From 1c3e642f12417b41c6567758dd4ce2476e75c83a Mon Sep 17 00:00:00 2001 From: Dogfather Date: Fri, 28 Aug 2026 11:55:05 +0200 Subject: [PATCH] Workspace: Rolle "Management" heisst jetzt "DogFather" MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Auf Wunsch von Filipe. Betrifft ausschliesslich die Anzeige. Der Rollenschluessel bleibt "admin". Er steckt in der CHECK-Regel der Datenbank, in jeder bestehenden Sitzung und in jeder Rechteabfrage -- ihn umzubenennen haette alle drei gebrochen, und bestehende Anmeldungen waeren ungueltig geworden. Umbenannt wird nur, was man LIEST. Der Anzeigename steht jetzt an EINER Stelle (ROLLEN_NAME in workspace.js) und kommt ueber /workspace/api/ich als rolle_name mit. Stand er in elf Dateien, waere er beim naechsten Mal in zehn davon geaendert. Dabei aufgefallen: In der Kopfleiste stand auf JEDER Seite der rohe Rollenschluessel -- "Chef · admin". Das war schon vorher unschoen, faellt aber jetzt erst richtig auf. Alle elf Seiten zeigen jetzt "Chef · DogFather". Geprueft: kein rohes "admin" mehr in der Oberflaeche. Geaendert: Rollenkachel und Untertitel auf der Anmeldeseite, Kopfleiste aller Seiten, Rollentext auf dem Dashboard, Rollenmarken und Auswahl in der Personenverwaltung, die Betreuungs-Auswahl ("nur DogFather"), der Hinweis auf der Dateienseite, die Erklaerung zur internen Notiz im Profil, die Hinweise fuer Scouts ohne Zuteilung -- und vier Fehlermeldungen vom Server. Schreibweise "DogFather" wie von Filipe geschrieben; das ist auch auf der oeffentlichen Website die haeufigste Form (717 von 1216). In den Code-Kommentaren der Fachmodule heisst die Rolle weiterhin "das Management". Das bleibt bewusst so -- eine Massenaenderung an vierzig Kommentaren waere reines Risiko ohne sichtbaren Nutzen. Ein Hinweis an der ROLLEN_NAME-Zuordnung erklaert den Zusammenhang. --- server/workspace-dateien.js | 8 ++++---- server/workspace-personen.js | 2 +- server/workspace-scouts.js | 2 +- server/workspace.js | 20 +++++++++++++++++++- workspace/assets/js/aufgaben.js | 2 +- workspace/assets/js/bereich.js | 2 +- workspace/assets/js/calls.js | 2 +- workspace/assets/js/dateien.js | 2 +- workspace/assets/js/gate.js | 2 +- workspace/assets/js/kalender.js | 2 +- workspace/assets/js/personen.js | 8 ++++---- workspace/assets/js/profil.js | 6 +++--- workspace/assets/js/report.js | 4 ++-- workspace/assets/js/scouting.js | 4 ++-- workspace/assets/js/start.js | 4 ++-- workspace/assets/js/startcheck.js | 4 ++-- workspace/dateien.html | 2 +- workspace/index.html | 8 ++++---- workspace/personen.html | 2 +- workspace/profil.html | 4 ++-- 20 files changed, 54 insertions(+), 36 deletions(-) diff --git a/server/workspace-dateien.js b/server/workspace-dateien.js index 17410819..11831443 100644 --- a/server/workspace-dateien.js +++ b/server/workspace-dateien.js @@ -129,7 +129,7 @@ function nameAusKopf(req) { function darfHochladen(req, res, next) { if (!DARF_HOCHLADEN.has(req.person.rolle)) { return res.status(403).json({ - fehler: "Dateien legen das Management und die Scouts ab.", + fehler: "Dateien legen DogFather und die Scouts ab.", }); } next(); @@ -263,10 +263,10 @@ dateienRouter.patch("/workspace/api/dateien/:id", gleicheHerkunft, (req, res) => /* "freigegeben" ist eine Abnahme -- die trifft laut Konzept das Management, nicht der, der die Datei hochgeladen hat. */ if (req.body.status === "freigegeben" && req.person.rolle !== "admin") { - return res.status(403).json({ fehler: "Freigeben darf nur das Management." }); + return res.status(403).json({ fehler: "Freigeben darf nur DogFather." }); } if (datei.status === "freigegeben" && req.person.rolle !== "admin") { - return res.status(403).json({ fehler: "Freigegebene Dateien ändert nur das Management." }); + return res.status(403).json({ fehler: "Freigegebene Dateien ändert nur DogFather." }); } setz.push("status = ?"); daten.push(req.body.status); } @@ -309,7 +309,7 @@ dateienRouter.delete("/workspace/api/dateien/:id", gleicheHerkunft, (req, res) = return res.status(403).json({ fehler: "nicht_erlaubt" }); } if (datei.status === "freigegeben") { - return res.status(403).json({ fehler: "Freigegebene Dateien löscht nur das Management." }); + return res.status(403).json({ fehler: "Freigegebene Dateien löscht nur DogFather." }); } } diff --git a/server/workspace-personen.js b/server/workspace-personen.js index 76ff61ae..5c2c62c5 100644 --- a/server/workspace-personen.js +++ b/server/workspace-personen.js @@ -180,7 +180,7 @@ personenRouter.patch("/workspace/api/verwaltung/personen/:id", gleicheHerkunft, if (!aktiv && person.rolle === "admin") { const { n } = db().prepare( "SELECT COUNT(*) AS n FROM personen WHERE rolle = 'admin' AND aktiv = 1").get(); - if (n <= 1) return res.status(400).json({ fehler: "Das ist das letzte aktive Management." }); + if (n <= 1) return res.status(400).json({ fehler: "Das ist der letzte aktive DogFather-Zugang." }); } personSperren(id, aktiv, { ...req.person, ip: echteIp(req) }); } diff --git a/server/workspace-scouts.js b/server/workspace-scouts.js index 2941a6bb..6656c6d4 100644 --- a/server/workspace-scouts.js +++ b/server/workspace-scouts.js @@ -227,7 +227,7 @@ scoutRouter.delete("/workspace/api/leads/:id", gleicheHerkunft, (req, res) => { /* Ein übergebener Lead ist Teil der Betreuungsgeschichte -- den räumt nur das Management weg. */ if (req.person.rolle !== "admin" && lead.status === "uebergeben") { - return res.status(403).json({ fehler: "Übergebene Leads löscht nur das Management." }); + return res.status(403).json({ fehler: "Übergebene Leads löscht nur DogFather." }); } db().prepare("DELETE FROM leads WHERE id = ?").run(id); protokolliere("lead_geloescht", { diff --git a/server/workspace.js b/server/workspace.js index 0b54e9a3..2c686f65 100644 --- a/server/workspace.js +++ b/server/workspace.js @@ -54,6 +54,21 @@ const VERSUCHE_MAX = 8; // pro IP const VERSUCHE_FENSTER_MIN = 10; const ROLLEN = new Set(["admin", "creator", "scout"]); +/* Der Rollenschluessel bleibt "admin" -- er steckt in der CHECK-Regel der + Datenbank, in jeder Sitzung und in jeder Rechteabfrage. Umbenannt wird + nur, was man LIEST. Diese Zuordnung ist die einzige Stelle dafuer: + Stand der Anzeigename in elf Dateien, waere er beim naechsten Mal in + zehn davon geaendert. + + Hinweis fuer spaeter: In den Kommentaren der Fachmodule heisst die + Rolle "admin" weiterhin "das Management". Gemeint ist dieselbe Rolle, + die in der Oberflaeche "DogFather" heisst. */ +export const ROLLEN_NAME = { + admin: "DogFather", + creator: "Creator", + scout: "Scout", +}; + /* scrypt-Parameter. N=2^15 braucht auf diesem Server rund 150 ms — spürbar genug, um Rateversuche auszubremsen, und unauffällig für einen echten Anmeldevorgang. Die Werte werden je Datensatz mitgespeichert, damit sie @@ -529,7 +544,10 @@ workspaceRouter.get("/workspace/api/ich", (req, res) => { erkennen, welcher Eintrag der eigene ist (etwa "das bin ich" in der Personenliste), und das eigene Profil liesse sich gar nicht aufrufen. Ein Geheimnis ist sie nicht -- sie beschreibt nur den Angemeldeten. */ - res.json({ id: person.id, name: person.name, rolle: person.rolle }); + res.json({ + id: person.id, name: person.name, rolle: person.rolle, + rolle_name: ROLLEN_NAME[person.rolle] ?? person.rolle, + }); }); /* ---------- Verwaltung (nur über die Kommandozeile) -------------------- diff --git a/workspace/assets/js/aufgaben.js b/workspace/assets/js/aufgaben.js index 8c3ba146..1af408b2 100644 --- a/workspace/assets/js/aufgaben.js +++ b/workspace/assets/js/aufgaben.js @@ -260,7 +260,7 @@ Das laesst sich nicht rueckgaengig machen. Erledigte Aufgaben sollten normalerwe ich = await antwort.json(); } catch { return; } - $('wer').textContent = `${ich.name} · ${ich.rolle}`; + $('wer').textContent = `${ich.name} · ${ich.rolle_name || ich.rolle}`; if (ich.rolle === 'admin') { $('feld-creator').hidden = false; diff --git a/workspace/assets/js/bereich.js b/workspace/assets/js/bereich.js index 89b19f85..e5c57662 100644 --- a/workspace/assets/js/bereich.js +++ b/workspace/assets/js/bereich.js @@ -200,7 +200,7 @@ if (!a.ok) { location.assign('/workspace/'); return; } ich = await a.json(); } catch { return; } - $('wer').textContent = ich.name + ' · ' + ich.rolle; + $('wer').textContent = ich.name + ' · ' + (ich.rolle_name || ich.rolle); let daten; try { diff --git a/workspace/assets/js/calls.js b/workspace/assets/js/calls.js index 1eb398a0..38251c0c 100644 --- a/workspace/assets/js/calls.js +++ b/workspace/assets/js/calls.js @@ -328,7 +328,7 @@ if (!a.ok) { location.assign('/workspace/'); return; } ich = await a.json(); } catch { return; } - $('wer').textContent = ich.name + ' · ' + ich.rolle; + $('wer').textContent = ich.name + ' · ' + (ich.rolle_name || ich.rolle); await laden(); })(); })(); diff --git a/workspace/assets/js/dateien.js b/workspace/assets/js/dateien.js index 6b0b7504..f7092ff8 100644 --- a/workspace/assets/js/dateien.js +++ b/workspace/assets/js/dateien.js @@ -214,7 +214,7 @@ if (!a.ok) { location.assign('/workspace/'); return; } ich = await a.json(); } catch { return; } - $('wer').textContent = ich.name + ' · ' + ich.rolle; + $('wer').textContent = ich.name + ' · ' + (ich.rolle_name || ich.rolle); /* Creator laden nichts hoch (Wunsch 28.08.2026). Das Ablegefeld verschwindet, stattdessen steht dort, warum -- ein einfach diff --git a/workspace/assets/js/gate.js b/workspace/assets/js/gate.js index 82a2724e..d6e12ba8 100644 --- a/workspace/assets/js/gate.js +++ b/workspace/assets/js/gate.js @@ -15,7 +15,7 @@ const knopf = $('knopf'); const fuer = $('fuer'); - const NAMEN = { admin: 'Management', creator: 'Creator', scout: 'Scout' }; + const NAMEN = { admin: 'DogFather', creator: 'Creator', scout: 'Scout' }; const SPEICHER = 'dfw.rolle'; let gewaehlt = null; diff --git a/workspace/assets/js/kalender.js b/workspace/assets/js/kalender.js index a921b00d..0ff4c076 100644 --- a/workspace/assets/js/kalender.js +++ b/workspace/assets/js/kalender.js @@ -242,7 +242,7 @@ if (!a.ok) { location.assign('/workspace/'); return; } ich = await a.json(); } catch { return; } - $('wer').textContent = ich.name + ' · ' + ich.rolle; + $('wer').textContent = ich.name + ' · ' + (ich.rolle_name || ich.rolle); if (ich.rolle === 'admin') { $('feld-teilnehmer').hidden = false; diff --git a/workspace/assets/js/personen.js b/workspace/assets/js/personen.js index b705f9dd..2b484368 100644 --- a/workspace/assets/js/personen.js +++ b/workspace/assets/js/personen.js @@ -1,12 +1,12 @@ /* =================================================================== - Personen und Zugangscodes verwalten. Nur für Management -- der Server + Personen und Zugangscodes verwalten. Nur für DogFather -- der Server liefert allen anderen ohnehin 404 auf diese Schnittstellen. =================================================================== */ (() => { 'use strict'; const $ = (id) => document.getElementById(id); - const ROLLENNAME = { admin: 'Management', creator: 'Creator', scout: 'Scout' }; + const ROLLENNAME = { admin: 'DogFather', creator: 'Creator', scout: 'Scout' }; let ich = null; const el = (tag, klasse, text) => { @@ -88,7 +88,7 @@ const w = el('select', 'betreuung__wahl'); w.id = 'betreuer-' + p.id; const leer = document.createElement('option'); - leer.value = ''; leer.textContent = 'nur Management'; + leer.value = ''; leer.textContent = 'nur DogFather'; w.append(leer); for (const s2 of betreuerListe) { const o = document.createElement('option'); @@ -230,7 +230,7 @@ ich = await a.json(); } catch { return; } if (ich.rolle !== 'admin') { location.assign('/workspace/start.html'); return; } - $('wer').textContent = `${ich.name} · ${ich.rolle}`; + $('wer').textContent = `${ich.name} · ${ich.rolle_name || ich.rolle}`; await laden(); })(); })(); diff --git a/workspace/assets/js/profil.js b/workspace/assets/js/profil.js index d23efd43..13200b2e 100644 --- a/workspace/assets/js/profil.js +++ b/workspace/assets/js/profil.js @@ -97,9 +97,9 @@ if (!a.ok) { location.assign('/workspace/'); return; } ich = await a.json(); } catch { return; } - /* Scouts betreuen ihre zugeteilten Creator wie das Management -- + /* Scouts betreuen ihre zugeteilten Creator wie DogFather -- sie sehen aber nur die management-internen Felder nicht. */ - $('wer').textContent = ich.name + ' · ' + ich.rolle; + $('wer').textContent = ich.name + ' · ' + (ich.rolle_name || ich.rolle); let liste; try { liste = await (await hole('/workspace/api/profil')).json(); } catch { return; } @@ -107,7 +107,7 @@ if (ich.rolle === 'admin' || ich.rolle === 'scout') { if (!liste.creator.length) { $('unterzeile').textContent = ich.rolle === 'scout' - ? 'Dir ist noch kein Creator zugeteilt. Das Management legt fest, wen du betreust.' + ? 'Dir ist noch kein Creator zugeteilt. DogFather legt fest, wen du betreust.' : 'Es gibt noch keinen Creator. Lege zuerst unter Personen & Zugänge einen an.'; return; } diff --git a/workspace/assets/js/report.js b/workspace/assets/js/report.js index 6eadd914..cee79ec7 100644 --- a/workspace/assets/js/report.js +++ b/workspace/assets/js/report.js @@ -200,7 +200,7 @@ if (!a.ok) { location.assign('/workspace/'); return; } ich = await a.json(); } catch { return; } - $('wer').textContent = ich.name + ' · ' + ich.rolle; + $('wer').textContent = ich.name + ' · ' + (ich.rolle_name || ich.rolle); try { const { creator } = await (await hole('/workspace/api/report/creator')).json(); @@ -214,7 +214,7 @@ fuer ihn nicht, das waere die Gesamtuebersicht. */ if (!creator.length) { $('unterzeile').textContent = - 'Dir ist noch kein Creator zugeteilt. Das Management legt fest, wen du betreust.'; + 'Dir ist noch kein Creator zugeteilt. DogFather legt fest, wen du betreust.'; return; } $('creator-block').hidden = false; diff --git a/workspace/assets/js/scouting.js b/workspace/assets/js/scouting.js index 01a0693a..8e0ddd6b 100644 --- a/workspace/assets/js/scouting.js +++ b/workspace/assets/js/scouting.js @@ -340,7 +340,7 @@ ich = await a.json(); } catch { return; } if (ich.rolle === 'creator') { location.assign('/workspace/start.html'); return; } - $('wer').textContent = ich.name + ' · ' + ich.rolle; + $('wer').textContent = ich.name + ' · ' + (ich.rolle_name || ich.rolle); if (ich.rolle === 'admin') { $('unterzeile').textContent = 'Gesamtübersicht über alle Scouts.'; @@ -358,7 +358,7 @@ } catch { return; } $('f-scout').addEventListener('change', zeichne); } else { - $('unterzeile').textContent = 'Deine Pipeline – nur du und das Management sehen sie.'; + $('unterzeile').textContent = 'Deine Pipeline – nur du und DogFather sehen sie.'; } await laden(); diff --git a/workspace/assets/js/start.js b/workspace/assets/js/start.js index 2934048a..c650d98d 100644 --- a/workspace/assets/js/start.js +++ b/workspace/assets/js/start.js @@ -7,7 +7,7 @@ 'use strict'; const ROLLENTEXT = { - admin: 'Management · Gesamtübersicht und Freigaben', + admin: 'DogFather · Gesamtübersicht und Freigaben', creator: 'Creator · dein eigener Bereich', scout: 'Scout · deine Pipeline und die Creator, die du betreust', }; @@ -48,7 +48,7 @@ return; } - $('wer').textContent = `${ich.name} · ${ich.rolle}`; + $('wer').textContent = `${ich.name} · ${ich.rolle_name || ich.rolle}`; $('gruss').textContent = `Willkommen, ${ich.name}`; $('rollentext').textContent = ROLLENTEXT[ich.rolle] || ich.rolle; diff --git a/workspace/assets/js/startcheck.js b/workspace/assets/js/startcheck.js index d4cc999e..daa2ce06 100644 --- a/workspace/assets/js/startcheck.js +++ b/workspace/assets/js/startcheck.js @@ -254,7 +254,7 @@ if (!a.ok) { location.assign('/workspace/'); return; } ich = await a.json(); } catch { return; } - $('wer').textContent = ich.name + ' · ' + ich.rolle; + $('wer').textContent = ich.name + ' · ' + (ich.rolle_name || ich.rolle); let liste; try { liste = await (await hole('/workspace/api/startcheck/creator')).json(); } catch { return; } @@ -262,7 +262,7 @@ if (!liste.creator.length) { $('felder').textContent = ''; $('felder').append(el('p', 'leer-hinweis', ich.rolle === 'scout' - ? 'Dir ist noch kein Creator zugeteilt. Das Management legt fest, wen du betreust.' + ? 'Dir ist noch kein Creator zugeteilt. DogFather legt fest, wen du betreust.' : 'Es gibt noch keinen Creator.')); return; } diff --git a/workspace/dateien.html b/workspace/dateien.html index 5543e799..9b47169f 100644 --- a/workspace/dateien.html +++ b/workspace/dateien.html @@ -44,7 +44,7 @@ Feld wirkt wie ein Fehler. --> @@ -69,7 +69,7 @@ - Management + DogFather Gesamtübersicht & Freigaben diff --git a/workspace/personen.html b/workspace/personen.html index 53faf5e0..8ca986cf 100644 --- a/workspace/personen.html +++ b/workspace/personen.html @@ -50,7 +50,7 @@ diff --git a/workspace/profil.html b/workspace/profil.html index 80d9f4fb..54bdb34d 100644 --- a/workspace/profil.html +++ b/workspace/profil.html @@ -108,12 +108,12 @@ -