'use client'; import { useState } from 'react'; import { Container, Box, Typography, Grid, Pagination, CircularProgress, Card, Button } from '@mui/material'; import { useParams, useRouter } from 'next/navigation'; import { useTranslation } from 'react-i18next'; import axios from 'axios'; import { toast } from 'sonner'; import { imageDatasetStyles } from './styles/imageDatasetStyles'; import { useImageDatasets } from './hooks/useImageDatasets'; import { useImageDatasetFilters } from './hooks/useImageDatasetFilters'; import ImageDatasetFilters from './components/ImageDatasetFilters'; import ImageDatasetFilterDialog from './components/ImageDatasetFilterDialog'; import ImageDatasetCard from './components/ImageDatasetCard'; import EmptyState from './components/EmptyState'; import ExportImageDatasetDialog from './components/ExportImageDatasetDialog'; import useImageDatasetExport from './hooks/useImageDatasetExport'; import FileDownloadIcon from '@mui/icons-material/FileDownload'; import { alpha } from '@mui/material/styles'; export default function ImageDatasetsPage() { const { projectId } = useParams(); const router = useRouter(); const { t } = useTranslation(); const [filterDialogOpen, setFilterDialogOpen] = useState(false); const [exportDialogOpen, setExportDialogOpen] = useState(false); // 使用筛选 Hook const { searchQuery, setSearchQuery, statusFilter, setStatusFilter, scoreFilter, setScoreFilter, getActiveFilterCount, resetFilters } = useImageDatasetFilters(projectId); // 使用数据 Hook const { datasets, loading, page, setPage, pageSize, fetchDatasets } = useImageDatasets(projectId, { search: searchQuery, confirmed: statusFilter === 'all' ? undefined : statusFilter === 'confirmed', minScore: scoreFilter[0], maxScore: scoreFilter[1] }); // 使用导出 Hook const { exportImageDatasets } = useImageDatasetExport(projectId); const handlePageChange = (event, value) => { setPage(value); window.scrollTo({ top: 0, behavior: 'smooth' }); }; const handleCardClick = datasetId => { router.push(`/projects/${projectId}/image-datasets/${datasetId}`); }; const handleViewDetails = datasetId => { router.push(`/projects/${projectId}/image-datasets/${datasetId}`); }; const handleDeleteDataset = async datasetId => { if (confirm(t('imageDatasets.deleteConfirm', '确定要删除这个数据集吗?'))) { try { await axios.delete(`/api/projects/${projectId}/image-datasets/${datasetId}`); toast.success(t('imageDatasets.deleteSuccess', '删除成功')); // 重新查询数据 fetchDatasets(); } catch (error) { console.error('Failed to delete dataset:', error); toast.error(t('imageDatasets.deleteFailed', '删除失败')); } } }; const handleEvaluateDataset = datasetId => { toast.info(t('common.comingSoon', '功能开发中...')); }; const handleResetFilters = () => { resetFilters(); setFilterDialogOpen(false); }; const handleApplyFilters = () => { setFilterDialogOpen(false); setPage(1); }; const handleExport = async exportOptions => { setExportDialogOpen(false); await exportImageDatasets(exportOptions); }; const totalPages = Math.ceil(datasets.total / pageSize); return ( {/* 筛选区域 - 参考数据集管理的设计 */} alpha(theme.palette.primary.main, 0.06) }} > { setSearchQuery(value); setPage(1); }} onMoreFiltersClick={() => setFilterDialogOpen(true)} activeFilterCount={getActiveFilterCount()} /> {/* 数据集列表 */} {loading ? ( ) : datasets.data.length === 0 ? ( ) : ( <> {datasets.data.map(dataset => ( ))} {/* 分页 */} {totalPages > 1 && ( )} )} {/* 筛选对话框 */} setFilterDialogOpen(false)} statusFilter={statusFilter} scoreFilter={scoreFilter} onStatusChange={setStatusFilter} onScoreChange={setScoreFilter} onResetFilters={handleResetFilters} onApplyFilters={handleApplyFilters} /> {/* 导出对话框 */} setExportDialogOpen(false)} onExport={handleExport} /> ); }