diff --git a/apps/edr-freight-web/backoffice/src/App.tsx b/apps/edr-freight-web/backoffice/src/App.tsx
index 0da9fe3f0..81a8552e7 100644
--- a/apps/edr-freight-web/backoffice/src/App.tsx
+++ b/apps/edr-freight-web/backoffice/src/App.tsx
@@ -18,6 +18,7 @@ import {
Send,
Settings,
ShieldCheck,
+ Settings2,
Ship,
SlidersHorizontal,
Train,
@@ -142,14 +143,9 @@ const buildSidebarSections = (demoItems: SidebarItem[]): SidebarSection[] => [
icon: ,
},
{
- label: "Staff",
- href: "/user-management",
- icon: ,
- },
- {
- label: "Bookings",
- href: "/dashboard/booking-requests",
- icon: ,
+ label: "Customers",
+ href: "/dashboard/customers",
+ icon: ,
},
{
label: "Contracts",
@@ -157,6 +153,11 @@ const buildSidebarSections = (demoItems: SidebarItem[]): SidebarSection[] => [
icon: ,
permission: FREIGHT_PERMS.contracts.view,
},
+ {
+ label: "Bookings",
+ href: "/dashboard/booking-requests",
+ icon: ,
+ },
// Operations hub: clearance-document review for contracts WITHOUT
// customs clearing (contract-level for one-time, per-booking for general).
{
@@ -165,11 +166,6 @@ const buildSidebarSections = (demoItems: SidebarItem[]): SidebarSection[] => [
icon: ,
permission: FREIGHT_PERMS.contracts.opsClearanceReview,
},
- {
- label: "Customers",
- href: "/dashboard/customers",
- icon: ,
- },
{
label: "Payments",
href: "/dashboard/payments",
@@ -186,183 +182,185 @@ const buildSidebarSections = (demoItems: SidebarItem[]): SidebarSection[] => [
],
},
{
- title: "Operations",
+ // title: "Port & Terminal",
items: [
{
- label: "Clearance",
- href: "/dashboard/contracts/clearance",
- icon: ,
- permission: [
- FREIGHT_PERMS.contracts.clearanceReview,
- FREIGHT_PERMS.contracts.clearanceEtActions,
+ label: "Operations",
+ icon: ,
+ children: [
+ {
+ label: "Clearance",
+ href: "/dashboard/contracts/clearance",
+ icon: ,
+ permission: [
+ FREIGHT_PERMS.contracts.clearanceReview,
+ FREIGHT_PERMS.contracts.clearanceEtActions,
+ ],
+ },
+ {
+ label: "Shipment Requests",
+ href: "/dashboard/shipment-requests",
+ icon: ,
+ permission: FREIGHT_PERMS.contracts.createBooking,
+ },
+ // Operations Path A queue: per-booking self-clearance review for
+ // GENERAL non-customs booking instances (and legacy self-clear bookings).
+ {
+ label: "Self-Clearance Review",
+ href: "/dashboard/contracts/ops-clearance",
+ icon: ,
+ permission: FREIGHT_PERMS.contracts.opsClearanceReview,
+ },
+ {
+ label: "GL Djibouti Clearance",
+ href: "/dashboard/gl-djibouti/clearance",
+ icon: ,
+ permission: FREIGHT_PERMS.contracts.clearanceDjActions,
+ },
+ {
+ label: "Train Schedules",
+ href: "/dashboard/operations/train-scheduling-v2",
+ icon: ,
+ permission: FREIGHT_PERMS.trainScheduling.view,
+ },
+ {
+ label: "Batch Board",
+ href: "/dashboard/operations/batch-board",
+ icon: ,
+ permission: FREIGHT_PERMS.trainScheduling.view,
+ },
+ {
+ label: "First Mile",
+ href: "/dashboard/operations/first-mile",
+ icon: ,
+ permission: FREIGHT_PERMS.firstMile.view,
+ },
+ {
+ label: "Last Mile",
+ href: "/dashboard/operations/last-mile",
+ icon: ,
+ permission: FREIGHT_PERMS.lastMile.view,
+ },
],
},
{
- label: "Shipment Requests",
- href: "/dashboard/shipment-requests",
- icon: ,
- permission: FREIGHT_PERMS.contracts.createBooking,
- },
- // Operations Path A queue: per-booking self-clearance review for
- // GENERAL non-customs booking instances (and legacy self-clear bookings).
- {
- label: "Self-Clearance Review",
- href: "/dashboard/contracts/ops-clearance",
- icon: ,
- permission: FREIGHT_PERMS.contracts.opsClearanceReview,
- },
- {
- label: "GL Djibouti Clearance",
- href: "/dashboard/gl-djibouti/clearance",
- icon: ,
- permission: FREIGHT_PERMS.contracts.clearanceDjActions,
- },
- {
- label: "Train Schedules",
- href: "/dashboard/operations/train-scheduling-v2",
- icon: ,
- permission: FREIGHT_PERMS.trainScheduling.view,
- },
- {
- label: "Batch Board",
- href: "/dashboard/operations/batch-board",
- icon: ,
- permission: FREIGHT_PERMS.trainScheduling.view,
- },
- {
- label: "First Mile",
- href: "/dashboard/operations/first-mile",
+ label: "Fleet Management",
icon: ,
- permission: FREIGHT_PERMS.firstMile.view,
- },
- {
- label: "Last Mile",
- href: "/dashboard/operations/last-mile",
- icon: ,
- permission: FREIGHT_PERMS.lastMile.view,
- },
- ],
- },
- {
- title: "Fleet Management",
- items: [
- {
- label: "Fleet Dashboard",
- href: "/dashboard/fleet-dashboard",
- icon: ,
- permission: FREIGHT_PERMS.fleetDashboard.view,
- },
- {
- label: "Routes",
- href: "/dashboard/routes",
- icon: ,
- permission: FREIGHT_PERMS.fleet.view,
- },
- {
- label: "Locomotives",
- href: "/dashboard/locomotives",
- icon: ,
- permission: FREIGHT_PERMS.fleet.view,
- },
- {
- label: "Train Builder",
- href: "/dashboard/train-builder",
- icon: ,
- permission: FREIGHT_PERMS.fleet.view,
- },
+ children: [
+ {
+ label: "Fleet Dashboard",
+ href: "/dashboard/fleet-dashboard",
+ icon: ,
+ permission: FREIGHT_PERMS.fleetDashboard.view,
+ },
+ {
+ label: "Routes",
+ href: "/dashboard/routes",
+ icon: ,
+ permission: FREIGHT_PERMS.fleet.view,
+ },
+ {
+ label: "Locomotives",
+ href: "/dashboard/locomotives",
+ icon: ,
+ permission: FREIGHT_PERMS.fleet.view,
+ },
+ {
+ label: "Train Builder",
+ href: "/dashboard/train-builder",
+ icon: ,
+ permission: FREIGHT_PERMS.fleet.view,
+ },
- // {
- // label: "Wagon types",
- // href: "/dashboard/wagon-types",
- // icon: ,
- // },
- {
- label: "Wagons",
- href: "/dashboard/wagons",
- icon: ,
- permission: FREIGHT_PERMS.fleet.view,
+ // {
+ // label: "Wagon types",
+ // href: "/dashboard/wagon-types",
+ // icon: ,
+ // },
+ {
+ label: "Wagons",
+ href: "/dashboard/wagons",
+ icon: ,
+ permission: FREIGHT_PERMS.fleet.view,
+ },
+ {
+ label: "Vehicles",
+ href: "/dashboard/vehicles",
+ icon: ,
+ permission: FREIGHT_PERMS.vehicles.view,
+ },
+ {
+ label: "Drivers",
+ href: "/dashboard/drivers",
+ icon: ,
+ permission: FREIGHT_PERMS.drivers.view,
+ },
+ {
+ label: "Track Vehicles",
+ href: "/dashboard/tracking",
+ icon: ,
+ permission: FREIGHT_PERMS.tracking.view,
+ },
+ {
+ label: "Fuel Purchases",
+ href: "/dashboard/fuel-purchases",
+ icon: ,
+ permission: FREIGHT_PERMS.fuel.view,
+ },
+ {
+ label: "Fuel Analytics",
+ href: "/dashboard/fuel-stats",
+ icon: ,
+ permission: FREIGHT_PERMS.fuel.view,
+ },
+ {
+ label: "Maintenance",
+ href: "/dashboard/maintenance",
+ icon: ,
+ permission: FREIGHT_PERMS.maintenance.view,
+ },
+ {
+ label: "Work Orders",
+ href: "/dashboard/work-orders",
+ icon: ,
+ permission: FREIGHT_PERMS.maintenance.view,
+ },
+ {
+ label: "Compliance & Alerts",
+ href: "/dashboard/compliance",
+ icon: ,
+ permission: FREIGHT_PERMS.fleet.view,
+ },
+ {
+ label: "Incidents",
+ href: "/dashboard/incidents",
+ icon: ,
+ permission: FREIGHT_PERMS.fleet.view,
+ },
+ {
+ label: "Procurement",
+ href: "/dashboard/procurement",
+ icon: ,
+ permission: FREIGHT_PERMS.fleet.view,
+ },
+ {
+ label: "Financial Reports",
+ href: "/dashboard/financial-reports",
+ icon: ,
+ permission: FREIGHT_PERMS.fleetReports.view,
+ },
+ // {
+ // label: "Containers",
+ // href: "/dashboard/containers",
+ // icon: ,
+ // },
+ // {
+ // label: "Cargoes",
+ // href: "/dashboard/cargoes",
+ // icon: ,
+ // },
+ ],
},
- {
- label: "Vehicles",
- href: "/dashboard/vehicles",
- icon: ,
- permission: FREIGHT_PERMS.vehicles.view,
- },
- {
- label: "Drivers",
- href: "/dashboard/drivers",
- icon: ,
- permission: FREIGHT_PERMS.drivers.view,
- },
- {
- label: "Track Vehicles",
- href: "/dashboard/tracking",
- icon: ,
- permission: FREIGHT_PERMS.tracking.view,
- },
- {
- label: "Fuel Purchases",
- href: "/dashboard/fuel-purchases",
- icon: ,
- permission: FREIGHT_PERMS.fuel.view,
- },
- {
- label: "Fuel Analytics",
- href: "/dashboard/fuel-stats",
- icon: ,
- permission: FREIGHT_PERMS.fuel.view,
- },
- {
- label: "Maintenance",
- href: "/dashboard/maintenance",
- icon: ,
- permission: FREIGHT_PERMS.maintenance.view,
- },
- {
- label: "Work Orders",
- href: "/dashboard/work-orders",
- icon: ,
- permission: FREIGHT_PERMS.maintenance.view,
- },
- {
- label: "Compliance & Alerts",
- href: "/dashboard/compliance",
- icon: ,
- permission: FREIGHT_PERMS.fleet.view,
- },
- {
- label: "Incidents",
- href: "/dashboard/incidents",
- icon: ,
- permission: FREIGHT_PERMS.fleet.view,
- },
- {
- label: "Procurement",
- href: "/dashboard/procurement",
- icon: ,
- permission: FREIGHT_PERMS.fleet.view,
- },
- {
- label: "Financial Reports",
- href: "/dashboard/financial-reports",
- icon: ,
- permission: FREIGHT_PERMS.fleetReports.view,
- },
- // {
- // label: "Containers",
- // href: "/dashboard/containers",
- // icon: ,
- // },
- // {
- // label: "Cargoes",
- // href: "/dashboard/cargoes",
- // icon: ,
- // },
- ],
- },
- {
- title: "Port & Terminal",
- items: [
{
label: "Imports",
href: "/dashboard/import-warehouse",
@@ -437,35 +435,37 @@ const buildSidebarSections = (demoItems: SidebarItem[]): SidebarSection[] => [
},
],
},
- ],
- },
- {
- title: "Warehouse Management",
- items: [
{
- label: "Warehouse Dashboard",
- href: "/dashboard/warehouse-dashboard",
- icon: ,
- },
- {
- label: "Warehouses",
- href: "/dashboard/warehouses",
+ label: "Warehouse Management",
icon: ,
- },
- {
- label: "Allocation & Fees",
- href: "/dashboard/warehouse-rules",
- icon: ,
- },
- {
- label: "Fee Invoices",
- href: "/dashboard/warehouse-fee-invoices",
- icon: ,
+ children: [
+ {
+ label: "Warehouse Dashboard",
+ href: "/dashboard/warehouse-dashboard",
+ icon: ,
+ },
+ {
+ label: "Warehouses",
+ href: "/dashboard/warehouses",
+ icon: ,
+ },
+ {
+ label: "Allocation & Fees",
+ href: "/dashboard/warehouse-rules",
+ icon: ,
+ },
+ {
+ label: "Fee Invoices",
+ href: "/dashboard/warehouse-fee-invoices",
+ icon: ,
+ },
+ ],
},
],
},
{
- title: "Administration",
+ title: "Freight configuration",
+ mutedTitle: true,
items: [
{
label: "File settings",
@@ -485,12 +485,6 @@ const buildSidebarSections = (demoItems: SidebarItem[]): SidebarSection[] => [
icon: ,
permission: FREIGHT_PERMS.admin,
},
- ],
- },
- {
- title: "Freight configuration",
- mutedTitle: true,
- items: [
{
label: "Configuration",
href: "/dashboard/configuration",
@@ -513,6 +507,12 @@ const buildSidebarSections = (demoItems: SidebarItem[]): SidebarSection[] => [
icon: ,
children: getCategorySidebarChildren("rules"),
},
+
+ {
+ label: "Staff",
+ href: "/user-management",
+ icon: ,
+ },
],
},
];
@@ -599,7 +599,10 @@ const findActiveSidebarLabel = (
): string | undefined => {
const path = pathname.toLowerCase();
const candidates = flattenSidebarItems(sections)
- .map(({ href, label }) => ({ label, href: href.split("?")[0].toLowerCase() }))
+ .map(({ href, label }) => ({
+ label,
+ href: href.split("?")[0].toLowerCase(),
+ }))
.sort((a, b) => b.href.length - a.href.length);
return candidates.find(
@@ -674,10 +677,7 @@ const App = () => {
} />
{/* } /> */}
- }
- />
+ } />
} />
} />
diff --git a/apps/edr-freight-web/backoffice/src/components/layout/FreightSidebar.tsx b/apps/edr-freight-web/backoffice/src/components/layout/FreightSidebar.tsx
index 698b0fc2c..91429356c 100644
--- a/apps/edr-freight-web/backoffice/src/components/layout/FreightSidebar.tsx
+++ b/apps/edr-freight-web/backoffice/src/components/layout/FreightSidebar.tsx
@@ -92,7 +92,9 @@ const FreightSidebar = ({
walk(item.children, key);
});
};
- sections.forEach((section) => walk(section.items, section.title));
+ sections.forEach((section, i) =>
+ walk(section.items, section?.title ?? "" + i++),
+ );
return acc;
}, [sections, isHrefActive, branchActive]);
@@ -126,6 +128,7 @@ const FreightSidebar = ({
opened={isOpen}
classNames={navClassNames(active)}
onClick={() => toggle(key)}
+ childrenOffset="sm"
rightSection={
@@ -166,6 +169,7 @@ const FreightSidebar = ({
active={active}
component={Link}
classNames={navClassNames(active)}
+ onClick={onClose}
to={item.href!}
/>
);
@@ -177,19 +181,21 @@ const FreightSidebar = ({
() =>
sections.map((section) => (
-
- {section.title}
-
+ {section.title && (
+
+ {section.title}
+
+ )}
{section.items.map((item, i) =>
- renderItem(item, itemKey(section.title, item, i)),
+ renderItem(item, itemKey(section.title ?? "" + i, item, i)),
)}
@@ -257,7 +263,7 @@ const FreightSidebar = ({
px="sm"
pb="md"
>
- {renderedSections}
+ {renderedSections}
);
diff --git a/apps/edr-freight-web/backoffice/src/components/layout/types.ts b/apps/edr-freight-web/backoffice/src/components/layout/types.ts
index 051f28839..2129e05e5 100644
--- a/apps/edr-freight-web/backoffice/src/components/layout/types.ts
+++ b/apps/edr-freight-web/backoffice/src/components/layout/types.ts
@@ -12,7 +12,7 @@ export interface SidebarItem {
export interface SidebarSection {
/** Section label shown above a group of nav items (e.g. "Main menu"). */
- title: string;
+ title?: string;
items: SidebarItem[];
/** When true, section title uses muted grey instead of dark text. */
mutedTitle?: boolean;