Non puoi selezionare più di 25 argomenti Gli argomenti devono iniziare con una lettera o un numero, possono includere trattini ('-') e possono essere lunghi fino a 35 caratteri.
 
 

250 righe
7.2 KiB

  1. "use client";
  2. import React, { useCallback, useState } from "react";
  3. import { useTranslation } from "react-i18next";
  4. import Button from "@mui/material/Button";
  5. import Stack from "@mui/material/Stack";
  6. import {
  7. CalendarMonth,
  8. EditCalendar,
  9. Luggage,
  10. MoreTime,
  11. } from "@mui/icons-material";
  12. import { Menu, MenuItem, SxProps, Typography } from "@mui/material";
  13. import AssignedProjects from "./AssignedProjects";
  14. import { AssignedProject, ProjectWithTasks } from "@/app/api/projects";
  15. import {
  16. RecordLeaveInput,
  17. RecordTimesheetInput,
  18. revalidateCacheAfterAmendment,
  19. } from "@/app/api/timesheets/actions";
  20. import { LeaveType, TeamLeaves, TeamTimeSheets } from "@/app/api/timesheets";
  21. import { CalendarIcon } from "@mui/x-date-pickers";
  22. import PastEntryCalendarModal from "../PastEntryCalendar/PastEntryCalendarModal";
  23. import { HolidaysResult } from "@/app/api/holidays";
  24. import { TimesheetAmendmentModal } from "../TimesheetAmendment/TimesheetAmendmentModal";
  25. import TimeLeaveModal from "../TimeLeaveModal/TimeLeaveModal";
  26. import LeaveModal from "../LeaveModal";
  27. import { Task } from "@/app/api/tasks";
  28. import dayjs from "dayjs";
  29. export interface Props {
  30. leaveTypes: LeaveType[];
  31. allProjects: ProjectWithTasks[];
  32. assignedProjects: AssignedProject[];
  33. defaultLeaveRecords: RecordLeaveInput;
  34. defaultTimesheets: RecordTimesheetInput;
  35. holidays: HolidaysResult[];
  36. teamTimesheets: TeamTimeSheets;
  37. teamLeaves: TeamLeaves;
  38. fastEntryEnabled: boolean;
  39. maintainNormalStaffWorkspaceAbility: boolean;
  40. maintainManagementStaffWorkspaceAbility: boolean;
  41. isFullTime: boolean;
  42. joinDate?: number | null;
  43. miscTasks: Task[];
  44. isSaturdayWorker: boolean;
  45. userId: number;
  46. }
  47. const menuItemSx: SxProps = {
  48. gap: 1,
  49. color: "neutral.700",
  50. };
  51. const UserWorkspacePage: React.FC<Props> = ({
  52. leaveTypes,
  53. allProjects,
  54. assignedProjects,
  55. defaultLeaveRecords,
  56. defaultTimesheets,
  57. holidays,
  58. teamTimesheets,
  59. teamLeaves,
  60. fastEntryEnabled,
  61. maintainNormalStaffWorkspaceAbility,
  62. maintainManagementStaffWorkspaceAbility,
  63. isFullTime,
  64. joinDate,
  65. miscTasks,
  66. isSaturdayWorker,
  67. userId
  68. }) => {
  69. const [anchorEl, setAnchorEl] = useState<null | HTMLElement>(null);
  70. const [isTimeLeaveModalVisible, setTimeLeaveModalVisible] = useState(false);
  71. const [isLeaveCalendarVisible, setLeaveCalendarVisible] = useState(false);
  72. const [isPastEventModalVisible, setPastEventModalVisible] = useState(false);
  73. const [isTimesheetAmendmentVisible, setisTimesheetAmendmentVisible] =
  74. useState(false);
  75. const { t } = useTranslation("home");
  76. const showTimesheetAmendment = Object.keys(teamTimesheets).length > 0;
  77. const handleOpenActionMenu = useCallback<
  78. React.MouseEventHandler<HTMLButtonElement>
  79. >((event) => {
  80. setAnchorEl(event.currentTarget);
  81. }, []);
  82. const handleCloseActionMenu = useCallback(() => {
  83. setAnchorEl(null);
  84. }, []);
  85. const handleAddTimeLeaveButton = useCallback(() => {
  86. setAnchorEl(null);
  87. setTimeLeaveModalVisible(true);
  88. }, []);
  89. const handleCloseTimeLeaveModal = useCallback(() => {
  90. setTimeLeaveModalVisible(false);
  91. }, []);
  92. const handleOpenLeaveCalendarButton = useCallback(() => {
  93. setAnchorEl(null);
  94. setLeaveCalendarVisible(true);
  95. }, []);
  96. const handleCloseLeaveCalendarButton = useCallback(() => {
  97. setLeaveCalendarVisible(false);
  98. }, []);
  99. const handlePastEventClick = useCallback(() => {
  100. setAnchorEl(null);
  101. setPastEventModalVisible(true);
  102. }, []);
  103. const handlePastEventClose = useCallback(() => {
  104. setPastEventModalVisible(false);
  105. }, []);
  106. const handleAmendmentClick = useCallback(() => {
  107. setAnchorEl(null);
  108. setisTimesheetAmendmentVisible(true);
  109. }, []);
  110. const handleAmendmentClose = useCallback(() => {
  111. setisTimesheetAmendmentVisible(false);
  112. revalidateCacheAfterAmendment();
  113. }, []);
  114. return (
  115. <>
  116. <Stack
  117. direction="row"
  118. justifyContent="space-between"
  119. flexWrap="wrap"
  120. rowGap={2}
  121. >
  122. <Typography variant="h4" marginInlineEnd={2}>
  123. {t("User Workspace")}
  124. </Typography>
  125. <Button
  126. startIcon={<CalendarIcon />}
  127. variant="contained"
  128. onClick={handleOpenActionMenu}
  129. >
  130. {t("Timesheet Actions")}
  131. </Button>
  132. </Stack>
  133. <Menu
  134. anchorEl={anchorEl}
  135. open={Boolean(anchorEl)}
  136. onClose={handleCloseActionMenu}
  137. anchorOrigin={{
  138. vertical: "bottom",
  139. horizontal: "right",
  140. }}
  141. transformOrigin={{
  142. vertical: "top",
  143. horizontal: "right",
  144. }}
  145. >
  146. <MenuItem onClick={handleAddTimeLeaveButton} sx={menuItemSx}>
  147. <MoreTime />
  148. {t("Enter Timesheet")}
  149. </MenuItem>
  150. <MenuItem onClick={handleOpenLeaveCalendarButton} sx={menuItemSx}>
  151. <Luggage />
  152. {t("Record Leave")}
  153. </MenuItem>
  154. <MenuItem onClick={handlePastEventClick} sx={menuItemSx}>
  155. <CalendarMonth />
  156. {t("View Past Entries")}
  157. </MenuItem>
  158. {showTimesheetAmendment && (
  159. <MenuItem onClick={handleAmendmentClick} sx={menuItemSx}>
  160. <EditCalendar />
  161. {t("Timesheet Amendments")}
  162. </MenuItem>
  163. )}
  164. </Menu>
  165. <PastEntryCalendarModal
  166. open={isPastEventModalVisible}
  167. handleClose={handlePastEventClose}
  168. timesheet={defaultTimesheets}
  169. leaves={defaultLeaveRecords}
  170. allProjects={allProjects}
  171. leaveTypes={leaveTypes}
  172. companyHolidays={holidays}
  173. />
  174. <TimeLeaveModal
  175. fastEntryEnabled={fastEntryEnabled}
  176. companyHolidays={holidays}
  177. isOpen={isTimeLeaveModalVisible}
  178. onClose={handleCloseTimeLeaveModal}
  179. leaveTypes={leaveTypes}
  180. allProjects={allProjects}
  181. assignedProjects={assignedProjects}
  182. timesheetRecords={defaultTimesheets}
  183. leaveRecords={defaultLeaveRecords}
  184. isFullTime={isFullTime}
  185. joinDate={dayjs(joinDate)}
  186. miscTasks={miscTasks}
  187. />
  188. <LeaveModal
  189. open={isLeaveCalendarVisible}
  190. onClose={handleCloseLeaveCalendarButton}
  191. leaveTypes={leaveTypes}
  192. companyHolidays={holidays}
  193. allProjects={allProjects}
  194. leaveRecords={defaultLeaveRecords}
  195. timesheetRecords={defaultTimesheets}
  196. isFullTime={isFullTime}
  197. joinDate={dayjs(joinDate)}
  198. />
  199. {assignedProjects.length > 0 ? (
  200. <AssignedProjects
  201. assignedProjects={assignedProjects}
  202. maintainNormalStaffWorkspaceAbility={
  203. maintainNormalStaffWorkspaceAbility
  204. }
  205. maintainManagementStaffWorkspaceAbility={
  206. maintainManagementStaffWorkspaceAbility
  207. }
  208. />
  209. ) : (
  210. <Typography variant="subtitle1">
  211. {t("You have no assigned projects!")}
  212. </Typography>
  213. )}
  214. {showTimesheetAmendment && (
  215. <TimesheetAmendmentModal
  216. allProjects={allProjects}
  217. leaveTypes={leaveTypes}
  218. companyHolidays={holidays}
  219. teamLeaves={teamLeaves}
  220. teamTimesheets={teamTimesheets}
  221. open={isTimesheetAmendmentVisible}
  222. onClose={handleAmendmentClose}
  223. miscTasks={miscTasks}
  224. isSaturdayWorker={isSaturdayWorker}
  225. userId={userId}
  226. />
  227. )}
  228. </>
  229. );
  230. };
  231. export default UserWorkspacePage;