'use client'; import { useState } from 'react'; import { Card, CardContent, CardHeader, CardTitle, } from '@/figma-make/components/base/card'; import { Label } from '@/figma-make/components/base/label'; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from '@/figma-make/components/base/select'; import { Badge } from '@/figma-make/components/base/badge'; import { Calendar as CalendarIcon, Users, AlertCircle, Info, } from 'lucide-react'; import { DateRangePicker } from '@/figma-make/components/base/date-range-picker'; import { BarChart, Bar, XAxis, YAxis, CartesianGrid, Tooltip, Legend, ResponsiveContainer, Cell, } from 'recharts'; import { toast } from 'sonner'; import useSWR from 'swr'; import { BaseApiResponse } from '@/types/api/api-general'; import { DailyChecklistSummary } from '@/types/api/daily-checklist/daily-checklist'; import { AxiosError } from 'axios'; import { httpClientFetcher, SWRHttpKey } from '@/services/http/client'; import { DailyChecklistApi } from '@/services/api/daily-checklist/daily-checklist'; import { KandangApi } from '@/services/api/master-data'; import { useSelect } from '@/components/input/SelectInput'; import { isResponseError, isResponseSuccess } from '@/lib/api-helper'; import { formatDate } from '@/lib/helper'; const KANDANG_COLORS = [ '#0069e0', // Blue (primary) '#10B981', // Green '#F59E0B', // Amber '#EF4444', // Red '#8B5CF6', // Violet '#EC4899', // Pink '#14B8A6', // Teal '#F97316', // Orange ]; const CATEGORY_LABELS: { [key: string]: string } = { pullet_open: 'Pullet Open', pullet_close: 'Pullet Close', produksi_open: 'Produksi Open', produksi_close: 'Produksi Close', }; export function Dashboard() { // Filters const [dateFrom, setDateFrom] = useState(''); const [dateTo, setDateTo] = useState(''); const [kandangFilter, setKandangFilter] = useState('ALL'); const [categoryFilter, setCategoryFilter] = useState('ALL'); const { data: summaryResponse, isLoading: isLoadingSummary, mutate: refreshSummary, } = useSWR< BaseApiResponse, AxiosError, SWRHttpKey >( dateFrom && dateTo ? `${DailyChecklistApi.basePath}/summary?date_from=${dateFrom}&date_to=${dateTo}&kandang_id=${kandangFilter === 'ALL' ? '' : kandangFilter}&category=${categoryFilter === 'ALL' ? '' : categoryFilter}` : '', httpClientFetcher ); const { options: kandangOptions, isLoadingOptions: isLoadingKandangs } = useSelect(KandangApi.basePath, 'id', 'name', 'search', { page: '1', limit: '100', }); const kandangColorMap: { [key: string]: string } = {}; (kandangOptions || []).forEach((k, index) => { kandangColorMap[k.value] = KANDANG_COLORS[index % KANDANG_COLORS.length]; }); const employeePerformance = isResponseSuccess(summaryResponse) ? summaryResponse.data?.tracking_abk.map((abk) => { return { ...abk, color: kandangColorMap[abk.kandang_id] || '#0069e0', }; }) : []; const chartData = employeePerformance?.map((emp) => ({ name: emp.employee_name, completed: emp.activity_done, remaining: emp.activity_left, total: emp.total_activity, color: emp.color, kandang: emp.kandang_name, })); const hasFilters = dateFrom && dateTo; if (summaryResponse && isResponseError(summaryResponse)) { toast.error('Gagal memuat data: ' + summaryResponse.message); } return (
{/* Page Title */}

Dashboard

Performance tracking per ABK

{/* Filters Card */} Filter
{ setDateFrom(from); setDateTo(to); }} />
{/* Performance Chart Card */}
Performance Overview - Aktivitas per ABK

Aktivitas yang telah diselesaikan vs total aktivitas di kategori

{!hasFilters ? ( // Empty state - no filters

Pilih Filter Terlebih Dahulu

Silakan pilih{' '} Tanggal Dari dan{' '} Tanggal Sampai untuk melihat performance ABK.

) : isLoadingSummary ? (
Memuat data...
) : employeePerformance && employeePerformance.length === 0 ? (

Tidak Ada Data

Tidak ada data aktivitas ABK pada periode yang dipilih.

) : ( { if (name === 'completed') return [value, 'Aktivitas Selesai']; if (name === 'remaining') return [value, 'Aktivitas Tersisa']; return [value, name]; }} /> { if (value === 'completed') return 'Aktivitas Selesai'; if (value === 'remaining') return 'Aktivitas Tersisa'; return value; }} /> {chartData?.map((entry, index) => ( ))} {chartData?.map((entry, index) => ( ))} )}
{/* Employee Tracking Table */} {hasFilters && employeePerformance && employeePerformance.length > 0 && ( Tracking ABK

Detail performance masing-masing ABK

{employeePerformance?.map((emp, index) => ( ))}
Nama ABK Kandang Total Aktivitas Aktivitas Selesai Aktivitas Tersisa Completion Rate Last Activity
{emp.employee_name} {emp.kandang_name} {emp.total_activity} {emp.activity_done} {emp.activity_left}
{emp.completion_rate}%
{formatDate(emp.last_activity, 'DD MMM YYYY')}
)}
); }