import { Head, router } from '@inertiajs/react'; import { format } from 'date-fns'; 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 { FormDialog } from '@/components/form-dialog'; import InputError from '@/components/input-error'; import { PageHeader } from '@/components/page-header'; import { Badge } from '@/components/ui/badge'; import { Button } from '@/components/ui/button'; import { Checkbox } from '@/components/ui/checkbox'; import { Dialog, DialogContent, DialogHeader, DialogTitle, } from '@/components/ui/dialog'; 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 { index as announcementIndex, destroy, store, update, } from '@/routes/admin/manage/announcements'; import type { Announcement } from '@/types/announcement'; import { AnnouncementTargetRoleLabels, AnnouncementTargetRoles, } from '@/types/announcement'; import { createAnnouncementColumns } from './columns'; type Props = { announcements: { data: Announcement[]; current_page: number; last_page: number; per_page: number; total: number; }; highlight?: number; }; export default function AnnouncementIndex({ announcements, highlight, }: Props) { const [createOpen, setCreateOpen] = useState(false); const [editing, setEditing] = useState(null); const [deleting, setDeleting] = useState(null); const [viewing, setViewing] = useState(null); const { hasPermission } = usePermissions(); const canCreate = hasPermission('create-announcements'); const canUpdate = hasPermission('update-announcements'); const canDelete = hasPermission('delete-announcements'); const pagination: PaginationState = { current_page: announcements.current_page, last_page: announcements.last_page, per_page: announcements.per_page, total: announcements.total, }; const { search, handlePageChange, handlePerPageChange, handleSearchChange } = useServerTable({ route: () => announcementIndex.url(), pagination, }); function handleDelete() { if (!deleting) { return; } router.delete(destroy(deleting.id), { onSuccess: () => setDeleting(null), }); } const columns = createAnnouncementColumns({ handleView: (announcement) => setViewing(announcement), handleEdit: (announcement) => setEditing(announcement), handleDeleteClick: (announcement) => setDeleting(announcement), canUpdate, canDelete, showTargetRoles: canCreate || canUpdate, }); return ( <>
Menampilkan pengumuman dari notifikasi.

) } actions={ canCreate && ( ) } /> { if (!open) { setEditing(null); } }} editing={editing} /> { if (!open) { setViewing(null); } }} announcement={viewing} /> { if (!open) { setDeleting(null); } }} title="Hapus Pengumuman" description={(announcement) => `Apakah Anda yakin ingin menghapus pengumuman "${announcement.title}"? Tindakan ini tidak dapat dibatalkan.` } onConfirm={handleDelete} />
); } function ViewDetailDialog({ open, onOpenChange, announcement, }: { open: boolean; onOpenChange: (open: boolean) => void; announcement: Announcement | null; }) { return ( Detail Pengumuman {announcement && (
Dibuat oleh{' '} {announcement.creator?.profile?.full_name ?? '-'}{' '} ·{' '} {format( new Date(announcement.created_at), 'd MMM yyyy, HH:mm', )}
{announcement.target_roles.map((role) => ( {AnnouncementTargetRoleLabels[role]} ))}

{announcement.title}

{announcement.content}

)}
); } function AnnouncementFields({ errors, editing, }: { errors: Record; editing?: Announcement; }) { return ( <>