rsuite 5.49.0 → 5.51.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.
Files changed (233) hide show
  1. package/CHANGELOG.md +24 -0
  2. package/Cascader/styles/index.less +4 -4
  3. package/CheckTreePicker/styles/index.less +3 -3
  4. package/DatePicker/styles/index.less +1 -1
  5. package/DateRangePicker/styles/index.less +15 -5
  6. package/Dropdown/styles/index.less +5 -4
  7. package/Dropdown/styles/mixin.less +0 -11
  8. package/Form/styles/mixin.less +1 -2
  9. package/InputGroup/styles/index.less +0 -14
  10. package/InputPicker/styles/index.less +1 -1
  11. package/Picker/styles/index.less +33 -26
  12. package/Picker/styles/mixin.less +20 -16
  13. package/README.md +4 -4
  14. package/TagInput/styles/index.less +2 -2
  15. package/TagPicker/styles/index.less +5 -1
  16. package/TreePicker/styles/index.less +2 -2
  17. package/cjs/@types/common.d.ts +8 -0
  18. package/cjs/AutoComplete/AutoComplete.js +39 -37
  19. package/cjs/AutoComplete/Combobox.d.ts +8 -0
  20. package/cjs/AutoComplete/Combobox.js +31 -0
  21. package/cjs/Calendar/Calendar.d.ts +5 -1
  22. package/cjs/Calendar/CalendarContainer.d.ts +5 -1
  23. package/cjs/Calendar/CalendarContainer.js +35 -37
  24. package/cjs/Cascader/Cascader.js +58 -59
  25. package/cjs/Cascader/DropdownMenu.d.ts +3 -20
  26. package/cjs/Cascader/DropdownMenu.js +48 -48
  27. package/cjs/Cascader/TreeView.d.ts +24 -0
  28. package/cjs/Cascader/TreeView.js +174 -0
  29. package/cjs/CheckPicker/CheckPicker.d.ts +2 -2
  30. package/cjs/CheckPicker/CheckPicker.js +42 -44
  31. package/cjs/CheckTreePicker/CheckTreeNode.d.ts +2 -2
  32. package/cjs/CheckTreePicker/CheckTreeNode.js +31 -59
  33. package/cjs/CheckTreePicker/CheckTreePicker.js +81 -84
  34. package/cjs/DatePicker/DatePicker.d.ts +5 -1
  35. package/cjs/DatePicker/DatePicker.js +7 -10
  36. package/cjs/DatePicker/Toolbar.js +2 -1
  37. package/cjs/DateRangeInput/DateRangeInput.js +2 -2
  38. package/cjs/DateRangePicker/Calendar.js +24 -23
  39. package/cjs/DateRangePicker/DateRangePicker.d.ts +18 -4
  40. package/cjs/DateRangePicker/DateRangePicker.js +239 -202
  41. package/cjs/DateRangePicker/types.d.ts +11 -3
  42. package/cjs/DateRangePicker/utils.d.ts +2 -1
  43. package/cjs/DateRangePicker/utils.js +7 -5
  44. package/cjs/Form/Form.d.ts +14 -0
  45. package/cjs/Form/Form.js +39 -30
  46. package/cjs/Form/FormContext.d.ts +1 -0
  47. package/cjs/FormControl/FormControl.d.ts +11 -1
  48. package/cjs/FormControl/FormControl.js +40 -17
  49. package/cjs/FormGroup/FormGroup.js +2 -1
  50. package/cjs/InputPicker/InputPicker.js +108 -92
  51. package/cjs/InputPicker/InputSearch.js +3 -15
  52. package/cjs/InputPicker/TagList.d.ts +3 -0
  53. package/cjs/InputPicker/TagList.js +29 -0
  54. package/cjs/InputPicker/TextBox.d.ts +18 -0
  55. package/cjs/InputPicker/TextBox.js +48 -0
  56. package/cjs/MultiCascader/MultiCascader.js +53 -52
  57. package/cjs/MultiCascader/{DropdownMenu.d.ts → TreeView.d.ts} +3 -3
  58. package/cjs/MultiCascader/{DropdownMenu.js → TreeView.js} +77 -74
  59. package/{esm/Picker/DropdownMenuCheckItem.d.ts → cjs/Picker/ListCheckItem.d.ts} +3 -3
  60. package/cjs/Picker/{DropdownMenuCheckItem.js → ListCheckItem.js} +14 -30
  61. package/cjs/Picker/{DropdownMenuItem.d.ts → ListItem.d.ts} +4 -4
  62. package/cjs/Picker/{DropdownMenuItem.js → ListItem.js} +15 -24
  63. package/cjs/Picker/ListItemGroup.d.ts +6 -0
  64. package/cjs/Picker/{DropdownMenuGroup.js → ListItemGroup.js} +3 -9
  65. package/cjs/Picker/Listbox.d.ts +35 -0
  66. package/cjs/Picker/{DropdownMenu.js → Listbox.js} +49 -64
  67. package/cjs/{DatePicker → Picker}/PickerIndicator.d.ts +1 -1
  68. package/cjs/{DatePicker → Picker}/PickerIndicator.js +2 -1
  69. package/cjs/{DatePicker → Picker}/PickerLabel.d.ts +1 -1
  70. package/cjs/Picker/{PickerOverlay.d.ts → PickerPopup.d.ts} +3 -3
  71. package/cjs/Picker/{PickerOverlay.js → PickerPopup.js} +9 -7
  72. package/cjs/Picker/PickerToggle.d.ts +17 -22
  73. package/cjs/Picker/PickerToggle.js +63 -181
  74. package/cjs/Picker/PickerToggleTrigger.d.ts +15 -0
  75. package/cjs/Picker/PickerToggleTrigger.js +21 -5
  76. package/cjs/Picker/SearchBar.js +7 -9
  77. package/cjs/Picker/TreeView.d.ts +7 -0
  78. package/cjs/Picker/TreeView.js +31 -0
  79. package/cjs/Picker/hooks/index.d.ts +6 -0
  80. package/cjs/Picker/hooks/index.js +18 -0
  81. package/cjs/Picker/hooks/useCombobox.d.ts +7 -0
  82. package/cjs/Picker/hooks/useCombobox.js +22 -0
  83. package/cjs/Picker/hooks/useFocusItemValue.d.ts +30 -0
  84. package/cjs/Picker/hooks/useFocusItemValue.js +246 -0
  85. package/cjs/Picker/hooks/usePickerClassName.d.ts +21 -0
  86. package/cjs/Picker/hooks/usePickerClassName.js +39 -0
  87. package/cjs/Picker/{usePickerRef.d.ts → hooks/usePickerRef.d.ts} +5 -3
  88. package/cjs/Picker/{usePickerRef.js → hooks/usePickerRef.js} +13 -7
  89. package/cjs/Picker/hooks/useSearch.d.ts +18 -0
  90. package/cjs/Picker/hooks/useSearch.js +57 -0
  91. package/cjs/Picker/hooks/useToggleKeyDownEvent.d.ts +25 -0
  92. package/cjs/Picker/hooks/useToggleKeyDownEvent.js +101 -0
  93. package/cjs/Picker/index.d.ts +9 -5
  94. package/cjs/Picker/index.js +32 -16
  95. package/cjs/Picker/propTypes.d.ts +0 -6
  96. package/cjs/Picker/propTypes.js +0 -5
  97. package/cjs/Picker/utils.d.ts +2 -100
  98. package/cjs/Picker/utils.js +1 -473
  99. package/cjs/SelectPicker/SelectPicker.d.ts +2 -2
  100. package/cjs/SelectPicker/SelectPicker.js +47 -50
  101. package/cjs/TagInput/index.js +4 -0
  102. package/cjs/TreePicker/TreeNode.d.ts +2 -2
  103. package/cjs/TreePicker/TreeNode.js +22 -56
  104. package/cjs/TreePicker/TreePicker.js +91 -95
  105. package/cjs/utils/constants.d.ts +2 -1
  106. package/cjs/utils/constants.js +1 -0
  107. package/cjs/utils/dateUtils.d.ts +0 -1
  108. package/cjs/utils/dateUtils.js +0 -6
  109. package/cjs/utils/getStringLength.d.ts +2 -0
  110. package/cjs/utils/getStringLength.js +18 -0
  111. package/cjs/utils/index.d.ts +1 -0
  112. package/cjs/utils/index.js +4 -1
  113. package/dist/rsuite-no-reset-rtl.css +201 -186
  114. package/dist/rsuite-no-reset-rtl.min.css +1 -1
  115. package/dist/rsuite-no-reset-rtl.min.css.map +1 -1
  116. package/dist/rsuite-no-reset.css +201 -186
  117. package/dist/rsuite-no-reset.min.css +1 -1
  118. package/dist/rsuite-no-reset.min.css.map +1 -1
  119. package/dist/rsuite-rtl.css +201 -186
  120. package/dist/rsuite-rtl.min.css +1 -1
  121. package/dist/rsuite-rtl.min.css.map +1 -1
  122. package/dist/rsuite.css +201 -186
  123. package/dist/rsuite.js +235 -104
  124. package/dist/rsuite.js.map +1 -1
  125. package/dist/rsuite.min.css +1 -1
  126. package/dist/rsuite.min.css.map +1 -1
  127. package/dist/rsuite.min.js +1 -1
  128. package/dist/rsuite.min.js.map +1 -1
  129. package/esm/@types/common.d.ts +8 -0
  130. package/esm/AutoComplete/AutoComplete.js +42 -40
  131. package/esm/AutoComplete/Combobox.d.ts +8 -0
  132. package/esm/AutoComplete/Combobox.js +25 -0
  133. package/esm/Calendar/Calendar.d.ts +5 -1
  134. package/esm/Calendar/CalendarContainer.d.ts +5 -1
  135. package/esm/Calendar/CalendarContainer.js +37 -39
  136. package/esm/Cascader/Cascader.js +61 -62
  137. package/esm/Cascader/DropdownMenu.d.ts +3 -20
  138. package/esm/Cascader/DropdownMenu.js +50 -49
  139. package/esm/Cascader/TreeView.d.ts +24 -0
  140. package/esm/Cascader/TreeView.js +167 -0
  141. package/esm/CheckPicker/CheckPicker.d.ts +2 -2
  142. package/esm/CheckPicker/CheckPicker.js +45 -47
  143. package/esm/CheckTreePicker/CheckTreeNode.d.ts +2 -2
  144. package/esm/CheckTreePicker/CheckTreeNode.js +33 -61
  145. package/esm/CheckTreePicker/CheckTreePicker.js +84 -87
  146. package/esm/DatePicker/DatePicker.d.ts +5 -1
  147. package/esm/DatePicker/DatePicker.js +5 -8
  148. package/esm/DatePicker/Toolbar.js +2 -1
  149. package/esm/DateRangeInput/DateRangeInput.js +2 -2
  150. package/esm/DateRangePicker/Calendar.js +25 -23
  151. package/esm/DateRangePicker/DateRangePicker.d.ts +18 -4
  152. package/esm/DateRangePicker/DateRangePicker.js +241 -204
  153. package/esm/DateRangePicker/types.d.ts +11 -3
  154. package/esm/DateRangePicker/utils.d.ts +2 -1
  155. package/esm/DateRangePicker/utils.js +7 -5
  156. package/esm/Form/Form.d.ts +14 -0
  157. package/esm/Form/Form.js +41 -32
  158. package/esm/Form/FormContext.d.ts +1 -0
  159. package/esm/FormControl/FormControl.d.ts +11 -1
  160. package/esm/FormControl/FormControl.js +41 -18
  161. package/esm/FormGroup/FormGroup.js +3 -2
  162. package/esm/InputPicker/InputPicker.js +110 -94
  163. package/esm/InputPicker/InputSearch.js +4 -15
  164. package/esm/InputPicker/TagList.d.ts +3 -0
  165. package/esm/InputPicker/TagList.js +23 -0
  166. package/esm/InputPicker/TextBox.d.ts +18 -0
  167. package/esm/InputPicker/TextBox.js +42 -0
  168. package/esm/MultiCascader/MultiCascader.js +56 -55
  169. package/esm/MultiCascader/{DropdownMenu.d.ts → TreeView.d.ts} +3 -3
  170. package/esm/MultiCascader/{DropdownMenu.js → TreeView.js} +79 -75
  171. package/{cjs/Picker/DropdownMenuCheckItem.d.ts → esm/Picker/ListCheckItem.d.ts} +3 -3
  172. package/esm/Picker/{DropdownMenuCheckItem.js → ListCheckItem.js} +15 -30
  173. package/esm/Picker/{DropdownMenuItem.d.ts → ListItem.d.ts} +4 -4
  174. package/esm/Picker/{DropdownMenuItem.js → ListItem.js} +16 -24
  175. package/esm/Picker/ListItemGroup.d.ts +6 -0
  176. package/esm/Picker/{DropdownMenuGroup.js → ListItemGroup.js} +3 -9
  177. package/esm/Picker/Listbox.d.ts +35 -0
  178. package/esm/Picker/{DropdownMenu.js → Listbox.js} +50 -64
  179. package/esm/{DatePicker → Picker}/PickerIndicator.d.ts +1 -1
  180. package/esm/{DatePicker → Picker}/PickerIndicator.js +2 -1
  181. package/esm/{DatePicker → Picker}/PickerLabel.d.ts +1 -1
  182. package/esm/Picker/{PickerOverlay.d.ts → PickerPopup.d.ts} +3 -3
  183. package/esm/Picker/{PickerOverlay.js → PickerPopup.js} +10 -8
  184. package/esm/Picker/PickerToggle.d.ts +17 -22
  185. package/esm/Picker/PickerToggle.js +65 -183
  186. package/esm/Picker/PickerToggleTrigger.d.ts +15 -0
  187. package/esm/Picker/PickerToggleTrigger.js +20 -5
  188. package/esm/Picker/SearchBar.js +8 -9
  189. package/esm/Picker/TreeView.d.ts +7 -0
  190. package/esm/Picker/TreeView.js +25 -0
  191. package/esm/Picker/hooks/index.d.ts +6 -0
  192. package/esm/Picker/hooks/index.js +7 -0
  193. package/esm/Picker/hooks/useCombobox.d.ts +7 -0
  194. package/esm/Picker/hooks/useCombobox.js +17 -0
  195. package/esm/Picker/hooks/useFocusItemValue.d.ts +30 -0
  196. package/esm/Picker/hooks/useFocusItemValue.js +240 -0
  197. package/esm/Picker/hooks/usePickerClassName.d.ts +21 -0
  198. package/esm/Picker/hooks/usePickerClassName.js +33 -0
  199. package/esm/Picker/{usePickerRef.d.ts → hooks/usePickerRef.d.ts} +5 -3
  200. package/esm/Picker/{usePickerRef.js → hooks/usePickerRef.js} +13 -8
  201. package/esm/Picker/hooks/useSearch.d.ts +18 -0
  202. package/esm/Picker/hooks/useSearch.js +51 -0
  203. package/esm/Picker/hooks/useToggleKeyDownEvent.d.ts +25 -0
  204. package/esm/Picker/hooks/useToggleKeyDownEvent.js +96 -0
  205. package/esm/Picker/index.d.ts +9 -5
  206. package/esm/Picker/index.js +9 -5
  207. package/esm/Picker/propTypes.d.ts +0 -6
  208. package/esm/Picker/propTypes.js +0 -5
  209. package/esm/Picker/utils.d.ts +2 -100
  210. package/esm/Picker/utils.js +2 -467
  211. package/esm/SelectPicker/SelectPicker.d.ts +2 -2
  212. package/esm/SelectPicker/SelectPicker.js +50 -53
  213. package/esm/TagInput/index.js +4 -0
  214. package/esm/TreePicker/TreeNode.d.ts +2 -2
  215. package/esm/TreePicker/TreeNode.js +24 -58
  216. package/esm/TreePicker/TreePicker.js +94 -98
  217. package/esm/utils/constants.d.ts +2 -1
  218. package/esm/utils/constants.js +1 -0
  219. package/esm/utils/dateUtils.d.ts +0 -1
  220. package/esm/utils/dateUtils.js +0 -5
  221. package/esm/utils/getStringLength.d.ts +2 -0
  222. package/esm/utils/getStringLength.js +13 -0
  223. package/esm/utils/index.d.ts +1 -0
  224. package/esm/utils/index.js +1 -0
  225. package/package.json +1 -1
  226. package/styles/mixins/combobox.less +10 -0
  227. package/styles/variables.less +1 -3
  228. package/cjs/Picker/DropdownMenu.d.ts +0 -59
  229. package/cjs/Picker/DropdownMenuGroup.d.ts +0 -6
  230. package/esm/Picker/DropdownMenu.d.ts +0 -59
  231. package/esm/Picker/DropdownMenuGroup.d.ts +0 -6
  232. /package/cjs/{DatePicker → Picker}/PickerLabel.js +0 -0
  233. /package/esm/{DatePicker → Picker}/PickerLabel.js +0 -0
@@ -9,12 +9,20 @@ export interface RangeType<T = DateRange> {
9
9
  placement?: 'bottom' | 'left';
10
10
  }
11
11
  export declare type DisabledDateFunction = (
12
- /** Date used to determine if disabling is required. */
12
+ /**
13
+ * Date used to determine if disabling is required.
14
+ */
13
15
  date: Date,
14
- /** Date selected. */
16
+ /**
17
+ * Date selected.
18
+ */
15
19
  selectDate?: ValueType,
16
20
  /**
17
21
  * Whether to choose to finish now.
18
22
  * If `false`, only the start date is selected, waiting for the selection end date.
19
23
  */
20
- selectedDone?: boolean, target?: DATERANGE_DISABLED_TARGET) => boolean;
24
+ selectedDone?: boolean,
25
+ /**
26
+ * Call the target of the `shouldDisableDate` function.
27
+ */
28
+ target?: DATERANGE_DISABLED_TARGET) => boolean;
@@ -1,7 +1,8 @@
1
1
  import { DateRange } from './types';
2
- export declare function getSafeCalendarDate({ value, calendarKey }: {
2
+ export declare function getSafeCalendarDate({ value, calendarKey, allowAameMonth }: {
3
3
  value: [] | [Date] | [Date, Date] | null;
4
4
  calendarKey?: 'start' | 'end';
5
+ allowAameMonth?: boolean;
5
6
  }): DateRange;
6
7
  export declare const isSameRange: (source: DateRange | null, dest: DateRange | null, format: string) => boolean;
7
8
  export declare const getMonthHoverRange: (date: Date) => DateRange;
@@ -4,29 +4,31 @@ export function getSafeCalendarDate(_ref) {
4
4
  var _value;
5
5
  var value = _ref.value,
6
6
  _ref$calendarKey = _ref.calendarKey,
7
- calendarKey = _ref$calendarKey === void 0 ? 'start' : _ref$calendarKey;
7
+ calendarKey = _ref$calendarKey === void 0 ? 'start' : _ref$calendarKey,
8
+ allowAameMonth = _ref.allowAameMonth;
8
9
  // Update calendarDate if the value is not null
9
10
  value = (_value = value) !== null && _value !== void 0 ? _value : [];
11
+ var gap = allowAameMonth ? 0 : 1;
10
12
  if (value[0] && value[1]) {
11
13
  var diffMonth = differenceInCalendarMonths(value[1], value[0]);
12
14
  if (calendarKey === 'start') {
13
15
  return [value[0], diffMonth <= 0 ? copyTime({
14
16
  from: value[1],
15
- to: addMonths(value[0], 1)
17
+ to: addMonths(value[0], gap)
16
18
  }) : value[1]];
17
19
  } else if (calendarKey === 'end') {
18
20
  return [diffMonth <= 0 ? copyTime({
19
21
  from: value[0],
20
- to: addMonths(value[1], -1)
22
+ to: addMonths(value[1], -gap)
21
23
  }) : value[0], value[1]];
22
24
  }
23
25
 
24
26
  // If only the start date
25
27
  } else if (value[0]) {
26
- return [value[0], addMonths(value[0], 1)];
28
+ return [value[0], addMonths(value[0], gap)];
27
29
  }
28
30
  var todayDate = new Date();
29
- return [todayDate, addMonths(todayDate, 1)];
31
+ return [todayDate, addMonths(todayDate, gap)];
30
32
  }
31
33
  export var isSameRange = function isSameRange(source, dest, format) {
32
34
  // If both are null, reguard as same
@@ -32,6 +32,20 @@ export interface FormProps<T = Record<string, any>, errorMsgType = any, E = {
32
32
  disabled?: boolean;
33
33
  /** The error message comes from context */
34
34
  errorFromContext?: boolean;
35
+ /**
36
+ * The form data is nested.
37
+ * You may now nest fields with "dot syntax" (e.g. address.city).
38
+ *
39
+ * @default false
40
+ * @version v5.51.0
41
+ * @example
42
+ * ```jsx
43
+ * <Form formValue={{ address: { city: 'Shanghai' } }} nestedField>
44
+ * <FormControl name="address.city" />
45
+ * </Form>
46
+ * ```
47
+ */
48
+ nestedField?: boolean;
35
49
  /** Callback fired when data changing */
36
50
  onChange?: (formValue: T, event?: React.SyntheticEvent) => void;
37
51
  /** Callback fired when error checking */
package/esm/Form/Form.js CHANGED
@@ -1,9 +1,10 @@
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, { useMemo, useCallback, useImperativeHandle, useRef } from 'react';
4
+ import React, { useMemo, useImperativeHandle, useRef } from 'react';
5
5
  import PropTypes from 'prop-types';
6
6
  import omit from 'lodash/omit';
7
+ import set from 'lodash/set';
7
8
  import { SchemaModel } from 'schema-typed';
8
9
  import FormContext, { FormValueContext } from './FormContext';
9
10
  import FormControl from '../FormControl';
@@ -13,7 +14,7 @@ import FormGroup from '../FormGroup';
13
14
  import FormHelpText from '../FormHelpText';
14
15
  import { useFormClassNames } from './useFormClassNames';
15
16
  import useSchemaModel from './useSchemaModel';
16
- import { useControlled } from '../utils';
17
+ import { useControlled, useEventCallback } from '../utils';
17
18
  /**
18
19
  * The `Form` component is a form interface for collecting and validating user input.
19
20
  * @see https://rsuitejs.com/components/form
@@ -30,6 +31,8 @@ var Form = /*#__PURE__*/React.forwardRef(function (props, ref) {
30
31
  formValue = props.formValue,
31
32
  formError = props.formError,
32
33
  fluid = props.fluid,
34
+ _props$nestedField = props.nestedField,
35
+ nestedField = _props$nestedField === void 0 ? false : _props$nestedField,
33
36
  _props$layout = props.layout,
34
37
  layout = _props$layout === void 0 ? 'vertical' : _props$layout,
35
38
  _props$model = props.model,
@@ -43,7 +46,7 @@ var Form = /*#__PURE__*/React.forwardRef(function (props, ref) {
43
46
  onCheck = props.onCheck,
44
47
  onError = props.onError,
45
48
  onChange = props.onChange,
46
- rest = _objectWithoutPropertiesLoose(props, ["checkTrigger", "classPrefix", "errorFromContext", "formDefaultValue", "formValue", "formError", "fluid", "layout", "model", "readOnly", "plaintext", "className", "children", "disabled", "onSubmit", "onCheck", "onError", "onChange"]);
49
+ rest = _objectWithoutPropertiesLoose(props, ["checkTrigger", "classPrefix", "errorFromContext", "formDefaultValue", "formValue", "formError", "fluid", "nestedField", "layout", "model", "readOnly", "plaintext", "className", "children", "disabled", "onSubmit", "onCheck", "onError", "onChange"]);
47
50
  var _useSchemaModel = useSchemaModel(formModel),
48
51
  getCombinedModel = _useSchemaModel.getCombinedModel,
49
52
  pushFieldRule = _useSchemaModel.pushFieldRule,
@@ -73,7 +76,7 @@ var Form = /*#__PURE__*/React.forwardRef(function (props, ref) {
73
76
  * The error message after verification is returned in the callback.
74
77
  * @param callback
75
78
  */
76
- var check = useCallback(function (callback) {
79
+ var check = useEventCallback(function (callback) {
77
80
  var formValue = realFormValue || {};
78
81
  var formError = {};
79
82
  var errorCount = 0;
@@ -93,14 +96,14 @@ var Form = /*#__PURE__*/React.forwardRef(function (props, ref) {
93
96
  return false;
94
97
  }
95
98
  return true;
96
- }, [realFormValue, getCombinedModel, setFormError, onCheck, onError]);
99
+ });
97
100
 
98
101
  /**
99
102
  * Check the data field
100
103
  * @param fieldName
101
104
  * @param callback
102
105
  */
103
- var checkForField = useCallback(function (fieldName, callback) {
106
+ var checkForField = useEventCallback(function (fieldName, callback) {
104
107
  var _extends2;
105
108
  var formValue = realFormValue || {};
106
109
  var model = getCombinedModel();
@@ -113,12 +116,12 @@ var Form = /*#__PURE__*/React.forwardRef(function (props, ref) {
113
116
  onError === null || onError === void 0 ? void 0 : onError(formError);
114
117
  }
115
118
  return !checkResult.hasError;
116
- }, [realFormValue, getCombinedModel, realFormError, setFormError, onCheck, onError]);
119
+ });
117
120
 
118
121
  /**
119
122
  * Check form data asynchronously and return a Promise
120
123
  */
121
- var checkAsync = useCallback(function () {
124
+ var checkAsync = useEventCallback(function () {
122
125
  var formValue = realFormValue || {};
123
126
  var promises = [];
124
127
  var keys = [];
@@ -146,13 +149,13 @@ var Form = /*#__PURE__*/React.forwardRef(function (props, ref) {
146
149
  formError: formError
147
150
  };
148
151
  });
149
- }, [realFormValue, getCombinedModel, onCheck, setFormError, onError]);
152
+ });
150
153
 
151
154
  /**
152
155
  * Asynchronously check form fields and return Promise
153
156
  * @param fieldName
154
157
  */
155
- var checkForFieldAsync = useCallback(function (fieldName) {
158
+ var checkForFieldAsync = useEventCallback(function (fieldName) {
156
159
  var formValue = realFormValue || {};
157
160
  var model = getCombinedModel();
158
161
  return model.checkForFieldAsync(fieldName, formValue).then(function (checkResult) {
@@ -165,19 +168,19 @@ var Form = /*#__PURE__*/React.forwardRef(function (props, ref) {
165
168
  }
166
169
  return checkResult;
167
170
  });
168
- }, [realFormValue, getCombinedModel, realFormError, onCheck, setFormError, onError]);
169
- var cleanErrors = useCallback(function () {
171
+ });
172
+ var cleanErrors = useEventCallback(function () {
170
173
  setFormError({});
171
- }, [setFormError]);
172
- var cleanErrorForField = useCallback(function (fieldName) {
174
+ });
175
+ var cleanErrorForField = useEventCallback(function (fieldName) {
173
176
  setFormError(omit(realFormError, [fieldName]));
174
- }, [realFormError, setFormError]);
175
- var resetErrors = useCallback(function (formError) {
177
+ });
178
+ var resetErrors = useEventCallback(function (formError) {
176
179
  if (formError === void 0) {
177
180
  formError = {};
178
181
  }
179
182
  setFormError(formError);
180
- }, [setFormError]);
183
+ });
181
184
  useImperativeHandle(ref, function () {
182
185
  return {
183
186
  root: rootRef.current,
@@ -190,7 +193,7 @@ var Form = /*#__PURE__*/React.forwardRef(function (props, ref) {
190
193
  resetErrors: resetErrors
191
194
  };
192
195
  });
193
- var removeFieldError = useCallback(function (name) {
196
+ var removeFieldError = useEventCallback(function (name) {
194
197
  /**
195
198
  * when this function is called when the children component is unmount, it's an old render frame
196
199
  * so use Ref to get future error
@@ -199,8 +202,8 @@ var Form = /*#__PURE__*/React.forwardRef(function (props, ref) {
199
202
  realFormErrorRef.current = formError;
200
203
  setFormError(formError);
201
204
  onCheck === null || onCheck === void 0 ? void 0 : onCheck(formError);
202
- }, [onCheck, setFormError]);
203
- var removeFieldValue = useCallback(function (name) {
205
+ });
206
+ var removeFieldValue = useEventCallback(function (name) {
204
207
  /**
205
208
  * when this function is called when the children component is unmount, it's an old render frame
206
209
  * so use Ref to get future value
@@ -209,8 +212,8 @@ var Form = /*#__PURE__*/React.forwardRef(function (props, ref) {
209
212
  realFormValueRef.current = formValue;
210
213
  setFormValue(formValue);
211
214
  onChange === null || onChange === void 0 ? void 0 : onChange(formValue);
212
- }, [onChange, setFormValue]);
213
- var handleSubmit = useCallback(function (event) {
215
+ });
216
+ var handleSubmit = useEventCallback(function (event) {
214
217
  if (disabled || readOnly || plaintext) {
215
218
  return;
216
219
  }
@@ -218,24 +221,29 @@ var Form = /*#__PURE__*/React.forwardRef(function (props, ref) {
218
221
  event.stopPropagation();
219
222
  var checkStatus = check();
220
223
  onSubmit === null || onSubmit === void 0 ? void 0 : onSubmit(checkStatus, event);
221
- }, [disabled, readOnly, plaintext, check, onSubmit]);
222
- var handleFieldError = useCallback(function (name, errorMessage) {
224
+ });
225
+ var handleFieldError = useEventCallback(function (name, errorMessage) {
223
226
  var _extends4;
224
227
  var formError = _extends({}, realFormError, (_extends4 = {}, _extends4[name] = errorMessage, _extends4));
225
228
  setFormError(formError);
226
229
  onError === null || onError === void 0 ? void 0 : onError(formError);
227
230
  onCheck === null || onCheck === void 0 ? void 0 : onCheck(formError);
228
- }, [realFormError, setFormError, onError, onCheck]);
229
- var handleFieldSuccess = useCallback(function (name) {
231
+ });
232
+ var handleFieldSuccess = useEventCallback(function (name) {
230
233
  removeFieldError(name);
231
- }, [removeFieldError]);
232
- var handleFieldChange = useCallback(function (name, value, event) {
234
+ });
235
+ var setFieldValue = function setFieldValue(formValue, fieldName, fieldValue) {
233
236
  var _extends5;
234
- var formValue = realFormValue;
235
- var nextFormValue = _extends({}, formValue, (_extends5 = {}, _extends5[name] = value, _extends5));
237
+ if (nestedField) {
238
+ return set(_extends({}, formValue), fieldName, fieldValue);
239
+ }
240
+ return _extends({}, formValue, (_extends5 = {}, _extends5[fieldName] = fieldValue, _extends5));
241
+ };
242
+ var handleFieldChange = useEventCallback(function (name, value, event) {
243
+ var nextFormValue = setFieldValue(realFormValue, name, value);
236
244
  setFormValue(nextFormValue);
237
245
  onChange === null || onChange === void 0 ? void 0 : onChange(nextFormValue, event);
238
- }, [realFormValue, setFormValue, onChange]);
246
+ });
239
247
  var rootRef = useRef(null);
240
248
  var formContextValue = useMemo(function () {
241
249
  return {
@@ -246,6 +254,7 @@ var Form = /*#__PURE__*/React.forwardRef(function (props, ref) {
246
254
  plaintext: plaintext,
247
255
  disabled: disabled,
248
256
  formError: realFormError,
257
+ nestedField: nestedField,
249
258
  removeFieldValue: removeFieldValue,
250
259
  removeFieldError: removeFieldError,
251
260
  pushFieldRule: pushFieldRule,
@@ -254,7 +263,7 @@ var Form = /*#__PURE__*/React.forwardRef(function (props, ref) {
254
263
  onFieldError: handleFieldError,
255
264
  onFieldSuccess: handleFieldSuccess
256
265
  };
257
- }, [getCombinedModel, checkTrigger, errorFromContext, readOnly, plaintext, disabled, realFormError, removeFieldValue, removeFieldError, pushFieldRule, removeFieldRule, handleFieldChange, handleFieldError, handleFieldSuccess]);
266
+ }, [getCombinedModel, checkTrigger, errorFromContext, readOnly, plaintext, disabled, realFormError, nestedField, removeFieldValue, removeFieldError, pushFieldRule, removeFieldRule, handleFieldChange, handleFieldError, handleFieldSuccess]);
258
267
  return /*#__PURE__*/React.createElement("form", _extends({}, rest, {
259
268
  ref: rootRef,
260
269
  onSubmit: handleSubmit,
@@ -7,6 +7,7 @@ interface TrulyFormContextValue<T = Record<string, any>, errorMsgType = any, E =
7
7
  }> {
8
8
  getCombinedModel: () => Schema;
9
9
  formError: E;
10
+ nestedField: boolean;
10
11
  removeFieldValue: (name: string) => void;
11
12
  removeFieldError: (name: string) => void;
12
13
  pushFieldRule: (name: string, fieldRule: FieldRuleType) => void;
@@ -9,7 +9,17 @@ export declare type FormControlAccepterProps<ValueType = any> = FormControlBaseP
9
9
  export interface FormControlProps<P = any, ValueType = any> extends WithAsProps, Omit<React.HTMLAttributes<HTMLFormElement>, 'value' | 'onChange'> {
10
10
  /** Proxied components */
11
11
  accepter?: React.ElementType<P & FormControlBaseProps<ValueType>>;
12
- /** The name of form-control */
12
+ /**
13
+ * The name of form-control, support nested path. such as `address.city`.
14
+ * The path will be used to get and set form values.
15
+ *
16
+ * @example
17
+ * ```js
18
+ * <Form formValue={{ address: { city: 'Shanghai' } }}>
19
+ * <FormControl name="address.city" />
20
+ * </Form>
21
+ * ```
22
+ **/
13
23
  name: string;
14
24
  /** Value */
15
25
  value?: ValueType;
@@ -6,12 +6,14 @@ var _templateObject;
6
6
  import React, { useContext } from 'react';
7
7
  import PropTypes from 'prop-types';
8
8
  import isUndefined from 'lodash/isUndefined';
9
+ import get from 'lodash/get';
10
+ import set from 'lodash/set';
9
11
  import Input from '../Input';
10
12
  import FormErrorMessage from '../FormErrorMessage';
11
13
  import { useClassNames } from '../utils';
12
14
  import FormContext, { FormValueContext } from '../Form/FormContext';
13
15
  import { FormGroupContext } from '../FormGroup/FormGroup';
14
- import { useWillUnmount } from '../utils';
16
+ import { useWillUnmount, useEventCallback } from '../utils';
15
17
  import useRegisterModel from './useRegisterModel';
16
18
  import Toggle from '../Toggle';
17
19
 
@@ -31,6 +33,7 @@ var FormControl = /*#__PURE__*/React.forwardRef(function (props, ref) {
31
33
  disabledContext = _useContext.disabled,
32
34
  errorFromContext = _useContext.errorFromContext,
33
35
  formError = _useContext.formError,
36
+ nestedField = _useContext.nestedField,
34
37
  removeFieldValue = _useContext.removeFieldValue,
35
38
  removeFieldError = _useContext.removeFieldError,
36
39
  pushFieldRule = _useContext.pushFieldRule,
@@ -80,47 +83,67 @@ var FormControl = /*#__PURE__*/React.forwardRef(function (props, ref) {
80
83
  });
81
84
  var trigger = checkTrigger || contextCheckTrigger;
82
85
  var formValue = useContext(FormValueContext);
83
- var val = isUndefined(value) ? formValue === null || formValue === void 0 ? void 0 : formValue[name] : value;
86
+ var getFieldValue = function getFieldValue(fieldName) {
87
+ if (!isUndefined(value)) {
88
+ return value;
89
+ }
90
+ return nestedField ? get(formValue, fieldName) : formValue === null || formValue === void 0 ? void 0 : formValue[name];
91
+ };
92
+ var setFieldValue = function setFieldValue(fieldName, fieldValue) {
93
+ var _extends2;
94
+ if (nestedField) {
95
+ return set(_extends({}, formValue), fieldName, fieldValue);
96
+ }
97
+ return _extends({}, formValue, (_extends2 = {}, _extends2[fieldName] = fieldValue, _extends2));
98
+ };
99
+ var getFieldError = function getFieldError(fieldName) {
100
+ if (nestedField) {
101
+ var _name = fieldName.includes('.') ? fieldName.replace('.', '.object.') + '.errorMessage' : fieldName;
102
+ return get(formError, _name);
103
+ }
104
+ return formError === null || formError === void 0 ? void 0 : formError[fieldName];
105
+ };
106
+ var fieldValue = getFieldValue(name);
84
107
  var _useClassNames = useClassNames(classPrefix),
85
108
  withClassPrefix = _useClassNames.withClassPrefix,
86
109
  prefix = _useClassNames.prefix;
87
110
  var classes = withClassPrefix('wrapper');
88
- var handleFieldChange = function handleFieldChange(value, event) {
111
+ var handleFieldChange = useEventCallback(function (value, event) {
89
112
  handleFieldCheck(value, trigger === 'change');
90
113
  onFieldChange === null || onFieldChange === void 0 ? void 0 : onFieldChange(name, value, event);
91
114
  onChange === null || onChange === void 0 ? void 0 : onChange(value, event);
92
- };
93
- var handleFieldBlur = function handleFieldBlur(event) {
94
- handleFieldCheck(val, trigger === 'blur');
115
+ });
116
+ var handleFieldBlur = useEventCallback(function (event) {
117
+ handleFieldCheck(fieldValue, trigger === 'blur');
95
118
  onBlur === null || onBlur === void 0 ? void 0 : onBlur(event);
96
- };
97
- var handleFieldCheck = function handleFieldCheck(value, isCheckTrigger) {
98
- var _extends2;
119
+ });
120
+ var handleFieldCheck = useEventCallback(function (value, isCheckTrigger) {
121
+ var checkFieldName = nestedField ? name.split('.')[0] : name;
99
122
  var callbackEvents = function callbackEvents(checkResult) {
100
123
  // The relevant event is triggered only when the inspection is allowed.
101
124
  if (isCheckTrigger) {
102
125
  if (checkResult.hasError) {
103
- onFieldError === null || onFieldError === void 0 ? void 0 : onFieldError(name, (checkResult === null || checkResult === void 0 ? void 0 : checkResult.errorMessage) || checkResult);
126
+ onFieldError === null || onFieldError === void 0 ? void 0 : onFieldError(checkFieldName, (checkResult === null || checkResult === void 0 ? void 0 : checkResult.errorMessage) || checkResult);
104
127
  } else {
105
- onFieldSuccess === null || onFieldSuccess === void 0 ? void 0 : onFieldSuccess(name);
128
+ onFieldSuccess === null || onFieldSuccess === void 0 ? void 0 : onFieldSuccess(checkFieldName);
106
129
  }
107
130
  }
108
131
  return checkResult;
109
132
  };
110
- var nextFormValue = _extends({}, formValue, (_extends2 = {}, _extends2[name] = value, _extends2));
133
+ var nextFormValue = setFieldValue(name, value);
111
134
  var model = getCombinedModel();
112
135
  if (checkAsync) {
113
- return model === null || model === void 0 ? void 0 : model.checkForFieldAsync(name, nextFormValue).then(function (checkResult) {
136
+ return model === null || model === void 0 ? void 0 : model.checkForFieldAsync(checkFieldName, nextFormValue).then(function (checkResult) {
114
137
  return callbackEvents(checkResult);
115
138
  });
116
139
  }
117
- return Promise.resolve(callbackEvents(model === null || model === void 0 ? void 0 : model.checkForField(name, nextFormValue)));
118
- };
140
+ return Promise.resolve(callbackEvents(model === null || model === void 0 ? void 0 : model.checkForField(checkFieldName, nextFormValue)));
141
+ });
119
142
  var messageNode = null;
120
143
  if (!isUndefined(errorMessage)) {
121
144
  messageNode = errorMessage;
122
145
  } else if (errorFromContext) {
123
- var fieldError = formError === null || formError === void 0 ? void 0 : formError[name];
146
+ var fieldError = getFieldError(name);
124
147
  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) {
125
148
  messageNode = fieldError;
126
149
  }
@@ -134,7 +157,7 @@ var FormControl = /*#__PURE__*/React.forwardRef(function (props, ref) {
134
157
  if (AccepterComponent === Toggle) {
135
158
  valueKey = 'checked';
136
159
  }
137
- var accepterProps = (_accepterProps = {}, _accepterProps[valueKey] = val === undefined ? defaultValue : val, _accepterProps);
160
+ var accepterProps = (_accepterProps = {}, _accepterProps[valueKey] = fieldValue === undefined ? defaultValue : fieldValue, _accepterProps);
138
161
  return /*#__PURE__*/React.createElement(Component, {
139
162
  className: classes,
140
163
  ref: ref,
@@ -153,7 +176,7 @@ var FormControl = /*#__PURE__*/React.forwardRef(function (props, ref) {
153
176
  onChange: handleFieldChange,
154
177
  onBlur: handleFieldBlur
155
178
  })), /*#__PURE__*/React.createElement(FormErrorMessage, {
156
- id: controlId + "-error-message",
179
+ id: controlId ? controlId + "-error-message" : undefined,
157
180
  role: "alert",
158
181
  "aria-relevant": "all",
159
182
  show: !!messageNode,
@@ -3,7 +3,7 @@ import _extends from "@babel/runtime/helpers/esm/extends";
3
3
  import _objectWithoutPropertiesLoose from "@babel/runtime/helpers/esm/objectWithoutPropertiesLoose";
4
4
  import React, { useMemo } from 'react';
5
5
  import PropTypes from 'prop-types';
6
- import { useClassNames } from '../utils';
6
+ import { useClassNames, useUniqueId } from '../utils';
7
7
  export var FormGroupContext = /*#__PURE__*/React.createContext({});
8
8
 
9
9
  /**
@@ -15,13 +15,14 @@ var FormGroup = /*#__PURE__*/React.forwardRef(function (props, ref) {
15
15
  Component = _props$as === void 0 ? 'div' : _props$as,
16
16
  _props$classPrefix = props.classPrefix,
17
17
  classPrefix = _props$classPrefix === void 0 ? 'form-group' : _props$classPrefix,
18
- controlId = props.controlId,
18
+ controlIdProp = props.controlId,
19
19
  className = props.className,
20
20
  rest = _objectWithoutPropertiesLoose(props, ["as", "classPrefix", "controlId", "className"]);
21
21
  var _useClassNames = useClassNames(classPrefix),
22
22
  withClassPrefix = _useClassNames.withClassPrefix,
23
23
  merge = _useClassNames.merge;
24
24
  var classes = merge(className, withClassPrefix());
25
+ var controlId = useUniqueId('rs-', controlIdProp);
25
26
  var contextValue = useMemo(function () {
26
27
  return {
27
28
  controlId: controlId