'use client'; import Button from '@/components/Button'; import Card from '@/components/Card'; import { Icon } from '@iconify/react'; import ProductionLineChart from '@/components/pages/dashboard/chart/ProductionLineChart'; import StandardLineChart from '@/components/pages/dashboard/chart/StandardLineChart'; import EggWeightBarChart from '@/components/pages/dashboard/chart/EggWeightBarChart'; import FCRBarChart from '@/components/pages/dashboard/chart/FCRBarChart'; import ProductionStat from '@/components/pages/dashboard/chart/ProductionStat'; import Modal, { useModal } from '@/components/Modal'; import DateInput from '@/components/input/DateInput'; import SelectInput, { OptionType, useSelect, } from '@/components/input/SelectInput'; import { RadioGroup } from '@/components/input/RadioInput'; import { useState } from 'react'; import useSWR from 'swr'; import { DashboardApi } from '@/services/api/dashboard'; import { useFormik } from 'formik'; import dashboardProductionFilterSchema from '@/components/pages/dashboard/filter/DashboardProductionFilter.schema'; import { ProjectFlockApi } from '@/services/api/production'; import { ProductionStandardApi } from '@/services/api/master-data'; const DashboardProduction = () => { const filterModal = useModal(); const [selectedPeriod, setSelectedPeriod] = useState('daily'); const [selectedStandards, setSelectedStandards] = useState([ 'hen_day', 'hen_house', ]); const [endpointUrl, setEndpointUrl] = useState('/dashboard'); // ===== FETCH DATA ===== const { data: dashboardProductionResponse, isLoading: isLoadingDashboardProductionData, error: dashboardProductionError, } = useSWR(endpointUrl, () => DashboardApi.getDashboardProductionFetcher(endpointUrl) ); const dashboardProductionData = dashboardProductionResponse?.status === 'success' ? dashboardProductionResponse.data : undefined; // ===== SELECT ===== const { options: flockOptions, isLoadingOptions: isLoadingFlockOptions } = useSelect(ProjectFlockApi.basePath, 'id', 'flock_name', '', { limit: 'limit', category: 'LAYING', }); const { options: standardProductionOptions, isLoadingOptions: isLoadingStandardProductionOptions, } = useSelect(ProductionStandardApi.basePath, 'id', 'name', '', { limit: 'limit', }); // ===== FORMIK ===== const formik = useFormik({ initialValues: { startDate: '', endDate: '', flock: [] as OptionType[], standard_production_id: [] as OptionType[], standard_productions: [] as OptionType[], period: selectedPeriod, }, validationSchema: dashboardProductionFilterSchema, onSubmit: (values) => { console.log(values); // Build URL with query parameters const params = new URLSearchParams(); if (values.startDate) params.set('startDate', values.startDate); if (values.endDate) params.set('endDate', values.endDate); if (values.flock && values.flock.length > 0) { const flockIds = values.flock .map((f: OptionType) => f.value || f) .join(','); params.set('flock', flockIds); } if ( values.standard_production_id && values.standard_production_id.length > 0 ) { const standardIds = values.standard_production_id .map((s: OptionType) => s.value || s) .join(','); params.set('standard_production_id', standardIds); } if (selectedStandards.length > 0) { params.set('standards', selectedStandards.join(',')); } params.set('period', selectedPeriod); const newUrl = `/dashboard?${params.toString()}`; setEndpointUrl(newUrl); // Close modal after applying filter filterModal.closeModal(); }, }); const handleResetFilter = () => { formik.resetForm(); setSelectedPeriod('daily'); setSelectedStandards(['hen_day', 'hen_house']); setEndpointUrl('/dashboard'); }; if (isLoadingDashboardProductionData) { return (
); } return ( <>

Dashboard

{/* Dashboard Statistics */} {/* Charts Grid */}
{/* Production Line Chart */} {/* Standard Line Chart */} {/* Bar Charts Grid - 2 columns */}
{/* FCR Bar Chart */} {/* Egg Weight Bar Chart */}
{/* Modal Header */}

Filter Data

{/* Rentang Waktu */}
{/* Flock */}
formik.setFieldValue('flock', selected)} errorMessage={formik.errors.flock as string} options={flockOptions} isLoading={isLoadingFlockOptions} isMulti isError={ Boolean(formik.errors.flock) && Boolean(formik.touched.flock) } />
{/* Production */}
formik.setFieldValue('standard_production_id', selected) } errorMessage={formik.errors.standard_production_id as string} options={standardProductionOptions} isLoading={isLoadingStandardProductionOptions} isMulti isError={ Boolean(formik.errors.standard_production_id) && Boolean(formik.touched.standard_production_id) } />
{/* Standard */}
({ value: s, label: s === 'hen_day' ? 'Hen Day' : s === 'hen_house' ? 'Hen House' : s === 'uniformity' ? 'Uniformity' : s === 'egg_weight' ? 'Egg Weight' : 'Egg Mass', }))} options={[ { value: 'hen_day', label: 'Hen Day' }, { value: 'hen_house', label: 'Hen House' }, { value: 'uniformity', label: 'Uniformity' }, { value: 'egg_weight', label: 'Egg Weight' }, { value: 'egg_mass', label: 'Egg Mass' }, ]} isMulti onChange={(selected: OptionType | OptionType[] | null) => { const values = Array.isArray(selected) ? selected.map((item) => String(item.value)) : []; setSelectedStandards( values.length > 0 ? values : ['hen_day'] ); }} isError={ Boolean(formik.errors.standard_productions) && Boolean(formik.touched.standard_productions) } />
{/* Periode Perbandingan */}
{/* Action Buttons */}
); }; export default DashboardProduction;