Skip to content

Commit 64d81a6

Browse files
authored
fix(table-utils): fix deleting columns in tables with nested tables (#231)
1 parent bb9c9b6 commit 64d81a6

File tree

1 file changed

+22
-28
lines changed

1 file changed

+22
-28
lines changed

src/table-utils/commands/removeColumn.ts

Lines changed: 22 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,7 @@
1-
import {Fragment} from 'prosemirror-model';
21
import type {Command} from 'prosemirror-state';
3-
import {findParentNodeClosestToPos} from 'prosemirror-utils';
42

53
import {isTableNode} from '..';
6-
import {findChildTableCells, findChildTableRows} from '../utils';
4+
import {isTableBodyNode, isTableCellNode, isTableRowNode} from '../utils';
75

86
export const removeColumn: Command = (
97
state,
@@ -13,40 +11,36 @@ export const removeColumn: Command = (
1311
) => {
1412
const {tablePos, columnNumber} = attrs;
1513

16-
if (tablePos === undefined || columnNumber === undefined) return false;
14+
if (typeof tablePos !== 'number' || typeof columnNumber !== 'number') return false;
15+
if (Number.isNaN(tablePos) || Number.isNaN(columnNumber)) return false;
16+
if (tablePos < 0 || columnNumber < 0) return false;
1717

18-
const tableNode = findParentNodeClosestToPos(state.doc.resolve(tablePos + 1), isTableNode)
19-
?.node;
18+
const tableNode = state.doc.nodeAt(tablePos);
19+
if (!tableNode || tableNode.nodeSize <= 2 || !isTableNode(tableNode)) return false;
2020

21-
if (!tableNode) return false;
22-
23-
if (!tableNode.firstChild || !tableNode) {
24-
return false;
25-
}
26-
27-
const allRows = findChildTableRows(tableNode);
28-
29-
if (allRows[0].node.childCount < 2) {
30-
// there is one column left
21+
const tableBodyNode = tableNode.firstChild;
22+
if (!tableBodyNode || tableBodyNode.nodeSize <= 2 || !isTableBodyNode(tableBodyNode))
3123
return false;
32-
}
3324

34-
if (columnNumber < 0) {
35-
return false;
36-
}
25+
// there is one column left
26+
if (tableBodyNode.firstChild && tableBodyNode.firstChild.childCount < 2) return false;
3727

3828
if (dispatch) {
39-
let tr = state.tr;
29+
const {tr} = state;
4030

41-
for (const row of allRows) {
42-
const rowCells = findChildTableCells(row.node);
43-
const cell = rowCells[columnNumber];
31+
tableBodyNode.forEach((rowNode, rowOffset) => {
32+
if (!isTableRowNode(rowNode)) return;
4433

45-
const from = tablePos + row.pos + cell.pos + 2;
46-
const to = from + cell.node.nodeSize;
34+
rowNode.forEach((cellNode, cellOffset, cellIndex) => {
35+
if (!isTableCellNode(cellNode)) return;
4736

48-
tr = tr.replaceWith(tr.mapping.map(from), tr.mapping.map(to), Fragment.empty);
49-
}
37+
if (cellIndex === columnNumber) {
38+
const from = tablePos + 1 + rowOffset + 1 + cellOffset;
39+
const to = from + cellNode.nodeSize;
40+
tr.delete(tr.mapping.map(from), tr.mapping.map(to));
41+
}
42+
});
43+
});
5044

5145
dispatch(tr);
5246
}

0 commit comments

Comments
 (0)