@tiptap/extension-table 2.0.0-beta.9 → 2.0.0-rc.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (33) hide show
  1. package/README.md +4 -4
  2. package/dist/index.cjs +305 -0
  3. package/dist/index.cjs.map +1 -0
  4. package/dist/index.js +299 -0
  5. package/dist/index.js.map +1 -0
  6. package/dist/index.umd.js +307 -0
  7. package/dist/index.umd.js.map +1 -0
  8. package/dist/packages/extension-table/src/TableView.d.ts +2 -2
  9. package/dist/packages/extension-table/src/index.d.ts +1 -0
  10. package/dist/packages/extension-table/src/table.d.ts +28 -23
  11. package/dist/packages/extension-table/src/utilities/createCell.d.ts +2 -2
  12. package/dist/packages/extension-table/src/utilities/createTable.d.ts +2 -2
  13. package/dist/packages/extension-table/src/utilities/getTableNodeTypes.d.ts +1 -1
  14. package/dist/packages/extension-table/src/utilities/isCellSelection.d.ts +1 -1
  15. package/package.json +27 -11
  16. package/src/TableView.ts +17 -6
  17. package/src/index.ts +1 -0
  18. package/src/table.ts +181 -144
  19. package/src/utilities/createCell.ts +5 -6
  20. package/src/utilities/createTable.ts +12 -5
  21. package/src/utilities/deleteTableWhenAllCellsSelected.ts +2 -1
  22. package/src/utilities/getTableNodeTypes.ts +1 -1
  23. package/src/utilities/isCellSelection.ts +1 -1
  24. package/CHANGELOG.md +0 -134
  25. package/LICENSE.md +0 -21
  26. package/dist/tiptap-extension-table.bundle.umd.min.js +0 -2
  27. package/dist/tiptap-extension-table.bundle.umd.min.js.map +0 -1
  28. package/dist/tiptap-extension-table.cjs.js +0 -5920
  29. package/dist/tiptap-extension-table.cjs.js.map +0 -1
  30. package/dist/tiptap-extension-table.esm.js +0 -5916
  31. package/dist/tiptap-extension-table.esm.js.map +0 -1
  32. package/dist/tiptap-extension-table.umd.js +0 -5923
  33. package/dist/tiptap-extension-table.umd.js.map +0 -1
package/README.md CHANGED
@@ -5,10 +5,10 @@
5
5
  [![Sponsor](https://img.shields.io/static/v1?label=Sponsor&message=%E2%9D%A4&logo=GitHub)](https://github.com/sponsors/ueberdosis)
6
6
 
7
7
  ## Introduction
8
- tiptap is a headless wrapper around [ProseMirror](https://ProseMirror.net) – a toolkit for building rich text WYSIWYG editors, which is already in use at many well-known companies such as *New York Times*, *The Guardian* or *Atlassian*.
8
+ Tiptap is a headless wrapper around [ProseMirror](https://ProseMirror.net) – a toolkit for building rich text WYSIWYG editors, which is already in use at many well-known companies such as *New York Times*, *The Guardian* or *Atlassian*.
9
9
 
10
- ## Offical Documentation
11
- Documentation can be found on the [tiptap website](https://tiptap.dev).
10
+ ## Official Documentation
11
+ Documentation can be found on the [Tiptap website](https://tiptap.dev).
12
12
 
13
13
  ## License
14
- tiptap is open sourced software licensed under the [MIT license](https://github.com/ueberdosis/tiptap-next/blob/main/LICENSE.md).
14
+ Tiptap is open sourced software licensed under the [MIT license](https://github.com/ueberdosis/tiptap/blob/main/LICENSE.md).
package/dist/index.cjs ADDED
@@ -0,0 +1,305 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ var core = require('@tiptap/core');
6
+ var state = require('@tiptap/pm/state');
7
+ var tables = require('@tiptap/pm/tables');
8
+
9
+ function updateColumns(node, colgroup, table, cellMinWidth, overrideCol, overrideValue) {
10
+ let totalWidth = 0;
11
+ let fixedWidth = true;
12
+ let nextDOM = colgroup.firstChild;
13
+ const row = node.firstChild;
14
+ for (let i = 0, col = 0; i < row.childCount; i += 1) {
15
+ const { colspan, colwidth } = row.child(i).attrs;
16
+ for (let j = 0; j < colspan; j += 1, col += 1) {
17
+ const hasWidth = overrideCol === col ? overrideValue : colwidth && colwidth[j];
18
+ const cssWidth = hasWidth ? `${hasWidth}px` : '';
19
+ totalWidth += hasWidth || cellMinWidth;
20
+ if (!hasWidth) {
21
+ fixedWidth = false;
22
+ }
23
+ if (!nextDOM) {
24
+ colgroup.appendChild(document.createElement('col')).style.width = cssWidth;
25
+ }
26
+ else {
27
+ if (nextDOM.style.width !== cssWidth) {
28
+ nextDOM.style.width = cssWidth;
29
+ }
30
+ nextDOM = nextDOM.nextSibling;
31
+ }
32
+ }
33
+ }
34
+ while (nextDOM) {
35
+ const after = nextDOM.nextSibling;
36
+ nextDOM.parentNode.removeChild(nextDOM);
37
+ nextDOM = after;
38
+ }
39
+ if (fixedWidth) {
40
+ table.style.width = `${totalWidth}px`;
41
+ table.style.minWidth = '';
42
+ }
43
+ else {
44
+ table.style.width = '';
45
+ table.style.minWidth = `${totalWidth}px`;
46
+ }
47
+ }
48
+ class TableView {
49
+ constructor(node, cellMinWidth) {
50
+ this.node = node;
51
+ this.cellMinWidth = cellMinWidth;
52
+ this.dom = document.createElement('div');
53
+ this.dom.className = 'tableWrapper';
54
+ this.table = this.dom.appendChild(document.createElement('table'));
55
+ this.colgroup = this.table.appendChild(document.createElement('colgroup'));
56
+ updateColumns(node, this.colgroup, this.table, cellMinWidth);
57
+ this.contentDOM = this.table.appendChild(document.createElement('tbody'));
58
+ }
59
+ update(node) {
60
+ if (node.type !== this.node.type) {
61
+ return false;
62
+ }
63
+ this.node = node;
64
+ updateColumns(node, this.colgroup, this.table, this.cellMinWidth);
65
+ return true;
66
+ }
67
+ ignoreMutation(mutation) {
68
+ return (mutation.type === 'attributes'
69
+ && (mutation.target === this.table || this.colgroup.contains(mutation.target)));
70
+ }
71
+ }
72
+
73
+ function createCell(cellType, cellContent) {
74
+ if (cellContent) {
75
+ return cellType.createChecked(null, cellContent);
76
+ }
77
+ return cellType.createAndFill();
78
+ }
79
+
80
+ function getTableNodeTypes(schema) {
81
+ if (schema.cached.tableNodeTypes) {
82
+ return schema.cached.tableNodeTypes;
83
+ }
84
+ const roles = {};
85
+ Object.keys(schema.nodes).forEach(type => {
86
+ const nodeType = schema.nodes[type];
87
+ if (nodeType.spec.tableRole) {
88
+ roles[nodeType.spec.tableRole] = nodeType;
89
+ }
90
+ });
91
+ schema.cached.tableNodeTypes = roles;
92
+ return roles;
93
+ }
94
+
95
+ function createTable(schema, rowsCount, colsCount, withHeaderRow, cellContent) {
96
+ const types = getTableNodeTypes(schema);
97
+ const headerCells = [];
98
+ const cells = [];
99
+ for (let index = 0; index < colsCount; index += 1) {
100
+ const cell = createCell(types.cell, cellContent);
101
+ if (cell) {
102
+ cells.push(cell);
103
+ }
104
+ if (withHeaderRow) {
105
+ const headerCell = createCell(types.header_cell, cellContent);
106
+ if (headerCell) {
107
+ headerCells.push(headerCell);
108
+ }
109
+ }
110
+ }
111
+ const rows = [];
112
+ for (let index = 0; index < rowsCount; index += 1) {
113
+ rows.push(types.row.createChecked(null, withHeaderRow && index === 0 ? headerCells : cells));
114
+ }
115
+ return types.table.createChecked(null, rows);
116
+ }
117
+
118
+ function isCellSelection(value) {
119
+ return value instanceof tables.CellSelection;
120
+ }
121
+
122
+ const deleteTableWhenAllCellsSelected = ({ editor }) => {
123
+ const { selection } = editor.state;
124
+ if (!isCellSelection(selection)) {
125
+ return false;
126
+ }
127
+ let cellCount = 0;
128
+ const table = core.findParentNodeClosestToPos(selection.ranges[0].$from, node => {
129
+ return node.type.name === 'table';
130
+ });
131
+ table === null || table === void 0 ? void 0 : table.node.descendants(node => {
132
+ if (node.type.name === 'table') {
133
+ return false;
134
+ }
135
+ if (['tableCell', 'tableHeader'].includes(node.type.name)) {
136
+ cellCount += 1;
137
+ }
138
+ });
139
+ const allCellsSelected = cellCount === selection.ranges.length;
140
+ if (!allCellsSelected) {
141
+ return false;
142
+ }
143
+ editor.commands.deleteTable();
144
+ return true;
145
+ };
146
+
147
+ const Table = core.Node.create({
148
+ name: 'table',
149
+ // @ts-ignore
150
+ addOptions() {
151
+ return {
152
+ HTMLAttributes: {},
153
+ resizable: false,
154
+ handleWidth: 5,
155
+ cellMinWidth: 25,
156
+ // TODO: fix
157
+ View: TableView,
158
+ lastColumnResizable: true,
159
+ allowTableNodeSelection: false,
160
+ };
161
+ },
162
+ content: 'tableRow+',
163
+ tableRole: 'table',
164
+ isolating: true,
165
+ group: 'block',
166
+ parseHTML() {
167
+ return [{ tag: 'table' }];
168
+ },
169
+ renderHTML({ HTMLAttributes }) {
170
+ return ['table', core.mergeAttributes(this.options.HTMLAttributes, HTMLAttributes), ['tbody', 0]];
171
+ },
172
+ addCommands() {
173
+ return {
174
+ insertTable: ({ rows = 3, cols = 3, withHeaderRow = true } = {}) => ({ tr, dispatch, editor }) => {
175
+ const node = createTable(editor.schema, rows, cols, withHeaderRow);
176
+ if (dispatch) {
177
+ const offset = tr.selection.anchor + 1;
178
+ tr.replaceSelectionWith(node)
179
+ .scrollIntoView()
180
+ .setSelection(state.TextSelection.near(tr.doc.resolve(offset)));
181
+ }
182
+ return true;
183
+ },
184
+ addColumnBefore: () => ({ state, dispatch }) => {
185
+ return tables.addColumnBefore(state, dispatch);
186
+ },
187
+ addColumnAfter: () => ({ state, dispatch }) => {
188
+ return tables.addColumnAfter(state, dispatch);
189
+ },
190
+ deleteColumn: () => ({ state, dispatch }) => {
191
+ return tables.deleteColumn(state, dispatch);
192
+ },
193
+ addRowBefore: () => ({ state, dispatch }) => {
194
+ return tables.addRowBefore(state, dispatch);
195
+ },
196
+ addRowAfter: () => ({ state, dispatch }) => {
197
+ return tables.addRowAfter(state, dispatch);
198
+ },
199
+ deleteRow: () => ({ state, dispatch }) => {
200
+ return tables.deleteRow(state, dispatch);
201
+ },
202
+ deleteTable: () => ({ state, dispatch }) => {
203
+ return tables.deleteTable(state, dispatch);
204
+ },
205
+ mergeCells: () => ({ state, dispatch }) => {
206
+ return tables.mergeCells(state, dispatch);
207
+ },
208
+ splitCell: () => ({ state, dispatch }) => {
209
+ return tables.splitCell(state, dispatch);
210
+ },
211
+ toggleHeaderColumn: () => ({ state, dispatch }) => {
212
+ return tables.toggleHeader('column')(state, dispatch);
213
+ },
214
+ toggleHeaderRow: () => ({ state, dispatch }) => {
215
+ return tables.toggleHeader('row')(state, dispatch);
216
+ },
217
+ toggleHeaderCell: () => ({ state, dispatch }) => {
218
+ return tables.toggleHeaderCell(state, dispatch);
219
+ },
220
+ mergeOrSplit: () => ({ state, dispatch }) => {
221
+ if (tables.mergeCells(state, dispatch)) {
222
+ return true;
223
+ }
224
+ return tables.splitCell(state, dispatch);
225
+ },
226
+ setCellAttribute: (name, value) => ({ state, dispatch }) => {
227
+ return tables.setCellAttr(name, value)(state, dispatch);
228
+ },
229
+ goToNextCell: () => ({ state, dispatch }) => {
230
+ return tables.goToNextCell(1)(state, dispatch);
231
+ },
232
+ goToPreviousCell: () => ({ state, dispatch }) => {
233
+ return tables.goToNextCell(-1)(state, dispatch);
234
+ },
235
+ fixTables: () => ({ state, dispatch }) => {
236
+ if (dispatch) {
237
+ tables.fixTables(state);
238
+ }
239
+ return true;
240
+ },
241
+ setCellSelection: position => ({ tr, dispatch }) => {
242
+ if (dispatch) {
243
+ const selection = tables.CellSelection.create(tr.doc, position.anchorCell, position.headCell);
244
+ // @ts-ignore
245
+ tr.setSelection(selection);
246
+ }
247
+ return true;
248
+ },
249
+ };
250
+ },
251
+ addKeyboardShortcuts() {
252
+ return {
253
+ Tab: () => {
254
+ if (this.editor.commands.goToNextCell()) {
255
+ return true;
256
+ }
257
+ if (!this.editor.can().addRowAfter()) {
258
+ return false;
259
+ }
260
+ return this.editor.chain().addRowAfter().goToNextCell().run();
261
+ },
262
+ 'Shift-Tab': () => this.editor.commands.goToPreviousCell(),
263
+ Backspace: deleteTableWhenAllCellsSelected,
264
+ 'Mod-Backspace': deleteTableWhenAllCellsSelected,
265
+ Delete: deleteTableWhenAllCellsSelected,
266
+ 'Mod-Delete': deleteTableWhenAllCellsSelected,
267
+ };
268
+ },
269
+ addProseMirrorPlugins() {
270
+ const isResizable = this.options.resizable && this.editor.isEditable;
271
+ return [
272
+ ...(isResizable
273
+ ? [
274
+ tables.columnResizing({
275
+ handleWidth: this.options.handleWidth,
276
+ cellMinWidth: this.options.cellMinWidth,
277
+ // @ts-ignore (incorrect type)
278
+ View: this.options.View,
279
+ // TODO: PR for @types/prosemirror-tables
280
+ // @ts-ignore (incorrect type)
281
+ lastColumnResizable: this.options.lastColumnResizable,
282
+ }),
283
+ ]
284
+ : []),
285
+ tables.tableEditing({
286
+ allowTableNodeSelection: this.options.allowTableNodeSelection,
287
+ }),
288
+ ];
289
+ },
290
+ extendNodeSchema(extension) {
291
+ const context = {
292
+ name: extension.name,
293
+ options: extension.options,
294
+ storage: extension.storage,
295
+ };
296
+ return {
297
+ tableRole: core.callOrReturn(core.getExtensionField(extension, 'tableRole', context)),
298
+ };
299
+ },
300
+ });
301
+
302
+ exports.Table = Table;
303
+ exports.createTable = createTable;
304
+ exports["default"] = Table;
305
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.cjs","sources":["../src/TableView.ts","../src/utilities/createCell.ts","../src/utilities/getTableNodeTypes.ts","../src/utilities/createTable.ts","../src/utilities/isCellSelection.ts","../src/utilities/deleteTableWhenAllCellsSelected.ts","../src/table.ts"],"sourcesContent":["// @ts-nocheck\nimport { Node as ProseMirrorNode } from '@tiptap/pm/model'\nimport { NodeView } from '@tiptap/pm/view'\n\nexport function updateColumns(\n node: ProseMirrorNode,\n colgroup: Element,\n table: Element,\n cellMinWidth: number,\n overrideCol?: number,\n overrideValue?: any,\n) {\n let totalWidth = 0\n let fixedWidth = true\n let nextDOM = colgroup.firstChild\n const row = node.firstChild\n\n for (let i = 0, col = 0; i < row.childCount; i += 1) {\n const { colspan, colwidth } = row.child(i).attrs\n\n for (let j = 0; j < colspan; j += 1, col += 1) {\n const hasWidth = overrideCol === col ? overrideValue : colwidth && colwidth[j]\n const cssWidth = hasWidth ? `${hasWidth}px` : ''\n\n totalWidth += hasWidth || cellMinWidth\n\n if (!hasWidth) {\n fixedWidth = false\n }\n\n if (!nextDOM) {\n colgroup.appendChild(document.createElement('col')).style.width = cssWidth\n } else {\n if (nextDOM.style.width !== cssWidth) {\n nextDOM.style.width = cssWidth\n }\n\n nextDOM = nextDOM.nextSibling\n }\n }\n }\n\n while (nextDOM) {\n const after = nextDOM.nextSibling\n\n nextDOM.parentNode.removeChild(nextDOM)\n nextDOM = after\n }\n\n if (fixedWidth) {\n table.style.width = `${totalWidth}px`\n table.style.minWidth = ''\n } else {\n table.style.width = ''\n table.style.minWidth = `${totalWidth}px`\n }\n}\n\nexport class TableView implements NodeView {\n node: ProseMirrorNode\n\n cellMinWidth: number\n\n dom: Element\n\n table: Element\n\n colgroup: Element\n\n contentDOM: Element\n\n constructor(node: ProseMirrorNode, cellMinWidth: number) {\n this.node = node\n this.cellMinWidth = cellMinWidth\n this.dom = document.createElement('div')\n this.dom.className = 'tableWrapper'\n this.table = this.dom.appendChild(document.createElement('table'))\n this.colgroup = this.table.appendChild(document.createElement('colgroup'))\n updateColumns(node, this.colgroup, this.table, cellMinWidth)\n this.contentDOM = this.table.appendChild(document.createElement('tbody'))\n }\n\n update(node: ProseMirrorNode) {\n if (node.type !== this.node.type) {\n return false\n }\n\n this.node = node\n updateColumns(node, this.colgroup, this.table, this.cellMinWidth)\n\n return true\n }\n\n ignoreMutation(mutation: MutationRecord | { type: 'selection'; target: Element }) {\n return (\n mutation.type === 'attributes'\n && (mutation.target === this.table || this.colgroup.contains(mutation.target))\n )\n }\n}\n","import { Fragment, Node as ProsemirrorNode, NodeType } from '@tiptap/pm/model'\n\nexport function createCell(\n cellType: NodeType,\n cellContent?: Fragment | ProsemirrorNode | Array<ProsemirrorNode>,\n): ProsemirrorNode | null | undefined {\n if (cellContent) {\n return cellType.createChecked(null, cellContent)\n }\n\n return cellType.createAndFill()\n}\n","import { NodeType, Schema } from '@tiptap/pm/model'\n\nexport function getTableNodeTypes(schema: Schema): { [key: string]: NodeType } {\n if (schema.cached.tableNodeTypes) {\n return schema.cached.tableNodeTypes\n }\n\n const roles: { [key: string]: NodeType } = {}\n\n Object.keys(schema.nodes).forEach(type => {\n const nodeType = schema.nodes[type]\n\n if (nodeType.spec.tableRole) {\n roles[nodeType.spec.tableRole] = nodeType\n }\n })\n\n schema.cached.tableNodeTypes = roles\n\n return roles\n}\n","import { Fragment, Node as ProsemirrorNode, Schema } from '@tiptap/pm/model'\n\nimport { createCell } from './createCell'\nimport { getTableNodeTypes } from './getTableNodeTypes'\n\nexport function createTable(\n schema: Schema,\n rowsCount: number,\n colsCount: number,\n withHeaderRow: boolean,\n cellContent?: Fragment | ProsemirrorNode | Array<ProsemirrorNode>,\n): ProsemirrorNode {\n const types = getTableNodeTypes(schema)\n const headerCells: ProsemirrorNode[] = []\n const cells: ProsemirrorNode[] = []\n\n for (let index = 0; index < colsCount; index += 1) {\n const cell = createCell(types.cell, cellContent)\n\n if (cell) {\n cells.push(cell)\n }\n\n if (withHeaderRow) {\n const headerCell = createCell(types.header_cell, cellContent)\n\n if (headerCell) {\n headerCells.push(headerCell)\n }\n }\n }\n\n const rows: ProsemirrorNode[] = []\n\n for (let index = 0; index < rowsCount; index += 1) {\n rows.push(types.row.createChecked(null, withHeaderRow && index === 0 ? headerCells : cells))\n }\n\n return types.table.createChecked(null, rows)\n}\n","import { CellSelection } from '@tiptap/pm/tables'\n\nexport function isCellSelection(value: unknown): value is CellSelection {\n return value instanceof CellSelection\n}\n","import { findParentNodeClosestToPos, KeyboardShortcutCommand } from '@tiptap/core'\n\nimport { isCellSelection } from './isCellSelection'\n\nexport const deleteTableWhenAllCellsSelected: KeyboardShortcutCommand = ({ editor }) => {\n const { selection } = editor.state\n\n if (!isCellSelection(selection)) {\n return false\n }\n\n let cellCount = 0\n const table = findParentNodeClosestToPos(selection.ranges[0].$from, node => {\n return node.type.name === 'table'\n })\n\n table?.node.descendants(node => {\n if (node.type.name === 'table') {\n return false\n }\n\n if (['tableCell', 'tableHeader'].includes(node.type.name)) {\n cellCount += 1\n }\n })\n\n const allCellsSelected = cellCount === selection.ranges.length\n\n if (!allCellsSelected) {\n return false\n }\n\n editor.commands.deleteTable()\n\n return true\n}\n","import {\n callOrReturn, getExtensionField, mergeAttributes, Node, ParentConfig,\n} from '@tiptap/core'\nimport { TextSelection } from '@tiptap/pm/state'\nimport {\n addColumnAfter,\n addColumnBefore,\n addRowAfter,\n addRowBefore,\n CellSelection,\n columnResizing,\n deleteColumn,\n deleteRow,\n deleteTable,\n fixTables,\n goToNextCell,\n mergeCells,\n setCellAttr,\n splitCell,\n tableEditing,\n toggleHeader,\n toggleHeaderCell,\n} from '@tiptap/pm/tables'\nimport { NodeView } from '@tiptap/pm/view'\n\nimport { TableView } from './TableView'\nimport { createTable } from './utilities/createTable'\nimport { deleteTableWhenAllCellsSelected } from './utilities/deleteTableWhenAllCellsSelected'\n\nexport interface TableOptions {\n HTMLAttributes: Record<string, any>\n resizable: boolean\n handleWidth: number\n cellMinWidth: number\n View: NodeView\n lastColumnResizable: boolean\n allowTableNodeSelection: boolean\n}\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n table: {\n insertTable: (options?: {\n rows?: number\n cols?: number\n withHeaderRow?: boolean\n }) => ReturnType\n addColumnBefore: () => ReturnType\n addColumnAfter: () => ReturnType\n deleteColumn: () => ReturnType\n addRowBefore: () => ReturnType\n addRowAfter: () => ReturnType\n deleteRow: () => ReturnType\n deleteTable: () => ReturnType\n mergeCells: () => ReturnType\n splitCell: () => ReturnType\n toggleHeaderColumn: () => ReturnType\n toggleHeaderRow: () => ReturnType\n toggleHeaderCell: () => ReturnType\n mergeOrSplit: () => ReturnType\n setCellAttribute: (name: string, value: any) => ReturnType\n goToNextCell: () => ReturnType\n goToPreviousCell: () => ReturnType\n fixTables: () => ReturnType\n setCellSelection: (position: { anchorCell: number; headCell?: number }) => ReturnType\n }\n }\n\n interface NodeConfig<Options, Storage> {\n /**\n * Table Role\n */\n tableRole?:\n | string\n | ((this: {\n name: string\n options: Options\n storage: Storage\n parent: ParentConfig<NodeConfig<Options>>['tableRole']\n }) => string)\n }\n}\n\nexport const Table = Node.create<TableOptions>({\n name: 'table',\n\n // @ts-ignore\n addOptions() {\n return {\n HTMLAttributes: {},\n resizable: false,\n handleWidth: 5,\n cellMinWidth: 25,\n // TODO: fix\n View: TableView,\n lastColumnResizable: true,\n allowTableNodeSelection: false,\n }\n },\n\n content: 'tableRow+',\n\n tableRole: 'table',\n\n isolating: true,\n\n group: 'block',\n\n parseHTML() {\n return [{ tag: 'table' }]\n },\n\n renderHTML({ HTMLAttributes }) {\n return ['table', mergeAttributes(this.options.HTMLAttributes, HTMLAttributes), ['tbody', 0]]\n },\n\n addCommands() {\n return {\n insertTable:\n ({ rows = 3, cols = 3, withHeaderRow = true } = {}) => ({ tr, dispatch, editor }) => {\n const node = createTable(editor.schema, rows, cols, withHeaderRow)\n\n if (dispatch) {\n const offset = tr.selection.anchor + 1\n\n tr.replaceSelectionWith(node)\n .scrollIntoView()\n .setSelection(TextSelection.near(tr.doc.resolve(offset)))\n }\n\n return true\n },\n addColumnBefore:\n () => ({ state, dispatch }) => {\n return addColumnBefore(state, dispatch)\n },\n addColumnAfter:\n () => ({ state, dispatch }) => {\n return addColumnAfter(state, dispatch)\n },\n deleteColumn:\n () => ({ state, dispatch }) => {\n return deleteColumn(state, dispatch)\n },\n addRowBefore:\n () => ({ state, dispatch }) => {\n return addRowBefore(state, dispatch)\n },\n addRowAfter:\n () => ({ state, dispatch }) => {\n return addRowAfter(state, dispatch)\n },\n deleteRow:\n () => ({ state, dispatch }) => {\n return deleteRow(state, dispatch)\n },\n deleteTable:\n () => ({ state, dispatch }) => {\n return deleteTable(state, dispatch)\n },\n mergeCells:\n () => ({ state, dispatch }) => {\n return mergeCells(state, dispatch)\n },\n splitCell:\n () => ({ state, dispatch }) => {\n return splitCell(state, dispatch)\n },\n toggleHeaderColumn:\n () => ({ state, dispatch }) => {\n return toggleHeader('column')(state, dispatch)\n },\n toggleHeaderRow:\n () => ({ state, dispatch }) => {\n return toggleHeader('row')(state, dispatch)\n },\n toggleHeaderCell:\n () => ({ state, dispatch }) => {\n return toggleHeaderCell(state, dispatch)\n },\n mergeOrSplit:\n () => ({ state, dispatch }) => {\n if (mergeCells(state, dispatch)) {\n return true\n }\n\n return splitCell(state, dispatch)\n },\n setCellAttribute:\n (name, value) => ({ state, dispatch }) => {\n return setCellAttr(name, value)(state, dispatch)\n },\n goToNextCell:\n () => ({ state, dispatch }) => {\n return goToNextCell(1)(state, dispatch)\n },\n goToPreviousCell:\n () => ({ state, dispatch }) => {\n return goToNextCell(-1)(state, dispatch)\n },\n fixTables:\n () => ({ state, dispatch }) => {\n if (dispatch) {\n fixTables(state)\n }\n\n return true\n },\n setCellSelection:\n position => ({ tr, dispatch }) => {\n if (dispatch) {\n const selection = CellSelection.create(tr.doc, position.anchorCell, position.headCell)\n\n // @ts-ignore\n tr.setSelection(selection)\n }\n\n return true\n },\n }\n },\n\n addKeyboardShortcuts() {\n return {\n Tab: () => {\n if (this.editor.commands.goToNextCell()) {\n return true\n }\n\n if (!this.editor.can().addRowAfter()) {\n return false\n }\n\n return this.editor.chain().addRowAfter().goToNextCell().run()\n },\n 'Shift-Tab': () => this.editor.commands.goToPreviousCell(),\n Backspace: deleteTableWhenAllCellsSelected,\n 'Mod-Backspace': deleteTableWhenAllCellsSelected,\n Delete: deleteTableWhenAllCellsSelected,\n 'Mod-Delete': deleteTableWhenAllCellsSelected,\n }\n },\n\n addProseMirrorPlugins() {\n const isResizable = this.options.resizable && this.editor.isEditable\n\n return [\n ...(isResizable\n ? [\n columnResizing({\n handleWidth: this.options.handleWidth,\n cellMinWidth: this.options.cellMinWidth,\n // @ts-ignore (incorrect type)\n View: this.options.View,\n // TODO: PR for @types/prosemirror-tables\n // @ts-ignore (incorrect type)\n lastColumnResizable: this.options.lastColumnResizable,\n }),\n ]\n : []),\n tableEditing({\n allowTableNodeSelection: this.options.allowTableNodeSelection,\n }),\n ]\n },\n\n extendNodeSchema(extension) {\n const context = {\n name: extension.name,\n options: extension.options,\n storage: extension.storage,\n }\n\n return {\n tableRole: callOrReturn(getExtensionField(extension, 'tableRole', context)),\n }\n },\n})\n"],"names":["CellSelection","findParentNodeClosestToPos","Node","mergeAttributes","TextSelection","addColumnBefore","addColumnAfter","deleteColumn","addRowBefore","addRowAfter","deleteRow","deleteTable","mergeCells","splitCell","toggleHeader","toggleHeaderCell","setCellAttr","goToNextCell","fixTables","columnResizing","tableEditing","callOrReturn","getExtensionField"],"mappings":"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"}
package/dist/index.js ADDED
@@ -0,0 +1,299 @@
1
+ import { findParentNodeClosestToPos, Node, mergeAttributes, callOrReturn, getExtensionField } from '@tiptap/core';
2
+ import { TextSelection } from '@tiptap/pm/state';
3
+ import { CellSelection, addColumnBefore, addColumnAfter, deleteColumn, addRowBefore, addRowAfter, deleteRow, deleteTable, mergeCells, splitCell, toggleHeader, toggleHeaderCell, setCellAttr, goToNextCell, fixTables, columnResizing, tableEditing } from '@tiptap/pm/tables';
4
+
5
+ function updateColumns(node, colgroup, table, cellMinWidth, overrideCol, overrideValue) {
6
+ let totalWidth = 0;
7
+ let fixedWidth = true;
8
+ let nextDOM = colgroup.firstChild;
9
+ const row = node.firstChild;
10
+ for (let i = 0, col = 0; i < row.childCount; i += 1) {
11
+ const { colspan, colwidth } = row.child(i).attrs;
12
+ for (let j = 0; j < colspan; j += 1, col += 1) {
13
+ const hasWidth = overrideCol === col ? overrideValue : colwidth && colwidth[j];
14
+ const cssWidth = hasWidth ? `${hasWidth}px` : '';
15
+ totalWidth += hasWidth || cellMinWidth;
16
+ if (!hasWidth) {
17
+ fixedWidth = false;
18
+ }
19
+ if (!nextDOM) {
20
+ colgroup.appendChild(document.createElement('col')).style.width = cssWidth;
21
+ }
22
+ else {
23
+ if (nextDOM.style.width !== cssWidth) {
24
+ nextDOM.style.width = cssWidth;
25
+ }
26
+ nextDOM = nextDOM.nextSibling;
27
+ }
28
+ }
29
+ }
30
+ while (nextDOM) {
31
+ const after = nextDOM.nextSibling;
32
+ nextDOM.parentNode.removeChild(nextDOM);
33
+ nextDOM = after;
34
+ }
35
+ if (fixedWidth) {
36
+ table.style.width = `${totalWidth}px`;
37
+ table.style.minWidth = '';
38
+ }
39
+ else {
40
+ table.style.width = '';
41
+ table.style.minWidth = `${totalWidth}px`;
42
+ }
43
+ }
44
+ class TableView {
45
+ constructor(node, cellMinWidth) {
46
+ this.node = node;
47
+ this.cellMinWidth = cellMinWidth;
48
+ this.dom = document.createElement('div');
49
+ this.dom.className = 'tableWrapper';
50
+ this.table = this.dom.appendChild(document.createElement('table'));
51
+ this.colgroup = this.table.appendChild(document.createElement('colgroup'));
52
+ updateColumns(node, this.colgroup, this.table, cellMinWidth);
53
+ this.contentDOM = this.table.appendChild(document.createElement('tbody'));
54
+ }
55
+ update(node) {
56
+ if (node.type !== this.node.type) {
57
+ return false;
58
+ }
59
+ this.node = node;
60
+ updateColumns(node, this.colgroup, this.table, this.cellMinWidth);
61
+ return true;
62
+ }
63
+ ignoreMutation(mutation) {
64
+ return (mutation.type === 'attributes'
65
+ && (mutation.target === this.table || this.colgroup.contains(mutation.target)));
66
+ }
67
+ }
68
+
69
+ function createCell(cellType, cellContent) {
70
+ if (cellContent) {
71
+ return cellType.createChecked(null, cellContent);
72
+ }
73
+ return cellType.createAndFill();
74
+ }
75
+
76
+ function getTableNodeTypes(schema) {
77
+ if (schema.cached.tableNodeTypes) {
78
+ return schema.cached.tableNodeTypes;
79
+ }
80
+ const roles = {};
81
+ Object.keys(schema.nodes).forEach(type => {
82
+ const nodeType = schema.nodes[type];
83
+ if (nodeType.spec.tableRole) {
84
+ roles[nodeType.spec.tableRole] = nodeType;
85
+ }
86
+ });
87
+ schema.cached.tableNodeTypes = roles;
88
+ return roles;
89
+ }
90
+
91
+ function createTable(schema, rowsCount, colsCount, withHeaderRow, cellContent) {
92
+ const types = getTableNodeTypes(schema);
93
+ const headerCells = [];
94
+ const cells = [];
95
+ for (let index = 0; index < colsCount; index += 1) {
96
+ const cell = createCell(types.cell, cellContent);
97
+ if (cell) {
98
+ cells.push(cell);
99
+ }
100
+ if (withHeaderRow) {
101
+ const headerCell = createCell(types.header_cell, cellContent);
102
+ if (headerCell) {
103
+ headerCells.push(headerCell);
104
+ }
105
+ }
106
+ }
107
+ const rows = [];
108
+ for (let index = 0; index < rowsCount; index += 1) {
109
+ rows.push(types.row.createChecked(null, withHeaderRow && index === 0 ? headerCells : cells));
110
+ }
111
+ return types.table.createChecked(null, rows);
112
+ }
113
+
114
+ function isCellSelection(value) {
115
+ return value instanceof CellSelection;
116
+ }
117
+
118
+ const deleteTableWhenAllCellsSelected = ({ editor }) => {
119
+ const { selection } = editor.state;
120
+ if (!isCellSelection(selection)) {
121
+ return false;
122
+ }
123
+ let cellCount = 0;
124
+ const table = findParentNodeClosestToPos(selection.ranges[0].$from, node => {
125
+ return node.type.name === 'table';
126
+ });
127
+ table === null || table === void 0 ? void 0 : table.node.descendants(node => {
128
+ if (node.type.name === 'table') {
129
+ return false;
130
+ }
131
+ if (['tableCell', 'tableHeader'].includes(node.type.name)) {
132
+ cellCount += 1;
133
+ }
134
+ });
135
+ const allCellsSelected = cellCount === selection.ranges.length;
136
+ if (!allCellsSelected) {
137
+ return false;
138
+ }
139
+ editor.commands.deleteTable();
140
+ return true;
141
+ };
142
+
143
+ const Table = Node.create({
144
+ name: 'table',
145
+ // @ts-ignore
146
+ addOptions() {
147
+ return {
148
+ HTMLAttributes: {},
149
+ resizable: false,
150
+ handleWidth: 5,
151
+ cellMinWidth: 25,
152
+ // TODO: fix
153
+ View: TableView,
154
+ lastColumnResizable: true,
155
+ allowTableNodeSelection: false,
156
+ };
157
+ },
158
+ content: 'tableRow+',
159
+ tableRole: 'table',
160
+ isolating: true,
161
+ group: 'block',
162
+ parseHTML() {
163
+ return [{ tag: 'table' }];
164
+ },
165
+ renderHTML({ HTMLAttributes }) {
166
+ return ['table', mergeAttributes(this.options.HTMLAttributes, HTMLAttributes), ['tbody', 0]];
167
+ },
168
+ addCommands() {
169
+ return {
170
+ insertTable: ({ rows = 3, cols = 3, withHeaderRow = true } = {}) => ({ tr, dispatch, editor }) => {
171
+ const node = createTable(editor.schema, rows, cols, withHeaderRow);
172
+ if (dispatch) {
173
+ const offset = tr.selection.anchor + 1;
174
+ tr.replaceSelectionWith(node)
175
+ .scrollIntoView()
176
+ .setSelection(TextSelection.near(tr.doc.resolve(offset)));
177
+ }
178
+ return true;
179
+ },
180
+ addColumnBefore: () => ({ state, dispatch }) => {
181
+ return addColumnBefore(state, dispatch);
182
+ },
183
+ addColumnAfter: () => ({ state, dispatch }) => {
184
+ return addColumnAfter(state, dispatch);
185
+ },
186
+ deleteColumn: () => ({ state, dispatch }) => {
187
+ return deleteColumn(state, dispatch);
188
+ },
189
+ addRowBefore: () => ({ state, dispatch }) => {
190
+ return addRowBefore(state, dispatch);
191
+ },
192
+ addRowAfter: () => ({ state, dispatch }) => {
193
+ return addRowAfter(state, dispatch);
194
+ },
195
+ deleteRow: () => ({ state, dispatch }) => {
196
+ return deleteRow(state, dispatch);
197
+ },
198
+ deleteTable: () => ({ state, dispatch }) => {
199
+ return deleteTable(state, dispatch);
200
+ },
201
+ mergeCells: () => ({ state, dispatch }) => {
202
+ return mergeCells(state, dispatch);
203
+ },
204
+ splitCell: () => ({ state, dispatch }) => {
205
+ return splitCell(state, dispatch);
206
+ },
207
+ toggleHeaderColumn: () => ({ state, dispatch }) => {
208
+ return toggleHeader('column')(state, dispatch);
209
+ },
210
+ toggleHeaderRow: () => ({ state, dispatch }) => {
211
+ return toggleHeader('row')(state, dispatch);
212
+ },
213
+ toggleHeaderCell: () => ({ state, dispatch }) => {
214
+ return toggleHeaderCell(state, dispatch);
215
+ },
216
+ mergeOrSplit: () => ({ state, dispatch }) => {
217
+ if (mergeCells(state, dispatch)) {
218
+ return true;
219
+ }
220
+ return splitCell(state, dispatch);
221
+ },
222
+ setCellAttribute: (name, value) => ({ state, dispatch }) => {
223
+ return setCellAttr(name, value)(state, dispatch);
224
+ },
225
+ goToNextCell: () => ({ state, dispatch }) => {
226
+ return goToNextCell(1)(state, dispatch);
227
+ },
228
+ goToPreviousCell: () => ({ state, dispatch }) => {
229
+ return goToNextCell(-1)(state, dispatch);
230
+ },
231
+ fixTables: () => ({ state, dispatch }) => {
232
+ if (dispatch) {
233
+ fixTables(state);
234
+ }
235
+ return true;
236
+ },
237
+ setCellSelection: position => ({ tr, dispatch }) => {
238
+ if (dispatch) {
239
+ const selection = CellSelection.create(tr.doc, position.anchorCell, position.headCell);
240
+ // @ts-ignore
241
+ tr.setSelection(selection);
242
+ }
243
+ return true;
244
+ },
245
+ };
246
+ },
247
+ addKeyboardShortcuts() {
248
+ return {
249
+ Tab: () => {
250
+ if (this.editor.commands.goToNextCell()) {
251
+ return true;
252
+ }
253
+ if (!this.editor.can().addRowAfter()) {
254
+ return false;
255
+ }
256
+ return this.editor.chain().addRowAfter().goToNextCell().run();
257
+ },
258
+ 'Shift-Tab': () => this.editor.commands.goToPreviousCell(),
259
+ Backspace: deleteTableWhenAllCellsSelected,
260
+ 'Mod-Backspace': deleteTableWhenAllCellsSelected,
261
+ Delete: deleteTableWhenAllCellsSelected,
262
+ 'Mod-Delete': deleteTableWhenAllCellsSelected,
263
+ };
264
+ },
265
+ addProseMirrorPlugins() {
266
+ const isResizable = this.options.resizable && this.editor.isEditable;
267
+ return [
268
+ ...(isResizable
269
+ ? [
270
+ columnResizing({
271
+ handleWidth: this.options.handleWidth,
272
+ cellMinWidth: this.options.cellMinWidth,
273
+ // @ts-ignore (incorrect type)
274
+ View: this.options.View,
275
+ // TODO: PR for @types/prosemirror-tables
276
+ // @ts-ignore (incorrect type)
277
+ lastColumnResizable: this.options.lastColumnResizable,
278
+ }),
279
+ ]
280
+ : []),
281
+ tableEditing({
282
+ allowTableNodeSelection: this.options.allowTableNodeSelection,
283
+ }),
284
+ ];
285
+ },
286
+ extendNodeSchema(extension) {
287
+ const context = {
288
+ name: extension.name,
289
+ options: extension.options,
290
+ storage: extension.storage,
291
+ };
292
+ return {
293
+ tableRole: callOrReturn(getExtensionField(extension, 'tableRole', context)),
294
+ };
295
+ },
296
+ });
297
+
298
+ export { Table, createTable, Table as default };
299
+ //# sourceMappingURL=index.js.map