import Divider from "@mui/material/Divider"; import Box from "@mui/material/Box"; import React 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 Staff from "@mui/icons-material/PeopleAlt"; import Company from "@mui/icons-material/Store"; import Department from "@mui/icons-material/Diversity3"; import Position from "@mui/icons-material/Paragliding"; import Salary from "@mui/icons-material/AttachMoney"; import Team from "@mui/icons-material/Paragliding"; import Holiday from "@mui/icons-material/CalendarMonth"; import { useTranslation } from "react-i18next"; import { usePathname } from "next/navigation"; import Link from "next/link"; import { NAVIGATION_CONTENT_WIDTH } from "@/config/uiConfig"; import Logo from "../Logo"; import GroupIcon from "@mui/icons-material/Group"; import BusinessIcon from "@mui/icons-material/Business"; import ViewWeekIcon from "@mui/icons-material/ViewWeek"; import ManageAccountsIcon from "@mui/icons-material/ManageAccounts"; import EmojiEventsIcon from "@mui/icons-material/EmojiEvents"; import { GENERATE_REPORTS, MAINTAIN_MASTERDATA, MAINTAIN_USER, VIEW_MASTERDATA, VIEW_USER, } from "@/middleware"; import { SessionWithAbilities } from "../AppBar/NavigationToggle"; import { authOptions } from "@/config/authConfig"; import { getServerSession } from "next-auth"; import useIsMobile from "@/app/utils/useIsMobile"; interface NavigationItem { icon: React.ReactNode; label: string; path: string; isHidden?: boolean; showOnMobile?: boolean; children?: NavigationItem[]; } interface Props { abilities?: string[]; } const NavigationContent: React.FC = ({ abilities }) => { const navigationItems: NavigationItem[] = [ { icon: , label: "User Workspace", path: "/home", showOnMobile: true, }, { icon: , label: "Dashboard", path: "", children: [ { icon: , label: "Financial Summary", path: "/dashboard/ProjectFinancialSummary", }, { icon: , label: "Company / Team Cash Flow", path: "/dashboard/CompanyTeamCashFlow", }, { icon: , label: "Project Cash Flow", path: "/dashboard/ProjectCashFlow", }, { icon: , label: "Project Status by Client", path: "/dashboard/ProjectStatusByClient", }, { icon: , label: "Project Status by Team", path: "/dashboard/ProjectStatusByTeam", }, { icon: , label: "Staff Utilization", path: "/dashboard/StaffUtilization", }, { icon: , label: "Project Resource Summary", path: "/dashboard/ProjectResourceSummary", }, ], }, // No Claim function in Breaur, will be implement later // { // icon: , // label: "Staff Reimbursement", // path: "/staffReimbursement", // children: [ // { // icon: , // label: "Claim Approval", // path: "/staffReimbursement/ClaimApproval", // }, // { // icon: , // label: "Claim Summary", // path: "/staffReimbursement/ClaimSummary", // }, // ], // }, { icon: , label: "Project Management", path: "/projects" }, { icon: , label: "Task Template", path: "/tasks" }, { icon: , label: "Invoice", path: "/invoice" }, { icon: , label: "Analysis Report", path: "", isHidden: ![GENERATE_REPORTS].some((ability) => abilities!.includes(ability), ), children: [ { icon: , label: "Late Start Report", path: "/analytics/LateStartReport", }, { icon: , label: "Delay Report", path: "/analytics/DelayReport", }, { icon: , label: "Resource Overconsumption Report", path: "/analytics/ResourceOverconsumptionReport", }, { icon: , label: "Cost and Expense Report", path: "/analytics/CostandExpenseReport", }, { icon: , label: "Completion Report", path: "/analytics/ProjectCompletionReport", }, { icon: , label: "Completion Report with Outstanding Un-billed Hours Report", path: "/analytics/ProjectCompletionReportWO", }, { icon: , label: "Project Claims Report", path: "/analytics/ProjectClaimsReport", }, { icon: , label: "Project P&L Report", path: "/analytics/ProjectPandLReport", }, { icon: , label: "Financial Status Report", path: "/analytics/FinancialStatusReport", }, { icon: , label: "Project Cash Flow Report", path: "/analytics/ProjectCashFlowReport", }, { icon: , label: "Staff Monthly Work Hours Analysis Report", path: "/analytics/StaffMonthlyWorkHoursAnalysisReport", }, ], }, { icon: , label: "Setting", path: "", isHidden: ![VIEW_MASTERDATA, MAINTAIN_MASTERDATA].some((ability) => abilities!.includes(ability), ), children: [ { icon: , label: "Client", path: "/settings/customer" }, { icon: , label: "Subsidiary", path: "/settings/subsidiary", }, { icon: , label: "Staff", path: "/settings/staff" }, { icon: , label: "Company", path: "/settings/company" }, { icon: , label: "Skill", path: "/settings/skill" }, { icon: , label: "Department", path: "/settings/department", }, { icon: , label: "Position", path: "/settings/position" }, { icon: , label: "Salary", path: "/settings/salary" }, { icon: , label: "Team", path: "/settings/team" }, // { icon: , label: "User", path: "/settings/user" }, { icon: , label: "User Group", path: "/settings/group", }, { icon: , label: "Holiday", path: "/settings/holiday" }, ], }, ]; const isMobile = useIsMobile(); 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) => { const isOpen = openItems.includes(item.label); return ( item.children && toggleItem(item.label)} > {item.icon} {item.children && isOpen && ( {item.children.map((child) => renderNavigationItem(child))} )} ); }; return ( {/* */} {navigationItems .filter( (item) => !item.isHidden && (isMobile ? item.showOnMobile : true), ) .map((item) => renderNavigationItem(item))} {/* {navigationItems.map(({ icon, label, path }, index) => { return ( {icon} ); })} */} ); }; export default NavigationContent;