+
+
- {(selectedFiles === 'all' ||
- (selectedFiles as Set).size > 0) && (
+
+
+ {((selectedFiles instanceof Set && selectedFiles.size > 0) ||
+ selectedFiles === 'all') && (
<>
}
+ className="text-sm"
+ startContent={}
>
- 删除选中项 (
- {selectedFiles === 'all'
- ? files.length
- : (selectedFiles as Set).size}
+ (
+ {selectedFiles instanceof Set ? selectedFiles.size : files.length}
)
}
+ className="text-sm"
+ startContent={}
>
- 移动选中项
+ (
+ {selectedFiles instanceof Set ? selectedFiles.size : files.length}
+ )
>
)}
-
+
{currentPath.split('/').map((part, index, parts) => (
))}
+ setJumpPath(e.target.value)}
+ onKeyDown={(e) => {
+ if (e.key === 'Enter' && jumpPath.trim() !== '') {
+ navigate(`/file_manager#${encodeURIComponent(jumpPath.trim())}`)
+ }
+ }}
+ className="ml-auto w-64"
+ />
-
-
-
- 名称
-
-
- 类型
-
-
- 大小
-
-
- 修改时间
-
- 操作
-
-
-
-
- }
- items={files}
- >
- {(file) => (
-
-
-
-
- {file.isDirectory ? '目录' : '文件'}
-
- {isNaN(file.size) || file.isDirectory
- ? '-'
- : `${file.size} 字节`}
-
- {new Date(file.mtime).toLocaleString()}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- )}
-
-
+ onDirectoryClick={handleDirectoryClick}
+ onEdit={handleEdit}
+ onRenameRequest={(name) => {
+ setRenamingFile(name)
+ setNewFileName(name)
+ setIsRenameModalOpen(true)
+ }}
+ onMoveRequest={handleMoveClick}
+ onCopyPath={handleCopyPath}
+ onDelete={handleDelete}
+ />
- {/* 文件编辑对话框 */}
-
setEditingFile(null)}
- >
-
-
- 编辑文件
- {editingFile?.path}
-
-
-
-
- setEditingFile((prev) =>
- prev ? { ...prev, content: value || '' } : null
- )
- }
- options={{ wordWrap: 'on' }}
- />
-
-
-
-
-
-
-
-
+ onSave={handleSave}
+ onContentChange={(newContent) =>
+ setEditingFile((prev) =>
+ prev ? { ...prev, content: newContent ?? '' } : null
+ )
+ }
+ />
- {/* 新建文件/目录对话框 */}
-
setNewFileName(e.target.value)}
onClose={() => setIsCreateModalOpen(false)}
- >
-
- 新建
-
-
-
-
-
-
- setNewFileName(e.target.value)}
- />
-
-
-
-
-
-
-
-
+ onCreate={handleCreate}
+ />
- {/* 重命名对话框 */}
-
setNewFileName(e.target.value)}
onClose={() => setIsRenameModalOpen(false)}
- >
-
- 重命名
-
- setNewFileName(e.target.value)}
- />
-
-
-
-
-
-
-
+ onRename={handleRename}
+ />
- {/* 移动对话框 */}
-
setIsMoveModalOpen(false)}>
-
- 移动到
-
-
-
setMoveTargetPath(e.target.value)}
- placeholder="请输入完整目标路径"
- />
-
- 当前选择:
- {selectedFiles === 'all' ||
- (selectedFiles as Set).size > 0
- ? `${selectedFiles === 'all' ? files.length : (selectedFiles as Set).size} 个项目`
- : renamingFile}
-
-
-
-
-
-
-
-
-
+
0
+ ? `${selectedFiles.size} 个项目`
+ : renamingFile
+ }
+ onClose={() => setIsMoveModalOpen(false)}
+ onMove={() =>
+ selectedFiles instanceof Set && selectedFiles.size > 0
+ ? handleBatchMove()
+ : handleMove(renamingFile)
+ }
+ onSelect={(dir) => setMoveTargetPath(dir)} // 替换原有 onTargetChange
+ />
)
}
diff --git a/src/webui/src/api/File.ts b/src/webui/src/api/File.ts
index 6f23510d..1da78820 100644
--- a/src/webui/src/api/File.ts
+++ b/src/webui/src/api/File.ts
@@ -28,6 +28,10 @@ const getRootDirs = async (): Promise