Skip to content
This repository was archived by the owner on Aug 23, 2022. It is now read-only.

Commit e5446c8

Browse files
committed
Adding .retouched prop to field + unit tests
1 parent 2a2c624 commit e5446c8

File tree

2 files changed

+69
-2
lines changed

2 files changed

+69
-2
lines changed

src/reducers/form-reducer.js

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -204,11 +204,12 @@ function _createFormReducer(model, initialState) {
204204
case actionTypes.BLUR:
205205
case actionTypes.SET_TOUCHED: {
206206
const fieldState = setField(state, localPath, {
207+
focus: false,
208+
touched: true,
209+
retouched: state.submitted || state.submitFailed,
207210
get blur() {
208211
return deprecateProp('blur', true);
209212
},
210-
focus: false,
211-
touched: true,
212213
get untouched() {
213214
return deprecateProp('untouched', false);
214215
},
@@ -227,6 +228,7 @@ function _createFormReducer(model, initialState) {
227228
pending: action.pending,
228229
submitted: false,
229230
submitFailed: false,
231+
retouched: false,
230232
});
231233

232234
case actionTypes.SET_VALIDITY: {

test/field-actions-spec.js

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -391,10 +391,75 @@ describe('field actions', () => {
391391
{
392392
touched: true,
393393
untouched: false,
394+
retouched: false,
394395
focus: false,
395396
blur: true,
396397
});
397398
});
399+
400+
it('should set the retouched property to true upon touch after submit', () => {
401+
const reducer = formReducer('test');
402+
const state = reducer(undefined, actions.setSubmitted('test'));
403+
404+
assert.containSubset(
405+
state,
406+
{
407+
submitted: true,
408+
retouched: false,
409+
}, 'not retouched yet');
410+
411+
assert.containSubset(
412+
reducer(state, actions.setTouched('test')),
413+
{
414+
submitted: true,
415+
retouched: true,
416+
}, 'retouched after submit');
417+
});
418+
419+
it('should set the retouched property to true upon touch after submit failed', () => {
420+
const reducer = formReducer('test');
421+
const state = reducer(undefined, actions.setSubmitFailed('test'));
422+
423+
assert.containSubset(
424+
state,
425+
{
426+
submitted: false,
427+
submitFailed: true,
428+
retouched: false,
429+
}, 'not retouched yet');
430+
431+
assert.containSubset(
432+
reducer(state, actions.setTouched('test')),
433+
{
434+
submitted: false,
435+
submitFailed: true,
436+
retouched: true,
437+
}, 'retouched after submit failed');
438+
});
439+
440+
it('should set the retouched property to false when pending', () => {
441+
const reducer = formReducer('test');
442+
let state = reducer(undefined, actions.setSubmitted('test'));
443+
444+
state = reducer(state, actions.setTouched('test'));
445+
446+
assert.containSubset(
447+
state,
448+
{
449+
submitted: true,
450+
retouched: true,
451+
}, 'retouched after submit and before pending');
452+
453+
state = reducer(state, actions.setPending('test'));
454+
455+
assert.containSubset(
456+
state,
457+
{
458+
pending: true,
459+
submitted: false,
460+
retouched: false,
461+
}, 'not retouched while pending');
462+
});
398463
});
399464

400465
describe('setUntouched()', () => {

0 commit comments

Comments
 (0)