diff --git a/src/components/pages/purchase/PurchaseFilterModal.tsx b/src/components/pages/purchase/PurchaseFilterModal.tsx index bcb80fe6..856f2074 100644 --- a/src/components/pages/purchase/PurchaseFilterModal.tsx +++ b/src/components/pages/purchase/PurchaseFilterModal.tsx @@ -1,6 +1,6 @@ 'use client'; -import { RefObject, useState, useEffect, useMemo } from 'react'; +import { RefObject, useState, useEffect, useMemo, useCallback } from 'react'; import { useFormik } from 'formik'; import toast from 'react-hot-toast'; @@ -26,22 +26,32 @@ import { isResponseSuccess } from '@/lib/api-helper'; interface PurchaseFilterModalProps { ref: RefObject; + initialValues?: { + poDate: string; + category: OptionType[]; + status: OptionType[]; + supplier: OptionType | null; + area: OptionType | null; + location: OptionType | null; + project_flock: OptionType | null; + project_flock_kandang: OptionType | null; + }; onSubmit?: (values: PurchaseFilter) => void; onReset?: () => void; } const PurchaseFilterModal = ({ ref, + initialValues, onSubmit, onReset, }: PurchaseFilterModalProps) => { - const closeModalHandler = () => { + const closeModalHandler = useCallback(() => { ref.current?.close(); - }; + }, [ref]); // ===== DATE ERROR STATE ===== const [dateErrorShown, setDateErrorShown] = useState(false); - const [hasDateError, setHasDateError] = useState(false); // ===== CLEANUP TOAST ON UNMOUNT ===== useEffect(() => { @@ -81,8 +91,12 @@ const PurchaseFilterModal = ({ 'search' ); - const [selectedAreaId, setSelectedAreaId] = useState(''); - const [selectedLocationId, setSelectedLocationId] = useState(''); + const [selectedAreaId, setSelectedAreaId] = useState( + initialValues?.area?.value ? String(initialValues.area.value) : '' + ); + const [selectedLocationId, setSelectedLocationId] = useState( + initialValues?.location?.value ? String(initialValues.location.value) : '' + ); const { setInputValue: setSupplierInputValue, @@ -133,7 +147,8 @@ const PurchaseFilterModal = ({ project_flock: OptionType | null; project_flock_kandang: OptionType | null; }>({ - initialValues: { + // enableReinitialize: true, + initialValues: initialValues || { poDate: '', category: [], status: [], @@ -147,12 +162,18 @@ const PurchaseFilterModal = ({ const formattedValues = { ...values, category: values.category.map((item) => String(item.value)), + category_labels: values.category, status: values.status.map((item) => String(item.value)), supplier_id: values.supplier?.value, + supplier_label: values.supplier?.label, area_id: values.area?.value, + area_label: values.area?.label, location_id: values.location?.value, + location_label: values.location?.label, project_flock_id: values.project_flock?.value, + project_flock_label: values.project_flock?.label, project_flock_kandang_id: values.project_flock_kandang?.value, + project_flock_kandang_label: values.project_flock_kandang?.label, }; onSubmit?.(formattedValues); @@ -166,6 +187,17 @@ const PurchaseFilterModal = ({ }, }); + const { resetForm, submitForm } = formik; + + useEffect(() => { + setSelectedAreaId( + initialValues?.area?.value ? String(initialValues.area.value) : '' + ); + setSelectedLocationId( + initialValues?.location?.value ? String(initialValues.location.value) : '' + ); + }, [initialValues?.area, initialValues?.location]); + const projectFlockKandangOptions = useMemo(() => { if ( !formik.values.project_flock || @@ -197,6 +229,29 @@ const PurchaseFilterModal = ({ formik.setFieldValue('status', val); }; + const formikResetHandler = useCallback(() => { + resetForm({ + values: { + poDate: '', + category: [], + status: [], + supplier: null, + area: null, + location: null, + project_flock: null, + project_flock_kandang: null, + }, + }); + setSelectedAreaId(''); + setSelectedLocationId(''); + onReset?.(); + closeModalHandler(); + }, [resetForm, onReset, closeModalHandler]); + + const formikSubmitHandler = useCallback(async () => { + await submitForm(); + }, [submitForm]); + return (
{/* Modal Header */} @@ -220,7 +275,9 @@ const PurchaseFilterModal = ({ type='button' variant='ghost' color='none' - onClick={closeModalHandler} + onClick={() => { + closeModalHandler(); + }} className='p-0 text-base-content/50 hover:text-base-content' > @@ -377,7 +434,8 @@ const PurchaseFilterModal = ({