Просмотр исходного кода

added access right LANE for car line

production
PC-20260115JRSN\Administrator 7 часов назад
Родитель
Сommit
d908f2378c
3 измененных файлов: 47 добавлений и 1 удалений
  1. +27
    -0
      src/app/(main)/settings/shop/layout.tsx
  2. +2
    -0
      src/authorities.ts
  3. +18
    -1
      src/components/NavigationContent/NavigationContent.tsx

+ 27
- 0
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 (
<I18nProvider namespaces={["shop", "navigation", "common"]}>
{children}
</I18nProvider>
);
}

+ 2
- 0
src/authorities.ts Просмотреть файл

@@ -27,6 +27,8 @@ export const AUTH = {
REPORT_MGMT: "REPORT_MGMT", 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 */ /** 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", M18_SYNC: "M18_SYNC",
/** Route board (/settings/shop/board): ADMIN or this ability (DB name: 車線) */
TRUCK_LANE: "TRUCK_LANE",
} as const; } as const;


/** /**


+ 18
- 1
src/components/NavigationContent/NavigationContent.tsx Просмотреть файл

@@ -303,7 +303,7 @@ const NavigationContent: React.FC = () => {
icon: <Settings />, icon: <Settings />,
labelKey: "nav.settings", labelKey: "nav.settings",
path: "", path: "",
requiredAbility: [AUTH.VIEW_USER, AUTH.ADMIN],
requiredAbility: [AUTH.VIEW_USER, AUTH.ADMIN, AUTH.TRUCK_LANE],
children: [ children: [
{ {
id: "nav.settings.user", id: "nav.settings.user",
@@ -325,78 +325,91 @@ const NavigationContent: React.FC = () => {
icon: <Category />, icon: <Category />,
labelKey: "nav.settings.items", labelKey: "nav.settings.items",
path: "/settings/items", path: "/settings/items",
requiredAbility: [AUTH.VIEW_USER, AUTH.ADMIN],
}, },
{ {
id: "nav.settings.itemDefaultShelfLife", id: "nav.settings.itemDefaultShelfLife",
icon: <EventAvailable />, icon: <EventAvailable />,
labelKey: "nav.settings.itemDefaultShelfLife", labelKey: "nav.settings.itemDefaultShelfLife",
path: "/settings/itemDefaultShelfLife", path: "/settings/itemDefaultShelfLife",
requiredAbility: [AUTH.VIEW_USER, AUTH.ADMIN],
}, },
{ {
id: "nav.settings.equipment", id: "nav.settings.equipment",
icon: <Build />, icon: <Build />,
labelKey: "nav.settings.equipment", labelKey: "nav.settings.equipment",
path: "/settings/equipment", path: "/settings/equipment",
requiredAbility: [AUTH.VIEW_USER, AUTH.ADMIN],
}, },
{ {
id: "nav.settings.warehouse", id: "nav.settings.warehouse",
icon: <Warehouse />, icon: <Warehouse />,
labelKey: "nav.settings.warehouse", labelKey: "nav.settings.warehouse",
path: "/settings/warehouse", path: "/settings/warehouse",
requiredAbility: [AUTH.VIEW_USER, AUTH.ADMIN],
}, },
{ {
id: "nav.settings.printer", id: "nav.settings.printer",
icon: <Print />, icon: <Print />,
labelKey: "nav.settings.printer", labelKey: "nav.settings.printer",
path: "/settings/printer", path: "/settings/printer",
requiredAbility: [AUTH.VIEW_USER, AUTH.ADMIN],
}, },
{ {
id: "nav.settings.priceInquiry", id: "nav.settings.priceInquiry",
icon: <Assessment />, icon: <Assessment />,
labelKey: "nav.settings.priceInquiry", labelKey: "nav.settings.priceInquiry",
path: "/settings/itemPrice", path: "/settings/itemPrice",
requiredAbility: [AUTH.VIEW_USER, AUTH.ADMIN],
}, },
{ {
id: "nav.settings.qcItem", id: "nav.settings.qcItem",
icon: <VerifiedUser />, icon: <VerifiedUser />,
labelKey: "nav.settings.qcItem", labelKey: "nav.settings.qcItem",
path: "/settings/qcItem", path: "/settings/qcItem",
requiredAbility: [AUTH.VIEW_USER, AUTH.ADMIN],
}, },
{ {
id: "nav.settings.qcCategory", id: "nav.settings.qcCategory",
icon: <Label />, icon: <Label />,
labelKey: "nav.settings.qcCategory", labelKey: "nav.settings.qcCategory",
path: "/settings/qcCategory", path: "/settings/qcCategory",
requiredAbility: [AUTH.VIEW_USER, AUTH.ADMIN],
}, },
{ {
id: "nav.settings.qcItemAll", id: "nav.settings.qcItemAll",
icon: <Checklist />, icon: <Checklist />,
labelKey: "nav.settings.qcItemAll", labelKey: "nav.settings.qcItemAll",
path: "/settings/qcItemAll", path: "/settings/qcItemAll",
requiredAbility: [AUTH.VIEW_USER, AUTH.ADMIN],
}, },
{ {
id: "nav.settings.shopAndTruck", id: "nav.settings.shopAndTruck",
icon: <Storefront />, icon: <Storefront />,
labelKey: "nav.settings.shopAndTruck", labelKey: "nav.settings.shopAndTruck",
path: "/settings/shop/board", path: "/settings/shop/board",
requiredAbility: [AUTH.TRUCK_LANE, AUTH.ADMIN],
}, },
{ {
id: "nav.settings.deliveryOrderFloor", id: "nav.settings.deliveryOrderFloor",
icon: <Layers />, icon: <Layers />,
labelKey: "nav.settings.deliveryOrderFloor", labelKey: "nav.settings.deliveryOrderFloor",
path: "/settings/deliveryOrderFloor", path: "/settings/deliveryOrderFloor",
requiredAbility: [AUTH.VIEW_USER, AUTH.ADMIN],
}, },
{ {
id: "nav.settings.demandForecast", id: "nav.settings.demandForecast",
icon: <TrendingUp />, icon: <TrendingUp />,
labelKey: "nav.settings.demandForecast", labelKey: "nav.settings.demandForecast",
path: "/settings/rss", path: "/settings/rss",
requiredAbility: [AUTH.VIEW_USER, AUTH.ADMIN],
}, },
{ {
id: "nav.settings.bomWeighting", id: "nav.settings.bomWeighting",
icon: <ViewModule />, icon: <ViewModule />,
labelKey: "nav.settings.bomWeighting", labelKey: "nav.settings.bomWeighting",
path: "/settings/bomWeighting", path: "/settings/bomWeighting",
requiredAbility: [AUTH.VIEW_USER, AUTH.ADMIN],
}, },
{ {
id: "nav.settings.masterDataIssues", id: "nav.settings.masterDataIssues",
@@ -410,24 +423,28 @@ const NavigationContent: React.FC = () => {
icon: <QrCodeIcon />, icon: <QrCodeIcon />,
labelKey: "nav.settings.qrCodeHandle", labelKey: "nav.settings.qrCodeHandle",
path: "/settings/qrCodeHandle", path: "/settings/qrCodeHandle",
requiredAbility: [AUTH.VIEW_USER, AUTH.ADMIN],
}, },
{ {
id: "nav.settings.importTesting", id: "nav.settings.importTesting",
icon: <Science />, icon: <Science />,
labelKey: "nav.settings.importTesting", labelKey: "nav.settings.importTesting",
path: "/settings/m18ImportTesting", path: "/settings/m18ImportTesting",
requiredAbility: [AUTH.VIEW_USER, AUTH.ADMIN],
}, },
{ {
id: "nav.settings.importExcel", id: "nav.settings.importExcel",
icon: <UploadFile />, icon: <UploadFile />,
labelKey: "nav.settings.importExcel", labelKey: "nav.settings.importExcel",
path: "/settings/importExcel", path: "/settings/importExcel",
requiredAbility: [AUTH.VIEW_USER, AUTH.ADMIN],
}, },
{ {
id: "nav.settings.importBom", id: "nav.settings.importBom",
icon: <UploadFile />, icon: <UploadFile />,
labelKey: "nav.settings.importBom", labelKey: "nav.settings.importBom",
path: "/settings/importBom", path: "/settings/importBom",
requiredAbility: [AUTH.VIEW_USER, AUTH.ADMIN],
}, },
], ],
}, },


Загрузка…
Отмена
Сохранить