X-Git-Url: http://source.bookstackapp.com/bookstack/blobdiff_plain/ddf5f2543c2347ee27b48c8a2b8db008d4892950..refs/pull/5681/head:/resources/js/wysiwyg/services/drop-paste-handling.ts diff --git a/resources/js/wysiwyg/services/drop-paste-handling.ts b/resources/js/wysiwyg/services/drop-paste-handling.ts index 85d0235d8..57f9a80ae 100644 --- a/resources/js/wysiwyg/services/drop-paste-handling.ts +++ b/resources/js/wysiwyg/services/drop-paste-handling.ts @@ -1,4 +1,5 @@ import { + $createParagraphNode, $insertNodes, $isDecoratorNode, COMMAND_PRIORITY_HIGH, DROP_COMMAND, LexicalEditor, @@ -7,8 +8,7 @@ import { import {$insertNewBlockNodesAtSelection, $selectSingleNode} from "../utils/selection"; import {$getNearestBlockNodeForCoords, $htmlToBlockNodes} from "../utils/nodes"; import {Clipboard} from "../../services/clipboard"; -import {$createImageNode} from "../nodes/image"; -import {$createCustomParagraphNode} from "../nodes/custom-paragraph"; +import {$createImageNode} from "@lexical/rich-text/LexicalImageNode"; import {$createLinkNode} from "@lexical/link"; import {EditorImageData, uploadImageFile} from "../utils/images"; import {EditorUiContext} from "../ui/framework/core"; @@ -67,7 +67,7 @@ function handleMediaInsert(data: DataTransfer, context: EditorUiContext): boolea for (const imageFile of images) { const loadingImage = window.baseUrl('/loading.gif'); const loadingNode = $createImageNode(loadingImage); - const imageWrap = $createCustomParagraphNode(); + const imageWrap = $createParagraphNode(); imageWrap.append(loadingNode); $insertNodes([imageWrap]); @@ -95,6 +95,21 @@ function handleMediaInsert(data: DataTransfer, context: EditorUiContext): boolea return handled; } +function handleImageLinkInsert(data: DataTransfer, context: EditorUiContext): boolean { + const regex = /https?:\/\/([^?#]*?)\.(png|jpeg|jpg|gif|webp|bmp|avif)/i + const text = data.getData('text/plain'); + if (text && regex.test(text)) { + context.editor.update(() => { + const image = $createImageNode(text); + $insertNodes([image]); + image.select(); + }); + return true; + } + + return false; +} + function createDropListener(context: EditorUiContext): (event: DragEvent) => boolean { const editor = context.editor; return (event: DragEvent): boolean => { @@ -103,6 +118,7 @@ function createDropListener(context: EditorUiContext): (event: DragEvent) => boo if (templateId) { insertTemplateToEditor(editor, templateId, event); event.preventDefault(); + event.stopPropagation(); return true; } @@ -114,6 +130,7 @@ function createDropListener(context: EditorUiContext): (event: DragEvent) => boo $insertNodesAtEvent(newNodes, event, editor); }); event.preventDefault(); + event.stopPropagation(); return true; } @@ -121,6 +138,7 @@ function createDropListener(context: EditorUiContext): (event: DragEvent) => boo const handled = handleMediaInsert(event.dataTransfer, context); if (handled) { event.preventDefault(); + event.stopPropagation(); return true; } } @@ -135,7 +153,10 @@ function createPasteListener(context: EditorUiContext): (event: ClipboardEvent) return false; } - const handled = handleMediaInsert(event.clipboardData, context); + const handled = + handleImageLinkInsert(event.clipboardData, context) || + handleMediaInsert(event.clipboardData, context); + if (handled) { event.preventDefault(); } @@ -150,9 +171,11 @@ export function registerDropPasteHandling(context: EditorUiContext): () => void const unregisterDrop = context.editor.registerCommand(DROP_COMMAND, dropListener, COMMAND_PRIORITY_HIGH); const unregisterPaste = context.editor.registerCommand(PASTE_COMMAND, pasteListener, COMMAND_PRIORITY_HIGH); + context.scrollDOM.addEventListener('drop', dropListener); return () => { unregisterDrop(); unregisterPaste(); + context.scrollDOM.removeEventListener('drop', dropListener); }; } \ No newline at end of file