feat: implement endorsement types and update navigation for endorsement processing

This commit is contained in:
estifanos
2026-08-11 10:50:37 +00:00
parent deb650f22f
commit 01899c0593
8 changed files with 32 additions and 49 deletions

View File

@@ -1,21 +0,0 @@
import { Container } from '@mantine/core';
import { FeatureUnavailable } from '@ema-platform/ui';
/**
* Placeholder until this feature has a backend.
*
* This page previously rendered hardcoded sample records, which were
* indistinguishable from real ones.
*/
export function EndorsementQueuePage() {
return (
<Container size="lg" py="xl">
<FeatureUnavailable
title="Endorsement queue"
description="Endorsement processing is not connected to the backend yet."
/>
</Container>
);
}
export default EndorsementQueuePage;

View File

@@ -1,21 +0,0 @@
import { Container } from '@mantine/core';
import { FeatureUnavailable } from '@ema-platform/ui';
/**
* Placeholder until this feature has a backend.
*
* This page previously rendered hardcoded sample records, which were
* indistinguishable from real ones.
*/
export function EndorsementReviewPage() {
return (
<Container size="lg" py="xl">
<FeatureUnavailable
title="Endorsement review"
description="Endorsement processing is not connected to the backend yet."
/>
</Container>
);
}
export default EndorsementReviewPage;

View File

@@ -3,6 +3,7 @@ import {
IconArrowsExchange,
IconFileDescription,
IconId,
IconRubberStamp,
IconShip,
IconTruck,
IconUsers,
@@ -97,6 +98,18 @@ const PRESENTATION: Record<string, LicenseTypePresentation> = {
// no capital threshold, no staff roles.
detailSections: ['overview', 'documents'],
},
ENDORSEMENT_COC: {
key: 'ENDORSEMENT_COC',
icon: IconRubberStamp,
// Person-centric, same as seafarer registration: no company entity, no
// capital threshold, no staff roles, no inspection.
detailSections: ['overview', 'documents'],
},
ENDORSEMENT_GOC: {
key: 'ENDORSEMENT_GOC',
icon: IconRubberStamp,
detailSections: ['overview', 'documents'],
},
};
/** Falls back to a generic presentation so an unseeded type still renders. */

View File

@@ -97,6 +97,8 @@ const APPLICANT_NAME_TYPE_KEYS = [
"CERTIFICATE_OF_PROFICIENCY",
"VESSEL_REGISTRATION",
"VESSEL_OWNERSHIP_TRANSFER",
"ENDORSEMENT_COC",
"ENDORSEMENT_GOC",
];
function applicantOrCompanyName(app: LicenseApplication): string | undefined {

View File

@@ -38,6 +38,10 @@ export const am: Translations = {
typeMto: "የብዝሃ-ሁነታ ትራንስፖርት አንቀሳቃሽ",
typeSEAFARER_REGISTRATION: "የመርከበኞች ምዝገባ",
typeVESSEL_OWNERSHIP_TRANSFER: "የመርከብ ባለቤትነት ዝውውር",
typeCERTIFICATE_OF_COMPETENCY: "የብቃት ማረጋገጫ ምስክር ወረቀት",
typeCERTIFICATE_OF_PROFICIENCY: "የብቃት ምስክር ወረቀት",
typeENDORSEMENT_COC: "የCoC ማረጋገጫ",
typeENDORSEMENT_GOC: "የGOC ማረጋገጫ",
primary: "ዋና",
destinations: "ወደ",
noResults: "ምንም አልተገኘም",
@@ -74,7 +78,8 @@ export const am: Translations = {
seamanBookQueue: "የመርከበኞች መጽሐፍ ወረፋ",
cocQueue: "የCoC ወረፋ",
copQueue: "የCoP ወረፋ",
endorsementQueue: "የማረጋገጫ ወረፋ",
endorsementCocQueue: "የCoC ማረጋገጫ ወረፋ",
endorsementGocQueue: "የGOC ማረጋገጫ ወረፋ",
vesselRegistrations: "የመርከብ ምዝገባ",
// vesselRegistrationReport: 'የምዝገባ ሪፖርት',
vesselTransfers: "የመርከብ ባለቤትነት ዝውውር",

View File

@@ -36,6 +36,10 @@ export const en = {
typeMto: 'Multimodal Transport Operator',
typeSEAFARER_REGISTRATION: 'Seafarer Registration',
typeVESSEL_OWNERSHIP_TRANSFER: 'Vessel Ownership Transfer',
typeCERTIFICATE_OF_COMPETENCY: 'Certificate of Competency',
typeCERTIFICATE_OF_PROFICIENCY: 'Certificate of Proficiency',
typeENDORSEMENT_COC: 'CoC Endorsement',
typeENDORSEMENT_GOC: 'GOC Endorsement',
primary: 'Primary',
destinations: 'Go to',
noResults: 'Nothing found',
@@ -72,7 +76,8 @@ export const en = {
postWaiverQueue: 'Post-Waiver Queue',
cocQueue: 'CoC Queue',
copQueue: 'CoP Queue',
endorsementQueue: 'Endorsement Queue',
endorsementCocQueue: 'CoC Endorsement Queue',
endorsementGocQueue: 'GOC Endorsement Queue',
vesselRegistrations: 'Vessel Registration',
vesselTransfers: 'Vessel Ownership Transfer',
seafarerRegistry: 'Seafarer Registry',

View File

@@ -115,7 +115,8 @@ export const NAV_SECTIONS: NavSection[] = [
{ to: '/licence-review/type/CERTIFICATE_OF_COMPETENCY', label: 'nav.cocQueue', icon: IconShieldCheck },
{ to: '/licence-review/type/CERTIFICATE_OF_PROFICIENCY', label: 'nav.copQueue', icon: IconShieldCheck },
{ to: '/seaman-book-queue', label: 'nav.seamanBookQueue', icon: IconBook2, soon: true },
{ to: '/endorsement-queue', label: 'nav.endorsementQueue', icon: IconRubberStamp, soon: true },
{ to: '/licence-review/type/ENDORSEMENT_COC', label: 'nav.endorsementCocQueue', icon: IconRubberStamp },
{ to: '/licence-review/type/ENDORSEMENT_GOC', label: 'nav.endorsementGocQueue', icon: IconRubberStamp },
{ to: '/medical-verification', label: 'nav.medicalVerification', icon: IconHeart },
],
},

View File

@@ -19,8 +19,6 @@ import { ConfigurationPage } from '../features/configuration/pages/Configuration
import { LocationPage } from '../features/location/pages/LocationPage';
import { AnalyticsPage } from '../features/analytics/pages/AnalyticsPage';
import { ApplicationReviewPage } from '../features/applications/pages/ApplicationReviewPage';
import { EndorsementQueuePage } from '../features/endorsement/pages/EndorsementQueuePage';
import { EndorsementReviewPage } from '../features/endorsement/pages/EndorsementReviewPage';
import { MedicalVerificationPage } from '../features/medical-verification/pages/MedicalVerificationPage';
import { PaymentConfigPage } from '../features/payment-config/pages/PaymentConfigPage';
import { SeafarerRegistryPage } from '../features/seafarer-registry/pages/SeafarerRegistryPage';
@@ -73,8 +71,9 @@ const router = createBrowserRouter([
// CoC/CoP review happens in the config-driven licence queue.
{ path: 'coc-queue', element: <Navigate to="/licence-review/type/CERTIFICATE_OF_COMPETENCY" replace /> },
{ path: 'coc-queue/:id', element: <Navigate to="/licence-review" replace /> },
{ path: 'endorsement-queue', element: <EndorsementQueuePage /> },
{ path: 'endorsement-queue/:id', element: <EndorsementReviewPage /> },
// Endorsement review happens in the config-driven licence queue.
{ path: 'endorsement-queue', element: <Navigate to="/licence-review/type/ENDORSEMENT_COC" replace /> },
{ path: 'endorsement-queue/:id', element: <Navigate to="/licence-review" replace /> },
{ path: 'medical-verification', element: <MedicalVerificationPage /> },
{ path: 'payment-config', element: <PaymentConfigPage /> },
{ path: 'seafarer-registry', element: <SeafarerRegistryPage /> },