diff --git a/workspace/assets/css/start.css b/workspace/assets/css/start.css index c302298c..6f020545 100644 --- a/workspace/assets/css/start.css +++ b/workspace/assets/css/start.css @@ -38,6 +38,28 @@ body.start { .kopfleiste .marke { margin: 0; font-size: .72rem; } +/* Zurück-Knopf. Steht ganz links, weil dort jeder ihn erwartet -- gleiche + Stelle wie im Browser. Bleibt verborgen (hidden), wenn es nichts gibt, + wohin er führen könnte; das entscheidet kopf.js. */ +.zurueck-knopf { + flex: 0 0 auto; + padding: 7px 13px; + background: rgba(255, 255, 255, .045); + border: 1px solid var(--rand); + border-radius: 9px; + color: var(--text-leise); + font: inherit; font-size: .82rem; + cursor: pointer; + white-space: nowrap; + transition: background var(--tempo), border-color var(--tempo), color var(--tempo); +} +.zurueck-knopf:hover { + background: rgba(255, 255, 255, .08); + border-color: var(--rand-hell); + color: var(--text); +} +.zurueck-knopf:active { transform: translateX(-1px); } + .kopfleiste__rechts { display: flex; align-items: center; gap: 12px; } .wer { diff --git a/workspace/assets/js/aufgaben.js b/workspace/assets/js/aufgaben.js index 428931cc..8c3ba146 100644 --- a/workspace/assets/js/aufgaben.js +++ b/workspace/assets/js/aufgaben.js @@ -252,11 +252,6 @@ Das laesst sich nicht rueckgaengig machen. Erledigte Aufgaben sollten normalerwe /* ---------- Start ----------------------------------------------------- */ - $('abmelden').addEventListener('click', async () => { - try { await fetch('/workspace/api/abmelden', { method: 'POST', credentials: 'same-origin' }); } - catch { /* egal */ } - location.assign('/workspace/'); - }); (async () => { try { diff --git a/workspace/assets/js/kalender.js b/workspace/assets/js/kalender.js index 6ec113c1..a921b00d 100644 --- a/workspace/assets/js/kalender.js +++ b/workspace/assets/js/kalender.js @@ -235,11 +235,6 @@ /* ---------- Start -------------------------------------------------------- */ - $('abmelden').addEventListener('click', async () => { - try { await fetch('/workspace/api/abmelden', { method: 'POST', credentials: 'same-origin' }); } - catch { /* egal */ } - location.assign('/workspace/'); - }); (async () => { try { diff --git a/workspace/assets/js/kopf.js b/workspace/assets/js/kopf.js new file mode 100644 index 00000000..bd3d93d8 --- /dev/null +++ b/workspace/assets/js/kopf.js @@ -0,0 +1,68 @@ +/* =================================================================== + Gemeinsames Verhalten der Kopfleiste: Zurück-Knopf und Abmelden. + + Liegt bewusst in einer eigenen Datei. Vorher stand das Abmelden in + jeder Seitendatei noch einmal -- fünfmal derselbe Block, fünfmal eine + Stelle zum Vergessen, wenn sich etwas ändert. + =================================================================== */ +(() => { + 'use strict'; + + const START = '/workspace/start.html'; + + /* Gibt es eine sinnvolle vorherige Seite INNERHALB des Workspace? + + Blindes history.back() reicht nicht: Wer die Adresse direkt eingibt + oder gerade von der Anmeldung kommt, landet damit außerhalb des + Workspace oder wieder im Anmeldeformular. Deshalb wird zuerst + geprüft, woher der Aufruf kam. */ + function hatVorherigeSeite() { + if (!document.referrer) return false; + let u; + try { u = new URL(document.referrer); } catch { return false; } + if (u.origin !== location.origin) return false; + if (!u.pathname.startsWith('/workspace/')) return false; + /* Die Anmeldeseite ist kein sinnvolles Ziel -- wer angemeldet ist, + würde dort sofort wieder weitergeleitet. */ + if (u.pathname === '/workspace/' || u.pathname.endsWith('/index.html')) return false; + /* Gleiche Seite heißt: neu geladen, nicht hergekommen. */ + if (u.pathname === location.pathname) return false; + return true; + } + + const knopf = document.getElementById('zurueck'); + if (knopf) { + const aufStartseite = location.pathname.endsWith('/start.html'); + if (hatVorherigeSeite()) { + knopf.hidden = false; + knopf.addEventListener('click', () => { + /* history.back() statt eines festen Ziels: Es führt wirklich + dorthin zurück, wo man war -- samt Bildlaufposition. Nur wenn + es keine Historie gibt, wird ersatzweise umgeleitet. */ + if (history.length > 1) history.back(); + else location.assign(START); + }); + } else if (!aufStartseite) { + /* Kein Verlauf, aber wir sind in einem Unterbereich: dann wenigstens + ein Weg zur Übersicht. */ + knopf.hidden = false; + knopf.textContent = '← Übersicht'; + knopf.addEventListener('click', () => location.assign(START)); + } + /* Auf der Startseite ohne Verlauf bleibt der Knopf aus -- ein Knopf, + der nichts tut, ist schlimmer als keiner. */ + } + + const abmelden = document.getElementById('abmelden'); + if (abmelden) { + abmelden.addEventListener('click', async () => { + abmelden.disabled = true; + try { + await fetch('/workspace/api/abmelden', { + method: 'POST', credentials: 'same-origin', + }); + } catch { /* Auch ohne Antwort weiterleiten -- das Cookie läuft ohnehin ab. */ } + location.assign('/workspace/'); + }); + } +})(); diff --git a/workspace/assets/js/personen.js b/workspace/assets/js/personen.js index 196be31c..90e7a29f 100644 --- a/workspace/assets/js/personen.js +++ b/workspace/assets/js/personen.js @@ -183,11 +183,6 @@ /* ---------- Start ------------------------------------------------------- */ - $('abmelden').addEventListener('click', async () => { - try { await fetch('/workspace/api/abmelden', { method: 'POST', credentials: 'same-origin' }); } - catch { /* egal */ } - location.assign('/workspace/'); - }); (async () => { try { diff --git a/workspace/assets/js/profil.js b/workspace/assets/js/profil.js index cf612ad8..4b0dafa1 100644 --- a/workspace/assets/js/profil.js +++ b/workspace/assets/js/profil.js @@ -90,11 +90,6 @@ } catch { /* umgeleitet */ } finally { knopf.disabled = false; } }); - $('abmelden').addEventListener('click', async () => { - try { await fetch('/workspace/api/abmelden', { method: 'POST', credentials: 'same-origin' }); } - catch { /* egal */ } - location.assign('/workspace/'); - }); (async () => { try { diff --git a/workspace/assets/js/start.js b/workspace/assets/js/start.js index cd52a469..6a5191a4 100644 --- a/workspace/assets/js/start.js +++ b/workspace/assets/js/start.js @@ -123,12 +123,6 @@ } } - $('abmelden').addEventListener('click', async () => { - try { - await fetch('/workspace/api/abmelden', { method: 'POST', credentials: 'same-origin' }); - } catch { /* Auch ohne Antwort weiterleiten - das Cookie ist dann spätestens abgelaufen. */ } - location.assign('/workspace/'); - }); laden(); })(); diff --git a/workspace/aufgaben.html b/workspace/aufgaben.html index 937004b6..57f24088 100644 --- a/workspace/aufgaben.html +++ b/workspace/aufgaben.html @@ -15,6 +15,7 @@
Creator Workspace · Aufgaben