From 3ce30115f8563a249024e1c388a20543a6979310 Mon Sep 17 00:00:00 2001 From: rstubryan Date: Fri, 9 Jan 2026 09:30:51 +0700 Subject: [PATCH] refactor(FE): Add validation and error messages to filter modal --- .../production/uniformity/UniformityTable.tsx | 177 +++++++++++++----- 1 file changed, 127 insertions(+), 50 deletions(-) diff --git a/src/components/pages/production/uniformity/UniformityTable.tsx b/src/components/pages/production/uniformity/UniformityTable.tsx index 9caa98a9..ff57a2ff 100644 --- a/src/components/pages/production/uniformity/UniformityTable.tsx +++ b/src/components/pages/production/uniformity/UniformityTable.tsx @@ -230,6 +230,7 @@ const UniformityTable = () => { const [filterStartDate, setFilterStartDate] = useState(''); const [filterEndDate, setFilterEndDate] = useState(''); const [projectFlockSearchValue, setProjectFlockSearchValue] = useState(''); + const [filterErrors, setFilterErrors] = useState>({}); const { setInputValue: setFilterLocationInputValue, @@ -423,9 +424,38 @@ const UniformityTable = () => { }, []); const handleApplyFilters = useCallback(() => { - setIsSubmitted(true); - filterModal.closeModal(); - }, [filterModal]); + const errors: Record = {}; + + if (!filterStartDate) { + errors.start_date = 'Tanggal mulai wajib diisi'; + } + if (!filterEndDate) { + errors.end_date = 'Tanggal akhir wajib diisi'; + } + if (!filterLocation) { + errors.location = 'Lokasi wajib dipilih'; + } + if (!filterProjectFlock) { + errors.project_flock = 'Project Flock wajib dipilih'; + } + if (!filterKandang) { + errors.kandang = 'Kandang wajib dipilih'; + } + + setFilterErrors(errors); + + if (Object.keys(errors).length === 0) { + setIsSubmitted(true); + filterModal.closeModal(); + } + }, [ + filterModal, + filterStartDate, + filterEndDate, + filterLocation, + filterProjectFlock, + filterKandang, + ]); const selectedRowIds = useMemo(() => { return Object.keys(rowSelection) @@ -1124,58 +1154,105 @@ const UniformityTable = () => {
- setFilterStartDate(e.target.value)} - className={{ wrapper: 'w-full' }} - /> +
+ { + setFilterStartDate(e.target.value); + setFilterErrors((prev) => ({ ...prev, start_date: '' })); + }} + className={{ wrapper: 'w-full' }} + /> + {filterErrors.start_date && ( +

+ {filterErrors.start_date} +

+ )} +
- setFilterEndDate(e.target.value)} - className={{ wrapper: 'w-full' }} - /> +
+ { + setFilterEndDate(e.target.value); + setFilterErrors((prev) => ({ ...prev, end_date: '' })); + }} + className={{ wrapper: 'w-full' }} + /> + {filterErrors.end_date && ( +

+ {filterErrors.end_date} +

+ )} +
- +
+ { + handleFilterLocationChange(value); + setFilterErrors((prev) => ({ ...prev, location: '' })); + }} + options={filterLocationOptions} + onInputChange={setFilterLocationInputValue} + isLoading={isLoadingFilterLocations} + className={{ wrapper: 'w-full' }} + /> + {filterErrors.location && ( +

+ {filterErrors.location} +

+ )} +
- +
+ { + handleFilterProjectFlockChange(value); + setFilterErrors((prev) => ({ ...prev, project_flock: '' })); + }} + options={filterProjectFlockOptions} + onInputChange={setProjectFlockSearchValue} + isLoading={isLoadingFilterProjectFlocks} + isDisabled={!filterLocation} + className={{ wrapper: 'w-full' }} + /> + {filterErrors.project_flock && ( +

+ {filterErrors.project_flock} +

+ )} +
- +
+ { + handleFilterKandangChange(value); + setFilterErrors((prev) => ({ ...prev, kandang: '' })); + }} + options={filterKandangOptions} + isDisabled={!filterProjectFlock} + className={{ wrapper: 'w-full' }} + /> + {filterErrors.kandang && ( +

+ {filterErrors.kandang} +

+ )} +
{/* Action Buttons */}