1- import { Fragment } from 'prosemirror-model' ;
21import type { Command } from 'prosemirror-state' ;
3- import { findParentNodeClosestToPos } from 'prosemirror-utils' ;
42
53import { isTableNode } from '..' ;
6- import { findChildTableCells , findChildTableRows } from '../utils' ;
4+ import { isTableBodyNode , isTableCellNode , isTableRowNode } from '../utils' ;
75
86export 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