[] = useMemo(
+ () => [
+ {
+ header: 'Seafarer',
+ label: 'Seafarer',
+ accessorKey: 'profile.firstName',
+ cell: ({ row }) => (
+
+
+ {ownerName(row.original.profile)}
+
+ {row.original.profile?.seafarerNumber && (
+
+ {row.original.profile.seafarerNumber}
+
+ )}
+
+ ),
+ },
+ {
+ header: 'Issuer',
+ label: 'Issuer',
+ accessorKey: 'issuerName',
+ cell: ({ row }) => (
+
+ {row.original.issuerName}
+ {row.original.certificateNumber && (
+
+ № {row.original.certificateNumber}
+
+ )}
+
+ ),
+ },
+ {
+ header: 'Validity',
+ label: 'Validity',
+ cell: ({ row }) => (
+
+ {row.original.issueDate} → {row.original.expiryDate}
+
+ ),
+ },
+ {
+ header: 'Fitness',
+ label: 'Fitness',
+ accessorKey: 'fitnessStatus',
+ cell: ({ row }) => (
+
+ {row.original.fitnessStatus}
+
+ ),
+ },
+ {
+ header: '',
+ label: 'Actions',
+ align: 'right',
+ cell: ({ row }) => (
+
+ }
+ onClick={() =>
+ setAttachmentModal({
+ ownerType: 'MEDICAL_CERTIFICATE',
+ ownerId: row.original.id,
+ title: `Evidence for ${ownerName(row.original.profile)} Medical Certificate`,
+ })
+ }
+ >
+ Evidence
+
+ }
+ loading={rulingMedical}
+ onClick={() =>
+ rule(
+ () =>
+ verifyMedical({
+ id: row.original.id,
+ outcome: 'VERIFIED',
+ }).unwrap(),
+ 'Certificate verified',
+ )
+ }
+ >
+ Verify
+
+ }
+ onClick={() => setRejectMedical(row.original)}
+ >
+ Reject
+
+
+ ),
+ },
+ ],
+ [rulingMedical, rule, verifyMedical],
+ );
+
+ const seaServiceColumns: AdvancedColumn[] = useMemo(
+ () => [
+ {
+ header: 'Seafarer',
+ label: 'Seafarer',
+ accessorKey: 'profile.firstName',
+ cell: ({ row }) => (
+
+
+ {ownerName(row.original.profile)}
+
+ {row.original.profile?.seafarerNumber && (
+
+ {row.original.profile.seafarerNumber}
+
+ )}
+
+ ),
+ },
+ {
+ header: 'Vessel',
+ label: 'Vessel',
+ accessorKey: 'vesselName',
+ cell: ({ row }) => (
+
+ {row.original.vesselName}
+ {row.original.imoNumber && (
+
+ IMO {row.original.imoNumber}
+
+ )}
+
+ ),
+ },
+ {
+ header: 'Rank',
+ label: 'Rank',
+ accessorKey: 'rank',
+ cell: ({ row }) => {row.original.rank},
+ },
+ {
+ header: 'Period',
+ label: 'Period',
+ cell: ({ row }) => (
+
+ {row.original.engagementDate} → {row.original.dischargeDate}
+
+ ),
+ },
+ {
+ header: '',
+ label: 'Actions',
+ align: 'right',
+ cell: ({ row }) => (
+
+ }
+ onClick={() =>
+ setAttachmentModal({
+ ownerType: 'SEA_SERVICE_RECORD',
+ ownerId: row.original.id,
+ title: `Evidence for ${ownerName(row.original.profile)} Sea Service Record`,
+ })
+ }
+ >
+ Evidence
+
+ }
+ loading={rulingSeaService}
+ onClick={() =>
+ rule(
+ () =>
+ verifySeaService({
+ id: row.original.id,
+ outcome: 'VERIFIED',
+ }).unwrap(),
+ 'Sea-service record verified',
+ )
+ }
+ >
+ Verify
+
+ }
+ onClick={() => setRejectSeaService(row.original)}
+ >
+ Reject
+
+
+ ),
+ },
+ ],
+ [rulingSeaService, rule, verifySeaService],
+ );
return (
@@ -137,192 +476,52 @@ export function MedicalVerificationPage() {
}>
- Medical ({pendingMedical?.length ?? 0})
+ Medical ({pendingMedicalList.length})
}>
- Sea Service ({pendingSeaService?.length ?? 0})
+ Sea Service ({pendingSeaServiceList.length})
-
- {loadingMedical ? (
-
-
-
- ) : (pendingMedical ?? []).length === 0 ? (
-
-
- Nothing awaiting verification.
-
-
- ) : (
-
-
-
- Seafarer
- Issuer
- Validity
- Fitness
-
-
-
-
- {(pendingMedical ?? []).map((certificate) => (
-
-
-
- {ownerName(certificate.profile)}
-
- {certificate.profile?.seafarerNumber && (
-
- {certificate.profile.seafarerNumber}
-
- )}
-
-
- {certificate.issuerName}
- {certificate.certificateNumber && (
-
- № {certificate.certificateNumber}
-
- )}
-
-
- {certificate.issueDate} → {certificate.expiryDate}
-
-
-
- {certificate.fitnessStatus}
-
-
-
-
- }
- loading={rulingMedical}
- onClick={() =>
- rule(
- () =>
- verifyMedical({
- id: certificate.id,
- outcome: 'VERIFIED',
- }).unwrap(),
- 'Certificate verified',
- )
- }
- >
- Verify
-
- }
- onClick={() => setRejectMedical(certificate)}
- >
- Reject
-
-
-
-
- ))}
-
-
- )}
-
+
-
- {loadingSeaService ? (
-
-
-
- ) : (pendingSeaService ?? []).length === 0 ? (
-
-
- Nothing awaiting verification.
-
-
- ) : (
-
-
-
- Seafarer
- Vessel
- Rank
- Period
-
-
-
-
- {(pendingSeaService ?? []).map((record) => (
-
-
-
- {ownerName(record.profile)}
-
- {record.profile?.seafarerNumber && (
-
- {record.profile.seafarerNumber}
-
- )}
-
-
- {record.vesselName}
- {record.imoNumber && (
-
- IMO {record.imoNumber}
-
- )}
-
- {record.rank}
-
- {record.engagementDate} → {record.dischargeDate}
-
-
-
- }
- loading={rulingSeaService}
- onClick={() =>
- rule(
- () =>
- verifySeaService({
- id: record.id,
- outcome: 'VERIFIED',
- }).unwrap(),
- 'Sea-service record verified',
- )
- }
- >
- Verify
-
- }
- onClick={() => setRejectSeaService(record)}
- >
- Reject
-
-
-
-
- ))}
-
-
- )}
-
+
+ setAttachmentModal(null)}
+ />
+
)}
@@ -461,7 +462,7 @@ const EMPTY_MEDICAL = {
};
function MedicalTab() {
- const { data: certificates, isLoading } = useGetMyMedicalCertificatesQuery();
+ const { data: certificates, isLoading, refetch } = useGetMyMedicalCertificatesQuery();
const [createCertificate, { isLoading: creating }] =
useCreateMedicalCertificateMutation();
const [updateCertificate, { isLoading: updating }] =
@@ -654,6 +655,7 @@ function MedicalTab() {
onPageChange={setPageIndex}
pageSize={pageSize}
isLoading={isLoading}
+ refresh={refetch}
/>
)}
diff --git a/libs/ui/src/lib/data/AdvancedTable.tsx b/libs/ui/src/lib/data/AdvancedTable.tsx
index 4fcae4570..6ec59a3c7 100644
--- a/libs/ui/src/lib/data/AdvancedTable.tsx
+++ b/libs/ui/src/lib/data/AdvancedTable.tsx
@@ -85,7 +85,7 @@ export function AdvancedTable({
const shownColumns = columns.filter((_, i) => visible[i] ?? true);
return (
-
+
{""}