mirror of https://github.com/halo-dev/halo
feat: add shortcut for table deletion
parent
0b30c0d98e
commit
0a812c497e
|
@ -15,8 +15,7 @@ const ExtensionListKeymap = ListKeymap.extend<ListKeymapOptions>({
|
||||||
let handled = false;
|
let handled = false;
|
||||||
|
|
||||||
if (!editor.state.selection.empty) {
|
if (!editor.state.selection.empty) {
|
||||||
editor.commands.deleteSelection();
|
return false;
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
this.options.listTypes.forEach(
|
this.options.listTypes.forEach(
|
||||||
|
|
|
@ -1,5 +1,10 @@
|
||||||
import TiptapTable, { type TableOptions } from "@tiptap/extension-table";
|
import TiptapTable, { type TableOptions } from "@tiptap/extension-table";
|
||||||
import { isActive, type Editor, type Range } from "@/tiptap/vue-3";
|
import {
|
||||||
|
isActive,
|
||||||
|
type Editor,
|
||||||
|
type Range,
|
||||||
|
isNodeActive,
|
||||||
|
} from "@/tiptap/vue-3";
|
||||||
import type {
|
import type {
|
||||||
Node as ProseMirrorNode,
|
Node as ProseMirrorNode,
|
||||||
NodeView,
|
NodeView,
|
||||||
|
@ -25,6 +30,8 @@ import { markRaw } from "vue";
|
||||||
import { i18n } from "@/locales";
|
import { i18n } from "@/locales";
|
||||||
import type { ExtensionOptions, NodeBubbleMenu } from "@/types";
|
import type { ExtensionOptions, NodeBubbleMenu } from "@/types";
|
||||||
import { BlockActionSeparator, ToolboxItem } from "@/components";
|
import { BlockActionSeparator, ToolboxItem } from "@/components";
|
||||||
|
import { hasTableBefore, isTableSelected } from "./util";
|
||||||
|
import { Editor } from "@tiptap/core";
|
||||||
|
|
||||||
function updateColumns(
|
function updateColumns(
|
||||||
node: ProseMirrorNode,
|
node: ProseMirrorNode,
|
||||||
|
@ -375,6 +382,44 @@ const Table = TiptapTable.extend<ExtensionOptions & TableOptions>({
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
|
|
||||||
|
addKeyboardShortcuts() {
|
||||||
|
const handleBackspace = () => {
|
||||||
|
const { editor } = this;
|
||||||
|
if (editor.commands.undoInputRule()) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// the node in the current active state is not a table
|
||||||
|
// and the previous node is a table
|
||||||
|
if (
|
||||||
|
!isNodeActive(editor.state, Table.name) &&
|
||||||
|
hasTableBefore(editor.state)
|
||||||
|
) {
|
||||||
|
editor.commands.selectNodeBackward();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!isNodeActive(editor.state, Table.name)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// If the table is currently selected,
|
||||||
|
// then delete the whole table
|
||||||
|
if (isTableSelected(editor.state.selection)) {
|
||||||
|
editor.commands.deleteTable();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
};
|
||||||
|
|
||||||
|
return {
|
||||||
|
Backspace: () => handleBackspace(),
|
||||||
|
|
||||||
|
"Mod-Backspace": () => handleBackspace(),
|
||||||
|
};
|
||||||
|
},
|
||||||
}).configure({ resizable: true });
|
}).configure({ resizable: true });
|
||||||
|
|
||||||
export default Table;
|
export default Table;
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
import { findParentNode } from "@/tiptap/vue-3";
|
import { findParentNode } from "@/tiptap/vue-3";
|
||||||
import { Node, CellSelection, TableMap } from "@/tiptap/pm";
|
import { Node, CellSelection, TableMap } from "@/tiptap/pm";
|
||||||
import type { Selection, Transaction } from "@/tiptap/pm";
|
import type { EditorState, Selection, Transaction } from "@/tiptap/pm";
|
||||||
|
|
||||||
export const selectTable = (tr: Transaction) => {
|
export const selectTable = (tr: Transaction) => {
|
||||||
const table = findTable(tr.selection);
|
const table = findTable(tr.selection);
|
||||||
|
@ -236,3 +236,17 @@ export const isTableSelected = (selection: any) => {
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export const hasTableBefore = (editorState: EditorState) => {
|
||||||
|
const { $anchor } = editorState.selection;
|
||||||
|
|
||||||
|
const previousNodePos = Math.max(0, $anchor.pos - 2);
|
||||||
|
|
||||||
|
const previousNode = editorState.doc.resolve(previousNodePos).node();
|
||||||
|
|
||||||
|
if (!previousNode || !(previousNode.type.name === "table")) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
};
|
||||||
|
|
Loading…
Reference in New Issue