You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

107 line
3.0 KiB

  1. import { useTranslation } from "react-i18next";
  2. import { Props } from "./ProjectGrid";
  3. import {
  4. Paper,
  5. Table,
  6. TableBody,
  7. TableCell,
  8. TableContainer,
  9. TableHead,
  10. TableRow,
  11. } from "@mui/material";
  12. import { useMemo } from "react";
  13. import { AssignedProject } from "@/app/api/projects";
  14. import { manhourFormatter } from "@/app/utils/formatUtil";
  15. interface Column {
  16. name: keyof AssignedProject;
  17. label: string;
  18. }
  19. const hourColumns: Array<keyof AssignedProject> = [
  20. "currentStaffHoursSpent",
  21. "currentStaffHoursSpentOther",
  22. "hoursAllocated",
  23. "hoursSpent",
  24. "hoursSpentOther",
  25. ];
  26. const ProjectTable: React.FC<Props> = ({
  27. projects,
  28. maintainManagementStaffWorkspaceAbility,
  29. maintainNormalStaffWorkspaceAbility,
  30. }) => {
  31. const { t } = useTranslation("home");
  32. const columns = useMemo<Column[]>(() => {
  33. return [
  34. { name: "code", label: t("Project Code") },
  35. { name: "name", label: t("Project Name") },
  36. ...(maintainManagementStaffWorkspaceAbility ||
  37. maintainNormalStaffWorkspaceAbility
  38. ? maintainManagementStaffWorkspaceAbility
  39. ? ([
  40. { name: "hoursSpent", label: t("Total Normal Hours Spent") },
  41. { name: "hoursSpentOther", label: t("Total Other Hours Spent") },
  42. { name: "hoursAllocated", label: t("Hours Allocated") },
  43. ] satisfies Column[])
  44. : ([
  45. {
  46. name: "currentStaffHoursSpent",
  47. label: t("Normal Hours Spent"),
  48. },
  49. {
  50. name: "currentStaffHoursSpentOther",
  51. label: t("Other Hours Spent"),
  52. },
  53. ] satisfies Column[])
  54. : []),
  55. ];
  56. }, [
  57. maintainManagementStaffWorkspaceAbility,
  58. maintainNormalStaffWorkspaceAbility,
  59. t,
  60. ]);
  61. return (
  62. <Paper sx={{ overflow: "hidden" }}>
  63. <TableContainer>
  64. <Table>
  65. <TableHead>
  66. <TableRow>
  67. {columns.map((column, idx) => (
  68. <TableCell key={`${column.name.toString()}-${idx}`}>
  69. {column.label}
  70. </TableCell>
  71. ))}
  72. </TableRow>
  73. </TableHead>
  74. <TableBody>
  75. {projects.map((project) => {
  76. return (
  77. <TableRow hover tabIndex={-1} key={project.id}>
  78. {columns.map((column, idx) => {
  79. const columnName = column.name;
  80. const needsFormatting = hourColumns.includes(columnName);
  81. return (
  82. <TableCell key={`${columnName.toString()}-${idx}`}>
  83. {needsFormatting
  84. ? manhourFormatter.format(
  85. project[columnName] as number,
  86. )
  87. : project[columnName]?.toString()}
  88. </TableCell>
  89. );
  90. })}
  91. </TableRow>
  92. );
  93. })}
  94. </TableBody>
  95. </Table>
  96. </TableContainer>
  97. </Paper>
  98. );
  99. };
  100. export default ProjectTable;