'use client' import { useState, useRef, useEffect } from 'react' import { useRouter } from 'next/navigation' import { useForm } from 'react-hook-form' import { zodResolver } from '@hookform/resolvers/zod' import * as z from 'zod' import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, DialogTrigger, } from '@/components/ui/dialog' import { Form, FormControl, FormField, FormItem, FormLabel, FormMessage, } from '@/components/ui/form' import { Input } from '@/components/ui/input' import { Button } from '@/components/ui/button' import { createUser } from '@/lib/actions/users' import { createCompany } from '@/lib/actions/companies' import { Plus, Building2 } from 'lucide-react' const userSchema = z.object({ email: z.string().email('Ungültige E-Mail-Adresse'), role: z.enum(['admin', 'partner']), company_id: z.string().optional().or(z.literal('')), first_name: z.string().optional().or(z.literal('')), last_name: z.string().optional().or(z.literal('')), }).refine((data) => { if (data.role === 'partner' && !data.company_id) { return false } return true }, { message: 'Für Partner-Benutzer ist eine Firmenauswahl erforderlich.', path: ['company_id'], }) type UserFormValues = z.infer interface UserDialogProps { companies: { id: string; name: string }[] } export function UserDialog({ companies }: UserDialogProps) { const [open, setOpen] = useState(false) const [dropdownOpen, setDropdownOpen] = useState(false) const [search, setSearch] = useState('') const [localCompanies, setLocalCompanies] = useState<{ id: string; name: string }[]>(companies) const [showNewCompanyInput, setShowNewCompanyInput] = useState(false) const [newCompanyName, setNewCompanyName] = useState('') const [isCreatingCompany, setIsCreatingCompany] = useState(false) const dropdownRef = useRef(null) const router = useRouter() useEffect(() => { setLocalCompanies(companies) }, [companies]) useEffect(() => { function handleClickOutside(e: MouseEvent) { if (dropdownRef.current && !dropdownRef.current.contains(e.target as Node)) { setDropdownOpen(false) setSearch('') } } document.addEventListener('mousedown', handleClickOutside) return () => document.removeEventListener('mousedown', handleClickOutside) }, []) const form = useForm({ resolver: zodResolver(userSchema) as any, defaultValues: { email: '', role: 'partner', company_id: '', first_name: '', last_name: '', }, }) async function onSubmit(values: UserFormValues) { try { const payload = { email: values.email, role: values.role, company_id: values.company_id || undefined, first_name: values.first_name || undefined, last_name: values.last_name || undefined, } await createUser(payload) setOpen(false) form.reset() router.refresh() } catch (error) { console.error('Error creating user:', error) } } return ( { setOpen(val) if (!val) { form.reset() setDropdownOpen(false) setSearch('') setShowNewCompanyInput(false) setNewCompanyName('') } }}> Neuen Benutzer anlegen Geben Sie die E-Mail, die Rolle und optional die Firma für den neuen Benutzer ein. Nach der Erstellung erhält der Benutzer eine E-Mail zum Festlegen seines Passworts.
( E-Mail )} />
( Vorname )} /> ( Nachname )} />
( Rolle )} /> { const selectedCompany = localCompanies.find((c) => c.id === field.value) return ( Firma
{dropdownOpen && (
setSearch(e.target.value)} className="w-full text-xs bg-slate-50 dark:bg-white/5 border border-slate-200 dark:border-white/10 rounded px-2 py-1.5 text-slate-900 dark:text-slate-200 placeholder-slate-500 focus:outline-none focus:ring-1 focus:ring-primary/50" autoFocus />
{localCompanies .filter((c) => c.name.toLowerCase().includes(search.toLowerCase())) .map((c) => ( ))}
)}
{showNewCompanyInput ? (
setNewCompanyName(e.target.value)} className="bg-slate-50 dark:bg-white/5 border-slate-200 dark:border-white/10 text-slate-900 dark:text-white text-xs h-8 w-full" />
) : ( )}
) }} />
) }