FPSMS-frontend
Não pode escolher mais do que 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.
 
 

158 linhas
4.4 KiB

  1. "use client";
  2. import { useCallback, useEffect, useMemo, useState } from "react";
  3. import SearchBox, { Criterion } from "../SearchBox";
  4. import { EquipmentResult } from "@/app/api/settings/equipment";
  5. import { useTranslation } from "react-i18next";
  6. import SearchResults, { Column } from "../SearchResults";
  7. import { EditNote } from "@mui/icons-material";
  8. import { useRouter, useSearchParams } from "next/navigation";
  9. import { GridDeleteIcon } from "@mui/x-data-grid";
  10. import { TypeEnum } from "@/app/utils/typeEnum";
  11. import axios from "axios";
  12. import { BASE_API_URL, NEXT_PUBLIC_API_URL } from "@/config/api";
  13. import axiosInstance from "@/app/(main)/axios/axiosInstance";
  14. type Props = {
  15. equipments: EquipmentResult[];
  16. };
  17. type SearchQuery = Partial<Omit<EquipmentResult, "id">>;
  18. type SearchParamNames = keyof SearchQuery;
  19. const EquipmentSearch: React.FC<Props> = ({ equipments }) => {
  20. const [filteredEquipments, setFilteredEquipments] = useState<EquipmentResult[]>(equipments);
  21. const { t } = useTranslation("common");
  22. const router = useRouter();
  23. const [filterObj, setFilterObj] = useState({});
  24. const [pagingController, setPagingController] = useState({
  25. pageNum: 1,
  26. pageSize: 10,
  27. // totalCount: 0,
  28. });
  29. const [totalCount, setTotalCount] = useState(0)
  30. const searchCriteria: Criterion<SearchParamNames>[] = useMemo(() => {
  31. var searchCriteria: Criterion<SearchParamNames>[] = [
  32. { label: t("Code"), paramName: "code", type: "text" },
  33. { label: t("Description"), paramName: "description", type: "text" },
  34. ];
  35. return searchCriteria;
  36. }, [t, equipments]);
  37. const onDetailClick = useCallback(
  38. (equipment: EquipmentResult) => {
  39. router.push(`/settings/equipment/edit?id=${equipment.id}`);
  40. },
  41. [router]
  42. );
  43. const onDeleteClick = useCallback((equipment: EquipmentResult) => {}, [router]);
  44. const columns = useMemo<Column<EquipmentResult>[]>(
  45. () => [
  46. {
  47. name: "id",
  48. label: t("Details"),
  49. onClick: onDetailClick,
  50. buttonIcon: <EditNote />,
  51. },
  52. {
  53. name: "code",
  54. label: t("Code"),
  55. },
  56. {
  57. name: "description",
  58. label: t("Description"),
  59. },
  60. {
  61. name: "equipmentTypeId",
  62. label: t("Equipment Type"),
  63. },
  64. {
  65. name: "action",
  66. label: t(""),
  67. buttonIcon: <GridDeleteIcon />,
  68. onClick: onDeleteClick,
  69. },
  70. ],
  71. [filteredEquipments]
  72. );
  73. interface ApiResponse<T> {
  74. records: T[];
  75. total: number;
  76. }
  77. const refetchData = useCallback(
  78. async (filterObj: SearchQuery) => {
  79. const authHeader = axiosInstance.defaults.headers["Authorization"];
  80. if (!authHeader) {
  81. return;
  82. }
  83. const params = {
  84. pageNum: pagingController.pageNum,
  85. pageSize: pagingController.pageSize,
  86. ...filterObj,
  87. };
  88. try {
  89. const response = await axiosInstance.get<ApiResponse<EquipmentResult>>(
  90. `${NEXT_PUBLIC_API_URL}/Equipment/getRecordByPage`,
  91. { params }
  92. );
  93. console.log(response);
  94. if (response.status == 200) {
  95. setFilteredEquipments(response.data.records);
  96. setTotalCount(response.data.total);
  97. return response;
  98. } else {
  99. throw "400";
  100. }
  101. } catch (error) {
  102. console.error("Error fetching equipment types:", error);
  103. throw error;
  104. }
  105. },
  106. [axiosInstance, pagingController.pageNum, pagingController.pageSize]
  107. );
  108. useEffect(() => {
  109. refetchData(filterObj);
  110. }, [filterObj, pagingController.pageNum, pagingController.pageSize]);
  111. const onReset = useCallback(() => {
  112. setFilteredEquipments(equipments);
  113. }, [equipments]);
  114. return (
  115. <>
  116. <SearchBox
  117. criteria={searchCriteria}
  118. onSearch={(query) => {
  119. // setFilteredItems(
  120. // equipmentTypes.filter((pm) => {
  121. // return (
  122. // pm.code.toLowerCase().includes(query.code.toLowerCase()) &&
  123. // pm.name.toLowerCase().includes(query.name.toLowerCase())
  124. // );
  125. // })
  126. // );
  127. setFilterObj({
  128. ...query,
  129. });
  130. }}
  131. onReset={onReset}
  132. />
  133. <SearchResults<EquipmentResult>
  134. items={filteredEquipments}
  135. columns={columns}
  136. setPagingController={setPagingController}
  137. pagingController={pagingController}
  138. totalCount={totalCount}
  139. isAutoPaging={false}
  140. />
  141. </>
  142. );
  143. };
  144. export default EquipmentSearch;