FPSMS-frontend
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.
 
 

82 lines
1.8 KiB

  1. import React, { useEffect, useState } from "react";
  2. import {
  3. FormControl,
  4. InputLabel,
  5. Select,
  6. MenuItem,
  7. Chip,
  8. Box,
  9. } from "@mui/material";
  10. interface Option {
  11. value: number;
  12. label: string;
  13. }
  14. interface MultiSelectProps {
  15. label: string;
  16. options: Option[];
  17. selectedValues: number[];
  18. onChange: (values: number[]) => void;
  19. isReset?: boolean;
  20. }
  21. const MultiSelect: React.FC<MultiSelectProps> = ({
  22. label,
  23. options,
  24. selectedValues,
  25. onChange,
  26. isReset,
  27. }) => {
  28. const [displayValues, setDisplayValues] = useState<number[]>(selectedValues);
  29. const handleChange = (event: React.ChangeEvent<{ value: unknown }>) => {
  30. const value = event.target.value as number[];
  31. console.log("[debug] value", value);
  32. // Update display values state
  33. setDisplayValues(value);
  34. // Update selected values in parent component
  35. onChange(value);
  36. };
  37. useEffect(() => {
  38. setDisplayValues([]);
  39. }, [isReset]);
  40. return (
  41. <FormControl fullWidth>
  42. <InputLabel>{label}</InputLabel>
  43. <Select
  44. multiple
  45. value={displayValues}
  46. onChange={handleChange as any}
  47. renderValue={(selected) => (
  48. <Box sx={{ display: "flex", flexWrap: "wrap" }}>
  49. {(selected as number[]).map((value) => (
  50. <Chip
  51. key={value}
  52. label={options.find((item) => item.value == value)?.label ?? ""}
  53. sx={{ margin: 0.5 }}
  54. />
  55. ))}
  56. </Box>
  57. )}
  58. >
  59. {options.map((option) => (
  60. <MenuItem key={option.value} value={option.value}>
  61. <input
  62. type="checkbox"
  63. checked={displayValues.indexOf(option.value) > -1}
  64. readOnly
  65. />
  66. {option.label}
  67. </MenuItem>
  68. ))}
  69. </Select>
  70. </FormControl>
  71. );
  72. };
  73. export default MultiSelect;