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.
 
 

145 rivejä
4.5 KiB

  1. "use client"
  2. import { SearchJoResult, SearchJoResultRequest, fetchJos } from "@/app/api/jo/actions";
  3. import React, { useCallback, useEffect, useMemo, useState } from "react";
  4. import { useTranslation } from "react-i18next";
  5. import { Criterion } from "../SearchBox";
  6. import SearchResults, { Column, defaultPagingController } from "../SearchResults/SearchResults";
  7. import { EditNote } from "@mui/icons-material";
  8. import { decimalFormatter, integerFormatter } from "@/app/utils/formatUtil";
  9. import { uniqBy, upperFirst } from "lodash";
  10. import SearchBox from "../SearchBox/SearchBox";
  11. import { useRouter } from "next/navigation";
  12. interface Props {
  13. defaultInputs: SearchJoResultRequest
  14. }
  15. type SearchQuery = Partial<Omit<SearchJoResult, "id">>;
  16. type SearchParamNames = keyof SearchQuery;
  17. const JoSearch: React.FC<Props> = ({ defaultInputs }) => {
  18. const { t } = useTranslation("jo");
  19. const router = useRouter()
  20. const [filteredJos, setFilteredJos] = useState<SearchJoResult[]>([]);
  21. const [inputs, setInputs] = useState(defaultInputs);
  22. const [pagingController, setPagingController] = useState(
  23. defaultPagingController
  24. )
  25. const [totalCount, setTotalCount] = useState(0)
  26. const searchCriteria: Criterion<SearchParamNames>[] = useMemo(() => [
  27. { label: t("Code"), paramName: "code", type: "text" },
  28. { label: t("Name"), paramName: "name", type: "text" },
  29. ], [t])
  30. const columns = useMemo<Column<SearchJoResult>[]>(
  31. () => [
  32. {
  33. name: "id",
  34. label: t("Details"),
  35. onClick: (record) => onDetailClick(record),
  36. buttonIcon: <EditNote />,
  37. },
  38. {
  39. name: "code",
  40. label: t("Code")
  41. },
  42. {
  43. name: "name",
  44. label: t("Name"),
  45. },
  46. {
  47. name: "reqQty",
  48. label: t("Req. Qty"),
  49. align: "right",
  50. headerAlign: "right",
  51. renderCell: (row) => {
  52. return integerFormatter.format(row.reqQty)
  53. }
  54. },
  55. {
  56. name: "uom",
  57. label: t("UoM"),
  58. align: "left",
  59. headerAlign: "left",
  60. renderCell: (row) => {
  61. return t(row.uom)
  62. }
  63. },
  64. {
  65. name: "status",
  66. label: t("Status"),
  67. renderCell: (row) => {
  68. return t(upperFirst(row.status))
  69. }
  70. }
  71. ], []
  72. )
  73. const refetchData = useCallback(async (
  74. query: Record<SearchParamNames, string> | SearchJoResultRequest,
  75. actionType: "reset" | "search" | "paging",
  76. ) => {
  77. const params: SearchJoResultRequest = {
  78. code: query.code,
  79. name: query.name,
  80. pageNum: pagingController.pageNum - 1,
  81. pageSize: pagingController.pageSize,
  82. }
  83. const response = await fetchJos(params)
  84. if (response) {
  85. setTotalCount(response.total);
  86. switch (actionType) {
  87. case "reset":
  88. case "search":
  89. setFilteredJos(() => response.records);
  90. break;
  91. case "paging":
  92. setFilteredJos((fs) =>
  93. uniqBy([...fs, ...response.records], "id"),
  94. );
  95. break;
  96. }
  97. }
  98. }, [pagingController, setPagingController])
  99. useEffect(() => {
  100. refetchData(inputs, "paging");
  101. }, [pagingController]);
  102. const onDetailClick = useCallback((record: SearchJoResult) => {
  103. router.push(`/jo/edit?id=${record.id}`)
  104. }, [])
  105. const onSearch = useCallback((query: Record<SearchParamNames, string>) => {
  106. setInputs(() => ({
  107. code: query.code,
  108. name: query.name
  109. }))
  110. refetchData(query, "search");
  111. }, [])
  112. const onReset = useCallback(() => {
  113. refetchData(defaultInputs, "paging");
  114. }, [])
  115. return <>
  116. <SearchBox
  117. criteria={searchCriteria}
  118. onSearch={onSearch}
  119. onReset={onReset}
  120. />
  121. <SearchResults<SearchJoResult>
  122. items={filteredJos}
  123. columns={columns}
  124. setPagingController={setPagingController}
  125. pagingController={pagingController}
  126. totalCount={totalCount}
  127. // isAutoPaging={false}
  128. />
  129. </>
  130. }
  131. export default JoSearch;