'use client'; import { useCallback } from 'react'; import { useRouter, useSearchParams } from 'next/navigation'; import { Pencil } from 'lucide-react'; import { Badge } from '@kit/ui/badge'; import { Button } from '@kit/ui/button'; import { Card, CardContent, CardHeader, CardTitle } from '@kit/ui/card'; import { useActionWithToast } from '@kit/ui/use-action-with-toast'; import { CATCH_BOOK_STATUS_LABELS, CATCH_BOOK_STATUS_COLORS, } from '../lib/fischerei-constants'; import { deleteCatchBook } from '../server/actions/fischerei-actions'; import { DeleteConfirmButton } from './delete-confirm-button'; interface CatchBooksDataTableProps { data: Array>; total: number; page: number; pageSize: number; account: string; accountId: string; } const STATUS_OPTIONS = [ { value: '', label: 'Alle Status' }, { value: 'offen', label: 'Offen' }, { value: 'eingereicht', label: 'Eingereicht' }, { value: 'geprueft', label: 'Geprüft' }, { value: 'akzeptiert', label: 'Akzeptiert' }, { value: 'abgelehnt', label: 'Abgelehnt' }, ] as const; export function CatchBooksDataTable({ data, total, page, pageSize, account, accountId, }: CatchBooksDataTableProps) { const router = useRouter(); const searchParams = useSearchParams(); const { execute: executeDelete, isPending: isDeleting } = useActionWithToast( deleteCatchBook, { successMessage: 'Fangbuch gelöscht', onSuccess: () => router.refresh(), }, ); const currentYear = searchParams.get('year') ?? ''; const currentStatus = searchParams.get('status') ?? ''; const totalPages = Math.max(1, Math.ceil(total / pageSize)); const updateParams = useCallback( (updates: Record) => { const params = new URLSearchParams(searchParams.toString()); for (const [key, value] of Object.entries(updates)) { if (value) { params.set(key, value); } else { params.delete(key); } } if (!('page' in updates)) params.delete('page'); router.push(`?${params.toString()}`); }, [router, searchParams], ); const handleYearChange = useCallback( (e: React.ChangeEvent) => { updateParams({ year: e.target.value }); }, [updateParams], ); const handleStatusChange = useCallback( (e: React.ChangeEvent) => { updateParams({ status: e.target.value }); }, [updateParams], ); const handlePageChange = useCallback( (newPage: number) => { updateParams({ page: String(newPage) }); }, [updateParams], ); // Build year options from current year going back 5 years const thisYear = new Date().getFullYear(); const yearOptions = Array.from({ length: 6 }, (_, i) => thisYear - i); return (
{/* Toolbar */}
{/* Table */} Fangbücher ({total}) {data.length === 0 ? (

Keine Fangbücher vorhanden

Es wurden noch keine Fangbücher angelegt.

) : (
{data.map((cb) => { const members = cb.members as Record< string, unknown > | null; const memberName = members ? `${String(members.first_name ?? '')} ${String(members.last_name ?? '')}`.trim() : String(cb.member_name ?? '—'); const status = String(cb.status ?? 'offen'); return ( router.push( `/home/${account}/fischerei/catch-books/${String(cb.id)}`, ) } > ); })}
Mitglied Jahr Angeltage Fänge Status Aktionen
{memberName} {String(cb.year)} {String(cb.fishing_days_count ?? 0)} {String(cb.total_fish_caught ?? 0)} {CATCH_BOOK_STATUS_LABELS[status] ?? status}
executeDelete({ catchBookId: String(cb.id), accountId, }) } />
)} {totalPages > 1 && (

Seite {page} von {totalPages} ({total} Einträge)

)}
); }