FPSMS-frontend
Você não pode selecionar mais de 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.
 
 

79 linhas
2.1 KiB

  1. import { ItemCombo } from "@/app/api/settings/item/actions";
  2. import { Autocomplete, TextField } from "@mui/material";
  3. import { useCallback, useMemo } from "react";
  4. import { useTranslation } from "react-i18next";
  5. interface CommonProps {
  6. allItems: ItemCombo[];
  7. error?: boolean;
  8. }
  9. interface SingleAutocompleteProps extends CommonProps {
  10. value: number | string | undefined;
  11. onItemSelect: (itemId: number, uom: string, uomId: number) => void | Promise<void>;
  12. // multiple: false;
  13. }
  14. type Props = SingleAutocompleteProps;
  15. const ItemSelect: React.FC<Props> = ({
  16. allItems,
  17. value,
  18. error,
  19. onItemSelect
  20. }) => {
  21. const { t } = useTranslation("item");
  22. const filteredItems = useMemo(() => {
  23. return allItems
  24. }, [allItems])
  25. const options = useMemo(() => {
  26. return [
  27. {
  28. value: -1, // think think sin
  29. label: t("None"),
  30. uom: "",
  31. uomId: -1,
  32. group: "default",
  33. },
  34. ...filteredItems.map((i) => ({
  35. value: i.id as number,
  36. label: i.label,
  37. uom: i.uom,
  38. uomId: i.uomId,
  39. group: "existing",
  40. })),
  41. ];
  42. }, [t, filteredItems]);
  43. const currentValue = options.find((o) => o.value === value) || options[0];
  44. const onChange = useCallback(
  45. (
  46. event: React.SyntheticEvent,
  47. newValue: { value: number; uom: string; uomId: number; group: string } | { uom: string; uomId: number; value: number }[],
  48. ) => {
  49. const singleNewVal = newValue as {
  50. value: number;
  51. uom: string;
  52. uomId: number;
  53. group: string;
  54. };
  55. onItemSelect(singleNewVal.value, singleNewVal.uom, singleNewVal.uomId)
  56. }
  57. , [onItemSelect])
  58. return (
  59. <Autocomplete
  60. noOptionsText={t("No Item")}
  61. disableClearable
  62. fullWidth
  63. value={currentValue}
  64. onChange={onChange}
  65. getOptionLabel={(option) => option.label}
  66. options={options}
  67. renderInput={(params) => <TextField {...params} error={error} />}
  68. />
  69. );
  70. }
  71. export default ItemSelect