@rainbow-oh/yee-c 0.6.4 → 0.8.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/dist/cjs/Button/style/index.less +5 -4
- package/dist/cjs/Drawer/drawer.js +1 -1
- package/dist/cjs/Drawer/interface.d.ts +1 -1
- package/dist/cjs/Drawer/style/index.less +1 -0
- package/dist/cjs/Form/form-store.d.ts +2 -1
- package/dist/cjs/Form/form-store.js +32 -17
- package/dist/cjs/List/demo/virtual.d.ts +3 -0
- package/dist/cjs/List/demo/virtual.js +53 -0
- package/dist/cjs/List/hooks/useListKeyboard.d.ts +28 -0
- package/dist/cjs/List/hooks/useListKeyboard.js +188 -0
- package/dist/cjs/List/interface.d.ts +29 -2
- package/dist/cjs/List/list.js +141 -21
- package/dist/cjs/List/style/index.less +24 -0
- package/dist/cjs/Select/demo/columns.d.ts +3 -0
- package/dist/cjs/Select/demo/columns.js +62 -0
- package/dist/cjs/Select/hooks/useSelectKeyboard.d.ts +13 -1
- package/dist/cjs/Select/hooks/useSelectKeyboard.js +81 -10
- package/dist/cjs/Select/interface.d.ts +30 -3
- package/dist/cjs/Select/option.js +4 -3
- package/dist/cjs/Select/options.js +90 -8
- package/dist/cjs/Select/select.js +32 -8
- package/dist/cjs/Select/style/index.less +14 -0
- package/dist/cjs/Selector/interface.d.ts +4 -0
- package/dist/cjs/Selector/selector.js +5 -3
- package/dist/cjs/Table/hooks/useColumns.js +1 -1
- package/dist/cjs/Table/interface.d.ts +1 -1
- package/dist/cjs/Table/style/index.less +35 -11
- package/dist/cjs/Table/table.js +57 -7
- package/dist/cjs/Table/tbody/cell.js +1 -1
- package/dist/cjs/Table/util/header.d.ts +3 -1
- package/dist/cjs/Table/util/header.js +30 -3
- package/dist/cjs/Tree/demo/draggable.js +2 -0
- package/dist/cjs/Tree/interface.d.ts +46 -23
- package/dist/cjs/Tree/tree-node.d.ts +1 -1
- package/dist/cjs/Tree/tree-node.js +30 -23
- package/dist/cjs/Tree/tree.d.ts +13 -12
- package/dist/cjs/Tree/tree.js +452 -227
- package/dist/cjs/Tree/utils/tree-tools.d.ts +43 -10
- package/dist/cjs/Tree/utils/tree-tools.js +129 -91
- package/dist/cjs/locale/context.d.ts +5 -4
- package/dist/cjs/locale/context.js +15 -8
- package/dist/cjs/locale/interface.d.ts +20 -0
- package/dist/cjs/locale/util.d.ts +3 -3
- package/dist/cjs/style/color.css +3 -0
- package/dist/cjs/style/size.css +2 -1
- package/dist/cjs/style/themes.css +1 -1
- package/dist/cjs/style/variables.css +6 -2
- package/dist/cjs/utils/isEqual.js +5 -7
- package/dist/cjs/version.d.ts +1 -1
- package/dist/cjs/version.js +1 -1
- package/dist/esm/Button/style/index.less +5 -4
- package/dist/esm/Drawer/drawer.js +2 -1
- package/dist/esm/Drawer/interface.d.ts +1 -1
- package/dist/esm/Drawer/style/index.less +1 -0
- package/dist/esm/Form/form-store.d.ts +2 -1
- package/dist/esm/Form/form-store.js +40 -19
- package/dist/esm/List/demo/virtual.d.ts +3 -0
- package/dist/esm/List/demo/virtual.js +22 -0
- package/dist/esm/List/hooks/useListKeyboard.d.ts +28 -0
- package/dist/esm/List/hooks/useListKeyboard.js +173 -0
- package/dist/esm/List/interface.d.ts +29 -2
- package/dist/esm/List/list.js +171 -14
- package/dist/esm/List/style/index.less +24 -0
- package/dist/esm/Select/demo/columns.d.ts +3 -0
- package/dist/esm/Select/demo/columns.js +36 -0
- package/dist/esm/Select/hooks/useSelectKeyboard.d.ts +13 -1
- package/dist/esm/Select/hooks/useSelectKeyboard.js +91 -14
- package/dist/esm/Select/interface.d.ts +30 -3
- package/dist/esm/Select/option.js +6 -2
- package/dist/esm/Select/options.js +114 -32
- package/dist/esm/Select/select.js +40 -11
- package/dist/esm/Select/style/index.less +14 -0
- package/dist/esm/Selector/interface.d.ts +4 -0
- package/dist/esm/Selector/selector.js +10 -4
- package/dist/esm/Table/hooks/useColumns.js +1 -1
- package/dist/esm/Table/interface.d.ts +1 -1
- package/dist/esm/Table/style/index.less +35 -11
- package/dist/esm/Table/table.js +54 -2
- package/dist/esm/Table/tbody/cell.js +1 -1
- package/dist/esm/Table/util/header.d.ts +3 -1
- package/dist/esm/Table/util/header.js +30 -2
- package/dist/esm/Tree/demo/draggable.js +2 -0
- package/dist/esm/Tree/interface.d.ts +46 -23
- package/dist/esm/Tree/tree-node.d.ts +1 -1
- package/dist/esm/Tree/tree-node.js +26 -31
- package/dist/esm/Tree/tree.d.ts +13 -12
- package/dist/esm/Tree/tree.js +572 -163
- package/dist/esm/Tree/utils/tree-tools.d.ts +43 -10
- package/dist/esm/Tree/utils/tree-tools.js +219 -104
- package/dist/esm/locale/context.d.ts +5 -4
- package/dist/esm/locale/context.js +25 -9
- package/dist/esm/locale/interface.d.ts +20 -0
- package/dist/esm/locale/util.d.ts +3 -3
- package/dist/esm/style/color.css +3 -0
- package/dist/esm/style/size.css +2 -1
- package/dist/esm/style/themes.css +1 -1
- package/dist/esm/style/variables.css +6 -2
- package/dist/esm/utils/isEqual.js +5 -7
- package/dist/esm/version.d.ts +1 -1
- package/dist/esm/version.js +1 -1
- package/dist/umd/yee-c.min.css +4 -4
- package/dist/umd/yee-c.min.js +1 -1
- package/package.json +1 -1
- package/src/Button/style/index.less +5 -4
- package/src/Drawer/drawer.tsx +1 -1
- package/src/Drawer/interface.ts +1 -0
- package/src/Drawer/style/index.less +1 -0
- package/src/Form/form-store.ts +42 -15
- package/src/List/demo/virtual.tsx +20 -0
- package/src/List/hooks/useListKeyboard.ts +235 -0
- package/src/List/index.en-US.md +6 -0
- package/src/List/index.zh-CN.md +6 -0
- package/src/List/interface.ts +29 -2
- package/src/List/list.tsx +157 -19
- package/src/List/style/index.less +24 -0
- package/src/Select/demo/columns.tsx +35 -0
- package/src/Select/hooks/useSelectKeyboard.ts +112 -15
- package/src/Select/index.en-US.md +4 -0
- package/src/Select/index.zh-CN.md +4 -0
- package/src/Select/interface.ts +31 -4
- package/src/Select/option.tsx +9 -3
- package/src/Select/options.tsx +119 -26
- package/src/Select/select.tsx +41 -8
- package/src/Select/style/index.less +14 -0
- package/src/Selector/interface.ts +4 -0
- package/src/Selector/selector.tsx +8 -3
- package/src/Table/hooks/useColumns.ts +1 -1
- package/src/Table/interface.ts +1 -1
- package/src/Table/style/index.less +35 -11
- package/src/Table/table.tsx +60 -1
- package/src/Table/tbody/cell.tsx +1 -1
- package/src/Table/util/header.ts +48 -2
- package/src/Tree/demo/draggable.tsx +2 -0
- package/src/Tree/interface.ts +46 -23
- package/src/Tree/tree-node.tsx +26 -29
- package/src/Tree/tree.tsx +573 -274
- package/src/Tree/utils/tree-tools.ts +231 -125
- package/src/locale/_README.md +22 -13
- package/src/locale/context.tsx +33 -16
- package/src/locale/interface.ts +24 -0
- package/src/locale/util.ts +6 -6
- package/src/style/color.css +3 -0
- package/src/style/size.css +2 -1
- package/src/utils/isEqual.ts +5 -7
- package/src/version.ts +1 -1
package/dist/esm/Tree/tree.js
CHANGED
|
@@ -1,19 +1,29 @@
|
|
|
1
|
+
function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
|
|
2
|
+
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
|
|
3
|
+
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
|
|
4
|
+
function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
|
5
|
+
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : String(i); }
|
|
6
|
+
function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
|
|
1
7
|
function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); }
|
|
2
8
|
function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
|
|
3
9
|
function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); }
|
|
4
10
|
function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); }
|
|
5
11
|
function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
|
|
6
12
|
function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
|
|
7
|
-
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
|
|
8
|
-
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }
|
|
9
13
|
function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t.return && (u = t.return(), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }
|
|
10
14
|
function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
|
|
15
|
+
function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function (_e) { function e(_x) { return _e.apply(this, arguments); } e.toString = function () { return _e.toString(); }; return e; }(function (e) { throw e; }), f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function (_e2) { function e(_x2) { return _e2.apply(this, arguments); } e.toString = function () { return _e2.toString(); }; return e; }(function (e) { didErr = true; err = e; }), f: function f() { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; }
|
|
16
|
+
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
|
|
17
|
+
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }
|
|
11
18
|
import clsx from 'clsx';
|
|
12
|
-
import React, { createContext,
|
|
19
|
+
import React, { createContext, useContext, useMemo, useRef, useState } from 'react';
|
|
20
|
+
import { AnimatePresence, motion } from 'motion/react';
|
|
13
21
|
import { GlobalContext } from "../Config-Provider";
|
|
22
|
+
import useEvent from "../hooks/useEvent";
|
|
14
23
|
import useMergedState from "../hooks/useMergedState";
|
|
24
|
+
import useVirtualList from "../hooks/useVirtualList";
|
|
15
25
|
import mergeContextToProps from "../utils/mergeContextToProps";
|
|
16
|
-
import
|
|
26
|
+
import TreeNodeComp from "./tree-node";
|
|
17
27
|
import { getCheckedKeys, tree2array } from "./utils/tree-tools";
|
|
18
28
|
import "./style/index.less";
|
|
19
29
|
var DEFAULTFIELDNAMES = {
|
|
@@ -23,11 +33,12 @@ var DEFAULTFIELDNAMES = {
|
|
|
23
33
|
};
|
|
24
34
|
export var TreeContext = /*#__PURE__*/createContext({
|
|
25
35
|
showIcon: true,
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
36
|
+
selectedUids: new Set(),
|
|
37
|
+
checkedUids: new Set(),
|
|
38
|
+
indeterminateUids: new Set(),
|
|
39
|
+
expandedUids: new Set(),
|
|
29
40
|
draggable: false,
|
|
30
|
-
|
|
41
|
+
draggingUid: null,
|
|
31
42
|
dropState: null,
|
|
32
43
|
onCheck: function onCheck() {},
|
|
33
44
|
onSelect: function onSelect() {},
|
|
@@ -37,10 +48,133 @@ export var TreeContext = /*#__PURE__*/createContext({
|
|
|
37
48
|
onNodeDragLeave: function onNodeDragLeave() {},
|
|
38
49
|
onNodeDrop: function onNodeDrop() {}
|
|
39
50
|
});
|
|
51
|
+
|
|
52
|
+
// ---------------------------------------------------------------------------
|
|
53
|
+
// Helpers: convert between external user keys and internal uids
|
|
54
|
+
// ---------------------------------------------------------------------------
|
|
55
|
+
|
|
56
|
+
var EMPTY_ARRAY = [];
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* Given a list of user-provided keys, find matching uids.
|
|
60
|
+
* A key may match multiple nodes (non-unique keys), so we return all matches.
|
|
61
|
+
* Returns an array of uid strings (for use with useMergedState).
|
|
62
|
+
*/
|
|
63
|
+
function keysToUidArray(keys, flatItems) {
|
|
64
|
+
if (!keys) return undefined;
|
|
65
|
+
if (keys.length === 0) return EMPTY_ARRAY;
|
|
66
|
+
var keySet = new Set(keys.map(String));
|
|
67
|
+
var uids = [];
|
|
68
|
+
var _iterator = _createForOfIteratorHelper(flatItems),
|
|
69
|
+
_step;
|
|
70
|
+
try {
|
|
71
|
+
for (_iterator.s(); !(_step = _iterator.n()).done;) {
|
|
72
|
+
var item = _step.value;
|
|
73
|
+
if (keySet.has(String(item.key))) {
|
|
74
|
+
uids.push(item.uid);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
} catch (err) {
|
|
78
|
+
_iterator.e(err);
|
|
79
|
+
} finally {
|
|
80
|
+
_iterator.f();
|
|
81
|
+
}
|
|
82
|
+
return uids;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* Hook that memoizes a uid array derived from external keys.
|
|
87
|
+
* Only returns a new reference when the actual uid content changes.
|
|
88
|
+
* This prevents useMergedState from seeing a "new value" every render.
|
|
89
|
+
*/
|
|
90
|
+
function useStableUidArray(keys, flatItems) {
|
|
91
|
+
var ref = useRef({
|
|
92
|
+
keys: undefined,
|
|
93
|
+
result: undefined
|
|
94
|
+
});
|
|
95
|
+
|
|
96
|
+
// Only recompute if external keys reference or flatItems changed
|
|
97
|
+
var computed = useMemo(function () {
|
|
98
|
+
return keysToUidArray(keys, flatItems);
|
|
99
|
+
}, [keys, flatItems]);
|
|
100
|
+
|
|
101
|
+
// Stable reference: reuse previous if content is identical
|
|
102
|
+
if (computed === undefined) {
|
|
103
|
+
ref.current = {
|
|
104
|
+
keys: keys,
|
|
105
|
+
result: undefined
|
|
106
|
+
};
|
|
107
|
+
return undefined;
|
|
108
|
+
}
|
|
109
|
+
var prev = ref.current.result;
|
|
110
|
+
if (prev && prev.length === computed.length && prev.every(function (v, i) {
|
|
111
|
+
return v === computed[i];
|
|
112
|
+
})) {
|
|
113
|
+
return prev;
|
|
114
|
+
}
|
|
115
|
+
ref.current = {
|
|
116
|
+
keys: keys,
|
|
117
|
+
result: computed
|
|
118
|
+
};
|
|
119
|
+
return computed;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
/**
|
|
123
|
+
* Convert an array of uids to user keys (for external callbacks).
|
|
124
|
+
*/
|
|
125
|
+
function uidsToKeys(uids, map) {
|
|
126
|
+
var keys = [];
|
|
127
|
+
var _iterator2 = _createForOfIteratorHelper(uids),
|
|
128
|
+
_step2;
|
|
129
|
+
try {
|
|
130
|
+
for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
|
|
131
|
+
var _uid = _step2.value;
|
|
132
|
+
var node = map.get(_uid);
|
|
133
|
+
if (node) keys.push(node.key);
|
|
134
|
+
}
|
|
135
|
+
} catch (err) {
|
|
136
|
+
_iterator2.e(err);
|
|
137
|
+
} finally {
|
|
138
|
+
_iterator2.f();
|
|
139
|
+
}
|
|
140
|
+
return keys;
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
/** Build a Set from an array (avoids downlevelIteration issues with Set constructor). */
|
|
144
|
+
function arrayToSet(arr) {
|
|
145
|
+
var s = new Set();
|
|
146
|
+
var _iterator3 = _createForOfIteratorHelper(arr),
|
|
147
|
+
_step3;
|
|
148
|
+
try {
|
|
149
|
+
for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {
|
|
150
|
+
var item = _step3.value;
|
|
151
|
+
s.add(item);
|
|
152
|
+
}
|
|
153
|
+
} catch (err) {
|
|
154
|
+
_iterator3.e(err);
|
|
155
|
+
} finally {
|
|
156
|
+
_iterator3.f();
|
|
157
|
+
}
|
|
158
|
+
return s;
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
/** Convert a Set to an array (avoids spread/iteration issues). */
|
|
162
|
+
function setToArray(s) {
|
|
163
|
+
var arr = [];
|
|
164
|
+
s.forEach(function (v) {
|
|
165
|
+
return arr.push(v);
|
|
166
|
+
});
|
|
167
|
+
return arr;
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
// ---------------------------------------------------------------------------
|
|
171
|
+
// Tree Component
|
|
172
|
+
// ---------------------------------------------------------------------------
|
|
173
|
+
|
|
40
174
|
var Tree = function Tree(baseprops) {
|
|
41
175
|
var _useContext = useContext(GlobalContext),
|
|
42
176
|
tree = _useContext.tree;
|
|
43
|
-
// @ts-expect-error - tree context type may not match TreeProps<T> exactly
|
|
177
|
+
// @ts-expect-error - tree context type may not match TreeProps<T> exactly
|
|
44
178
|
var props = mergeContextToProps(baseprops, tree);
|
|
45
179
|
var _props$prefixCls = props.prefixCls,
|
|
46
180
|
prefixCls = _props$prefixCls === void 0 ? 'yee-tree' : _props$prefixCls,
|
|
@@ -70,191 +204,320 @@ var Tree = function Tree(baseprops) {
|
|
|
70
204
|
onDrop = props.onDrop,
|
|
71
205
|
onSelect = props.onSelect,
|
|
72
206
|
onCheck = props.onCheck,
|
|
73
|
-
onExpand = props.onExpand
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
var _useMergedState3 = useMergedState([], {
|
|
82
|
-
value: checkedKeys,
|
|
83
|
-
defaultValue: defaultCheckedKeys
|
|
84
|
-
}),
|
|
85
|
-
_useMergedState4 = _slicedToArray(_useMergedState3, 2),
|
|
86
|
-
mergedCheckedKeys = _useMergedState4[0],
|
|
87
|
-
setMergedCheckedKeys = _useMergedState4[1];
|
|
207
|
+
onExpand = props.onExpand,
|
|
208
|
+
_props$virtual = props.virtual,
|
|
209
|
+
virtual = _props$virtual === void 0 ? false : _props$virtual,
|
|
210
|
+
height = props.height,
|
|
211
|
+
_props$itemHeight = props.itemHeight,
|
|
212
|
+
itemHeight = _props$itemHeight === void 0 ? 28 : _props$itemHeight;
|
|
213
|
+
|
|
214
|
+
// ======================== Data ========================
|
|
88
215
|
var _useMemo = useMemo(function () {
|
|
89
216
|
return tree2array(dataSource !== null && dataSource !== void 0 ? dataSource : [], fieldNames);
|
|
90
217
|
}, [dataSource, fieldNames]),
|
|
91
218
|
_useMemo2 = _slicedToArray(_useMemo, 2),
|
|
92
219
|
flatItems = _useMemo2[0],
|
|
93
220
|
itemMap = _useMemo2[1];
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
221
|
+
|
|
222
|
+
// All parent uids (for defaultExpandAll)
|
|
223
|
+
var allParentUidArray = useMemo(function () {
|
|
224
|
+
var uids = [];
|
|
225
|
+
var _iterator4 = _createForOfIteratorHelper(flatItems),
|
|
226
|
+
_step4;
|
|
227
|
+
try {
|
|
228
|
+
for (_iterator4.s(); !(_step4 = _iterator4.n()).done;) {
|
|
229
|
+
var item = _step4.value;
|
|
230
|
+
if (!item.isLeaf) uids.push(item.uid);
|
|
99
231
|
}
|
|
100
|
-
})
|
|
101
|
-
|
|
232
|
+
} catch (err) {
|
|
233
|
+
_iterator4.e(err);
|
|
234
|
+
} finally {
|
|
235
|
+
_iterator4.f();
|
|
236
|
+
}
|
|
237
|
+
return uids;
|
|
102
238
|
}, [flatItems]);
|
|
103
|
-
|
|
104
|
-
|
|
239
|
+
|
|
240
|
+
// ==================== State (array-based for useMergedState compatibility) ====================
|
|
241
|
+
// useMergedState works with arrays (serializable, isEqual-friendly).
|
|
242
|
+
// We derive Sets via useMemo for O(1) lookups in render/handlers.
|
|
243
|
+
// useStableUidArray ensures stable references to prevent infinite re-render loops.
|
|
244
|
+
|
|
245
|
+
var stableExpandedValue = useStableUidArray(expandedKeys, flatItems);
|
|
246
|
+
var stableExpandedDefault = useStableUidArray(defaultExpandedKeys, flatItems);
|
|
247
|
+
var stableSelectedValue = useStableUidArray(selectedKeys, flatItems);
|
|
248
|
+
var stableSelectedDefault = useStableUidArray(defaultSelectedKeys, flatItems);
|
|
249
|
+
var stableCheckedValue = useStableUidArray(checkedKeys, flatItems);
|
|
250
|
+
var stableCheckedDefault = useStableUidArray(defaultCheckedKeys, flatItems);
|
|
251
|
+
|
|
252
|
+
// --- Expanded ---
|
|
253
|
+
var _useMergedState = useMergedState(function () {
|
|
254
|
+
return defaultExpandAll ? allParentUidArray : [];
|
|
105
255
|
}, {
|
|
106
|
-
value:
|
|
107
|
-
defaultValue:
|
|
256
|
+
value: stableExpandedValue,
|
|
257
|
+
defaultValue: stableExpandedDefault
|
|
258
|
+
}),
|
|
259
|
+
_useMergedState2 = _slicedToArray(_useMergedState, 2),
|
|
260
|
+
expandedUidArray = _useMergedState2[0],
|
|
261
|
+
setExpandedUidArray = _useMergedState2[1];
|
|
262
|
+
var expandedUidSet = useMemo(function () {
|
|
263
|
+
return arrayToSet(expandedUidArray);
|
|
264
|
+
}, [expandedUidArray]);
|
|
265
|
+
|
|
266
|
+
// --- Selected ---
|
|
267
|
+
var _useMergedState3 = useMergedState([], {
|
|
268
|
+
value: stableSelectedValue,
|
|
269
|
+
defaultValue: stableSelectedDefault
|
|
270
|
+
}),
|
|
271
|
+
_useMergedState4 = _slicedToArray(_useMergedState3, 2),
|
|
272
|
+
selectedUidArray = _useMergedState4[0],
|
|
273
|
+
setSelectedUidArray = _useMergedState4[1];
|
|
274
|
+
var selectedUidSet = useMemo(function () {
|
|
275
|
+
return arrayToSet(selectedUidArray);
|
|
276
|
+
}, [selectedUidArray]);
|
|
277
|
+
|
|
278
|
+
// --- Checked ---
|
|
279
|
+
var _useMergedState5 = useMergedState([], {
|
|
280
|
+
value: stableCheckedValue,
|
|
281
|
+
defaultValue: stableCheckedDefault
|
|
108
282
|
}),
|
|
109
283
|
_useMergedState6 = _slicedToArray(_useMergedState5, 2),
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
var
|
|
113
|
-
|
|
284
|
+
checkedUidArray = _useMergedState6[0],
|
|
285
|
+
setCheckedUidArray = _useMergedState6[1];
|
|
286
|
+
var checkedUidSet = useMemo(function () {
|
|
287
|
+
return arrayToSet(checkedUidArray);
|
|
288
|
+
}, [checkedUidArray]);
|
|
289
|
+
|
|
290
|
+
// --- Indeterminate (half-select) ---
|
|
291
|
+
// A non-leaf node is indeterminate if:
|
|
292
|
+
// - It is NOT itself checked
|
|
293
|
+
// - At least one of its descendants IS checked
|
|
294
|
+
var indeterminateUidSet = useMemo(function () {
|
|
295
|
+
var result = new Set();
|
|
296
|
+
var _iterator5 = _createForOfIteratorHelper(flatItems),
|
|
297
|
+
_step5;
|
|
298
|
+
try {
|
|
299
|
+
for (_iterator5.s(); !(_step5 = _iterator5.n()).done;) {
|
|
300
|
+
var item = _step5.value;
|
|
301
|
+
if (!item.isLeaf && !checkedUidSet.has(item.uid) && item.childUids && item.childUids.some(function (cuid) {
|
|
302
|
+
return checkedUidSet.has(cuid);
|
|
303
|
+
})) {
|
|
304
|
+
result.add(item.uid);
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
} catch (err) {
|
|
308
|
+
_iterator5.e(err);
|
|
309
|
+
} finally {
|
|
310
|
+
_iterator5.f();
|
|
311
|
+
}
|
|
312
|
+
return result;
|
|
313
|
+
}, [flatItems, checkedUidSet]);
|
|
314
|
+
|
|
315
|
+
// ==================== Visible Items ====================
|
|
316
|
+
// A node is visible if it's a root OR its parent is both visible and expanded.
|
|
317
|
+
// flatItems is in pre-order so we can compute in a single forward pass.
|
|
318
|
+
var visibleItems = useMemo(function () {
|
|
319
|
+
var visibleSet = new Set();
|
|
320
|
+
var result = [];
|
|
321
|
+
var _iterator6 = _createForOfIteratorHelper(flatItems),
|
|
322
|
+
_step6;
|
|
323
|
+
try {
|
|
324
|
+
for (_iterator6.s(); !(_step6 = _iterator6.n()).done;) {
|
|
325
|
+
var item = _step6.value;
|
|
326
|
+
if (item.depth === 0) {
|
|
327
|
+
visibleSet.add(item.uid);
|
|
328
|
+
result.push(item);
|
|
329
|
+
} else if (item.pUid && visibleSet.has(item.pUid) && expandedUidSet.has(item.pUid)) {
|
|
330
|
+
visibleSet.add(item.uid);
|
|
331
|
+
result.push(item);
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
} catch (err) {
|
|
335
|
+
_iterator6.e(err);
|
|
336
|
+
} finally {
|
|
337
|
+
_iterator6.f();
|
|
338
|
+
}
|
|
339
|
+
return result;
|
|
340
|
+
}, [flatItems, expandedUidSet]);
|
|
341
|
+
|
|
342
|
+
// ==================== Handlers ====================
|
|
343
|
+
// All handlers use useEvent for stable references — they always read
|
|
344
|
+
// the latest state via closure without being listed as deps.
|
|
345
|
+
|
|
346
|
+
var handleCheck = useEvent(function (event, uid) {
|
|
114
347
|
var checked = event.target.checked;
|
|
115
|
-
var treeNode = itemMap.get(
|
|
116
|
-
var
|
|
348
|
+
var treeNode = itemMap.get(uid);
|
|
349
|
+
var newUidSet = getCheckedKeys({
|
|
117
350
|
checked: checked,
|
|
118
|
-
keys:
|
|
119
|
-
|
|
351
|
+
keys: checkedUidSet,
|
|
352
|
+
uid: uid,
|
|
120
353
|
map: itemMap
|
|
121
354
|
});
|
|
122
|
-
var
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
355
|
+
var newUidArr = setToArray(newUidSet);
|
|
356
|
+
setCheckedUidArray(newUidArr);
|
|
357
|
+
if (treeNode && onCheck) {
|
|
358
|
+
var externalKeys = uidsToKeys(newUidArr, itemMap);
|
|
359
|
+
var nodes = [];
|
|
360
|
+
newUidSet.forEach(function (u) {
|
|
361
|
+
var _itemMap$get;
|
|
362
|
+
var n = (_itemMap$get = itemMap.get(u)) === null || _itemMap$get === void 0 ? void 0 : _itemMap$get.original;
|
|
363
|
+
if (n) nodes.push(n);
|
|
364
|
+
});
|
|
365
|
+
onCheck(externalKeys, {
|
|
132
366
|
checked: checked,
|
|
133
367
|
checkedNodes: nodes,
|
|
134
|
-
node:
|
|
368
|
+
node: treeNode.original
|
|
135
369
|
});
|
|
136
370
|
}
|
|
137
|
-
}
|
|
138
|
-
var handleSelect =
|
|
139
|
-
var selected =
|
|
140
|
-
var
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
}
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
371
|
+
});
|
|
372
|
+
var handleSelect = useEvent(function (uid) {
|
|
373
|
+
var selected = selectedUidSet.has(uid);
|
|
374
|
+
var newUidArr;
|
|
375
|
+
if (multiple) {
|
|
376
|
+
if (selected) {
|
|
377
|
+
newUidArr = selectedUidArray.filter(function (u) {
|
|
378
|
+
return u !== uid;
|
|
379
|
+
});
|
|
380
|
+
} else {
|
|
381
|
+
newUidArr = [].concat(_toConsumableArray(selectedUidArray), [uid]);
|
|
382
|
+
}
|
|
383
|
+
} else {
|
|
384
|
+
newUidArr = selected ? [] : [uid];
|
|
385
|
+
}
|
|
386
|
+
setSelectedUidArray(newUidArr);
|
|
387
|
+
var treeNode = itemMap.get(uid);
|
|
388
|
+
if (treeNode && onSelect) {
|
|
389
|
+
var externalKeys = uidsToKeys(newUidArr, itemMap);
|
|
390
|
+
var nodes = [];
|
|
391
|
+
var _iterator7 = _createForOfIteratorHelper(newUidArr),
|
|
392
|
+
_step7;
|
|
393
|
+
try {
|
|
394
|
+
for (_iterator7.s(); !(_step7 = _iterator7.n()).done;) {
|
|
395
|
+
var _itemMap$get2;
|
|
396
|
+
var u = _step7.value;
|
|
397
|
+
var n = (_itemMap$get2 = itemMap.get(u)) === null || _itemMap$get2 === void 0 ? void 0 : _itemMap$get2.original;
|
|
398
|
+
if (n) nodes.push(n);
|
|
399
|
+
}
|
|
400
|
+
} catch (err) {
|
|
401
|
+
_iterator7.e(err);
|
|
402
|
+
} finally {
|
|
403
|
+
_iterator7.f();
|
|
404
|
+
}
|
|
405
|
+
onSelect(externalKeys, {
|
|
154
406
|
selected: !selected,
|
|
155
407
|
selectedNodes: nodes,
|
|
156
|
-
node:
|
|
408
|
+
node: treeNode.original
|
|
157
409
|
});
|
|
158
410
|
}
|
|
159
|
-
}
|
|
160
|
-
var handleExpand =
|
|
161
|
-
var expanded =
|
|
162
|
-
var
|
|
163
|
-
return
|
|
164
|
-
})
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
var
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
411
|
+
});
|
|
412
|
+
var handleExpand = useEvent(function (uid) {
|
|
413
|
+
var expanded = expandedUidSet.has(uid);
|
|
414
|
+
var newUidArr = expanded ? expandedUidArray.filter(function (u) {
|
|
415
|
+
return u !== uid;
|
|
416
|
+
}) : [].concat(_toConsumableArray(expandedUidArray), [uid]);
|
|
417
|
+
setExpandedUidArray(newUidArr);
|
|
418
|
+
if (onExpand) {
|
|
419
|
+
var externalKeys = uidsToKeys(newUidArr, itemMap);
|
|
420
|
+
var treeNode = itemMap.get(uid);
|
|
421
|
+
var nodes = [];
|
|
422
|
+
var _iterator8 = _createForOfIteratorHelper(newUidArr),
|
|
423
|
+
_step8;
|
|
424
|
+
try {
|
|
425
|
+
for (_iterator8.s(); !(_step8 = _iterator8.n()).done;) {
|
|
426
|
+
var _itemMap$get3;
|
|
427
|
+
var u = _step8.value;
|
|
428
|
+
var n = (_itemMap$get3 = itemMap.get(u)) === null || _itemMap$get3 === void 0 ? void 0 : _itemMap$get3.original;
|
|
429
|
+
if (n) nodes.push(n);
|
|
430
|
+
}
|
|
431
|
+
} catch (err) {
|
|
432
|
+
_iterator8.e(err);
|
|
433
|
+
} finally {
|
|
434
|
+
_iterator8.f();
|
|
435
|
+
}
|
|
436
|
+
onExpand(externalKeys, {
|
|
437
|
+
expanded: !expanded,
|
|
438
|
+
expandedNodes: nodes,
|
|
439
|
+
node: treeNode.original
|
|
440
|
+
});
|
|
441
|
+
}
|
|
442
|
+
});
|
|
178
443
|
|
|
179
|
-
// ---
|
|
180
|
-
|
|
181
|
-
// lives in a ref as the source of truth; a state mirrors it for styling.
|
|
182
|
-
var dragKeyRef = useRef(null);
|
|
444
|
+
// --- Drag & Drop ---
|
|
445
|
+
var dragUidRef = useRef(null);
|
|
183
446
|
var _useState = useState(null),
|
|
184
447
|
_useState2 = _slicedToArray(_useState, 2),
|
|
185
|
-
|
|
186
|
-
|
|
448
|
+
draggingUid = _useState2[0],
|
|
449
|
+
setDraggingUid = _useState2[1];
|
|
187
450
|
var _useState3 = useState(null),
|
|
188
451
|
_useState4 = _slicedToArray(_useState3, 2),
|
|
189
452
|
dropState = _useState4[0],
|
|
190
453
|
setDropState = _useState4[1];
|
|
191
|
-
|
|
192
|
-
// A drop is a cycle/illegal if the target is the dragged node itself or one
|
|
193
|
-
// of its descendants. Covers before/after/inside uniformly.
|
|
194
|
-
var isIllegalMove = useCallback(function (dragKey, dropKey) {
|
|
195
|
-
if (dragKey === dropKey) return true;
|
|
196
|
-
var dropNode = itemMap.get(dropKey);
|
|
197
|
-
return !!dropNode && dropNode.path.includes(dragKey);
|
|
198
|
-
}, [itemMap]);
|
|
199
|
-
var resolvePosition = useCallback(function (rect, clientY) {
|
|
454
|
+
var resolvePosition = function resolvePosition(rect, clientY) {
|
|
200
455
|
var offset = (clientY - rect.top) / rect.height;
|
|
201
456
|
if (offset < 0.25) return 'before';
|
|
202
457
|
if (offset > 0.75) return 'after';
|
|
203
458
|
return 'inside';
|
|
204
|
-
}
|
|
205
|
-
var
|
|
206
|
-
|
|
459
|
+
};
|
|
460
|
+
var isIllegalMove = function isIllegalMove(dragUid, dropUid) {
|
|
461
|
+
if (dragUid === dropUid) return true;
|
|
462
|
+
var dropNode = itemMap.get(dropUid);
|
|
463
|
+
if (!dropNode) return true;
|
|
464
|
+
var current = dropNode;
|
|
465
|
+
while (current) {
|
|
466
|
+
if (current.pUid === dragUid) return true;
|
|
467
|
+
current = current.pUid ? itemMap.get(current.pUid) : undefined;
|
|
468
|
+
}
|
|
469
|
+
return false;
|
|
470
|
+
};
|
|
471
|
+
var handleDragStart = useEvent(function (uid, e) {
|
|
472
|
+
var node = itemMap.get(uid);
|
|
207
473
|
if (node !== null && node !== void 0 && node.disabled) {
|
|
208
474
|
e.preventDefault();
|
|
209
475
|
return;
|
|
210
476
|
}
|
|
211
|
-
|
|
212
|
-
|
|
477
|
+
dragUidRef.current = uid;
|
|
478
|
+
setDraggingUid(uid);
|
|
213
479
|
if (e.dataTransfer) {
|
|
214
480
|
e.dataTransfer.effectAllowed = 'move';
|
|
215
481
|
try {
|
|
216
|
-
e.dataTransfer.setData('text/plain',
|
|
482
|
+
e.dataTransfer.setData('text/plain', uid);
|
|
217
483
|
} catch (_unused) {
|
|
218
|
-
/* some browsers throw
|
|
484
|
+
/* some browsers throw */
|
|
219
485
|
}
|
|
220
486
|
}
|
|
221
|
-
}
|
|
222
|
-
var handleDragOver =
|
|
223
|
-
var
|
|
224
|
-
if (
|
|
225
|
-
if (isIllegalMove(
|
|
226
|
-
var dropNode = itemMap.get(
|
|
487
|
+
});
|
|
488
|
+
var handleDragOver = useEvent(function (uid, e) {
|
|
489
|
+
var dragUid = dragUidRef.current;
|
|
490
|
+
if (dragUid === null) return;
|
|
491
|
+
if (isIllegalMove(dragUid, uid)) return;
|
|
492
|
+
var dropNode = itemMap.get(uid);
|
|
227
493
|
if (!dropNode || dropNode.disabled) return;
|
|
228
494
|
var position = resolvePosition(e.currentTarget.getBoundingClientRect(), e.clientY);
|
|
229
|
-
var dragNode = itemMap.get(
|
|
495
|
+
var dragNode = itemMap.get(dragUid);
|
|
230
496
|
if (allowDrop && dragNode && allowDrop({
|
|
231
497
|
dragNode: dragNode.original,
|
|
232
498
|
dropNode: dropNode.original,
|
|
233
499
|
position: position
|
|
234
500
|
}) === false) {
|
|
235
|
-
return;
|
|
501
|
+
return;
|
|
236
502
|
}
|
|
237
503
|
e.preventDefault();
|
|
238
504
|
if (e.dataTransfer) e.dataTransfer.dropEffect = 'move';
|
|
239
505
|
setDropState(function (prev) {
|
|
240
|
-
return prev && prev.
|
|
241
|
-
|
|
506
|
+
return prev && prev.uid === uid && prev.position === position ? prev : {
|
|
507
|
+
uid: uid,
|
|
242
508
|
position: position
|
|
243
509
|
};
|
|
244
510
|
});
|
|
245
|
-
}
|
|
246
|
-
var handleDragLeave =
|
|
247
|
-
|
|
248
|
-
// elements. Drop state is cleared in handleDragEnd at the Tree root.
|
|
249
|
-
function () {}, []);
|
|
250
|
-
var handleDrop = useCallback(function (key, e) {
|
|
511
|
+
});
|
|
512
|
+
var handleDragLeave = useEvent(function () {});
|
|
513
|
+
var handleDrop = useEvent(function (uid, e) {
|
|
251
514
|
e.preventDefault();
|
|
252
|
-
var
|
|
253
|
-
if (
|
|
515
|
+
var dragUid = dragUidRef.current;
|
|
516
|
+
if (dragUid === null) return;
|
|
254
517
|
var position = resolvePosition(e.currentTarget.getBoundingClientRect(), e.clientY);
|
|
255
|
-
if (isIllegalMove(
|
|
256
|
-
var dragNode = itemMap.get(
|
|
257
|
-
var dropNode = itemMap.get(
|
|
518
|
+
if (isIllegalMove(dragUid, uid)) return;
|
|
519
|
+
var dragNode = itemMap.get(dragUid);
|
|
520
|
+
var dropNode = itemMap.get(uid);
|
|
258
521
|
if (!dragNode || !dropNode) return;
|
|
259
522
|
if (allowDrop && allowDrop({
|
|
260
523
|
dragNode: dragNode.original,
|
|
@@ -266,45 +529,46 @@ var Tree = function Tree(baseprops) {
|
|
|
266
529
|
onDrop === null || onDrop === void 0 || onDrop({
|
|
267
530
|
dragNode: dragNode.original,
|
|
268
531
|
dropNode: dropNode.original,
|
|
269
|
-
dragKey:
|
|
270
|
-
dropKey: key,
|
|
532
|
+
dragKey: dragNode.key,
|
|
533
|
+
dropKey: dropNode.key,
|
|
534
|
+
dragPath: [].concat(_toConsumableArray(dragNode.path), [dragNode.key]),
|
|
535
|
+
dropPath: [].concat(_toConsumableArray(dropNode.path), [dropNode.key]),
|
|
271
536
|
position: position,
|
|
272
537
|
dropToGap: position !== 'inside'
|
|
273
538
|
});
|
|
274
539
|
|
|
275
|
-
// Auto-expand the target after a drop-inside
|
|
276
|
-
// visible. Only effective in uncontrolled expandedKeys mode.
|
|
540
|
+
// Auto-expand the target after a drop-inside
|
|
277
541
|
if (position === 'inside') {
|
|
278
|
-
|
|
279
|
-
|
|
542
|
+
setExpandedUidArray(function (prev) {
|
|
543
|
+
if (prev.includes(uid)) return prev;
|
|
544
|
+
return [].concat(_toConsumableArray(prev), [uid]);
|
|
280
545
|
});
|
|
281
546
|
}
|
|
282
|
-
|
|
283
|
-
|
|
547
|
+
dragUidRef.current = null;
|
|
548
|
+
setDraggingUid(null);
|
|
284
549
|
setDropState(null);
|
|
285
|
-
}
|
|
286
|
-
var handleDragEnd =
|
|
287
|
-
|
|
288
|
-
|
|
550
|
+
});
|
|
551
|
+
var handleDragEnd = useEvent(function () {
|
|
552
|
+
dragUidRef.current = null;
|
|
553
|
+
setDraggingUid(null);
|
|
289
554
|
setDropState(null);
|
|
290
|
-
}
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
}, /*#__PURE__*/React.createElement(TreeContext.Provider, {
|
|
296
|
-
value: {
|
|
555
|
+
});
|
|
556
|
+
|
|
557
|
+
// ==================== Context Value (memoized) ====================
|
|
558
|
+
var contextValue = useMemo(function () {
|
|
559
|
+
return {
|
|
297
560
|
prefixCls: prefixCls,
|
|
298
561
|
checkable: checkable,
|
|
299
562
|
showIcon: showIcon,
|
|
300
563
|
icon: icon,
|
|
301
564
|
showLine: showLine,
|
|
302
565
|
switcherIcon: switcherIcon,
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
566
|
+
selectedUids: selectedUidSet,
|
|
567
|
+
checkedUids: checkedUidSet,
|
|
568
|
+
indeterminateUids: indeterminateUidSet,
|
|
569
|
+
expandedUids: expandedUidSet,
|
|
306
570
|
draggable: draggable,
|
|
307
|
-
|
|
571
|
+
draggingUid: draggingUid,
|
|
308
572
|
dropState: dropState,
|
|
309
573
|
onCheck: handleCheck,
|
|
310
574
|
onSelect: handleSelect,
|
|
@@ -313,12 +577,157 @@ var Tree = function Tree(baseprops) {
|
|
|
313
577
|
onNodeDragOver: handleDragOver,
|
|
314
578
|
onNodeDragLeave: handleDragLeave,
|
|
315
579
|
onNodeDrop: handleDrop
|
|
580
|
+
};
|
|
581
|
+
}, [prefixCls, checkable, showIcon, icon, showLine, switcherIcon, selectedUidSet, checkedUidSet, indeterminateUidSet, expandedUidSet, draggable, draggingUid, dropState,
|
|
582
|
+
// handlers are stable (useEvent), but listed for correctness
|
|
583
|
+
handleCheck, handleSelect, handleExpand, handleDragStart, handleDragOver, handleDragLeave, handleDrop]);
|
|
584
|
+
|
|
585
|
+
// ==================== Virtual Scroll ====================
|
|
586
|
+
var useVirtual = virtual && height !== null && height !== undefined;
|
|
587
|
+
var _useVirtualList = useVirtualList({
|
|
588
|
+
itemCount: useVirtual ? visibleItems.length : 0,
|
|
589
|
+
itemHeight: itemHeight,
|
|
590
|
+
overscan: 4
|
|
591
|
+
}),
|
|
592
|
+
start = _useVirtualList.start,
|
|
593
|
+
end = _useVirtualList.end,
|
|
594
|
+
offsetY = _useVirtualList.offsetY,
|
|
595
|
+
totalHeight = _useVirtualList.totalHeight,
|
|
596
|
+
viewportRef = _useVirtualList.viewportRef,
|
|
597
|
+
onScroll = _useVirtualList.onScroll;
|
|
598
|
+
|
|
599
|
+
// ==================== Render ====================
|
|
600
|
+
if (useVirtual) {
|
|
601
|
+
var slicedItems = visibleItems.slice(start, end);
|
|
602
|
+
return /*#__PURE__*/React.createElement("div", {
|
|
603
|
+
className: clsx(prefixCls, className),
|
|
604
|
+
style: style,
|
|
605
|
+
onDragEnd: handleDragEnd
|
|
606
|
+
}, /*#__PURE__*/React.createElement(TreeContext.Provider, {
|
|
607
|
+
value: contextValue
|
|
608
|
+
}, /*#__PURE__*/React.createElement("div", {
|
|
609
|
+
ref: viewportRef,
|
|
610
|
+
onScroll: onScroll,
|
|
611
|
+
style: {
|
|
612
|
+
height: height,
|
|
613
|
+
overflowY: 'auto'
|
|
614
|
+
}
|
|
615
|
+
}, /*#__PURE__*/React.createElement("div", {
|
|
616
|
+
style: {
|
|
617
|
+
height: totalHeight,
|
|
618
|
+
position: 'relative'
|
|
619
|
+
}
|
|
620
|
+
}, slicedItems.map(function (node, i) {
|
|
621
|
+
return /*#__PURE__*/React.createElement(TreeNodeComp, {
|
|
622
|
+
node: node,
|
|
623
|
+
key: node.uid,
|
|
624
|
+
style: {
|
|
625
|
+
position: 'absolute',
|
|
626
|
+
top: 0,
|
|
627
|
+
left: 0,
|
|
628
|
+
width: '100%',
|
|
629
|
+
height: itemHeight,
|
|
630
|
+
transform: "translateY(".concat(offsetY + i * itemHeight, "px)")
|
|
631
|
+
}
|
|
632
|
+
});
|
|
633
|
+
})))));
|
|
634
|
+
}
|
|
635
|
+
|
|
636
|
+
// ==================== Render (non-virtual) ====================
|
|
637
|
+
// Group consecutive children of the same parent into segments.
|
|
638
|
+
// Each group animates as a single unit (one height measurement) rather than
|
|
639
|
+
// each node individually, drastically reducing layout thrashing.
|
|
640
|
+
|
|
641
|
+
var segments = [];
|
|
642
|
+
var currentGroup = null;
|
|
643
|
+
var _iterator9 = _createForOfIteratorHelper(visibleItems),
|
|
644
|
+
_step9;
|
|
645
|
+
try {
|
|
646
|
+
for (_iterator9.s(); !(_step9 = _iterator9.n()).done;) {
|
|
647
|
+
var node = _step9.value;
|
|
648
|
+
if (node.depth === 0) {
|
|
649
|
+
// Root nodes are always visible, render directly without animation
|
|
650
|
+
if (currentGroup) {
|
|
651
|
+
segments.push(_objectSpread({
|
|
652
|
+
type: 'group'
|
|
653
|
+
}, currentGroup));
|
|
654
|
+
currentGroup = null;
|
|
655
|
+
}
|
|
656
|
+
segments.push({
|
|
657
|
+
type: 'node',
|
|
658
|
+
node: node
|
|
659
|
+
});
|
|
660
|
+
} else {
|
|
661
|
+
// Non-root: group consecutive children under the same parent
|
|
662
|
+
if (currentGroup && currentGroup.pUid === node.pUid) {
|
|
663
|
+
currentGroup.nodes.push(node);
|
|
664
|
+
} else {
|
|
665
|
+
if (currentGroup) {
|
|
666
|
+
segments.push(_objectSpread({
|
|
667
|
+
type: 'group'
|
|
668
|
+
}, currentGroup));
|
|
669
|
+
}
|
|
670
|
+
currentGroup = {
|
|
671
|
+
pUid: node.pUid,
|
|
672
|
+
nodes: [node]
|
|
673
|
+
};
|
|
674
|
+
}
|
|
675
|
+
}
|
|
316
676
|
}
|
|
317
|
-
}
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
677
|
+
} catch (err) {
|
|
678
|
+
_iterator9.e(err);
|
|
679
|
+
} finally {
|
|
680
|
+
_iterator9.f();
|
|
681
|
+
}
|
|
682
|
+
if (currentGroup) {
|
|
683
|
+
segments.push(_objectSpread({
|
|
684
|
+
type: 'group'
|
|
685
|
+
}, currentGroup));
|
|
686
|
+
}
|
|
687
|
+
return /*#__PURE__*/React.createElement("div", {
|
|
688
|
+
className: clsx(prefixCls, className),
|
|
689
|
+
style: style,
|
|
690
|
+
onDragEnd: handleDragEnd
|
|
691
|
+
}, /*#__PURE__*/React.createElement(TreeContext.Provider, {
|
|
692
|
+
value: contextValue
|
|
693
|
+
}, /*#__PURE__*/React.createElement(AnimatePresence, {
|
|
694
|
+
initial: false
|
|
695
|
+
}, segments.map(function (segment) {
|
|
696
|
+
if (segment.type === 'node') {
|
|
697
|
+
return /*#__PURE__*/React.createElement(TreeNodeComp, {
|
|
698
|
+
node: segment.node,
|
|
699
|
+
key: segment.node.uid
|
|
700
|
+
});
|
|
701
|
+
}
|
|
702
|
+
// Keep the wrapper mounted throughout native drag operations.
|
|
703
|
+
// Replacing this tree after dragStart removes the browser's drag
|
|
704
|
+
// source and cancels the drag before dragOver/drop can fire.
|
|
705
|
+
return /*#__PURE__*/React.createElement(motion.div, {
|
|
706
|
+
key: segment.pUid + '\x01children',
|
|
707
|
+
initial: {
|
|
708
|
+
height: 0,
|
|
709
|
+
opacity: 0
|
|
710
|
+
},
|
|
711
|
+
animate: {
|
|
712
|
+
height: 'auto',
|
|
713
|
+
opacity: 1
|
|
714
|
+
},
|
|
715
|
+
exit: {
|
|
716
|
+
height: 0,
|
|
717
|
+
opacity: 0
|
|
718
|
+
},
|
|
719
|
+
transition: {
|
|
720
|
+
duration: 0.15
|
|
721
|
+
},
|
|
722
|
+
style: {
|
|
723
|
+
overflow: 'hidden'
|
|
724
|
+
}
|
|
725
|
+
}, segment.nodes.map(function (node) {
|
|
726
|
+
return /*#__PURE__*/React.createElement(TreeNodeComp, {
|
|
727
|
+
node: node,
|
|
728
|
+
key: node.uid
|
|
729
|
+
});
|
|
730
|
+
}));
|
|
731
|
+
}))));
|
|
323
732
|
};
|
|
324
733
|
export default Tree;
|