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

Commit 1ef8d1e

Browse files
committed
Adding new updateParentForms (internal), using with setPristineActionReducer to update parent forms with pristine state. Fixes #429
1 parent 652812e commit 1ef8d1e

File tree

4 files changed

+92
-4
lines changed

4 files changed

+92
-4
lines changed

src/form/is-pristine.js

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,15 @@
11
export default function isPristine(formState) {
22
if (!formState) return false;
33

4-
// Field is pending
4+
// Form is pristine
55
if (!formState.$form) {
66
return formState.pristine;
77
}
88

99
// Every field in form is pristine
10-
return Object.keys(formState).every((key) => isPristine(formState[key]));
10+
return Object.keys(formState).every((key) => {
11+
if (key === '$form') return true;
12+
13+
return isPristine(formState[key]);
14+
});
1115
}
Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,20 @@
11
import actionTypes from '../../action-types';
22
import updateField from '../../utils/update-field';
3+
import isPristine from '../../form/is-pristine';
4+
import updateParentForms from '../../utils/update-parent-forms';
35

4-
export default function setValidityActionReducer(state, action, localPath) {
6+
export default function setPristineActionReducer(state, action, localPath) {
57
if (action.type !== actionTypes.SET_PRISTINE) {
68
return state;
79
}
810

9-
return updateField(state, localPath, {
11+
const updatedField = updateField(state, localPath, {
1012
pristine: true,
1113
}, {
1214
pristine: true,
1315
});
16+
17+
return updateParentForms(updatedField, localPath, (form) => ({
18+
pristine: isPristine(form),
19+
}));
1420
}

src/utils/update-parent-forms.js

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
import i from 'icepick';
2+
import get from './get';
3+
4+
export default function updateParentForms(state, localPath, updater) {
5+
const parentLocalPath = localPath.slice(0, -1);
6+
7+
const value = parentLocalPath.length
8+
? get(state, parentLocalPath)
9+
: state;
10+
11+
const form = value.$form;
12+
13+
const updatedValue = typeof updater === 'function'
14+
? updater(value)
15+
: updater;
16+
17+
const newState = i.setIn(state, [...parentLocalPath, '$form'], i.merge(form, updatedValue));
18+
19+
if (!parentLocalPath.length) return newState;
20+
21+
return updateParentForms(newState, parentLocalPath, updater);
22+
}

test/form-reducer-actions-spec.js

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,62 @@ describe('formReducer() (V1)', () => {
8686
args: [],
8787
expectedField: { pristine: true },
8888
},
89+
{
90+
action: actions.setPristine,
91+
initialState: {
92+
$form: {
93+
...initialFieldState,
94+
pristine: false,
95+
},
96+
name: {
97+
...initialFieldState,
98+
pristine: false,
99+
},
100+
},
101+
args: [],
102+
expectedField: { pristine: true },
103+
expectedForm: { pristine: true },
104+
},
105+
{
106+
action: actions.setPristine,
107+
initialState: {
108+
$form: {
109+
...initialFieldState,
110+
pristine: false,
111+
},
112+
name: {
113+
...initialFieldState,
114+
pristine: false,
115+
},
116+
other: {
117+
...initialFieldState,
118+
pristine: true,
119+
},
120+
},
121+
args: [],
122+
expectedField: { pristine: true },
123+
expectedForm: { pristine: true },
124+
},
125+
{
126+
action: actions.setPristine,
127+
initialState: {
128+
$form: {
129+
...initialFieldState,
130+
pristine: false,
131+
},
132+
name: {
133+
...initialFieldState,
134+
pristine: false,
135+
},
136+
other: {
137+
...initialFieldState,
138+
pristine: false,
139+
},
140+
},
141+
args: [],
142+
expectedField: { pristine: true },
143+
expectedForm: { pristine: false },
144+
},
89145
],
90146
[actionTypes.SET_DIRTY]: [
91147
{

0 commit comments

Comments
 (0)