diff --git a/.planning/STATE.md b/.planning/STATE.md index 109dd0b..a6c84d2 100644 --- a/.planning/STATE.md +++ b/.planning/STATE.md @@ -413,6 +413,7 @@ Gerettet aus `.continue-here.md`. Relevant fuer die noch offenen Live-Tests. | 260916-hiv | **Kalenderquellen-Formular: URL-Platzhalter je Typ + EWS-Hinweis.** Adressfeld zeigt je nach Typ ein Beispiel (Exchange EWS `https://mail.firma.de/EWS/Exchange.asmx`, Graph, CalDAV, ICS) statt fix `https://`; bei Exchange EWS grauer Hinweis unter dem Feld (vollstaendige Adresse inkl. /EWS/Exchange.asmx noetig). 5 i18n-Schluessel de/en, neuer Komponententest (6 Faelle), Changelog "Geändert". Ausloeser: User scheiterte mit blossem Hostnamen `owa.ctl.de`, curl bestaetigte 401 + NTLM auf `/EWS/Exchange.asmx`. Tests Web 309 -> 315 / 50 Dateien, tsc 0. | 2026-09-16 | 618fbd6,2306a6d,9439c33 | [260916-hiv-kalenderquellen-formular-url-platzhalter](./quick/260916-hiv-kalenderquellen-formular-url-platzhalter/) | | 260916-htc | **Kalender-Widget nach Vorbild personal-dashboard.** Monatsraster (Zurueck/Monat/Weiter, Mo-So, 42 Zellen ab Montag, heute hervorgehoben, Zaehler-Plakette je Tag, Termine beim Ueberfahren als Tooltip per `createPortal`/`position: fixed`, weil die Kachel `overflow-hidden` ist) + Block "Naechste Termine" (Datum/Uhrzeit, Titel, Ort, Farbpunkt). Drei Einstellungen unter Einstellungen -> Dashboard -> Widgets (`CalendarConfig`, Muster ClockConfig): `showMonth` (Standard an), `maxEvents` 0..10 (Standard 3, 0 = ausblenden), `lookaheadDays` 7/14/30/60/90 (Standard 30). Ein `fetchEvents(from,to)`-Aufruf je Ladevorgang mit lokalen Tagesgrenzen (Backend-Cache-Schluessel bleibt stabil), Neuladen bei Monatswechsel, 5-Minuten-Intervall bleibt. Neues reines Modul `calendar-month.ts` (resolveCalendarConfig, buildCalendarDays, groupEventsByDate, computeFetchWindow, selectUpcomingEvents). Mindestgroesse calendar 6x8 (Registry-Test mitgezogen). Keine Quellenauswahl pro Widget (User-Entscheidung: nur Optik). 16 i18n-Schluessel de/en, Changelog "Geändert", Anwenderhandbuch. Tests Web 315 -> 332 / 51 Dateien, tsc 0, 12 Dateien. | 2026-09-16 | 0858102,61996dc,6d8c7c4 | [260916-htc-kalender-widget-nach-vorbild-personal-da](./quick/260916-htc-kalender-widget-nach-vorbild-personal-da/) | | 260916-iex | **Dashboard-Widgets: Notiz-Haekchen, Favoriten-Titel, Link-Widget entfernt.** (1) Notiz-Widget: Aufgabenlisten (`- [ ]`/`- [x]`) in der Ansicht direkt abhakbar — `previewOptions.components.input` ersetzt das von rehypeSanitize erzwungene `disabled`-Kaestchen durch `NoteCheckbox` (greift NACH Sanitize, per Spike bestaetigt), delegierter Klick auf dem Vorschau-Container, Index = Reihenfolge der Kaestchen, `toggleTaskLine` kippt genau diese Zeile (strenge Regex, Code-Zaeune uebersprungen), Sofort-Speichern. (2) Favoriten-Widget: `config.title` optional — Kopfzeile im Notiz-Look nur bei Titel, im Bearbeitungsmodus Textfeld (`widgetNoDrag`, 1500 ms entprellt), `FavoritesConfig` + "— {title}" im Einstellungsfeld, NoteConfig-Beschriftung uebersetzt. (3) Link-Widget restlos entfernt: Registry/Union/Constraints/Katalog/page.tsx, `widgets.link` de/en, API-DTO, Migration `20260916120000_remove_link_widget` (`DELETE FROM "WidgetInstance" WHERE "widgetType" = 'link'`, FavoriteLink kaskadiert, Migrationsrolle tessera = Superuser/BYPASSRLS), `widget-wrapper.test.tsx` (unbekannter Typ -> grauer Text), Handbuch, Changelog. Tests Web 332 -> 344 / 52 Dateien, API dashboard 31 gruen, tsc Web+API 0. | 2026-09-16 | 684f063,7f1ee3b,39ea147 | [260916-iex-dashboard-widgets-notiz-haekchen-in-der-](./quick/260916-iex-dashboard-widgets-notiz-haekchen-in-der-/) | +| 260916-j4f | **Nachtraege nach Browser-Pruefung.** Kalender-Tooltip bricht lange Termintitel um (`break-words` + `min-w-0`, Breite/Klemmung aus `TOOLTIP_WIDTH_PX = 288`); Notiz-Widget nimmt `data-color-mode` aus `useTheme().resolvedTheme` mit mounted-Guard (Muster changelog-view) statt `auto` — Textbereich blieb bei OS-dunkel/Tessera-hell dunkel (User-Meldung); CHANGELOG.md auf kurze Stichpunkte gestrafft (User: "Kein Fliesstext"), alle drei Abschnitte, Ueberschriften unveraendert, `publish-release.sh --dry-run --tag v1.1.0` Exit 0. Tests Web 344 -> 347 / 52 Dateien, tsc 0. | 2026-09-16 | b16e4b8,4c2495b,a6bb7aa | [260916-j4f-nachtraege-kalender-tooltip-umbrechen-no](./quick/260916-j4f-nachtraege-kalender-tooltip-umbrechen-no/) | ## Deferred Items @@ -458,4 +459,4 @@ Last session: 2026-09-16T10:15:09.000Z Resumed: 2026-09-14 — Sitzung ueber /gsd-resume-work fortgesetzt; #29 und 3c als /gsd-quick --validate mit voller Kette durchgefuehrt. Stopped at: **VERSION 1.1.0 FREIGEGEBEN — 2026-09-16.** CHANGELOG `Unveröffentlicht` -> `1.1.0 – 2026-09-16` (e0d4532), `live` per ff-merge auf e0d4532, Tag `v1.1.0` gepusht; CI (Beta, live-Pruefung, Tag) gruen; Registry traegt `live`/`v1.1.0` (Stempel `v1.1.0 live e0d4532`); **erster echter CI-Beweis des Release-Wegs: Gitea-Release "Tessera 1.1.0" von der Pipeline angelegt** (Body 2146 Zeichen). Der User spielt 1.1.0 auf tessera.ctl.de ein (pull + up -d --force-recreate api web). Inhalt: Dashboard-Umbau + Nachbesserung, Seite "Was ist neu", Uebersetzungs-Fix. Offen ohne Dringlichkeit: Desktop-Client-Todo, Ship Phase 17, Ledger #35/#36/#37. Mandantenfaehigkeit RUHT. Schalter AUS. Einstieg: `/gsd-resume-work`. Resume file: .planning/HANDOFF.json + .planning/.continue-here.md (2026-09-16T10:28Z) -Last activity: 2026-09-16 - Completed quick task 260916-iex: Notiz-Haekchen abhakbar, Favoriten-Titel, Link-Widget entfernt (Migration) +Last activity: 2026-09-16 - Completed quick task 260916-j4f: Nachtraege (Tooltip-Umbruch, Notiz-Farbmodus, Changelog-Stichpunkte); Browser-Pruefung + Push ausstehend diff --git a/.planning/quick/260916-j4f-nachtraege-kalender-tooltip-umbrechen-no/260916-j4f-SUMMARY.md b/.planning/quick/260916-j4f-nachtraege-kalender-tooltip-umbrechen-no/260916-j4f-SUMMARY.md new file mode 100644 index 0000000..d546e4e --- /dev/null +++ b/.planning/quick/260916-j4f-nachtraege-kalender-tooltip-umbrechen-no/260916-j4f-SUMMARY.md @@ -0,0 +1,88 @@ +--- +phase: quick-260916-j4f +plan: 01 +status: complete +subsystem: dashboard-widgets +tags: [calendar-widget, note-widget, changelog, theming, tooltip] +dependency-graph: + requires: [quick-260916-htc (Kalender-Widget-Neubau), quick-260916-iex (Notiz-Häkchen), quick-260916-dcz (CHANGELOG.md/changelog-view.tsx-Vorbild)] + provides: [TOOLTIP_WIDTH_PX/TOOLTIP_EDGE_PX-Konstanten (calendar-widget.tsx), Notiz-Widget folgt next-themes (colorMode), CHANGELOG.md Stichpunkt-Fassung] + affects: [apps/web/src/components/dashboard/widgets/calendar-widget.tsx, apps/web/src/components/dashboard/widgets/note-widget.tsx, CHANGELOG.md] +tech-stack: + added: [] + patterns: [mounted-Guard + useTheme().resolvedTheme (Muster changelog-view.tsx, jetzt auch im Notiz-Widget), Breite+Klemmung eines Portal-Tooltips aus einer gemeinsamen Modul-Konstante statt zweier hart codierter Werte] +key-files: + created: [] + modified: + - apps/web/src/components/dashboard/widgets/calendar-widget.tsx + - apps/web/src/components/dashboard/widgets/calendar-widget.test.tsx + - apps/web/src/components/dashboard/widgets/note-widget.tsx + - apps/web/src/components/dashboard/widgets/note-widget.test.tsx + - CHANGELOG.md + deleted: + - .planning/quick/260916-j4f-nachtraege-kalender-tooltip-umbrechen-no/CHANGELOG.soll.md +decisions: + - "Keine der drei Aufgaben erforderte eine Abweichung vom Plan — Zeilennummern in den Live-gemessenen Notizen des Planers wichen geringfügig von den beim Ausführen gelesenen ab (z. B. Tooltip-Block bei Z. 296-315 statt Z. 290-315), inhaltlich stimmte aber alles überein." +metrics: + duration: ~10 min + completed: 2026-09-16 +actuals: + tokens: 4127 + tasks: 3 + commits: 3 +plan_head_before: 4f823c3 +--- + +# Phase quick-260916-j4f Plan 01: Nachträge — Kalender-Tooltip umbrechen, Notiz-Farbmodus, CHANGELOG straffen Summary + +Drei vom Anwender im Browser gemeldete Nachbesserungen an den heutigen Dashboard-Arbeiten: Der Termin-Tooltip des Kalender-Widgets bricht lange Titel jetzt um statt sie abzuschneiden, das Notiz-Widget folgt dem Tessera-Farbschalter statt der Betriebssystem-Einstellung, und CHANGELOG.md ist von Fließtext auf kurze Stichpunkte gestrafft. + +## Was gebaut wurde + +**Task 1 — Kalender-Tooltip: Titel umbrechen, Breite/Klemmung aus einer Konstante (Commit `b16e4b8`)** +Zwei neue Modul-Konstanten `TOOLTIP_WIDTH_PX = 288` und `TOOLTIP_EDGE_PX = 4` ersetzen die bisher zwei getrennt hart codierten Werte (`w-60` = 240px in der Klassenliste, `- 244` in der `left`-Berechnung), die driften konnten. Der Tooltip-Div bekommt die Breite jetzt über `style.width`, `left` klemmt mit `Math.max(TOOLTIP_EDGE_PX, Math.min(hover.rect.left, window.innerWidth - TOOLTIP_WIDTH_PX - TOOLTIP_EDGE_PX))`, `top` nutzt ebenfalls `TOOLTIP_EDGE_PX`. Der Titel-Span im Tooltip trägt `min-w-0 break-words` statt `truncate`; die Uhrzeit-Spalte (`shrink-0`) und die Liste „Nächste Termine“ (weiterhin `truncate`) blieben unverändert. RED-GREEN: Test 4c wurde zuerst rot verifiziert (Titel hatte noch `truncate`, Breite kam aus `w-60`), dann grün. Alle 10 Kalender-Tests grün (vorher 9). + +**Task 2 — Notiz-Widget folgt dem Tessera-Farbmodus (Commit `4c2495b`)** +`useTheme()` aus `next-themes` plus eigener `mounted`-Effekt (getrennt vom bestehenden Cleanup-Effekt) liefern `colorMode: 'light' | 'dark' = mounted && resolvedTheme === 'dark' ? 'dark' : 'light'` — exakt das Muster aus `changelog-view.tsx`. Das Wurzel-Div trägt jetzt `data-color-mode={colorMode}` statt des festen Werts `"auto"` (der der Betriebssystem-Einstellung folgte, nicht dem Tessera-Schalter). Im Test wurde ein gehobener Themenzustand über `vi.hoisted` eingeführt (`vi.mock('next-themes', ...)` liest `themeMock.resolvedTheme`), im `beforeEach` auf `'light'` zurückgesetzt. RED-GREEN: beide neuen Tests waren zuerst rot (Attribut lieferte noch `'auto'`), dann grün. Alle 9 Notiz-Tests grün (vorher 7), `tsc --noEmit` Exit 0. + +**Task 3 — CHANGELOG.md auf Stichpunkte gestrafft (Commit `a6bb7aa`)** +`CHANGELOG.md` wurde byte-genau durch den geprüften Inhalt von `CHANGELOG.soll.md` ersetzt (drei `## `-Überschriften, 28 Stichpunkte, kein Satzpunkt am Zeilenende, echte Umlaute, keine CRLF). Die Vorlage im Auftragsordner wurde anschließend gelöscht (`rm`, war nie im Git). Beim Lesen der Vorlage fiel kein sachlicher Fehler auf — die vom Planer genannte Prüfung (Link-Eintrag unter 1.0.0 historisch korrekt, Kalender-Widget/Favoriten-Titel bewusst unter „Neu“ neu sortiert) war zutreffend, keine Korrektur nötig. + +## Gemessene Zahlen + +- Vorher (Basislinie laut Plan/STATE.md): 52 Dateien / 344 Tests. +- Nachher: **52 Dateien / 347 Tests**, alle grün (+1 Kalender, +2 Notiz — exakt wie erwartet). +- `pnpm --filter @tessera/web type-check` → Exit 0. +- `pnpm --filter @tessera/web exec vitest run` → 52 Dateien / 347 Tests grün, darin umlaut-guard 3/3 und `changelog.test.ts` 10/10. +- `sh .gitea/scripts/publish-release.sh --dry-run --tag v1.1.0` → Exit 0, JSON-Body enthält den 1.1.0-Abschnitt inkl. „Seite „Was ist neu““. +- CHANGELOG.soll.md existiert nicht mehr; war nie getrackt, taucht in `git status` nicht auf. +- Kein `biome check`, kein Docker-Build, kein Deploy, kein Testserver, kein `git push` — wie vorgegeben. + +## Commits + +- `b16e4b8` — fix(web): Kalender-Tooltip bricht lange Termintitel um (Breite/Klemmung aus einer Konstante) +- `4c2495b` — fix(web): Notiz-Widget folgt dem Hell/Dunkel-Schalter von Tessera statt der Systemeinstellung +- `a6bb7aa` — docs: Changelog auf Stichpunkte gestrafft (kein Fließtext) + +## Deviations from Plan + +None — Plan exakt wie geschrieben ausgeführt. Die im Plan als „Live gemessen“ genannten Zeilennummern wichen beim tatsächlichen Lesen der Dateien minimal ab (z. B. Tooltip-Block bei Z. 296-315 statt Z. 290-315), inhaltlich und strukturell stimmte aber alles überein — keine Fixes, keine Rule-1/2/3/4-Fälle. + +## Known Stubs + +Keine. + +## Threat Flags + +Keine neue, im Plan nicht bereits erfasste sicherheitsrelevante Oberfläche gefunden. Alle vier im `` benannten Maßnahmen (T-J4F-01 bis T-J4F-04) sind wie spezifiziert umgesetzt: Termintitel bleibt React-Textknoten ohne `dangerouslySetInnerHTML`, `break-words` bricht auch wortlose Zeichenketten bei fester Breite und weiterhin maximal 5 Einträgen, `resolvedTheme` fällt auf jeden anderen Wert als `'dark'` auf `'light'` zurück, `CHANGELOG.md` wurde byte-genau aus der geprüften Vorlage übernommen und `rehypeSanitize` in `changelog-view.tsx` blieb unangetastet. + +## Self-Check: PASSED + +- `apps/web/src/components/dashboard/widgets/calendar-widget.tsx` — FOUND, enthält `TOOLTIP_WIDTH_PX = 288` und `min-w-0 break-words` +- `apps/web/src/components/dashboard/widgets/note-widget.tsx` — FOUND, enthält `data-color-mode={colorMode}`, kein `data-color-mode="auto"` mehr +- `CHANGELOG.md` — FOUND, 3 Überschriften, 28 Stichpunkte +- `.planning/quick/260916-j4f-nachtraege-kalender-tooltip-umbrechen-no/CHANGELOG.soll.md` — CONFIRMED DELETED +- Commit `b16e4b8` — FOUND in `git log` +- Commit `4c2495b` — FOUND in `git log` +- Commit `a6bb7aa` — FOUND in `git log` +- Gesamtlauf: 52 Testdateien / 347 Tests grün, Web-Type-Check Exit 0, Release-Dry-Run Exit 0