import { Navigate, Outlet, Route, Routes, useLocation, useNavigate } from "react-router-dom"; import { Boxes, FileText, LayoutDashboard, LayoutGrid, Network, Paperclip, PackageCheck, Send, Settings, SlidersHorizontal, Train, Truck, Container, Package, PackageOpen, Users, Wallet, //TrainTrack, } from "lucide-react"; import { FreightDashboardLayout, type SidebarItem, type SidebarSection } from "@/components/layout"; import LoadingScreen from "./components/LoadingScreen"; import { useAuth } from "./auth/useAuth"; 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 PaymentsPage from "./pages/payments/PaymentsPage"; import NewBookingPage from "./pages/bookings/NewBookingPage"; import UserManagementHostPage from "./pages/dashboard/user-management/UserManagementHostPage"; import DemoUser1Page from "./pages/dashboard/demo/DemoUser1Page"; import DemoUser2Page from "./pages/dashboard/demo/DemoUser2Page"; import OverviewPage from "./pages/dashboard/OverviewPage"; import MyProfilePage from "./pages/dashboard/MyProfilePage"; //import EmployeesPage from "./pages/dashboard/user-management/EmployeesPage"; 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 DropdownSettingsPage from "./pages/dropdown_settings/DropdownSettingsPage"; import FileUploadSettingsPage from "./pages/documents/FileUploadSettingsPage"; import RuleEngineLegacyRedirect from "./pages/ruleEngine/RuleEngineLegacyRedirect"; import RuleEngineResourcePage from "./pages/ruleEngine/RuleEngineResourcePage"; import TrainsPage from "./pages/trains/TrainsPage"; import TrainScheduleV2ListPage from "./pages/trainScheduling/TrainScheduleV2ListPage"; import TrainScheduleV2DetailPage from "./pages/trainScheduling/TrainScheduleV2DetailPage"; import TrainSchedulingGlobalRulesPage from "./pages/trainScheduling/TrainSchedulingGlobalRulesPage"; import FleetResourcePage from "./pages/fleet/FleetResourcePage"; import { getCategorySidebarChildren } from "./pages/ruleEngine/config/resources"; import RuleEngineLegacyRedirect from "./pages/ruleEngine/RuleEngineLegacyRedirect"; import RuleEngineResourcePage from "./pages/ruleEngine/RuleEngineResourcePage"; 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 FleetResourcePage from "./pages/fleet/FleetResourcePage"; import { getCategorySidebarChildren } from "./pages/ruleEngine/config/resources"; import { FREIGHT_PERMS, hasPermission as hasFreightPermission } from "./lib/permissions"; import { RequirePermission } from "./components/auth/RequirePermission"; import TrainDetailPage from "./pages/trains/TrainDetailPage"; import RoutesPage from "./pages/fleet/RoutesPage"; import WarehouseDashboardPage from "./pages/warehouses/WarehouseDashboardPage"; import WarehouseListPage from "./pages/warehouses/WarehouseListPage"; import WarehouseDetailPage from "./pages/warehouses/WarehouseDetailPage"; import WarehouseInventoryPage from "./pages/warehouses/WarehouseInventoryPage"; import InventoryInquiryPage from "./pages/warehouses/InventoryInquiryPage"; import WarehouseDashboardPage from "./pages/warehouses/WarehouseDashboardPage"; import LoadingQueuePage from "./pages/warehouses/LoadingQueuePage"; import LoadedInventoryPage from "./pages/warehouses/LoadedInventoryPage"; import DispatchQueuePage from "./pages/warehouses/DispatchQueuePage"; import ArrivalQueuePage from "./pages/warehouses/ArrivalQueuePage"; import WarehouseRulesPage from "./pages/warehouses/WarehouseRulesPage"; import WarehouseInvoicesPage from "./pages/warehouses/WarehouseInvoicesPage"; const buildSidebarSections = (demoItems: SidebarItem[]): SidebarSection[] => [ { title: "Main menu", mutedTitle: true, items: [ { label: "Overview", href: "/dashboard/overview", icon: , }, { label: "UM", href: "/um", icon: , }, { label: "Booking requests", href: "/dashboard/booking-requests", icon: , }, { label: "Payments", href: "/dashboard/payments", icon: , permission: FREIGHT_PERMS.bookings.view, }, ...demoItems, ], }, { title: "Operations", items: [ { 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, }, ], }, { title: "Fleet Management", items: [ { label: "Routes", href: "/dashboard/routes", icon: , permission: FREIGHT_PERMS.fleet.view, }, { label: "Locomotives", href: "/dashboard/locomotives", icon: , permission: FREIGHT_PERMS.fleet.view, }, // { // label: "Trains", // href: "/dashboard/trains", // icon: , // }, // { // 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: "Containers", // href: "/dashboard/containers", // icon: , // }, // { // label: "Cargoes", // href: "/dashboard/cargoes", // icon: , // }, ], }, { title: "Warehouse Management", items: [ { label: "Warehouse dashboard", href: "/dashboard/warehouses", icon: , }, { label: "Warehouses", href: "/dashboard/warehouses/list", icon: , }, title: "Warehouse Management", items: [ { label: "Warehouse Dashboard", href: "/dashboard/warehouse-dashboard", icon: , }, { label: "Warehouses", href: "/dashboard/warehouses", icon: , }, { label: "Inventory", href: "/dashboard/warehouse-inventory", icon: , }, { label: "Arrival Queue", href: "/dashboard/arrival-queue", 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: "Inventory Inquiry", href: "/dashboard/inventory-inquiry", icon: , }, { label: "Allocation & Fees", href: "/dashboard/warehouse-rules", icon: , }, { label: "Fee Invoices", href: "/dashboard/warehouse-fee-invoices", icon: , }, ], }, { title: "Administration", items: [ { label: "User management", href: "/dashboard/user-management", icon: , permission: FREIGHT_PERMS.admin, children: [ { label: "Users", href: "/dashboard/user-management/users", }, { label: "Employees", href: "/dashboard/user-management/employees", }, { label: "Position Types", href: "/dashboard/user-management/position-types", }, { label: "Permissions", href: "/dashboard/user-management/permissions", }, { label: "Roles", href: "/dashboard/user-management/roles", }, ], }, { 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 ( } /> }> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> {/* iframe-based user management module */} } /> {/* Legacy embedded user management routes */} } /> } /> } /> {/* } /> */} } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> ); }; export default App;