@ai-group/chat-sdk 3.5.6 → 3.5.9
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/components/FolderTree/DirectoryTree.d.ts +13 -1
- package/dist/cjs/components/FolderTree/DirectoryTree.js +215 -70
- package/dist/cjs/components/FolderTree/DirectoryTree.js.map +2 -2
- package/dist/cjs/components/FolderTree/index.d.ts +3 -3
- package/dist/cjs/components/FolderTree/index.js +102 -5
- package/dist/cjs/components/FolderTree/index.js.map +2 -2
- package/dist/cjs/components/FolderTree/styles.d.ts +5 -0
- package/dist/cjs/components/FolderTree/styles.js +77 -14
- package/dist/cjs/components/FolderTree/styles.js.map +2 -2
- package/dist/cjs/components/FolderTree/types.d.ts +61 -2
- package/dist/cjs/components/FolderTree/types.js.map +1 -1
- package/dist/cjs/components/FolderTree/useFolderDrag.d.ts +53 -0
- package/dist/cjs/components/FolderTree/useFolderDrag.js +309 -0
- package/dist/cjs/components/FolderTree/useFolderDrag.js.map +7 -0
- package/dist/cjs/index.d.ts +1 -1
- package/dist/cjs/index.js.map +2 -2
- package/dist/esm/components/FolderTree/DirectoryTree.d.ts +13 -1
- package/dist/esm/components/FolderTree/DirectoryTree.js +220 -62
- package/dist/esm/components/FolderTree/DirectoryTree.js.map +1 -1
- package/dist/esm/components/FolderTree/index.d.ts +3 -3
- package/dist/esm/components/FolderTree/index.js +149 -31
- package/dist/esm/components/FolderTree/index.js.map +1 -1
- package/dist/esm/components/FolderTree/styles.d.ts +5 -0
- package/dist/esm/components/FolderTree/styles.js +17 -12
- package/dist/esm/components/FolderTree/styles.js.map +1 -1
- package/dist/esm/components/FolderTree/types.d.ts +61 -2
- package/dist/esm/components/FolderTree/types.js.map +1 -1
- package/dist/esm/components/FolderTree/useFolderDrag.d.ts +53 -0
- package/dist/esm/components/FolderTree/useFolderDrag.js +324 -0
- package/dist/esm/components/FolderTree/useFolderDrag.js.map +1 -0
- package/dist/esm/index.d.ts +1 -1
- package/dist/esm/index.js.map +1 -1
- package/dist/umd/chat-sdk.min.js +1 -1
- package/package.json +10 -10
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import _objectSpread from "@babel/runtime/helpers/esm/objectSpread2";
|
|
2
1
|
import _toConsumableArray from "@babel/runtime/helpers/esm/toConsumableArray";
|
|
3
|
-
import React, { useCallback } from "react";
|
|
4
|
-
import { Tree, Dropdown } from "antd";
|
|
2
|
+
import React, { useCallback, useMemo } from "react";
|
|
3
|
+
import { Tree, Dropdown, Input } from "antd";
|
|
5
4
|
import { FileOutlined, FolderOutlined, MoreOutlined } from "@ant-design/icons";
|
|
6
5
|
import clsx from "clsx";
|
|
7
6
|
import { useStyles } from "./styles";
|
|
7
|
+
import { useFolderDrag } from "./useFolderDrag";
|
|
8
8
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
9
9
|
import { jsxs as _jsxs } from "react/jsx-runtime";
|
|
10
10
|
var AntDirectoryTree = Tree.DirectoryTree;
|
|
@@ -25,7 +25,13 @@ var DirectoryTreeComponent = function DirectoryTreeComponent(_ref) {
|
|
|
25
25
|
moreActions = _ref.moreActions,
|
|
26
26
|
width = _ref.width,
|
|
27
27
|
draggable = _ref.draggable,
|
|
28
|
-
onDrop = _ref.onDrop
|
|
28
|
+
onDrop = _ref.onDrop,
|
|
29
|
+
editNode = _ref.editNode,
|
|
30
|
+
onEditValueChange = _ref.onEditValueChange,
|
|
31
|
+
onEditConfirm = _ref.onEditConfirm,
|
|
32
|
+
onEditCancel = _ref.onEditCancel,
|
|
33
|
+
createInfo = _ref.createInfo,
|
|
34
|
+
onStartRename = _ref.onStartRename;
|
|
29
35
|
var styles = useStyles();
|
|
30
36
|
var isFolder = function isFolder(node) {
|
|
31
37
|
return !!node.children && node.children.length > 0;
|
|
@@ -56,17 +62,153 @@ var DirectoryTreeComponent = function DirectoryTreeComponent(_ref) {
|
|
|
56
62
|
return s !== "";
|
|
57
63
|
});
|
|
58
64
|
}, []);
|
|
65
|
+
var renderInlineInput = useCallback(function (value) {
|
|
66
|
+
return /*#__PURE__*/_jsx("span", {
|
|
67
|
+
className: styles.treeNodeTitle,
|
|
68
|
+
children: /*#__PURE__*/_jsx(Input, {
|
|
69
|
+
size: "small",
|
|
70
|
+
value: value,
|
|
71
|
+
onChange: function onChange(e) {
|
|
72
|
+
return onEditValueChange === null || onEditValueChange === void 0 ? void 0 : onEditValueChange(e.target.value);
|
|
73
|
+
},
|
|
74
|
+
onBlur: function onBlur() {
|
|
75
|
+
return onEditConfirm === null || onEditConfirm === void 0 ? void 0 : onEditConfirm();
|
|
76
|
+
},
|
|
77
|
+
onPressEnter: function onPressEnter() {
|
|
78
|
+
return onEditConfirm === null || onEditConfirm === void 0 ? void 0 : onEditConfirm();
|
|
79
|
+
},
|
|
80
|
+
onKeyDown: function onKeyDown(e) {
|
|
81
|
+
if (e.key === "Escape") {
|
|
82
|
+
e.stopPropagation();
|
|
83
|
+
onEditCancel === null || onEditCancel === void 0 || onEditCancel();
|
|
84
|
+
}
|
|
85
|
+
},
|
|
86
|
+
autoFocus: true,
|
|
87
|
+
className: styles.inlineInput,
|
|
88
|
+
onClick: function onClick(e) {
|
|
89
|
+
return e.stopPropagation();
|
|
90
|
+
},
|
|
91
|
+
onSelect: function onSelect(e) {
|
|
92
|
+
return e.stopPropagation();
|
|
93
|
+
},
|
|
94
|
+
onFocus: function onFocus(e) {
|
|
95
|
+
return e.stopPropagation();
|
|
96
|
+
}
|
|
97
|
+
})
|
|
98
|
+
});
|
|
99
|
+
}, [onEditValueChange, onEditConfirm, onEditCancel, styles]);
|
|
100
|
+
|
|
101
|
+
// ====== 拖拽模式 ======
|
|
102
|
+
var dragMode = draggable === true ? "file" : draggable || false;
|
|
103
|
+
|
|
104
|
+
// ====== 自定义拖拽 hook ======
|
|
105
|
+
var handleDragDrop = useCallback(function (dragNode, dropNode, dropPosition) {
|
|
106
|
+
var dragNd = dragNode;
|
|
107
|
+
var dropNd = dropNode;
|
|
108
|
+
var originalDragNode = dragNd._originalNode;
|
|
109
|
+
var originalDropNode = dropNd._originalNode;
|
|
110
|
+
if (!originalDragNode) return;
|
|
111
|
+
var dragKey = String(dragNode.key);
|
|
112
|
+
var dropKey = String(dropNode.key);
|
|
113
|
+
var dragFileName = originalDragNode.path;
|
|
114
|
+
var newPath;
|
|
115
|
+
|
|
116
|
+
// 拖到底部 drop zone:放在根级别末尾
|
|
117
|
+
if (!originalDropNode && dropKey === "__bottom_placeholder__") {
|
|
118
|
+
newPath = dragFileName;
|
|
119
|
+
onDrop === null || onDrop === void 0 || onDrop({
|
|
120
|
+
fileName: originalDragNode.title,
|
|
121
|
+
extra: originalDragNode.extra,
|
|
122
|
+
oldPath: dragKey,
|
|
123
|
+
newPath: newPath,
|
|
124
|
+
dragNode: originalDragNode,
|
|
125
|
+
dropNode: {
|
|
126
|
+
title: "",
|
|
127
|
+
path: ""
|
|
128
|
+
}
|
|
129
|
+
});
|
|
130
|
+
return;
|
|
131
|
+
}
|
|
132
|
+
if (!originalDropNode) return;
|
|
133
|
+
if (!dropNode.isLeaf && dropPosition === 0) {
|
|
134
|
+
// 拖入文件夹内部
|
|
135
|
+
newPath = "".concat(dropKey, "/").concat(dragFileName);
|
|
136
|
+
} else {
|
|
137
|
+
// 拖到节点旁边(同级)
|
|
138
|
+
var dropParentPath = dropKey.includes("/") ? dropKey.substring(0, dropKey.lastIndexOf("/")) : "";
|
|
139
|
+
newPath = dropParentPath ? "".concat(dropParentPath, "/").concat(dragFileName) : dragFileName;
|
|
140
|
+
}
|
|
141
|
+
onDrop === null || onDrop === void 0 || onDrop({
|
|
142
|
+
fileName: originalDragNode.title,
|
|
143
|
+
extra: originalDragNode.extra,
|
|
144
|
+
oldPath: dragKey,
|
|
145
|
+
newPath: newPath,
|
|
146
|
+
dragNode: originalDragNode,
|
|
147
|
+
dropNode: originalDropNode
|
|
148
|
+
});
|
|
149
|
+
}, [onDrop]);
|
|
150
|
+
var handleDragEnterExpand = useCallback(function (nodeKey) {
|
|
151
|
+
var isExpanded = expandedKeys === null || expandedKeys === void 0 ? void 0 : expandedKeys.includes(nodeKey);
|
|
152
|
+
if (!isExpanded) {
|
|
153
|
+
onExpand === null || onExpand === void 0 || onExpand([].concat(_toConsumableArray(expandedKeys || []), [nodeKey]), {
|
|
154
|
+
node: null,
|
|
155
|
+
expanded: true,
|
|
156
|
+
nativeEvent: null
|
|
157
|
+
});
|
|
158
|
+
}
|
|
159
|
+
}, [expandedKeys, onExpand]);
|
|
160
|
+
var _useFolderDrag = useFolderDrag({
|
|
161
|
+
dragMode: dragMode,
|
|
162
|
+
onDrop: handleDragDrop,
|
|
163
|
+
onDragEnterExpand: handleDragEnterExpand
|
|
164
|
+
}),
|
|
165
|
+
onDragStart = _useFolderDrag.onDragStart,
|
|
166
|
+
onDragEnd = _useFolderDrag.onDragEnd,
|
|
167
|
+
onItemDragEnter = _useFolderDrag.onItemDragEnter,
|
|
168
|
+
onItemDragOver = _useFolderDrag.onItemDragOver,
|
|
169
|
+
onItemDragLeave = _useFolderDrag.onItemDragLeave,
|
|
170
|
+
onItemDrop = _useFolderDrag.onItemDrop,
|
|
171
|
+
onContainerDragOver = _useFolderDrag.onContainerDragOver,
|
|
172
|
+
onContainerDrop = _useFolderDrag.onContainerDrop,
|
|
173
|
+
canDragNode = _useFolderDrag.canDragNode;
|
|
174
|
+
|
|
175
|
+
// ====== 转换树数据 ======
|
|
176
|
+
// 注意:convertToTreeData 不依赖拖拽状态,拖拽效果通过 DOM 操作实现
|
|
59
177
|
var convertToTreeData = useCallback(function (nodes) {
|
|
60
178
|
var parentSegments = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
|
|
61
|
-
|
|
179
|
+
var parentKey = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : "";
|
|
180
|
+
var result = nodes.map(function (node) {
|
|
62
181
|
var pathSegments = buildPathSegments(node, parentSegments);
|
|
63
182
|
var fullPath = pathSegments.join("/").replace(/^\/+/, "");
|
|
183
|
+
var isEditing = editNode && editNode.key === fullPath;
|
|
184
|
+
var nodeChildren = node.children ? convertToTreeData(node.children, pathSegments, fullPath) : undefined;
|
|
185
|
+
var baseNode = {
|
|
186
|
+
key: fullPath,
|
|
187
|
+
path: fullPath,
|
|
188
|
+
pathSegments: pathSegments,
|
|
189
|
+
icon: getIcon(node),
|
|
190
|
+
isLeaf: !isFolder(node),
|
|
191
|
+
_originalNode: node,
|
|
192
|
+
children: nodeChildren
|
|
193
|
+
};
|
|
194
|
+
|
|
195
|
+
// 编辑态:直接渲染 inline input
|
|
196
|
+
if (isEditing) {
|
|
197
|
+
baseNode.title = renderInlineInput(editNode.currentValue);
|
|
198
|
+
return baseNode;
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
// title 内容(按钮、菜单等)
|
|
64
202
|
var titleContent = /*#__PURE__*/_jsxs("span", {
|
|
65
203
|
className: clsx(styles.treeNodeTitle, moreActions && styles.treeNodeTitleHover),
|
|
66
204
|
children: [/*#__PURE__*/_jsx("span", {
|
|
67
205
|
children: node.title
|
|
68
206
|
}), moreActions && /*#__PURE__*/_jsx(Dropdown, {
|
|
69
|
-
menu: moreActions(node
|
|
207
|
+
menu: moreActions(node, {
|
|
208
|
+
startRename: function startRename() {
|
|
209
|
+
return onStartRename === null || onStartRename === void 0 ? void 0 : onStartRename(fullPath, node);
|
|
210
|
+
}
|
|
211
|
+
}),
|
|
70
212
|
trigger: ["click"],
|
|
71
213
|
placement: "bottomRight",
|
|
72
214
|
children: /*#__PURE__*/_jsx("span", {
|
|
@@ -78,63 +220,74 @@ var DirectoryTreeComponent = function DirectoryTreeComponent(_ref) {
|
|
|
78
220
|
})
|
|
79
221
|
})]
|
|
80
222
|
});
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
223
|
+
|
|
224
|
+
// 启用拖拽时:在 title 外层包裹具有 data-node-key 属性的容器,
|
|
225
|
+
// 用于 DOM 查询和事件绑定。拖拽状态通过 CSS class 控制。
|
|
226
|
+
if (dragMode) {
|
|
227
|
+
var nodeData = baseNode;
|
|
228
|
+
var draggableDiv = canDragNode(nodeData);
|
|
229
|
+
baseNode.title = /*#__PURE__*/_jsx("div", {
|
|
230
|
+
className: clsx(styles.treeNodeWrapper, draggableDiv && styles.dragNodeHandle),
|
|
231
|
+
"data-node-key": fullPath,
|
|
232
|
+
draggable: draggableDiv,
|
|
233
|
+
onDragStart: draggableDiv ? function (e) {
|
|
234
|
+
return onDragStart(e, baseNode);
|
|
235
|
+
} : undefined,
|
|
236
|
+
onDragEnd: draggableDiv ? onDragEnd : undefined,
|
|
237
|
+
onDragEnter: function onDragEnter(e) {
|
|
238
|
+
return onItemDragEnter(e, baseNode);
|
|
239
|
+
},
|
|
240
|
+
onDragOver: function onDragOver(e) {
|
|
241
|
+
return onItemDragOver(e, baseNode);
|
|
242
|
+
},
|
|
243
|
+
onDragLeave: onItemDragLeave,
|
|
244
|
+
onDrop: function onDrop(e) {
|
|
245
|
+
return onItemDrop(e, baseNode);
|
|
246
|
+
},
|
|
247
|
+
children: titleContent
|
|
248
|
+
});
|
|
249
|
+
} else {
|
|
250
|
+
baseNode.title = titleContent;
|
|
251
|
+
}
|
|
252
|
+
return baseNode;
|
|
92
253
|
});
|
|
93
|
-
}, [buildPathSegments, getIcon, moreActions, styles]);
|
|
94
|
-
var treeDataConverted = convertToTreeData(treeData);
|
|
95
254
|
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
255
|
+
// 新建模式:在目标父节点下插入临时节点
|
|
256
|
+
if (createInfo && editNode && editNode.mode === "create") {
|
|
257
|
+
var targetParentKey = createInfo.parentKey;
|
|
258
|
+
if (targetParentKey === parentKey || targetParentKey === "" && parentKey === "" || targetParentKey === "/" && parentKey === "") {
|
|
259
|
+
var tempNode = {
|
|
260
|
+
key: editNode.key,
|
|
261
|
+
title: renderInlineInput(editNode.currentValue),
|
|
262
|
+
icon: createInfo.type === "folder" ? /*#__PURE__*/_jsx(FolderOutlined, {}) : /*#__PURE__*/_jsx(FileOutlined, {}),
|
|
263
|
+
isLeaf: createInfo.type === "file",
|
|
264
|
+
path: editNode.key,
|
|
265
|
+
pathSegments: [editNode.key],
|
|
266
|
+
_originalNode: null,
|
|
267
|
+
_isTempNode: true
|
|
268
|
+
};
|
|
269
|
+
result.push(tempNode);
|
|
270
|
+
}
|
|
104
271
|
}
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
var
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
//
|
|
115
|
-
var
|
|
116
|
-
|
|
117
|
-
//
|
|
118
|
-
var
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
if (!dropNode.isLeaf && info.dropToGap === false) {
|
|
122
|
-
// 拖入文件夹内部
|
|
123
|
-
newPath = "".concat(dropKey, "/").concat(dragFileName);
|
|
124
|
-
} else {
|
|
125
|
-
// 拖到节点旁边(同级)
|
|
126
|
-
var dropParentPath = dropKey.includes("/") ? dropKey.substring(0, dropKey.lastIndexOf("/")) : "";
|
|
127
|
-
newPath = dropParentPath ? "".concat(dropParentPath, "/").concat(dragFileName) : dragFileName;
|
|
272
|
+
return result;
|
|
273
|
+
}, [buildPathSegments, getIcon, moreActions, styles, editNode, renderInlineInput, createInfo, onStartRename, dragMode, canDragNode, onDragStart, onDragEnd, onItemDragEnter, onItemDragOver, onItemDragLeave, onItemDrop]);
|
|
274
|
+
var treeDataConverted = useMemo(function () {
|
|
275
|
+
return convertToTreeData(treeData, [], "");
|
|
276
|
+
}, [treeData, convertToTreeData]);
|
|
277
|
+
var handleSelect = useCallback(function (keys, info) {
|
|
278
|
+
var _info$nativeEvent;
|
|
279
|
+
// 编辑态不响应选中
|
|
280
|
+
if (editNode) return;
|
|
281
|
+
// 临时节点不可选中
|
|
282
|
+
var node = info.node;
|
|
283
|
+
if (node._isTempNode) return;
|
|
284
|
+
// 点击 moreActions 区域不触发选中
|
|
285
|
+
var target = (_info$nativeEvent = info.nativeEvent) === null || _info$nativeEvent === void 0 ? void 0 : _info$nativeEvent.target;
|
|
286
|
+
if (target && (target.closest(".folder-tree-more-icon") || target.closest(".ant-dropdown"))) {
|
|
287
|
+
return;
|
|
128
288
|
}
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
extra: originalDragNode.extra,
|
|
132
|
-
oldPath: dragKey,
|
|
133
|
-
newPath: newPath,
|
|
134
|
-
dragNode: originalDragNode,
|
|
135
|
-
dropNode: originalDropNode
|
|
136
|
-
});
|
|
137
|
-
}, [onDrop]);
|
|
289
|
+
onSelect === null || onSelect === void 0 || onSelect(keys, info);
|
|
290
|
+
}, [onSelect, editNode]);
|
|
138
291
|
var titleNode = directoryTitle === false || directoryTitle === null ? null : typeof directoryTitle === "function" ? directoryTitle() : directoryTitle;
|
|
139
292
|
return /*#__PURE__*/_jsxs("div", {
|
|
140
293
|
className: clsx(styles.directoryPanel, className),
|
|
@@ -146,19 +299,24 @@ var DirectoryTreeComponent = function DirectoryTreeComponent(_ref) {
|
|
|
146
299
|
children: titleNode
|
|
147
300
|
}), /*#__PURE__*/_jsx("div", {
|
|
148
301
|
className: styles.directoryTreeContent,
|
|
302
|
+
onDragOver: dragMode ? onContainerDragOver : undefined,
|
|
303
|
+
onDrop: dragMode ? onContainerDrop : undefined,
|
|
149
304
|
children: /*#__PURE__*/_jsx(AntDirectoryTree, {
|
|
305
|
+
style: {
|
|
306
|
+
"--ant-tree-directory-node-selected-bg": "rgba(0,0,0,0.03)",
|
|
307
|
+
"--ant-tree-directory-node-selected-color": "#1a1c1e"
|
|
308
|
+
},
|
|
150
309
|
treeData: treeDataConverted,
|
|
151
310
|
selectedKeys: selectedKeys,
|
|
152
311
|
expandedKeys: expandedKeys,
|
|
153
|
-
onSelect:
|
|
312
|
+
onSelect: handleSelect,
|
|
154
313
|
onExpand: onExpand,
|
|
155
314
|
multiple: false,
|
|
156
315
|
blockNode: true,
|
|
157
316
|
showLine: showLine,
|
|
158
317
|
switcherIcon: switcherIcon,
|
|
159
318
|
defaultExpandAll: defaultExpandAll,
|
|
160
|
-
draggable:
|
|
161
|
-
onDrop: dragMode ? handleDrop : undefined
|
|
319
|
+
draggable: false
|
|
162
320
|
})
|
|
163
321
|
})]
|
|
164
322
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["React","useCallback","Tree","Dropdown","FileOutlined","FolderOutlined","MoreOutlined","clsx","useStyles","jsx","_jsx","jsxs","_jsxs","AntDirectoryTree","DirectoryTree","DirectoryTreeComponent","_ref","treeData","selectedKeys","expandedKeys","onSelect","onExpand","_ref$showLine","showLine","switcherIcon","_ref$defaultExpandAll","defaultExpandAll","className","directoryIcons","directoryTitle","moreActions","width","draggable","onDrop","styles","isFolder","node","children","length","getIcon","icon","directory","filePath","path","toLowerCase","extension","split","pop","buildPathSegments","parentSegments","arguments","undefined","concat","_toConsumableArray","filter","s","convertToTreeData","nodes","map","pathSegments","fullPath","join","replace","titleContent","treeNodeTitle","treeNodeTitleHover","title","menu","trigger","placement","moreIcon","onClick","e","stopPropagation","_objectSpread","key","isLeaf","_originalNode","treeDataConverted","dragMode","draggableConfig","nodeDraggable","handleDrop","info","dragNode","dropNode","originalDragNode","originalDropNode","dragKey","String","dropKey","dragFileName","newPath","dropToGap","dropParentPath","includes","substring","lastIndexOf","fileName","extra","oldPath","titleNode","directoryPanel","style","directoryTreeContent","multiple","blockNode"],"sources":["../../../../src/components/FolderTree/DirectoryTree.tsx"],"sourcesContent":["import React, { useCallback } from \"react\";\nimport { Tree, Dropdown } from \"antd\";\nimport {\n FileOutlined,\n FolderOutlined,\n MoreOutlined,\n} from \"@ant-design/icons\";\nimport type { TreeProps } from \"antd\";\nimport type { DataNode } from \"antd/es/tree\";\nimport clsx from \"clsx\";\nimport type { FolderTreeData, FolderTreeProps } from \"./types\";\nimport { useStyles } from \"./styles\";\n\nconst { DirectoryTree: AntDirectoryTree } = Tree;\n\nexport interface DirectoryTreeComponentProps {\n treeData: FolderTreeData[];\n directoryIcons?: FolderTreeProps[\"directoryIcons\"];\n selectedKeys?: string[];\n expandedKeys?: string[];\n onSelect?: TreeProps[\"onSelect\"];\n onExpand?: TreeProps[\"onExpand\"];\n showLine?: FolderTreeProps[\"showLine\"];\n switcherIcon?: FolderTreeProps[\"switcherIcon\"];\n defaultExpandAll?: boolean;\n className?: string;\n directoryTitle?: FolderTreeProps[\"directoryTitle\"];\n moreActions?: FolderTreeProps[\"moreActions\"];\n width?: number | string;\n draggable?: FolderTreeProps[\"draggable\"];\n onDrop?: FolderTreeProps[\"onDrop\"];\n}\n\nconst DirectoryTreeComponent: React.FC<DirectoryTreeComponentProps> = ({\n treeData,\n selectedKeys,\n expandedKeys,\n onSelect,\n onExpand,\n showLine = false,\n switcherIcon,\n defaultExpandAll = true,\n className,\n directoryIcons,\n directoryTitle,\n moreActions,\n width,\n draggable,\n onDrop,\n}) => {\n const styles = useStyles();\n\n const isFolder = (node: FolderTreeData): boolean => {\n return !!node.children && node.children.length > 0;\n };\n\n const getIcon = useCallback(\n (node: FolderTreeData) => {\n if (directoryIcons === false || directoryIcons === null) {\n return null;\n }\n if (isFolder(node)) {\n const icon = directoryIcons?.directory;\n if (typeof icon === \"function\") return icon();\n return icon || <FolderOutlined />;\n }\n const filePath = node.path.toLowerCase();\n const extension = filePath.split(\".\").pop();\n if (extension) {\n const icon = directoryIcons?.[extension];\n if (icon) return typeof icon === \"function\" ? icon() : icon;\n }\n return <FileOutlined />;\n },\n [directoryIcons]\n );\n\n const buildPathSegments = useCallback(\n (node: FolderTreeData, parentSegments: string[] = []): string[] => {\n if (node.path === \"/\" && parentSegments.length === 0) {\n return [\"/\"];\n }\n return [...parentSegments, node.path].filter((s) => s !== \"\");\n },\n []\n );\n\n const convertToTreeData = useCallback(\n (nodes: FolderTreeData[], parentSegments: string[] = []): DataNode[] => {\n return nodes.map((node) => {\n const pathSegments = buildPathSegments(node, parentSegments);\n const fullPath = pathSegments.join(\"/\").replace(/^\\/+/, \"\");\n\n const titleContent = (\n <span\n className={clsx(\n styles.treeNodeTitle,\n moreActions && styles.treeNodeTitleHover\n )}\n >\n <span>{node.title}</span>\n {moreActions && (\n <Dropdown\n menu={moreActions(node)}\n trigger={[\"click\"]}\n placement=\"bottomRight\"\n >\n <span\n className={clsx(styles.moreIcon, \"folder-tree-more-icon\")}\n onClick={(e) => e.stopPropagation()}\n >\n <MoreOutlined />\n </span>\n </Dropdown>\n )}\n </span>\n );\n\n return {\n ...node,\n key: fullPath,\n path: fullPath,\n pathSegments,\n title: titleContent,\n icon: getIcon(node),\n isLeaf: !isFolder(node),\n /** 保存原始节点数据用于拖拽回调 */\n _originalNode: node,\n children: node.children\n ? convertToTreeData(node.children, pathSegments)\n : undefined,\n };\n });\n },\n [buildPathSegments, getIcon, moreActions, styles]\n );\n\n const treeDataConverted = convertToTreeData(treeData);\n\n // ====== 拖拽配置 ======\n const dragMode = draggable === true ? \"file\" : draggable || false;\n\n const draggableConfig = dragMode\n ? {\n icon: false,\n nodeDraggable: (node: DataNode) => {\n if (dragMode === \"file\") return !!node.isLeaf;\n if (dragMode === \"folder\") return !node.isLeaf;\n return true; // 'all'\n },\n }\n : false;\n\n const handleDrop: TreeProps[\"onDrop\"] = useCallback(\n (info: Parameters<NonNullable<TreeProps[\"onDrop\"]>>[0]) => {\n if (!onDrop) return;\n\n const dragNode = info.dragNode as DataNode & { _originalNode?: FolderTreeData };\n const dropNode = info.node as DataNode & { _originalNode?: FolderTreeData };\n\n const originalDragNode = dragNode._originalNode;\n const originalDropNode = dropNode._originalNode;\n if (!originalDragNode || !originalDropNode) return;\n\n // dragNode 的原始完整路径\n const dragKey = String(dragNode.key);\n // 计算新路径:如果 drop 到文件夹上(非叶子),新路径为 dropNode路径/dragNode文件名\n // 如果 drop 到文件旁边,新路径为 dropNode 的父路径/dragNode文件名\n const dropKey = String(dropNode.key);\n const dragFileName = originalDragNode.path;\n let newPath: string;\n\n if (!dropNode.isLeaf && info.dropToGap === false) {\n // 拖入文件夹内部\n newPath = `${dropKey}/${dragFileName}`;\n } else {\n // 拖到节点旁边(同级)\n const dropParentPath = dropKey.includes(\"/\")\n ? dropKey.substring(0, dropKey.lastIndexOf(\"/\"))\n : \"\";\n newPath = dropParentPath\n ? `${dropParentPath}/${dragFileName}`\n : dragFileName;\n }\n\n onDrop({\n fileName: originalDragNode.title,\n extra: originalDragNode.extra,\n oldPath: dragKey,\n newPath,\n dragNode: originalDragNode,\n dropNode: originalDropNode,\n });\n },\n [onDrop],\n );\n\n const titleNode =\n directoryTitle === false || directoryTitle === null\n ? null\n : typeof directoryTitle === \"function\"\n ? directoryTitle()\n : directoryTitle;\n\n return (\n <div className={clsx(styles.directoryPanel, className)} style={{ width }}>\n {titleNode && <div className={styles.directoryTitle}>{titleNode}</div>}\n <div className={styles.directoryTreeContent}>\n <AntDirectoryTree\n treeData={treeDataConverted}\n selectedKeys={selectedKeys}\n expandedKeys={expandedKeys}\n onSelect={onSelect}\n onExpand={onExpand}\n multiple={false}\n blockNode\n showLine={showLine as any}\n switcherIcon={switcherIcon}\n defaultExpandAll={defaultExpandAll}\n draggable={draggableConfig}\n onDrop={dragMode ? handleDrop : undefined}\n />\n </div>\n </div>\n );\n};\n\nexport default DirectoryTreeComponent;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"names":["React","useCallback","useMemo","Tree","Dropdown","Input","FileOutlined","FolderOutlined","MoreOutlined","clsx","useStyles","useFolderDrag","jsx","_jsx","jsxs","_jsxs","AntDirectoryTree","DirectoryTree","DirectoryTreeComponent","_ref","treeData","selectedKeys","expandedKeys","onSelect","onExpand","_ref$showLine","showLine","switcherIcon","_ref$defaultExpandAll","defaultExpandAll","className","directoryIcons","directoryTitle","moreActions","width","draggable","onDrop","editNode","onEditValueChange","onEditConfirm","onEditCancel","createInfo","onStartRename","styles","isFolder","node","children","length","getIcon","icon","directory","filePath","path","toLowerCase","extension","split","pop","buildPathSegments","parentSegments","arguments","undefined","concat","_toConsumableArray","filter","s","renderInlineInput","value","treeNodeTitle","size","onChange","e","target","onBlur","onPressEnter","onKeyDown","key","stopPropagation","autoFocus","inlineInput","onClick","onFocus","dragMode","handleDragDrop","dragNode","dropNode","dropPosition","dragNd","dropNd","originalDragNode","_originalNode","originalDropNode","dragKey","String","dropKey","dragFileName","newPath","fileName","title","extra","oldPath","isLeaf","dropParentPath","includes","substring","lastIndexOf","handleDragEnterExpand","nodeKey","isExpanded","expanded","nativeEvent","_useFolderDrag","onDragEnterExpand","onDragStart","onDragEnd","onItemDragEnter","onItemDragOver","onItemDragLeave","onItemDrop","onContainerDragOver","onContainerDrop","canDragNode","convertToTreeData","nodes","parentKey","result","map","pathSegments","fullPath","join","replace","isEditing","nodeChildren","baseNode","currentValue","titleContent","treeNodeTitleHover","menu","startRename","trigger","placement","moreIcon","nodeData","draggableDiv","treeNodeWrapper","dragNodeHandle","onDragEnter","onDragOver","onDragLeave","mode","targetParentKey","tempNode","type","_isTempNode","push","treeDataConverted","handleSelect","keys","info","_info$nativeEvent","closest","titleNode","directoryPanel","style","directoryTreeContent","multiple","blockNode"],"sources":["../../../../src/components/FolderTree/DirectoryTree.tsx"],"sourcesContent":["import React, { useCallback, useMemo } from \"react\";\nimport { Tree, Dropdown, Input } from \"antd\";\nimport { FileOutlined, FolderOutlined, MoreOutlined } from \"@ant-design/icons\";\nimport type { TreeProps } from \"antd\";\nimport type { DataNode } from \"antd/es/tree\";\nimport clsx from \"clsx\";\nimport type {\n FolderTreeData,\n FolderTreeProps,\n EditNodeInfo,\n CreateNodeContext,\n} from \"./types\";\nimport { useStyles } from \"./styles\";\nimport { useFolderDrag, type DropPosition } from \"./useFolderDrag\";\n\nconst { DirectoryTree: AntDirectoryTree } = Tree;\n\nexport interface DirectoryTreeComponentProps {\n treeData: FolderTreeData[];\n directoryIcons?: FolderTreeProps[\"directoryIcons\"];\n selectedKeys?: string[];\n expandedKeys?: string[];\n onSelect?: TreeProps[\"onSelect\"];\n onExpand?: TreeProps[\"onExpand\"];\n showLine?: FolderTreeProps[\"showLine\"];\n switcherIcon?: FolderTreeProps[\"switcherIcon\"];\n defaultExpandAll?: boolean;\n className?: string;\n directoryTitle?: FolderTreeProps[\"directoryTitle\"];\n moreActions?: FolderTreeProps[\"moreActions\"];\n width?: number | string;\n draggable?: FolderTreeProps[\"draggable\"];\n onDrop?: FolderTreeProps[\"onDrop\"];\n /** 当前编辑节点信息 */\n editNode?: EditNodeInfo | null;\n /** 编辑值变化回调 */\n onEditValueChange?: (value: string) => void;\n /** 编辑确认回调 */\n onEditConfirm?: () => void;\n /** 编辑取消回调 */\n onEditCancel?: () => void;\n /** 新建上下文 */\n createInfo?: CreateNodeContext | null;\n /** 开始重命名回调(由父组件注入) */\n onStartRename?: (fullPath: string, node: FolderTreeData) => void;\n}\n\nconst DirectoryTreeComponent: React.FC<DirectoryTreeComponentProps> = ({\n treeData,\n selectedKeys,\n expandedKeys,\n onSelect,\n onExpand,\n showLine = false,\n switcherIcon,\n defaultExpandAll = true,\n className,\n directoryIcons,\n directoryTitle,\n moreActions,\n width,\n draggable,\n onDrop,\n editNode,\n onEditValueChange,\n onEditConfirm,\n onEditCancel,\n createInfo,\n onStartRename,\n}) => {\n const styles = useStyles();\n\n const isFolder = (node: FolderTreeData): boolean => {\n return !!node.children && node.children.length > 0;\n };\n\n const getIcon = useCallback(\n (node: FolderTreeData) => {\n if (directoryIcons === false || directoryIcons === null) {\n return null;\n }\n if (isFolder(node)) {\n const icon = directoryIcons?.directory;\n if (typeof icon === \"function\") return icon();\n return icon || <FolderOutlined />;\n }\n const filePath = node.path.toLowerCase();\n const extension = filePath.split(\".\").pop();\n if (extension) {\n const icon = directoryIcons?.[extension];\n if (icon) return typeof icon === \"function\" ? icon() : icon;\n }\n return <FileOutlined />;\n },\n [directoryIcons],\n );\n\n const buildPathSegments = useCallback(\n (node: FolderTreeData, parentSegments: string[] = []): string[] => {\n if (node.path === \"/\" && parentSegments.length === 0) {\n return [\"/\"];\n }\n return [...parentSegments, node.path].filter((s) => s !== \"\");\n },\n [],\n );\n\n const renderInlineInput = useCallback(\n (value: string) => (\n <span className={styles.treeNodeTitle}>\n <Input\n size=\"small\"\n value={value}\n onChange={(e) => onEditValueChange?.(e.target.value)}\n onBlur={() => onEditConfirm?.()}\n onPressEnter={() => onEditConfirm?.()}\n onKeyDown={(e) => {\n if (e.key === \"Escape\") {\n e.stopPropagation();\n onEditCancel?.();\n }\n }}\n autoFocus\n className={styles.inlineInput}\n onClick={(e) => e.stopPropagation()}\n onSelect={(e) => e.stopPropagation()}\n onFocus={(e) => e.stopPropagation()}\n />\n </span>\n ),\n [onEditValueChange, onEditConfirm, onEditCancel, styles],\n );\n\n // ====== 拖拽模式 ======\n const dragMode = draggable === true ? \"file\" : draggable || false;\n\n // ====== 自定义拖拽 hook ======\n const handleDragDrop = useCallback(\n (dragNode: DataNode, dropNode: DataNode, dropPosition: DropPosition) => {\n const dragNd = dragNode as DataNode & { _originalNode?: FolderTreeData };\n const dropNd = dropNode as DataNode & { _originalNode?: FolderTreeData };\n const originalDragNode = dragNd._originalNode;\n const originalDropNode = dropNd._originalNode;\n if (!originalDragNode) return;\n\n const dragKey = String(dragNode.key);\n const dropKey = String(dropNode.key);\n const dragFileName = originalDragNode.path;\n let newPath: string;\n\n // 拖到底部 drop zone:放在根级别末尾\n if (!originalDropNode && dropKey === \"__bottom_placeholder__\") {\n newPath = dragFileName;\n onDrop?.({\n fileName: originalDragNode.title,\n extra: originalDragNode.extra,\n oldPath: dragKey,\n newPath,\n dragNode: originalDragNode,\n dropNode: { title: \"\", path: \"\" },\n });\n return;\n }\n\n if (!originalDropNode) return;\n\n if (!dropNode.isLeaf && dropPosition === 0) {\n // 拖入文件夹内部\n newPath = `${dropKey}/${dragFileName}`;\n } else {\n // 拖到节点旁边(同级)\n const dropParentPath = dropKey.includes(\"/\")\n ? dropKey.substring(0, dropKey.lastIndexOf(\"/\"))\n : \"\";\n newPath = dropParentPath\n ? `${dropParentPath}/${dragFileName}`\n : dragFileName;\n }\n\n onDrop?.({\n fileName: originalDragNode.title,\n extra: originalDragNode.extra,\n oldPath: dragKey,\n newPath,\n dragNode: originalDragNode,\n dropNode: originalDropNode,\n });\n },\n [onDrop],\n );\n\n const handleDragEnterExpand = useCallback(\n (nodeKey: string) => {\n const isExpanded = expandedKeys?.includes(nodeKey);\n if (!isExpanded) {\n onExpand?.([...(expandedKeys || []), nodeKey], {\n node: null as any,\n expanded: true,\n nativeEvent: null as any,\n });\n }\n },\n [expandedKeys, onExpand],\n );\n\n const { onDragStart, onDragEnd, onItemDragEnter, onItemDragOver, onItemDragLeave, onItemDrop, onContainerDragOver, onContainerDrop, canDragNode } =\n useFolderDrag({\n dragMode,\n onDrop: handleDragDrop,\n onDragEnterExpand: handleDragEnterExpand,\n });\n\n // ====== 转换树数据 ======\n // 注意:convertToTreeData 不依赖拖拽状态,拖拽效果通过 DOM 操作实现\n const convertToTreeData = useCallback(\n (\n nodes: FolderTreeData[],\n parentSegments: string[] = [],\n parentKey: string = \"\",\n ): DataNode[] => {\n const result = nodes.map((node) => {\n const pathSegments = buildPathSegments(node, parentSegments);\n const fullPath = pathSegments.join(\"/\").replace(/^\\/+/, \"\");\n\n const isEditing = editNode && editNode.key === fullPath;\n\n const nodeChildren = node.children\n ? convertToTreeData(node.children, pathSegments, fullPath)\n : undefined;\n\n const baseNode: any = {\n key: fullPath,\n path: fullPath,\n pathSegments,\n icon: getIcon(node),\n isLeaf: !isFolder(node),\n _originalNode: node,\n children: nodeChildren,\n };\n\n // 编辑态:直接渲染 inline input\n if (isEditing) {\n baseNode.title = renderInlineInput(editNode!.currentValue);\n return baseNode;\n }\n\n // title 内容(按钮、菜单等)\n const titleContent = (\n <span\n className={clsx(\n styles.treeNodeTitle,\n moreActions && styles.treeNodeTitleHover,\n )}\n >\n <span>{node.title}</span>\n {moreActions && (\n <Dropdown\n menu={moreActions(node, {\n startRename: () => onStartRename?.(fullPath, node),\n })}\n trigger={[\"click\"]}\n placement=\"bottomRight\"\n >\n <span\n className={clsx(styles.moreIcon, \"folder-tree-more-icon\")}\n onClick={(e) => e.stopPropagation()}\n >\n <MoreOutlined />\n </span>\n </Dropdown>\n )}\n </span>\n );\n\n // 启用拖拽时:在 title 外层包裹具有 data-node-key 属性的容器,\n // 用于 DOM 查询和事件绑定。拖拽状态通过 CSS class 控制。\n if (dragMode) {\n const nodeData = baseNode as DataNode & {\n _isTempNode?: boolean;\n };\n const draggableDiv = canDragNode(nodeData);\n\n baseNode.title = (\n <div\n className={clsx(\n styles.treeNodeWrapper,\n draggableDiv && styles.dragNodeHandle,\n )}\n data-node-key={fullPath}\n draggable={draggableDiv}\n onDragStart={draggableDiv ? (e) => onDragStart(e, baseNode) : undefined}\n onDragEnd={draggableDiv ? onDragEnd : undefined}\n onDragEnter={(e) => onItemDragEnter(e, baseNode)}\n onDragOver={(e) => onItemDragOver(e, baseNode)}\n onDragLeave={onItemDragLeave}\n onDrop={(e) => onItemDrop(e, baseNode)}\n >\n {titleContent}\n </div>\n );\n } else {\n baseNode.title = titleContent;\n }\n\n return baseNode;\n });\n\n // 新建模式:在目标父节点下插入临时节点\n if (createInfo && editNode && editNode.mode === \"create\") {\n const targetParentKey = createInfo.parentKey;\n if (\n targetParentKey === parentKey ||\n (targetParentKey === \"\" && parentKey === \"\") ||\n (targetParentKey === \"/\" && parentKey === \"\")\n ) {\n const tempNode: any = {\n key: editNode.key,\n title: renderInlineInput(editNode.currentValue),\n icon:\n createInfo.type === \"folder\" ? (\n <FolderOutlined />\n ) : (\n <FileOutlined />\n ),\n isLeaf: createInfo.type === \"file\",\n path: editNode.key,\n pathSegments: [editNode.key],\n _originalNode: null,\n _isTempNode: true,\n };\n result.push(tempNode);\n }\n }\n\n return result;\n },\n [\n buildPathSegments,\n getIcon,\n moreActions,\n styles,\n editNode,\n renderInlineInput,\n createInfo,\n onStartRename,\n dragMode,\n canDragNode,\n onDragStart,\n onDragEnd,\n onItemDragEnter,\n onItemDragOver,\n onItemDragLeave,\n onItemDrop,\n ],\n );\n\n const treeDataConverted = useMemo(\n () => convertToTreeData(treeData, [], \"\"),\n [treeData, convertToTreeData],\n );\n\n const handleSelect: TreeProps[\"onSelect\"] = useCallback(\n (keys: any, info: any) => {\n // 编辑态不响应选中\n if (editNode) return;\n // 临时节点不可选中\n const node = info.node as DataNode & { _isTempNode?: boolean };\n if (node._isTempNode) return;\n // 点击 moreActions 区域不触发选中\n const target = info.nativeEvent?.target as HTMLElement | null;\n if (\n target &&\n (target.closest(\".folder-tree-more-icon\") ||\n target.closest(\".ant-dropdown\"))\n ) {\n return;\n }\n onSelect?.(keys, info);\n },\n [onSelect, editNode],\n );\n\n const titleNode =\n directoryTitle === false || directoryTitle === null\n ? null\n : typeof directoryTitle === \"function\"\n ? directoryTitle()\n : directoryTitle;\n\n return (\n <div className={clsx(styles.directoryPanel, className)} style={{ width }}>\n {titleNode && <div className={styles.directoryTitle}>{titleNode}</div>}\n <div className={styles.directoryTreeContent}\n onDragOver={dragMode ? onContainerDragOver : undefined}\n onDrop={dragMode ? onContainerDrop : undefined}\n >\n <AntDirectoryTree\n style={\n {\n \"--ant-tree-directory-node-selected-bg\": \"rgba(0,0,0,0.03)\",\n \"--ant-tree-directory-node-selected-color\": \"#1a1c1e\",\n } as React.CSSProperties\n }\n treeData={treeDataConverted}\n selectedKeys={selectedKeys}\n expandedKeys={expandedKeys}\n onSelect={handleSelect}\n onExpand={onExpand}\n multiple={false}\n blockNode\n showLine={showLine as any}\n switcherIcon={switcherIcon}\n defaultExpandAll={defaultExpandAll}\n draggable={false}\n />\n </div>\n </div>\n );\n};\n\nexport default DirectoryTreeComponent;"],"mappings":";AAAA,OAAOA,KAAK,IAAIC,WAAW,EAAEC,OAAO,QAAQ,OAAO;AACnD,SAASC,IAAI,EAAEC,QAAQ,EAAEC,KAAK,QAAQ,MAAM;AAC5C,SAASC,YAAY,EAAEC,cAAc,EAAEC,YAAY,QAAQ,mBAAmB;AAG9E,OAAOC,IAAI,MAAM,MAAM;AAOvB,SAASC,SAAS;AAClB,SAASC,aAAa;AAA6C,SAAAC,GAAA,IAAAC,IAAA;AAAA,SAAAC,IAAA,IAAAC,KAAA;AAEnE,IAAuBC,gBAAgB,GAAKb,IAAI,CAAxCc,aAAa;AAgCrB,IAAMC,sBAA6D,GAAG,SAAhEA,sBAA6DA,CAAAC,IAAA,EAsB7D;EAAA,IArBJC,QAAQ,GAAAD,IAAA,CAARC,QAAQ;IACRC,YAAY,GAAAF,IAAA,CAAZE,YAAY;IACZC,YAAY,GAAAH,IAAA,CAAZG,YAAY;IACZC,QAAQ,GAAAJ,IAAA,CAARI,QAAQ;IACRC,QAAQ,GAAAL,IAAA,CAARK,QAAQ;IAAAC,aAAA,GAAAN,IAAA,CACRO,QAAQ;IAARA,QAAQ,GAAAD,aAAA,cAAG,KAAK,GAAAA,aAAA;IAChBE,YAAY,GAAAR,IAAA,CAAZQ,YAAY;IAAAC,qBAAA,GAAAT,IAAA,CACZU,gBAAgB;IAAhBA,gBAAgB,GAAAD,qBAAA,cAAG,IAAI,GAAAA,qBAAA;IACvBE,SAAS,GAAAX,IAAA,CAATW,SAAS;IACTC,cAAc,GAAAZ,IAAA,CAAdY,cAAc;IACdC,cAAc,GAAAb,IAAA,CAAda,cAAc;IACdC,WAAW,GAAAd,IAAA,CAAXc,WAAW;IACXC,KAAK,GAAAf,IAAA,CAALe,KAAK;IACLC,SAAS,GAAAhB,IAAA,CAATgB,SAAS;IACTC,MAAM,GAAAjB,IAAA,CAANiB,MAAM;IACNC,QAAQ,GAAAlB,IAAA,CAARkB,QAAQ;IACRC,iBAAiB,GAAAnB,IAAA,CAAjBmB,iBAAiB;IACjBC,aAAa,GAAApB,IAAA,CAAboB,aAAa;IACbC,YAAY,GAAArB,IAAA,CAAZqB,YAAY;IACZC,UAAU,GAAAtB,IAAA,CAAVsB,UAAU;IACVC,aAAa,GAAAvB,IAAA,CAAbuB,aAAa;EAEb,IAAMC,MAAM,GAAGjC,SAAS,CAAC,CAAC;EAE1B,IAAMkC,QAAQ,GAAG,SAAXA,QAAQA,CAAIC,IAAoB,EAAc;IAClD,OAAO,CAAC,CAACA,IAAI,CAACC,QAAQ,IAAID,IAAI,CAACC,QAAQ,CAACC,MAAM,GAAG,CAAC;EACpD,CAAC;EAED,IAAMC,OAAO,GAAG/C,WAAW,CACzB,UAAC4C,IAAoB,EAAK;IACxB,IAAId,cAAc,KAAK,KAAK,IAAIA,cAAc,KAAK,IAAI,EAAE;MACvD,OAAO,IAAI;IACb;IACA,IAAIa,QAAQ,CAACC,IAAI,CAAC,EAAE;MAClB,IAAMI,IAAI,GAAGlB,cAAc,aAAdA,cAAc,uBAAdA,cAAc,CAAEmB,SAAS;MACtC,IAAI,OAAOD,IAAI,KAAK,UAAU,EAAE,OAAOA,IAAI,CAAC,CAAC;MAC7C,OAAOA,IAAI,iBAAIpC,IAAA,CAACN,cAAc,IAAE,CAAC;IACnC;IACA,IAAM4C,QAAQ,GAAGN,IAAI,CAACO,IAAI,CAACC,WAAW,CAAC,CAAC;IACxC,IAAMC,SAAS,GAAGH,QAAQ,CAACI,KAAK,CAAC,GAAG,CAAC,CAACC,GAAG,CAAC,CAAC;IAC3C,IAAIF,SAAS,EAAE;MACb,IAAML,KAAI,GAAGlB,cAAc,aAAdA,cAAc,uBAAdA,cAAc,CAAGuB,SAAS,CAAC;MACxC,IAAIL,KAAI,EAAE,OAAO,OAAOA,KAAI,KAAK,UAAU,GAAGA,KAAI,CAAC,CAAC,GAAGA,KAAI;IAC7D;IACA,oBAAOpC,IAAA,CAACP,YAAY,IAAE,CAAC;EACzB,CAAC,EACD,CAACyB,cAAc,CACjB,CAAC;EAED,IAAM0B,iBAAiB,GAAGxD,WAAW,CACnC,UAAC4C,IAAoB,EAA8C;IAAA,IAA5Ca,cAAwB,GAAAC,SAAA,CAAAZ,MAAA,QAAAY,SAAA,QAAAC,SAAA,GAAAD,SAAA,MAAG,EAAE;IAClD,IAAId,IAAI,CAACO,IAAI,KAAK,GAAG,IAAIM,cAAc,CAACX,MAAM,KAAK,CAAC,EAAE;MACpD,OAAO,CAAC,GAAG,CAAC;IACd;IACA,OAAO,GAAAc,MAAA,CAAAC,kBAAA,CAAIJ,cAAc,IAAEb,IAAI,CAACO,IAAI,GAAEW,MAAM,CAAC,UAACC,CAAC;MAAA,OAAKA,CAAC,KAAK,EAAE;IAAA,EAAC;EAC/D,CAAC,EACD,EACF,CAAC;EAED,IAAMC,iBAAiB,GAAGhE,WAAW,CACnC,UAACiE,KAAa;IAAA,oBACZrD,IAAA;MAAMiB,SAAS,EAAEa,MAAM,CAACwB,aAAc;MAAArB,QAAA,eACpCjC,IAAA,CAACR,KAAK;QACJ+D,IAAI,EAAC,OAAO;QACZF,KAAK,EAAEA,KAAM;QACbG,QAAQ,EAAE,SAAAA,SAACC,CAAC;UAAA,OAAKhC,iBAAiB,aAAjBA,iBAAiB,uBAAjBA,iBAAiB,CAAGgC,CAAC,CAACC,MAAM,CAACL,KAAK,CAAC;QAAA,CAAC;QACrDM,MAAM,EAAE,SAAAA,OAAA;UAAA,OAAMjC,aAAa,aAAbA,aAAa,uBAAbA,aAAa,CAAG,CAAC;QAAA,CAAC;QAChCkC,YAAY,EAAE,SAAAA,aAAA;UAAA,OAAMlC,aAAa,aAAbA,aAAa,uBAAbA,aAAa,CAAG,CAAC;QAAA,CAAC;QACtCmC,SAAS,EAAE,SAAAA,UAACJ,CAAC,EAAK;UAChB,IAAIA,CAAC,CAACK,GAAG,KAAK,QAAQ,EAAE;YACtBL,CAAC,CAACM,eAAe,CAAC,CAAC;YACnBpC,YAAY,aAAZA,YAAY,eAAZA,YAAY,CAAG,CAAC;UAClB;QACF,CAAE;QACFqC,SAAS;QACT/C,SAAS,EAAEa,MAAM,CAACmC,WAAY;QAC9BC,OAAO,EAAE,SAAAA,QAACT,CAAC;UAAA,OAAKA,CAAC,CAACM,eAAe,CAAC,CAAC;QAAA,CAAC;QACpCrD,QAAQ,EAAE,SAAAA,SAAC+C,CAAC;UAAA,OAAKA,CAAC,CAACM,eAAe,CAAC,CAAC;QAAA,CAAC;QACrCI,OAAO,EAAE,SAAAA,QAACV,CAAC;UAAA,OAAKA,CAAC,CAACM,eAAe,CAAC,CAAC;QAAA;MAAC,CACrC;IAAC,CACE,CAAC;EAAA,CACR,EACD,CAACtC,iBAAiB,EAAEC,aAAa,EAAEC,YAAY,EAAEG,MAAM,CACzD,CAAC;;EAED;EACA,IAAMsC,QAAQ,GAAG9C,SAAS,KAAK,IAAI,GAAG,MAAM,GAAGA,SAAS,IAAI,KAAK;;EAEjE;EACA,IAAM+C,cAAc,GAAGjF,WAAW,CAChC,UAACkF,QAAkB,EAAEC,QAAkB,EAAEC,YAA0B,EAAK;IACtE,IAAMC,MAAM,GAAGH,QAAyD;IACxE,IAAMI,MAAM,GAAGH,QAAyD;IACxE,IAAMI,gBAAgB,GAAGF,MAAM,CAACG,aAAa;IAC7C,IAAMC,gBAAgB,GAAGH,MAAM,CAACE,aAAa;IAC7C,IAAI,CAACD,gBAAgB,EAAE;IAEvB,IAAMG,OAAO,GAAGC,MAAM,CAACT,QAAQ,CAACR,GAAG,CAAC;IACpC,IAAMkB,OAAO,GAAGD,MAAM,CAACR,QAAQ,CAACT,GAAG,CAAC;IACpC,IAAMmB,YAAY,GAAGN,gBAAgB,CAACpC,IAAI;IAC1C,IAAI2C,OAAe;;IAEnB;IACA,IAAI,CAACL,gBAAgB,IAAIG,OAAO,KAAK,wBAAwB,EAAE;MAC7DE,OAAO,GAAGD,YAAY;MACtB1D,MAAM,aAANA,MAAM,eAANA,MAAM,CAAG;QACP4D,QAAQ,EAAER,gBAAgB,CAACS,KAAK;QAChCC,KAAK,EAAEV,gBAAgB,CAACU,KAAK;QAC7BC,OAAO,EAAER,OAAO;QAChBI,OAAO,EAAPA,OAAO;QACPZ,QAAQ,EAAEK,gBAAgB;QAC1BJ,QAAQ,EAAE;UAAEa,KAAK,EAAE,EAAE;UAAE7C,IAAI,EAAE;QAAG;MAClC,CAAC,CAAC;MACF;IACF;IAEA,IAAI,CAACsC,gBAAgB,EAAE;IAEvB,IAAI,CAACN,QAAQ,CAACgB,MAAM,IAAIf,YAAY,KAAK,CAAC,EAAE;MAC1C;MACAU,OAAO,MAAAlC,MAAA,CAAMgC,OAAO,OAAAhC,MAAA,CAAIiC,YAAY,CAAE;IACxC,CAAC,MAAM;MACL;MACA,IAAMO,cAAc,GAAGR,OAAO,CAACS,QAAQ,CAAC,GAAG,CAAC,GACxCT,OAAO,CAACU,SAAS,CAAC,CAAC,EAAEV,OAAO,CAACW,WAAW,CAAC,GAAG,CAAC,CAAC,GAC9C,EAAE;MACNT,OAAO,GAAGM,cAAc,MAAAxC,MAAA,CACjBwC,cAAc,OAAAxC,MAAA,CAAIiC,YAAY,IACjCA,YAAY;IAClB;IAEA1D,MAAM,aAANA,MAAM,eAANA,MAAM,CAAG;MACP4D,QAAQ,EAAER,gBAAgB,CAACS,KAAK;MAChCC,KAAK,EAAEV,gBAAgB,CAACU,KAAK;MAC7BC,OAAO,EAAER,OAAO;MAChBI,OAAO,EAAPA,OAAO;MACPZ,QAAQ,EAAEK,gBAAgB;MAC1BJ,QAAQ,EAAEM;IACZ,CAAC,CAAC;EACJ,CAAC,EACD,CAACtD,MAAM,CACT,CAAC;EAED,IAAMqE,qBAAqB,GAAGxG,WAAW,CACvC,UAACyG,OAAe,EAAK;IACnB,IAAMC,UAAU,GAAGrF,YAAY,aAAZA,YAAY,uBAAZA,YAAY,CAAEgF,QAAQ,CAACI,OAAO,CAAC;IAClD,IAAI,CAACC,UAAU,EAAE;MACfnF,QAAQ,aAARA,QAAQ,eAARA,QAAQ,IAAAqC,MAAA,CAAAC,kBAAA,CAAQxC,YAAY,IAAI,EAAE,IAAGoF,OAAO,IAAG;QAC7C7D,IAAI,EAAE,IAAW;QACjB+D,QAAQ,EAAE,IAAI;QACdC,WAAW,EAAE;MACf,CAAC,CAAC;IACJ;EACF,CAAC,EACD,CAACvF,YAAY,EAAEE,QAAQ,CACzB,CAAC;EAED,IAAAsF,cAAA,GACEnG,aAAa,CAAC;MACZsE,QAAQ,EAARA,QAAQ;MACR7C,MAAM,EAAE8C,cAAc;MACtB6B,iBAAiB,EAAEN;IACrB,CAAC,CAAC;IALIO,WAAW,GAAAF,cAAA,CAAXE,WAAW;IAAEC,SAAS,GAAAH,cAAA,CAATG,SAAS;IAAEC,eAAe,GAAAJ,cAAA,CAAfI,eAAe;IAAEC,cAAc,GAAAL,cAAA,CAAdK,cAAc;IAAEC,eAAe,GAAAN,cAAA,CAAfM,eAAe;IAAEC,UAAU,GAAAP,cAAA,CAAVO,UAAU;IAAEC,mBAAmB,GAAAR,cAAA,CAAnBQ,mBAAmB;IAAEC,eAAe,GAAAT,cAAA,CAAfS,eAAe;IAAEC,WAAW,GAAAV,cAAA,CAAXU,WAAW;;EAO/I;EACA;EACA,IAAMC,iBAAiB,GAAGxH,WAAW,CACnC,UACEyH,KAAuB,EAGR;IAAA,IAFfhE,cAAwB,GAAAC,SAAA,CAAAZ,MAAA,QAAAY,SAAA,QAAAC,SAAA,GAAAD,SAAA,MAAG,EAAE;IAAA,IAC7BgE,SAAiB,GAAAhE,SAAA,CAAAZ,MAAA,QAAAY,SAAA,QAAAC,SAAA,GAAAD,SAAA,MAAG,EAAE;IAEtB,IAAMiE,MAAM,GAAGF,KAAK,CAACG,GAAG,CAAC,UAAChF,IAAI,EAAK;MACjC,IAAMiF,YAAY,GAAGrE,iBAAiB,CAACZ,IAAI,EAAEa,cAAc,CAAC;MAC5D,IAAMqE,QAAQ,GAAGD,YAAY,CAACE,IAAI,CAAC,GAAG,CAAC,CAACC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;MAE3D,IAAMC,SAAS,GAAG7F,QAAQ,IAAIA,QAAQ,CAACsC,GAAG,KAAKoD,QAAQ;MAEvD,IAAMI,YAAY,GAAGtF,IAAI,CAACC,QAAQ,GAC9B2E,iBAAiB,CAAC5E,IAAI,CAACC,QAAQ,EAAEgF,YAAY,EAAEC,QAAQ,CAAC,GACxDnE,SAAS;MAEb,IAAMwE,QAAa,GAAG;QACpBzD,GAAG,EAAEoD,QAAQ;QACb3E,IAAI,EAAE2E,QAAQ;QACdD,YAAY,EAAZA,YAAY;QACZ7E,IAAI,EAAED,OAAO,CAACH,IAAI,CAAC;QACnBuD,MAAM,EAAE,CAACxD,QAAQ,CAACC,IAAI,CAAC;QACvB4C,aAAa,EAAE5C,IAAI;QACnBC,QAAQ,EAAEqF;MACZ,CAAC;;MAED;MACA,IAAID,SAAS,EAAE;QACbE,QAAQ,CAACnC,KAAK,GAAGhC,iBAAiB,CAAC5B,QAAQ,CAAEgG,YAAY,CAAC;QAC1D,OAAOD,QAAQ;MACjB;;MAEA;MACA,IAAME,YAAY,gBAChBvH,KAAA;QACEe,SAAS,EAAErB,IAAI,CACbkC,MAAM,CAACwB,aAAa,EACpBlC,WAAW,IAAIU,MAAM,CAAC4F,kBACxB,CAAE;QAAAzF,QAAA,gBAEFjC,IAAA;UAAAiC,QAAA,EAAOD,IAAI,CAACoD;QAAK,CAAO,CAAC,EACxBhE,WAAW,iBACVpB,IAAA,CAACT,QAAQ;UACPoI,IAAI,EAAEvG,WAAW,CAACY,IAAI,EAAE;YACtB4F,WAAW,EAAE,SAAAA,YAAA;cAAA,OAAM/F,aAAa,aAAbA,aAAa,uBAAbA,aAAa,CAAGqF,QAAQ,EAAElF,IAAI,CAAC;YAAA;UACpD,CAAC,CAAE;UACH6F,OAAO,EAAE,CAAC,OAAO,CAAE;UACnBC,SAAS,EAAC,aAAa;UAAA7F,QAAA,eAEvBjC,IAAA;YACEiB,SAAS,EAAErB,IAAI,CAACkC,MAAM,CAACiG,QAAQ,EAAE,uBAAuB,CAAE;YAC1D7D,OAAO,EAAE,SAAAA,QAACT,CAAC;cAAA,OAAKA,CAAC,CAACM,eAAe,CAAC,CAAC;YAAA,CAAC;YAAA9B,QAAA,eAEpCjC,IAAA,CAACL,YAAY,IAAE;UAAC,CACZ;QAAC,CACC,CACX;MAAA,CACG,CACP;;MAED;MACA;MACA,IAAIyE,QAAQ,EAAE;QACZ,IAAM4D,QAAQ,GAAGT,QAEhB;QACD,IAAMU,YAAY,GAAGtB,WAAW,CAACqB,QAAQ,CAAC;QAE1CT,QAAQ,CAACnC,KAAK,gBACZpF,IAAA;UACEiB,SAAS,EAAErB,IAAI,CACbkC,MAAM,CAACoG,eAAe,EACtBD,YAAY,IAAInG,MAAM,CAACqG,cACzB,CAAE;UACF,iBAAejB,QAAS;UACxB5F,SAAS,EAAE2G,YAAa;UACxB9B,WAAW,EAAE8B,YAAY,GAAG,UAACxE,CAAC;YAAA,OAAK0C,WAAW,CAAC1C,CAAC,EAAE8D,QAAQ,CAAC;UAAA,IAAGxE,SAAU;UACxEqD,SAAS,EAAE6B,YAAY,GAAG7B,SAAS,GAAGrD,SAAU;UAChDqF,WAAW,EAAE,SAAAA,YAAC3E,CAAC;YAAA,OAAK4C,eAAe,CAAC5C,CAAC,EAAE8D,QAAQ,CAAC;UAAA,CAAC;UACjDc,UAAU,EAAE,SAAAA,WAAC5E,CAAC;YAAA,OAAK6C,cAAc,CAAC7C,CAAC,EAAE8D,QAAQ,CAAC;UAAA,CAAC;UAC/Ce,WAAW,EAAE/B,eAAgB;UAC7BhF,MAAM,EAAE,SAAAA,OAACkC,CAAC;YAAA,OAAK+C,UAAU,CAAC/C,CAAC,EAAE8D,QAAQ,CAAC;UAAA,CAAC;UAAAtF,QAAA,EAEtCwF;QAAY,CACV,CACN;MACH,CAAC,MAAM;QACLF,QAAQ,CAACnC,KAAK,GAAGqC,YAAY;MAC/B;MAEA,OAAOF,QAAQ;IACjB,CAAC,CAAC;;IAEF;IACA,IAAI3F,UAAU,IAAIJ,QAAQ,IAAIA,QAAQ,CAAC+G,IAAI,KAAK,QAAQ,EAAE;MACxD,IAAMC,eAAe,GAAG5G,UAAU,CAACkF,SAAS;MAC5C,IACE0B,eAAe,KAAK1B,SAAS,IAC5B0B,eAAe,KAAK,EAAE,IAAI1B,SAAS,KAAK,EAAG,IAC3C0B,eAAe,KAAK,GAAG,IAAI1B,SAAS,KAAK,EAAG,EAC7C;QACA,IAAM2B,QAAa,GAAG;UACpB3E,GAAG,EAAEtC,QAAQ,CAACsC,GAAG;UACjBsB,KAAK,EAAEhC,iBAAiB,CAAC5B,QAAQ,CAACgG,YAAY,CAAC;UAC/CpF,IAAI,EACFR,UAAU,CAAC8G,IAAI,KAAK,QAAQ,gBAC1B1I,IAAA,CAACN,cAAc,IAAE,CAAC,gBAElBM,IAAA,CAACP,YAAY,IAAE,CAChB;UACH8F,MAAM,EAAE3D,UAAU,CAAC8G,IAAI,KAAK,MAAM;UAClCnG,IAAI,EAAEf,QAAQ,CAACsC,GAAG;UAClBmD,YAAY,EAAE,CAACzF,QAAQ,CAACsC,GAAG,CAAC;UAC5Bc,aAAa,EAAE,IAAI;UACnB+D,WAAW,EAAE;QACf,CAAC;QACD5B,MAAM,CAAC6B,IAAI,CAACH,QAAQ,CAAC;MACvB;IACF;IAEA,OAAO1B,MAAM;EACf,CAAC,EACD,CACEnE,iBAAiB,EACjBT,OAAO,EACPf,WAAW,EACXU,MAAM,EACNN,QAAQ,EACR4B,iBAAiB,EACjBxB,UAAU,EACVC,aAAa,EACbuC,QAAQ,EACRuC,WAAW,EACXR,WAAW,EACXC,SAAS,EACTC,eAAe,EACfC,cAAc,EACdC,eAAe,EACfC,UAAU,CAEd,CAAC;EAED,IAAMqC,iBAAiB,GAAGxJ,OAAO,CAC/B;IAAA,OAAMuH,iBAAiB,CAACrG,QAAQ,EAAE,EAAE,EAAE,EAAE,CAAC;EAAA,GACzC,CAACA,QAAQ,EAAEqG,iBAAiB,CAC9B,CAAC;EAED,IAAMkC,YAAmC,GAAG1J,WAAW,CACrD,UAAC2J,IAAS,EAAEC,IAAS,EAAK;IAAA,IAAAC,iBAAA;IACxB;IACA,IAAIzH,QAAQ,EAAE;IACd;IACA,IAAMQ,IAAI,GAAGgH,IAAI,CAAChH,IAA4C;IAC9D,IAAIA,IAAI,CAAC2G,WAAW,EAAE;IACtB;IACA,IAAMjF,MAAM,IAAAuF,iBAAA,GAAGD,IAAI,CAAChD,WAAW,cAAAiD,iBAAA,uBAAhBA,iBAAA,CAAkBvF,MAA4B;IAC7D,IACEA,MAAM,KACLA,MAAM,CAACwF,OAAO,CAAC,wBAAwB,CAAC,IACvCxF,MAAM,CAACwF,OAAO,CAAC,eAAe,CAAC,CAAC,EAClC;MACA;IACF;IACAxI,QAAQ,aAARA,QAAQ,eAARA,QAAQ,CAAGqI,IAAI,EAAEC,IAAI,CAAC;EACxB,CAAC,EACD,CAACtI,QAAQ,EAAEc,QAAQ,CACrB,CAAC;EAED,IAAM2H,SAAS,GACbhI,cAAc,KAAK,KAAK,IAAIA,cAAc,KAAK,IAAI,GAC/C,IAAI,GACJ,OAAOA,cAAc,KAAK,UAAU,GAClCA,cAAc,CAAC,CAAC,GAChBA,cAAc;EAEtB,oBACEjB,KAAA;IAAKe,SAAS,EAAErB,IAAI,CAACkC,MAAM,CAACsH,cAAc,EAAEnI,SAAS,CAAE;IAACoI,KAAK,EAAE;MAAEhI,KAAK,EAALA;IAAM,CAAE;IAAAY,QAAA,GACtEkH,SAAS,iBAAInJ,IAAA;MAAKiB,SAAS,EAAEa,MAAM,CAACX,cAAe;MAAAc,QAAA,EAAEkH;IAAS,CAAM,CAAC,eACtEnJ,IAAA;MAAKiB,SAAS,EAAEa,MAAM,CAACwH,oBAAqB;MAC1CjB,UAAU,EAAEjE,QAAQ,GAAGqC,mBAAmB,GAAG1D,SAAU;MACvDxB,MAAM,EAAE6C,QAAQ,GAAGsC,eAAe,GAAG3D,SAAU;MAAAd,QAAA,eAE/CjC,IAAA,CAACG,gBAAgB;QACfkJ,KAAK,EACH;UACE,uCAAuC,EAAE,kBAAkB;UAC3D,0CAA0C,EAAE;QAC9C,CACD;QACD9I,QAAQ,EAAEsI,iBAAkB;QAC5BrI,YAAY,EAAEA,YAAa;QAC3BC,YAAY,EAAEA,YAAa;QAC3BC,QAAQ,EAAEoI,YAAa;QACvBnI,QAAQ,EAAEA,QAAS;QACnB4I,QAAQ,EAAE,KAAM;QAChBC,SAAS;QACT3I,QAAQ,EAAEA,QAAgB;QAC1BC,YAAY,EAAEA,YAAa;QAC3BE,gBAAgB,EAAEA,gBAAiB;QACnCM,SAAS,EAAE;MAAM,CAClB;IAAC,CACG,CAAC;EAAA,CACL,CAAC;AAEV,CAAC;AAED,eAAejB,sBAAsB"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import React from "react";
|
|
2
|
-
import type { FolderTreeProps } from "./types";
|
|
3
|
-
export type { FolderTreeData, FolderTreeProps, FileContentService, } from "./types";
|
|
4
|
-
declare const FolderTree: React.
|
|
2
|
+
import type { FolderTreeProps, FolderTreeRef } from "./types";
|
|
3
|
+
export type { FolderTreeData, FolderTreeProps, FileContentService, FolderTreeRef, } from "./types";
|
|
4
|
+
declare const FolderTree: React.ForwardRefExoticComponent<FolderTreeProps & React.RefAttributes<FolderTreeRef>>;
|
|
5
5
|
export default FolderTree;
|