@@ -302,4 +302,94 @@ describe('Form.Dependencies', () => {
302302 await changeValue ( getInput ( container ) , '1' ) ;
303303 matchError ( container , false ) ;
304304 } ) ;
305+
306+ it ( 'mixed field list should not missing value with onValuesChange' , ( ) => {
307+ const onValuesChange = jest . fn ( ) ;
308+
309+ const { container } = render (
310+ < Form
311+ initialValues = { { rules : [ { name : 'test' , triggers : [ ] } ] } }
312+ onValuesChange = { onValuesChange }
313+ >
314+ < Form . List name = "rules" >
315+ { fields =>
316+ fields . map ( field => (
317+ < div key = { field . key } >
318+ < Field { ...field } name = { [ field . name , 'name' ] } >
319+ < Input />
320+ </ Field >
321+
322+ < Form . List name = { [ field . name , 'triggers' ] } >
323+ { ( triggerFields , { add } ) => (
324+ < >
325+ { triggerFields . map ( triggerField => (
326+ < Field { ...triggerField } key = { triggerField . key } >
327+ < Input />
328+ </ Field >
329+ ) ) }
330+ < button type = "button" onClick = { ( ) => add ( 'trigger_1' ) } >
331+ Add trigger
332+ </ button >
333+ </ >
334+ ) }
335+ </ Form . List >
336+ </ div >
337+ ) )
338+ }
339+ </ Form . List >
340+ </ Form > ,
341+ ) ;
342+
343+ fireEvent . click ( container . querySelector ( 'button' ) ! ) ;
344+
345+ expect ( onValuesChange ) . toHaveBeenLastCalledWith (
346+ expect . anything ( ) ,
347+ { rules : [ { name : 'test' , triggers : [ 'trigger_1' ] } ] } ,
348+ ) ;
349+ } ) ;
350+
351+ it ( 'mixed field list remove should not missing value with onValuesChange' , ( ) => {
352+ const onValuesChange = jest . fn ( ) ;
353+
354+ const { container } = render (
355+ < Form
356+ initialValues = { { rules : [ { name : 'test' , triggers : [ 'trigger_1' , 'trigger_2' ] } ] } }
357+ onValuesChange = { onValuesChange }
358+ >
359+ < Form . List name = "rules" >
360+ { fields =>
361+ fields . map ( field => (
362+ < div key = { field . key } >
363+ < Field { ...field } name = { [ field . name , 'name' ] } >
364+ < Input />
365+ </ Field >
366+
367+ < Form . List name = { [ field . name , 'triggers' ] } >
368+ { ( triggerFields , { remove } ) => (
369+ < >
370+ { triggerFields . map ( triggerField => (
371+ < Field { ...triggerField } key = { triggerField . key } >
372+ < Input />
373+ </ Field >
374+ ) ) }
375+ < button type = "button" onClick = { ( ) => remove ( 0 ) } >
376+ Remove trigger
377+ </ button >
378+ </ >
379+ ) }
380+ </ Form . List >
381+ </ div >
382+ ) )
383+ }
384+ </ Form . List >
385+ </ Form > ,
386+ ) ;
387+
388+ fireEvent . click ( container . querySelector ( 'button' ) ! ) ;
389+
390+ expect ( onValuesChange ) . toHaveBeenLastCalledWith (
391+ expect . anything ( ) ,
392+ { rules : [ { name : 'test' , triggers : [ 'trigger_2' ] } ] } ,
393+ ) ;
394+ } ) ;
305395} ) ;
0 commit comments