@@ -6,6 +6,9 @@ export interface Data {
66 value : string ;
77 styles ?: { [ key : string ] : string } ;
88 type ?: string ;
9+ colSpan ?: number ;
10+ rowSpan ?: number ;
11+ skip ?: boolean ; //merged
912}
1013
1114interface Action {
@@ -299,7 +302,6 @@ const actions: DispatcherActions = {
299302 } ,
300303 addColumn ( state , action ) {
301304 state . redo = [ ] ;
302- // state.undo.push(undo);
303305 const index = action . payload . right ? state . selected [ 0 ] [ 1 ] + 1 : state . selected [ 0 ] [ 1 ] ;
304306 const data = state . data ;
305307 state . undo . push ( [ { i : index , j : 0 , type : "add-column" , data : { value : "" } } ] ) ;
@@ -331,6 +333,48 @@ const actions: DispatcherActions = {
331333 ] ) ;
332334 return state ;
333335 } ,
336+ mergeCells ( state ) {
337+ if ( state . selected . length > 0 ) {
338+ state . redo = [ ] ;
339+ const undo : Action [ ] = [ ] ;
340+ const cellForMerge = state . selected [ 0 ] ;
341+ const data = state . data ;
342+ if ( data [ cellForMerge [ 0 ] ] [ cellForMerge [ 1 ] ] . rowSpan ) {
343+ for (
344+ let i = cellForMerge [ 0 ] ;
345+ i <= cellForMerge [ 0 ] + ( data [ cellForMerge [ 0 ] ] [ cellForMerge [ 1 ] ] . rowSpan || 0 ) ;
346+ i ++
347+ ) {
348+ for (
349+ let j = cellForMerge [ 1 ] ;
350+ j <= cellForMerge [ 1 ] + ( data [ cellForMerge [ 0 ] ] [ cellForMerge [ 1 ] ] . colSpan || 0 ) ;
351+ j ++
352+ ) {
353+ undo . push ( { i : i , j : j , data : { ...state . data [ i ] [ j ] } } ) ;
354+ data [ i ] [ j ] . skip = undefined ;
355+ }
356+ }
357+ data [ cellForMerge [ 0 ] ] [ cellForMerge [ 1 ] ] . rowSpan = undefined ;
358+ data [ cellForMerge [ 0 ] ] [ cellForMerge [ 1 ] ] . colSpan = undefined ;
359+ } else if ( state . selected . length > 1 ) {
360+ state . selected . forEach ( ( p , i ) => {
361+ undo . push ( { i : p [ 0 ] , j : p [ 1 ] , data : { ...state . data [ p [ 0 ] ] [ p [ 1 ] ] } } ) ;
362+ if ( i !== 0 ) {
363+ data [ p [ 0 ] ] [ p [ 1 ] ] . value = "" ;
364+ data [ p [ 0 ] ] [ p [ 1 ] ] . skip = true ;
365+ }
366+ } ) ;
367+ data [ cellForMerge [ 0 ] ] [ cellForMerge [ 1 ] ] . rowSpan =
368+ Math . abs ( state . selected [ 0 ] [ 0 ] - state . selected [ state . selected . length - 1 ] [ 0 ] ) + 1 ;
369+ data [ cellForMerge [ 0 ] ] [ cellForMerge [ 1 ] ] . colSpan =
370+ Math . abs ( state . selected [ 0 ] [ 1 ] - state . selected [ state . selected . length - 1 ] [ 1 ] ) + 1 ;
371+ }
372+ state . selected = [ cellForMerge ] ;
373+ state . data = data ;
374+ state . undo . push ( undo ) ;
375+ }
376+ return state ;
377+ } ,
334378} ;
335379
336380export const {
@@ -354,4 +398,5 @@ export const {
354398 addColumn,
355399 deleteRow,
356400 deleteColumn,
401+ mergeCells,
357402} = actions ;
0 commit comments