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

@@ -5,11 +5,15 @@ import { useCallback } from 'react';
import Link from 'next/link';
import { useRouter, useSearchParams } from 'next/navigation';
import { Plus } from 'lucide-react';
import { Pencil, Plus } from 'lucide-react';
import { formatDate } from '@kit/shared/dates';
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 { deleteCompetition } from '../server/actions/fischerei-actions';
import { DeleteConfirmButton } from './delete-confirm-button';
interface CompetitionsDataTableProps {
data: Array<Record<string, unknown>>;
@@ -17,6 +21,7 @@ interface CompetitionsDataTableProps {
page: number;
pageSize: number;
account: string;
accountId: string;
}
export function CompetitionsDataTable({
@@ -25,11 +30,20 @@ export function CompetitionsDataTable({
page,
pageSize,
account,
accountId,
}: CompetitionsDataTableProps) {
const router = useRouter();
const searchParams = useSearchParams();
const totalPages = Math.max(1, Math.ceil(total / pageSize));
const { execute: executeDelete, isPending: isDeleting } = useActionWithToast(
deleteCompetition,
{
successMessage: 'Wettbewerb gelöscht',
onSuccess: () => router.refresh(),
},
);
const updateParams = useCallback(
(updates: Record<string, string>) => {
const params = new URLSearchParams(searchParams.toString());
@@ -95,6 +109,7 @@ export function CompetitionsDataTable({
<th className="p-3 text-right font-medium">
Max. Teilnehmer
</th>
<th className="p-3 text-right font-medium">Aktionen</th>
</tr>
</thead>
<tbody>
@@ -126,6 +141,34 @@ export function CompetitionsDataTable({
? String(comp.max_participants)
: '—'}
</td>
<td className="p-3 text-right">
<div className="flex items-center justify-end gap-1">
<Button
variant="ghost"
size="sm"
data-test="competition-edit-btn"
onClick={(e) => {
e.stopPropagation();
router.push(
`/home/${account}/fischerei/competitions/${String(comp.id)}`,
);
}}
>
<Pencil className="h-4 w-4" />
</Button>
<DeleteConfirmButton
title="Wettbewerb löschen"
description="Möchten Sie diesen Wettbewerb wirklich löschen? Diese Aktion kann nicht rückgängig gemacht werden."
isPending={isDeleting}
onConfirm={() =>
executeDelete({
competitionId: String(comp.id),
accountId,
})
}
/>
</div>
</td>
</tr>
);
})}