import { useEffect, useState } from 'react'; import { Button, Checkbox, Divider, Drawer, MultiSelect, NumberInput, Select, Stack, Text, TextInput, } from '@mantine/core'; import { useTranslation } from 'react-i18next'; import { BilingualInput, ModalFooter } from '@ema-platform/ui'; import type { ApplicationKind, DocumentRequirement, FormSchemaPalette } from '@ema-platform/api'; import { ConditionBuilder, type ConditionValue } from './ConditionBuilder'; import type { ConditionTarget } from '../config/schema-paths'; const MIME_OPTIONS = [ { value: 'application/pdf', label: 'PDF' }, { value: 'image/jpeg', label: 'JPEG' }, { value: 'image/png', label: 'PNG' }, ]; type DraftRequirement = Omit; function emptyDraft(applicationKind: ApplicationKind): DraftRequirement { return { key: '', name: { en: '', am: '' }, applicationKind, mode: 'ALWAYS', allowedMimeTypes: ['application/pdf', 'image/jpeg', 'image/png'], maxSizeMb: 5, requiresValidityDates: false, allowMultiple: false, sortOrder: 0, }; } /** Adds/edits one document requirement slot for a licence type + application kind. */ export function DocumentRequirementEditorDrawer({ opened, onClose, requirement, defaultApplicationKind, onSave, palette, conditionTargets, saving, }: { opened: boolean; onClose: () => void; /** Null = adding a new requirement. */ requirement: DocumentRequirement | null; defaultApplicationKind: ApplicationKind; onSave: (draft: DraftRequirement) => void; palette: FormSchemaPalette | undefined; conditionTargets: ConditionTarget[]; saving: boolean; }) { const { t } = useTranslation(); const [draft, setDraft] = useState(emptyDraft(defaultApplicationKind)); const [keyError, setKeyError] = useState(null); const isNew = !requirement; useEffect(() => { if (opened) { setDraft( requirement ? { key: requirement.key, name: { ...requirement.name }, description: requirement.description ? { ...requirement.description } : undefined, applicationKind: requirement.applicationKind, mode: requirement.mode, conditionExpression: requirement.conditionExpression, allowedMimeTypes: requirement.allowedMimeTypes, maxSizeMb: requirement.maxSizeMb, requiresValidityDates: requirement.requiresValidityDates, allowMultiple: requirement.allowMultiple, sortOrder: requirement.sortOrder, } : emptyDraft(defaultApplicationKind), ); setKeyError(null); } }, [opened, requirement, defaultApplicationKind]); function save() { if (!draft.key.trim()) { setKeyError(t('certReq.doc.keyRequired', 'Key is required')); return; } if (!draft.name.en?.trim()) return; // A condition is either a single-field check or an anyOf list — the CoP // watch_rating_certificate requirement is seeded with anyOf and no field. const hasCondition = Boolean(draft.conditionExpression?.field) || Boolean(draft.conditionExpression?.anyOf?.length); if ( draft.mode === 'CONDITIONAL' && !hasCondition && !draft.conditionExpression?.anyOf?.length ) { setKeyError(t('certReq.doc.conditionRequired', 'A conditional requirement needs a condition')); return; } onSave({ ...draft, key: draft.key.trim(), conditionExpression: draft.mode === 'CONDITIONAL' ? draft.conditionExpression : undefined, }); } return ( {isNew ? t('certReq.doc.add', 'Add document requirement') : t('certReq.doc.edit', 'Edit document requirement')}} > setDraft((d) => ({ ...d, key: e.currentTarget.value }))} /> setDraft((d) => ({ ...d, name: v }))} /> setDraft((d) => ({ ...d, description: v }))} /> v && setDraft((d) => ({ ...d, mode: v as DraftRequirement['mode'] }))} allowDeselect={false} /> {draft.mode === 'CONDITIONAL' && ( <> setDraft((d) => ({ ...d, conditionExpression: v ?? undefined }))} targets={conditionTargets} palette={palette} allowClear={false} /> )} setDraft((d) => ({ ...d, allowedMimeTypes: v }))} /> setDraft((d) => ({ ...d, maxSizeMb: typeof v === 'number' ? v : d.maxSizeMb }))} /> setDraft((d) => ({ ...d, requiresValidityDates: e.currentTarget.checked }))} /> setDraft((d) => ({ ...d, allowMultiple: e.currentTarget.checked }))} /> setDraft((d) => ({ ...d, sortOrder: typeof v === 'number' ? v : d.sortOrder }))} /> ); }