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
@@ -0,0 +1,9 @@
1
+ import React from 'react';
2
+ import type { DataItemValue } from '../@types/common';
3
+ import type { MultiCascadeTreeProps } from './types';
4
+ /**
5
+ * The `MultiCascadeTree` component is used to select multiple values from cascading options.
6
+ * @see https://rsuitejs.com/components/multi-cascade-tree/
7
+ */
8
+ declare const MultiCascadeTree: React.ForwardRefExoticComponent<MultiCascadeTreeProps<DataItemValue, DataItemValue[]> & React.RefAttributes<unknown>>;
9
+ export default MultiCascadeTree;
@@ -0,0 +1,125 @@
1
+ 'use client';
2
+ import _extends from "@babel/runtime/helpers/esm/extends";
3
+ import _objectWithoutPropertiesLoose from "@babel/runtime/helpers/esm/objectWithoutPropertiesLoose";
4
+ import React from 'react';
5
+ import TreeView from './TreeView';
6
+ import { useCascadeValue, useSelect, useSearch } from './hooks';
7
+ import { useClassNames, useControlled } from '../utils';
8
+ import SearchView from './SearchView';
9
+ var emptyArray = [];
10
+
11
+ /**
12
+ * The `MultiCascadeTree` component is used to select multiple values from cascading options.
13
+ * @see https://rsuitejs.com/components/multi-cascade-tree/
14
+ */
15
+ var MultiCascadeTree = /*#__PURE__*/React.forwardRef(function (props, ref) {
16
+ var _props$as = props.as,
17
+ Component = _props$as === void 0 ? 'div' : _props$as,
18
+ _props$data = props.data,
19
+ data = _props$data === void 0 ? emptyArray : _props$data,
20
+ defaultValue = props.defaultValue,
21
+ className = props.className,
22
+ _props$classPrefix = props.classPrefix,
23
+ classPrefix = _props$classPrefix === void 0 ? 'cascade-tree' : _props$classPrefix,
24
+ valueProp = props.value,
25
+ _props$valueKey = props.valueKey,
26
+ valueKey = _props$valueKey === void 0 ? 'value' : _props$valueKey,
27
+ _props$labelKey = props.labelKey,
28
+ labelKey = _props$labelKey === void 0 ? 'label' : _props$labelKey,
29
+ _props$childrenKey = props.childrenKey,
30
+ childrenKey = _props$childrenKey === void 0 ? 'children' : _props$childrenKey,
31
+ _props$disabledItemVa = props.disabledItemValues,
32
+ disabledItemValues = _props$disabledItemVa === void 0 ? emptyArray : _props$disabledItemVa,
33
+ _props$cascade = props.cascade,
34
+ cascade = _props$cascade === void 0 ? true : _props$cascade,
35
+ columnWidth = props.columnWidth,
36
+ columnHeight = props.columnHeight,
37
+ searchable = props.searchable,
38
+ _props$uncheckableIte = props.uncheckableItemValues,
39
+ uncheckableItemValues = _props$uncheckableIte === void 0 ? emptyArray : _props$uncheckableIte,
40
+ getChildren = props.getChildren,
41
+ renderColumn = props.renderColumn,
42
+ renderTreeNode = props.renderTreeNode,
43
+ onSelect = props.onSelect,
44
+ onCheck = props.onCheck,
45
+ onChange = props.onChange,
46
+ onSearch = props.onSearch,
47
+ rest = _objectWithoutPropertiesLoose(props, ["as", "data", "defaultValue", "className", "classPrefix", "value", "valueKey", "labelKey", "childrenKey", "disabledItemValues", "cascade", "columnWidth", "columnHeight", "searchable", "uncheckableItemValues", "getChildren", "renderColumn", "renderTreeNode", "onSelect", "onCheck", "onChange", "onSearch"]);
48
+ var itemKeys = {
49
+ childrenKey: childrenKey,
50
+ labelKey: labelKey,
51
+ valueKey: valueKey
52
+ };
53
+ var _useSelect = useSelect({
54
+ data: data,
55
+ childrenKey: childrenKey,
56
+ labelKey: labelKey,
57
+ valueKey: valueKey,
58
+ onSelect: onSelect,
59
+ getChildren: getChildren
60
+ }),
61
+ selectedPaths = _useSelect.selectedPaths,
62
+ flattenData = _useSelect.flattenData,
63
+ columnData = _useSelect.columnData,
64
+ handleSelect = _useSelect.handleSelect;
65
+ var _useControlled = useControlled(valueProp, defaultValue),
66
+ controlledValue = _useControlled[0];
67
+ var cascadeValueProps = _extends({}, itemKeys, {
68
+ uncheckableItemValues: uncheckableItemValues,
69
+ cascade: cascade,
70
+ value: controlledValue,
71
+ onCheck: onCheck,
72
+ onChange: onChange
73
+ });
74
+ var _useCascadeValue = useCascadeValue(cascadeValueProps, flattenData),
75
+ value = _useCascadeValue.value,
76
+ handleCheck = _useCascadeValue.handleCheck;
77
+ var _useSearch = useSearch({
78
+ labelKey: labelKey,
79
+ valueKey: valueKey,
80
+ childrenKey: childrenKey,
81
+ flattenedData: flattenData,
82
+ uncheckableItemValues: uncheckableItemValues,
83
+ onSearch: onSearch
84
+ }),
85
+ items = _useSearch.items,
86
+ searchKeyword = _useSearch.searchKeyword,
87
+ handleSearch = _useSearch.handleSearch;
88
+ var _useClassNames = useClassNames(classPrefix),
89
+ withClassPrefix = _useClassNames.withClassPrefix,
90
+ merge = _useClassNames.merge;
91
+ var classes = merge(className, withClassPrefix('multi'));
92
+ return /*#__PURE__*/React.createElement(Component, _extends({
93
+ ref: ref,
94
+ className: classes
95
+ }, rest), searchable && /*#__PURE__*/React.createElement(SearchView, {
96
+ data: items,
97
+ value: value,
98
+ searchKeyword: searchKeyword,
99
+ valueKey: valueKey,
100
+ labelKey: labelKey,
101
+ childrenKey: childrenKey,
102
+ disabledItemValues: disabledItemValues,
103
+ onCheck: handleCheck,
104
+ onSearch: handleSearch
105
+ }), !searchKeyword && /*#__PURE__*/React.createElement(TreeView, {
106
+ cascade: cascade,
107
+ columnWidth: columnWidth,
108
+ columnHeight: columnHeight,
109
+ uncheckableItemValues: uncheckableItemValues,
110
+ disabledItemValues: disabledItemValues,
111
+ valueKey: valueKey,
112
+ labelKey: labelKey,
113
+ childrenKey: childrenKey,
114
+ classPrefix: classPrefix,
115
+ cascadeData: columnData,
116
+ cascadePaths: selectedPaths,
117
+ value: value,
118
+ onSelect: handleSelect,
119
+ onCheck: handleCheck,
120
+ renderColumn: renderColumn,
121
+ renderTreeNode: renderTreeNode
122
+ }));
123
+ });
124
+ MultiCascadeTree.displayName = 'MultiCascadeTree';
125
+ export default MultiCascadeTree;
@@ -0,0 +1,17 @@
1
+ import React from 'react';
2
+ import { ItemDataType, WithAsProps } from '../@types/common';
3
+ interface SearchViewProps<T> extends WithAsProps {
4
+ searchKeyword: string;
5
+ labelKey: string;
6
+ valueKey: string;
7
+ childrenKey: string;
8
+ value: T[];
9
+ data: ItemDataType<T>[];
10
+ disabledItemValues: any[];
11
+ cascade?: boolean;
12
+ onSearch: (value: string, event: React.ChangeEvent<HTMLInputElement>) => void;
13
+ onCheck: (item: ItemDataType<T>, event: React.SyntheticEvent, checked: boolean) => void;
14
+ inputRef?: React.RefObject<HTMLInputElement>;
15
+ }
16
+ declare function SearchView<T>(props: SearchViewProps<T>): JSX.Element;
17
+ export default SearchView;
@@ -0,0 +1,111 @@
1
+ 'use client';
2
+ import _extends from "@babel/runtime/helpers/esm/extends";
3
+ import _objectWithoutPropertiesLoose from "@babel/runtime/helpers/esm/objectWithoutPropertiesLoose";
4
+ import React from 'react';
5
+ import { useClassNames, useCustom } from '../utils';
6
+ import { getNodeParents } from '../utils/treeUtils';
7
+ import SearchBox from '../internals/SearchBox';
8
+ import Checkbox from '../Checkbox';
9
+ import { isSomeChildChecked } from './utils';
10
+ import { highlightLabel } from '../CascadeTree/utils';
11
+ function SearchView(props) {
12
+ var _props$as = props.as,
13
+ Component = _props$as === void 0 ? 'div' : _props$as,
14
+ _props$classPrefix = props.classPrefix,
15
+ classPrefix = _props$classPrefix === void 0 ? 'cascade-search-view' : _props$classPrefix,
16
+ className = props.className,
17
+ searchKeyword = props.searchKeyword,
18
+ childrenKey = props.childrenKey,
19
+ labelKey = props.labelKey,
20
+ valueKey = props.valueKey,
21
+ value = props.value,
22
+ data = props.data,
23
+ disabledItemValues = props.disabledItemValues,
24
+ inputRef = props.inputRef,
25
+ cascade = props.cascade,
26
+ onSearch = props.onSearch,
27
+ onCheck = props.onCheck,
28
+ rest = _objectWithoutPropertiesLoose(props, ["as", "classPrefix", "className", "searchKeyword", "childrenKey", "labelKey", "valueKey", "value", "data", "disabledItemValues", "inputRef", "cascade", "onSearch", "onCheck"]);
29
+ var _useClassNames = useClassNames(classPrefix),
30
+ merge = _useClassNames.merge,
31
+ prefix = _useClassNames.prefix,
32
+ withClassPrefix = _useClassNames.withClassPrefix,
33
+ rootPrefix = _useClassNames.rootPrefix;
34
+ var classes = merge(className, withClassPrefix());
35
+ var _useCustom = useCustom('Picker'),
36
+ locale = _useCustom.locale;
37
+ var renderSearchRow = function renderSearchRow(item, key) {
38
+ var _extends2;
39
+ var nodes = getNodeParents(item);
40
+ var label = highlightLabel({
41
+ item: item,
42
+ labelKey: labelKey,
43
+ searchKeyword: searchKeyword,
44
+ render: function render(patch, index) {
45
+ return /*#__PURE__*/React.createElement("span", {
46
+ key: index,
47
+ className: prefix('match')
48
+ }, patch);
49
+ }
50
+ });
51
+ nodes.push(_extends({}, item, (_extends2 = {}, _extends2[labelKey] = label, _extends2)));
52
+ var active = value.some(function (value) {
53
+ if (cascade) {
54
+ return nodes.some(function (node) {
55
+ return node[valueKey] === value;
56
+ });
57
+ }
58
+ return item[valueKey] === value;
59
+ });
60
+ var disabled = disabledItemValues.some(function (value) {
61
+ return nodes.some(function (node) {
62
+ return node[valueKey] === value;
63
+ });
64
+ });
65
+ var rowClasses = prefix('row', {
66
+ 'row-disabled': disabled
67
+ });
68
+ var indeterminate = cascade && !active && isSomeChildChecked(item, value, {
69
+ valueKey: valueKey,
70
+ childrenKey: childrenKey
71
+ });
72
+ var handleChange = function handleChange(_value, checked, event) {
73
+ onCheck === null || onCheck === void 0 ? void 0 : onCheck(item, event, checked);
74
+ };
75
+ return /*#__PURE__*/React.createElement("div", {
76
+ role: "treeitem",
77
+ "aria-disabled": disabled,
78
+ key: key,
79
+ className: rowClasses,
80
+ "data-key": item[valueKey]
81
+ }, /*#__PURE__*/React.createElement(Checkbox, {
82
+ disabled: disabled,
83
+ checked: active,
84
+ value: item[valueKey],
85
+ indeterminate: indeterminate,
86
+ onChange: handleChange
87
+ }, /*#__PURE__*/React.createElement("span", {
88
+ className: prefix('col-group')
89
+ }, nodes.map(function (node, index) {
90
+ return /*#__PURE__*/React.createElement("span", {
91
+ key: "col-" + index,
92
+ className: prefix('col')
93
+ }, node[labelKey]);
94
+ }))));
95
+ };
96
+ return /*#__PURE__*/React.createElement(Component, _extends({
97
+ className: classes
98
+ }, rest), /*#__PURE__*/React.createElement(SearchBox, {
99
+ placeholder: locale === null || locale === void 0 ? void 0 : locale.searchPlaceholder,
100
+ onChange: onSearch,
101
+ value: searchKeyword,
102
+ inputRef: inputRef
103
+ }), searchKeyword !== '' && /*#__PURE__*/React.createElement("div", {
104
+ className: prefix('panel'),
105
+ "data-layer": 0,
106
+ role: "tree"
107
+ }, data.length ? data.map(renderSearchRow) : /*#__PURE__*/React.createElement("div", {
108
+ className: merge(prefix('none'), rootPrefix('picker-none'))
109
+ }, locale.noResultsText)));
110
+ }
111
+ export default SearchView;
@@ -0,0 +1,22 @@
1
+ import React from 'react';
2
+ import { ItemDataType, WithAsProps, RsRefForwardingComponent } from '../@types/common';
3
+ import type { CascadeColumn } from '../CascadeTree/types';
4
+ export interface TreeViewProps<T = any> extends WithAsProps {
5
+ disabledItemValues?: T[];
6
+ value: T[];
7
+ childrenKey: string;
8
+ valueKey: string;
9
+ labelKey: string;
10
+ columnWidth?: number;
11
+ columnHeight?: number | string;
12
+ cascade?: boolean;
13
+ cascadeData: (readonly ItemDataType<T>[])[];
14
+ cascadePaths?: ItemDataType<T>[];
15
+ uncheckableItemValues: T[];
16
+ renderTreeNode?: (node: React.ReactNode, item: ItemDataType<T>) => React.ReactNode;
17
+ renderColumn?: (childNodes: React.ReactNode, column: CascadeColumn<T>) => React.ReactNode;
18
+ onCheck?: (node: ItemDataType<T>, event: React.SyntheticEvent, checked: boolean) => void;
19
+ onSelect?: (node: ItemDataType<T>, cascadePaths: ItemDataType<T>[], event: React.SyntheticEvent) => void;
20
+ }
21
+ declare const TreeView: RsRefForwardingComponent<'div', TreeViewProps>;
22
+ export default TreeView;
@@ -9,15 +9,11 @@ import { useClassNames, shallowEqual, useCustom, useEventCallback } from '../uti
9
9
  import { ListCheckItem, useCombobox } from '../internals/Picker';
10
10
  import { isSomeParentChecked, isSomeChildChecked } from './utils';
11
11
  var emptyArray = [];
12
-
13
- /**
14
- * TODO: reuse Menu from Cascader for consistent behavior
15
- */
16
12
  var TreeView = /*#__PURE__*/React.forwardRef(function (props, ref) {
17
13
  var _props$as = props.as,
18
14
  Component = _props$as === void 0 ? 'div' : _props$as,
19
15
  _props$classPrefix = props.classPrefix,
20
- classPrefix = _props$classPrefix === void 0 ? 'menu' : _props$classPrefix,
16
+ classPrefix = _props$classPrefix === void 0 ? 'tree' : _props$classPrefix,
21
17
  className = props.className,
22
18
  cascade = props.cascade,
23
19
  _props$cascadeData = props.cascadeData,
@@ -28,10 +24,10 @@ var TreeView = /*#__PURE__*/React.forwardRef(function (props, ref) {
28
24
  childrenKey = _props$childrenKey === void 0 ? 'children' : _props$childrenKey,
29
25
  _props$disabledItemVa = props.disabledItemValues,
30
26
  disabledItemValues = _props$disabledItemVa === void 0 ? emptyArray : _props$disabledItemVa,
31
- _props$menuWidth = props.menuWidth,
32
- menuWidth = _props$menuWidth === void 0 ? 156 : _props$menuWidth,
33
- _props$menuHeight = props.menuHeight,
34
- menuHeight = _props$menuHeight === void 0 ? 200 : _props$menuHeight,
27
+ _props$columnWidth = props.columnWidth,
28
+ columnWidth = _props$columnWidth === void 0 ? 156 : _props$columnWidth,
29
+ _props$columnHeight = props.columnHeight,
30
+ columnHeight = _props$columnHeight === void 0 ? 200 : _props$columnHeight,
35
31
  _props$uncheckableIte = props.uncheckableItemValues,
36
32
  uncheckableItemValues = _props$uncheckableIte === void 0 ? emptyArray : _props$uncheckableIte,
37
33
  value = props.value,
@@ -40,11 +36,11 @@ var TreeView = /*#__PURE__*/React.forwardRef(function (props, ref) {
40
36
  _props$labelKey = props.labelKey,
41
37
  labelKey = _props$labelKey === void 0 ? 'label' : _props$labelKey,
42
38
  style = props.style,
43
- renderMenuItem = props.renderMenuItem,
44
- renderMenu = props.renderMenu,
39
+ renderTreeNode = props.renderTreeNode,
40
+ renderColumn = props.renderColumn,
45
41
  _onCheck = props.onCheck,
46
42
  onSelect = props.onSelect,
47
- rest = _objectWithoutPropertiesLoose(props, ["as", "classPrefix", "className", "cascade", "cascadeData", "cascadePaths", "childrenKey", "disabledItemValues", "menuWidth", "menuHeight", "uncheckableItemValues", "value", "valueKey", "labelKey", "style", "renderMenuItem", "renderMenu", "onCheck", "onSelect"]);
43
+ rest = _objectWithoutPropertiesLoose(props, ["as", "classPrefix", "className", "cascade", "cascadeData", "cascadePaths", "childrenKey", "disabledItemValues", "columnWidth", "columnHeight", "uncheckableItemValues", "value", "valueKey", "labelKey", "style", "renderTreeNode", "renderColumn", "onCheck", "onSelect"]);
48
44
  var _useClassNames = useClassNames(classPrefix),
49
45
  merge = _useClassNames.merge,
50
46
  prefix = _useClassNames.prefix;
@@ -122,19 +118,19 @@ var TreeView = /*#__PURE__*/React.forwardRef(function (props, ref) {
122
118
  },
123
119
  checkable: !uncheckable,
124
120
  labelClickable: false
125
- }, renderMenuItem ? renderMenuItem(label, node) : label, children ? /*#__PURE__*/React.createElement(Icon, {
121
+ }, renderTreeNode ? renderTreeNode(label, node) : label, children ? /*#__PURE__*/React.createElement(Icon, {
126
122
  className: prefix('caret'),
127
123
  spin: node.loading
128
124
  }) : null);
129
125
  };
130
126
  var columnStyles = {
131
- height: menuHeight,
132
- width: menuWidth
127
+ height: columnHeight,
128
+ width: columnWidth
133
129
  };
134
130
  var cascadeNodes = cascadeData.map(function (children, layer) {
135
131
  var uncheckableCount = 0;
136
132
  var onlyKey = layer + "_" + children.length;
137
- var menu = /*#__PURE__*/React.createElement(React.Fragment, null, children.map(function (item, index) {
133
+ var childNodes = /*#__PURE__*/React.createElement(React.Fragment, null, children.map(function (item, index) {
138
134
  var uncheckable = uncheckableItemValues.some(function (uncheckableValue) {
139
135
  return shallowEqual(uncheckableValue, item[valueKey]);
140
136
  });
@@ -151,7 +147,7 @@ var TreeView = /*#__PURE__*/React.forwardRef(function (props, ref) {
151
147
  size: children.length
152
148
  });
153
149
  }));
154
- var parentNode = cascadePaths[layer - 1];
150
+ var parentItem = cascadePaths[layer - 1];
155
151
  var columnClasses = prefix('column', {
156
152
  'column-uncheckable': uncheckableCount === children.length
157
153
  });
@@ -161,14 +157,18 @@ var TreeView = /*#__PURE__*/React.forwardRef(function (props, ref) {
161
157
  className: columnClasses,
162
158
  "data-layer": layer,
163
159
  style: columnStyles
164
- }, renderMenu ? renderMenu(children, menu, parentNode, layer) : menu);
160
+ }, renderColumn ? renderColumn(childNodes, {
161
+ items: children,
162
+ parentItem: parentItem,
163
+ layer: layer
164
+ }) : childNodes);
165
165
  });
166
166
  var styles = _extends({}, style, {
167
- width: cascadeData.length * menuWidth
167
+ width: cascadeData.length * columnWidth
168
168
  });
169
169
  return /*#__PURE__*/React.createElement(Component, _extends({
170
170
  role: "tree",
171
- id: id + "-" + popupType,
171
+ id: id ? id + "-" + popupType : undefined,
172
172
  "aria-labelledby": labelId,
173
173
  "aria-multiselectable": multiple
174
174
  }, rest, {
@@ -0,0 +1,5 @@
1
+ export { default as useFlattenData } from './useFlattenData';
2
+ export { default as useSelect } from './useSelect';
3
+ export { default as useColumnData } from './useColumnData';
4
+ export { default as useCascadeValue } from './useCascadeValue';
5
+ export { default as useSearch } from './useSearch';
@@ -0,0 +1,6 @@
1
+ 'use client';
2
+ export { default as useFlattenData } from './useFlattenData';
3
+ export { default as useSelect } from './useSelect';
4
+ export { default as useColumnData } from './useColumnData';
5
+ export { default as useCascadeValue } from './useCascadeValue';
6
+ export { default as useSearch } from './useSearch';
@@ -0,0 +1,18 @@
1
+ /// <reference types="react" />
2
+ import { MultiCascadeTreeProps, ItemKeys } from '../types';
3
+ import { type ItemType } from '../utils';
4
+ /**
5
+ * A hook that converts the value into a cascading value
6
+ * @param props
7
+ * @param flattenData
8
+ */
9
+ declare function useCascadeValue<T>(props: Partial<MultiCascadeTreeProps<T>> & ItemKeys, flattenData: ItemType<T>[]): {
10
+ value: T[];
11
+ setValue: import("react").Dispatch<import("react").SetStateAction<T[]>>;
12
+ splitValue: (item: ItemType<T>, checked: boolean, value: T[]) => {
13
+ value: T[];
14
+ removedValue: T[];
15
+ };
16
+ handleCheck: (...args: any[]) => any;
17
+ };
18
+ export default useCascadeValue;
@@ -0,0 +1,197 @@
1
+ 'use client';
2
+ import { useState, useEffect, useCallback } from 'react';
3
+ import uniq from 'lodash/uniq';
4
+ import remove from 'lodash/remove';
5
+ import { useEventCallback } from '../../utils';
6
+ import { getParents, removeAllChildrenValue, getOtherItemValuesByUnselectChild } from '../utils';
7
+
8
+ /**
9
+ * A hook that converts the value into a cascading value
10
+ * @param props
11
+ * @param flattenData
12
+ */
13
+ function useCascadeValue(props, flattenData) {
14
+ var valueKey = props.valueKey,
15
+ childrenKey = props.childrenKey,
16
+ uncheckableItemValues = props.uncheckableItemValues,
17
+ cascade = props.cascade,
18
+ valueProp = props.value,
19
+ onChange = props.onChange,
20
+ onCheck = props.onCheck;
21
+ /**
22
+ * Get the values of all children
23
+ */
24
+ var getChildrenValue = useCallback(function (item) {
25
+ var values = [];
26
+ if (!item[childrenKey]) {
27
+ return values;
28
+ }
29
+ item[childrenKey].forEach(function (n) {
30
+ if (uncheckableItemValues && !uncheckableItemValues.some(function (v) {
31
+ return v === n[valueKey];
32
+ })) {
33
+ values.push(n[valueKey]);
34
+ }
35
+ values = values.concat(getChildrenValue(n));
36
+ });
37
+ return values;
38
+ }, [childrenKey, uncheckableItemValues, valueKey]);
39
+ var splitValue = useCallback(function (item, checked, value) {
40
+ var itemValue = item[valueKey];
41
+ var childrenValue = getChildrenValue(item);
42
+ var parents = getParents(item);
43
+ var nextValue = [].concat(value);
44
+ var removedValue = [];
45
+ if (checked) {
46
+ nextValue.push(itemValue);
47
+
48
+ // Delete all values under the current node
49
+ removedValue = removedValue.concat(removeAllChildrenValue(nextValue, item, {
50
+ valueKey: valueKey,
51
+ childrenKey: childrenKey
52
+ }) || []);
53
+
54
+ // Traverse all ancestor nodes of the current node
55
+ // Then determine whether all the child nodes of these nodes are selected, and then they themselves must be selected
56
+ var _loop = function _loop(i) {
57
+ // Whether the parent node can be selected
58
+ var isCheckableParent = !(uncheckableItemValues !== null && uncheckableItemValues !== void 0 && uncheckableItemValues.some(function (v) {
59
+ return v === parents[i][valueKey];
60
+ }));
61
+ if (isCheckableParent) {
62
+ var isCheckAll = parents[i][childrenKey]
63
+ // Filter out options that are marked as not selectable
64
+ .filter(function (n) {
65
+ return !(uncheckableItemValues !== null && uncheckableItemValues !== void 0 && uncheckableItemValues.some(function (v) {
66
+ return v === n[valueKey];
67
+ }));
68
+ })
69
+ // Check if all nodes are selected
70
+ .every(function (n) {
71
+ return nextValue.some(function (v) {
72
+ return v === n[valueKey];
73
+ });
74
+ });
75
+ if (isCheckAll) {
76
+ // Add parent node value
77
+ nextValue.push(parents[i][valueKey]);
78
+
79
+ // Delete all values under the parent node
80
+ removedValue = removedValue.concat(removeAllChildrenValue(nextValue, parents[i], {
81
+ valueKey: valueKey,
82
+ childrenKey: childrenKey
83
+ }) || []);
84
+ }
85
+ }
86
+ };
87
+ for (var i = 0; i < parents.length; i++) {
88
+ _loop(i);
89
+ }
90
+ } else {
91
+ var tempValue = childrenValue.concat(parents.map(function (item) {
92
+ return item[valueKey];
93
+ }));
94
+ nextValue = nextValue.concat(getOtherItemValuesByUnselectChild(item, nextValue, {
95
+ valueKey: valueKey,
96
+ childrenKey: childrenKey
97
+ }));
98
+
99
+ // Delete related child and parent nodes
100
+ removedValue = remove(nextValue, function (v) {
101
+ // Delete yourself
102
+ if (v === itemValue) {
103
+ return true;
104
+ }
105
+ return tempValue.some(function (n) {
106
+ return n === v;
107
+ });
108
+ });
109
+ }
110
+ var uniqValue = uniq(nextValue);
111
+ var uniqRemovedValue = uniq(removedValue);
112
+ return {
113
+ value: uniqValue,
114
+ removedValue: uniqRemovedValue
115
+ };
116
+ }, [valueKey, childrenKey, uncheckableItemValues, getChildrenValue]);
117
+ var transformValue = useCallback(function (value) {
118
+ if (value === void 0) {
119
+ value = [];
120
+ }
121
+ if (!cascade) {
122
+ return value;
123
+ }
124
+ var tempRemovedValue = [];
125
+ var nextValue = [];
126
+ var _loop2 = function _loop2(i) {
127
+ // If the value in the current value is already in the deleted list, it will not be processed
128
+ if (tempRemovedValue.some(function (v) {
129
+ return v === value[i];
130
+ })) {
131
+ return "continue";
132
+ }
133
+ var item = flattenData.find(function (v) {
134
+ return v[valueKey] === value[i];
135
+ });
136
+ if (!item) {
137
+ return "continue";
138
+ }
139
+ var sv = splitValue(item, true, value);
140
+ tempRemovedValue = uniq(tempRemovedValue.concat(sv.removedValue));
141
+
142
+ // Get all relevant values
143
+ nextValue = uniq(nextValue.concat(sv.value));
144
+ };
145
+ for (var i = 0; i < value.length; i++) {
146
+ var _ret = _loop2(i);
147
+ if (_ret === "continue") continue;
148
+ }
149
+
150
+ // Finally traverse all nextValue, and delete if its parent node is also nextValue
151
+ return nextValue.filter(function (v) {
152
+ var item = flattenData.find(function (n) {
153
+ return n[valueKey] === v;
154
+ });
155
+ if (item !== null && item !== void 0 && item.parent && nextValue.some(function (v) {
156
+ var _item$parent;
157
+ return v === ((_item$parent = item.parent) === null || _item$parent === void 0 ? void 0 : _item$parent[valueKey]);
158
+ })) {
159
+ return false;
160
+ }
161
+ return true;
162
+ });
163
+ }, [cascade, flattenData, splitValue, valueKey]);
164
+ var _useState = useState(transformValue(valueProp) || []),
165
+ value = _useState[0],
166
+ setValue = _useState[1];
167
+ useEffect(function () {
168
+ // Update value when valueProp is updated.
169
+ setValue(transformValue(valueProp) || []);
170
+ }, [transformValue, valueProp]);
171
+ var handleCheck = useEventCallback(function (node, event, checked) {
172
+ var nodeValue = node[valueKey];
173
+ var nextValue = [];
174
+ if (cascade) {
175
+ nextValue = splitValue(node, checked, value).value;
176
+ } else {
177
+ nextValue = [].concat(value);
178
+ if (checked) {
179
+ nextValue.push(nodeValue);
180
+ } else {
181
+ nextValue = nextValue.filter(function (n) {
182
+ return n !== nodeValue;
183
+ });
184
+ }
185
+ }
186
+ setValue(nextValue);
187
+ onChange === null || onChange === void 0 ? void 0 : onChange(nextValue, event);
188
+ onCheck === null || onCheck === void 0 ? void 0 : onCheck(nextValue, node, checked, event);
189
+ });
190
+ return {
191
+ value: value,
192
+ setValue: setValue,
193
+ splitValue: splitValue,
194
+ handleCheck: handleCheck
195
+ };
196
+ }
197
+ export default useCascadeValue;
@@ -0,0 +1,16 @@
1
+ /// <reference types="react" />
2
+ declare type MayHasParent<T extends Record<string, unknown>> = T & {
3
+ parent?: MayHasParent<T>;
4
+ };
5
+ /**
6
+ * A hook for column data
7
+ * @param flattenData
8
+ */
9
+ declare function useColumnData<T extends MayHasParent<Record<string, unknown>>>(flattenData: T[]): {
10
+ columnData: (readonly T[])[];
11
+ addColumn: (column: T[], index: number) => void;
12
+ removeColumnByIndex: (index: number) => void;
13
+ setColumnData: import("react").Dispatch<import("react").SetStateAction<(readonly T[])[]>>;
14
+ enforceUpdateColumnData: (nextData: T[]) => void;
15
+ };
16
+ export default useColumnData;