Die Rolle "Spicy Media" -- und drei Fehler, die nur ihre Pruefung fand
DIE PERSONENTABELLE WURDE NEU GEBAUT. Eine Rolle ist ein erlaubter Wert in einer Spalte, und der steckt in einem CHECK -- den kann SQLite nicht aendern. Auf `personen` zeigen ZWEIUNDFUENFZIG Fremdschluessel. Deshalb wird der Bauplan NICHT abgeschrieben, sondern gelesen: Der CREATE-Text kommt aus sqlite_master, darin wird ausschliesslich die Rollenliste ersetzt, und die Kopierliste kommt aus PRAGMA table_info. Die beiden aelteren Umstellungen schreiben ihre Spalten von Hand ab -- `personen` hat seit damals SIEBEN dazubekommen (bild, ueber_mich, tiktok ...). Wer hier abschreibt, verliert alle Profilbilder. ZWEI FRAGEN, DIE MAN AUSEINANDERHALTEN MUSS: siehtAlles() = DogFather ODER Spicy Media -> Listen, Uebersichten istDogFather() = nur DogFather -> loeschen, Rollen, Codes Es waere weniger Arbeit gewesen, istDogFather() um "spicy" zu erweitern -- und genau das waere der Fehler: Spicy Media koennte dann DogFather loeschen. DER CHAT BRAUCHTE NICHTS. Er haengt allein an der Teilnehmerliste und kennt kein "das Management sieht alles". Spicy Media sieht fremde Gespraeche nicht, weil es dafuer keinen Weg gibt -- nicht, weil eine Abfrage es verbietet. DREI ECHTE FEHLER, alle von pruef-spicy gefunden, keiner vorher sichtbar: 1. MEIN EIGENER KOMMENTAR STAND IM BAUPLAN. SQLite hebt den CREATE-Text woertlich auf, samt Kommentaren. Ich hatte "'spicy' steht HIER mit drin" hineingeschrieben -- und die Erkennung suchte genau dieses Wort im ganzen Text. Ergebnis: Die Umstellung hielt die Tabelle fuer erledigt, obwohl die CHECK-Regel noch die alte war. Jetzt wird die Regel herausgeschnitten und NUR darin gesucht; der Kommentar steht ausserhalb des SQL. 2. DER SICHERUNGSNAME HATTE NUR MINUTEN. `VACUUM INTO` weigert sich, eine vorhandene Datei zu ueberschreiben -- zu Recht. Zwei Umstellungen in derselben Minute wollten in dieselbe Datei, die zweite scheiterte, und weil ohne Sicherung nicht umgestellt wird, blieb sie aus. Es sah nach "lief" aus (die Datei lag ja da) und war keine. Jetzt mit Sekunden. 3. EINE FRISCHE DATENBANK LEGTE DIE ALTE ROLLENLISTE AN und stellte beim allerersten Start sofort um -- Tabelle neu bauen, Sicherung schreiben, fuer nichts. Ein Bauplan, der sofort umgebaut werden muss, ist der falsche. Und ein vierter in der Pruefung selbst: Der Chat-Aufbau benutzte einen falschen Weg, das Gespraech entstand gar nicht -- "Spicy Media sieht 0 Gespraeche" war trotzdem gruen, weil es keine gab. Jetzt ist das Anlegen selbst eine Pruefung, und eine Gegenprobe zeigt, dass Max es sehr wohl sieht. DAZU: Manager sehen die Kachel "Personen & Zugaenge" -- die SEITE geht auf, die Schnittstellen nicht. Alles unter /verwaltung haengt weiter an `nurAdmin` und antwortet 404; sie sehen genau den Teil, fuer den es einen Weg gibt. Spicy Media legt Creator UND Manager an (zweite enge Tuer, Rolle steht auch dort nicht im Aufruf; ein Manager kommt durch sie nicht). Der Rollentext des Managers stimmte nicht mehr -- er legt jetzt Creator an. pruef-spicy: 36 Pruefungen, alle gruen. Ausserdem gruen: personen-liste (33), creator-anlegen (29), sicht (48), css-klassen (15), alle-wege (19), haerte (20), manager-sicht (43). Co-Authored-By: Claude Opus 5 <[email protected]>
This commit is contained in:
@@ -310,22 +310,22 @@
|
||||
unter: 'Was du sowieso jeden Tag aufmachst',
|
||||
bereiche: [
|
||||
{ name: 'Dashboard', unter: 'Alle Creator auf einen Blick', zeichen: 'dashboard', ton: 1,
|
||||
gross: true, rollen: ['admin', 'manager', 'creator', 'scout'], ziel: 'uebersicht.html', szene: 'showbuehne' },
|
||||
gross: true, rollen: ['spicy', 'admin', 'manager', 'creator', 'scout'], ziel: 'uebersicht.html', szene: 'showbuehne' },
|
||||
{ name: 'Aufgaben', unter: 'Offen, in Arbeit, Review', zeichen: 'aufgaben', ton: 13,
|
||||
rollen: ['admin', 'manager', 'creator', 'scout'], ziel: 'aufgaben.html', szene: 'garage' },
|
||||
rollen: ['spicy', 'admin', 'manager', 'creator', 'scout'], ziel: 'aufgaben.html', szene: 'garage' },
|
||||
{ name: 'Kalender', unter: 'Termine und Calls', zeichen: 'kalender', ton: 8,
|
||||
rollen: ['admin', 'manager', 'creator', 'scout'], ziel: 'kalender.html', szene: 'skyline' },
|
||||
rollen: ['spicy', 'admin', 'manager', 'creator', 'scout'], ziel: 'kalender.html', szene: 'skyline' },
|
||||
{ name: 'Calls & Protokolle', unter: 'Gespräche mit To-dos', zeichen: 'calls', ton: 15,
|
||||
rollen: ['admin', 'manager', 'creator', 'scout'], ziel: 'calls.html', szene: 'lounge' },
|
||||
rollen: ['spicy', 'admin', 'manager', 'creator', 'scout'], ziel: 'calls.html', szene: 'lounge' },
|
||||
/* CHAT (06.09.2026). Steht neben "Calls & Protokolle", weil
|
||||
beides Gespraech ist -- das eine geplant und protokolliert,
|
||||
das andere zwischendurch. Ton 14 (Gruen), weil die taegliche
|
||||
Gruppe sonst 3, 11, 16, 9 und 2 traegt und sich der Chat
|
||||
davon abheben soll. */
|
||||
{ name: 'Chat', unter: 'Nachrichten mit deinem Team', zeichen: 'chat', ton: 4,
|
||||
rollen: ['admin', 'manager', 'creator', 'scout'], ziel: 'chat.html', szene: 'lounge' },
|
||||
rollen: ['spicy', 'admin', 'manager', 'creator', 'scout'], ziel: 'chat.html', szene: 'lounge' },
|
||||
{ name: 'Dateien', unter: 'Ablage und Freigaben', zeichen: 'dateien', ton: 19,
|
||||
rollen: ['admin', 'manager', 'creator', 'scout'], ziel: 'dateien.html', szene: 'arena' },
|
||||
rollen: ['spicy', 'admin', 'manager', 'creator', 'scout'], ziel: 'dateien.html', szene: 'arena' },
|
||||
],
|
||||
},
|
||||
{
|
||||
@@ -370,9 +370,9 @@
|
||||
erst wer jemand IST, dann was er vorhat, dann was dabei
|
||||
herauskommt. Die Zahlen zuerst zu zeigen dreht das um. */
|
||||
{ name: 'Mein Steckbrief', unter: 'Dein Bild und deine Kanäle', zeichen: 'steckbrief', ton: 10,
|
||||
rollen: ['admin', 'manager', 'scout'], ziel: 'steckbrief.html', szene: 'halle' },
|
||||
rollen: ['spicy', 'admin', 'manager', 'scout'], ziel: 'steckbrief.html', szene: 'halle' },
|
||||
{ name: 'Creator-Profile', unter: 'Ziele und 90-Tage-Plan', zeichen: 'profil', ton: 20,
|
||||
rollen: ['admin', 'manager', 'scout'], ziel: 'profil.html', szene: 'halle' },
|
||||
rollen: ['spicy', 'admin', 'manager', 'scout'], ziel: 'profil.html', szene: 'halle' },
|
||||
/* KEINE eigene Steckbrief-Kachel fuer Creator, und das ist
|
||||
Absicht: Ihr Steckbrief samt Profilbild steht bereits auf
|
||||
`profil.html` (der Block mit `data-nur-creator="ja"`). Eine
|
||||
@@ -389,19 +389,19 @@
|
||||
wegzunehmen, ohne die Seite zu schliessen, waere nur ein
|
||||
versteckter Weg und keine Regel. */
|
||||
{ name: 'Zahlen', unter: 'Diamanten, LIVE-Tage, Verweildauer', zeichen: 'zahlen', ton: 2,
|
||||
rollen: ['admin'], ziel: 'leistung.html', szene: 'arena' },
|
||||
rollen: ['spicy', 'admin'], ziel: 'leistung.html', szene: 'arena' },
|
||||
{ name: 'Start-Check', unter: 'Erstanalyse, 16 Punkte', zeichen: 'startcheck', ton: 16,
|
||||
rollen: ['admin', 'manager', 'creator', 'scout'], ziel: 'startcheck.html', szene: 'wald' },
|
||||
rollen: ['spicy', 'admin', 'manager', 'creator', 'scout'], ziel: 'startcheck.html', szene: 'wald' },
|
||||
{ name: 'LIVE-Analyse', unter: 'Vorher, während, danach', zeichen: 'live', ton: 3,
|
||||
rollen: ['admin', 'manager', 'creator', 'scout'], ziel: 'bereich.html?b=live', szene: 'portal' },
|
||||
rollen: ['spicy', 'admin', 'manager', 'creator', 'scout'], ziel: 'bereich.html?b=live', szene: 'portal' },
|
||||
{ name: 'Content-Ideen', unter: 'Idee bis Upload', zeichen: 'content', ton: 12,
|
||||
rollen: ['admin', 'manager', 'creator', 'scout'], ziel: 'content.html', szene: 'portal' },
|
||||
rollen: ['spicy', 'admin', 'manager', 'creator', 'scout'], ziel: 'content.html', szene: 'portal' },
|
||||
{ name: 'Community', unter: 'Moderation und Konflikte', zeichen: 'community', ton: 6,
|
||||
rollen: ['admin', 'manager', 'creator', 'scout'], ziel: 'bereich.html?b=community', szene: 'lounge' },
|
||||
rollen: ['spicy', 'admin', 'manager', 'creator', 'scout'], ziel: 'bereich.html?b=community', szene: 'lounge' },
|
||||
{ name: 'Technik', unter: 'Setup, Fehler, Lösungen', zeichen: 'technik', ton: 14,
|
||||
rollen: ['admin', 'manager', 'creator', 'scout'], ziel: 'bereich.html?b=technik', szene: 'garage' },
|
||||
rollen: ['spicy', 'admin', 'manager', 'creator', 'scout'], ziel: 'bereich.html?b=technik', szene: 'garage' },
|
||||
{ name: 'Schutz & Regeln', unter: 'Richtlinien und Vorfälle', zeichen: 'schutz', ton: 5,
|
||||
rollen: ['admin', 'manager', 'creator', 'scout'], ziel: 'bereich.html?b=schutz', szene: 'halle' },
|
||||
rollen: ['spicy', 'admin', 'manager', 'creator', 'scout'], ziel: 'bereich.html?b=schutz', szene: 'halle' },
|
||||
/* DER SECHSTE BEREICH (06.09.2026). Kernprinzip 04 des Konzepts
|
||||
lautet "Die Agentur bleibt angebunden" -- und dafuer gab es
|
||||
bis heute nichts. Fuenf Bereiche standen, dieser fehlte.
|
||||
@@ -415,9 +415,9 @@
|
||||
von pruef-start-ansicht. Ein Untertitel, der mitten im Wort
|
||||
endet, ist schlechter als ein kuerzerer. */
|
||||
{ name: 'Agentur', unter: 'Kampagnen und offizielle Wege', zeichen: 'agentur', ton: 17,
|
||||
rollen: ['admin', 'manager', 'creator', 'scout'], ziel: 'bereich.html?b=agentur', szene: 'halle' },
|
||||
rollen: ['spicy', 'admin', 'manager', 'creator', 'scout'], ziel: 'bereich.html?b=agentur', szene: 'halle' },
|
||||
{ name: 'Reports & Review', unter: 'Woche und Entscheidung', zeichen: 'reports', ton: 7,
|
||||
rollen: ['admin', 'manager', 'creator', 'scout'], ziel: 'report.html', szene: 'showbuehne' },
|
||||
rollen: ['spicy', 'admin', 'manager', 'creator', 'scout'], ziel: 'report.html', szene: 'showbuehne' },
|
||||
],
|
||||
},
|
||||
{
|
||||
@@ -443,11 +443,17 @@
|
||||
einzeln: Man weiss danach nicht mehr, welcher von beiden man
|
||||
glauben soll. */
|
||||
{ name: 'Personen & Zugänge', unter: 'Rollen und Codes', zeichen: 'personen', ton: 11,
|
||||
rollen: ['admin'], ziel: 'personen.html', szene: 'halle' },
|
||||
/* MANAGER SEHEN DIESE KACHEL JETZT AUCH (07.09.2026).
|
||||
Filipe: "die manager sehen immer noch nicht die kachel
|
||||
personen & zugangscode, wo sie dan die neuen creator
|
||||
hinzufuegen koennen." Die SEITE zeigt ihnen nur das
|
||||
Anlegen -- Codes, Sperren, Loeschen und das Protokoll
|
||||
haengen weiterhin an DogFather (siehe personen.js). */
|
||||
rollen: ['spicy', 'admin', 'manager'], ziel: 'personen.html', szene: 'halle' },
|
||||
{ name: 'Scout-Pipeline', unter: 'Entdeckt bis übergeben', zeichen: 'scouting', ton: 21,
|
||||
rollen: ['admin', 'manager', 'scout'], ziel: 'scouting.html', szene: 'wald' },
|
||||
rollen: ['spicy', 'admin', 'manager', 'scout'], ziel: 'scouting.html', szene: 'wald' },
|
||||
{ name: 'Wissens-Bibliothek', unter: 'Anleitungen und PDFs', zeichen: 'wissen', ton: 9,
|
||||
rollen: ['admin', 'manager', 'creator', 'scout'], ziel: 'wissen.html', szene: 'arena' },
|
||||
rollen: ['spicy', 'admin', 'manager', 'creator', 'scout'], ziel: 'wissen.html', szene: 'arena' },
|
||||
/* Ebenfalls nur DogFather (02.09.2026). Was von allein passiert,
|
||||
legt fest, was ALLEN anderen automatisch zugeschoben wird --
|
||||
das gehört in dieselbe Hand wie die Rollenvergabe. */
|
||||
|
||||
@@ -15,10 +15,15 @@
|
||||
/* Reihenfolge und Erklaerung an EINER Stelle. Sie gilt fuer die
|
||||
Rollenwahl im Formular und fuer alles, was sonst Rollen auflistet. */
|
||||
const ROLLEN = [
|
||||
{ wert: 'spicy', name: 'Spicy Media', symbol: 'chili',
|
||||
text: 'Überblick über alle – ohne Automationen, ohne fremde Chats. Legt Leute an.' },
|
||||
{ wert: 'admin', name: 'DogFather', symbol: 'krone',
|
||||
text: 'Alle Rechte, endgültig. Nur DogFather legt DogFather und Manager an.' },
|
||||
text: 'Alle Rechte, endgültig. Nur DogFather legt DogFather, Spicy Media und Manager an.' },
|
||||
/* Der Satz stimmte bis zum 07.09.2026 -- seither legen Manager
|
||||
Creator an, und ein Text, der etwas anderes verspricht als die
|
||||
Oberflaeche tut, ist schlimmer als gar keiner. */
|
||||
{ wert: 'manager', name: 'Manager', symbol: 'stern',
|
||||
text: 'Dieselben Rechte wie DogFather – außer der Personenverwaltung.' },
|
||||
text: 'Dieselben Rechte wie DogFather, ohne Personenverwaltung – legt aber Creator an.' },
|
||||
{ wert: 'scout', name: 'Scout', symbol: 'schutz',
|
||||
text: 'Eigene Pipeline und die Creator, die ihm zugeteilt sind.' },
|
||||
{ wert: 'creator', name: 'Creator', symbol: 'person',
|
||||
@@ -32,7 +37,19 @@
|
||||
/* DogFather und Manager kann nur DogFather vergeben -- der Server
|
||||
lehnt es ohnehin ab, aber ein Knopf, der immer scheitert, gehoert
|
||||
gar nicht erst hin. */
|
||||
for (const r of ROLLEN) {
|
||||
/* WER WELCHE ROLLE VERGEBEN DARF (07.09.2026).
|
||||
|
||||
DogFather: alle. Spicy Media: Manager und Creator. Manager: nur
|
||||
Creator. Der Server setzt dasselbe durch (drei getrennte Wege,
|
||||
siehe workspace-personen.js) -- hier geht es nur darum, niemandem
|
||||
einen Knopf hinzustellen, der eine Absage bringt.
|
||||
|
||||
Aus derselben Liste wie die Beschreibungen, damit die beiden nicht
|
||||
auseinanderlaufen. */
|
||||
const darf = ich?.rolle === 'admin' ? ['spicy', 'admin', 'manager', 'scout', 'creator']
|
||||
: ich?.rolle === 'spicy' ? ['manager', 'creator']
|
||||
: ['creator'];
|
||||
for (const r of ROLLEN.filter((x) => darf.includes(x.wert))) {
|
||||
if ((r.wert === 'admin' || r.wert === 'manager') && ich.rolle !== 'admin') continue;
|
||||
const b = el('button', 'rollenwahl__knopf');
|
||||
b.type = 'button';
|
||||
@@ -627,10 +644,27 @@
|
||||
const knopf = $('neu-speichern');
|
||||
knopf.disabled = true;
|
||||
try {
|
||||
const a = await hole('/workspace/api/verwaltung/personen', {
|
||||
/* DREI TUEREN, EINE AUSWAHL (07.09.2026).
|
||||
|
||||
DogFather geht durch die Verwaltungstuer und kann jede Rolle
|
||||
vergeben. Manager und Spicy Media haben dort nichts zu suchen --
|
||||
fuer sie gibt es zwei enge Tueren, die je genau eine Rolle
|
||||
anlegen und die Rolle gar nicht erst als Feld annehmen.
|
||||
|
||||
Die Zuordnung steht hier und nicht in einer Abfrage im Server:
|
||||
Der Server prueft ohnehin, WER durch welche Tuer darf. Diese
|
||||
Zeilen sorgen nur dafuer, dass niemand gegen eine verschlossene
|
||||
laeuft. */
|
||||
const rolle = gewaehlteRolle();
|
||||
const weg = ich.rolle === 'admin' ? '/workspace/api/verwaltung/personen'
|
||||
: rolle === 'manager' ? '/workspace/api/manager-anlegen'
|
||||
: '/workspace/api/creator-anlegen';
|
||||
const a = await hole(weg, {
|
||||
method: 'POST',
|
||||
headers: { 'Content-Type': 'application/json' },
|
||||
body: JSON.stringify({ name: $('f-name').value, rolle: gewaehlteRolle() }),
|
||||
body: JSON.stringify(ich.rolle === 'admin'
|
||||
? { name: $('f-name').value, rolle }
|
||||
: { name: $('f-name').value }),
|
||||
});
|
||||
if (!a.ok) {
|
||||
$('neu-fehler').textContent = (await a.json().catch(() => ({}))).fehler || 'Ging nicht.';
|
||||
@@ -653,6 +687,43 @@
|
||||
} catch { return; }
|
||||
if (!LEITUNG.has(ich.rolle)) { location.assign('/workspace/start.html'); return; }
|
||||
window.werZeigen?.(ich);
|
||||
|
||||
/* ===================================================================
|
||||
DIE SEITE HAT ZWEI AUSBAUSTUFEN (07.09.2026)
|
||||
|
||||
Filipe: "die sollen in der kategorie wo die jetzt sehen werden
|
||||
auch noch das mit den hinzufuegen sehen, alles andere auf der
|
||||
seite sollen die weiterhin nicht sehen."
|
||||
|
||||
DogFather bekommt die Seite wie bisher: Liste, Codes, Sperren,
|
||||
Loeschen, Protokoll. Manager und Spicy Media bekommen genau EINEN
|
||||
Teil davon -- das Anlegen.
|
||||
|
||||
DAS VERSTECKEN IST NICHT DIE SICHERUNG. Alles, was hier
|
||||
ausgeblendet wird, haengt am Server an `nurAdmin` und antwortet
|
||||
mit 404. Wuerde diese Zeile fehlen, saehen sie leere Kaesten und
|
||||
Fehlermeldungen -- aber keine Daten. Das Ausblenden erspart ihnen
|
||||
nur den Anblick von Dingen, die es fuer sie nicht gibt.
|
||||
|
||||
Und deshalb wird auch `laden()` NICHT aufgerufen: Es fragt die
|
||||
Verwaltungsschnittstelle ab, und die ist zu. Eine Abfrage, von der
|
||||
man weiss, dass sie 404 gibt, sollte man nicht stellen -- sie
|
||||
fuellt nur das Serverlog. */
|
||||
const nurAnlegen = ich.rolle !== 'admin';
|
||||
if (nurAnlegen) {
|
||||
document.body.dataset.nurAnlegen = 'ja';
|
||||
$('unterzeile') && ($('unterzeile').textContent =
|
||||
'Hier legst du neue Leute an. Codes, Sperren und das Protokoll bleiben bei DogFather.');
|
||||
baueRollenwahl();
|
||||
/* Das Formular steht offen da -- es ist der einzige Grund, warum
|
||||
diese Seite fuer sie ueberhaupt aufgeht. Ein Knopf, der eine
|
||||
leere Seite oeffnet, waere ein Klick ohne Zweck. */
|
||||
$('neu').hidden = false;
|
||||
$('neu-oeffnen').hidden = true;
|
||||
$('neu-abbrechen').hidden = true;
|
||||
return;
|
||||
}
|
||||
|
||||
baueRollenwahl();
|
||||
await laden();
|
||||
})();
|
||||
|
||||
@@ -27,8 +27,12 @@
|
||||
'use strict';
|
||||
|
||||
const ROLLENTEXT = {
|
||||
spicy: 'Spicy Media · Überblick über alle, ohne Automationen',
|
||||
admin: 'DogFather · Gesamtübersicht und Freigaben',
|
||||
manager: 'Manager · dieselben Rechte, ohne Personenverwaltung',
|
||||
/* Der Satz stimmte bis zum 07.09.2026. Seither legen Manager
|
||||
Creator an -- und ein Rollentext, der etwas anderes verspricht als
|
||||
die Oberflaeche kann, ist schlimmer als gar keiner. */
|
||||
manager: 'Manager · dieselben Rechte, ohne Personenverwaltung – legt Creator an',
|
||||
creator: 'Creator · dein eigener Bereich',
|
||||
scout: 'Scout · deine Pipeline und die Creator, die du betreust',
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user