From 30c40179bec62b68bbc9d9641672a0de6d6e6265 Mon Sep 17 00:00:00 2001 From: MoeexT Date: Wed, 11 Mar 2026 16:59:29 +0800 Subject: [PATCH] :sparkles: multi-select file --- frontend/package-lock.json | 1 + frontend/package.json | 1 + .../Detail/components/Overview.tsx | 43 ++- .../Detail/useFilesOperation.ts | 262 ++++++++++++++++-- 4 files changed, 274 insertions(+), 33 deletions(-) diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 5c835945..d5d8550d 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -13,6 +13,7 @@ "antd": "^5.27.0", "i18next": "^25.8.0", "jssha": "^3.3.1", + "jszip": "^3.10.1", "lucide-react": "^0.539.0", "mammoth": "^1.11.0", "react": "^18.1.1", diff --git a/frontend/package.json b/frontend/package.json index e517ad48..b3be598e 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -16,6 +16,7 @@ "antd": "^5.27.0", "i18next": "^25.8.0", "jssha": "^3.3.1", + "jszip": "^3.10.1", "lucide-react": "^0.539.0", "mammoth": "^1.11.0", "react": "^18.1.1", diff --git a/frontend/src/pages/DataManagement/Detail/components/Overview.tsx b/frontend/src/pages/DataManagement/Detail/components/Overview.tsx index ff1853f0..4e65298f 100644 --- a/frontend/src/pages/DataManagement/Detail/components/Overview.tsx +++ b/frontend/src/pages/DataManagement/Detail/components/Overview.tsx @@ -30,6 +30,7 @@ export default function Overview({ dataset, filesOperation, fetchDataset }) { pagination, selectedFiles, setSelectedFiles, + clearSelection, previewVisible, previewFileName, previewContent, @@ -43,6 +44,7 @@ export default function Overview({ dataset, filesOperation, fetchDataset }) { handleDownloadFile, handleBatchDeleteFiles, handleBatchExport, + handleSelectionChange, handleCreateDirectory, handleDownloadDirectory, handleDeleteDirectory, @@ -50,11 +52,15 @@ export default function Overview({ dataset, filesOperation, fetchDataset }) { handleRenameDirectory, } = filesOperation; - // 文件列表多选配置 + // 文件列表多选配置(支持跨页选择) const rowSelection = { - onChange: (selectedRowKeys: React.Key[], selectedRows: any[]) => { - setSelectedFiles(selectedRowKeys as number[]); - }, + selectedRowKeys: selectedFiles, + onChange: handleSelectionChange, + preserveSelectedRowKeys: true, // 关键:跨页时保持选中状态 + getCheckboxProps: (record: any) => ({ + // 目录和文件都可以选择 + name: record.fileName, + }), }; // 显示删除确认弹窗 @@ -428,18 +434,36 @@ export default function Overview({ dataset, filesOperation, fetchDataset }) { {selectedFiles.length > 0 && (
- {t("dataManagement.detail.selectedFiles", { count: selectedFiles.length })} + 已选择 {selectedFiles.length} 项 + {(() => { + const dirCount = selectedFiles.filter(id => typeof id === 'string' && id.startsWith('directory-')).length; + const fileCount = selectedFiles.length - dirCount; + if (dirCount > 0 && fileCount > 0) { + return ` (${fileCount} 个文件, ${dirCount} 个文件夹)`; + } else if (dirCount > 0) { + return ` (${dirCount} 个文件夹)`; + } else if (fileCount > 0) { + return ` (${fileCount} 个文件)`; + } + return ''; + })()} +