@ai-group/chat-sdk 3.5.6 → 3.5.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (34) hide show
  1. package/dist/cjs/components/FolderTree/DirectoryTree.d.ts +13 -1
  2. package/dist/cjs/components/FolderTree/DirectoryTree.js +215 -70
  3. package/dist/cjs/components/FolderTree/DirectoryTree.js.map +2 -2
  4. package/dist/cjs/components/FolderTree/index.d.ts +3 -3
  5. package/dist/cjs/components/FolderTree/index.js +102 -5
  6. package/dist/cjs/components/FolderTree/index.js.map +2 -2
  7. package/dist/cjs/components/FolderTree/styles.d.ts +5 -0
  8. package/dist/cjs/components/FolderTree/styles.js +77 -14
  9. package/dist/cjs/components/FolderTree/styles.js.map +2 -2
  10. package/dist/cjs/components/FolderTree/types.d.ts +61 -2
  11. package/dist/cjs/components/FolderTree/types.js.map +1 -1
  12. package/dist/cjs/components/FolderTree/useFolderDrag.d.ts +53 -0
  13. package/dist/cjs/components/FolderTree/useFolderDrag.js +309 -0
  14. package/dist/cjs/components/FolderTree/useFolderDrag.js.map +7 -0
  15. package/dist/cjs/index.d.ts +1 -1
  16. package/dist/cjs/index.js.map +2 -2
  17. package/dist/esm/components/FolderTree/DirectoryTree.d.ts +13 -1
  18. package/dist/esm/components/FolderTree/DirectoryTree.js +220 -62
  19. package/dist/esm/components/FolderTree/DirectoryTree.js.map +1 -1
  20. package/dist/esm/components/FolderTree/index.d.ts +3 -3
  21. package/dist/esm/components/FolderTree/index.js +149 -31
  22. package/dist/esm/components/FolderTree/index.js.map +1 -1
  23. package/dist/esm/components/FolderTree/styles.d.ts +5 -0
  24. package/dist/esm/components/FolderTree/styles.js +17 -12
  25. package/dist/esm/components/FolderTree/styles.js.map +1 -1
  26. package/dist/esm/components/FolderTree/types.d.ts +61 -2
  27. package/dist/esm/components/FolderTree/types.js.map +1 -1
  28. package/dist/esm/components/FolderTree/useFolderDrag.d.ts +53 -0
  29. package/dist/esm/components/FolderTree/useFolderDrag.js +324 -0
  30. package/dist/esm/components/FolderTree/useFolderDrag.js.map +1 -0
  31. package/dist/esm/index.d.ts +1 -1
  32. package/dist/esm/index.js.map +1 -1
  33. package/dist/umd/chat-sdk.min.js +1 -1
  34. package/package.json +10 -10
@@ -1,10 +1,10 @@
1
- import _objectSpread from "@babel/runtime/helpers/esm/objectSpread2";
2
1
  import _toConsumableArray from "@babel/runtime/helpers/esm/toConsumableArray";
3
- import React, { useCallback } from "react";
4
- import { Tree, Dropdown } from "antd";
2
+ import React, { useCallback, useMemo } from "react";
3
+ import { Tree, Dropdown, Input } from "antd";
5
4
  import { FileOutlined, FolderOutlined, MoreOutlined } from "@ant-design/icons";
6
5
  import clsx from "clsx";
7
6
  import { useStyles } from "./styles";
7
+ import { useFolderDrag } from "./useFolderDrag";
8
8
  import { jsx as _jsx } from "react/jsx-runtime";
9
9
  import { jsxs as _jsxs } from "react/jsx-runtime";
10
10
  var AntDirectoryTree = Tree.DirectoryTree;
@@ -25,7 +25,13 @@ var DirectoryTreeComponent = function DirectoryTreeComponent(_ref) {
25
25
  moreActions = _ref.moreActions,
26
26
  width = _ref.width,
27
27
  draggable = _ref.draggable,
28
- onDrop = _ref.onDrop;
28
+ onDrop = _ref.onDrop,
29
+ editNode = _ref.editNode,
30
+ onEditValueChange = _ref.onEditValueChange,
31
+ onEditConfirm = _ref.onEditConfirm,
32
+ onEditCancel = _ref.onEditCancel,
33
+ createInfo = _ref.createInfo,
34
+ onStartRename = _ref.onStartRename;
29
35
  var styles = useStyles();
30
36
  var isFolder = function isFolder(node) {
31
37
  return !!node.children && node.children.length > 0;
@@ -56,17 +62,153 @@ var DirectoryTreeComponent = function DirectoryTreeComponent(_ref) {
56
62
  return s !== "";
57
63
  });
58
64
  }, []);
65
+ var renderInlineInput = useCallback(function (value) {
66
+ return /*#__PURE__*/_jsx("span", {
67
+ className: styles.treeNodeTitle,
68
+ children: /*#__PURE__*/_jsx(Input, {
69
+ size: "small",
70
+ value: value,
71
+ onChange: function onChange(e) {
72
+ return onEditValueChange === null || onEditValueChange === void 0 ? void 0 : onEditValueChange(e.target.value);
73
+ },
74
+ onBlur: function onBlur() {
75
+ return onEditConfirm === null || onEditConfirm === void 0 ? void 0 : onEditConfirm();
76
+ },
77
+ onPressEnter: function onPressEnter() {
78
+ return onEditConfirm === null || onEditConfirm === void 0 ? void 0 : onEditConfirm();
79
+ },
80
+ onKeyDown: function onKeyDown(e) {
81
+ if (e.key === "Escape") {
82
+ e.stopPropagation();
83
+ onEditCancel === null || onEditCancel === void 0 || onEditCancel();
84
+ }
85
+ },
86
+ autoFocus: true,
87
+ className: styles.inlineInput,
88
+ onClick: function onClick(e) {
89
+ return e.stopPropagation();
90
+ },
91
+ onSelect: function onSelect(e) {
92
+ return e.stopPropagation();
93
+ },
94
+ onFocus: function onFocus(e) {
95
+ return e.stopPropagation();
96
+ }
97
+ })
98
+ });
99
+ }, [onEditValueChange, onEditConfirm, onEditCancel, styles]);
100
+
101
+ // ====== 拖拽模式 ======
102
+ var dragMode = draggable === true ? "file" : draggable || false;
103
+
104
+ // ====== 自定义拖拽 hook ======
105
+ var handleDragDrop = useCallback(function (dragNode, dropNode, dropPosition) {
106
+ var dragNd = dragNode;
107
+ var dropNd = dropNode;
108
+ var originalDragNode = dragNd._originalNode;
109
+ var originalDropNode = dropNd._originalNode;
110
+ if (!originalDragNode) return;
111
+ var dragKey = String(dragNode.key);
112
+ var dropKey = String(dropNode.key);
113
+ var dragFileName = originalDragNode.path;
114
+ var newPath;
115
+
116
+ // 拖到底部 drop zone:放在根级别末尾
117
+ if (!originalDropNode && dropKey === "__bottom_placeholder__") {
118
+ newPath = dragFileName;
119
+ onDrop === null || onDrop === void 0 || onDrop({
120
+ fileName: originalDragNode.title,
121
+ extra: originalDragNode.extra,
122
+ oldPath: dragKey,
123
+ newPath: newPath,
124
+ dragNode: originalDragNode,
125
+ dropNode: {
126
+ title: "",
127
+ path: ""
128
+ }
129
+ });
130
+ return;
131
+ }
132
+ if (!originalDropNode) return;
133
+ if (!dropNode.isLeaf && dropPosition === 0) {
134
+ // 拖入文件夹内部
135
+ newPath = "".concat(dropKey, "/").concat(dragFileName);
136
+ } else {
137
+ // 拖到节点旁边(同级)
138
+ var dropParentPath = dropKey.includes("/") ? dropKey.substring(0, dropKey.lastIndexOf("/")) : "";
139
+ newPath = dropParentPath ? "".concat(dropParentPath, "/").concat(dragFileName) : dragFileName;
140
+ }
141
+ onDrop === null || onDrop === void 0 || onDrop({
142
+ fileName: originalDragNode.title,
143
+ extra: originalDragNode.extra,
144
+ oldPath: dragKey,
145
+ newPath: newPath,
146
+ dragNode: originalDragNode,
147
+ dropNode: originalDropNode
148
+ });
149
+ }, [onDrop]);
150
+ var handleDragEnterExpand = useCallback(function (nodeKey) {
151
+ var isExpanded = expandedKeys === null || expandedKeys === void 0 ? void 0 : expandedKeys.includes(nodeKey);
152
+ if (!isExpanded) {
153
+ onExpand === null || onExpand === void 0 || onExpand([].concat(_toConsumableArray(expandedKeys || []), [nodeKey]), {
154
+ node: null,
155
+ expanded: true,
156
+ nativeEvent: null
157
+ });
158
+ }
159
+ }, [expandedKeys, onExpand]);
160
+ var _useFolderDrag = useFolderDrag({
161
+ dragMode: dragMode,
162
+ onDrop: handleDragDrop,
163
+ onDragEnterExpand: handleDragEnterExpand
164
+ }),
165
+ onDragStart = _useFolderDrag.onDragStart,
166
+ onDragEnd = _useFolderDrag.onDragEnd,
167
+ onItemDragEnter = _useFolderDrag.onItemDragEnter,
168
+ onItemDragOver = _useFolderDrag.onItemDragOver,
169
+ onItemDragLeave = _useFolderDrag.onItemDragLeave,
170
+ onItemDrop = _useFolderDrag.onItemDrop,
171
+ onContainerDragOver = _useFolderDrag.onContainerDragOver,
172
+ onContainerDrop = _useFolderDrag.onContainerDrop,
173
+ canDragNode = _useFolderDrag.canDragNode;
174
+
175
+ // ====== 转换树数据 ======
176
+ // 注意:convertToTreeData 不依赖拖拽状态,拖拽效果通过 DOM 操作实现
59
177
  var convertToTreeData = useCallback(function (nodes) {
60
178
  var parentSegments = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
61
- return nodes.map(function (node) {
179
+ var parentKey = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : "";
180
+ var result = nodes.map(function (node) {
62
181
  var pathSegments = buildPathSegments(node, parentSegments);
63
182
  var fullPath = pathSegments.join("/").replace(/^\/+/, "");
183
+ var isEditing = editNode && editNode.key === fullPath;
184
+ var nodeChildren = node.children ? convertToTreeData(node.children, pathSegments, fullPath) : undefined;
185
+ var baseNode = {
186
+ key: fullPath,
187
+ path: fullPath,
188
+ pathSegments: pathSegments,
189
+ icon: getIcon(node),
190
+ isLeaf: !isFolder(node),
191
+ _originalNode: node,
192
+ children: nodeChildren
193
+ };
194
+
195
+ // 编辑态:直接渲染 inline input
196
+ if (isEditing) {
197
+ baseNode.title = renderInlineInput(editNode.currentValue);
198
+ return baseNode;
199
+ }
200
+
201
+ // title 内容(按钮、菜单等)
64
202
  var titleContent = /*#__PURE__*/_jsxs("span", {
65
203
  className: clsx(styles.treeNodeTitle, moreActions && styles.treeNodeTitleHover),
66
204
  children: [/*#__PURE__*/_jsx("span", {
67
205
  children: node.title
68
206
  }), moreActions && /*#__PURE__*/_jsx(Dropdown, {
69
- menu: moreActions(node),
207
+ menu: moreActions(node, {
208
+ startRename: function startRename() {
209
+ return onStartRename === null || onStartRename === void 0 ? void 0 : onStartRename(fullPath, node);
210
+ }
211
+ }),
70
212
  trigger: ["click"],
71
213
  placement: "bottomRight",
72
214
  children: /*#__PURE__*/_jsx("span", {
@@ -78,63 +220,74 @@ var DirectoryTreeComponent = function DirectoryTreeComponent(_ref) {
78
220
  })
79
221
  })]
80
222
  });
81
- return _objectSpread(_objectSpread({}, node), {}, {
82
- key: fullPath,
83
- path: fullPath,
84
- pathSegments: pathSegments,
85
- title: titleContent,
86
- icon: getIcon(node),
87
- isLeaf: !isFolder(node),
88
- /** 保存原始节点数据用于拖拽回调 */
89
- _originalNode: node,
90
- children: node.children ? convertToTreeData(node.children, pathSegments) : undefined
91
- });
223
+
224
+ // 启用拖拽时:在 title 外层包裹具有 data-node-key 属性的容器,
225
+ // 用于 DOM 查询和事件绑定。拖拽状态通过 CSS class 控制。
226
+ if (dragMode) {
227
+ var nodeData = baseNode;
228
+ var draggableDiv = canDragNode(nodeData);
229
+ baseNode.title = /*#__PURE__*/_jsx("div", {
230
+ className: clsx(styles.treeNodeWrapper, draggableDiv && styles.dragNodeHandle),
231
+ "data-node-key": fullPath,
232
+ draggable: draggableDiv,
233
+ onDragStart: draggableDiv ? function (e) {
234
+ return onDragStart(e, baseNode);
235
+ } : undefined,
236
+ onDragEnd: draggableDiv ? onDragEnd : undefined,
237
+ onDragEnter: function onDragEnter(e) {
238
+ return onItemDragEnter(e, baseNode);
239
+ },
240
+ onDragOver: function onDragOver(e) {
241
+ return onItemDragOver(e, baseNode);
242
+ },
243
+ onDragLeave: onItemDragLeave,
244
+ onDrop: function onDrop(e) {
245
+ return onItemDrop(e, baseNode);
246
+ },
247
+ children: titleContent
248
+ });
249
+ } else {
250
+ baseNode.title = titleContent;
251
+ }
252
+ return baseNode;
92
253
  });
93
- }, [buildPathSegments, getIcon, moreActions, styles]);
94
- var treeDataConverted = convertToTreeData(treeData);
95
254
 
96
- // ====== 拖拽配置 ======
97
- var dragMode = draggable === true ? "file" : draggable || false;
98
- var draggableConfig = dragMode ? {
99
- icon: false,
100
- nodeDraggable: function nodeDraggable(node) {
101
- if (dragMode === "file") return !!node.isLeaf;
102
- if (dragMode === "folder") return !node.isLeaf;
103
- return true; // 'all'
255
+ // 新建模式:在目标父节点下插入临时节点
256
+ if (createInfo && editNode && editNode.mode === "create") {
257
+ var targetParentKey = createInfo.parentKey;
258
+ if (targetParentKey === parentKey || targetParentKey === "" && parentKey === "" || targetParentKey === "/" && parentKey === "") {
259
+ var tempNode = {
260
+ key: editNode.key,
261
+ title: renderInlineInput(editNode.currentValue),
262
+ icon: createInfo.type === "folder" ? /*#__PURE__*/_jsx(FolderOutlined, {}) : /*#__PURE__*/_jsx(FileOutlined, {}),
263
+ isLeaf: createInfo.type === "file",
264
+ path: editNode.key,
265
+ pathSegments: [editNode.key],
266
+ _originalNode: null,
267
+ _isTempNode: true
268
+ };
269
+ result.push(tempNode);
270
+ }
104
271
  }
105
- } : false;
106
- var handleDrop = useCallback(function (info) {
107
- if (!onDrop) return;
108
- var dragNode = info.dragNode;
109
- var dropNode = info.node;
110
- var originalDragNode = dragNode._originalNode;
111
- var originalDropNode = dropNode._originalNode;
112
- if (!originalDragNode || !originalDropNode) return;
113
-
114
- // dragNode 的原始完整路径
115
- var dragKey = String(dragNode.key);
116
- // 计算新路径:如果 drop 到文件夹上(非叶子),新路径为 dropNode路径/dragNode文件名
117
- // 如果 drop 到文件旁边,新路径为 dropNode 的父路径/dragNode文件名
118
- var dropKey = String(dropNode.key);
119
- var dragFileName = originalDragNode.path;
120
- var newPath;
121
- if (!dropNode.isLeaf && info.dropToGap === false) {
122
- // 拖入文件夹内部
123
- newPath = "".concat(dropKey, "/").concat(dragFileName);
124
- } else {
125
- // 拖到节点旁边(同级)
126
- var dropParentPath = dropKey.includes("/") ? dropKey.substring(0, dropKey.lastIndexOf("/")) : "";
127
- newPath = dropParentPath ? "".concat(dropParentPath, "/").concat(dragFileName) : dragFileName;
272
+ return result;
273
+ }, [buildPathSegments, getIcon, moreActions, styles, editNode, renderInlineInput, createInfo, onStartRename, dragMode, canDragNode, onDragStart, onDragEnd, onItemDragEnter, onItemDragOver, onItemDragLeave, onItemDrop]);
274
+ var treeDataConverted = useMemo(function () {
275
+ return convertToTreeData(treeData, [], "");
276
+ }, [treeData, convertToTreeData]);
277
+ var handleSelect = useCallback(function (keys, info) {
278
+ var _info$nativeEvent;
279
+ // 编辑态不响应选中
280
+ if (editNode) return;
281
+ // 临时节点不可选中
282
+ var node = info.node;
283
+ if (node._isTempNode) return;
284
+ // 点击 moreActions 区域不触发选中
285
+ var target = (_info$nativeEvent = info.nativeEvent) === null || _info$nativeEvent === void 0 ? void 0 : _info$nativeEvent.target;
286
+ if (target && (target.closest(".folder-tree-more-icon") || target.closest(".ant-dropdown"))) {
287
+ return;
128
288
  }
129
- onDrop({
130
- fileName: originalDragNode.title,
131
- extra: originalDragNode.extra,
132
- oldPath: dragKey,
133
- newPath: newPath,
134
- dragNode: originalDragNode,
135
- dropNode: originalDropNode
136
- });
137
- }, [onDrop]);
289
+ onSelect === null || onSelect === void 0 || onSelect(keys, info);
290
+ }, [onSelect, editNode]);
138
291
  var titleNode = directoryTitle === false || directoryTitle === null ? null : typeof directoryTitle === "function" ? directoryTitle() : directoryTitle;
139
292
  return /*#__PURE__*/_jsxs("div", {
140
293
  className: clsx(styles.directoryPanel, className),
@@ -146,19 +299,24 @@ var DirectoryTreeComponent = function DirectoryTreeComponent(_ref) {
146
299
  children: titleNode
147
300
  }), /*#__PURE__*/_jsx("div", {
148
301
  className: styles.directoryTreeContent,
302
+ onDragOver: dragMode ? onContainerDragOver : undefined,
303
+ onDrop: dragMode ? onContainerDrop : undefined,
149
304
  children: /*#__PURE__*/_jsx(AntDirectoryTree, {
305
+ style: {
306
+ "--ant-tree-directory-node-selected-bg": "rgba(0,0,0,0.03)",
307
+ "--ant-tree-directory-node-selected-color": "#1a1c1e"
308
+ },
150
309
  treeData: treeDataConverted,
151
310
  selectedKeys: selectedKeys,
152
311
  expandedKeys: expandedKeys,
153
- onSelect: onSelect,
312
+ onSelect: handleSelect,
154
313
  onExpand: onExpand,
155
314
  multiple: false,
156
315
  blockNode: true,
157
316
  showLine: showLine,
158
317
  switcherIcon: switcherIcon,
159
318
  defaultExpandAll: defaultExpandAll,
160
- draggable: draggableConfig,
161
- onDrop: dragMode ? handleDrop : undefined
319
+ draggable: false
162
320
  })
163
321
  })]
164
322
  });
@@ -1 +1 @@
1
- {"version":3,"names":["React","useCallback","Tree","Dropdown","FileOutlined","FolderOutlined","MoreOutlined","clsx","useStyles","jsx","_jsx","jsxs","_jsxs","AntDirectoryTree","DirectoryTree","DirectoryTreeComponent","_ref","treeData","selectedKeys","expandedKeys","onSelect","onExpand","_ref$showLine","showLine","switcherIcon","_ref$defaultExpandAll","defaultExpandAll","className","directoryIcons","directoryTitle","moreActions","width","draggable","onDrop","styles","isFolder","node","children","length","getIcon","icon","directory","filePath","path","toLowerCase","extension","split","pop","buildPathSegments","parentSegments","arguments","undefined","concat","_toConsumableArray","filter","s","convertToTreeData","nodes","map","pathSegments","fullPath","join","replace","titleContent","treeNodeTitle","treeNodeTitleHover","title","menu","trigger","placement","moreIcon","onClick","e","stopPropagation","_objectSpread","key","isLeaf","_originalNode","treeDataConverted","dragMode","draggableConfig","nodeDraggable","handleDrop","info","dragNode","dropNode","originalDragNode","originalDropNode","dragKey","String","dropKey","dragFileName","newPath","dropToGap","dropParentPath","includes","substring","lastIndexOf","fileName","extra","oldPath","titleNode","directoryPanel","style","directoryTreeContent","multiple","blockNode"],"sources":["../../../../src/components/FolderTree/DirectoryTree.tsx"],"sourcesContent":["import React, { useCallback } from \"react\";\nimport { Tree, Dropdown } from \"antd\";\nimport {\n FileOutlined,\n FolderOutlined,\n MoreOutlined,\n} from \"@ant-design/icons\";\nimport type { TreeProps } from \"antd\";\nimport type { DataNode } from \"antd/es/tree\";\nimport clsx from \"clsx\";\nimport type { FolderTreeData, FolderTreeProps } from \"./types\";\nimport { useStyles } from \"./styles\";\n\nconst { DirectoryTree: AntDirectoryTree } = Tree;\n\nexport interface DirectoryTreeComponentProps {\n treeData: FolderTreeData[];\n directoryIcons?: FolderTreeProps[\"directoryIcons\"];\n selectedKeys?: string[];\n expandedKeys?: string[];\n onSelect?: TreeProps[\"onSelect\"];\n onExpand?: TreeProps[\"onExpand\"];\n showLine?: FolderTreeProps[\"showLine\"];\n switcherIcon?: FolderTreeProps[\"switcherIcon\"];\n defaultExpandAll?: boolean;\n className?: string;\n directoryTitle?: FolderTreeProps[\"directoryTitle\"];\n moreActions?: FolderTreeProps[\"moreActions\"];\n width?: number | string;\n draggable?: FolderTreeProps[\"draggable\"];\n onDrop?: FolderTreeProps[\"onDrop\"];\n}\n\nconst DirectoryTreeComponent: React.FC<DirectoryTreeComponentProps> = ({\n treeData,\n selectedKeys,\n expandedKeys,\n onSelect,\n onExpand,\n showLine = false,\n switcherIcon,\n defaultExpandAll = true,\n className,\n directoryIcons,\n directoryTitle,\n moreActions,\n width,\n draggable,\n onDrop,\n}) => {\n const styles = useStyles();\n\n const isFolder = (node: FolderTreeData): boolean => {\n return !!node.children && node.children.length > 0;\n };\n\n const getIcon = useCallback(\n (node: FolderTreeData) => {\n if (directoryIcons === false || directoryIcons === null) {\n return null;\n }\n if (isFolder(node)) {\n const icon = directoryIcons?.directory;\n if (typeof icon === \"function\") return icon();\n return icon || <FolderOutlined />;\n }\n const filePath = node.path.toLowerCase();\n const extension = filePath.split(\".\").pop();\n if (extension) {\n const icon = directoryIcons?.[extension];\n if (icon) return typeof icon === \"function\" ? icon() : icon;\n }\n return <FileOutlined />;\n },\n [directoryIcons]\n );\n\n const buildPathSegments = useCallback(\n (node: FolderTreeData, parentSegments: string[] = []): string[] => {\n if (node.path === \"/\" && parentSegments.length === 0) {\n return [\"/\"];\n }\n return [...parentSegments, node.path].filter((s) => s !== \"\");\n },\n []\n );\n\n const convertToTreeData = useCallback(\n (nodes: FolderTreeData[], parentSegments: string[] = []): DataNode[] => {\n return nodes.map((node) => {\n const pathSegments = buildPathSegments(node, parentSegments);\n const fullPath = pathSegments.join(\"/\").replace(/^\\/+/, \"\");\n\n const titleContent = (\n <span\n className={clsx(\n styles.treeNodeTitle,\n moreActions && styles.treeNodeTitleHover\n )}\n >\n <span>{node.title}</span>\n {moreActions && (\n <Dropdown\n menu={moreActions(node)}\n trigger={[\"click\"]}\n placement=\"bottomRight\"\n >\n <span\n className={clsx(styles.moreIcon, \"folder-tree-more-icon\")}\n onClick={(e) => e.stopPropagation()}\n >\n <MoreOutlined />\n </span>\n </Dropdown>\n )}\n </span>\n );\n\n return {\n ...node,\n key: fullPath,\n path: fullPath,\n pathSegments,\n title: titleContent,\n icon: getIcon(node),\n isLeaf: !isFolder(node),\n /** 保存原始节点数据用于拖拽回调 */\n _originalNode: node,\n children: node.children\n ? convertToTreeData(node.children, pathSegments)\n : undefined,\n };\n });\n },\n [buildPathSegments, getIcon, moreActions, styles]\n );\n\n const treeDataConverted = convertToTreeData(treeData);\n\n // ====== 拖拽配置 ======\n const dragMode = draggable === true ? \"file\" : draggable || false;\n\n const draggableConfig = dragMode\n ? {\n icon: false,\n nodeDraggable: (node: DataNode) => {\n if (dragMode === \"file\") return !!node.isLeaf;\n if (dragMode === \"folder\") return !node.isLeaf;\n return true; // 'all'\n },\n }\n : false;\n\n const handleDrop: TreeProps[\"onDrop\"] = useCallback(\n (info: Parameters<NonNullable<TreeProps[\"onDrop\"]>>[0]) => {\n if (!onDrop) return;\n\n const dragNode = info.dragNode as DataNode & { _originalNode?: FolderTreeData };\n const dropNode = info.node as DataNode & { _originalNode?: FolderTreeData };\n\n const originalDragNode = dragNode._originalNode;\n const originalDropNode = dropNode._originalNode;\n if (!originalDragNode || !originalDropNode) return;\n\n // dragNode 的原始完整路径\n const dragKey = String(dragNode.key);\n // 计算新路径:如果 drop 到文件夹上(非叶子),新路径为 dropNode路径/dragNode文件名\n // 如果 drop 到文件旁边,新路径为 dropNode 的父路径/dragNode文件名\n const dropKey = String(dropNode.key);\n const dragFileName = originalDragNode.path;\n let newPath: string;\n\n if (!dropNode.isLeaf && info.dropToGap === false) {\n // 拖入文件夹内部\n newPath = `${dropKey}/${dragFileName}`;\n } else {\n // 拖到节点旁边(同级)\n const dropParentPath = dropKey.includes(\"/\")\n ? dropKey.substring(0, dropKey.lastIndexOf(\"/\"))\n : \"\";\n newPath = dropParentPath\n ? `${dropParentPath}/${dragFileName}`\n : dragFileName;\n }\n\n onDrop({\n fileName: originalDragNode.title,\n extra: originalDragNode.extra,\n oldPath: dragKey,\n newPath,\n dragNode: originalDragNode,\n dropNode: originalDropNode,\n });\n },\n [onDrop],\n );\n\n const titleNode =\n directoryTitle === false || directoryTitle === null\n ? null\n : typeof directoryTitle === \"function\"\n ? directoryTitle()\n : directoryTitle;\n\n return (\n <div className={clsx(styles.directoryPanel, className)} style={{ width }}>\n {titleNode && <div className={styles.directoryTitle}>{titleNode}</div>}\n <div className={styles.directoryTreeContent}>\n <AntDirectoryTree\n treeData={treeDataConverted}\n selectedKeys={selectedKeys}\n expandedKeys={expandedKeys}\n onSelect={onSelect}\n onExpand={onExpand}\n multiple={false}\n blockNode\n showLine={showLine as any}\n switcherIcon={switcherIcon}\n defaultExpandAll={defaultExpandAll}\n draggable={draggableConfig}\n onDrop={dragMode ? handleDrop : undefined}\n />\n </div>\n </div>\n );\n};\n\nexport default DirectoryTreeComponent;\n"],"mappings":"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"}
1
+ {"version":3,"names":["React","useCallback","useMemo","Tree","Dropdown","Input","FileOutlined","FolderOutlined","MoreOutlined","clsx","useStyles","useFolderDrag","jsx","_jsx","jsxs","_jsxs","AntDirectoryTree","DirectoryTree","DirectoryTreeComponent","_ref","treeData","selectedKeys","expandedKeys","onSelect","onExpand","_ref$showLine","showLine","switcherIcon","_ref$defaultExpandAll","defaultExpandAll","className","directoryIcons","directoryTitle","moreActions","width","draggable","onDrop","editNode","onEditValueChange","onEditConfirm","onEditCancel","createInfo","onStartRename","styles","isFolder","node","children","length","getIcon","icon","directory","filePath","path","toLowerCase","extension","split","pop","buildPathSegments","parentSegments","arguments","undefined","concat","_toConsumableArray","filter","s","renderInlineInput","value","treeNodeTitle","size","onChange","e","target","onBlur","onPressEnter","onKeyDown","key","stopPropagation","autoFocus","inlineInput","onClick","onFocus","dragMode","handleDragDrop","dragNode","dropNode","dropPosition","dragNd","dropNd","originalDragNode","_originalNode","originalDropNode","dragKey","String","dropKey","dragFileName","newPath","fileName","title","extra","oldPath","isLeaf","dropParentPath","includes","substring","lastIndexOf","handleDragEnterExpand","nodeKey","isExpanded","expanded","nativeEvent","_useFolderDrag","onDragEnterExpand","onDragStart","onDragEnd","onItemDragEnter","onItemDragOver","onItemDragLeave","onItemDrop","onContainerDragOver","onContainerDrop","canDragNode","convertToTreeData","nodes","parentKey","result","map","pathSegments","fullPath","join","replace","isEditing","nodeChildren","baseNode","currentValue","titleContent","treeNodeTitleHover","menu","startRename","trigger","placement","moreIcon","nodeData","draggableDiv","treeNodeWrapper","dragNodeHandle","onDragEnter","onDragOver","onDragLeave","mode","targetParentKey","tempNode","type","_isTempNode","push","treeDataConverted","handleSelect","keys","info","_info$nativeEvent","closest","titleNode","directoryPanel","style","directoryTreeContent","multiple","blockNode"],"sources":["../../../../src/components/FolderTree/DirectoryTree.tsx"],"sourcesContent":["import React, { useCallback, useMemo } from \"react\";\nimport { Tree, Dropdown, Input } from \"antd\";\nimport { FileOutlined, FolderOutlined, MoreOutlined } from \"@ant-design/icons\";\nimport type { TreeProps } from \"antd\";\nimport type { DataNode } from \"antd/es/tree\";\nimport clsx from \"clsx\";\nimport type {\n FolderTreeData,\n FolderTreeProps,\n EditNodeInfo,\n CreateNodeContext,\n} from \"./types\";\nimport { useStyles } from \"./styles\";\nimport { useFolderDrag, type DropPosition } from \"./useFolderDrag\";\n\nconst { DirectoryTree: AntDirectoryTree } = Tree;\n\nexport interface DirectoryTreeComponentProps {\n treeData: FolderTreeData[];\n directoryIcons?: FolderTreeProps[\"directoryIcons\"];\n selectedKeys?: string[];\n expandedKeys?: string[];\n onSelect?: TreeProps[\"onSelect\"];\n onExpand?: TreeProps[\"onExpand\"];\n showLine?: FolderTreeProps[\"showLine\"];\n switcherIcon?: FolderTreeProps[\"switcherIcon\"];\n defaultExpandAll?: boolean;\n className?: string;\n directoryTitle?: FolderTreeProps[\"directoryTitle\"];\n moreActions?: FolderTreeProps[\"moreActions\"];\n width?: number | string;\n draggable?: FolderTreeProps[\"draggable\"];\n onDrop?: FolderTreeProps[\"onDrop\"];\n /** 当前编辑节点信息 */\n editNode?: EditNodeInfo | null;\n /** 编辑值变化回调 */\n onEditValueChange?: (value: string) => void;\n /** 编辑确认回调 */\n onEditConfirm?: () => void;\n /** 编辑取消回调 */\n onEditCancel?: () => void;\n /** 新建上下文 */\n createInfo?: CreateNodeContext | null;\n /** 开始重命名回调(由父组件注入) */\n onStartRename?: (fullPath: string, node: FolderTreeData) => void;\n}\n\nconst DirectoryTreeComponent: React.FC<DirectoryTreeComponentProps> = ({\n treeData,\n selectedKeys,\n expandedKeys,\n onSelect,\n onExpand,\n showLine = false,\n switcherIcon,\n defaultExpandAll = true,\n className,\n directoryIcons,\n directoryTitle,\n moreActions,\n width,\n draggable,\n onDrop,\n editNode,\n onEditValueChange,\n onEditConfirm,\n onEditCancel,\n createInfo,\n onStartRename,\n}) => {\n const styles = useStyles();\n\n const isFolder = (node: FolderTreeData): boolean => {\n return !!node.children && node.children.length > 0;\n };\n\n const getIcon = useCallback(\n (node: FolderTreeData) => {\n if (directoryIcons === false || directoryIcons === null) {\n return null;\n }\n if (isFolder(node)) {\n const icon = directoryIcons?.directory;\n if (typeof icon === \"function\") return icon();\n return icon || <FolderOutlined />;\n }\n const filePath = node.path.toLowerCase();\n const extension = filePath.split(\".\").pop();\n if (extension) {\n const icon = directoryIcons?.[extension];\n if (icon) return typeof icon === \"function\" ? icon() : icon;\n }\n return <FileOutlined />;\n },\n [directoryIcons],\n );\n\n const buildPathSegments = useCallback(\n (node: FolderTreeData, parentSegments: string[] = []): string[] => {\n if (node.path === \"/\" && parentSegments.length === 0) {\n return [\"/\"];\n }\n return [...parentSegments, node.path].filter((s) => s !== \"\");\n },\n [],\n );\n\n const renderInlineInput = useCallback(\n (value: string) => (\n <span className={styles.treeNodeTitle}>\n <Input\n size=\"small\"\n value={value}\n onChange={(e) => onEditValueChange?.(e.target.value)}\n onBlur={() => onEditConfirm?.()}\n onPressEnter={() => onEditConfirm?.()}\n onKeyDown={(e) => {\n if (e.key === \"Escape\") {\n e.stopPropagation();\n onEditCancel?.();\n }\n }}\n autoFocus\n className={styles.inlineInput}\n onClick={(e) => e.stopPropagation()}\n onSelect={(e) => e.stopPropagation()}\n onFocus={(e) => e.stopPropagation()}\n />\n </span>\n ),\n [onEditValueChange, onEditConfirm, onEditCancel, styles],\n );\n\n // ====== 拖拽模式 ======\n const dragMode = draggable === true ? \"file\" : draggable || false;\n\n // ====== 自定义拖拽 hook ======\n const handleDragDrop = useCallback(\n (dragNode: DataNode, dropNode: DataNode, dropPosition: DropPosition) => {\n const dragNd = dragNode as DataNode & { _originalNode?: FolderTreeData };\n const dropNd = dropNode as DataNode & { _originalNode?: FolderTreeData };\n const originalDragNode = dragNd._originalNode;\n const originalDropNode = dropNd._originalNode;\n if (!originalDragNode) return;\n\n const dragKey = String(dragNode.key);\n const dropKey = String(dropNode.key);\n const dragFileName = originalDragNode.path;\n let newPath: string;\n\n // 拖到底部 drop zone:放在根级别末尾\n if (!originalDropNode && dropKey === \"__bottom_placeholder__\") {\n newPath = dragFileName;\n onDrop?.({\n fileName: originalDragNode.title,\n extra: originalDragNode.extra,\n oldPath: dragKey,\n newPath,\n dragNode: originalDragNode,\n dropNode: { title: \"\", path: \"\" },\n });\n return;\n }\n\n if (!originalDropNode) return;\n\n if (!dropNode.isLeaf && dropPosition === 0) {\n // 拖入文件夹内部\n newPath = `${dropKey}/${dragFileName}`;\n } else {\n // 拖到节点旁边(同级)\n const dropParentPath = dropKey.includes(\"/\")\n ? dropKey.substring(0, dropKey.lastIndexOf(\"/\"))\n : \"\";\n newPath = dropParentPath\n ? `${dropParentPath}/${dragFileName}`\n : dragFileName;\n }\n\n onDrop?.({\n fileName: originalDragNode.title,\n extra: originalDragNode.extra,\n oldPath: dragKey,\n newPath,\n dragNode: originalDragNode,\n dropNode: originalDropNode,\n });\n },\n [onDrop],\n );\n\n const handleDragEnterExpand = useCallback(\n (nodeKey: string) => {\n const isExpanded = expandedKeys?.includes(nodeKey);\n if (!isExpanded) {\n onExpand?.([...(expandedKeys || []), nodeKey], {\n node: null as any,\n expanded: true,\n nativeEvent: null as any,\n });\n }\n },\n [expandedKeys, onExpand],\n );\n\n const { onDragStart, onDragEnd, onItemDragEnter, onItemDragOver, onItemDragLeave, onItemDrop, onContainerDragOver, onContainerDrop, canDragNode } =\n useFolderDrag({\n dragMode,\n onDrop: handleDragDrop,\n onDragEnterExpand: handleDragEnterExpand,\n });\n\n // ====== 转换树数据 ======\n // 注意:convertToTreeData 不依赖拖拽状态,拖拽效果通过 DOM 操作实现\n const convertToTreeData = useCallback(\n (\n nodes: FolderTreeData[],\n parentSegments: string[] = [],\n parentKey: string = \"\",\n ): DataNode[] => {\n const result = nodes.map((node) => {\n const pathSegments = buildPathSegments(node, parentSegments);\n const fullPath = pathSegments.join(\"/\").replace(/^\\/+/, \"\");\n\n const isEditing = editNode && editNode.key === fullPath;\n\n const nodeChildren = node.children\n ? convertToTreeData(node.children, pathSegments, fullPath)\n : undefined;\n\n const baseNode: any = {\n key: fullPath,\n path: fullPath,\n pathSegments,\n icon: getIcon(node),\n isLeaf: !isFolder(node),\n _originalNode: node,\n children: nodeChildren,\n };\n\n // 编辑态:直接渲染 inline input\n if (isEditing) {\n baseNode.title = renderInlineInput(editNode!.currentValue);\n return baseNode;\n }\n\n // title 内容(按钮、菜单等)\n const titleContent = (\n <span\n className={clsx(\n styles.treeNodeTitle,\n moreActions && styles.treeNodeTitleHover,\n )}\n >\n <span>{node.title}</span>\n {moreActions && (\n <Dropdown\n menu={moreActions(node, {\n startRename: () => onStartRename?.(fullPath, node),\n })}\n trigger={[\"click\"]}\n placement=\"bottomRight\"\n >\n <span\n className={clsx(styles.moreIcon, \"folder-tree-more-icon\")}\n onClick={(e) => e.stopPropagation()}\n >\n <MoreOutlined />\n </span>\n </Dropdown>\n )}\n </span>\n );\n\n // 启用拖拽时:在 title 外层包裹具有 data-node-key 属性的容器,\n // 用于 DOM 查询和事件绑定。拖拽状态通过 CSS class 控制。\n if (dragMode) {\n const nodeData = baseNode as DataNode & {\n _isTempNode?: boolean;\n };\n const draggableDiv = canDragNode(nodeData);\n\n baseNode.title = (\n <div\n className={clsx(\n styles.treeNodeWrapper,\n draggableDiv && styles.dragNodeHandle,\n )}\n data-node-key={fullPath}\n draggable={draggableDiv}\n onDragStart={draggableDiv ? (e) => onDragStart(e, baseNode) : undefined}\n onDragEnd={draggableDiv ? onDragEnd : undefined}\n onDragEnter={(e) => onItemDragEnter(e, baseNode)}\n onDragOver={(e) => onItemDragOver(e, baseNode)}\n onDragLeave={onItemDragLeave}\n onDrop={(e) => onItemDrop(e, baseNode)}\n >\n {titleContent}\n </div>\n );\n } else {\n baseNode.title = titleContent;\n }\n\n return baseNode;\n });\n\n // 新建模式:在目标父节点下插入临时节点\n if (createInfo && editNode && editNode.mode === \"create\") {\n const targetParentKey = createInfo.parentKey;\n if (\n targetParentKey === parentKey ||\n (targetParentKey === \"\" && parentKey === \"\") ||\n (targetParentKey === \"/\" && parentKey === \"\")\n ) {\n const tempNode: any = {\n key: editNode.key,\n title: renderInlineInput(editNode.currentValue),\n icon:\n createInfo.type === \"folder\" ? (\n <FolderOutlined />\n ) : (\n <FileOutlined />\n ),\n isLeaf: createInfo.type === \"file\",\n path: editNode.key,\n pathSegments: [editNode.key],\n _originalNode: null,\n _isTempNode: true,\n };\n result.push(tempNode);\n }\n }\n\n return result;\n },\n [\n buildPathSegments,\n getIcon,\n moreActions,\n styles,\n editNode,\n renderInlineInput,\n createInfo,\n onStartRename,\n dragMode,\n canDragNode,\n onDragStart,\n onDragEnd,\n onItemDragEnter,\n onItemDragOver,\n onItemDragLeave,\n onItemDrop,\n ],\n );\n\n const treeDataConverted = useMemo(\n () => convertToTreeData(treeData, [], \"\"),\n [treeData, convertToTreeData],\n );\n\n const handleSelect: TreeProps[\"onSelect\"] = useCallback(\n (keys: any, info: any) => {\n // 编辑态不响应选中\n if (editNode) return;\n // 临时节点不可选中\n const node = info.node as DataNode & { _isTempNode?: boolean };\n if (node._isTempNode) return;\n // 点击 moreActions 区域不触发选中\n const target = info.nativeEvent?.target as HTMLElement | null;\n if (\n target &&\n (target.closest(\".folder-tree-more-icon\") ||\n target.closest(\".ant-dropdown\"))\n ) {\n return;\n }\n onSelect?.(keys, info);\n },\n [onSelect, editNode],\n );\n\n const titleNode =\n directoryTitle === false || directoryTitle === null\n ? null\n : typeof directoryTitle === \"function\"\n ? directoryTitle()\n : directoryTitle;\n\n return (\n <div className={clsx(styles.directoryPanel, className)} style={{ width }}>\n {titleNode && <div className={styles.directoryTitle}>{titleNode}</div>}\n <div className={styles.directoryTreeContent}\n onDragOver={dragMode ? onContainerDragOver : undefined}\n onDrop={dragMode ? onContainerDrop : undefined}\n >\n <AntDirectoryTree\n style={\n {\n \"--ant-tree-directory-node-selected-bg\": \"rgba(0,0,0,0.03)\",\n \"--ant-tree-directory-node-selected-color\": \"#1a1c1e\",\n } as React.CSSProperties\n }\n treeData={treeDataConverted}\n selectedKeys={selectedKeys}\n expandedKeys={expandedKeys}\n onSelect={handleSelect}\n onExpand={onExpand}\n multiple={false}\n blockNode\n showLine={showLine as any}\n switcherIcon={switcherIcon}\n defaultExpandAll={defaultExpandAll}\n draggable={false}\n />\n </div>\n </div>\n );\n};\n\nexport default DirectoryTreeComponent;"],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import React from "react";
2
- import type { FolderTreeProps } from "./types";
3
- export type { FolderTreeData, FolderTreeProps, FileContentService, } from "./types";
4
- declare const FolderTree: React.FC<FolderTreeProps>;
2
+ import type { FolderTreeProps, FolderTreeRef } from "./types";
3
+ export type { FolderTreeData, FolderTreeProps, FileContentService, FolderTreeRef, } from "./types";
4
+ declare const FolderTree: React.ForwardRefExoticComponent<FolderTreeProps & React.RefAttributes<FolderTreeRef>>;
5
5
  export default FolderTree;