import { App, Button, Descriptions, DescriptionsProps, Modal, Spin, Table, Input, } from "antd"; import { formatBytes, formatDateTime } from "@/utils/unit"; import { Download, Trash2, Folder, File } from "lucide-react"; import { datasetTypeMap } from "../../dataset.const"; import type { Dataset, DatasetFile } from "@/pages/DataManagement/dataset.model"; import type { useFilesOperation } from "../useFilesOperation"; type DatasetFileRow = DatasetFile & { fileSize?: number; fileCount?: number; uploadTime?: string; }; const PREVIEW_MAX_HEIGHT = 500; const PREVIEW_MODAL_WIDTH = { text: "80vw", media: "80vw", }; const PREVIEW_TEXT_FONT_SIZE = 12; const PREVIEW_TEXT_PADDING = 12; const PREVIEW_AUDIO_PADDING = 40; type OverviewProps = { dataset: Dataset; filesOperation: ReturnType; fetchDataset: () => void; onUpload?: () => void; }; export default function Overview({ dataset, filesOperation, fetchDataset, onUpload, }: OverviewProps) { const { modal, message } = App.useApp(); const { fileList, pagination, selectedFiles, previewVisible, previewFileName, previewContent, previewFileType, previewMediaUrl, previewLoading, officePreviewStatus, officePreviewError, closePreview, handleDeleteFile, handleDownloadFile, handleBatchDeleteFiles, handleBatchExport, handleCreateDirectory, handleDownloadDirectory, handleDeleteDirectory, handlePreviewFile, } = filesOperation; // 基本信息 const items: DescriptionsProps["items"] = [ { key: "id", label: "ID", children: dataset.id, }, { key: "name", label: "名称", children: dataset.name, }, { key: "fileCount", label: "文件数", children: dataset.fileCount || 0, }, { key: "size", label: "数据大小", children: dataset.size || "0 B", }, { key: "datasetType", label: "类型", children: datasetTypeMap[dataset?.datasetType]?.label || "未知", }, { key: "status", label: "状态", children: dataset?.status?.label || "未知", }, { key: "createdBy", label: "创建者", children: dataset.createdBy || "未知", }, { key: "createdAt", label: "创建时间", children: dataset.createdAt, }, { key: "updatedAt", label: "更新时间", children: dataset.updatedAt, }, { key: "description", label: "描述", children: dataset.description || "无", }, ]; // 文件列表列定义 const columns = [ { title: "文件名", dataIndex: "fileName", key: "fileName", fixed: "left", render: (text: string, record: DatasetFileRow) => { const isDirectory = record.id.startsWith('directory-'); const iconSize = 16; const content = (
{isDirectory ? ( ) : ( )} {text}
); if (isDirectory) { return ( ); } return ( ); }, }, { title: "大小", dataIndex: "fileSize", key: "fileSize", width: 150, render: (text: number, record: DatasetFileRow) => { const isDirectory = record.id.startsWith('directory-'); if (isDirectory) { return formatBytes(record.fileSize || 0); } return formatBytes(text) }, }, { title: "包含文件数", dataIndex: "fileCount", key: "fileCount", width: 120, render: (text: number, record: DatasetFileRow) => { const isDirectory = record.id.startsWith('directory-'); if (!isDirectory) { return "-"; } return record.fileCount ?? 0; }, }, { title: "上传时间", dataIndex: "uploadTime", key: "uploadTime", width: 200, render: (text) => formatDateTime(text), }, { title: "操作", key: "action", width: 180, fixed: "right", render: (_, record: DatasetFileRow) => { const isDirectory = record.id.startsWith('directory-'); if (isDirectory) { const currentPath = filesOperation.pagination.prefix || ''; const fullPath = `${currentPath}${record.fileName}/`; return (
); } return (
)}, }, ]; return ( <>
{/* 基本信息 */} {/* 文件列表 */}

文件列表

{selectedFiles.length > 0 && (
已选择 {selectedFiles.length} 个文件
)}
{(filesOperation.pagination.prefix || '') !== '' && ( )} {filesOperation.pagination.prefix && ( 当前路径: {filesOperation.pagination.prefix} )}
`共 ${total} 条`, onChange: (page, pageSize) => { filesOperation.fetchFiles(filesOperation.pagination.prefix, page, pageSize); } }} /> {/* 文件预览弹窗 */} 关闭 , ]} width={previewFileType === "text" ? PREVIEW_MODAL_WIDTH.text : PREVIEW_MODAL_WIDTH.media} > {previewFileType === "text" && (
            {previewContent}
          
)} {previewFileType === "image" && (
{previewFileName}
)} {previewFileType === "pdf" && ( <> {previewMediaUrl ? (