File tree Expand file tree Collapse file tree 2 files changed +69
-7
lines changed
packages/form-state-manager/src Expand file tree Collapse file tree 2 files changed +69
-7
lines changed Original file line number Diff line number Diff line change @@ -107,13 +107,13 @@ const useField = ({
107
107
sanitizedValue = finalClearedValue ;
108
108
}
109
109
110
- if ( type && type === 'checkbox' ) {
111
- if ( value ) {
112
- if ( state ?. value && Array . isArray ( state . value ) ) {
113
- sanitizedValue = state . value . includes ( value ) ? state . value . filter ( ( v : any ) => v !== value ) : [ ... state . value , value ] ;
114
- } else {
115
- sanitizedValue = [ value ] ;
116
- }
110
+ if ( ( type && type === 'checkbox' && value ) || multiple ) {
111
+ const finalValue = value || sanitizedValue ;
112
+
113
+ if ( state ? .value && Array . isArray ( state . value ) ) {
114
+ sanitizedValue = state . value . includes ( finalValue ) ? state . value . filter ( ( v : any ) => v !== finalValue ) : [ ... state . value , finalValue ] ;
115
+ } else {
116
+ sanitizedValue = [ finalValue ] ;
117
117
}
118
118
}
119
119
@@ -164,6 +164,10 @@ const useField = ({
164
164
valueToReturn = '' ;
165
165
}
166
166
167
+ if ( ! valueToReturn && multiple ) {
168
+ valueToReturn = [ ] ;
169
+ }
170
+
167
171
return {
168
172
input : {
169
173
value : valueToReturn ,
Original file line number Diff line number Diff line change @@ -1263,4 +1263,62 @@ describe('useField', () => {
1263
1263
console . error = _consoleError ;
1264
1264
} ) ;
1265
1265
} ) ;
1266
+
1267
+ describe ( 'multiple' , ( ) => {
1268
+ let Select ;
1269
+ let wrapper ;
1270
+
1271
+ beforeEach ( ( ) => {
1272
+ Select = ( props ) => {
1273
+ const { input } = useField ( props ) ;
1274
+ return (
1275
+ < select { ...input } >
1276
+ < option value = "dogs" > Dogs</ option >
1277
+ < option value = "cats" > Cats</ option >
1278
+ < option value = "hamsters" > Hamsters</ option >
1279
+ </ select >
1280
+ ) ;
1281
+ } ;
1282
+ } ) ;
1283
+
1284
+ it ( 'select and deselect multiple' , async ( ) => {
1285
+ wrapper = mount (
1286
+ < FormManagerContext . Provider value = { { ...managerApi ( ) , formOptions : managerApi } } >
1287
+ < Select name = "field" multiple />
1288
+ </ FormManagerContext . Provider >
1289
+ ) ;
1290
+
1291
+ expect ( wrapper . find ( 'select' ) . props ( ) . value ) . toEqual ( [ ] ) ;
1292
+
1293
+ await act ( async ( ) => {
1294
+ wrapper
1295
+ . find ( 'option' )
1296
+ . first ( )
1297
+ . simulate ( 'change' ) ;
1298
+ } ) ;
1299
+ wrapper . update ( ) ;
1300
+
1301
+ expect ( wrapper . find ( 'select' ) . props ( ) . value ) . toEqual ( [ 'dogs' ] ) ;
1302
+
1303
+ await act ( async ( ) => {
1304
+ wrapper
1305
+ . find ( 'option' )
1306
+ . last ( )
1307
+ . simulate ( 'change' ) ;
1308
+ } ) ;
1309
+ wrapper . update ( ) ;
1310
+
1311
+ expect ( wrapper . find ( 'select' ) . props ( ) . value ) . toEqual ( [ 'dogs' , 'hamsters' ] ) ;
1312
+
1313
+ await act ( async ( ) => {
1314
+ wrapper
1315
+ . find ( 'option' )
1316
+ . first ( )
1317
+ . simulate ( 'change' ) ;
1318
+ } ) ;
1319
+ wrapper . update ( ) ;
1320
+
1321
+ expect ( wrapper . find ( 'select' ) . props ( ) . value ) . toEqual ( [ 'hamsters' ] ) ;
1322
+ } ) ;
1323
+ } ) ;
1266
1324
} ) ;
You can’t perform that action at this time.
0 commit comments