1 import {EditorFormDefinition, EditorFormTabs, EditorSelectFormFieldDefinition} from "../../framework/forms";
2 import {EditorUiContext} from "../../framework/core";
3 import {$createTextNode, $getSelection} from "lexical";
4 import {$createImageNode} from "../../../nodes/image";
5 import {$createLinkNode} from "@lexical/link";
6 import {$createMediaNodeFromHtml, $createMediaNodeFromSrc, $isMediaNode, MediaNode} from "../../../nodes/media";
7 import {$getNodeFromSelection} from "../../../helpers";
8 import {$insertNodeToNearestRoot} from "@lexical/utils";
10 export const image: EditorFormDefinition = {
12 async action(formData, context: EditorUiContext) {
13 context.editor.update(() => {
14 const selection = $getSelection();
15 const imageNode = $createImageNode(formData.get('src')?.toString() || '', {
16 alt: formData.get('alt')?.toString() || '',
17 height: Number(formData.get('height')?.toString() || '0'),
18 width: Number(formData.get('width')?.toString() || '0'),
20 selection?.insertNodes([imageNode]);
31 label: 'Alternative description',
48 export const link: EditorFormDefinition = {
50 async action(formData, context: EditorUiContext) {
51 context.editor.update(() => {
53 const selection = $getSelection();
55 const linkNode = $createLinkNode(formData.get('url')?.toString() || '', {
56 title: formData.get('title')?.toString() || '',
57 target: formData.get('target')?.toString() || '',
59 linkNode.append($createTextNode(formData.get('text')?.toString() || ''));
61 selection?.insertNodes([linkNode]);
72 label: 'Text to display',
82 label: 'Open link in...',
87 'New window': '_blank',
89 } as EditorSelectFormFieldDefinition,
93 export const media: EditorFormDefinition = {
95 async action(formData, context: EditorUiContext) {
96 const selectedNode: MediaNode|null = await (new Promise((res, rej) => {
97 context.editor.getEditorState().read(() => {
98 const node = $getNodeFromSelection($getSelection(), $isMediaNode);
99 res(node as MediaNode|null);
103 const embedCode = (formData.get('embed') || '').toString().trim();
105 context.editor.update(() => {
106 const node = $createMediaNodeFromHtml(embedCode);
107 if (selectedNode && node) {
108 selectedNode.replace(node)
110 $insertNodeToNearestRoot(node);
117 context.editor.update(() => {
118 const src = (formData.get('src') || '').toString().trim();
119 const height = (formData.get('height') || '').toString().trim();
120 const width = (formData.get('width') || '').toString().trim();
122 const updateNode = selectedNode || $createMediaNodeFromSrc(src);
123 updateNode.setSrc(src);
124 updateNode.setWidthAndHeight(width, height);
126 $insertNodeToNearestRoot(updateNode);
135 return new EditorFormTabs([
160 label: 'Paste your embed code below:',