"use client"; import { useMemo, useState } from "react"; import type { FormEvent, ReactNode } from "react"; import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, } from "@/components/ui/dialog"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; import type { User, UserPayload, UserRole } from "@/types/user"; const roles: Array<{ value: UserRole; label: string }> = [ { value: "admin", label: "Admin" }, { value: "manager", label: "Manager" }, { value: "user", label: "Benutzer" }, ]; const emptyForm: UserPayload = { first_name: "", last_name: "", username: "", email: "", role: "user", is_active: true, password: "", }; type Props = { open: boolean; user?: User | null; pending?: boolean; serverError?: string; onOpenChange: (open: boolean) => void; onSubmit: (payload: UserPayload) => Promise; }; export default function UserFormDialog({ open, user, pending = false, serverError, onOpenChange, onSubmit, }: Props) { const isEditing = Boolean(user); const initialForm = user ? { first_name: user.first_name, last_name: user.last_name, username: user.username, email: user.email, role: user.role, is_active: user.is_active, password: "", } : emptyForm; return ( {open && ( onOpenChange(false)} onSubmit={onSubmit} /> )} ); } function UserForm({ initialForm, isEditing, pending, serverError, onCancel, onSubmit, }: { initialForm: UserPayload; isEditing: boolean; pending: boolean; serverError?: string; onCancel: () => void; onSubmit: (payload: UserPayload) => Promise; }) { const [form, setForm] = useState(initialForm); const errors = useMemo(() => { return { username: form.username.trim().length < 3 ? "Mindestens 3 Zeichen" : "", email: /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(form.email) ? "" : "Gültige E-Mail erforderlich", password: !isEditing && (form.password?.length ?? 0) < 8 ? "Mindestens 8 Zeichen" : "", }; }, [form.email, form.password, form.username, isEditing]); const isValid = Object.values(errors).every((error) => !error); function updateField(key: K, value: UserPayload[K]) { setForm((current) => ({ ...current, [key]: value, })); } async function handleSubmit(event: FormEvent) { event.preventDefault(); if (!isValid) { return; } const payload = { ...form, password: form.password?.trim() || undefined, }; await onSubmit(payload); } return (
{isEditing ? "Benutzer bearbeiten" : "Benutzer erstellen"} Stammdaten, Rolle und Status des Benutzers verwalten.
updateField("first_name", event.target.value)} /> updateField("last_name", event.target.value)} /> updateField("username", event.target.value)} /> updateField("email", event.target.value)} /> updateField("password", event.target.value)} />
{serverError &&

{serverError}

}
); } function Field({ label, error, children, }: { label: string; error?: string; children: ReactNode; }) { return (
{children} {error &&

{error}

}
); }