"use client"; import React, { useCallback, useEffect, useMemo, useState } from "react"; import SearchBox, { Criterion } from "../SearchBox"; import { ItemsResult } from "@/app/api/settings/item"; import SearchResults, { Column } from "../SearchResults"; import { EditNote } from "@mui/icons-material"; import { useRouter, useSearchParams } from "next/navigation"; import { GridDeleteIcon } from "@mui/x-data-grid"; import { TypeEnum } from "@/app/utils/typeEnum"; import axios from "axios"; import { BASE_API_URL, NEXT_PUBLIC_API_URL } from "@/config/api"; import { useTranslation } from "react-i18next"; import axiosInstance from "@/app/(main)/axios/axiosInstance"; import Qs from 'qs'; import EditableSearchResults from "@/components/SearchResults/EditableSearchResults"; // Make sure to import Qs import { ScheduleType } from "@/app/api/scheduling"; import { ProdScheduleResult, SearchProdSchedule, fetchProdSchedules } from "@/app/api/scheduling/actions"; import { defaultPagingController } from "../SearchResults/SearchResults"; import { arrayToDateString, decimalFormatter } from "@/app/utils/formatUtil"; import dayjs from "dayjs"; import { uniqBy } from "lodash"; // may need move to "index" or "actions" // type RecordStructure = { // id: number, // scheduledPeriod: string, // scheduledAt: string, // productCount: number, // }; type Props = { type: ScheduleType; // records: RecordStructure[]; defaultInputs: SearchProdSchedule; }; type SearchQuery = Partial>; type SearchParamNames = keyof SearchQuery; const DSOverview: React.FC = ({ type, defaultInputs }) => { const [filteredSchedules, setFilteredSchedules] = useState([]); const { t } = useTranslation("schedule"); const router = useRouter(); // const [filterObj, setFilterObj] = useState({}); // const [tempSelectedValue, setTempSelectedValue] = useState({}); const [pagingController, setPagingController] = useState(defaultPagingController) const [totalCount, setTotalCount] = useState(0) const [inputs, setInputs] = useState(defaultInputs) const typeOptions = [ { value: "detailed", label: t("Detailed") }, { value: "manual", label: t("Manual") }, ] const searchCriteria: Criterion[] = useMemo( () => { var searchCriteria: Criterion[] = [ { label: t("Schedule Period"), label2: t("Schedule Period To"), paramName: "schedulePeriod", type: "dateRange" }, { label: t("Production Date"), paramName: "scheduleAt", type: "date" }, { label: t("Product Count"), paramName: "totalEstProdCount", type: "text" }, { label: t("Type"), paramName: "types", type: "autocomplete", options: typeOptions }, ] return searchCriteria }, [t] ); // const onDetailClick = useCallback( // (item: ItemsResult) => { // router.push(`/settings/items/edit?id=${item.id}`); // }, // [router] // ); // const onDeleteClick = useCallback( // (item: ItemsResult) => {}, // [router] // ); const onDetailClick = (record: ProdScheduleResult) => { console.log("[debug] record", record); router.push(`/scheduling/detail/edit?id=${record.id}`); } const columns = useMemo[]>( () => [ { name: "id", label: t("Details"), onClick: (record) => onDetailClick(record), buttonIcon: , }, { name: "schedulePeriod", label: t("Demand Forecast Period"), renderCell: (params) => { return `${arrayToDateString(params.schedulePeriod)} - ${arrayToDateString(params.schedulePeriodTo)}` } }, { name: "scheduleAt", label: t("Production Date"), renderCell: (params) => { return arrayToDateString(params.scheduleAt) } }, { name: "totalEstProdCount", label: t("Product Count(s)"), headerAlign: "right", align: "right", renderCell: (params) => { return decimalFormatter.format(params.totalEstProdCount) } }, { name: "type", label: t("Type"), renderCell: (params) => { return t(params.type) } }, // { // name: "action", // label: t(""), // buttonIcon: , // onClick: onDeleteClick, // }, ], [filteredSchedules] ); const refetchData = useCallback(async (query: Record | SearchProdSchedule, actionType: "reset" | "search" | "paging") => { // console.log(query) const defaultTypes = ["detailed", "manual"] const convertedTypes = (query.types == undefined || typeof (query.types) == "string" ? query.types?.toLowerCase() == "all" ? defaultTypes : [query.types] : query.types.some((ele) => ele.toLowerCase() === "all") ? defaultTypes : query.types) as ScheduleType[]; console.log(convertedTypes) console.log(query.types) const params: SearchProdSchedule = { scheduleAt: dayjs(query?.scheduleAt).isValid() ? query?.scheduleAt : undefined, schedulePeriod: dayjs(query?.schedulePeriod).isValid() ? query?.schedulePeriod : undefined, schedulePeriodTo: dayjs(query?.schedulePeriodTo).isValid() ? query?.schedulePeriodTo : undefined, totalEstProdCount: query?.totalEstProdCount ? Number(query?.totalEstProdCount) : undefined, types: convertedTypes, pageNum: pagingController.pageNum - 1, pageSize: pagingController.pageSize } const response = await fetchProdSchedules(params) // console.log(response) if (response) { setTotalCount(response.total) switch (actionType) { case "reset": case "search": setFilteredSchedules(() => response.records) break; case "paging": setFilteredSchedules((fs) => uniqBy([...fs, ...response.records], "id")) break; } } }, [pagingController, setPagingController]) useEffect(() => { refetchData(inputs, "paging") }, [pagingController]) // useEffect(() => { // refetchData(filterObj); // }, [filterObj, pagingController.pageNum, pagingController.pageSize]); // const refetchData = async (filterObj: SearchQuery | null) => { // const authHeader = axiosInstance.defaults.headers['Authorization']; // if (!authHeader) { // return; // Exit the function if the token is not set // } // const params = { // pageNum: pagingController.pageNum, // pageSize: pagingController.pageSize, // ...filterObj, // ...tempSelectedValue, // } // try { // const response = await axiosInstance.get(`${NEXT_PUBLIC_API_URL}/items/getRecordByPage`, { // params, // paramsSerializer: (params) => { // return Qs.stringify(params, { arrayFormat: 'repeat' }); // }, // }); // //setFilteredItems(response.data.records); // setFilteredItems([ // { // id: 1, // scheduledPeriod: "2025-05-11 to 2025-05-17", // scheduledAt: "2025-05-07", // productCount: 13, // }, // { // id: 2, // scheduledPeriod: "2025-05-18 to 2025-05-24", // scheduledAt: "2025-05-14", // productCount: 15, // }, // { // id: 3, // scheduledPeriod: "2025-05-25 to 2025-05-31", // scheduledAt: "2025-05-21", // productCount: 13, // }, // ]) // setPagingController({ // ...pagingController, // totalCount: response.data.total // }) // return response; // Return the data from the response // } catch (error) { // console.error('Error fetching items:', error); // throw error; // Rethrow the error for further handling // } // }; const onReset = useCallback(() => { //setFilteredItems(items ?? []); // setFilterObj({}); // setTempSelectedValue({}); refetchData(inputs, "reset"); }, []); return ( <> { setInputs(() => ( { scheduleAt: query?.scheduleAt, schedulePeriod: query?.schedulePeriod, schedulePeriodTo: query?.schedulePeriodTo, totalEstProdCount: Number(query?.totalEstProdCount), types: query.types as unknown as ScheduleType[] } )) refetchData(query, "search") }} onReset={onReset} /> items={filteredSchedules} columns={columns} setPagingController={setPagingController} pagingController={pagingController} totalCount={totalCount} // isAutoPaging={false} // hasCollapse={false} /> ); }; export default DSOverview;