react-hook-form 7.74.0 → 7.76.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +13 -9
- package/dist/index.cjs.js +1 -1
- package/dist/index.cjs.js.map +1 -1
- package/dist/index.esm.mjs +164 -72
- package/dist/index.esm.mjs.map +1 -1
- package/dist/index.umd.js +1 -1
- package/dist/index.umd.js.map +1 -1
- package/dist/logic/createFormControl.d.ts +13 -0
- package/dist/logic/createFormControl.d.ts.map +1 -1
- package/dist/logic/getDirtyFields.d.ts.map +1 -1
- package/dist/logic/{isNameInFieldArray.d.ts → getFieldArrayParentNames.d.ts} +2 -2
- package/dist/logic/getFieldArrayParentNames.d.ts.map +1 -0
- package/dist/logic/getProxyFormState.d.ts.map +1 -1
- package/dist/logic/getResolverOptions.d.ts +2 -2
- package/dist/logic/hasValidation.d.ts +1 -1
- package/dist/logic/shouldRenderFormState.d.ts.map +1 -1
- package/dist/react-server.esm.mjs +136 -49
- package/dist/react-server.esm.mjs.map +1 -1
- package/dist/types/form.d.ts +3 -2
- package/dist/types/form.d.ts.map +1 -1
- package/dist/types/utils.d.ts +2 -2
- package/dist/useController.d.ts.map +1 -1
- package/dist/useFieldArray.d.ts.map +1 -1
- package/dist/useForm.d.ts.map +1 -1
- package/dist/useFormContext.d.ts.map +1 -1
- package/dist/useFormState.d.ts.map +1 -1
- package/dist/watch.d.ts +1 -1
- package/dist/watch.d.ts.map +1 -1
- package/package.json +4 -5
- package/dist/logic/isNameInFieldArray.d.ts.map +0 -1
|
@@ -1,4 +1,17 @@
|
|
|
1
1
|
import type { FieldValues, UseFormProps, UseFormReturn } from '../types';
|
|
2
|
+
export declare const DEFAULT_FORM_STATE: {
|
|
3
|
+
submitCount: number;
|
|
4
|
+
isDirty: boolean;
|
|
5
|
+
isReady: boolean;
|
|
6
|
+
isValidating: boolean;
|
|
7
|
+
isSubmitted: boolean;
|
|
8
|
+
isSubmitting: boolean;
|
|
9
|
+
isSubmitSuccessful: boolean;
|
|
10
|
+
isValid: boolean;
|
|
11
|
+
touchedFields: {};
|
|
12
|
+
dirtyFields: {};
|
|
13
|
+
validatingFields: {};
|
|
14
|
+
};
|
|
2
15
|
export declare function createFormControl<TFieldValues extends FieldValues = FieldValues, TContext = any, TTransformedValues = TFieldValues>(props?: UseFormProps<TFieldValues, TContext, TTransformedValues>): Omit<UseFormReturn<TFieldValues, TContext, TTransformedValues>, 'formState'> & {
|
|
3
16
|
formControl: Omit<UseFormReturn<TFieldValues, TContext, TTransformedValues>, 'formState'>;
|
|
4
17
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"createFormControl.d.ts","sourceRoot":"","sources":["../../src/logic/createFormControl.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAaV,WAAW,EAiBX,YAAY,EAIZ,aAAa,EAYd,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"createFormControl.d.ts","sourceRoot":"","sources":["../../src/logic/createFormControl.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAaV,WAAW,EAiBX,YAAY,EAIZ,aAAa,EAYd,MAAM,UAAU,CAAC;AAuDlB,eAAO,MAAM,kBAAkB;;;;;;;;;;;;CAY9B,CAAC;AAEF,wBAAgB,iBAAiB,CAC/B,YAAY,SAAS,WAAW,GAAG,WAAW,EAC9C,QAAQ,GAAG,GAAG,EACd,kBAAkB,GAAG,YAAY,EAEjC,KAAK,GAAE,YAAY,CAAC,YAAY,EAAE,QAAQ,EAAE,kBAAkB,CAAM,GACnE,IAAI,CACL,aAAa,CAAC,YAAY,EAAE,QAAQ,EAAE,kBAAkB,CAAC,EACzD,WAAW,CACZ,GAAG;IACF,WAAW,EAAE,IAAI,CACf,aAAa,CAAC,YAAY,EAAE,QAAQ,EAAE,kBAAkB,CAAC,EACzD,WAAW,CACZ,CAAC;CACH,CAssDA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getDirtyFields.d.ts","sourceRoot":"","sources":["../../src/logic/getDirtyFields.ts"],"names":[],"mappings":"AAWA,iBAAS,eAAe,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,GAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAM,uBAapE;
|
|
1
|
+
{"version":3,"file":"getDirtyFields.d.ts","sourceRoot":"","sources":["../../src/logic/getDirtyFields.ts"],"names":[],"mappings":"AAWA,iBAAS,eAAe,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,GAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAM,uBAapE;AAmCD,MAAM,CAAC,OAAO,UAAU,cAAc,CAAC,CAAC,EACtC,IAAI,EAAE,CAAC,EACP,UAAU,EAAE,CAAC,EACb,qBAAqB,CAAC,EAAE,MAAM,CAC5B,OAAO,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,EACxB,UAAU,CAAC,OAAO,eAAe,CAAC,GAAG,OAAO,CAC7C,mEA6BF"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
import type { InternalFieldName } from '../types';
|
|
2
|
-
declare const _default: (names: Set<InternalFieldName>, name: InternalFieldName) =>
|
|
2
|
+
declare const _default: (names: Set<InternalFieldName>, name: InternalFieldName) => string[];
|
|
3
3
|
export default _default;
|
|
4
|
-
//# sourceMappingURL=
|
|
4
|
+
//# sourceMappingURL=getFieldArrayParentNames.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getFieldArrayParentNames.d.ts","sourceRoot":"","sources":["../../src/logic/getFieldArrayParentNames.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;yBAElC,OAAO,GAAG,CAAC,iBAAiB,CAAC,EAAE,MAAM,iBAAiB;AAAtE,wBAUE"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getProxyFormState.d.ts","sourceRoot":"","sources":["../../src/logic/getProxyFormState.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;yBAG7E,YAAY,SAAS,WAAW,EAChC,QAAQ,GAAG,GAAG,EACd,kBAAkB,GAAG,YAAY,EAEjC,WAAW,SAAS,CAAC,YAAY,CAAC,EAClC,SAAS,OAAO,CAAC,YAAY,EAAE,QAAQ,EAAE,kBAAkB,CAAC,EAC5D,sBAAsB,aAAa,EACnC,gBAAa;AARf,
|
|
1
|
+
{"version":3,"file":"getProxyFormState.d.ts","sourceRoot":"","sources":["../../src/logic/getProxyFormState.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;yBAG7E,YAAY,SAAS,WAAW,EAChC,QAAQ,GAAG,GAAG,EACd,kBAAkB,GAAG,YAAY,EAEjC,WAAW,SAAS,CAAC,YAAY,CAAC,EAClC,SAAS,OAAO,CAAC,YAAY,EAAE,QAAQ,EAAE,kBAAkB,CAAC,EAC5D,sBAAsB,aAAa,EACnC,gBAAa;AARf,wBA4BE"}
|
|
@@ -3,11 +3,11 @@ declare const _default: <TFieldValues extends FieldValues>(fieldsNames: Set<Inte
|
|
|
3
3
|
criteriaMode: CriteriaMode | undefined;
|
|
4
4
|
names: FieldName<TFieldValues>[];
|
|
5
5
|
fields: Record<string, {
|
|
6
|
-
ref: import("
|
|
6
|
+
ref: import("..").Ref;
|
|
7
7
|
name: InternalFieldName;
|
|
8
8
|
refs?: HTMLInputElement[];
|
|
9
9
|
mount?: boolean;
|
|
10
|
-
} & import("
|
|
10
|
+
} & import("..").RegisterOptions>;
|
|
11
11
|
shouldUseNativeValidation: boolean | undefined;
|
|
12
12
|
};
|
|
13
13
|
export default _default;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
import type { Field } from '../types';
|
|
2
|
-
declare const _default: (options: Field["_f"]) => string | number | boolean | import("
|
|
2
|
+
declare const _default: (options: Field["_f"]) => string | number | boolean | import("..").ValidationValueMessage<boolean> | import("..").ValidationValueMessage<string | number> | import("..").ValidationRule<RegExp> | import("..").Validate<any, import("..").FieldValues> | Record<string, import("..").Validate<any, import("..").FieldValues>> | undefined;
|
|
3
3
|
export default _default;
|
|
4
4
|
//# sourceMappingURL=hasValidation.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shouldRenderFormState.d.ts","sourceRoot":"","sources":["../../src/logic/shouldRenderFormState.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,WAAW,EACX,SAAS,EACT,iBAAiB,EACjB,aAAa,EACd,MAAM,UAAU,CAAC;yBAGF,CAAC,SAAS,WAAW,EAAE,CAAC,SAAS,aAAa,EAC5D,eAAe,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,GAAG;IACrC,IAAI,CAAC,EAAE,iBAAiB,CAAC;IACzB,MAAM,CAAC,EAAE,CAAC,CAAC;CACZ,EACD,iBAAiB,CAAC,EAClB,iBAAiB,CAAC,SAAS,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,EAC3D,SAAS,OAAO;AAPlB,
|
|
1
|
+
{"version":3,"file":"shouldRenderFormState.d.ts","sourceRoot":"","sources":["../../src/logic/shouldRenderFormState.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,WAAW,EACX,SAAS,EACT,iBAAiB,EACjB,aAAa,EACd,MAAM,UAAU,CAAC;yBAGF,CAAC,SAAS,WAAW,EAAE,CAAC,SAAS,aAAa,EAC5D,eAAe,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,GAAG;IACrC,IAAI,CAAC,EAAE,iBAAiB,CAAC;IACzB,MAAM,CAAC,EAAE,CAAC,CAAC;CACZ,EACD,iBAAiB,CAAC,EAClB,iBAAiB,CAAC,SAAS,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,EAC3D,SAAS,OAAO;AAPlB,wBAsBE"}
|
|
@@ -325,6 +325,29 @@ function markFieldsDirty(data, fields = {}) {
|
|
|
325
325
|
}
|
|
326
326
|
return fields;
|
|
327
327
|
}
|
|
328
|
+
function pruneDirtyFields(value) {
|
|
329
|
+
if (value === false) {
|
|
330
|
+
return undefined;
|
|
331
|
+
}
|
|
332
|
+
if (value === true) {
|
|
333
|
+
return true;
|
|
334
|
+
}
|
|
335
|
+
if (Array.isArray(value)) {
|
|
336
|
+
const result = value.map((value) => pruneDirtyFields(value));
|
|
337
|
+
return (result.some((value) => value !== undefined) ? result : undefined);
|
|
338
|
+
}
|
|
339
|
+
if (isObject(value)) {
|
|
340
|
+
const result = {};
|
|
341
|
+
for (const key in value) {
|
|
342
|
+
const pruned = pruneDirtyFields(value[key]);
|
|
343
|
+
if (!isUndefined(pruned)) {
|
|
344
|
+
result[key] = pruned;
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
return (Object.keys(result).length ? result : undefined);
|
|
348
|
+
}
|
|
349
|
+
return undefined;
|
|
350
|
+
}
|
|
328
351
|
function getDirtyFields(data, formValues, dirtyFieldsFromValues) {
|
|
329
352
|
if (!dirtyFieldsFromValues) {
|
|
330
353
|
dirtyFieldsFromValues = markFieldsDirty(formValues);
|
|
@@ -344,7 +367,7 @@ function getDirtyFields(data, formValues, dirtyFieldsFromValues) {
|
|
|
344
367
|
dirtyFieldsFromValues[key] = !deepEqual(value, formValue);
|
|
345
368
|
}
|
|
346
369
|
}
|
|
347
|
-
return dirtyFieldsFromValues;
|
|
370
|
+
return pruneDirtyFields(dirtyFieldsFromValues) || {};
|
|
348
371
|
}
|
|
349
372
|
|
|
350
373
|
var getEventValue = (event) => isObject(event) && event.target
|
|
@@ -353,6 +376,16 @@ var getEventValue = (event) => isObject(event) && event.target
|
|
|
353
376
|
: event.target.value
|
|
354
377
|
: event;
|
|
355
378
|
|
|
379
|
+
var getFieldArrayParentNames = (names, name) => {
|
|
380
|
+
const parts = name.split('.');
|
|
381
|
+
const matches = [];
|
|
382
|
+
let prefix = parts[0];
|
|
383
|
+
for (let i = 1; i < parts.length; prefix += '.' + parts[i++]) {
|
|
384
|
+
!isNaN(+parts[i]) && names.has(prefix) && matches.push(prefix);
|
|
385
|
+
}
|
|
386
|
+
return matches;
|
|
387
|
+
};
|
|
388
|
+
|
|
356
389
|
const defaultResult = {
|
|
357
390
|
value: false,
|
|
358
391
|
isValid: false,
|
|
@@ -422,8 +455,6 @@ function getFieldValue(_f) {
|
|
|
422
455
|
return getFieldValueAs(isUndefined(ref.value) ? _f.ref.value : ref.value, _f);
|
|
423
456
|
}
|
|
424
457
|
|
|
425
|
-
var getNodeParentName = (name) => name.substring(0, name.search(/\.\d+(\.|$)/)) || name;
|
|
426
|
-
|
|
427
458
|
var getResolverOptions = (fieldsNames, _fields, criteriaMode, shouldUseNativeValidation) => {
|
|
428
459
|
const fields = {};
|
|
429
460
|
for (const name of fieldsNames) {
|
|
@@ -475,10 +506,6 @@ var hasValidation = (options) => options.mount &&
|
|
|
475
506
|
options.pattern ||
|
|
476
507
|
options.validate);
|
|
477
508
|
|
|
478
|
-
var isNameInFieldArray = (names, name) => name
|
|
479
|
-
.split('.')
|
|
480
|
-
.some((part, index, arr) => !isNaN(Number(part)) && names.has(arr.slice(0, index).join('.')));
|
|
481
|
-
|
|
482
509
|
var isWatched = (name, _names, isBlurEvent) => !isBlurEvent &&
|
|
483
510
|
(_names.watchAll ||
|
|
484
511
|
_names.watch.has(name) ||
|
|
@@ -552,7 +579,8 @@ var shouldRenderFormState = (formStateData, _proxyFormState, updateFormState, is
|
|
|
552
579
|
updateFormState(formStateData);
|
|
553
580
|
const { name, ...formState } = formStateData;
|
|
554
581
|
return (isEmptyObject(formState) ||
|
|
555
|
-
|
|
582
|
+
(isRoot &&
|
|
583
|
+
Object.keys(formState).length >= Object.keys(_proxyFormState).length) ||
|
|
556
584
|
Object.keys(formState).find((key) => _proxyFormState[key] ===
|
|
557
585
|
(!isRoot || VALIDATION_MODE.all)));
|
|
558
586
|
};
|
|
@@ -795,24 +823,27 @@ const defaultOptions = {
|
|
|
795
823
|
reValidateMode: VALIDATION_MODE.onChange,
|
|
796
824
|
shouldFocusError: true,
|
|
797
825
|
};
|
|
826
|
+
const DEFAULT_FORM_STATE = {
|
|
827
|
+
submitCount: 0,
|
|
828
|
+
isDirty: false,
|
|
829
|
+
isReady: false,
|
|
830
|
+
isValidating: false,
|
|
831
|
+
isSubmitted: false,
|
|
832
|
+
isSubmitting: false,
|
|
833
|
+
isSubmitSuccessful: false,
|
|
834
|
+
isValid: false,
|
|
835
|
+
touchedFields: {},
|
|
836
|
+
dirtyFields: {},
|
|
837
|
+
validatingFields: {},
|
|
838
|
+
};
|
|
798
839
|
function createFormControl(props = {}) {
|
|
799
840
|
let _options = {
|
|
800
841
|
...defaultOptions,
|
|
801
842
|
...props,
|
|
802
843
|
};
|
|
803
844
|
let _formState = {
|
|
804
|
-
|
|
805
|
-
isDirty: false,
|
|
806
|
-
isReady: false,
|
|
845
|
+
...cloneObject(DEFAULT_FORM_STATE),
|
|
807
846
|
isLoading: isFunction(_options.defaultValues),
|
|
808
|
-
isValidating: false,
|
|
809
|
-
isSubmitted: false,
|
|
810
|
-
isSubmitting: false,
|
|
811
|
-
isSubmitSuccessful: false,
|
|
812
|
-
isValid: false,
|
|
813
|
-
touchedFields: {},
|
|
814
|
-
dirtyFields: {},
|
|
815
|
-
validatingFields: {},
|
|
816
847
|
errors: _options.errors || {},
|
|
817
848
|
disabled: _options.disabled || false,
|
|
818
849
|
};
|
|
@@ -909,10 +940,8 @@ function createFormControl(props = {}) {
|
|
|
909
940
|
});
|
|
910
941
|
}
|
|
911
942
|
};
|
|
912
|
-
const _updateDirtyFields = (
|
|
913
|
-
|
|
914
|
-
const rootName = getNodeParentName(name);
|
|
915
|
-
set(_formState.dirtyFields, rootName, get(fullDirtyFields, rootName));
|
|
943
|
+
const _updateDirtyFields = () => {
|
|
944
|
+
_formState.dirtyFields = getDirtyFields(_defaultValues, _formValues);
|
|
916
945
|
};
|
|
917
946
|
const _setFieldArray = (name, values = [], method, args, shouldSetValues = true, shouldUpdateFieldsAndState = true) => {
|
|
918
947
|
if (args && method && !_options.disabled) {
|
|
@@ -935,7 +964,7 @@ function createFormControl(props = {}) {
|
|
|
935
964
|
shouldSetValues && set(_formState.touchedFields, name, touchedFields);
|
|
936
965
|
}
|
|
937
966
|
if (_proxyFormState.dirtyFields || _proxySubscribeFormState.dirtyFields) {
|
|
938
|
-
_updateDirtyFields(
|
|
967
|
+
_updateDirtyFields();
|
|
939
968
|
}
|
|
940
969
|
_subjects.state.next({
|
|
941
970
|
name,
|
|
@@ -962,16 +991,53 @@ function createFormControl(props = {}) {
|
|
|
962
991
|
isValid: false,
|
|
963
992
|
});
|
|
964
993
|
};
|
|
994
|
+
const hasExplicitNullIntermediate = (name) => {
|
|
995
|
+
const segments = isKey(name) ? [name] : stringToPath(name);
|
|
996
|
+
let formValues = _formValues;
|
|
997
|
+
let defaultValues = _defaultValues;
|
|
998
|
+
for (let i = 0; i < segments.length - 1; i++) {
|
|
999
|
+
const key = segments[i];
|
|
1000
|
+
formValues = isNullOrUndefined(formValues) ? formValues : formValues[key];
|
|
1001
|
+
defaultValues = isNullOrUndefined(defaultValues)
|
|
1002
|
+
? defaultValues
|
|
1003
|
+
: defaultValues[key];
|
|
1004
|
+
if (formValues === null && defaultValues !== null) {
|
|
1005
|
+
return true;
|
|
1006
|
+
}
|
|
1007
|
+
}
|
|
1008
|
+
return false;
|
|
1009
|
+
};
|
|
965
1010
|
const updateValidAndValue = (name, shouldSkipSetValueAs, value, ref) => {
|
|
966
1011
|
const field = get(_fields, name);
|
|
967
1012
|
if (field) {
|
|
1013
|
+
if (hasExplicitNullIntermediate(name)) {
|
|
1014
|
+
return;
|
|
1015
|
+
}
|
|
1016
|
+
const wasUnsetInFormValues = isUndefined(get(_formValues, name));
|
|
968
1017
|
const defaultValue = get(_formValues, name, isUndefined(value) ? get(_defaultValues, name) : value);
|
|
969
1018
|
isUndefined(defaultValue) ||
|
|
970
1019
|
(ref && ref.defaultChecked) ||
|
|
971
1020
|
shouldSkipSetValueAs
|
|
972
1021
|
? set(_formValues, name, shouldSkipSetValueAs ? defaultValue : getFieldValue(field._f))
|
|
973
1022
|
: setFieldValue(name, defaultValue);
|
|
974
|
-
_state.mount && !_state.action
|
|
1023
|
+
if (_state.mount && !_state.action) {
|
|
1024
|
+
_setValid();
|
|
1025
|
+
// Re-registering a field after a prior unregister puts its key back
|
|
1026
|
+
// into _formValues, which can flip isDirty back to false (#13397).
|
|
1027
|
+
// Only run when we are currently dirty, otherwise an initial register
|
|
1028
|
+
// for a field with no defaultValue would flip isDirty to true. Reset
|
|
1029
|
+
// paths repopulate _formValues before re-register, so the key is
|
|
1030
|
+
// present then and this branch is skipped (preserves keepDirty).
|
|
1031
|
+
if (wasUnsetInFormValues &&
|
|
1032
|
+
_formState.isDirty &&
|
|
1033
|
+
(_proxyFormState.isDirty || _proxySubscribeFormState.isDirty)) {
|
|
1034
|
+
const isDirty = _getDirty();
|
|
1035
|
+
if (!isDirty) {
|
|
1036
|
+
_formState.isDirty = false;
|
|
1037
|
+
_subjects.state.next({ ..._formState });
|
|
1038
|
+
}
|
|
1039
|
+
}
|
|
1040
|
+
}
|
|
975
1041
|
}
|
|
976
1042
|
};
|
|
977
1043
|
const updateTouchAndDirty = (name, fieldValue, isBlurEvent, shouldDirty, shouldRender) => {
|
|
@@ -989,9 +1055,14 @@ function createFormControl(props = {}) {
|
|
|
989
1055
|
}
|
|
990
1056
|
const isCurrentFieldPristine = deepEqual(get(_defaultValues, name), fieldValue);
|
|
991
1057
|
isPreviousDirty = !!get(_formState.dirtyFields, name);
|
|
992
|
-
isCurrentFieldPristine
|
|
993
|
-
|
|
994
|
-
|
|
1058
|
+
if (isCurrentFieldPristine !== _formState.isDirty) {
|
|
1059
|
+
_formState.dirtyFields = getDirtyFields(_defaultValues, _formValues);
|
|
1060
|
+
}
|
|
1061
|
+
else {
|
|
1062
|
+
isCurrentFieldPristine
|
|
1063
|
+
? unset(_formState.dirtyFields, name)
|
|
1064
|
+
: set(_formState.dirtyFields, name, true);
|
|
1065
|
+
}
|
|
995
1066
|
output.dirtyFields = _formState.dirtyFields;
|
|
996
1067
|
shouldUpdateField =
|
|
997
1068
|
shouldUpdateField ||
|
|
@@ -1058,7 +1129,9 @@ function createFormControl(props = {}) {
|
|
|
1058
1129
|
for (const name of names) {
|
|
1059
1130
|
const error = get(errors, name);
|
|
1060
1131
|
error
|
|
1061
|
-
?
|
|
1132
|
+
? _names.array.has(name) && isObject(error)
|
|
1133
|
+
? updateFieldArrayRootError(_formState.errors, { [name]: error }, name)
|
|
1134
|
+
: set(_formState.errors, name, error)
|
|
1062
1135
|
: unset(_formState.errors, name);
|
|
1063
1136
|
}
|
|
1064
1137
|
}
|
|
@@ -1080,8 +1153,8 @@ function createFormControl(props = {}) {
|
|
|
1080
1153
|
const error = result[key];
|
|
1081
1154
|
if (error) {
|
|
1082
1155
|
setError(`${FORM_ERROR_TYPE}.${key}`, {
|
|
1083
|
-
message: isString(
|
|
1084
|
-
type: INPUT_VALIDATION_RULES.validate,
|
|
1156
|
+
message: isString(error.message) ? error.message : '',
|
|
1157
|
+
type: error.type || INPUT_VALIDATION_RULES.validate,
|
|
1085
1158
|
});
|
|
1086
1159
|
}
|
|
1087
1160
|
}
|
|
@@ -1123,11 +1196,15 @@ function createFormControl(props = {}) {
|
|
|
1123
1196
|
if (_f) {
|
|
1124
1197
|
const isFieldArrayRoot = _names.array.has(_f.name);
|
|
1125
1198
|
const isPromiseFunction = field._f && hasPromiseValidation(field._f);
|
|
1126
|
-
|
|
1199
|
+
const shouldTrackIsValidatingState = _proxyFormState.validatingFields ||
|
|
1200
|
+
_proxyFormState.isValidating ||
|
|
1201
|
+
_proxySubscribeFormState.validatingFields ||
|
|
1202
|
+
_proxySubscribeFormState.isValidating;
|
|
1203
|
+
if (isPromiseFunction && shouldTrackIsValidatingState) {
|
|
1127
1204
|
_updateIsValidating([_f.name], true);
|
|
1128
1205
|
}
|
|
1129
1206
|
const fieldError = await validateField(field, _names.disabled, _formValues, shouldDisplayAllAssociatedErrors, _options.shouldUseNativeValidation && !onlyCheckValid, isFieldArrayRoot);
|
|
1130
|
-
if (isPromiseFunction &&
|
|
1207
|
+
if (isPromiseFunction && shouldTrackIsValidatingState) {
|
|
1131
1208
|
_updateIsValidating([_f.name]);
|
|
1132
1209
|
}
|
|
1133
1210
|
if (fieldError[_f.name]) {
|
|
@@ -1255,14 +1332,20 @@ function createFormControl(props = {}) {
|
|
|
1255
1332
|
const cloneValue = cloneObject(value);
|
|
1256
1333
|
const previousValue = get(_formValues, name);
|
|
1257
1334
|
const isValueUnchanged = deepEqual(previousValue, cloneValue);
|
|
1258
|
-
|
|
1335
|
+
if (!isValueUnchanged) {
|
|
1336
|
+
set(_formValues, name, cloneValue);
|
|
1337
|
+
}
|
|
1259
1338
|
if (isFieldArray) {
|
|
1260
1339
|
_subjects.array.next({
|
|
1261
1340
|
name,
|
|
1262
1341
|
values: cloneObject(_formValues),
|
|
1263
1342
|
});
|
|
1264
|
-
if (
|
|
1265
|
-
|
|
1343
|
+
if ((_proxyFormState.isDirty ||
|
|
1344
|
+
_proxyFormState.dirtyFields ||
|
|
1345
|
+
_proxySubscribeFormState.isDirty ||
|
|
1346
|
+
_proxySubscribeFormState.dirtyFields) &&
|
|
1347
|
+
options.shouldDirty) {
|
|
1348
|
+
_updateDirtyFields();
|
|
1266
1349
|
_subjects.state.next({
|
|
1267
1350
|
name,
|
|
1268
1351
|
dirtyFields: _formState.dirtyFields,
|
|
@@ -1281,19 +1364,18 @@ function createFormControl(props = {}) {
|
|
|
1281
1364
|
}
|
|
1282
1365
|
}
|
|
1283
1366
|
if (!isValueUnchanged) {
|
|
1284
|
-
|
|
1285
|
-
|
|
1286
|
-
|
|
1287
|
-
|
|
1288
|
-
|
|
1289
|
-
}
|
|
1290
|
-
}
|
|
1291
|
-
else {
|
|
1292
|
-
_subjects.state.next({
|
|
1293
|
-
name: _state.mount ? name : undefined,
|
|
1294
|
-
values: cloneObject(_formValues),
|
|
1295
|
-
});
|
|
1367
|
+
const watched = isWatched(name, _names);
|
|
1368
|
+
const values = cloneObject(_formValues);
|
|
1369
|
+
if (!isFieldArray) {
|
|
1370
|
+
for (const arrayName of getFieldArrayParentNames(_names.array, name)) {
|
|
1371
|
+
_subjects.array.next({ name: arrayName, values });
|
|
1372
|
+
}
|
|
1296
1373
|
}
|
|
1374
|
+
_subjects.state.next({
|
|
1375
|
+
...(watched && _formState),
|
|
1376
|
+
name: _state.mount || watched ? name : undefined,
|
|
1377
|
+
values,
|
|
1378
|
+
});
|
|
1297
1379
|
}
|
|
1298
1380
|
};
|
|
1299
1381
|
const setValues = (formValues) => {
|
|
@@ -1305,6 +1387,9 @@ function createFormControl(props = {}) {
|
|
|
1305
1387
|
..._formValues,
|
|
1306
1388
|
...updatedFormValues,
|
|
1307
1389
|
};
|
|
1390
|
+
for (const fieldName of _names.mount) {
|
|
1391
|
+
setValue(fieldName, get(updatedFormValues, fieldName));
|
|
1392
|
+
}
|
|
1308
1393
|
_subjects.state.next({ ..._formState, values: _formValues });
|
|
1309
1394
|
}
|
|
1310
1395
|
};
|
|
@@ -1675,13 +1760,15 @@ function createFormControl(props = {}) {
|
|
|
1675
1760
|
field._f.mount = false;
|
|
1676
1761
|
}
|
|
1677
1762
|
(_options.shouldUnregister || options.shouldUnregister) &&
|
|
1678
|
-
!(
|
|
1763
|
+
!(getFieldArrayParentNames(_names.array, name).length &&
|
|
1764
|
+
_state.action) &&
|
|
1679
1765
|
_names.unMount.add(name);
|
|
1680
1766
|
}
|
|
1681
1767
|
},
|
|
1682
1768
|
};
|
|
1683
1769
|
};
|
|
1684
1770
|
const _focusError = () => _options.shouldFocusError &&
|
|
1771
|
+
!_options.shouldUseNativeValidation &&
|
|
1685
1772
|
iterateFieldsByAction(_fields, _focusInput, _names.mount);
|
|
1686
1773
|
const _disableForm = (disabled) => {
|
|
1687
1774
|
if (isBoolean(disabled)) {
|