import React, { useState } from "react"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { Table, TableHeader, TableRow, TableHead, TableBody, TableCell, } from "@/components/ui/table"; import { useToast } from "@/hooks/use-toast"; import { Card, CardHeader, CardTitle, CardContent } from "@/components/ui/card"; import { Search, Plus, Pencil, Trash2, ChevronLeft, ChevronRight, AlertTriangle, Edit, FileText, } from "lucide-react"; import AuthenticatedLayout from "@/layouts/authenticated-layout"; import { Head, router } from "@inertiajs/react"; import { Toaster } from "@/components/ui/toaster"; import { HukumType } from "@/types/perusahaan"; import { AddHukumModal } from "@/components/modals/add-sanksi-hukum"; import { AddPenaatanModal } from "@/components/modals/add-penaatan-modal"; import { AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogTitle, } from "@/components/ui/alert-dialog"; interface HukumIndexProps { hukumData: HukumType[]; perusahaan: { PerusahaanId: number; NamaPerusahaan: string }[]; jenisSanksi: { JenisSanksiId: number; NamaJenisSanksi: string }[]; penaatan: { PenaatanId: number; NamaPenaatan: string }[]; } const ITEMS_PER_PAGE = 5; export default function HukumIndex({ hukumData = [], perusahaan = [], jenisSanksi = [], penaatan = [], }: HukumIndexProps) { const { toast } = useToast(); const [search, setSearch] = useState(""); const [filteredHukum, setFilteredHukum] = useState( hukumData || [] ); const [isDeleteModalOpen, setIsDeleteModalOpen] = useState(false); const [deletingData, setDeletingData] = useState(null); const [isDeleting, setIsDeleting] = useState(false); const [currentPage, setCurrentPage] = useState(1); const [isModalOpen, setIsModalOpen] = useState(false); const [isPenaatanModalOpen, setIsPenaatanModalOpen] = useState(false); const [editingData, setEditingData] = useState(null); const [selectedHukum, setSelectedHukum] = useState(null); // Pagination setup const totalPages = Math.ceil((filteredHukum?.length || 0) / ITEMS_PER_PAGE); const startIndex = (currentPage - 1) * ITEMS_PER_PAGE; const endIndex = startIndex + ITEMS_PER_PAGE; const currentItems = filteredHukum.slice(startIndex, endIndex); // Handle Search const handleSearch = (e: React.ChangeEvent) => { const keyword = e.target.value.toLowerCase(); setSearch(keyword); setFilteredHukum( hukumData.filter((hukum) => hukum.SanksiNumber.toLowerCase().includes(keyword) ) ); setCurrentPage(1); }; // Handle Open Modal (Add/Edit) const handleOpenModal = (data?: HukumType) => { setEditingData(data || null); setIsModalOpen(true); }; // Handle Delete Modal const handleDeleteModal = (data: HukumType) => { setDeletingData(data); setIsDeleteModalOpen(true); }; // Handle Open Modal for Penaatan const handleOpenPenaatanModal = (hukum: HukumType) => { setSelectedHukum(hukum); setIsPenaatanModalOpen(true); }; const handleDeleteConfirm = () => { if (!deletingData) return; setIsDeleting(true); router.delete(`/admin/hukum/${deletingData.HukumId}`, { preserveScroll: true, onSuccess: () => { // Update the local state by filtering out the deleted item setFilteredHukum((prev) => prev.filter((item) => item.HukumId !== deletingData.HukumId) ); toast({ title: "Berhasil", description: "Data berhasil dihapus", variant: "default", }); // Adjust page if necessary (if we're on the last page and it's now empty) const newTotalItems = filteredHukum.length - 1; const newTotalPages = Math.ceil(newTotalItems / ITEMS_PER_PAGE); if (currentPage > newTotalPages && newTotalPages > 0) { setCurrentPage(newTotalPages); } setIsDeleteModalOpen(false); setDeletingData(null); setIsDeleting(false); }, onError: (errors) => { console.error("Error deleting record:", errors); toast({ title: "Gagal", description: "Terjadi kesalahan saat menghapus data", variant: "destructive", }); setIsDeleting(false); }, onFinish: () => { // This will run regardless of success or error setIsDeleting(false); }, }); }; // Handle Success Callback const handleSuccess = () => { toast({ title: "Berhasil", description: editingData ? "Data berhasil diperbarui" : "Data berhasil ditambahkan", variant: "default", }); setIsModalOpen(false); setEditingData(null); }; console.log("hukumData", hukumData); return (
No Nama Perusahaan Jenis Sanksi Nomor SK Sanksi Tanggal Sanksi SK Sanksi Status Penaatan Nomor SK Penaatan Tanggal SK Penaatan SK Penaatan {currentItems?.length > 0 ? ( currentItems.map((hukum, index) => ( {startIndex + index + 1} {hukum.jenis_sanksi ?.NamaJenisSanksi || "-"} {hukum.SanksiNumber || "-"} {hukum.SanksiDate ? new Date( hukum.SanksiDate ).toLocaleDateString( "id-ID", { day: "2-digit", month: "long", year: "numeric", } ) : "-"} {hukum.SanksiFile ? ( ) : ( "-" )} {hukum.PenaatanNumber || "-"} {hukum.PenaatanDate ? new Date( hukum.PenaatanDate ).toLocaleDateString( "id-ID", { day: "2-digit", month: "long", year: "numeric", } ) : "-"} {hukum.PenaatanFile ? ( ) : ( "-" )} )) ) : ( Tidak ada data )}
{/* Pagination */}
{/* Modal for Adding/Editing Hukum */} setIsModalOpen(false)} onSuccess={handleSuccess} hukumtype={hukumData} perusahaan={perusahaan} penaatan={penaatan} jenisSanksi={jenisSanksi} editingData={editingData} /> {/* Modal for Updating Penaatan */} setIsPenaatanModalOpen(false)} onSuccess={() => { toast({ title: "Berhasil", description: "Penaatan diperbarui", variant: "default", }); setIsPenaatanModalOpen(false); }} editingData={selectedHukum} penaatan={penaatan} /> {/* Delete Confirmation Dialog */} Konfirmasi Hapus Apakah anda yakin ingin menghapus data sanksi untuk perusahaan{" "} {deletingData?.perusahaan?.NamaPerusahaan} ?
Tindakan ini tidak dapat dibatalkan.
Batal { e.preventDefault(); handleDeleteConfirm(); }} disabled={isDeleting} className="bg-red-600 hover:bg-red-700 text-white" > {isDeleting ? "Menghapus..." : "Hapus"}
); }