rsuite 5.31.1 → 5.33.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 (66) hide show
  1. package/CHANGELOG.md +17 -0
  2. package/cjs/Calendar/CalendarContainer.d.ts +2 -0
  3. package/cjs/Calendar/CalendarContainer.js +4 -1
  4. package/cjs/Calendar/MonthDropdown.js +1 -1
  5. package/cjs/Cascader/Cascader.d.ts +2 -2
  6. package/cjs/Cascader/Cascader.js +83 -71
  7. package/cjs/Cascader/DropdownMenu.d.ts +6 -2
  8. package/cjs/Cascader/DropdownMenu.js +8 -4
  9. package/cjs/Cascader/utils.d.ts +43 -17
  10. package/cjs/Cascader/utils.js +60 -145
  11. package/cjs/CheckTreePicker/CheckTreePicker.js +16 -3
  12. package/cjs/DatePicker/DatePicker.d.ts +3 -1
  13. package/cjs/DatePicker/DatePicker.js +4 -1
  14. package/cjs/DateRangePicker/Calendar.d.ts +1 -0
  15. package/cjs/DateRangePicker/Calendar.js +4 -1
  16. package/cjs/DateRangePicker/DateRangePicker.d.ts +3 -1
  17. package/cjs/DateRangePicker/DateRangePicker.js +4 -1
  18. package/cjs/MultiCascader/DropdownMenu.d.ts +2 -2
  19. package/cjs/MultiCascader/MultiCascader.d.ts +1 -1
  20. package/cjs/MultiCascader/MultiCascader.js +12 -7
  21. package/cjs/MultiCascader/utils.d.ts +2 -2
  22. package/cjs/MultiCascader/utils.js +3 -3
  23. package/cjs/Picker/utils.d.ts +4 -3
  24. package/cjs/Picker/utils.js +8 -4
  25. package/cjs/Tree/Tree.d.ts +2 -0
  26. package/cjs/TreePicker/TreePicker.js +16 -3
  27. package/cjs/utils/getDataGroupBy.js +1 -1
  28. package/cjs/utils/treeUtils.d.ts +23 -1
  29. package/cjs/utils/treeUtils.js +109 -6
  30. package/cjs/utils/useMap.d.ts +6 -0
  31. package/cjs/utils/useMap.js +35 -0
  32. package/dist/rsuite.js +189 -17
  33. package/dist/rsuite.js.map +1 -1
  34. package/dist/rsuite.min.js +1 -1
  35. package/dist/rsuite.min.js.map +1 -1
  36. package/esm/Calendar/CalendarContainer.d.ts +2 -0
  37. package/esm/Calendar/CalendarContainer.js +4 -1
  38. package/esm/Calendar/MonthDropdown.js +1 -1
  39. package/esm/Cascader/Cascader.d.ts +2 -2
  40. package/esm/Cascader/Cascader.js +84 -74
  41. package/esm/Cascader/DropdownMenu.d.ts +6 -2
  42. package/esm/Cascader/DropdownMenu.js +8 -4
  43. package/esm/Cascader/utils.d.ts +43 -17
  44. package/esm/Cascader/utils.js +64 -142
  45. package/esm/CheckTreePicker/CheckTreePicker.js +17 -4
  46. package/esm/DatePicker/DatePicker.d.ts +3 -1
  47. package/esm/DatePicker/DatePicker.js +4 -1
  48. package/esm/DateRangePicker/Calendar.d.ts +1 -0
  49. package/esm/DateRangePicker/Calendar.js +4 -1
  50. package/esm/DateRangePicker/DateRangePicker.d.ts +3 -1
  51. package/esm/DateRangePicker/DateRangePicker.js +4 -1
  52. package/esm/MultiCascader/DropdownMenu.d.ts +2 -2
  53. package/esm/MultiCascader/MultiCascader.d.ts +1 -1
  54. package/esm/MultiCascader/MultiCascader.js +12 -7
  55. package/esm/MultiCascader/utils.d.ts +2 -2
  56. package/esm/MultiCascader/utils.js +4 -4
  57. package/esm/Picker/utils.d.ts +4 -3
  58. package/esm/Picker/utils.js +8 -4
  59. package/esm/Tree/Tree.d.ts +2 -0
  60. package/esm/TreePicker/TreePicker.js +18 -5
  61. package/esm/utils/getDataGroupBy.js +2 -2
  62. package/esm/utils/treeUtils.d.ts +23 -1
  63. package/esm/utils/treeUtils.js +103 -6
  64. package/esm/utils/useMap.d.ts +6 -0
  65. package/esm/utils/useMap.js +29 -0
  66. package/package.json +2 -1
@@ -104,6 +104,7 @@ var TreePicker = /*#__PURE__*/_react.default.forwardRef(function (props, ref) {
104
104
  onOpen = props.onOpen,
105
105
  onSearch = props.onSearch,
106
106
  onSelect = props.onSelect,
107
+ onSelectItem = props.onSelectItem,
107
108
  onChange = props.onChange,
108
109
  onEntered = props.onEntered,
109
110
  onClose = props.onClose,
@@ -117,7 +118,7 @@ var TreePicker = /*#__PURE__*/_react.default.forwardRef(function (props, ref) {
117
118
  renderExtraFooter = props.renderExtraFooter,
118
119
  renderMenu = props.renderMenu,
119
120
  renderValue = props.renderValue,
120
- rest = (0, _objectWithoutPropertiesLoose2.default)(props, ["as", "data", "appearance", "style", "showIndentLine", "value", "locale", "height", "menuMaxHeight", "menuStyle", "className", "disabled", "placement", "cleanable", "searchable", "virtualized", "classPrefix", "defaultValue", "placeholder", "searchKeyword", "menuClassName", "menuAutoWidth", "searchBy", "toggleAs", "labelKey", "valueKey", "childrenKey", "draggable", "defaultExpandAll", "disabledItemValues", "expandItemValues", "defaultExpandItemValues", "id", "listProps", "getChildren", "renderTreeIcon", "renderTreeNode", "onExit", "onExited", "onClean", "onOpen", "onSearch", "onSelect", "onChange", "onEntered", "onClose", "onDragEnd", "onDragStart", "onDragEnter", "onDragLeave", "onDragOver", "onDrop", "onExpand", "renderExtraFooter", "renderMenu", "renderValue"]);
121
+ rest = (0, _objectWithoutPropertiesLoose2.default)(props, ["as", "data", "appearance", "style", "showIndentLine", "value", "locale", "height", "menuMaxHeight", "menuStyle", "className", "disabled", "placement", "cleanable", "searchable", "virtualized", "classPrefix", "defaultValue", "placeholder", "searchKeyword", "menuClassName", "menuAutoWidth", "searchBy", "toggleAs", "labelKey", "valueKey", "childrenKey", "draggable", "defaultExpandAll", "disabledItemValues", "expandItemValues", "defaultExpandItemValues", "id", "listProps", "getChildren", "renderTreeIcon", "renderTreeNode", "onExit", "onExited", "onClean", "onOpen", "onSearch", "onSelect", "onSelectItem", "onChange", "onEntered", "onClose", "onDragEnd", "onDragStart", "onDragEnter", "onDragLeave", "onDragOver", "onDrop", "onExpand", "renderExtraFooter", "renderMenu", "renderValue"]);
121
122
  var triggerRef = (0, _react.useRef)(null);
122
123
  var targetRef = (0, _react.useRef)(null);
123
124
  var listRef = (0, _react.useRef)(null);
@@ -313,8 +314,17 @@ var TreePicker = /*#__PURE__*/_react.default.forwardRef(function (props, ref) {
313
314
  onRenderTreeNode: renderTreeNode,
314
315
  onRenderTreeIcon: renderTreeIcon
315
316
  };
316
- };
317
+ }; // TODO-Doma
318
+ // Replace `getKeyParentMap` with `getParentMap`
319
+
317
320
 
321
+ var itemParentMap = (0, _react.useMemo)(function () {
322
+ return (0, _treeUtils.getKeyParentMap)(data, function (node) {
323
+ return node[valueKey];
324
+ }, function (node) {
325
+ return node[childrenKey];
326
+ });
327
+ }, [childrenKey, data, valueKey]);
318
328
  var handleSelect = (0, _react.useCallback)(function (nodeData, event) {
319
329
  var _targetRef$current, _triggerRef$current, _triggerRef$current$c;
320
330
 
@@ -331,9 +341,12 @@ var TreePicker = /*#__PURE__*/_react.default.forwardRef(function (props, ref) {
331
341
  setFocusItemValue(nodeData[valueKey]);
332
342
  onChange === null || onChange === void 0 ? void 0 : onChange(nodeValue, event);
333
343
  onSelect === null || onSelect === void 0 ? void 0 : onSelect(nodeData, nodeValue, event);
344
+ onSelectItem === null || onSelectItem === void 0 ? void 0 : onSelectItem(nodeData, (0, _treeUtils.getPathTowardsItem)(nodeData, function (item) {
345
+ return itemParentMap.get(item[valueKey]);
346
+ }));
334
347
  (_targetRef$current = targetRef.current) === null || _targetRef$current === void 0 ? void 0 : _targetRef$current.focus();
335
348
  (_triggerRef$current = triggerRef.current) === null || _triggerRef$current === void 0 ? void 0 : (_triggerRef$current$c = _triggerRef$current.close) === null || _triggerRef$current$c === void 0 ? void 0 : _triggerRef$current$c.call(_triggerRef$current);
336
- }, [valueKey, isControlled, onChange, onSelect, setValue]);
349
+ }, [valueKey, isControlled, onChange, onSelect, onSelectItem, setValue, itemParentMap]);
337
350
  var handleExpand = (0, _react.useCallback)(function (node) {
338
351
  var nextExpandItemValues = (0, _treeUtils.toggleExpand)({
339
352
  node: node,
@@ -50,5 +50,5 @@ function getDataGroupBy(data, key, sort) {
50
50
  nextData = nextData.sort(sort(true));
51
51
  }
52
52
 
53
- return (0, _treeUtils.flattenTree)(nextData);
53
+ return (0, _treeUtils.UNSAFE_flattenTree)(nextData);
54
54
  }
@@ -16,8 +16,12 @@ export declare function shouldShowNodeByParentExpanded<T>(expandItemValues?: T[]
16
16
  * @param {*} tree
17
17
  * @param {*} childrenKey
18
18
  * @param {*} executor
19
+ *
20
+ * @deprecated This {@link UNSAFE_flattenTree} function is considered unsafe because it mutates `tree` argument in-place
21
+ * Use {@link flattenTree} instead.
19
22
  */
20
- export declare function flattenTree<TItem>(tree: TItem[], childrenKey?: string, executor?: (node: any, index: number) => any): TItem[];
23
+ export declare function UNSAFE_flattenTree<TItem>(tree: TItem[], childrenKey?: string, executor?: (node: any, index: number) => any): TItem[];
24
+ export declare function flattenTree<T>(rootNodes: readonly T[], getChildren: (node: T) => readonly T[] | undefined): T[];
21
25
  /**
22
26
  * get all ancestor nodes of given node
23
27
  * @param {*} node
@@ -274,3 +278,21 @@ export declare function createDragPreview(name: string, className: string): HTML
274
278
  */
275
279
  export declare function removeDragPreview(): void;
276
280
  export declare function stringifyTreeNodeLabel(label: string | React.ReactNode): string;
281
+ /**
282
+ * Returns a WeakMap that maps each item in `items` to its parent
283
+ * indicated by `getChildren` function
284
+ */
285
+ export declare function getParentMap<T extends Record<string, unknown>>(items: readonly T[], getChildren: (item: T) => readonly T[] | undefined): WeakMap<T, T>;
286
+ /**
287
+ * Returns a Map that maps each item's "key", indicated by `getKey` function,
288
+ * to its parent indicated by `getChildren` function
289
+ *
290
+ * NOTICE:
291
+ * Using this function is discouraged.
292
+ * Use {@link getParentMap} whenever possible.
293
+ */
294
+ export declare function getKeyParentMap<T extends Record<string, unknown>, K = React.Key>(items: readonly T[], getKey: (item: T) => K, getChildren: (item: T) => readonly T[] | undefined): Map<K, T>;
295
+ /**
296
+ * Returns an array indicating the hirearchy path from root towards `target` item
297
+ */
298
+ export declare function getPathTowardsItem<T>(target: T | undefined, getParent: (item: T) => T | undefined): T[];
@@ -6,6 +6,7 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
6
6
 
7
7
  exports.__esModule = true;
8
8
  exports.shouldShowNodeByParentExpanded = shouldShowNodeByParentExpanded;
9
+ exports.UNSAFE_flattenTree = UNSAFE_flattenTree;
9
10
  exports.flattenTree = flattenTree;
10
11
  exports.getNodeParents = getNodeParents;
11
12
  exports.getNodeParentKeys = getNodeParentKeys;
@@ -38,6 +39,9 @@ exports.getNodeFormattedRefKey = getNodeFormattedRefKey;
38
39
  exports.createDragPreview = createDragPreview;
39
40
  exports.removeDragPreview = removeDragPreview;
40
41
  exports.stringifyTreeNodeLabel = stringifyTreeNodeLabel;
42
+ exports.getParentMap = getParentMap;
43
+ exports.getKeyParentMap = getKeyParentMap;
44
+ exports.getPathTowardsItem = getPathTowardsItem;
41
45
  exports.getScrollToIndex = exports.focusPreviousItem = exports.focusNextItem = exports.focusTreeNode = exports.getElementByDataKey = exports.getActiveItem = exports.getActiveIndex = exports.getFocusableItems = void 0;
42
46
 
43
47
  var _extends3 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
@@ -72,6 +76,12 @@ var _constants = require("./constants");
72
76
 
73
77
  var _attachParent = require("./attachParent");
74
78
 
79
+ function _createForOfIteratorHelperLoose(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (it) return (it = it.call(o)).next.bind(it); if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; return function () { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
80
+
81
+ function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
82
+
83
+ function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
84
+
75
85
  // gap of tree node
76
86
  var TREE_NODE_GAP = 4;
77
87
  /**
@@ -102,10 +112,13 @@ function shouldShowNodeByParentExpanded(expandItemValues, parentKeys) {
102
112
  * @param {*} tree
103
113
  * @param {*} childrenKey
104
114
  * @param {*} executor
115
+ *
116
+ * @deprecated This {@link UNSAFE_flattenTree} function is considered unsafe because it mutates `tree` argument in-place
117
+ * Use {@link flattenTree} instead.
105
118
  */
106
119
 
107
120
 
108
- function flattenTree(tree, childrenKey, executor) {
121
+ function UNSAFE_flattenTree(tree, childrenKey, executor) {
109
122
  if (childrenKey === void 0) {
110
123
  childrenKey = 'children';
111
124
  }
@@ -130,6 +143,27 @@ function flattenTree(tree, childrenKey, executor) {
130
143
  traverse(tree, null);
131
144
  return flattenData;
132
145
  }
146
+
147
+ function flattenTree(rootNodes, getChildren) {
148
+ var result = [];
149
+ walkTree(rootNodes, getChildren, function (node) {
150
+ return result.push(node);
151
+ });
152
+ return result;
153
+ }
154
+
155
+ function walkTree(rootNodes, getChildren, callback) {
156
+ for (var queue = [].concat(rootNodes); queue.length > 0;) {
157
+ var _node = queue.shift();
158
+
159
+ callback(_node);
160
+ var children = getChildren(_node);
161
+
162
+ if (children) {
163
+ queue.push.apply(queue, children);
164
+ }
165
+ }
166
+ }
133
167
  /**
134
168
  * get all ancestor nodes of given node
135
169
  * @param {*} node
@@ -212,7 +246,7 @@ function getDefaultExpandItemValues(data, props) {
212
246
  defaultExpandItemValues = _props$defaultExpandI === void 0 ? [] : _props$defaultExpandI;
213
247
 
214
248
  if (defaultExpandAll) {
215
- return flattenTree(data, childrenKey).filter(function (item) {
249
+ return UNSAFE_flattenTree(data, childrenKey).filter(function (item) {
216
250
  return Array.isArray(item[childrenKey]) && item[childrenKey].length > 0;
217
251
  }).map(function (item) {
218
252
  return item[valueKey];
@@ -379,10 +413,10 @@ function findNodeOfTree(data, check) {
379
413
  var _item3 = nodes[i];
380
414
 
381
415
  if ((0, _isArray2.default)(_item3.children)) {
382
- var _node = findNode(_item3.children);
416
+ var _node2 = findNode(_item3.children);
383
417
 
384
- if (_node) {
385
- return _node;
418
+ if (_node2) {
419
+ return _node2;
386
420
  }
387
421
  }
388
422
 
@@ -875,7 +909,7 @@ function useFlattenTreeData(_ref8) {
875
909
  var formatVirtualizedTreeData = function formatVirtualizedTreeData(nodes, data, expandItemValues, options) {
876
910
  var cascade = options.cascade,
877
911
  searchKeyword = options.searchKeyword;
878
- return flattenTree(data, childrenKey, function (node) {
912
+ return UNSAFE_flattenTree(data, childrenKey, function (node) {
879
913
  var formatted = {};
880
914
  var curNode = nodes === null || nodes === void 0 ? void 0 : nodes[node.refKey];
881
915
  var parentKeys = getNodeParentKeys(nodes, curNode, valueKey);
@@ -1170,4 +1204,73 @@ function stringifyTreeNodeLabel(label) {
1170
1204
  }
1171
1205
 
1172
1206
  return '';
1207
+ }
1208
+ /**
1209
+ * Returns a WeakMap that maps each item in `items` to its parent
1210
+ * indicated by `getChildren` function
1211
+ */
1212
+
1213
+
1214
+ function getParentMap(items, getChildren) {
1215
+ var map = new WeakMap();
1216
+
1217
+ for (var queue = [].concat(items); queue.length > 0;) {
1218
+ var _item5 = queue.shift();
1219
+
1220
+ var children = getChildren(_item5);
1221
+
1222
+ if (children) {
1223
+ for (var _iterator = _createForOfIteratorHelperLoose(children), _step; !(_step = _iterator()).done;) {
1224
+ var child = _step.value;
1225
+ map.set(child, _item5);
1226
+ queue.push(child);
1227
+ }
1228
+ }
1229
+ }
1230
+
1231
+ return map;
1232
+ }
1233
+ /**
1234
+ * Returns a Map that maps each item's "key", indicated by `getKey` function,
1235
+ * to its parent indicated by `getChildren` function
1236
+ *
1237
+ * NOTICE:
1238
+ * Using this function is discouraged.
1239
+ * Use {@link getParentMap} whenever possible.
1240
+ */
1241
+
1242
+
1243
+ function getKeyParentMap(items, getKey, getChildren) {
1244
+ var map = new Map();
1245
+
1246
+ for (var queue = [].concat(items); queue.length > 0;) {
1247
+ var _item6 = queue.shift();
1248
+
1249
+ var children = getChildren(_item6);
1250
+
1251
+ if (children) {
1252
+ for (var _iterator2 = _createForOfIteratorHelperLoose(children), _step2; !(_step2 = _iterator2()).done;) {
1253
+ var child = _step2.value;
1254
+ map.set(getKey(child), _item6);
1255
+ queue.push(child);
1256
+ }
1257
+ }
1258
+ }
1259
+
1260
+ return map;
1261
+ }
1262
+ /**
1263
+ * Returns an array indicating the hirearchy path from root towards `target` item
1264
+ */
1265
+
1266
+
1267
+ function getPathTowardsItem(target, getParent) {
1268
+ if (!target) return [];
1269
+ var path = [target];
1270
+
1271
+ for (var parent = getParent(target); !!parent; parent = getParent(parent)) {
1272
+ path.unshift(parent);
1273
+ }
1274
+
1275
+ return path;
1173
1276
  }
@@ -0,0 +1,6 @@
1
+ export declare function useMap<K, V>(): {
2
+ has(key: K): boolean;
3
+ get(key: K): V | undefined;
4
+ set(key: K, value: V): void;
5
+ clear(): void;
6
+ };
@@ -0,0 +1,35 @@
1
+ "use strict";
2
+
3
+ exports.__esModule = true;
4
+ exports.useMap = useMap;
5
+
6
+ var _react = require("react");
7
+
8
+ function useMap() {
9
+ var _useState = (0, _react.useState)(function () {
10
+ return new Map();
11
+ }),
12
+ map = _useState[0],
13
+ setMap = _useState[1];
14
+
15
+ return (0, _react.useMemo)(function () {
16
+ return {
17
+ has: function has(key) {
18
+ return map.has(key);
19
+ },
20
+ get: function get(key) {
21
+ return map.get(key);
22
+ },
23
+ set: function set(key, value) {
24
+ setMap(function (prev) {
25
+ var copy = new Map(prev);
26
+ copy.set(key, value);
27
+ return copy;
28
+ });
29
+ },
30
+ clear: function clear() {
31
+ setMap(new Map());
32
+ }
33
+ };
34
+ }, [map]);
35
+ }