diff --git a/.gitignore b/.gitignore index b833848bb..4b15bf545 100644 --- a/.gitignore +++ b/.gitignore @@ -30,3 +30,7 @@ apps/backoffice/public/_um/ apps/backoffice/public/tinymce/ local-packages/iamui-extracted/ + +# Playwright visual-regression artifacts (baselines under apps/e2e/visual are tracked) +test-results/ +dist/visual-report/ 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/certificate-requirements/pages/CertificateRequirementsPage.tsx b/apps/backoffice/src/app/features/certificate-requirements/pages/CertificateRequirementsPage.tsx index 8e9414a0a..86352bb97 100644 --- a/apps/backoffice/src/app/features/certificate-requirements/pages/CertificateRequirementsPage.tsx +++ b/apps/backoffice/src/app/features/certificate-requirements/pages/CertificateRequirementsPage.tsx @@ -44,6 +44,7 @@ export function CertificateRequirementsPage() { 'certReq.subtitle', 'Configure the form fields and document uploads applicants must complete for a licence type, including conditions on when a requirement applies.', )} + noMargin /> {isError ? ( 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 1c5893ab3..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,27 +1,16 @@ import { useState } from 'react'; -import { - Stack, - Title, - Group, - Button, - Modal, - Text, - TextInput, - Textarea, - Card, - Alert, -} 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, IconInfoCircle } from '@tabler/icons-react'; -import { notify, useErrorHandler, AdvancedTable, useServerTable, ModalFooter } from '@ema-platform/ui'; +import {IconPlus} from '@tabler/icons-react'; +import { AdvancedTable, ErrorState, ModalFooter, notify, PageHeader, useErrorHandler, useServerTable } from '@ema-platform/ui'; import { useGetCertificationsQuery, useCreateCertificationMutation, 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'; @@ -33,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(); @@ -41,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(); @@ -48,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 ( @@ -59,6 +49,17 @@ function CertificationForm({ setNameAm(e.currentTarget.value)} size="sm" required />