From e4a1fe4b23c622826f84bf0fbd0e260b7cdbfc6a Mon Sep 17 00:00:00 2001 From: Primakov Alexandr Date: Wed, 10 Dec 2025 00:01:24 +0300 Subject: [PATCH] Refactor submissions page to improve participant progress display; replace table with grid layout for better responsiveness and user interaction. Update data processing for participant overview and overall progress calculation. --- src/pages/submissions/SubmissionsPage.tsx | 164 +++++++++------------- 1 file changed, 70 insertions(+), 94 deletions(-) diff --git a/src/pages/submissions/SubmissionsPage.tsx b/src/pages/submissions/SubmissionsPage.tsx index 58149fd..8e316e6 100644 --- a/src/pages/submissions/SubmissionsPage.tsx +++ b/src/pages/submissions/SubmissionsPage.tsx @@ -18,6 +18,7 @@ import { DialogFooter, DialogActionTrigger, Progress, + Grid, createListCollection, } from '@chakra-ui/react' import ReactMarkdown from 'react-markdown' @@ -32,7 +33,6 @@ import type { SubmissionStatus, ChallengeTask, ChallengeUser, - ParticipantProgress, } from '../../types/challenge' export const SubmissionsPage: React.FC = () => { @@ -139,27 +139,29 @@ export const SubmissionsPage: React.FC = () => { const hasParticipants = participants.length > 0 const hasSelectedUser = !!selectedUserId - const participantProgressRows = stats.chainsDetailed - .reduce( - (acc, chain) => { - const rows = chain.participantProgress.map((participant) => ({ - ...participant, - chainId: chain.chainId, - chainName: chain.name, - totalTasks: chain.totalTasks, - })) + const participantOverviewRows = participants + .map((participant) => { + const chains = participant.chainProgress || [] - return acc.concat(rows) - }, - [] as Array< - ParticipantProgress & { - chainId: string - chainName: string - totalTasks: number - } - > - ) - .sort((a, b) => a.progressPercent - b.progressPercent) + const totalTasks = chains.reduce((sum, chain) => sum + (chain.totalTasks ?? 0), 0) + const completedTasks = chains.reduce( + (sum, chain) => sum + (chain.completedTasks ?? 0), + 0 + ) + + const overallPercent = + totalTasks > 0 ? Math.round((completedTasks / totalTasks) * 100) : 0 + + return { + userId: participant.userId, + nickname: participant.nickname, + totalSubmissions: participant.totalSubmissions, + completedTasks, + totalTasks, + overallPercent, + } + }) + .sort((a, b) => a.overallPercent - b.overallPercent) return ( @@ -246,86 +248,60 @@ export const SubmissionsPage: React.FC = () => { {t('challenge.admin.submissions.overview.description')} - {participantProgressRows.length === 0 ? ( + {participantOverviewRows.length === 0 ? ( ) : ( - - - - - - {t('challenge.admin.submissions.overview.table.user')} - - - {t('challenge.admin.submissions.overview.table.chain')} - - - {t('challenge.admin.submissions.overview.table.progress')} - - - - - {participantProgressRows.map((row) => { - const colorPalette = - row.progressPercent >= 70 - ? 'green' - : row.progressPercent >= 40 - ? 'orange' - : 'red' + {participantOverviewRows.map((row) => { + const colorPalette = + row.overallPercent >= 70 + ? 'green' + : row.overallPercent >= 40 + ? 'orange' + : 'red' - return ( - setSelectedUserId(row.userId)} - > - - {row.nickname} - - - - {row.chainName} - - - {t('challenge.admin.detailed.stats.chains.total.tasks')}{' '} - {row.completedCount} / {row.totalTasks} - - - - - - - {row.progressPercent}% - - - - - - - - - - - ) - })} - - - + return ( + setSelectedUserId(row.userId)} + > + + + {row.nickname} + + + {row.overallPercent}% + + + + + + + + + {row.completedTasks} / {row.totalTasks} + + + ) + })} + )} ) : filteredSubmissions.length === 0 ? (