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

Commit 2c47615

Browse files
committed
Revert removing value from field state. Fixes #573
1 parent f7c3f0c commit 2c47615

File tree

5 files changed

+42
-18
lines changed

5 files changed

+42
-18
lines changed

src/reducers/form-reducer.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,13 +31,15 @@ export function createInitialState(model, state, customInitialFieldState = {}, o
3131
} else {
3232
return i.merge(initialFieldState, {
3333
initialValue: state,
34+
value: state,
3435
model,
3536
...customInitialFieldState,
3637
});
3738
}
3839

3940
const initialForm = i.merge(initialFieldState, {
4041
initialValue: state,
42+
value: state,
4143
model,
4244
...customInitialFieldState,
4345
});

src/reducers/form/change-action-reducer.js

Lines changed: 25 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import actionTypes from '../../action-types';
22
import i from 'icepick';
33
import get from '../../utils/get';
4+
import shallowEqual from '../../utils/shallow-equal';
45
import isPlainObject from '../../utils/is-plain-object';
56
import mapValues from '../../utils/map-values';
67
import { createInitialState } from '../form-reducer';
@@ -15,23 +16,34 @@ function updateFieldValue(field, action, parentModel = undefined) {
1516
? field.$form
1617
: field;
1718

18-
const valueIsArray = Array.isArray(value);
19-
2019
const changedFieldProps = {
2120
validated: false,
22-
retouched: fieldState.submitted || fieldState.retouched,
21+
retouched: fieldState.submitted
22+
? true
23+
: fieldState.retouched,
2324
intents: [{ type: 'validate' }],
24-
pristine: silent && fieldState.pristine,
25-
loadedValue: (load && value) || fieldState.loadedValue,
25+
pristine: silent
26+
? fieldState.pristine
27+
: false,
28+
loadedValue: load
29+
? value
30+
: fieldState.loadedValue,
2631
};
2732

33+
if (shallowEqual(field.value, value)) {
34+
return i.merge(field, changedFieldProps);
35+
}
36+
2837
if (removeKeys) {
2938
invariant(field && field.$form,
3039
'Unable to remove keys. ' +
3140
'Field for "%s" in store is not an array/object.',
3241
model);
3342

34-
const removeKeysArray = [].concat(removeKeys);
43+
const valueIsArray = Array.isArray(field.$form.value);
44+
const removeKeysArray = Array.isArray(removeKeys)
45+
? removeKeys
46+
: [removeKeys];
3547

3648
let result;
3749

@@ -58,8 +70,8 @@ function updateFieldValue(field, action, parentModel = undefined) {
5870
return result;
5971
}
6072

61-
if (!valueIsArray && !isPlainObject(value)) {
62-
return i.merge(field, changedFieldProps);
73+
if (!Array.isArray(value) && !isPlainObject(value)) {
74+
return i.merge(field, i.set(changedFieldProps, 'value', value));
6375
}
6476

6577
const updatedField = mapValues(value, (subValue, index) => {
@@ -77,7 +89,12 @@ function updateFieldValue(field, action, parentModel = undefined) {
7789
}, parentModel ? `${parentModel}.${model}` : model);
7890
}
7991

92+
if (shallowEqual(subValue, subField.value)) {
93+
return subField;
94+
}
95+
8096
return i.merge(subField, i.assign(changedFieldProps, {
97+
value: subValue,
8198
loadedValue: load
8299
? subValue
83100
: subField.loadedValue,

test/field-actions-spec.js

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1101,7 +1101,11 @@ Object.keys(testContexts).forEach((testKey) => {
11011101

11021102
assert.containSubset(
11031103
reducer(changedState, actions.setInitial('test.foo'))
1104-
.foo, initialFieldState);
1104+
.foo,
1105+
{
1106+
...initialFieldState,
1107+
value: 'changed',
1108+
});
11051109
});
11061110
});
11071111

test/form-reducer-actions-spec.js

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ describe('formReducer() (V1)', () => {
2323
expectedField: {
2424
pristine: false,
2525
validated: false,
26+
value: 'foo',
2627
},
2728
expectedForm: {
2829
pristine: false,
@@ -35,6 +36,7 @@ describe('formReducer() (V1)', () => {
3536
$form: {
3637
pristine: false,
3738
validated: false,
39+
value: { foo: 'bar' },
3840
},
3941
},
4042
expectedForm: {
@@ -48,6 +50,7 @@ describe('formReducer() (V1)', () => {
4850
$form: {
4951
pristine: false,
5052
validated: false,
53+
value: [1, 2, 3],
5154
},
5255
},
5356
expectedForm: {
@@ -59,6 +62,7 @@ describe('formReducer() (V1)', () => {
5962
args: ['string'],
6063
expectedField: {
6164
pristine: true,
65+
value: 'string',
6266
loadedValue: 'string',
6367
},
6468
expectedForm: {
@@ -70,6 +74,7 @@ describe('formReducer() (V1)', () => {
7074
args: [42],
7175
expectedField: {
7276
pristine: true,
77+
value: 42,
7378
loadedValue: 42,
7479
},
7580
expectedForm: {
@@ -82,10 +87,12 @@ describe('formReducer() (V1)', () => {
8287
expectedField: {
8388
$form: {
8489
pristine: true,
90+
value: { foo: 'bar' },
8591
loadedValue: { foo: 'bar' },
8692
},
8793
foo: {
8894
pristine: true,
95+
value: 'bar',
8996
initialValue: 'bar',
9097
},
9198
},
@@ -700,6 +707,7 @@ describe('formReducer() (V1)', () => {
700707

701708
it('should change the loaded value for the field', () => {
702709
assert.equal(loadedState.foo.loadedValue, 'new loaded');
710+
assert.equal(loadedState.foo.value, 'new loaded');
703711
});
704712

705713
it('should change the loaded value for the form', () => {

test/local-forms-spec.js

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -11,13 +11,9 @@ describe('local forms', () => {
1111

1212
describe('standard usage with onUpdate', () => {
1313
let innerFormState;
14-
let innerModelState;
1514

1615
const form = TestUtils.renderIntoDocument(
17-
<LocalForm
18-
onUpdate={(formValue) => innerFormState = formValue}
19-
onChange={(modelState) => innerModelState = modelState}
20-
>
16+
<LocalForm onUpdate={(formValue) => innerFormState = formValue}>
2117
<Control.text model=".foo" />
2218
</LocalForm>
2319
);
@@ -42,12 +38,9 @@ describe('local forms', () => {
4238
},
4339
foo: {
4440
pristine: false,
41+
value: 'changed',
4542
},
4643
});
47-
48-
assert.deepEqual(innerModelState, {
49-
foo: 'changed',
50-
});
5144
});
5245
});
5346

0 commit comments

Comments
 (0)