/* ===================================================================== DER NOTIZBLOCK — die Tabelle und die Regeln dahinter (26.09.2026) ===================================================================== Filipe: „für die modis, rechte und linke hand und dogfather eine kachel hinzufügst, sie soll: Notizen, heißen. ich will dass du das auch wie ein notizblock erstellst." --------------------------------------------------------------------- DIE EINE ENTSCHEIDUNG, DIE ALLES ANDERE NACH SICH ZIEHT EIN NOTIZBLOCK GEHÖRT EINEM MENSCHEN. Nicht dem Team, nicht dem Haus, nicht der Leitung. Wer seine Gedanken aufschreibt, schreibt anders, wenn jemand mitlesen könnte — und dann ist es kein Block mehr, sondern ein Bericht. Deshalb gibt es hier KEINE Rolle, die mehr sieht. `siehtAlles()` wird in diesem Modul nicht gefragt, und das ist Absicht: DogFather sieht die Notizen eines Modis so wenig wie umgekehrt. Jede Abfrage hat `person_id = ?` fest eingebaut, nicht als Bedingung, die man weglassen könnte. Das ist dieselbe Linie wie bei `befinden.html` („Ein paar Fragen über dich, nur für dich. Niemand aus dem Team sieht deine Antworten") — dort steht sie schon im Haus, hier wird sie fortgesetzt. --------------------------------------------------------------------- WARUM ON DELETE CASCADE UND NICHT SET NULL Bei Aufgaben ist es richtig, den Namen zu entfernen und die Sache stehen zu lassen: Sie gehört dem Projekt. Eine Notiz gehört niemandem sonst. Wird ein Zugang gelöscht, hat die Zeile keinen Leser mehr — sie wäre ein Text ohne Menschen, den irgendwann jemand in der Datenbank findet. Also geht sie mit. --------------------------------------------------------------------- DER PAPIERKORB IST EIN DATUM, KEINE ZWEITE TABELLE `weg_am` gesetzt heißt „liegt im Papierkorb, seit …". Eine zweite Tabelle wäre dieselbe Struktur noch einmal, und beim nächsten neuen Feld hätte eine davon es nicht. Geräumt wird über die Aufbewahrungsliste (workspace-aufbewahrung.js) — dort steht die Frist, dort wird sie eingelöst. Ein Versprechen ohne Eintrag dort ist kein Versprechen; genau das ist dem Support am 24.09. passiert. ===================================================================== */ /** Wie lange etwas im Papierkorb liegt, bevor es wirklich weg ist. * * Dreißig Tage. Kürzer wäre eine Falle für den, der drei Wochen im * Urlaub war; länger würde aus dem Papierkorb ein zweites Archiv, * und dann räumt ihn niemand mehr aus. */ export const PAPIERKORB_TAGE = 30; /** Wie lang eine einzelne Notiz werden darf. * * Zwanzigtausend Zeichen sind rund acht eng beschriebene Seiten. * Die Zahl steht nicht gegen den Benutzer, sondern gegen ein * hängendes Skript: Ohne Grenze schreibt ein Fehler in einer Schleife * die Platte voll, und das merkt man erst, wenn nichts mehr geht. */ export const TEXT_MAX = 20000; /** Wie viele Blätter ein Block hat. * * Dreihundert. Wer so viele hat, sucht ohnehin über die Suche und * nicht über die Liste — und auch diese Zahl steht gegen ein Skript, * nicht gegen einen Menschen. */ export const BLAETTER_MAX = 300; /* ===================================================================== DIE PAPIERFARBEN Sechs, und keine davon ist ein Papierweiß. Auf einer dunklen Wand wäre ein cremefarbenes Blatt eine Lampe — die Hausregel heißt augenschonend, und sie gilt auch für ein Blatt Papier. Die Farbe ist deshalb die TINTE: Rand, Linien und Kante des Blattes tragen sie, die Fläche bleibt dunkel. Das ist näher an einer schwarzen Kladde mit farbigem Lesebändchen als an einem Klebezettel — und man kann sechs Blätter nebeneinander auseinanderhalten, ohne dass eines blendet. ALLE SECHS HALTEN 4,5:1 GEGEN DEN DUNKLEN GRUND (#0a121e) — gemessen, nicht geschätzt, und nachgeprüft in pruef-notizen. Sie tragen ja auch Text. WARUM NICHT DIE 46 KACHELFARBEN: Die sind gegeneinander auseinandergerechnet, damit man 46 Kacheln unterscheidet. Hier müssen sechs auseinandergehen, und dafür sind größere, ruhigere Abstände besser als sechs Nachbarn aus einer vollen Palette. */ export const FARBEN = [ { name: "block", wort: "Block", hex: "#9cde90" }, { name: "sonne", wort: "Sonne", hex: "#e8bd63" }, { name: "rosa", wort: "Rosa", hex: "#f2a0c0" }, { name: "himmel", wort: "Himmel", hex: "#86c5f5" }, { name: "flieder", wort: "Flieder", hex: "#c3a6f2" }, { name: "minze", wort: "Minze", hex: "#7ee0c4" }, ]; export const FARB_NAMEN = FARBEN.map((f) => f.name); /** * Legt die Tabelle an. Wird aus workspace.js gerufen, nachdem * `personen` steht — die Notiz hängt daran. * * ACHTUNG, EIN GEGEN-APOSTROPH IN DIESEM TEXT BEENDET DAS * TEMPLATE-LITERAL. Das hat in diesem Haus schon zweimal den Start * gekostet (support-tabellen.js, workspace.js). Deshalb steht in den * Kommentaren hier drin kein einziger. */ export function notizTabellen(d) { d.exec(` CREATE TABLE IF NOT EXISTS notizen ( id INTEGER PRIMARY KEY AUTOINCREMENT, /* CASCADE: Eine Notiz ohne ihren Menschen ist ein Text, den niemand lesen darf und niemand vermisst. */ person_id INTEGER NOT NULL REFERENCES personen(id) ON DELETE CASCADE, /* DER GANZE TEXT IN EINEM FELD -- Titel, Haken, Absaetze. Eine eigene Titelspalte waere die naheliegende Loesung und die falsche: Dann muesste die Oberflaeche zwei Eingabefelder haben, und ein Notizblock mit Formular ist kein Notizblock mehr. Die erste Zeile IST der Titel, und zwar dort, wo sie hingehoert -- im Text. */ text TEXT NOT NULL DEFAULT '', farbe TEXT NOT NULL DEFAULT 'block', /* Angeheftet: bleibt oben. Als Zahl und nicht als Datum -- hier geht es um ein Ja oder Nein, und ein Datum waere ein Feld, das etwas anderes verspricht, als es haelt. */ angeheftet INTEGER NOT NULL DEFAULT 0, erstellt TEXT NOT NULL, geaendert TEXT NOT NULL, /* Im Papierkorb seit. NULL heisst: auf dem Block. */ weg_am TEXT ); /* Die eine Frage, die dieses Modul stellt: „meine Blaetter, die angehefteten zuerst, danach das zuletzt Angefasste". Der Index beantwortet sie in genau dieser Reihenfolge. */ CREATE INDEX IF NOT EXISTS idx_notizen_person ON notizen (person_id, weg_am, angeheftet DESC, geaendert DESC); /* Und die Frage des Aufraeumers: „was liegt lange genug im Papierkorb?" */ CREATE INDEX IF NOT EXISTS idx_notizen_weg ON notizen (weg_am); `); /* DIE FARBPRUEFUNG STEHT NICHT IN DER TABELLE. Ein CHECK (farbe IN (...)) waere die naheliegende Stelle -- und die, an der die Liste ein zweites Mal steht. Waechst FARBEN oben um eine Farbe, muesste die Tabelle umgebaut werden, damit ein Wert erlaubt wird, der im Programm laengst gilt. Genau diese Sorte Abschrift hat am 11.09. drei Spalten gekostet. Geprueft wird deshalb an der Route, gegen FARB_NAMEN -- eine Liste, die niemand pflegen muss, weil sie abgeleitet ist. */ }