import React, { useEffect, useState } from 'react'; import { Table, Button, Spin, Alert, Modal, Form, Input, Select, App, Tooltip } from 'antd'; import { EditPencil, Trash } from 'iconoir-react'; import { getAll, create, update, remove } from '../services/entityService'; const { Option } = Select; export default function UserManagement() { const [users, setUsers] = useState([]); const [clients, setClients] = useState([]); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); const [modalOpen, setModalOpen] = useState(false); const [form] = Form.useForm(); const [saving, setSaving] = useState(false); const [editModalOpen, setEditModalOpen] = useState(false); const [editingUser, setEditingUser] = useState(null); const [modal, modalContextHolder] = Modal.useModal(); const { message } = App.useApp(); useEffect(() => { fetchUsers(); fetchClients(); }, []); function fetchUsers() { setLoading(true); getAll('users').then(res => { if (res.success && Array.isArray(res.users)) { setUsers(res.users); } else { setError(res.error?.message || 'Fehler beim Laden der Benutzer'); } }).catch(() => setError('Serverfehler')).finally(() => setLoading(false)); } function fetchClients() { getAll('clients').then(res => { if (res.success && res.clients) { // Extrahiere Client-Verzeichnisnamen (dir) aus der Response const clientDirs = Object.values(res.clients).map(client => client.dir); // Entferne Duplikate falls vorhanden const uniqueClientDirs = [...new Set(clientDirs)]; setClients(uniqueClientDirs); } }).catch(err => { console.warn('Fehler beim Laden der Clients:', err); setClients([]); }); } async function handleCreateUser(values) { setSaving(true); try { // Stelle sicher, dass disallowedClients als Array gespeichert wird if (values.disallowedClients && !Array.isArray(values.disallowedClients)) { values.disallowedClients = []; } const data = await create('users', values); if (data.success) { message.success('Benutzer angelegt'); setModalOpen(false); form.resetFields(); fetchUsers(); } else { message.error(data.error?.message || 'Fehler beim Anlegen'); } } catch (e) { message.error('Netzwerkfehler'); } finally { setSaving(false); } } function handleDeleteUser(user) { modal.confirm({ title: `Benutzer wirklich löschen?`, content: `Soll der Benutzer "${user.username}" wirklich gelöscht werden?`, okText: 'Löschen', okType: 'danger', cancelText: 'Abbrechen', onOk: async () => { const data = await remove('users', user.id); if (data.success) { message.success('Benutzer gelöscht'); fetchUsers(); } else { message.error(data.error?.message || 'Fehler beim Löschen'); } } }); } function openEditModal(user) { setEditingUser(user); setEditModalOpen(true); } async function handleEditUser(values) { setSaving(true); try { // Separater API-Call für Passwort-Update falls angegeben if (values.password) { const token = localStorage.getItem('jwt'); const passwordResponse = await fetch(`/api/admin/users/${editingUser.id}/password`, { method: 'PUT', headers: { 'Content-Type': 'application/json', 'Authorization': `Bearer ${token}` }, body: JSON.stringify({ password: values.password }) }); const passwordResult = await passwordResponse.json(); if (!passwordResult.success) { message.error(passwordResult.error?.message || 'Fehler beim Ändern des Passworts'); setSaving(false); return; } } // Standard User-Daten aktualisieren (ohne Passwort) const { password, confirmPassword, ...userData } = values; // Stelle sicher, dass disallowedClients als Array gespeichert wird if (userData.disallowedClients && !Array.isArray(userData.disallowedClients)) { userData.disallowedClients = []; } const data = await update('users', editingUser.id, userData); if (data.success) { message.success('Benutzer erfolgreich aktualisiert' + (values.password ? ' (inklusive Passwort)' : '')); setEditModalOpen(false); fetchUsers(); } else { message.error(data.error?.message || 'Fehler beim Bearbeiten'); } } catch (e) { message.error('Netzwerkfehler'); } finally { setSaving(false); } } const columns = [ { title: 'Benutzername', dataIndex: 'username', key: 'username' }, { title: 'Rolle', dataIndex: 'role', key: 'role' }, { title: 'E-Mail', dataIndex: 'email', key: 'email' }, { title: 'Gesperrte Clients', key: 'disallowedClients', render: (_, record) => { if (record.role !== 'admin' || !record.disallowedClients || record.disallowedClients.length === 0) { return Keine; } return (