"use client"; import { PickOrderResult } from "@/app/api/pickorder"; import { SearchParams } from "@/app/utils/fetchUtil"; import { useCallback, useMemo, useState } from "react"; import { useTranslation } from "react-i18next"; import SearchBox, { Criterion } from "../SearchBox"; import SearchResults, { Column } from "../SearchResults"; import { flatten, groupBy, intersectionWith, isEmpty, map, sortBy, sortedUniq, uniqBy, upperCase, upperFirst, } from "lodash"; import { arrayToDateString, arrayToDayjs, dateStringToDayjs, } from "@/app/utils/formatUtil"; import dayjs from "dayjs"; import { Button, Grid, Stack, Tab, Tabs, TabsProps } from "@mui/material"; import PickOrders from "./PickOrders"; import ConsolidatedPickOrders from "./ConsolidatedPickOrders"; import { getServerI18n } from "@/i18n"; interface Props { pickOrders: PickOrderResult[]; } type SearchQuery = Partial< Omit >; type SearchParamNames = keyof SearchQuery; const PickOrderSearch: React.FC = ({ pickOrders, }) => { const { t } = useTranslation("pickOrder"); const [filteredPickOrders, setFilteredPickOrders] = useState(pickOrders); const [filterArgs, setFilterArgs] = useState>({}); const [tabIndex, setTabIndex] = useState(0); const handleTabChange = useCallback>( (_e, newValue) => { setTabIndex(newValue); }, [] ); const searchCriteria: Criterion[] = useMemo( () => [ { label: t("Code"), paramName: "code", type: "text" }, { label: t("Target Date From"), label2: t("Target Date To"), paramName: "targetDate", type: "dateRange", }, { label: t("Type"), paramName: "type", type: "autocomplete", options: sortBy( uniqBy( pickOrders.map((po) => ({ value: po.type, label: t(upperCase(po.type)), })), "value" ), "label" ), }, { label: t("Status"), paramName: "status", type: "autocomplete", options: sortBy( uniqBy( pickOrders.map((po) => ({ value: po.status, label: t(upperFirst(po.status)), })), "value" ), "label" ), }, { label: t("Items"), paramName: "items", type: "autocomplete", // multiple: true, options: uniqBy( flatten( sortBy( pickOrders.map((po) => po.items ? po.items.map((item) => ({ value: item.name, label: item.name, // group: item.type })) : [] ), "label" ) ), "value" ), }, ], [t] ); const onReset = useCallback(() => { setFilteredPickOrders(pickOrders); }, [pickOrders]); return ( <> { setFilterArgs({ ...query }); // modify later setFilteredPickOrders( pickOrders.filter((po) => { const poTargetDateStr = arrayToDayjs(po.targetDate); // console.log(intersectionWith(po.items?.map(item => item.name), query.items)) return ( po.code.toLowerCase().includes(query.code.toLowerCase()) && (isEmpty(query.targetDate) || poTargetDateStr.isSame(query.targetDate) || poTargetDateStr.isAfter(query.targetDate)) && (isEmpty(query.targetDateTo) || poTargetDateStr.isSame(query.targetDateTo) || poTargetDateStr.isBefore(query.targetDateTo)) && (intersectionWith(["All"], query.items).length > 0 || intersectionWith( po.items?.map((item) => item.name), query.items ).length > 0) && (query.status.toLowerCase() == "all" || po.status .toLowerCase() .includes(query.status.toLowerCase())) && (query.type.toLowerCase() == "all" || po.type.toLowerCase().includes(query.type.toLowerCase())) ); }) ); }} onReset={onReset} /> {tabIndex === 0 && ( )} {tabIndex === 1 && } ); }; export default PickOrderSearch;