Ein Creator hakt seine fuenf Ersten Schritte ab, sieht seinen
Fortschritt im Kopf, bekommt unter „Was ist dran" den Punkt „Erste
Schritte noch offen" und ganz oben auf der Startseite eine breite
Kachel „Fang hier an". Alle drei verschwinden von selbst, sobald er
durch ist -- niemand muss etwas wegklicken oder abschalten.
EINE QUELLE, DREI ANZEIGEN.
Der Bauplan wollte einen Punkt bei „Was ist dran" UND einen eigenen
Zaehler an der Kachel. Zwei getrennt gebaute Zaehler zeigen irgendwann
zwei verschiedene Zahlen uebereinander auf einem Bildschirm. Es gibt
deshalb nur `offeneHinweise()`: Daraus kommen die Zeile, die Zahl an
der kleinen Kachel und die Zahl an der breiten. Die breite Kachel
entsteht ausserdem aus der BEREITS GEFILTERTEN Kachelliste und erbt
damit beide Schranken (Rollenliste und Rechtetafel), statt sie ein
drittes Mal zu beantworten.
Gespeichert wird nur Erledigtes: eine Zeile heisst „abgehakt", keine
Zeile heisst „offen". Kein Feld mit 0 und 1 -- sonst gaebe es zwei
Arten, „offen" zu sagen.
DIE WICHTIGSTE ENTDECKUNG WAR NICHT TEIL DIESER ETAPPE.
`pruef-kachel-universum` wurde rot. Nachgemessen gegen den Stand VOR
Etappe 1: Sie war schon rot -- seit dem 02.10., und zwar wegen Ton 47
(Manager-Ziele, #7368ff), den ich selbst eingetragen habe. Im
Kommentar daneben steht sogar meine eigene Messung: „Abstand zum
naechsten Nachbarn 0,0899 ... knapp unter der 0,090". Ich habe die
Zahl hingeschrieben und die Pruefung nie laufen lassen. Vier Tage.
#7368ff -> #7269ff. Eine Hexziffer, Abstand zum alten Wert 0,0024 --
das sieht kein Mensch --, aber der Abstand zur naechsten Kachel im
eigenen Haus steigt von 0,0899 auf 0,0918. Nicht die am weitesten
entfernte Farbe genommen (das waere ein grelles Gruen gewesen):
Manager-Ziele ist in Benutzung und violett, gesucht war die kleinste
Aenderung, die die Regel haelt.
UND DIE REGEL SELBST WAR FUER EIN HAUS GESCHRIEBEN.
Auch mit sauberem Ton 47 blieb die Pruefung rot: Sie vergleicht ALLE
48 Toene miteinander, und rechnerisch ist 0,09 fuer 48 Farben nicht zu
halten (das Werkzeug findet als besten freien Platz 0,0793). Seit dem
24.09.2026 gibt es aber zwei Haeuser, und eine Kachel des einen steht
nie neben einer des anderen -- sie liegen auf verschiedenen Adressen.
Die Messung ist jetzt haus-bewusst: 0,09 innerhalb eines Hauses
(streng, und mit rund 24 Farden je Haus zu halten -- gemessen 0,0905),
ein Boden von 0,06 ueber die Haeuser hinweg. Das ist SCHAERFER, nicht
weicher: Vorher verteilte sich die Grenze auf 48 Farben und war
unerreichbar, weshalb die Pruefung dauerhaft rot stand -- und eine
Warnung, die immer kommt, ist keine mehr. Welcher Ton zu welchem Haus
gehoert, wird aus bereiche.js abgeleitet, nicht aufgelistet. Dazu eine
Gegenprobe, dass die Einteilung ueberhaupt trennt (553 Paare im Haus,
575 darueber hinweg).
NOCH EINE FESTE ZAHL ERSETZT: `pruef-start-ansicht` verlangte „genau
drei Gruppen" fuer einen Creator. Mit „Fang hier an" sind es
zeitweilig vier, und beides ist richtig. Gezaehlt wird nicht mehr,
sondern benannt -- auch das die schaerfere Pruefung: Die alte Zeile
waere gruen geblieben, wenn eine der drei Gruppen verschwindet und
eine fremde dazukommt.
Gemessen
pruef-anleitung 70 Pruefungen, 0 Fehler (vorher 47)
pruef-rollen 402 Pruefungen, 0 Fehler (vorher 401)
pruef-kachel-universum 16 Pruefungen, 0 Fehler (vorher 13, davon 1 rot)
pruef-start-ansicht alles in Ordnung (vorher 1 rot)
pruef-kachelraster 24 Pruefungen, 0 Fehler
pruef-css-klassen alles in Ordnung, 42 Stellen unter 11,5 px
mess-anleitung mit offenen Schritten: Gruppe „Fang hier an",
breite Kachel mit Zaehler 5, Hinweiszeile.
Nach dem Abhaken: alle drei weg, ein Weg
statt drei. Kein Querschieben bei 412/1440 px.
Sicherung: ~/sicherungen/workspace-vor-anleitung-e2-20261006-1421.db
Co-Authored-By: Claude Opus 5 <[email protected]>
405 lines
18 KiB
JavaScript
405 lines
18 KiB
JavaScript
/* =====================================================================
|
||
DIE ANLEITUNG — Tabellen und Inhalte
|
||
|
||
Bauplan: "Kachel Anleitung — Bauplan fuer die Einweisung neuer
|
||
Leute", Stand 06.10.2026. Geprueft und ergaenzt in
|
||
`02 Projekte/Anleitung-Kachel – Bauplan.md` (Obsidian).
|
||
|
||
---------------------------------------------------------------------
|
||
WAS HIER *NICHT* STEHT, UND WARUM DAS DER KERN IST
|
||
|
||
Eine Karte der Anleitung zeigt Symbol, Farbe, Name und Ziel der
|
||
echten Kachel. Nichts davon steht in dieser Datenbank.
|
||
|
||
Es steht in `workspace/assets/js/bereiche.js`, und zwar genau
|
||
einmal. Wuerde man es hier noch einmal hinschreiben, haette man zwei
|
||
Listen: Die eine wird gepflegt, wenn eine Kachel umbenannt wird, die
|
||
andere nicht — und ab da erklaert die Anleitung eine Kachel, die es
|
||
so nicht mehr gibt. Das ist derselbe Fehler, der am 11.09.2026 beim
|
||
Spaltenumbau drei Spalten gekostet hat: eine abgeschriebene Liste.
|
||
|
||
Gespeichert wird deshalb nur, was der Bauplan NEU hinzufuegt:
|
||
die Stufe und die drei Saetze (Wozu / Was du hier tust / Merke).
|
||
Verbunden wird ueber den Kachel-Schluessel.
|
||
|
||
---------------------------------------------------------------------
|
||
DER KACHEL-SCHLUESSEL wird aus dem Ziel ABGELEITET, nicht vergeben:
|
||
|
||
uebersicht.html -> uebersicht
|
||
bereich.html?b=live -> bereich:live
|
||
|
||
Das muss sein, weil zwei Faelle sonst zusammenfallen:
|
||
|
||
* `bereich.html` ist FUENF Kacheln (live, community, technik,
|
||
schutz, agentur). Ueber die Seite allein waeren sie eine.
|
||
* `profil.html` heisst beim Creator "Mein Profil" und beim Manager
|
||
"Creator-Profile" — zwei Karten, eine Adresse. Hier trennt sie
|
||
die Rolle im Schluessel (haus, rolle, kachel).
|
||
|
||
---------------------------------------------------------------------
|
||
DIE HAUS-SPALTE ist leer gelaufene Vorsorge und soll es bleiben.
|
||
|
||
Entscheidung Filipe, 06.10.2026: "Jetzt nur Agentur, aber
|
||
vorbereitet." Team Dogi bekommt heute keine Anleitung. Die Spalte
|
||
kostet jetzt ein Feld; sie spaeter nachzuruesten hiesse, jede Zeile
|
||
und jeden Schluessel anzufassen.
|
||
===================================================================== */
|
||
|
||
/** Die drei Stufen. Reihenfolge ist die Anzeigereihenfolge. */
|
||
export const STUFEN = [
|
||
{ schluessel: "muss", name: "Muss",
|
||
titel: "Das brauchst du sofort",
|
||
unter: "Ohne das laeuft der Alltag nicht.",
|
||
offen: true },
|
||
{ schluessel: "regelmaessig", name: "Regelmäßig",
|
||
titel: "Das kommt regelmäßig",
|
||
unter: "Woechentlich, monatlich oder bei jedem neuen Creator.",
|
||
offen: false },
|
||
{ schluessel: "bedarf", name: "Bei Bedarf",
|
||
titel: "Das brauchst du nur bei Bedarf",
|
||
unter: "Nur oeffnen, wenn es einen Anlass gibt.",
|
||
offen: false },
|
||
];
|
||
|
||
export const STUFEN_SCHLUESSEL = STUFEN.map((s) => s.schluessel);
|
||
|
||
/** Die Rollen, die eine eigene Fassung bekommen.
|
||
*
|
||
* OHNE 'admin'. DogFather bekommt keine Einweisung (Bauplan,
|
||
* Kapitel 11) — bei ihm oeffnet dieselbe Adresse ab Etappe 4 die
|
||
* Pflege-Ansicht. */
|
||
export const FASSUNGEN = ["creator", "scout", "manager", "spicy"];
|
||
|
||
/** Wer die Texte aendern darf.
|
||
*
|
||
* DogFather UND Spicy — Entscheidung Filipe am 06.10.2026, und zwar
|
||
* ausdruecklich dieselbe Regel wie bei den Manager-Zielen am
|
||
* 02.10.2026 ("dogfather und spicy rolle sollen gleichzeitig es immer
|
||
* aendern koennen fuer alle"). Der Bauplan hatte hier "nur DogFather"
|
||
* stehen; zwei verschiedene Regeln fuer dieselbe Frage sind eine
|
||
* Regel, die man sich nicht merken kann. */
|
||
export const PFLEGE_ROLLEN = ["admin", "spicy"];
|
||
|
||
/** Die Arten von Listenzeilen in `anl_zeile`.
|
||
*
|
||
* EINE TABELLE STATT FUENF. Satz, Schritt, Nicht-deins, Takt und Frage
|
||
* sind alle dasselbe: eine geordnete Zeile mit hoechstens zwei Texten
|
||
* und manchmal einem Ziel. Fuenf Tabellen waeren fuenfmal dieselbe
|
||
* Spaltenliste, fuenf Indizes und fuenf Stellen, an denen die
|
||
* Haus-Spalte vergessen werden kann. */
|
||
export const ZEILEN_ARTEN = {
|
||
/* "In 60 Sekunden" — drei Saetze. Nur `text`. */
|
||
satz: { titel: false, ziel: false },
|
||
/* "Erste Schritte" — `titel` ist die Kachel, `ziel` der Sprung. */
|
||
schritt: { titel: true, ziel: true },
|
||
/* "Das kannst du liegen lassen" — `titel` die Taetigkeit,
|
||
`text` wer sie erledigt. */
|
||
nicht: { titel: true, ziel: false },
|
||
/* "Dein Rhythmus" — `titel` ist das Wann, `text` das Was. */
|
||
takt: { titel: true, ziel: false },
|
||
/* "Haeufige Fragen" — `titel` die Frage, `text` die Antwort. */
|
||
frage: { titel: true, ziel: false },
|
||
};
|
||
|
||
export const ARTEN_SCHLUESSEL = Object.keys(ZEILEN_ARTEN);
|
||
|
||
/* =====================================================================
|
||
WO DIE UMRECHNUNG "Ziel -> Schluessel" STEHT
|
||
|
||
NICHT hier. Der Server bildet nie einen Schluessel: Die Schluessel
|
||
stehen woertlich in INHALTE weiter unten, er schreibt sie nur weg.
|
||
Gebraucht wird die Rechnung ausschliesslich im Browser, wo die
|
||
Kachelliste liegt — also steht sie dort, als
|
||
`window.Bereiche.schluesselVonZiel`.
|
||
|
||
Ich hatte sie zuerst hier gebaut und exportiert. Benutzt haette sie
|
||
niemand. Eine Funktion, die nur dasteht, liest sich beim naechsten
|
||
Mal wie eine Zusage ("der Server kennt die Kacheln") und ist keine.
|
||
Wenn die Pflege-Ansicht in Etappe 4 Schreibzugriffe pruefen muss,
|
||
kommt sie zurueck — dann aber mit einem Aufrufer.
|
||
===================================================================== */
|
||
|
||
const TABELLEN = `
|
||
CREATE TABLE IF NOT EXISTS anl_karte (
|
||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||
haus TEXT NOT NULL DEFAULT 'agentur',
|
||
rolle TEXT NOT NULL,
|
||
kachel TEXT NOT NULL,
|
||
stufe TEXT NOT NULL,
|
||
wozu TEXT NOT NULL DEFAULT '',
|
||
tust TEXT NOT NULL DEFAULT '',
|
||
merke TEXT NOT NULL DEFAULT '',
|
||
reihe INTEGER NOT NULL DEFAULT 0,
|
||
geaendert TEXT NOT NULL,
|
||
geaendert_von INTEGER REFERENCES personen(id) ON DELETE SET NULL,
|
||
UNIQUE (haus, rolle, kachel)
|
||
);
|
||
CREATE INDEX IF NOT EXISTS idx_anl_karte_sicht ON anl_karte (haus, rolle, stufe, reihe);
|
||
|
||
CREATE TABLE IF NOT EXISTS anl_zeile (
|
||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||
haus TEXT NOT NULL DEFAULT 'agentur',
|
||
rolle TEXT NOT NULL,
|
||
art TEXT NOT NULL,
|
||
reihe INTEGER NOT NULL DEFAULT 0,
|
||
titel TEXT NOT NULL DEFAULT '',
|
||
text TEXT NOT NULL DEFAULT '',
|
||
ziel TEXT,
|
||
geaendert TEXT NOT NULL,
|
||
geaendert_von INTEGER REFERENCES personen(id) ON DELETE SET NULL
|
||
);
|
||
CREATE INDEX IF NOT EXISTS idx_anl_zeile_sicht ON anl_zeile (haus, rolle, art, reihe);
|
||
|
||
CREATE TABLE IF NOT EXISTS anl_rolle (
|
||
haus TEXT NOT NULL DEFAULT 'agentur',
|
||
rolle TEXT NOT NULL,
|
||
leitgedanke TEXT NOT NULL DEFAULT '',
|
||
geaendert TEXT NOT NULL,
|
||
geaendert_von INTEGER REFERENCES personen(id) ON DELETE SET NULL,
|
||
PRIMARY KEY (haus, rolle)
|
||
);
|
||
|
||
/* ======================================================================
|
||
DER STAND JE PERSON (Etappe 2)
|
||
|
||
NUR ERLEDIGTES WIRD GESPEICHERT. Eine Zeile heisst "abgehakt", keine
|
||
Zeile heisst "offen". Die Alternative waere, fuer jede Person jeden
|
||
Schritt mit einem Ja/Nein anzulegen -- dann muesste jemand beim
|
||
Anlegen einer Person an die Anleitung denken, und beim Hinzufuegen
|
||
eines Schrittes an alle Personen. Beides vergisst man.
|
||
|
||
zeile_id UND NICHT EIN EIGENER SCHLUESSEL. Aendert DogFather in
|
||
Etappe 4 den Text eines Schrittes, behaelt die Zeile ihre Nummer und
|
||
der Haken bleibt stehen -- richtig, es ist derselbe Schritt. Loescht
|
||
er ihn und legt einen neuen an, ist der Haken weg -- auch richtig,
|
||
es ist ein anderer Schritt. ON DELETE CASCADE sorgt dafuer, dass
|
||
keine Haken auf geloeschte Schritte zeigen.
|
||
|
||
KEINE SPALTE erledigt. Ein Haken, den man wegnimmt, loescht die
|
||
Zeile. Ein Feld mit 0 und 1 waere eine zweite Art, "offen" zu sagen,
|
||
und dann gaebe es zwei -- fehlende Zeile und Zeile mit 0.
|
||
====================================================================== */
|
||
CREATE TABLE IF NOT EXISTS anl_stand (
|
||
person_id INTEGER NOT NULL REFERENCES personen(id) ON DELETE CASCADE,
|
||
zeile_id INTEGER NOT NULL REFERENCES anl_zeile(id) ON DELETE CASCADE,
|
||
erledigt_am TEXT NOT NULL,
|
||
PRIMARY KEY (person_id, zeile_id)
|
||
);
|
||
CREATE INDEX IF NOT EXISTS idx_anl_stand_person ON anl_stand (person_id);
|
||
`;
|
||
|
||
/* =====================================================================
|
||
DIE INHALTE
|
||
|
||
Woertlich aus dem Bauplan vom 06.10.2026, Kapitel 06. Gewonnen mit
|
||
`pdftotext -raw`, NICHT mit `-layout`: Der Layout-Auszug verschiebt
|
||
Tabellenzellen. Dort stand "Schulung und Community-Call laufen
|
||
woechentlich von allein" beim Eintrag *Mein Profil* statt bei
|
||
*Kalender* — eine Zeile, die man ohne Verdacht uebernommen und nie
|
||
wiedergefunden haette.
|
||
|
||
Die Stufen stammen aus Kapitel 05. Sie sind ab Etappe 4 in der
|
||
Pflege-Ansicht aenderbar, ohne dass hier jemand etwas anfasst —
|
||
deshalb ist diese Liste eine ERSTBEFUELLUNG und keine Wahrheit.
|
||
===================================================================== */
|
||
|
||
export const INHALTE = {
|
||
creator: {
|
||
leitgedanke:
|
||
"Das ist dein eigener Bereich. Du siehst nur, was zu dir gehört. "
|
||
+ "Deine Betreuung trägt ein, du liest mit, antwortest und hakst ab.",
|
||
saetze: [
|
||
"Du musst nicht alles kennen. Fünf Kacheln reichen für den Anfang.",
|
||
"Was heute dran ist, steht immer auf der Zentrale unter „Was ist dran“.",
|
||
"Fast alles andere füllt deine Betreuung für dich. Du liest und antwortest.",
|
||
],
|
||
schritte: [
|
||
{ titel: "Mein Profil", ziel: "profil.html",
|
||
text: "Bild wählen, einen Satz über dich schreiben, TikTok-Namen eintragen, speichern." },
|
||
{ titel: "Schutz & Regeln", ziel: "bereich.html?b=schutz",
|
||
text: "Unterweisungen lesen und zusammen mit deiner Betreuung bestätigen." },
|
||
{ titel: "Aufgaben", ziel: "aufgaben.html",
|
||
text: "Nachsehen, ob schon etwas für dich offen ist." },
|
||
{ titel: "Kalender", ziel: "kalender.html",
|
||
text: "Termine in deinen eigenen Kalender holen (Google, Apple, Outlook)." },
|
||
/* KEIN ZIEL. "Installieren" ist keine Kachel, sondern der Knopf
|
||
in der Kopfleiste. Ein Sprung auf eine Seite waere hier falsch
|
||
-- und ein Sprung ins Leere erst recht. */
|
||
{ titel: "Installieren", ziel: null,
|
||
text: "Oben antippen, dann hast du den Workspace als App auf dem Handy." },
|
||
],
|
||
karten: [
|
||
{ kachel: "aufgaben", stufe: "muss",
|
||
wozu: "Was du zu tun hast.",
|
||
tust: "Annehmen, bearbeiten, zur Freigabe geben, Rückmeldung schreiben.",
|
||
merke: "„Zur Freigabe“ heißt: Jemand schaut noch drauf." },
|
||
{ kachel: "chat", stufe: "muss",
|
||
wozu: "Nachrichten mit deinem Team.",
|
||
tust: "Mit „Neu“ ein Gespräch beginnen.",
|
||
merke: "Fehler an der Seite gehören in Support, nicht in den Chat." },
|
||
{ kachel: "kalender", stufe: "muss",
|
||
wozu: "Termine und Calls.",
|
||
tust: "Termine ansehen, eigene anlegen.",
|
||
merke: "Schulung und Community-Call laufen wöchentlich von allein." },
|
||
{ kachel: "profil", stufe: "muss",
|
||
wozu: "Wer du bist und wohin du willst.",
|
||
tust: "Einmal ausfüllen: Bild, Kanäle, Stammdaten, Ziele, 90-Tage-Plan.",
|
||
merke: "Nur du schreibst deinen Eintrag." },
|
||
{ kachel: "bereich:schutz", stufe: "muss",
|
||
wozu: "Regeln, die du kennen musst.",
|
||
tust: "Einmal: Dokument öffnen, durchgehen, bestätigen.",
|
||
merke: "Nach der Bestätigung von beiden Seiten nicht mehr änderbar." },
|
||
|
||
{ kachel: "bereich:live", stufe: "regelmaessig",
|
||
wozu: "Dein LIVE besser machen.",
|
||
tust: "Vor und nach dem LIVE: Bewertungen und Notizen lesen, an jedem Punkt antworten.",
|
||
merke: "Geordnet nach vor, während, nach der Sendung." },
|
||
{ kachel: "leistung", stufe: "regelmaessig",
|
||
wozu: "Diamanten, LIVE-Tage, Verweildauer.",
|
||
tust: "Wochenzahlen und Ziele ansehen.",
|
||
merke: "Kommen aus Backstage und werden eingetragen, nicht automatisch geholt." },
|
||
{ kachel: "calls", stufe: "regelmaessig",
|
||
wozu: "Gespräche mit To-dos.",
|
||
tust: "Nachlesen, was besprochen wurde. Der Call-Raum ist verlinkt.",
|
||
merke: "To-dos landen direkt bei deinen Aufgaben." },
|
||
{ kachel: "bereich:agentur", stufe: "regelmaessig",
|
||
wozu: "Events und offizielle Wege.",
|
||
tust: "Event-Aufgaben ansehen, Rückmeldung geben, Anliegen an die Agentur stellen.",
|
||
merke: "Teilnahmebedingungen stehen beim Event." },
|
||
{ kachel: "content", stufe: "regelmaessig",
|
||
wozu: "Von der Idee bis zum Upload.",
|
||
tust: "Sehen, was geplant ist, und antworten.",
|
||
merke: "Fünf Stufen: Idee, Hook & Skript, Gedreht, Fertig & geplant, Veröffentlicht." },
|
||
{ kachel: "report", stufe: "regelmaessig",
|
||
wozu: "Rückblick und nächste Schritte.",
|
||
tust: "Einmal im Monat: Zeitraum wählen (7, 30 oder 90 Tage).",
|
||
merke: "Ein Review endet mit einer Entscheidung." },
|
||
|
||
{ kachel: "uebersicht", stufe: "bedarf",
|
||
wozu: "Dein Stand auf einen Blick.",
|
||
tust: "Nachsehen: nächster Termin, offene Aufgaben, Start-Check.",
|
||
merke: "Was dran ist, zeigt dir schon die Zentrale." },
|
||
{ kachel: "startcheck", stufe: "bedarf",
|
||
wozu: "Erstanalyse deines Kanals.",
|
||
tust: "Ansehen, was passt und was nicht, in 16 Punkten.",
|
||
merke: "Grundlage für deinen 90-Tage-Plan." },
|
||
{ kachel: "bereich:community", stufe: "bedarf",
|
||
wozu: "Moderation und Konflikte.",
|
||
tust: "Nachlesen, wenn es im Chat unruhig wird.",
|
||
merke: "Ruhig statt Drama." },
|
||
{ kachel: "bereich:technik", stufe: "bedarf",
|
||
wozu: "Setup, Fehler, Lösungen.",
|
||
tust: "Nachschlagen, wenn etwas klemmt.",
|
||
merke: "Erst hier schauen, dann fragen." },
|
||
{ kachel: "dateien", stufe: "bedarf",
|
||
wozu: "Ablage für dich.",
|
||
tust: "Dateien öffnen, die für dich abgelegt wurden.",
|
||
merke: "Du kannst hier nichts hochladen." },
|
||
{ kachel: "wissen", stufe: "bedarf",
|
||
wozu: "Anleitungen zu TikTok und Technik.",
|
||
tust: "Nach Stufe, Gerät oder Tag filtern.",
|
||
merke: "Hier geht es um Streaming, nicht um den Workspace." },
|
||
{ kachel: "support", stufe: "bedarf",
|
||
wozu: "Etwas ist kaputt.",
|
||
tust: "Kurz beschreiben, bis zu drei Bilder anhängen, abschicken.",
|
||
merke: "DogFather und die rechte Hand kümmern sich." },
|
||
],
|
||
nicht: [
|
||
{ titel: "Zahlen eintragen.", text: "Das macht deine Betreuung." },
|
||
{ titel: "Start-Check und LIVE-Analyse bewerten.", text: "Du liest und antwortest nur." },
|
||
{ titel: "Protokolle schreiben.", text: "Du liest sie nach." },
|
||
{ titel: "Dateien hochladen.", text: "Geht in deiner Ansicht nicht." },
|
||
{ titel: "Jede Kachel täglich öffnen.", text: "Die Zentrale sagt dir, was dran ist." },
|
||
],
|
||
takt: [
|
||
{ titel: "Täglich", text: "Zentrale („Was ist dran“), Aufgaben, Chat." },
|
||
{ titel: "Vor und nach dem LIVE", text: "LIVE-Analyse und Zahlen." },
|
||
{ titel: "Wöchentlich", text: "Kalender, Calls & Protokolle, Agentur." },
|
||
{ titel: "Monatlich", text: "Reports & Review und dein 90-Tage-Plan in Mein Profil." },
|
||
],
|
||
fragen: [
|
||
{ titel: "Muss ich jede Kachel kennen?",
|
||
text: "Nein. Fang mit den fünf Muss-Kacheln an. Der Rest kommt, wenn du ihn brauchst." },
|
||
{ titel: "Ich habe meinen Code verloren.",
|
||
text: "Sag deiner Betreuung oder DogFather Bescheid. Du bekommst einen neuen, "
|
||
+ "der alte gilt dann nicht mehr." },
|
||
{ titel: "Warum sehe ich keine Zahlen?",
|
||
text: "Für die Woche wurde noch kein Tag eingetragen. Sprich deine Betreuung an." },
|
||
{ titel: "Wer sieht mein Profil?",
|
||
text: "Dein Team: Bild, Name und was du über dich geschrieben hast." },
|
||
],
|
||
},
|
||
};
|
||
|
||
/* =====================================================================
|
||
ANLEGEN UND ERSTBEFUELLEN
|
||
===================================================================== */
|
||
|
||
/** Spielt eine Rolle ein — aber nur, wenn fuer sie noch GAR NICHTS da ist.
|
||
*
|
||
* DAS IST DIE WICHTIGSTE ZEILE DIESER DATEI. Ein Einspielen bei jedem
|
||
* Serverstart wuerde jede Aenderung aus der Pflege-Ansicht beim
|
||
* naechsten Neustart ueberschreiben — lautlos, und man wuerde es erst
|
||
* Wochen spaeter merken, wenn jemand fragt, warum sein Text wieder
|
||
* der alte ist.
|
||
*
|
||
* Gepruefte Bedingung ist "keine einzige Karte dieser Rolle", nicht
|
||
* "Tabelle leer": Sonst bekaeme Rolle zwei nichts mehr, sobald Rolle
|
||
* eins drin ist. */
|
||
function rolleEinspielen(d, haus, rolle, inhalt, jetzt) {
|
||
const schon = d.prepare(
|
||
"SELECT COUNT(*) n FROM anl_karte WHERE haus = ? AND rolle = ?").get(haus, rolle)?.n ?? 0;
|
||
if (schon > 0) return 0;
|
||
|
||
const karte = d.prepare(
|
||
`INSERT INTO anl_karte (haus, rolle, kachel, stufe, wozu, tust, merke, reihe, geaendert)
|
||
VALUES (?,?,?,?,?,?,?,?,?)`);
|
||
const zeile = d.prepare(
|
||
`INSERT INTO anl_zeile (haus, rolle, art, reihe, titel, text, ziel, geaendert)
|
||
VALUES (?,?,?,?,?,?,?,?)`);
|
||
|
||
let n = 0;
|
||
inhalt.karten.forEach((k, i) => {
|
||
karte.run(haus, rolle, k.kachel, k.stufe, k.wozu, k.tust, k.merke, i, jetzt);
|
||
n++;
|
||
});
|
||
const listen = [
|
||
["satz", inhalt.saetze.map((t) => ({ titel: "", text: t, ziel: null }))],
|
||
["schritt", inhalt.schritte],
|
||
["nicht", inhalt.nicht],
|
||
["takt", inhalt.takt],
|
||
["frage", inhalt.fragen],
|
||
];
|
||
for (const [art, liste] of listen) {
|
||
liste.forEach((z, i) => {
|
||
zeile.run(haus, rolle, art, i, z.titel ?? "", z.text ?? "", z.ziel ?? null, jetzt);
|
||
n++;
|
||
});
|
||
}
|
||
d.prepare(
|
||
`INSERT INTO anl_rolle (haus, rolle, leitgedanke, geaendert) VALUES (?,?,?,?)
|
||
ON CONFLICT(haus, rolle) DO NOTHING`).run(haus, rolle, inhalt.leitgedanke, jetzt);
|
||
return n;
|
||
}
|
||
|
||
export function anleitungTabellen(d) {
|
||
d.exec(TABELLEN);
|
||
|
||
const jetzt = new Date().toISOString();
|
||
let gesamt = 0;
|
||
const neu = [];
|
||
for (const rolle of FASSUNGEN) {
|
||
const inhalt = INHALTE[rolle];
|
||
/* Eine Rolle ohne Inhalte ist kein Fehler, sondern der Stand der
|
||
Arbeit: Etappe 1 bringt nur den Creator, die drei anderen kommen
|
||
in Etappe 3. Still uebergehen — aber die Zuordnungspruefung
|
||
weiss davon und meldet es als offen, nicht als in Ordnung. */
|
||
if (!inhalt) continue;
|
||
const n = rolleEinspielen(d, "agentur", rolle, inhalt, jetzt);
|
||
if (n) { gesamt += n; neu.push(`${rolle} ${n}`); }
|
||
}
|
||
if (gesamt) {
|
||
console.log(`[workspace] Anleitung: ${gesamt} Zeilen erstbefuellt (${neu.join(", ")}).`);
|
||
}
|
||
}
|