File tree

4 files changed

+46
-6
lines changed

4 files changed

+46
-6
lines changed
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@ import {
1414
setCommonBlockPropsFromElement,
1515
updateElementWithCommonBlockProps
1616
} from "lexical/nodes/common";
17-
import {$selectSingleNode} from "../../utils/selection";
1817
import {SerializedCommonBlockNode} from "lexical/nodes/CommonBlockNode";
1918

2019
export type MediaNodeTag = 'iframe' | 'embed' | 'object' | 'video' | 'audio';
@@ -141,16 +140,26 @@ export class MediaNode extends ElementNode {
141140

142141
getSources(): MediaNodeSource[] {
143142
const self = this.getLatest();
144-
return self.__sources;
143+
return self.__sources.map(s => Object.assign({}, s))
145144
}
146145

147146
setSrc(src: string): void {
148147
const attrs = this.getAttributes();
148+
const sources = this.getSources();
149+
149150
if (this.__tag ==='object') {
150151
attrs.data = src;
152+
} if (this.__tag === 'video' && sources.length > 0) {
153+
sources[0].src = src;
154+
delete attrs.src;
155+
if (sources.length > 1) {
156+
sources.splice(1, sources.length - 1);
157+
}
158+
this.setSources(sources);
151159
} else {
152160
attrs.src = src;
153161
}
162+
154163
this.setAttributes(attrs);
155164
}
156165

Original file line numberDiff line numberDiff line change
@@ -28,4 +28,19 @@ describe('LexicalMediaNode', () => {
2828
});
2929
});
3030

31+
test('setSrc on video uses sources if existing', () => {
32+
const {editor} = createTestContext();
33+
editor.updateAndCommit(() => {
34+
const mediaMode = $createMediaNode('video');
35+
mediaMode.setAttributes({src: 'z'});
36+
mediaMode.setSources([{src: 'a', type: 'video'}, {src: 'b', type: 'video'}]);
37+
38+
mediaMode.setSrc('c');
39+
40+
expect(mediaMode.getAttributes().src).toBeUndefined();
41+
expect(mediaMode.getSources()).toHaveLength(1);
42+
expect(mediaMode.getSources()[0].src).toBe('c');
43+
});
44+
});
45+
3146
});
Original file line numberDiff line numberDiff line change
@@ -192,11 +192,17 @@ export function $showMediaForm(media: MediaNode|null, context: EditorUiContext):
192192
let formDefaults = {};
193193
if (media) {
194194
const nodeAttrs = media.getAttributes();
195+
const nodeDOM = media.exportDOM(context.editor).element;
196+
const nodeHtml = (nodeDOM instanceof HTMLElement) ? nodeDOM.outerHTML : '';
197+
195198
formDefaults = {
196-
src: nodeAttrs.src || nodeAttrs.data || '',
199+
src: nodeAttrs.src || nodeAttrs.data || media.getSources()[0]?.src || '',
197200
width: nodeAttrs.width,
198201
height: nodeAttrs.height,
199-
embed: '',
202+
embed: nodeHtml,
203+
204+
// This is used so we can check for edits against the embed field on submit
205+
embed_check: nodeHtml,
200206
}
201207
}
202208

@@ -214,7 +220,8 @@ export const media: EditorFormDefinition = {
214220
}));
215221

216222
const embedCode = (formData.get('embed') || '').toString().trim();
217-
if (embedCode) {
223+
const embedCheck = (formData.get('embed_check') || '').toString().trim();
224+
if (embedCode && embedCode !== embedCheck) {
218225
context.editor.update(() => {
219226
const node = $createMediaNodeFromHtml(embedCode);
220227
if (selectedNode && node) {
@@ -236,6 +243,7 @@ export const media: EditorFormDefinition = {
236243
if (selectedNode) {
237244
selectedNode.setSrc(src);
238245
selectedNode.setWidthAndHeight(width, height);
246+
context.manager.triggerFutureStateRefresh();
239247
return;
240248
}
241249

@@ -281,6 +289,11 @@ export const media: EditorFormDefinition = {
281289
name: 'embed',
282290
type: 'textarea',
283291
},
292+
{
293+
label: '',
294+
name: 'embed_check',
295+
type: 'hidden',
296+
},
284297
],
285298
}
286299
])
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import {el} from "../../utils/dom";
1111
export interface EditorFormFieldDefinition {
1212
label: string;
1313
name: string;
14-
type: 'text' | 'select' | 'textarea' | 'checkbox';
14+
type: 'text' | 'select' | 'textarea' | 'checkbox' | 'hidden';
1515
}
1616

1717
export interface EditorSelectFormFieldDefinition extends EditorFormFieldDefinition {
@@ -67,6 +67,9 @@ export class EditorFormField extends EditorUiElement {
6767
input = el('textarea', {id, name: this.definition.name, class: 'editor-form-field-input'});
6868
} else if (this.definition.type === 'checkbox') {
6969
input = el('input', {id, name: this.definition.name, type: 'checkbox', class: 'editor-form-field-input-checkbox', value: 'true'});
70+
} else if (this.definition.type === 'hidden') {
71+
input = el('input', {id, name: this.definition.name, type: 'hidden'});
72+
return el('div', {hidden: 'true'}, [input]);
7073
} else {
7174
input = el('input', {id, name: this.definition.name, class: 'editor-form-field-input'});
7275
}

0 commit comments

Comments
 (0)