// /opt/erp-system/app/roles/page.tsx 'use client'; import { useState, useEffect } from 'react'; import { ShieldCheck, Plus, X, Check, Edit2, Trash2 } from 'lucide-react'; import { useToast } from '../components/ToastProvider'; import { useSession } from 'next-auth/react'; const AVAILABLE_PERMISSIONS = [ { id: 'TICKETS_VIEW', label: 'Tickets ansehen' }, { id: 'TICKETS_EDIT', label: 'Tickets bearbeiten / Zeit buchen' }, { id: 'CUSTOMERS_MANAGE', label: 'Kundenstamm verwalten' }, { id: 'CUSTOMERS_EDIT', label: 'Kundendaten bearbeiten (Stammdaten, Zugangsdaten)' }, { id: 'PURCHASING_MANAGE', label: 'Einkauf: Produkte & Bestand verwalten' }, { id: 'SALES_MANAGE', label: 'Verkauf: Angebote, Rechnungen & Belege' }, { id: 'DATA_DELETE', label: 'Daten löschen (Kunden, Mitarbeiter, Gruppen)' }, { id: 'TEAM_MANAGE', label: 'Mitarbeiter & Rollen verwalten' }, { id: 'SYSTEM_SETTINGS', label: 'Globale Einstellungen' } ]; export default function RolesPage() { const [roles, setRoles] = useState([]); const [showForm, setShowForm] = useState(false); const [editingId, setEditingId] = useState(null); const [formData, setFormData] = useState({ name: '', permissions: [] as string[] }); const { toast, confirm } = useToast(); const { data: session } = useSession(); const permissions = (session?.user as any)?.permissions || []; const canDelete = permissions.includes('DATA_DELETE'); useEffect(() => { fetchRoles(); }, []); const fetchRoles = async () => { const res = await fetch('/api/roles'); if (res.ok) setRoles(await res.json()); }; const handleEdit = (role: any) => { setEditingId(role.id); setFormData({ name: role.name, permissions: role.permissions || [] }); setShowForm(true); }; const handleCreateNew = () => { setEditingId(null); setFormData({ name: '', permissions: [] }); setShowForm(!showForm); }; const togglePermission = (permId: string) => { setFormData(prev => ({ ...prev, permissions: prev.permissions.includes(permId) ? prev.permissions.filter(p => p !== permId) : [...prev.permissions, permId] })); }; 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/roles', { method: method, headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(payload) }); if (res.ok) { setFormData({ name: '', permissions: [] }); setEditingId(null); setShowForm(false); fetchRoles(); // Hinweis für den Nutzer, falls er seine eigenen Rechte ändert toast('Erfolgreich gespeichert. Hinweis: Änderungen an den eigenen Rechten werden erst nach einem Neu-Login aktiv.', 'success', 8000); } else { toast('Fehler beim Speichern.', 'error'); } }; const handleDelete = async (role: any) => { const isConfirmed = await confirm({ title: 'Berechtigungsgruppe löschen', message: `"${role.name}" wirklich löschen?`, danger: true }); if (!isConfirmed) return; const res = await fetch(`/api/roles?id=${role.id}`, { method: 'DELETE' }); if (res.ok) { toast('Gruppe gelöscht', 'success'); fetchRoles(); } else { const data = await res.json(); toast(data.error || 'Fehler beim Löschen', 'error'); } }; return (

Berechtigungsgruppen

Definiere Rollen und weise granulare Rechte zu.

{showForm && (

{editingId ? 'Berechtigungsgruppe bearbeiten' : 'Neue Gruppe anlegen'}

setFormData({...formData, name: e.target.value})} />
{AVAILABLE_PERMISSIONS.map(perm => ( ))}
)}
{roles.map(role => (
{/* Action Buttons */}
{canDelete && ( )}

{role.name}

{role._count.users} Nutzer zugeordnet

Rechte

{role.permissions.map((p: string) => (
{AVAILABLE_PERMISSIONS.find(ap => ap.id === p)?.label || p}
))} {(!role.permissions || role.permissions.length === 0) && Keine Rechte zugewiesen.}
))}
); }