feat: add delete functionality for leases, catch books, and permits; implement newsletter update feature
Some checks failed
Workflow / ʦ TypeScript (push) Failing after 4m52s
Workflow / ⚫️ Test (push) Has been skipped

This commit is contained in:
T. Zehetbauer
2026-04-01 17:53:39 +02:00
parent c6b2824da8
commit 080ec1cb47
22 changed files with 798 additions and 210 deletions

View File

@@ -4,16 +4,19 @@ import { useCallback } from 'react';
import { useRouter, useSearchParams } from 'next/navigation';
import { Check } from 'lucide-react';
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<Record<string, unknown>>;
@@ -21,6 +24,7 @@ interface CatchBooksDataTableProps {
page: number;
pageSize: number;
account: string;
accountId: string;
}
const STATUS_OPTIONS = [
@@ -38,10 +42,19 @@ export function CatchBooksDataTable({
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));
@@ -146,6 +159,7 @@ export function CatchBooksDataTable({
<th className="p-3 text-right font-medium">Angeltage</th>
<th className="p-3 text-right font-medium">Fänge</th>
<th className="p-3 text-left font-medium">Status</th>
<th className="p-3 text-right font-medium">Aktionen</th>
</tr>
</thead>
<tbody>
@@ -190,6 +204,34 @@ export function CatchBooksDataTable({
{CATCH_BOOK_STATUS_LABELS[status] ?? status}
</Badge>
</td>
<td className="p-3 text-right">
<div className="flex items-center justify-end gap-1">
<Button
variant="ghost"
size="sm"
data-test="catchbook-edit-btn"
onClick={(e) => {
e.stopPropagation();
router.push(
`/home/${account}/fischerei/catch-books/${String(cb.id)}`,
);
}}
>
<Pencil className="h-4 w-4" />
</Button>
<DeleteConfirmButton
title="Fangbuch löschen"
description="Möchten Sie dieses Fangbuch wirklich löschen? Alle zugehörigen Fangeinträge werden ebenfalls gelöscht. Diese Aktion kann nicht rückgängig gemacht werden."
isPending={isDeleting}
onConfirm={() =>
executeDelete({
catchBookId: String(cb.id),
accountId,
})
}
/>
</div>
</td>
</tr>
);
})}