import React from 'react'; import { Box, Grid, Paper, Typography, IconButton, TextField, Tabs, Tab, Fab } from '@mui/material'; import { DataGrid, type GridColDef } from '@mui/x-data-grid'; import { ArrowBack as ArrowBackIcon, Search as SearchIcon, } from '@mui/icons-material'; import { useTranslation } from 'react-i18next'; import { useNavigate, useParams } from 'react-router-dom'; import { useKnowledgeOverview, useKnowledgeDetail } from '@/hooks/knowledge-hooks'; import logger from '@/utils/logger'; import i18n from '@/locales'; import { enUS, zhCN } from '@mui/x-data-grid/locales'; import KnowledgeBreadcrumbs from './components/KnowledgeBreadcrumbs'; import { LanguageAbbreviation } from '@/constants/common'; const PROCESSING_TYPES = { knowledgeGraph: 'GraphRAG', raptor: 'RAPTOR', } as const type ProcessingType = typeof PROCESSING_TYPES[keyof typeof PROCESSING_TYPES] const ProcessingTypeMap = { [PROCESSING_TYPES.knowledgeGraph]: 'Knowledge Graph', [PROCESSING_TYPES.raptor]: 'RAPTOR', } as const function KnowledgeLogsPage() { const { t } = useTranslation(); const [paginationModel, setPaginationModel] = React.useState({ page: 0, pageSize: 50 }); // 根据当前语言获取DataGrid的localeText const getDataGridLocale = () => { const currentLanguage = i18n.language; return currentLanguage === LanguageAbbreviation.Zh ? zhCN : enUS; }; // 路由参数与数据Hook const { id: kbId = '' } = useParams(); const { overview, fileLogs, datasetLogs, loading, currentPage, pageSize, setCurrentPage, setPageSize, activeTab, keywords, setActiveTab, setKeywords, } = useKnowledgeOverview(kbId); // 获取知识库详情以用于面包屑显示名称 const { knowledge } = useKnowledgeDetail(kbId); // 同步分页模型到Hook React.useEffect(() => { setPaginationModel({ page: Math.max(currentPage - 1, 0), pageSize }); }, [currentPage, pageSize]); const columnsFile: GridColDef[] = [ { field: 'id', headerName: 'ID', width: 100 }, { field: 'document_name', headerName: t('knowledgeDetails.fileName'), flex: 1, minWidth: 160, valueGetter: (params) => { logger.info('params', params) return '' } }, { field: 'source_from', headerName: t('knowledgeDetails.source'), flex: 1, minWidth: 140 }, { field: 'pipeline_title', headerName: t('knowledgeDetails.ingestionPipeline'), flex: 1, minWidth: 180 }, { field: 'create_date', headerName: t('knowledgeDetails.startDate') || 'Start Date', flex: 0.8, minWidth: 160, sortable: true }, { field: 'task_type', headerName: t('knowledgeDetails.task') || 'Task', flex: 0.8, minWidth: 140 }, { field: 'status', headerName: t('knowledgeDetails.status'), flex: 0.7, minWidth: 120 }, { field: 'operations', headerName: t('knowledgeDetails.operations') || 'Operations', flex: 0.8, minWidth: 160, sortable: false, filterable: false, align: 'center', headerAlign: 'center' }, ]; const columnsDataset: GridColDef[] = [ { field: 'id', headerName: 'ID', width: 100 }, { field: 'create_date', headerName: t('knowledgeDetails.startDate') || 'Start Date', flex: 1, minWidth: 160, sortable: true }, { field: 'task_type', headerName: 'Processing Type', flex: 1, minWidth: 180 }, { field: 'status', headerName: t('knowledgeDetails.status'), flex: 0.8, minWidth: 120 }, { field: 'operations', headerName: t('knowledgeDetails.operations') || 'Operations', flex: 0.8, minWidth: 160, sortable: false, filterable: false, align: 'center', headerAlign: 'center' }, ]; const columns = React.useMemo(() => (activeTab === 'fileLogs' ? columnsFile : columnsDataset), [activeTab]); const rows = React.useMemo(() => (activeTab === 'fileLogs' ? (fileLogs?.logs || []) : (datasetLogs?.logs || [])), [activeTab, fileLogs, datasetLogs]); const rowCount = React.useMemo(() => (activeTab === 'fileLogs' ? (fileLogs?.total || 0) : (datasetLogs?.total || 0)), [activeTab, fileLogs, datasetLogs]); const navigate = useNavigate(); const handleNavigateBack = () => { navigate(`/knowledge/${kbId}`); }; return ( {/* 面包屑导航 */} {/* 顶部统计卡片占位 */} {t('datasetOverview.totalFiles')} {fileLogs?.total ?? 0} 0% from last week {t('datasetOverview.downloading')} 0 {t('knowledgeDetails.success')} {overview?.finished ?? 0} · {t('knowledgeDetails.failed')} {overview?.failed ?? 0} {t('datasetOverview.processing')} {overview?.processing ?? 0} {t('knowledgeDetails.success')} {overview?.finished ?? 0} · {t('knowledgeDetails.failed')} {overview?.failed ?? 0} {/* Tabs & Filter/Search */} setActiveTab(v)}> {/* */} setKeywords(e.target.value)} /> {/* DataGrid 表格占位 */} row.id} density="comfortable" pageSizeOptions={[20, 50, 100]} paginationMode="server" rowCount={rowCount} paginationModel={paginationModel} onPaginationModelChange={(model) => { setPaginationModel(model); setCurrentPage(model.page + 1); setPageSize(model.pageSize); }} loading={loading} disableColumnMenu localeText={getDataGridLocale().components.MuiDataGrid.defaultProps.localeText} /> {/* 返回按钮 */} ); } export default KnowledgeLogsPage;