Skip to content

Commit ce52d65

Browse files
authored
fix: initial value (#39)
1 parent ec823bf commit ce52d65

File tree

15 files changed

+42
-31
lines changed

15 files changed

+42
-31
lines changed

src/lib/core/components/Form/Controller.tsx

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ import {ControllerMirror, FieldValue, ValidateError} from './types';
1717
export interface ControllerProps<Value extends FieldValue, SpecType extends Spec> {
1818
spec: SpecType;
1919
name: string;
20-
initialValue: Value;
20+
value: Value;
2121
parentOnChange:
2222
| ((
2323
childName: string,
@@ -31,7 +31,7 @@ export interface ControllerProps<Value extends FieldValue, SpecType extends Spec
3131
export const Controller = <Value extends FieldValue, SpecType extends Spec>({
3232
spec,
3333
name,
34-
initialValue,
34+
value,
3535
parentOnChange,
3636
parentOnUnmount,
3737
}: ControllerProps<Value, SpecType>) => {
@@ -41,7 +41,8 @@ export const Controller = <Value extends FieldValue, SpecType extends Spec>({
4141
const validate = useValidate(spec);
4242
const renderProps = useField({
4343
name,
44-
initialValue,
44+
initialValue: _.get(tools.initialValue, name),
45+
value,
4546
spec,
4647
validate,
4748
tools,

src/lib/core/components/Form/DynamicField.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ export const DynamicField: React.FC<DynamicFieldProps> = ({
8585
name={name}
8686
parentOnChange={null}
8787
parentOnUnmount={null}
88-
initialValue={_.get(tools.initialValue, name)}
88+
value={_.get(store.values, name)}
8989
/>
9090
{watcher}
9191
</SearchContext.Provider>

src/lib/core/components/Form/hooks/useField.tsx

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ export interface UseFieldProps<Value extends FieldValue, SpecType extends Spec>
1818
name: string;
1919
spec: SpecType;
2020
initialValue: Value;
21+
value: Value;
2122
validate?: (value?: Value) => ValidateError;
2223
tools: DynamicFormsContext['tools'];
2324
parentOnChange:
@@ -34,6 +35,7 @@ export const useField = <Value extends FieldValue, SpecType extends Spec>({
3435
name,
3536
spec,
3637
initialValue,
38+
value: externalValue,
3739
validate: propsValidate,
3840
tools,
3941
parentOnChange,
@@ -53,7 +55,7 @@ export const useField = <Value extends FieldValue, SpecType extends Spec>({
5355
);
5456

5557
const [state, setState] = React.useState(() => {
56-
let value = _.cloneDeep(initialValue);
58+
let value = _.cloneDeep(externalValue);
5759

5860
if (_.isNil(value)) {
5961
if (spec.defaultValue) {
@@ -71,18 +73,20 @@ export const useField = <Value extends FieldValue, SpecType extends Spec>({
7173
}
7274

7375
const error = validate?.(value);
76+
const dirty = !_.isEqual(value, initialValue);
77+
const pristine = value === initialValue;
7478

7579
return {
7680
active: false,
77-
dirty: false,
81+
dirty,
7882
error,
7983
invalid: Boolean(error),
80-
modified: false,
81-
pristine: false,
82-
touched: false,
84+
modified: dirty || !pristine,
85+
pristine,
86+
touched: dirty || !pristine,
8387
valid: !error,
8488
value,
85-
visited: false,
89+
visited: dirty || !pristine,
8690
childErrors: {},
8791
};
8892
});
@@ -243,7 +247,7 @@ export const useField = <Value extends FieldValue, SpecType extends Spec>({
243247
]);
244248

245249
React.useEffect(() => {
246-
if (!firstRenderRef.current || !_.isEqual(initialValue, state.value) || state.error) {
250+
if (!firstRenderRef.current || !_.isEqual(externalValue, state.value) || state.error) {
247251
(parentOnChange ? parentOnChange : tools.onChange)(name, state.value, {
248252
...state.childErrors,
249253
[name]: state.error,

src/lib/core/components/Form/hooks/useStore.tsx

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -10,14 +10,18 @@ export const useStore = (name: string) => {
1010
const form = useForm();
1111
const firstRenderRef = React.useRef(true);
1212
const [store, setStore] = React.useState<DynamicFieldStore>(() => {
13-
const initialValue: FieldObjectValue = transformArrIn({
13+
const values: FieldObjectValue = transformArrIn({
1414
[name]: _.get(form.getState().values, name),
1515
});
1616

17+
const initialValue = transformArrIn({
18+
[name]: _.get(form.getState().initialValues, name),
19+
});
20+
1721
return {
1822
name,
19-
initialValue,
20-
values: _.cloneDeep(initialValue),
23+
initialValue: _.cloneDeep(initialValue),
24+
values: _.cloneDeep(values),
2125
errors: {},
2226
};
2327
});
@@ -49,14 +53,18 @@ export const useStore = (name: string) => {
4953

5054
React.useEffect(() => {
5155
if (!firstRenderRef.current) {
52-
const initialValue: FieldObjectValue = transformArrIn({
56+
const values: FieldObjectValue = transformArrIn({
5357
[name]: _.get(form.getState().values, name),
5458
});
5559

60+
const initialValue = transformArrIn({
61+
[name]: _.get(form.getState().initialValues, name),
62+
});
63+
5664
setStore({
5765
name: name,
58-
initialValue,
59-
values: _.cloneDeep(initialValue),
66+
initialValue: _.cloneDeep(initialValue),
67+
values: _.cloneDeep(values),
6068
errors: {},
6169
});
6270
}

src/lib/core/components/Form/types/context.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,13 @@ import React from 'react';
22

33
import type {MonacoEditorProps} from 'react-monaco-editor/lib/types';
44

5-
import {DynamicFormConfig, FieldObjectValue, FieldValue, ValidateError, WonderMirror} from './';
5+
import {DynamicFormConfig, FieldValue, ValidateError, WonderMirror} from './';
66

77
export interface DynamicFormsContext {
88
config: DynamicFormConfig;
99
Monaco?: React.ComponentType<MonacoEditorProps>;
1010
tools: {
11-
initialValue: FieldObjectValue;
11+
initialValue: FieldValue;
1212
onChange: (name: string, value: FieldValue, errors?: Record<string, ValidateError>) => void;
1313
onUnmount: (name: string) => void;
1414
submitFailed: boolean;

src/lib/kit/components/Inputs/ArrayBase/ArrayBase.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,7 @@ export const ArrayBase: ArrayInput = ({spec, name, arrayInput, input}) => {
102102

103103
return (
104104
<Controller
105-
initialValue={input.value?.[`<${key}>`]}
105+
value={input.value?.[`<${key}>`]}
106106
parentOnChange={parentOnChange}
107107
parentOnUnmount={parentOnUnmount}
108108
spec={itemSpec}

src/lib/kit/components/Inputs/CardOneOf/CardOneOf.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ export const CardOneOf: ObjectIndependentInput = (props) => {
7676
>
7777
{specProperties[oneOfValue] ? (
7878
<Controller
79-
initialValue={input.value?.[oneOfValue]}
79+
value={input.value?.[oneOfValue]}
8080
spec={specProperties[oneOfValue]}
8181
name={`${name}.${oneOfValue}`}
8282
parentOnChange={parentOnChange}

src/lib/kit/components/Inputs/ObjectBase/ObjectBase.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ export const ObjectBase: ObjectIndependentInput = ({spec, name, Layout, ...restP
6969
{(spec.viewSpec.order || Object.keys(specProperties)).map((property: string) =>
7070
specProperties[property] ? (
7171
<Controller
72-
initialValue={restProps.input.value?.[property]}
72+
value={restProps.input.value?.[property]}
7373
spec={specProperties[property]}
7474
name={`${name ? name + '.' : ''}${property}`}
7575
parentOnChange={parentOnChange}

src/lib/kit/components/Inputs/ObjectValueInput/ObjectValueInput.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ export const ObjectValueInput: ObjectIndependentInput = (props) => {
4242

4343
const content = (
4444
<Controller
45-
initialValue={input.value?.[OBJECT_VALUE_PROPERTY_NAME]}
45+
value={input.value?.[OBJECT_VALUE_PROPERTY_NAME]}
4646
spec={childSpec}
4747
name={`${name}.${OBJECT_VALUE_PROPERTY_NAME}`}
4848
key={`${name}.${OBJECT_VALUE_PROPERTY_NAME}`}

src/lib/kit/components/Inputs/OneOf/OneOf.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ export const OneOf: ObjectIndependentInput = (props) => {
3939
{specProperties[oneOfValue] ? (
4040
<GroupIndent>
4141
<Controller
42-
initialValue={props.input.value?.[oneOfValue]}
42+
value={props.input.value?.[oneOfValue]}
4343
spec={specProperties[oneOfValue]}
4444
name={`${props.name}.${oneOfValue}`}
4545
parentOnChange={parentOnChange}

0 commit comments

Comments
 (0)