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;
@@ -9,29 +9,31 @@ function getSafeCalendarDate(_ref) {
9
9
  var _value;
10
10
  var value = _ref.value,
11
11
  _ref$calendarKey = _ref.calendarKey,
12
- calendarKey = _ref$calendarKey === void 0 ? 'start' : _ref$calendarKey;
12
+ calendarKey = _ref$calendarKey === void 0 ? 'start' : _ref$calendarKey,
13
+ allowAameMonth = _ref.allowAameMonth;
13
14
  // Update calendarDate if the value is not null
14
15
  value = (_value = value) !== null && _value !== void 0 ? _value : [];
16
+ var gap = allowAameMonth ? 0 : 1;
15
17
  if (value[0] && value[1]) {
16
18
  var diffMonth = (0, _dateUtils.differenceInCalendarMonths)(value[1], value[0]);
17
19
  if (calendarKey === 'start') {
18
20
  return [value[0], diffMonth <= 0 ? (0, _dateUtils.copyTime)({
19
21
  from: value[1],
20
- to: (0, _dateUtils.addMonths)(value[0], 1)
22
+ to: (0, _dateUtils.addMonths)(value[0], gap)
21
23
  }) : value[1]];
22
24
  } else if (calendarKey === 'end') {
23
25
  return [diffMonth <= 0 ? (0, _dateUtils.copyTime)({
24
26
  from: value[0],
25
- to: (0, _dateUtils.addMonths)(value[1], -1)
27
+ to: (0, _dateUtils.addMonths)(value[1], -gap)
26
28
  }) : value[0], value[1]];
27
29
  }
28
30
 
29
31
  // If only the start date
30
32
  } else if (value[0]) {
31
- return [value[0], (0, _dateUtils.addMonths)(value[0], 1)];
33
+ return [value[0], (0, _dateUtils.addMonths)(value[0], gap)];
32
34
  }
33
35
  var todayDate = new Date();
34
- return [todayDate, (0, _dateUtils.addMonths)(todayDate, 1)];
36
+ return [todayDate, (0, _dateUtils.addMonths)(todayDate, gap)];
35
37
  }
36
38
  var isSameRange = function isSameRange(source, dest, format) {
37
39
  // 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/cjs/Form/Form.js CHANGED
@@ -10,6 +10,7 @@ var _objectWithoutPropertiesLoose2 = _interopRequireDefault(require("@babel/runt
10
10
  var _react = _interopRequireWildcard(require("react"));
11
11
  var _propTypes = _interopRequireDefault(require("prop-types"));
12
12
  var _omit = _interopRequireDefault(require("lodash/omit"));
13
+ var _set = _interopRequireDefault(require("lodash/set"));
13
14
  var _schemaTyped = require("schema-typed");
14
15
  var _FormContext = _interopRequireWildcard(require("./FormContext"));
15
16
  var _FormControl = _interopRequireDefault(require("../FormControl"));
@@ -36,6 +37,8 @@ var Form = /*#__PURE__*/_react.default.forwardRef(function (props, ref) {
36
37
  formValue = props.formValue,
37
38
  formError = props.formError,
38
39
  fluid = props.fluid,
40
+ _props$nestedField = props.nestedField,
41
+ nestedField = _props$nestedField === void 0 ? false : _props$nestedField,
39
42
  _props$layout = props.layout,
40
43
  layout = _props$layout === void 0 ? 'vertical' : _props$layout,
41
44
  _props$model = props.model,
@@ -49,7 +52,7 @@ var Form = /*#__PURE__*/_react.default.forwardRef(function (props, ref) {
49
52
  onCheck = props.onCheck,
50
53
  onError = props.onError,
51
54
  onChange = props.onChange,
52
- rest = (0, _objectWithoutPropertiesLoose2.default)(props, ["checkTrigger", "classPrefix", "errorFromContext", "formDefaultValue", "formValue", "formError", "fluid", "layout", "model", "readOnly", "plaintext", "className", "children", "disabled", "onSubmit", "onCheck", "onError", "onChange"]);
55
+ rest = (0, _objectWithoutPropertiesLoose2.default)(props, ["checkTrigger", "classPrefix", "errorFromContext", "formDefaultValue", "formValue", "formError", "fluid", "nestedField", "layout", "model", "readOnly", "plaintext", "className", "children", "disabled", "onSubmit", "onCheck", "onError", "onChange"]);
53
56
  var _useSchemaModel = (0, _useSchemaModel2.default)(formModel),
54
57
  getCombinedModel = _useSchemaModel.getCombinedModel,
55
58
  pushFieldRule = _useSchemaModel.pushFieldRule,
@@ -79,7 +82,7 @@ var Form = /*#__PURE__*/_react.default.forwardRef(function (props, ref) {
79
82
  * The error message after verification is returned in the callback.
80
83
  * @param callback
81
84
  */
82
- var check = (0, _react.useCallback)(function (callback) {
85
+ var check = (0, _utils.useEventCallback)(function (callback) {
83
86
  var formValue = realFormValue || {};
84
87
  var formError = {};
85
88
  var errorCount = 0;
@@ -99,14 +102,14 @@ var Form = /*#__PURE__*/_react.default.forwardRef(function (props, ref) {
99
102
  return false;
100
103
  }
101
104
  return true;
102
- }, [realFormValue, getCombinedModel, setFormError, onCheck, onError]);
105
+ });
103
106
 
104
107
  /**
105
108
  * Check the data field
106
109
  * @param fieldName
107
110
  * @param callback
108
111
  */
109
- var checkForField = (0, _react.useCallback)(function (fieldName, callback) {
112
+ var checkForField = (0, _utils.useEventCallback)(function (fieldName, callback) {
110
113
  var _extends2;
111
114
  var formValue = realFormValue || {};
112
115
  var model = getCombinedModel();
@@ -119,12 +122,12 @@ var Form = /*#__PURE__*/_react.default.forwardRef(function (props, ref) {
119
122
  onError === null || onError === void 0 ? void 0 : onError(formError);
120
123
  }
121
124
  return !checkResult.hasError;
122
- }, [realFormValue, getCombinedModel, realFormError, setFormError, onCheck, onError]);
125
+ });
123
126
 
124
127
  /**
125
128
  * Check form data asynchronously and return a Promise
126
129
  */
127
- var checkAsync = (0, _react.useCallback)(function () {
130
+ var checkAsync = (0, _utils.useEventCallback)(function () {
128
131
  var formValue = realFormValue || {};
129
132
  var promises = [];
130
133
  var keys = [];
@@ -152,13 +155,13 @@ var Form = /*#__PURE__*/_react.default.forwardRef(function (props, ref) {
152
155
  formError: formError
153
156
  };
154
157
  });
155
- }, [realFormValue, getCombinedModel, onCheck, setFormError, onError]);
158
+ });
156
159
 
157
160
  /**
158
161
  * Asynchronously check form fields and return Promise
159
162
  * @param fieldName
160
163
  */
161
- var checkForFieldAsync = (0, _react.useCallback)(function (fieldName) {
164
+ var checkForFieldAsync = (0, _utils.useEventCallback)(function (fieldName) {
162
165
  var formValue = realFormValue || {};
163
166
  var model = getCombinedModel();
164
167
  return model.checkForFieldAsync(fieldName, formValue).then(function (checkResult) {
@@ -171,19 +174,19 @@ var Form = /*#__PURE__*/_react.default.forwardRef(function (props, ref) {
171
174
  }
172
175
  return checkResult;
173
176
  });
174
- }, [realFormValue, getCombinedModel, realFormError, onCheck, setFormError, onError]);
175
- var cleanErrors = (0, _react.useCallback)(function () {
177
+ });
178
+ var cleanErrors = (0, _utils.useEventCallback)(function () {
176
179
  setFormError({});
177
- }, [setFormError]);
178
- var cleanErrorForField = (0, _react.useCallback)(function (fieldName) {
180
+ });
181
+ var cleanErrorForField = (0, _utils.useEventCallback)(function (fieldName) {
179
182
  setFormError((0, _omit.default)(realFormError, [fieldName]));
180
- }, [realFormError, setFormError]);
181
- var resetErrors = (0, _react.useCallback)(function (formError) {
183
+ });
184
+ var resetErrors = (0, _utils.useEventCallback)(function (formError) {
182
185
  if (formError === void 0) {
183
186
  formError = {};
184
187
  }
185
188
  setFormError(formError);
186
- }, [setFormError]);
189
+ });
187
190
  (0, _react.useImperativeHandle)(ref, function () {
188
191
  return {
189
192
  root: rootRef.current,
@@ -196,7 +199,7 @@ var Form = /*#__PURE__*/_react.default.forwardRef(function (props, ref) {
196
199
  resetErrors: resetErrors
197
200
  };
198
201
  });
199
- var removeFieldError = (0, _react.useCallback)(function (name) {
202
+ var removeFieldError = (0, _utils.useEventCallback)(function (name) {
200
203
  /**
201
204
  * when this function is called when the children component is unmount, it's an old render frame
202
205
  * so use Ref to get future error
@@ -205,8 +208,8 @@ var Form = /*#__PURE__*/_react.default.forwardRef(function (props, ref) {
205
208
  realFormErrorRef.current = formError;
206
209
  setFormError(formError);
207
210
  onCheck === null || onCheck === void 0 ? void 0 : onCheck(formError);
208
- }, [onCheck, setFormError]);
209
- var removeFieldValue = (0, _react.useCallback)(function (name) {
211
+ });
212
+ var removeFieldValue = (0, _utils.useEventCallback)(function (name) {
210
213
  /**
211
214
  * when this function is called when the children component is unmount, it's an old render frame
212
215
  * so use Ref to get future value
@@ -215,8 +218,8 @@ var Form = /*#__PURE__*/_react.default.forwardRef(function (props, ref) {
215
218
  realFormValueRef.current = formValue;
216
219
  setFormValue(formValue);
217
220
  onChange === null || onChange === void 0 ? void 0 : onChange(formValue);
218
- }, [onChange, setFormValue]);
219
- var handleSubmit = (0, _react.useCallback)(function (event) {
221
+ });
222
+ var handleSubmit = (0, _utils.useEventCallback)(function (event) {
220
223
  if (disabled || readOnly || plaintext) {
221
224
  return;
222
225
  }
@@ -224,24 +227,29 @@ var Form = /*#__PURE__*/_react.default.forwardRef(function (props, ref) {
224
227
  event.stopPropagation();
225
228
  var checkStatus = check();
226
229
  onSubmit === null || onSubmit === void 0 ? void 0 : onSubmit(checkStatus, event);
227
- }, [disabled, readOnly, plaintext, check, onSubmit]);
228
- var handleFieldError = (0, _react.useCallback)(function (name, errorMessage) {
230
+ });
231
+ var handleFieldError = (0, _utils.useEventCallback)(function (name, errorMessage) {
229
232
  var _extends4;
230
233
  var formError = (0, _extends6.default)({}, realFormError, (_extends4 = {}, _extends4[name] = errorMessage, _extends4));
231
234
  setFormError(formError);
232
235
  onError === null || onError === void 0 ? void 0 : onError(formError);
233
236
  onCheck === null || onCheck === void 0 ? void 0 : onCheck(formError);
234
- }, [realFormError, setFormError, onError, onCheck]);
235
- var handleFieldSuccess = (0, _react.useCallback)(function (name) {
237
+ });
238
+ var handleFieldSuccess = (0, _utils.useEventCallback)(function (name) {
236
239
  removeFieldError(name);
237
- }, [removeFieldError]);
238
- var handleFieldChange = (0, _react.useCallback)(function (name, value, event) {
240
+ });
241
+ var setFieldValue = function setFieldValue(formValue, fieldName, fieldValue) {
239
242
  var _extends5;
240
- var formValue = realFormValue;
241
- var nextFormValue = (0, _extends6.default)({}, formValue, (_extends5 = {}, _extends5[name] = value, _extends5));
243
+ if (nestedField) {
244
+ return (0, _set.default)((0, _extends6.default)({}, formValue), fieldName, fieldValue);
245
+ }
246
+ return (0, _extends6.default)({}, formValue, (_extends5 = {}, _extends5[fieldName] = fieldValue, _extends5));
247
+ };
248
+ var handleFieldChange = (0, _utils.useEventCallback)(function (name, value, event) {
249
+ var nextFormValue = setFieldValue(realFormValue, name, value);
242
250
  setFormValue(nextFormValue);
243
251
  onChange === null || onChange === void 0 ? void 0 : onChange(nextFormValue, event);
244
- }, [realFormValue, setFormValue, onChange]);
252
+ });
245
253
  var rootRef = (0, _react.useRef)(null);
246
254
  var formContextValue = (0, _react.useMemo)(function () {
247
255
  return {
@@ -252,6 +260,7 @@ var Form = /*#__PURE__*/_react.default.forwardRef(function (props, ref) {
252
260
  plaintext: plaintext,
253
261
  disabled: disabled,
254
262
  formError: realFormError,
263
+ nestedField: nestedField,
255
264
  removeFieldValue: removeFieldValue,
256
265
  removeFieldError: removeFieldError,
257
266
  pushFieldRule: pushFieldRule,
@@ -260,7 +269,7 @@ var Form = /*#__PURE__*/_react.default.forwardRef(function (props, ref) {
260
269
  onFieldError: handleFieldError,
261
270
  onFieldSuccess: handleFieldSuccess
262
271
  };
263
- }, [getCombinedModel, checkTrigger, errorFromContext, readOnly, plaintext, disabled, realFormError, removeFieldValue, removeFieldError, pushFieldRule, removeFieldRule, handleFieldChange, handleFieldError, handleFieldSuccess]);
272
+ }, [getCombinedModel, checkTrigger, errorFromContext, readOnly, plaintext, disabled, realFormError, nestedField, removeFieldValue, removeFieldError, pushFieldRule, removeFieldRule, handleFieldChange, handleFieldError, handleFieldSuccess]);
264
273
  return /*#__PURE__*/_react.default.createElement("form", (0, _extends6.default)({}, rest, {
265
274
  ref: rootRef,
266
275
  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;
@@ -11,6 +11,8 @@ var _objectWithoutPropertiesLoose2 = _interopRequireDefault(require("@babel/runt
11
11
  var _react = _interopRequireWildcard(require("react"));
12
12
  var _propTypes = _interopRequireDefault(require("prop-types"));
13
13
  var _isUndefined = _interopRequireDefault(require("lodash/isUndefined"));
14
+ var _get = _interopRequireDefault(require("lodash/get"));
15
+ var _set = _interopRequireDefault(require("lodash/set"));
14
16
  var _Input = _interopRequireDefault(require("../Input"));
15
17
  var _FormErrorMessage = _interopRequireDefault(require("../FormErrorMessage"));
16
18
  var _utils = require("../utils");
@@ -35,6 +37,7 @@ var FormControl = /*#__PURE__*/_react.default.forwardRef(function (props, ref) {
35
37
  disabledContext = _useContext.disabled,
36
38
  errorFromContext = _useContext.errorFromContext,
37
39
  formError = _useContext.formError,
40
+ nestedField = _useContext.nestedField,
38
41
  removeFieldValue = _useContext.removeFieldValue,
39
42
  removeFieldError = _useContext.removeFieldError,
40
43
  pushFieldRule = _useContext.pushFieldRule,
@@ -84,47 +87,67 @@ var FormControl = /*#__PURE__*/_react.default.forwardRef(function (props, ref) {
84
87
  });
85
88
  var trigger = checkTrigger || contextCheckTrigger;
86
89
  var formValue = (0, _react.useContext)(_FormContext.FormValueContext);
87
- var val = (0, _isUndefined.default)(value) ? formValue === null || formValue === void 0 ? void 0 : formValue[name] : value;
90
+ var getFieldValue = function getFieldValue(fieldName) {
91
+ if (!(0, _isUndefined.default)(value)) {
92
+ return value;
93
+ }
94
+ return nestedField ? (0, _get.default)(formValue, fieldName) : formValue === null || formValue === void 0 ? void 0 : formValue[name];
95
+ };
96
+ var setFieldValue = function setFieldValue(fieldName, fieldValue) {
97
+ var _extends2;
98
+ if (nestedField) {
99
+ return (0, _set.default)((0, _extends3.default)({}, formValue), fieldName, fieldValue);
100
+ }
101
+ return (0, _extends3.default)({}, formValue, (_extends2 = {}, _extends2[fieldName] = fieldValue, _extends2));
102
+ };
103
+ var getFieldError = function getFieldError(fieldName) {
104
+ if (nestedField) {
105
+ var _name = fieldName.includes('.') ? fieldName.replace('.', '.object.') + '.errorMessage' : fieldName;
106
+ return (0, _get.default)(formError, _name);
107
+ }
108
+ return formError === null || formError === void 0 ? void 0 : formError[fieldName];
109
+ };
110
+ var fieldValue = getFieldValue(name);
88
111
  var _useClassNames = (0, _utils.useClassNames)(classPrefix),
89
112
  withClassPrefix = _useClassNames.withClassPrefix,
90
113
  prefix = _useClassNames.prefix;
91
114
  var classes = withClassPrefix('wrapper');
92
- var handleFieldChange = function handleFieldChange(value, event) {
115
+ var handleFieldChange = (0, _utils.useEventCallback)(function (value, event) {
93
116
  handleFieldCheck(value, trigger === 'change');
94
117
  onFieldChange === null || onFieldChange === void 0 ? void 0 : onFieldChange(name, value, event);
95
118
  onChange === null || onChange === void 0 ? void 0 : onChange(value, event);
96
- };
97
- var handleFieldBlur = function handleFieldBlur(event) {
98
- handleFieldCheck(val, trigger === 'blur');
119
+ });
120
+ var handleFieldBlur = (0, _utils.useEventCallback)(function (event) {
121
+ handleFieldCheck(fieldValue, trigger === 'blur');
99
122
  onBlur === null || onBlur === void 0 ? void 0 : onBlur(event);
100
- };
101
- var handleFieldCheck = function handleFieldCheck(value, isCheckTrigger) {
102
- var _extends2;
123
+ });
124
+ var handleFieldCheck = (0, _utils.useEventCallback)(function (value, isCheckTrigger) {
125
+ var checkFieldName = nestedField ? name.split('.')[0] : name;
103
126
  var callbackEvents = function callbackEvents(checkResult) {
104
127
  // The relevant event is triggered only when the inspection is allowed.
105
128
  if (isCheckTrigger) {
106
129
  if (checkResult.hasError) {
107
- onFieldError === null || onFieldError === void 0 ? void 0 : onFieldError(name, (checkResult === null || checkResult === void 0 ? void 0 : checkResult.errorMessage) || checkResult);
130
+ onFieldError === null || onFieldError === void 0 ? void 0 : onFieldError(checkFieldName, (checkResult === null || checkResult === void 0 ? void 0 : checkResult.errorMessage) || checkResult);
108
131
  } else {
109
- onFieldSuccess === null || onFieldSuccess === void 0 ? void 0 : onFieldSuccess(name);
132
+ onFieldSuccess === null || onFieldSuccess === void 0 ? void 0 : onFieldSuccess(checkFieldName);
110
133
  }
111
134
  }
112
135
  return checkResult;
113
136
  };
114
- var nextFormValue = (0, _extends3.default)({}, formValue, (_extends2 = {}, _extends2[name] = value, _extends2));
137
+ var nextFormValue = setFieldValue(name, value);
115
138
  var model = getCombinedModel();
116
139
  if (checkAsync) {
117
- return model === null || model === void 0 ? void 0 : model.checkForFieldAsync(name, nextFormValue).then(function (checkResult) {
140
+ return model === null || model === void 0 ? void 0 : model.checkForFieldAsync(checkFieldName, nextFormValue).then(function (checkResult) {
118
141
  return callbackEvents(checkResult);
119
142
  });
120
143
  }
121
- return Promise.resolve(callbackEvents(model === null || model === void 0 ? void 0 : model.checkForField(name, nextFormValue)));
122
- };
144
+ return Promise.resolve(callbackEvents(model === null || model === void 0 ? void 0 : model.checkForField(checkFieldName, nextFormValue)));
145
+ });
123
146
  var messageNode = null;
124
147
  if (!(0, _isUndefined.default)(errorMessage)) {
125
148
  messageNode = errorMessage;
126
149
  } else if (errorFromContext) {
127
- var fieldError = formError === null || formError === void 0 ? void 0 : formError[name];
150
+ var fieldError = getFieldError(name);
128
151
  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) {
129
152
  messageNode = fieldError;
130
153
  }
@@ -138,7 +161,7 @@ var FormControl = /*#__PURE__*/_react.default.forwardRef(function (props, ref) {
138
161
  if (AccepterComponent === _Toggle.default) {
139
162
  valueKey = 'checked';
140
163
  }
141
- var accepterProps = (_accepterProps = {}, _accepterProps[valueKey] = val === undefined ? defaultValue : val, _accepterProps);
164
+ var accepterProps = (_accepterProps = {}, _accepterProps[valueKey] = fieldValue === undefined ? defaultValue : fieldValue, _accepterProps);
142
165
  return /*#__PURE__*/_react.default.createElement(Component, {
143
166
  className: classes,
144
167
  ref: ref,
@@ -157,7 +180,7 @@ var FormControl = /*#__PURE__*/_react.default.forwardRef(function (props, ref) {
157
180
  onChange: handleFieldChange,
158
181
  onBlur: handleFieldBlur
159
182
  })), /*#__PURE__*/_react.default.createElement(_FormErrorMessage.default, {
160
- id: controlId + "-error-message",
183
+ id: controlId ? controlId + "-error-message" : undefined,
161
184
  role: "alert",
162
185
  "aria-relevant": "all",
163
186
  show: !!messageNode,
@@ -22,13 +22,14 @@ var FormGroup = /*#__PURE__*/_react.default.forwardRef(function (props, ref) {
22
22
  Component = _props$as === void 0 ? 'div' : _props$as,
23
23
  _props$classPrefix = props.classPrefix,
24
24
  classPrefix = _props$classPrefix === void 0 ? 'form-group' : _props$classPrefix,
25
- controlId = props.controlId,
25
+ controlIdProp = props.controlId,
26
26
  className = props.className,
27
27
  rest = (0, _objectWithoutPropertiesLoose2.default)(props, ["as", "classPrefix", "controlId", "className"]);
28
28
  var _useClassNames = (0, _utils.useClassNames)(classPrefix),
29
29
  withClassPrefix = _useClassNames.withClassPrefix,
30
30
  merge = _useClassNames.merge;
31
31
  var classes = merge(className, withClassPrefix());
32
+ var controlId = (0, _utils.useUniqueId)('rs-', controlIdProp);
32
33
  var contextValue = (0, _react.useMemo)(function () {
33
34
  return {
34
35
  controlId: controlId