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

177 líneas
5.0 KiB

  1. "use client";
  2. import { PickOrderResult } from "@/app/api/pickorder";
  3. import { SearchParams } from "@/app/utils/fetchUtil";
  4. import { useCallback, useMemo, useState } from "react";
  5. import { useTranslation } from "react-i18next";
  6. import SearchBox, { Criterion } from "../SearchBox";
  7. import SearchResults, { Column } from "../SearchResults";
  8. import {
  9. flatten,
  10. groupBy,
  11. intersectionWith,
  12. isEmpty,
  13. map,
  14. sortBy,
  15. sortedUniq,
  16. uniqBy,
  17. upperCase,
  18. upperFirst,
  19. } from "lodash";
  20. import {
  21. arrayToDateString,
  22. arrayToDayjs,
  23. dateStringToDayjs,
  24. } from "@/app/utils/formatUtil";
  25. import dayjs from "dayjs";
  26. import { Button, Grid, Stack, Tab, Tabs, TabsProps } from "@mui/material";
  27. import PickOrders from "./PickOrders";
  28. import ConsolidatedPickOrders from "./ConsolidatedPickOrders";
  29. import { getServerI18n } from "@/i18n";
  30. interface Props {
  31. pickOrders: PickOrderResult[];
  32. }
  33. type SearchQuery = Partial<
  34. Omit<PickOrderResult, "id" | "consoCode" | "completeDate">
  35. >;
  36. type SearchParamNames = keyof SearchQuery;
  37. const PickOrderSearch: React.FC<Props> = ({
  38. pickOrders,
  39. }) => {
  40. const { t } = useTranslation("pickOrder");
  41. const [filteredPickOrders, setFilteredPickOrders] = useState(pickOrders);
  42. const [filterArgs, setFilterArgs] = useState<Record<string, any>>({});
  43. const [tabIndex, setTabIndex] = useState(0);
  44. const handleTabChange = useCallback<NonNullable<TabsProps["onChange"]>>(
  45. (_e, newValue) => {
  46. setTabIndex(newValue);
  47. },
  48. []
  49. );
  50. const searchCriteria: Criterion<SearchParamNames>[] = useMemo(
  51. () => [
  52. { label: t("Code"), paramName: "code", type: "text" },
  53. {
  54. label: t("Target Date From"),
  55. label2: t("Target Date To"),
  56. paramName: "targetDate",
  57. type: "dateRange",
  58. },
  59. {
  60. label: t("Type"),
  61. paramName: "type",
  62. type: "autocomplete",
  63. options: sortBy(
  64. uniqBy(
  65. pickOrders.map((po) => ({
  66. value: po.type,
  67. label: t(upperCase(po.type)),
  68. })),
  69. "value"
  70. ),
  71. "label"
  72. ),
  73. },
  74. {
  75. label: t("Status"),
  76. paramName: "status",
  77. type: "autocomplete",
  78. options: sortBy(
  79. uniqBy(
  80. pickOrders.map((po) => ({
  81. value: po.status,
  82. label: t(upperFirst(po.status)),
  83. })),
  84. "value"
  85. ),
  86. "label"
  87. ),
  88. },
  89. {
  90. label: t("Items"),
  91. paramName: "items",
  92. type: "autocomplete", // multiple: true,
  93. options: uniqBy(
  94. flatten(
  95. sortBy(
  96. pickOrders.map((po) =>
  97. po.items
  98. ? po.items.map((item) => ({
  99. value: item.name,
  100. label: item.name,
  101. // group: item.type
  102. }))
  103. : []
  104. ),
  105. "label"
  106. )
  107. ),
  108. "value"
  109. ),
  110. },
  111. ],
  112. [t]
  113. );
  114. const onReset = useCallback(() => {
  115. setFilteredPickOrders(pickOrders);
  116. }, [pickOrders]);
  117. return (
  118. <>
  119. <SearchBox
  120. criteria={searchCriteria}
  121. onSearch={(query) => {
  122. setFilterArgs({ ...query }); // modify later
  123. setFilteredPickOrders(
  124. pickOrders.filter((po) => {
  125. const poTargetDateStr = arrayToDayjs(po.targetDate);
  126. // console.log(intersectionWith(po.items?.map(item => item.name), query.items))
  127. return (
  128. po.code.toLowerCase().includes(query.code.toLowerCase()) &&
  129. (isEmpty(query.targetDate) ||
  130. poTargetDateStr.isSame(query.targetDate) ||
  131. poTargetDateStr.isAfter(query.targetDate)) &&
  132. (isEmpty(query.targetDateTo) ||
  133. poTargetDateStr.isSame(query.targetDateTo) ||
  134. poTargetDateStr.isBefore(query.targetDateTo)) &&
  135. (intersectionWith(["All"], query.items).length > 0 ||
  136. intersectionWith(
  137. po.items?.map((item) => item.name),
  138. query.items
  139. ).length > 0) &&
  140. (query.status.toLowerCase() == "all" ||
  141. po.status
  142. .toLowerCase()
  143. .includes(query.status.toLowerCase())) &&
  144. (query.type.toLowerCase() == "all" ||
  145. po.type.toLowerCase().includes(query.type.toLowerCase()))
  146. );
  147. })
  148. );
  149. }}
  150. onReset={onReset}
  151. />
  152. <Tabs value={tabIndex} onChange={handleTabChange} variant="scrollable">
  153. <Tab label={t("Pick Orders")} iconPosition="end" />
  154. <Tab label={t("Consolidated Pick Orders")} iconPosition="end" />
  155. </Tabs>
  156. {tabIndex === 0 && (
  157. <PickOrders
  158. filteredPickOrders={filteredPickOrders}
  159. filterArgs={filterArgs}
  160. />
  161. )}
  162. {tabIndex === 1 && <ConsolidatedPickOrders filterArgs={filterArgs} />}
  163. </>
  164. );
  165. };
  166. export default PickOrderSearch;