'use client'; import { useState } from 'react'; import { useParams, useRouter } from 'next/navigation'; import { Box, Container, Typography, Grid, Pagination, CircularProgress, Alert, Dialog, DialogTitle, DialogContent, DialogActions, Button, Snackbar } from '@mui/material'; import { Masonry } from '@mui/lab'; import { useTranslation } from 'react-i18next'; import useEvalDatasets from './hooks/useEvalDatasets'; import useExportEvalDatasets from './hooks/useExportEvalDatasets'; import EvalToolbar from './components/EvalToolbar'; import EvalDatasetCard from './components/EvalDatasetCard'; import EvalDatasetList from './components/EvalDatasetList'; import ImportDialog from './components/ImportDialog'; import BuiltinDatasetDialog from './components/BuiltinDatasetDialog'; import ExportEvalDialog from './components/ExportEvalDialog'; export default function EvalDatasetsPage() { const { projectId } = useParams(); const router = useRouter(); const { t } = useTranslation(); const { items, total, stats, totalPages, loading, searching, error, page, setPage, questionType, setQuestionType, tags, setTags, keyword, setKeyword, viewMode, setViewMode, selectedIds, toggleSelect, toggleSelectAll, fetchData, deleteItems } = useEvalDatasets(projectId); // 导出 Hook const { dialogOpen: exportDialogOpen, openDialog: openExportDialog, closeDialog: closeExportDialog, exporting, error: exportError, format: exportFormat, setFormat: setExportFormat, questionTypes: exportQuestionTypes, setQuestionTypes: setExportQuestionTypes, selectedTags: exportSelectedTags, setSelectedTags: setExportSelectedTags, keyword: exportKeyword, setKeyword: setExportKeyword, previewTotal, previewLoading, availableTags: exportAvailableTags, resetFilters: resetExportFilters, handleExport } = useExportEvalDatasets(projectId, stats); // 删除确认对话框 const [deleteDialog, setDeleteDialog] = useState({ open: false, ids: [] }); // 导入对话框 const [importDialogOpen, setImportDialogOpen] = useState(false); const [builtinImportOpen, setBuiltinImportOpen] = useState(false); // Toast 提示 const [toast, setToast] = useState({ open: false, message: '', severity: 'success' }); // 处理导入成功 const handleImportSuccess = result => { setToast({ open: true, message: t('evalDatasets.import.successMessage', { count: result.total }), severity: 'success' }); fetchData(); // 刷新数据 }; // 处理删除 const handleDelete = async ids => { setDeleteDialog({ open: true, ids: Array.isArray(ids) ? ids : [ids] }); }; const confirmDelete = async () => { try { await deleteItems(deleteDialog.ids); setDeleteDialog({ open: false, ids: [] }); } catch (err) { console.error('Delete failed:', err); } }; // 处理编辑 const handleEdit = item => { router.push(`/projects/${projectId}/eval-datasets/${item.id}`); }; // 处理查看 const handleView = item => { router.push(`/projects/${projectId}/eval-datasets/${item.id}`); }; return ( {/* 错误提示 */} {error && ( {error} )} {/* 工具栏(包含统计筛选) */} handleDelete(selectedIds)} stats={stats} questionType={questionType} onTypeChange={setQuestionType} tags={tags} onTagsChange={setTags} onRefresh={fetchData} loading={loading} onImport={() => setImportDialogOpen(true)} onBuiltinImport={() => setBuiltinImportOpen(true)} onExport={openExportDialog} /> {/* 加载状态 */} {loading && ( )} {/* 内容区域 */} {!loading && ( {/* 搜索加载遮罩 */} {searching && ( )} {viewMode === 'card' ? ( {items.map(item => ( ))} ) : ( )} {/* 空状态 */} {items.length === 0 && ( {t('eval.noData')} {t('eval.noDataHint')} )} {/* 分页 */} {totalPages > 1 && ( setPage(value)} color="primary" showFirstButton showLastButton /> )} )} {/* 删除确认对话框 */} setDeleteDialog({ open: false, ids: [] })}> {t('eval.deleteConfirmTitle')} {t('eval.deleteConfirmMessage', { count: deleteDialog.ids.length })} {/* 导入对话框 */} setImportDialogOpen(false)} projectId={projectId} onSuccess={handleImportSuccess} /> {/* 内置数据集导入对话框 */} setBuiltinImportOpen(false)} projectId={projectId} onSuccess={handleImportSuccess} /> {/* 导出对话框 */} {/* Toast 提示 */} setToast({ ...toast, open: false })} anchorOrigin={{ vertical: 'top', horizontal: 'center' }} > setToast({ ...toast, open: false })}> {toast.message} ); }