import { useRef, useState } from 'react' import CopyableCredential from '../components/CopyableCredential' import { Badge, Button, Card, Dialog, EmptyState, Field, PageHeader, Tabs } from '../components/ui' import { useAuth } from '../context/AuthContext' import { useEmployees } from '../hooks/useEmployees' import { useScrollIntoView } from '../hooks/useScrollIntoView' import { validateEmployeeForm } from '../lib/employeeForm' import './AdminPage.css' const EMPTY_EMPLOYEE = { displayName: '', email: '', password: '', shortcode: '', isAdmin: false, } function Notice({ notice }) { if (!notice?.text) return null return (
{notice.text}
) } export default function AdminPage() { const { user, isAdmin } = useAuth() const { employees, loading: employeesLoading, error: employeesError, createEmployee, updateEmployee, deleteEmployee, } = useEmployees() // Kunden werden unter "Kunden" gepflegt (Anlegen und Loeschen fuer Admins dort) const [activeSection, setActiveSection] = useState('employees') const [employeeForm, setEmployeeForm] = useState(EMPTY_EMPLOYEE) const [editingEmployee, setEditingEmployee] = useState(null) const [formOpen, setFormOpen] = useState(false) const [formError, setFormError] = useState(null) const [employeeBusy, setEmployeeBusy] = useState(false) const [createdCredential, setCreatedCredential] = useState(null) const [notice, setNotice] = useState(null) const errorRef = useRef(null) // Hooks stehen vor dem frühen return bei !isAdmin useScrollIntoView(errorRef, formError) const showNotice = (type, text) => { setNotice({ type, text }) window.setTimeout(() => setNotice(null), 4500) } if (!isAdmin) { return (
403

Zugriff verweigert

Für diesen Bereich ist ein Admin-Account erforderlich.

) } // Der Admin-Haken des eigenen Kontos ist gesperrt: man nimmt sich nicht selbst die Rechte const editingSelf = Boolean(editingEmployee) && employees.find((item) => item.$id === editingEmployee)?.userId === user?.$id const closeForm = () => { setFormOpen(false) setFormError(null) setEmployeeForm(EMPTY_EMPLOYEE) setEditingEmployee(null) } const createNew = () => { setEmployeeForm(EMPTY_EMPLOYEE) setEditingEmployee(null) setFormError(null) setFormOpen(true) } const editEmployee = (employee) => { setEditingEmployee(employee.$id) setEmployeeForm({ displayName: employee.displayName || '', email: employee.email || '', password: '', shortcode: employee.shortcode || '', isAdmin: Boolean(employee.isAdmin), }) setFormError(null) setFormOpen(true) } const submitEmployee = async (event) => { event.preventDefault() const message = validateEmployeeForm(employeeForm, Boolean(editingEmployee)) if (message) { setFormError(message) return } setFormError(null) setEmployeeBusy(true) const result = editingEmployee ? await updateEmployee(editingEmployee, employeeForm) : await createEmployee(employeeForm) setEmployeeBusy(false) if (!result.success) { setFormError(result.error || 'Mitarbeiter konnte nicht gespeichert werden.') return } if (!editingEmployee) { setCreatedCredential({ email: employeeForm.email.trim(), password: employeeForm.password, }) } showNotice('success', editingEmployee ? 'Mitarbeiter aktualisiert.' : 'Mitarbeiter angelegt. Der Login ist sofort aktiv.') closeForm() } const removeEmployee = async (employee) => { if (!window.confirm(`${employee.displayName || employee.email} und dessen Login wirklich löschen?`)) return const result = await deleteEmployee(employee.$id) showNotice( result.success ? 'success' : 'error', result.success ? 'Mitarbeiter und Login gelöscht.' : result.error ) } const setField = (key) => (event) => setEmployeeForm({ ...employeeForm, [key]: event.target.value }) return (
Angemeldet als {user?.name || user?.email} } /> {activeSection === 'employees' && ( <> {createdCredential && ( setCreatedCredential(null)} aria-label="Hinweis schließen">× } >

Diese Zugangsdaten jetzt sicher weitergeben.

)}

Aktive Logins für das Ticketsystem

{employeesError &&
{employeesError}
} {employeesLoading ? (
Mitarbeiter werden geladen …
) : employees.length === 0 ? ( ) : ( {employees.map((employee) => ( ))}
Mitarbeiter E-Mail Kürzel Rolle User-ID Aktionen
{employee.displayName || '–'} {employee.shortcode || '–'} {employee.isAdmin ? Admin : Mitarbeiter}
{employee.userId !== user?.$id && ( )}
)}
)} {formOpen && ( } > {formError &&
{formError}
}

Die User-ID wird automatisch vergeben.

setEmployeeForm({ ...employeeForm, shortcode: event.target.value.toUpperCase() })} placeholder="z. B. KNSO" />
)}
) }