@rc-component/tree-select 1.0.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/LICENSE.md +22 -0
- package/README.md +140 -0
- package/assets/icons.png +0 -0
- package/assets/index.less +2 -0
- package/assets/loading.gif +0 -0
- package/assets/minus.gif +0 -0
- package/assets/select.less +3 -0
- package/assets/tree.less +3 -0
- package/dist/223.90c7e648.async.js +3 -0
- package/dist/338.a2a48f3b.async.js +15 -0
- package/dist/338.e8c51481.chunk.css +5 -0
- package/dist/404.html +20 -0
- package/dist/439.67bede3f.async.js +137 -0
- package/dist/929.df8dd03f.async.js +32 -0
- package/dist/demo/basic/index.html +20 -0
- package/dist/demo/big-data/index.html +20 -0
- package/dist/demo/controlled/index.html +20 -0
- package/dist/demo/custom-icons/index.html +20 -0
- package/dist/demo/debug/index.html +20 -0
- package/dist/demo/disable/index.html +20 -0
- package/dist/demo/dynamic/index.html +20 -0
- package/dist/demo/field-names/index.html +20 -0
- package/dist/demo/filter/index.html +20 -0
- package/dist/demo/form/index.html +20 -0
- package/dist/demo/mutiple-with-max-count/index.html +20 -0
- package/dist/demo/tree-node-label-prop/index.html +20 -0
- package/dist/demo/width/index.html +20 -0
- package/dist/demos.f221b577.async.js +1 -0
- package/dist/docs__demo__basic.md.bcb0edb7.async.js +1 -0
- package/dist/docs__demo__big-data.md.8783cd6b.async.js +1 -0
- package/dist/docs__demo__controlled.md.e65ef7d7.async.js +1 -0
- package/dist/docs__demo__custom-icons.md.d53bf2f9.async.js +1 -0
- package/dist/docs__demo__debug.md.099ad226.async.js +1 -0
- package/dist/docs__demo__disable.md.6ba57652.async.js +1 -0
- package/dist/docs__demo__dynamic.md.f7559890.async.js +1 -0
- package/dist/docs__demo__fieldNames.md.16131d9f.async.js +1 -0
- package/dist/docs__demo__filter.md.02527db4.async.js +1 -0
- package/dist/docs__demo__form.md.6b77dffe.async.js +1 -0
- package/dist/docs__demo__mutiple-with-maxCount.md.7268d4ad.async.js +1 -0
- package/dist/docs__demo__treeNodeLabelProp.md.24709916.async.js +1 -0
- package/dist/docs__demo__width.md.24bfecd6.async.js +1 -0
- package/dist/docs__index.md.a6e45331.async.js +1 -0
- package/dist/dumi__tmp-production__dumi__theme__ContextWrapper.f56a0670.async.js +1 -0
- package/dist/index.html +20 -0
- package/dist/meta__docs.255fc42b.chunk.css +1 -0
- package/dist/meta__docs.dbf04b66.async.js +3359 -0
- package/dist/nm__dumi__dist__client__pages__404.8b85f2d9.chunk.css +1 -0
- package/dist/nm__dumi__dist__client__pages__404.ca2add38.async.js +1 -0
- package/dist/nm__dumi__dist__client__pages__Demo__index.29e9ef8f.async.js +1 -0
- package/dist/nm__dumi__dist__client__pages__Demo__index.578aa5c0.chunk.css +1 -0
- package/dist/nm__dumi__theme-default__layouts__DocLayout__index.8ed833d7.async.js +1 -0
- package/dist/preload_helper.d41c4da0.js +1 -0
- package/dist/umi.4f47b921.js +124 -0
- package/dist/umi.8faca2de.css +1 -0
- package/dist/~demos/:id/index.html +20 -0
- package/dist/~demos/docs-demo-basic-demo-basic/index.html +20 -0
- package/dist/~demos/docs-demo-big-data-demo-big-data/index.html +20 -0
- package/dist/~demos/docs-demo-controlled-demo-controlled/index.html +20 -0
- package/dist/~demos/docs-demo-custom-icons-demo-custom-icons/index.html +20 -0
- package/dist/~demos/docs-demo-debug-demo-debug/index.html +20 -0
- package/dist/~demos/docs-demo-disable-demo-disable/index.html +20 -0
- package/dist/~demos/docs-demo-dynamic-demo-dynamic/index.html +20 -0
- package/dist/~demos/docs-demo-field-names-demo-fieldnames/index.html +20 -0
- package/dist/~demos/docs-demo-filter-demo-filter/index.html +20 -0
- package/dist/~demos/docs-demo-form-demo-form/index.html +20 -0
- package/dist/~demos/docs-demo-mutiple-with-max-count-demo-mutiple-with-maxcount/index.html +20 -0
- package/dist/~demos/docs-demo-tree-node-label-prop-demo-treenodelabelprop/index.html +20 -0
- package/dist/~demos/docs-demo-width-demo-width/index.html +20 -0
- package/es/LegacyContext.d.ts +24 -0
- package/es/LegacyContext.js +3 -0
- package/es/OptionList.d.ts +8 -0
- package/es/OptionList.js +351 -0
- package/es/TreeNode.d.ts +9 -0
- package/es/TreeNode.js +5 -0
- package/es/TreeSelect.d.ts +65 -0
- package/es/TreeSelect.js +507 -0
- package/es/TreeSelectContext.d.ts +25 -0
- package/es/TreeSelectContext.js +3 -0
- package/es/hooks/useCache.d.ts +7 -0
- package/es/hooks/useCache.js +32 -0
- package/es/hooks/useCheckedKeys.d.ts +5 -0
- package/es/hooks/useCheckedKeys.js +21 -0
- package/es/hooks/useDataEntities.d.ts +7 -0
- package/es/hooks/useDataEntities.js +26 -0
- package/es/hooks/useFilterTreeData.d.ts +8 -0
- package/es/hooks/useFilterTreeData.js +33 -0
- package/es/hooks/useRefFunc.d.ts +5 -0
- package/es/hooks/useRefFunc.js +14 -0
- package/es/hooks/useTreeData.d.ts +7 -0
- package/es/hooks/useTreeData.js +52 -0
- package/es/index.d.ts +7 -0
- package/es/index.js +5 -0
- package/es/interface.d.ts +57 -0
- package/es/interface.js +1 -0
- package/es/utils/legacyUtil.d.ts +5 -0
- package/es/utils/legacyUtil.js +120 -0
- package/es/utils/strategyUtil.d.ts +7 -0
- package/es/utils/strategyUtil.js +25 -0
- package/es/utils/valueUtil.d.ts +11 -0
- package/es/utils/valueUtil.js +30 -0
- package/es/utils/warningPropsUtil.d.ts +5 -0
- package/es/utils/warningPropsUtil.js +30 -0
- package/lib/LegacyContext.d.ts +24 -0
- package/lib/LegacyContext.js +11 -0
- package/lib/OptionList.d.ts +8 -0
- package/lib/OptionList.js +359 -0
- package/lib/TreeNode.d.ts +9 -0
- package/lib/TreeNode.js +11 -0
- package/lib/TreeSelect.d.ts +65 -0
- package/lib/TreeSelect.js +516 -0
- package/lib/TreeSelectContext.d.ts +25 -0
- package/lib/TreeSelectContext.js +11 -0
- package/lib/hooks/useCache.d.ts +7 -0
- package/lib/hooks/useCache.js +41 -0
- package/lib/hooks/useCheckedKeys.d.ts +5 -0
- package/lib/hooks/useCheckedKeys.js +29 -0
- package/lib/hooks/useDataEntities.d.ts +7 -0
- package/lib/hooks/useDataEntities.js +36 -0
- package/lib/hooks/useFilterTreeData.d.ts +8 -0
- package/lib/hooks/useFilterTreeData.js +41 -0
- package/lib/hooks/useRefFunc.d.ts +5 -0
- package/lib/hooks/useRefFunc.js +21 -0
- package/lib/hooks/useTreeData.d.ts +7 -0
- package/lib/hooks/useTreeData.js +60 -0
- package/lib/index.d.ts +7 -0
- package/lib/index.js +35 -0
- package/lib/interface.d.ts +57 -0
- package/lib/interface.js +5 -0
- package/lib/utils/legacyUtil.d.ts +5 -0
- package/lib/utils/legacyUtil.js +131 -0
- package/lib/utils/strategyUtil.d.ts +7 -0
- package/lib/utils/strategyUtil.js +32 -0
- package/lib/utils/valueUtil.d.ts +11 -0
- package/lib/utils/valueUtil.js +41 -0
- package/lib/utils/warningPropsUtil.d.ts +5 -0
- package/lib/utils/warningPropsUtil.js +37 -0
- package/package.json +89 -0
|
@@ -0,0 +1,359 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = void 0;
|
|
7
|
+
var _select = require("@rc-component/select");
|
|
8
|
+
var _rcTree = _interopRequireWildcard(require("rc-tree"));
|
|
9
|
+
var _KeyCode = _interopRequireDefault(require("@rc-component/util/lib/KeyCode"));
|
|
10
|
+
var _useMemo = _interopRequireDefault(require("@rc-component/util/lib/hooks/useMemo"));
|
|
11
|
+
var React = _interopRequireWildcard(require("react"));
|
|
12
|
+
var _LegacyContext = _interopRequireDefault(require("./LegacyContext"));
|
|
13
|
+
var _TreeSelectContext = _interopRequireDefault(require("./TreeSelectContext"));
|
|
14
|
+
var _valueUtil = require("./utils/valueUtil");
|
|
15
|
+
var _util = require("@rc-component/util");
|
|
16
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
17
|
+
function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
|
|
18
|
+
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && Object.prototype.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
|
|
19
|
+
function _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
|
|
20
|
+
const HIDDEN_STYLE = {
|
|
21
|
+
width: 0,
|
|
22
|
+
height: 0,
|
|
23
|
+
display: 'flex',
|
|
24
|
+
overflow: 'hidden',
|
|
25
|
+
opacity: 0,
|
|
26
|
+
border: 0,
|
|
27
|
+
padding: 0,
|
|
28
|
+
margin: 0
|
|
29
|
+
};
|
|
30
|
+
const OptionList = (_, ref) => {
|
|
31
|
+
const {
|
|
32
|
+
prefixCls,
|
|
33
|
+
multiple,
|
|
34
|
+
searchValue,
|
|
35
|
+
toggleOpen,
|
|
36
|
+
open,
|
|
37
|
+
notFoundContent
|
|
38
|
+
} = (0, _select.useBaseProps)();
|
|
39
|
+
const {
|
|
40
|
+
virtual,
|
|
41
|
+
listHeight,
|
|
42
|
+
listItemHeight,
|
|
43
|
+
listItemScrollOffset,
|
|
44
|
+
treeData,
|
|
45
|
+
fieldNames,
|
|
46
|
+
onSelect,
|
|
47
|
+
popupMatchSelectWidth,
|
|
48
|
+
treeExpandAction,
|
|
49
|
+
treeTitleRender,
|
|
50
|
+
onPopupScroll,
|
|
51
|
+
leftMaxCount,
|
|
52
|
+
leafCountOnly,
|
|
53
|
+
valueEntities
|
|
54
|
+
} = React.useContext(_TreeSelectContext.default);
|
|
55
|
+
const {
|
|
56
|
+
checkable,
|
|
57
|
+
checkedKeys,
|
|
58
|
+
halfCheckedKeys,
|
|
59
|
+
treeExpandedKeys,
|
|
60
|
+
treeDefaultExpandAll,
|
|
61
|
+
treeDefaultExpandedKeys,
|
|
62
|
+
onTreeExpand,
|
|
63
|
+
treeIcon,
|
|
64
|
+
showTreeIcon,
|
|
65
|
+
switcherIcon,
|
|
66
|
+
treeLine,
|
|
67
|
+
treeNodeFilterProp,
|
|
68
|
+
loadData,
|
|
69
|
+
treeLoadedKeys,
|
|
70
|
+
treeMotion,
|
|
71
|
+
onTreeLoad,
|
|
72
|
+
keyEntities
|
|
73
|
+
} = React.useContext(_LegacyContext.default);
|
|
74
|
+
const treeRef = React.useRef();
|
|
75
|
+
const memoTreeData = (0, _useMemo.default)(() => treeData,
|
|
76
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
77
|
+
[open, treeData], (prev, next) => next[0] && prev[1] !== next[1]);
|
|
78
|
+
|
|
79
|
+
// ========================== Values ==========================
|
|
80
|
+
const mergedCheckedKeys = React.useMemo(() => {
|
|
81
|
+
if (!checkable) {
|
|
82
|
+
return null;
|
|
83
|
+
}
|
|
84
|
+
return {
|
|
85
|
+
checked: checkedKeys,
|
|
86
|
+
halfChecked: halfCheckedKeys
|
|
87
|
+
};
|
|
88
|
+
}, [checkable, checkedKeys, halfCheckedKeys]);
|
|
89
|
+
|
|
90
|
+
// ========================== Scroll ==========================
|
|
91
|
+
React.useEffect(() => {
|
|
92
|
+
// Single mode should scroll to current key
|
|
93
|
+
if (open && !multiple && checkedKeys.length) {
|
|
94
|
+
treeRef.current?.scrollTo({
|
|
95
|
+
key: checkedKeys[0]
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
99
|
+
}, [open]);
|
|
100
|
+
|
|
101
|
+
// ========================== Events ==========================
|
|
102
|
+
const onListMouseDown = event => {
|
|
103
|
+
event.preventDefault();
|
|
104
|
+
};
|
|
105
|
+
const onInternalSelect = (__, info) => {
|
|
106
|
+
const {
|
|
107
|
+
node
|
|
108
|
+
} = info;
|
|
109
|
+
if (checkable && (0, _valueUtil.isCheckDisabled)(node)) {
|
|
110
|
+
return;
|
|
111
|
+
}
|
|
112
|
+
onSelect(node.key, {
|
|
113
|
+
selected: !checkedKeys.includes(node.key)
|
|
114
|
+
});
|
|
115
|
+
if (!multiple) {
|
|
116
|
+
toggleOpen(false);
|
|
117
|
+
}
|
|
118
|
+
};
|
|
119
|
+
|
|
120
|
+
// =========================== Keys ===========================
|
|
121
|
+
const [expandedKeys, setExpandedKeys] = React.useState(treeDefaultExpandedKeys);
|
|
122
|
+
const [searchExpandedKeys, setSearchExpandedKeys] = React.useState(null);
|
|
123
|
+
const mergedExpandedKeys = React.useMemo(() => {
|
|
124
|
+
if (treeExpandedKeys) {
|
|
125
|
+
return [...treeExpandedKeys];
|
|
126
|
+
}
|
|
127
|
+
return searchValue ? searchExpandedKeys : expandedKeys;
|
|
128
|
+
}, [expandedKeys, searchExpandedKeys, treeExpandedKeys, searchValue]);
|
|
129
|
+
const onInternalExpand = keys => {
|
|
130
|
+
setExpandedKeys(keys);
|
|
131
|
+
setSearchExpandedKeys(keys);
|
|
132
|
+
if (onTreeExpand) {
|
|
133
|
+
onTreeExpand(keys);
|
|
134
|
+
}
|
|
135
|
+
};
|
|
136
|
+
|
|
137
|
+
// ========================== Search ==========================
|
|
138
|
+
const lowerSearchValue = String(searchValue).toLowerCase();
|
|
139
|
+
const filterTreeNode = treeNode => {
|
|
140
|
+
if (!lowerSearchValue) {
|
|
141
|
+
return false;
|
|
142
|
+
}
|
|
143
|
+
return String(treeNode[treeNodeFilterProp]).toLowerCase().includes(lowerSearchValue);
|
|
144
|
+
};
|
|
145
|
+
React.useEffect(() => {
|
|
146
|
+
if (searchValue) {
|
|
147
|
+
setSearchExpandedKeys((0, _valueUtil.getAllKeys)(treeData, fieldNames));
|
|
148
|
+
}
|
|
149
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
150
|
+
}, [searchValue]);
|
|
151
|
+
|
|
152
|
+
// ========================= Disabled =========================
|
|
153
|
+
// Cache disabled states in React state to ensure re-render when cache updates
|
|
154
|
+
const [disabledCache, setDisabledCache] = React.useState(() => new Map());
|
|
155
|
+
React.useEffect(() => {
|
|
156
|
+
if (leftMaxCount) {
|
|
157
|
+
setDisabledCache(new Map());
|
|
158
|
+
}
|
|
159
|
+
}, [leftMaxCount]);
|
|
160
|
+
function getDisabledWithCache(node) {
|
|
161
|
+
const value = node[fieldNames.value];
|
|
162
|
+
if (!disabledCache.has(value)) {
|
|
163
|
+
const entity = valueEntities.get(value);
|
|
164
|
+
const isLeaf = (entity.children || []).length === 0;
|
|
165
|
+
if (!isLeaf) {
|
|
166
|
+
const checkableChildren = entity.children.filter(childTreeNode => !childTreeNode.node.disabled && !childTreeNode.node.disableCheckbox && !checkedKeys.includes(childTreeNode.node[fieldNames.value]));
|
|
167
|
+
const checkableChildrenCount = checkableChildren.length;
|
|
168
|
+
disabledCache.set(value, checkableChildrenCount > leftMaxCount);
|
|
169
|
+
} else {
|
|
170
|
+
disabledCache.set(value, false);
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
return disabledCache.get(value);
|
|
174
|
+
}
|
|
175
|
+
const nodeDisabled = (0, _util.useEvent)(node => {
|
|
176
|
+
const nodeValue = node[fieldNames.value];
|
|
177
|
+
if (checkedKeys.includes(nodeValue)) {
|
|
178
|
+
return false;
|
|
179
|
+
}
|
|
180
|
+
if (leftMaxCount === null) {
|
|
181
|
+
return false;
|
|
182
|
+
}
|
|
183
|
+
if (leftMaxCount <= 0) {
|
|
184
|
+
return true;
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
// This is a low performance calculation
|
|
188
|
+
if (leafCountOnly && leftMaxCount) {
|
|
189
|
+
return getDisabledWithCache(node);
|
|
190
|
+
}
|
|
191
|
+
return false;
|
|
192
|
+
});
|
|
193
|
+
|
|
194
|
+
// ========================== Get First Selectable Node ==========================
|
|
195
|
+
const getFirstMatchingNode = nodes => {
|
|
196
|
+
for (const node of nodes) {
|
|
197
|
+
if (node.disabled || node.selectable === false) {
|
|
198
|
+
continue;
|
|
199
|
+
}
|
|
200
|
+
if (searchValue) {
|
|
201
|
+
if (filterTreeNode(node)) {
|
|
202
|
+
return node;
|
|
203
|
+
}
|
|
204
|
+
} else {
|
|
205
|
+
return node;
|
|
206
|
+
}
|
|
207
|
+
if (node[fieldNames.children]) {
|
|
208
|
+
const matchInChildren = getFirstMatchingNode(node[fieldNames.children]);
|
|
209
|
+
if (matchInChildren) {
|
|
210
|
+
return matchInChildren;
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
return null;
|
|
215
|
+
};
|
|
216
|
+
|
|
217
|
+
// ========================== Active ==========================
|
|
218
|
+
const [activeKey, setActiveKey] = React.useState(null);
|
|
219
|
+
const activeEntity = keyEntities[activeKey];
|
|
220
|
+
React.useEffect(() => {
|
|
221
|
+
if (!open) {
|
|
222
|
+
return;
|
|
223
|
+
}
|
|
224
|
+
let nextActiveKey = null;
|
|
225
|
+
const getFirstNode = () => {
|
|
226
|
+
const firstNode = getFirstMatchingNode(memoTreeData);
|
|
227
|
+
return firstNode ? firstNode[fieldNames.value] : null;
|
|
228
|
+
};
|
|
229
|
+
|
|
230
|
+
// single mode active first checked node
|
|
231
|
+
if (!multiple && checkedKeys.length && !searchValue) {
|
|
232
|
+
nextActiveKey = checkedKeys[0];
|
|
233
|
+
} else {
|
|
234
|
+
nextActiveKey = getFirstNode();
|
|
235
|
+
}
|
|
236
|
+
setActiveKey(nextActiveKey);
|
|
237
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
238
|
+
}, [open, searchValue]);
|
|
239
|
+
|
|
240
|
+
// ========================= Keyboard =========================
|
|
241
|
+
React.useImperativeHandle(ref, () => ({
|
|
242
|
+
scrollTo: treeRef.current?.scrollTo,
|
|
243
|
+
onKeyDown: event => {
|
|
244
|
+
const {
|
|
245
|
+
which
|
|
246
|
+
} = event;
|
|
247
|
+
switch (which) {
|
|
248
|
+
// >>> Arrow keys
|
|
249
|
+
case _KeyCode.default.UP:
|
|
250
|
+
case _KeyCode.default.DOWN:
|
|
251
|
+
case _KeyCode.default.LEFT:
|
|
252
|
+
case _KeyCode.default.RIGHT:
|
|
253
|
+
treeRef.current?.onKeyDown(event);
|
|
254
|
+
break;
|
|
255
|
+
|
|
256
|
+
// >>> Select item
|
|
257
|
+
case _KeyCode.default.ENTER:
|
|
258
|
+
{
|
|
259
|
+
if (activeEntity) {
|
|
260
|
+
const isNodeDisabled = nodeDisabled(activeEntity.node);
|
|
261
|
+
const {
|
|
262
|
+
selectable,
|
|
263
|
+
value,
|
|
264
|
+
disabled
|
|
265
|
+
} = activeEntity?.node || {};
|
|
266
|
+
if (selectable !== false && !disabled && !isNodeDisabled) {
|
|
267
|
+
onInternalSelect(null, {
|
|
268
|
+
node: {
|
|
269
|
+
key: activeKey
|
|
270
|
+
},
|
|
271
|
+
selected: !checkedKeys.includes(value)
|
|
272
|
+
});
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
break;
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
// >>> Close
|
|
279
|
+
case _KeyCode.default.ESC:
|
|
280
|
+
{
|
|
281
|
+
toggleOpen(false);
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
},
|
|
285
|
+
onKeyUp: () => {}
|
|
286
|
+
}));
|
|
287
|
+
const hasLoadDataFn = (0, _useMemo.default)(() => searchValue ? false : true,
|
|
288
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
289
|
+
[searchValue, treeExpandedKeys || expandedKeys], ([preSearchValue], [nextSearchValue, nextExcludeSearchExpandedKeys]) => preSearchValue !== nextSearchValue && !!(nextSearchValue || nextExcludeSearchExpandedKeys));
|
|
290
|
+
const syncLoadData = hasLoadDataFn ? loadData : null;
|
|
291
|
+
|
|
292
|
+
// ========================== Render ==========================
|
|
293
|
+
if (memoTreeData.length === 0) {
|
|
294
|
+
return /*#__PURE__*/React.createElement("div", {
|
|
295
|
+
role: "listbox",
|
|
296
|
+
className: `${prefixCls}-empty`,
|
|
297
|
+
onMouseDown: onListMouseDown
|
|
298
|
+
}, notFoundContent);
|
|
299
|
+
}
|
|
300
|
+
const treeProps = {
|
|
301
|
+
fieldNames
|
|
302
|
+
};
|
|
303
|
+
if (treeLoadedKeys) {
|
|
304
|
+
treeProps.loadedKeys = treeLoadedKeys;
|
|
305
|
+
}
|
|
306
|
+
if (mergedExpandedKeys) {
|
|
307
|
+
treeProps.expandedKeys = mergedExpandedKeys;
|
|
308
|
+
}
|
|
309
|
+
return /*#__PURE__*/React.createElement("div", {
|
|
310
|
+
onMouseDown: onListMouseDown
|
|
311
|
+
}, activeEntity && open && /*#__PURE__*/React.createElement("span", {
|
|
312
|
+
style: HIDDEN_STYLE,
|
|
313
|
+
"aria-live": "assertive"
|
|
314
|
+
}, activeEntity.node.value), /*#__PURE__*/React.createElement(_rcTree.UnstableContext.Provider, {
|
|
315
|
+
value: {
|
|
316
|
+
nodeDisabled
|
|
317
|
+
}
|
|
318
|
+
}, /*#__PURE__*/React.createElement(_rcTree.default, _extends({
|
|
319
|
+
ref: treeRef,
|
|
320
|
+
focusable: false,
|
|
321
|
+
prefixCls: `${prefixCls}-tree`,
|
|
322
|
+
treeData: memoTreeData,
|
|
323
|
+
height: listHeight,
|
|
324
|
+
itemHeight: listItemHeight,
|
|
325
|
+
itemScrollOffset: listItemScrollOffset,
|
|
326
|
+
virtual: virtual !== false && popupMatchSelectWidth !== false,
|
|
327
|
+
multiple: multiple,
|
|
328
|
+
icon: treeIcon,
|
|
329
|
+
showIcon: showTreeIcon,
|
|
330
|
+
switcherIcon: switcherIcon,
|
|
331
|
+
showLine: treeLine,
|
|
332
|
+
loadData: syncLoadData,
|
|
333
|
+
motion: treeMotion,
|
|
334
|
+
activeKey: activeKey
|
|
335
|
+
// We handle keys by out instead tree self
|
|
336
|
+
,
|
|
337
|
+
checkable: checkable,
|
|
338
|
+
checkStrictly: true,
|
|
339
|
+
checkedKeys: mergedCheckedKeys,
|
|
340
|
+
selectedKeys: !checkable ? checkedKeys : [],
|
|
341
|
+
defaultExpandAll: treeDefaultExpandAll,
|
|
342
|
+
titleRender: treeTitleRender
|
|
343
|
+
}, treeProps, {
|
|
344
|
+
// Proxy event out
|
|
345
|
+
onActiveChange: setActiveKey,
|
|
346
|
+
onSelect: onInternalSelect,
|
|
347
|
+
onCheck: onInternalSelect,
|
|
348
|
+
onExpand: onInternalExpand,
|
|
349
|
+
onLoad: onTreeLoad,
|
|
350
|
+
filterTreeNode: filterTreeNode,
|
|
351
|
+
expandAction: treeExpandAction,
|
|
352
|
+
onScroll: onPopupScroll
|
|
353
|
+
}))));
|
|
354
|
+
};
|
|
355
|
+
const RefOptionList = /*#__PURE__*/React.forwardRef(OptionList);
|
|
356
|
+
if (process.env.NODE_ENV !== 'production') {
|
|
357
|
+
RefOptionList.displayName = 'OptionList';
|
|
358
|
+
}
|
|
359
|
+
var _default = exports.default = RefOptionList;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type * as React from 'react';
|
|
2
|
+
import type { DataNode, Key } from './interface';
|
|
3
|
+
export interface TreeNodeProps extends Omit<DataNode, 'children'> {
|
|
4
|
+
value: Key;
|
|
5
|
+
children?: React.ReactNode;
|
|
6
|
+
}
|
|
7
|
+
/** This is a placeholder, not real render in dom */
|
|
8
|
+
declare const TreeNode: React.FC<TreeNodeProps>;
|
|
9
|
+
export default TreeNode;
|
package/lib/TreeNode.js
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = void 0;
|
|
7
|
+
/* istanbul ignore file */
|
|
8
|
+
|
|
9
|
+
/** This is a placeholder, not real render in dom */
|
|
10
|
+
const TreeNode = () => null;
|
|
11
|
+
var _default = exports.default = TreeNode;
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import type { BaseSelectPropsWithoutPrivate, BaseSelectRef } from '@rc-component/select';
|
|
2
|
+
import type { IconType } from 'rc-tree/lib/interface';
|
|
3
|
+
import type { ExpandAction } from 'rc-tree/lib/Tree';
|
|
4
|
+
import * as React from 'react';
|
|
5
|
+
import TreeNode from './TreeNode';
|
|
6
|
+
import type { CheckedStrategy } from './utils/strategyUtil';
|
|
7
|
+
import { SHOW_ALL, SHOW_CHILD, SHOW_PARENT } from './utils/strategyUtil';
|
|
8
|
+
import type { SafeKey, DataNode, SimpleModeConfig, ChangeEventExtra, FieldNames, LegacyDataNode } from './interface';
|
|
9
|
+
export interface TreeSelectProps<ValueType = any, OptionType extends DataNode = DataNode> extends Omit<BaseSelectPropsWithoutPrivate, 'mode'> {
|
|
10
|
+
prefixCls?: string;
|
|
11
|
+
id?: string;
|
|
12
|
+
children?: React.ReactNode;
|
|
13
|
+
value?: ValueType;
|
|
14
|
+
defaultValue?: ValueType;
|
|
15
|
+
onChange?: (value: ValueType, labelList: React.ReactNode[], extra: ChangeEventExtra) => void;
|
|
16
|
+
searchValue?: string;
|
|
17
|
+
/** @deprecated Use `searchValue` instead */
|
|
18
|
+
inputValue?: string;
|
|
19
|
+
onSearch?: (value: string) => void;
|
|
20
|
+
autoClearSearchValue?: boolean;
|
|
21
|
+
filterTreeNode?: boolean | ((inputValue: string, treeNode: DataNode) => boolean);
|
|
22
|
+
treeNodeFilterProp?: string;
|
|
23
|
+
onSelect?: (value: ValueType, option: OptionType) => void;
|
|
24
|
+
onDeselect?: (value: ValueType, option: OptionType) => void;
|
|
25
|
+
showCheckedStrategy?: CheckedStrategy;
|
|
26
|
+
treeNodeLabelProp?: string;
|
|
27
|
+
fieldNames?: FieldNames;
|
|
28
|
+
multiple?: boolean;
|
|
29
|
+
treeCheckable?: boolean | React.ReactNode;
|
|
30
|
+
treeCheckStrictly?: boolean;
|
|
31
|
+
labelInValue?: boolean;
|
|
32
|
+
maxCount?: number;
|
|
33
|
+
treeData?: OptionType[];
|
|
34
|
+
treeDataSimpleMode?: boolean | SimpleModeConfig;
|
|
35
|
+
loadData?: (dataNode: LegacyDataNode) => Promise<unknown>;
|
|
36
|
+
treeLoadedKeys?: SafeKey[];
|
|
37
|
+
onTreeLoad?: (loadedKeys: SafeKey[]) => void;
|
|
38
|
+
treeDefaultExpandAll?: boolean;
|
|
39
|
+
treeExpandedKeys?: SafeKey[];
|
|
40
|
+
treeDefaultExpandedKeys?: SafeKey[];
|
|
41
|
+
onTreeExpand?: (expandedKeys: SafeKey[]) => void;
|
|
42
|
+
treeExpandAction?: ExpandAction;
|
|
43
|
+
virtual?: boolean;
|
|
44
|
+
listHeight?: number;
|
|
45
|
+
listItemHeight?: number;
|
|
46
|
+
listItemScrollOffset?: number;
|
|
47
|
+
onPopupVisibleChange?: (open: boolean) => void;
|
|
48
|
+
treeTitleRender?: (node: OptionType) => React.ReactNode;
|
|
49
|
+
treeLine?: boolean;
|
|
50
|
+
treeIcon?: IconType;
|
|
51
|
+
showTreeIcon?: boolean;
|
|
52
|
+
switcherIcon?: IconType;
|
|
53
|
+
treeMotion?: any;
|
|
54
|
+
}
|
|
55
|
+
declare const GenericTreeSelect: (<ValueType = any, OptionType extends DataNode = DataNode>(props: TreeSelectProps<ValueType, OptionType> & {
|
|
56
|
+
children?: React.ReactNode;
|
|
57
|
+
} & {
|
|
58
|
+
ref?: React.Ref<BaseSelectRef>;
|
|
59
|
+
}) => React.ReactElement) & {
|
|
60
|
+
TreeNode: typeof TreeNode;
|
|
61
|
+
SHOW_ALL: typeof SHOW_ALL;
|
|
62
|
+
SHOW_PARENT: typeof SHOW_PARENT;
|
|
63
|
+
SHOW_CHILD: typeof SHOW_CHILD;
|
|
64
|
+
};
|
|
65
|
+
export default GenericTreeSelect;
|