Files
mrp/client/src/main.tsx

155 lines
7.5 KiB
TypeScript
Raw Normal View History

2026-03-14 14:44:40 -05:00
import { QueryClient, QueryClientProvider } from "@tanstack/react-query";
import React from "react";
import ReactDOM from "react-dom/client";
import { createBrowserRouter, Navigate, RouterProvider } from "react-router-dom";
import { permissions } from "@mrp/shared";
import { AppShell } from "./components/AppShell";
import { ProtectedRoute } from "./components/ProtectedRoute";
import { AuthProvider } from "./auth/AuthProvider";
import { DashboardPage } from "./modules/dashboard/DashboardPage";
import { LoginPage } from "./modules/login/LoginPage";
import { CompanySettingsPage } from "./modules/settings/CompanySettingsPage";
2026-03-14 16:08:29 -05:00
import { CrmDetailPage } from "./modules/crm/CrmDetailPage";
import { CrmFormPage } from "./modules/crm/CrmFormPage";
2026-03-14 14:44:40 -05:00
import { CustomersPage } from "./modules/crm/CustomersPage";
import { VendorsPage } from "./modules/crm/VendorsPage";
import { GanttPage } from "./modules/gantt/GanttPage";
2026-03-14 21:10:35 -05:00
import { InventoryDetailPage } from "./modules/inventory/InventoryDetailPage";
import { InventoryFormPage } from "./modules/inventory/InventoryFormPage";
import { InventoryItemsPage } from "./modules/inventory/InventoryItemsPage";
2026-03-15 00:29:41 -05:00
import { PurchaseDetailPage } from "./modules/purchasing/PurchaseDetailPage";
import { PurchaseFormPage } from "./modules/purchasing/PurchaseFormPage";
import { PurchaseListPage } from "./modules/purchasing/PurchaseListPage";
2026-03-14 21:23:22 -05:00
import { WarehouseDetailPage } from "./modules/inventory/WarehouseDetailPage";
import { WarehouseFormPage } from "./modules/inventory/WarehouseFormPage";
import { WarehousesPage } from "./modules/inventory/WarehousesPage";
2026-03-14 23:03:17 -05:00
import { SalesDetailPage } from "./modules/sales/SalesDetailPage";
import { SalesFormPage } from "./modules/sales/SalesFormPage";
import { SalesListPage } from "./modules/sales/SalesListPage";
2026-03-14 23:48:27 -05:00
import { ShipmentDetailPage } from "./modules/shipping/ShipmentDetailPage";
import { ShipmentFormPage } from "./modules/shipping/ShipmentFormPage";
import { ShipmentListPage } from "./modules/shipping/ShipmentListPage";
2026-03-14 14:44:40 -05:00
import { ThemeProvider } from "./theme/ThemeProvider";
import "./index.css";
const queryClient = new QueryClient();
const router = createBrowserRouter([
{ path: "/login", element: <LoginPage /> },
{
element: <ProtectedRoute />,
children: [
{
element: <AppShell />,
children: [
{ path: "/", element: <DashboardPage /> },
{
element: <ProtectedRoute requiredPermissions={[permissions.companyRead]} />,
children: [{ path: "/settings/company", element: <CompanySettingsPage /> }],
},
{
element: <ProtectedRoute requiredPermissions={[permissions.crmRead]} />,
children: [
{ path: "/crm/customers", element: <CustomersPage /> },
2026-03-14 16:08:29 -05:00
{ path: "/crm/customers/:customerId", element: <CrmDetailPage entity="customer" /> },
2026-03-14 14:44:40 -05:00
{ path: "/crm/vendors", element: <VendorsPage /> },
2026-03-14 16:08:29 -05:00
{ path: "/crm/vendors/:vendorId", element: <CrmDetailPage entity="vendor" /> },
],
},
2026-03-14 21:10:35 -05:00
{
element: <ProtectedRoute requiredPermissions={[permissions.inventoryRead]} />,
children: [
{ path: "/inventory/items", element: <InventoryItemsPage /> },
{ path: "/inventory/items/:itemId", element: <InventoryDetailPage /> },
2026-03-14 21:23:22 -05:00
{ path: "/inventory/warehouses", element: <WarehousesPage /> },
{ path: "/inventory/warehouses/:warehouseId", element: <WarehouseDetailPage /> },
2026-03-14 21:10:35 -05:00
],
},
2026-03-15 00:29:41 -05:00
{
element: <ProtectedRoute requiredPermissions={["purchasing.read"]} />,
children: [
2026-03-15 00:41:01 -05:00
{ path: "/purchasing/orders", element: <PurchaseListPage /> },
2026-03-15 00:29:41 -05:00
{ path: "/purchasing/orders/:orderId", element: <PurchaseDetailPage /> },
],
},
2026-03-14 23:03:17 -05:00
{
element: <ProtectedRoute requiredPermissions={[permissions.salesRead]} />,
children: [
{ path: "/sales/quotes", element: <SalesListPage entity="quote" /> },
{ path: "/sales/quotes/:quoteId", element: <SalesDetailPage entity="quote" /> },
{ path: "/sales/orders", element: <SalesListPage entity="order" /> },
{ path: "/sales/orders/:orderId", element: <SalesDetailPage entity="order" /> },
],
},
2026-03-14 23:48:27 -05:00
{
element: <ProtectedRoute requiredPermissions={[permissions.shippingRead]} />,
children: [
{ path: "/shipping/shipments", element: <ShipmentListPage /> },
{ path: "/shipping/shipments/:shipmentId", element: <ShipmentDetailPage /> },
],
},
2026-03-14 16:08:29 -05:00
{
element: <ProtectedRoute requiredPermissions={[permissions.crmWrite]} />,
children: [
{ path: "/crm/customers/new", element: <CrmFormPage entity="customer" mode="create" /> },
{ path: "/crm/customers/:customerId/edit", element: <CrmFormPage entity="customer" mode="edit" /> },
{ path: "/crm/vendors/new", element: <CrmFormPage entity="vendor" mode="create" /> },
{ path: "/crm/vendors/:vendorId/edit", element: <CrmFormPage entity="vendor" mode="edit" /> },
2026-03-14 14:44:40 -05:00
],
},
2026-03-15 00:29:41 -05:00
{
element: <ProtectedRoute requiredPermissions={["purchasing.write"]} />,
children: [
{ path: "/purchasing/orders/new", element: <PurchaseFormPage mode="create" /> },
{ path: "/purchasing/orders/:orderId/edit", element: <PurchaseFormPage mode="edit" /> },
],
},
2026-03-14 23:03:17 -05:00
{
element: <ProtectedRoute requiredPermissions={[permissions.salesWrite]} />,
children: [
{ path: "/sales/quotes/new", element: <SalesFormPage entity="quote" mode="create" /> },
{ path: "/sales/quotes/:quoteId/edit", element: <SalesFormPage entity="quote" mode="edit" /> },
{ path: "/sales/orders/new", element: <SalesFormPage entity="order" mode="create" /> },
{ path: "/sales/orders/:orderId/edit", element: <SalesFormPage entity="order" mode="edit" /> },
],
},
2026-03-14 23:48:27 -05:00
{
element: <ProtectedRoute requiredPermissions={[permissions.shippingWrite]} />,
children: [
{ path: "/shipping/shipments/new", element: <ShipmentFormPage mode="create" /> },
{ path: "/shipping/shipments/:shipmentId/edit", element: <ShipmentFormPage mode="edit" /> },
],
},
2026-03-14 21:10:35 -05:00
{
element: <ProtectedRoute requiredPermissions={[permissions.inventoryWrite]} />,
children: [
{ path: "/inventory/items/new", element: <InventoryFormPage mode="create" /> },
{ path: "/inventory/items/:itemId/edit", element: <InventoryFormPage mode="edit" /> },
2026-03-14 21:23:22 -05:00
{ path: "/inventory/warehouses/new", element: <WarehouseFormPage mode="create" /> },
{ path: "/inventory/warehouses/:warehouseId/edit", element: <WarehouseFormPage mode="edit" /> },
2026-03-14 21:10:35 -05:00
],
},
2026-03-14 14:44:40 -05:00
{
element: <ProtectedRoute requiredPermissions={[permissions.ganttRead]} />,
children: [{ path: "/planning/gantt", element: <GanttPage /> }],
},
],
},
],
},
{ path: "*", element: <Navigate to="/" replace /> },
]);
ReactDOM.createRoot(document.getElementById("root")!).render(
<React.StrictMode>
<ThemeProvider>
<QueryClientProvider client={queryClient}>
<AuthProvider>
<RouterProvider router={router} />
</AuthProvider>
</QueryClientProvider>
</ThemeProvider>
</React.StrictMode>
);