Enhance exam selection by displaying certification rank in options and remove admission number input from scheduling modal

This commit is contained in:
Nati
2026-08-22 06:11:02 +00:00
parent c3977897b7
commit e82714ba1f
2 changed files with 17 additions and 16 deletions

View File

@@ -24,6 +24,7 @@ import {
import { notify, useErrorHandler, AdvancedTable, useServerTable, ModalFooter, AmharicDatePicker } from "@ema-platform/ui"; import { notify, useErrorHandler, AdvancedTable, useServerTable, ModalFooter, AmharicDatePicker } from "@ema-platform/ui";
import { LICENSE_PERMISSIONS, RequirePermission } from "@ema-platform/auth"; import { LICENSE_PERMISSIONS, RequirePermission } from "@ema-platform/auth";
import { useGetCertificationsQuery } from "../../../certification/api/certification-api"; import { useGetCertificationsQuery } from "../../../certification/api/certification-api";
import { RANK_KEY_OPTIONS } from "../../../certification/types/certification";
import { import {
useGetExamsQuery, useGetExamsQuery,
useCreateExamMutation, useCreateExamMutation,
@@ -383,9 +384,18 @@ export function ExamPage() {
const [statusOpened, { open: openStatus, close: closeStatus }] = const [statusOpened, { open: openStatus, close: closeStatus }] =
useDisclosure(false); useDisclosure(false);
// Rank in the label: an exam inherits its STCW rank from the certification
// it is created under (Certification.rankKey), so the officer sees which
// rank a sitting will serve at the moment they pick the subject.
const certOptions = certifications const certOptions = certifications
.filter((c) => c.isActive) .filter((c) => c.isActive)
.map((c) => ({ value: c.id, label: c.name[locale] })); .map((c) => {
const rank = RANK_KEY_OPTIONS.find((r) => r.value === c.rankKey)?.label;
return {
value: c.id,
label: rank ? `${c.name[locale]}${rank}` : c.name[locale],
};
});
const getCertName = (id: string) => const getCertName = (id: string) =>
certifications.find((c) => c.id === id)?.name?.[locale] ?? "-"; certifications.find((c) => c.id === id)?.name?.[locale] ?? "-";

View File

@@ -1,5 +1,5 @@
import { useState } from 'react'; import { useState } from 'react';
import { Alert, Button, Modal, Select, Stack, Text, TextInput } from '@mantine/core'; import { Alert, Button, Modal, Select, Stack, Text } from '@mantine/core';
import { IconCalendarEvent } from '@tabler/icons-react'; import { IconCalendarEvent } from '@tabler/icons-react';
import { useTranslation } from 'react-i18next'; import { useTranslation } from 'react-i18next';
import { ModalFooter } from '@ema-platform/ui'; import { ModalFooter } from '@ema-platform/ui';
@@ -11,11 +11,7 @@ interface Props {
applicantName: string; applicantName: string;
loading: boolean; loading: boolean;
onClose: () => void; onClose: () => void;
onConfirm: (payload: { onConfirm: (payload: { examId: string; examDate?: string }) => void;
examId: string;
admissionNumber?: string;
examDate?: string;
}) => void;
} }
/** /**
@@ -38,7 +34,6 @@ export function ScheduleExamModal({
const { t } = useTranslation(); const { t } = useTranslation();
const { data: exams, isLoading } = useGetEligibleExamsQuery(applicationId, { skip: !opened }); const { data: exams, isLoading } = useGetEligibleExamsQuery(applicationId, { skip: !opened });
const [examId, setExamId] = useState<string | null>(null); const [examId, setExamId] = useState<string | null>(null);
const [admissionNumber, setAdmissionNumber] = useState('');
const options = (exams ?? []).map((exam) => ({ const options = (exams ?? []).map((exam) => ({
value: exam.id, value: exam.id,
@@ -52,7 +47,6 @@ export function ScheduleExamModal({
if (!examId) return; if (!examId) return;
onConfirm({ onConfirm({
examId, examId,
admissionNumber: admissionNumber.trim() || undefined,
examDate: selected?.date ? String(selected.date) : undefined, examDate: selected?.date ? String(selected.date) : undefined,
}); });
} }
@@ -92,15 +86,12 @@ export function ScheduleExamModal({
/> />
)} )}
<TextInput <Text size="xs" c="dimmed">
label={t('review.scheduleExam.admissionNumber', 'Admission number')} {t(
description={t(
'review.scheduleExam.admissionHint', 'review.scheduleExam.admissionHint',
'Leave blank to let the system issue one.', 'An admission number is issued automatically when the candidate is seated.',
)} )}
value={admissionNumber} </Text>
onChange={(e) => setAdmissionNumber(e.currentTarget.value)}
/>
<ModalFooter> <ModalFooter>
<Button variant="default" onClick={onClose}> <Button variant="default" onClick={onClose}>