Wizard-Hoehe fix, Logout in Konto, Server-Reset, responsive Tabs, Set-Zeilen, Brand-Date
Image bauen und in die Registry schieben / build (push) Successful in 7s

- Wizard: feste Hoehe (600px, intern scrollbar), Schritt-Inhalt zentriert
  (.wizard-body) -> Schritte gleich gross, auch beim User anlegen
- Benutzer-Anlage: Bestaetigung 'Benutzer x angelegt.' (ohne 'Weiter mit'),
  Solo-Option nach User-Anlage deaktiviert (kein irrefuehrendes Umschalten)
- User-Chip + Abmelden aus der Topbar entfernt, 'Abmelden' in Konto-Sektion
- Topbar-Datum: 'Fr 02.10.2026' + aktive Session ('Push aktiv') statt
  redundantem 'Today'
- Tabs: flex-wrap statt Scrollen, auf Mobil volle Breite + kompakter
- Server-Reset (Owner): Passwort + 'RESET'-Eingabe, loescht alle Daten
- Benutzerliste: Querbalken vor dem Anlegen-Formular
- Tests: 163 Checks gruen (39+18+49+32+25)
This commit is contained in:
AI-Agent committed 2026-10-02 19:42:46 +00:00
1 parent 0ebaa8b132
commit 655316278a
6 files changed
+183 -52

No files matched your search

+39
View File
@@ -770,6 +770,16 @@ def set_user_password(uid, new):
return True
def reset_server():
"""Kompletter Reset: alle Sessions, Settings, Tokens und Benutzer loeschen."""
con = db()
for t in ("entries", "sessions", "settings", "tokens", "users"):
con.execute(f"DELETE FROM {t}")
con.execute("DELETE FROM sqlite_sequence")
con.commit()
con.close()
# ---------------------------------------------------------------------------
# Auto-Reset: letztes Workout einer Kategorie laden
# ---------------------------------------------------------------------------
@@ -1415,6 +1425,8 @@ class Handler(BaseHTTPRequestHandler):
self._send(400, json.dumps(
{"error": "Aktuelles Passwort ist falsch"}),
"application/json; charset=utf-8")
elif path in ("/api/reset", "/api/reset/"):
self.do_reset()
else:
uid = self._require_user()
if uid is None:
@@ -1450,6 +1462,33 @@ class Handler(BaseHTTPRequestHandler):
self._send(500, json.dumps({"error": str(exc)}),
"application/json; charset=utf-8")
def do_reset(self):
uid = self._require_user()
if uid is None:
return
if uid != 1:
self._send(403, json.dumps({"error": "nur der erste Benutzer"}),
"application/json; charset=utf-8")
return
data = self._read_json()
con = db()
row = con.execute("SELECT * FROM users WHERE id=?",
(uid,)).fetchone()
con.close()
if not row or not _verify_pw(data.get("password", ""),
row["salt"], row["password_hash"]):
self._send(400, json.dumps(
{"error": "Aktuelles Passwort ist falsch"}),
"application/json; charset=utf-8")
return
if _clean_str(data.get("confirm")) != "RESET":
self._send(400, json.dumps(
{"error": "Bestätigungstext ist falsch"}),
"application/json; charset=utf-8")
return
reset_server()
self._send_json(200, {"ok": True})
def do_register(self):
if user_count() > 0:
self._send(403, json.dumps(