/* Pelagia Portal — page components */ const { useState: useS, useEffect: useE, useMemo: useM } = React; /* ═══════════════════ LOGIN ═══════════════════ */ const LoginPage = ({ onLogin }) => (
Pelagia Portal
Internal · Purchase Order Management
Contact an administrator to request access.
); /* ═══════════════════ DASHBOARD (Manager view) ═══════════════════ */ const Dashboard = ({ role, go }) => { // Manager-rich view; switch headline content by role const isMgr = role === "MANAGER" || role === "SUPERUSER"; const isAcct = role === "ACCOUNTS"; const isAuditor = role === "AUDITOR" || role === "ADMIN"; const isSubmitter = role === "TECHNICAL" || role === "MANNING"; const maxSpend = Math.max(...SPEND_TREND.map(s => s.v)); return ( <>

Good afternoon, Anjali

Tuesday, May 12, 2026 · 14:38 IST · 3 vessels active at sea
{isMgr && ( <>
↑ 2 vs last week} onClick={() => go("approvals")} /> across 5 vessels} /> ↓ 8% vs Apr} /> submit → approve} />
₹ in thousands}>
{SPEND_TREND.map((s, i) => (
{s.v}
))}
₹ in thousands}>
{VESSEL_SPEND.map((v, i) => { const max = Math.max(...VESSEL_SPEND.map(x => x.v)); return (
{v.name}
{v.v}
); })}
go("history")} href="#">View history →} flush> {ORDERS.filter(o => ["MGR_APPROVED", "SENT_FOR_PAYMENT", "PAID_DELIVERED", "CLOSED"].includes(o.status)).slice(0, 5).map(o => ( go("po-detail", o.id)}> ))}
PO NumberTitleVessel SubmitterApprovedAmount
{o.id} {o.title} {o.vessel} {o.submitter} {o.approved || "—"} {inr(o.amount)}
)} {isAcct && ( <>
go("payments")} />
go("payments")} className="muted" style={{ fontSize: 12 }}>Open queue →}>
4 POs ready to send for payment. Open the queue to process.
)} {isSubmitter && ( <>
go("my-orders")} />
{ORDERS.filter(o => o.submitter === "Rajesh Pillai").slice(0, 4).map(o => ( go("po-detail", o.id)}> ))}
PO NumberTitleVesselStatusAmount
{o.id} {o.title} {o.vessel} {inr(o.amount)}
)} {isAuditor && ( <>
go("history")} />
)} ); }; /* ═══════════════════ MY ORDERS ═══════════════════ */ const MyOrders = ({ go }) => { const mine = ORDERS.filter(o => o.submitter === "Rajesh Pillai"); const open = mine.filter(o => ["DRAFT","SUBMITTED","MGR_REVIEW","VENDOR_ID_PENDING","EDITS_REQUESTED"].includes(o.status)); const past = mine.filter(o => !["DRAFT","SUBMITTED","MGR_REVIEW","VENDOR_ID_PENDING","EDITS_REQUESTED"].includes(o.status)); // Add a couple of synthetic past orders to make it feel real const pastFull = [...past, ...ORDERS.filter(o => ["CLOSED","PAID_DELIVERED","SENT_FOR_PAYMENT","MGR_APPROVED","REJECTED"].includes(o.status)).slice(0,3)]; return ( <>

My Purchase Orders

{open.length} open · {pastFull.length} past

Open orders

{open.length === 0 ?
No open orders.
: ( {open.map(o => ( go("po-detail", o.id)}> {o.managerNote && ( )} ))}
PO NumberTitleVesselStatusUpdatedAmount
{o.id} {o.title} {o.vessel} {o.submitted || o.created || "—"} {inr(o.amount)}
Manager note · Anjali Krishnan: {o.managerNote}
)}

Past orders

{pastFull.map(o => ( go("po-detail", o.id)}> ))}
PO NumberTitleVesselStatusClosed/CompletedAmount
{o.id} {o.title} {o.vessel} {o.closed || o.paid || o.approved || o.rejected || "—"} {inr(o.amount)}
); }; Object.assign(window, { LoginPage, Dashboard, MyOrders });