Arbeit der parallelen Session in git gesichert (war nur auf dem Server)

Diese Änderungen liefen bereits live auf dem Server, lagen dort aber
ausschließlich als nicht eingecheckte Arbeitskopie — bei jedem Deploy
(stash/pull/pop) und bei jedem Serverproblem wären sie verloren gewesen.
Deshalb hier unverändert in git übernommen, bevor darauf aufgebaut wird.

Enthalten (nicht von mir gebaut, nur gesichert):
- Supporter: eigener fester Zugangscode statt Einmalcode-Login
  (Migration 0009, lib/crypto.js scrypt-Hash, routes/supporter.js,
  abonnieren.html, supporter.html, i18n-abonnieren/-supporter)
- Stimmen: Profilbilder (Migration 0010, routes/testimonials.js)
- Event-Bild-Upload: voller Pfad statt relativem (routes/events.js)
- Neue/überarbeitete Hintergrundbilder für viele Seiten
- Teilen-Funktion (streamplan.js, i18n-index/-streamplan, main.css)

Co-Authored-By: Claude Opus 5 <[email protected]>
This commit is contained in:
2026-08-21 17:35:14 +02:00
co-authored by Claude Opus 5
parent 4b294f6c6b
commit 5d0ea11570
65 changed files with 992 additions and 139 deletions
+58 -7
View File
@@ -518,16 +518,24 @@
}
const token = localStorage.getItem("supporterToken");
const status = localStorage.getItem("supporterSubStatus");
if (!token) {
return `<a class="nav-cta nav-cta-abo" href="abonnieren.html"><span>${t("nav_cta_abo_anonym")}</span>${soonBadge()}</a>`;
}
const hatBereich = ["active", "pending", "suspended", "cancelled"].includes(status);
if (hatBereich) {
const name = localStorage.getItem("supporterDisplayName");
return `<a class="nav-cta nav-cta-abo" href="supporter.html"><span>${bereichLabel(name)}</span></a>`;
}
return `<a class="nav-cta nav-cta-abo" href="abonnieren.html"><span>${t("nav_cta_abo_aktivieren")}</span>${soonBadge()}</a>`;
/* Nutzer-Wunsch 21.08.2026: "meine seite ändert sich nicht und es gibt
keinen button für registrierte sich normal anzumelden und abzumelden.
wo sie die speziellen sachen sehen als supporter und dass sie auch
schon den abo sehen aber gesperrt ist." Vorher landeten Leute mit
Konto, aber ohne bezahltes Abo (status "none"), im Nav-Knopf wieder
nur bei abonnieren.html -- man merkte dem Knopf also nie an, dass man
überhaupt eingeloggt ist. supporter.html zeigt für genau diesen Fall
schon lange den Bereich "Mein Abo" -> #supp-keine-abo ("Du hast noch
kein aktives Abo" + Knopf) UND den Ausloggen-Knopf (siehe dort,
#btn-logout) -- das musste also nur noch verlinkt werden. Ab jetzt:
JEDER mit gültigem Token (egal ob "none", "active", "pending", ...)
geht auf supporter.html und sieht dort automatisch den passenden
Zustand samt Logout. */
const name = localStorage.getItem("supporterDisplayName");
return `<a class="nav-cta nav-cta-abo" href="supporter.html"><span>${bereichLabel(name)}</span></a>`;
}
function renderHeader() {
@@ -1172,6 +1180,49 @@
return feld[sprache] || feld.de || "";
};
/* =====================================================================
dogiTeilen() — 21.08.2026, Nutzer-Wunsch: "die events des jahres und
speziellen live events soll man auch teilen können." Wiederverwendbare
Teilen-Funktion für einzelne Inhalte (aktuell: Event des Jahres auf
index.html, spezielles Live-Event auf streamplan.html — künftig bei
Bedarf für weitere Stellen nutzbar, ohne den Mechanismus neu zu bauen).
Nutzt zuerst die native Teilen-Funktion des Geräts (Web-Share-API) —
auf dem Handy öffnet das den echten Teilen-Dialog (WhatsApp, TikTok,
Mail, ...). Die meisten Desktop-Browser kennen diese API nicht/zeigen
dort ohnehin kein sinnvolles Menü -- dort stattdessen Fallback: Link in
die Zwischenablage kopieren, der klickende Knopf bekommt kurz ein
"✓ Link kopiert"-Feedback (eigener Text + eigene Klasse, gleiches
Timing wie .vw-copy-btn in der Verwaltung). */
window.dogiTeilen = async function (daten, knopf) {
const payload = { title: daten.title || "", text: daten.text || "", url: daten.url || location.href };
if (navigator.share) {
try {
await navigator.share(payload);
return;
} catch (err) {
if (err && err.name === "AbortError") return; // Dialog selbst abgebrochen -- kein Fallback nötig
// sonst: weiter zum Zwischenablage-Fallback unten
}
}
if (!navigator.clipboard) return;
try {
await navigator.clipboard.writeText(payload.url);
if (knopf) {
const alterText = knopf.textContent;
knopf.textContent = "✓ Link kopiert";
knopf.classList.add("dogi-teilen-kopiert");
setTimeout(() => {
knopf.textContent = alterText;
knopf.classList.remove("dogi-teilen-kopiert");
}, 1600);
}
} catch {
/* Zwischenablage nicht erreichbar (z.B. kein HTTPS-Kontext) -- kein
Blocker, der Link bleibt über die normale Adressleiste erreichbar. */
}
};
/* =====================================================================
dogiTeamLaden() — 21.08.2026, Nutzer-Wunsch: "überall wo Modis sind
oder Scouts oder Manager, oder Creator, will ich dass ich die easy