Filipe: „fuer die modis, rechte und linke hand und dogfather eine
kachel hinzufuegst, sie soll: Notizen, heissen. ich will dass du das
auch wie ein notizblock erstellst. ich will dass es uebelst geil und
einzigartig ist."
=================================================================
TEIL 1: DIE FARBE -- UND WAS DABEI AUFFIEL
=================================================================
Fuer die neue Kachel braucht es einen Ton. Beim Suchen fiel auf, dass
tools/kachelton-entzerren.mjs zwoelf der 45 Farben fuer FREI hielt.
Sie sind es nicht. bereicheFuer() gibt fuer die fuenf Rollen des
Agenturhauses null zurueck -- das heisst „nimm die Liste aus dem
Browser", und die steht in workspace/assets/js/bereiche.js. Dort
stehen die Toene 1 bis 22 und 44: Dashboard, Zahlen, Team-Lage,
Scout-Pipeline. Kacheln, die jeden Tag jemand ansieht.
pruef-kachelfarben hatte denselben blinden Fleck. Sie meldete seit
Wochen „33 benutzte Toene" und war gruen. Was sie dadurch NICHT sah:
* Der Farblauf von gestern Nacht hat zwoelf dieser Kacheln
verschoben und drei davon unter die Buntheitsgrenze gedrueckt.
Gruen geblieben.
* Ton 7, 16 und 22 lagen SEIT JEHER unter der Grenze (0,112 / 0,116
/ 0,068). Nie gemeldet.
Das ist die Sorte gruener Haken, vor der die Hausregel warnt: Er sagt
nur, dass die Bedingung erfuellt war -- nicht, dass sie das Richtige
angesehen hat.
BEHOBEN, und zwar an der Wurzel: Die REGELN (Kontrast, Buntheit)
gelten jetzt fuer jeden Ton, der irgendwo an einer Kachel steht --
gelesen aus denselben fuenf Dateien, die auch pruef-kachel-universum
liest. Dazu die Namen der Kacheln, damit „Ton 1 traegt Dashboard"
ueberhaupt pruefbar ist.
DIE PALETTE WURDE NEU GERECHNET, mit dem dritten Verfahren an einem
Tag -- die ersten zwei stehen als Fehler im Kopf des Werkzeugs:
1. Alle 45 neu verteilt. Lief ueber zwei ausdrueckliche Wuensche
hinweg (#ff1a1a, #a8d8ff).
2. Nur die Kollisionen, aber immer nur EINEN der beiden bewegt.
Ergebnis: Ton 1 sprang vom Tuerkis ins Altrosa, 0,197 weit.
3. BEIDE duerfen sich bewegen, und zwar beide nur ein bisschen.
Zwei Toene, die 0,02 auseinanderstehen und 0,09 brauchen, teilen
sich das -- jeder rueckt 0,045, und beide bleiben, was sie waren.
kleinster Abstand 0,0154 -> 0,0905
zu blass 4 -> 0
sichtbar veraendert 7 Kacheln (ueber 0,05)
kaum zu sehen 28 (13 zwischen 0,02 und 0,05, 15 darunter)
EINE AUSNAHME MIT ZAHL, keine mit Achselzucken: Ton 1 (Dashboard)
bleibt acht Tausendstel unter der Buntheitsgrenze. Gemessen ueber ALLE
16,7 Millionen sRGB-Farben ist die naechste, die alle Regeln haelt,
#7a75c8 -- ein Blauviolett, 0,113 entfernt. Tuerkis erreicht in sRGB
schlicht keine hoehere Buntheit, und das schmale Band teilen sich
schon sieben Toene. Eine Kachel, die ihre Farbfamilie behaelt, ist die
bessere Antwort auf „richtig geil und speziell" als eine, die acht
Tausendstel bunter ist und niemand wiedererkennt. blassBis sagt jetzt
bei jeder Ausnahme, WIE WEIT sie reicht -- vorher hiess blassErlaubt
schlicht „hier wird weggesehen".
DIE NEUE FARBE IST GRUEN UND WOLLTE BERNSTEIN SEIN. Gesucht war die
Farbe von Papier. Gemessen gibt es sie nicht mehr: Der beste Bernstein
im ganzen Farbraum haelt 0,0799 Abstand -- unter der Hausgrenze. Und
Platz schaffen hilft nicht: Setzt man ihn fest, muss ein warmer Ton
das Band verlassen (Ton 45 waere 0,212 weit ins Magenta gewandert).
Die groesste wirklich freie Luecke liegt im Gruen, bei 0,0917. Ein
linierter Block in Gruen ist Papier, seit es Papier gibt.
=================================================================
TEIL 2: DER BLOCK
=================================================================
DREI ENTSCHEIDUNGEN, AUS DENEN DER REST FOLGT:
1. ES GIBT KEINEN SPEICHERN-KNOPF. Nirgends. Wer einen Block
aufschlaegt und lostippt, drueckt hinterher nicht auf „sichern";
er klappt ihn zu. Gesichert wird 800 ms nach dem letzten
Tastendruck. Geht das nicht, bleibt der Text im Browser liegen und
wird nachgereicht -- und der Fuss sagt ehrlich „noch nicht
gesichert", statt einen Verlust zu melden, den man gerade nicht
verhindern kann.
2. DAS BLATT IST EIN SCHREIBFELD MIT EINER DECKSCHICHT. Das Feld
traegt Text und Cursor und ist unsichtbar; darueber zeichnet eine
zweite Schicht denselben Text noch einmal -- mit Kaestchen,
Ueberschriften, Strichen und Links.
DARAUS FOLGT EINE EISERNE REGEL, und sie steht dreimal im Code:
KEINE Auszeichnung darf die BREITE eines Zeichens aendern. Kein
Fettdruck, keine andere Groesse, keine Sperrung. Erlaubt sind nur
Farbe, Flaeche, Rahmen und Durchstreichen. Ein einziges
font-weight: 700 verschoebe den Umbruch, und ab der zweiten Zeile
stuende der sichtbare Text neben dem Cursor.
pruef-notizen misst das am echten Umbruch: eine Probe mit allen
Auszeichnungen und einer Zeile, die umbrechen MUSS. Sind beide
Schichten verschieden hoch, sitzt der Umbruch woanders. Mit
Gegenprobe -- Fettdruck auf der Deckschicht bricht die Deckung um
genau eine Zeile (30 px), und die Zeile wird rot.
3. DIE TASTATUR FUEHRT DIE LISTE FORT, NICHT EINE LEISTE. Ein
Spiegelstrich und Enter macht den naechsten Punkt, ein leeres
Kaestchen und Enter das naechste Kaestchen -- und ein GESETZTER
Haken wird dabei nicht mitgenommen, die naechste Aufgabe ist ja
noch nicht erledigt. Zweimal Enter beendet die Liste. Ein Klick
aufs Kaestchen hakt ab. Es gibt keine Werkzeugleiste, weil man beim
Schreiben nie den Stift wechselt.
UND: NIEMAND SIEHT DIE NOTIZEN EINES ANDEREN. Auch DogFather nicht.
Es gibt in workspace-notizen.js keinen siehtAlles()-Zweig, keinen
Umschalter, keine fremde Liste -- jede Abfrage hat person_id = ? fest
eingebaut. Die Kachel steht deshalb in „Fuer dich" und nicht in
„Taeglich": Die Gruppe sagt die wichtigste Eigenschaft, bevor man sie
anfasst.
NUR AUF DER TEAM-ADRESSE. Auf der Agenturadresse ist die Seite ein
404 -- auch fuer DogFather. Das ist dieselbe Trennung wie bei Chat,
Kalender und Aufgaben, und sie steht an zwei Stellen: in
GEHOERT_ZU_ADRESSE (die Datei) und in der Schnittstelle (die Daten).
Die Seite ist nur HTML; die Daten sind die Sache.
Dazu: sechs Papierfarben, Anheften, Suche mit Hervorhebung im Text,
Papierkorb mit dreissig Tagen und einem Eintrag in der
Aufbewahrungsliste (ohne den waere die Frist ein Satz in einem
Kommentar -- genau das ist dem Support am 24.09. passiert).
=================================================================
EIN FUND BEIM BAUEN, DER ALLEN GEHOERT
=================================================================
DELETE /workspace/api/notizen/:id gab es schon -- in
workspace-aufgaben.js, fuer die Notizen AN einer Aufgabe. Weil jener
Router frueher eingehaengt ist, hat er jeden Loeschversuch des Blocks
abgefangen und mit 404 beantwortet.
Von aussen sah das aus wie ein Fehler im neuen Modul: Anlegen ging,
Aendern ging, Loeschen nicht. Man sucht dann im eigenen Code, und dort
ist nichts. Express meldet so etwas nicht -- es nimmt die erste Route,
die passt, und schweigt ueber die zweite.
Der Block liegt jetzt unter /workspace/api/notizblock. Und
pruef-notizen geht seitdem den Routenbaum von express durch und meldet
jedes Paar aus Methode und Pfad, das zweimal vergeben ist. Gemessen:
307 Wege, keine Dublette. Die Pruefung gilt fuers ganze Haus, auch
wenn sie in dieser Datei steht -- hier ist sie gefunden worden.
Nebenbei berichtigt: pruef-crew-adresse verlangte von jedem Eintrag
der Haustafel HTTP 200 mit Inhalt. Das stimmte, solange dort nur
oeffentliche Dateien standen. notizen.html ist die erste Seite hinter
der Anmeldung -- sie antwortet mit 302, und das ist richtig. Gefragt
wird jetzt, was die Tafel wirklich meint: GIBT es das hier.
GEMESSEN, alles nach den Aenderungen:
pruef-notizen 76 Punkte, 0 Fehler (neu)
pruef-kachelfarben 31 Punkte, 0 Fehler (vorher 26)
pruef-kachel-universum 13 Punkte, 0 Fehler
pruef-crew-adresse 157 Punkte, 0 Fehler
pruef-buehne 230 Punkte, 0 Fehler -- notizen.html neu in
der Liste, schlechtester Kontrast 6,73:1,
also 50 % ueber der Grenze
pruef-rechtetafel, -haus-seiten, -struktur, -css-klassen,
-jeder-hat-eine-seite, -workspace-seiten, -kachelraster,
-rueckmeldung alle 0 Fehler
Co-Authored-By: Claude Opus 5 <[email protected]>
158 lines
7.1 KiB
JavaScript
158 lines
7.1 KiB
JavaScript
/* =====================================================================
|
|
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. */
|
|
}
|