// app/(app)/users/UsersHeaderClient.tsx 'use client'; import { useState, FormEvent } from 'react'; import { useRouter } from 'next/navigation'; import Modal from '@/components/ui/Modal'; import Button from '@/components/ui/Button'; import { PlusIcon } from '@heroicons/react/24/outline'; import UsersCsvImportButton from './UsersCsvImportButton'; type SimpleGroup = { id: string; name: string; }; type Props = { groups: SimpleGroup[]; }; export default function UsersHeaderClient({ groups }: Props) { const router = useRouter(); const [personModalOpen, setUserModalOpen] = useState(false); const [groupModalOpen, setGroupModalOpen] = useState(false); // User-Form State (angepasst an neues Schema) const [arbeitsname, setArbeitsname] = useState(''); const [firstName, setFirstName] = useState(''); const [lastName, setLastName] = useState(''); const [personGroupId, setUserGroupId] = useState<'none' | string>('none'); const [savingUser, setSavingUser] = useState(false); const [personError, setUserError] = useState(null); // Gruppen-Form State const [groupName, setGroupName] = useState(''); const [savingGroup, setSavingGroup] = useState(false); const [groupError, setGroupError] = useState(null); async function handleCreateUser(e: FormEvent) { e.preventDefault(); setSavingUser(true); setUserError(null); try { const res = await fetch('/api/users', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ arbeitsname, firstName, lastName, groupId: personGroupId === 'none' ? null : personGroupId, }), }); if (!res.ok) { const data = await res.json().catch(() => null); throw new Error( data?.error ?? `Fehler beim Anlegen (HTTP ${res.status})`, ); } setArbeitsname(''); setFirstName(''); setLastName(''); setUserGroupId('none'); setUserModalOpen(false); router.refresh(); } catch (err: any) { console.error('Error creating person', err); setUserError( err instanceof Error ? err.message : 'Fehler beim Anlegen der User.', ); } finally { setSavingUser(false); } } async function handleCreateGroup(e: FormEvent) { e.preventDefault(); setSavingGroup(true); setGroupError(null); try { const res = await fetch('/api/person-groups', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ name: groupName }), }); if (!res.ok) { const data = await res.json().catch(() => null); throw new Error( data?.error ?? `Fehler beim Anlegen (HTTP ${res.status})`, ); } setGroupName(''); setGroupModalOpen(false); router.refresh(); } catch (err: any) { console.error('Error creating group', err); setGroupError( err instanceof Error ? err.message : 'Fehler beim Anlegen der Gruppe.', ); } finally { setSavingGroup(false); } } return ( <>

Personen

Personen verwalten und in Gruppen einteilen.

{/* Neuer CSV-Import als eigene Komponente */}
{/* Modal: Neue Person */} setUserModalOpen(false)} title="Neue Person anlegen" tone="info" variant="centered" size="md" primaryAction={{ label: savingUser ? 'Speichere …' : 'User anlegen', onClick: () => { const form = document.getElementById( 'new-person-form', ) as HTMLFormElement | null; form?.requestSubmit(); }, variant: 'primary', }} secondaryAction={{ label: 'Abbrechen', onClick: () => setUserModalOpen(false), variant: 'secondary', }} >
{/* Arbeitsname */}
setArbeitsname(e.target.value)} />
{/* Vorname / Nachname */}
setFirstName(e.target.value)} />
setLastName(e.target.value)} />
{/* Gruppe */}
{personError && (

{personError}

)}

Felder mit * sind Pflichtfelder.

{/* Modal: Neue Gruppe */} setGroupModalOpen(false)} title="Neue Gruppe anlegen" tone="info" variant="centered" size="sm" primaryAction={{ label: savingGroup ? 'Speichere …' : 'Gruppe anlegen', onClick: () => { const form = document.getElementById( 'new-group-form', ) as HTMLFormElement | null; form?.requestSubmit(); }, variant: 'primary', }} secondaryAction={{ label: 'Abbrechen', onClick: () => setGroupModalOpen(false), variant: 'secondary', }} >
setGroupName(e.target.value)} />
{groupError && (

{groupError}

)}
); }