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