// /opt/erp-system/app/users/page.tsx 'use client'; import { useState, useEffect } from 'react'; import { Users, Plus, X, Mail, ShieldAlert, Edit2, Trash2 } from 'lucide-react'; import { useToast } from '../components/ToastProvider'; import { useSession } from 'next-auth/react'; export default function UsersPage() { const [users, setUsers] = useState([]); const [roles, setRoles] = useState([]); const [showForm, setShowForm] = useState(false); const [editingId, setEditingId] = useState(null); const { toast, confirm } = useToast(); const { data: session } = useSession(); const permissions = (session?.user as any)?.permissions || []; const canDelete = permissions.includes('DATA_DELETE'); const [formData, setFormData] = useState({ firstName: '', lastName: '', email: '', password: '', roleId: '' }); useEffect(() => { fetchRoles(); fetchUsers(); }, []); const fetchUsers = async () => { const res = await fetch('/api/users'); if (res.ok) setUsers(await res.json()); }; const fetchRoles = async () => { const res = await fetch('/api/roles'); if (res.ok) { const data = await res.json(); setRoles(data); if (data.length > 0 && !editingId) { setFormData(prev => ({ ...prev, roleId: data[0].id.toString() })); } } }; const handleCreateNew = () => { setEditingId(null); setFormData({ firstName: '', lastName: '', email: '', password: '', roleId: roles.length > 0 ? roles[0].id.toString() : '' }); setShowForm(!showForm); }; const handleEdit = (user: any) => { setEditingId(user.id); setFormData({ firstName: user.firstName, lastName: user.lastName, email: user.email, password: '', // Passwort wird aus Sicherheitsgründen nie geladen roleId: user.roleId ? user.roleId.toString() : (roles[0]?.id.toString() || '') }); setShowForm(true); }; const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); const method = editingId ? 'PUT' : 'POST'; const payload = editingId ? { id: editingId, ...formData } : formData; const res = await fetch('/api/users', { method: method, headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(payload), }); if (res.ok) { setShowForm(false); fetchUsers(); toast(editingId ? 'Mitarbeiter erfolgreich aktualisiert' : 'Mitarbeiter erfolgreich angelegt', 'success'); } else { const data = await res.json(); toast(data.error || 'Fehler beim Speichern', 'error'); } }; const handleDelete = async (user: any) => { const isConfirmed = await confirm({ title: 'Mitarbeiter löschen', message: `"${user.firstName} ${user.lastName}" wirklich löschen? Zugewiesene Tickets werden freigestellt.`, danger: true }); if (!isConfirmed) return; const res = await fetch(`/api/users?id=${user.id}`, { method: 'DELETE' }); if (res.ok) { toast('Mitarbeiter gelöscht', 'success'); fetchUsers(); } else { const data = await res.json(); toast(data.error || 'Fehler beim Löschen', 'error'); } }; return (

Team

Verwalte Systemzugänge und weise Berechtigungsgruppen zu.

{showForm && (

{editingId ? 'Mitarbeiter bearbeiten' : 'Zugang anlegen'}

setFormData({...formData, firstName: e.target.value})} />
setFormData({...formData, lastName: e.target.value})} />
setFormData({...formData, email: e.target.value})} />
setFormData({...formData, password: e.target.value})} />
)}
{users.map((u) => ( ))} {users.length === 0 && ( )}
Mitarbeiter E-Mail Gruppe Angelegt am Aktionen
{u.firstName} {u.lastName} {u.email} {u.role ? ( {u.role.name} ) : ( Ohne Rechte )} {new Date(u.createdAt).toLocaleDateString('de-DE')}
{canDelete && ( )}
Keine Mitarbeiter gefunden.
); }