From c30a48c4b85d633c3a60eaa4599de644cbed230e Mon Sep 17 00:00:00 2001 From: Blake Matthes Date: Thu, 6 Mar 2025 19:34:10 -0600 Subject: [PATCH] feat(frontend): added in checks for links inside the module --- .../src/components/layout/lst-sidebar.tsx | 7 +- .../layout/side-components/logistics.tsx | 30 +++++-- frontend/src/routeTree.gen.ts | 85 ++++++++++++++++++- frontend/src/utils/userAccess.ts | 27 +++--- 4 files changed, 126 insertions(+), 23 deletions(-) diff --git a/frontend/src/components/layout/lst-sidebar.tsx b/frontend/src/components/layout/lst-sidebar.tsx index 4d2a16f..a60e0c0 100644 --- a/frontend/src/components/layout/lst-sidebar.tsx +++ b/frontend/src/components/layout/lst-sidebar.tsx @@ -20,7 +20,12 @@ export function AppSidebar() {
{moduleActive("production") && } - {moduleActive("logistics") && hasAccess(user, "logistics", modules) && } + {moduleActive("logistics") && ( + n.name === "logistics")[0].module_id as string} + /> + )} {moduleActive("forklift") && hasAccess(user, "forklift", modules) && } {moduleActive("eom") && hasAccess(user, "eom", modules) && } {moduleActive("quality") && hasAccess(user, "quality", modules) && } diff --git a/frontend/src/components/layout/side-components/logistics.tsx b/frontend/src/components/layout/side-components/logistics.tsx index 6a1bb5c..0cdfd59 100644 --- a/frontend/src/components/layout/side-components/logistics.tsx +++ b/frontend/src/components/layout/side-components/logistics.tsx @@ -7,35 +7,45 @@ import { SidebarMenuButton, SidebarMenuItem, } from "../../ui/sidebar"; - +import {hasPageAccess} from "@/utils/userAccess"; +import {User} from "@/types/users"; +// this will need to be moved to a links section the db to make it more easy to remove and add const items = [ { title: "Silo Adjustments", url: "#", icon: Cylinder, role: ["technician", "supervisor", "manager", "admin", "systemAdmin"], + module: "logistics", + active: true, }, { title: "Bulk orders", url: "#", icon: Truck, role: ["technician", "supervisor", "manager", "admin", "systemAdmin"], + module: "logistics", + active: true, }, { title: "Forecast", url: "#", icon: Truck, role: ["technician", "supervisor", "manager", "admin", "systemAdmin"], + module: "logistics", + active: true, }, { title: "Ocme cycle counts", url: "#", icon: Package, role: ["technician", "supervisor", "manager", "admin", "systemAdmin"], + module: "logistics", + active: false, }, ]; -export function LogisticsSideBar() { +export function LogisticsSideBar({user, moduleID}: {user: User | null; moduleID: string}) { return ( Logistics @@ -43,12 +53,16 @@ export function LogisticsSideBar() { {items.map((item) => ( - - - - {item.title} - - + <> + {hasPageAccess(user, item.role, moduleID) && item.active && ( + + + + {item.title} + + + )} + ))} diff --git a/frontend/src/routeTree.gen.ts b/frontend/src/routeTree.gen.ts index 999dade..247ccd6 100644 --- a/frontend/src/routeTree.gen.ts +++ b/frontend/src/routeTree.gen.ts @@ -23,7 +23,10 @@ import { Route as EomEomImport } from './routes/_eom/eom' import { Route as AuthProfileImport } from './routes/_auth/profile' import { Route as AdminSettingsImport } from './routes/_admin/settings' import { Route as AdminModulesImport } from './routes/_admin/modules' +import { Route as logisticsMaterialHelperIndexImport } from './routes/(logistics)/materialHelper/index' import { Route as EomArticleAvImport } from './routes/_eom/article/$av' +import { Route as logisticsMaterialHelperSiloLinkIndexImport } from './routes/(logistics)/materialHelper/siloLink/index' +import { Route as logisticsMaterialHelperConsumptionIndexImport } from './routes/(logistics)/materialHelper/consumption/index' // Create/Update Routes @@ -96,12 +99,33 @@ const AdminModulesRoute = AdminModulesImport.update({ getParentRoute: () => AdminRoute, } as any) +const logisticsMaterialHelperIndexRoute = + logisticsMaterialHelperIndexImport.update({ + id: '/(logistics)/materialHelper/', + path: '/materialHelper/', + getParentRoute: () => rootRoute, + } as any) + const EomArticleAvRoute = EomArticleAvImport.update({ id: '/article/$av', path: '/article/$av', getParentRoute: () => EomRoute, } as any) +const logisticsMaterialHelperSiloLinkIndexRoute = + logisticsMaterialHelperSiloLinkIndexImport.update({ + id: '/(logistics)/materialHelper/siloLink/', + path: '/materialHelper/siloLink/', + getParentRoute: () => rootRoute, + } as any) + +const logisticsMaterialHelperConsumptionIndexRoute = + logisticsMaterialHelperConsumptionIndexImport.update({ + id: '/(logistics)/materialHelper/consumption/', + path: '/materialHelper/consumption/', + getParentRoute: () => rootRoute, + } as any) + // Populate the FileRoutesByPath interface declare module '@tanstack/react-router' { @@ -197,6 +221,27 @@ declare module '@tanstack/react-router' { preLoaderRoute: typeof EomArticleAvImport parentRoute: typeof EomImport } + '/(logistics)/materialHelper/': { + id: '/(logistics)/materialHelper/' + path: '/materialHelper' + fullPath: '/materialHelper' + preLoaderRoute: typeof logisticsMaterialHelperIndexImport + parentRoute: typeof rootRoute + } + '/(logistics)/materialHelper/consumption/': { + id: '/(logistics)/materialHelper/consumption/' + path: '/materialHelper/consumption' + fullPath: '/materialHelper/consumption' + preLoaderRoute: typeof logisticsMaterialHelperConsumptionIndexImport + parentRoute: typeof rootRoute + } + '/(logistics)/materialHelper/siloLink/': { + id: '/(logistics)/materialHelper/siloLink/' + path: '/materialHelper/siloLink' + fullPath: '/materialHelper/siloLink' + preLoaderRoute: typeof logisticsMaterialHelperSiloLinkIndexImport + parentRoute: typeof rootRoute + } } } @@ -248,6 +293,9 @@ export interface FileRoutesByFullPath { '/ocp/lots': typeof OcpLotsRoute '/ocp': typeof OcpIndexRoute '/article/$av': typeof EomArticleAvRoute + '/materialHelper': typeof logisticsMaterialHelperIndexRoute + '/materialHelper/consumption': typeof logisticsMaterialHelperConsumptionIndexRoute + '/materialHelper/siloLink': typeof logisticsMaterialHelperSiloLinkIndexRoute } export interface FileRoutesByTo { @@ -262,6 +310,9 @@ export interface FileRoutesByTo { '/ocp/lots': typeof OcpLotsRoute '/ocp': typeof OcpIndexRoute '/article/$av': typeof EomArticleAvRoute + '/materialHelper': typeof logisticsMaterialHelperIndexRoute + '/materialHelper/consumption': typeof logisticsMaterialHelperConsumptionIndexRoute + '/materialHelper/siloLink': typeof logisticsMaterialHelperSiloLinkIndexRoute } export interface FileRoutesById { @@ -279,6 +330,9 @@ export interface FileRoutesById { '/ocp/lots': typeof OcpLotsRoute '/ocp/': typeof OcpIndexRoute '/_eom/article/$av': typeof EomArticleAvRoute + '/(logistics)/materialHelper/': typeof logisticsMaterialHelperIndexRoute + '/(logistics)/materialHelper/consumption/': typeof logisticsMaterialHelperConsumptionIndexRoute + '/(logistics)/materialHelper/siloLink/': typeof logisticsMaterialHelperSiloLinkIndexRoute } export interface FileRouteTypes { @@ -295,6 +349,9 @@ export interface FileRouteTypes { | '/ocp/lots' | '/ocp' | '/article/$av' + | '/materialHelper' + | '/materialHelper/consumption' + | '/materialHelper/siloLink' fileRoutesByTo: FileRoutesByTo to: | '/' @@ -308,6 +365,9 @@ export interface FileRouteTypes { | '/ocp/lots' | '/ocp' | '/article/$av' + | '/materialHelper' + | '/materialHelper/consumption' + | '/materialHelper/siloLink' id: | '__root__' | '/' @@ -323,6 +383,9 @@ export interface FileRouteTypes { | '/ocp/lots' | '/ocp/' | '/_eom/article/$av' + | '/(logistics)/materialHelper/' + | '/(logistics)/materialHelper/consumption/' + | '/(logistics)/materialHelper/siloLink/' fileRoutesById: FileRoutesById } @@ -335,6 +398,9 @@ export interface RootRouteChildren { LoginRoute: typeof LoginRoute OcpLotsRoute: typeof OcpLotsRoute OcpIndexRoute: typeof OcpIndexRoute + logisticsMaterialHelperIndexRoute: typeof logisticsMaterialHelperIndexRoute + logisticsMaterialHelperConsumptionIndexRoute: typeof logisticsMaterialHelperConsumptionIndexRoute + logisticsMaterialHelperSiloLinkIndexRoute: typeof logisticsMaterialHelperSiloLinkIndexRoute } const rootRouteChildren: RootRouteChildren = { @@ -346,6 +412,11 @@ const rootRouteChildren: RootRouteChildren = { LoginRoute: LoginRoute, OcpLotsRoute: OcpLotsRoute, OcpIndexRoute: OcpIndexRoute, + logisticsMaterialHelperIndexRoute: logisticsMaterialHelperIndexRoute, + logisticsMaterialHelperConsumptionIndexRoute: + logisticsMaterialHelperConsumptionIndexRoute, + logisticsMaterialHelperSiloLinkIndexRoute: + logisticsMaterialHelperSiloLinkIndexRoute, } export const routeTree = rootRoute @@ -365,7 +436,10 @@ export const routeTree = rootRoute "/about", "/login", "/ocp/lots", - "/ocp/" + "/ocp/", + "/(logistics)/materialHelper/", + "/(logistics)/materialHelper/consumption/", + "/(logistics)/materialHelper/siloLink/" ] }, "/": { @@ -422,6 +496,15 @@ export const routeTree = rootRoute "/_eom/article/$av": { "filePath": "_eom/article/$av.tsx", "parent": "/_eom" + }, + "/(logistics)/materialHelper/": { + "filePath": "(logistics)/materialHelper/index.tsx" + }, + "/(logistics)/materialHelper/consumption/": { + "filePath": "(logistics)/materialHelper/consumption/index.tsx" + }, + "/(logistics)/materialHelper/siloLink/": { + "filePath": "(logistics)/materialHelper/siloLink/index.tsx" } } } diff --git a/frontend/src/utils/userAccess.ts b/frontend/src/utils/userAccess.ts index 228e0ed..98cb8cd 100644 --- a/frontend/src/utils/userAccess.ts +++ b/frontend/src/utils/userAccess.ts @@ -1,17 +1,5 @@ import {Modules} from "@/types/modules"; - -type User = { - user_id: string; - email: string; - username: string; - roles: Roles[]; - role: string; -}; - -interface Roles { - role: string; - module_id: string; -} +import {User} from "@/types/users"; // user will need access to the module. // users role will determine there visual access @@ -23,3 +11,16 @@ export function hasAccess(user: User | null, moduleName: string | null, modules: return user?.roles.find((role) => role.module_id === filteredModule[0].module_id) ? true : false; } + +export function hasPageAccess(user: User | null, role: any, module_id: string): boolean { + if (!user) return false; + + // get only the module in the user profile + const userRole = user?.roles.filter((role) => role.module_id === module_id); + + if (role.includes(userRole[0].role)) { + return true; + } + + return false; +}