diff --git a/src/components/DetailedSchedule/DetailedScheduleSearchView.tsx b/src/components/DetailedSchedule/DetailedScheduleSearchView.tsx index 79832fd..2b53dd9 100644 --- a/src/components/DetailedSchedule/DetailedScheduleSearchView.tsx +++ b/src/components/DetailedSchedule/DetailedScheduleSearchView.tsx @@ -50,6 +50,7 @@ const DSOverview: React.FC = ({ type, defaultInputs }) => { >([]); const { t } = useTranslation("schedule"); const { setIsUploading } = useUploadContext(); + const today = dayjs().format("YYYY-MM-DD"); const router = useRouter(); // const [filterObj, setFilterObj] = useState({}); @@ -58,7 +59,10 @@ const DSOverview: React.FC = ({ type, defaultInputs }) => { defaultPagingController, ); const [totalCount, setTotalCount] = useState(0); - const [inputs, setInputs] = useState(defaultInputs); + const [inputs, setInputs] = useState({ + ...defaultInputs, + produceAt: dayjs().format("YYYY-MM-DD"), + }); const typeOptions = [ { value: "detailed", @@ -78,7 +82,7 @@ const DSOverview: React.FC = ({ type, defaultInputs }) => { // paramName: "schedulePeriod", // type: "dateRange", // }, - { label: t("Production Date"), paramName: "produceAt", type: "date" }, + { label: t("Production Date"), paramName: "produceAt", type: "date", defaultValue: dayjs().format("YYYY-MM-DD") }, //{ // label: t("Product Count"), // paramName: "totalEstProdCount", @@ -182,15 +186,6 @@ const DSOverview: React.FC = ({ type, defaultInputs }) => { produceAt: dayjs(query?.produceAt).isValid() ? query?.produceAt : 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, @@ -221,77 +216,24 @@ const DSOverview: React.FC = ({ type, defaultInputs }) => { 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(defaultInputs, "reset"); - }, []); + + const resetWithToday = { + ...defaultInputs, + produceAt: dayjs().format("YYYY-MM-DD"), + }; + setInputs(resetWithToday); // Update state + refetchData(resetWithToday, "reset"); // Fetch data + }, [defaultInputs, refetchData]); const testDetailedScheduleClick = useCallback(async () => { try { setIsUploading(true) const response = await testDetailedSchedule(inputs.scheduleAt) if (response) { - refetchData(inputs, "paging"); + //refetchData(inputs, "paging"); + setPagingController(prev => ({ ...prev, pageNum: 1 })); + refetchData(inputs, "search"); } } catch(e) { console.log(e) @@ -394,14 +336,14 @@ const DSOverview: React.FC = ({ type, defaultInputs }) => { { - setInputs(() => ({ - scheduleAt: query?.scheduleAt, - schedulePeriod: query?.schedulePeriod, - schedulePeriodTo: query?.schedulePeriodTo, + const updatedInputs = { + ...inputs, + produceAt: query?.produceAt, // Ensure this matches paramName in searchCriteria totalEstProdCount: Number(query?.totalEstProdCount), types: query.types as unknown as ScheduleType[], - })); - refetchData(query, "search"); + }; + setInputs(updatedInputs); + refetchData(updatedInputs, "search"); }} onReset={onReset} /> diff --git a/src/components/DetailedScheduleDetail/DetailInfoCard.tsx b/src/components/DetailedScheduleDetail/DetailInfoCard.tsx index 8ee780b..2471d6b 100644 --- a/src/components/DetailedScheduleDetail/DetailInfoCard.tsx +++ b/src/components/DetailedScheduleDetail/DetailInfoCard.tsx @@ -70,7 +70,7 @@ const DetailInfoCard: React.FC = ({ // {...register("scheduleAt", { // required: "Schedule At required!", // })} - defaultValue={`${arrayToDateString(getValues("scheduleAt"))}`} + defaultValue={`${arrayToDateString(getValues("produceAt"))}`} // defaultValue={details?.scheduledPeriod} disabled={!isEditing} // error={Boolean(errors.name)} diff --git a/src/components/DetailedScheduleDetail/DetailedScheduleDetailView.tsx b/src/components/DetailedScheduleDetail/DetailedScheduleDetailView.tsx index 1f82989..e41690d 100644 --- a/src/components/DetailedScheduleDetail/DetailedScheduleDetailView.tsx +++ b/src/components/DetailedScheduleDetail/DetailedScheduleDetailView.tsx @@ -163,36 +163,55 @@ const DetailedScheduleDetailView: React.FC = ({ }, [formProps, setIsUploading]) // --- NEW FUNCTION: GLOBAL RELEASE FOR THE ENTIRE SCHEDULE --- + // --- UPDATED FUNCTION: GLOBAL RELEASE WITH produceAt CHECK --- const onGlobalReleaseClick = useCallback(async () => { if (!scheduleId) { setServerError(t("Cannot release. Schedule ID is missing.")); return; } - // Optional: Add a confirmation dialog here before proceeding + // 1. Get the production date (produceAt) from the form values + const produceAtValue = getValues("produceAt"); + + if (produceAtValue) { + // Use standard JS Date comparison for YYYY-MM-DD + const today = new Date().toISOString().split('T')[0]; + + // Handle various potential formats (string or array from API) + let scheduleDate = ""; + if (Array.isArray(produceAtValue)) { + // If it's an array format [YYYY, MM, DD] common in Java backends + const [year, month, day] = produceAtValue; + scheduleDate = `${year}-${String(month).padStart(2, '0')}-${String(day).padStart(2, '0')}`; + } else { + scheduleDate = new Date(produceAtValue).toISOString().split('T')[0]; + } + + // 2. Alert and block if the date is not today + if (scheduleDate !== today) { + alert(t("Only schedules for today can be released.")); + return; + } + } setIsUploading(true); - setServerError(""); // Clear previous errors + setServerError(""); try { - // **IMPORTANT**: Ensure 'releaseProdSchedule' is implemented in your actions file - // to call the '/productionSchedule/detail/detailed/release' endpoint. const response = await releaseProdSchedule({ id: Number(scheduleId), - }) + }); - if (response) { - router.refresh(); + router.refresh(); } - } catch (e) { console.error(e); setServerError(t("An unexpected error occurred during global schedule release.")); } finally { setIsUploading(false); } - }, [scheduleId, setIsUploading, t, router]); + }, [scheduleId, setIsUploading, t, router, getValues]); // -------------------------------------------------------------------- const [tempValue, setTempValue] = useState(null)