Skip to content

Commit a4e4482

Browse files
committed
feat(manager): implement multiple for on change
1 parent d307c94 commit a4e4482

File tree

2 files changed

+69
-7
lines changed

2 files changed

+69
-7
lines changed

packages/form-state-manager/src/files/use-field.ts

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -107,13 +107,13 @@ const useField = ({
107107
sanitizedValue = finalClearedValue;
108108
}
109109

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];
117117
}
118118
}
119119

@@ -164,6 +164,10 @@ const useField = ({
164164
valueToReturn = '';
165165
}
166166

167+
if (!valueToReturn && multiple) {
168+
valueToReturn = [];
169+
}
170+
167171
return {
168172
input: {
169173
value: valueToReturn,

packages/form-state-manager/src/tests/files/use-field.test.js

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1263,4 +1263,62 @@ describe('useField', () => {
12631263
console.error = _consoleError;
12641264
});
12651265
});
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+
});
12661324
});

0 commit comments

Comments
 (0)