import type { PaginationState } from '@/components/data-table'; import { DataTable } from '@/components/data-table'; import { DeleteConfirmDialog } from '@/components/delete-confirm-dialog'; import { FileUploadField } from '@/components/file-upload-field'; 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 { Alert, AlertDescription, AlertTitle } from '@/components/ui/alert'; import { Button } from '@/components/ui/button'; import { Input } from '@/components/ui/input'; import { Label } from '@/components/ui/label'; import { Textarea } from '@/components/ui/textarea'; import { usePermissions } from '@/hooks/use-permissions'; import { useServerTable } from '@/hooks/use-server-table'; import { destroy, index as letterRequestIndex, store, update, update_status, } from '@/routes/admin/services/letter-requests'; import type { LetterRequest } from '@/types/letter-request'; import { LetterStatuses, LetterStatusLabels } from '@/types/letter-request'; import { Head, router } from '@inertiajs/react'; import { Info, Plus } from 'lucide-react'; import { useState } from 'react'; import { createLetterRequestColumns } from './columns'; type Props = { letterRequests: { data: LetterRequest[]; current_page: number; last_page: number; per_page: number; total: number; }; highlight?: number; filters: { status?: string; }; }; export default function LetterRequestIndex({ letterRequests, highlight, filters, }: Props) { const [createOpen, setCreateOpen] = useState(false); const [editing, setEditing] = useState(null); const [deleting, setDeleting] = useState(null); const [processing, setProcessing] = useState(null); const { hasPermission } = usePermissions(); const canCreate = hasPermission('create-letter-requests'); const canUpdate = hasPermission('update-letter-requests'); const canDelete = hasPermission('delete-letter-requests'); const canProcess = hasPermission('update-letter-requests-status'); const filterFields: FilterField[] = [ { key: 'status', label: 'Status', options: LetterStatuses.map((status) => ({ value: status, label: LetterStatusLabels[status], })), }, ]; const pagination: PaginationState = { current_page: letterRequests.current_page, last_page: letterRequests.last_page, per_page: letterRequests.per_page, total: letterRequests.total, }; const { search, handlePageChange, handlePerPageChange, handleSearchChange, applyFilters, } = useServerTable({ route: () => letterRequestIndex.url(), pagination, filters, }); function handleDelete() { if (!deleting) { return; } router.delete(destroy(deleting.id), { onSuccess: () => setDeleting(null), }); } function handleStatusChange(letterRequest: LetterRequest, status: string) { if (status === 'completed') { setProcessing(letterRequest); return; } router.patch( update_status.url(letterRequest.id), { status }, { preserveScroll: true }, ); } const columns = createLetterRequestColumns({ handleEdit: (letterRequest) => setEditing(letterRequest), handleDeleteClick: (letterRequest) => setDeleting(letterRequest), handleStatusChange, canUpdate, canDelete, canProcess, }); return ( <>
Menampilkan surat permohonan dari notifikasi.

) } actions={ canCreate && ( ) } /> { if (!open) { setEditing(null); } }} editing={editing} /> { if (!open) { setProcessing(null); } }} processing={processing} /> {canProcess && ( Ubah status permohonan Klik badge Status pada tabel untuk mengubah status permohonan secara langsung. )} } /> { if (!open) { setDeleting(null); } }} title="Hapus Surat Permohonan" description={(letterRequest) => `Apakah Anda yakin ingin menghapus permohonan "${letterRequest.letter_type}" milik "${letterRequest.user?.profile?.full_name ?? 'mahasiswa ini'}"? Tindakan ini tidak dapat dibatalkan.` } onConfirm={handleDelete} />
); } function LetterRequestFields({ errors, editing, }: { errors: Record; editing?: LetterRequest; }) { return ( <>