FPSMS-frontend
Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.
 
 

108 строки
3.4 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 { groupBy, map, sortBy, sortedUniq, uniqBy, upperCase, upperFirst } from "lodash";
  9. interface Props {
  10. pickOrders: PickOrderResult[];
  11. }
  12. type SearchQuery = Partial<Omit<PickOrderResult,
  13. | "id"
  14. | "consoCode"
  15. | "completeDate">>
  16. type SearchParamNames = keyof SearchQuery;
  17. const PickOrderSearch: React.FC<Props> = ({
  18. pickOrders,
  19. }) => {
  20. const { t } = useTranslation("pickOrders");
  21. const [filteredPickOrders, setFilteredPickOrders] = useState(pickOrders)
  22. const searchCriteria: Criterion<SearchParamNames>[] = useMemo(() => [
  23. { label: t("Code"), paramName: "code", type: "text" },
  24. { label: t("Target Date From"), label2: t("Target Date To"), paramName: "targetDate", type: "dateRange" },
  25. {
  26. label: t("Type"), paramName: "type", type: "autocomplete",
  27. options: sortBy(
  28. uniqBy(pickOrders.map((po) => ({ value: po.type, label: t(upperCase(po.type)) })), "value"),
  29. "label").map((po) => (po))
  30. },
  31. {
  32. label: t("Status"), paramName: "status", type: "autocomplete",
  33. options: sortBy(
  34. uniqBy(pickOrders.map((po) => ({ value: po.status, label: t(upperFirst(po.status)) })), "value"),
  35. "label").map((po) => (po))
  36. },
  37. // {
  38. // label: t("Items"), paramName: "items", type: "autocomplete", multiple: true,
  39. // options: sortBy(
  40. // uniqBy(pickOrders.map((po) => po.items?.map((item) => ({ value: item.name, label: item.name, group: item.type }))), "value"),
  41. // "label")
  42. // },
  43. ], [t])
  44. const onReset = useCallback(() => {
  45. setFilteredPickOrders(pickOrders)
  46. }, [pickOrders])
  47. const columns = useMemo<Column<PickOrderResult>[]>(() => [
  48. {
  49. name: "code",
  50. label: t("Code"),
  51. },
  52. {
  53. name: "consoCode",
  54. label: t("Consolidated Code"),
  55. },
  56. {
  57. name: "type",
  58. label: t("type"),
  59. },
  60. {
  61. name: "items",
  62. label: t("Items"),
  63. renderCell: (params) => {
  64. return params.items?.map((i) => i.name).join(", ")
  65. }
  66. },
  67. {
  68. name: "releasedBy",
  69. label: t("Released By"),
  70. },
  71. {
  72. name: "status",
  73. label: t("Status"),
  74. },
  75. ], [t])
  76. return (
  77. <>
  78. <SearchBox
  79. criteria={searchCriteria}
  80. onSearch={(query) => {
  81. setFilteredPickOrders(
  82. pickOrders.filter(
  83. (po) =>
  84. po.code.toLowerCase().includes(query.code.toLowerCase())
  85. )
  86. )
  87. }}
  88. onReset={onReset}
  89. />
  90. <SearchResults<PickOrderResult> items={filteredPickOrders} columns={columns} pagingController={{
  91. pageNum: 0,
  92. pageSize: 0,
  93. totalCount: 0,
  94. }} />
  95. </>
  96. )
  97. }
  98. export default PickOrderSearch;