Skip to content

Commit 6f3dbf9

Browse files
committed
support to skip field touch for onFieldChange fn
1 parent 0322442 commit 6f3dbf9

File tree

2 files changed

+37
-2
lines changed

2 files changed

+37
-2
lines changed

packages/core/src/comparator.test.js

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -387,3 +387,35 @@ describe("complex test case", () => {
387387
expect(form.state().isValid).toBe(true);
388388
});
389389
});
390+
391+
describe("onFieldChange fn", ()=>{
392+
const form = mount(
393+
<Form
394+
defaultFields={fields}
395+
renderer={customRenderer}
396+
showValidationBeforeTouched
397+
/>
398+
);
399+
form.update();
400+
401+
test('should not update the field touch state when skipTouchState argument is set to true',()=>{
402+
//check initially state of name field for a freshly mounted form
403+
let isNameFieldTouched = form.state().fields.find(field=>field.id === 'name').touched;
404+
expect(isNameFieldTouched).toBe(false);
405+
406+
let formFragment = form.find("FormFragment").first();
407+
// update a name field through onFieldChange and provide skipTouchState argument
408+
formFragment.prop("onFieldChange")('name','Some name',true);
409+
form.update();
410+
isNameFieldTouched = form.state().fields.find(field=>field.id === 'name').touched;
411+
expect(isNameFieldTouched).toBe(false);
412+
413+
// update a name field through onFieldChange and without the skipTouchState argument
414+
// touched should be subsequently set to true
415+
formFragment.prop("onFieldChange")('name','Some name');
416+
form.update();
417+
isNameFieldTouched = form.state().fields.find(field=>field.id === 'name').touched;
418+
expect(isNameFieldTouched).toBe(true);
419+
420+
})
421+
});

packages/core/src/components/Form.js

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -147,7 +147,7 @@ export default class Form extends Component<
147147
}
148148
}
149149

150-
onFieldChange(id: string, value: Value) {
150+
onFieldChange(id: string, value: Value, skipFieldTouched) {
151151
const {
152152
optionsHandler,
153153
validationHandler,
@@ -156,7 +156,10 @@ export default class Form extends Component<
156156
disabled = false
157157
} = this.props;
158158
let { fields } = this.state;
159-
fields = updateFieldTouchedState(id, true, fields);
159+
160+
//skiping the field touch update here
161+
if(!skipFieldTouched)
162+
fields = updateFieldTouchedState(id, true, fields);
160163
fields = updateFieldValue(id, value, fields);
161164
const nextState = getNextStateFromFields({
162165
fields,

0 commit comments

Comments
 (0)