"use client"; import { InventoryLotLineResult, InventoryResult } from "@/app/api/inventory"; import { useTranslation } from "react-i18next"; import SearchBox, { Criterion } from "../SearchBox"; import { useCallback, useEffect, useMemo, useState } from "react"; import { orderBy, uniq, uniqBy } from "lodash"; import SearchResults, { Column } from "../SearchResults"; import { CheckCircleOutline, DoDisturb } from "@mui/icons-material"; import InventoryTable from "./InventoryTable"; import { defaultPagingController } from "../SearchResults/SearchResults"; import InventoryLotLineTable from "./InventoryLotLineTable"; import { SearchInventory, SearchInventoryLotLine, fetchInventories, fetchInventoryLotLines } from "@/app/api/inventory/actions"; interface Props { inventories: InventoryResult[]; } type SearchQuery = Partial< Omit< InventoryResult, | "id" | "qty" | "uomCode" | "uomUdfudesc" | "germPerSmallestUnit" | "qtyPerSmallestUnit" | "itemSmallestUnit" | "price" | "description" | "category" > >; type SearchParamNames = keyof SearchQuery; const InventorySearch: React.FC = ({ inventories }) => { const { t } = useTranslation(["inventory", "common"]); // Inventory const [filteredInventories, setFilteredInventories] = useState([]); const [inventoriesPagingController, setInventoriesPagingController] = useState(defaultPagingController) const [inventoriesTotalCount, setInventoriesTotalCount] = useState(0) const [item, setItem] = useState(null) // Inventory Lot Line const [filteredInventoryLotLines, setFilteredInventoryLotLines] = useState([]); const [inventoryLotLinesPagingController, setInventoryLotLinesPagingController] = useState(defaultPagingController) const [inventoryLotLinesTotalCount, setInventoryLotLinesTotalCount] = useState(0) const [inputs, setInputs] = useState>({ itemId: "", itemCode: "", itemName: "", itemType: "", onHandQty: "", onHoldQty: "", unavailableQty: "", availableQty: "", currencyName: "", status: "", baseUom: "", }); const searchCriteria: Criterion[] = useMemo( () => [ { label: t("Code"), paramName: "itemCode", type: "text" }, { label: t("Name"), paramName: "itemName", type: "text" }, { label: t("Type"), paramName: "itemType", type: "select", options: uniq(inventories.map((i) => i.itemType)), }, // { // label: t("Status"), // paramName: "status", // type: "select", // options: uniq(inventories.map((i) => i.status)), // }, ], [t], ); const refetchInventoryData = useCallback(async ( query: Record, actionType: "reset" | "search" | "paging" ) => { const params: SearchInventory = { code: query?.itemCode ?? '', name: query?.itemName ?? '', type: query?.itemType.toLowerCase() === "all" ? '' : query?.itemType ?? '', pageNum: inventoriesPagingController.pageNum - 1, pageSize: inventoriesPagingController.pageSize } const response = await fetchInventories(params) if (response) { console.log(response) setInventoriesTotalCount(response.total); switch (actionType) { case "reset": case "search": setFilteredInventories(() => response.records); break; case "paging": setFilteredInventories((fi) => // orderBy( uniqBy([...fi, ...response.records], "id") // , ["id"], ["desc"]) ); } } }, [inventoriesPagingController, setInventoriesPagingController]) useEffect(() => { refetchInventoryData(inputs, "paging") }, [inventoriesPagingController]) const refetchInventoryLotLineData = useCallback(async ( itemId: number | null, actionType: "reset" | "search" | "paging" ) => { if (!itemId) { setItem(null) setInventoryLotLinesTotalCount(0); setFilteredInventoryLotLines([]) return } const params: SearchInventoryLotLine = { itemId: itemId, pageNum: inventoriesPagingController.pageNum - 1, pageSize: inventoriesPagingController.pageSize } const response = await fetchInventoryLotLines(params) if (response) { setInventoryLotLinesTotalCount(response.total); switch (actionType) { case "reset": case "search": setFilteredInventoryLotLines(() => response.records); break; case "paging": setFilteredInventoryLotLines((fi) => orderBy( uniqBy([...fi, ...response.records], "id"), ["id"], ["desc"] )); } } }, [inventoriesPagingController, setInventoriesPagingController]) useEffect(() => { refetchInventoryData(inputs, "paging") }, [inventoriesPagingController]) const onReset = useCallback(() => { refetchInventoryData(inputs, "reset"); refetchInventoryLotLineData(null, "reset"); // setFilteredInventories(inventories); }, []); const onInventoryRowClick = useCallback((item: InventoryResult) => { setItem(item) refetchInventoryLotLineData(item.itemId, "search") }, []) return ( <> { // console.log(query) // console.log(inventories) setInputs(() => query) refetchInventoryData(query, "search") // setFilteredInventories( // inventories.filter( // (i) => // i.itemCode.toLowerCase().includes(query.itemCode.toLowerCase()) && // i.itemName.toLowerCase().includes(query.itemName.toLowerCase()) && // (query.itemType == "All" || // i.itemType.toLowerCase().includes(query.itemType.toLowerCase())) && // (query.status == "All" || // i.status.toLowerCase().includes(query.status.toLowerCase())), // ), // ); }} onReset={onReset} /> ); }; export default InventorySearch;