@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.
@@ -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 titleContent = isEditing ? renderInlineInput(editNode.currentValue) : /*#__PURE__*/_jsxs("span", {
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
- var nodeChildren = node.children ? convertToTreeData(node.children, pathSegments, fullPath) : undefined;
126
- return _objectSpread(_objectSpread({}, node), {}, {
127
- key: fullPath,
128
- path: fullPath,
129
- pathSegments: pathSegments,
130
- title: titleContent,
131
- icon: getIcon(node),
132
- isLeaf: !isFolder(node),
133
- /** 保存原始节点数据用于拖拽回调 */
134
- _originalNode: node,
135
- children: nodeChildren
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, onEditValueChange, createInfo, onStartRename]);
160
- var treeDataConverted = convertToTreeData(treeData, [], "");
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: draggableConfig,
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 React, { useCallback, useEffect, useState, forwardRef, useImperativeHandle } from "react";
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 _useState7 = useState(expandedPaths || defaultExpandedPaths),
187
+ var controlled = expandedPaths !== undefined;
188
+ var _useState7 = useState(defaultExpandedPaths || []),
175
189
  _useState8 = _slicedToArray(_useState7, 2),
176
190
  expandedPathsState = _useState8[0],
177
- setExpandedPaths = _useState8[1];
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, treeData]);
212
+ }, [selectedFile, isValidSelectedFile]);
198
213
  useEffect(function () {
199
- if (expandedPaths !== undefined) {
200
- setExpandedPaths(expandedPaths);
214
+ if (!controlled && defaultExpandAll && !initializedExpandRef.current && treeData.length > 0) {
215
+ initializedExpandRef.current = true;
216
+ setExpandedPathsState(getAllExpandedKeys(treeData));
201
217
  }
202
- }, [expandedPaths]);
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
- setExpandedPaths(newPaths);
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
- setExpandedPaths(function (prev) {
355
+ // 自动展开父文件夹(仅在受控模式下需要,非受控模式由 defaultExpandAll 处理)
356
+ if (!controlled && parentPath && parentPath !== "/") {
357
+ setExpandedPathsState(function (prev) {
335
358
  var current = prev || [];
336
- if (current.includes(parentPath)) return current;
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,