@ai-group/chat-sdk 3.5.7 → 3.5.10
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.js +149 -83
- package/dist/cjs/components/FolderTree/DirectoryTree.js.map +2 -2
- package/dist/cjs/components/FolderTree/index.js +36 -17
- package/dist/cjs/components/FolderTree/index.js.map +2 -2
- package/dist/cjs/components/FolderTree/styles.d.ts +4 -0
- package/dist/cjs/components/FolderTree/styles.js +63 -11
- package/dist/cjs/components/FolderTree/styles.js.map +2 -2
- 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/esm/components/FolderTree/DirectoryTree.js +144 -67
- package/dist/esm/components/FolderTree/DirectoryTree.js.map +1 -1
- package/dist/esm/components/FolderTree/index.js +40 -15
- package/dist/esm/components/FolderTree/index.js.map +1 -1
- package/dist/esm/components/FolderTree/styles.d.ts +4 -0
- package/dist/esm/components/FolderTree/styles.js +17 -13
- package/dist/esm/components/FolderTree/styles.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/package.json +1 -1
|
@@ -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";
|
|
2
|
+
import React, { useCallback, useMemo } from "react";
|
|
4
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;
|
|
@@ -90,10 +90,90 @@ var DirectoryTreeComponent = function DirectoryTreeComponent(_ref) {
|
|
|
90
90
|
},
|
|
91
91
|
onSelect: function onSelect(e) {
|
|
92
92
|
return e.stopPropagation();
|
|
93
|
+
},
|
|
94
|
+
onFocus: function onFocus(e) {
|
|
95
|
+
return e.stopPropagation();
|
|
93
96
|
}
|
|
94
97
|
})
|
|
95
98
|
});
|
|
96
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 操作实现
|
|
97
177
|
var convertToTreeData = useCallback(function (nodes) {
|
|
98
178
|
var parentSegments = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
|
|
99
179
|
var parentKey = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : "";
|
|
@@ -101,7 +181,25 @@ var DirectoryTreeComponent = function DirectoryTreeComponent(_ref) {
|
|
|
101
181
|
var pathSegments = buildPathSegments(node, parentSegments);
|
|
102
182
|
var fullPath = pathSegments.join("/").replace(/^\/+/, "");
|
|
103
183
|
var isEditing = editNode && editNode.key === fullPath;
|
|
104
|
-
var
|
|
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 内容(按钮、菜单等)
|
|
202
|
+
var titleContent = /*#__PURE__*/_jsxs("span", {
|
|
105
203
|
className: clsx(styles.treeNodeTitle, moreActions && styles.treeNodeTitleHover),
|
|
106
204
|
children: [/*#__PURE__*/_jsx("span", {
|
|
107
205
|
children: node.title
|
|
@@ -122,24 +220,41 @@ var DirectoryTreeComponent = function DirectoryTreeComponent(_ref) {
|
|
|
122
220
|
})
|
|
123
221
|
})]
|
|
124
222
|
});
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
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;
|
|
137
253
|
});
|
|
138
254
|
|
|
139
255
|
// 新建模式:在目标父节点下插入临时节点
|
|
140
256
|
if (createInfo && editNode && editNode.mode === "create") {
|
|
141
257
|
var targetParentKey = createInfo.parentKey;
|
|
142
|
-
// 匹配当前层级的父节点 key
|
|
143
258
|
if (targetParentKey === parentKey || targetParentKey === "" && parentKey === "" || targetParentKey === "/" && parentKey === "") {
|
|
144
259
|
var tempNode = {
|
|
145
260
|
key: editNode.key,
|
|
@@ -149,69 +264,30 @@ var DirectoryTreeComponent = function DirectoryTreeComponent(_ref) {
|
|
|
149
264
|
path: editNode.key,
|
|
150
265
|
pathSegments: [editNode.key],
|
|
151
266
|
_originalNode: null,
|
|
152
|
-
/** 标记为临时节点 */
|
|
153
267
|
_isTempNode: true
|
|
154
268
|
};
|
|
155
269
|
result.push(tempNode);
|
|
156
270
|
}
|
|
157
271
|
}
|
|
158
272
|
return result;
|
|
159
|
-
}, [buildPathSegments, getIcon, moreActions, styles, editNode, renderInlineInput,
|
|
160
|
-
var treeDataConverted =
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
var dragMode = draggable === true ? "file" : draggable || false;
|
|
164
|
-
var draggableConfig = dragMode ? {
|
|
165
|
-
icon: false,
|
|
166
|
-
nodeDraggable: function nodeDraggable(node) {
|
|
167
|
-
var nd = node;
|
|
168
|
-
// 临时新建节点不可拖拽
|
|
169
|
-
if (nd._isTempNode) return false;
|
|
170
|
-
if (dragMode === "file") return !!node.isLeaf;
|
|
171
|
-
if (dragMode === "folder") return !node.isLeaf;
|
|
172
|
-
return true; // 'all'
|
|
173
|
-
}
|
|
174
|
-
} : false;
|
|
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]);
|
|
175
277
|
var handleSelect = useCallback(function (keys, info) {
|
|
278
|
+
var _info$nativeEvent;
|
|
176
279
|
// 编辑态不响应选中
|
|
177
280
|
if (editNode) return;
|
|
178
281
|
// 临时节点不可选中
|
|
179
282
|
var node = info.node;
|
|
180
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;
|
|
288
|
+
}
|
|
181
289
|
onSelect === null || onSelect === void 0 || onSelect(keys, info);
|
|
182
290
|
}, [onSelect, editNode]);
|
|
183
|
-
var handleDrop = useCallback(function (info) {
|
|
184
|
-
if (!onDrop) return;
|
|
185
|
-
var dragNode = info.dragNode;
|
|
186
|
-
var dropNode = info.node;
|
|
187
|
-
var originalDragNode = dragNode._originalNode;
|
|
188
|
-
var originalDropNode = dropNode._originalNode;
|
|
189
|
-
if (!originalDragNode || !originalDropNode) return;
|
|
190
|
-
|
|
191
|
-
// dragNode 的原始完整路径
|
|
192
|
-
var dragKey = String(dragNode.key);
|
|
193
|
-
// 计算新路径:如果 drop 到文件夹上(非叶子),新路径为 dropNode路径/dragNode文件名
|
|
194
|
-
// 如果 drop 到文件旁边,新路径为 dropNode 的父路径/dragNode文件名
|
|
195
|
-
var dropKey = String(dropNode.key);
|
|
196
|
-
var dragFileName = originalDragNode.path;
|
|
197
|
-
var newPath;
|
|
198
|
-
if (!dropNode.isLeaf && info.dropToGap === false) {
|
|
199
|
-
// 拖入文件夹内部
|
|
200
|
-
newPath = "".concat(dropKey, "/").concat(dragFileName);
|
|
201
|
-
} else {
|
|
202
|
-
// 拖到节点旁边(同级)
|
|
203
|
-
var dropParentPath = dropKey.includes("/") ? dropKey.substring(0, dropKey.lastIndexOf("/")) : "";
|
|
204
|
-
newPath = dropParentPath ? "".concat(dropParentPath, "/").concat(dragFileName) : dragFileName;
|
|
205
|
-
}
|
|
206
|
-
onDrop({
|
|
207
|
-
fileName: originalDragNode.title,
|
|
208
|
-
extra: originalDragNode.extra,
|
|
209
|
-
oldPath: dragKey,
|
|
210
|
-
newPath: newPath,
|
|
211
|
-
dragNode: originalDragNode,
|
|
212
|
-
dropNode: originalDropNode
|
|
213
|
-
});
|
|
214
|
-
}, [onDrop]);
|
|
215
291
|
var titleNode = directoryTitle === false || directoryTitle === null ? null : typeof directoryTitle === "function" ? directoryTitle() : directoryTitle;
|
|
216
292
|
return /*#__PURE__*/_jsxs("div", {
|
|
217
293
|
className: clsx(styles.directoryPanel, className),
|
|
@@ -223,6 +299,8 @@ var DirectoryTreeComponent = function DirectoryTreeComponent(_ref) {
|
|
|
223
299
|
children: titleNode
|
|
224
300
|
}), /*#__PURE__*/_jsx("div", {
|
|
225
301
|
className: styles.directoryTreeContent,
|
|
302
|
+
onDragOver: dragMode ? onContainerDragOver : undefined,
|
|
303
|
+
onDrop: dragMode ? onContainerDrop : undefined,
|
|
226
304
|
children: /*#__PURE__*/_jsx(AntDirectoryTree, {
|
|
227
305
|
style: {
|
|
228
306
|
"--ant-tree-directory-node-selected-bg": "rgba(0,0,0,0.03)",
|
|
@@ -238,8 +316,7 @@ var DirectoryTreeComponent = function DirectoryTreeComponent(_ref) {
|
|
|
238
316
|
showLine: showLine,
|
|
239
317
|
switcherIcon: switcherIcon,
|
|
240
318
|
defaultExpandAll: defaultExpandAll,
|
|
241
|
-
draggable:
|
|
242
|
-
onDrop: dragMode ? handleDrop : undefined
|
|
319
|
+
draggable: false
|
|
243
320
|
})
|
|
244
321
|
})]
|
|
245
322
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["React","useCallback","Tree","Dropdown","Input","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","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","convertToTreeData","nodes","parentKey","result","map","pathSegments","fullPath","join","replace","isEditing","titleContent","currentValue","treeNodeTitleHover","title","menu","startRename","trigger","placement","moreIcon","nodeChildren","_objectSpread","isLeaf","_originalNode","mode","targetParentKey","tempNode","type","_isTempNode","push","treeDataConverted","dragMode","draggableConfig","nodeDraggable","nd","handleSelect","keys","info","handleDrop","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, 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\";\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 />\n </span>\n ),\n [onEditValueChange, onEditConfirm, onEditCancel, styles],\n );\n\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 titleContent = isEditing ? (\n renderInlineInput(editNode!.currentValue)\n ) : (\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 const nodeChildren = node.children\n ? convertToTreeData(node.children, pathSegments, fullPath)\n : undefined;\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: nodeChildren,\n };\n });\n\n // 新建模式:在目标父节点下插入临时节点\n if (createInfo && editNode && editNode.mode === \"create\") {\n const targetParentKey = createInfo.parentKey;\n // 匹配当前层级的父节点 key\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 /** 标记为临时节点 */\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 onEditValueChange,\n createInfo,\n onStartRename,\n ],\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 const nd = node as DataNode & { _isTempNode?: boolean };\n // 临时新建节点不可拖拽\n if (nd._isTempNode) return false;\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 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 onSelect?.(keys, info);\n },\n [onSelect, editNode],\n );\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 & {\n _originalNode?: FolderTreeData;\n };\n const dropNode = info.node as DataNode & {\n _originalNode?: FolderTreeData;\n };\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 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={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,16 +1,29 @@
|
|
|
1
|
-
import _toConsumableArray from "@babel/runtime/helpers/esm/toConsumableArray";
|
|
2
1
|
import _regeneratorRuntime from "@babel/runtime/helpers/esm/regeneratorRuntime";
|
|
3
2
|
import _asyncToGenerator from "@babel/runtime/helpers/esm/asyncToGenerator";
|
|
4
3
|
import _objectSpread from "@babel/runtime/helpers/esm/objectSpread2";
|
|
5
4
|
import _createForOfIteratorHelper from "@babel/runtime/helpers/esm/createForOfIteratorHelper";
|
|
6
5
|
import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
|
|
7
|
-
import
|
|
6
|
+
import _toConsumableArray from "@babel/runtime/helpers/esm/toConsumableArray";
|
|
7
|
+
import React, { useRef, useCallback, useEffect, useState, forwardRef, useImperativeHandle } from "react";
|
|
8
8
|
import clsx from "clsx";
|
|
9
9
|
import DirectoryTreeComponent from "./DirectoryTree";
|
|
10
10
|
import FilePreview from "./FilePreview";
|
|
11
11
|
import { useStyles } from "./styles";
|
|
12
12
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
13
13
|
import { jsxs as _jsxs } from "react/jsx-runtime";
|
|
14
|
+
function getAllExpandedKeys(nodes) {
|
|
15
|
+
var parentPath = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : "";
|
|
16
|
+
var keys = [];
|
|
17
|
+
nodes.forEach(function (node) {
|
|
18
|
+
var _node$children;
|
|
19
|
+
var currentPath = parentPath ? "".concat(parentPath, "/").concat(node.path) : node.path;
|
|
20
|
+
if ((_node$children = node.children) !== null && _node$children !== void 0 && _node$children.length) {
|
|
21
|
+
keys.push(currentPath);
|
|
22
|
+
keys.push.apply(keys, _toConsumableArray(getAllExpandedKeys(node.children, currentPath)));
|
|
23
|
+
}
|
|
24
|
+
});
|
|
25
|
+
return keys;
|
|
26
|
+
}
|
|
14
27
|
var FolderTree = /*#__PURE__*/forwardRef(function (props, ref) {
|
|
15
28
|
var className = props.className,
|
|
16
29
|
style = props.style,
|
|
@@ -171,10 +184,11 @@ var FolderTree = /*#__PURE__*/forwardRef(function (props, ref) {
|
|
|
171
184
|
_useState6 = _slicedToArray(_useState5, 2),
|
|
172
185
|
selectedFileState = _useState6[0],
|
|
173
186
|
setSelectedFileState = _useState6[1];
|
|
174
|
-
var
|
|
187
|
+
var controlled = expandedPaths !== undefined;
|
|
188
|
+
var _useState7 = useState(defaultExpandedPaths || []),
|
|
175
189
|
_useState8 = _slicedToArray(_useState7, 2),
|
|
176
190
|
expandedPathsState = _useState8[0],
|
|
177
|
-
|
|
191
|
+
setExpandedPathsState = _useState8[1];
|
|
178
192
|
var _useState9 = useState(isValidSelectedFile(selectedFile || defaultSelectedFile)),
|
|
179
193
|
_useState10 = _slicedToArray(_useState9, 2),
|
|
180
194
|
validSelectedFile = _useState10[0],
|
|
@@ -187,6 +201,7 @@ var FolderTree = /*#__PURE__*/forwardRef(function (props, ref) {
|
|
|
187
201
|
_useState14 = _slicedToArray(_useState13, 2),
|
|
188
202
|
loadingContent = _useState14[0],
|
|
189
203
|
setLoadingContent = _useState14[1];
|
|
204
|
+
var initializedExpandRef = useRef(false);
|
|
190
205
|
|
|
191
206
|
// 受控模式同步
|
|
192
207
|
useEffect(function () {
|
|
@@ -194,12 +209,18 @@ var FolderTree = /*#__PURE__*/forwardRef(function (props, ref) {
|
|
|
194
209
|
setSelectedFileState(selectedFile);
|
|
195
210
|
setValidSelectedFile(isValidSelectedFile(selectedFile));
|
|
196
211
|
}
|
|
197
|
-
}, [selectedFile,
|
|
212
|
+
}, [selectedFile, isValidSelectedFile]);
|
|
198
213
|
useEffect(function () {
|
|
199
|
-
if (
|
|
200
|
-
|
|
214
|
+
if (!controlled && defaultExpandAll && !initializedExpandRef.current && treeData.length > 0) {
|
|
215
|
+
initializedExpandRef.current = true;
|
|
216
|
+
setExpandedPathsState(getAllExpandedKeys(treeData));
|
|
201
217
|
}
|
|
202
|
-
}, [
|
|
218
|
+
}, [controlled, defaultExpandAll, treeData]);
|
|
219
|
+
useEffect(function () {
|
|
220
|
+
if (controlled) {
|
|
221
|
+
setExpandedPathsState(expandedPaths);
|
|
222
|
+
}
|
|
223
|
+
}, [controlled, expandedPaths]);
|
|
203
224
|
|
|
204
225
|
// ====== 加载文件内容 ======
|
|
205
226
|
useEffect(function () {
|
|
@@ -307,7 +328,9 @@ var FolderTree = /*#__PURE__*/forwardRef(function (props, ref) {
|
|
|
307
328
|
};
|
|
308
329
|
var handleExpand = function handleExpand(keys) {
|
|
309
330
|
var newPaths = keys;
|
|
310
|
-
|
|
331
|
+
if (!controlled) {
|
|
332
|
+
setExpandedPathsState(newPaths);
|
|
333
|
+
}
|
|
311
334
|
onExpandedPathsChange === null || onExpandedPathsChange === void 0 || onExpandedPathsChange(newPaths);
|
|
312
335
|
};
|
|
313
336
|
|
|
@@ -329,17 +352,19 @@ var FolderTree = /*#__PURE__*/forwardRef(function (props, ref) {
|
|
|
329
352
|
mode: "create"
|
|
330
353
|
});
|
|
331
354
|
|
|
332
|
-
//
|
|
333
|
-
if (parentPath && parentPath !== "/") {
|
|
334
|
-
|
|
355
|
+
// 自动展开父文件夹(仅在受控模式下需要,非受控模式由 defaultExpandAll 处理)
|
|
356
|
+
if (!controlled && parentPath && parentPath !== "/") {
|
|
357
|
+
setExpandedPathsState(function (prev) {
|
|
335
358
|
var current = prev || [];
|
|
336
|
-
if (current.includes(parentPath))
|
|
359
|
+
if (current.includes(parentPath)) {
|
|
360
|
+
return current;
|
|
361
|
+
}
|
|
337
362
|
return [].concat(_toConsumableArray(current), [parentPath]);
|
|
338
363
|
});
|
|
339
364
|
}
|
|
340
365
|
}
|
|
341
366
|
};
|
|
342
|
-
}, []);
|
|
367
|
+
}, [controlled]);
|
|
343
368
|
return /*#__PURE__*/_jsxs("div", {
|
|
344
369
|
className: clsx(styles.container, !showPreview && styles.containerNoPreview, className),
|
|
345
370
|
style: _objectSpread(_objectSpread(_objectSpread({}, style), style !== null && style !== void 0 && style.background ? {
|
|
@@ -351,7 +376,7 @@ var FolderTree = /*#__PURE__*/forwardRef(function (props, ref) {
|
|
|
351
376
|
treeData: treeData,
|
|
352
377
|
directoryIcons: directoryIcons,
|
|
353
378
|
selectedKeys: selectable && selectedFileState && validSelectedFile ? [selectedFileState.join("/")] : [],
|
|
354
|
-
expandedKeys: expandedPathsState,
|
|
379
|
+
expandedKeys: controlled ? expandedPaths : expandedPathsState,
|
|
355
380
|
onSelect: handleSelect,
|
|
356
381
|
onExpand: handleExpand,
|
|
357
382
|
defaultExpandAll: defaultExpandAll,
|