From 62dc8235d408a167f236f3b08be32992611d2c54 Mon Sep 17 00:00:00 2001 From: rstubryan Date: Mon, 13 Apr 2026 14:37:23 +0700 Subject: [PATCH] refactor(FE-change-api): Refactor Kandang input handling in DashboardProduction --- .../pages/dashboard/DashboardProduction.tsx | 103 ++++++------------ 1 file changed, 31 insertions(+), 72 deletions(-) diff --git a/src/components/pages/dashboard/DashboardProduction.tsx b/src/components/pages/dashboard/DashboardProduction.tsx index 81254442..6b3dabbd 100644 --- a/src/components/pages/dashboard/DashboardProduction.tsx +++ b/src/components/pages/dashboard/DashboardProduction.tsx @@ -5,11 +5,14 @@ import { Icon } from '@iconify/react'; import Modal, { useModal } from '@/components/Modal'; import DateInput from '@/components/input/DateInput'; import { OptionType, useSelect } from '@/components/input/SelectInput'; -import { useState, useEffect, useRef, useCallback, useMemo } from 'react'; +import { useState, useEffect, useRef, useCallback } from 'react'; import useSWR from 'swr'; import { DashboardApi } from '@/services/api/dashboard'; import { useFormik } from 'formik'; -import { ProjectFlockApi } from '@/services/api/production'; +import { + ProjectFlockApi, + ProjectFlockKandangApi, +} from '@/services/api/production'; import { LocationApi } from '@/services/api/master-data'; import { generateDashboardPDF } from '@/components/pages/dashboard/export/DashboardPDF'; import { @@ -22,10 +25,7 @@ import DashboardExportCharts, { DashboardExportChartsRef, } from '@/components/pages/dashboard/export/DashboardExportCharts'; import { RadioGroup, RadioGroupItem } from '@/components/input/RadioInput'; -import { - DashboardFilter, - DashboardMeta, -} from '@/types/api/dashboard/dashboard'; +import { DashboardMeta } from '@/types/api/dashboard/dashboard'; import DashboardStats from '@/components/pages/dashboard/chart/DashboardStats'; import { isResponseSuccess } from '@/lib/api-helper'; import AlertErrorList from '@/components/helper/form/FormErrors'; @@ -43,6 +43,7 @@ import DashboardExportStats, { DashboardExportStatsRef, } from '@/components/pages/dashboard/export/DashboardExportStats'; import { ProjectFlock } from '@/types/api/production/project-flock'; +import { ProjectFlockKandang } from '@/types/api/production/project-flock-kandang'; // Helper function to normalize values to array const normalizeToArray = ( @@ -72,7 +73,6 @@ const DashboardProduction = () => { const [selectedLocationIds, setSelectedLocationIds] = useState( normalizeToArray(filterValues.location) ); - const [kandangInputValue, setRawKandangInputValue] = useState(''); const [exporting, setExporting] = useState(false); const allChartsRef = useRef(null); const allStatsRef = useRef(null); @@ -116,15 +116,13 @@ const DashboardProduction = () => { options: flockOptions, isLoadingOptions: isLoadingFlockOptions, loadMore: loadMoreFlock, - rawData: projectFlocksRawData, } = useSelect( ProjectFlockApi.basePath, 'id', 'flock_name', - '', + 'search', { - location_id: - selectedLocationIds.length > 0 ? selectedLocationIds.toString() : '', + location_id: selectedLocationIds ? selectedLocationIds.toString() : '', } ); @@ -165,66 +163,34 @@ const DashboardProduction = () => { const { resetForm } = formik; - const selectedFlockIds = useMemo( - () => normalizeToArray(formik.values.flock), - [formik.values.flock] - ); - - const derivedKandangOptions = useMemo(() => { - if (!isResponseSuccess(projectFlocksRawData)) return []; - - const availableProjectFlocks = projectFlocksRawData.data.filter( - (projectFlock) => - selectedFlockIds.length === 0 || - selectedFlockIds.includes(projectFlock.id) - ); - - const kandangMap = new Map>(); - - availableProjectFlocks.forEach((projectFlock) => { - projectFlock.kandangs?.forEach((kandang) => { - if (!kandangMap.has(kandang.id)) { - kandangMap.set(kandang.id, { - value: kandang.id, - label: kandang.name, - }); - } - }); - }); - - const normalizedSearch = kandangInputValue.trim().toLowerCase(); - const allOptions = Array.from(kandangMap.values()); - - if (!normalizedSearch) return allOptions; - - return allOptions.filter((option) => - option.label.toLowerCase().includes(normalizedSearch) - ); - }, [projectFlocksRawData, selectedFlockIds, kandangInputValue]); - - const kandangSelect = useMemo( - () => ({ - setInputValue: setRawKandangInputValue, - options: derivedKandangOptions, - isLoadingOptions: isLoadingFlockOptions, - loadMore: loadMoreFlock, - }), - [derivedKandangOptions, isLoadingFlockOptions, loadMoreFlock] - ); + const selectedLocationValues = normalizeToArray(formik.values.location); + const selectedFlockValues = normalizeToArray(formik.values.flock); const { setInputValue: setInputValueKandang, options: kandangOptions, isLoadingOptions: isLoadingKandangOptions, loadMore: loadMoreKandang, - } = kandangSelect; + } = useSelect( + ProjectFlockKandangApi.basePath, + 'kandang_id', + 'kandang.name', + 'search', + { + location_id: + selectedLocationValues.length > 0 + ? selectedLocationValues.toString() + : '', + project_flock_id: + selectedFlockValues.length > 0 ? selectedFlockValues.toString() : '', + } + ); const handleResetFilter = useCallback(() => { resetForm(); resetFilterValues(); // Clear stored filter values setAnalysisMode('OVERVIEW'); setSelectedLocationIds([]); - setRawKandangInputValue(''); filterModal.closeModal(); }, [filterModal, resetForm, resetFilterValues]); @@ -520,7 +486,6 @@ const DashboardProduction = () => { formik.setFieldValue('kandang', []); formik.setFieldValue('comparisonType', ''); setSelectedLocationIds([]); - setRawKandangInputValue(''); }} color='primary' className={{ @@ -592,7 +557,6 @@ const DashboardProduction = () => { // Reset dependent fields when location changes formik.setFieldValue('flock', []); formik.setFieldValue('kandang', []); - setRawKandangInputValue(''); }} errorMessage={formik.errors.location as string} options={locationOptions} @@ -625,7 +589,6 @@ const DashboardProduction = () => { // Reset dependent fields when location changes formik.setFieldValue('flock', []); formik.setFieldValue('kandang', []); - setRawKandangInputValue(''); }} errorMessage={formik.errors.location as string} options={locationOptions} @@ -662,11 +625,9 @@ const DashboardProduction = () => { | null | undefined } - onChange={(selected) => { - formik.setFieldValue('flock', selected); - formik.setFieldValue('kandang', []); - setInputValueKandang(''); - }} + onChange={(selected) => + formik.setFieldValue('flock', selected) + } errorMessage={formik.errors.flock as string} onInputChange={setInputValueFlock} onMenuScrollToBottom={loadMoreFlock} @@ -691,11 +652,9 @@ const DashboardProduction = () => { | null | undefined } - onChange={(selected) => { - formik.setFieldValue('flock', selected); - formik.setFieldValue('kandang', []); - setInputValueKandang(''); - }} + onChange={(selected) => + formik.setFieldValue('flock', selected) + } errorMessage={formik.errors.flock as string} onInputChange={setInputValueFlock} onMenuScrollToBottom={loadMoreFlock}