diff --git a/app/api/mahasiswa/total/route.ts b/app/api/mahasiswa/total/route.ts
index 0d68841..c0985b4 100644
--- a/app/api/mahasiswa/total/route.ts
+++ b/app/api/mahasiswa/total/route.ts
@@ -29,78 +29,130 @@ export async function OPTIONS() {
});
}
-export async function GET() {
+export async function GET(request: Request) {
try {
+ // Ambil parameter tahun angkatan dari query string
+ const { searchParams } = new URL(request.url);
+ const tahunAngkatan = searchParams.get('tahun_angkatan');
+
// Jumlah mahasiswa
- const { count: totalMahasiswa } = await supabase
+ let totalMahasiswaQuery = supabase
.from('mahasiswa')
.select('*', { count: 'exact', head: true });
+ if (tahunAngkatan && tahunAngkatan !== 'all') {
+ totalMahasiswaQuery = totalMahasiswaQuery.eq('tahun_angkatan', parseInt(tahunAngkatan));
+ }
+ const { count: totalMahasiswa } = await totalMahasiswaQuery;
// Ambil mahasiswa aktif
- const { count: mahasiswaAktif } = await supabase
+ let mahasiswaAktifQuery = supabase
.from('mahasiswa')
.select('*', { count: 'exact', head: true })
.eq('status_kuliah', 'Aktif');
+ if (tahunAngkatan && tahunAngkatan !== 'all') {
+ mahasiswaAktifQuery = mahasiswaAktifQuery.eq('tahun_angkatan', parseInt(tahunAngkatan));
+ }
+ const { count: mahasiswaAktif } = await mahasiswaAktifQuery;
// Ambil total lulus
- const { count: totalLulus } = await supabase
+ let totalLulusQuery = supabase
.from('mahasiswa')
.select('*', { count: 'exact', head: true })
.eq('status_kuliah', 'Lulus');
+ if (tahunAngkatan && tahunAngkatan !== 'all') {
+ totalLulusQuery = totalLulusQuery.eq('tahun_angkatan', parseInt(tahunAngkatan));
+ }
+ const { count: totalLulus } = await totalLulusQuery;
// Ambil pria lulus
- const { count: priaLulus } = await supabase
+ let priaLulusQuery = supabase
.from('mahasiswa')
.select('*', { count: 'exact', head: true })
.eq('status_kuliah', 'Lulus')
.eq('jk', 'Pria');
+ if (tahunAngkatan && tahunAngkatan !== 'all') {
+ priaLulusQuery = priaLulusQuery.eq('tahun_angkatan', parseInt(tahunAngkatan));
+ }
+ const { count: priaLulus } = await priaLulusQuery;
// Ambil wanita lulus
- const { count: wanitaLulus } = await supabase
+ let wanitaLulusQuery = supabase
.from('mahasiswa')
.select('*', { count: 'exact', head: true })
.eq('status_kuliah', 'Lulus')
.eq('jk', 'Wanita');
+ if (tahunAngkatan && tahunAngkatan !== 'all') {
+ wanitaLulusQuery = wanitaLulusQuery.eq('tahun_angkatan', parseInt(tahunAngkatan));
+ }
+ const { count: wanitaLulus } = await wanitaLulusQuery;
// Ambil total berprestasi
- const { count: totalBerprestasi } = await supabase
+ let prestasiTotalQuery = supabase
.from('prestasi_mahasiswa')
- .select('*', { count: 'exact', head: true });
+ .select('*, mahasiswa!inner(tahun_angkatan)', { count: 'exact', head: true });
+ if (tahunAngkatan && tahunAngkatan !== 'all') {
+ prestasiTotalQuery = prestasiTotalQuery.eq('mahasiswa.tahun_angkatan', parseInt(tahunAngkatan));
+ }
+ const { count: totalBerprestasi } = await prestasiTotalQuery;
// Ambil prestasi akademik
- const { count: prestasiAkademik } = await supabase
+ let prestasiAkademikQuery = supabase
.from('prestasi_mahasiswa')
- .select('*', { count: 'exact', head: true })
+ .select('*, mahasiswa!inner(tahun_angkatan)', { count: 'exact', head: true })
.eq('jenis_prestasi', 'Akademik');
+ if (tahunAngkatan && tahunAngkatan !== 'all') {
+ prestasiAkademikQuery = prestasiAkademikQuery.eq('mahasiswa.tahun_angkatan', parseInt(tahunAngkatan));
+ }
+ const { count: prestasiAkademik } = await prestasiAkademikQuery;
// Ambil prestasi non-akademik
- const { count: prestasiNonAkademik } = await supabase
+ let prestasiNonAkademikQuery = supabase
.from('prestasi_mahasiswa')
- .select('*', { count: 'exact', head: true })
+ .select('*, mahasiswa!inner(tahun_angkatan)', { count: 'exact', head: true })
.eq('jenis_prestasi', 'Non-Akademik');
+ if (tahunAngkatan && tahunAngkatan !== 'all') {
+ prestasiNonAkademikQuery = prestasiNonAkademikQuery.eq('mahasiswa.tahun_angkatan', parseInt(tahunAngkatan));
+ }
+ const { count: prestasiNonAkademik } = await prestasiNonAkademikQuery;
// Ambil total mahasiswa aktif + lulus
- const { count: totalMahasiswaAktifLulus } = await supabase
+ let totalMahasiswaAktifLulusQuery = supabase
.from('mahasiswa')
.select('*', { count: 'exact', head: true })
.in('status_kuliah', ['Aktif', 'Lulus']);
+ if (tahunAngkatan && tahunAngkatan !== 'all') {
+ totalMahasiswaAktifLulusQuery = totalMahasiswaAktifLulusQuery.eq('tahun_angkatan', parseInt(tahunAngkatan));
+ }
+ const { count: totalMahasiswaAktifLulus } = await totalMahasiswaAktifLulusQuery;
// Total mahasiswa beasiswa
- const { count: totalMahasiswaBeasiswa } = await supabase
- .from('beasiswa_mahasiswa')
- .select('*', { count: 'exact', head: true });
+ let beasiswaTotalQuery = supabase
+ .from('beasiswa_mahasiswa')
+ .select('*, mahasiswa!inner(tahun_angkatan)', { count: 'exact', head: true });
+ if (tahunAngkatan && tahunAngkatan !== 'all') {
+ beasiswaTotalQuery = beasiswaTotalQuery.eq('mahasiswa.tahun_angkatan', parseInt(tahunAngkatan));
+ }
+ const { count: totalMahasiswaBeasiswa } = await beasiswaTotalQuery;
// Total mahasiswa beasiswa Pemerintah
- const { count: totalMahasiswaBeasiswaPemerintah } = await supabase
- .from('beasiswa_mahasiswa')
- .select('*', { count: 'exact', head: true })
- .eq('jenis_beasiswa', 'Pemerintah');
+ let beasiswaPemerintahQuery = supabase
+ .from('beasiswa_mahasiswa')
+ .select('*, mahasiswa!inner(tahun_angkatan)', { count: 'exact', head: true })
+ .eq('jenis_beasiswa', 'Pemerintah');
+ if (tahunAngkatan && tahunAngkatan !== 'all') {
+ beasiswaPemerintahQuery = beasiswaPemerintahQuery.eq('mahasiswa.tahun_angkatan', parseInt(tahunAngkatan));
+ }
+ const { count: totalMahasiswaBeasiswaPemerintah } = await beasiswaPemerintahQuery;
// Total mahasiswa beasiswa Non-Pemerintah
- const { count: totalMahasiswaBeasiswaNonPemerintah } = await supabase
- .from('beasiswa_mahasiswa')
- .select('*', { count: 'exact', head: true })
- .eq('jenis_beasiswa', 'Non-Pemerintah');
+ let beasiswaNonPemerintahQuery = supabase
+ .from('beasiswa_mahasiswa')
+ .select('*, mahasiswa!inner(tahun_angkatan)', { count: 'exact', head: true })
+ .eq('jenis_beasiswa', 'Non-Pemerintah');
+ if (tahunAngkatan && tahunAngkatan !== 'all') {
+ beasiswaNonPemerintahQuery = beasiswaNonPemerintahQuery.eq('mahasiswa.tahun_angkatan', parseInt(tahunAngkatan));
+ }
+ const { count: totalMahasiswaBeasiswaNonPemerintah } = await beasiswaNonPemerintahQuery;
const results: MahasiswaTotal = {
total_mahasiswa: totalMahasiswa || 0,
diff --git a/app/dashboard/page.tsx b/app/dashboard/page.tsx
index ec0230b..1c6bc18 100644
--- a/app/dashboard/page.tsx
+++ b/app/dashboard/page.tsx
@@ -32,11 +32,55 @@ import {
DropdownMenuTrigger,
} from "@/components/ui/dropdown-menu";
import { ChevronDown, Navigation, ArrowUp } from "lucide-react";
+import DashboardStats, { DashboardStatsSkeleton } from "@/components/dashboard/DashboardStats";
+
+interface MahasiswaTotal {
+ total_mahasiswa: number;
+ mahasiswa_aktif: number;
+ total_lulus: number;
+ pria_lulus: number;
+ wanita_lulus: number;
+ total_berprestasi: number;
+ prestasi_akademik: number;
+ prestasi_non_akademik: number;
+ total_mahasiswa_aktif_lulus: number;
+ total_mahasiswa_beasiswa: number;
+ total_mahasiswa_beasiswa_pemerintah: number;
+ total_mahasiswa_beasiswa_non_pemerintah: number;
+}
export default function TotalMahasiswaPage() {
const [selectedYear, setSelectedYear] = useState
Gagal memuat data statistik mahasiswa
+