Files
dogfather-universe/server/hilfe-tabellen.js
T
DogFatherGitandClaude Opus 5 f62ade3573 Vertraulicher Meldeweg, klappbare Abschnitte, lila Stunden, Logos
Eine Nacht voller Auftraege von Filipe. Der Reihe nach:

1. VERTRAULICH MELDEN -- der groesste neue Teil.

"es soll auch eine kategorie also eine hauptkachel geben wo die
community leute sich anonym melden koennen wenn sie probleme haben ...
rechte hand und dogfather sollen zugriff auf diese anonyme nachrichten
haben. also anonym fuer die anderen."

WICHTIG, UND ES STEHT SO AUF DER SEITE: "anonym" heisst hier
VERTRAULICH. DogFather und die rechte Hand sehen den Namen -- so
bestellt und auch richtig, ohne Namen kann man niemandem helfen.
Anonym ist es gegenueber allen anderen: kein Modi, kein anderes
Mitglied. Wer glaubt, er schreibe unerkannt, schreibt anders und fuehlt
sich hinterher getaeuscht -- deshalb steht der Satz im Formular, bevor
jemand tippt.

Der strikte Wechsel (melden -> warten -> antworten -> warten) ist im
SERVER erzwungen, nicht nur im Knopf. Ein ausgegrauter Knopf ist keine
Regel. Geschlossen wird nur von der Leitung; abgeschlossene Faelle
werden nach 90 Tagen samt Nachrichten geloescht -- hier stehen die
empfindlichsten Texte des Hauses.

Modis sind ausdruecklich AUSSEN VOR: Sehr oft geht es in diesen
Meldungen um eine Moderationsentscheidung.

2. JEDE KATEGORIE LAESST SICH ZUKLAPPEN.

"man soll auf dieser seite jede kategorie auf und zu klappen koennen
mit einem button ... ueberall wo so eine liste entstehen kann."

Das Muster gab es auf der Startseite schon; es steht jetzt als
`abschnittKlappbar` in kopf.js und wird von den Brettern und dem
Zeitstrahl benutzt. Die Koepfe sind echte <button> (fuer die Tastatur),
der Zustand haelt in localStorage, und er haengt je Brett UND Art --
sonst waere "Regel zugeklappt" ueberall gleichzeitig zu.

3. DIE SPRUNGLEISTE SIEHT AUS WIE ETWAS ZUM ANFASSEN.

Vorher unterstrichene Woerter, die aussahen wie eine Fusszeile. Jetzt
Marken mit Rahmen in einem eigenen Block.

4. DIE STUNDEN SIND LILA.

UMGERECHNET, NICHT NEU GEWAEHLT: Jeder der fuenf Verlaufsstopps wurde
nach OKLCH zerlegt, der Farbton auf 303 Grad gedreht, zurueckgerechnet.
Helligkeit und Buntheit blieben gleich -- eine frei gegriffene Palette
waere heller oder bunter geworden, und die Uhr damit unruhiger.

5. DIE KARTEN "UNSERE SEITEN": babyblau und lila, mit schwebenden Logos.

Beide Logos wurden zu MASKEN gerechnet (tools/logo-maske.mjs): Die PNG
tragen nur Alpha, die Farbe kommt aus dem CSS. Dadurch passt dasselbe
Logo in jede Kachel, egal welchen Ton sie hat -- und VanVans 378-KB-
Logo wurde dabei zu 109 KB. Vier Stueck je Karte, verschieden gross,
zwei Bahnen, 26 bis 41 Sekunden Umlauf. Der erste Versuch war mit 5-9 %
Deckkraft praktisch unsichtbar; jetzt 10-16 %.

6. "ENTWICKLUNG" HEISST JETZT "EURE AUFGABEN".

Filipe hat recht: Die Kachel fuehrt seit dem 11.09. auf den Katalog --
eine Aufgabenliste. Der Name blieb stehen, weil beim Umhaengen des
Ziels niemand ihn angefasst hat. Der Name "Entwicklung" ist damit frei
fuer das, was er darunter versteht (Auswertung je Person mit Verlauf
und Text) -- das ist noch NICHT gebaut.

DREI PRUEFUNGEN, DIE ZUFAELLIG GRUEN WAREN, sind nebenbei aufgefallen:
- pruef-kachelraster wartete feste 500 ms auf eine gestaffelte
  Einblendung und mass vier Reihen, wo drei sind. Jetzt reducedMotion.
- pruef-start-ansicht scrollte 600 px und nahm an, danach liege keine
  Kachel mehr unter dem Zeiger.
- pruef-wege-nach-draussen zaehlte das Kachelraster ueber ALLE Gruppen
  statt je Gruppe.

GEMESSEN: pruef-hilfe (neu) 55/0, pruef-wege-nach-draussen 64/0,
pruef-jeder-hat-eine-seite 65/0, pruef-community-sicht 10/0,
pruef-bereiche-lesend, pruef-steckbrief, pruef-start-ansicht,
pruef-kachelraster alle gruen.

Co-Authored-By: Claude Opus 5 <[email protected]>
2026-09-19 02:04:03 +02:00

133 lines
6.1 KiB
JavaScript

/* =====================================================================
DER VERTRAULICHE MELDEWEG -- Tabellen (19.09.2026)
Filipe: „es soll auch eine kategorie also eine hauptkachel geben wo
die community leute sich anonym melden können wenn sie probleme
haben. so wie ein support sie melden was und müssen dan auf die
antwort warten, dan können die erst antworten dan wieder auf antwort
von mir warten und immer so weiter bis ich es zu mache. rechte hand
und dogfather sollen zugriff auf diese anonyme nachrichten haben.
also anonym für die anderen. keiner soll sie sehen in dem sinne aber
wir sollen sehen wer die geschrieben hat, den namen."
---------------------------------------------------------------------
„ANONYM" HEISST HIER VERTRAULICH -- UND DAS MUSS DRANSTEHEN
Der Melder ist NICHT anonym: DogFather und die rechte Hand sehen
seinen Namen, genau so hat Filipe es bestellt, und es ist auch
richtig so (ohne Namen kann man niemandem helfen und keine Maßnahme
ergreifen). Anonym ist er gegenüber allen ANDEREN -- kein anderes
Mitglied, kein Modi, niemand sonst sieht diese Fälle.
DAS IST EIN UNTERSCHIED, DER AUF DIE SEITE GEHÖRT. Wer glaubt,
niemand wisse, dass er es war, schreibt anders -- und fühlt sich
hinterher getäuscht. Der Satz „DogFather und die rechte Hand sehen
deinen Namen. Sonst niemand." steht deshalb im Formular, bevor man
tippt, und nicht im Kleingedruckten darunter.
---------------------------------------------------------------------
WARUM DER STRIKTE WECHSEL
Filipe will: melden -> warten -> antworten -> warten. Immer
abwechselnd. Das ist keine technische Einschränkung, sondern die
eigentliche Idee:
1. Es sagt IMMER, wer am Zug ist. Ein Verlauf, in den beide
jederzeit schreiben können, endet damit, dass niemand weiß, ob
noch eine Antwort kommt.
2. Es schützt den, der meldet. Wer aufgeregt ist, schreibt
sonst fünf Nachrichten hintereinander -- und liest die Antwort
dann als Reaktion auf die letzte statt auf alles.
3. Es schützt den, der antwortet. Ein Fall mit drei offenen
Fragen wird nicht beantwortet, er wird verschoben.
Geschlossen wird nur von der Leitung. Ein Fall, den der Melder
selbst zumachen kann, wird in einem schlechten Moment zugemacht.
---------------------------------------------------------------------
DIESE DATEI IMPORTIERT NICHTS -- derselbe Grund wie bei
treff-tabellen.js: Sie wird aus dem Bauplan in workspace.js
aufgerufen und darf keinen Kreis erzeugen.
===================================================================== */
/** Die drei Zustände eines Falls.
*
* Sie stehen hier und nicht als Zeichenkette an zwanzig Stellen --
* ein Tippfehler in einem `WHERE status = 'offen'` findet lautlos
* nichts.
*
* „wartet_auf_antwort" Der Melder hat geschrieben, die Leitung ist dran.
* „antwort_da" Die Leitung hat geantwortet, der Melder ist dran.
* „geschlossen" Erledigt. Nur die Leitung setzt das.
*/
export const FALL_STAND = {
wartet: "wartet_auf_antwort",
antwort: "antwort_da",
zu: "geschlossen",
};
/** Wie lange ein geschlossener Fall aufgehoben wird (Tage).
*
* NICHT FÜR IMMER. Hier stehen die empfindlichsten Texte des ganzen
* Hauses -- jemand beschreibt ein Problem, oft mit anderen Menschen
* darin. Was niemand mehr braucht, soll auch nicht mehr da sein.
*
* 90 Tage, weil ein Fall manchmal wieder aufkommt („das ist schon
* wieder passiert") und man dann nachlesen können muss, was damals
* vereinbart wurde. Länger hilft niemandem. */
export const AUFBEWAHRUNG_TAGE = 90;
export function hilfeTabellen(d) {
d.exec(`
/* EIN FALL. Nicht "Ticket" -- das Wort kennt hier niemand.
"betreff" ist kurz und steht in der Liste; der eigentliche Text
ist die erste Nachricht. Das trennt "worum geht es" von "was ist
passiert" und macht eine Liste von zwanzig Fällen lesbar.
"person_id" MIT ON DELETE CASCADE: Wer sein Konto verliert,
verliert auch seine Fälle. Ein Fall ohne Melder ist eine
Beschwerde von niemandem -- daran kann man nichts mehr klären,
und aufheben sollte man ihn erst recht nicht. */
CREATE TABLE IF NOT EXISTS hilfe_faelle (
id INTEGER PRIMARY KEY AUTOINCREMENT,
person_id INTEGER NOT NULL REFERENCES personen(id) ON DELETE CASCADE,
betreff TEXT NOT NULL,
stand TEXT NOT NULL DEFAULT 'wartet_auf_antwort'
CHECK (stand IN ('wartet_auf_antwort','antwort_da','geschlossen')),
erstellt TEXT NOT NULL,
geaendert TEXT NOT NULL,
geschlossen_am TEXT,
geschlossen_von INTEGER REFERENCES personen(id) ON DELETE SET NULL
);
/* DIE NACHRICHTEN. "von_leitung" statt eines Rollennamens: Wer
geantwortet hat, ist für den Melder unerheblich -- er soll nicht
überlegen müssen, ob eine Antwort von DogFather mehr gilt als
eine von der rechten Hand. Für das Protokoll bleibt "von_id".
Das ist ausserdem stabil gegen Rollenwechsel: Wird jemand später
etwas anderes, bleibt seine Antwort trotzdem eine der Leitung. */
CREATE TABLE IF NOT EXISTS hilfe_nachrichten (
id INTEGER PRIMARY KEY AUTOINCREMENT,
fall_id INTEGER NOT NULL REFERENCES hilfe_faelle(id) ON DELETE CASCADE,
von_id INTEGER REFERENCES personen(id) ON DELETE SET NULL,
von_leitung INTEGER NOT NULL DEFAULT 0,
text TEXT NOT NULL,
erstellt TEXT NOT NULL,
/* Wann der jeweils andere es gelesen hat. Nur dafür da, dem
Melder zu zeigen, dass seine Meldung angekommen ist -- das ist
die erste Frage, die jemand hat, der etwas Unangenehmes
geschrieben hat. */
gelesen_am TEXT
);
CREATE INDEX IF NOT EXISTS idx_hilfe_faelle_person
ON hilfe_faelle (person_id, geaendert DESC);
CREATE INDEX IF NOT EXISTS idx_hilfe_faelle_stand
ON hilfe_faelle (stand, geaendert DESC);
CREATE INDEX IF NOT EXISTS idx_hilfe_nachrichten_fall
ON hilfe_nachrichten (fall_id, id);
`);
}