/* Pelagia Portal — main app with router, sidebar, header */ const NAV_BY_ROLE = { TECHNICAL: { main: [["dashboard", "Dashboard", "home"]], "Purchase Orders": [ ["po-new", "New PO", "plus"], ["my-orders", "My Orders", "list", 3], ], Inventory: [ ["items", "Items", "box"], ["cart", "Cart", "cart", 3], ], }, MANNING: { main: [["dashboard", "Dashboard", "home"]], "Purchase Orders": [ ["po-new", "New PO", "plus"], ["my-orders", "My Orders", "list", 2], ], Inventory: [ ["items", "Items", "box"], ["cart", "Cart", "cart"], ], }, MANAGER: { main: [["dashboard", "Dashboard", "home"]], "Purchase Orders": [ ["po-new", "New PO", "plus"], ["my-orders", "My Orders", "list"], ["approvals", "Approvals", "check", 6], ["import-po", "Import PO", "upload"], ["history", "History / Export", "file"], ], Inventory: [ ["vendors", "Vendors", "users"], ["items", "Items", "box"], ["vessels", "Vessels", "ship"], ["sites", "Sites", "map"], ["cart", "Cart", "cart"], ], }, ACCOUNTS: { main: [["dashboard", "Dashboard", "home"]], "Purchase Orders": [ ["payments", "Payments", "truck", 4], ["history", "History / Export", "file"], ], Inventory: [ ["vendors", "Vendors", "users"], ], }, SUPERUSER: { main: [["dashboard", "Dashboard", "home"]], "Purchase Orders": [ ["po-new", "New PO", "plus"], ["my-orders", "My Orders", "list"], ["approvals", "Approvals", "check", 6], ["payments", "Payments", "truck", 4], ["import-po", "Import PO", "upload"], ["history", "History / Export", "file"], ], Inventory: [ ["vendors", "Vendors", "users"], ["items", "Items", "box"], ["vessels", "Vessels", "ship"], ["sites", "Sites", "map"], ["cart", "Cart", "cart"], ], }, AUDITOR: { main: [["dashboard", "Dashboard", "home"]], "Purchase Orders": [ ["history", "History / Export", "file"], ], }, ADMIN: { main: [["dashboard", "Dashboard", "home"]], "Purchase Orders": [ ["import-po", "Import PO", "upload"], ["history", "History / Export", "file"], ], Inventory: [ ["vendors", "Vendors", "users"], ["items", "Items", "box"], ["vessels", "Vessels", "ship"], ["sites", "Sites", "map"], ], Administration: [ ["users", "Users", "user"], ["accounts", "Accounts", "settings"], ], }, }; const USER_BY_ROLE = { TECHNICAL: { name: "Rajesh Pillai", short: "RP" }, MANNING: { name: "Fatima Sheikh", short: "FS" }, MANAGER: { name: "Anjali Krishnan", short: "AK" }, ACCOUNTS: { name: "Vikram Iyer", short: "VI" }, SUPERUSER: { name: "Dev Shah", short: "DS" }, AUDITOR: { name: "Lakshmi Rao", short: "LR" }, ADMIN: { name: "System Admin", short: "SA" }, }; const Sidebar = ({ role, route, navigate }) => { const nav = NAV_BY_ROLE[role] || NAV_BY_ROLE.MANAGER; return ( ); }; const Header = ({ role, setRole, navigate }) => { const u = USER_BY_ROLE[role]; return ( navigate("dashboard")} style={{ cursor: "pointer" }}> Pelagia Portal ⌘K Role setRole(e.target.value)}> {Object.keys(NAV_BY_ROLE).map(r => {r})} {u.short} {u.name} {role.toLowerCase()} ); }; const App = () => { const [authed, setAuthed] = useS(() => sessionStorage.getItem("pelagia.authed") === "1"); const [role, setRole] = useS(() => sessionStorage.getItem("pelagia.role") || "MANAGER"); const [route, setRoute] = useS(() => parseHash() || { page: "dashboard" }); useE(() => { const onHash = () => setRoute(parseHash() || { page: "dashboard" }); window.addEventListener("hashchange", onHash); return () => window.removeEventListener("hashchange", onHash); }, []); useE(() => sessionStorage.setItem("pelagia.role", role), [role]); useE(() => sessionStorage.setItem("pelagia.authed", authed ? "1" : "0"), [authed]); const navigate = (page, id) => { window.location.hash = id ? `#${page}/${id}` : `#${page}`; }; if (!authed) return setAuthed(true)} />; const page = route.page; const id = route.id; let body; switch (page) { case "dashboard": body = ; break; case "my-orders": body = ; break; case "approvals": body = ; break; case "approval-detail": body = o.id === id) || APPROVAL_QUEUE.find(o => o.id === id) || ORDERS[0]} go={navigate} role={role} />; break; case "po-detail": body = o.id === id) || ORDERS[0]} go={navigate} role={role} />; break; case "po-new": body = ; break; case "payments": body = ; break; case "history": body = ; break; case "vendors": body = ; break; case "vendor-detail": body = ; break; case "items": body = ; break; case "item-detail": body = ; break; case "sites": body = ; break; case "site-detail": body = ; break; case "vessels": body = ; break; case "accounts": body = ; break; case "users": body = ; break; case "import-po": body = ; break; case "cart": body = ; break; default: body = ; } return ( {body} ); }; function parseHash() { const h = window.location.hash.replace(/^#/, ""); if (!h) return null; const [page, id] = h.split("/"); return { page, id }; } ReactDOM.createRoot(document.getElementById("root")).render();