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: ,
labelKey: "nav.settings.qcCategory",
path: "/settings/qcCategory",
+ requiredAbility: [AUTH.VIEW_USER, AUTH.ADMIN],
},
{
id: "nav.settings.qcItemAll",
icon: ,
labelKey: "nav.settings.qcItemAll",
path: "/settings/qcItemAll",
+ requiredAbility: [AUTH.VIEW_USER, AUTH.ADMIN],
},
{
id: "nav.settings.shopAndTruck",
icon: ,
labelKey: "nav.settings.shopAndTruck",
path: "/settings/shop/board",
+ requiredAbility: [AUTH.TRUCK_LANE, AUTH.ADMIN],
},
{
id: "nav.settings.deliveryOrderFloor",
icon: ,
labelKey: "nav.settings.deliveryOrderFloor",
path: "/settings/deliveryOrderFloor",
+ requiredAbility: [AUTH.VIEW_USER, AUTH.ADMIN],
},
{
id: "nav.settings.demandForecast",
icon: ,
labelKey: "nav.settings.demandForecast",
path: "/settings/rss",
+ requiredAbility: [AUTH.VIEW_USER, AUTH.ADMIN],
},
{
id: "nav.settings.bomWeighting",
icon: ,
labelKey: "nav.settings.bomWeighting",
path: "/settings/bomWeighting",
+ requiredAbility: [AUTH.VIEW_USER, AUTH.ADMIN],
},
{
id: "nav.settings.masterDataIssues",
@@ -410,24 +423,28 @@ const NavigationContent: React.FC = () => {
icon: ,
labelKey: "nav.settings.qrCodeHandle",
path: "/settings/qrCodeHandle",
+ requiredAbility: [AUTH.VIEW_USER, AUTH.ADMIN],
},
{
id: "nav.settings.importTesting",
icon: ,
labelKey: "nav.settings.importTesting",
path: "/settings/m18ImportTesting",
+ requiredAbility: [AUTH.VIEW_USER, AUTH.ADMIN],
},
{
id: "nav.settings.importExcel",
icon: ,
labelKey: "nav.settings.importExcel",
path: "/settings/importExcel",
+ requiredAbility: [AUTH.VIEW_USER, AUTH.ADMIN],
},
{
id: "nav.settings.importBom",
icon: ,
labelKey: "nav.settings.importBom",
path: "/settings/importBom",
+ requiredAbility: [AUTH.VIEW_USER, AUTH.ADMIN],
},
],
},