react-hook-form 7.81.0 → 7.83.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 +8 -9
- package/dist/index.cjs.js +1 -1
- package/dist/index.cjs.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.esm.mjs +2308 -2233
- 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.map +1 -1
- package/dist/logic/getDirtyFields.d.ts +3 -2
- package/dist/logic/getDirtyFields.d.ts.map +1 -1
- package/dist/logic/getEventValue.d.ts.map +1 -1
- package/dist/logic/getValueAndMessage.d.ts +1 -4
- package/dist/logic/getValueAndMessage.d.ts.map +1 -1
- package/dist/react-server.esm.mjs +111 -72
- package/dist/react-server.esm.mjs.map +1 -1
- package/dist/types/errors.d.ts +2 -2
- package/dist/types/errors.d.ts.map +1 -1
- package/dist/types/form.d.ts +58 -57
- package/dist/types/form.d.ts.map +1 -1
- package/dist/types/path/common.d.ts +6 -0
- package/dist/types/path/common.d.ts.map +1 -1
- package/dist/types/path/eager.d.ts +15 -11
- package/dist/types/path/eager.d.ts.map +1 -1
- package/dist/types/utils.d.ts +1 -1
- package/dist/types/utils.d.ts.map +1 -1
- package/dist/types/validator.d.ts +1 -1
- package/dist/types/validator.d.ts.map +1 -1
- package/dist/types/watch.d.ts +1 -1
- package/dist/types/watch.d.ts.map +1 -1
- package/dist/useFormContext.d.ts +1 -1
- package/dist/useFormContext.d.ts.map +1 -1
- package/dist/useFormState.d.ts +2 -2
- package/dist/useWatch.d.ts +14 -14
- package/package.json +7 -7
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"createFormControl.d.ts","sourceRoot":"","sources":["../../src/logic/createFormControl.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAcV,WAAW,
|
|
1
|
+
{"version":3,"file":"createFormControl.d.ts","sourceRoot":"","sources":["../../src/logic/createFormControl.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAcV,WAAW,EAkBX,YAAY,EAKZ,aAAa,EAYd,MAAM,UAAU,CAAC;AAuElB,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,CAo3DA"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
import type { FieldRefs } from '../types';
|
|
2
|
+
declare function markFieldsDirty<T>(data: T, fields?: Record<string, any>, fieldRefs?: Record<string, any>): Record<string, any>;
|
|
3
|
+
export default function getDirtyFields<T>(data: T, formValues: T, dirtyFieldsFromValues?: Record<Extract<keyof T, string>, ReturnType<typeof markFieldsDirty> | boolean>, fieldRefs?: FieldRefs): Record<Extract<keyof T, string>, boolean | Record<string, any>>;
|
|
3
4
|
export {};
|
|
4
5
|
//# sourceMappingURL=getDirtyFields.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getDirtyFields.d.ts","sourceRoot":"","sources":["../../src/logic/getDirtyFields.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"getDirtyFields.d.ts","sourceRoot":"","sources":["../../src/logic/getDirtyFields.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AA8B1C,iBAAS,eAAe,CAAC,CAAC,EACxB,IAAI,EAAE,CAAC,EACP,MAAM,GAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAM,EAChC,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,uBAsBhC;AAED,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,EACD,SAAS,CAAC,EAAE,SAAS,mEAwCtB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getEventValue.d.ts","sourceRoot":"","sources":["../../src/logic/getEventValue.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"getEventValue.d.ts","sourceRoot":"","sources":["../../src/logic/getEventValue.ts"],"names":[],"mappings":"yBAMgB,OAAO,OAAO;AAA9B,wBAOY"}
|
|
@@ -1,7 +1,4 @@
|
|
|
1
1
|
import type { ValidationRule } from '../types';
|
|
2
|
-
declare const _default: (validationData?: ValidationRule) =>
|
|
3
|
-
value: string | number | boolean | RegExp | undefined;
|
|
4
|
-
message: string;
|
|
5
|
-
};
|
|
2
|
+
declare const _default: (validationData?: ValidationRule) => import("..").ValidationValueMessage<import("..").ValidationValue>;
|
|
6
3
|
export default _default;
|
|
7
4
|
//# sourceMappingURL=getValueAndMessage.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getValueAndMessage.d.ts","sourceRoot":"","sources":["../../src/logic/getValueAndMessage.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;yBAI/B,iBAAiB,cAAc
|
|
1
|
+
{"version":3,"file":"getValueAndMessage.d.ts","sourceRoot":"","sources":["../../src/logic/getValueAndMessage.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;yBAI/B,iBAAiB,cAAc;AAA/C,wBAMQ"}
|
|
@@ -353,12 +353,33 @@ var objectHasFunction = (data) => {
|
|
|
353
353
|
function isTraversable(value) {
|
|
354
354
|
return Array.isArray(value) || (isObject(value) && !objectHasFunction(value));
|
|
355
355
|
}
|
|
356
|
-
function
|
|
356
|
+
function isRegisteredLeaf(fieldRef) {
|
|
357
|
+
return !!(fieldRef && '_f' in fieldRef);
|
|
358
|
+
}
|
|
359
|
+
function isEmptyDirtyContainer(value) {
|
|
360
|
+
return Array.isArray(value)
|
|
361
|
+
? !value.some((item) => !isUndefined(item))
|
|
362
|
+
: !Object.keys(value).length;
|
|
363
|
+
}
|
|
364
|
+
function clearDirtyField(container, key) {
|
|
365
|
+
if (Array.isArray(container)) {
|
|
366
|
+
container[key] = undefined;
|
|
367
|
+
}
|
|
368
|
+
else {
|
|
369
|
+
delete container[key];
|
|
370
|
+
}
|
|
371
|
+
}
|
|
372
|
+
function markFieldsDirty(data, fields = {}, fieldRefs) {
|
|
357
373
|
for (const key in data) {
|
|
358
374
|
const value = data[key];
|
|
359
|
-
|
|
375
|
+
const fieldRef = fieldRefs && fieldRefs[key];
|
|
376
|
+
if (isTraversable(value) &&
|
|
377
|
+
(!Array.isArray(value) || !isRegisteredLeaf(fieldRef))) {
|
|
360
378
|
fields[key] = Array.isArray(value) ? [] : {};
|
|
361
|
-
markFieldsDirty(value, fields[key]);
|
|
379
|
+
markFieldsDirty(value, fields[key], fieldRef);
|
|
380
|
+
if (isEmptyDirtyContainer(fields[key])) {
|
|
381
|
+
clearDirtyField(fields, key);
|
|
382
|
+
}
|
|
362
383
|
}
|
|
363
384
|
else if (!isUndefined(value)) {
|
|
364
385
|
fields[key] = true;
|
|
@@ -366,55 +387,41 @@ function markFieldsDirty(data, fields = {}) {
|
|
|
366
387
|
}
|
|
367
388
|
return fields;
|
|
368
389
|
}
|
|
369
|
-
function
|
|
370
|
-
if (value === false) {
|
|
371
|
-
return undefined;
|
|
372
|
-
}
|
|
373
|
-
if (value === true) {
|
|
374
|
-
return true;
|
|
375
|
-
}
|
|
376
|
-
if (Array.isArray(value)) {
|
|
377
|
-
const result = value.map((value) => pruneDirtyFields(value));
|
|
378
|
-
return (result.some((value) => value !== undefined) ? result : undefined);
|
|
379
|
-
}
|
|
380
|
-
if (isObject(value)) {
|
|
381
|
-
const result = {};
|
|
382
|
-
for (const key in value) {
|
|
383
|
-
const pruned = pruneDirtyFields(value[key]);
|
|
384
|
-
if (!isUndefined(pruned)) {
|
|
385
|
-
result[key] = pruned;
|
|
386
|
-
}
|
|
387
|
-
}
|
|
388
|
-
return (Object.keys(result).length ? result : undefined);
|
|
389
|
-
}
|
|
390
|
-
return undefined;
|
|
391
|
-
}
|
|
392
|
-
function getDirtyFields(data, formValues, dirtyFieldsFromValues) {
|
|
390
|
+
function getDirtyFields(data, formValues, dirtyFieldsFromValues, fieldRefs) {
|
|
393
391
|
if (!dirtyFieldsFromValues) {
|
|
394
|
-
dirtyFieldsFromValues = markFieldsDirty(formValues);
|
|
392
|
+
dirtyFieldsFromValues = markFieldsDirty(formValues, {}, fieldRefs);
|
|
395
393
|
}
|
|
396
394
|
for (const key in data) {
|
|
397
395
|
const value = data[key];
|
|
398
|
-
|
|
396
|
+
const fieldRef = fieldRefs && fieldRefs[key];
|
|
397
|
+
if (isTraversable(value) &&
|
|
398
|
+
(!Array.isArray(value) || !isRegisteredLeaf(fieldRef))) {
|
|
399
399
|
if (isUndefined(formValues) || isPrimitive(dirtyFieldsFromValues[key])) {
|
|
400
|
-
dirtyFieldsFromValues[key] = markFieldsDirty(value, Array.isArray(value) ? [] : {});
|
|
400
|
+
dirtyFieldsFromValues[key] = markFieldsDirty(value, Array.isArray(value) ? [] : {}, fieldRef);
|
|
401
401
|
}
|
|
402
402
|
else {
|
|
403
|
-
getDirtyFields(value, isNullOrUndefined(formValues) ? {} : formValues[key], dirtyFieldsFromValues[key]);
|
|
403
|
+
getDirtyFields(value, isNullOrUndefined(formValues) ? {} : formValues[key], dirtyFieldsFromValues[key], fieldRef);
|
|
404
404
|
}
|
|
405
|
+
if (isEmptyDirtyContainer(dirtyFieldsFromValues[key])) {
|
|
406
|
+
clearDirtyField(dirtyFieldsFromValues, key);
|
|
407
|
+
}
|
|
408
|
+
}
|
|
409
|
+
else if (deepEqual(value, formValues[key])) {
|
|
410
|
+
clearDirtyField(dirtyFieldsFromValues, key);
|
|
405
411
|
}
|
|
406
412
|
else {
|
|
407
|
-
|
|
408
|
-
dirtyFieldsFromValues[key] = !deepEqual(value, formValue);
|
|
413
|
+
dirtyFieldsFromValues[key] = true;
|
|
409
414
|
}
|
|
410
415
|
}
|
|
411
|
-
return
|
|
416
|
+
return dirtyFieldsFromValues;
|
|
412
417
|
}
|
|
413
418
|
|
|
414
419
|
var getEventValue = (event) => isObject(event) && event.target
|
|
415
420
|
? isCheckBoxInput(event.target)
|
|
416
421
|
? event.target.checked
|
|
417
|
-
: event.target
|
|
422
|
+
: isFileInput(event.target)
|
|
423
|
+
? event.target.files
|
|
424
|
+
: event.target.value
|
|
418
425
|
: event;
|
|
419
426
|
|
|
420
427
|
const defaultResult = {
|
|
@@ -881,6 +888,14 @@ const defaultOptions = {
|
|
|
881
888
|
shouldFocusError: true,
|
|
882
889
|
};
|
|
883
890
|
const FORM_ERROR_TYPE = 'form';
|
|
891
|
+
const updateDirtyFields = (dirtyFields, nextDirtyFields) => {
|
|
892
|
+
for (const key in dirtyFields) {
|
|
893
|
+
if (!(key in nextDirtyFields)) {
|
|
894
|
+
delete dirtyFields[key];
|
|
895
|
+
}
|
|
896
|
+
}
|
|
897
|
+
Object.assign(dirtyFields, nextDirtyFields);
|
|
898
|
+
};
|
|
884
899
|
const DEFAULT_FORM_STATE = {
|
|
885
900
|
submitCount: 0,
|
|
886
901
|
isDirty: false,
|
|
@@ -926,8 +941,8 @@ function createFormControl(props = {}) {
|
|
|
926
941
|
watch: new Set(),
|
|
927
942
|
registerName: new Set(),
|
|
928
943
|
};
|
|
929
|
-
|
|
930
|
-
|
|
944
|
+
const delayErrorCallbacks = {};
|
|
945
|
+
const timers = {};
|
|
931
946
|
let _valuesSubscriberCount = 0;
|
|
932
947
|
let _validationModeBeforeSubmit = getValidationModes(_options.mode);
|
|
933
948
|
let _validationModeAfterSubmit = getValidationModes(_options.reValidateMode);
|
|
@@ -950,10 +965,11 @@ function createFormControl(props = {}) {
|
|
|
950
965
|
array: createSubject(),
|
|
951
966
|
state: createSubject(),
|
|
952
967
|
};
|
|
968
|
+
let _setValidCallId = 0;
|
|
953
969
|
const shouldDisplayAllAssociatedErrors = _options.criteriaMode === VALIDATION_MODE.all;
|
|
954
|
-
const debounce = (callback) => (wait) => {
|
|
955
|
-
clearTimeout(
|
|
956
|
-
|
|
970
|
+
const debounce = (name, callback) => (wait) => {
|
|
971
|
+
clearTimeout(timers[name]);
|
|
972
|
+
timers[name] = setTimeout(callback, wait);
|
|
957
973
|
};
|
|
958
974
|
const _setValid = async (shouldUpdateValid) => {
|
|
959
975
|
if (_state.keepIsValid) {
|
|
@@ -963,10 +979,11 @@ function createFormControl(props = {}) {
|
|
|
963
979
|
(_proxyFormState.isValid ||
|
|
964
980
|
_proxySubscribeFormState.isValid ||
|
|
965
981
|
shouldUpdateValid)) {
|
|
982
|
+
const callId = ++_setValidCallId;
|
|
966
983
|
let isValid;
|
|
967
984
|
if (_options.resolver) {
|
|
968
985
|
isValid = isEmptyObject((await _runSchema()).errors);
|
|
969
|
-
_updateIsValidating();
|
|
986
|
+
callId === _setValidCallId && _updateIsValidating();
|
|
970
987
|
}
|
|
971
988
|
else {
|
|
972
989
|
isValid = await executeBuiltInValidation({
|
|
@@ -975,7 +992,7 @@ function createFormControl(props = {}) {
|
|
|
975
992
|
eventType: EVENTS.VALID,
|
|
976
993
|
});
|
|
977
994
|
}
|
|
978
|
-
if (isValid !== _formState.isValid) {
|
|
995
|
+
if (callId === _setValidCallId && isValid !== _formState.isValid) {
|
|
979
996
|
_subjects.state.next({
|
|
980
997
|
isValid,
|
|
981
998
|
});
|
|
@@ -1002,7 +1019,7 @@ function createFormControl(props = {}) {
|
|
|
1002
1019
|
}
|
|
1003
1020
|
};
|
|
1004
1021
|
const _updateDirtyFields = () => {
|
|
1005
|
-
_formState.dirtyFields = getDirtyFields(_defaultValues, _formValues);
|
|
1022
|
+
_formState.dirtyFields = getDirtyFields(_defaultValues, _formValues, undefined, _fields);
|
|
1006
1023
|
};
|
|
1007
1024
|
const _setFieldArray = (name, values = [], method, args, shouldSetValues = true, shouldUpdateFieldsAndState = true) => {
|
|
1008
1025
|
if (args && method && !_options.disabled) {
|
|
@@ -1108,7 +1125,9 @@ function createFormControl(props = {}) {
|
|
|
1108
1125
|
const output = {
|
|
1109
1126
|
name,
|
|
1110
1127
|
};
|
|
1111
|
-
|
|
1128
|
+
// an explicit programmatic update (e.g. setValue with shouldDirty: true)
|
|
1129
|
+
// opts into dirty tracking even when the form is disabled
|
|
1130
|
+
if (!_options.disabled || shouldDirty === true) {
|
|
1112
1131
|
if (!isBlurEvent || shouldDirty) {
|
|
1113
1132
|
const isCurrentFieldPristine = deepEqual(get(_defaultValues, name), fieldValue);
|
|
1114
1133
|
if (_proxyFormState.isDirty || _proxySubscribeFormState.isDirty) {
|
|
@@ -1119,7 +1138,7 @@ function createFormControl(props = {}) {
|
|
|
1119
1138
|
}
|
|
1120
1139
|
isPreviousDirty = !!get(_formState.dirtyFields, name);
|
|
1121
1140
|
if (isCurrentFieldPristine !== _formState.isDirty) {
|
|
1122
|
-
_formState.dirtyFields
|
|
1141
|
+
updateDirtyFields(_formState.dirtyFields, getDirtyFields(_defaultValues, _formValues, undefined, _fields));
|
|
1123
1142
|
}
|
|
1124
1143
|
else {
|
|
1125
1144
|
isCurrentFieldPristine
|
|
@@ -1155,12 +1174,12 @@ function createFormControl(props = {}) {
|
|
|
1155
1174
|
isBoolean(isValid) &&
|
|
1156
1175
|
_formState.isValid !== isValid;
|
|
1157
1176
|
if (_options.delayError && error) {
|
|
1158
|
-
|
|
1159
|
-
|
|
1177
|
+
delayErrorCallbacks[name] = debounce(name, () => updateErrors(name, error));
|
|
1178
|
+
delayErrorCallbacks[name](_options.delayError);
|
|
1160
1179
|
}
|
|
1161
1180
|
else {
|
|
1162
|
-
clearTimeout(
|
|
1163
|
-
|
|
1181
|
+
clearTimeout(timers[name]);
|
|
1182
|
+
delete delayErrorCallbacks[name];
|
|
1164
1183
|
error
|
|
1165
1184
|
? set(_formState.errors, name, error)
|
|
1166
1185
|
: unset(_formState.errors, name);
|
|
@@ -1313,9 +1332,8 @@ function createFormControl(props = {}) {
|
|
|
1313
1332
|
}
|
|
1314
1333
|
_names.unMount = new Set();
|
|
1315
1334
|
};
|
|
1316
|
-
const _getDirty = (name, data) =>
|
|
1317
|
-
(
|
|
1318
|
-
!deepEqual(_state.mount ? _formValues : _defaultValues, _defaultValues));
|
|
1335
|
+
const _getDirty = (name, data) => (name && data && set(_formValues, name, data),
|
|
1336
|
+
!deepEqual(_state.mount ? _formValues : _defaultValues, _defaultValues));
|
|
1319
1337
|
const _getWatch = (names, defaultValue, isGlobal) => generateWatchOutput(names, _names, {
|
|
1320
1338
|
...(_state.mount
|
|
1321
1339
|
? _formValues
|
|
@@ -1375,7 +1393,10 @@ function createFormControl(props = {}) {
|
|
|
1375
1393
|
}
|
|
1376
1394
|
(options.shouldDirty || options.shouldTouch) &&
|
|
1377
1395
|
updateTouchAndDirty(name, fieldValue, options.shouldTouch, options.shouldDirty, !skipRender);
|
|
1378
|
-
options.shouldValidate &&
|
|
1396
|
+
options.shouldValidate &&
|
|
1397
|
+
trigger(name, {
|
|
1398
|
+
delayError: options.delayError,
|
|
1399
|
+
});
|
|
1379
1400
|
};
|
|
1380
1401
|
const setFieldValues = (name, value, options, skipClone = false, skipRender = false) => {
|
|
1381
1402
|
for (const fieldKey in value) {
|
|
@@ -1500,7 +1521,8 @@ function createFormControl(props = {}) {
|
|
|
1500
1521
|
if (isBlurEvent) {
|
|
1501
1522
|
if (!target || !target.readOnly) {
|
|
1502
1523
|
field._f.onBlur && field._f.onBlur(event);
|
|
1503
|
-
|
|
1524
|
+
const pendingDelayError = delayErrorCallbacks[name];
|
|
1525
|
+
pendingDelayError && pendingDelayError(0);
|
|
1504
1526
|
}
|
|
1505
1527
|
}
|
|
1506
1528
|
else if (field._f.onChange) {
|
|
@@ -1615,6 +1637,18 @@ function createFormControl(props = {}) {
|
|
|
1615
1637
|
eventType: EVENTS.TRIGGER,
|
|
1616
1638
|
});
|
|
1617
1639
|
}
|
|
1640
|
+
if (options.delayError && _options.delayError && isString(name)) {
|
|
1641
|
+
const error = get(_formState.errors, name);
|
|
1642
|
+
if (error) {
|
|
1643
|
+
unset(_formState.errors, name);
|
|
1644
|
+
delayErrorCallbacks[name] = debounce(name, () => updateErrors(name, error));
|
|
1645
|
+
delayErrorCallbacks[name](_options.delayError);
|
|
1646
|
+
}
|
|
1647
|
+
else {
|
|
1648
|
+
clearTimeout(timers[name]);
|
|
1649
|
+
delete delayErrorCallbacks[name];
|
|
1650
|
+
}
|
|
1651
|
+
}
|
|
1618
1652
|
_subjects.state.next({
|
|
1619
1653
|
...(!isString(name) ||
|
|
1620
1654
|
((_proxyFormState.isValid || _proxySubscribeFormState.isValid) &&
|
|
@@ -1661,8 +1695,9 @@ function createFormControl(props = {}) {
|
|
|
1661
1695
|
});
|
|
1662
1696
|
}
|
|
1663
1697
|
else {
|
|
1698
|
+
_formState.errors = {};
|
|
1664
1699
|
_subjects.state.next({
|
|
1665
|
-
errors:
|
|
1700
|
+
errors: _formState.errors,
|
|
1666
1701
|
});
|
|
1667
1702
|
}
|
|
1668
1703
|
};
|
|
@@ -1847,20 +1882,23 @@ function createFormControl(props = {}) {
|
|
|
1847
1882
|
: fieldRef === field._f.ref) {
|
|
1848
1883
|
return;
|
|
1849
1884
|
}
|
|
1885
|
+
const newField = {
|
|
1886
|
+
...field._f,
|
|
1887
|
+
};
|
|
1888
|
+
if (radioOrCheckbox) {
|
|
1889
|
+
newField.refs = [
|
|
1890
|
+
...refs.filter(live),
|
|
1891
|
+
fieldRef,
|
|
1892
|
+
...(Array.isArray(get(_defaultValues, name)) ? [{}] : []),
|
|
1893
|
+
];
|
|
1894
|
+
newField.ref = { type: fieldRef.type, name };
|
|
1895
|
+
}
|
|
1896
|
+
else {
|
|
1897
|
+
newField.ref = fieldRef;
|
|
1898
|
+
delete newField.refs;
|
|
1899
|
+
}
|
|
1850
1900
|
set(_fields, name, {
|
|
1851
|
-
_f:
|
|
1852
|
-
...field._f,
|
|
1853
|
-
...(radioOrCheckbox
|
|
1854
|
-
? {
|
|
1855
|
-
refs: [
|
|
1856
|
-
...refs.filter(live),
|
|
1857
|
-
fieldRef,
|
|
1858
|
-
...(Array.isArray(get(_defaultValues, name)) ? [{}] : []),
|
|
1859
|
-
],
|
|
1860
|
-
ref: { type: fieldRef.type, name },
|
|
1861
|
-
}
|
|
1862
|
-
: { ref: fieldRef }),
|
|
1863
|
-
},
|
|
1901
|
+
_f: newField,
|
|
1864
1902
|
});
|
|
1865
1903
|
updateValidAndValue(name, false, undefined, fieldRef);
|
|
1866
1904
|
}
|
|
@@ -1983,6 +2021,7 @@ function createFormControl(props = {}) {
|
|
|
1983
2021
|
const cloneUpdatedValues = cloneObject(updatedValues);
|
|
1984
2022
|
const isEmptyResetValues = isEmptyObject(formValues);
|
|
1985
2023
|
const values = cloneUpdatedValues;
|
|
2024
|
+
const fieldRefs = _fields;
|
|
1986
2025
|
if (!keepStateOptions.keepDefaultValues) {
|
|
1987
2026
|
_defaultValues = updatedValues;
|
|
1988
2027
|
}
|
|
@@ -1990,7 +2029,7 @@ function createFormControl(props = {}) {
|
|
|
1990
2029
|
if (keepStateOptions.keepDirtyValues) {
|
|
1991
2030
|
const fieldsToCheck = new Set([
|
|
1992
2031
|
..._names.mount,
|
|
1993
|
-
...Object.keys(getDirtyFields(_defaultValues, _formValues)),
|
|
2032
|
+
...Object.keys(getDirtyFields(_defaultValues, _formValues, undefined, fieldRefs)),
|
|
1994
2033
|
]);
|
|
1995
2034
|
for (const fieldName of Array.from(fieldsToCheck)) {
|
|
1996
2035
|
const isDirty = get(_formState.dirtyFields, fieldName);
|
|
@@ -2093,10 +2132,10 @@ function createFormControl(props = {}) {
|
|
|
2093
2132
|
? {}
|
|
2094
2133
|
: keepStateOptions.keepDirtyValues
|
|
2095
2134
|
? keepStateOptions.keepDefaultValues && _formValues
|
|
2096
|
-
? getDirtyFields(_defaultValues, _formValues)
|
|
2135
|
+
? getDirtyFields(_defaultValues, _formValues, undefined, fieldRefs)
|
|
2097
2136
|
: _formState.dirtyFields
|
|
2098
2137
|
: keepStateOptions.keepDefaultValues && formValues
|
|
2099
|
-
? getDirtyFields(_defaultValues, formValues)
|
|
2138
|
+
? getDirtyFields(_defaultValues, formValues, undefined, fieldRefs)
|
|
2100
2139
|
: keepStateOptions.keepDirty
|
|
2101
2140
|
? _formState.dirtyFields
|
|
2102
2141
|
: {},
|
|
@@ -2153,7 +2192,7 @@ function createFormControl(props = {}) {
|
|
|
2153
2192
|
const resetDefaultValues = (values, options = {}) => {
|
|
2154
2193
|
_defaultValues = cloneObject(values);
|
|
2155
2194
|
if (!options.keepDirty) {
|
|
2156
|
-
const newDirtyFields = getDirtyFields(_defaultValues, _formValues);
|
|
2195
|
+
const newDirtyFields = getDirtyFields(_defaultValues, _formValues, undefined, _fields);
|
|
2157
2196
|
_formState.dirtyFields = newDirtyFields;
|
|
2158
2197
|
_formState.isDirty = !isEmptyObject(newDirtyFields);
|
|
2159
2198
|
}
|