No puede seleccionar más de 25 temas Los temas deben comenzar con una letra o número, pueden incluir guiones ('-') y pueden tener hasta 35 caracteres de largo.
 
 

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