mirror of
https://github.com/Tria-plc/edr-platform.git
synced 2026-08-27 15:30:56 +00:00
The overview layout table matched invented keys (`edr_operations_officer`, `edr_marketing`, …) that only ever existed as IAM roles. The positions actually configured under the unit use their own keys — `edr_freight_app/opn`, `ethiopian_gl`, `edr_freight_app/finance` — so most staff fell through to the executive fallback regardless of desk. Map every position key in the current org tree, roots and sub-positions alike, and keep the legacy role-form keys so accounts that model the desks as roles still resolve. Finance was previously unmapped entirely. Also drop a stray console.log from resolveOverviewLayout. Safety (`edr_freight_app/sf_146`) stays unmapped — no such layout exists yet. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
100 lines
5.0 KiB
TypeScript
100 lines
5.0 KiB
TypeScript
import type { AuthUser } from "@/auth/types";
|
|
import { getPositionKeys } from "@/lib/permissions";
|
|
|
|
/** One overview composition. Every backoffice user lands on exactly one of these. */
|
|
export type OverviewLayoutKey =
|
|
| "executive"
|
|
| "operation"
|
|
| "occ"
|
|
| "marketer"
|
|
| "finance"
|
|
| "clearance";
|
|
|
|
export const OVERVIEW_LAYOUT_LABEL: Record<OverviewLayoutKey, string> = {
|
|
executive: "Executive dashboard",
|
|
operation: "Operations dashboard",
|
|
occ: "Control centre dashboard",
|
|
marketer: "Marketing dashboard",
|
|
finance: "Finance dashboard",
|
|
clearance: "Clearance & logistics dashboard",
|
|
};
|
|
|
|
/**
|
|
* Position/role key → layout, in match priority order: a user holding several
|
|
* of these keys gets the first match, so the specific operational view wins
|
|
* over the broad executive one. Roles are matched alongside positions because
|
|
* the IAM payload models the GL desks as positions (`ethiopian_gl`) on some
|
|
* accounts and as roles (`edr_gl_ethiopia`) on others — see `getPositionKeys`.
|
|
*
|
|
* The `edr_freight_app/…` keys are the org's real position keys (root desks and
|
|
* their sub-positions) as configured under Unit → Departments. They are typed
|
|
* by hand in the Add/Edit Department form, so a new sub-position appears here
|
|
* only once someone adds it — unmapped keys fall through to `executive`.
|
|
*/
|
|
const ROLE_LAYOUTS: Array<[key: string, layout: OverviewLayoutKey]> = [
|
|
// ── Clearance & logistics: both GL desks, root and sub-positions ──────────
|
|
["ethiopian_gl", "clearance"],
|
|
["edr_freight_app/gl_003", "clearance"], // Ethiopian GL Chief
|
|
["edr_freight_app/off_001", "clearance"], // Ethiopian GL Director
|
|
["edr_freight_app/off_0056", "clearance"], // Ethiopian GL Officer
|
|
["djibouti_gl", "clearance"],
|
|
["edr_freight_app/dj_gl_001", "clearance"], // Djibouti GL Director
|
|
["edr_freight_app/dj_gl_002", "clearance"], // Djibouti GL Chief
|
|
["edr_freight_app/dj_gl_003", "clearance"], // Djibouti GL Officer
|
|
["edr_gl_ethiopia", "clearance"], // legacy role form
|
|
["edr_gl_djibouti", "clearance"], // legacy role form
|
|
|
|
// ── Control centre ───────────────────────────────────────────────────────
|
|
["edr_freight_app/occ_001", "occ"], // OCC
|
|
["edr_freight_app/occ_005", "occ"], // OCC Director
|
|
["edr_line_staff", "occ"], // legacy role form
|
|
|
|
// ── Operations: operations desk, track & machinery, rolling stock ─────────
|
|
["edr_freight_app/opn", "operation"], // Operation
|
|
["edr_freight_app/opcf", "operation"], // Operation Chief
|
|
["edr_freight_app/opdr", "operation"], // Operation Director
|
|
["edr_freight_app/opco", "operation"], // Operation Officer
|
|
["edr_freight_app/opp_005", "operation"], // Operation Dispatcher
|
|
["edr_freight_app/opp_0067", "operation"], // Gelan Operation Director
|
|
["edr_freight_app/track_001", "operation"], // Track And Machinery
|
|
["edr_freight_app/ttk_001", "operation"], // Track Director
|
|
["edr_freight_app/tto_001", "operation"], // Track Operator
|
|
["edr_freight_app/rool_001", "operation"], // Rolling Stock
|
|
["edr_freight_app/rl_003", "operation"], // Rolling Stock Director
|
|
["edr_freight_app/rl_009", "operation"], // Rolling Stock Team Lead
|
|
["edr_freight_app/rl_0090", "operation"], // Rolling Stock Dispatcher
|
|
["operation", "operation"],
|
|
["operations_chief", "operation"],
|
|
["dispatcher", "operation"],
|
|
["truck_machinery_chief", "operation"],
|
|
["edr_operations_officer", "operation"], // legacy role form
|
|
|
|
// ── Marketing ────────────────────────────────────────────────────────────
|
|
["edr_freight_app/edr_test_org_0022", "marketer"], // Commercial Marketing
|
|
["edr_freight_app/edr_test_org_00567", "marketer"], // Marketing Director
|
|
["edr_freight_app/edr_test_org_0054", "marketer"], // Marketing Chief
|
|
["edr_freight_app/edr_test_org_0013", "marketer"], // Marketing Officer
|
|
["marketer", "marketer"],
|
|
["edr_marketing", "marketer"], // legacy role form
|
|
|
|
// ── Finance ──────────────────────────────────────────────────────────────
|
|
["edr_freight_app/finance", "finance"],
|
|
["edr_finance", "finance"], // legacy role form
|
|
|
|
// ── Executive: org-wide desks with no operational queue of their own ──────
|
|
["ceo", "executive"],
|
|
["director", "executive"],
|
|
["chief", "executive"],
|
|
["edr_ceo", "executive"], // legacy role form
|
|
["edr_director", "executive"], // legacy role form
|
|
["edr_org_manager", "executive"], // legacy role form
|
|
];
|
|
|
|
/** Unmapped keys (superadmin, IAM admins, Safety, new positions) keep the executive layout. */
|
|
export function resolveOverviewLayout(
|
|
user: AuthUser | null | undefined,
|
|
): OverviewLayoutKey {
|
|
const held = new Set(getPositionKeys(user));
|
|
return ROLE_LAYOUTS.find(([key]) => held.has(key))?.[1] ?? "executive";
|
|
}
|