Volk aufloesen, Bienenstand deaktivieren, Benutzer deaktivieren und Webhook loeschen liefen bisher ohne jede Rueckfrage direkt auf Klick. Neue wiederverwendbare ConfirmDialog-Komponente erzwingt jetzt eine bewusste Bestaetigung. Zusaetzlich zeigen Volk/Bienenstand/Benutzer nach dem Aufloesen/Deaktivieren einen Reaktivieren-Button (nutzt die neuen Backend-Endpunkte), da diese Aktionen nie ein echtes Loeschen sind und ein versehentlicher Klick bisher nicht rueckgaengig zu machen war.
82 lines
2.0 KiB
TypeScript
82 lines
2.0 KiB
TypeScript
"use client";
|
|
|
|
import { useState } from "react";
|
|
import { Button, buttonVariants } from "@/components/ui/button";
|
|
import {
|
|
Dialog,
|
|
DialogContent,
|
|
DialogDescription,
|
|
DialogFooter,
|
|
DialogHeader,
|
|
DialogTitle,
|
|
} from "@/components/ui/dialog";
|
|
import { cn } from "@/lib/utils";
|
|
import type { VariantProps } from "class-variance-authority";
|
|
|
|
interface ConfirmDialogProps {
|
|
triggerLabel: string;
|
|
triggerVariant?: VariantProps<typeof buttonVariants>["variant"];
|
|
triggerSize?: VariantProps<typeof buttonVariants>["size"];
|
|
triggerClassName?: string;
|
|
triggerDisabled?: boolean;
|
|
title: string;
|
|
description: string;
|
|
confirmLabel: string;
|
|
destructive?: boolean;
|
|
onConfirm: () => void;
|
|
isPending?: boolean;
|
|
}
|
|
|
|
export function ConfirmDialog({
|
|
triggerLabel,
|
|
triggerVariant = "outline",
|
|
triggerSize = "default",
|
|
triggerClassName,
|
|
triggerDisabled,
|
|
title,
|
|
description,
|
|
confirmLabel,
|
|
destructive = true,
|
|
onConfirm,
|
|
isPending,
|
|
}: ConfirmDialogProps) {
|
|
const [open, setOpen] = useState(false);
|
|
|
|
return (
|
|
<Dialog open={open} onOpenChange={setOpen}>
|
|
<Button
|
|
type="button"
|
|
variant={triggerVariant}
|
|
size={triggerSize}
|
|
className={cn(triggerClassName)}
|
|
disabled={triggerDisabled}
|
|
onClick={() => setOpen(true)}
|
|
>
|
|
{triggerLabel}
|
|
</Button>
|
|
<DialogContent>
|
|
<DialogHeader>
|
|
<DialogTitle>{title}</DialogTitle>
|
|
<DialogDescription>{description}</DialogDescription>
|
|
</DialogHeader>
|
|
<DialogFooter>
|
|
<Button type="button" variant="outline" onClick={() => setOpen(false)}>
|
|
Abbrechen
|
|
</Button>
|
|
<Button
|
|
type="button"
|
|
variant={destructive ? "destructive" : "default"}
|
|
disabled={isPending}
|
|
onClick={() => {
|
|
onConfirm();
|
|
setOpen(false);
|
|
}}
|
|
>
|
|
{isPending ? "Wird ausgeführt…" : confirmLabel}
|
|
</Button>
|
|
</DialogFooter>
|
|
</DialogContent>
|
|
</Dialog>
|
|
);
|
|
}
|