Skip to content

Commit 7c7d0f0

Browse files
authored
Merge pull request #773 from rvsia/implementMultiple
feat(manager): implement multiple for on change
2 parents a6ec319 + a4e4482 commit 7c7d0f0

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
@@ -1277,4 +1277,62 @@ describe('useField', () => {
12771277
console.error = _consoleError;
12781278
});
12791279
});
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+
});
12801338
});

0 commit comments

Comments
 (0)