5 EditorSelectFormFieldDefinition
6 } from "../../framework/forms";
7 import {EditorUiContext} from "../../framework/core";
8 import {$createTextNode, $getSelection} from "lexical";
9 import {$isImageNode, ImageNode} from "../../../nodes/image";
10 import {$createLinkNode} from "@lexical/link";
11 import {$createMediaNodeFromHtml, $createMediaNodeFromSrc, $isMediaNode, MediaNode} from "../../../nodes/media";
12 import {$insertNodeToNearestRoot} from "@lexical/utils";
13 import {$getNodeFromSelection} from "../../../utils/selection";
14 import {EditorFormModal} from "../../framework/modals";
15 import {EditorActionField} from "../../framework/blocks/action-field";
16 import {EditorButton} from "../../framework/buttons";
17 import {showImageManager} from "../../../utils/images";
18 import searchImageIcon from "@icons/editor/image-search.svg";
20 export function $showImageForm(image: ImageNode, context: EditorUiContext) {
21 const imageModal: EditorFormModal = context.manager.createModal('image');
22 const height = image.getHeight();
23 const width = image.getWidth();
27 alt: image.getAltText(),
28 height: height === 0 ? '' : String(height),
29 width: width === 0 ? '' : String(width),
32 imageModal.show(formData);
35 export const image: EditorFormDefinition = {
37 async action(formData, context: EditorUiContext) {
38 context.editor.update(() => {
39 const selectedImage = $getNodeFromSelection(context.lastSelection, $isImageNode);
40 if ($isImageNode(selectedImage)) {
41 selectedImage.setSrc(formData.get('src')?.toString() || '');
42 selectedImage.setAltText(formData.get('alt')?.toString() || '');
44 selectedImage.setWidth(Number(formData.get('width')?.toString() || '0'));
45 selectedImage.setHeight(Number(formData.get('height')?.toString() || '0'));
53 return new EditorActionField(
60 label: 'Browse files',
61 icon: searchImageIcon,
62 action(context: EditorUiContext) {
63 showImageManager((image) => {
64 const modal = context.manager.getActiveModal('image');
66 modal.getForm().setValues({
67 src: image.thumbs?.display || image.url,
78 label: 'Alternative description',
95 export const link: EditorFormDefinition = {
97 async action(formData, context: EditorUiContext) {
98 context.editor.update(() => {
100 const selection = $getSelection();
102 const linkNode = $createLinkNode(formData.get('url')?.toString() || '', {
103 title: formData.get('title')?.toString() || '',
104 target: formData.get('target')?.toString() || '',
106 linkNode.append($createTextNode(formData.get('text')?.toString() || ''));
108 selection?.insertNodes([linkNode]);
119 label: 'Text to display',
129 label: 'Open link in...',
133 'Current window': '',
134 'New window': '_blank',
136 } as EditorSelectFormFieldDefinition,
140 export const media: EditorFormDefinition = {
142 async action(formData, context: EditorUiContext) {
143 const selectedNode: MediaNode|null = await (new Promise((res, rej) => {
144 context.editor.getEditorState().read(() => {
145 const node = $getNodeFromSelection($getSelection(), $isMediaNode);
146 res(node as MediaNode|null);
150 const embedCode = (formData.get('embed') || '').toString().trim();
152 context.editor.update(() => {
153 const node = $createMediaNodeFromHtml(embedCode);
154 if (selectedNode && node) {
155 selectedNode.replace(node)
157 $insertNodeToNearestRoot(node);
164 context.editor.update(() => {
165 const src = (formData.get('src') || '').toString().trim();
166 const height = (formData.get('height') || '').toString().trim();
167 const width = (formData.get('width') || '').toString().trim();
169 const updateNode = selectedNode || $createMediaNodeFromSrc(src);
170 updateNode.setSrc(src);
171 updateNode.setWidthAndHeight(width, height);
173 $insertNodeToNearestRoot(updateNode);
182 return new EditorFormTabs([
207 label: 'Paste your embed code below:',