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:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user