1+ import { Fragment } from 'prosemirror-model' ;
12import { Plugin , PluginKey } from 'prosemirror-state' ;
23import {
3- findChildren ,
44 findParentNode ,
55 findParentNodeClosestToPos ,
66 findSelectedNodeOfType ,
@@ -14,6 +14,7 @@ import {
1414 isTableNode ,
1515 isTableRowNode ,
1616} from '../../../../table-utils' ;
17+ import { getChildrenOfNode } from '../../../../utils' ;
1718import { YfmTableNode } from '../const' ;
1819
1920import { viewB , yfmTableView } from './view' ;
@@ -88,43 +89,33 @@ export const tableControlsPlugin = () =>
8889 const pos = view . posAtCoords ( { left : e . x , top : e . y } ) ;
8990 if ( ! pos ) return false ;
9091
91- const cell = findParentNodeClosestToPos (
92- view . state . doc . resolve ( pos . pos ) ,
93- isTableCellNode ,
94- ) ;
95- const table = findParentNodeClosestToPos (
96- view . state . doc . resolve ( pos . pos ) ,
97- isTableBodyNode ,
98- ) ;
92+ const $pos = view . state . doc . resolve ( pos . pos ) ;
93+ const cell = findParentNodeClosestToPos ( $pos , isTableCellNode ) ;
94+ const row = findParentNodeClosestToPos ( $pos , isTableRowNode ) ;
95+ const tbody = findParentNodeClosestToPos ( $pos , isTableBodyNode ) ;
9996
10097 let state : State = null ;
10198
102- if ( cell && table ) {
103- const contentDom = view . domAtPos ( cell . pos + 1 ) . node as HTMLElement ;
104- const rowNumber = contentDom . getAttribute ( 'data-row-number' ) ;
105- const colNumber = contentDom . getAttribute ( 'data-col-number' ) ;
106-
107- const rows = findChildren ( table . node , isTableRowNode ) ;
108- const parentRow = rows [ Number ( rowNumber ) ] ;
109- const firstRow = rows [ 0 ] ;
110- const parentCol = findChildren ( rows [ 0 ] . node , isTableCellNode ) [
111- Number ( colNumber )
112- ] ;
113-
114- const rowFrom = parentRow . pos + table . start ;
115- const rowTo = parentRow . pos + parentRow . node . nodeSize + table . start ;
116- const firstRowFrom = firstRow . pos + table . start ;
117-
118- state = {
119- upper : {
120- from : parentCol . pos + firstRowFrom + 1 ,
121- to : parentCol . pos + firstRowFrom + 1 + parentCol . node . nodeSize ,
122- } ,
123- left : {
124- from : rowFrom ,
125- to : rowTo ,
126- } ,
127- } ;
99+ if ( cell && row && tbody ) {
100+ const cellIndex = getChildrenOfNode ( row . node ) . findIndex (
101+ ( child ) => child . node === cell . node ,
102+ ) ;
103+ const firstRowCell = getChildrenOfNode (
104+ tbody . node . firstChild || Fragment . empty ,
105+ ) [ cellIndex ] ;
106+
107+ if ( firstRowCell ) {
108+ const upperFrom = tbody . pos + 2 + firstRowCell . offset ;
109+ const upperTo = upperFrom + firstRowCell . node . nodeSize ;
110+
111+ const leftFrom = row . pos ;
112+ const leftTo = row . pos + row . node . nodeSize ;
113+
114+ state = {
115+ upper : { from : upperFrom , to : upperTo } ,
116+ left : { from : leftFrom , to : leftTo } ,
117+ } ;
118+ }
128119 }
129120
130121 if ( shouldUpdateState ( prevState , state ) ) {
0 commit comments