From c3977897b7551f0efa0c8c2a614cea745dc7334c Mon Sep 17 00:00:00 2001 From: Nati Date: Fri, 21 Aug 2026 19:10:01 +0000 Subject: [PATCH] Add rankKey support to certification forms and exams - Introduced rankKey field in Certification interface and payloads. - Updated CertificationForm to handle rankKey input. - Enhanced ScheduleExamModal to filter exams based on rank. - Added getEligibleExams API query to fetch exams relevant to the application's rank. - Updated related components and types to accommodate new rankKey functionality. --- .../DocumentRequirementEditorDrawer.tsx | 2 +- .../pages/CertificationPage/columns.tsx | 9 ++++++ .../pages/CertificationPage/index.tsx | 28 ++++++++++++++----- .../certification/types/certification.ts | 22 +++++++++++++++ .../components/ScheduleExamModal.tsx | 16 +++++++---- .../pages/LicenseReviewPage/index.tsx | 1 + .../lib/features/licensing/licensing-api.ts | 11 ++++++++ .../lib/features/licensing/licensing.types.ts | 10 +++++++ 8 files changed, 85 insertions(+), 14 deletions(-) diff --git a/apps/backoffice/src/app/features/certificate-requirements/components/DocumentRequirementEditorDrawer.tsx b/apps/backoffice/src/app/features/certificate-requirements/components/DocumentRequirementEditorDrawer.tsx index 6d59af5f6..733334b8e 100644 --- a/apps/backoffice/src/app/features/certificate-requirements/components/DocumentRequirementEditorDrawer.tsx +++ b/apps/backoffice/src/app/features/certificate-requirements/components/DocumentRequirementEditorDrawer.tsx @@ -167,7 +167,7 @@ export function DocumentRequirementEditorDrawer({ <> setDraft((d) => ({ ...d, conditionExpression: v ?? undefined }))} targets={conditionTargets} palette={palette} diff --git a/apps/backoffice/src/app/features/certification/pages/CertificationPage/columns.tsx b/apps/backoffice/src/app/features/certification/pages/CertificationPage/columns.tsx index 4a56ea6d0..47649d27f 100644 --- a/apps/backoffice/src/app/features/certification/pages/CertificationPage/columns.tsx +++ b/apps/backoffice/src/app/features/certification/pages/CertificationPage/columns.tsx @@ -16,6 +16,15 @@ export function certificationColumns( header: t('certification.columns.description'), cell: ({ row }) => {row.original.description[locale]}, }, + { + header: t('certification.columns.rank', 'Rank'), + cell: ({ row }) => + row.original.rankKey ? ( + {row.original.rankKey} + ) : ( + + ), + }, { header: t('certification.columns.status'), cell: ({ row }) => ( diff --git a/apps/backoffice/src/app/features/certification/pages/CertificationPage/index.tsx b/apps/backoffice/src/app/features/certification/pages/CertificationPage/index.tsx index 717311b65..e3f9ed214 100644 --- a/apps/backoffice/src/app/features/certification/pages/CertificationPage/index.tsx +++ b/apps/backoffice/src/app/features/certification/pages/CertificationPage/index.tsx @@ -1,5 +1,5 @@ import { useState } from 'react'; -import {Stack, Button, Modal, Text, TextInput, Textarea, Card} from '@mantine/core'; +import {Stack, Button, Modal, Text, TextInput, Textarea, Select, Card} from '@mantine/core'; import { useDisclosure } from '@mantine/hooks'; import { useTranslation } from 'react-i18next'; import {IconPlus} from '@tabler/icons-react'; @@ -10,7 +10,7 @@ import { useUpdateCertificationMutation, useDeleteCertificationMutation, } from '../../api/certification-api'; -import type { Certification } from '../../types/certification'; +import { RANK_KEY_OPTIONS, type Certification } from '../../types/certification'; import { certificationColumns } from './columns'; import { certificationActionsColumn } from './actions'; @@ -22,7 +22,7 @@ function CertificationForm({ }: { editing: Certification | null; isSubmitting: boolean; - onSubmit: (values: { nameEn: string; nameAm: string; descEn: string; descAm: string }, isEdit: boolean) => void; + onSubmit: (values: { nameEn: string; nameAm: string; descEn: string; descAm: string; rankKey: string | null }, isEdit: boolean) => void; onCancel: () => void; }) { const { t } = useTranslation(); @@ -30,6 +30,7 @@ function CertificationForm({ const [nameAm, setNameAm] = useState(editing?.name?.am ?? ''); const [descEn, setDescEn] = useState(editing?.description?.en ?? ''); const [descAm, setDescAm] = useState(editing?.description?.am ?? ''); + const [rankKey, setRankKey] = useState(editing?.rankKey ?? null); const handleSubmit = (e: React.FormEvent) => { e.preventDefault(); @@ -37,7 +38,7 @@ function CertificationForm({ notify.error('Name fields are required'); return; } - onSubmit({ nameEn, nameAm, descEn, descAm }, !!editing); + onSubmit({ nameEn, nameAm, descEn, descAm, rankKey }, !!editing); }; return ( @@ -48,6 +49,17 @@ function CertificationForm({ setNameAm(e.currentTarget.value)} size="sm" required />