diff --git a/ui/packages/editor/src/extensions/indent/index.ts b/ui/packages/editor/src/extensions/indent/index.ts index a8eddedf3..d49849089 100644 --- a/ui/packages/editor/src/extensions/indent/index.ts +++ b/ui/packages/editor/src/extensions/indent/index.ts @@ -7,6 +7,7 @@ import { type KeyboardShortcutCommand, } from "@/tiptap"; import { TextSelection, Transaction } from "@/tiptap/pm"; +import { isListActive } from "@/utils/isListActive"; declare module "@/tiptap" { interface Commands { @@ -222,14 +223,6 @@ const isTextIndent = (tr: Transaction, currNodePos: number) => { return false; }; -const isListActive = (editor: CoreEditor) => { - return ( - editor.isActive("bulletList") || - editor.isActive("orderedList") || - editor.isActive("taskList") - ); -}; - const isFilterActive = (editor: CoreEditor) => { return editor.isActive("table") || editor.isActive("columns"); }; diff --git a/ui/packages/editor/src/extensions/paragraph/index.ts b/ui/packages/editor/src/extensions/paragraph/index.ts index 9feb863d1..fe03c34dc 100644 --- a/ui/packages/editor/src/extensions/paragraph/index.ts +++ b/ui/packages/editor/src/extensions/paragraph/index.ts @@ -2,6 +2,7 @@ import ToolbarItem from "@/components/toolbar/ToolbarItem.vue"; import ToolbarSubItem from "@/components/toolbar/ToolbarSubItem.vue"; import { i18n } from "@/locales"; import { + CoreEditor, EditorState, ResolvedPos, TextSelection, @@ -11,6 +12,7 @@ import { } from "@/tiptap"; import type { ExtensionOptions, ToolbarItem as TypeToolbarItem } from "@/types"; import { deleteNodeByPos } from "@/utils"; +import { isListActive } from "@/utils/isListActive"; import { isEmpty } from "@/utils/isNodeEmpty"; import type { ParagraphOptions } from "@tiptap/extension-paragraph"; import TiptapParagraph from "@tiptap/extension-paragraph"; @@ -97,15 +99,15 @@ const Paragraph = TiptapParagraph.extend({ addKeyboardShortcuts() { return { - Backspace: ({ editor }) => { + Backspace: ({ editor }: { editor: CoreEditor }) => { const { state, view } = editor; const { selection } = state; - if ( - !isActive(state, Paragraph.name) || - !(selection instanceof TextSelection) || - !selection.empty - ) { + if (isListActive(editor) || !isActive(state, Paragraph.name)) { + return false; + } + + if (!(selection instanceof TextSelection) || !selection.empty) { return false; } diff --git a/ui/packages/editor/src/utils/isListActive.ts b/ui/packages/editor/src/utils/isListActive.ts new file mode 100644 index 000000000..0d2880b2f --- /dev/null +++ b/ui/packages/editor/src/utils/isListActive.ts @@ -0,0 +1,42 @@ +import { + callOrReturn, + CoreEditor, + getExtensionField, + isActive, + type NodeConfig, +} from "@/tiptap"; + +/** + * Check if a list is active + * + * @param state - The state of the editor + * @returns Whether a list is active + * @example + * ```ts + * const isActive = isListActive(editor.state); + * ``` + **/ +export const isListActive = (editor: CoreEditor) => { + const extensions = editor.extensionManager.extensions; + const listExtensions = extensions.filter((extension) => { + const context = { + name: extension.name, + options: extension.options, + storage: extension.storage, + }; + + const group = callOrReturn( + getExtensionField(extension, "group", context) + ); + + if (typeof group !== "string") { + return false; + } + + return group.split(" ").includes("list"); + }); + + return listExtensions.some((extension) => { + return isActive(editor.state, extension.name); + }); +};