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,46 @@
1
+ 'use client';
2
+ import { useState } from 'react';
3
+ import slice from 'lodash/slice';
4
+ import { UNSAFE_flattenTree } from '../../utils/treeUtils';
5
+ /**
6
+ * A hook for column data
7
+ * @param flattenData
8
+ */
9
+ function useColumnData(flattenData) {
10
+ // The columns displayed in the cascading panel.
11
+ var _useState = useState([flattenData.filter(function (item) {
12
+ return !item.parent;
13
+ })]),
14
+ columnData = _useState[0],
15
+ setColumnData = _useState[1];
16
+ /**
17
+ * Add a list of options to the cascading panel. Used for lazy loading options.
18
+ * @param column
19
+ * @param index The index of the current column.
20
+ */
21
+ function addColumn(column, index) {
22
+ setColumnData([].concat(slice(columnData, 0, index), [column]));
23
+ }
24
+
25
+ /**
26
+ * Remove subsequent columns of the specified column
27
+ * @param index
28
+ */
29
+ function removeColumnByIndex(index) {
30
+ setColumnData([].concat(slice(columnData, 0, index)));
31
+ }
32
+ function enforceUpdateColumnData(nextData) {
33
+ var nextFlattenData = UNSAFE_flattenTree(nextData);
34
+ setColumnData([nextFlattenData.filter(function (item) {
35
+ return !item.parent;
36
+ })]);
37
+ }
38
+ return {
39
+ columnData: columnData,
40
+ addColumn: addColumn,
41
+ removeColumnByIndex: removeColumnByIndex,
42
+ setColumnData: setColumnData,
43
+ enforceUpdateColumnData: enforceUpdateColumnData
44
+ };
45
+ }
46
+ export default useColumnData;
@@ -0,0 +1,9 @@
1
+ import { ItemKeys } from '../types';
2
+ /**
3
+ * A hook to flatten tree structure data
4
+ */
5
+ declare function useFlattenData<T>(data: T[], itemKeys: ItemKeys): {
6
+ addFlattenData: (children: T[], parent: T) => void;
7
+ flattenData: T[];
8
+ };
9
+ export default useFlattenData;
@@ -0,0 +1,28 @@
1
+ 'use client';
2
+ import { useState, useCallback, useEffect } from 'react';
3
+ import { UNSAFE_flattenTree } from '../../utils/treeUtils';
4
+ import { attachParent } from '../../utils/attachParent';
5
+ /**
6
+ * A hook to flatten tree structure data
7
+ */
8
+ function useFlattenData(data, itemKeys) {
9
+ var childrenKey = itemKeys.childrenKey;
10
+ var _useState = useState(UNSAFE_flattenTree(data, itemKeys.childrenKey)),
11
+ flattenData = _useState[0],
12
+ setFlattenData = _useState[1];
13
+ var addFlattenData = useCallback(function (children, parent) {
14
+ var nodes = children.map(function (child) {
15
+ return attachParent(child, parent);
16
+ });
17
+ parent[childrenKey] = nodes;
18
+ setFlattenData([].concat(flattenData, nodes));
19
+ }, [childrenKey, flattenData]);
20
+ useEffect(function () {
21
+ setFlattenData(UNSAFE_flattenTree(data, itemKeys.childrenKey));
22
+ }, [data, itemKeys.childrenKey]);
23
+ return {
24
+ addFlattenData: addFlattenData,
25
+ flattenData: flattenData
26
+ };
27
+ }
28
+ export default useFlattenData;
@@ -0,0 +1,17 @@
1
+ /// <reference types="react" />
2
+ import { ItemDataType } from '../../@types/common';
3
+ interface SearchPanelProps<T> {
4
+ labelKey: string;
5
+ valueKey: string;
6
+ childrenKey: string;
7
+ flattenedData: ItemDataType<T>[];
8
+ uncheckableItemValues?: any[];
9
+ onSearch?: (value: string, event: React.SyntheticEvent) => void;
10
+ }
11
+ declare function useSearch<T>(props: SearchPanelProps<T>): {
12
+ searchKeyword: string;
13
+ setSearchKeyword: import("react").Dispatch<import("react").SetStateAction<string>>;
14
+ items: ItemDataType<T>[];
15
+ handleSearch: (...args: any[]) => any;
16
+ };
17
+ export default useSearch;
@@ -0,0 +1,47 @@
1
+ 'use client';
2
+ import { useState } from 'react';
3
+ import { getSafeRegExpString, useEventCallback } from '../../utils';
4
+ function useSearch(props) {
5
+ var _useState = useState(''),
6
+ searchKeyword = _useState[0],
7
+ setSearchKeyword = _useState[1];
8
+ var labelKey = props.labelKey,
9
+ valueKey = props.valueKey,
10
+ flattenedData = props.flattenedData,
11
+ uncheckableItemValues = props.uncheckableItemValues,
12
+ onSearch = props.onSearch;
13
+ var getSearchResult = function getSearchResult() {
14
+ var items = [];
15
+ var result = flattenedData.filter(function (item) {
16
+ if (uncheckableItemValues !== null && uncheckableItemValues !== void 0 && uncheckableItemValues.some(function (value) {
17
+ return item[valueKey] === value;
18
+ })) {
19
+ return false;
20
+ }
21
+ if (item[labelKey].match(new RegExp(getSafeRegExpString(searchKeyword), 'i'))) {
22
+ return true;
23
+ }
24
+ return false;
25
+ });
26
+ for (var i = 0; i < result.length; i++) {
27
+ items.push(result[i]);
28
+
29
+ // A maximum of 100 search results are returned.
30
+ if (i === 99) {
31
+ return items;
32
+ }
33
+ }
34
+ return items;
35
+ };
36
+ var handleSearch = useEventCallback(function (value, event) {
37
+ setSearchKeyword(value);
38
+ onSearch === null || onSearch === void 0 ? void 0 : onSearch(value, event);
39
+ });
40
+ return {
41
+ searchKeyword: searchKeyword,
42
+ setSearchKeyword: setSearchKeyword,
43
+ items: getSearchResult(),
44
+ handleSearch: handleSearch
45
+ };
46
+ }
47
+ export default useSearch;
@@ -0,0 +1,19 @@
1
+ import React from 'react';
2
+ import { type ItemDataType } from '../../@types/common';
3
+ export interface UseSelectProps<T> {
4
+ data: ItemDataType<T>[];
5
+ childrenKey: string;
6
+ labelKey: string;
7
+ valueKey: string;
8
+ onSelect?: (node: ItemDataType<T>, cascadePaths: ItemDataType<T>[], event: React.SyntheticEvent) => void;
9
+ getChildren?: (node: ItemDataType<T>) => ItemDataType<T>[] | Promise<ItemDataType<T>[]>;
10
+ }
11
+ declare const useSelect: <T>(props: UseSelectProps<T>) => {
12
+ columnData: (readonly ItemDataType<T>[])[];
13
+ setColumnData: React.Dispatch<React.SetStateAction<(readonly ItemDataType<T>[])[]>>;
14
+ flattenData: ItemDataType<T>[];
15
+ selectedPaths: ItemDataType<T>[] | undefined;
16
+ setSelectedPaths: React.Dispatch<React.SetStateAction<ItemDataType<T>[] | undefined>>;
17
+ handleSelect: (...args: any[]) => any;
18
+ };
19
+ export default useSelect;
@@ -0,0 +1,77 @@
1
+ 'use client';
2
+ import { useState } from 'react';
3
+ import { useEventCallback, useUpdateEffect, useIsMounted } from '../../utils';
4
+ import useFlattenData from './useFlattenData';
5
+ import useColumnData from './useColumnData';
6
+ var useSelect = function useSelect(props) {
7
+ var data = props.data,
8
+ childrenKey = props.childrenKey,
9
+ labelKey = props.labelKey,
10
+ valueKey = props.valueKey,
11
+ onSelect = props.onSelect,
12
+ getChildren = props.getChildren;
13
+ var itemKeys = {
14
+ childrenKey: childrenKey,
15
+ labelKey: labelKey,
16
+ valueKey: valueKey
17
+ };
18
+ var _useFlattenData = useFlattenData(data, itemKeys),
19
+ flattenData = _useFlattenData.flattenData,
20
+ addFlattenData = _useFlattenData.addFlattenData; // The columns displayed in the cascading panel.
21
+ var _useColumnData = useColumnData(flattenData),
22
+ columnData = _useColumnData.columnData,
23
+ addColumn = _useColumnData.addColumn,
24
+ setColumnData = _useColumnData.setColumnData,
25
+ removeColumnByIndex = _useColumnData.removeColumnByIndex,
26
+ enforceUpdateColumnData = _useColumnData.enforceUpdateColumnData;
27
+ useUpdateEffect(function () {
28
+ enforceUpdateColumnData(data);
29
+ }, [data]);
30
+ var isMounted = useIsMounted();
31
+
32
+ // The path after cascading data selection.
33
+ var _useState = useState(),
34
+ selectedPaths = _useState[0],
35
+ setSelectedPaths = _useState[1];
36
+ var handleSelect = useEventCallback(function (node, cascadePaths, event) {
37
+ var _node$childrenKey, _node$childrenKey2;
38
+ setSelectedPaths(cascadePaths);
39
+ var columnIndex = cascadePaths.length;
40
+
41
+ // Lazy load node's children
42
+ if (typeof getChildren === 'function' && ((_node$childrenKey = node[childrenKey]) === null || _node$childrenKey === void 0 ? void 0 : _node$childrenKey.length) === 0) {
43
+ node.loading = true;
44
+ var children = getChildren(node);
45
+ if (children instanceof Promise) {
46
+ children.then(function (data) {
47
+ node.loading = false;
48
+ node[childrenKey] = data;
49
+ if (isMounted()) {
50
+ addFlattenData(data, node);
51
+ addColumn(data, columnIndex);
52
+ }
53
+ });
54
+ } else {
55
+ node.loading = false;
56
+ node[childrenKey] = children;
57
+ addFlattenData(children, node);
58
+ addColumn(children, columnIndex);
59
+ }
60
+ } else if ((_node$childrenKey2 = node[childrenKey]) !== null && _node$childrenKey2 !== void 0 && _node$childrenKey2.length) {
61
+ addColumn(node[childrenKey], columnIndex);
62
+ } else {
63
+ // Removes subsequent columns of the current column when the clicked node is a leaf node.
64
+ removeColumnByIndex(columnIndex);
65
+ }
66
+ onSelect === null || onSelect === void 0 ? void 0 : onSelect(node, cascadePaths, event);
67
+ });
68
+ return {
69
+ columnData: columnData,
70
+ setColumnData: setColumnData,
71
+ flattenData: flattenData,
72
+ selectedPaths: selectedPaths,
73
+ setSelectedPaths: setSelectedPaths,
74
+ handleSelect: handleSelect
75
+ };
76
+ };
77
+ export default useSelect;
@@ -0,0 +1,4 @@
1
+ import MultiCascadeTree from './MultiCascadeTree';
2
+ export type { ItemDataType } from '../@types/common';
3
+ export type { MultiCascadeTreeProps } from './types';
4
+ export default MultiCascadeTree;
@@ -0,0 +1,3 @@
1
+ 'use client';
2
+ import MultiCascadeTree from './MultiCascadeTree';
3
+ export default MultiCascadeTree;
@@ -0,0 +1,26 @@
1
+ /// <reference types="react" />
2
+ import type { CascadeTreeProps } from '../CascadeTree/types';
3
+ import type { ItemDataType, ToArray, WithAsProps } from '../@types/common';
4
+ export interface ItemKeys {
5
+ valueKey: string;
6
+ labelKey: string;
7
+ childrenKey: string;
8
+ }
9
+ export interface MultiCascadeTreeProps<T, V = T[]> extends WithAsProps, CascadeTreeProps<T, V> {
10
+ /**
11
+ * When set to true, selecting a child node will update the state of the parent node.
12
+ */
13
+ cascade?: boolean;
14
+ /**
15
+ * Disabled items
16
+ */
17
+ disabledItemValues?: ToArray<NonNullable<T>>;
18
+ /**
19
+ * Set the option value for the check box not to be rendered
20
+ */
21
+ uncheckableItemValues?: T[];
22
+ /**
23
+ * Called after the checkbox state changes.
24
+ */
25
+ onCheck?: (value: T[], node: ItemDataType<T>, checked: boolean, event: React.SyntheticEvent) => void;
26
+ }
@@ -0,0 +1 @@
1
+ 'use client';
@@ -0,0 +1,37 @@
1
+ import { ItemDataType } from '../@types/common';
2
+ export interface ItemType<T = any> extends ItemDataType<T> {
3
+ parent?: ItemType<T>;
4
+ }
5
+ interface ItemKeys {
6
+ valueKey: string;
7
+ labelKey: string;
8
+ childrenKey: string;
9
+ }
10
+ declare type MayHasParent<T extends Record<string, unknown>> = T & {
11
+ parent?: MayHasParent<T>;
12
+ };
13
+ /**
14
+ * Get all parents of a node
15
+ * @param node
16
+ */
17
+ export declare const getParents: <T extends Record<string, unknown>>(node: MayHasParent<T>) => MayHasParent<T>[];
18
+ /**
19
+ * Check if any child nodes are selected.
20
+ * @param node
21
+ * @param value
22
+ * @param itemKeys
23
+ */
24
+ export declare const isSomeChildChecked: <T extends Record<string, unknown>>(node: T, value: T[], itemKeys: Omit<ItemKeys, 'labelKey'>) => any;
25
+ /**
26
+ * Check if the parent is selected.
27
+ * @param node
28
+ * @param value
29
+ * @param itemKeys
30
+ */
31
+ export declare const isSomeParentChecked: <T extends Record<string, unknown>>(node: MayHasParent<T>, value: T[], itemKeys: Pick<ItemKeys, 'valueKey'>) => any;
32
+ export declare const getOtherItemValuesByUnselectChild: <T>(itemNode: ItemType, value: any, itemKeys: Omit<ItemKeys, 'labelKey'>) => T[];
33
+ /**
34
+ * Remove the values of all children.
35
+ */
36
+ export declare const removeAllChildrenValue: <T>(value: T[], item: ItemType, itemKeys: Omit<ItemKeys, 'labelKey'>) => T[] | undefined;
37
+ export {};
@@ -0,0 +1,130 @@
1
+ 'use client';
2
+ import remove from 'lodash/remove';
3
+ /**
4
+ * Get all parents of a node
5
+ * @param node
6
+ */
7
+ export var getParents = function getParents(node) {
8
+ var parents = [];
9
+ if (!node.parent) {
10
+ return parents;
11
+ }
12
+ parents.push(node.parent);
13
+ parents = parents.concat(getParents(node.parent));
14
+ return parents;
15
+ };
16
+
17
+ /**
18
+ * Check if any child nodes are selected.
19
+ * @param node
20
+ * @param value
21
+ * @param itemKeys
22
+ */
23
+ export var isSomeChildChecked = function isSomeChildChecked(node, value, itemKeys) {
24
+ var childrenKey = itemKeys.childrenKey,
25
+ valueKey = itemKeys.valueKey;
26
+ if (!node[childrenKey] || !value) {
27
+ return false;
28
+ }
29
+ return node[childrenKey].some(function (child) {
30
+ var _child$childrenKey;
31
+ if (value.some(function (n) {
32
+ return n === child[valueKey];
33
+ })) {
34
+ return true;
35
+ }
36
+ if ((_child$childrenKey = child[childrenKey]) !== null && _child$childrenKey !== void 0 && _child$childrenKey.length) {
37
+ return isSomeChildChecked(child, value, itemKeys);
38
+ }
39
+ return false;
40
+ });
41
+ };
42
+
43
+ /**
44
+ * Check if the parent is selected.
45
+ * @param node
46
+ * @param value
47
+ * @param itemKeys
48
+ */
49
+ export var isSomeParentChecked = function isSomeParentChecked(node, value, itemKeys) {
50
+ var valueKey = itemKeys.valueKey;
51
+ if (!value) {
52
+ return false;
53
+ }
54
+ if (value.some(function (n) {
55
+ return n === node[valueKey];
56
+ })) {
57
+ return true;
58
+ }
59
+ if (node.parent) {
60
+ return isSomeParentChecked(node.parent, value, itemKeys);
61
+ }
62
+ return false;
63
+ };
64
+ export var getOtherItemValuesByUnselectChild = function getOtherItemValuesByUnselectChild(itemNode, value, itemKeys) {
65
+ var valueKey = itemKeys.valueKey,
66
+ childrenKey = itemKeys.childrenKey;
67
+ var parentValues = [];
68
+ var itemValues = [];
69
+
70
+ // Find the parent node of the current node by value
71
+ function findParent(item) {
72
+ parentValues.push(item[valueKey]);
73
+ if (value.some(function (v) {
74
+ return v === item[valueKey];
75
+ })) {
76
+ return item;
77
+ }
78
+ if (item.parent) {
79
+ var p = findParent(item.parent);
80
+ if (p) {
81
+ return p;
82
+ }
83
+ }
84
+ return null;
85
+ }
86
+
87
+ // Get child nodes through parent node
88
+ function pushChildValue(item) {
89
+ if (!item[childrenKey]) {
90
+ return;
91
+ }
92
+ item[childrenKey].forEach(function (n) {
93
+ // Determine whether it is a direct parent
94
+ if (parentValues.some(function (v) {
95
+ return v === n[valueKey];
96
+ }) && n[childrenKey]) {
97
+ pushChildValue(n);
98
+ } else if (n[valueKey] !== itemNode[valueKey]) {
99
+ itemValues.push(n[valueKey]);
100
+ }
101
+ });
102
+ }
103
+ var parent = findParent(itemNode);
104
+ if (!parent) {
105
+ return [];
106
+ }
107
+ pushChildValue(parent);
108
+ return itemValues;
109
+ };
110
+
111
+ /**
112
+ * Remove the values of all children.
113
+ */
114
+ export var removeAllChildrenValue = function removeAllChildrenValue(value, item, itemKeys) {
115
+ var valueKey = itemKeys.valueKey,
116
+ childrenKey = itemKeys.childrenKey;
117
+ var removedValue = [];
118
+ if (!item[childrenKey]) {
119
+ return;
120
+ }
121
+ item[childrenKey].forEach(function (n) {
122
+ removedValue = removedValue.concat(remove(value, function (v) {
123
+ return v === n[valueKey];
124
+ }));
125
+ if (n[childrenKey]) {
126
+ removeAllChildrenValue(value, n, itemKeys);
127
+ }
128
+ });
129
+ return removedValue;
130
+ };
@@ -1,42 +1,70 @@
1
1
  import React from 'react';
2
2
  import { PickerLocale } from '../locales';
3
3
  import { PickerComponent, PickerToggleProps } from '../internals/Picker';
4
- import { FormControlPickerProps, ItemDataType } from '../@types/common';
5
- export declare type ValueType = (number | string)[];
6
- export interface MultiCascaderProps<T = ValueType> extends FormControlPickerProps<T, PickerLocale, ItemDataType>, Pick<PickerToggleProps, 'loading'> {
7
- cascade?: boolean;
8
- /** A picker that can be counted */
4
+ import { FormControlPickerProps, ItemDataType, DataItemValue } from '../@types/common';
5
+ import type { MultiCascadeTreeProps } from '../MultiCascadeTree';
6
+ export interface MultiCascaderProps<T extends DataItemValue> extends FormControlPickerProps<T[], PickerLocale, ItemDataType<T>, T>, MultiCascadeTreeProps<T, T[]>, Pick<PickerToggleProps, 'loading'> {
7
+ /**
8
+ * A picker that can be counted
9
+ */
9
10
  countable?: boolean;
10
- /** Sets the width of the menu */
11
+ /**
12
+ * Sets the width of the menu.
13
+ *
14
+ * @deprecated Use columnWidth instead
15
+ */
11
16
  menuWidth?: number;
12
- /** Sets the height of the menu */
13
- menuHeight?: number | string;
14
- /** Set the option value for the check box not to be rendered */
15
- uncheckableItemValues?: T;
16
- /** Whether dispaly search input box */
17
- searchable?: boolean;
18
- /** The menu is displayed directly when the component is initialized */
17
+ /**
18
+ * Sets the height of the menu
19
+ * @deprecated Use columnHeight instead
20
+ */
21
+ menuHeight?: number;
22
+ /**
23
+ * Custom menu class name
24
+ * @deprecated Use popupClassName instead
25
+ */
26
+ menuClassName?: string;
27
+ /**
28
+ * Custom menu style
29
+ * @deprecated Use popupStyle instead
30
+ */
31
+ menuStyle?: React.CSSProperties;
32
+ /**
33
+ * Custom popup style
34
+ */
35
+ popupStyle?: React.CSSProperties;
36
+ /**
37
+ * Custom popup style
38
+ */
39
+ popupClassName?: string;
40
+ /**
41
+ * The panel is displayed directly when the component is initialized
42
+ * @deprecated Use MultiCascadeTree instead
43
+ * @see MultiCascadeTree https://rsuitejs.com/components/multi-cascade-tree
44
+ */
19
45
  inline?: boolean;
20
- /** Custom render menu */
21
- renderMenu?: (items: readonly ItemDataType[], menu: React.ReactNode, parentNode?: any, layer?: number) => React.ReactNode;
22
- /** Custom render menu items */
23
- renderMenuItem?: (itemLabel: React.ReactNode, item: any) => React.ReactNode;
24
- /** Custom render selected items */
25
- renderValue?: (value: T, selectedItems: ItemDataType[], selectedElement: React.ReactNode) => React.ReactNode;
26
- /** Called when the option is selected */
27
- onSelect?: (node: ItemDataType, cascadePaths: ItemDataType[], event: React.SyntheticEvent) => void;
28
- /** Called after the checkbox state changes */
29
- onCheck?: (value: ValueType, node: ItemDataType, checked: boolean, event: React.SyntheticEvent) => void;
30
- /** Called when clean */
46
+ /**
47
+ * Custom render menu
48
+ * @deprecated Use renderColumn instead
49
+ */
50
+ renderMenu?: (items: readonly ItemDataType<T>[], menu: React.ReactNode, parentNode?: any, layer?: number) => React.ReactNode;
51
+ /**
52
+ * Custom render menu item
53
+ * @deprecated Use renderTreeNode instead
54
+ */
55
+ renderMenuItem?: (node: React.ReactNode, item: ItemDataType<T>) => React.ReactNode;
56
+ /**
57
+ * Custom render selected items
58
+ */
59
+ renderValue?: (value: T[], selectedItems: ItemDataType<T>[], selectedElement: React.ReactNode) => React.ReactNode;
60
+ /**
61
+ * Called when clean
62
+ */
31
63
  onClean?: (event: React.SyntheticEvent) => void;
32
- /** Called when searching */
33
- onSearch?: (searchKeyword: string, event: React.SyntheticEvent) => void;
34
- /** Asynchronously load the children of the tree node. */
35
- getChildren?: (node: ItemDataType) => ItemDataType[] | Promise<ItemDataType[]>;
36
64
  }
37
65
  /**
38
66
  * The `MultiCascader` component is used to select multiple values from cascading options.
39
67
  * @see https://rsuitejs.com/components/multi-cascader/
40
68
  */
41
- declare const MultiCascader: PickerComponent<MultiCascaderProps>;
69
+ declare const MultiCascader: PickerComponent<MultiCascaderProps<DataItemValue>>;
42
70
  export default MultiCascader;