import React, { useState, useEffect } from 'react'; import { useAuth } from '../context/AuthContext'; import userService from '../services/userService'; import LoadingSpinner from '../components/common/LoadingSpinner'; import { toast } from 'react-toastify'; const UsersPage = () => { const { isSuperAdmin } = useAuth(); const [users, setUsers] = useState([]); const [roles, setRoles] = useState([]); const [loading, setLoading] = useState(true); const [showModal, setShowModal] = useState(false); const [editingUser, setEditingUser] = useState(null); const [showImportModal, setShowImportModal] = useState(false); const [azureGroups, setAzureGroups] = useState([]); const [azureGroupsLoading, setAzureGroupsLoading] = useState(false); const [importGroupId, setImportGroupId] = useState(''); const [importRoleId, setImportRoleId] = useState(''); const [importing, setImporting] = useState(false); const [groupSearch, setGroupSearch] = useState(''); const [search, setSearch] = useState(''); const [formData, setFormData] = useState({ username: '', email: '', password: '', role_id: '', first_name: '', last_name: '', is_active: true, }); useEffect(() => { loadData(); }, []); const loadData = async () => { try { const [usersData, rolesData] = await Promise.all([ userService.getAll(), userService.getRoles(), ]); setUsers(usersData); setRoles(rolesData); } catch (error) { toast.error('Fehler beim Laden der Daten'); } finally { setLoading(false); } }; const handleCreate = () => { setEditingUser(null); setFormData({ username: '', email: '', password: '', role_id: roles[0]?.id || '', first_name: '', last_name: '', is_active: true, }); setShowModal(true); }; const handleEdit = (user) => { setEditingUser(user); setFormData({ username: user.username, email: user.email, password: '', role_id: user.role_id, first_name: user.first_name || '', last_name: user.last_name || '', is_active: user.is_active, }); setShowModal(true); }; const handleSubmit = async (e) => { e.preventDefault(); try { const submitData = { ...formData }; // Remove password if empty (for edit) if (editingUser && !submitData.password) { delete submitData.password; } if (editingUser) { await userService.update(editingUser.id, submitData); toast.success('Benutzer erfolgreich aktualisiert'); } else { await userService.create(submitData); toast.success('Benutzer erfolgreich erstellt'); } setShowModal(false); loadData(); } catch (error) { toast.error(error.message || 'Fehler beim Speichern'); } }; const handleDelete = async (id) => { if (!window.confirm('Möchten Sie diesen Benutzer wirklich löschen?')) { return; } try { await userService.delete(id); toast.success('Benutzer erfolgreich gelöscht'); loadData(); } catch (error) { toast.error(error.message || 'Fehler beim Löschen'); } }; const handleToggleStatus = async (user) => { try { await userService.toggleStatus(user.id, !user.is_active); toast.success('Status erfolgreich geändert'); loadData(); } catch (error) { toast.error(error.message || 'Fehler beim Ändern des Status'); } }; const handleOpenImportModal = async () => { setImportGroupId(''); setImportRoleId(roles[0]?.id || ''); setGroupSearch(''); setShowImportModal(true); setAzureGroupsLoading(true); try { const groups = await userService.getAzureGroups(); setAzureGroups(groups); } catch (error) { toast.error(error.message || 'Fehler beim Laden der Azure-Gruppen'); setShowImportModal(false); } finally { setAzureGroupsLoading(false); } }; const handleImport = async () => { if (!importGroupId || !importRoleId) return; setImporting(true); try { const result = await userService.importFromAzure(importGroupId, importRoleId); toast.success( `Import abgeschlossen: ${result.imported} importiert, ${result.skipped} übersprungen` + (result.errors.length > 0 ? `, ${result.errors.length} Fehler` : '') ); setShowImportModal(false); if (result.imported > 0) loadData(); } catch (error) { toast.error(error.message || 'Fehler beim Importieren'); } finally { setImporting(false); } }; const handleRoleChange = async (userId, roleId) => { try { await userService.assignRole(userId, roleId); toast.success('Rolle erfolgreich zugewiesen'); loadData(); } catch (error) { toast.error(error.message || 'Fehler beim Zuweisen der Rolle'); } }; if (loading) { return (
| Benutzername | Name | Rolle | Status | Letzter Login | Aktionen | |
|---|---|---|---|---|---|---|
| Keine Benutzer gefunden | ||||||
| {user.username} | {user.email} | {user.first_name || user.last_name ? `${user.first_name || ''} ${ user.last_name || '' }`.trim() : '-'} | {user.role_name} | {user.is_active ? 'Aktiv' : 'Inaktiv'} | {user.last_login ? new Date(user.last_login).toLocaleString('de-DE') : 'Nie'} |
{isSuperAdmin() && (
|
Gruppen werden geladen...
) : ( <>Bereits vorhandene Benutzer (gleiche E-Mail oder Azure ID) werden übersprungen.
> )}