rsuite 5.59.1 → 5.59.3-alpha.1

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.
Files changed (141) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/DateRangePicker/styles/index.css +27 -0
  3. package/DateRangePicker/styles/index.less +27 -0
  4. package/cjs/@types/common.d.ts +1 -1
  5. package/cjs/Calendar/CalendarContainer.js +4 -4
  6. package/cjs/DatePicker/DatePicker.d.ts +3 -38
  7. package/cjs/DatePicker/DatePicker.js +86 -137
  8. package/cjs/DatePicker/PredefinedRanges.d.ts +1 -1
  9. package/cjs/DatePicker/PredefinedRanges.js +3 -3
  10. package/cjs/DatePicker/Toolbar.d.ts +1 -1
  11. package/cjs/DatePicker/Toolbar.js +13 -12
  12. package/cjs/DatePicker/hooks/useFocus.d.ts +13 -0
  13. package/cjs/DatePicker/hooks/useFocus.js +96 -0
  14. package/cjs/DatePicker/hooks/useMonthView.d.ts +10 -0
  15. package/cjs/DatePicker/hooks/useMonthView.js +28 -0
  16. package/cjs/DatePicker/index.d.ts +2 -1
  17. package/cjs/DatePicker/types.d.ts +37 -0
  18. package/cjs/DatePicker/utils.d.ts +9 -0
  19. package/cjs/DatePicker/utils.js +20 -2
  20. package/cjs/DateRangePicker/DateRangePicker.d.ts +15 -3
  21. package/cjs/DateRangePicker/DateRangePicker.js +58 -68
  22. package/cjs/DateRangePicker/DateRangePickerContext.d.ts +4 -1
  23. package/cjs/DateRangePicker/DateRangePickerContext.js +4 -4
  24. package/cjs/DateRangePicker/Header.d.ts +11 -0
  25. package/cjs/DateRangePicker/Header.js +65 -0
  26. package/cjs/DateRangePicker/disabledDateUtils.d.ts +1 -1
  27. package/cjs/DateRangePicker/disabledDateUtils.js +1 -1
  28. package/cjs/DateRangePicker/index.js +5 -0
  29. package/cjs/Form/Form.d.ts +56 -39
  30. package/cjs/Form/Form.js +64 -186
  31. package/cjs/Form/FormContext.d.ts +12 -9
  32. package/cjs/Form/FormContext.js +11 -5
  33. package/cjs/Form/hooks/useFormRef.d.ts +55 -0
  34. package/cjs/Form/hooks/useFormRef.js +45 -0
  35. package/cjs/Form/hooks/useFormValidate.d.ts +19 -0
  36. package/cjs/Form/hooks/useFormValidate.js +157 -0
  37. package/cjs/Form/hooks/useFormValue.d.ts +2 -1
  38. package/cjs/Form/hooks/useFormValue.js +12 -1
  39. package/cjs/Form/hooks/useSchemaModel.js +5 -0
  40. package/cjs/Form/index.d.ts +2 -1
  41. package/cjs/FormControl/FormControl.d.ts +1 -1
  42. package/cjs/FormControl/FormControl.js +50 -68
  43. package/cjs/FormControl/hooks/useField.d.ts +18 -0
  44. package/cjs/FormControl/hooks/useField.js +54 -0
  45. package/cjs/FormControl/hooks/useRegisterModel.d.ts +3 -0
  46. package/cjs/FormControl/hooks/useRegisterModel.js +22 -0
  47. package/cjs/FormControl/utils.d.ts +1 -0
  48. package/cjs/FormControl/utils.js +8 -0
  49. package/cjs/FormControlLabel/FormControlLabel.js +12 -9
  50. package/cjs/FormErrorMessage/FormErrorMessage.js +2 -5
  51. package/cjs/FormGroup/FormGroup.d.ts +18 -4
  52. package/cjs/FormGroup/FormGroup.js +28 -2
  53. package/cjs/FormGroup/index.d.ts +1 -0
  54. package/cjs/FormGroup/index.js +4 -3
  55. package/cjs/FormHelpText/FormHelpText.d.ts +2 -1
  56. package/cjs/FormHelpText/FormHelpText.js +16 -9
  57. package/cjs/Input/Input.js +4 -5
  58. package/cjs/utils/dateUtils.d.ts +72 -10
  59. package/cjs/utils/dateUtils.js +88 -29
  60. package/dist/rsuite-no-reset-rtl.css +27 -0
  61. package/dist/rsuite-no-reset-rtl.min.css +1 -1
  62. package/dist/rsuite-no-reset-rtl.min.css.map +1 -1
  63. package/dist/rsuite-no-reset.css +27 -0
  64. package/dist/rsuite-no-reset.min.css +1 -1
  65. package/dist/rsuite-no-reset.min.css.map +1 -1
  66. package/dist/rsuite-rtl.css +27 -0
  67. package/dist/rsuite-rtl.min.css +1 -1
  68. package/dist/rsuite-rtl.min.css.map +1 -1
  69. package/dist/rsuite.css +27 -0
  70. package/dist/rsuite.js +144 -44
  71. package/dist/rsuite.js.map +1 -1
  72. package/dist/rsuite.min.css +1 -1
  73. package/dist/rsuite.min.css.map +1 -1
  74. package/dist/rsuite.min.js +1 -1
  75. package/dist/rsuite.min.js.LICENSE.txt +35 -0
  76. package/dist/rsuite.min.js.map +1 -1
  77. package/esm/@types/common.d.ts +1 -1
  78. package/esm/Calendar/CalendarContainer.js +5 -5
  79. package/esm/DatePicker/DatePicker.d.ts +3 -38
  80. package/esm/DatePicker/DatePicker.js +88 -139
  81. package/esm/DatePicker/PredefinedRanges.d.ts +1 -1
  82. package/esm/DatePicker/PredefinedRanges.js +3 -3
  83. package/esm/DatePicker/Toolbar.d.ts +1 -1
  84. package/esm/DatePicker/Toolbar.js +13 -12
  85. package/esm/DatePicker/hooks/useFocus.d.ts +13 -0
  86. package/esm/DatePicker/hooks/useFocus.js +90 -0
  87. package/esm/DatePicker/hooks/useMonthView.d.ts +10 -0
  88. package/esm/DatePicker/hooks/useMonthView.js +22 -0
  89. package/esm/DatePicker/index.d.ts +2 -1
  90. package/esm/DatePicker/types.d.ts +37 -0
  91. package/esm/DatePicker/utils.d.ts +9 -0
  92. package/esm/DatePicker/utils.js +18 -2
  93. package/esm/DateRangePicker/DateRangePicker.d.ts +15 -3
  94. package/esm/DateRangePicker/DateRangePicker.js +61 -71
  95. package/esm/DateRangePicker/DateRangePickerContext.d.ts +4 -1
  96. package/esm/DateRangePicker/DateRangePickerContext.js +2 -2
  97. package/esm/DateRangePicker/Header.d.ts +11 -0
  98. package/esm/DateRangePicker/Header.js +59 -0
  99. package/esm/DateRangePicker/disabledDateUtils.d.ts +1 -1
  100. package/esm/DateRangePicker/disabledDateUtils.js +1 -1
  101. package/esm/DateRangePicker/index.js +4 -0
  102. package/esm/Form/Form.d.ts +56 -39
  103. package/esm/Form/Form.js +62 -183
  104. package/esm/Form/FormContext.d.ts +12 -9
  105. package/esm/Form/FormContext.js +6 -2
  106. package/esm/Form/hooks/useFormRef.d.ts +55 -0
  107. package/esm/Form/hooks/useFormRef.js +40 -0
  108. package/esm/Form/hooks/useFormValidate.d.ts +19 -0
  109. package/esm/Form/hooks/useFormValidate.js +152 -0
  110. package/esm/Form/hooks/useFormValue.d.ts +2 -1
  111. package/esm/Form/hooks/useFormValue.js +12 -1
  112. package/esm/Form/hooks/useSchemaModel.js +5 -0
  113. package/esm/Form/index.d.ts +2 -1
  114. package/esm/FormControl/FormControl.d.ts +1 -1
  115. package/esm/FormControl/FormControl.js +48 -66
  116. package/esm/FormControl/hooks/useField.d.ts +18 -0
  117. package/esm/FormControl/hooks/useField.js +48 -0
  118. package/esm/FormControl/hooks/useRegisterModel.d.ts +3 -0
  119. package/esm/FormControl/hooks/useRegisterModel.js +17 -0
  120. package/esm/FormControl/utils.d.ts +1 -0
  121. package/esm/FormControl/utils.js +4 -0
  122. package/esm/FormControlLabel/FormControlLabel.js +12 -8
  123. package/esm/FormErrorMessage/FormErrorMessage.js +2 -5
  124. package/esm/FormGroup/FormGroup.d.ts +18 -4
  125. package/esm/FormGroup/FormGroup.js +27 -1
  126. package/esm/FormGroup/index.d.ts +1 -0
  127. package/esm/FormGroup/index.js +1 -0
  128. package/esm/FormHelpText/FormHelpText.d.ts +2 -1
  129. package/esm/FormHelpText/FormHelpText.js +17 -9
  130. package/esm/Input/Input.js +4 -5
  131. package/esm/utils/dateUtils.d.ts +72 -10
  132. package/esm/utils/dateUtils.js +86 -28
  133. package/package.json +2 -2
  134. package/cjs/Form/hooks/useFormError.d.ts +0 -6
  135. package/cjs/Form/hooks/useFormError.js +0 -31
  136. package/cjs/FormControl/useRegisterModel.d.ts +0 -4
  137. package/cjs/FormControl/useRegisterModel.js +0 -18
  138. package/esm/Form/hooks/useFormError.d.ts +0 -6
  139. package/esm/Form/hooks/useFormError.js +0 -26
  140. package/esm/FormControl/useRegisterModel.d.ts +0 -4
  141. package/esm/FormControl/useRegisterModel.js +0 -13
@@ -0,0 +1,152 @@
1
+ 'use client';
2
+ import _extends from "@babel/runtime/helpers/esm/extends";
3
+ import { useRef, useCallback } from 'react';
4
+ import omit from 'lodash/omit';
5
+ import set from 'lodash/set';
6
+ import { useControlled } from '../../utils';
7
+ import { nameToPath } from '../../FormControl/utils';
8
+ import useEventCallback from '../../utils/useEventCallback';
9
+ import useFormRef from './useFormRef';
10
+ export default function useFormValidate(formError, props) {
11
+ var ref = props.ref,
12
+ formValue = props.formValue,
13
+ getCombinedModel = props.getCombinedModel,
14
+ onCheck = props.onCheck,
15
+ onError = props.onError,
16
+ nestedField = props.nestedField;
17
+ var _useControlled = useControlled(formError, {}),
18
+ realFormError = _useControlled[0],
19
+ setFormError = _useControlled[1];
20
+ var realFormErrorRef = useRef(realFormError);
21
+ realFormErrorRef.current = realFormError;
22
+
23
+ /**
24
+ * Validate the form data and return a boolean.
25
+ * The error message after verification is returned in the callback.
26
+ * @param callback
27
+ */
28
+ var check = useEventCallback(function (callback) {
29
+ var formError = {};
30
+ var errorCount = 0;
31
+ var model = getCombinedModel();
32
+ Object.keys(model.getSchemaSpec()).forEach(function (key) {
33
+ var checkResult = model.checkForField(key, formValue || {});
34
+ if (checkResult.hasError === true) {
35
+ errorCount += 1;
36
+ formError[key] = (checkResult === null || checkResult === void 0 ? void 0 : checkResult.errorMessage) || checkResult;
37
+ }
38
+ });
39
+ setFormError(formError);
40
+ onCheck === null || onCheck === void 0 ? void 0 : onCheck(formError);
41
+ callback === null || callback === void 0 ? void 0 : callback(formError);
42
+ if (errorCount > 0) {
43
+ onError === null || onError === void 0 ? void 0 : onError(formError);
44
+ return false;
45
+ }
46
+ return true;
47
+ });
48
+
49
+ /**
50
+ * Check the data field
51
+ * @param fieldName
52
+ * @param callback
53
+ */
54
+ var checkForField = useEventCallback(function (fieldName, callback) {
55
+ var _extends2;
56
+ var model = getCombinedModel();
57
+ var checkResult = model.checkForField(fieldName, formValue || {});
58
+ var nextFormError = _extends({}, formError, (_extends2 = {}, _extends2[fieldName] = (checkResult === null || checkResult === void 0 ? void 0 : checkResult.errorMessage) || checkResult, _extends2));
59
+ setFormError(nextFormError);
60
+ onCheck === null || onCheck === void 0 ? void 0 : onCheck(nextFormError);
61
+ callback === null || callback === void 0 ? void 0 : callback(checkResult);
62
+ if (checkResult.hasError) {
63
+ onError === null || onError === void 0 ? void 0 : onError(nextFormError);
64
+ }
65
+ return !checkResult.hasError;
66
+ });
67
+
68
+ /**
69
+ * Check form data asynchronously and return a Promise
70
+ */
71
+ var checkAsync = useEventCallback(function () {
72
+ var promises = [];
73
+ var keys = [];
74
+ var model = getCombinedModel();
75
+ Object.keys(model.getSchemaSpec()).forEach(function (key) {
76
+ keys.push(key);
77
+ promises.push(model.checkForFieldAsync(key, formValue || {}));
78
+ });
79
+ return Promise.all(promises).then(function (values) {
80
+ var formError = {};
81
+ var errorCount = 0;
82
+ for (var i = 0; i < values.length; i++) {
83
+ if (values[i].hasError) {
84
+ errorCount += 1;
85
+ formError[keys[i]] = values[i].errorMessage;
86
+ }
87
+ }
88
+ onCheck === null || onCheck === void 0 ? void 0 : onCheck(formError);
89
+ setFormError(formError);
90
+ if (errorCount > 0) {
91
+ onError === null || onError === void 0 ? void 0 : onError(formError);
92
+ }
93
+ return {
94
+ hasError: errorCount > 0,
95
+ formError: formError
96
+ };
97
+ });
98
+ });
99
+
100
+ /**
101
+ * Asynchronously check form fields and return Promise
102
+ * @param fieldName
103
+ */
104
+ var checkForFieldAsync = useEventCallback(function (fieldName) {
105
+ var model = getCombinedModel();
106
+ return model.checkForFieldAsync(fieldName, formValue || {}).then(function (checkResult) {
107
+ var _extends3;
108
+ var nextFormError = _extends({}, formError, (_extends3 = {}, _extends3[fieldName] = checkResult.errorMessage, _extends3));
109
+ onCheck === null || onCheck === void 0 ? void 0 : onCheck(nextFormError);
110
+ setFormError(nextFormError);
111
+ if (checkResult.hasError) {
112
+ onError === null || onError === void 0 ? void 0 : onError(nextFormError);
113
+ }
114
+ return checkResult;
115
+ });
116
+ });
117
+ var onRemoveError = useCallback(function (name) {
118
+ /**
119
+ * when this function is called when the children component is unmount,
120
+ * it's an old render frame so use Ref to get future error
121
+ */
122
+ var formError = omit(realFormErrorRef.current, [nestedField ? nameToPath(name) : name]);
123
+ realFormErrorRef.current = formError;
124
+ setFormError(formError);
125
+ onCheck === null || onCheck === void 0 ? void 0 : onCheck(formError);
126
+ return formError;
127
+ }, [nestedField, onCheck, setFormError]);
128
+ var setFieldError = useCallback(function (fieldName, checkResult) {
129
+ var _extends4;
130
+ var nextFormError = nestedField ? set(_extends({}, formError), nameToPath(fieldName), checkResult) : _extends({}, formError, (_extends4 = {}, _extends4[fieldName] = checkResult, _extends4));
131
+ setFormError(nextFormError);
132
+ onError === null || onError === void 0 ? void 0 : onError(nextFormError);
133
+ onCheck === null || onCheck === void 0 ? void 0 : onCheck(nextFormError);
134
+ return nextFormError;
135
+ }, [formError, nestedField, onCheck, onError, setFormError]);
136
+ var formRef = useFormRef(ref, {
137
+ check: check,
138
+ checkForField: checkForField,
139
+ checkAsync: checkAsync,
140
+ checkForFieldAsync: checkForFieldAsync,
141
+ formError: formError,
142
+ setFormError: setFormError,
143
+ nestedField: nestedField
144
+ });
145
+ return {
146
+ formRef: formRef,
147
+ formError: realFormError,
148
+ check: check,
149
+ setFieldError: setFieldError,
150
+ onRemoveError: onRemoveError
151
+ };
152
+ }
@@ -1,6 +1,7 @@
1
1
  /// <reference types="lodash" />
2
- export default function useFormValue(controlledValue: any, formDefaultValue: any): {
2
+ export default function useFormValue(controlledValue: any, props: any): {
3
3
  formValue: any;
4
4
  setFormValue: (value: any) => void;
5
+ setFieldValue: (fieldName: string, fieldValue: any) => any;
5
6
  onRemoveValue: (name: string) => import("lodash").Omit<any, string>;
6
7
  };
@@ -1,13 +1,23 @@
1
1
  'use client';
2
+ import _extends from "@babel/runtime/helpers/esm/extends";
2
3
  import { useRef, useCallback } from 'react';
3
4
  import omit from 'lodash/omit';
5
+ import set from 'lodash/set';
4
6
  import { useControlled } from '../../utils';
5
- export default function useFormValue(controlledValue, formDefaultValue) {
7
+ export default function useFormValue(controlledValue, props) {
8
+ var formDefaultValue = props.formDefaultValue,
9
+ nestedField = props.nestedField;
6
10
  var _useControlled = useControlled(controlledValue, formDefaultValue),
7
11
  formValue = _useControlled[0],
8
12
  setFormValue = _useControlled[1];
9
13
  var realFormValueRef = useRef(formValue);
10
14
  realFormValueRef.current = formValue;
15
+ var setFieldValue = useCallback(function (fieldName, fieldValue) {
16
+ var _extends2;
17
+ var nextFormError = nestedField ? set(_extends({}, formValue), fieldName, fieldValue) : _extends({}, formValue, (_extends2 = {}, _extends2[fieldName] = fieldValue, _extends2));
18
+ setFormValue(nextFormError);
19
+ return nextFormError;
20
+ }, [formValue, nestedField, setFormValue]);
11
21
  var onRemoveValue = useCallback(function (name) {
12
22
  /**
13
23
  * when this function is called when the children component is unmount,
@@ -21,6 +31,7 @@ export default function useFormValue(controlledValue, formDefaultValue) {
21
31
  return {
22
32
  formValue: formValue,
23
33
  setFormValue: setFormValue,
34
+ setFieldValue: setFieldValue,
24
35
  onRemoveValue: onRemoveValue
25
36
  };
26
37
  }
@@ -19,6 +19,11 @@ function useSchemaModel(formModel) {
19
19
  var realSubRules = subRulesRef.current.filter(function (v) {
20
20
  return Boolean(v.fieldRule.current);
21
21
  });
22
+
23
+ // If there is no sub rule, return the original form model
24
+ if (realSubRules.length === 0) {
25
+ return formModel;
26
+ }
22
27
  return SchemaModel.combine(formModel, SchemaModel(realSubRules.map(function (_ref) {
23
28
  var _ref2;
24
29
  var name = _ref.name,
@@ -1,5 +1,6 @@
1
1
  import Form from './Form';
2
- export type { FormInstance, FormProps } from './Form';
2
+ export type { FormProps } from './Form';
3
+ export type { FormInstance } from './hooks/useFormRef';
3
4
  export type { FormGroupProps } from '../FormGroup';
4
5
  export type { FormErrorMessageProps } from '../FormErrorMessage';
5
6
  export type { FormControlLabelProps } from '../FormControlLabel';
@@ -1,7 +1,7 @@
1
1
  import React from 'react';
2
+ import type { CheckType } from 'schema-typed';
2
3
  import Input from '../Input';
3
4
  import { TypeAttributes, FormControlBaseProps, WithAsProps } from '../@types/common';
4
- import type { CheckType } from 'schema-typed';
5
5
  /**
6
6
  * Props that FormControl passes to its accepter
7
7
  */
@@ -5,17 +5,15 @@ import _objectWithoutPropertiesLoose from "@babel/runtime/helpers/esm/objectWith
5
5
  var _templateObject;
6
6
  import React, { useContext } from 'react';
7
7
  import PropTypes from 'prop-types';
8
- import isUndefined from 'lodash/isUndefined';
9
- import get from 'lodash/get';
10
- import set from 'lodash/set';
11
8
  import Input from '../Input';
12
9
  import FormErrorMessage from '../FormErrorMessage';
13
10
  import { useClassNames } from '../utils';
14
11
  import FormContext, { FormValueContext } from '../Form/FormContext';
15
- import { FormGroupContext } from '../FormGroup/FormGroup';
12
+ import { useFormGroup } from '../FormGroup';
16
13
  import { useWillUnmount, useEventCallback } from '../utils';
17
14
  import { oneOf } from '../internals/propTypes';
18
- import useRegisterModel from './useRegisterModel';
15
+ import useRegisterModel from './hooks/useRegisterModel';
16
+ import useField from './hooks/useField';
19
17
  import Toggle from '../Toggle';
20
18
 
21
19
  /**
@@ -37,8 +35,6 @@ var FormControl = /*#__PURE__*/React.forwardRef(function (props, ref) {
37
35
  nestedField = _useContext.nestedField,
38
36
  removeFieldValue = _useContext.removeFieldValue,
39
37
  removeFieldError = _useContext.removeFieldError,
40
- pushFieldRule = _useContext.pushFieldRule,
41
- removeFieldRule = _useContext.removeFieldRule,
42
38
  onFieldChange = _useContext.onFieldChange,
43
39
  onFieldError = _useContext.onFieldError,
44
40
  onFieldSuccess = _useContext.onFieldSuccess,
@@ -69,13 +65,17 @@ var FormControl = /*#__PURE__*/React.forwardRef(function (props, ref) {
69
65
  _props$shouldResetWit = props.shouldResetWithUnmount,
70
66
  shouldResetWithUnmount = _props$shouldResetWit === void 0 ? false : _props$shouldResetWit,
71
67
  rule = props.rule,
72
- rest = _objectWithoutPropertiesLoose(props, ["as", "accepter", "classPrefix", "checkAsync", "checkTrigger", "errorPlacement", "errorMessage", "name", "value", "readOnly", "plaintext", "disabled", "onChange", "onBlur", "defaultValue", "shouldResetWithUnmount", "rule"]);
73
- var _useContext2 = useContext(FormGroupContext),
74
- controlId = _useContext2.controlId;
68
+ id = props.id,
69
+ rest = _objectWithoutPropertiesLoose(props, ["as", "accepter", "classPrefix", "checkAsync", "checkTrigger", "errorPlacement", "errorMessage", "name", "value", "readOnly", "plaintext", "disabled", "onChange", "onBlur", "defaultValue", "shouldResetWithUnmount", "rule", "id"]);
70
+ var _useFormGroup = useFormGroup(id),
71
+ controlId = _useFormGroup.controlId,
72
+ helpTextId = _useFormGroup.helpTextId,
73
+ labelId = _useFormGroup.labelId,
74
+ errorMessageId = _useFormGroup.errorMessageId;
75
75
  if (!onFieldChange) {
76
76
  throw new Error("\n <FormControl> must be inside a component decorated with <Form>.\n And need to update React to 16.6.0 +.\n ");
77
77
  }
78
- useRegisterModel(name, pushFieldRule, removeFieldRule, rule);
78
+ useRegisterModel(name, rule);
79
79
  useWillUnmount(function () {
80
80
  if (shouldResetWithUnmount) {
81
81
  removeFieldValue === null || removeFieldValue === void 0 ? void 0 : removeFieldValue(name);
@@ -84,80 +84,62 @@ var FormControl = /*#__PURE__*/React.forwardRef(function (props, ref) {
84
84
  });
85
85
  var trigger = checkTrigger || contextCheckTrigger;
86
86
  var formValue = useContext(FormValueContext);
87
- var getFieldValue = function getFieldValue(fieldName) {
88
- if (!isUndefined(value)) {
89
- return value;
90
- }
91
- return nestedField ? get(formValue, fieldName) : formValue === null || formValue === void 0 ? void 0 : formValue[name];
92
- };
93
- var setFieldValue = function setFieldValue(fieldName, fieldValue) {
94
- var _extends2;
95
- if (nestedField) {
96
- return set(_extends({}, formValue), fieldName, fieldValue);
97
- }
98
- return _extends({}, formValue, (_extends2 = {}, _extends2[fieldName] = fieldValue, _extends2));
99
- };
100
- var getFieldError = function getFieldError(fieldName) {
101
- if (nestedField) {
102
- var _name = fieldName.includes('.') ? fieldName.replace('.', '.object.') + '.errorMessage' : fieldName;
103
- return get(formError, _name);
104
- }
105
- return formError === null || formError === void 0 ? void 0 : formError[fieldName];
106
- };
107
- var fieldValue = getFieldValue(name);
87
+ var _useField = useField({
88
+ name: name,
89
+ errorMessage: errorMessage,
90
+ formValue: formValue,
91
+ formError: formError,
92
+ value: value,
93
+ nestedField: nestedField,
94
+ errorFromContext: errorFromContext
95
+ }),
96
+ fieldValue = _useField.fieldValue,
97
+ fieldError = _useField.fieldError,
98
+ setFieldValue = _useField.setFieldValue;
108
99
  var _useClassNames = useClassNames(classPrefix),
109
100
  withClassPrefix = _useClassNames.withClassPrefix,
110
101
  prefix = _useClassNames.prefix;
111
102
  var classes = withClassPrefix('wrapper');
112
103
  var handleFieldChange = useEventCallback(function (value, event) {
113
- handleFieldCheck(value, trigger === 'change');
104
+ if (trigger === 'change') {
105
+ handleFieldCheck(value);
106
+ }
114
107
  onFieldChange === null || onFieldChange === void 0 ? void 0 : onFieldChange(name, value, event);
115
108
  onChange === null || onChange === void 0 ? void 0 : onChange(value, event);
116
109
  });
117
110
  var handleFieldBlur = useEventCallback(function (event) {
118
- handleFieldCheck(fieldValue, trigger === 'blur');
111
+ if (trigger === 'blur') {
112
+ handleFieldCheck(fieldValue);
113
+ }
119
114
  onBlur === null || onBlur === void 0 ? void 0 : onBlur(event);
120
115
  });
121
- var handleFieldCheck = useEventCallback(function (value, isCheckTrigger) {
122
- var checkFieldName = nestedField ? name.split('.')[0] : name;
116
+ var handleFieldCheck = useEventCallback(function (value) {
123
117
  var callbackEvents = function callbackEvents(checkResult) {
124
- // The relevant event is triggered only when the inspection is allowed.
125
- if (isCheckTrigger) {
126
- if (checkResult.hasError) {
127
- onFieldError === null || onFieldError === void 0 ? void 0 : onFieldError(checkFieldName, (checkResult === null || checkResult === void 0 ? void 0 : checkResult.errorMessage) || checkResult);
128
- } else {
129
- onFieldSuccess === null || onFieldSuccess === void 0 ? void 0 : onFieldSuccess(checkFieldName);
130
- }
118
+ if (checkResult.hasError) {
119
+ var _errorMessage = checkResult.errorMessage;
120
+ var _fieldError = nestedField ? checkResult : _errorMessage || checkResult;
121
+ onFieldError === null || onFieldError === void 0 ? void 0 : onFieldError(name, _fieldError);
122
+ } else {
123
+ onFieldSuccess === null || onFieldSuccess === void 0 ? void 0 : onFieldSuccess(name);
131
124
  }
132
125
  return checkResult;
133
126
  };
134
127
  var nextFormValue = setFieldValue(name, value);
135
128
  var model = getCombinedModel();
129
+ var checkOptions = {
130
+ nestedObject: nestedField
131
+ };
136
132
  if (checkAsync) {
137
- return model === null || model === void 0 ? void 0 : model.checkForFieldAsync(checkFieldName, nextFormValue).then(function (checkResult) {
133
+ return model === null || model === void 0 ? void 0 : model.checkForFieldAsync(name, nextFormValue, checkOptions).then(function (checkResult) {
138
134
  return callbackEvents(checkResult);
139
135
  });
140
136
  }
141
- return Promise.resolve(callbackEvents(model === null || model === void 0 ? void 0 : model.checkForField(checkFieldName, nextFormValue)));
137
+ return Promise.resolve(callbackEvents(model === null || model === void 0 ? void 0 : model.checkForField(name, nextFormValue, checkOptions)));
142
138
  });
143
- var messageNode = null;
144
- if (!isUndefined(errorMessage)) {
145
- messageNode = errorMessage;
146
- } else if (errorFromContext) {
147
- var fieldError = getFieldError(name);
148
- if (typeof fieldError === 'string' || !(fieldError !== null && fieldError !== void 0 && fieldError.array) && !(fieldError !== null && fieldError !== void 0 && fieldError.object) && fieldError !== null && fieldError !== void 0 && fieldError.hasError) {
149
- messageNode = fieldError;
150
- }
151
- }
152
- var ariaDescribedby = controlId ? controlId + "-help-text" : null;
153
- var fieldHasError = Boolean(messageNode);
154
- var ariaErrormessage = fieldHasError && controlId ? controlId + "-error-message" : undefined;
155
- var valueKey = 'value';
139
+ var fieldHasError = Boolean(fieldError);
156
140
 
157
141
  // Toggle component is a special case that uses `checked` and `defaultChecked` instead of `value` and `defaultValue` props.
158
- if (AccepterComponent === Toggle) {
159
- valueKey = 'checked';
160
- }
142
+ var valueKey = AccepterComponent === Toggle ? 'checked' : 'value';
161
143
  var accepterProps = (_accepterProps = {}, _accepterProps[valueKey] = fieldValue === undefined ? defaultValue : fieldValue, _accepterProps);
162
144
  return /*#__PURE__*/React.createElement(Component, {
163
145
  className: classes,
@@ -165,10 +147,10 @@ var FormControl = /*#__PURE__*/React.forwardRef(function (props, ref) {
165
147
  "data-testid": "form-control-wrapper"
166
148
  }, /*#__PURE__*/React.createElement(AccepterComponent, _extends({
167
149
  id: controlId,
168
- "aria-labelledby": controlId ? controlId + "-control-label" : null,
169
- "aria-describedby": ariaDescribedby,
150
+ "aria-labelledby": labelId,
151
+ "aria-describedby": helpTextId,
170
152
  "aria-invalid": fieldHasError || undefined,
171
- "aria-errormessage": ariaErrormessage
153
+ "aria-errormessage": fieldHasError ? errorMessageId : undefined
172
154
  }, accepterProps, rest, {
173
155
  readOnly: readOnly,
174
156
  plaintext: plaintext,
@@ -177,13 +159,13 @@ var FormControl = /*#__PURE__*/React.forwardRef(function (props, ref) {
177
159
  onChange: handleFieldChange,
178
160
  onBlur: handleFieldBlur
179
161
  })), /*#__PURE__*/React.createElement(FormErrorMessage, {
180
- id: controlId ? controlId + "-error-message" : undefined,
162
+ id: errorMessageId,
181
163
  role: "alert",
182
164
  "aria-relevant": "all",
183
165
  show: fieldHasError,
184
166
  className: prefix(_templateObject || (_templateObject = _taggedTemplateLiteralLoose(["message-wrapper"]))),
185
167
  placement: errorPlacement
186
- }, messageNode));
168
+ }, fieldError));
187
169
  });
188
170
  FormControl.displayName = 'FormControl';
189
171
  FormControl.propTypes = {
@@ -0,0 +1,18 @@
1
+ /// <reference types="react" />
2
+ interface FieldProps {
3
+ name: string;
4
+ formValue?: Record<string, any>;
5
+ formError?: Record<string, any>;
6
+ value: any;
7
+ nestedField: boolean;
8
+ errorMessage: React.ReactNode;
9
+ errorFromContext?: boolean;
10
+ }
11
+ declare function useField(props: FieldProps): {
12
+ fieldValue: any;
13
+ fieldError: any;
14
+ setFieldValue: (fieldName: string, fieldValue: any) => {
15
+ [x: string]: any;
16
+ };
17
+ };
18
+ export default useField;
@@ -0,0 +1,48 @@
1
+ 'use client';
2
+ import _extends from "@babel/runtime/helpers/esm/extends";
3
+ import { useCallback, useMemo } from 'react';
4
+ import get from 'lodash/get';
5
+ import set from 'lodash/set';
6
+ import { nameToPath } from '../utils';
7
+ function useField(props) {
8
+ var name = props.name,
9
+ formValue = props.formValue,
10
+ formError = props.formError,
11
+ value = props.value,
12
+ nestedField = props.nestedField,
13
+ errorMessage = props.errorMessage,
14
+ errorFromContext = props.errorFromContext;
15
+ var fieldValue = useMemo(function () {
16
+ if (typeof value !== 'undefined') {
17
+ return value;
18
+ }
19
+ return nestedField ? get(formValue, name) : formValue === null || formValue === void 0 ? void 0 : formValue[name];
20
+ }, [formValue, name, nestedField, value]);
21
+ var fieldError = useMemo(function () {
22
+ if (typeof errorMessage !== 'undefined' || !errorFromContext) {
23
+ return errorMessage;
24
+ }
25
+ if (nestedField) {
26
+ var _get;
27
+ return (_get = get(formError, nameToPath(name))) === null || _get === void 0 ? void 0 : _get.errorMessage;
28
+ }
29
+ var fieldError = formError === null || formError === void 0 ? void 0 : formError[name];
30
+ if (typeof fieldError === 'string') {
31
+ return fieldError;
32
+ }
33
+ return fieldError === null || fieldError === void 0 ? void 0 : fieldError.errorMessage;
34
+ }, [errorFromContext, errorMessage, formError, name, nestedField]);
35
+ var setFieldValue = useCallback(function (fieldName, fieldValue) {
36
+ var _extends2;
37
+ if (nestedField) {
38
+ return set(_extends({}, formValue), fieldName, fieldValue);
39
+ }
40
+ return _extends({}, formValue, (_extends2 = {}, _extends2[fieldName] = fieldValue, _extends2));
41
+ }, [formValue, nestedField]);
42
+ return {
43
+ fieldValue: fieldValue,
44
+ fieldError: fieldError,
45
+ setFieldValue: setFieldValue
46
+ };
47
+ }
48
+ export default useField;
@@ -0,0 +1,3 @@
1
+ import type { CheckType } from 'schema-typed';
2
+ declare function useRegisterModel(name: string, rule?: CheckType<unknown, any>): void;
3
+ export default useRegisterModel;
@@ -0,0 +1,17 @@
1
+ 'use client';
2
+ import { useRef, useEffect } from 'react';
3
+ import { useFormContext } from '../../Form/FormContext';
4
+ function useRegisterModel(name, rule) {
5
+ var _ref = useFormContext() || {},
6
+ pushFieldRule = _ref.pushFieldRule,
7
+ removeFieldRule = _ref.removeFieldRule;
8
+ var refRule = useRef(rule);
9
+ refRule.current = rule;
10
+ useEffect(function () {
11
+ pushFieldRule === null || pushFieldRule === void 0 ? void 0 : pushFieldRule(name, refRule);
12
+ return function () {
13
+ removeFieldRule === null || removeFieldRule === void 0 ? void 0 : removeFieldRule(name);
14
+ };
15
+ }, [name, pushFieldRule, removeFieldRule]);
16
+ }
17
+ export default useRegisterModel;
@@ -0,0 +1 @@
1
+ export declare function nameToPath(name: string): string;
@@ -0,0 +1,4 @@
1
+ 'use client';
2
+ export function nameToPath(name) {
3
+ return name.includes('.') ? name.replace('.', '.object.') : name;
4
+ }
@@ -1,31 +1,35 @@
1
1
  'use client';
2
2
  import _extends from "@babel/runtime/helpers/esm/extends";
3
3
  import _objectWithoutPropertiesLoose from "@babel/runtime/helpers/esm/objectWithoutPropertiesLoose";
4
- import React, { useContext } from 'react';
4
+ import React from 'react';
5
5
  import PropTypes from 'prop-types';
6
6
  import { useClassNames } from '../utils';
7
- import { FormGroupContext } from '../FormGroup/FormGroup';
7
+ import { useFormGroup } from '../FormGroup';
8
8
  /**
9
9
  * The `<Form.ControlLabel>` component renders a label with required indicator, for form controls.
10
10
  * @see https://rsuitejs.com/components/form/
11
11
  */
12
12
  var FormControlLabel = /*#__PURE__*/React.forwardRef(function (props, ref) {
13
+ var _useFormGroup = useFormGroup(),
14
+ labelId = _useFormGroup.labelId,
15
+ controlId = _useFormGroup.controlId;
13
16
  var _props$as = props.as,
14
17
  Component = _props$as === void 0 ? 'label' : _props$as,
15
18
  _props$classPrefix = props.classPrefix,
16
19
  classPrefix = _props$classPrefix === void 0 ? 'form-control-label' : _props$classPrefix,
17
- htmlFor = props.htmlFor,
20
+ _props$htmlFor = props.htmlFor,
21
+ htmlFor = _props$htmlFor === void 0 ? controlId : _props$htmlFor,
18
22
  className = props.className,
19
- rest = _objectWithoutPropertiesLoose(props, ["as", "classPrefix", "htmlFor", "className"]);
20
- var _useContext = useContext(FormGroupContext),
21
- controlId = _useContext.controlId;
23
+ _props$id = props.id,
24
+ id = _props$id === void 0 ? labelId : _props$id,
25
+ rest = _objectWithoutPropertiesLoose(props, ["as", "classPrefix", "htmlFor", "className", "id"]);
22
26
  var _useClassNames = useClassNames(classPrefix),
23
27
  withClassPrefix = _useClassNames.withClassPrefix,
24
28
  merge = _useClassNames.merge;
25
29
  var classes = merge(className, withClassPrefix());
26
30
  return /*#__PURE__*/React.createElement(Component, _extends({
27
- id: controlId ? controlId + "-control-label" : null,
28
- htmlFor: htmlFor || controlId
31
+ id: id,
32
+ htmlFor: htmlFor
29
33
  }, rest, {
30
34
  ref: ref,
31
35
  className: classes
@@ -29,10 +29,7 @@ var FormErrorMessage = /*#__PURE__*/React.forwardRef(function (props, ref) {
29
29
  merge = _useClassNames.merge;
30
30
  var classes = withClassPrefix('show');
31
31
  var wrapperClasses = merge(className, prefix('wrapper', (_prefix = {}, _prefix["placement-" + kebabCase(placementPolyfill(placement))] = placement, _prefix)));
32
- if (!show) {
33
- return null;
34
- }
35
- return /*#__PURE__*/React.createElement(Component, _extends({}, rest, {
32
+ return show ? /*#__PURE__*/React.createElement(Component, _extends({}, rest, {
36
33
  ref: ref,
37
34
  className: wrapperClasses
38
35
  }), /*#__PURE__*/React.createElement("span", {
@@ -41,7 +38,7 @@ var FormErrorMessage = /*#__PURE__*/React.forwardRef(function (props, ref) {
41
38
  className: prefix(_templateObject || (_templateObject = _taggedTemplateLiteralLoose(["arrow"])))
42
39
  }), /*#__PURE__*/React.createElement("span", {
43
40
  className: prefix(_templateObject2 || (_templateObject2 = _taggedTemplateLiteralLoose(["inner"])))
44
- }, children)));
41
+ }, children))) : null;
45
42
  });
46
43
  FormErrorMessage.displayName = 'FormErrorMessage';
47
44
  FormErrorMessage.propTypes = {
@@ -1,4 +1,3 @@
1
- import React from 'react';
2
1
  import { WithAsProps, RsRefForwardingComponent } from '../@types/common';
3
2
  export interface FormGroupProps extends WithAsProps {
4
3
  /**
@@ -7,9 +6,24 @@ export interface FormGroupProps extends WithAsProps {
7
6
  */
8
7
  controlId?: string;
9
8
  }
10
- export declare const FormGroupContext: React.Context<{
11
- controlId?: string | undefined;
12
- }>;
9
+ export declare const useFormGroup: (controlId?: string) => {
10
+ /**
11
+ * The `id` of the `<Form.Control>` component.
12
+ */
13
+ controlId: string;
14
+ /**
15
+ * The `id` of the `<Form.HelpText>` component.
16
+ */
17
+ helpTextId: string;
18
+ /**
19
+ * The `id` of the `<Form.ControlLabel>` component.
20
+ */
21
+ labelId: string;
22
+ /**
23
+ * The `id` of the `<Form.ErrorMessage>` component.
24
+ */
25
+ errorMessageId: string;
26
+ };
13
27
  /**
14
28
  * The `<Form.Group>` component is the easiest way to add some structure to forms.
15
29
  * @see https://rsuitejs.com/components/form/
@@ -4,7 +4,33 @@ import _objectWithoutPropertiesLoose from "@babel/runtime/helpers/esm/objectWith
4
4
  import React, { useMemo } from 'react';
5
5
  import PropTypes from 'prop-types';
6
6
  import { useClassNames, useUniqueId } from '../utils';
7
- export var FormGroupContext = /*#__PURE__*/React.createContext({});
7
+ var FormGroupContext = /*#__PURE__*/React.createContext({});
8
+ export var useFormGroup = function useFormGroup(controlId) {
9
+ var context = React.useContext(FormGroupContext);
10
+ var fallbackId = useUniqueId('rs-');
11
+ var id = controlId || context.controlId || fallbackId;
12
+ var helpTextId = id + "-help-text";
13
+ var labelId = id + "-label";
14
+ var errorMessageId = id + "-error-message";
15
+ return {
16
+ /**
17
+ * The `id` of the `<Form.Control>` component.
18
+ */
19
+ controlId: id,
20
+ /**
21
+ * The `id` of the `<Form.HelpText>` component.
22
+ */
23
+ helpTextId: helpTextId,
24
+ /**
25
+ * The `id` of the `<Form.ControlLabel>` component.
26
+ */
27
+ labelId: labelId,
28
+ /**
29
+ * The `id` of the `<Form.ErrorMessage>` component.
30
+ */
31
+ errorMessageId: errorMessageId
32
+ };
33
+ };
8
34
 
9
35
  /**
10
36
  * The `<Form.Group>` component is the easiest way to add some structure to forms.