@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.
Files changed (145) hide show
  1. package/dist/cjs/Button/style/index.less +5 -4
  2. package/dist/cjs/Drawer/drawer.js +1 -1
  3. package/dist/cjs/Drawer/interface.d.ts +1 -1
  4. package/dist/cjs/Drawer/style/index.less +1 -0
  5. package/dist/cjs/Form/form-store.d.ts +2 -1
  6. package/dist/cjs/Form/form-store.js +32 -17
  7. package/dist/cjs/List/demo/virtual.d.ts +3 -0
  8. package/dist/cjs/List/demo/virtual.js +53 -0
  9. package/dist/cjs/List/hooks/useListKeyboard.d.ts +28 -0
  10. package/dist/cjs/List/hooks/useListKeyboard.js +188 -0
  11. package/dist/cjs/List/interface.d.ts +29 -2
  12. package/dist/cjs/List/list.js +141 -21
  13. package/dist/cjs/List/style/index.less +24 -0
  14. package/dist/cjs/Select/demo/columns.d.ts +3 -0
  15. package/dist/cjs/Select/demo/columns.js +62 -0
  16. package/dist/cjs/Select/hooks/useSelectKeyboard.d.ts +13 -1
  17. package/dist/cjs/Select/hooks/useSelectKeyboard.js +81 -10
  18. package/dist/cjs/Select/interface.d.ts +30 -3
  19. package/dist/cjs/Select/option.js +4 -3
  20. package/dist/cjs/Select/options.js +90 -8
  21. package/dist/cjs/Select/select.js +32 -8
  22. package/dist/cjs/Select/style/index.less +14 -0
  23. package/dist/cjs/Selector/interface.d.ts +4 -0
  24. package/dist/cjs/Selector/selector.js +5 -3
  25. package/dist/cjs/Table/hooks/useColumns.js +1 -1
  26. package/dist/cjs/Table/interface.d.ts +1 -1
  27. package/dist/cjs/Table/style/index.less +35 -11
  28. package/dist/cjs/Table/table.js +57 -7
  29. package/dist/cjs/Table/tbody/cell.js +1 -1
  30. package/dist/cjs/Table/util/header.d.ts +3 -1
  31. package/dist/cjs/Table/util/header.js +30 -3
  32. package/dist/cjs/Tree/demo/draggable.js +2 -0
  33. package/dist/cjs/Tree/interface.d.ts +46 -23
  34. package/dist/cjs/Tree/tree-node.d.ts +1 -1
  35. package/dist/cjs/Tree/tree-node.js +30 -23
  36. package/dist/cjs/Tree/tree.d.ts +13 -12
  37. package/dist/cjs/Tree/tree.js +452 -227
  38. package/dist/cjs/Tree/utils/tree-tools.d.ts +43 -10
  39. package/dist/cjs/Tree/utils/tree-tools.js +129 -91
  40. package/dist/cjs/locale/context.d.ts +5 -4
  41. package/dist/cjs/locale/context.js +15 -8
  42. package/dist/cjs/locale/interface.d.ts +20 -0
  43. package/dist/cjs/locale/util.d.ts +3 -3
  44. package/dist/cjs/style/color.css +3 -0
  45. package/dist/cjs/style/size.css +2 -1
  46. package/dist/cjs/style/themes.css +1 -1
  47. package/dist/cjs/style/variables.css +6 -2
  48. package/dist/cjs/utils/isEqual.js +5 -7
  49. package/dist/cjs/version.d.ts +1 -1
  50. package/dist/cjs/version.js +1 -1
  51. package/dist/esm/Button/style/index.less +5 -4
  52. package/dist/esm/Drawer/drawer.js +2 -1
  53. package/dist/esm/Drawer/interface.d.ts +1 -1
  54. package/dist/esm/Drawer/style/index.less +1 -0
  55. package/dist/esm/Form/form-store.d.ts +2 -1
  56. package/dist/esm/Form/form-store.js +40 -19
  57. package/dist/esm/List/demo/virtual.d.ts +3 -0
  58. package/dist/esm/List/demo/virtual.js +22 -0
  59. package/dist/esm/List/hooks/useListKeyboard.d.ts +28 -0
  60. package/dist/esm/List/hooks/useListKeyboard.js +173 -0
  61. package/dist/esm/List/interface.d.ts +29 -2
  62. package/dist/esm/List/list.js +171 -14
  63. package/dist/esm/List/style/index.less +24 -0
  64. package/dist/esm/Select/demo/columns.d.ts +3 -0
  65. package/dist/esm/Select/demo/columns.js +36 -0
  66. package/dist/esm/Select/hooks/useSelectKeyboard.d.ts +13 -1
  67. package/dist/esm/Select/hooks/useSelectKeyboard.js +91 -14
  68. package/dist/esm/Select/interface.d.ts +30 -3
  69. package/dist/esm/Select/option.js +6 -2
  70. package/dist/esm/Select/options.js +114 -32
  71. package/dist/esm/Select/select.js +40 -11
  72. package/dist/esm/Select/style/index.less +14 -0
  73. package/dist/esm/Selector/interface.d.ts +4 -0
  74. package/dist/esm/Selector/selector.js +10 -4
  75. package/dist/esm/Table/hooks/useColumns.js +1 -1
  76. package/dist/esm/Table/interface.d.ts +1 -1
  77. package/dist/esm/Table/style/index.less +35 -11
  78. package/dist/esm/Table/table.js +54 -2
  79. package/dist/esm/Table/tbody/cell.js +1 -1
  80. package/dist/esm/Table/util/header.d.ts +3 -1
  81. package/dist/esm/Table/util/header.js +30 -2
  82. package/dist/esm/Tree/demo/draggable.js +2 -0
  83. package/dist/esm/Tree/interface.d.ts +46 -23
  84. package/dist/esm/Tree/tree-node.d.ts +1 -1
  85. package/dist/esm/Tree/tree-node.js +26 -31
  86. package/dist/esm/Tree/tree.d.ts +13 -12
  87. package/dist/esm/Tree/tree.js +572 -163
  88. package/dist/esm/Tree/utils/tree-tools.d.ts +43 -10
  89. package/dist/esm/Tree/utils/tree-tools.js +219 -104
  90. package/dist/esm/locale/context.d.ts +5 -4
  91. package/dist/esm/locale/context.js +25 -9
  92. package/dist/esm/locale/interface.d.ts +20 -0
  93. package/dist/esm/locale/util.d.ts +3 -3
  94. package/dist/esm/style/color.css +3 -0
  95. package/dist/esm/style/size.css +2 -1
  96. package/dist/esm/style/themes.css +1 -1
  97. package/dist/esm/style/variables.css +6 -2
  98. package/dist/esm/utils/isEqual.js +5 -7
  99. package/dist/esm/version.d.ts +1 -1
  100. package/dist/esm/version.js +1 -1
  101. package/dist/umd/yee-c.min.css +4 -4
  102. package/dist/umd/yee-c.min.js +1 -1
  103. package/package.json +1 -1
  104. package/src/Button/style/index.less +5 -4
  105. package/src/Drawer/drawer.tsx +1 -1
  106. package/src/Drawer/interface.ts +1 -0
  107. package/src/Drawer/style/index.less +1 -0
  108. package/src/Form/form-store.ts +42 -15
  109. package/src/List/demo/virtual.tsx +20 -0
  110. package/src/List/hooks/useListKeyboard.ts +235 -0
  111. package/src/List/index.en-US.md +6 -0
  112. package/src/List/index.zh-CN.md +6 -0
  113. package/src/List/interface.ts +29 -2
  114. package/src/List/list.tsx +157 -19
  115. package/src/List/style/index.less +24 -0
  116. package/src/Select/demo/columns.tsx +35 -0
  117. package/src/Select/hooks/useSelectKeyboard.ts +112 -15
  118. package/src/Select/index.en-US.md +4 -0
  119. package/src/Select/index.zh-CN.md +4 -0
  120. package/src/Select/interface.ts +31 -4
  121. package/src/Select/option.tsx +9 -3
  122. package/src/Select/options.tsx +119 -26
  123. package/src/Select/select.tsx +41 -8
  124. package/src/Select/style/index.less +14 -0
  125. package/src/Selector/interface.ts +4 -0
  126. package/src/Selector/selector.tsx +8 -3
  127. package/src/Table/hooks/useColumns.ts +1 -1
  128. package/src/Table/interface.ts +1 -1
  129. package/src/Table/style/index.less +35 -11
  130. package/src/Table/table.tsx +60 -1
  131. package/src/Table/tbody/cell.tsx +1 -1
  132. package/src/Table/util/header.ts +48 -2
  133. package/src/Tree/demo/draggable.tsx +2 -0
  134. package/src/Tree/interface.ts +46 -23
  135. package/src/Tree/tree-node.tsx +26 -29
  136. package/src/Tree/tree.tsx +573 -274
  137. package/src/Tree/utils/tree-tools.ts +231 -125
  138. package/src/locale/_README.md +22 -13
  139. package/src/locale/context.tsx +33 -16
  140. package/src/locale/interface.ts +24 -0
  141. package/src/locale/util.ts +6 -6
  142. package/src/style/color.css +3 -0
  143. package/src/style/size.css +2 -1
  144. package/src/utils/isEqual.ts +5 -7
  145. package/src/version.ts +1 -1
@@ -2,8 +2,22 @@ var __create = Object.create;
2
2
  var __defProp = Object.defineProperty;
3
3
  var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
4
  var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __getOwnPropSymbols = Object.getOwnPropertySymbols;
5
6
  var __getProtoOf = Object.getPrototypeOf;
6
7
  var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __propIsEnum = Object.prototype.propertyIsEnumerable;
9
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
10
+ var __spreadValues = (a, b) => {
11
+ for (var prop in b || (b = {}))
12
+ if (__hasOwnProp.call(b, prop))
13
+ __defNormalProp(a, prop, b[prop]);
14
+ if (__getOwnPropSymbols)
15
+ for (var prop of __getOwnPropSymbols(b)) {
16
+ if (__propIsEnum.call(b, prop))
17
+ __defNormalProp(a, prop, b[prop]);
18
+ }
19
+ return a;
20
+ };
7
21
  var __export = (target, all) => {
8
22
  for (var name in all)
9
23
  __defProp(target, name, { get: all[name], enumerable: true });
@@ -35,8 +49,11 @@ __export(tree_exports, {
35
49
  module.exports = __toCommonJS(tree_exports);
36
50
  var import_clsx = __toESM(require("clsx"));
37
51
  var import_react = __toESM(require("react"));
52
+ var import_react2 = require("motion/react");
38
53
  var import_Config_Provider = require("../Config-Provider");
54
+ var import_useEvent = __toESM(require("../hooks/useEvent"));
39
55
  var import_useMergedState = __toESM(require("../hooks/useMergedState"));
56
+ var import_useVirtualList = __toESM(require("../hooks/useVirtualList"));
40
57
  var import_mergeContextToProps = __toESM(require("../utils/mergeContextToProps"));
41
58
  var import_tree_node = __toESM(require("./tree-node"));
42
59
  var import_tree_tools = require("./utils/tree-tools");
@@ -48,11 +65,12 @@ var DEFAULTFIELDNAMES = {
48
65
  };
49
66
  var TreeContext = (0, import_react.createContext)({
50
67
  showIcon: true,
51
- selectedKeys: [],
52
- checkedKeys: [],
53
- expandedKeys: [],
68
+ selectedUids: /* @__PURE__ */ new Set(),
69
+ checkedUids: /* @__PURE__ */ new Set(),
70
+ indeterminateUids: /* @__PURE__ */ new Set(),
71
+ expandedUids: /* @__PURE__ */ new Set(),
54
72
  draggable: false,
55
- draggingKey: null,
73
+ draggingUid: null,
56
74
  dropState: null,
57
75
  onCheck: () => {
58
76
  },
@@ -69,6 +87,62 @@ var TreeContext = (0, import_react.createContext)({
69
87
  onNodeDrop: () => {
70
88
  }
71
89
  });
90
+ var EMPTY_ARRAY = [];
91
+ function keysToUidArray(keys, flatItems) {
92
+ if (!keys)
93
+ return void 0;
94
+ if (keys.length === 0)
95
+ return EMPTY_ARRAY;
96
+ const keySet = new Set(keys.map(String));
97
+ const uids = [];
98
+ for (const item of flatItems) {
99
+ if (keySet.has(String(item.key))) {
100
+ uids.push(item.uid);
101
+ }
102
+ }
103
+ return uids;
104
+ }
105
+ function useStableUidArray(keys, flatItems) {
106
+ const ref = (0, import_react.useRef)({
107
+ keys: void 0,
108
+ result: void 0
109
+ });
110
+ const computed = (0, import_react.useMemo)(
111
+ () => keysToUidArray(keys, flatItems),
112
+ [keys, flatItems]
113
+ );
114
+ if (computed === void 0) {
115
+ ref.current = { keys, result: void 0 };
116
+ return void 0;
117
+ }
118
+ const prev = ref.current.result;
119
+ if (prev && prev.length === computed.length && prev.every((v, i) => v === computed[i])) {
120
+ return prev;
121
+ }
122
+ ref.current = { keys, result: computed };
123
+ return computed;
124
+ }
125
+ function uidsToKeys(uids, map) {
126
+ const keys = [];
127
+ for (const uid of uids) {
128
+ const node = map.get(uid);
129
+ if (node)
130
+ keys.push(node.key);
131
+ }
132
+ return keys;
133
+ }
134
+ function arrayToSet(arr) {
135
+ const s = /* @__PURE__ */ new Set();
136
+ for (const item of arr) {
137
+ s.add(item);
138
+ }
139
+ return s;
140
+ }
141
+ function setToArray(s) {
142
+ const arr = [];
143
+ s.forEach((v) => arr.push(v));
144
+ return arr;
145
+ }
72
146
  var Tree = (baseprops) => {
73
147
  const { tree } = (0, import_react.useContext)(import_Config_Provider.GlobalContext);
74
148
  const props = (0, import_mergeContextToProps.default)(baseprops, tree);
@@ -96,230 +170,391 @@ var Tree = (baseprops) => {
96
170
  onDrop,
97
171
  onSelect,
98
172
  onCheck,
99
- onExpand
173
+ onExpand,
174
+ virtual = false,
175
+ height,
176
+ itemHeight = 28
100
177
  } = props;
101
- const [mergedSelectedKeys, setMergedSelectedKeys] = (0, import_useMergedState.default)([], {
102
- value: selectedKeys,
103
- defaultValue: defaultSelectedKeys
104
- });
105
- const [mergedCheckedKeys, setMergedCheckedKeys] = (0, import_useMergedState.default)([], {
106
- value: checkedKeys,
107
- defaultValue: defaultCheckedKeys
108
- });
109
178
  const [flatItems, itemMap] = (0, import_react.useMemo)(
110
179
  () => (0, import_tree_tools.tree2array)(dataSource != null ? dataSource : [], fieldNames),
111
180
  [dataSource, fieldNames]
112
181
  );
113
- const allParentKeys = (0, import_react.useMemo)(() => {
114
- const keys = [];
115
- flatItems.forEach((item) => {
116
- if (!item.isLeaf) {
117
- keys.push(item.key);
118
- }
119
- });
120
- return keys;
182
+ const allParentUidArray = (0, import_react.useMemo)(() => {
183
+ const uids = [];
184
+ for (const item of flatItems) {
185
+ if (!item.isLeaf)
186
+ uids.push(item.uid);
187
+ }
188
+ return uids;
121
189
  }, [flatItems]);
122
- const [mergedExpandedKeys, setMergedExpandedKeys] = (0, import_useMergedState.default)(
123
- () => {
124
- return defaultExpandAll ? allParentKeys : [];
125
- },
190
+ const stableExpandedValue = useStableUidArray(expandedKeys, flatItems);
191
+ const stableExpandedDefault = useStableUidArray(defaultExpandedKeys, flatItems);
192
+ const stableSelectedValue = useStableUidArray(selectedKeys, flatItems);
193
+ const stableSelectedDefault = useStableUidArray(defaultSelectedKeys, flatItems);
194
+ const stableCheckedValue = useStableUidArray(checkedKeys, flatItems);
195
+ const stableCheckedDefault = useStableUidArray(defaultCheckedKeys, flatItems);
196
+ const [expandedUidArray, setExpandedUidArray] = (0, import_useMergedState.default)(
197
+ () => defaultExpandAll ? allParentUidArray : [],
198
+ {
199
+ value: stableExpandedValue,
200
+ defaultValue: stableExpandedDefault
201
+ }
202
+ );
203
+ const expandedUidSet = (0, import_react.useMemo)(
204
+ () => arrayToSet(expandedUidArray),
205
+ [expandedUidArray]
206
+ );
207
+ const [selectedUidArray, setSelectedUidArray] = (0, import_useMergedState.default)(
208
+ [],
126
209
  {
127
- value: expandedKeys,
128
- defaultValue: defaultExpandedKeys
210
+ value: stableSelectedValue,
211
+ defaultValue: stableSelectedDefault
129
212
  }
130
213
  );
131
- const handleCheck = (0, import_react.useCallback)(
132
- (event) => {
133
- const key = event.target.value;
214
+ const selectedUidSet = (0, import_react.useMemo)(
215
+ () => arrayToSet(selectedUidArray),
216
+ [selectedUidArray]
217
+ );
218
+ const [checkedUidArray, setCheckedUidArray] = (0, import_useMergedState.default)([], {
219
+ value: stableCheckedValue,
220
+ defaultValue: stableCheckedDefault
221
+ });
222
+ const checkedUidSet = (0, import_react.useMemo)(
223
+ () => arrayToSet(checkedUidArray),
224
+ [checkedUidArray]
225
+ );
226
+ const indeterminateUidSet = (0, import_react.useMemo)(() => {
227
+ const result = /* @__PURE__ */ new Set();
228
+ for (const item of flatItems) {
229
+ if (!item.isLeaf && !checkedUidSet.has(item.uid) && item.childUids && item.childUids.some((cuid) => checkedUidSet.has(cuid))) {
230
+ result.add(item.uid);
231
+ }
232
+ }
233
+ return result;
234
+ }, [flatItems, checkedUidSet]);
235
+ const visibleItems = (0, import_react.useMemo)(() => {
236
+ const visibleSet = /* @__PURE__ */ new Set();
237
+ const result = [];
238
+ for (const item of flatItems) {
239
+ if (item.depth === 0) {
240
+ visibleSet.add(item.uid);
241
+ result.push(item);
242
+ } else if (item.pUid && visibleSet.has(item.pUid) && expandedUidSet.has(item.pUid)) {
243
+ visibleSet.add(item.uid);
244
+ result.push(item);
245
+ }
246
+ }
247
+ return result;
248
+ }, [flatItems, expandedUidSet]);
249
+ const handleCheck = (0, import_useEvent.default)(
250
+ (event, uid) => {
134
251
  const checked = event.target.checked;
135
- const treeNode = itemMap.get(key);
136
- const newKeys = (0, import_tree_tools.getCheckedKeys)({
252
+ const treeNode = itemMap.get(uid);
253
+ const newUidSet = (0, import_tree_tools.getCheckedKeys)({
137
254
  checked,
138
- keys: mergedCheckedKeys,
139
- key,
255
+ keys: checkedUidSet,
256
+ uid,
140
257
  map: itemMap
141
258
  });
142
- const nodes = newKeys.map((key2) => {
143
- var _a;
144
- return (_a = itemMap.get(key2)) == null ? void 0 : _a.original;
145
- }).filter((node) => node !== void 0);
146
- setMergedCheckedKeys(newKeys);
147
- const originalNode = treeNode == null ? void 0 : treeNode.original;
148
- if (originalNode) {
149
- onCheck == null ? void 0 : onCheck(newKeys, {
259
+ const newUidArr = setToArray(newUidSet);
260
+ setCheckedUidArray(newUidArr);
261
+ if (treeNode && onCheck) {
262
+ const externalKeys = uidsToKeys(newUidArr, itemMap);
263
+ const nodes = [];
264
+ newUidSet.forEach((u) => {
265
+ var _a;
266
+ const n = (_a = itemMap.get(u)) == null ? void 0 : _a.original;
267
+ if (n)
268
+ nodes.push(n);
269
+ });
270
+ onCheck(externalKeys, {
150
271
  checked,
151
272
  checkedNodes: nodes,
152
- node: originalNode
273
+ node: treeNode.original
153
274
  });
154
275
  }
155
- },
156
- [mergedCheckedKeys, itemMap, onCheck]
276
+ }
157
277
  );
158
- const handleSelect = (0, import_react.useCallback)(
159
- (key) => {
160
- const selected = mergedSelectedKeys.includes(key);
161
- const newKeys = multiple ? selected ? [...mergedSelectedKeys.filter((k) => k !== key)] : [...mergedSelectedKeys, key] : selected ? [] : [key];
162
- setMergedSelectedKeys(newKeys);
163
- const nodes = newKeys.map((k) => {
164
- var _a;
165
- return (_a = itemMap.get(k)) == null ? void 0 : _a.original;
166
- }).filter((node) => node !== void 0);
167
- const treeNode = itemMap.get(key);
168
- const originalNode = treeNode == null ? void 0 : treeNode.original;
169
- if (originalNode) {
170
- onSelect == null ? void 0 : onSelect(newKeys, {
171
- selected: !selected,
172
- selectedNodes: nodes,
173
- node: originalNode
174
- });
278
+ const handleSelect = (0, import_useEvent.default)((uid) => {
279
+ var _a;
280
+ const selected = selectedUidSet.has(uid);
281
+ let newUidArr;
282
+ if (multiple) {
283
+ if (selected) {
284
+ newUidArr = selectedUidArray.filter((u) => u !== uid);
285
+ } else {
286
+ newUidArr = [...selectedUidArray, uid];
175
287
  }
176
- },
177
- [mergedSelectedKeys, itemMap, multiple, onSelect]
178
- );
179
- const handleExpand = (0, import_react.useCallback)(
180
- (key) => {
181
- const expanded = mergedExpandedKeys.includes(key);
182
- const newKeys = expanded ? [...mergedExpandedKeys.filter((k) => k !== key)] : [...mergedExpandedKeys, key];
183
- setMergedExpandedKeys(newKeys);
184
- const nodes = newKeys.map((k) => {
185
- var _a;
186
- return (_a = itemMap.get(k)) == null ? void 0 : _a.original;
187
- }).filter((node) => node !== void 0);
188
- onExpand == null ? void 0 : onExpand(newKeys, {
288
+ } else {
289
+ newUidArr = selected ? [] : [uid];
290
+ }
291
+ setSelectedUidArray(newUidArr);
292
+ const treeNode = itemMap.get(uid);
293
+ if (treeNode && onSelect) {
294
+ const externalKeys = uidsToKeys(newUidArr, itemMap);
295
+ const nodes = [];
296
+ for (const u of newUidArr) {
297
+ const n = (_a = itemMap.get(u)) == null ? void 0 : _a.original;
298
+ if (n)
299
+ nodes.push(n);
300
+ }
301
+ onSelect(externalKeys, {
302
+ selected: !selected,
303
+ selectedNodes: nodes,
304
+ node: treeNode.original
305
+ });
306
+ }
307
+ });
308
+ const handleExpand = (0, import_useEvent.default)((uid) => {
309
+ var _a;
310
+ const expanded = expandedUidSet.has(uid);
311
+ const newUidArr = expanded ? expandedUidArray.filter((u) => u !== uid) : [...expandedUidArray, uid];
312
+ setExpandedUidArray(newUidArr);
313
+ if (onExpand) {
314
+ const externalKeys = uidsToKeys(newUidArr, itemMap);
315
+ const treeNode = itemMap.get(uid);
316
+ const nodes = [];
317
+ for (const u of newUidArr) {
318
+ const n = (_a = itemMap.get(u)) == null ? void 0 : _a.original;
319
+ if (n)
320
+ nodes.push(n);
321
+ }
322
+ onExpand(externalKeys, {
189
323
  expanded: !expanded,
190
324
  expandedNodes: nodes,
191
- node: nodes
325
+ node: treeNode.original
192
326
  });
193
- },
194
- [mergedExpandedKeys, itemMap, onExpand]
195
- );
196
- const dragKeyRef = (0, import_react.useRef)(null);
197
- const [draggingKey, setDraggingKey] = (0, import_react.useState)(null);
327
+ }
328
+ });
329
+ const dragUidRef = (0, import_react.useRef)(null);
330
+ const [draggingUid, setDraggingUid] = (0, import_react.useState)(null);
198
331
  const [dropState, setDropState] = (0, import_react.useState)(null);
199
- const isIllegalMove = (0, import_react.useCallback)(
200
- (dragKey, dropKey) => {
201
- if (dragKey === dropKey)
332
+ const resolvePosition = (rect, clientY) => {
333
+ const offset = (clientY - rect.top) / rect.height;
334
+ if (offset < 0.25)
335
+ return "before";
336
+ if (offset > 0.75)
337
+ return "after";
338
+ return "inside";
339
+ };
340
+ const isIllegalMove = (dragUid, dropUid) => {
341
+ if (dragUid === dropUid)
342
+ return true;
343
+ const dropNode = itemMap.get(dropUid);
344
+ if (!dropNode)
345
+ return true;
346
+ let current = dropNode;
347
+ while (current) {
348
+ if (current.pUid === dragUid)
202
349
  return true;
203
- const dropNode = itemMap.get(dropKey);
204
- return !!dropNode && dropNode.path.includes(dragKey);
205
- },
206
- [itemMap]
207
- );
208
- const resolvePosition = (0, import_react.useCallback)(
209
- (rect, clientY) => {
210
- const offset = (clientY - rect.top) / rect.height;
211
- if (offset < 0.25)
212
- return "before";
213
- if (offset > 0.75)
214
- return "after";
215
- return "inside";
216
- },
217
- []
218
- );
219
- const handleDragStart = (0, import_react.useCallback)(
220
- (key, e) => {
221
- const node = itemMap.get(key);
222
- if (node == null ? void 0 : node.disabled) {
223
- e.preventDefault();
224
- return;
225
- }
226
- dragKeyRef.current = key;
227
- setDraggingKey(key);
228
- if (e.dataTransfer) {
229
- e.dataTransfer.effectAllowed = "move";
230
- try {
231
- e.dataTransfer.setData("text/plain", String(key));
232
- } catch (e2) {
233
- }
234
- }
235
- },
236
- [itemMap]
237
- );
238
- const handleDragOver = (0, import_react.useCallback)(
239
- (key, e) => {
240
- const dragKey = dragKeyRef.current;
241
- if (dragKey === null)
242
- return;
243
- if (isIllegalMove(dragKey, key))
244
- return;
245
- const dropNode = itemMap.get(key);
246
- if (!dropNode || dropNode.disabled)
247
- return;
248
- const position = resolvePosition(
249
- e.currentTarget.getBoundingClientRect(),
250
- e.clientY
251
- );
252
- const dragNode = itemMap.get(dragKey);
253
- if (allowDrop && dragNode && allowDrop({
254
- dragNode: dragNode.original,
255
- dropNode: dropNode.original,
256
- position
257
- }) === false) {
258
- return;
259
- }
260
- e.preventDefault();
261
- if (e.dataTransfer)
262
- e.dataTransfer.dropEffect = "move";
263
- setDropState(
264
- (prev) => prev && prev.key === key && prev.position === position ? prev : { key, position }
265
- );
266
- },
267
- [itemMap, isIllegalMove, resolvePosition, allowDrop]
268
- );
269
- const handleDragLeave = (0, import_react.useCallback)(
270
- // Intentionally a no-op: dragleave fires spuriously when crossing child
271
- // elements. Drop state is cleared in handleDragEnd at the Tree root.
272
- () => {
273
- },
274
- []
275
- );
276
- const handleDrop = (0, import_react.useCallback)(
277
- (key, e) => {
350
+ current = current.pUid ? itemMap.get(current.pUid) : void 0;
351
+ }
352
+ return false;
353
+ };
354
+ const handleDragStart = (0, import_useEvent.default)((uid, e) => {
355
+ const node = itemMap.get(uid);
356
+ if (node == null ? void 0 : node.disabled) {
278
357
  e.preventDefault();
279
- const dragKey = dragKeyRef.current;
280
- if (dragKey === null)
281
- return;
282
- const position = resolvePosition(
283
- e.currentTarget.getBoundingClientRect(),
284
- e.clientY
285
- );
286
- if (isIllegalMove(dragKey, key))
287
- return;
288
- const dragNode = itemMap.get(dragKey);
289
- const dropNode = itemMap.get(key);
290
- if (!dragNode || !dropNode)
291
- return;
292
- if (allowDrop && allowDrop({
293
- dragNode: dragNode.original,
294
- dropNode: dropNode.original,
295
- position
296
- }) === false) {
297
- return;
358
+ return;
359
+ }
360
+ dragUidRef.current = uid;
361
+ setDraggingUid(uid);
362
+ if (e.dataTransfer) {
363
+ e.dataTransfer.effectAllowed = "move";
364
+ try {
365
+ e.dataTransfer.setData("text/plain", uid);
366
+ } catch (e2) {
298
367
  }
299
- onDrop == null ? void 0 : onDrop({
300
- dragNode: dragNode.original,
301
- dropNode: dropNode.original,
302
- dragKey,
303
- dropKey: key,
304
- position,
305
- dropToGap: position !== "inside"
368
+ }
369
+ });
370
+ const handleDragOver = (0, import_useEvent.default)((uid, e) => {
371
+ const dragUid = dragUidRef.current;
372
+ if (dragUid === null)
373
+ return;
374
+ if (isIllegalMove(dragUid, uid))
375
+ return;
376
+ const dropNode = itemMap.get(uid);
377
+ if (!dropNode || dropNode.disabled)
378
+ return;
379
+ const position = resolvePosition(
380
+ e.currentTarget.getBoundingClientRect(),
381
+ e.clientY
382
+ );
383
+ const dragNode = itemMap.get(dragUid);
384
+ if (allowDrop && dragNode && allowDrop({
385
+ dragNode: dragNode.original,
386
+ dropNode: dropNode.original,
387
+ position
388
+ }) === false) {
389
+ return;
390
+ }
391
+ e.preventDefault();
392
+ if (e.dataTransfer)
393
+ e.dataTransfer.dropEffect = "move";
394
+ setDropState(
395
+ (prev) => prev && prev.uid === uid && prev.position === position ? prev : { uid, position }
396
+ );
397
+ });
398
+ const handleDragLeave = (0, import_useEvent.default)(() => {
399
+ });
400
+ const handleDrop = (0, import_useEvent.default)((uid, e) => {
401
+ e.preventDefault();
402
+ const dragUid = dragUidRef.current;
403
+ if (dragUid === null)
404
+ return;
405
+ const position = resolvePosition(
406
+ e.currentTarget.getBoundingClientRect(),
407
+ e.clientY
408
+ );
409
+ if (isIllegalMove(dragUid, uid))
410
+ return;
411
+ const dragNode = itemMap.get(dragUid);
412
+ const dropNode = itemMap.get(uid);
413
+ if (!dragNode || !dropNode)
414
+ return;
415
+ if (allowDrop && allowDrop({
416
+ dragNode: dragNode.original,
417
+ dropNode: dropNode.original,
418
+ position
419
+ }) === false) {
420
+ return;
421
+ }
422
+ onDrop == null ? void 0 : onDrop({
423
+ dragNode: dragNode.original,
424
+ dropNode: dropNode.original,
425
+ dragKey: dragNode.key,
426
+ dropKey: dropNode.key,
427
+ dragPath: [...dragNode.path, dragNode.key],
428
+ dropPath: [...dropNode.path, dropNode.key],
429
+ position,
430
+ dropToGap: position !== "inside"
431
+ });
432
+ if (position === "inside") {
433
+ setExpandedUidArray((prev) => {
434
+ if (prev.includes(uid))
435
+ return prev;
436
+ return [...prev, uid];
306
437
  });
307
- if (position === "inside") {
308
- setMergedExpandedKeys(
309
- (prev) => prev.includes(key) ? prev : [...prev, key]
310
- );
311
- }
312
- dragKeyRef.current = null;
313
- setDraggingKey(null);
314
- setDropState(null);
315
- },
316
- [itemMap, isIllegalMove, resolvePosition, allowDrop, onDrop]
317
- );
318
- const handleDragEnd = (0, import_react.useCallback)(() => {
319
- dragKeyRef.current = null;
320
- setDraggingKey(null);
438
+ }
439
+ dragUidRef.current = null;
440
+ setDraggingUid(null);
441
+ setDropState(null);
442
+ });
443
+ const handleDragEnd = (0, import_useEvent.default)(() => {
444
+ dragUidRef.current = null;
445
+ setDraggingUid(null);
321
446
  setDropState(null);
322
- }, []);
447
+ });
448
+ const contextValue = (0, import_react.useMemo)(
449
+ () => ({
450
+ prefixCls,
451
+ checkable,
452
+ showIcon,
453
+ icon,
454
+ showLine,
455
+ switcherIcon,
456
+ selectedUids: selectedUidSet,
457
+ checkedUids: checkedUidSet,
458
+ indeterminateUids: indeterminateUidSet,
459
+ expandedUids: expandedUidSet,
460
+ draggable,
461
+ draggingUid,
462
+ dropState,
463
+ onCheck: handleCheck,
464
+ onSelect: handleSelect,
465
+ onExpand: handleExpand,
466
+ onNodeDragStart: handleDragStart,
467
+ onNodeDragOver: handleDragOver,
468
+ onNodeDragLeave: handleDragLeave,
469
+ onNodeDrop: handleDrop
470
+ }),
471
+ [
472
+ prefixCls,
473
+ checkable,
474
+ showIcon,
475
+ icon,
476
+ showLine,
477
+ switcherIcon,
478
+ selectedUidSet,
479
+ checkedUidSet,
480
+ indeterminateUidSet,
481
+ expandedUidSet,
482
+ draggable,
483
+ draggingUid,
484
+ dropState,
485
+ // handlers are stable (useEvent), but listed for correctness
486
+ handleCheck,
487
+ handleSelect,
488
+ handleExpand,
489
+ handleDragStart,
490
+ handleDragOver,
491
+ handleDragLeave,
492
+ handleDrop
493
+ ]
494
+ );
495
+ const useVirtual = virtual && height !== null && height !== void 0;
496
+ const { start, end, offsetY, totalHeight, viewportRef, onScroll } = (0, import_useVirtualList.default)({
497
+ itemCount: useVirtual ? visibleItems.length : 0,
498
+ itemHeight,
499
+ overscan: 4
500
+ });
501
+ if (useVirtual) {
502
+ const slicedItems = visibleItems.slice(start, end);
503
+ return /* @__PURE__ */ import_react.default.createElement(
504
+ "div",
505
+ {
506
+ className: (0, import_clsx.default)(prefixCls, className),
507
+ style,
508
+ onDragEnd: handleDragEnd
509
+ },
510
+ /* @__PURE__ */ import_react.default.createElement(TreeContext.Provider, { value: contextValue }, /* @__PURE__ */ import_react.default.createElement(
511
+ "div",
512
+ {
513
+ ref: viewportRef,
514
+ onScroll,
515
+ style: { height, overflowY: "auto" }
516
+ },
517
+ /* @__PURE__ */ import_react.default.createElement("div", { style: { height: totalHeight, position: "relative" } }, slicedItems.map((node, i) => /* @__PURE__ */ import_react.default.createElement(
518
+ import_tree_node.default,
519
+ {
520
+ node,
521
+ key: node.uid,
522
+ style: {
523
+ position: "absolute",
524
+ top: 0,
525
+ left: 0,
526
+ width: "100%",
527
+ height: itemHeight,
528
+ transform: `translateY(${offsetY + i * itemHeight}px)`
529
+ }
530
+ }
531
+ )))
532
+ ))
533
+ );
534
+ }
535
+ const segments = [];
536
+ let currentGroup = null;
537
+ for (const node of visibleItems) {
538
+ if (node.depth === 0) {
539
+ if (currentGroup) {
540
+ segments.push(__spreadValues({ type: "group" }, currentGroup));
541
+ currentGroup = null;
542
+ }
543
+ segments.push({ type: "node", node });
544
+ } else {
545
+ if (currentGroup && currentGroup.pUid === node.pUid) {
546
+ currentGroup.nodes.push(node);
547
+ } else {
548
+ if (currentGroup) {
549
+ segments.push(__spreadValues({ type: "group" }, currentGroup));
550
+ }
551
+ currentGroup = { pUid: node.pUid, nodes: [node] };
552
+ }
553
+ }
554
+ }
555
+ if (currentGroup) {
556
+ segments.push(__spreadValues({ type: "group" }, currentGroup));
557
+ }
323
558
  return /* @__PURE__ */ import_react.default.createElement(
324
559
  "div",
325
560
  {
@@ -327,33 +562,23 @@ var Tree = (baseprops) => {
327
562
  style,
328
563
  onDragEnd: handleDragEnd
329
564
  },
330
- /* @__PURE__ */ import_react.default.createElement(
331
- TreeContext.Provider,
332
- {
333
- value: {
334
- prefixCls,
335
- checkable,
336
- showIcon,
337
- icon,
338
- showLine,
339
- switcherIcon,
340
- selectedKeys: mergedSelectedKeys,
341
- checkedKeys: mergedCheckedKeys,
342
- expandedKeys: mergedExpandedKeys,
343
- draggable,
344
- draggingKey,
345
- dropState,
346
- onCheck: handleCheck,
347
- onSelect: handleSelect,
348
- onExpand: handleExpand,
349
- onNodeDragStart: handleDragStart,
350
- onNodeDragOver: handleDragOver,
351
- onNodeDragLeave: handleDragLeave,
352
- onNodeDrop: handleDrop
353
- }
354
- },
355
- flatItems.map((node, index) => /* @__PURE__ */ import_react.default.createElement(import_tree_node.default, { node, key: node.key || index }))
356
- )
565
+ /* @__PURE__ */ import_react.default.createElement(TreeContext.Provider, { value: contextValue }, /* @__PURE__ */ import_react.default.createElement(import_react2.AnimatePresence, { initial: false }, segments.map((segment) => {
566
+ if (segment.type === "node") {
567
+ return /* @__PURE__ */ import_react.default.createElement(import_tree_node.default, { node: segment.node, key: segment.node.uid });
568
+ }
569
+ return /* @__PURE__ */ import_react.default.createElement(
570
+ import_react2.motion.div,
571
+ {
572
+ key: segment.pUid + "children",
573
+ initial: { height: 0, opacity: 0 },
574
+ animate: { height: "auto", opacity: 1 },
575
+ exit: { height: 0, opacity: 0 },
576
+ transition: { duration: 0.15 },
577
+ style: { overflow: "hidden" }
578
+ },
579
+ segment.nodes.map((node) => /* @__PURE__ */ import_react.default.createElement(import_tree_node.default, { node, key: node.uid }))
580
+ );
581
+ })))
357
582
  );
358
583
  };
359
584
  var tree_default = Tree;