- Allowed re-editing of existing embed HTML code.
- Handled "src" form field when video is using child source tags.
setCommonBlockPropsFromElement,
updateElementWithCommonBlockProps
} from "lexical/nodes/common";
-import {$selectSingleNode} from "../../utils/selection";
import {SerializedCommonBlockNode} from "lexical/nodes/CommonBlockNode";
export type MediaNodeTag = 'iframe' | 'embed' | 'object' | 'video' | 'audio';
getSources(): MediaNodeSource[] {
const self = this.getLatest();
- return self.__sources;
+ return self.__sources.map(s => Object.assign({}, s))
}
setSrc(src: string): void {
const attrs = this.getAttributes();
+ const sources = this.getSources();
+
if (this.__tag ==='object') {
attrs.data = src;
+ } if (this.__tag === 'video' && sources.length > 0) {
+ sources[0].src = src;
+ delete attrs.src;
+ if (sources.length > 1) {
+ sources.splice(1, sources.length - 1);
+ }
+ this.setSources(sources);
} else {
attrs.src = src;
}
+
this.setAttributes(attrs);
}
});
});
+ test('setSrc on video uses sources if existing', () => {
+ const {editor} = createTestContext();
+ editor.updateAndCommit(() => {
+ const mediaMode = $createMediaNode('video');
+ mediaMode.setAttributes({src: 'z'});
+ mediaMode.setSources([{src: 'a', type: 'video'}, {src: 'b', type: 'video'}]);
+
+ mediaMode.setSrc('c');
+
+ expect(mediaMode.getAttributes().src).toBeUndefined();
+ expect(mediaMode.getSources()).toHaveLength(1);
+ expect(mediaMode.getSources()[0].src).toBe('c');
+ });
+ });
+
});
\ No newline at end of file
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 || '',
+ src: nodeAttrs.src || nodeAttrs.data || media.getSources()[0]?.src || '',
width: nodeAttrs.width,
height: nodeAttrs.height,
- embed: '',
+ embed: nodeHtml,
+
+ // This is used so we can check for edits against the embed field on submit
+ embed_check: nodeHtml,
}
}
}));
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) {
if (selectedNode) {
selectedNode.setSrc(src);
selectedNode.setWidthAndHeight(width, height);
+ context.manager.triggerFutureStateRefresh();
return;
}
name: 'embed',
type: 'textarea',
},
+ {
+ label: '',
+ name: 'embed_check',
+ type: 'hidden',
+ },
],
}
])
export interface EditorFormFieldDefinition {
label: string;
name: string;
- type: 'text' | 'select' | 'textarea' | 'checkbox';
+ type: 'text' | 'select' | 'textarea' | 'checkbox' | 'hidden';
}
export interface EditorSelectFormFieldDefinition extends EditorFormFieldDefinition {
input = el('textarea', {id, name: this.definition.name, class: 'editor-form-field-input'});
} else if (this.definition.type === 'checkbox') {
input = el('input', {id, name: this.definition.name, type: 'checkbox', class: 'editor-form-field-input-checkbox', value: 'true'});
+ } else if (this.definition.type === 'hidden') {
+ input = el('input', {id, name: this.definition.name, type: 'hidden'});
+ return el('div', {hidden: 'true'}, [input]);
} else {
input = el('input', {id, name: this.definition.name, class: 'editor-form-field-input'});
}