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]>
133 lines
6.1 KiB
JavaScript
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);
|
|
`);
|
|
}
|