import { Head, router } from '@inertiajs/react'; import { Plus } from 'lucide-react'; import { useState } from 'react'; import type { PaginationState } from '@/components/data-table'; import { DataTable } from '@/components/data-table'; import { DeleteConfirmDialog } from '@/components/delete-confirm-dialog'; import type { FilterField } from '@/components/filter-dialog'; import { FilterDialog } from '@/components/filter-dialog'; import { FormDialog } from '@/components/form-dialog'; import InputError from '@/components/input-error'; import { PageHeader } from '@/components/page-header'; import { Button } from '@/components/ui/button'; import { Label } from '@/components/ui/label'; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from '@/components/ui/select'; import { useServerTable } from '@/hooks/use-server-table'; import { index as courseRegistrationIndex, destroy, store, update, } from '@/routes/admin/academic-classes/course-registrations'; import type { CourseRegistration, CourseRegistrationCourseClass, CourseRegistrationStudent, } from '@/types/course-registration'; import { RegistrationStatuses, RegistrationStatusLabels, } from '@/types/course-registration'; import { createCourseRegistrationColumns } from './columns'; type AcademicTermOption = { id: number; name: string; semester: string }; type LecturerOption = { id: number; lecturer_number: string; user: { profile: { full_name: string } | null } | null; }; type Props = { registrations: { data: CourseRegistration[]; current_page: number; last_page: number; per_page: number; total: number; }; students: CourseRegistrationStudent[]; academicTerms: AcademicTermOption[]; courseClasses: CourseRegistrationCourseClass[]; lecturers: LecturerOption[]; highlight?: number; filters: { status?: string; academic_term_id?: string; }; }; function studentLabel(student: CourseRegistrationStudent): string { return `${student.user?.profile?.full_name ?? 'N/A'} - ${student.student_number}`; } function courseClassLabel(courseClass: CourseRegistrationCourseClass): string { const course = courseClass.course; return `${course?.code ?? '-'} - ${course?.name ?? 'N/A'}`; } function lecturerLabel(lecturer: LecturerOption): string { return `${lecturer.user?.profile?.full_name ?? 'N/A'} - ${lecturer.lecturer_number}`; } export default function CourseRegistrationIndex({ registrations, students, academicTerms, courseClasses, lecturers, highlight, filters, }: Props) { const [createOpen, setCreateOpen] = useState(false); const [editing, setEditing] = useState(null); const [deleting, setDeleting] = useState(null); const filterFields: FilterField[] = [ { key: 'status', label: 'Status', options: RegistrationStatuses.map((status) => ({ value: status, label: RegistrationStatusLabels[status], })), }, { key: 'academic_term_id', label: 'Periode Akademik', options: academicTerms.map((term) => ({ value: String(term.id), label: term.name, })), }, ]; const pagination: PaginationState = { current_page: registrations.current_page, last_page: registrations.last_page, per_page: registrations.per_page, total: registrations.total, }; const { search, handlePageChange, handlePerPageChange, handleSearchChange, applyFilters, } = useServerTable({ route: () => courseRegistrationIndex.url(), pagination, filters, }); function handleDelete() { if (!deleting) { return; } router.delete(destroy(deleting.id), { onSuccess: () => setDeleting(null), }); } const columns = createCourseRegistrationColumns({ handleEdit: (registration) => setEditing(registration), handleDeleteClick: (registration) => setDeleting(registration), }); return ( <>
Menampilkan registrasi dari notifikasi.

) } actions={ } /> { if (!open) { setEditing(null); } }} editing={editing} students={students} academicTerms={academicTerms} courseClasses={courseClasses} lecturers={lecturers} /> } /> { if (!open) { setDeleting(null); } }} title="Hapus Registrasi" description={(registration) => `Apakah Anda yakin ingin menghapus registrasi KRS untuk "${registration.student?.user?.profile?.full_name ?? 'mahasiswa ini'}"? Tindakan ini tidak dapat dibatalkan.` } onConfirm={handleDelete} />
); } function RegistrationFields({ errors, editing, students, academicTerms, courseClasses, lecturers, }: { errors: Record; editing?: CourseRegistration; students: CourseRegistrationStudent[]; academicTerms: AcademicTermOption[]; courseClasses: CourseRegistrationCourseClass[]; lecturers: LecturerOption[]; }) { return ( <>
{!editing && }
{!editing && }
{!editing && }
); } function CreateForm({ open, onOpenChange, students, academicTerms, courseClasses, lecturers, }: { open: boolean; onOpenChange: (open: boolean) => void; students: CourseRegistrationStudent[]; academicTerms: AcademicTermOption[]; courseClasses: CourseRegistrationCourseClass[]; lecturers: LecturerOption[]; }) { return ( onOpenChange(false)} > {({ errors }) => (
)}
); } function EditForm({ open, onOpenChange, editing, students, academicTerms, courseClasses, lecturers, }: { open: boolean; onOpenChange: (open: boolean) => void; editing: CourseRegistration | null; students: CourseRegistrationStudent[]; academicTerms: AcademicTermOption[]; courseClasses: CourseRegistrationCourseClass[]; lecturers: LecturerOption[]; }) { return ( onOpenChange(false)} > {({ errors }) => editing && (
) }
); }