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.
 
 

109 regels
3.1 KiB

  1. "use client";
  2. import { 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 { Add } from "@mui/icons-material";
  7. import { Typography } from "@mui/material";
  8. import ButtonGroup from "@mui/material/ButtonGroup";
  9. import AssignedProjects from "./AssignedProjects";
  10. import TimesheetModal from "../TimesheetModal";
  11. import { AssignedProject } from "@/app/api/projects";
  12. import { RecordTimesheetInput } from "@/app/api/timesheets/actions";
  13. export interface Props {
  14. assignedProjects: AssignedProject[];
  15. username: string;
  16. defaultTimesheets: RecordTimesheetInput;
  17. }
  18. const UserWorkspacePage: React.FC<Props> = ({
  19. assignedProjects,
  20. username,
  21. defaultTimesheets,
  22. }) => {
  23. const [isTimeheetModalVisible, setTimeheetModalVisible] = useState(false);
  24. const [isLeaveModalVisible, setLeaveModalVisible] = useState(false);
  25. const { t } = useTranslation("home");
  26. const handleAddTimesheetButtonClick = useCallback(() => {
  27. setTimeheetModalVisible(true);
  28. }, []);
  29. const handleCloseTimesheetModal = useCallback(() => {
  30. setTimeheetModalVisible(false);
  31. }, []);
  32. const handleAddLeaveButtonClick = useCallback(() => {
  33. setLeaveModalVisible(true);
  34. }, []);
  35. const handleCloseLeaveModal = useCallback(() => {
  36. setLeaveModalVisible(false);
  37. }, []);
  38. return (
  39. <>
  40. <Stack
  41. direction="row"
  42. justifyContent="space-between"
  43. flexWrap="wrap"
  44. rowGap={2}
  45. >
  46. <Typography variant="h4" marginInlineEnd={2}>
  47. {t("User Workspace")}
  48. </Typography>
  49. <Stack
  50. direction="row"
  51. justifyContent="right"
  52. flexWrap="wrap"
  53. spacing={2}
  54. >
  55. {Boolean(assignedProjects.length) && (
  56. <ButtonGroup variant="contained">
  57. <Button
  58. startIcon={<Add />}
  59. onClick={handleAddTimesheetButtonClick}
  60. >
  61. {t("Enter Time")}
  62. </Button>
  63. <Button startIcon={<Add />} onClick={handleAddLeaveButtonClick}>
  64. {t("Record Leave")}
  65. </Button>
  66. </ButtonGroup>
  67. )}
  68. </Stack>
  69. </Stack>
  70. {assignedProjects.length > 0 ? (
  71. <>
  72. <TimesheetModal
  73. timesheetType="time"
  74. isOpen={isTimeheetModalVisible}
  75. onClose={handleCloseTimesheetModal}
  76. assignedProjects={assignedProjects}
  77. username={username}
  78. defaultTimesheets={defaultTimesheets}
  79. />
  80. <TimesheetModal
  81. timesheetType="leave"
  82. isOpen={isLeaveModalVisible}
  83. onClose={handleCloseLeaveModal}
  84. assignedProjects={assignedProjects}
  85. username={username}
  86. />
  87. <AssignedProjects assignedProjects={assignedProjects} />
  88. </>
  89. ) : (
  90. <>
  91. <Typography variant="subtitle1">
  92. {t("You have no assigned projects!")}
  93. </Typography>
  94. </>
  95. )}
  96. </>
  97. );
  98. };
  99. export default UserWorkspacePage;