mirror of
https://github.com/Tria-plc/emaui.git
synced 2026-09-07 23:35:43 +00:00
feat(exam): regrade action + stop inviting a re-take on a finished exam
Two fixes surfaced by actual candidate-flow testing: - Portal 'My registrations' always showed 'Take exam' regardless of whether the candidate had already finished — clicking it just hit attempt_already_submitted server-side. The registrations/mine response now carries the attempt's status; the row shows a Completed/Time expired badge once finished, or 'Resume exam' while still in progress, and only invites a fresh start when there's genuinely nothing yet. - Backoffice candidates panel: a Regrade button next to a SUBMITTED/EXPIRED sitting, calling the new POST /exam-attempts/:id/regrade — the officer's path to the same staff-triggered regrade, no SQL needed. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
@@ -94,6 +94,23 @@ export function registrationColumns(deps: {
|
||||
header: 'Exam',
|
||||
cell: ({ row }) => {
|
||||
const exam = row.original.exam;
|
||||
const attemptStatus = row.original.attempt?.status;
|
||||
// Already finished — no restart, no more room for "Take exam" to
|
||||
// invite a click that the backend would just refuse.
|
||||
if (attemptStatus === 'SUBMITTED') {
|
||||
return (
|
||||
<Badge size="sm" variant="light" color="teal">
|
||||
Completed
|
||||
</Badge>
|
||||
);
|
||||
}
|
||||
if (attemptStatus === 'EXPIRED') {
|
||||
return (
|
||||
<Badge size="sm" variant="light" color="red">
|
||||
Time expired
|
||||
</Badge>
|
||||
);
|
||||
}
|
||||
const eligible =
|
||||
exam?.status === 'ACTIVE' && !NOT_SITTING.includes(row.original.attendanceStatus);
|
||||
if (!eligible || !deps.can([PORTAL_PERMISSIONS.APPLY_EXAM])) return null;
|
||||
@@ -104,7 +121,7 @@ export function registrationColumns(deps: {
|
||||
leftSection={<IconPlayerPlay size={13} />}
|
||||
onClick={() => deps.onStartExam(row.original)}
|
||||
>
|
||||
Take exam
|
||||
{attemptStatus === 'IN_PROGRESS' ? 'Resume exam' : 'Take exam'}
|
||||
</Button>
|
||||
);
|
||||
},
|
||||
|
||||
@@ -54,6 +54,8 @@ export interface MyRegistration {
|
||||
attemptNumber: number;
|
||||
attendanceStatus: AttendanceStatus;
|
||||
exam?: OpenExam;
|
||||
/** The candidate's online sitting, when one has been started. */
|
||||
attempt?: { status: 'IN_PROGRESS' | 'SUBMITTED' | 'EXPIRED' } | null;
|
||||
}
|
||||
|
||||
export interface MyResult {
|
||||
|
||||
Reference in New Issue
Block a user