Files
DogFatherGitandClaude Opus 5 fc823240ab screen4: Dogi-Media — bearbeiten, entfernen, von wann bis wann
Filipe, 22.09.2026: "wenn wir in der kategorie material was hochladen
will ich dass die rechte und linke hand es auch bearbeiten und loeschen
koennen. dogfather auch fals es ein fehler gab. ... uebrigens ersetz das
wort material durch Dogi-Media. und mach kategorien welche sind benutzt
welche nicht welche sind noch offen, welche laufen von wan bis wann."

WAS JETZT GEHT
- Rechte Hand, linke Hand und DogFather bearbeiten und entfernen jedes
  Stueck, nicht nur ihr eigenes. Bearbeitet wird Text und Zeitfenster,
  nicht die Datei: Sonst zeigte dieselbe Nummer etwas anderes als das,
  was sich jemand gerade angesehen hat.
- Ein vergebenes Stueck bleibt unberuehrt (409). Wer es genommen hat,
  hat sich auf diesen Text verlassen.
- Vier Zustaende, gerechnet statt gespeichert: jetzt frei, kommt noch,
  abgelaufen, schon benutzt. Die Kategorieleiste zeigt zu jedem die
  Anzahl aus den echten Daten und filtert BEIDE Listen.
- "Material" heisst ueberall "Dogi-Media", der Dateiname bleibt.

DREI FEHLER AUS DEM EIGENEN ENTWURF, ALLE VOR DEM AUSLIEFERN GEMESSEN

1. `tagLokal()` ohne Argument gab "NaN-NaN-NaN" zurueck -- eine
   Zeichenkette, die aussieht wie ein Datum. Im Vergleich gewinnt das N
   gegen jede Ziffer, also galt JEDES Stueck mit Enddatum vom ersten Tag
   an als abgelaufen, und "Kommt noch" gab es nie. Kein Absturz, keine
   Meldung. Die drei Kopien der Funktion waren hier auseinandergelaufen;
   alle drei haben jetzt die Vorbelegung und werfen bei einer Zahl, die
   keine ist.
2. `frageNach` liefert bei einer reinen Rueckfrage `true`, nicht
   `{ ok: true }`. Der Entwurf prueft auf `erg?.ok` -- "Entfernen" waere
   ein Knopf gewesen, der nichts tut.
3. Drei erfundene Klassennamen (`knopf--leise`, `m-kat__knopf`,
   `m-karte__weg-knopf`) statt der vorhandenen des Hauses. Jetzt
   `.knopf-still`, `.knopf-still--warn` und die Filterleiste `.filter`.

EIN FUND IM BESTAND, ZWEI WOCHEN ALT

In start.css fehlten an einer Stelle die zwei Zeichen, die einen
Kommentar schliessen. CSS-Kommentare schachteln nicht: Der Block lief
bis zum naechsten Abschluss weiter und verschluckte `.kacheln {`; die
Fehlerbehebung des Browsers nahm danach auch die Regel `.kachel` mit.
In Chromium gemessen, beide Fassungen nacheinander: 738 statt 740
Regeln.

Der Entwurf, der dadurch nie gewirkt hat, ist NICHT wiederhergestellt
worden: Seine Flaeche mischte den Kachelton mit 30/11/3 Prozent ein --
pruef-kachelfarben fiel sofort von 36,5 % auf 4,1 % angekommene Farbe,
und 31 Toene sahen gleich aus. Das ist das Gegenteil dessen, was am
22.09. verlangt war. Er ist geloescht, mit dem Grund daneben. Offen
bleibt eine Frage an Filipe, keine Entscheidung von mir: zu demselben
Entwurf gehoerte ein schmaleres Kachelraster (fuenf bis sechs statt
drei pro Reihe). Das aendert das Aussehen der Startseite sichtbar und
bleibt deshalb, wie es ist.

GEMEINSAME BAUSTEINE AUS DEN SEITENDATEIEN GEHOLT
`.filter` stand Zeichen fuer Zeichen doppelt in dateien.css und
bereich.css, `.feld-hinweis` in aufgaben.css und leistung.css (und die
zwei waren schon auseinandergelaufen). Dogi-Media war jeweils die
dritte Seite, die sie braucht, und laedt keine davon. Derselbe Fehler
wie damals bei .knopf-still und beim Schalter -- jetzt in gate.css
bzw. start.css.

GEPRUEFT
pruef-material 155/0 (von 126, neu: Zeitfenster, Bearbeiten, Entfernen,
Rechte in der Liste und ein Abschnitt am echten Bildschirm mit Browser).
pruef-css-klassen um eine Pruefung erweitert, die genau den
start.css-Fehler findet -- mit sieben Gegenproben, darunter der echte
Fall. pruef-kachelfarben 22/0, pruef-start-ansicht, pruef-struktur,
pruef-meldungen, pruef-zeitraum, pruef-content, pruef-serien 69/0.

Co-Authored-By: Claude Opus 5 <[email protected]>
2026-09-22 13:59:55 +02:00

81 lines
3.8 KiB
JavaScript

/* =====================================================================
EIN TAGESDATUM IN ORTSZEIT — für Prüfungen (16.09.2026)
`new Date().toISOString().slice(0, 10)` ist der bequemste Weg zu
einem Datum und der falsche. toISOString rechnet in UTC; Server und
Menschen stehen hier auf Europe/Berlin. Zwischen Mitternacht und
zwei Uhr morgens liefert die Rechnung deshalb den VORTAG.
In einer Prüfung heißt das: Sie ist tagsüber grün und nachts rot,
ohne dass irgendetwas kaputt ist. Ein Fehlalarm, den man nicht
nachstellen kann, ist der sicherste Weg, eine Prüfung abzuschalten.
---------------------------------------------------------------------
WARUM NICHT AUS workspace.js
Dort stehen `heuteLokal()` und `tagLokal()` schon, mit demselben
Kommentar — aber wer sie importiert, zieht das ganze Haus mit: die
Datenbank, die Umstellungen, die Zeitgeber. Eine Prüfung, die nur ein
Datum braucht, soll dafür keinen Server hochfahren.
Dieselbe Rechnung an zwei Stellen ist hier also Absicht, und es ist
die Ausnahme, nicht die Regel: Es sind vier Zeilen ohne
Verzweigung, sie können nicht auseinanderlaufen, ohne dass
pruef-struktur es meldet.
---------------------------------------------------------------------
UND WANN toISOString RICHTIG IST
Wenn die Uhrzeit fest auf Mittag steht. `Date.parse("…T12:00:00Z")`
plus oder minus ganze Tage bleibt in jeder Zeitzone am selben
Kalendertag — deshalb rechnet der Server mit UTC-Mittag, wenn er
Fristen VERGLEICHT. Nur beim ANZEIGEN und beim Erzeugen eines
Tagesdatums gilt die Ortszeit.
===================================================================== */
const zwei = (n) => String(n).padStart(2, "0");
/** Der heutige Tag in Ortszeit, als `JJJJ-MM-TT`. */
export function heuteLokal() {
const d = new Date();
return `${d.getFullYear()}-${zwei(d.getMonth() + 1)}-${zwei(d.getDate())}`;
}
/** Derselbe Tag, um `versatz` Tage verschoben. Negativ heißt zurück.
*
* ZWEI DINGE AM 22.09.2026 NACHGEZOGEN, beide durch einen echten Schaden:
*
* (1) `versatz = 0`. Dogi-Media rief `tagLokal()` ohne Argument auf und
* bekam `"NaN-NaN-NaN"` zurück -- eine Zeichenkette, die aussieht
* wie ein Datum und sich wie keines verhält. Im Vergleich
* `"2026-12-31" < "NaN-NaN-NaN"` gewinnt das N, also galt JEDES
* Stück mit Enddatum vom ersten Tag an als abgelaufen, und
* "Kommt noch" gab es nie. Kein Absturz, keine Meldung, keine
* Zeile im Protokoll -- nur eine Seite, die etwas anderes zeigt
* als die Wahrheit. Die drei Kopien dieser Funktion waren an
* dieser Stelle auseinandergelaufen: helfer-tag.mjs hatte die
* Vorbelegung, die beiden anderen nicht.
*
* (2) Der Wurf bei einer Zahl, die keine ist. Eine Vorbelegung deckt
* nur den leeren Aufruf ab; `tagLokal(irgendwas)` mit einer
* undefinierten Variablen läge weiter still daneben. Ein Datum,
* das sich nicht ausrechnen lässt, muss SCHEITERN und nicht
* schweigen -- sonst wandert der Unsinn in die Datenbank und in
* die Anzeige, und gefunden wird er Wochen später. */
export function tagLokal(versatz = 0) {
if (!Number.isFinite(Number(versatz))) {
throw new TypeError(`tagLokal: "${versatz}" ist keine Zahl von Tagen.`);
}
const d = new Date(Date.now() + versatz * 86400_000);
return `${d.getFullYear()}-${zwei(d.getMonth() + 1)}-${zwei(d.getDate())}`;
}
/** Ein beliebiger Zeitpunkt als Tagesdatum in Ortszeit.
*
* Für Prüfungen, die von einem FESTEN Zeitpunkt aus rechnen statt von
* jetzt — dort ist die Zeitzone genauso entscheidend. */
export function tagVon(zeitpunkt, versatz = 0) {
const d = new Date(zeitpunkt + versatz * 86400_000);
return `${d.getFullYear()}-${zwei(d.getMonth() + 1)}-${zwei(d.getDate())}`;
}