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
@@ -5,11 +5,11 @@ import _isNil from "lodash/isNil";
5
5
  import _isUndefined from "lodash/isUndefined";
6
6
  import _omit from "lodash/omit";
7
7
  import _pick from "lodash/pick";
8
- import React, { useState, useRef, useEffect, useCallback, useContext } from 'react';
8
+ import React, { useState, useRef, useEffect, useCallback, useContext, useMemo } from 'react';
9
9
  import PropTypes from 'prop-types';
10
10
  import { List, AutoSizer } from '../Windowing';
11
11
  import TreeNode from './TreeNode';
12
- import { createDragPreview, getTreeNodeIndent, removeDragPreview, stringifyTreeNodeLabel } from '../utils/treeUtils';
12
+ import { createDragPreview, getKeyParentMap, getPathTowardsItem, getTreeNodeIndent, removeDragPreview, stringifyTreeNodeLabel } from '../utils/treeUtils';
13
13
  import { createChainedFunction, useClassNames, useCustom, useControlled, TREE_NODE_DROP_POSITION, KEY_VALUES, mergeRefs, shallowEqual } from '../utils';
14
14
  import { getExpandWhenSearching, hasVisibleChildren, getDragNodeKeys, calDropNodePosition, createUpdateTreeDataFunction, useTreeDrag, useFlattenTreeData, getTreeActiveNode, getDefaultExpandItemValues, useTreeNodeRefs, useTreeSearch, focusPreviousItem, getFocusableItems, focusNextItem, getActiveItem, toggleExpand, useGetTreeNodeChildren, focusToActiveTreeNode, leftArrowHandler, focusTreeNode, rightArrowHandler, isSearching } from '../utils/treeUtils';
15
15
  import { PickerToggle, PickerOverlay, SearchBar, PickerToggleTrigger, createConcatChildrenFunction, usePickerClassName, onMenuKeyDown as _onMenuKeyDown, usePublicMethods, listPickerPropTypes, pickTriggerPropKeys, omitTriggerPropKeys, useToggleKeyDownEvent } from '../Picker';
@@ -81,6 +81,7 @@ var TreePicker = /*#__PURE__*/React.forwardRef(function (props, ref) {
81
81
  onOpen = props.onOpen,
82
82
  onSearch = props.onSearch,
83
83
  onSelect = props.onSelect,
84
+ onSelectItem = props.onSelectItem,
84
85
  onChange = props.onChange,
85
86
  onEntered = props.onEntered,
86
87
  onClose = props.onClose,
@@ -94,7 +95,7 @@ var TreePicker = /*#__PURE__*/React.forwardRef(function (props, ref) {
94
95
  renderExtraFooter = props.renderExtraFooter,
95
96
  renderMenu = props.renderMenu,
96
97
  renderValue = props.renderValue,
97
- rest = _objectWithoutPropertiesLoose(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"]);
98
+ rest = _objectWithoutPropertiesLoose(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"]);
98
99
 
99
100
  var triggerRef = useRef(null);
100
101
  var targetRef = useRef(null);
@@ -291,8 +292,17 @@ var TreePicker = /*#__PURE__*/React.forwardRef(function (props, ref) {
291
292
  onRenderTreeNode: renderTreeNode,
292
293
  onRenderTreeIcon: renderTreeIcon
293
294
  };
294
- };
295
+ }; // TODO-Doma
296
+ // Replace `getKeyParentMap` with `getParentMap`
297
+
295
298
 
299
+ var itemParentMap = useMemo(function () {
300
+ return getKeyParentMap(data, function (node) {
301
+ return node[valueKey];
302
+ }, function (node) {
303
+ return node[childrenKey];
304
+ });
305
+ }, [childrenKey, data, valueKey]);
296
306
  var handleSelect = useCallback(function (nodeData, event) {
297
307
  var _targetRef$current, _triggerRef$current, _triggerRef$current$c;
298
308
 
@@ -309,9 +319,12 @@ var TreePicker = /*#__PURE__*/React.forwardRef(function (props, ref) {
309
319
  setFocusItemValue(nodeData[valueKey]);
310
320
  onChange === null || onChange === void 0 ? void 0 : onChange(nodeValue, event);
311
321
  onSelect === null || onSelect === void 0 ? void 0 : onSelect(nodeData, nodeValue, event);
322
+ onSelectItem === null || onSelectItem === void 0 ? void 0 : onSelectItem(nodeData, getPathTowardsItem(nodeData, function (item) {
323
+ return itemParentMap.get(item[valueKey]);
324
+ }));
312
325
  (_targetRef$current = targetRef.current) === null || _targetRef$current === void 0 ? void 0 : _targetRef$current.focus();
313
326
  (_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);
314
- }, [valueKey, isControlled, onChange, onSelect, setValue]);
327
+ }, [valueKey, isControlled, onChange, onSelect, onSelectItem, setValue, itemParentMap]);
315
328
  var handleExpand = useCallback(function (node) {
316
329
  var nextExpandItemValues = toggleExpand({
317
330
  node: node,
@@ -1,5 +1,5 @@
1
1
  import _get from "lodash/get";
2
- import { flattenTree } from '../utils/treeUtils';
2
+ import { UNSAFE_flattenTree } from '../utils/treeUtils';
3
3
  var hasSymbol = typeof Symbol === 'function';
4
4
  export var KEY_GROUP = hasSymbol ? Symbol('_$grouped') : '_$grouped';
5
5
  export var KEY_GROUP_TITLE = 'groupTitle';
@@ -37,5 +37,5 @@ export default function getDataGroupBy(data, key, sort) {
37
37
  nextData = nextData.sort(sort(true));
38
38
  }
39
39
 
40
- return flattenTree(nextData);
40
+ return UNSAFE_flattenTree(nextData);
41
41
  }
@@ -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,13 @@ import _isArray from "lodash/isArray";
6
6
  import _omit from "lodash/omit";
7
7
  import _isUndefined from "lodash/isUndefined";
8
8
  import _intersection from "lodash/intersection";
9
+
10
+ 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."); }
11
+
12
+ 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); }
13
+
14
+ 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; }
15
+
9
16
  import React, { useRef, useState, useEffect, useCallback } from 'react';
10
17
  import shallowEqualArray from '../utils/shallowEqualArray';
11
18
  import { getNodeCheckState } from '../CheckTreePicker/utils';
@@ -44,9 +51,12 @@ export function shouldShowNodeByParentExpanded(expandItemValues, parentKeys) {
44
51
  * @param {*} tree
45
52
  * @param {*} childrenKey
46
53
  * @param {*} executor
54
+ *
55
+ * @deprecated This {@link UNSAFE_flattenTree} function is considered unsafe because it mutates `tree` argument in-place
56
+ * Use {@link flattenTree} instead.
47
57
  */
48
58
 
49
- export function flattenTree(tree, childrenKey, executor) {
59
+ export function UNSAFE_flattenTree(tree, childrenKey, executor) {
50
60
  if (childrenKey === void 0) {
51
61
  childrenKey = 'children';
52
62
  }
@@ -71,11 +81,32 @@ export function flattenTree(tree, childrenKey, executor) {
71
81
  traverse(tree, null);
72
82
  return flattenData;
73
83
  }
84
+ export function flattenTree(rootNodes, getChildren) {
85
+ var result = [];
86
+ walkTree(rootNodes, getChildren, function (node) {
87
+ return result.push(node);
88
+ });
89
+ return result;
90
+ }
91
+
92
+ function walkTree(rootNodes, getChildren, callback) {
93
+ for (var queue = [].concat(rootNodes); queue.length > 0;) {
94
+ var _node = queue.shift();
95
+
96
+ callback(_node);
97
+ var children = getChildren(_node);
98
+
99
+ if (children) {
100
+ queue.push.apply(queue, children);
101
+ }
102
+ }
103
+ }
74
104
  /**
75
105
  * get all ancestor nodes of given node
76
106
  * @param {*} node
77
107
  */
78
108
 
109
+
79
110
  export function getNodeParents(node, parentKey, valueKey) {
80
111
  if (parentKey === void 0) {
81
112
  parentKey = 'parent';
@@ -148,7 +179,7 @@ export function getDefaultExpandItemValues(data, props) {
148
179
  defaultExpandItemValues = _props$defaultExpandI === void 0 ? [] : _props$defaultExpandI;
149
180
 
150
181
  if (defaultExpandAll) {
151
- return flattenTree(data, childrenKey).filter(function (item) {
182
+ return UNSAFE_flattenTree(data, childrenKey).filter(function (item) {
152
183
  return Array.isArray(item[childrenKey]) && item[childrenKey].length > 0;
153
184
  }).map(function (item) {
154
185
  return item[valueKey];
@@ -311,10 +342,10 @@ export function findNodeOfTree(data, check) {
311
342
  var _item3 = nodes[i];
312
343
 
313
344
  if (_isArray(_item3.children)) {
314
- var _node = findNode(_item3.children);
345
+ var _node2 = findNode(_item3.children);
315
346
 
316
- if (_node) {
317
- return _node;
347
+ if (_node2) {
348
+ return _node2;
318
349
  }
319
350
  }
320
351
 
@@ -780,7 +811,7 @@ export function useFlattenTreeData(_ref8) {
780
811
  var formatVirtualizedTreeData = function formatVirtualizedTreeData(nodes, data, expandItemValues, options) {
781
812
  var cascade = options.cascade,
782
813
  searchKeyword = options.searchKeyword;
783
- return flattenTree(data, childrenKey, function (node) {
814
+ return UNSAFE_flattenTree(data, childrenKey, function (node) {
784
815
  var formatted = {};
785
816
  var curNode = nodes === null || nodes === void 0 ? void 0 : nodes[node.refKey];
786
817
  var parentKeys = getNodeParentKeys(nodes, curNode, valueKey);
@@ -1067,4 +1098,70 @@ export function stringifyTreeNodeLabel(label) {
1067
1098
  }
1068
1099
 
1069
1100
  return '';
1101
+ }
1102
+ /**
1103
+ * Returns a WeakMap that maps each item in `items` to its parent
1104
+ * indicated by `getChildren` function
1105
+ */
1106
+
1107
+ export function getParentMap(items, getChildren) {
1108
+ var map = new WeakMap();
1109
+
1110
+ for (var queue = [].concat(items); queue.length > 0;) {
1111
+ var _item5 = queue.shift();
1112
+
1113
+ var children = getChildren(_item5);
1114
+
1115
+ if (children) {
1116
+ for (var _iterator = _createForOfIteratorHelperLoose(children), _step; !(_step = _iterator()).done;) {
1117
+ var child = _step.value;
1118
+ map.set(child, _item5);
1119
+ queue.push(child);
1120
+ }
1121
+ }
1122
+ }
1123
+
1124
+ return map;
1125
+ }
1126
+ /**
1127
+ * Returns a Map that maps each item's "key", indicated by `getKey` function,
1128
+ * to its parent indicated by `getChildren` function
1129
+ *
1130
+ * NOTICE:
1131
+ * Using this function is discouraged.
1132
+ * Use {@link getParentMap} whenever possible.
1133
+ */
1134
+
1135
+ export function getKeyParentMap(items, getKey, getChildren) {
1136
+ var map = new Map();
1137
+
1138
+ for (var queue = [].concat(items); queue.length > 0;) {
1139
+ var _item6 = queue.shift();
1140
+
1141
+ var children = getChildren(_item6);
1142
+
1143
+ if (children) {
1144
+ for (var _iterator2 = _createForOfIteratorHelperLoose(children), _step2; !(_step2 = _iterator2()).done;) {
1145
+ var child = _step2.value;
1146
+ map.set(getKey(child), _item6);
1147
+ queue.push(child);
1148
+ }
1149
+ }
1150
+ }
1151
+
1152
+ return map;
1153
+ }
1154
+ /**
1155
+ * Returns an array indicating the hirearchy path from root towards `target` item
1156
+ */
1157
+
1158
+ export function getPathTowardsItem(target, getParent) {
1159
+ if (!target) return [];
1160
+ var path = [target];
1161
+
1162
+ for (var parent = getParent(target); !!parent; parent = getParent(parent)) {
1163
+ path.unshift(parent);
1164
+ }
1165
+
1166
+ return path;
1070
1167
  }
@@ -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,29 @@
1
+ import { useMemo, useState } from 'react';
2
+ export function useMap() {
3
+ var _useState = useState(function () {
4
+ return new Map();
5
+ }),
6
+ map = _useState[0],
7
+ setMap = _useState[1];
8
+
9
+ return useMemo(function () {
10
+ return {
11
+ has: function has(key) {
12
+ return map.has(key);
13
+ },
14
+ get: function get(key) {
15
+ return map.get(key);
16
+ },
17
+ set: function set(key, value) {
18
+ setMap(function (prev) {
19
+ var copy = new Map(prev);
20
+ copy.set(key, value);
21
+ return copy;
22
+ });
23
+ },
24
+ clear: function clear() {
25
+ setMap(new Map());
26
+ }
27
+ };
28
+ }, [map]);
29
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "rsuite",
3
- "version": "5.31.1",
3
+ "version": "5.33.0",
4
4
  "description": "A suite of react components",
5
5
  "main": "cjs/index.js",
6
6
  "module": "esm/index.js",
@@ -36,6 +36,7 @@
36
36
  "dom-lib": "^3.1.3",
37
37
  "lodash": "^4.17.11",
38
38
  "prop-types": "^15.8.1",
39
+ "react-use-set": "^1.0.0",
39
40
  "react-window": "^1.8.8",
40
41
  "rsuite-table": "^5.10.3",
41
42
  "schema-typed": "^2.1.2"