import { createFileRoute, useNavigate } from '@tanstack/react-router'; import * as React from 'react'; import { Search, Pencil, Trash2, Plus } from 'lucide-react'; import { AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogTitle, Button, Card, CardContent, CardHeader, Checkbox, Input, } from '@imphnen-frontend-service/ui/atoms'; import { DataTable, BackofficeWrapper, } from '@imphnen-frontend-service/ui/organisms'; import { ColumnDef, getCoreRowModel, getPaginationRowModel, PaginationState, RowSelectionState, useReactTable, } from '@tanstack/react-table'; import { useTestimonialList, useDeleteTestimonial, TTestimonialsListItem, } from '@imphnen-frontend-service/service'; import { toast } from 'sonner'; export const Route = createFileRoute('/_authenticated/cms-testimonials')({ component: CmsTestimonialsPage, }); function CmsTestimonialsPage() { const navigate = useNavigate(); const [search, setSearch] = React.useState(''); const [deleteId, setDeleteId] = React.useState(null); const [pagination, setPagination] = React.useState({ pageIndex: 0, pageSize: 10, }); const [rowSelection, setRowSelection] = React.useState({}); const { data: testimonialsData, isLoading } = useTestimonialList({ search, page: pagination.pageIndex + 1, per_page: pagination.pageSize, }); const deleteTestimonial = useDeleteTestimonial(); const testimonials: TTestimonialsListItem[] = testimonialsData?.data ?? []; const totalItems = testimonialsData?.meta?.total ?? testimonials.length; const handleDelete = async (id: string) => { try { await deleteTestimonial.mutateAsync(id); toast.success('Data testimonial berhasil dihapus'); setDeleteId(null); } catch (error) { console.log(error); toast.error('Data testimonial gagal dihapus'); } }; const columns: ColumnDef[] = [ { id: 'select', header: ({ table }) => ( table.toggleAllRowsSelected(!!v && v !== 'indeterminate') } /> ), cell: ({ row }) => ( row.toggleSelected(!!v)} /> ), }, { header: 'User', accessorKey: 'user_fullname' }, { header: 'Role', accessorKey: 'role' }, { header: 'Content', accessorKey: 'content', cell: ({ row }) => { const content = row.original.content; return content.length > 80 ? `${content.substring(0, 80)}…` : content; }, }, { header: 'Created At', accessorKey: 'created_at', cell: ({ row }) => new Date(row.original.created_at).toLocaleDateString('id-ID', { day: 'numeric', month: 'short', year: 'numeric', }), }, { header: 'Action', cell: ({ row }) => (
), }, ]; const table = useReactTable({ data: testimonials, columns, state: { pagination, rowSelection }, enableRowSelection: true, onRowSelectionChange: setRowSelection, getCoreRowModel: getCoreRowModel(), getPaginationRowModel: getPaginationRowModel(), onPaginationChange: setPagination, pageCount: Math.ceil(totalItems / pagination.pageSize), manualPagination: true, }); return (
setSearch(e.target.value)} />
{isLoading ? (
Memuat data…
) : ( setPagination((prev) => ({ ...prev, pageIndex: p - 1 })) } /> )}
!o && setDeleteId(null)} > Hapus testimonial ini? Tindakan ini tidak dapat dibatalkan. Testimonial akan dihapus permanen. Batal deleteId && handleDelete(deleteId)} className="bg-destructive text-destructive-foreground hover:bg-destructive/90" > Hapus
); }