react-hook-form 7.20.2 → 7.21.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/CHANGELOG.md +13 -0
- package/README.md +28 -20
- package/dist/index.cjs.js +1 -1
- package/dist/index.cjs.js.map +1 -1
- package/dist/index.esm.js +137 -125
- package/dist/index.esm.js.map +1 -1
- package/dist/index.umd.js +1 -1
- package/dist/index.umd.js.map +1 -1
- package/dist/logic/getDirtyFields.d.ts +2 -0
- package/dist/logic/{getControllerValue.d.ts → getEventValue.d.ts} +0 -0
- package/dist/logic/getFieldValueAs.d.ts +2 -2
- package/dist/logic/getResolverOptions.d.ts +2 -2
- package/dist/logic/getRuleValue.d.ts +3 -0
- package/dist/logic/hasValidation.d.ts +1 -1
- package/dist/logic/validateField.d.ts +2 -2
- package/dist/types/fields.d.ts +1 -0
- package/dist/types/form.d.ts +7 -0
- package/dist/types/validator.d.ts +2 -2
- package/dist/utils/isHTMLElement.d.ts +1 -1
- package/package.json +16 -16
- package/dist/logic/setFieldArrayDirtyFields.d.ts +0 -2
package/dist/index.esm.js
CHANGED
@@ -12,7 +12,7 @@ var isObject = (value) => !isNullOrUndefined(value) &&
|
|
12
12
|
isObjectType(value) &&
|
13
13
|
!isDateObject(value);
|
14
14
|
|
15
|
-
var
|
15
|
+
var getEventValue = (event) => isObject(event) && event.target
|
16
16
|
? isCheckBoxInput(event.target)
|
17
17
|
? event.target.checked
|
18
18
|
: event.target.value
|
@@ -22,7 +22,7 @@ var getNodeParentName = (name) => name.substring(0, name.search(/.\d/)) || name;
|
|
22
22
|
|
23
23
|
var isNameInFieldArray = (names, name) => [...names].some((current) => getNodeParentName(name) === current);
|
24
24
|
|
25
|
-
var compact = (value) => value.filter(Boolean);
|
25
|
+
var compact = (value) => (value || []).filter(Boolean);
|
26
26
|
|
27
27
|
var isUndefined = (val) => val === undefined;
|
28
28
|
|
@@ -250,7 +250,7 @@ function useController(props) {
|
|
250
250
|
onChange: (event) => {
|
251
251
|
registerProps.onChange({
|
252
252
|
target: {
|
253
|
-
value:
|
253
|
+
value: getEventValue(event),
|
254
254
|
name: name,
|
255
255
|
},
|
256
256
|
type: EVENTS.CHANGE,
|
@@ -448,68 +448,76 @@ const useFieldArray = (props) => {
|
|
448
448
|
const append$1 = (value, options) => {
|
449
449
|
const appendValue = convertToArrayPayload(value);
|
450
450
|
const updatedFieldArrayValuesWithKey = append(mapCurrentIds(control._getFieldArray(name), _fieldIds, keyName), mapIds(appendValue, keyName));
|
451
|
+
const fieldArrayValues = updateValues(updatedFieldArrayValuesWithKey);
|
452
|
+
control._names.focus = getFocusFieldName(name, fieldArrayValues.length - 1, options);
|
451
453
|
setFields(updatedFieldArrayValuesWithKey);
|
452
454
|
control._updateFieldArray(name, append, {
|
453
455
|
argA: fillEmptyArray(value),
|
454
|
-
},
|
455
|
-
control._names.focus = getFocusFieldName(name, updatedFieldArrayValuesWithKey.length - appendValue.length, options);
|
456
|
+
}, fieldArrayValues);
|
456
457
|
};
|
457
458
|
const prepend$1 = (value, options) => {
|
458
459
|
const updatedFieldArrayValuesWithKey = prepend(mapCurrentIds(control._getFieldArray(name), _fieldIds, keyName), mapIds(convertToArrayPayload(value), keyName));
|
460
|
+
const fieldArrayValues = updateValues(updatedFieldArrayValuesWithKey);
|
461
|
+
control._names.focus = getFocusFieldName(name, 0, options);
|
459
462
|
setFields(updatedFieldArrayValuesWithKey);
|
460
463
|
control._updateFieldArray(name, prepend, {
|
461
464
|
argA: fillEmptyArray(value),
|
462
|
-
},
|
463
|
-
control._names.focus = getFocusFieldName(name, 0, options);
|
465
|
+
}, fieldArrayValues);
|
464
466
|
};
|
465
467
|
const remove = (index) => {
|
466
468
|
const updatedFieldArrayValuesWithKey = removeArrayAt(mapCurrentIds(control._getFieldArray(name), _fieldIds, keyName), index);
|
469
|
+
const fieldArrayValues = updateValues(updatedFieldArrayValuesWithKey);
|
467
470
|
setFields(updatedFieldArrayValuesWithKey);
|
468
471
|
control._updateFieldArray(name, removeArrayAt, {
|
469
472
|
argA: index,
|
470
|
-
},
|
473
|
+
}, fieldArrayValues);
|
471
474
|
};
|
472
475
|
const insert$1 = (index, value, options) => {
|
473
476
|
const updatedFieldArrayValuesWithKey = insert(mapCurrentIds(control._getFieldArray(name), _fieldIds, keyName), index, mapIds(convertToArrayPayload(value), keyName));
|
477
|
+
const fieldArrayValues = updateValues(updatedFieldArrayValuesWithKey);
|
478
|
+
control._names.focus = getFocusFieldName(name, index, options);
|
474
479
|
setFields(updatedFieldArrayValuesWithKey);
|
475
480
|
control._updateFieldArray(name, insert, {
|
476
481
|
argA: index,
|
477
482
|
argB: fillEmptyArray(value),
|
478
|
-
},
|
479
|
-
control._names.focus = getFocusFieldName(name, index, options);
|
483
|
+
}, fieldArrayValues);
|
480
484
|
};
|
481
485
|
const swap = (indexA, indexB) => {
|
482
486
|
const updatedFieldArrayValuesWithKey = mapCurrentIds(control._getFieldArray(name), _fieldIds, keyName);
|
483
487
|
swapArrayAt(updatedFieldArrayValuesWithKey, indexA, indexB);
|
488
|
+
const fieldArrayValues = updateValues(updatedFieldArrayValuesWithKey);
|
484
489
|
setFields(updatedFieldArrayValuesWithKey);
|
485
490
|
control._updateFieldArray(name, swapArrayAt, {
|
486
491
|
argA: indexA,
|
487
492
|
argB: indexB,
|
488
|
-
},
|
493
|
+
}, fieldArrayValues, false);
|
489
494
|
};
|
490
495
|
const move = (from, to) => {
|
491
496
|
const updatedFieldArrayValuesWithKey = mapCurrentIds(control._getFieldArray(name), _fieldIds, keyName);
|
492
497
|
moveArrayAt(updatedFieldArrayValuesWithKey, from, to);
|
498
|
+
const fieldArrayValues = updateValues(updatedFieldArrayValuesWithKey);
|
499
|
+
setFields(updatedFieldArrayValuesWithKey);
|
493
500
|
control._updateFieldArray(name, moveArrayAt, {
|
494
501
|
argA: from,
|
495
502
|
argB: to,
|
496
|
-
},
|
497
|
-
setFields(updatedFieldArrayValuesWithKey);
|
503
|
+
}, fieldArrayValues, false);
|
498
504
|
};
|
499
505
|
const update = (index, value) => {
|
500
506
|
const updatedFieldArrayValuesWithKey = mapCurrentIds(control._getFieldArray(name), _fieldIds, keyName);
|
501
507
|
const updatedFieldArrayValues = updateAt(updatedFieldArrayValuesWithKey, index, value);
|
502
508
|
_fieldIds.current = mapIds(updatedFieldArrayValues, keyName);
|
509
|
+
const fieldArrayValues = updateValues(_fieldIds.current);
|
503
510
|
setFields(_fieldIds.current);
|
504
511
|
control._updateFieldArray(name, updateAt, {
|
505
512
|
argA: index,
|
506
513
|
argB: value,
|
507
|
-
},
|
514
|
+
}, fieldArrayValues, true, false);
|
508
515
|
};
|
509
516
|
const replace = (value) => {
|
510
517
|
const updatedFieldArrayValuesWithKey = mapIds(convertToArrayPayload(value), keyName);
|
518
|
+
const fieldArrayValues = updateValues(updatedFieldArrayValuesWithKey);
|
511
519
|
setFields(updatedFieldArrayValuesWithKey);
|
512
|
-
control._updateFieldArray(name, () => updatedFieldArrayValuesWithKey, {},
|
520
|
+
control._updateFieldArray(name, () => updatedFieldArrayValuesWithKey, {}, fieldArrayValues, true, false);
|
513
521
|
};
|
514
522
|
React.useEffect(() => {
|
515
523
|
control._stateFlags.action = false;
|
@@ -659,7 +667,7 @@ var isMultipleSelect = (element) => element.type === `select-multiple`;
|
|
659
667
|
|
660
668
|
var isRadioInput = (element) => element.type === 'radio';
|
661
669
|
|
662
|
-
var
|
670
|
+
var isRadioOrCheckbox = (ref) => isRadioInput(ref) || isCheckBoxInput(ref);
|
663
671
|
|
664
672
|
var isWeb = typeof window !== 'undefined' &&
|
665
673
|
typeof window.HTMLElement !== 'undefined' &&
|
@@ -706,6 +714,47 @@ function unset(object, path) {
|
|
706
714
|
return object;
|
707
715
|
}
|
708
716
|
|
717
|
+
function markFieldsDirty(data, fields = {}) {
|
718
|
+
const isParentNodeArray = Array.isArray(data);
|
719
|
+
if (isObject(data) || isParentNodeArray) {
|
720
|
+
for (const key in data) {
|
721
|
+
if (Array.isArray(data[key]) ||
|
722
|
+
(isObject(data[key]) && !objectHasFunction(data[key]))) {
|
723
|
+
fields[key] = Array.isArray(data[key]) ? [] : {};
|
724
|
+
markFieldsDirty(data[key], fields[key]);
|
725
|
+
}
|
726
|
+
else if (!isNullOrUndefined(data[key])) {
|
727
|
+
fields[key] = true;
|
728
|
+
}
|
729
|
+
}
|
730
|
+
}
|
731
|
+
return fields;
|
732
|
+
}
|
733
|
+
function getDirtyFieldsFromDefaultValues(data, formValues, dirtyFieldsFromValues) {
|
734
|
+
const isParentNodeArray = Array.isArray(data);
|
735
|
+
if (isObject(data) || isParentNodeArray) {
|
736
|
+
for (const key in data) {
|
737
|
+
if (Array.isArray(data[key]) ||
|
738
|
+
(isObject(data[key]) && !objectHasFunction(data[key]))) {
|
739
|
+
if (isUndefined(formValues) ||
|
740
|
+
isPrimitive(dirtyFieldsFromValues[key])) {
|
741
|
+
dirtyFieldsFromValues[key] = Array.isArray(data[key])
|
742
|
+
? markFieldsDirty(data[key], [])
|
743
|
+
: Object.assign({}, markFieldsDirty(data[key]));
|
744
|
+
}
|
745
|
+
else {
|
746
|
+
getDirtyFieldsFromDefaultValues(data[key], isNullOrUndefined(formValues) ? {} : formValues[key], dirtyFieldsFromValues[key]);
|
747
|
+
}
|
748
|
+
}
|
749
|
+
else {
|
750
|
+
dirtyFieldsFromValues[key] = !deepEqual(data[key], formValues[key]);
|
751
|
+
}
|
752
|
+
}
|
753
|
+
}
|
754
|
+
return dirtyFieldsFromValues;
|
755
|
+
}
|
756
|
+
var getDirtyFields = (defaultValues, formValues) => getDirtyFieldsFromDefaultValues(defaultValues, formValues, markFieldsDirty(formValues));
|
757
|
+
|
709
758
|
const defaultResult = {
|
710
759
|
value: false,
|
711
760
|
isValid: false,
|
@@ -737,7 +786,7 @@ var getFieldValueAs = (value, { valueAsNumber, valueAsDate, setValueAs }) => isU
|
|
737
786
|
? value === ''
|
738
787
|
? NaN
|
739
788
|
: +value
|
740
|
-
: valueAsDate
|
789
|
+
: valueAsDate && isString(value)
|
741
790
|
? new Date(value)
|
742
791
|
: setValueAs
|
743
792
|
? setValueAs(value)
|
@@ -790,6 +839,18 @@ var getResolverOptions = (fieldsNames, _fields, criteriaMode, shouldUseNativeVal
|
|
790
839
|
};
|
791
840
|
};
|
792
841
|
|
842
|
+
var isRegex = (value) => value instanceof RegExp;
|
843
|
+
|
844
|
+
var getRuleValue = (rule) => isUndefined(rule)
|
845
|
+
? undefined
|
846
|
+
: isRegex(rule)
|
847
|
+
? rule.source
|
848
|
+
: isObject(rule)
|
849
|
+
? isRegex(rule.value)
|
850
|
+
? rule.value.source
|
851
|
+
: rule.value
|
852
|
+
: rule;
|
853
|
+
|
793
854
|
var hasValidation = (options) => options.mount &&
|
794
855
|
(options.required ||
|
795
856
|
options.min ||
|
@@ -828,49 +889,6 @@ function schemaErrorLookup(errors, _fields, name) {
|
|
828
889
|
};
|
829
890
|
}
|
830
891
|
|
831
|
-
function deepMerge(target, source) {
|
832
|
-
if (isPrimitive(target) || isPrimitive(source)) {
|
833
|
-
return source;
|
834
|
-
}
|
835
|
-
for (const key in source) {
|
836
|
-
const targetValue = target[key];
|
837
|
-
const sourceValue = source[key];
|
838
|
-
try {
|
839
|
-
target[key] =
|
840
|
-
(isObject(targetValue) && isObject(sourceValue)) ||
|
841
|
-
(Array.isArray(targetValue) && Array.isArray(sourceValue))
|
842
|
-
? deepMerge(targetValue, sourceValue)
|
843
|
-
: sourceValue;
|
844
|
-
}
|
845
|
-
catch (_a) { }
|
846
|
-
}
|
847
|
-
return target;
|
848
|
-
}
|
849
|
-
|
850
|
-
function setDirtyFields(values, defaultValues, dirtyFields, parentNode, parentName) {
|
851
|
-
let index = -1;
|
852
|
-
while (++index < values.length) {
|
853
|
-
for (const key in values[index]) {
|
854
|
-
if (Array.isArray(values[index][key])) {
|
855
|
-
!dirtyFields[index] && (dirtyFields[index] = {});
|
856
|
-
dirtyFields[index][key] = [];
|
857
|
-
setDirtyFields(values[index][key], get(defaultValues[index] || {}, key, []), dirtyFields[index][key], dirtyFields[index], key);
|
858
|
-
}
|
859
|
-
else {
|
860
|
-
!isNullOrUndefined(defaultValues) &&
|
861
|
-
deepEqual(get(defaultValues[index] || {}, key), values[index][key])
|
862
|
-
? set(dirtyFields[index] || {}, key)
|
863
|
-
: (dirtyFields[index] = Object.assign(Object.assign({}, dirtyFields[index]), { [key]: true }));
|
864
|
-
}
|
865
|
-
}
|
866
|
-
parentNode &&
|
867
|
-
!dirtyFields.length &&
|
868
|
-
delete parentNode[parentName];
|
869
|
-
}
|
870
|
-
return dirtyFields;
|
871
|
-
}
|
872
|
-
var setFieldArrayDirtyFields = (values, defaultValues, dirtyFields) => deepMerge(setDirtyFields(values, defaultValues, dirtyFields.slice(0, values.length)), setDirtyFields(defaultValues, values, dirtyFields.slice(0, values.length)));
|
873
|
-
|
874
892
|
var skipValidation = (isBlurEvent, isTouched, isSubmitted, reValidateMode, mode) => {
|
875
893
|
if (mode.isOnAll) {
|
876
894
|
return false;
|
@@ -887,12 +905,10 @@ var skipValidation = (isBlurEvent, isTouched, isSubmitted, reValidateMode, mode)
|
|
887
905
|
return true;
|
888
906
|
};
|
889
907
|
|
890
|
-
var unsetEmptyArray = (ref, name) => !compact(get(ref, name
|
908
|
+
var unsetEmptyArray = (ref, name) => !compact(get(ref, name)).length && unset(ref, name);
|
891
909
|
|
892
910
|
var isMessage = (value) => isString(value) || React.isValidElement(value);
|
893
911
|
|
894
|
-
var isRegex = (value) => value instanceof RegExp;
|
895
|
-
|
896
912
|
function getValidateError(result, ref, type = 'validate') {
|
897
913
|
if (isMessage(result) ||
|
898
914
|
(Array.isArray(result) && result.every(isMessage)) ||
|
@@ -918,7 +934,7 @@ var validateField = async (field, inputValue, validateAllFieldCriteria, shouldUs
|
|
918
934
|
return {};
|
919
935
|
}
|
920
936
|
const inputRef = refs ? refs[0] : ref;
|
921
|
-
const
|
937
|
+
const setCustomValidity = (message) => {
|
922
938
|
if (shouldUseNativeValidation && inputRef.reportValidity) {
|
923
939
|
inputRef.setCustomValidity(isBoolean(message) ? '' : message || ' ');
|
924
940
|
inputRef.reportValidity();
|
@@ -948,7 +964,7 @@ var validateField = async (field, inputValue, validateAllFieldCriteria, shouldUs
|
|
948
964
|
if (value) {
|
949
965
|
error[name] = Object.assign({ type: INPUT_VALIDATION_RULES.required, message, ref: inputRef }, appendErrorsCurry(INPUT_VALIDATION_RULES.required, message));
|
950
966
|
if (!validateAllFieldCriteria) {
|
951
|
-
|
967
|
+
setCustomValidity(message);
|
952
968
|
return error;
|
953
969
|
}
|
954
970
|
}
|
@@ -959,7 +975,8 @@ var validateField = async (field, inputValue, validateAllFieldCriteria, shouldUs
|
|
959
975
|
const maxOutput = getValueAndMessage(max);
|
960
976
|
const minOutput = getValueAndMessage(min);
|
961
977
|
if (!isNaN(inputValue)) {
|
962
|
-
const valueNumber = ref.valueAsNumber ||
|
978
|
+
const valueNumber = ref.valueAsNumber ||
|
979
|
+
parseFloat(inputValue);
|
963
980
|
if (!isNullOrUndefined(maxOutput.value)) {
|
964
981
|
exceedMax = valueNumber > maxOutput.value;
|
965
982
|
}
|
@@ -979,7 +996,7 @@ var validateField = async (field, inputValue, validateAllFieldCriteria, shouldUs
|
|
979
996
|
if (exceedMax || exceedMin) {
|
980
997
|
getMinMaxMessage(!!exceedMax, maxOutput.message, minOutput.message, INPUT_VALIDATION_RULES.max, INPUT_VALIDATION_RULES.min);
|
981
998
|
if (!validateAllFieldCriteria) {
|
982
|
-
|
999
|
+
setCustomValidity(error[name].message);
|
983
1000
|
return error;
|
984
1001
|
}
|
985
1002
|
}
|
@@ -994,7 +1011,7 @@ var validateField = async (field, inputValue, validateAllFieldCriteria, shouldUs
|
|
994
1011
|
if (exceedMax || exceedMin) {
|
995
1012
|
getMinMaxMessage(exceedMax, maxLengthOutput.message, minLengthOutput.message);
|
996
1013
|
if (!validateAllFieldCriteria) {
|
997
|
-
|
1014
|
+
setCustomValidity(error[name].message);
|
998
1015
|
return error;
|
999
1016
|
}
|
1000
1017
|
}
|
@@ -1005,7 +1022,7 @@ var validateField = async (field, inputValue, validateAllFieldCriteria, shouldUs
|
|
1005
1022
|
error[name] = Object.assign({ type: INPUT_VALIDATION_RULES.pattern, message,
|
1006
1023
|
ref }, appendErrorsCurry(INPUT_VALIDATION_RULES.pattern, message));
|
1007
1024
|
if (!validateAllFieldCriteria) {
|
1008
|
-
|
1025
|
+
setCustomValidity(message);
|
1009
1026
|
return error;
|
1010
1027
|
}
|
1011
1028
|
}
|
@@ -1017,7 +1034,7 @@ var validateField = async (field, inputValue, validateAllFieldCriteria, shouldUs
|
|
1017
1034
|
if (validateError) {
|
1018
1035
|
error[name] = Object.assign(Object.assign({}, validateError), appendErrorsCurry(INPUT_VALIDATION_RULES.validate, validateError.message));
|
1019
1036
|
if (!validateAllFieldCriteria) {
|
1020
|
-
|
1037
|
+
setCustomValidity(validateError.message);
|
1021
1038
|
return error;
|
1022
1039
|
}
|
1023
1040
|
}
|
@@ -1031,7 +1048,7 @@ var validateField = async (field, inputValue, validateAllFieldCriteria, shouldUs
|
|
1031
1048
|
const validateError = getValidateError(await validate[key](inputValue), inputRef, key);
|
1032
1049
|
if (validateError) {
|
1033
1050
|
validationResult = Object.assign(Object.assign({}, validateError), appendErrorsCurry(key, validateError.message));
|
1034
|
-
|
1051
|
+
setCustomValidity(validateError.message);
|
1035
1052
|
if (validateAllFieldCriteria) {
|
1036
1053
|
error[name] = validationResult;
|
1037
1054
|
}
|
@@ -1045,7 +1062,7 @@ var validateField = async (field, inputValue, validateAllFieldCriteria, shouldUs
|
|
1045
1062
|
}
|
1046
1063
|
}
|
1047
1064
|
}
|
1048
|
-
|
1065
|
+
setCustomValidity(true);
|
1049
1066
|
return error;
|
1050
1067
|
};
|
1051
1068
|
|
@@ -1054,7 +1071,6 @@ const defaultOptions = {
|
|
1054
1071
|
reValidateMode: VALIDATION_MODE.onChange,
|
1055
1072
|
shouldFocusError: true,
|
1056
1073
|
};
|
1057
|
-
const isWindowUndefined = typeof window === 'undefined';
|
1058
1074
|
function createFormControl(props = {}) {
|
1059
1075
|
let _options = Object.assign(Object.assign({}, defaultOptions), props);
|
1060
1076
|
let _formState = {
|
@@ -1141,7 +1157,7 @@ function createFormControl(props = {}) {
|
|
1141
1157
|
unsetEmptyArray(_formState.touchedFields, name);
|
1142
1158
|
}
|
1143
1159
|
if (_proxyFormState.dirtyFields || _proxyFormState.isDirty) {
|
1144
|
-
|
1160
|
+
_formState.dirtyFields = getDirtyFields(_defaultValues, _formValues);
|
1145
1161
|
}
|
1146
1162
|
_subjects.state.next({
|
1147
1163
|
isDirty: _getDirty(name, values),
|
@@ -1199,8 +1215,6 @@ function createFormControl(props = {}) {
|
|
1199
1215
|
isFieldDirty && shouldRender && _subjects.state.next(output);
|
1200
1216
|
return isFieldDirty ? output : {};
|
1201
1217
|
};
|
1202
|
-
const updateFieldArrayDirty = (name, value) => (set(_formState.dirtyFields, name, setFieldArrayDirtyFields(value, get(_defaultValues, name, []), get(_formState.dirtyFields, name, []))),
|
1203
|
-
unsetEmptyArray(_formState.dirtyFields, name));
|
1204
1218
|
const shouldRenderByError = async (shouldSkipRender, name, isValid, error, fieldState) => {
|
1205
1219
|
const previousFieldError = get(_formState.errors, name);
|
1206
1220
|
const shouldUpdateValid = _proxyFormState.isValid && _formState.isValid !== isValid;
|
@@ -1312,10 +1326,7 @@ function createFormControl(props = {}) {
|
|
1312
1326
|
isWeb && isHTMLElement(fieldReference.ref) && isNullOrUndefined(value)
|
1313
1327
|
? ''
|
1314
1328
|
: value;
|
1315
|
-
if (
|
1316
|
-
fieldReference.ref.files = fieldValue;
|
1317
|
-
}
|
1318
|
-
else if (isMultipleSelect(fieldReference.ref)) {
|
1329
|
+
if (isMultipleSelect(fieldReference.ref)) {
|
1319
1330
|
[...fieldReference.ref.options].forEach((selectRef) => (selectRef.selected = fieldValue.includes(selectRef.value)));
|
1320
1331
|
}
|
1321
1332
|
else if (fieldReference.refs) {
|
@@ -1330,7 +1341,7 @@ function createFormControl(props = {}) {
|
|
1330
1341
|
fieldReference.refs.forEach((radioRef) => (radioRef.checked = radioRef.value === fieldValue));
|
1331
1342
|
}
|
1332
1343
|
}
|
1333
|
-
else {
|
1344
|
+
else if (!isFileInput(fieldReference.ref)) {
|
1334
1345
|
fieldReference.ref.value = fieldValue;
|
1335
1346
|
}
|
1336
1347
|
}
|
@@ -1363,7 +1374,7 @@ function createFormControl(props = {}) {
|
|
1363
1374
|
});
|
1364
1375
|
if ((_proxyFormState.isDirty || _proxyFormState.dirtyFields) &&
|
1365
1376
|
options.shouldDirty) {
|
1366
|
-
|
1377
|
+
_formState.dirtyFields = getDirtyFields(_defaultValues, _formValues);
|
1367
1378
|
_subjects.state.next({
|
1368
1379
|
name,
|
1369
1380
|
dirtyFields: _formState.dirtyFields,
|
@@ -1381,14 +1392,16 @@ function createFormControl(props = {}) {
|
|
1381
1392
|
name,
|
1382
1393
|
});
|
1383
1394
|
};
|
1384
|
-
const
|
1395
|
+
const onChange = async (event) => {
|
1385
1396
|
const target = event.target;
|
1386
1397
|
let name = target.name;
|
1387
1398
|
const field = get(_fields, name);
|
1388
1399
|
if (field) {
|
1389
1400
|
let error;
|
1390
1401
|
let isValid;
|
1391
|
-
const fieldValue = target.type
|
1402
|
+
const fieldValue = target.type
|
1403
|
+
? getFieldValue(field._f)
|
1404
|
+
: getEventValue(event);
|
1392
1405
|
const isBlurEvent = event.type === EVENTS.BLUR;
|
1393
1406
|
const shouldSkipValidation = (!hasValidation(field._f) &&
|
1394
1407
|
!_options.resolver &&
|
@@ -1523,7 +1536,7 @@ function createFormControl(props = {}) {
|
|
1523
1536
|
!options.keepIsValid && _updateValid();
|
1524
1537
|
};
|
1525
1538
|
const register = (name, options = {}) => {
|
1526
|
-
|
1539
|
+
let field = get(_fields, name);
|
1527
1540
|
set(_fields, name, {
|
1528
1541
|
_f: Object.assign(Object.assign(Object.assign({}, (field && field._f ? field._f : { ref: { name } })), { name, mount: true }), options),
|
1529
1542
|
});
|
@@ -1537,48 +1550,47 @@ function createFormControl(props = {}) {
|
|
1537
1550
|
? undefined
|
1538
1551
|
: get(_formValues, name, getFieldValue(field._f)))
|
1539
1552
|
: updateValidAndValue(name, true);
|
1540
|
-
return
|
1541
|
-
? {
|
1542
|
-
|
1543
|
-
|
1544
|
-
:
|
1545
|
-
|
1546
|
-
|
1547
|
-
|
1548
|
-
|
1549
|
-
|
1550
|
-
|
1551
|
-
|
1552
|
-
|
1553
|
-
|
1554
|
-
|
1555
|
-
|
1556
|
-
(
|
1557
|
-
|
1558
|
-
|
1559
|
-
|
1560
|
-
|
1561
|
-
|
1562
|
-
|
1563
|
-
|
1564
|
-
fieldRef,
|
1565
|
-
], ref: { type: fieldRef.type, name } }) : Object.assign(Object.assign({}, field._f), { ref: fieldRef }),
|
1566
|
-
};
|
1567
|
-
set(_fields, name, field);
|
1568
|
-
(!options || !options.disabled) &&
|
1569
|
-
updateValidAndValue(name, false, fieldRef);
|
1553
|
+
return Object.assign(Object.assign(Object.assign({}, (isBoolean(options.disabled) ? { disabled: options.disabled } : {})), (_options.shouldUseNativeValidation
|
1554
|
+
? {
|
1555
|
+
required: !!options.required,
|
1556
|
+
min: getRuleValue(options.min),
|
1557
|
+
max: getRuleValue(options.max),
|
1558
|
+
minLength: getRuleValue(options.minLength),
|
1559
|
+
maxLength: getRuleValue(options.maxLength),
|
1560
|
+
pattern: getRuleValue(options.pattern),
|
1561
|
+
}
|
1562
|
+
: {})), { name,
|
1563
|
+
onChange, onBlur: onChange, ref: (ref) => {
|
1564
|
+
if (ref) {
|
1565
|
+
register(name, options);
|
1566
|
+
field = get(_fields, name);
|
1567
|
+
const fieldRef = isUndefined(ref.value)
|
1568
|
+
? ref.querySelectorAll
|
1569
|
+
? ref.querySelectorAll('input,select,textarea')[0] || ref
|
1570
|
+
: ref
|
1571
|
+
: ref;
|
1572
|
+
const radioOrCheckbox = isRadioOrCheckbox(fieldRef);
|
1573
|
+
if (fieldRef === field._f.ref ||
|
1574
|
+
(radioOrCheckbox &&
|
1575
|
+
compact(field._f.refs).find((option) => option === fieldRef))) {
|
1576
|
+
return;
|
1570
1577
|
}
|
1571
|
-
|
1572
|
-
|
1573
|
-
|
1574
|
-
|
1575
|
-
|
1576
|
-
|
1577
|
-
|
1578
|
-
|
1579
|
-
|
1578
|
+
set(_fields, name, {
|
1579
|
+
_f: radioOrCheckbox
|
1580
|
+
? Object.assign(Object.assign({}, field._f), { refs: [...compact(field._f.refs).filter(live), fieldRef], ref: { type: fieldRef.type, name } }) : Object.assign(Object.assign({}, field._f), { ref: fieldRef }),
|
1581
|
+
});
|
1582
|
+
!options.disabled && updateValidAndValue(name, false, fieldRef);
|
1583
|
+
}
|
1584
|
+
else {
|
1585
|
+
field = get(_fields, name, {});
|
1586
|
+
if (field._f) {
|
1587
|
+
field._f.mount = false;
|
1580
1588
|
}
|
1581
|
-
|
1589
|
+
(_options.shouldUnregister || options.shouldUnregister) &&
|
1590
|
+
!(isNameInFieldArray(_names.array, name) && _stateFlags.action) &&
|
1591
|
+
_names.unMount.add(name);
|
1592
|
+
}
|
1593
|
+
} });
|
1582
1594
|
};
|
1583
1595
|
const handleSubmit = (onValid, onInvalid) => async (e) => {
|
1584
1596
|
if (e) {
|