@@ -28,6 +28,7 @@ const initialFieldState = {
28
28
valid : true ,
29
29
validating : false ,
30
30
viewValue : null ,
31
+ array : false ,
31
32
validity : { } ,
32
33
errors : { } ,
33
34
} ;
@@ -77,7 +78,7 @@ function setInField(state, localPath, props) {
77
78
return icepick . assign ( state , props ) ;
78
79
}
79
80
80
- const field = _get ( state , [ 'fields' , localPath . join ( '.' ) ] , initialFieldState ) ;
81
+ const field = getField ( state , localPath ) ;
81
82
82
83
return icepick . setIn (
83
84
state ,
@@ -141,6 +142,7 @@ function _createFormReducer(model, initialState) {
141
142
return setField ( state , localPath , {
142
143
blur : false , // will be deprecated
143
144
focus : true ,
145
+ array : Array . isArray ( action . value ) ,
144
146
} ) ;
145
147
146
148
case actionTypes . CHANGE : {
@@ -149,25 +151,51 @@ function _createFormReducer(model, initialState) {
149
151
let setFieldDirtyState = setField ( state , localPath , {
150
152
dirty : true , // will be deprecated
151
153
pristine : false ,
154
+ value : action . value ,
152
155
} ) ;
153
156
154
- const removeKeys = action . removeKeys
155
- ? Object . keys ( state . fields ) . filter ( ( fieldKey ) => {
157
+ if ( action . removeKeys ) {
158
+ const persistKeys = [ ] ;
159
+
160
+ const removeKeys = Object . keys ( state . fields ) . filter ( ( fieldKey ) => {
161
+ const localStringPath = localPath . join ( '.' ) ;
162
+
156
163
for ( const removeKey of action . removeKeys ) {
157
- const removeKeyPath = localPath . concat ( removeKey ) . join ( '.' ) ;
164
+ const removeKeyPath = ` ${ localStringPath } . ${ removeKey } ` ;
158
165
if ( startsWith ( fieldKey , removeKeyPath ) ) return true ;
159
166
}
160
167
168
+ if ( startsWith ( fieldKey , `${ localStringPath } .` ) ) {
169
+ persistKeys . push ( fieldKey ) ;
170
+ }
171
+
161
172
return false ;
162
- } )
163
- : false ;
173
+ } ) ;
164
174
165
- if ( removeKeys ) {
166
175
removeKeys . forEach ( ( removeKey ) => {
176
+ setFieldDirtyState = icepick . updateIn (
177
+ setFieldDirtyState ,
178
+ [ 'fields' ] ,
179
+ ( field ) => icepick . dissoc ( field , removeKey ) ) ;
180
+ } ) ;
181
+
182
+ persistKeys . forEach ( ( persistKey , index ) => {
183
+ const newPersistKeyPath = toPath ( persistKey ) ;
184
+ newPersistKeyPath [ localPath . length ] = index ;
185
+
186
+ const persistField = getField ( state , persistKey ) ;
187
+
188
+ // Update field to new key
167
189
setFieldDirtyState = setInField (
168
190
setFieldDirtyState ,
169
- toPath ( removeKey ) ,
170
- initialFieldState ) ;
191
+ newPersistKeyPath ,
192
+ persistField ) ;
193
+
194
+ // Remove old key
195
+ setFieldDirtyState = icepick . updateIn (
196
+ setFieldDirtyState ,
197
+ [ 'fields' ] ,
198
+ ( field ) => icepick . dissoc ( field , persistKey ) ) ;
171
199
} ) ;
172
200
}
173
201
0 commit comments