@@ -25,6 +25,11 @@ const triggerKeyDownEvent = (wrapper, keyCode, options = {}) => {
2525 wrapper . simulate ( 'keydown' , { keyCode, ...options } )
2626}
2727
28+ const triggerEvent = ( node , keyCode ) => {
29+ node . dispatchEvent ( new Event ( 'focus' ) )
30+ node . dispatchEvent ( new KeyboardEvent ( 'keydown' , { keyCode } ) )
31+ }
32+
2833const triggerMouseEvent = ( node , eventType ) => {
2934 const clickEvent = document . createEvent ( 'MouseEvents' )
3035 clickEvent . initEvent ( eventType , true , true )
@@ -87,7 +92,7 @@ describe('Component', () => {
8792 selected : false ,
8893 cell : {
8994 value : 5 ,
90- data : 5 ,
95+ data : 5
9196 } ,
9297 row : 1 ,
9398 col : 1 ,
@@ -158,7 +163,7 @@ describe('Component', () => {
158163 selected : false ,
159164 cell : {
160165 value : '2' ,
161- data : '5' ,
166+ data : '5'
162167 } ,
163168 row : 1 ,
164169 col : 2 ,
@@ -226,7 +231,7 @@ describe('Component', () => {
226231 const onNavigate = sinon . spy ( )
227232 const onChange = sinon . spy ( )
228233 const onRevert = sinon . spy ( )
229- const cell = {
234+ const cell = {
230235 foo : 'bar' ,
231236 readOnly : false ,
232237 forceComponent : true ,
@@ -262,12 +267,12 @@ describe('Component', () => {
262267 wrapper . setProps ( { cell : { ...cell , forceComponent : false } } )
263268 expect ( wrapper . html ( ) ) . toEqual (
264269 mount ( < td className = 'test cell' colSpan = { 5 } rowSpan = { 4 } style = { { width : '200px' } } >
265- < span className = " value-viewer" > 5</ span >
270+ < span className = ' value-viewer' > 5</ span >
266271 </ td > ) . html ( ) )
267272 wrapper . setProps ( { cell : { ...cell , forceComponent : false , value : 7 } } )
268273 expect ( wrapper . html ( ) ) . toEqual (
269274 mount ( < td className = 'test cell updated' colSpan = { 5 } rowSpan = { 4 } style = { { width : '200px' } } >
270- < span className = " value-viewer" > 7</ span >
275+ < span className = ' value-viewer' > 7</ span >
271276 </ td > ) . html ( ) )
272277 wrapper . simulate ( 'mousedown' )
273278 wrapper . simulate ( 'doubleclick' )
@@ -503,6 +508,61 @@ describe('Component', () => {
503508 expect ( customWrapper . find ( 'td' ) . text ( ) ) . toEqual ( 'COMPONENT RENDERED' )
504509 } )
505510
511+ it ( 'handles a custom editable component and exits on ENTER_KEY' , ( done ) => {
512+ customWrapper = mount ( < DataSheet
513+ data = { [ [ { value : 1 } , { component : < input className = { 'custom-component' } /> } , { value : 2 } ] ] }
514+ valueRenderer = { ( cell ) => 'VALUE RENDERED' }
515+ onChange = { ( cell , i , j , value ) => data [ i ] [ j ] . data = value }
516+ /> )
517+ const cell = customWrapper . find ( 'td' ) . at ( 1 )
518+ cell . simulate ( 'mouseDown' )
519+ cell . simulate ( 'doubleClick' )
520+
521+ expect ( customWrapper . state ( 'start' ) ) . toEqual ( { i : 0 , j : 1 } )
522+ cell . find ( '.custom-component' ) . first ( ) . simulate ( 'doubleClick' )
523+ triggerEvent ( customWrapper . find ( '.data-grid-container' ) . node , TAB_KEY )
524+ setTimeout ( ( ) => {
525+ expect ( customWrapper . state ( 'start' ) ) . toEqual ( { i : 0 , j : 2 } )
526+ done ( )
527+ } , 50 )
528+ } )
529+
530+ it ( 'handles a custom editable component and exits' , ( done ) => {
531+ customWrapper = mount ( < DataSheet
532+ data = { [ [ { value : 1 } , { component : < input className = { 'custom-component' } /> } , { value : 2 } ] ] }
533+ valueRenderer = { ( cell ) => 'VALUE RENDERED' }
534+ onChange = { ( cell , i , j , value ) => data [ i ] [ j ] . data = value }
535+ /> )
536+ const cell = customWrapper . find ( 'td' ) . at ( 1 )
537+
538+ const selectCell = ( ) => {
539+ cell . simulate ( 'mouseDown' )
540+ cell . simulate ( 'doubleClick' )
541+ }
542+
543+ const checkEnterKey = ( callback ) => {
544+ selectCell ( )
545+ expect ( customWrapper . state ( 'start' ) ) . toEqual ( { i : 0 , j : 1 } )
546+ cell . find ( '.custom-component' ) . first ( ) . simulate ( 'doubleClick' )
547+ triggerEvent ( customWrapper . find ( '.data-grid-container' ) . node , ENTER_KEY )
548+ setTimeout ( ( ) => {
549+ expect ( customWrapper . state ( 'start' ) ) . toEqual ( { i : 0 , j : 1 } )
550+ callback ( )
551+ } , 50 )
552+ }
553+ const checkTabKey = ( callback ) => {
554+ selectCell ( )
555+ expect ( customWrapper . state ( 'start' ) ) . toEqual ( { i : 0 , j : 1 } )
556+ cell . find ( '.custom-component' ) . first ( ) . simulate ( 'doubleClick' )
557+ triggerEvent ( customWrapper . find ( '.data-grid-container' ) . node , TAB_KEY )
558+ setTimeout ( ( ) => {
559+ expect ( customWrapper . state ( 'start' ) ) . toEqual ( { i : 0 , j : 2 } )
560+ callback ( )
561+ } , 50 )
562+ }
563+ checkEnterKey ( ( ) => checkTabKey ( done ) )
564+ } )
565+
506566 it ( 'renders a cell with readOnly field properly' , ( ) => {
507567 customWrapper = mount ( < DataSheet
508568 data = { [ [ { data : 12 , readOnly : true } , { data : 24 , readOnly : false } ] ] }
@@ -1169,32 +1229,32 @@ describe('Component', () => {
11691229 } )
11701230
11711231 it ( 'renders a custom header' , ( ) => {
1172- component = < DataSheet
1173- className = { 'test' }
1174- data = { data }
1175- valueRenderer = { ( cell ) => cell . data }
1176- onChange = { ( cell , i , j , value ) => data [ i ] [ j ] . data = value }
1177- sheetRenderer = { props => {
1178- return (
1179- < table className = { props . className } >
1180- < thead >
1181- < tr >
1182- { columns . map ( col => < th key = { col } > { col } </ th > ) }
1183- </ tr >
1184- </ thead >
1185- < tbody >
1186- { props . children }
1187- </ tbody >
1188- </ table >
1189- )
1190- } }
1232+ component = < DataSheet
1233+ className = { 'test' }
1234+ data = { data }
1235+ valueRenderer = { ( cell ) => cell . data }
1236+ onChange = { ( cell , i , j , value ) => data [ i ] [ j ] . data = value }
1237+ sheetRenderer = { props => {
1238+ return (
1239+ < table className = { props . className } >
1240+ < thead >
1241+ < tr >
1242+ { columns . map ( col => < th key = { col } > { col } </ th > ) }
1243+ </ tr >
1244+ </ thead >
1245+ < tbody >
1246+ { props . children }
1247+ </ tbody >
1248+ </ table >
1249+ )
1250+ } }
11911251 />
1192- wrapper = mount ( component )
1252+ wrapper = mount ( component )
11931253 // extra row for header
1194- expect ( wrapper . find ( 'tr' ) . length ) . toEqual ( 3 )
1195- expect ( wrapper . find ( 'th' ) . nodes . map ( n => n . innerHTML ) ) . toEqual ( columns )
1196- expect ( wrapper . find ( 'td span' ) . nodes . map ( n => n . innerHTML ) ) . toEqual ( [ '4' , '2' , '3' , '5' ] )
1197- } )
1254+ expect ( wrapper . find ( 'tr' ) . length ) . toEqual ( 3 )
1255+ expect ( wrapper . find ( 'th' ) . nodes . map ( n => n . innerHTML ) ) . toEqual ( columns )
1256+ expect ( wrapper . find ( 'td span' ) . nodes . map ( n => n . innerHTML ) ) . toEqual ( [ '4' , '2' , '3' , '5' ] )
1257+ } )
11981258
11991259 // custom tr
12001260 // custom td
@@ -1228,8 +1288,8 @@ describe('Component', () => {
12281288 wrapper = mount ( component )
12291289 expect ( wrapper . find ( 'ul.data-grid li' ) . length ) . toEqual ( 2 )
12301290 expect ( wrapper . find ( 'ul.data-grid li div.cell span' ) . nodes . map ( n => n . innerHTML ) ) . toEqual ( [ '4' , '2' , '3' , '5' ] )
1231- expect ( wrapper . find ( 'DataCell' ) . at ( 1 ) . key ( ) ) . toEqual ( 'custom_key' )
1232- expect ( wrapper . find ( 'ul.data-grid li div.cell' ) . at ( 3 ) . hasClass ( 'test4' ) ) . toBe ( true )
1291+ expect ( wrapper . find ( 'DataCell' ) . at ( 1 ) . key ( ) ) . toEqual ( 'custom_key' )
1292+ expect ( wrapper . find ( 'ul.data-grid li div.cell' ) . at ( 3 ) . hasClass ( 'test4' ) ) . toBe ( true )
12331293 } )
12341294
12351295 it ( 'renders custom valueViewers' , ( ) => {
@@ -1256,11 +1316,11 @@ describe('Component', () => {
12561316 data [ 0 ] [ 0 ] . dataEditor = props => {
12571317 const { value, onKeyDown, onChange} = props
12581318 return (
1259- < select
1260- className = 'data-editor'
1261- value = { value }
1262- onChange = { e => onChange ( e . target . value ) }
1263- onKeyDown = { onKeyDown }
1319+ < select
1320+ className = 'data-editor'
1321+ value = { value }
1322+ onChange = { e => onChange ( e . target . value ) }
1323+ onKeyDown = { onKeyDown }
12641324 >
12651325 < option value = '1' > 1</ option >
12661326 < option value = '2' > 2</ option >
@@ -1302,15 +1362,15 @@ describe('Component', () => {
13021362 cells . at ( 0 ) . simulate ( 'doubleClick' )
13031363 expect ( wrapper . find ( 'td.cell.selected select' ) . node . value ) . toEqual ( '4' )
13041364
1305- wrapper . find ( 'td.cell.selected select' ) . simulate ( 'change' , { target : { value : '5' } } )
1365+ wrapper . find ( 'td.cell.selected select' ) . simulate ( 'change' , { target : { value : '5' } } )
13061366 wrapper . find ( 'td.cell.selected select' ) . simulate ( 'keydown' , { keyCode : ENTER_KEY } )
13071367 expect ( data [ 0 ] [ 0 ] . data ) . toEqual ( 5 )
13081368
13091369 // should have gone down one cell on ENTER
13101370 triggerKeyDownEvent ( wrapper , ENTER_KEY )
13111371 const input = cells . at ( 2 ) . find ( 'input' )
13121372 expect ( input . node . value ) . toEqual ( '3' )
1313- input . simulate ( 'change' , { target : { value : '1' } } )
1373+ input . simulate ( 'change' , { target : { value : '1' } } )
13141374 triggerKeyDownEvent ( input , ENTER_KEY )
13151375 expect ( data [ 1 ] [ 0 ] . data ) . toEqual ( '1' )
13161376 } )
0 commit comments