Team-Verwaltung Runde 2: bestehende Mitglieder importieren + Kategorien/Seitentitel editierbar

Nutzer-Wunsch 21.08.2026: "wenn ich eine änderung mache ist es auch für
jeden für die die schon da sind und die neuen" + "ich will ich titel
und namen von kategorien und seiten ändern können in der verwaltung".

Backend (braucht Filipes manuellen Deploy):
- Migration 0008: team_members bekommt intro/bioHtml/extraCta-Spalten
  -- volle Feld-Parität mit den von Hand gepflegten Profilen (Diene/
  Patrick/Bananenstift/Marina nutzen diese Felder).
- routes/team.js: neue importLegacyMember()-Funktion -- übernimmt ein
  bestehendes Profil 1:1 in die Datenbank, OHNE erneut zu übersetzen
  (die vorhandenen, von Hand geschriebenen Übersetzungen bleiben
  erhalten). Idempotent: mehrfacher Import erzeugt keine Duplikate.
- routes/site-texts.js (neu): admin-editierbare Kategorie-Namen und
  Seitentitel, generischer key->{de,...}-Override über app_settings
  (wie "Event des Jahres"), fester Schlüssel-Katalog aus
  Sicherheitsgründen. Leeres Feld setzt auf den Standardtext zurück.
- 27 Tests in isolierter Testumgebung geprüft (kein better-sqlite3
  lokal kompilierbar).

Frontend:
- window.dogiTeamZusammenfuehren() (main.js): admin-Mitglieder
  ÜBERSCHREIBEN jetzt gleichnamige statische Einträge (per slug) statt
  sie zu duplizieren -- eine Bearbeitung wirkt dadurch für alle.
- window.dogiSiteTexteLaden() + applyTranslations() erweitert um
  data-site-text-key -- Kategorie-Seitentitel (team-modis.html/
  team-scouts.html/creator.html/manager.html) sind jetzt live editierbar.
- Verwaltung: "📥 Bestehende Mitglieder importieren"-Knopf (holt VanVan/
  Diene/Funny/Miss/Marina/Ghost/Patrick/Bananenstift aus den data-*.js-
  Dateien, VanVan bewusst ausgenommen -- eigene Sonderkarte + Seite),
  erweitertes Formular (Intro/ausführliche Vorstellung/zweiter Button,
  eingeklappt unter "Erweitert"), neue Sektion "Kategorien &
  Seitentitel" (4 Karten, sofort wirksam auf Website UND Verwaltung).

Beim Testen einen echten UX-Bug gefunden und gefixt: die "Gespeichert"-
Meldung nach dem Speichern eines Mitglieds wurde von der direkt
anschließenden Formular-Zurücksetzung sofort wieder überschrieben und
war nie sichtbar.

Cache-Busting-Version auf 20260821k erhöht.

Co-Authored-By: Claude Sonnet 5 <[email protected]>
This commit is contained in:
2026-08-21 03:47:51 +02:00
co-authored by Claude Sonnet 5
parent 7060a4a6ae
commit 81f55d67db
41 changed files with 894 additions and 306 deletions
+60
View File
@@ -199,6 +199,22 @@
if (text) el.setAttribute(attr, text);
});
});
// 21.08.2026 (Nutzer-Wunsch: "ich will ich titel und namen von
// kategorien und seiten ändern können in der verwaltung"): admin-
// editierbare Text-Overrides (siehe window.dogiSiteTexteLaden() weiter
// unten). Läuft bewusst NACH den normalen data-i18n-Standardtexten
// oben, damit ein gesetzter Override sie überschreiben kann. Fehlt ein
// Override (Normalfall, noch nichts in der Verwaltung eingetragen),
// bleibt einfach der eingebaute Standardtext stehen -- diese Funktion
// hier macht dann schlicht nichts.
const siteTexte = window.__siteTexteCache || {};
document.querySelectorAll("[data-site-text-key]").forEach((el) => {
const eintrag = siteTexte[el.getAttribute("data-site-text-key")];
if (!eintrag) return;
const text = eintrag[sprache] || eintrag.de;
if (text) el.innerHTML = text;
});
}
/* ---------- Navigationsstruktur (an einer Stelle pflegen) ---------- */
@@ -1052,6 +1068,7 @@
await skripteUebernehmen(dok);
applyTranslations(); // seiteneigene data-i18n-Elemente der neuen Seite übersetzen
if (window.dogiSiteTexteLaden) window.dogiSiteTexteLaden(); // Kategorie-/Seitentitel-Overrides der neuen Seite
}
function nahtloseNavigationAktivieren() {
@@ -1123,6 +1140,7 @@
musikKnopfFarbenAnpassen();
nahtloseNavigationAktivieren();
applyTranslations(); // seiteneigene data-i18n-Elemente (z.B. Startseite) übersetzen
if (window.dogiSiteTexteLaden) window.dogiSiteTexteLaden(); // Kategorie-/Seitentitel-Overrides (siehe Verwaltung)
});
/* Kleine öffentliche Schnittstelle für seiteneigene Inline-Skripte
@@ -1189,12 +1207,19 @@
role: m.rolle || "",
photo: m.foto || "",
avatar: m.foto || "",
// 21.08.2026 (Runde 2, "wenn ich eine änderung mache ist es auch
// für jeden"): volle Feld-Parität mit den von Hand gepflegten
// Profilen, damit ein importiertes/bearbeitetes Profil genau so
// reichhaltig sein kann wie die schon bestehenden.
intro: m.intro || "",
bio: m.bio || "",
bioHtml: m.bioHtml || "",
quote: m.zitat || "",
social: m.tiktok ? { tiktok: m.tiktok } : {},
status: "aktiv", // /team liefert ohnehin nur aktive Mitglieder
rank: m.rang || undefined,
rankLabel: m.rangLabel || undefined,
extraCta: m.extraCta || undefined,
// Markiert admin-gepflegte Einträge (z.B. für profil.html, das
// sonst nicht zwischen fest einprogrammierten und dynamischen
// Personen unterscheiden könnte).
@@ -1205,6 +1230,41 @@
}
};
/* 21.08.2026 (Runde 2, Nutzer-Wunsch: "wenn ich eine änderung mache ist
es auch für jeden für die die schon da sind und die neuen"): fügt eine
per dogiTeamLaden() geladene Liste NICHT einfach hinten an die von Hand
gepflegte Liste an, sondern ÜBERSCHREIBT darin jeden Eintrag mit
demselben slug. So zeigt die Seite nach einem Import + einer
Bearbeitung in der Verwaltung automatisch den aktuellen (DB-)Stand
statt der alten, einprogrammierten Version -- ist das Backend mal
nicht erreichbar, bleibt wenigstens die statische Version sichtbar
(nichts verschwindet einfach). */
window.dogiTeamZusammenfuehren = function (statische, neue) {
if (!neue || !neue.length) return statische;
const neueSlugs = new Set(neue.map((n) => n.slug));
return [...statische.filter((s) => !neueSlugs.has(s.slug)), ...neue];
};
/* 21.08.2026 (Nutzer-Wunsch: "ich will ich titel und namen von
kategorien und seiten ändern können in der verwaltung"): lädt einmalig
alle in der Verwaltung gesetzten Text-Overrides (siehe
server-internal/routes/site-texts.js) und ruft applyTranslations()
danach erneut auf, damit gesetzte Overrides die eingebauten
Standardtexte sofort ersetzen. Ohne Overrides (Normalfall) ändert sich
einfach nichts -- die Seite zeigt weiterhin ihren gewohnten Text. */
window.dogiSiteTexteLaden = async function () {
try {
const res = await fetch(`${TEAM_API_BASIS}/site-texts`, { cache: "no-store" });
const data = await res.json();
if (data && data.ok) {
window.__siteTexteCache = data.texte || {};
applyTranslations();
}
} catch {
/* kein Override verfügbar -> eingebaute Standardtexte bleiben stehen */
}
};
/* ===================================================================
PWA: Service-Worker-Registrierung
Voraussetzung dafür, dass Chrome/Edge auf dem Desktop "App