"use client"; import React, { useEffect, useMemo, useState } from "react"; import { useDebouncedCallback } from "use-debounce"; import { SubmitButton } from "@/components/auth/SubmitButton"; import { LuCircleAlert, LuCircleArrowLeft, LuCircleArrowRight } from "react-icons/lu"; import { useRouter } from "next/navigation"; interface PesertaData { id: string; mahasiswa: { id: string; name: string; nim: string | null; semester: { id: string; name: string } | null; golongan: { id: string; name: string } | null; }; jadwal_kuliah: { id: string; mata_kuliah: { id: string; name: string }; ruangan: { id: string; name: string } | null; semester: { id: string; name: string }; golongans: { id: string; name: string }[]; }; } interface FilterOption { id: string; name: string; } interface PesertaKuliahTableProps { data: PesertaData[]; filters: { semesters: FilterOption[]; mataKuliahs: FilterOption[]; ruangans: FilterOption[]; }; prodiId: string; } export default function PesertaKuliahTable({ data, filters, prodiId }: PesertaKuliahTableProps) { const router = useRouter(); const [isModalOpen, setIsModalOpen] = useState(false); const [selectedPeserta, setSelectedPeserta] = useState(null); const [isLoading, setIsLoading] = useState(false); const [golonganOptions, setGolonganOptions] = useState([]); const [localFilters, setLocalFilters] = useState<{ semester?: string; golongan?: string; matkul?: string; ruangan?: string; search?: string; }>({ semester: "", golongan: "", matkul: "", ruangan: "", search: "", }); const ITEMS_PER_PAGE = 6; const [currentPage, setCurrentPage] = useState(1); useEffect(() => { if (!localFilters.semester) { setGolonganOptions([]); return; } const fetchGolongan = async () => { const res = await fetch(`/api/golongan?semesterId=${localFilters.semester}&prodiId=${prodiId}`); const data = await res.json(); setGolonganOptions(Array.isArray(data) ? data : []); }; fetchGolongan(); }, [localFilters.semester, prodiId]); const handleSearch = useDebouncedCallback((term: string) => { setLocalFilters((f) => ({ ...f, search: term || undefined })); setCurrentPage(1); }, 500); const handleOpenModal = (peserta: PesertaData) => { setSelectedPeserta(peserta); setIsModalOpen(true); }; const handleCloseModal = () => { setIsModalOpen(false); setSelectedPeserta(null); }; const handleConfirmDelete = async () => { if (!selectedPeserta) return; setIsLoading(true); try { const res = await fetch(`/api/peserta-kuliah/${selectedPeserta.id}`, { method: "DELETE" }); if (!res.ok) { const data = await res.json(); throw new Error(data.error || "Gagal menghapus peserta."); } router.push("/admin/manajemen-akademik/peserta-kuliah?peserta-kuliah=delete_success"); router.refresh(); handleCloseModal(); } catch (err) { if (err instanceof Error) alert(`Error: ${err.message}`); } finally { setIsLoading(false); } }; const filteredData = useMemo(() => { return data.filter((p) => { if (localFilters.semester && p.mahasiswa.semester?.id !== localFilters.semester) return false; if (localFilters.golongan && !p.jadwal_kuliah.golongans.some((g) => g.id === localFilters.golongan)) return false; if (localFilters.matkul && p.jadwal_kuliah.mata_kuliah.id !== localFilters.matkul) return false; if (localFilters.ruangan && p.jadwal_kuliah.ruangan?.id !== localFilters.ruangan) return false; if ( localFilters.search && !`${p.mahasiswa.name} ${p.mahasiswa.nim}`.toLowerCase().includes(localFilters.search.toLowerCase()) ) return false; return true; }); }, [data, localFilters]); const paginatedData = useMemo(() => { const start = (currentPage - 1) * ITEMS_PER_PAGE; return filteredData.slice(start, start + ITEMS_PER_PAGE); }, [filteredData, currentPage]); const totalPages = Math.max(1, Math.ceil(filteredData.length / ITEMS_PER_PAGE)); return (
handleSearch(e.target.value)} className="w-full bg-white dark:bg-neutral-950/50 text-black dark:text-gray-200 border border-gray-300 dark:border-neutral-800 rounded-md px-4 py-2 focus:outline-none text-sm" />
{/* Table */}
{paginatedData.length === 0 ? ( ) : ( paginatedData.map((p) => ( )) )}
Nama Mahasiswa NIM Semester/Gol Mata Kuliah Ruangan Aksi
Tidak ada peserta ditemukan.
{p.mahasiswa.name} {p.mahasiswa.nim} {p.mahasiswa.semester?.name || "-"} / {p.mahasiswa.golongan?.name || "-"} {p.jadwal_kuliah.mata_kuliah.name} {p.jadwal_kuliah.ruangan?.name || "-"} handleOpenModal(p)} className="bg-red-700 dark:bg-red-800/80 text-white px-4 py-2 rounded-md text-sm hover:bg-red-800 dark:hover:bg-red-950 transition-all" />
{/* Pagination */} {totalPages > 1 && (
Halaman {currentPage} dari {totalPages}
)} {/* Modal Konfirmasi Hapus */} {isModalOpen && (

Konfirmasi Hapus Peserta Kuliah

Yakin ingin menghapus :

{selectedPeserta?.mahasiswa.name} ({selectedPeserta?.mahasiswa.nim})

Pada Mata Kuliah:

{selectedPeserta?.jadwal_kuliah.mata_kuliah.name} ?

)}
); }