rsuite 5.50.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 (177) hide show
  1. package/CHANGELOG.md +11 -0
  2. package/CheckTreePicker/styles/index.less +3 -3
  3. package/DatePicker/styles/index.less +1 -1
  4. package/Form/styles/mixin.less +1 -2
  5. package/InputGroup/styles/index.less +0 -14
  6. package/InputPicker/styles/index.less +1 -1
  7. package/Picker/styles/index.less +2 -2
  8. package/Picker/styles/mixin.less +3 -3
  9. package/TagInput/styles/index.less +1 -1
  10. package/TagPicker/styles/index.less +5 -1
  11. package/TreePicker/styles/index.less +2 -2
  12. package/cjs/@types/common.d.ts +8 -0
  13. package/cjs/AutoComplete/AutoComplete.js +14 -11
  14. package/cjs/AutoComplete/Combobox.d.ts +8 -0
  15. package/cjs/AutoComplete/Combobox.js +31 -0
  16. package/cjs/Calendar/CalendarContainer.js +35 -37
  17. package/cjs/Cascader/Cascader.js +12 -11
  18. package/cjs/Cascader/DropdownMenu.d.ts +3 -20
  19. package/cjs/Cascader/DropdownMenu.js +48 -48
  20. package/cjs/Cascader/TreeView.d.ts +24 -0
  21. package/cjs/Cascader/TreeView.js +174 -0
  22. package/cjs/CheckPicker/CheckPicker.js +9 -8
  23. package/cjs/CheckTreePicker/CheckTreeNode.d.ts +2 -2
  24. package/cjs/CheckTreePicker/CheckTreeNode.js +31 -59
  25. package/cjs/CheckTreePicker/CheckTreePicker.js +20 -20
  26. package/cjs/DatePicker/DatePicker.js +5 -6
  27. package/cjs/DateRangePicker/DateRangePicker.js +3 -4
  28. package/cjs/Form/Form.d.ts +14 -0
  29. package/cjs/Form/Form.js +39 -30
  30. package/cjs/Form/FormContext.d.ts +1 -0
  31. package/cjs/FormControl/FormControl.js +40 -18
  32. package/cjs/FormGroup/FormGroup.js +2 -1
  33. package/cjs/InputPicker/InputPicker.js +46 -29
  34. package/cjs/InputPicker/InputSearch.js +3 -15
  35. package/cjs/InputPicker/TagList.d.ts +3 -0
  36. package/cjs/InputPicker/TagList.js +29 -0
  37. package/cjs/InputPicker/TextBox.d.ts +18 -0
  38. package/cjs/InputPicker/TextBox.js +48 -0
  39. package/cjs/MultiCascader/MultiCascader.js +13 -10
  40. package/cjs/MultiCascader/{DropdownMenu.d.ts → TreeView.d.ts} +3 -3
  41. package/cjs/MultiCascader/{DropdownMenu.js → TreeView.js} +77 -74
  42. package/{esm/Picker/DropdownMenuCheckItem.d.ts → cjs/Picker/ListCheckItem.d.ts} +3 -3
  43. package/cjs/Picker/{DropdownMenuCheckItem.js → ListCheckItem.js} +14 -30
  44. package/{esm/Picker/DropdownMenuItem.d.ts → cjs/Picker/ListItem.d.ts} +4 -4
  45. package/cjs/Picker/{DropdownMenuItem.js → ListItem.js} +15 -24
  46. package/cjs/Picker/ListItemGroup.d.ts +6 -0
  47. package/cjs/Picker/{DropdownMenuGroup.js → ListItemGroup.js} +3 -9
  48. package/cjs/Picker/Listbox.d.ts +35 -0
  49. package/cjs/Picker/{DropdownMenu.js → Listbox.js} +49 -64
  50. package/cjs/Picker/{PickerOverlay.d.ts → PickerPopup.d.ts} +3 -3
  51. package/cjs/Picker/{PickerOverlay.js → PickerPopup.js} +9 -7
  52. package/cjs/Picker/PickerToggle.d.ts +1 -1
  53. package/cjs/Picker/PickerToggle.js +16 -9
  54. package/cjs/Picker/PickerToggleTrigger.d.ts +15 -0
  55. package/cjs/Picker/PickerToggleTrigger.js +21 -5
  56. package/cjs/Picker/SearchBar.js +7 -9
  57. package/cjs/Picker/TreeView.d.ts +7 -0
  58. package/cjs/Picker/TreeView.js +31 -0
  59. package/cjs/Picker/hooks/index.d.ts +6 -0
  60. package/cjs/Picker/hooks/index.js +18 -0
  61. package/cjs/Picker/hooks/useCombobox.d.ts +7 -0
  62. package/cjs/Picker/hooks/useCombobox.js +22 -0
  63. package/cjs/Picker/hooks/useFocusItemValue.d.ts +30 -0
  64. package/cjs/Picker/hooks/useFocusItemValue.js +246 -0
  65. package/cjs/Picker/hooks/usePickerClassName.d.ts +21 -0
  66. package/cjs/Picker/hooks/usePickerClassName.js +39 -0
  67. package/cjs/Picker/{usePickerRef.d.ts → hooks/usePickerRef.d.ts} +2 -2
  68. package/cjs/Picker/{usePickerRef.js → hooks/usePickerRef.js} +1 -1
  69. package/cjs/Picker/hooks/useSearch.d.ts +18 -0
  70. package/cjs/Picker/hooks/useSearch.js +57 -0
  71. package/cjs/Picker/hooks/useToggleKeyDownEvent.d.ts +25 -0
  72. package/cjs/Picker/hooks/useToggleKeyDownEvent.js +101 -0
  73. package/cjs/Picker/index.d.ts +7 -6
  74. package/cjs/Picker/index.js +26 -19
  75. package/cjs/Picker/propTypes.d.ts +0 -6
  76. package/cjs/Picker/propTypes.js +0 -5
  77. package/cjs/Picker/utils.d.ts +2 -96
  78. package/cjs/Picker/utils.js +1 -406
  79. package/cjs/SelectPicker/SelectPicker.js +8 -8
  80. package/cjs/TagInput/index.js +4 -0
  81. package/cjs/TreePicker/TreeNode.d.ts +2 -2
  82. package/cjs/TreePicker/TreeNode.js +22 -56
  83. package/cjs/TreePicker/TreePicker.js +19 -20
  84. package/dist/rsuite-no-reset-rtl.css +109 -117
  85. package/dist/rsuite-no-reset-rtl.min.css +1 -1
  86. package/dist/rsuite-no-reset-rtl.min.css.map +1 -1
  87. package/dist/rsuite-no-reset.css +109 -117
  88. package/dist/rsuite-no-reset.min.css +1 -1
  89. package/dist/rsuite-no-reset.min.css.map +1 -1
  90. package/dist/rsuite-rtl.css +109 -117
  91. package/dist/rsuite-rtl.min.css +1 -1
  92. package/dist/rsuite-rtl.min.css.map +1 -1
  93. package/dist/rsuite.css +109 -117
  94. package/dist/rsuite.js +184 -74
  95. package/dist/rsuite.js.map +1 -1
  96. package/dist/rsuite.min.css +1 -1
  97. package/dist/rsuite.min.css.map +1 -1
  98. package/dist/rsuite.min.js +1 -1
  99. package/dist/rsuite.min.js.map +1 -1
  100. package/esm/@types/common.d.ts +8 -0
  101. package/esm/AutoComplete/AutoComplete.js +15 -12
  102. package/esm/AutoComplete/Combobox.d.ts +8 -0
  103. package/esm/AutoComplete/Combobox.js +25 -0
  104. package/esm/Calendar/CalendarContainer.js +37 -39
  105. package/esm/Cascader/Cascader.js +13 -12
  106. package/esm/Cascader/DropdownMenu.d.ts +3 -20
  107. package/esm/Cascader/DropdownMenu.js +50 -49
  108. package/esm/Cascader/TreeView.d.ts +24 -0
  109. package/esm/Cascader/TreeView.js +167 -0
  110. package/esm/CheckPicker/CheckPicker.js +10 -9
  111. package/esm/CheckTreePicker/CheckTreeNode.d.ts +2 -2
  112. package/esm/CheckTreePicker/CheckTreeNode.js +33 -61
  113. package/esm/CheckTreePicker/CheckTreePicker.js +21 -21
  114. package/esm/DatePicker/DatePicker.js +5 -6
  115. package/esm/DateRangePicker/DateRangePicker.js +3 -4
  116. package/esm/Form/Form.d.ts +14 -0
  117. package/esm/Form/Form.js +41 -32
  118. package/esm/Form/FormContext.d.ts +1 -0
  119. package/esm/FormControl/FormControl.js +39 -17
  120. package/esm/FormGroup/FormGroup.js +3 -2
  121. package/esm/InputPicker/InputPicker.js +47 -30
  122. package/esm/InputPicker/InputSearch.js +4 -15
  123. package/esm/InputPicker/TagList.d.ts +3 -0
  124. package/esm/InputPicker/TagList.js +23 -0
  125. package/esm/InputPicker/TextBox.d.ts +18 -0
  126. package/esm/InputPicker/TextBox.js +42 -0
  127. package/esm/MultiCascader/MultiCascader.js +14 -11
  128. package/esm/MultiCascader/{DropdownMenu.d.ts → TreeView.d.ts} +3 -3
  129. package/esm/MultiCascader/{DropdownMenu.js → TreeView.js} +79 -75
  130. package/{cjs/Picker/DropdownMenuCheckItem.d.ts → esm/Picker/ListCheckItem.d.ts} +3 -3
  131. package/esm/Picker/{DropdownMenuCheckItem.js → ListCheckItem.js} +15 -30
  132. package/{cjs/Picker/DropdownMenuItem.d.ts → esm/Picker/ListItem.d.ts} +4 -4
  133. package/esm/Picker/{DropdownMenuItem.js → ListItem.js} +16 -24
  134. package/esm/Picker/ListItemGroup.d.ts +6 -0
  135. package/esm/Picker/{DropdownMenuGroup.js → ListItemGroup.js} +3 -9
  136. package/esm/Picker/Listbox.d.ts +35 -0
  137. package/esm/Picker/{DropdownMenu.js → Listbox.js} +50 -64
  138. package/esm/Picker/{PickerOverlay.d.ts → PickerPopup.d.ts} +3 -3
  139. package/esm/Picker/{PickerOverlay.js → PickerPopup.js} +10 -8
  140. package/esm/Picker/PickerToggle.d.ts +1 -1
  141. package/esm/Picker/PickerToggle.js +16 -9
  142. package/esm/Picker/PickerToggleTrigger.d.ts +15 -0
  143. package/esm/Picker/PickerToggleTrigger.js +20 -5
  144. package/esm/Picker/SearchBar.js +8 -9
  145. package/esm/Picker/TreeView.d.ts +7 -0
  146. package/esm/Picker/TreeView.js +25 -0
  147. package/esm/Picker/hooks/index.d.ts +6 -0
  148. package/esm/Picker/hooks/index.js +7 -0
  149. package/esm/Picker/hooks/useCombobox.d.ts +7 -0
  150. package/esm/Picker/hooks/useCombobox.js +17 -0
  151. package/esm/Picker/hooks/useFocusItemValue.d.ts +30 -0
  152. package/esm/Picker/hooks/useFocusItemValue.js +240 -0
  153. package/esm/Picker/hooks/usePickerClassName.d.ts +21 -0
  154. package/esm/Picker/hooks/usePickerClassName.js +33 -0
  155. package/esm/Picker/{usePickerRef.d.ts → hooks/usePickerRef.d.ts} +2 -2
  156. package/esm/Picker/{usePickerRef.js → hooks/usePickerRef.js} +1 -1
  157. package/esm/Picker/hooks/useSearch.d.ts +18 -0
  158. package/esm/Picker/hooks/useSearch.js +51 -0
  159. package/esm/Picker/hooks/useToggleKeyDownEvent.d.ts +25 -0
  160. package/esm/Picker/hooks/useToggleKeyDownEvent.js +96 -0
  161. package/esm/Picker/index.d.ts +7 -6
  162. package/esm/Picker/index.js +7 -6
  163. package/esm/Picker/propTypes.d.ts +0 -6
  164. package/esm/Picker/propTypes.js +0 -5
  165. package/esm/Picker/utils.d.ts +2 -96
  166. package/esm/Picker/utils.js +2 -401
  167. package/esm/SelectPicker/SelectPicker.js +9 -9
  168. package/esm/TagInput/index.js +4 -0
  169. package/esm/TreePicker/TreeNode.d.ts +2 -2
  170. package/esm/TreePicker/TreeNode.js +24 -58
  171. package/esm/TreePicker/TreePicker.js +20 -21
  172. package/package.json +1 -1
  173. package/styles/variables.less +1 -3
  174. package/cjs/Picker/DropdownMenu.d.ts +0 -59
  175. package/cjs/Picker/DropdownMenuGroup.d.ts +0 -6
  176. package/esm/Picker/DropdownMenu.d.ts +0 -59
  177. package/esm/Picker/DropdownMenuGroup.d.ts +0 -6
@@ -243,8 +243,8 @@ var CheckTreePicker = /*#__PURE__*/_react.default.forwardRef(function (props, re
243
243
  allUncheckable: (0, _utils2.isAllSiblingNodeUncheckable)(node, flattenNodes, uncheckableItemValues, valueKey),
244
244
  onSelect: handleSelect,
245
245
  onExpand: handleExpand,
246
- onRenderTreeNode: renderTreeNode,
247
- onRenderTreeIcon: renderTreeIcon
246
+ renderTreeNode: renderTreeNode,
247
+ renderTreeIcon: renderTreeIcon
248
248
  };
249
249
  };
250
250
  var focusActiveNode = function focusActiveNode() {
@@ -407,8 +407,8 @@ var CheckTreePicker = /*#__PURE__*/_react.default.forwardRef(function (props, re
407
407
  });
408
408
  var handleClean = (0, _utils.useEventCallback)(function (event) {
409
409
  var target = event.target;
410
- // exclude searchBar
411
- if (target.matches('div[role="searchbox"] > input') || disabled || !cleanable) {
410
+ // exclude searchbox
411
+ if (target.matches('input[role="searchbox"]') || disabled || !cleanable) {
412
412
  return;
413
413
  }
414
414
  setActiveNode(null);
@@ -562,7 +562,8 @@ var CheckTreePicker = /*#__PURE__*/_react.default.forwardRef(function (props, re
562
562
  return saveTreeNodeRef(_ref, refKey);
563
563
  }
564
564
  })), /*#__PURE__*/_react.default.createElement("div", {
565
- className: checkTreePrefix('children')
565
+ className: checkTreePrefix('group'),
566
+ role: "group"
566
567
  }, nodes.map(function (child) {
567
568
  return renderNode(child, layer);
568
569
  }), showIndentLine && /*#__PURE__*/_react.default.createElement("span", {
@@ -614,21 +615,17 @@ var CheckTreePicker = /*#__PURE__*/_react.default.forwardRef(function (props, re
614
615
  className: prefix('none')
615
616
  }, locale.noResultsText);
616
617
  }
617
- var treeNodesClass = merge(checkTreePrefix('nodes'), (_merge2 = {}, _merge2[checkTreePrefix('all-uncheckable')] = (0, _utils2.isEveryFirstLevelNodeUncheckable)(flattenNodes, uncheckableItemValues, valueKey), _merge2));
618
- var styles = inline ? (0, _extends2.default)({
619
- height: height
620
- }, style) : {};
621
- return /*#__PURE__*/_react.default.createElement("div", {
622
- id: id ? id + "-listbox" : undefined,
618
+ var treeNodesClass = merge(checkTreePrefix('root'), (_merge2 = {}, _merge2[checkTreePrefix('all-uncheckable')] = (0, _utils2.isEveryFirstLevelNodeUncheckable)(flattenNodes, uncheckableItemValues, valueKey), _merge2));
619
+ return /*#__PURE__*/_react.default.createElement(_Picker.TreeView, {
623
620
  ref: inline ? root : treeView,
624
- role: "tree",
625
- "aria-multiselectable": true,
621
+ multiselectable: true,
622
+ treeRootClassName: treeNodesClass,
626
623
  className: classes,
627
- style: styles,
624
+ style: inline ? (0, _extends2.default)({
625
+ height: height
626
+ }, style) : {},
628
627
  onScroll: onScroll,
629
628
  onKeyDown: inline ? handleTreeKeydown : undefined
630
- }, /*#__PURE__*/_react.default.createElement("div", {
631
- className: treeNodesClass
632
629
  }, virtualized ? /*#__PURE__*/_react.default.createElement(_Windowing.AutoSizer, {
633
630
  defaultHeight: inline ? height : menuMaxHeight,
634
631
  style: {
@@ -644,7 +641,7 @@ var CheckTreePicker = /*#__PURE__*/_react.default.forwardRef(function (props, re
644
641
  itemCount: formattedNodes.length,
645
642
  itemData: formattedNodes
646
643
  }, listProps), renderVirtualListNode);
647
- }) : formattedNodes));
644
+ }) : formattedNodes);
648
645
  };
649
646
  var renderDropdownMenu = function renderDropdownMenu(positionProps, speakerRef) {
650
647
  var left = positionProps.left,
@@ -655,7 +652,7 @@ var CheckTreePicker = /*#__PURE__*/_react.default.forwardRef(function (props, re
655
652
  left: left,
656
653
  top: top
657
654
  });
658
- return /*#__PURE__*/_react.default.createElement(_Picker.PickerOverlay, {
655
+ return /*#__PURE__*/_react.default.createElement(_Picker.PickerPopup, {
659
656
  autoWidth: menuAutoWidth,
660
657
  className: classes,
661
658
  style: mergedMenuStyle,
@@ -711,6 +708,9 @@ var CheckTreePicker = /*#__PURE__*/_react.default.forwardRef(function (props, re
711
708
  return renderCheckTree();
712
709
  }
713
710
  return /*#__PURE__*/_react.default.createElement(_Picker.PickerToggleTrigger, {
711
+ id: id,
712
+ popupType: "tree",
713
+ multiple: true,
714
714
  pickerProps: (0, _pick2.default)(props, _Picker.pickTriggerPropKeys),
715
715
  ref: trigger,
716
716
  placement: placement,
@@ -723,7 +723,6 @@ var CheckTreePicker = /*#__PURE__*/_react.default.forwardRef(function (props, re
723
723
  style: style,
724
724
  ref: root
725
725
  }, /*#__PURE__*/_react.default.createElement(_Picker.PickerToggle, (0, _extends2.default)({}, (0, _omit2.default)(rest, [].concat(_Picker.omitTriggerPropKeys, usedClassNamePropKeys)), {
726
- id: id,
727
726
  ref: target,
728
727
  appearance: appearance,
729
728
  onKeyDown: onPickerKeydown,
@@ -734,7 +733,8 @@ var CheckTreePicker = /*#__PURE__*/_react.default.forwardRef(function (props, re
734
733
  hasValue: hasValidValue,
735
734
  active: active,
736
735
  placement: placement,
737
- inputValue: value
736
+ inputValue: value,
737
+ focusItemValue: focusItemValue
738
738
  }), selectedElement || locale.placeholder)));
739
739
  });
740
740
  CheckTreePicker.displayName = 'CheckTreePicker';
@@ -25,7 +25,6 @@ var _PredefinedRanges = _interopRequireDefault(require("./PredefinedRanges"));
25
25
  var _utils = require("../utils");
26
26
  var _dateUtils = require("../utils/dateUtils");
27
27
  var _Picker = require("../Picker");
28
- var _usePickerRef2 = _interopRequireDefault(require("../Picker/usePickerRef"));
29
28
  var _DateInput = _interopRequireDefault(require("../DateInput"));
30
29
  var _InputGroup = _interopRequireDefault(require("../InputGroup"));
31
30
  var _OverlayTrigger = require("../Overlay/OverlayTrigger");
@@ -103,8 +102,8 @@ var DatePicker = /*#__PURE__*/_react.default.forwardRef(function (props, ref) {
103
102
  onToggleTimeDropdown = props.onToggleTimeDropdown,
104
103
  onShortcutClick = props.onShortcutClick,
105
104
  restProps = (0, _objectWithoutPropertiesLoose2.default)(props, ["as", "className", "classPrefix", "calendarDefaultDate", "cleanable", "editable", "defaultValue", "disabled", "readOnly", "plaintext", "format", "id", "isoWeek", "limitEndYear", "limitStartYear", "locale", "loading", "label", "menuClassName", "menuStyle", "appearance", "placement", "oneTap", "placeholder", "ranges", "value", "showMeridian", "showWeekNumbers", "style", "size", "caretAs", "disabledDate", "disabledHours", "disabledMinutes", "disabledSeconds", "shouldDisableDate", "shouldDisableHour", "shouldDisableMinute", "shouldDisableSecond", "onChange", "onChangeCalendarDate", "onClean", "onClose", "onEntered", "onExited", "onNextMonth", "onOk", "onOpen", "onPrevMonth", "onSelect", "onToggleMonthDropdown", "onToggleTimeDropdown", "onShortcutClick"]);
106
- var id = (0, _utils.useUniqueId)(classPrefix + "-", idProp);
107
- var _usePickerRef = (0, _usePickerRef2.default)(ref),
105
+ var id = (0, _utils.useUniqueId)('rs-', idProp);
106
+ var _usePickerRef = (0, _Picker.usePickerRef)(ref),
108
107
  trigger = _usePickerRef.trigger,
109
108
  root = _usePickerRef.root,
110
109
  target = _usePickerRef.target,
@@ -280,7 +279,7 @@ var DatePicker = /*#__PURE__*/_react.default.forwardRef(function (props, ref) {
280
279
  onClean === null || onClean === void 0 ? void 0 : onClean(event);
281
280
  event.stopPropagation();
282
281
  });
283
- var handlePickerOverlayKeyDown = (0, _utils.useEventCallback)(function (event) {
282
+ var handlePickerPopupKeyDown = (0, _utils.useEventCallback)(function (event) {
284
283
  var delta = 0;
285
284
  var step = showMonth ? 6 : 7;
286
285
  var changeDateFunc = showMonth ? _dateUtils.addMonths : _dateUtils.addDays;
@@ -424,7 +423,7 @@ var DatePicker = /*#__PURE__*/_react.default.forwardRef(function (props, ref) {
424
423
  left: left,
425
424
  top: top
426
425
  });
427
- return /*#__PURE__*/_react.default.createElement(_Picker.PickerOverlay, {
426
+ return /*#__PURE__*/_react.default.createElement(_Picker.PickerPopup, {
428
427
  role: "dialog",
429
428
  "aria-labelledby": label ? id + "-label" : undefined,
430
429
  tabIndex: -1,
@@ -432,7 +431,7 @@ var DatePicker = /*#__PURE__*/_react.default.forwardRef(function (props, ref) {
432
431
  ref: (0, _utils.mergeRefs)(overlay, speakerRef),
433
432
  style: styles,
434
433
  target: trigger,
435
- onKeyDown: handlePickerOverlayKeyDown
434
+ onKeyDown: handlePickerPopupKeyDown
436
435
  }, /*#__PURE__*/_react.default.createElement(_Stack.default, {
437
436
  alignItems: "flex-start"
438
437
  }, sideRanges.length > 0 && /*#__PURE__*/_react.default.createElement(_PredefinedRanges.default, {
@@ -30,7 +30,6 @@ var _deprecatePropType = require("../utils/deprecatePropType");
30
30
  var _DateRangePickerContext = _interopRequireDefault(require("./DateRangePickerContext"));
31
31
  var _DateRangeInput = _interopRequireDefault(require("../DateRangeInput"));
32
32
  var _InputGroup = _interopRequireDefault(require("../InputGroup"));
33
- var _usePickerRef2 = _interopRequireDefault(require("../Picker/usePickerRef"));
34
33
  var _templateObject;
35
34
  /**
36
35
  * A date range picker allows you to select a date range from a calendar.
@@ -99,8 +98,8 @@ var DateRangePicker = /*#__PURE__*/_react.default.forwardRef(function (props, re
99
98
  onShortcutClick = props.onShortcutClick,
100
99
  renderTitle = props.renderTitle,
101
100
  restProps = (0, _objectWithoutPropertiesLoose2.default)(props, ["as", "classPrefix", "className", "appearance", "editable", "cleanable", "character", "defaultCalendarValue", "defaultValue", "plaintext", "disabled", "disabledDate", "shouldDisableDate", "format", "hoverRange", "id", "isoWeek", "limitEndYear", "limitStartYear", "locale", "loading", "label", "menuClassName", "menuStyle", "oneTap", "placeholder", "placement", "ranges", "readOnly", "showOneCalendar", "showWeekNumbers", "showMeridian", "style", "size", "caretAs", "value", "onChange", "onClean", "onClose", "onEnter", "onEntered", "onExited", "onOk", "onOpen", "onSelect", "onShortcutClick", "renderTitle"]);
102
- var id = (0, _utils.useUniqueId)(classPrefix + "-", idProp);
103
- var _usePickerRef = (0, _usePickerRef2.default)(ref),
101
+ var id = (0, _utils.useUniqueId)('rs-', idProp);
102
+ var _usePickerRef = (0, _Picker.usePickerRef)(ref),
104
103
  trigger = _usePickerRef.trigger,
105
104
  root = _usePickerRef.root,
106
105
  target = _usePickerRef.target,
@@ -604,7 +603,7 @@ var DateRangePicker = /*#__PURE__*/_react.default.forwardRef(function (props, re
604
603
  var bottomRanges = ranges === null || ranges === void 0 ? void 0 : ranges.filter(function (range) {
605
604
  return (range === null || range === void 0 ? void 0 : range.placement) === 'bottom' || (range === null || range === void 0 ? void 0 : range.placement) === undefined;
606
605
  });
607
- return /*#__PURE__*/_react.default.createElement(_Picker.PickerOverlay, {
606
+ return /*#__PURE__*/_react.default.createElement(_Picker.PickerPopup, {
608
607
  role: "dialog",
609
608
  "aria-labelledby": label ? id + "-label" : undefined,
610
609
  tabIndex: -1,
@@ -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;
@@ -6,7 +6,7 @@ var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWild
6
6
  exports.__esModule = true;
7
7
  exports.default = void 0;
8
8
  var _taggedTemplateLiteralLoose2 = _interopRequireDefault(require("@babel/runtime/helpers/taggedTemplateLiteralLoose"));
9
- var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
9
+ var _extends3 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
10
10
  var _objectWithoutPropertiesLoose2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutPropertiesLoose"));
11
11
  var _react = _interopRequireWildcard(require("react"));
12
12
  var _propTypes = _interopRequireDefault(require("prop-types"));
@@ -37,6 +37,7 @@ var FormControl = /*#__PURE__*/_react.default.forwardRef(function (props, ref) {
37
37
  disabledContext = _useContext.disabled,
38
38
  errorFromContext = _useContext.errorFromContext,
39
39
  formError = _useContext.formError,
40
+ nestedField = _useContext.nestedField,
40
41
  removeFieldValue = _useContext.removeFieldValue,
41
42
  removeFieldError = _useContext.removeFieldError,
42
43
  pushFieldRule = _useContext.pushFieldRule,
@@ -86,46 +87,67 @@ var FormControl = /*#__PURE__*/_react.default.forwardRef(function (props, ref) {
86
87
  });
87
88
  var trigger = checkTrigger || contextCheckTrigger;
88
89
  var formValue = (0, _react.useContext)(_FormContext.FormValueContext);
89
- var val = (0, _isUndefined.default)(value) ? (0, _get.default)(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);
90
111
  var _useClassNames = (0, _utils.useClassNames)(classPrefix),
91
112
  withClassPrefix = _useClassNames.withClassPrefix,
92
113
  prefix = _useClassNames.prefix;
93
114
  var classes = withClassPrefix('wrapper');
94
- var handleFieldChange = function handleFieldChange(value, event) {
115
+ var handleFieldChange = (0, _utils.useEventCallback)(function (value, event) {
95
116
  handleFieldCheck(value, trigger === 'change');
96
117
  onFieldChange === null || onFieldChange === void 0 ? void 0 : onFieldChange(name, value, event);
97
118
  onChange === null || onChange === void 0 ? void 0 : onChange(value, event);
98
- };
99
- var handleFieldBlur = function handleFieldBlur(event) {
100
- handleFieldCheck(val, trigger === 'blur');
119
+ });
120
+ var handleFieldBlur = (0, _utils.useEventCallback)(function (event) {
121
+ handleFieldCheck(fieldValue, trigger === 'blur');
101
122
  onBlur === null || onBlur === void 0 ? void 0 : onBlur(event);
102
- };
103
- var handleFieldCheck = function handleFieldCheck(value, isCheckTrigger) {
123
+ });
124
+ var handleFieldCheck = (0, _utils.useEventCallback)(function (value, isCheckTrigger) {
125
+ var checkFieldName = nestedField ? name.split('.')[0] : name;
104
126
  var callbackEvents = function callbackEvents(checkResult) {
105
127
  // The relevant event is triggered only when the inspection is allowed.
106
128
  if (isCheckTrigger) {
107
129
  if (checkResult.hasError) {
108
- 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);
109
131
  } else {
110
- onFieldSuccess === null || onFieldSuccess === void 0 ? void 0 : onFieldSuccess(name);
132
+ onFieldSuccess === null || onFieldSuccess === void 0 ? void 0 : onFieldSuccess(checkFieldName);
111
133
  }
112
134
  }
113
135
  return checkResult;
114
136
  };
115
- var nextFormValue = (0, _set.default)(formValue || {}, name, value);
137
+ var nextFormValue = setFieldValue(name, value);
116
138
  var model = getCombinedModel();
117
139
  if (checkAsync) {
118
- 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) {
119
141
  return callbackEvents(checkResult);
120
142
  });
121
143
  }
122
- return Promise.resolve(callbackEvents(model === null || model === void 0 ? void 0 : model.checkForField(name, nextFormValue)));
123
- };
144
+ return Promise.resolve(callbackEvents(model === null || model === void 0 ? void 0 : model.checkForField(checkFieldName, nextFormValue)));
145
+ });
124
146
  var messageNode = null;
125
147
  if (!(0, _isUndefined.default)(errorMessage)) {
126
148
  messageNode = errorMessage;
127
149
  } else if (errorFromContext) {
128
- var fieldError = formError === null || formError === void 0 ? void 0 : formError[name];
150
+ var fieldError = getFieldError(name);
129
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) {
130
152
  messageNode = fieldError;
131
153
  }
@@ -139,12 +161,12 @@ var FormControl = /*#__PURE__*/_react.default.forwardRef(function (props, ref) {
139
161
  if (AccepterComponent === _Toggle.default) {
140
162
  valueKey = 'checked';
141
163
  }
142
- var accepterProps = (_accepterProps = {}, _accepterProps[valueKey] = val === undefined ? defaultValue : val, _accepterProps);
164
+ var accepterProps = (_accepterProps = {}, _accepterProps[valueKey] = fieldValue === undefined ? defaultValue : fieldValue, _accepterProps);
143
165
  return /*#__PURE__*/_react.default.createElement(Component, {
144
166
  className: classes,
145
167
  ref: ref,
146
168
  "data-testid": "form-control-wrapper"
147
- }, /*#__PURE__*/_react.default.createElement(AccepterComponent, (0, _extends2.default)({
169
+ }, /*#__PURE__*/_react.default.createElement(AccepterComponent, (0, _extends3.default)({
148
170
  id: controlId,
149
171
  "aria-labelledby": controlId ? controlId + "-control-label" : null,
150
172
  "aria-describedby": ariaDescribedby,
@@ -158,7 +180,7 @@ var FormControl = /*#__PURE__*/_react.default.forwardRef(function (props, ref) {
158
180
  onChange: handleFieldChange,
159
181
  onBlur: handleFieldBlur
160
182
  })), /*#__PURE__*/_react.default.createElement(_FormErrorMessage.default, {
161
- id: controlId + "-error-message",
183
+ id: controlId ? controlId + "-error-message" : undefined,
162
184
  role: "alert",
163
185
  "aria-relevant": "all",
164
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