],
};
+export function $showMediaForm(media: MediaNode|null, context: EditorUiContext): void {
+ const mediaModal = context.manager.createModal('media');
+
+ let formDefaults = {};
+ if (media) {
+ const nodeAttrs = media.getAttributes();
+ const nodeDOM = media.exportDOM(context.editor).element;
+ const nodeHtml = (nodeDOM instanceof HTMLElement) ? nodeDOM.outerHTML : '';
+
+ formDefaults = {
+ src: nodeAttrs.src || nodeAttrs.data || media.getSources()[0]?.src || '',
+ width: nodeAttrs.width,
+ height: nodeAttrs.height,
+ embed: nodeHtml,
+
+ // This is used so we can check for edits against the embed field on submit
+ embed_check: nodeHtml,
+ }
+ }
+
+ mediaModal.show(formDefaults);
+}
+
export const media: EditorFormDefinition = {
submitText: 'Save',
async action(formData, context: EditorUiContext) {
}));
const embedCode = (formData.get('embed') || '').toString().trim();
- if (embedCode) {
+ const embedCheck = (formData.get('embed_check') || '').toString().trim();
+ if (embedCode && embedCode !== embedCheck) {
context.editor.update(() => {
const node = $createMediaNodeFromHtml(embedCode);
if (selectedNode && node) {
const height = (formData.get('height') || '').toString().trim();
const width = (formData.get('width') || '').toString().trim();
- const updateNode = selectedNode || $createMediaNodeFromSrc(src);
- updateNode.setSrc(src);
- updateNode.setWidthAndHeight(width, height);
- if (!selectedNode) {
- $insertNodes([updateNode]);
+ // Update existing
+ if (selectedNode) {
+ selectedNode.setSrc(src);
+ selectedNode.setWidthAndHeight(width, height);
+ context.manager.triggerFutureStateRefresh();
+ return;
+ }
+
+ // Insert new
+ const node = $createMediaNodeFromSrc(src);
+ if (width || height) {
+ node.setWidthAndHeight(width, height);
}
+ $insertNodes([node]);
});
return true;
name: 'embed',
type: 'textarea',
},
+ {
+ label: '',
+ name: 'embed_check',
+ type: 'hidden',
+ },
],
}
])