@@ -6,7 +6,8 @@ import type {
66import type { AnyFieldMeta } from './FieldApi'
77import type { DeepKeys } from './util-types'
88
9- type ArrayFieldMode = 'insert' | 'remove' | 'swap' | 'move'
9+ type ValueFieldMode = 'insert' | 'remove' | 'swap' | 'move'
10+ type ArrayFieldMode = 'filter'
1011
1112export const defaultFieldMeta : AnyFieldMeta = {
1213 isValidating : false ,
@@ -45,34 +46,63 @@ export function metaHelper<
4546) {
4647 function handleArrayFieldMetaShift (
4748 field : DeepKeys < TFormData > ,
48- index : number ,
49+ remainingIndeces : number [ ] ,
4950 mode : ArrayFieldMode ,
51+ ) : void
52+ function handleArrayFieldMetaShift (
53+ field : DeepKeys < TFormData > ,
54+ index : number ,
55+ mode : ValueFieldMode ,
56+ secondIndex ?: number ,
57+ ) : void
58+ function handleArrayFieldMetaShift (
59+ field : DeepKeys < TFormData > ,
60+ index : number | number [ ] ,
61+ mode : ArrayFieldMode | ValueFieldMode ,
5062 secondIndex ?: number ,
5163 ) {
52- const affectedFields = getAffectedFields ( field , index , mode , secondIndex )
53-
54- const handlers = {
55- insert : ( ) => handleInsertMode ( affectedFields , field , index ) ,
56- remove : ( ) => handleRemoveMode ( affectedFields ) ,
57- swap : ( ) =>
58- secondIndex !== undefined &&
59- handleSwapMode ( affectedFields , field , index , secondIndex ) ,
60- move : ( ) =>
61- secondIndex !== undefined &&
62- handleMoveMode ( affectedFields , field , index , secondIndex ) ,
63- }
64+ if ( Array . isArray ( index ) ) {
65+ if ( mode === 'filter' ) {
66+ return handleFilterMode ( field , index )
67+ }
68+ } else {
69+ const affectedFields = getAffectedFields (
70+ field ,
71+ index ,
72+ mode as ValueFieldMode ,
73+ secondIndex ,
74+ )
6475
65- handlers [ mode ] ( )
76+ switch ( mode as ValueFieldMode ) {
77+ case 'insert' :
78+ return handleInsertMode ( affectedFields , field , index )
79+ case 'remove' :
80+ return handleRemoveMode ( affectedFields )
81+ case 'swap' :
82+ return (
83+ secondIndex !== undefined &&
84+ handleSwapMode ( affectedFields , field , index , secondIndex )
85+ )
86+ case 'move' :
87+ return (
88+ secondIndex !== undefined &&
89+ handleMoveMode ( affectedFields , field , index , secondIndex )
90+ )
91+ }
92+ }
6693 }
6794
68- function getFieldPath ( field : DeepKeys < TFormData > , index : number ) : string {
69- return `${ field } [${ index } ]`
95+ function getFieldPath (
96+ field : DeepKeys < TFormData > ,
97+ index : number ,
98+ ) : DeepKeys < TFormData > {
99+ return `${ field } [${ index } ]` as DeepKeys < TFormData >
70100 }
71101
72102 function getAffectedFields (
73103 field : DeepKeys < TFormData > ,
74104 index : number ,
75- mode : ArrayFieldMode ,
105+ mode : ValueFieldMode ,
76106 secondIndex ?: number ,
77107 ) : DeepKeys < TFormData > [ ] {
78108 const affectedFieldKeys = [ getFieldPath ( field , index ) ]
@@ -148,6 +178,30 @@ export function metaHelper<
148178 shiftMeta ( fields , 'up' )
149179 }
150180
181+ const handleFilterMode = (
182+ field : DeepKeys < TFormData > ,
183+ remainingIndices : number [ ] ,
184+ ) => {
185+ if ( remainingIndices . length === 0 ) return
186+
187+ // create a map between the index and its new location
188+ remainingIndices . forEach ( ( fromIndex , toIndex ) => {
189+ if ( fromIndex === toIndex ) return
190+ // assign it the original meta
191+ const fieldKey = getFieldPath ( field , toIndex )
192+ const originalFieldKey = getFieldPath ( field , fromIndex )
193+ const originalFieldMeta = formApi . getFieldMeta ( originalFieldKey )
194+ if ( originalFieldMeta ) {
195+ formApi . setFieldMeta ( fieldKey , originalFieldMeta )
196+ } else {
197+ formApi . setFieldMeta ( fieldKey , {
198+ ...getEmptyFieldMeta ( ) ,
199+ isTouched : originalFieldKey as unknown as boolean ,
200+ } )
201+ }
202+ } )
203+ }
204+
151205 const handleMoveMode = (
152206 fields : DeepKeys < TFormData > [ ] ,
153207 field : DeepKeys < TFormData > ,
0 commit comments