|
- import React, { useCallback, useState } from "react";
- import {
- Box,
- Card,
- CardContent,
- Grid,
- ToggleButton,
- ToggleButtonGroup,
- ToggleButtonProps,
- Tooltip,
- Typography,
- } from "@mui/material";
- import { useTranslation } from "react-i18next";
- import { manhourFormatter } from "@/app/utils/formatUtil";
- import { AssignedProject } from "@/app/api/projects";
- import { TableRows, ViewModule, TableChart } from "@mui/icons-material";
- import ProjectTable from "./ProjectTable";
-
- export interface Props {
- projects: AssignedProject[];
- maintainNormalStaffWorkspaceAbility?: boolean;
- maintainManagementStaffWorkspaceAbility?: boolean;
- }
-
- const ProjectGrid: React.FC<Props> = ({
- projects,
- maintainNormalStaffWorkspaceAbility,
- maintainManagementStaffWorkspaceAbility,
- }) => {
- const { t } = useTranslation("home");
- const [view, setView] = useState<"grid" | "list" | "table">("grid");
-
- const handleViewChange = useCallback<
- NonNullable<ToggleButtonProps["onChange"]>
- >((e, value) => {
- if (value) {
- setView(value);
- }
- }, []);
-
- return (
- <Box>
- <ToggleButtonGroup
- color="primary"
- value={view}
- exclusive
- onChange={handleViewChange}
- sx={{ marginBlockEnd: 2 }}
- >
- <ToggleButton value="grid">
- <Tooltip title={t("Grid view")}>
- <ViewModule />
- </Tooltip>
- </ToggleButton>
- <ToggleButton value="list">
- <Tooltip title={t("List view")}>
- <TableRows />
- </Tooltip>
- </ToggleButton>
- <ToggleButton value="table">
- <Tooltip title={t("Table view")}>
- <TableChart />
- </Tooltip>
- </ToggleButton>
- </ToggleButtonGroup>
- {view === "table" ? (
- <ProjectTable
- projects={projects}
- maintainManagementStaffWorkspaceAbility={
- maintainManagementStaffWorkspaceAbility
- }
- maintainNormalStaffWorkspaceAbility={
- maintainNormalStaffWorkspaceAbility
- }
- />
- ) : (
- <Grid
- container
- columns={view === "list" ? 4 : { xs: 4, sm: 8, md: 12, lg: 16 }}
- spacing={2}
- alignItems="stretch"
- >
- {projects.map((project, idx) => (
- <Grid key={`${project.code}${idx}`} item xs={4}>
- <Card sx={{ height: "100%" }}>
- <CardContent
- sx={{
- display: "flex",
- flexDirection: "column",
- height: "100%",
- }}
- >
- <Typography variant="overline">{project.code}</Typography>
- <Typography
- variant="h6"
- sx={{
- marginBlockEnd: 3,
- }}
- >
- {project.name}
- </Typography>
- {/* Spacer */}
- <Box sx={{ flex: 1 }} />
- {/* Hours Spent */}
- {(Boolean(maintainNormalStaffWorkspaceAbility) ||
- Boolean(maintainManagementStaffWorkspaceAbility)) && (
- <>
- <Typography variant="subtitle2">
- {t("Hours Spent:")}
- </Typography>
- <Box
- sx={{
- display: "flex",
- justifyContent: "space-between",
- alignItems: "baseline",
- }}
- >
- <Typography variant="caption">{t("Normal")}</Typography>
- <Typography>
- {manhourFormatter.format(
- Boolean(maintainManagementStaffWorkspaceAbility)
- ? project.hoursSpent
- : project.currentStaffHoursSpent,
- )}
- </Typography>
- </Box>
- <Box
- sx={{
- display: "flex",
- justifyContent: "space-between",
- alignItems: "baseline",
- }}
- >
- <Typography variant="caption">{t("Others")}</Typography>
- <Typography>{`${manhourFormatter.format(
- Boolean(maintainManagementStaffWorkspaceAbility)
- ? project.hoursSpentOther
- : project.currentStaffHoursSpentOther,
- )}`}</Typography>
- </Box>
- </>
- )}
- {/* Hours Allocated */}
- {Boolean(maintainManagementStaffWorkspaceAbility) && (
- <Box
- sx={{
- display: "flex",
- justifyContent: "space-between",
- alignItems: "baseline",
- }}
- >
- <Typography
- variant="subtitle2"
- sx={{ marginBlockStart: 2 }}
- >
- {t("Hours Allocated:")}
- </Typography>
- <Typography>
- {manhourFormatter.format(project.hoursAllocated)}
- </Typography>
- </Box>
- )}
- </CardContent>
- </Card>
- </Grid>
- ))}
- </Grid>
- )}
- </Box>
- );
- };
-
- export default ProjectGrid;
|