From 32809193704b06dd8dbe2eb98bb1fe329138a0e7 Mon Sep 17 00:00:00 2001 From: Dan Brown Date: Sun, 25 May 2025 13:21:13 +0100 Subject: [PATCH] Lexical: Improved diagram selection and keyboard usage Fixes issues where drawings could not be removed via backspace or delete. --- resources/js/wysiwyg/services/keyboard-handling.ts | 3 ++- resources/js/wysiwyg/ui/decorators/diagram.ts | 14 ++++++++++---- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/resources/js/wysiwyg/services/keyboard-handling.ts b/resources/js/wysiwyg/services/keyboard-handling.ts index a7f1ec7f0..41a917ecb 100644 --- a/resources/js/wysiwyg/services/keyboard-handling.ts +++ b/resources/js/wysiwyg/services/keyboard-handling.ts @@ -17,11 +17,12 @@ import {$getNearestNodeBlockParent, $getParentOfType} from "../utils/nodes"; import {$setInsetForSelection} from "../utils/lists"; import {$isListItemNode} from "@lexical/list"; import {$isDetailsNode, DetailsNode} from "@lexical/rich-text/LexicalDetailsNode"; +import {$isDiagramNode} from "../utils/diagrams"; function isSingleSelectedNode(nodes: LexicalNode[]): boolean { if (nodes.length === 1) { const node = nodes[0]; - if ($isDecoratorNode(node) || $isImageNode(node) || $isMediaNode(node)) { + if ($isDecoratorNode(node) || $isImageNode(node) || $isMediaNode(node) || $isDiagramNode(node)) { return true; } } diff --git a/resources/js/wysiwyg/ui/decorators/diagram.ts b/resources/js/wysiwyg/ui/decorators/diagram.ts index d53bcb482..52a73ad72 100644 --- a/resources/js/wysiwyg/ui/decorators/diagram.ts +++ b/resources/js/wysiwyg/ui/decorators/diagram.ts @@ -1,6 +1,6 @@ import {EditorDecorator} from "../framework/decorator"; import {EditorUiContext} from "../framework/core"; -import {BaseSelection} from "lexical"; +import {BaseSelection, CLICK_COMMAND, COMMAND_PRIORITY_NORMAL} from "lexical"; import {DiagramNode} from "@lexical/rich-text/LexicalDiagramNode"; import {$selectionContainsNode, $selectSingleNode} from "../../utils/selection"; import {$openDrawingEditorForNode} from "../../utils/diagrams"; @@ -12,11 +12,17 @@ export class DiagramDecorator extends EditorDecorator { setup(context: EditorUiContext, element: HTMLElement) { const diagramNode = this.getNode(); element.classList.add('editor-diagram'); - element.addEventListener('click', event => { + + context.editor.registerCommand(CLICK_COMMAND, (event: MouseEvent): boolean => { + if (!element.contains(event.target as HTMLElement)) { + return false; + } + context.editor.update(() => { $selectSingleNode(this.getNode()); - }) - }); + }); + return true; + }, COMMAND_PRIORITY_NORMAL); element.addEventListener('dblclick', event => { context.editor.getEditorState().read(() => {