diff --git a/frontend/src/App.jsx b/frontend/src/App.jsx index 9e1306c..14839e0 100644 --- a/frontend/src/App.jsx +++ b/frontend/src/App.jsx @@ -701,6 +701,137 @@ const Sec = ({title, children}) => ( ); +// ── Benutzerverwaltung ──────────────────────────────────────────────────────── +function UserManagement({ toast }) { + const [users, setUsers] = useState([]); + const [loading, setLoading] = useState(true); + const [form, setForm] = useState({ username:'', password:'', role:'user' }); + const [resetId, setResetId] = useState(null); + const [resetPw, setResetPw] = useState(''); + const [delId, setDelId] = useState(null); + const { confirm, ConfirmDialog } = useConfirm(); + + const load = () => { + setLoading(true); + api('/admin/users').then(setUsers).catch(e=>toast(e.message,'error')).finally(()=>setLoading(false)); + }; + useEffect(()=>{ load(); },[]); + + const create = async () => { + if (!form.username.trim()||!form.password) { toast('Alle Felder ausfüllen','error'); return; } + try { + await api('/admin/users',{body:form}); + toast(`Benutzer "${form.username}" angelegt`); + setForm({username:'',password:'',role:'user'}); load(); + } catch(e) { toast(e.message,'error'); } + }; + + const del = async id => { + if (!await confirm('Benutzer und alle seine Daten wirklich löschen?')) return; + try { await api(`/admin/users/${id}`,{method:'DELETE'}); toast('Gelöscht'); load(); } + catch(e) { toast(e.message,'error'); } + }; + + const resetPassword = async () => { + if (!resetPw||resetPw.length<8) { toast('Mind. 8 Zeichen','error'); return; } + try { + await api(`/admin/users/${resetId}/reset-password`,{method:'PUT',body:{newPassword:resetPw}}); + toast('Passwort zurückgesetzt'); setResetId(null); setResetPw(''); + } catch(e) { toast(e.message,'error'); } + }; + + return ( +