import { useState } from 'react'; import { Stack, Title, Group, Button, Badge, ActionIcon, Modal, Text, TextInput, Textarea, Card, Alert, } from '@mantine/core'; import { useDisclosure } from '@mantine/hooks'; import { useTranslation } from 'react-i18next'; import { IconEdit, IconTrash, IconPlus, IconInfoCircle, IconCertificate } from '@tabler/icons-react'; import { notify, useErrorHandler, AdvancedTable, useServerTable, ModalFooter, type AdvancedColumn } from '@ema-platform/ui'; import { useGetCertificationsQuery, useCreateCertificationMutation, useUpdateCertificationMutation, useDeleteCertificationMutation, } from '../api/certification-api'; import type { Certification } from '../types/certification'; function CertificationForm({ editing, isSubmitting, onSubmit, onCancel, }: { editing: Certification | null; isSubmitting: boolean; onSubmit: (values: { nameEn: string; nameAm: string; descEn: string; descAm: string }, isEdit: boolean) => void; onCancel: () => void; }) { const { t } = useTranslation(); const [nameEn, setNameEn] = useState(editing?.name?.en ?? ''); const [nameAm, setNameAm] = useState(editing?.name?.am ?? ''); const [descEn, setDescEn] = useState(editing?.description?.en ?? ''); const [descAm, setDescAm] = useState(editing?.description?.am ?? ''); const handleSubmit = (e: React.FormEvent) => { e.preventDefault(); if (!nameEn || !nameAm) { notify.error('Name fields are required'); return; } onSubmit({ nameEn, nameAm, descEn, descAm }, !!editing); }; return ( setNameEn(e.currentTarget.value)} size="sm" required /> setNameAm(e.currentTarget.value)} size="sm" required /> setDescEn(e.currentTarget.value)} size="sm" autosize minRows={2} /> setDescAm(e.currentTarget.value)} size="sm" autosize minRows={2} /> {t('certification.cancel')} {editing ? t('certification.update') : t('certification.create')} ); } export function CertificationPage() { const { t, i18n } = useTranslation(); const locale = i18n.language as 'en' | 'am'; const { handleError } = useErrorHandler(); const { data, isFetching, isError, refetch } = useGetCertificationsQuery(); const { setPageIndex, pageSize, setPageSize, paginate } = useServerTable(); const [createCert, { isLoading: isCreating }] = useCreateCertificationMutation(); const [updateCert, { isLoading: isUpdating }] = useUpdateCertificationMutation(); const [deleteCert] = useDeleteCertificationMutation(); const certifications = data?.items ?? []; const [editing, setEditing] = useState(null); const [showForm, setShowForm] = useState(false); const [deleteTarget, setDeleteTarget] = useState(null); const [deleteOpened, { open: openDelete, close: closeDelete }] = useDisclosure(false); const resetForm = () => { setEditing(null); setShowForm(false); }; const handleSubmit = async (values: { nameEn: string; nameAm: string; descEn: string; descAm: string }, isEdit: boolean) => { const name = { en: values.nameEn, am: values.nameAm }; const description = { en: values.descEn, am: values.descAm }; try { if (isEdit && editing) { await updateCert({ id: editing.id, name, description }).unwrap(); notify.success(t('certification.updated')); } else { await createCert({ name, description }).unwrap(); notify.success(t('certification.created')); } resetForm(); } catch (e) { handleError(e); } }; const handleDelete = async () => { if (!deleteTarget) return; try { await deleteCert(deleteTarget.id).unwrap(); notify.success(t('certification.deleted')); closeDelete(); setDeleteTarget(null); } catch (e) { handleError(e); } }; if (isError) return } color="red" title={t('certification.loadError')} />; const columns: AdvancedColumn[] = [ { header: t('certification.columns.name'), cell: ({ row }) => {row.original.name[locale]}, }, { header: t('certification.columns.description'), cell: ({ row }) => {row.original.description[locale]}, }, { header: t('certification.columns.status'), cell: ({ row }) => ( {row.original.isActive ? t('certification.status.active') : t('certification.status.inactive')} ), }, { header: '', label: t('certification.columns.actions', 'Actions'), size: 90, cell: ({ row }) => ( { setEditing(row.original); setShowForm(true); }}> { setDeleteTarget(row.original); openDelete(); }}> ), }, ]; const page = paginate(certifications); return ( {t('certification.title')} {t('certification.subtitle')} {!showForm && ( } onClick={() => setShowForm(true)} size="sm"> {t('certification.add')} )} {showForm && ( )} {t('certification.deleteConfirmText', { name: deleteTarget?.name?.[locale] })} {t('certification.cancel')} {t('certification.delete')} ); }