From a47f41bbfa85b1b0f33db32fe47d6d23c04055f4 Mon Sep 17 00:00:00 2001 From: irrlicht Date: Mon, 1 Jun 2026 11:47:00 +0200 Subject: [PATCH] Frontend: Registrierung angebunden (POST /auth/newuser) - Umschalter Login <-> Registrieren im Auth-Bereich - Fehlerlisten-Anzeige ({"errors": [...]}) fuer newuser - nach erfolgreicher Registrierung automatischer Login - Logout setzt Ansicht auf Login zurueck Co-Authored-By: Claude Opus 4.8 --- web/css/app.css | 2 ++ web/index.html | 11 +++++++++++ web/js/app.js | 47 ++++++++++++++++++++++++++++++++++++++++++----- 3 files changed, 55 insertions(+), 5 deletions(-) diff --git a/web/css/app.css b/web/css/app.css index 208066a..2732597 100644 --- a/web/css/app.css +++ b/web/css/app.css @@ -72,6 +72,8 @@ button:hover { opacity: 0.9; } .entry a { color: var(--accent); } .msg { color: #ff6b6b; font-size: 0.9rem; min-height: 1.2em; } +.switch { color: var(--muted); font-size: 0.9rem; margin: 0.6rem 0 0; } +.switch a { color: var(--accent); } .end { text-align: center; color: var(--muted); padding: 2rem 0; } .interactions { diff --git a/web/index.html b/web/index.html index 80b9d22..5c6c96e 100644 --- a/web/index.html +++ b/web/index.html @@ -21,7 +21,18 @@ +

Noch kein Konto? Registrieren

+ + +

diff --git a/web/js/app.js b/web/js/app.js index 1e20c60..b5d5a0a 100644 --- a/web/js/app.js +++ b/web/js/app.js @@ -34,22 +34,59 @@ async function refreshHeader() { }); } else { bar.innerHTML = ""; + showAuth("login"); } } -// --- Login --- -document.getElementById("login-form").addEventListener("submit", async (e) => { +// --- Login / Registrierung --- +const loginForm = document.getElementById("login-form"); +const registerForm = document.getElementById("register-form"); +const authMsg = document.getElementById("auth-msg"); + +function showAuth(which) { + loginForm.hidden = which !== "login"; + registerForm.hidden = which !== "register"; + authMsg.textContent = ""; +} + +document.getElementById("show-register").addEventListener("click", (e) => { + e.preventDefault(); + showAuth("register"); +}); +document.getElementById("show-login").addEventListener("click", (e) => { + e.preventDefault(); + showAuth("login"); +}); + +loginForm.addEventListener("submit", async (e) => { e.preventDefault(); const res = await api.post("/auth/login", new FormData(e.target)); - const msg = document.getElementById("auth-msg"); if (res.ok) { - msg.textContent = ""; await refreshHeader(); } else { - msg.textContent = res.data.error || "Login fehlgeschlagen."; + authMsg.textContent = res.data.error || "Login fehlgeschlagen."; } }); +registerForm.addEventListener("submit", async (e) => { + e.preventDefault(); + const data = new FormData(e.target); + const res = await api.post("/auth/newuser", data); + if (!res.ok) { + // newuser liefert eine Fehlerliste ({"errors": [...]}). + const errors = res.data.errors || [res.data.error || "Registrierung fehlgeschlagen."]; + authMsg.textContent = errors.join(" "); + return; + } + // Direkt mit denselben Daten einloggen, damit der Nutzer gleich drin ist. + const login = new FormData(); + login.append("user", data.get("user")); + login.append("pass", data.get("pass1")); + login.append("timeout", "86400"); + await api.post("/auth/login", login); + await refreshHeader(); +}); + // --- Neuer Beitrag --- document.getElementById("entry-form").addEventListener("submit", async (e) => { e.preventDefault();