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 @@ -1277,4 +1277,62 @@ describe('useField', () => {
1277
1277
console . error = _consoleError ;
1278
1278
} ) ;
1279
1279
} ) ;
1280
+
1281
+ describe ( 'multiple' , ( ) => {
1282
+ let Select ;
1283
+ let wrapper ;
1284
+
1285
+ beforeEach ( ( ) => {
1286
+ Select = ( props ) => {
1287
+ const { input } = useField ( props ) ;
1288
+ return (
1289
+ < select { ...input } >
1290
+ < option value = "dogs" > Dogs</ option >
1291
+ < option value = "cats" > Cats</ option >
1292
+ < option value = "hamsters" > Hamsters</ option >
1293
+ </ select >
1294
+ ) ;
1295
+ } ;
1296
+ } ) ;
1297
+
1298
+ it ( 'select and deselect multiple' , async ( ) => {
1299
+ wrapper = mount (
1300
+ < FormManagerContext . Provider value = { { ...managerApi ( ) , formOptions : managerApi } } >
1301
+ < Select name = "field" multiple />
1302
+ </ FormManagerContext . Provider >
1303
+ ) ;
1304
+
1305
+ expect ( wrapper . find ( 'select' ) . props ( ) . value ) . toEqual ( [ ] ) ;
1306
+
1307
+ await act ( async ( ) => {
1308
+ wrapper
1309
+ . find ( 'option' )
1310
+ . first ( )
1311
+ . simulate ( 'change' ) ;
1312
+ } ) ;
1313
+ wrapper . update ( ) ;
1314
+
1315
+ expect ( wrapper . find ( 'select' ) . props ( ) . value ) . toEqual ( [ 'dogs' ] ) ;
1316
+
1317
+ await act ( async ( ) => {
1318
+ wrapper
1319
+ . find ( 'option' )
1320
+ . last ( )
1321
+ . simulate ( 'change' ) ;
1322
+ } ) ;
1323
+ wrapper . update ( ) ;
1324
+
1325
+ expect ( wrapper . find ( 'select' ) . props ( ) . value ) . toEqual ( [ 'dogs' , 'hamsters' ] ) ;
1326
+
1327
+ await act ( async ( ) => {
1328
+ wrapper
1329
+ . find ( 'option' )
1330
+ . first ( )
1331
+ . simulate ( 'change' ) ;
1332
+ } ) ;
1333
+ wrapper . update ( ) ;
1334
+
1335
+ expect ( wrapper . find ( 'select' ) . props ( ) . value ) . toEqual ( [ 'hamsters' ] ) ;
1336
+ } ) ;
1337
+ } ) ;
1280
1338
} ) ;
You can’t perform that action at this time.
0 commit comments