rsuite 5.56.0 → 5.58.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.
- package/Accordion/styles/index.css +30 -0
- package/AutoComplete/styles/index.css +0 -137
- package/CHANGELOG.md +32 -0
- package/CascadeTree/package.json +7 -0
- package/CascadeTree/styles/index.css +273 -0
- package/CascadeTree/styles/index.less +77 -0
- package/CascadeTree/styles/search.less +45 -0
- package/Cascader/styles/index.css +187 -329
- package/Cascader/styles/index.less +1 -122
- package/CheckPicker/styles/index.css +0 -137
- package/CheckTree/styles/index.css +0 -137
- package/CheckTreePicker/styles/index.css +0 -137
- package/DatePicker/styles/index.css +0 -137
- package/DateRangePicker/styles/index.css +0 -137
- package/Dropdown/styles/index.css +35 -8
- package/Dropdown/styles/index.less +24 -13
- package/Heading/package.json +7 -0
- package/Heading/styles/index.css +42 -0
- package/Heading/styles/index.less +41 -0
- package/HeadingGroup/package.json +7 -0
- package/HeadingGroup/styles/index.css +5 -0
- package/HeadingGroup/styles/index.less +3 -0
- package/InputPicker/styles/index.css +29 -146
- package/InputPicker/styles/index.less +28 -12
- package/InputPicker/styles/mixin.less +7 -0
- package/MultiCascadeTree/package.json +7 -0
- package/MultiCascadeTree/styles/index.css +3564 -0
- package/MultiCascadeTree/styles/index.less +37 -0
- package/MultiCascader/styles/index.css +72 -206
- package/MultiCascader/styles/index.less +11 -31
- package/Nav/styles/index.css +35 -8
- package/Navbar/styles/index.css +35 -8
- package/Pagination/styles/index.css +0 -137
- package/Panel/styles/index.css +30 -0
- package/Panel/styles/index.less +1 -0
- package/Popover/styles/index.css +30 -0
- package/Popover/styles/index.less +3 -2
- package/SelectPicker/styles/index.css +0 -137
- package/Tabs/styles/index.css +35 -8
- package/TagInput/styles/index.css +132 -150
- package/TagPicker/styles/index.css +132 -150
- package/TagPicker/styles/index.less +57 -5
- package/TagPicker/styles/mixin.less +21 -0
- package/Text/package.json +7 -0
- package/Text/styles/index.css +192 -0
- package/Text/styles/index.less +117 -0
- package/cjs/@types/common.d.ts +12 -14
- package/cjs/CascadeTree/CascadeTree.d.ts +16 -0
- package/cjs/CascadeTree/CascadeTree.js +174 -0
- package/cjs/CascadeTree/SearchView.d.ts +17 -0
- package/cjs/CascadeTree/SearchView.js +106 -0
- package/cjs/CascadeTree/TreeView.d.ts +20 -0
- package/cjs/{Cascader → CascadeTree}/TreeView.js +42 -33
- package/cjs/CascadeTree/hooks/index.d.ts +3 -0
- package/cjs/CascadeTree/hooks/index.js +12 -0
- package/cjs/{Cascader/utils.d.ts → CascadeTree/hooks/usePaths.d.ts} +3 -25
- package/cjs/CascadeTree/hooks/usePaths.js +42 -0
- package/cjs/CascadeTree/hooks/useSearch.d.ts +17 -0
- package/cjs/CascadeTree/hooks/useSearch.js +59 -0
- package/cjs/CascadeTree/hooks/useSelect.d.ts +23 -0
- package/cjs/CascadeTree/hooks/useSelect.js +64 -0
- package/cjs/CascadeTree/index.d.ts +4 -0
- package/cjs/CascadeTree/index.js +9 -0
- package/cjs/CascadeTree/types.d.ts +66 -0
- package/cjs/CascadeTree/types.js +2 -0
- package/cjs/CascadeTree/utils.d.ts +32 -0
- package/cjs/CascadeTree/utils.js +66 -0
- package/cjs/Cascader/Cascader.d.ts +57 -26
- package/cjs/Cascader/Cascader.js +178 -249
- package/cjs/Cascader/useActive.d.ts +15 -0
- package/cjs/Cascader/useActive.js +43 -0
- package/cjs/CheckPicker/CheckPicker.js +2 -9
- package/cjs/CheckTreePicker/CheckTreePicker.js +2 -10
- package/cjs/DatePicker/DatePicker.js +5 -5
- package/cjs/DateRangePicker/DateRangePicker.js +3 -5
- package/cjs/Dropdown/DropdownItem.d.ts +10 -2
- package/cjs/Dropdown/DropdownItem.js +12 -3
- package/cjs/Heading/Heading.d.ts +16 -0
- package/cjs/Heading/Heading.js +44 -0
- package/cjs/Heading/index.d.ts +3 -0
- package/cjs/Heading/index.js +10 -0
- package/cjs/HeadingGroup/HeadingGroup.d.ts +8 -0
- package/cjs/HeadingGroup/HeadingGroup.js +17 -0
- package/cjs/HeadingGroup/index.d.ts +3 -0
- package/cjs/HeadingGroup/index.js +9 -0
- package/cjs/InlineEdit/InlineEdit.d.ts +1 -1
- package/cjs/InputPicker/InputPicker.js +7 -8
- package/cjs/Loader/Loader.js +5 -4
- package/cjs/MultiCascadeTree/MultiCascadeTree.d.ts +9 -0
- package/cjs/MultiCascadeTree/MultiCascadeTree.js +131 -0
- package/cjs/MultiCascadeTree/SearchView.d.ts +17 -0
- package/cjs/MultiCascadeTree/SearchView.js +117 -0
- package/cjs/MultiCascadeTree/TreeView.d.ts +22 -0
- package/cjs/{MultiCascader → MultiCascadeTree}/TreeView.js +20 -20
- package/cjs/MultiCascadeTree/hooks/index.d.ts +5 -0
- package/cjs/MultiCascadeTree/hooks/index.js +16 -0
- package/cjs/MultiCascadeTree/hooks/useCascadeValue.d.ts +18 -0
- package/cjs/MultiCascadeTree/hooks/useCascadeValue.js +202 -0
- package/cjs/MultiCascadeTree/hooks/useColumnData.d.ts +16 -0
- package/cjs/MultiCascadeTree/hooks/useColumnData.js +52 -0
- package/cjs/MultiCascadeTree/hooks/useFlattenData.d.ts +9 -0
- package/cjs/MultiCascadeTree/hooks/useFlattenData.js +33 -0
- package/cjs/MultiCascadeTree/hooks/useSearch.d.ts +17 -0
- package/cjs/MultiCascadeTree/hooks/useSearch.js +52 -0
- package/cjs/MultiCascadeTree/hooks/useSelect.d.ts +19 -0
- package/cjs/MultiCascadeTree/hooks/useSelect.js +83 -0
- package/cjs/MultiCascadeTree/index.d.ts +4 -0
- package/cjs/MultiCascadeTree/index.js +9 -0
- package/cjs/MultiCascadeTree/types.d.ts +26 -0
- package/cjs/MultiCascadeTree/types.js +2 -0
- package/cjs/MultiCascadeTree/utils.d.ts +37 -0
- package/cjs/MultiCascadeTree/utils.js +140 -0
- package/cjs/MultiCascader/MultiCascader.d.ts +57 -29
- package/cjs/MultiCascader/MultiCascader.js +173 -289
- package/cjs/Panel/Panel.js +3 -1
- package/cjs/Popover/Popover.js +3 -1
- package/cjs/SelectPicker/SelectPicker.js +3 -9
- package/cjs/Text/Text.d.ts +47 -0
- package/cjs/Text/Text.js +72 -0
- package/cjs/Text/index.d.ts +3 -0
- package/cjs/Text/index.js +10 -0
- package/cjs/Tree/Tree.d.ts +4 -4
- package/cjs/TreePicker/TreePicker.js +3 -10
- package/cjs/index.d.ts +27 -16
- package/cjs/index.js +30 -19
- package/cjs/internals/Overlay/OverlayTrigger.js +24 -17
- package/cjs/internals/Picker/PickerToggle.d.ts +4 -5
- package/cjs/internals/Picker/PickerToggleTrigger.d.ts +1 -1
- package/cjs/internals/Picker/PickerToggleTrigger.js +1 -1
- package/cjs/internals/Picker/hooks/useToggleKeyDownEvent.d.ts +0 -2
- package/cjs/internals/Picker/hooks/useToggleKeyDownEvent.js +0 -4
- package/cjs/toaster/ToastContainer.d.ts +9 -2
- package/cjs/toaster/index.d.ts +0 -1
- package/cjs/toaster/index.js +1 -3
- package/cjs/useToaster/index.d.ts +2 -0
- package/cjs/useToaster/index.js +9 -0
- package/cjs/{toaster → useToaster}/useToaster.d.ts +4 -4
- package/cjs/{toaster → useToaster}/useToaster.js +4 -4
- package/cjs/utils/index.d.ts +1 -0
- package/cjs/utils/index.js +5 -2
- package/dist/rsuite-no-reset-rtl.css +393 -219
- package/dist/rsuite-no-reset-rtl.min.css +1 -1
- package/dist/rsuite-no-reset-rtl.min.css.map +1 -1
- package/dist/rsuite-no-reset.css +393 -219
- package/dist/rsuite-no-reset.min.css +1 -1
- package/dist/rsuite-no-reset.min.css.map +1 -1
- package/dist/rsuite-rtl.css +393 -219
- package/dist/rsuite-rtl.min.css +1 -1
- package/dist/rsuite-rtl.min.css.map +1 -1
- package/dist/rsuite.css +393 -219
- package/dist/rsuite.js +321 -57
- package/dist/rsuite.js.map +1 -1
- package/dist/rsuite.min.css +1 -1
- package/dist/rsuite.min.css.map +1 -1
- package/dist/rsuite.min.js +1 -1
- package/dist/rsuite.min.js.map +1 -1
- package/esm/@types/common.d.ts +12 -14
- package/esm/CascadeTree/CascadeTree.d.ts +16 -0
- package/esm/CascadeTree/CascadeTree.js +167 -0
- package/esm/CascadeTree/SearchView.d.ts +17 -0
- package/esm/CascadeTree/SearchView.js +100 -0
- package/esm/CascadeTree/TreeView.d.ts +20 -0
- package/esm/{Cascader → CascadeTree}/TreeView.js +42 -33
- package/esm/CascadeTree/hooks/index.d.ts +3 -0
- package/esm/CascadeTree/hooks/index.js +4 -0
- package/esm/{Cascader/utils.d.ts → CascadeTree/hooks/usePaths.d.ts} +3 -25
- package/esm/CascadeTree/hooks/usePaths.js +36 -0
- package/esm/CascadeTree/hooks/useSearch.d.ts +17 -0
- package/esm/CascadeTree/hooks/useSearch.js +54 -0
- package/esm/CascadeTree/hooks/useSelect.d.ts +23 -0
- package/esm/CascadeTree/hooks/useSelect.js +59 -0
- package/esm/CascadeTree/index.d.ts +4 -0
- package/esm/CascadeTree/index.js +3 -0
- package/esm/CascadeTree/types.d.ts +66 -0
- package/esm/CascadeTree/types.js +1 -0
- package/esm/CascadeTree/utils.d.ts +32 -0
- package/esm/CascadeTree/utils.js +61 -0
- package/esm/Cascader/Cascader.d.ts +57 -26
- package/esm/Cascader/Cascader.js +165 -235
- package/esm/Cascader/useActive.d.ts +15 -0
- package/esm/Cascader/useActive.js +37 -0
- package/esm/CheckPicker/CheckPicker.js +2 -9
- package/esm/CheckTreePicker/CheckTreePicker.js +2 -10
- package/esm/DatePicker/DatePicker.js +6 -6
- package/esm/DateRangePicker/DateRangePicker.js +3 -5
- package/esm/Dropdown/DropdownItem.d.ts +10 -2
- package/esm/Dropdown/DropdownItem.js +12 -3
- package/esm/Heading/Heading.d.ts +16 -0
- package/esm/Heading/Heading.js +38 -0
- package/esm/Heading/index.d.ts +3 -0
- package/esm/Heading/index.js +4 -0
- package/esm/HeadingGroup/HeadingGroup.d.ts +8 -0
- package/esm/HeadingGroup/HeadingGroup.js +11 -0
- package/esm/HeadingGroup/index.d.ts +3 -0
- package/esm/HeadingGroup/index.js +3 -0
- package/esm/InlineEdit/InlineEdit.d.ts +1 -1
- package/esm/InputPicker/InputPicker.js +7 -8
- package/esm/Loader/Loader.js +6 -5
- package/esm/MultiCascadeTree/MultiCascadeTree.d.ts +9 -0
- package/esm/MultiCascadeTree/MultiCascadeTree.js +125 -0
- package/esm/MultiCascadeTree/SearchView.d.ts +17 -0
- package/esm/MultiCascadeTree/SearchView.js +111 -0
- package/esm/MultiCascadeTree/TreeView.d.ts +22 -0
- package/esm/{MultiCascader → MultiCascadeTree}/TreeView.js +20 -20
- package/esm/MultiCascadeTree/hooks/index.d.ts +5 -0
- package/esm/MultiCascadeTree/hooks/index.js +6 -0
- package/esm/MultiCascadeTree/hooks/useCascadeValue.d.ts +18 -0
- package/esm/MultiCascadeTree/hooks/useCascadeValue.js +197 -0
- package/esm/MultiCascadeTree/hooks/useColumnData.d.ts +16 -0
- package/esm/MultiCascadeTree/hooks/useColumnData.js +46 -0
- package/esm/MultiCascadeTree/hooks/useFlattenData.d.ts +9 -0
- package/esm/MultiCascadeTree/hooks/useFlattenData.js +28 -0
- package/esm/MultiCascadeTree/hooks/useSearch.d.ts +17 -0
- package/esm/MultiCascadeTree/hooks/useSearch.js +47 -0
- package/esm/MultiCascadeTree/hooks/useSelect.d.ts +19 -0
- package/esm/MultiCascadeTree/hooks/useSelect.js +77 -0
- package/esm/MultiCascadeTree/index.d.ts +4 -0
- package/esm/MultiCascadeTree/index.js +3 -0
- package/esm/MultiCascadeTree/types.d.ts +26 -0
- package/esm/MultiCascadeTree/types.js +1 -0
- package/esm/MultiCascadeTree/utils.d.ts +37 -0
- package/esm/MultiCascadeTree/utils.js +130 -0
- package/esm/MultiCascader/MultiCascader.d.ts +57 -29
- package/esm/MultiCascader/MultiCascader.js +166 -281
- package/esm/Panel/Panel.js +3 -1
- package/esm/Popover/Popover.js +3 -1
- package/esm/SelectPicker/SelectPicker.js +3 -9
- package/esm/Text/Text.d.ts +47 -0
- package/esm/Text/Text.js +66 -0
- package/esm/Text/index.d.ts +3 -0
- package/esm/Text/index.js +4 -0
- package/esm/Tree/Tree.d.ts +4 -4
- package/esm/TreePicker/TreePicker.js +3 -10
- package/esm/index.d.ts +27 -16
- package/esm/index.js +38 -15
- package/esm/internals/Overlay/OverlayTrigger.js +24 -17
- package/esm/internals/Picker/PickerToggle.d.ts +4 -5
- package/esm/internals/Picker/PickerToggleTrigger.d.ts +1 -1
- package/esm/internals/Picker/PickerToggleTrigger.js +1 -1
- package/esm/internals/Picker/hooks/useToggleKeyDownEvent.d.ts +0 -2
- package/esm/internals/Picker/hooks/useToggleKeyDownEvent.js +0 -4
- package/esm/toaster/ToastContainer.d.ts +9 -2
- package/esm/toaster/index.d.ts +0 -1
- package/esm/toaster/index.js +0 -1
- package/esm/useToaster/index.d.ts +2 -0
- package/esm/useToaster/index.js +3 -0
- package/esm/{toaster → useToaster}/useToaster.d.ts +4 -4
- package/esm/{toaster → useToaster}/useToaster.js +4 -4
- package/esm/utils/index.d.ts +1 -0
- package/esm/utils/index.js +2 -1
- package/internals/Picker/styles/index.less +0 -5
- package/internals/Picker/styles/mixin.less +0 -73
- package/package.json +1 -1
- package/styles/color-modes/light.less +7 -0
- package/styles/index.less +5 -0
- package/useToaster/package.json +7 -0
- package/useToaster/styles/index.css +239 -0
- package/useToaster/styles/index.less +1 -0
- package/cjs/Cascader/DropdownMenu.d.ts +0 -24
- package/cjs/Cascader/DropdownMenu.js +0 -175
- package/cjs/Cascader/TreeView.d.ts +0 -24
- package/cjs/Cascader/utils.js +0 -79
- package/cjs/MultiCascader/TreeView.d.ts +0 -25
- package/cjs/MultiCascader/utils.d.ts +0 -71
- package/cjs/MultiCascader/utils.js +0 -382
- package/esm/Cascader/DropdownMenu.d.ts +0 -24
- package/esm/Cascader/DropdownMenu.js +0 -168
- package/esm/Cascader/TreeView.d.ts +0 -24
- package/esm/Cascader/utils.js +0 -74
- package/esm/MultiCascader/TreeView.d.ts +0 -25
- package/esm/MultiCascader/utils.d.ts +0 -71
- package/esm/MultiCascader/utils.js +0 -369
|
@@ -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 ? '
|
|
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$
|
|
32
|
-
|
|
33
|
-
_props$
|
|
34
|
-
|
|
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
|
-
|
|
44
|
-
|
|
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", "
|
|
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
|
-
},
|
|
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:
|
|
132
|
-
width:
|
|
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
|
|
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
|
|
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
|
-
},
|
|
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 *
|
|
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;
|
|
@@ -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;
|