From 88f2cf07f59af061a94bc00539cfa07033c47560 Mon Sep 17 00:00:00 2001 From: Blake Matthes Date: Tue, 4 Mar 2025 16:43:03 -0600 Subject: [PATCH] feat(frontend): settings page added --- .../admin/settings/SettingsPage.tsx | 47 +++++++++++++++++++ .../src/components/layout/lst-sidebar.tsx | 2 +- .../layout/side-components/admin.tsx | 13 +++-- frontend/src/routeTree.gen.ts | 29 +++++++++++- frontend/src/routes/_admin/settings.tsx | 14 ++++++ 5 files changed, 100 insertions(+), 5 deletions(-) create mode 100644 frontend/src/components/admin/settings/SettingsPage.tsx create mode 100644 frontend/src/routes/_admin/settings.tsx diff --git a/frontend/src/components/admin/settings/SettingsPage.tsx b/frontend/src/components/admin/settings/SettingsPage.tsx new file mode 100644 index 0000000..306c547 --- /dev/null +++ b/frontend/src/components/admin/settings/SettingsPage.tsx @@ -0,0 +1,47 @@ +import {LstCard} from "@/components/extendedUI/LstCard"; +import {useSessionStore} from "@/lib/store/sessionStore"; +import {useModuleStore} from "@/lib/store/useModuleStore"; +import {useQuery} from "@tanstack/react-query"; +import {useRouter} from "@tanstack/react-router"; +import axios from "axios"; + +export default function SettingsPage() { + const token = localStorage.getItem("auth_token"); + const {user} = useSessionStore(); + const {modules} = useModuleStore(); + const router = useRouter(); + + const fetchSettings = async () => { + const {data} = await axios.get("/api/server/settings", {headers: {Authorization: `Bearer ${token}`}}); + return data.data; + }; + + const adminModule = modules.filter((n) => n.name === "admin"); + const userLevel = user?.roles.filter((r) => r.module_id === adminModule[0].module_id) || []; + + if (!adminModule[0].roles.includes(userLevel[0]?.role)) { + router.navigate({to: "/"}); + } + + const {data, isError, error, isLoading} = useQuery({ + queryKey: ["settings"], + queryFn: fetchSettings, + enabled: !!token, + refetchOnWindowFocus: true, + }); + + if (isLoading) { + return
Loading.....
; + } + if (isError) { + return
{JSON.stringify(error)}
; + } + + return ( +
+ {data.map((i) => { + return {i.name}; + })} +
+ ); +} diff --git a/frontend/src/components/layout/lst-sidebar.tsx b/frontend/src/components/layout/lst-sidebar.tsx index d924ffb..4d2a16f 100644 --- a/frontend/src/components/layout/lst-sidebar.tsx +++ b/frontend/src/components/layout/lst-sidebar.tsx @@ -22,7 +22,7 @@ export function AppSidebar() { {moduleActive("production") && } {moduleActive("logistics") && hasAccess(user, "logistics", modules) && } {moduleActive("forklift") && hasAccess(user, "forklift", modules) && } - {moduleActive("admin") && hasAccess(user, "eom", modules) && } + {moduleActive("eom") && hasAccess(user, "eom", modules) && } {moduleActive("quality") && hasAccess(user, "quality", modules) && } {moduleActive("admin") && hasAccess(user, "admin", modules) && } diff --git a/frontend/src/components/layout/side-components/admin.tsx b/frontend/src/components/layout/side-components/admin.tsx index c372710..a471ec7 100644 --- a/frontend/src/components/layout/side-components/admin.tsx +++ b/frontend/src/components/layout/side-components/admin.tsx @@ -29,7 +29,7 @@ const data = { items: [ { title: "Settings", - url: "#", + url: "/settings", icon: Settings, isActive: false, }, @@ -53,9 +53,16 @@ const data = { }, { title: "UCD", - url: "#", + url: "https://ucd.alpla.net:8443/", icon: Atom, isActive: false, + newWindow: true, + }, + { + title: "Lst Api", + url: "/api/docs", + icon: Webhook, + isActive: false, }, ], }, @@ -85,7 +92,7 @@ export function AdminSideBar() { {item.items.map((item) => ( - + {item.title} diff --git a/frontend/src/routeTree.gen.ts b/frontend/src/routeTree.gen.ts index 3bca86c..248e49d 100644 --- a/frontend/src/routeTree.gen.ts +++ b/frontend/src/routeTree.gen.ts @@ -19,6 +19,7 @@ import { Route as IndexImport } from './routes/index' import { Route as OcpIndexImport } from './routes/ocp/index' import { Route as OcpLotsImport } from './routes/ocp/lots' import { Route as AuthProfileImport } from './routes/_auth/profile' +import { Route as AdminSettingsImport } from './routes/_admin/settings' import { Route as AdminModulesImport } from './routes/_admin/modules' // Create/Update Routes @@ -69,6 +70,12 @@ const AuthProfileRoute = AuthProfileImport.update({ getParentRoute: () => AuthRoute, } as any) +const AdminSettingsRoute = AdminSettingsImport.update({ + id: '/settings', + path: '/settings', + getParentRoute: () => AdminRoute, +} as any) + const AdminModulesRoute = AdminModulesImport.update({ id: '/modules', path: '/modules', @@ -121,6 +128,13 @@ declare module '@tanstack/react-router' { preLoaderRoute: typeof AdminModulesImport parentRoute: typeof AdminImport } + '/_admin/settings': { + id: '/_admin/settings' + path: '/settings' + fullPath: '/settings' + preLoaderRoute: typeof AdminSettingsImport + parentRoute: typeof AdminImport + } '/_auth/profile': { id: '/_auth/profile' path: '/profile' @@ -149,10 +163,12 @@ declare module '@tanstack/react-router' { interface AdminRouteChildren { AdminModulesRoute: typeof AdminModulesRoute + AdminSettingsRoute: typeof AdminSettingsRoute } const AdminRouteChildren: AdminRouteChildren = { AdminModulesRoute: AdminModulesRoute, + AdminSettingsRoute: AdminSettingsRoute, } const AdminRouteWithChildren = AdminRoute._addFileChildren(AdminRouteChildren) @@ -173,6 +189,7 @@ export interface FileRoutesByFullPath { '/about': typeof AboutRoute '/login': typeof LoginRoute '/modules': typeof AdminModulesRoute + '/settings': typeof AdminSettingsRoute '/profile': typeof AuthProfileRoute '/ocp/lots': typeof OcpLotsRoute '/ocp': typeof OcpIndexRoute @@ -184,6 +201,7 @@ export interface FileRoutesByTo { '/about': typeof AboutRoute '/login': typeof LoginRoute '/modules': typeof AdminModulesRoute + '/settings': typeof AdminSettingsRoute '/profile': typeof AuthProfileRoute '/ocp/lots': typeof OcpLotsRoute '/ocp': typeof OcpIndexRoute @@ -197,6 +215,7 @@ export interface FileRoutesById { '/about': typeof AboutRoute '/login': typeof LoginRoute '/_admin/modules': typeof AdminModulesRoute + '/_admin/settings': typeof AdminSettingsRoute '/_auth/profile': typeof AuthProfileRoute '/ocp/lots': typeof OcpLotsRoute '/ocp/': typeof OcpIndexRoute @@ -210,6 +229,7 @@ export interface FileRouteTypes { | '/about' | '/login' | '/modules' + | '/settings' | '/profile' | '/ocp/lots' | '/ocp' @@ -220,6 +240,7 @@ export interface FileRouteTypes { | '/about' | '/login' | '/modules' + | '/settings' | '/profile' | '/ocp/lots' | '/ocp' @@ -231,6 +252,7 @@ export interface FileRouteTypes { | '/about' | '/login' | '/_admin/modules' + | '/_admin/settings' | '/_auth/profile' | '/ocp/lots' | '/ocp/' @@ -282,7 +304,8 @@ export const routeTree = rootRoute "/_admin": { "filePath": "_admin.tsx", "children": [ - "/_admin/modules" + "/_admin/modules", + "/_admin/settings" ] }, "/_auth": { @@ -301,6 +324,10 @@ export const routeTree = rootRoute "filePath": "_admin/modules.tsx", "parent": "/_admin" }, + "/_admin/settings": { + "filePath": "_admin/settings.tsx", + "parent": "/_admin" + }, "/_auth/profile": { "filePath": "_auth/profile.tsx", "parent": "/_auth" diff --git a/frontend/src/routes/_admin/settings.tsx b/frontend/src/routes/_admin/settings.tsx new file mode 100644 index 0000000..a3faaff --- /dev/null +++ b/frontend/src/routes/_admin/settings.tsx @@ -0,0 +1,14 @@ +import SettingsPage from "@/components/admin/settings/SettingsPage"; +import {createFileRoute} from "@tanstack/react-router"; + +export const Route = createFileRoute("/_admin/settings")({ + component: RouteComponent, +}); + +function RouteComponent() { + return ( +
+ +
+ ); +}