Você não pode selecionar mais de 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.
 
 

220 linhas
8.7 KiB

  1. import Divider from "@mui/material/Divider";
  2. import Box from "@mui/material/Box";
  3. import React from "react";
  4. import List from "@mui/material/List";
  5. import ListItemButton from "@mui/material/ListItemButton";
  6. import ListItemText from "@mui/material/ListItemText";
  7. import ListItemIcon from "@mui/material/ListItemIcon";
  8. import WorkHistory from "@mui/icons-material/WorkHistory";
  9. import Dashboard from "@mui/icons-material/Dashboard";
  10. import SummarizeIcon from "@mui/icons-material/Summarize";
  11. import PaymentsIcon from "@mui/icons-material/Payments";
  12. import AccountTreeIcon from "@mui/icons-material/AccountTree";
  13. import RequestQuote from "@mui/icons-material/RequestQuote";
  14. import PeopleIcon from "@mui/icons-material/People";
  15. import Task from "@mui/icons-material/Task";
  16. import Assignment from "@mui/icons-material/Assignment";
  17. import Settings from "@mui/icons-material/Settings";
  18. import Analytics from "@mui/icons-material/Analytics";
  19. import Payments from "@mui/icons-material/Payments";
  20. import Staff from "@mui/icons-material/PeopleAlt";
  21. import Company from '@mui/icons-material/Store';
  22. import Department from '@mui/icons-material/Diversity3';
  23. import Position from '@mui/icons-material/Paragliding';
  24. import Salary from '@mui/icons-material/AttachMoney';
  25. import Team from '@mui/icons-material/Paragliding';
  26. import Holiday from '@mui/icons-material/CalendarMonth';
  27. import { useTranslation } from "react-i18next";
  28. import Typography from "@mui/material/Typography";
  29. import { usePathname } from "next/navigation";
  30. import Link from "next/link";
  31. import { NAVIGATION_CONTENT_WIDTH } from "@/config/uiConfig";
  32. import Logo from "../Logo";
  33. import GroupIcon from '@mui/icons-material/Group';
  34. import BusinessIcon from '@mui/icons-material/Business';
  35. import ViewWeekIcon from '@mui/icons-material/ViewWeek';
  36. import ManageAccountsIcon from '@mui/icons-material/ManageAccounts';
  37. import EmojiEventsIcon from '@mui/icons-material/EmojiEvents';
  38. import { GENERATE_REPORTS, MAINTAIN_MASTERDATA, MAINTAIN_USER, VIEW_MASTERDATA, VIEW_USER } from "@/middleware";
  39. import { SessionWithAbilities } from "../AppBar/NavigationToggle";
  40. import { authOptions } from "@/config/authConfig";
  41. import { getServerSession } from "next-auth";
  42. interface NavigationItem {
  43. icon: React.ReactNode;
  44. label: string;
  45. path: string;
  46. isHidden?: boolean;
  47. children?: NavigationItem[];
  48. }
  49. interface Props {
  50. abilities?: string[]
  51. }
  52. const NavigationContent: React.FC<Props> = ({ abilities }) => {
  53. const navigationItems: NavigationItem[] = [
  54. { icon: <WorkHistory />, label: "User Workspace", path: "/home" },
  55. {
  56. icon: <Dashboard />,
  57. label: "Dashboard",
  58. path: "",
  59. children: [
  60. {
  61. icon: <SummarizeIcon />,
  62. label: "Financial Summary",
  63. path: "/dashboard/ProjectFinancialSummary",
  64. },
  65. {
  66. icon: <PaymentsIcon />,
  67. label: "Company / Team Cash Flow",
  68. path: "/dashboard/CompanyTeamCashFlow",
  69. },
  70. {
  71. icon: <PaymentsIcon />,
  72. label: "Project Cash Flow",
  73. path: "/dashboard/ProjectCashFlow",
  74. },
  75. {
  76. icon: <AccountTreeIcon />,
  77. label: "Project Status by Client",
  78. path: "/dashboard/ProjectStatusByClient",
  79. },
  80. {
  81. icon: <AccountTreeIcon />,
  82. label: "Project Status by Team",
  83. path: "/dashboard/ProjectStatusByTeam",
  84. },
  85. {
  86. icon: <PeopleIcon />,
  87. label: "Staff Utilization",
  88. path: "/dashboard/StaffUtilization",
  89. },
  90. {
  91. icon: <ViewWeekIcon />,
  92. label: "Project Resource Summary",
  93. path: "/dashboard/ProjectResourceSummary",
  94. }
  95. ],
  96. },
  97. {
  98. icon: <RequestQuote />,
  99. label: "Staff Reimbursement",
  100. path: "/staffReimbursement",
  101. children: [
  102. {
  103. icon: <RequestQuote />,
  104. label: "Claim Approval",
  105. path: "/staffReimbursement/ClaimApproval",
  106. },
  107. {
  108. icon: <RequestQuote />,
  109. label: "Claim Summary",
  110. path: "/staffReimbursement/ClaimSummary",
  111. },
  112. ],
  113. },
  114. { icon: <Assignment />, label: "Project Management", path: "/projects" },
  115. { icon: <Task />, label: "Task Template", path: "/tasks" },
  116. { icon: <Payments />, label: "Invoice", path: "/invoice" },
  117. { icon: <Analytics />, label: "Analysis Report", path: "", isHidden: ![GENERATE_REPORTS].some((ability) => abilities!!.includes(ability)),
  118. children: [
  119. {icon: <Analytics />, label:"Late Start Report", path: "/analytics/LateStartReport"},
  120. {icon: <Analytics />, label:"Delay Report", path: "/analytics/DelayReport"},
  121. {icon: <Analytics />, label:"Resource Overconsumption Report", path: "/analytics/ResourceOverconsumptionReport"},
  122. {icon: <Analytics />, label:"Cost and Expense Report", path: "/analytics/CostandExpenseReport"},
  123. {icon: <Analytics />, label:"Completion Report", path: "/analytics/ProjectCompletionReport"},
  124. {icon: <Analytics />, label:"Completion Report with Outstanding Un-billed Hours Report", path: "/analytics/ProjectCompletionReportWO"},
  125. {icon: <Analytics />, label:"Project Claims Report", path: "/analytics/ProjectClaimsReport"},
  126. {icon: <Analytics />, label:"Project P&L Report", path: "/analytics/ProjectPLReport"},
  127. {icon: <Analytics />, label:"Financial Status Report", path: "/analytics/FinancialStatusReport"},
  128. {icon: <Analytics />, label:"EX02 - Project Cash Flow Report", path: "/analytics/EX02ProjectCashFlowReport"},
  129. ],
  130. },
  131. {
  132. icon: <Settings />, label: "Setting", path: "", isHidden: ![VIEW_MASTERDATA, MAINTAIN_MASTERDATA].some((ability) => abilities!!.includes(ability)),
  133. children: [
  134. { icon: <GroupIcon />, label: "Client", path: "/settings/customer" },
  135. { icon: <BusinessIcon />, label: "Subsidiary", path: "/settings/subsidiary" },
  136. { icon: <Staff />, label: "Staff", path: "/settings/staff" },
  137. { icon: <Company />, label: "Company", path: "/settings/company" },
  138. { icon: <EmojiEventsIcon />, label: "Skill", path: "/settings/skill" },
  139. { icon: <Department />, label: "Department", path: "/settings/department" },
  140. { icon: <Position />, label: "Position", path: "/settings/position" },
  141. { icon: <Salary />, label: "Salary", path: "/settings/salary" },
  142. { icon: <Team />, label: "Team", path: "/settings/team" },
  143. { icon: <ManageAccountsIcon />, label: "User", path: "/settings/user" },
  144. { icon: <Holiday />, label: "Holiday", path: "/settings/holiday" },
  145. ],
  146. },
  147. ];
  148. const { t } = useTranslation("common");
  149. const pathname = usePathname();
  150. const [openItems, setOpenItems] = React.useState<string[]>([]);
  151. const toggleItem = (label: string) => {
  152. setOpenItems((prevOpenItems) =>
  153. prevOpenItems.includes(label)
  154. ? prevOpenItems.filter((item) => item !== label)
  155. : [...prevOpenItems, label],
  156. );
  157. };
  158. const renderNavigationItem = (item: NavigationItem) => {
  159. const isOpen = openItems.includes(item.label);
  160. return (
  161. <Box
  162. key={`${item.label}-${item.path}`}
  163. component={Link}
  164. href={item.path}
  165. sx={{ textDecoration: "none", color: "inherit" }}
  166. >
  167. <ListItemButton
  168. selected={pathname.includes(item.label)}
  169. onClick={() => item.children && toggleItem(item.label)}
  170. >
  171. <ListItemIcon>{item.icon}</ListItemIcon>
  172. <ListItemText primary={t(item.label)} />
  173. </ListItemButton>
  174. {item.children && isOpen && (
  175. <List sx={{ pl: 2 }}>
  176. {item.children.map((child) => renderNavigationItem(child))}
  177. </List>
  178. )}
  179. </Box>
  180. );
  181. };
  182. return (
  183. <Box sx={{ width: NAVIGATION_CONTENT_WIDTH }}>
  184. <Box sx={{ p: 3, display: "flex" }}>
  185. <Logo height={60} />
  186. {/* <button className="float-right bg-transparent border-transparent" >
  187. <ArrowCircleLeftRoundedIcon className="text-slate-400 hover:text-blue-400 hover:cursor-pointer " style={{ fontSize: '35px' }} />
  188. </button> */}
  189. </Box>
  190. <Divider />
  191. <List component="nav">
  192. {navigationItems.filter(item => item.isHidden !== true).map((item) => renderNavigationItem(item))}
  193. {/* {navigationItems.map(({ icon, label, path }, index) => {
  194. return (
  195. <Box
  196. key={`${label}-${index}`}
  197. component={Link}
  198. href={path}
  199. sx={{ textDecoration: "none", color: "inherit" }}
  200. >
  201. <ListItemButton selected={pathname.includes(path)}>
  202. <ListItemIcon>{icon}</ListItemIcon>
  203. <ListItemText primary={t(label)} />
  204. </ListItemButton>
  205. </Box>
  206. );
  207. })} */}
  208. </List>
  209. </Box>
  210. );
  211. };
  212. export default NavigationContent;