* Header toggling, resizable columns * Allow all blocks in table cells, disable column resizing in read-only * Fixed dynamic scroll shadows * Refactor, scroll styling * fix scrolling, tweaks * fix: Table layout lost on sort * fix: Caching of grip decorators * refactor * stash * fix first render shadows * stash * First add column grip, styles * Just add column/row click handlers left * fix: isTableSelected for single cell table * Refactor mousedown handlers * fix: 'Add row before' command missing on first row * fix overflow on rhs * fix: Error clicking column grip when menu is open * Hide table controls when printing * Restore table header background * fix: Header behavior when adding columns and rows at the edges * Tweak header styling * fix: Serialize and parsing of column attributes when copy/pasting fix: Column width is lost when changing column alignment
112 lines
2.4 KiB
TypeScript
112 lines
2.4 KiB
TypeScript
import { chainCommands } from "prosemirror-commands";
|
|
import { NodeSpec, Node as ProsemirrorNode } from "prosemirror-model";
|
|
import {
|
|
addColumnAfter,
|
|
addRowAfter,
|
|
columnResizing,
|
|
deleteColumn,
|
|
deleteRow,
|
|
deleteTable,
|
|
goToNextCell,
|
|
tableEditing,
|
|
toggleHeader,
|
|
} from "prosemirror-tables";
|
|
import {
|
|
addRowBefore,
|
|
addColumnBefore,
|
|
addRowAndMoveSelection,
|
|
setColumnAttr,
|
|
createTable,
|
|
sortTable,
|
|
setTableAttr,
|
|
} from "../commands/table";
|
|
import { MarkdownSerializerState } from "../lib/markdown/serializer";
|
|
import tablesRule from "../rules/tables";
|
|
import { EditorStyleHelper } from "../styles/EditorStyleHelper";
|
|
import { TableLayout } from "../types";
|
|
import Node from "./Node";
|
|
import { TableView } from "./TableView";
|
|
|
|
export type TableAttrs = {
|
|
layout: TableLayout | null;
|
|
};
|
|
|
|
export default class Table extends Node {
|
|
get name() {
|
|
return "table";
|
|
}
|
|
|
|
get schema(): NodeSpec {
|
|
return {
|
|
content: "tr+",
|
|
tableRole: "table",
|
|
isolating: true,
|
|
group: "block",
|
|
parseDOM: [{ tag: "table" }],
|
|
attrs: {
|
|
layout: {
|
|
default: null,
|
|
},
|
|
},
|
|
toDOM() {
|
|
// Note: This is overridden by TableView
|
|
return [
|
|
"div",
|
|
{ class: EditorStyleHelper.table },
|
|
["table", {}, ["tbody", 0]],
|
|
];
|
|
},
|
|
};
|
|
}
|
|
|
|
get rulePlugins() {
|
|
return [tablesRule];
|
|
}
|
|
|
|
commands() {
|
|
return {
|
|
createTable,
|
|
setColumnAttr,
|
|
setTableAttr,
|
|
sortTable,
|
|
addColumnBefore,
|
|
addColumnAfter: () => addColumnAfter,
|
|
deleteColumn: () => deleteColumn,
|
|
addRowBefore,
|
|
addRowAfter: () => addRowAfter,
|
|
deleteRow: () => deleteRow,
|
|
deleteTable: () => deleteTable,
|
|
toggleHeaderColumn: () => toggleHeader("column"),
|
|
toggleHeaderRow: () => toggleHeader("row"),
|
|
};
|
|
}
|
|
|
|
keys() {
|
|
return {
|
|
Tab: chainCommands(goToNextCell(1), addRowAndMoveSelection()),
|
|
"Shift-Tab": goToNextCell(-1),
|
|
"Mod-Enter": addRowAndMoveSelection(),
|
|
};
|
|
}
|
|
|
|
toMarkdown(state: MarkdownSerializerState, node: ProsemirrorNode) {
|
|
state.renderTable(node);
|
|
state.closeBlock(node);
|
|
}
|
|
|
|
parseMarkdown() {
|
|
return { block: "table" };
|
|
}
|
|
|
|
get plugins() {
|
|
return [
|
|
// Note: Important to register columnResizing before tableEditing
|
|
columnResizing({
|
|
View: TableView,
|
|
lastColumnResizable: false,
|
|
}),
|
|
tableEditing(),
|
|
];
|
|
}
|
|
}
|