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.
 
 

89 líneas
2.7 KiB

  1. import React, { useEffect } from "react";
  2. import {
  3. Card,
  4. CardContent,
  5. Grid,
  6. IconButton,
  7. InputAdornment,
  8. Stack,
  9. TextField,
  10. Typography,
  11. } from "@mui/material";
  12. import { useTranslation } from "react-i18next";
  13. import { Clear, Search } from "@mui/icons-material";
  14. import ProjectGrid from "./ProjectGrid";
  15. import { Props as UserWorkspaceProps } from "./UserWorkspacePage";
  16. interface Props {
  17. assignedProjects: UserWorkspaceProps["assignedProjects"];
  18. maintainNormalStaffWorkspaceAbility?: boolean;
  19. maintainManagementStaffWorkspaceAbility?: boolean;
  20. }
  21. const AssignedProjects: React.FC<Props> = ({ assignedProjects, maintainNormalStaffWorkspaceAbility, maintainManagementStaffWorkspaceAbility }) => {
  22. const { t } = useTranslation("home");
  23. // Projects
  24. const [filteredProjects, setFilterProjects] =
  25. React.useState(assignedProjects);
  26. // Query related
  27. const [query, setQuery] = React.useState("");
  28. const onQueryInputChange = React.useCallback<
  29. React.ChangeEventHandler<HTMLInputElement>
  30. >((e) => {
  31. setQuery(e.target.value);
  32. }, []);
  33. const clearQueryInput = React.useCallback(() => {
  34. setQuery("");
  35. }, []);
  36. useEffect(() => {
  37. setFilterProjects(
  38. assignedProjects.filter(
  39. (p) =>
  40. p.code.toLowerCase().includes(query.toLowerCase()) ||
  41. p.name.toLowerCase().includes(query.toLowerCase()),
  42. ),
  43. );
  44. }, [assignedProjects, query]);
  45. return (
  46. <>
  47. <Card>
  48. <CardContent>
  49. <Stack gap={2}>
  50. <Typography variant="overline" display="block">
  51. {t("Assigned Projects")}
  52. </Typography>
  53. <Grid container spacing={2} columns={{ xs: 6, sm: 12 }}>
  54. <Grid item xs={6} display="flex" alignItems="center">
  55. <Search sx={{ marginInlineEnd: 1 }} />
  56. <TextField
  57. variant="standard"
  58. fullWidth
  59. onChange={onQueryInputChange}
  60. value={query}
  61. placeholder={t("Search projects by name or code")}
  62. InputProps={{
  63. endAdornment: query && (
  64. <InputAdornment position="end">
  65. <IconButton onClick={clearQueryInput}>
  66. <Clear />
  67. </IconButton>
  68. </InputAdornment>
  69. ),
  70. }}
  71. />
  72. </Grid>
  73. </Grid>
  74. </Stack>
  75. </CardContent>
  76. </Card>
  77. <ProjectGrid projects={filteredProjects} maintainNormalStaffWorkspaceAbility={maintainNormalStaffWorkspaceAbility} maintainManagementStaffWorkspaceAbility={maintainManagementStaffWorkspaceAbility}/>
  78. </>
  79. );
  80. };
  81. export default AssignedProjects;