X-Git-Url: http://source.bookstackapp.com/bookstack/blobdiff_plain/20364382034c4979dc05e207242baf2871bf6283..refs/pull/5239/head:/resources/js/wysiwyg/services/keyboard-handling.ts diff --git a/resources/js/wysiwyg/services/keyboard-handling.ts b/resources/js/wysiwyg/services/keyboard-handling.ts index 65a8e4254..2c7bfdbba 100644 --- a/resources/js/wysiwyg/services/keyboard-handling.ts +++ b/resources/js/wysiwyg/services/keyboard-handling.ts @@ -1,10 +1,11 @@ import {EditorUiContext} from "../ui/framework/core"; import { + $getSelection, $isDecoratorNode, COMMAND_PRIORITY_LOW, KEY_BACKSPACE_COMMAND, KEY_DELETE_COMMAND, - KEY_ENTER_COMMAND, + KEY_ENTER_COMMAND, KEY_TAB_COMMAND, LexicalEditor, LexicalNode } from "lexical"; @@ -13,6 +14,8 @@ import {$isMediaNode} from "../nodes/media"; import {getLastSelection} from "../utils/selection"; import {$getNearestNodeBlockParent} from "../utils/nodes"; import {$createCustomParagraphNode} from "../nodes/custom-paragraph"; +import {$isCustomListItemNode} from "../nodes/custom-list-item"; +import {$setInsetForSelection} from "../utils/lists"; function isSingleSelectedNode(nodes: LexicalNode[]): boolean { if (nodes.length === 1) { @@ -55,6 +58,21 @@ function insertAfterSingleSelectedNode(editor: LexicalEditor, event: KeyboardEve return false; } +function handleInsetOnTab(editor: LexicalEditor, event: KeyboardEvent|null): boolean { + const change = event?.shiftKey ? -40 : 40; + const selection = $getSelection(); + const nodes = selection?.getNodes() || []; + if (nodes.length > 1 || (nodes.length === 1 && $isCustomListItemNode(nodes[0].getParent()))) { + editor.update(() => { + $setInsetForSelection(editor, change); + }); + event?.preventDefault(); + return true; + } + + return false; +} + export function registerKeyboardHandling(context: EditorUiContext): () => void { const unregisterBackspace = context.editor.registerCommand(KEY_BACKSPACE_COMMAND, (): boolean => { deleteSingleSelectedNode(context.editor); @@ -70,9 +88,14 @@ export function registerKeyboardHandling(context: EditorUiContext): () => void { return insertAfterSingleSelectedNode(context.editor, event); }, COMMAND_PRIORITY_LOW); + const unregisterTab = context.editor.registerCommand(KEY_TAB_COMMAND, (event): boolean => { + return handleInsetOnTab(context.editor, event); + }, COMMAND_PRIORITY_LOW); + return () => { unregisterBackspace(); unregisterDelete(); unregisterEnter(); + unregisterTab(); }; } \ No newline at end of file