From d908f2378c88c68f5068c29a99d528d5f68be1b7 Mon Sep 17 00:00:00 2001 From: "PC-20260115JRSN\\Administrator" Date: Tue, 29 Sep 2026 22:24:09 +0800 Subject: [PATCH] added access right LANE for car line --- src/app/(main)/settings/shop/layout.tsx | 27 +++++++++++++++++++ src/authorities.ts | 2 ++ .../NavigationContent/NavigationContent.tsx | 19 ++++++++++++- 3 files changed, 47 insertions(+), 1 deletion(-) create mode 100644 src/app/(main)/settings/shop/layout.tsx diff --git a/src/app/(main)/settings/shop/layout.tsx b/src/app/(main)/settings/shop/layout.tsx new file mode 100644 index 00000000..357f7952 --- /dev/null +++ b/src/app/(main)/settings/shop/layout.tsx @@ -0,0 +1,27 @@ +import { I18nProvider } from "@/i18n"; +import { authOptions } from "@/config/authConfig"; +import { AUTH, hasAbility } from "@/authorities"; +import { getServerSession } from "next-auth"; +import { redirect } from "next/navigation"; + +/** Route board and shop/truck lane pages: ADMIN or 車線 (TRUCK_LANE). */ +export default async function ShopSettingsLayout({ + children, +}: { + children: React.ReactNode; +}) { + const session = await getServerSession(authOptions); + const abilities = session?.user?.abilities ?? []; + const canAccess = + hasAbility(abilities, AUTH.TRUCK_LANE) || hasAbility(abilities, AUTH.ADMIN); + + if (!canAccess) { + redirect("/dashboard"); + } + + return ( + + {children} + + ); +} diff --git a/src/authorities.ts b/src/authorities.ts index ad4aeb9e..12747b66 100644 --- a/src/authorities.ts +++ b/src/authorities.ts @@ -27,6 +27,8 @@ export const AUTH = { REPORT_MGMT: "REPORT_MGMT", /** FP-MTMS Version Checklist | Functions Ref. No. 67 | v1.0.0 | 2026-08-13 — Manual M18 sync page (/m18Syn): ADMIN or this ability */ M18_SYNC: "M18_SYNC", + /** Route board (/settings/shop/board): ADMIN or this ability (DB name: 車線) */ + TRUCK_LANE: "TRUCK_LANE", } as const; /** diff --git a/src/components/NavigationContent/NavigationContent.tsx b/src/components/NavigationContent/NavigationContent.tsx index 957cb95b..05916740 100644 --- a/src/components/NavigationContent/NavigationContent.tsx +++ b/src/components/NavigationContent/NavigationContent.tsx @@ -303,7 +303,7 @@ const NavigationContent: React.FC = () => { icon: , labelKey: "nav.settings", path: "", - requiredAbility: [AUTH.VIEW_USER, AUTH.ADMIN], + requiredAbility: [AUTH.VIEW_USER, AUTH.ADMIN, AUTH.TRUCK_LANE], children: [ { id: "nav.settings.user", @@ -325,78 +325,91 @@ const NavigationContent: React.FC = () => { icon: , labelKey: "nav.settings.items", path: "/settings/items", + requiredAbility: [AUTH.VIEW_USER, AUTH.ADMIN], }, { id: "nav.settings.itemDefaultShelfLife", icon: , labelKey: "nav.settings.itemDefaultShelfLife", path: "/settings/itemDefaultShelfLife", + requiredAbility: [AUTH.VIEW_USER, AUTH.ADMIN], }, { id: "nav.settings.equipment", icon: , labelKey: "nav.settings.equipment", path: "/settings/equipment", + requiredAbility: [AUTH.VIEW_USER, AUTH.ADMIN], }, { id: "nav.settings.warehouse", icon: , labelKey: "nav.settings.warehouse", path: "/settings/warehouse", + requiredAbility: [AUTH.VIEW_USER, AUTH.ADMIN], }, { id: "nav.settings.printer", icon: , labelKey: "nav.settings.printer", path: "/settings/printer", + requiredAbility: [AUTH.VIEW_USER, AUTH.ADMIN], }, { id: "nav.settings.priceInquiry", icon: , labelKey: "nav.settings.priceInquiry", path: "/settings/itemPrice", + requiredAbility: [AUTH.VIEW_USER, AUTH.ADMIN], }, { id: "nav.settings.qcItem", icon: , labelKey: "nav.settings.qcItem", path: "/settings/qcItem", + requiredAbility: [AUTH.VIEW_USER, AUTH.ADMIN], }, { id: "nav.settings.qcCategory", icon: