@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 +1 @@
|
|
|
1
|
-
{"version":3,"names":["React","useCallback","useEffect","useState","forwardRef","useImperativeHandle","clsx","DirectoryTreeComponent","FilePreview","useStyles","jsx","_jsx","jsxs","_jsxs","FolderTree","props","ref","className","style","treeData","directoryIcons","previewRender","directoryTitle","previewTitle","_props$selectable","selectable","defaultSelectedFile","_props$defaultExpandA","defaultExpandAll","selectedFile","onSelectedFileChange","_props$directoryTreeW","directoryTreeWidth","emptyRender","defaultExpandedPaths","expandedPaths","onExpandedPathsChange","onFileClick","onFolderClick","fileContentService","moreActions","showLine","switcherIcon","_props$showPreview","showPreview","draggable","onDrop","onRename","onCreate","styles","_useState","_useState2","_slicedToArray","editNode","setEditNode","_useState3","_useState4","createContext","setCreateContext","findNodeAndValidate","path","validateAsFile","arguments","length","undefined","node","isValid","segments","Array","isArray","filter","Boolean","split","findNode","nodes","index","currentSegment","_iterator","_createForOfIteratorHelper","_step","s","n","done","value","children","err","e","f","isValidSelectedFile","filePath","_findNodeAndValidate","key","handleEditValueChange","prev","_objectSpread","currentValue","handleEditConfirm","newValue","trim","mode","_findNodeAndValidate2","oldTitle","originalTitle","newTitle","parentKey","name","type","extra","handleEditCancel","handleStartRename","fullPath","titleStr","title","String","_useState5","_useState6","selectedFileState","setSelectedFileState","_useState7","_useState8","expandedPathsState","setExpandedPaths","_useState9","_useState10","validSelectedFile","setValidSelectedFile","_useState11","_useState12","fileContent","setFileContent","_useState13","_useState14","loadingContent","setLoadingContent","loadContent","_ref","_asyncToGenerator","_regeneratorRuntime","mark","_callee","_findNodeAndValidate3","content","wrap","_callee$","_context","next","abrupt","join","loadFileContent","sent","t0","concat","Error","message","finish","stop","apply","handleSelect","_keys","info","_keys$","keys","selectedNodes","isFolder","some","isLeaf","pathArray","_findNodeAndValidate4","originalNode","fileName","nodeContent","isControlled","handleExpand","newPaths","createNode","parentPath","options","defaultName","tempKey","Date","now","current","includes","_toConsumableArray","container","containerNoPreview","background","backgroundColor","selectedKeys","expandedKeys","onSelect","onExpand","width","onEditValueChange","onEditConfirm","onEditCancel","createInfo","onStartRename","loading","getFileNode","_findNodeAndValidate5","displayName"],"sources":["../../../../src/components/FolderTree/index.tsx"],"sourcesContent":["import React, {\n useCallback,\n useEffect,\n useState,\n forwardRef,\n useImperativeHandle,\n} from \"react\";\nimport type { TreeProps } from \"antd\";\nimport clsx from \"clsx\";\nimport type {\n FolderTreeData,\n FolderTreeProps,\n FolderTreeRef,\n EditNodeInfo,\n CreateNodeContext,\n} from \"./types\";\nimport DirectoryTreeComponent from \"./DirectoryTree\";\nimport FilePreview from \"./FilePreview\";\nimport { useStyles } from \"./styles\";\n\nexport type {\n FolderTreeData,\n FolderTreeProps,\n FileContentService,\n FolderTreeRef,\n} from \"./types\";\n\nconst FolderTree = forwardRef<FolderTreeRef, FolderTreeProps>((props, ref) => {\n const {\n className,\n style,\n treeData,\n directoryIcons,\n previewRender,\n directoryTitle,\n previewTitle,\n selectable = true,\n defaultSelectedFile,\n defaultExpandAll = true,\n selectedFile,\n onSelectedFileChange,\n directoryTreeWidth = 280,\n emptyRender,\n defaultExpandedPaths,\n expandedPaths,\n onExpandedPathsChange,\n onFileClick,\n onFolderClick,\n fileContentService,\n moreActions,\n showLine,\n switcherIcon,\n showPreview = true,\n draggable,\n onDrop,\n onRename,\n onCreate,\n } = props;\n\n const styles = useStyles();\n\n // ====== 编辑态状态 ======\n const [editNode, setEditNode] = useState<EditNodeInfo | null>(null);\n const [createContext, setCreateContext] = useState<CreateNodeContext | null>(\n null\n );\n\n // ====== 工具函数 ======\n const findNodeAndValidate = useCallback(\n (\n path: string | string[],\n validateAsFile = false,\n ): { node: FolderTreeData | undefined; isValid: boolean } => {\n if (!path) return { node: undefined, isValid: false };\n const segments = Array.isArray(path)\n ? path.filter(Boolean)\n : path.split(\"/\").filter(Boolean);\n if (segments.length === 0) return { node: undefined, isValid: false };\n\n const findNode = (\n nodes: FolderTreeData[],\n index = 0,\n ): FolderTreeData | undefined => {\n if (index >= segments.length) return undefined;\n const currentSegment = segments[index];\n for (const node of nodes) {\n if (node.path === currentSegment) {\n return index === segments.length - 1\n ? node\n : node.children\n ? findNode(node.children, index + 1)\n : undefined;\n }\n }\n return undefined;\n };\n\n const node = findNode(treeData);\n const isValid = validateAsFile\n ? !!node && (!node?.children || node.children.length === 0)\n : !!node;\n return { node, isValid };\n },\n [treeData],\n );\n\n const isValidSelectedFile = (filePath?: string[]): boolean =>\n !!(\n filePath &&\n filePath.length > 0 &&\n findNodeAndValidate(filePath, true).isValid\n );\n\n // ====== 编辑态逻辑 ======\n\n // 当 treeData 变化时,检查编辑节点是否还存在\n useEffect(() => {\n if (!editNode) return;\n const { node } = findNodeAndValidate(editNode.key);\n if (!node) {\n setEditNode(null);\n setCreateContext(null);\n }\n }, [treeData]);\n\n // 编辑值变化\n const handleEditValueChange = useCallback((value: string) => {\n setEditNode((prev) => (prev ? { ...prev, currentValue: value } : null));\n }, []);\n\n // 确认编辑\n const handleEditConfirm = useCallback(() => {\n if (!editNode) return;\n const newValue = editNode.currentValue.trim();\n\n if (editNode.mode === \"rename\") {\n const { node } = findNodeAndValidate(editNode.key);\n onRename?.({\n key: editNode.key,\n oldTitle: editNode.originalTitle,\n newTitle: newValue,\n node: node!,\n });\n } else if (editNode.mode === \"create\" && createContext) {\n onCreate?.({\n parentKey: createContext.parentKey,\n name: newValue,\n type: createContext.type,\n extra: createContext.extra,\n });\n }\n\n setEditNode(null);\n setCreateContext(null);\n }, [editNode, createContext, findNodeAndValidate, onRename, onCreate]);\n\n // 取消编辑\n const handleEditCancel = useCallback(() => {\n setEditNode(null);\n setCreateContext(null);\n }, []);\n\n // 开始重命名\n const handleStartRename = useCallback(\n (fullPath: string, node: FolderTreeData) => {\n const titleStr =\n typeof node.title === \"string\" ? node.title : String(node.path);\n setCreateContext(null);\n setEditNode({\n key: fullPath,\n originalTitle: titleStr,\n currentValue: titleStr,\n mode: \"rename\",\n });\n },\n []\n );\n\n // ====== State ======\n const [selectedFileState, setSelectedFileState] = useState<string[]>(() =>\n isValidSelectedFile(selectedFile || defaultSelectedFile)\n ? selectedFile || defaultSelectedFile || []\n : [],\n );\n const [expandedPathsState, setExpandedPaths] = useState<string[] | undefined>(\n expandedPaths || defaultExpandedPaths,\n );\n const [validSelectedFile, setValidSelectedFile] = useState<boolean>(\n isValidSelectedFile(selectedFile || defaultSelectedFile),\n );\n const [fileContent, setFileContent] = useState<string>(\"\");\n const [loadingContent, setLoadingContent] = useState<boolean>(false);\n\n // 受控模式同步\n useEffect(() => {\n if (selectedFile !== undefined) {\n setSelectedFileState(selectedFile);\n setValidSelectedFile(isValidSelectedFile(selectedFile));\n }\n }, [selectedFile, treeData]);\n\n useEffect(() => {\n if (expandedPaths !== undefined) {\n setExpandedPaths(expandedPaths);\n }\n }, [expandedPaths]);\n\n // ====== 加载文件内容 ======\n useEffect(() => {\n const loadContent = async () => {\n if (!validSelectedFile || selectedFileState.length === 0) {\n setFileContent(\"\");\n setLoadingContent(false);\n return;\n }\n\n const filePath = selectedFileState.join(\"/\");\n const segments = filePath.split(\"/\").filter((s) => s !== \"\");\n const { node } = findNodeAndValidate(segments);\n\n if (fileContentService) {\n setLoadingContent(true);\n try {\n const content = await fileContentService.loadFileContent(filePath);\n setFileContent(content);\n } catch (error) {\n setFileContent(\n `// 加载错误: ${\n error instanceof Error ? error.message : \"Unknown error\"\n }`,\n );\n } finally {\n setLoadingContent(false);\n }\n } else if (node?.content) {\n setFileContent(node.content);\n setLoadingContent(false);\n } else {\n setFileContent(\"\");\n setLoadingContent(false);\n }\n };\n\n loadContent();\n }, [\n validSelectedFile,\n selectedFileState,\n treeData,\n fileContentService,\n findNodeAndValidate,\n ]);\n\n // ====== 事件处理 ======\n const handleSelect: TreeProps[\"onSelect\"] = (_keys, info) => {\n const keys = _keys as string[];\n const nodes = Array.isArray(info.selectedNodes)\n ? info.selectedNodes\n : [info.selectedNodes];\n\n const isFolder = nodes.some((node) => !node.isLeaf);\n if (isFolder) {\n if (nodes.length === 1) {\n const node = nodes[0] as unknown as FolderTreeData;\n onFolderClick?.(node.path, node.extra);\n }\n return;\n }\n\n const pathArray = keys[0]?.split(\"/\").filter(Boolean) || [];\n if (pathArray.length === 0) return;\n\n // 从原始 treeData 中查找节点,避免拿到 antd 包装后的 JSX title\n const { node: originalNode } = findNodeAndValidate(pathArray);\n const fileName = originalNode?.title;\n const nodeContent = originalNode?.content;\n\n onSelectedFileChange?.({\n path: pathArray,\n title: fileName,\n content: nodeContent,\n extra: originalNode?.extra,\n });\n\n const isControlled = selectedFile !== undefined;\n if (!isControlled) {\n setValidSelectedFile(true);\n setSelectedFileState(pathArray);\n }\n\n if (originalNode) {\n onFileClick?.(\n keys[0],\n originalNode.content,\n originalNode.extra,\n );\n }\n };\n\n const handleExpand: TreeProps[\"onExpand\"] = (keys) => {\n const newPaths = keys as string[];\n setExpandedPaths(newPaths);\n onExpandedPathsChange?.(newPaths);\n };\n\n // ====== 命令式 API ======\n useImperativeHandle(\n ref,\n () => ({\n createNode: (parentPath, options) => {\n const defaultName =\n options.defaultName ||\n (options.type === \"folder\" ? \"新建文件夹\" : \"新建文件\");\n const tempKey = `__create__${parentPath || \"root\"}__${Date.now()}`;\n\n setCreateContext({\n parentKey: parentPath,\n type: options.type,\n extra: options.extra,\n });\n setEditNode({\n key: tempKey,\n originalTitle: \"\",\n currentValue: defaultName,\n mode: \"create\",\n });\n\n // 自动展开父文件夹\n if (parentPath && parentPath !== \"/\") {\n setExpandedPaths((prev) => {\n const current = prev || [];\n if (current.includes(parentPath)) return current;\n return [...current, parentPath];\n });\n }\n },\n }),\n []\n );\n\n return (\n <div\n className={clsx(\n styles.container,\n !showPreview && styles.containerNoPreview,\n className,\n )}\n style={{\n ...style,\n ...(style?.background\n ? ({\n \"--folder-tree-directory-bg\": style.background,\n } as React.CSSProperties)\n : {}),\n ...(style?.backgroundColor\n ? ({\n \"--folder-tree-directory-bg\": style.backgroundColor,\n } as React.CSSProperties)\n : {}),\n }}\n >\n <DirectoryTreeComponent\n treeData={treeData}\n directoryIcons={directoryIcons}\n selectedKeys={\n selectable && selectedFileState && validSelectedFile\n ? [selectedFileState.join(\"/\")]\n : []\n }\n expandedKeys={expandedPathsState}\n onSelect={handleSelect}\n onExpand={handleExpand}\n defaultExpandAll={defaultExpandAll}\n directoryTitle={directoryTitle}\n moreActions={moreActions}\n showLine={showLine}\n switcherIcon={switcherIcon}\n width={directoryTreeWidth}\n draggable={draggable}\n editNode={editNode}\n onEditValueChange={handleEditValueChange}\n onEditConfirm={handleEditConfirm}\n onEditCancel={handleEditCancel}\n createInfo={createContext}\n onStartRename={handleStartRename}\n onDrop={onDrop}\n />\n {showPreview && (\n <FilePreview\n selectedFile={validSelectedFile ? selectedFileState : []}\n fileContent={fileContent}\n loading={loadingContent}\n previewTitle={previewTitle}\n previewRender={previewRender}\n emptyRender={emptyRender}\n getFileNode={(path) => {\n if (!path || path.length === 0) return undefined;\n const { node } = findNodeAndValidate(path);\n return node\n ? { title: node.title, path: node.path, content: node.content }\n : undefined;\n }}\n />\n )}\n </div>\n );\n});\n\nFolderTree.displayName = \"FolderTree\";\n\nexport default FolderTree;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"names":["React","useRef","useCallback","useEffect","useState","forwardRef","useImperativeHandle","clsx","DirectoryTreeComponent","FilePreview","useStyles","jsx","_jsx","jsxs","_jsxs","getAllExpandedKeys","nodes","parentPath","arguments","length","undefined","keys","forEach","node","_node$children","currentPath","concat","path","children","push","apply","_toConsumableArray","FolderTree","props","ref","className","style","treeData","directoryIcons","previewRender","directoryTitle","previewTitle","_props$selectable","selectable","defaultSelectedFile","_props$defaultExpandA","defaultExpandAll","selectedFile","onSelectedFileChange","_props$directoryTreeW","directoryTreeWidth","emptyRender","defaultExpandedPaths","expandedPaths","onExpandedPathsChange","onFileClick","onFolderClick","fileContentService","moreActions","showLine","switcherIcon","_props$showPreview","showPreview","draggable","onDrop","onRename","onCreate","styles","_useState","_useState2","_slicedToArray","editNode","setEditNode","_useState3","_useState4","createContext","setCreateContext","findNodeAndValidate","validateAsFile","isValid","segments","Array","isArray","filter","Boolean","split","findNode","index","currentSegment","_iterator","_createForOfIteratorHelper","_step","s","n","done","value","err","e","f","isValidSelectedFile","filePath","_findNodeAndValidate","key","handleEditValueChange","prev","_objectSpread","currentValue","handleEditConfirm","newValue","trim","mode","_findNodeAndValidate2","oldTitle","originalTitle","newTitle","parentKey","name","type","extra","handleEditCancel","handleStartRename","fullPath","titleStr","title","String","_useState5","_useState6","selectedFileState","setSelectedFileState","controlled","_useState7","_useState8","expandedPathsState","setExpandedPathsState","_useState9","_useState10","validSelectedFile","setValidSelectedFile","_useState11","_useState12","fileContent","setFileContent","_useState13","_useState14","loadingContent","setLoadingContent","initializedExpandRef","current","loadContent","_ref","_asyncToGenerator","_regeneratorRuntime","mark","_callee","_findNodeAndValidate3","content","wrap","_callee$","_context","next","abrupt","join","loadFileContent","sent","t0","Error","message","finish","stop","handleSelect","_keys","info","_keys$","selectedNodes","isFolder","some","isLeaf","pathArray","_findNodeAndValidate4","originalNode","fileName","nodeContent","isControlled","handleExpand","newPaths","createNode","options","defaultName","tempKey","Date","now","includes","container","containerNoPreview","background","backgroundColor","selectedKeys","expandedKeys","onSelect","onExpand","width","onEditValueChange","onEditConfirm","onEditCancel","createInfo","onStartRename","loading","getFileNode","_findNodeAndValidate5","displayName"],"sources":["../../../../src/components/FolderTree/index.tsx"],"sourcesContent":["import React, {\n useRef,\n useCallback,\n useEffect,\n useState,\n forwardRef,\n useImperativeHandle,\n} from \"react\";\nimport type { TreeProps } from \"antd\";\nimport clsx from \"clsx\";\nimport type {\n FolderTreeData,\n FolderTreeProps,\n FolderTreeRef,\n EditNodeInfo,\n CreateNodeContext,\n} from \"./types\";\nimport DirectoryTreeComponent from \"./DirectoryTree\";\nimport FilePreview from \"./FilePreview\";\nimport { useStyles } from \"./styles\";\n\nexport type {\n FolderTreeData,\n FolderTreeProps,\n FileContentService,\n FolderTreeRef,\n} from \"./types\";\n\nfunction getAllExpandedKeys(\n nodes: FolderTreeData[],\n parentPath = \"\",\n): string[] {\n const keys: string[] = [];\n\n nodes.forEach((node) => {\n const currentPath = parentPath ? `${parentPath}/${node.path}` : node.path;\n\n if (node.children?.length) {\n keys.push(currentPath);\n keys.push(...getAllExpandedKeys(node.children, currentPath));\n }\n });\n\n return keys;\n}\n\nconst FolderTree = forwardRef<FolderTreeRef, FolderTreeProps>((props, ref) => {\n const {\n className,\n style,\n treeData,\n directoryIcons,\n previewRender,\n directoryTitle,\n previewTitle,\n selectable = true,\n defaultSelectedFile,\n defaultExpandAll = true,\n selectedFile,\n onSelectedFileChange,\n directoryTreeWidth = 280,\n emptyRender,\n defaultExpandedPaths,\n expandedPaths,\n onExpandedPathsChange,\n onFileClick,\n onFolderClick,\n fileContentService,\n moreActions,\n showLine,\n switcherIcon,\n showPreview = true,\n draggable,\n onDrop,\n onRename,\n onCreate,\n } = props;\n\n const styles = useStyles();\n\n // ====== 编辑态状态 ======\n const [editNode, setEditNode] = useState<EditNodeInfo | null>(null);\n const [createContext, setCreateContext] = useState<CreateNodeContext | null>(\n null,\n );\n\n // ====== 工具函数 ======\n const findNodeAndValidate = useCallback(\n (\n path: string | string[],\n validateAsFile = false,\n ): { node: FolderTreeData | undefined; isValid: boolean } => {\n if (!path) return { node: undefined, isValid: false };\n const segments = Array.isArray(path)\n ? path.filter(Boolean)\n : path.split(\"/\").filter(Boolean);\n if (segments.length === 0) return { node: undefined, isValid: false };\n\n const findNode = (\n nodes: FolderTreeData[],\n index = 0,\n ): FolderTreeData | undefined => {\n if (index >= segments.length) return undefined;\n const currentSegment = segments[index];\n for (const node of nodes) {\n if (node.path === currentSegment) {\n return index === segments.length - 1\n ? node\n : node.children\n ? findNode(node.children, index + 1)\n : undefined;\n }\n }\n return undefined;\n };\n\n const node = findNode(treeData);\n const isValid = validateAsFile\n ? !!node && (!node?.children || node.children.length === 0)\n : !!node;\n return { node, isValid };\n },\n [treeData],\n );\n\n const isValidSelectedFile = (filePath?: string[]): boolean =>\n !!(\n filePath &&\n filePath.length > 0 &&\n findNodeAndValidate(filePath, true).isValid\n );\n\n // ====== 编辑态逻辑 ======\n\n // 当 treeData 变化时,检查编辑节点是否还存在\n useEffect(() => {\n if (!editNode) return;\n const { node } = findNodeAndValidate(editNode.key);\n if (!node) {\n setEditNode(null);\n setCreateContext(null);\n }\n }, [treeData]);\n\n // 编辑值变化\n const handleEditValueChange = useCallback((value: string) => {\n setEditNode((prev) => (prev ? { ...prev, currentValue: value } : null));\n }, []);\n\n // 确认编辑\n const handleEditConfirm = useCallback(() => {\n if (!editNode) return;\n const newValue = editNode.currentValue.trim();\n\n if (editNode.mode === \"rename\") {\n const { node } = findNodeAndValidate(editNode.key);\n onRename?.({\n key: editNode.key,\n oldTitle: editNode.originalTitle,\n newTitle: newValue,\n node: node!,\n });\n } else if (editNode.mode === \"create\" && createContext) {\n onCreate?.({\n parentKey: createContext.parentKey,\n name: newValue,\n type: createContext.type,\n extra: createContext.extra,\n });\n }\n\n setEditNode(null);\n setCreateContext(null);\n }, [editNode, createContext, findNodeAndValidate, onRename, onCreate]);\n\n // 取消编辑\n const handleEditCancel = useCallback(() => {\n setEditNode(null);\n setCreateContext(null);\n }, []);\n\n // 开始重命名\n const handleStartRename = useCallback(\n (fullPath: string, node: FolderTreeData) => {\n const titleStr =\n typeof node.title === \"string\" ? node.title : String(node.path);\n setCreateContext(null);\n setEditNode({\n key: fullPath,\n originalTitle: titleStr,\n currentValue: titleStr,\n mode: \"rename\",\n });\n },\n [],\n );\n\n // ====== State ======\n const [selectedFileState, setSelectedFileState] = useState<string[]>(() =>\n isValidSelectedFile(selectedFile || defaultSelectedFile)\n ? selectedFile || defaultSelectedFile || []\n : [],\n );\n const controlled = expandedPaths !== undefined;\n\n const [expandedPathsState, setExpandedPathsState] = useState<string[]>(\n defaultExpandedPaths || [],\n );\n const [validSelectedFile, setValidSelectedFile] = useState<boolean>(\n isValidSelectedFile(selectedFile || defaultSelectedFile),\n );\n const [fileContent, setFileContent] = useState<string>(\"\");\n const [loadingContent, setLoadingContent] = useState<boolean>(false);\n const initializedExpandRef = useRef(false);\n\n // 受控模式同步\n useEffect(() => {\n if (selectedFile !== undefined) {\n setSelectedFileState(selectedFile);\n setValidSelectedFile(isValidSelectedFile(selectedFile));\n }\n }, [selectedFile, isValidSelectedFile]);\n\n useEffect(() => {\n if (\n !controlled &&\n defaultExpandAll &&\n !initializedExpandRef.current &&\n treeData.length > 0\n ) {\n initializedExpandRef.current = true;\n\n setExpandedPathsState(getAllExpandedKeys(treeData));\n }\n }, [controlled, defaultExpandAll, treeData]);\n\n useEffect(() => {\n if (controlled) {\n setExpandedPathsState(expandedPaths);\n }\n }, [controlled, expandedPaths]);\n\n // ====== 加载文件内容 ======\n useEffect(() => {\n const loadContent = async () => {\n if (!validSelectedFile || selectedFileState.length === 0) {\n setFileContent(\"\");\n setLoadingContent(false);\n return;\n }\n\n const filePath = selectedFileState.join(\"/\");\n const segments = filePath.split(\"/\").filter((s) => s !== \"\");\n const { node } = findNodeAndValidate(segments);\n\n if (fileContentService) {\n setLoadingContent(true);\n try {\n const content = await fileContentService.loadFileContent(filePath);\n setFileContent(content);\n } catch (error) {\n setFileContent(\n `// 加载错误: ${\n error instanceof Error ? error.message : \"Unknown error\"\n }`,\n );\n } finally {\n setLoadingContent(false);\n }\n } else if (node?.content) {\n setFileContent(node.content);\n setLoadingContent(false);\n } else {\n setFileContent(\"\");\n setLoadingContent(false);\n }\n };\n\n loadContent();\n }, [\n validSelectedFile,\n selectedFileState,\n treeData,\n fileContentService,\n findNodeAndValidate,\n ]);\n\n // ====== 事件处理 ======\n const handleSelect: TreeProps[\"onSelect\"] = (_keys, info) => {\n const keys = _keys as string[];\n const nodes = Array.isArray(info.selectedNodes)\n ? info.selectedNodes\n : [info.selectedNodes];\n\n const isFolder = nodes.some((node) => !node.isLeaf);\n if (isFolder) {\n if (nodes.length === 1) {\n const node = nodes[0] as unknown as FolderTreeData;\n onFolderClick?.(node.path, node.extra);\n }\n return;\n }\n\n const pathArray = keys[0]?.split(\"/\").filter(Boolean) || [];\n if (pathArray.length === 0) return;\n\n // 从原始 treeData 中查找节点,避免拿到 antd 包装后的 JSX title\n const { node: originalNode } = findNodeAndValidate(pathArray);\n const fileName = originalNode?.title;\n const nodeContent = originalNode?.content;\n\n onSelectedFileChange?.({\n path: pathArray,\n title: fileName,\n content: nodeContent,\n extra: originalNode?.extra,\n });\n\n const isControlled = selectedFile !== undefined;\n if (!isControlled) {\n setValidSelectedFile(true);\n setSelectedFileState(pathArray);\n }\n\n if (originalNode) {\n onFileClick?.(keys[0], originalNode.content, originalNode.extra);\n }\n };\n\n const handleExpand: TreeProps[\"onExpand\"] = (keys) => {\n const newPaths = keys as string[];\n\n if (!controlled) {\n setExpandedPathsState(newPaths);\n }\n\n onExpandedPathsChange?.(newPaths);\n };\n\n // ====== 命令式 API ======\n useImperativeHandle(\n ref,\n () => ({\n createNode: (parentPath, options) => {\n const defaultName =\n options.defaultName ||\n (options.type === \"folder\" ? \"新建文件夹\" : \"新建文件\");\n const tempKey = `__create__${parentPath || \"root\"}__${Date.now()}`;\n\n setCreateContext({\n parentKey: parentPath,\n type: options.type,\n extra: options.extra,\n });\n setEditNode({\n key: tempKey,\n originalTitle: \"\",\n currentValue: defaultName,\n mode: \"create\",\n });\n\n // 自动展开父文件夹(仅在受控模式下需要,非受控模式由 defaultExpandAll 处理)\n if (!controlled && parentPath && parentPath !== \"/\") {\n setExpandedPathsState((prev) => {\n const current = prev || [];\n\n if (current.includes(parentPath)) {\n return current;\n }\n\n return [...current, parentPath];\n });\n }\n },\n }),\n [controlled],\n );\n\n return (\n <div\n className={clsx(\n styles.container,\n !showPreview && styles.containerNoPreview,\n className,\n )}\n style={{\n ...style,\n ...(style?.background\n ? ({\n \"--folder-tree-directory-bg\": style.background,\n } as React.CSSProperties)\n : {}),\n ...(style?.backgroundColor\n ? ({\n \"--folder-tree-directory-bg\": style.backgroundColor,\n } as React.CSSProperties)\n : {}),\n }}\n >\n <DirectoryTreeComponent\n treeData={treeData}\n directoryIcons={directoryIcons}\n selectedKeys={\n selectable && selectedFileState && validSelectedFile\n ? [selectedFileState.join(\"/\")]\n : []\n }\n expandedKeys={controlled ? expandedPaths : expandedPathsState}\n onSelect={handleSelect}\n onExpand={handleExpand}\n defaultExpandAll={defaultExpandAll}\n directoryTitle={directoryTitle}\n moreActions={moreActions}\n showLine={showLine}\n switcherIcon={switcherIcon}\n width={directoryTreeWidth}\n draggable={draggable}\n editNode={editNode}\n onEditValueChange={handleEditValueChange}\n onEditConfirm={handleEditConfirm}\n onEditCancel={handleEditCancel}\n createInfo={createContext}\n onStartRename={handleStartRename}\n onDrop={onDrop}\n />\n {showPreview && (\n <FilePreview\n selectedFile={validSelectedFile ? selectedFileState : []}\n fileContent={fileContent}\n loading={loadingContent}\n previewTitle={previewTitle}\n previewRender={previewRender}\n emptyRender={emptyRender}\n getFileNode={(path) => {\n if (!path || path.length === 0) return undefined;\n const { node } = findNodeAndValidate(path);\n return node\n ? { title: node.title, path: node.path, content: node.content }\n : undefined;\n }}\n />\n )}\n </div>\n );\n});\n\nFolderTree.displayName = \"FolderTree\";\n\nexport default FolderTree;\n"],"mappings":"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"}
|
|
@@ -4,6 +4,10 @@ export declare const useStyles: () => {
|
|
|
4
4
|
directoryPanel: string;
|
|
5
5
|
directoryTitle: string;
|
|
6
6
|
directoryTreeContent: string;
|
|
7
|
+
/** 自定义拖拽 - 节点可拖拽样式 */
|
|
8
|
+
dragNodeHandle: string;
|
|
9
|
+
/** 树节点容器,用于相对定位 drop indicator */
|
|
10
|
+
treeNodeWrapper: string;
|
|
7
11
|
previewPanel: string;
|
|
8
12
|
previewTitle: string;
|
|
9
13
|
previewContent: string;
|
|
@@ -1,24 +1,28 @@
|
|
|
1
1
|
import _taggedTemplateLiteral from "@babel/runtime/helpers/esm/taggedTemplateLiteral";
|
|
2
|
-
var _templateObject, _templateObject2, _templateObject3, _templateObject4, _templateObject5, _templateObject6, _templateObject7, _templateObject8, _templateObject9, _templateObject10, _templateObject11, _templateObject12, _templateObject13, _templateObject14, _templateObject15;
|
|
2
|
+
var _templateObject, _templateObject2, _templateObject3, _templateObject4, _templateObject5, _templateObject6, _templateObject7, _templateObject8, _templateObject9, _templateObject10, _templateObject11, _templateObject12, _templateObject13, _templateObject14, _templateObject15, _templateObject16, _templateObject17;
|
|
3
3
|
import { css } from "@emotion/css";
|
|
4
4
|
import { withBasicStyles } from "../../styles/common";
|
|
5
5
|
export var useStyles = withBasicStyles(function () {
|
|
6
6
|
return {
|
|
7
7
|
container: css(_templateObject || (_templateObject = _taggedTemplateLiteral(["\n display: flex;\n width: 100%;\n height: 500px;\n border: 1px solid #e8e8e8;\n border-radius: 8px;\n overflow: hidden;\n background: #fff;\n "]))),
|
|
8
8
|
containerNoPreview: css(_templateObject2 || (_templateObject2 = _taggedTemplateLiteral(["\n height: auto;\n border: none;\n border-radius: 0;\n & > *:first-child {\n border-right: none;\n }\n "]))),
|
|
9
|
-
directoryPanel: css(_templateObject3 || (_templateObject3 = _taggedTemplateLiteral(["\n height: 100%;\n overflow: auto;\n border-right: 1px solid #e8e8e8;\n background: var(--folder-tree-directory-bg, #fafafa);\n "]))),
|
|
9
|
+
directoryPanel: css(_templateObject3 || (_templateObject3 = _taggedTemplateLiteral(["\n display: flex;\n flex-direction: column;\n height: 100%;\n overflow: auto;\n border-right: 1px solid #e8e8e8;\n background: var(--folder-tree-directory-bg, #fafafa);\n "]))),
|
|
10
10
|
directoryTitle: css(_templateObject4 || (_templateObject4 = _taggedTemplateLiteral(["\n padding: 12px 16px;\n font-weight: 600;\n font-size: 14px;\n border-bottom: 1px solid #e8e8e8;\n color: #333;\n "]))),
|
|
11
|
-
directoryTreeContent: css(_templateObject5 || (_templateObject5 = _taggedTemplateLiteral(["\n padding: 4px 8px;\n\n .ant-tree {\n background: transparent;\n }\n .ant-tree-switcher {\n margin-right: 0;\n }\n .ant-tree .ant-tree-node-content-wrapper {\n display: inline-flex;\n align-items: center;\n flex: 1;\n min-width: 0;\n padding-left: 0;\n }\n .ant-tree .ant-tree-title {\n flex: 1;\n min-width: 0;\n }\n .ant-tree-directory .ant-tree-treenode {\n &::before {\n border-radius: 4px;\n }\n }\n /* \u62D6\u62FD\
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
11
|
+
directoryTreeContent: css(_templateObject5 || (_templateObject5 = _taggedTemplateLiteral(["\n padding: 4px 8px;\n flex: 1;\n\n .ant-tree {\n background: transparent;\n height: 100%;\n }\n .ant-tree-switcher {\n margin-right: 0;\n }\n .ant-tree .ant-tree-node-content-wrapper {\n display: inline-flex;\n align-items: center;\n flex: 1;\n min-width: 0;\n padding-left: 0;\n overflow: hidden;\n }\n .ant-tree .ant-tree-title {\n flex: 1;\n min-width: 0;\n overflow: hidden;\n }\n .ant-tree-directory .ant-tree-treenode {\n position: relative;\n &::before {\n border-radius: 4px;\n }\n }\n /* \u81EA\u5B9A\u4E49\u62D6\u62FD\u6837\u5F0F \u2014 \u57FA\u4E8E ant-tree-treenode \u5B9A\u4F4D\uFF0C\u8986\u76D6\u6574\u884C */\n .ant-tree-treenode.folder-tree-drop-before::after {\n content: \"\";\n position: absolute;\n top: -2px;\n left: 0;\n right: 0;\n height: 2px;\n background: transparent;\n border-top: 2px dashed #1677ff;\n z-index: 10;\n pointer-events: none;\n }\n .ant-tree-treenode.folder-tree-drop-inside::after {\n content: \"\";\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n border: 2px dashed #1677ff;\n border-radius: 4px;\n background: rgba(22, 119, 255, 0.04);\n z-index: 10;\n pointer-events: none;\n }\n .ant-tree-treenode.folder-tree-drop-after::after {\n content: \"\";\n position: absolute;\n bottom: -2px;\n left: 0;\n right: 0;\n height: 2px;\n background: transparent;\n border-bottom: 2px dashed #1677ff;\n z-index: 10;\n pointer-events: none;\n }\n "]))),
|
|
12
|
+
/** 自定义拖拽 - 节点可拖拽样式 */
|
|
13
|
+
dragNodeHandle: css(_templateObject6 || (_templateObject6 = _taggedTemplateLiteral(["\n cursor: grab;\n user-select: none;\n\n &:active {\n cursor: grabbing;\n }\n "]))),
|
|
14
|
+
/** 树节点容器,用于相对定位 drop indicator */
|
|
15
|
+
treeNodeWrapper: css(_templateObject7 || (_templateObject7 = _taggedTemplateLiteral(["\n position: relative;\n min-width: 0;\n overflow: hidden;\n "]))),
|
|
16
|
+
previewPanel: css(_templateObject8 || (_templateObject8 = _taggedTemplateLiteral(["\n flex: 1;\n height: 100%;\n overflow: auto;\n display: flex;\n flex-direction: column;\n "]))),
|
|
17
|
+
previewTitle: css(_templateObject9 || (_templateObject9 = _taggedTemplateLiteral(["\n padding: 10px 16px;\n font-size: 13px;\n font-weight: 500;\n border-bottom: 1px solid #e8e8e8;\n display: flex;\n align-items: center;\n justify-content: space-between;\n color: #333;\n background: #fff;\n "]))),
|
|
18
|
+
previewContent: css(_templateObject10 || (_templateObject10 = _taggedTemplateLiteral(["\n flex: 1;\n overflow: auto;\n padding: 16px;\n font-size: 13px;\n line-height: 1.6;\n "]))),
|
|
19
|
+
emptyContainer: css(_templateObject11 || (_templateObject11 = _taggedTemplateLiteral(["\n display: flex;\n align-items: center;\n justify-content: center;\n height: 100%;\n "]))),
|
|
20
|
+
loadingContainer: css(_templateObject12 || (_templateObject12 = _taggedTemplateLiteral(["\n display: flex;\n align-items: center;\n justify-content: center;\n height: 100%;\n "]))),
|
|
21
|
+
treeNodeTitle: css(_templateObject13 || (_templateObject13 = _taggedTemplateLiteral(["\n display: flex;\n align-items: center;\n justify-content: space-between;\n min-width: 0;\n overflow: hidden;\n padding-right: 4px;\n\n > span:first-child {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n "]))),
|
|
22
|
+
moreIcon: css(_templateObject14 || (_templateObject14 = _taggedTemplateLiteral(["\n opacity: 0;\n cursor: pointer;\n padding: 0 4px;\n margin: 2px;\n color: #999;\n font-size: 12px;\n transition: all 0.2s;\n\n &:hover {\n border-radius: 50%;\n color: #333;\n background: rgba(0, 0, 0, 0.04);\n }\n "]))),
|
|
23
|
+
treeNodeTitleHover: css(_templateObject15 || (_templateObject15 = _taggedTemplateLiteral(["\n &:hover .folder-tree-more-icon {\n opacity: 1;\n }\n "]))),
|
|
24
|
+
inlineInput: css(_templateObject16 || (_templateObject16 = _taggedTemplateLiteral(["\n width: 100%;\n .ant-input {\n height: 22px;\n font-size: 13px;\n padding: 0 6px;\n border-radius: 4px;\n }\n "]))),
|
|
25
|
+
copyBtn: css(_templateObject17 || (_templateObject17 = _taggedTemplateLiteral(["\n cursor: pointer;\n color: #999;\n font-size: 14px;\n &:hover {\n color: #1677ff;\n }\n "])))
|
|
22
26
|
};
|
|
23
27
|
});
|
|
24
28
|
//# sourceMappingURL=styles.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["css","withBasicStyles","useStyles","container","_templateObject","_taggedTemplateLiteral","containerNoPreview","_templateObject2","directoryPanel","_templateObject3","directoryTitle","_templateObject4","directoryTreeContent","_templateObject5","
|
|
1
|
+
{"version":3,"names":["css","withBasicStyles","useStyles","container","_templateObject","_taggedTemplateLiteral","containerNoPreview","_templateObject2","directoryPanel","_templateObject3","directoryTitle","_templateObject4","directoryTreeContent","_templateObject5","dragNodeHandle","_templateObject6","treeNodeWrapper","_templateObject7","previewPanel","_templateObject8","previewTitle","_templateObject9","previewContent","_templateObject10","emptyContainer","_templateObject11","loadingContainer","_templateObject12","treeNodeTitle","_templateObject13","moreIcon","_templateObject14","treeNodeTitleHover","_templateObject15","inlineInput","_templateObject16","copyBtn","_templateObject17"],"sources":["../../../../src/components/FolderTree/styles.tsx"],"sourcesContent":["import { css } from \"@emotion/css\";\nimport { withBasicStyles } from \"@/styles/common\";\n\nexport const useStyles = withBasicStyles(() => ({\n container: css`\n display: flex;\n width: 100%;\n height: 500px;\n border: 1px solid #e8e8e8;\n border-radius: 8px;\n overflow: hidden;\n background: #fff;\n `,\n containerNoPreview: css`\n height: auto;\n border: none;\n border-radius: 0;\n & > *:first-child {\n border-right: none;\n }\n `,\n directoryPanel: css`\n display: flex;\n flex-direction: column;\n height: 100%;\n overflow: auto;\n border-right: 1px solid #e8e8e8;\n background: var(--folder-tree-directory-bg, #fafafa);\n `,\n directoryTitle: css`\n padding: 12px 16px;\n font-weight: 600;\n font-size: 14px;\n border-bottom: 1px solid #e8e8e8;\n color: #333;\n `,\n directoryTreeContent: css`\n padding: 4px 8px;\n flex: 1;\n\n .ant-tree {\n background: transparent;\n height: 100%;\n }\n .ant-tree-switcher {\n margin-right: 0;\n }\n .ant-tree .ant-tree-node-content-wrapper {\n display: inline-flex;\n align-items: center;\n flex: 1;\n min-width: 0;\n padding-left: 0;\n overflow: hidden;\n }\n .ant-tree .ant-tree-title {\n flex: 1;\n min-width: 0;\n overflow: hidden;\n }\n .ant-tree-directory .ant-tree-treenode {\n position: relative;\n &::before {\n border-radius: 4px;\n }\n }\n /* 自定义拖拽样式 — 基于 ant-tree-treenode 定位,覆盖整行 */\n .ant-tree-treenode.folder-tree-drop-before::after {\n content: \"\";\n position: absolute;\n top: -2px;\n left: 0;\n right: 0;\n height: 2px;\n background: transparent;\n border-top: 2px dashed #1677ff;\n z-index: 10;\n pointer-events: none;\n }\n .ant-tree-treenode.folder-tree-drop-inside::after {\n content: \"\";\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n border: 2px dashed #1677ff;\n border-radius: 4px;\n background: rgba(22, 119, 255, 0.04);\n z-index: 10;\n pointer-events: none;\n }\n .ant-tree-treenode.folder-tree-drop-after::after {\n content: \"\";\n position: absolute;\n bottom: -2px;\n left: 0;\n right: 0;\n height: 2px;\n background: transparent;\n border-bottom: 2px dashed #1677ff;\n z-index: 10;\n pointer-events: none;\n }\n `,\n\n /** 自定义拖拽 - 节点可拖拽样式 */\n dragNodeHandle: css`\n cursor: grab;\n user-select: none;\n\n &:active {\n cursor: grabbing;\n }\n `,\n /** 树节点容器,用于相对定位 drop indicator */\n treeNodeWrapper: css`\n position: relative;\n min-width: 0;\n overflow: hidden;\n `,\n previewPanel: css`\n flex: 1;\n height: 100%;\n overflow: auto;\n display: flex;\n flex-direction: column;\n `,\n previewTitle: css`\n padding: 10px 16px;\n font-size: 13px;\n font-weight: 500;\n border-bottom: 1px solid #e8e8e8;\n display: flex;\n align-items: center;\n justify-content: space-between;\n color: #333;\n background: #fff;\n `,\n previewContent: css`\n flex: 1;\n overflow: auto;\n padding: 16px;\n font-size: 13px;\n line-height: 1.6;\n `,\n emptyContainer: css`\n display: flex;\n align-items: center;\n justify-content: center;\n height: 100%;\n `,\n loadingContainer: css`\n display: flex;\n align-items: center;\n justify-content: center;\n height: 100%;\n `,\n treeNodeTitle: css`\n display: flex;\n align-items: center;\n justify-content: space-between;\n min-width: 0;\n overflow: hidden;\n padding-right: 4px;\n\n > span:first-child {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n `,\n moreIcon: css`\n opacity: 0;\n cursor: pointer;\n padding: 0 4px;\n margin: 2px;\n color: #999;\n font-size: 12px;\n transition: all 0.2s;\n\n &:hover {\n border-radius: 50%;\n color: #333;\n background: rgba(0, 0, 0, 0.04);\n }\n `,\n treeNodeTitleHover: css`\n &:hover .folder-tree-more-icon {\n opacity: 1;\n }\n `,\n inlineInput: css`\n width: 100%;\n .ant-input {\n height: 22px;\n font-size: 13px;\n padding: 0 6px;\n border-radius: 4px;\n }\n `,\n copyBtn: css`\n cursor: pointer;\n color: #999;\n font-size: 14px;\n &:hover {\n color: #1677ff;\n }\n `,\n}));\n"],"mappings":";;AAAA,SAASA,GAAG,QAAQ,cAAc;AAClC,SAASC,eAAe;AAExB,OAAO,IAAMC,SAAS,GAAGD,eAAe,CAAC;EAAA,OAAO;IAC9CE,SAAS,EAAEH,GAAG,CAAAI,eAAA,KAAAA,eAAA,GAAAC,sBAAA,6KAQb;IACDC,kBAAkB,EAAEN,GAAG,CAAAO,gBAAA,KAAAA,gBAAA,GAAAF,sBAAA,oIAOtB;IACDG,cAAc,EAAER,GAAG,CAAAS,gBAAA,KAAAA,gBAAA,GAAAJ,sBAAA,sMAOlB;IACDK,cAAc,EAAEV,GAAG,CAAAW,gBAAA,KAAAA,gBAAA,GAAAN,sBAAA,2IAMlB;IACDO,oBAAoB,EAAEZ,GAAG,CAAAa,gBAAA,KAAAA,gBAAA,GAAAR,sBAAA,2qDAoEtB;IAEH;IACAS,cAAc,EAAEd,GAAG,CAAAe,gBAAA,KAAAA,gBAAA,GAAAV,sBAAA,yGAOlB;IACD;IACAW,eAAe,EAAEhB,GAAG,CAAAiB,gBAAA,KAAAA,gBAAA,GAAAZ,sBAAA,+EAInB;IACDa,YAAY,EAAElB,GAAG,CAAAmB,gBAAA,KAAAA,gBAAA,GAAAd,sBAAA,mHAMhB;IACDe,YAAY,EAAEpB,GAAG,CAAAqB,gBAAA,KAAAA,gBAAA,GAAAhB,sBAAA,qPAUhB;IACDiB,cAAc,EAAEtB,GAAG,CAAAuB,iBAAA,KAAAA,iBAAA,GAAAlB,sBAAA,gHAMlB;IACDmB,cAAc,EAAExB,GAAG,CAAAyB,iBAAA,KAAAA,iBAAA,GAAApB,sBAAA,2GAKlB;IACDqB,gBAAgB,EAAE1B,GAAG,CAAA2B,iBAAA,KAAAA,iBAAA,GAAAtB,sBAAA,2GAKpB;IACDuB,aAAa,EAAE5B,GAAG,CAAA6B,iBAAA,KAAAA,iBAAA,GAAAxB,sBAAA,0RAajB;IACDyB,QAAQ,EAAE9B,GAAG,CAAA+B,iBAAA,KAAAA,iBAAA,GAAA1B,sBAAA,4QAcZ;IACD2B,kBAAkB,EAAEhC,GAAG,CAAAiC,iBAAA,KAAAA,iBAAA,GAAA5B,sBAAA,4EAItB;IACD6B,WAAW,EAAElC,GAAG,CAAAmC,iBAAA,KAAAA,iBAAA,GAAA9B,sBAAA,sJAQf;IACD+B,OAAO,EAAEpC,GAAG,CAAAqC,iBAAA,KAAAA,iBAAA,GAAAhC,sBAAA;EAQd,CAAC;AAAA,CAAC,CAAC"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/// <reference types="react" />
|
|
2
|
+
import type { DataNode } from "antd/es/tree";
|
|
3
|
+
/**
|
|
4
|
+
* Drop position:
|
|
5
|
+
* -1 = before the node (gap above)
|
|
6
|
+
* 0 = inside the node (as child, for folders only)
|
|
7
|
+
* 1 = after the node (gap below)
|
|
8
|
+
*/
|
|
9
|
+
export type DropPosition = -1 | 0 | 1;
|
|
10
|
+
export interface DragState {
|
|
11
|
+
/** 拖拽中的节点 key */
|
|
12
|
+
dragNodeKey: string | null;
|
|
13
|
+
/** 当前悬停的目标节点 key */
|
|
14
|
+
dropNodeKey: string | null;
|
|
15
|
+
/** drop 位置 */
|
|
16
|
+
dropPosition: DropPosition;
|
|
17
|
+
}
|
|
18
|
+
export interface UseFolderDragOptions {
|
|
19
|
+
/** 是否启用拖拽('file' | 'folder' | 'all') */
|
|
20
|
+
dragMode: "file" | "folder" | "all" | false;
|
|
21
|
+
/** 拖拽完成回调 */
|
|
22
|
+
onDrop?: (dragNode: DataNode, dropNode: DataNode, dropPosition: DropPosition) => void;
|
|
23
|
+
/** 拖拽进入节点时回调(用于自动展开) */
|
|
24
|
+
onDragEnterExpand?: (nodeKey: string) => void;
|
|
25
|
+
}
|
|
26
|
+
export interface UseFolderDragReturn {
|
|
27
|
+
dragState: DragState;
|
|
28
|
+
/** 绑定到 draggable 元素的 onDragStart */
|
|
29
|
+
onDragStart: (e: React.DragEvent, node: DataNode) => void;
|
|
30
|
+
/** 绑定到 draggable 元素的 onDragEnd */
|
|
31
|
+
onDragEnd: (e: React.DragEvent) => void;
|
|
32
|
+
/** 绑定到每个树节点容器的 onDragEnter */
|
|
33
|
+
onItemDragEnter: (e: React.DragEvent, node: DataNode) => void;
|
|
34
|
+
/** 绑定到每个树节点容器的 onDragOver */
|
|
35
|
+
onItemDragOver: (e: React.DragEvent, node: DataNode) => void;
|
|
36
|
+
/** 绑定到每个树节点容器的 onDragLeave */
|
|
37
|
+
onItemDragLeave: (e: React.DragEvent) => void;
|
|
38
|
+
/** 绑定到每个树节点容器的 onDrop */
|
|
39
|
+
onItemDrop: (e: React.DragEvent, node: DataNode) => void;
|
|
40
|
+
/** 绑定到树内容容器(directoryTreeContent)的 onDragOver,处理拖到空白区域 */
|
|
41
|
+
onContainerDragOver: (e: React.DragEvent) => void;
|
|
42
|
+
/** 绑定到树内容容器(directoryTreeContent)的 onDrop,处理拖到空白区域 */
|
|
43
|
+
onContainerDrop: (e: React.DragEvent) => void;
|
|
44
|
+
/** 清除拖拽状态 */
|
|
45
|
+
clearDragState: () => void;
|
|
46
|
+
/** 是否正在拖拽中 */
|
|
47
|
+
isDragging: boolean;
|
|
48
|
+
/** 判断节点是否可拖拽 */
|
|
49
|
+
canDragNode: (node: DataNode & {
|
|
50
|
+
_isTempNode?: boolean;
|
|
51
|
+
}) => boolean;
|
|
52
|
+
}
|
|
53
|
+
export declare function useFolderDrag(options: UseFolderDragOptions): UseFolderDragReturn;
|
|
@@ -0,0 +1,324 @@
|
|
|
1
|
+
import _objectSpread from "@babel/runtime/helpers/esm/objectSpread2";
|
|
2
|
+
import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
|
|
3
|
+
import { useCallback, useRef, useState } from "react";
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Drop position:
|
|
7
|
+
* -1 = before the node (gap above)
|
|
8
|
+
* 0 = inside the node (as child, for folders only)
|
|
9
|
+
* 1 = after the node (gap below)
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* 根据鼠标 Y 坐标和节点 DOM rect 计算 dropPosition
|
|
14
|
+
*/
|
|
15
|
+
function calcDropPositionByRect(clientY, rect, isFolder) {
|
|
16
|
+
var top = rect.top;
|
|
17
|
+
var height = rect.height;
|
|
18
|
+
var relativeY = clientY - top;
|
|
19
|
+
|
|
20
|
+
// 上半部分 1/3:before
|
|
21
|
+
if (relativeY < height / 3) {
|
|
22
|
+
return {
|
|
23
|
+
dropPosition: -1,
|
|
24
|
+
insideThreshold: false
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
// 下半部分 1/3:after
|
|
28
|
+
if (relativeY > height * 2 / 3) {
|
|
29
|
+
return {
|
|
30
|
+
dropPosition: 1,
|
|
31
|
+
insideThreshold: false
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
// 中间 1/3:如果是文件夹,drop inside;如果是文件,drop after
|
|
35
|
+
if (isFolder) {
|
|
36
|
+
return {
|
|
37
|
+
dropPosition: 0,
|
|
38
|
+
insideThreshold: true
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
return {
|
|
42
|
+
dropPosition: 1,
|
|
43
|
+
insideThreshold: false
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
var INDICATOR_BEFORE_CLASS = "folder-tree-drop-before";
|
|
47
|
+
var INDICATOR_INSIDE_CLASS = "folder-tree-drop-inside";
|
|
48
|
+
var INDICATOR_AFTER_CLASS = "folder-tree-drop-after";
|
|
49
|
+
var INDICATOR_CLASSES = [INDICATOR_BEFORE_CLASS, INDICATOR_INSIDE_CLASS, INDICATOR_AFTER_CLASS];
|
|
50
|
+
|
|
51
|
+
/** 从 data-node-key 元素找到对应的 ant-tree-treenode */
|
|
52
|
+
function getTreeNodeEl(dataNodeKeyEl) {
|
|
53
|
+
return dataNodeKeyEl.closest(".ant-tree-treenode");
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/** 清除所有 treenode 上的 indicator class */
|
|
57
|
+
function clearAllTreenodeIndicators() {
|
|
58
|
+
document.querySelectorAll(".ant-tree-treenode").forEach(function (el) {
|
|
59
|
+
var _el$classList;
|
|
60
|
+
(_el$classList = el.classList).remove.apply(_el$classList, INDICATOR_CLASSES);
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
export function useFolderDrag(options) {
|
|
64
|
+
var dragMode = options.dragMode,
|
|
65
|
+
onDrop = options.onDrop,
|
|
66
|
+
onDragEnterExpand = options.onDragEnterExpand;
|
|
67
|
+
var _useState = useState({
|
|
68
|
+
dragNodeKey: null,
|
|
69
|
+
dropNodeKey: null,
|
|
70
|
+
dropPosition: 0
|
|
71
|
+
}),
|
|
72
|
+
_useState2 = _slicedToArray(_useState, 2),
|
|
73
|
+
dragState = _useState2[0],
|
|
74
|
+
setDragState = _useState2[1];
|
|
75
|
+
var _useState3 = useState(false),
|
|
76
|
+
_useState4 = _slicedToArray(_useState3, 2),
|
|
77
|
+
isDragging = _useState4[0],
|
|
78
|
+
setIsDragging = _useState4[1];
|
|
79
|
+
|
|
80
|
+
// 用 ref 追踪拖拽中数据,避免闭包问题
|
|
81
|
+
var dragNodeRef = useRef(null);
|
|
82
|
+
var expandTimerRef = useRef(null);
|
|
83
|
+
var prevDropTargetRef = useRef(null);
|
|
84
|
+
var canDragNode = useCallback(function (node) {
|
|
85
|
+
if (node._isTempNode) return false;
|
|
86
|
+
if (dragMode === "file") return !!node.isLeaf;
|
|
87
|
+
if (dragMode === "folder") return !node.isLeaf;
|
|
88
|
+
return true; // 'all'
|
|
89
|
+
}, [dragMode]);
|
|
90
|
+
var clearAllIndicators = useCallback(function () {
|
|
91
|
+
clearAllTreenodeIndicators();
|
|
92
|
+
}, []);
|
|
93
|
+
var clearDragState = useCallback(function () {
|
|
94
|
+
clearAllIndicators();
|
|
95
|
+
// 恢复所有 treenode 的透明度
|
|
96
|
+
document.querySelectorAll(".ant-tree-treenode").forEach(function (el) {
|
|
97
|
+
el.style.opacity = "";
|
|
98
|
+
});
|
|
99
|
+
setDragState({
|
|
100
|
+
dragNodeKey: null,
|
|
101
|
+
dropNodeKey: null,
|
|
102
|
+
dropPosition: 0
|
|
103
|
+
});
|
|
104
|
+
setIsDragging(false);
|
|
105
|
+
dragNodeRef.current = null;
|
|
106
|
+
prevDropTargetRef.current = null;
|
|
107
|
+
if (expandTimerRef.current) {
|
|
108
|
+
clearTimeout(expandTimerRef.current);
|
|
109
|
+
expandTimerRef.current = null;
|
|
110
|
+
}
|
|
111
|
+
}, [clearAllIndicators]);
|
|
112
|
+
var onDragStart = useCallback(function (e, node) {
|
|
113
|
+
if (!dragMode) return;
|
|
114
|
+
var nd = node;
|
|
115
|
+
if (!canDragNode(nd)) {
|
|
116
|
+
e.preventDefault();
|
|
117
|
+
return;
|
|
118
|
+
}
|
|
119
|
+
dragNodeRef.current = node;
|
|
120
|
+
setIsDragging(true);
|
|
121
|
+
setDragState(function (prev) {
|
|
122
|
+
return _objectSpread(_objectSpread({}, prev), {}, {
|
|
123
|
+
dragNodeKey: String(node.key)
|
|
124
|
+
});
|
|
125
|
+
});
|
|
126
|
+
|
|
127
|
+
// 标记被拖拽的节点(在 treenode 上加 translucent)
|
|
128
|
+
var treeNodeEl = getTreeNodeEl(e.currentTarget);
|
|
129
|
+
if (treeNodeEl) {
|
|
130
|
+
treeNodeEl.style.opacity = "0.4";
|
|
131
|
+
}
|
|
132
|
+
e.dataTransfer.effectAllowed = "move";
|
|
133
|
+
e.dataTransfer.setData("text/plain", String(node.key));
|
|
134
|
+
}, [dragMode, canDragNode]);
|
|
135
|
+
var onDragEnd = useCallback(function (_e) {
|
|
136
|
+
clearDragState();
|
|
137
|
+
}, [clearDragState]);
|
|
138
|
+
var onItemDragEnter = useCallback(function (e, node) {
|
|
139
|
+
e.preventDefault();
|
|
140
|
+
e.stopPropagation();
|
|
141
|
+
if (!dragNodeRef.current) return;
|
|
142
|
+
var nodeKey = String(node.key);
|
|
143
|
+
var dragKey = String(dragNodeRef.current.key);
|
|
144
|
+
|
|
145
|
+
// 不能拖到自己身上
|
|
146
|
+
if (nodeKey === dragKey) return;
|
|
147
|
+
|
|
148
|
+
// 自动展开收起状态的文件夹
|
|
149
|
+
if (!node.isLeaf) {
|
|
150
|
+
if (expandTimerRef.current) {
|
|
151
|
+
clearTimeout(expandTimerRef.current);
|
|
152
|
+
}
|
|
153
|
+
expandTimerRef.current = setTimeout(function () {
|
|
154
|
+
onDragEnterExpand === null || onDragEnterExpand === void 0 || onDragEnterExpand(nodeKey);
|
|
155
|
+
}, 800);
|
|
156
|
+
}
|
|
157
|
+
}, [onDragEnterExpand]);
|
|
158
|
+
var onItemDragOver = useCallback(function (e, node) {
|
|
159
|
+
var _currentTreeNode$clas;
|
|
160
|
+
e.preventDefault();
|
|
161
|
+
e.stopPropagation();
|
|
162
|
+
if (!dragNodeRef.current) return;
|
|
163
|
+
var nodeKey = String(node.key);
|
|
164
|
+
var dragKey = String(dragNodeRef.current.key);
|
|
165
|
+
if (nodeKey === dragKey) return;
|
|
166
|
+
var rect = e.currentTarget.getBoundingClientRect();
|
|
167
|
+
var isFolder = !node.isLeaf;
|
|
168
|
+
var _calcDropPositionByRe = calcDropPositionByRect(e.clientY, rect, isFolder),
|
|
169
|
+
dropPosition = _calcDropPositionByRe.dropPosition;
|
|
170
|
+
|
|
171
|
+
// 如果节点是文件且计算结果是 inside(0),改为 after(1)
|
|
172
|
+
var finalDropPosition = !isFolder && dropPosition === 0 ? 1 : dropPosition;
|
|
173
|
+
var currentTreeNode = getTreeNodeEl(e.currentTarget);
|
|
174
|
+
if (!currentTreeNode) return;
|
|
175
|
+
|
|
176
|
+
// 清除上一个节点的 indicator
|
|
177
|
+
if (prevDropTargetRef.current && prevDropTargetRef.current !== nodeKey) {
|
|
178
|
+
var _document$querySelect;
|
|
179
|
+
var prevTreeNode = (_document$querySelect = document.querySelector(".ant-tree-treenode [data-node-key=\"".concat(prevDropTargetRef.current, "\"]"))) === null || _document$querySelect === void 0 ? void 0 : _document$querySelect.closest(".ant-tree-treenode");
|
|
180
|
+
if (prevTreeNode) {
|
|
181
|
+
var _prevTreeNode$classLi;
|
|
182
|
+
(_prevTreeNode$classLi = prevTreeNode.classList).remove.apply(_prevTreeNode$classLi, INDICATOR_CLASSES);
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
prevDropTargetRef.current = nodeKey;
|
|
186
|
+
|
|
187
|
+
// 在当前 treenode 上设置 indicator class
|
|
188
|
+
(_currentTreeNode$clas = currentTreeNode.classList).remove.apply(_currentTreeNode$clas, INDICATOR_CLASSES);
|
|
189
|
+
var cls = finalDropPosition === -1 ? INDICATOR_BEFORE_CLASS : finalDropPosition === 0 ? INDICATOR_INSIDE_CLASS : INDICATOR_AFTER_CLASS;
|
|
190
|
+
currentTreeNode.classList.add(cls);
|
|
191
|
+
setDragState({
|
|
192
|
+
dragNodeKey: dragKey,
|
|
193
|
+
dropNodeKey: nodeKey,
|
|
194
|
+
dropPosition: finalDropPosition
|
|
195
|
+
});
|
|
196
|
+
e.dataTransfer.dropEffect = "move";
|
|
197
|
+
}, []);
|
|
198
|
+
var onItemDragLeave = useCallback(function (_e) {
|
|
199
|
+
// 不清除 dragState,因为可能只是进入子元素触发的 leave
|
|
200
|
+
}, []);
|
|
201
|
+
var onItemDrop = useCallback(function (e, node) {
|
|
202
|
+
e.preventDefault();
|
|
203
|
+
e.stopPropagation();
|
|
204
|
+
if (!dragNodeRef.current) return;
|
|
205
|
+
var nodeKey = String(node.key);
|
|
206
|
+
var dragKey = String(dragNodeRef.current.key);
|
|
207
|
+
if (nodeKey === dragKey) {
|
|
208
|
+
clearDragState();
|
|
209
|
+
return;
|
|
210
|
+
}
|
|
211
|
+
var rect = e.currentTarget.getBoundingClientRect();
|
|
212
|
+
var isFolder = !node.isLeaf;
|
|
213
|
+
var _calcDropPositionByRe2 = calcDropPositionByRect(e.clientY, rect, isFolder),
|
|
214
|
+
dropPosition = _calcDropPositionByRe2.dropPosition;
|
|
215
|
+
var finalDropPosition = !isFolder && dropPosition === 0 ? 1 : dropPosition;
|
|
216
|
+
onDrop === null || onDrop === void 0 || onDrop(dragNodeRef.current, node, finalDropPosition);
|
|
217
|
+
clearDragState();
|
|
218
|
+
}, [onDrop, clearDragState]);
|
|
219
|
+
|
|
220
|
+
// ====== 容器级别的事件处理(用于拖到空白区域/底部) ======
|
|
221
|
+
|
|
222
|
+
/**
|
|
223
|
+
* 获取容器内所有可见的 data-node-key 元素的 rect 列表,
|
|
224
|
+
* 用于判断鼠标是否在最后一个节点下方
|
|
225
|
+
*/
|
|
226
|
+
var getLastNodeRect = useCallback(function (containerEl) {
|
|
227
|
+
var nodeEls = containerEl.querySelectorAll("[data-node-key]");
|
|
228
|
+
if (nodeEls.length === 0) return null;
|
|
229
|
+
var lastEl = nodeEls[nodeEls.length - 1];
|
|
230
|
+
return lastEl.getBoundingClientRect();
|
|
231
|
+
}, []);
|
|
232
|
+
var onContainerDragOver = useCallback(function (e) {
|
|
233
|
+
if (!dragNodeRef.current) return;
|
|
234
|
+
var containerEl = e.currentTarget;
|
|
235
|
+
|
|
236
|
+
// 检查鼠标是否在某个节点上(通过判断 event target 是否在 data-node-key 元素内)
|
|
237
|
+
var targetEl = e.target;
|
|
238
|
+
var isOnNode = targetEl.closest("[data-node-key]");
|
|
239
|
+
if (isOnNode) {
|
|
240
|
+
// 鼠标在节点上,由 onItemDragOver 处理,这里清除底部相关的 indicator
|
|
241
|
+
if (prevDropTargetRef.current === "__bottom_placeholder__") {
|
|
242
|
+
clearAllIndicators();
|
|
243
|
+
prevDropTargetRef.current = null;
|
|
244
|
+
}
|
|
245
|
+
return;
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
// 鼠标在空白区域,检查是否在所有节点下方
|
|
249
|
+
var lastRect = getLastNodeRect(containerEl);
|
|
250
|
+
if (lastRect && e.clientY > lastRect.bottom) {
|
|
251
|
+
e.preventDefault();
|
|
252
|
+
e.stopPropagation();
|
|
253
|
+
|
|
254
|
+
// 清除其他节点的 indicator
|
|
255
|
+
if (prevDropTargetRef.current && prevDropTargetRef.current !== "__bottom_placeholder__") {
|
|
256
|
+
var _document$querySelect2;
|
|
257
|
+
var prevTreeNode = (_document$querySelect2 = document.querySelector(".ant-tree-treenode [data-node-key=\"".concat(prevDropTargetRef.current, "\"]"))) === null || _document$querySelect2 === void 0 ? void 0 : _document$querySelect2.closest(".ant-tree-treenode");
|
|
258
|
+
if (prevTreeNode) {
|
|
259
|
+
var _prevTreeNode$classLi2;
|
|
260
|
+
(_prevTreeNode$classLi2 = prevTreeNode.classList).remove.apply(_prevTreeNode$classLi2, INDICATOR_CLASSES);
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
prevDropTargetRef.current = "__bottom_placeholder__";
|
|
264
|
+
|
|
265
|
+
// 在最后一个 treenode 上显示 after 样式
|
|
266
|
+
var lastNodeEls = containerEl.querySelectorAll(".ant-tree-treenode");
|
|
267
|
+
var lastTreenode = lastNodeEls[lastNodeEls.length - 1];
|
|
268
|
+
if (lastTreenode) {
|
|
269
|
+
var _lastTreenode$classLi;
|
|
270
|
+
(_lastTreenode$classLi = lastTreenode.classList).remove.apply(_lastTreenode$classLi, INDICATOR_CLASSES);
|
|
271
|
+
lastTreenode.classList.add(INDICATOR_AFTER_CLASS);
|
|
272
|
+
}
|
|
273
|
+
setDragState({
|
|
274
|
+
dragNodeKey: String(dragNodeRef.current.key),
|
|
275
|
+
dropNodeKey: "__bottom_placeholder__",
|
|
276
|
+
dropPosition: 1
|
|
277
|
+
});
|
|
278
|
+
e.dataTransfer.dropEffect = "move";
|
|
279
|
+
}
|
|
280
|
+
}, [clearAllIndicators, getLastNodeRect]);
|
|
281
|
+
var onContainerDrop = useCallback(function (e) {
|
|
282
|
+
if (!dragNodeRef.current) {
|
|
283
|
+
return;
|
|
284
|
+
}
|
|
285
|
+
var containerEl = e.currentTarget;
|
|
286
|
+
var targetEl = e.target;
|
|
287
|
+
var isOnNode = targetEl.closest("[data-node-key]");
|
|
288
|
+
if (isOnNode) {
|
|
289
|
+
// 鼠标在节点上,由 onItemDrop 处理
|
|
290
|
+
return;
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
// 检查是否在最后一个节点下方
|
|
294
|
+
var lastRect = getLastNodeRect(containerEl);
|
|
295
|
+
if (lastRect && e.clientY > lastRect.bottom) {
|
|
296
|
+
e.preventDefault();
|
|
297
|
+
e.stopPropagation();
|
|
298
|
+
|
|
299
|
+
// 拖到最底部:视为 insert after 最后一个根节点
|
|
300
|
+
var placeholderNode = {
|
|
301
|
+
key: "__bottom_placeholder__",
|
|
302
|
+
title: "",
|
|
303
|
+
isLeaf: true
|
|
304
|
+
};
|
|
305
|
+
onDrop === null || onDrop === void 0 || onDrop(dragNodeRef.current, placeholderNode, 1);
|
|
306
|
+
clearDragState();
|
|
307
|
+
}
|
|
308
|
+
}, [onDrop, clearDragState, getLastNodeRect]);
|
|
309
|
+
return {
|
|
310
|
+
dragState: dragState,
|
|
311
|
+
onDragStart: onDragStart,
|
|
312
|
+
onDragEnd: onDragEnd,
|
|
313
|
+
onItemDragEnter: onItemDragEnter,
|
|
314
|
+
onItemDragOver: onItemDragOver,
|
|
315
|
+
onItemDragLeave: onItemDragLeave,
|
|
316
|
+
onItemDrop: onItemDrop,
|
|
317
|
+
onContainerDragOver: onContainerDragOver,
|
|
318
|
+
onContainerDrop: onContainerDrop,
|
|
319
|
+
clearDragState: clearDragState,
|
|
320
|
+
isDragging: isDragging,
|
|
321
|
+
canDragNode: canDragNode
|
|
322
|
+
};
|
|
323
|
+
}
|
|
324
|
+
//# sourceMappingURL=useFolderDrag.js.map
|