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";
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) {
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);
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