'use client'; import { Paper, Table, TableBody, TableCell, TableContainer, TableHead, TableRow, TablePagination, IconButton, Tooltip, Typography, Chip, CircularProgress, Checkbox } from '@mui/material'; import { Delete as DeleteIcon, Visibility as ViewIcon } from '@mui/icons-material'; import { useTranslation } from 'react-i18next'; import { useState } from 'react'; import RatingChip from './RatingChip'; const QUESTION_TOOLTIP_THRESHOLD = 80; const SCENARIO_TOOLTIP_THRESHOLD = 120; const ConversationTable = ({ conversations, loading, total, page, rowsPerPage, onPageChange, onRowsPerPageChange, onView, onDelete, selectedIds = [], onSelectionChange, isAllSelected = false, onSelectAll }) => { const { t } = useTranslation(); const [expandedRows, setExpandedRows] = useState({}); const columnWidths = { checkbox: 52, question: 280, scenario: 340, rounds: 90, model: 120, rating: 100, createdAt: 110, actions: 92 }; const shouldShowTooltip = (value, threshold) => (value || '').length > threshold; const handleSelectOne = conversationId => { if (selectedIds.includes(conversationId)) { onSelectionChange(selectedIds.filter(id => id !== conversationId)); } else { onSelectionChange([...selectedIds, conversationId]); } }; const handleSelectAll = () => { if (isAllSelected) { onSelectionChange([]); onSelectAll(false); } else { const currentPageIds = conversations.map(conv => conv.id); onSelectionChange(currentPageIds); onSelectAll(true); } }; const isIndeterminate = selectedIds.length > 0 && !isAllSelected; const toggleRowExpanded = conversationId => { setExpandedRows(prev => ({ ...prev, [conversationId]: !prev[conversationId] })); }; return ( {t('datasets.firstQuestion')} {t('datasets.conversationScenario')} {t('datasets.conversationRounds')} {t('datasets.modelUsed')} {t('datasets.rating')} {t('datasets.createTime')} {t('common.actions')} {loading ? ( ) : conversations.length === 0 ? ( {t('datasets.noConversations')} ) : ( conversations.map(conversation => { const questionText = conversation.question || ''; const scenarioText = conversation.scenario || ''; const isExpanded = Boolean(expandedRows[conversation.id]); const canToggleExpand = questionText.length > QUESTION_TOOLTIP_THRESHOLD || scenarioText.length > SCENARIO_TOOLTIP_THRESHOLD; const questionContent = ( {questionText} ); const scenarioContent = ( {scenarioText || t('datasets.notSet')} ); return ( handleSelectOne(conversation.id)} /> {shouldShowTooltip(questionText, QUESTION_TOOLTIP_THRESHOLD) ? ( {questionContent} ) : ( questionContent )} {conversation.confirmed && ( )} {canToggleExpand && ( toggleRowExpanded(conversation.id)} > {isExpanded ? t('common.collapse') : t('common.expand')} )} {shouldShowTooltip(scenarioText, SCENARIO_TOOLTIP_THRESHOLD) ? ( {scenarioContent} ) : ( scenarioContent )} {conversation.turnCount}/{conversation.maxTurns} {new Date(conversation.createAt).toLocaleDateString()} onView(conversation.id)}> onDelete(conversation.id)}> ); }) )}
onPageChange(newPage)} rowsPerPage={rowsPerPage} rowsPerPageOptions={[20, 50, 100]} onRowsPerPageChange={event => { onRowsPerPageChange(parseInt(event.target.value, 10)); }} labelRowsPerPage={t('datasets.rowsPerPage')} />
); }; export default ConversationTable;