import React, { useState } from 'react'; import { Box, Card, CardContent, Typography, Table, TableBody, TableCell, TableContainer, TableHead, TableRow, Chip, TextField, InputAdornment, TablePagination, useTheme, alpha, Tooltip } from '@mui/material'; import SearchIcon from '@mui/icons-material/Search'; import { useTranslation } from 'react-i18next'; const statusColors = { SUCCESS: 'success', FAILED: 'error' }; export default function UsageTable({ data, total, page, pageSize, onPageChange, onPageSizeChange, searchTerm, onSearchChange }) { const theme = useTheme(); const { t } = useTranslation(); const handleChangePage = (event, newPage) => { onPageChange(newPage + 1); // MUI uses 0-indexed, our API uses 1-indexed }; const handleChangeRowsPerPage = event => { onPageSizeChange(parseInt(event.target.value, 10)); }; const handleSearchChange = event => { onSearchChange(event.target.value); }; // 直接使用传入的数据,分页和搜索已在后端完成 return ( {t('monitoring.table.title')} ) }} sx={{ width: 300 }} /> {t('monitoring.table.columns.projectName')} {t('monitoring.table.columns.provider')} {t('monitoring.table.columns.model')} {t('monitoring.table.columns.status')} {t('monitoring.table.columns.failureReason')} {t('monitoring.table.columns.inputTokens')} {t('monitoring.table.columns.outputTokens')} {t('monitoring.table.columns.totalTokens')} {t('monitoring.table.columns.calls')} {t('monitoring.table.columns.avgLatency')} {data.map((row, index) => ( {row.projectName} {row.model} {row.failureReason ? ( 20 ? row.failureReason.slice(0, 20) + '...' : row.failureReason } size="small" color="error" variant="soft" sx={{ maxWidth: 200, bgcolor: alpha(theme.palette.error.main, 0.1), color: theme.palette.error.dark, cursor: 'pointer' }} /> ) : ( '-' )} {row.inputTokens.toLocaleString()} {row.outputTokens.toLocaleString()} {row.totalTokens.toLocaleString()} {row.calls} {row.avgLatency} ))} {data.length === 0 && ( {t('monitoring.table.empty')} )}
); }