import { Boxes, Building2, Container, FileSignature, FileText, LayoutDashboard, LayoutGrid, MapPin, Network, Package, PackageCheck, PackageOpen, Paperclip, Send, Settings, ShieldCheck, SlidersHorizontal, Train, Truck, Users, Wallet, } from "lucide-react"; import { Navigate, Outlet, Route, Routes, useLocation, useNavigate } from "react-router-dom"; import { FreightDashboardLayout, type SidebarItem, type SidebarSection } from "@/components/layout"; import { useAuth } from "./auth/useAuth"; import LoadingScreen from "./components/LoadingScreen"; import LoginPage from "./pages/auth/LoginPage"; import BookingContractPage from "./pages/bookings/BookingContractPage"; import BookingRequestDetailPage from "./pages/bookings/BookingRequestDetailPage"; import BookingRequestsPage from "./pages/bookings/BookingRequestsPage"; import NewBookingPage from "./pages/bookings/NewBookingPage"; import ContractRequestsPage from "./pages/contracts/ContractRequestsPage"; import ContractRequestDetailPage from "./pages/contracts/ContractRequestDetailPage"; import ContractViewPage from "./pages/contracts/ContractViewPage"; import ContractClearanceListPage from "./pages/contracts/ContractClearanceListPage"; import ContractClearanceDetailPage from "./pages/contracts/ContractClearanceDetailPage"; import GlCreateBookingForm from "./components/contracts/GlCreateBookingForm"; import BookingMilestonesPage from "./pages/contracts/BookingMilestonesPage"; import CustomerDetailPage from "./pages/customers/CustomerDetailPage"; import CustomersPage from "./pages/customers/CustomersPage"; import DemoUser1Page from "./pages/dashboard/demo/DemoUser1Page"; import DemoUser2Page from "./pages/dashboard/demo/DemoUser2Page"; import MyProfilePage from "./pages/dashboard/MyProfilePage"; import OverviewPage from "./pages/dashboard/OverviewPage"; import UserManagementHostPage from "./pages/dashboard/user-management/UserManagementHostPage"; import PaymentsPage from "./pages/payments/PaymentsPage"; //import EmployeesPage from "./pages/dashboard/user-management/EmployeesPage"; import { RequirePermission } from "./components/auth/RequirePermission"; import { FREIGHT_PERMS, hasPermission as hasFreightPermission } from "./lib/permissions"; import PermissionsPage from "./pages/dashboard/user-management/PermissionsPage"; import PositionTypesPage from "./pages/dashboard/user-management/PositionTypesPage"; import RolesPage from "./pages/dashboard/user-management/RolesPage"; import UserManagementPage from "./pages/dashboard/user-management/UserManagementPage"; import UsersPage from "./pages/dashboard/user-management/UsersPage"; import FileUploadSettingsPage from "./pages/documents/FileUploadSettingsPage"; import DropdownSettingsPage from "./pages/dropdown_settings/DropdownSettingsPage"; import FleetResourcePage from "./pages/fleet/FleetResourcePage"; import RoutesPage from "./pages/fleet/RoutesPage"; import FuelPurchasePage from "./pages/fleet/FuelPurchasePage"; import FuelStatsPage from "./pages/fleet/FuelStatsPage"; import { MaintenancePage } from "./pages/fleet/MaintenancePage"; import { FinancialReportsPage } from "./pages/fleet/FinancialReportsPage"; import { FleetDashboard } from "./pages/fleet/FleetDashboard"; import { TrackingPage } from "./pages/fleet/TrackingPage"; import { getCategorySidebarChildren } from "./pages/ruleEngine/config/resources"; import RuleEngineLegacyRedirect from "./pages/ruleEngine/RuleEngineLegacyRedirect"; import RuleEngineResourcePage from "./pages/ruleEngine/RuleEngineResourcePage"; import CargoTypesPage from "./pages/ruleEngine/CargoTypesPage"; import TrainScheduleV2ListPage from "./pages/trainScheduling/TrainScheduleV2ListPage"; import BatchBoardPage from "./pages/trainScheduling/BatchBoardPage"; import BatchScheduleDetailPage from "./pages/trainScheduling/BatchScheduleDetailPage"; import TrainScheduleV2DetailPage from "./pages/trainScheduling/TrainScheduleV2DetailPage"; import TrainScheduleTrackPage from "./pages/trainScheduling/TrainScheduleTrackPage"; import TrainSchedulingGlobalRulesPage from "./pages/trainScheduling/TrainSchedulingGlobalRulesPage"; import FirstMilePage from "./pages/operations/FirstMilePage"; import LastMilePage from "./pages/operations/LastMilePage"; import TrainDetailPage from "./pages/trains/TrainDetailPage"; import ArrivalQueuePage from "./pages/warehouses/ArrivalQueuePage"; import DispatchQueuePage from "./pages/warehouses/DispatchQueuePage"; import ExportDjiboutiUnloadingQueuePage from "./pages/warehouses/ExportDjiboutiUnloadingQueuePage"; import ExportWarehouseFlowPage from "./pages/warehouses/ExportWarehouseFlowPage"; import ImportWarehouseFlowPage from "./pages/warehouses/ImportWarehouseFlowPage"; import InterchangeDocumentsPage from "./pages/warehouses/InterchangeDocumentsPage"; import InventoryInquiryPage from "./pages/warehouses/InventoryInquiryPage"; import LoadedInventoryPage from "./pages/warehouses/LoadedInventoryPage"; import LoadingQueuePage from "./pages/warehouses/LoadingQueuePage"; import WarehouseDashboardPage from "./pages/warehouses/WarehouseDashboardPage"; import WarehouseDetailPage from "./pages/warehouses/WarehouseDetailPage"; import WarehouseInventoryPage from "./pages/warehouses/WarehouseInventoryPage"; import WarehouseInvoicesPage from "./pages/warehouses/WarehouseInvoicesPage"; import WarehouseListPage from "./pages/warehouses/WarehouseListPage"; import WarehouseRulesPage from "./pages/warehouses/WarehouseRulesPage"; import { HealthCheck } from "./features/health/HealthCheck"; import FaydaCallbackPage from "./pages/FaydaCallbackPage"; const buildSidebarSections = (demoItems: SidebarItem[]): SidebarSection[] => [ { title: "Main menu", items: [ { label: "Overview", href: "/dashboard/overview", icon: , }, { label: "User Management", href: "/um", icon: , }, { label: "Booking requests", href: "/dashboard/booking-requests", icon: , }, { label: "Contract requests", href: "/dashboard/contract-requests", icon: , permission: FREIGHT_PERMS.contracts.view, }, { label: "Customers", href: "/dashboard/customers", icon: , }, { label: "Payments", href: "/dashboard/payments", icon: , permission: FREIGHT_PERMS.bookings.view, }, ...demoItems, ], }, { title: "Operations", items: [ { label: "Document Clearance", href: "/dashboard/contracts/clearance", icon: , permission: FREIGHT_PERMS.contracts.clearanceReview, }, { 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.trainScheduling.view, }, { label: "Last Mile", href: "/dashboard/operations/last-mile", icon: , permission: FREIGHT_PERMS.trainScheduling.view, }, ], }, { title: "Fleet Management", items: [ { label: "Fleet Dashboard", href: "/dashboard/fleet-dashboard", icon: , permission: FREIGHT_PERMS.fleet.view, }, { label: "Routes", href: "/dashboard/routes", icon: , permission: FREIGHT_PERMS.fleet.view, }, { label: "Locomotives", href: "/dashboard/locomotives", 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.fleet.view, }, { label: "Drivers", href: "/dashboard/drivers", icon: , permission: FREIGHT_PERMS.fleet.view, }, { label: "Track Vehicles", href: "/dashboard/tracking", icon: , permission: FREIGHT_PERMS.fleet.view, }, { label: "Fuel Purchases", href: "/dashboard/fuel-purchases", icon: , permission: FREIGHT_PERMS.fleet.view, }, { label: "Fuel Analytics", href: "/dashboard/fuel-stats", icon: , permission: FREIGHT_PERMS.fleet.view, }, { label: "Maintenance", href: "/dashboard/maintenance", icon: , permission: FREIGHT_PERMS.fleet.view, }, { label: "Financial Reports", href: "/dashboard/financial-reports", icon: , permission: FREIGHT_PERMS.fleet.view, }, // { // label: "Containers", // href: "/dashboard/containers", // icon: , // }, // { // label: "Cargoes", // href: "/dashboard/cargoes", // icon: , // }, ], }, { title: "Port & Terminal", items: [ { label: "Import Operations", href: "/dashboard/import-warehouse", icon: , children: [ { label: "Import Overview", href: "/dashboard/import-warehouse", icon: , }, { label: "Arrival Queue", href: "/dashboard/arrival-queue", icon: , }, { label: "Dispatch Queue", href: "/dashboard/dispatch-queue", icon: , }, { label: "Terminal Inventory", href: "/dashboard/warehouse-inventory", icon: , }, { label: "Inventory Inquiry", href: "/dashboard/inventory-inquiry", icon: , }, ], }, { label: "Export Operations", href: "/dashboard/export-warehouse", icon: , children: [ { label: "Export Overview", href: "/dashboard/export-warehouse", icon: , }, { label: "Loading Queue", href: "/dashboard/loading-queue", icon: , }, { label: "Loaded Inventory", href: "/dashboard/loaded-inventory", icon: , }, { label: "Dispatch Queue", href: "/dashboard/dispatch-queue", icon: , }, { label: "Djibouti Unloading", href: "/dashboard/export-djibouti-unloading", icon: , }, { label: "Interchange Documents", href: "/dashboard/interchange-documents", icon: , }, { label: "Terminal Inventory", href: "/dashboard/warehouse-inventory", icon: , }, ], }, ], }, { title: "Warehouse Management", items: [ { 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", items: [ { label: "File settings", href: "/dashboard/file-settings", icon: , permission: FREIGHT_PERMS.admin, }, { label: "Dropdown settings", href: "/dashboard/dropdown-settings", icon: , permission: FREIGHT_PERMS.admin, }, ], }, { title: "Freight configuration", mutedTitle: true, items: [ { label: "Configuration", href: "/dashboard/configuration", icon: , children: [ ...getCategorySidebarChildren("configuration"), // { // label: "Train scheduling rules", // href: "/dashboard/configuration/train-scheduling-rules", // }, ], }, { label: "Rules", href: "/dashboard/rules", icon: , children: getCategorySidebarChildren("rules"), }, ], }, ]; /** Keep only items the user is permitted to see; drop now-empty sections. */ const filterSidebarByPermission = ( sections: SidebarSection[], user: ReturnType["user"], ): SidebarSection[] => { const itemAllowed = (item: SidebarItem): boolean => { if (!item.permission) return true; const keys = Array.isArray(item.permission) ? item.permission : [item.permission]; return keys.some((key) => hasFreightPermission(user, key)); }; return sections .map((section) => ({ ...section, items: section.items.filter(itemAllowed), })) .filter((section) => section.items.length > 0); }; const DashboardShell = () => { const navigate = useNavigate(); const location = useLocation(); const { user, logout } = useAuth(); const demoItems: SidebarItem[] = []; const sidebarSections = filterSidebarByPermission( buildSidebarSections(demoItems), user, ); const displayName = user?.name?.en || user?.username || user?.email || "User"; return ( ); }; const App = () => { const { user, loading } = useAuth(); if (loading) { return ; } if (!user) { return ( } /> } /> } /> } /> ); } return ( } /> } /> } /> } /> } /> }> } /> } /> } /> } /> } /> } /> } /> } /> } /> {/* Legacy booking-based clearance URLs → the contract clearance hub. */} } /> } /> {/* Contracts (Path A/B) */} } /> } /> } /> {/* GL (Path B) contract clearance review hub */} } /> } /> {/* Path A ops queue out of scope for now → fold into the GL hub. */} } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> {/* Legacy embedded user management routes */} } /> } /> } /> {/* } /> */} } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> ); }; export default App;