rsuite 5.56.0 → 5.57.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 (179) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/CascadeTree/package.json +7 -0
  3. package/CascadeTree/styles/index.css +273 -0
  4. package/CascadeTree/styles/index.less +77 -0
  5. package/CascadeTree/styles/search.less +45 -0
  6. package/Cascader/styles/index.css +187 -192
  7. package/Cascader/styles/index.less +1 -122
  8. package/MultiCascadeTree/package.json +7 -0
  9. package/MultiCascadeTree/styles/index.css +3701 -0
  10. package/MultiCascadeTree/styles/index.less +37 -0
  11. package/MultiCascader/styles/index.css +72 -69
  12. package/MultiCascader/styles/index.less +11 -31
  13. package/cjs/@types/common.d.ts +12 -14
  14. package/cjs/CascadeTree/CascadeTree.d.ts +16 -0
  15. package/cjs/CascadeTree/CascadeTree.js +174 -0
  16. package/cjs/CascadeTree/SearchView.d.ts +17 -0
  17. package/cjs/CascadeTree/SearchView.js +106 -0
  18. package/cjs/CascadeTree/TreeView.d.ts +20 -0
  19. package/cjs/{Cascader → CascadeTree}/TreeView.js +42 -33
  20. package/cjs/CascadeTree/hooks/index.d.ts +3 -0
  21. package/cjs/CascadeTree/hooks/index.js +12 -0
  22. package/cjs/{Cascader/utils.d.ts → CascadeTree/hooks/usePaths.d.ts} +3 -25
  23. package/cjs/CascadeTree/hooks/usePaths.js +42 -0
  24. package/cjs/CascadeTree/hooks/useSearch.d.ts +17 -0
  25. package/cjs/CascadeTree/hooks/useSearch.js +59 -0
  26. package/cjs/CascadeTree/hooks/useSelect.d.ts +23 -0
  27. package/cjs/CascadeTree/hooks/useSelect.js +64 -0
  28. package/cjs/CascadeTree/index.d.ts +4 -0
  29. package/cjs/CascadeTree/index.js +9 -0
  30. package/cjs/CascadeTree/types.d.ts +66 -0
  31. package/cjs/CascadeTree/types.js +2 -0
  32. package/cjs/CascadeTree/utils.d.ts +32 -0
  33. package/cjs/CascadeTree/utils.js +66 -0
  34. package/cjs/Cascader/Cascader.d.ts +57 -26
  35. package/cjs/Cascader/Cascader.js +180 -247
  36. package/cjs/Cascader/useActive.d.ts +15 -0
  37. package/cjs/Cascader/useActive.js +43 -0
  38. package/cjs/InlineEdit/InlineEdit.d.ts +1 -1
  39. package/cjs/Loader/Loader.js +5 -4
  40. package/cjs/MultiCascadeTree/MultiCascadeTree.d.ts +9 -0
  41. package/cjs/MultiCascadeTree/MultiCascadeTree.js +131 -0
  42. package/cjs/MultiCascadeTree/SearchView.d.ts +17 -0
  43. package/cjs/MultiCascadeTree/SearchView.js +117 -0
  44. package/cjs/MultiCascadeTree/TreeView.d.ts +22 -0
  45. package/cjs/{MultiCascader → MultiCascadeTree}/TreeView.js +20 -20
  46. package/cjs/MultiCascadeTree/hooks/index.d.ts +5 -0
  47. package/cjs/MultiCascadeTree/hooks/index.js +16 -0
  48. package/cjs/MultiCascadeTree/hooks/useCascadeValue.d.ts +18 -0
  49. package/cjs/MultiCascadeTree/hooks/useCascadeValue.js +202 -0
  50. package/cjs/MultiCascadeTree/hooks/useColumnData.d.ts +16 -0
  51. package/cjs/MultiCascadeTree/hooks/useColumnData.js +52 -0
  52. package/cjs/MultiCascadeTree/hooks/useFlattenData.d.ts +9 -0
  53. package/cjs/MultiCascadeTree/hooks/useFlattenData.js +33 -0
  54. package/cjs/MultiCascadeTree/hooks/useSearch.d.ts +17 -0
  55. package/cjs/MultiCascadeTree/hooks/useSearch.js +52 -0
  56. package/cjs/MultiCascadeTree/hooks/useSelect.d.ts +19 -0
  57. package/cjs/MultiCascadeTree/hooks/useSelect.js +83 -0
  58. package/cjs/MultiCascadeTree/index.d.ts +4 -0
  59. package/cjs/MultiCascadeTree/index.js +9 -0
  60. package/cjs/MultiCascadeTree/types.d.ts +26 -0
  61. package/cjs/MultiCascadeTree/types.js +2 -0
  62. package/cjs/MultiCascadeTree/utils.d.ts +37 -0
  63. package/cjs/MultiCascadeTree/utils.js +140 -0
  64. package/cjs/MultiCascader/MultiCascader.d.ts +57 -29
  65. package/cjs/MultiCascader/MultiCascader.js +175 -287
  66. package/cjs/Tree/Tree.d.ts +4 -4
  67. package/cjs/index.d.ts +6 -1
  68. package/cjs/index.js +8 -3
  69. package/cjs/internals/Picker/PickerToggle.d.ts +4 -5
  70. package/cjs/toaster/ToastContainer.d.ts +9 -2
  71. package/cjs/toaster/index.d.ts +0 -1
  72. package/cjs/toaster/index.js +1 -3
  73. package/cjs/useToaster/index.d.ts +2 -0
  74. package/cjs/useToaster/index.js +9 -0
  75. package/cjs/{toaster → useToaster}/useToaster.d.ts +4 -4
  76. package/cjs/{toaster → useToaster}/useToaster.js +4 -4
  77. package/cjs/utils/index.d.ts +1 -0
  78. package/cjs/utils/index.js +5 -2
  79. package/dist/rsuite-no-reset-rtl.css +64 -61
  80. package/dist/rsuite-no-reset-rtl.min.css +1 -1
  81. package/dist/rsuite-no-reset-rtl.min.css.map +1 -1
  82. package/dist/rsuite-no-reset.css +64 -61
  83. package/dist/rsuite-no-reset.min.css +1 -1
  84. package/dist/rsuite-no-reset.min.css.map +1 -1
  85. package/dist/rsuite-rtl.css +64 -61
  86. package/dist/rsuite-rtl.min.css +1 -1
  87. package/dist/rsuite-rtl.min.css.map +1 -1
  88. package/dist/rsuite.css +64 -61
  89. package/dist/rsuite.js +242 -44
  90. package/dist/rsuite.js.map +1 -1
  91. package/dist/rsuite.min.css +1 -1
  92. package/dist/rsuite.min.css.map +1 -1
  93. package/dist/rsuite.min.js +1 -1
  94. package/dist/rsuite.min.js.map +1 -1
  95. package/esm/@types/common.d.ts +12 -14
  96. package/esm/CascadeTree/CascadeTree.d.ts +16 -0
  97. package/esm/CascadeTree/CascadeTree.js +167 -0
  98. package/esm/CascadeTree/SearchView.d.ts +17 -0
  99. package/esm/CascadeTree/SearchView.js +100 -0
  100. package/esm/CascadeTree/TreeView.d.ts +20 -0
  101. package/esm/{Cascader → CascadeTree}/TreeView.js +42 -33
  102. package/esm/CascadeTree/hooks/index.d.ts +3 -0
  103. package/esm/CascadeTree/hooks/index.js +4 -0
  104. package/esm/{Cascader/utils.d.ts → CascadeTree/hooks/usePaths.d.ts} +3 -25
  105. package/esm/CascadeTree/hooks/usePaths.js +36 -0
  106. package/esm/CascadeTree/hooks/useSearch.d.ts +17 -0
  107. package/esm/CascadeTree/hooks/useSearch.js +54 -0
  108. package/esm/CascadeTree/hooks/useSelect.d.ts +23 -0
  109. package/esm/CascadeTree/hooks/useSelect.js +59 -0
  110. package/esm/CascadeTree/index.d.ts +4 -0
  111. package/esm/CascadeTree/index.js +3 -0
  112. package/esm/CascadeTree/types.d.ts +66 -0
  113. package/esm/CascadeTree/types.js +1 -0
  114. package/esm/CascadeTree/utils.d.ts +32 -0
  115. package/esm/CascadeTree/utils.js +61 -0
  116. package/esm/Cascader/Cascader.d.ts +57 -26
  117. package/esm/Cascader/Cascader.js +167 -233
  118. package/esm/Cascader/useActive.d.ts +15 -0
  119. package/esm/Cascader/useActive.js +37 -0
  120. package/esm/InlineEdit/InlineEdit.d.ts +1 -1
  121. package/esm/Loader/Loader.js +6 -5
  122. package/esm/MultiCascadeTree/MultiCascadeTree.d.ts +9 -0
  123. package/esm/MultiCascadeTree/MultiCascadeTree.js +125 -0
  124. package/esm/MultiCascadeTree/SearchView.d.ts +17 -0
  125. package/esm/MultiCascadeTree/SearchView.js +111 -0
  126. package/esm/MultiCascadeTree/TreeView.d.ts +22 -0
  127. package/esm/{MultiCascader → MultiCascadeTree}/TreeView.js +20 -20
  128. package/esm/MultiCascadeTree/hooks/index.d.ts +5 -0
  129. package/esm/MultiCascadeTree/hooks/index.js +6 -0
  130. package/esm/MultiCascadeTree/hooks/useCascadeValue.d.ts +18 -0
  131. package/esm/MultiCascadeTree/hooks/useCascadeValue.js +197 -0
  132. package/esm/MultiCascadeTree/hooks/useColumnData.d.ts +16 -0
  133. package/esm/MultiCascadeTree/hooks/useColumnData.js +46 -0
  134. package/esm/MultiCascadeTree/hooks/useFlattenData.d.ts +9 -0
  135. package/esm/MultiCascadeTree/hooks/useFlattenData.js +28 -0
  136. package/esm/MultiCascadeTree/hooks/useSearch.d.ts +17 -0
  137. package/esm/MultiCascadeTree/hooks/useSearch.js +47 -0
  138. package/esm/MultiCascadeTree/hooks/useSelect.d.ts +19 -0
  139. package/esm/MultiCascadeTree/hooks/useSelect.js +77 -0
  140. package/esm/MultiCascadeTree/index.d.ts +4 -0
  141. package/esm/MultiCascadeTree/index.js +3 -0
  142. package/esm/MultiCascadeTree/types.d.ts +26 -0
  143. package/esm/MultiCascadeTree/types.js +1 -0
  144. package/esm/MultiCascadeTree/utils.d.ts +37 -0
  145. package/esm/MultiCascadeTree/utils.js +130 -0
  146. package/esm/MultiCascader/MultiCascader.d.ts +57 -29
  147. package/esm/MultiCascader/MultiCascader.js +168 -279
  148. package/esm/Tree/Tree.d.ts +4 -4
  149. package/esm/index.d.ts +6 -1
  150. package/esm/index.js +5 -1
  151. package/esm/internals/Picker/PickerToggle.d.ts +4 -5
  152. package/esm/toaster/ToastContainer.d.ts +9 -2
  153. package/esm/toaster/index.d.ts +0 -1
  154. package/esm/toaster/index.js +0 -1
  155. package/esm/useToaster/index.d.ts +2 -0
  156. package/esm/useToaster/index.js +3 -0
  157. package/esm/{toaster → useToaster}/useToaster.d.ts +4 -4
  158. package/esm/{toaster → useToaster}/useToaster.js +4 -4
  159. package/esm/utils/index.d.ts +1 -0
  160. package/esm/utils/index.js +2 -1
  161. package/package.json +1 -1
  162. package/styles/index.less +2 -0
  163. package/useToaster/package.json +7 -0
  164. package/useToaster/styles/index.css +239 -0
  165. package/useToaster/styles/index.less +1 -0
  166. package/cjs/Cascader/DropdownMenu.d.ts +0 -24
  167. package/cjs/Cascader/DropdownMenu.js +0 -175
  168. package/cjs/Cascader/TreeView.d.ts +0 -24
  169. package/cjs/Cascader/utils.js +0 -79
  170. package/cjs/MultiCascader/TreeView.d.ts +0 -25
  171. package/cjs/MultiCascader/utils.d.ts +0 -71
  172. package/cjs/MultiCascader/utils.js +0 -382
  173. package/esm/Cascader/DropdownMenu.d.ts +0 -24
  174. package/esm/Cascader/DropdownMenu.js +0 -168
  175. package/esm/Cascader/TreeView.d.ts +0 -24
  176. package/esm/Cascader/utils.js +0 -74
  177. package/esm/MultiCascader/TreeView.d.ts +0 -25
  178. package/esm/MultiCascader/utils.d.ts +0 -71
  179. package/esm/MultiCascader/utils.js +0 -369
@@ -5,24 +5,23 @@ var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWild
5
5
  var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
6
6
  exports.__esModule = true;
7
7
  exports.default = void 0;
8
- var _extends3 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
8
+ var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
9
9
  var _objectWithoutPropertiesLoose2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutPropertiesLoose"));
10
10
  var _react = _interopRequireWildcard(require("react"));
11
- var _reactUseSet = require("react-use-set");
12
11
  var _propTypes = _interopRequireDefault(require("prop-types"));
13
12
  var _omit = _interopRequireDefault(require("lodash/omit"));
14
13
  var _pick = _interopRequireDefault(require("lodash/pick"));
15
14
  var _isNil = _interopRequireDefault(require("lodash/isNil"));
16
15
  var _isFunction = _interopRequireDefault(require("lodash/isFunction"));
17
- var _shallowEqual = _interopRequireDefault(require("../utils/shallowEqual"));
18
- var _TreeView = _interopRequireDefault(require("./TreeView"));
16
+ var _TreeView = _interopRequireDefault(require("../CascadeTree/TreeView"));
17
+ var _SearchView = _interopRequireDefault(require("../CascadeTree/SearchView"));
18
+ var _hooks = require("../CascadeTree/hooks");
19
19
  var _treeUtils = require("../utils/treeUtils");
20
- var _utils = require("./utils");
21
- var _utils2 = require("../utils");
20
+ var _propTypes2 = require("../internals/propTypes");
21
+ var _utils = require("../utils");
22
22
  var _Picker = require("../internals/Picker");
23
- var _SearchBox = _interopRequireDefault(require("../internals/SearchBox"));
24
23
  var _useMap = require("../utils/useMap");
25
- var _propTypes2 = require("../internals/propTypes");
24
+ var _useActive2 = _interopRequireDefault(require("./useActive"));
26
25
  var emptyArray = [];
27
26
 
28
27
  /**
@@ -55,23 +54,22 @@ var Cascader = /*#__PURE__*/_react.default.forwardRef(function (props, ref) {
55
54
  toggleAs = props.toggleAs,
56
55
  style = props.style,
57
56
  valueProp = props.value,
58
- inline = props.inline,
59
- menuClassName = props.menuClassName,
60
- menuStyle = props.menuStyle,
61
- menuWidth = props.menuWidth,
62
- menuHeight = props.menuHeight,
57
+ popupClassName = props.popupClassName,
58
+ popupStyle = props.popupStyle,
59
+ columnHeight = props.columnHeight,
60
+ columnWidth = props.columnWidth,
63
61
  _props$searchable = props.searchable,
64
62
  searchable = _props$searchable === void 0 ? true : _props$searchable,
65
63
  parentSelectable = props.parentSelectable,
66
64
  _props$placement = props.placement,
67
65
  placement = _props$placement === void 0 ? 'bottomStart' : _props$placement,
68
66
  id = props.id,
69
- renderMenuItem = props.renderMenuItem,
67
+ renderColumn = props.renderColumn,
68
+ renderTreeNode = props.renderTreeNode,
70
69
  renderSearchItem = props.renderSearchItem,
71
70
  renderValue = props.renderValue,
72
- renderMenu = props.renderMenu,
73
71
  renderExtraFooter = props.renderExtraFooter,
74
- onEnter = props.onEnter,
72
+ onEntered = props.onEntered,
75
73
  onExited = props.onExited,
76
74
  onClean = props.onClean,
77
75
  onChange = props.onChange,
@@ -80,57 +78,99 @@ var Cascader = /*#__PURE__*/_react.default.forwardRef(function (props, ref) {
80
78
  onClose = props.onClose,
81
79
  onOpen = props.onOpen,
82
80
  getChildren = props.getChildren,
83
- rest = (0, _objectWithoutPropertiesLoose2.default)(props, ["as", "data", "classPrefix", "childrenKey", "valueKey", "labelKey", "defaultValue", "placeholder", "disabled", "disabledItemValues", "appearance", "cleanable", "locale", "toggleAs", "style", "value", "inline", "menuClassName", "menuStyle", "menuWidth", "menuHeight", "searchable", "parentSelectable", "placement", "id", "renderMenuItem", "renderSearchItem", "renderValue", "renderMenu", "renderExtraFooter", "onEnter", "onExited", "onClean", "onChange", "onSelect", "onSearch", "onClose", "onOpen", "getChildren"]); // Use component active state to support keyboard events.
84
- var _useState = (0, _react.useState)(false),
85
- active = _useState[0],
86
- setActive = _useState[1];
81
+ DEPRECATED_menuClassName = props.menuClassName,
82
+ DEPRECATED_menuStyle = props.menuStyle,
83
+ DEPRECATED_menuWidth = props.menuWidth,
84
+ DEPRECATED_menuHeight = props.menuHeight,
85
+ DEPRECATED_renderMenuItem = props.renderMenuItem,
86
+ DEPRECATED_renderMenu = props.renderMenu,
87
+ rest = (0, _objectWithoutPropertiesLoose2.default)(props, ["as", "data", "classPrefix", "childrenKey", "valueKey", "labelKey", "defaultValue", "placeholder", "disabled", "disabledItemValues", "appearance", "cleanable", "locale", "toggleAs", "style", "value", "popupClassName", "popupStyle", "columnHeight", "columnWidth", "searchable", "parentSelectable", "placement", "id", "renderColumn", "renderTreeNode", "renderSearchItem", "renderValue", "renderExtraFooter", "onEntered", "onExited", "onClean", "onChange", "onSelect", "onSearch", "onClose", "onOpen", "getChildren", "menuClassName", "menuStyle", "menuWidth", "menuHeight", "renderMenuItem", "renderMenu"]);
87
88
  var _usePickerRef = (0, _Picker.usePickerRef)(ref),
88
89
  trigger = _usePickerRef.trigger,
89
90
  root = _usePickerRef.root,
90
91
  target = _usePickerRef.target,
91
92
  overlay = _usePickerRef.overlay,
92
93
  searchInput = _usePickerRef.searchInput;
93
- var _ref = (0, _utils2.useControlled)(valueProp, defaultValue),
94
+ var _ref = (0, _utils.useControlled)(valueProp, defaultValue),
94
95
  value = _ref[0],
95
- setValue = _ref[1];
96
- var isMounted = (0, _utils2.useIsMounted)();
97
- var loadingItemsSet = (0, _reactUseSet.useSet)();
98
- var asyncChildrenMap = (0, _useMap.useMap)();
96
+ setValue = _ref[1]; // Store the children of each node
97
+ var childrenMap = (0, _useMap.useMap)();
98
+
99
+ // Store the parent of each node
99
100
  var parentMap = (0, _react.useMemo)(function () {
100
101
  return (0, _treeUtils.getParentMap)(data, function (item) {
101
- var _asyncChildrenMap$get;
102
- return (_asyncChildrenMap$get = asyncChildrenMap.get(item)) !== null && _asyncChildrenMap$get !== void 0 ? _asyncChildrenMap$get : item[childrenKey];
102
+ var _childrenMap$get;
103
+ return (_childrenMap$get = childrenMap.get(item)) !== null && _childrenMap$get !== void 0 ? _childrenMap$get : item[childrenKey];
103
104
  });
104
- }, [asyncChildrenMap, childrenKey, data]);
105
+ }, [childrenMap, childrenKey, data]);
106
+
107
+ // Flatten the tree data
105
108
  var flattenedData = (0, _react.useMemo)(function () {
106
109
  return (0, _treeUtils.flattenTree)(data, function (item) {
107
- var _asyncChildrenMap$get2;
108
- return (_asyncChildrenMap$get2 = asyncChildrenMap.get(item)) !== null && _asyncChildrenMap$get2 !== void 0 ? _asyncChildrenMap$get2 : item[childrenKey];
110
+ var _childrenMap$get2;
111
+ return (_childrenMap$get2 = childrenMap.get(item)) !== null && _childrenMap$get2 !== void 0 ? _childrenMap$get2 : item[childrenKey];
109
112
  });
110
- }, [asyncChildrenMap, childrenKey, data]);
113
+ }, [childrenMap, childrenKey, data]);
114
+
115
+ // The selected item
116
+ var selectedItem = flattenedData.find(function (item) {
117
+ return item[valueKey] === value;
118
+ });
111
119
 
112
- // The item that focus is on
113
- var _useState2 = (0, _react.useState)(),
114
- activeItem = _useState2[0],
115
- setActiveItem = _useState2[1];
116
- var _usePaths = (0, _utils.usePaths)({
120
+ // Callback function after selecting the node
121
+ var onSelectCallback = function onSelectCallback(node, event) {
122
+ var _trigger$current;
123
+ var isLeafNode = node.isLeafNode,
124
+ cascadePaths = node.cascadePaths,
125
+ itemData = node.itemData;
126
+ onSelect === null || onSelect === void 0 ? void 0 : onSelect(itemData, cascadePaths, event);
127
+ var nextValue = itemData[valueKey];
128
+ if (isLeafNode) {
129
+ // Determines whether the option is a leaf node, and if so, closes the picker.
130
+ handleClose();
131
+ setValue(nextValue);
132
+ return;
133
+ }
134
+
135
+ // When the parent is optional, the value and the displayed path are updated.
136
+ if (parentSelectable && !(0, _utils.shallowEqual)(value, nextValue)) {
137
+ setValue(nextValue);
138
+ onChange === null || onChange === void 0 ? void 0 : onChange(nextValue, event);
139
+ }
140
+
141
+ // Update menu position
142
+ (_trigger$current = trigger.current) === null || _trigger$current === void 0 ? void 0 : _trigger$current.updatePosition();
143
+ };
144
+ var _useSelect = (0, _hooks.useSelect)({
145
+ value: value,
146
+ valueKey: valueKey,
147
+ childrenKey: childrenKey,
148
+ childrenMap: childrenMap,
149
+ selectedItem: selectedItem,
150
+ getChildren: getChildren,
151
+ onChange: onChange,
152
+ onSelect: onSelectCallback
153
+ }),
154
+ activeItem = _useSelect.activeItem,
155
+ setActiveItem = _useSelect.setActiveItem,
156
+ loadingItemsSet = _useSelect.loadingItemsSet,
157
+ handleSelect = _useSelect.handleSelect;
158
+ var _usePaths = (0, _hooks.usePaths)({
117
159
  data: data,
118
160
  activeItem: activeItem,
119
- selectedItem: flattenedData.find(function (item) {
120
- return item[valueKey] === value;
121
- }),
161
+ selectedItem: selectedItem,
122
162
  getParent: function getParent(item) {
123
163
  return parentMap.get(item);
124
164
  },
125
165
  getChildren: function getChildren(item) {
126
- var _asyncChildrenMap$get3;
127
- return (_asyncChildrenMap$get3 = asyncChildrenMap.get(item)) !== null && _asyncChildrenMap$get3 !== void 0 ? _asyncChildrenMap$get3 : item[childrenKey];
166
+ var _childrenMap$get3;
167
+ return (_childrenMap$get3 = childrenMap.get(item)) !== null && _childrenMap$get3 !== void 0 ? _childrenMap$get3 : item[childrenKey];
128
168
  }
129
169
  }),
130
- columnsToDisplay = _usePaths.columnsToDisplay,
170
+ columns = _usePaths.columns,
131
171
  pathTowardsActiveItem = _usePaths.pathTowardsActiveItem,
132
172
  pathTowardsSelectedItem = _usePaths.pathTowardsSelectedItem;
133
- var _useCustom = (0, _utils2.useCustom)('Picker', overrideLocale),
173
+ var _useCustom = (0, _utils.useCustom)('Picker', overrideLocale),
134
174
  locale = _useCustom.locale,
135
175
  rtl = _useCustom.rtl;
136
176
  /**
@@ -138,40 +178,14 @@ var Cascader = /*#__PURE__*/_react.default.forwardRef(function (props, ref) {
138
178
  * 2.Regardless of whether the value is valid, as long as renderValue is set, it is judged to have a value.
139
179
  */
140
180
  var hasValue = pathTowardsSelectedItem.length > 0 || !(0, _isNil.default)(value) && (0, _isFunction.default)(renderValue);
141
- var _useClassNames = (0, _utils2.useClassNames)(classPrefix),
181
+ var _useClassNames = (0, _utils.useClassNames)(classPrefix),
142
182
  prefix = _useClassNames.prefix,
143
183
  merge = _useClassNames.merge;
144
- var _useState3 = (0, _react.useState)(''),
145
- searchKeyword = _useState3[0],
146
- setSearchKeyword = _useState3[1];
147
- var someKeyword = function someKeyword(item, keyword) {
148
- if (item[labelKey].match(new RegExp((0, _utils2.getSafeRegExpString)(keyword || searchKeyword), 'i'))) {
149
- return true;
150
- }
151
- var parent = parentMap.get(item);
152
- if (parent && someKeyword(parent)) {
153
- return true;
154
- }
155
- return false;
156
- };
157
- var getSearchResult = function getSearchResult(keyword) {
158
- var items = [];
159
- var result = flattenedData.filter(function (item) {
160
- if (!parentSelectable && item[childrenKey]) {
161
- return false;
162
- }
163
- return someKeyword(item, keyword);
164
- });
165
- for (var i = 0; i < result.length; i++) {
166
- items.push(result[i]);
167
-
168
- // A maximum of 100 search results are returned.
169
- if (i === 99) {
170
- return items;
171
- }
172
- }
173
- return items;
174
- };
184
+ var onFocusItemCallback = (0, _react.useCallback)(function (value) {
185
+ setActiveItem(flattenedData.find(function (item) {
186
+ return item[valueKey] === value;
187
+ }));
188
+ }, [flattenedData, setActiveItem, valueKey]);
175
189
 
176
190
  // Used to hover the focuse item when trigger `onKeydown`
177
191
  var _useFocusItemValue = (0, _Picker.useFocusItemValue)(value, {
@@ -185,20 +199,14 @@ var Cascader = /*#__PURE__*/_react.default.forwardRef(function (props, ref) {
185
199
  getParent: function getParent(item) {
186
200
  return parentMap.get(item);
187
201
  },
188
- callback: (0, _react.useCallback)(function (value) {
189
- setActiveItem(flattenedData.find(function (item) {
190
- return item[valueKey] === value;
191
- }));
192
- }, [flattenedData, setActiveItem, valueKey])
202
+ callback: onFocusItemCallback
193
203
  }),
194
204
  focusItemValue = _useFocusItemValue.focusItemValue,
195
205
  setFocusItemValue = _useFocusItemValue.setFocusItemValue,
196
206
  setLayer = _useFocusItemValue.setLayer,
197
207
  setKeys = _useFocusItemValue.setKeys,
198
208
  onFocusItem = _useFocusItemValue.onKeyDown;
199
- var handleSearch = (0, _utils2.useEventCallback)(function (value, event) {
200
- var items = getSearchResult(value);
201
- setSearchKeyword(value);
209
+ var onSearchCallback = function onSearchCallback(value, items, event) {
202
210
  onSearch === null || onSearch === void 0 ? void 0 : onSearch(value, event);
203
211
  if (!value || items.length === 0) {
204
212
  setFocusItemValue(undefined);
@@ -209,37 +217,45 @@ var Cascader = /*#__PURE__*/_react.default.forwardRef(function (props, ref) {
209
217
  setLayer(0);
210
218
  setKeys([]);
211
219
  }
212
- });
213
- var handleEntered = (0, _utils2.useEventCallback)(function () {
214
- if (!target.current) {
215
- return;
216
- }
217
- onOpen === null || onOpen === void 0 ? void 0 : onOpen();
218
- setActive(true);
219
- });
220
- var handleExited = (0, _utils2.useEventCallback)(function () {
221
- if (!target.current) {
222
- return;
223
- }
224
- onClose === null || onClose === void 0 ? void 0 : onClose();
225
- setActive(false);
226
- setSearchKeyword('');
227
- });
228
- var handleClose = (0, _utils2.useEventCallback)(function () {
229
- var _trigger$current, _target$current, _target$current$focus;
230
- (_trigger$current = trigger.current) === null || _trigger$current === void 0 ? void 0 : _trigger$current.close();
220
+ };
221
+ var _useSearch = (0, _hooks.useSearch)({
222
+ labelKey: labelKey,
223
+ childrenKey: childrenKey,
224
+ parentMap: parentMap,
225
+ flattenedData: flattenedData,
226
+ parentSelectable: parentSelectable,
227
+ onSearch: onSearchCallback
228
+ }),
229
+ items = _useSearch.items,
230
+ searchKeyword = _useSearch.searchKeyword,
231
+ setSearchKeyword = _useSearch.setSearchKeyword,
232
+ handleSearch = _useSearch.handleSearch;
233
+ var _useActive = (0, _useActive2.default)({
234
+ onOpen: onOpen,
235
+ onClose: onClose,
236
+ onEntered: onEntered,
237
+ onExited: onExited,
238
+ target: target,
239
+ setSearchKeyword: setSearchKeyword
240
+ }),
241
+ active = _useActive.active,
242
+ handleEntered = _useActive.handleEntered,
243
+ handleExited = _useActive.handleExited;
244
+ var handleClose = (0, _utils.useEventCallback)(function () {
245
+ var _trigger$current2, _target$current, _target$current$focus;
246
+ (_trigger$current2 = trigger.current) === null || _trigger$current2 === void 0 ? void 0 : _trigger$current2.close();
231
247
 
232
248
  // The focus is on the trigger button after closing
233
249
  (_target$current = target.current) === null || _target$current === void 0 ? void 0 : (_target$current$focus = _target$current.focus) === null || _target$current$focus === void 0 ? void 0 : _target$current$focus.call(_target$current);
234
250
  });
235
- var handleClean = (0, _utils2.useEventCallback)(function (event) {
251
+ var handleClean = (0, _utils.useEventCallback)(function (event) {
236
252
  if (disabled || !target.current) {
237
253
  return;
238
254
  }
239
255
  setValue(null);
240
256
  onChange === null || onChange === void 0 ? void 0 : onChange(null, event);
241
257
  });
242
- var handleMenuPressEnter = (0, _utils2.useEventCallback)(function (event) {
258
+ var handleMenuPressEnter = (0, _utils.useEventCallback)(function (event) {
243
259
  var focusItem = (0, _treeUtils.findNodeOfTree)(data, function (item) {
244
260
  return item[valueKey] === focusItemValue;
245
261
  });
@@ -249,14 +265,14 @@ var Cascader = /*#__PURE__*/_react.default.forwardRef(function (props, ref) {
249
265
  if (pathTowardsActiveItem.length) {
250
266
  setLayer(pathTowardsActiveItem.length - 1);
251
267
  }
252
- if (!(0, _shallowEqual.default)(value, focusItemValue)) {
268
+ if (!(0, _utils.shallowEqual)(value, focusItemValue)) {
253
269
  onSelect === null || onSelect === void 0 ? void 0 : onSelect(focusItem, pathTowardsActiveItem, event);
254
270
  onChange === null || onChange === void 0 ? void 0 : onChange(focusItemValue !== null && focusItemValue !== void 0 ? focusItemValue : null, event);
255
271
  }
256
272
  handleClose();
257
273
  }
258
274
  });
259
- var onPickerKeyDown = (0, _Picker.useToggleKeyDownEvent)((0, _extends3.default)({
275
+ var onPickerKeyDown = (0, _Picker.useToggleKeyDownEvent)((0, _extends2.default)({
260
276
  toggle: !focusItemValue || !active,
261
277
  trigger: trigger,
262
278
  target: target,
@@ -267,162 +283,79 @@ var Cascader = /*#__PURE__*/_react.default.forwardRef(function (props, ref) {
267
283
  onMenuKeyDown: onFocusItem,
268
284
  onMenuPressEnter: handleMenuPressEnter
269
285
  }, rest));
270
- var handleSelect = (0, _utils2.useEventCallback)(function (node, cascadePaths, isLeafNode, event) {
271
- var _node$childrenKey, _trigger$current2;
272
- onSelect === null || onSelect === void 0 ? void 0 : onSelect(node, cascadePaths, event);
273
- setActiveItem(node);
274
- var nextValue = node[valueKey];
275
-
276
- // Lazy load node's children
277
- if (typeof getChildren === 'function' && ((_node$childrenKey = node[childrenKey]) === null || _node$childrenKey === void 0 ? void 0 : _node$childrenKey.length) === 0 && !asyncChildrenMap.has(node)) {
278
- loadingItemsSet.add(node);
279
- var children = getChildren(node);
280
- if (children instanceof Promise) {
281
- children.then(function (data) {
282
- if (isMounted()) {
283
- loadingItemsSet.delete(node);
284
- asyncChildrenMap.set(node, data);
285
- }
286
- });
287
- } else {
288
- loadingItemsSet.delete(node);
289
- asyncChildrenMap.set(node, children);
290
- }
291
- }
292
- if (isLeafNode) {
293
- // Determines whether the option is a leaf node, and if so, closes the picker.
294
- handleClose();
295
- setValue(nextValue);
296
- if (!(0, _shallowEqual.default)(value, nextValue)) {
297
- onChange === null || onChange === void 0 ? void 0 : onChange(nextValue, event);
298
- }
299
- return;
300
- }
301
-
302
- /** When the parent is optional, the value and the displayed path are updated. */
303
- if (parentSelectable && !(0, _shallowEqual.default)(value, nextValue)) {
304
- setValue(nextValue);
305
- onChange === null || onChange === void 0 ? void 0 : onChange(nextValue, event);
306
- }
307
-
308
- // Update menu position
309
- (_trigger$current2 = trigger.current) === null || _trigger$current2 === void 0 ? void 0 : _trigger$current2.updatePosition();
310
- });
311
286
 
312
287
  /**
313
288
  * The search structure option is processed after being selected.
314
289
  */
315
- var handleSearchRowSelect = (0, _utils2.useEventCallback)(function (node, nodes, event) {
316
- var nextValue = node[valueKey];
290
+ var handleSearchRowSelect = (0, _utils.useEventCallback)(function (itemData, nodes, event) {
291
+ var nextValue = itemData[valueKey];
317
292
  handleClose();
318
293
  setSearchKeyword('');
319
294
  setValue(nextValue);
320
- onSelect === null || onSelect === void 0 ? void 0 : onSelect(node, nodes, event);
295
+ onSelect === null || onSelect === void 0 ? void 0 : onSelect(itemData, nodes, event);
321
296
  onChange === null || onChange === void 0 ? void 0 : onChange(nextValue, event);
322
297
  });
323
- var renderSearchRow = function renderSearchRow(item, key) {
324
- var regx = new RegExp((0, _utils2.getSafeRegExpString)(searchKeyword), 'ig');
325
- var nodes = (0, _treeUtils.getPathTowardsItem)(item, function (item) {
326
- return parentMap.get(item);
327
- });
328
- var formattedNodes = nodes.map(function (node) {
329
- var _extends2;
330
- var labelElements = [];
331
- var a = node[labelKey].split(regx);
332
- var b = node[labelKey].match(regx);
333
- for (var i = 0; i < a.length; i++) {
334
- labelElements.push(a[i]);
335
- if (b && b[i]) {
336
- labelElements.push( /*#__PURE__*/_react.default.createElement("span", {
337
- key: i,
338
- className: prefix('cascader-search-match')
339
- }, b[i]));
340
- }
341
- }
342
- return (0, _extends3.default)({}, node, (_extends2 = {}, _extends2[labelKey] = labelElements, _extends2));
343
- });
344
- var disabled = disabledItemValues.some(function (value) {
345
- return formattedNodes.some(function (node) {
346
- return node[valueKey] === value;
347
- });
348
- });
349
- var itemClasses = prefix('cascader-row', {
350
- 'cascader-row-disabled': disabled,
351
- 'cascader-row-focus': item[valueKey] === focusItemValue
352
- });
353
- var label = formattedNodes.map(function (node, index) {
354
- return /*#__PURE__*/_react.default.createElement("span", {
355
- key: "col-" + index,
356
- className: prefix('cascader-col')
357
- }, node[labelKey]);
358
- });
359
- return /*#__PURE__*/_react.default.createElement("div", {
360
- role: "treeitem",
361
- key: key,
362
- "aria-disabled": disabled,
363
- "data-key": item[valueKey],
364
- className: itemClasses,
365
- tabIndex: -1,
366
- onClick: function onClick(event) {
367
- if (!disabled) {
368
- handleSearchRowSelect(item, nodes, event);
369
- }
370
- }
371
- }, renderSearchItem ? renderSearchItem(label, nodes) : label);
298
+ var renderCascadeColumn = function renderCascadeColumn(childNodes, column) {
299
+ var items = column.items,
300
+ parentItem = column.parentItem,
301
+ layer = column.layer;
302
+ if (typeof renderColumn === 'function') {
303
+ return renderColumn(childNodes, column);
304
+ } else if (typeof DEPRECATED_renderMenu === 'function') {
305
+ return DEPRECATED_renderMenu(items, childNodes, parentItem, layer);
306
+ }
307
+ return childNodes;
372
308
  };
373
- var renderSearchResultPanel = function renderSearchResultPanel() {
374
- if (searchKeyword === '') {
375
- return null;
309
+ var renderCascadeTreeNode = function renderCascadeTreeNode(node, itemData) {
310
+ var render = typeof renderTreeNode === 'function' ? renderTreeNode : DEPRECATED_renderMenuItem;
311
+ if (typeof render === 'function') {
312
+ return render(node, itemData);
376
313
  }
377
- var items = getSearchResult();
378
- return /*#__PURE__*/_react.default.createElement("div", {
379
- className: prefix('cascader-search-panel'),
380
- "data-layer": 0,
381
- role: "tree"
382
- }, items.length ? items.map(renderSearchRow) : /*#__PURE__*/_react.default.createElement("div", {
383
- className: prefix('none')
384
- }, locale.noResultsText));
314
+ return node;
385
315
  };
386
316
  var renderTreeView = function renderTreeView(positionProps, speakerRef) {
387
317
  var _ref2 = positionProps || {},
388
318
  left = _ref2.left,
389
319
  top = _ref2.top,
390
320
  className = _ref2.className;
391
- var styles = (0, _extends3.default)({}, menuStyle, {
321
+ var styles = (0, _extends2.default)({}, DEPRECATED_menuStyle, popupStyle, {
392
322
  left: left,
393
323
  top: top
394
324
  });
395
- var classes = merge(className, menuClassName, prefix('cascader-menu', {
396
- inline: inline
397
- }));
325
+ var classes = merge(className, DEPRECATED_menuClassName, popupClassName, prefix('popup-cascader'));
398
326
  return /*#__PURE__*/_react.default.createElement(_Picker.PickerPopup, {
399
- ref: (0, _utils2.mergeRefs)(overlay, speakerRef),
327
+ ref: (0, _utils.mergeRefs)(overlay, speakerRef),
400
328
  className: classes,
401
329
  style: styles,
402
330
  target: trigger,
403
331
  onKeyDown: onPickerKeyDown
404
- }, searchable && /*#__PURE__*/_react.default.createElement(_SearchBox.default, {
405
- placeholder: locale === null || locale === void 0 ? void 0 : locale.searchPlaceholder,
406
- onChange: handleSearch,
407
- value: searchKeyword,
408
- inputRef: searchInput
409
- }), renderSearchResultPanel(), searchKeyword === '' && /*#__PURE__*/_react.default.createElement(_TreeView.default, {
410
- menuWidth: menuWidth,
411
- menuHeight: menuHeight,
332
+ }, searchable && /*#__PURE__*/_react.default.createElement(_SearchView.default, {
333
+ data: items,
334
+ searchKeyword: searchKeyword,
335
+ valueKey: valueKey,
336
+ labelKey: labelKey,
337
+ parentMap: parentMap,
338
+ disabledItemValues: disabledItemValues,
339
+ focusItemValue: focusItemValue,
340
+ inputRef: searchInput,
341
+ renderSearchItem: renderSearchItem,
342
+ onSelect: handleSearchRowSelect,
343
+ onSearch: handleSearch
344
+ }), searchKeyword === '' && /*#__PURE__*/_react.default.createElement(_TreeView.default, {
345
+ columnWidth: columnWidth !== null && columnWidth !== void 0 ? columnWidth : DEPRECATED_menuWidth,
346
+ columnHeight: columnHeight !== null && columnHeight !== void 0 ? columnHeight : DEPRECATED_menuHeight,
412
347
  disabledItemValues: disabledItemValues,
413
348
  loadingItemsSet: loadingItemsSet,
414
349
  valueKey: valueKey,
415
350
  labelKey: labelKey,
416
351
  childrenKey: childrenKey,
417
- classPrefix: 'picker-cascader-menu',
418
- cascadeData: columnsToDisplay,
352
+ classPrefix: 'cascade-tree',
353
+ data: columns,
419
354
  cascadePaths: pathTowardsActiveItem,
420
- activeItemValue: value
421
- // FIXME make onSelect generic
422
- ,
355
+ activeItemValue: value,
423
356
  onSelect: handleSelect,
424
- renderMenu: renderMenu,
425
- renderMenuItem: renderMenuItem
357
+ renderColumn: renderCascadeColumn,
358
+ renderTreeNode: renderCascadeTreeNode
426
359
  }), renderExtraFooter === null || renderExtraFooter === void 0 ? void 0 : renderExtraFooter());
427
360
  };
428
361
  var selectedElement = placeholder;
@@ -448,7 +381,7 @@ var Cascader = /*#__PURE__*/_react.default.forwardRef(function (props, ref) {
448
381
  hasValue = false;
449
382
  }
450
383
  }
451
- var _usePickerClassName = (0, _Picker.usePickerClassName)((0, _extends3.default)({}, props, {
384
+ var _usePickerClassName = (0, _Picker.usePickerClassName)((0, _extends2.default)({}, props, {
452
385
  classPrefix: classPrefix,
453
386
  hasValue: hasValue,
454
387
  name: 'cascader',
@@ -456,30 +389,26 @@ var Cascader = /*#__PURE__*/_react.default.forwardRef(function (props, ref) {
456
389
  cleanable: cleanable
457
390
  })),
458
391
  classes = _usePickerClassName[0],
459
- usedClassNamePropKeys = _usePickerClassName[1]; // TODO: bad api design
460
- // consider an isolated Menu component
461
- if (inline) {
462
- return renderTreeView();
463
- }
392
+ usedClassNamePropKeys = _usePickerClassName[1];
464
393
  return /*#__PURE__*/_react.default.createElement(_Picker.PickerToggleTrigger, {
465
394
  id: id,
466
395
  popupType: "tree",
467
396
  pickerProps: (0, _pick.default)(props, _Picker.pickTriggerPropKeys),
468
397
  ref: trigger,
469
398
  placement: placement,
470
- onEntered: (0, _utils2.createChainedFunction)(handleEntered, onEnter),
471
- onExited: (0, _utils2.createChainedFunction)(handleExited, onExited),
399
+ onEntered: handleEntered,
400
+ onExited: handleExited,
472
401
  speaker: renderTreeView
473
402
  }, /*#__PURE__*/_react.default.createElement(Component, {
474
403
  className: classes,
475
404
  style: style,
476
405
  ref: root
477
- }, /*#__PURE__*/_react.default.createElement(_Picker.PickerToggle, (0, _extends3.default)({}, (0, _omit.default)(rest, [].concat(_Picker.omitTriggerPropKeys, usedClassNamePropKeys)), {
406
+ }, /*#__PURE__*/_react.default.createElement(_Picker.PickerToggle, (0, _extends2.default)({}, (0, _omit.default)(rest, [].concat(_Picker.omitTriggerPropKeys, usedClassNamePropKeys)), {
478
407
  ref: target,
479
408
  as: toggleAs,
480
409
  appearance: appearance,
481
410
  disabled: disabled,
482
- onClean: (0, _utils2.createChainedFunction)(handleClean, onClean),
411
+ onClean: (0, _utils.createChainedFunction)(handleClean, onClean),
483
412
  onKeyDown: onPickerKeyDown,
484
413
  cleanable: cleanable && !disabled,
485
414
  hasValue: hasValue,
@@ -490,21 +419,25 @@ var Cascader = /*#__PURE__*/_react.default.forwardRef(function (props, ref) {
490
419
  }), selectedElement || (locale === null || locale === void 0 ? void 0 : locale.placeholder))));
491
420
  });
492
421
  Cascader.displayName = 'Cascader';
493
- Cascader.propTypes = (0, _extends3.default)({}, _Picker.listPickerPropTypes, {
422
+ Cascader.propTypes = (0, _extends2.default)({}, _Picker.listPickerPropTypes, {
494
423
  disabledItemValues: _propTypes.default.array,
495
424
  locale: _propTypes.default.any,
496
425
  appearance: (0, _propTypes2.oneOf)(['default', 'subtle']),
497
- renderMenu: _propTypes.default.func,
498
426
  onSelect: _propTypes.default.func,
499
427
  onSearch: _propTypes.default.func,
500
428
  cleanable: _propTypes.default.bool,
501
- renderMenuItem: _propTypes.default.func,
429
+ renderColumn: _propTypes.default.func,
430
+ renderTreeNode: _propTypes.default.func,
502
431
  renderSearchItem: _propTypes.default.func,
503
- menuWidth: _propTypes.default.number,
504
- menuHeight: _propTypes.default.oneOfType([_propTypes.default.number, _propTypes.default.string]),
432
+ columnWidth: _propTypes.default.number,
433
+ columnHeight: _propTypes.default.number,
505
434
  searchable: _propTypes.default.bool,
506
- inline: _propTypes.default.bool,
507
- parentSelectable: _propTypes.default.bool
435
+ parentSelectable: _propTypes.default.bool,
436
+ inline: (0, _propTypes2.deprecatePropTypeNew)(_propTypes.default.bool, 'Use `<CascadeTree>` instead.'),
437
+ renderMenu: (0, _propTypes2.deprecatePropTypeNew)(_propTypes.default.func, 'Use "renderColumn" property instead.'),
438
+ renderMenuItem: (0, _propTypes2.deprecatePropTypeNew)(_propTypes.default.func, 'Use "renderTreeNode" property instead.'),
439
+ menuWidth: (0, _propTypes2.deprecatePropTypeNew)(_propTypes.default.number, 'Use "columnWidth" property instead.'),
440
+ menuHeight: (0, _propTypes2.deprecatePropTypeNew)(_propTypes.default.number, 'Use "columnHeight" property instead.')
508
441
  });
509
442
  var _default = Cascader;
510
443
  exports.default = _default;
@@ -0,0 +1,15 @@
1
+ /// <reference types="react" />
2
+ interface UseActiveProps {
3
+ target: React.RefObject<HTMLElement>;
4
+ onOpen?: () => void;
5
+ onClose?: () => void;
6
+ onEntered?: (node: HTMLElement) => void;
7
+ onExited?: (node: HTMLElement) => void;
8
+ setSearchKeyword: (keyword: string) => void;
9
+ }
10
+ declare const useActive: (props: UseActiveProps) => {
11
+ active: boolean;
12
+ handleEntered: (...args: any[]) => any;
13
+ handleExited: (...args: any[]) => any;
14
+ };
15
+ export default useActive;