'use client'; import { useEffect, useState } from 'react'; import dynamic from 'next/dynamic'; import { ApexOptions } from 'apexcharts'; import { useTheme } from 'next-themes'; import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; import { Button } from "@/components/ui/button"; import { ExternalLink } from "lucide-react"; import Link from "next/link"; const Chart = dynamic(() => import('react-apexcharts'), { ssr: false }); interface KelompokKeahlianStatusData { tahun_angkatan: number; nama_kelompok: string; jumlah_mahasiswa: number; } interface Props { selectedYear: string; } interface KelompokKeahlianStatusChartProps extends Props { height?: string; showDetailButton?: boolean; } export default function KelompokKeahlianStatusChart({ selectedYear, height = "h-[300px] sm:h-[300px] md:h-[300px]", showDetailButton = true }: KelompokKeahlianStatusChartProps) { const { theme } = useTheme(); const [data, setData] = useState([]); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); useEffect(() => { const fetchData = async () => { try { setLoading(true); const response = await fetch( `/api/mahasiswa/kk-dashboard?tahun_angkatan=${selectedYear}` ); if (!response.ok) { throw new Error('Failed to fetch data'); } const result = await response.json(); const sortedData = result.sort((a: KelompokKeahlianStatusData, b: KelompokKeahlianStatusData) => a.nama_kelompok.localeCompare(b.nama_kelompok) ); setData(sortedData); } catch (err) { setError(err instanceof Error ? err.message : 'An error occurred'); } finally { setLoading(false); } }; fetchData(); }, [selectedYear]); // Get unique tahun_angkatan (series) const years = [...new Set(data.map(item => item.tahun_angkatan))].sort((a, b) => Number(a) - Number(b)); // Get unique kelompok keahlian (x axis) const kelompokList = [...new Set(data.map(item => item.nama_kelompok))]; // Process data for series const processSeriesData = () => { return kelompokList.map(kelompok => { const seriesData = years.map(tahun => { const found = data.find(item => item.tahun_angkatan === tahun && item.nama_kelompok === kelompok); return found ? found.jumlah_mahasiswa : 0; }); return { name: kelompok, data: seriesData }; }); }; const series = processSeriesData(); const chartOptions: ApexOptions = { chart: { type: 'bar', stacked: true, toolbar: { show: true, }, background: theme === 'dark' ? '#0F172B' : '#fff', }, plotOptions: { bar: { horizontal: true, columnWidth: '55%', }, }, dataLabels: { enabled: true, formatter: function (val: number, opts: any) { const seriesIndex = opts.seriesIndex; const dataPointIndex = opts.dataPointIndex; // Hitung total untuk tahun angkatan ini const allSeries = opts.w.config.series; let totalForYear = 0; allSeries.forEach((series: any) => { totalForYear += series.data[dataPointIndex] || 0; }); if (totalForYear === 0 || val === 0) return '0%'; const percentage = ((val / totalForYear) * 100).toFixed(0); return percentage + '%'; }, style: { fontSize: '12px', colors: [theme === 'dark' ? '#fff' : '#000'] } }, stroke: { show: true, width: 2, colors: ['transparent'], }, xaxis: { categories: years.map(y => y.toString()), title: { text: 'Jumlah Mahasiswa', style: { fontSize: '14px', fontWeight: 'bold', color: theme === 'dark' ? '#fff' : '#000' } }, labels: { style: { fontSize: '12px', colors: theme === 'dark' ? '#fff' : '#000' } } }, yaxis: { title: { text: 'Tahun Angkatan', style: { fontSize: '14px', fontWeight: 'bold', color: theme === 'dark' ? '#fff' : '#000' } }, labels: { style: { fontSize: '12px', colors: theme === 'dark' ? '#fff' : '#000' } }, }, fill: { opacity: 1, }, legend: { position: 'top', fontSize: '14px', markers: { size: 12, }, itemMargin: { horizontal: 10, }, labels: { colors: theme === 'dark' ? '#fff' : '#000' } }, colors: ['#008FFB', '#00E396', '#FEB019', '#FF4560', '#775DD0', '#8B5CF6', '#EC4899', '#06B6D4', '#F97316'], tooltip: { theme: theme === 'dark' ? 'dark' : 'light', shared: true, intersect: false, custom: function({ series, seriesIndex, dataPointIndex, w }: any) { const tahun = w.globals.labels[dataPointIndex]; // Hitung total untuk tahun ini let total = 0; series.forEach((seriesData: number[]) => { total += seriesData[dataPointIndex] || 0; }); const isDark = theme === 'dark'; let tooltipContent = `
Angkatan ${tahun}
`; // Tampilkan setiap kelompok keahlian w.config.series.forEach((seriesItem: any, index: number) => { const value = series[index][dataPointIndex] || 0; const color = w.config.colors[index]; tooltipContent += `
${seriesItem.name} ${value}
`; }); // Tampilkan total tooltipContent += `
Total ${total}
`; return tooltipContent; } } }; if (loading) { return ( Loading... ); } if (error) { return ( Error: {error} ); } if (data.length === 0) { return ( Tidak ada data yang tersedia ); } return (
Persentase Jumlah Mahasiswa Berdasarkan Kelompok Keahlian dan Tahun Angkatan {selectedYear !== 'all' ? ` Angkatan ${selectedYear}` : ''} {showDetailButton && ( )}
{typeof window !== 'undefined' && ( )}
); }