1 import {EditorFormDefinition, EditorFormTabs, EditorSelectFormFieldDefinition} from "../framework/forms";
2 import {EditorUiContext} from "../framework/core";
3 import {$createLinkNode} from "@lexical/link";
4 import {$createTextNode, $getSelection, LexicalNode} from "lexical";
5 import {$createImageNode} from "../../nodes/image";
6 import {setEditorContentFromHtml} from "../../actions";
7 import {$createMediaNodeFromHtml, $createMediaNodeFromSrc, $isMediaNode, MediaNode} from "../../nodes/media";
8 import {$getNodeFromSelection} from "../../helpers";
9 import {$insertNodeToNearestRoot} from "@lexical/utils";
12 export const link: EditorFormDefinition = {
14 async action(formData, context: EditorUiContext) {
15 context.editor.update(() => {
17 const selection = $getSelection();
19 const linkNode = $createLinkNode(formData.get('url')?.toString() || '', {
20 title: formData.get('title')?.toString() || '',
21 target: formData.get('target')?.toString() || '',
23 linkNode.append($createTextNode(formData.get('text')?.toString() || ''));
25 selection?.insertNodes([linkNode]);
36 label: 'Text to display',
46 label: 'Open link in...',
51 'New window': '_blank',
53 } as EditorSelectFormFieldDefinition,
57 export const image: EditorFormDefinition = {
59 async action(formData, context: EditorUiContext) {
60 context.editor.update(() => {
61 const selection = $getSelection();
62 const imageNode = $createImageNode(formData.get('src')?.toString() || '', {
63 alt: formData.get('alt')?.toString() || '',
64 height: Number(formData.get('height')?.toString() || '0'),
65 width: Number(formData.get('width')?.toString() || '0'),
67 selection?.insertNodes([imageNode]);
78 label: 'Alternative description',
95 export const media: EditorFormDefinition = {
97 async action(formData, context: EditorUiContext) {
98 const selectedNode: MediaNode|null = await (new Promise((res, rej) => {
99 context.editor.getEditorState().read(() => {
100 const node = $getNodeFromSelection($getSelection(), $isMediaNode);
101 res(node as MediaNode|null);
105 const embedCode = (formData.get('embed') || '').toString().trim();
107 context.editor.update(() => {
108 const node = $createMediaNodeFromHtml(embedCode);
109 if (selectedNode && node) {
110 selectedNode.replace(node)
112 $insertNodeToNearestRoot(node);
119 context.editor.update(() => {
120 const src = (formData.get('src') || '').toString().trim();
121 const height = (formData.get('height') || '').toString().trim();
122 const width = (formData.get('width') || '').toString().trim();
124 const updateNode = selectedNode || $createMediaNodeFromSrc(src);
125 updateNode.setSrc(src);
126 updateNode.setWidthAndHeight(width, height);
128 $insertNodeToNearestRoot(updateNode);
137 return new EditorFormTabs([
162 label: 'Paste your embed code below:',
174 export const source: EditorFormDefinition = {
176 async action(formData, context: EditorUiContext) {
177 setEditorContentFromHtml(context.editor, formData.get('source')?.toString() || '');