import { useSession } from "next-auth/react"; import Divider from "@mui/material/Divider"; import Box from "@mui/material/Box"; import React, { useEffect } from "react"; import List from "@mui/material/List"; import ListItemButton from "@mui/material/ListItemButton"; import ListItemText from "@mui/material/ListItemText"; import ListItemIcon from "@mui/material/ListItemIcon"; import WorkHistory from "@mui/icons-material/WorkHistory"; import Dashboard from "@mui/icons-material/Dashboard"; import SummarizeIcon from "@mui/icons-material/Summarize"; import PaymentsIcon from "@mui/icons-material/Payments"; import AccountTreeIcon from "@mui/icons-material/AccountTree"; import RequestQuote from "@mui/icons-material/RequestQuote"; import PeopleIcon from "@mui/icons-material/People"; import Task from "@mui/icons-material/Task"; import Assignment from "@mui/icons-material/Assignment"; import Settings from "@mui/icons-material/Settings"; import Analytics from "@mui/icons-material/Analytics"; import Payments from "@mui/icons-material/Payments"; import QrCodeIcon from "@mui/icons-material/QrCode"; import { useTranslation } from "react-i18next"; import Typography from "@mui/material/Typography"; import { usePathname } from "next/navigation"; import Link from "next/link"; import { NAVIGATION_CONTENT_WIDTH } from "@/config/uiConfig"; import Logo from "../Logo"; import BugReportIcon from "@mui/icons-material/BugReport"; import { VIEW_USER, MAINTAIN_USER, VIEW_GROUP, MAINTAIN_GROUP, // Add more authorities as needed, e.g.: TESTING, PROD, PACK, ADMIN, STOCK, Driver } from "../../authorities"; interface NavigationItem { icon: React.ReactNode; label: string; path: string; children?: NavigationItem[]; isHidden?: boolean | undefined; requiredAbility?: string | string[]; } const NavigationContent: React.FC = () => { const { data: session, status } = useSession(); const abilities = session?.user?.abilities ?? []; // Helper: check if user has required permission const hasAbility = (required?: string | string[]): boolean => { if (!required) return true; // no requirement → always show if (Array.isArray(required)) { return required.some(ability => abilities.includes(ability)); } return abilities.includes(required); }; const navigationItems: NavigationItem[] = [ { icon: , label: "Dashboard", path: "/dashboard", }, { icon: , label: "Store Management", path: "", children: [ { icon: , label: "Purchase Order", path: "/po", }, { icon: , label: "Pick Order", path: "/pickOrder", }, // { // icon: , // label: "Cons. Pick Order", // path: "", // }, // { // icon: , // label: "Delivery Pick Order", // path: "", // }, // { // icon: , // label: "Warehouse", // path: "", // }, // { // icon: , // label: "Location Transfer Order", // path: "", // }, { icon: , label: "View item In-out And inventory Ledger", path: "/inventory", }, { icon: , label: "Stock Take Management", path: "/stocktakemanagement", }, { icon: , label: "Stock Issue", path: "/stockIssue", }, //TODO: anna // { // icon: , // label: "Stock Issue", // path: "/stockIssue", // }, { icon: , label: "Put Away Scan", path: "/putAway", }, { icon: , label: "Finished Good Order", path: "/finishedGood", }, ], }, { icon: , label: "Delivery", path: "", //requiredAbility: VIEW_DO, children: [ { icon: , label: "Delivery Order", path: "/do", }, ], }, // { // icon: , // label: "Report", // path: "", // children: [ // { // icon: , // label: "report", // path: "", // }, // ], // }, // { // icon: , // label: "Recipe", // path: "", // children: [ // { // icon: , // label: "FG Recipe", // path: "", // }, // { // icon: , // label: "SFG Recipe", // path: "", // }, // { // icon: , // label: "Recipe", // path: "", // }, // ], // }, { icon: , label: "Scheduling", path: "", children: [ { icon: , label: "Demand Forecast", path: "/scheduling/rough", }, { icon: , label: "Detail Scheduling", path: "/scheduling/detailed", }, /* { icon: , label: "Production", path: "/production", }, */ ], }, { icon: , label: "Management Job Order", path: "", children: [ { icon: , label: "Search Job Order/ Create Job Order", path: "/jo", }, { icon: , label: "Job Order Pickexcution", path: "/jodetail", }, { icon: , label: "Job Order Production Process", path: "/productionProcess", }, { icon: , label: "Bag Usage", path: "/bag", }, ], }, { icon: , label: "PS", path: "/ps", requiredAbility: TESTING, isHidden: false, }, { icon: , label: "Printer Testing", path: "/testing", requiredAbility: TESTING, isHidden: false, }, { icon: , label: "Settings", path: "", requiredAbility: [VIEW_USER, VIEW_GROUP], children: [ { icon: , label: "User", path: "/settings/user", requiredAbility: VIEW_USER, }, { icon: , label: "User Group", path: "/settings/user", requiredAbility: VIEW_GROUP, }, // { // icon: , // label: "Material", // path: "/settings/material", // }, // { // icon: , // label: "By-product", // path: "/settings/byProduct", // }, { icon: , label: "Items", path: "/settings/items", }, { icon: , label: "ShopAndTruck", path: "/settings/shop", }, { icon: , label: "Demand Forecast Setting", path: "/settings/rss", }, //{ // icon: , // label: "Equipment Type", // path: "/settings/equipmentType", //}, { icon: , label: "Equipment", path: "/settings/equipment", }, { icon: , label: "Warehouse", path: "/settings/warehouse", }, { icon: , label: "Supplier", path: "/settings/user", }, { icon: , label: "Customer", path: "/settings/user", }, { icon: , label: "QC Check Item", path: "/settings/qcItem", }, { icon: , label: "QC Category", path: "/settings/qcCategory", }, { icon: , label: "QC Check Template", path: "/settings/user", }, { icon: , label: "QR Code Handle", path: "/settings/qrCodeHandle", }, // { // icon: , // label: "Mail", // path: "/settings/mail", // }, { icon: , label: "Import Testing", path: "/settings/m18ImportTesting", }, { icon: , label: "Import Excel", path: "/settings/importExcel", }, ], }, ]; const { t } = useTranslation("common"); const pathname = usePathname(); const [openItems, setOpenItems] = React.useState([]); const toggleItem = (label: string) => { setOpenItems((prevOpenItems) => prevOpenItems.includes(label) ? prevOpenItems.filter((item) => item !== label) : [...prevOpenItems, label], ); }; const renderNavigationItem = (item: NavigationItem) => { if (!hasAbility(item.requiredAbility)) { return null; } const isOpen = openItems.includes(item.label); const hasVisibleChildren = item.children?.some(child => hasAbility(child.requiredAbility)); return ( item.children && toggleItem(item.label)} > {item.icon} {item.children && isOpen && hasVisibleChildren && ( {item.children.map( (child) => !child.isHidden && renderNavigationItem(child), )} )} ); }; if (status === "loading") { return Loading...; } return ( {/* */} {navigationItems .filter(item => !item.isHidden) .map(renderNavigationItem) .filter(Boolean)} {/* {navigationItems.map(({ icon, label, path }, index) => { return ( {icon} ); })} */} ); }; export default NavigationContent;