From 4c93555a507547c44b698a719274eefeb8e9aa0d Mon Sep 17 00:00:00 2001 From: Schalli Date: Thu, 17 Sep 2026 12:46:09 +0200 Subject: [PATCH] =?UTF-8?q?docs(quick-260917-h2s):=20Aktenstand=20?= =?UTF-8?q?=E2=80=94=20Desktop-Erkennung,=20Beta-Hinweis,=20deutscher=20In?= =?UTF-8?q?staller;=20Browser-Nachweise=20gsh/gyd/h2s?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 5 (1M context) --- .planning/STATE.md | 7 +- .../260917-h2s-SUMMARY.md | 109 ++++++++++++++++++ 2 files changed, 113 insertions(+), 3 deletions(-) create mode 100644 .planning/quick/260917-h2s-desktop-client-web-erkennt-den-client-do/260917-h2s-SUMMARY.md diff --git a/.planning/STATE.md b/.planning/STATE.md index 637cc65..264e3be 100644 --- a/.planning/STATE.md +++ b/.planning/STATE.md @@ -7,7 +7,7 @@ status: verified stopped_at: Completed 18-06-PLAN.md — Windows-Bedienprobe des Nutzers steht aus last_updated: "2026-09-16T15:27:16.943Z" last_activity: 2026-09-17 -last_activity_desc: Quick 260917-eta — Tray „Beenden"/„Öffnen" der Desktop-App repariert (Windows-VM-Bedienprobe durch Claude); davor 260917-e15 Icon-Fix, Benchmark nach VM-Umbau +last_activity_desc: Quick 260917-gsh/gyd/h2s — alle sieben Nebenbefunde der Windows-Bedienprobe + Akzentfarbe per Hex + Logo in Akzentfarbe state_head: a777814034ee5907cb4d151669447f015841082d progress: total_phases: 18 @@ -31,7 +31,7 @@ See: .planning/PROJECT.md (updated 2026-07-17) Phase: 18 (desktop-client-fertigstellen) — IN PROGRESS Plan: 6 of 6 (18-02 abgeschlossen) Status: 18-02 (CI-Job desktop, Cache-Uebergabe an publish, Release-Anhaenge) fertig; 18-03 (Web-Oberflaeche), 18-04 (Client-Updatepruefung), 18-05 (Windows-Cross-Bau + Pipeline-Beweis), 18-06 (Freigabe) stehen aus -Last activity: 2026-09-17 - Completed quick task 260917-eta: Tray „Beenden"/„Öffnen" der Desktop-App repariert (auf Windows-VM gefunden); zuvor 260917-e15 Icon-Fix, Benchmark nach VM-Umbau +Last activity: 2026-09-17 - Quick-Tasks 260917-gsh/gyd/h2s: Akzentfarbe per Hex + Logo in Akzentfarbe, Web-Robustheit (Ruecksprung, Sitzungswaechter, i18n), Desktop-Erkennung + Beta-Label + deutscher Installer — lokal im Browser bestaetigt, Push/CI/VM-Nachweis folgt Progress: [███░░░░░░░] 33% @@ -435,6 +435,7 @@ Gerettet aus `.continue-here.md`. Relevant fuer die noch offenen Live-Tests. | 260917-eta | **Desktop-Client: Tray „Beenden" beendete die App nicht; „Öffnen"/Linksklick holten minimiertes Fenster nicht zurueck.** Auf der Windows-Test-VM reproduziert (tasklist: `tessera-desktop.exe` lief nach „Beenden" weiter; Autostart-Haken im selben Menue funktionierte -> Klick kam an). Ursache: `app.run`-Handler rief bei jedem `RunEvent::ExitRequested` `api.prevent_exit()` — auch fuer `app.exit(0)` aus dem Tray. Fix: Muster `ExitRequested { code: None, api, .. }` (Tauri 2.11.3: `code` None = Nutzer-Interaktion, Some = programmatisch). Dazu `w.unminimize()` vor `show()` in „open" und im Linksklick-Handler (nach Win+D bewirkte „Öffnen" nichts). cargo check/clippy 0 Warnungen, rustfmt (9cb9d2e). Changelog 2 Stichpunkte. | 2026-09-17 | 68a69c6,9ba7456,9cb9d2e | [260917-eta-desktop-client-tray-eintrag-beenden-been](./quick/260917-eta-desktop-client-tray-eintrag-beenden-been/) | | 260917-gsh | **Akzentfarbe als Hex-Code eingebbar; Bildmarke uebernimmt die Akzentfarbe.** `normalizeHexColor()` in `lib/color.ts` (optionales `#`, 3-stellige Kurzform, Kleinschreibung; 9 Tests), Textfeld neben dem Farbwaehler mit Zwei-Wege-Sync, `aria-invalid` + Fehlertext + gesperrtes Speichern bei ungueltigem Wert (7 Komponententests), i18n `settings.account.accentColorHex/-Invalid`. Gedrehte Kachel in `LogoMark` per Inline-Style `fill: var(--primary, #ffed00)` — folgt `applyAccentColor`, Anmeldeseite bleibt gelb. Tests Web 365 -> 381 / 57 Dateien, tsc 0. | 2026-09-17 | 795c6a4,1601d97,db478e0 | [260917-gsh-akzentfarbe-in-einstellungen-konto-zusae](./quick/260917-gsh-akzentfarbe-in-einstellungen-konto-zusae/) | | 260917-gyd | **Web-Robustheit: Ruecksprung nach Anmeldung, Sitzungswaechter, Widgets-Seite uebersetzt.** Middleware leitet auf `/login?next=` (Helfer `lib/safe-next.ts`: nur relative Pfade, kein `//`, kein `\\`, kein `/login`; Tests), Anmeldeseite springt nach Erfolg dorthin. Neue Server Action `fetchSessionState()` (authenticated/unauthenticated/unavailable): bei 401/403 oder 200 ohne Benutzer wird das Sitzungscookie geloescht und der Header leitet auf `/login?next=…` — 5xx/Netzwerkfehler bleiben still (kein Redirect bei API-Ausfall). Befund vom Testserver-DB-Reset: `/auth/me` liefert bei geloeschtem Benutzer 200 mit leerem Body. `settings/dashboard`: `common.loading` + `settings.widgets.empty` statt englischer Hartkodierung. Tests Web gruen, tsc 0. | 2026-09-17 | 4b279ea,474d170,2868ffe | [260917-gyd-web-nach-anmeldung-zurueck-zur-ursprueng](./quick/260917-gyd-web-nach-anmeldung-zurueck-zur-ursprueng/) | +| 260917-h2s | **Desktop-Client-Erkennung, Beta-Hinweis, deutscher Installer.** Rust: `with_desktop_marker()` haengt `desktop=1` an beide Navigationen zur Server-Adresse (Store bleibt sauber); `update_labels()` — bei gleicher Version nennt Tray/Benachrichtigung „Neuen Beta-Stand {commit}“ statt „Version X“ (5 Rust-Tests). Web: Middleware setzt Cookie `tessera_desktop=1` (`withDesktopCookie` um jede Rueckgabe), `lib/desktop-client.ts` (`isDesktopClient`/`useIsDesktopClient`), `DesktopDownloadLinks` rendert im Client nichts, `DesktopContextMenuGuard` im RootLayout blockt Rechtsklick ausser in Eingabefeldern. Installer: `bundle.windows.nsis` languages German, kein Sprachwahldialog, installerIcon icon.ico, Header/Sidebar-BMP (Markengelb + Tessera-Zeichen, resvg-Quelle), installMode currentUser; Handbuecher ergaenzt. Web-Tests 417 / 63 Dateien, tsc 0. Browser: Cookie, Link-Ausblendung, Kontextmenue, Ruecksprung, 401-Waechter lokal bestaetigt; Installer/Client-Cookie nach CI auf der Windows-VM. | 2026-09-17 | 5bdabf5,d9b94bd,2cd4adc | [260917-h2s-desktop-client-web-erkennt-den-client-do](./quick/260917-h2s-desktop-client-web-erkennt-den-client-do/) | ## Deferred Items @@ -480,4 +481,4 @@ Last session: 2026-09-17T08:20:00Z Resumed: 2026-09-17 — Sitzung ueber /gsd-resume-work fortgesetzt (HANDOFF.json abgearbeitet und entfernt). Stopped at: Quick 260917-eta (Tray Beenden/Öffnen) gepusht (a0e4c21), CI 244 gruen, Fix auf der Windows-Test-VM 8233 mit Paket 1.1.0-beta.a0e4c21 BESTAETIGT (tasklist ohne tessera-desktop.exe nach Beenden; Öffnen nach Win+D holt Fenster zurueck); Icon-Fix ebenfalls bestaetigt. Nichts angefangen. Alpha-DB wurde vom User am 17.09. 10:37 neu angelegt (Admin-Passwort dort unbekannt). Nebenbefunde 1-7 siehe Memory project-resume Resume file: None -Last activity: 2026-09-17 - Completed quick task 260917-eta: Tray „Beenden"/„Öffnen" der Desktop-App repariert (auf Windows-VM gefunden); zuvor 260917-e15 Icon-Fix, Benchmark nach VM-Umbau +Last activity: 2026-09-17 - Quick-Tasks 260917-gsh/gyd/h2s: Akzentfarbe per Hex + Logo in Akzentfarbe, Web-Robustheit (Ruecksprung, Sitzungswaechter, i18n), Desktop-Erkennung + Beta-Label + deutscher Installer — lokal im Browser bestaetigt, Push/CI/VM-Nachweis folgt diff --git a/.planning/quick/260917-h2s-desktop-client-web-erkennt-den-client-do/260917-h2s-SUMMARY.md b/.planning/quick/260917-h2s-desktop-client-web-erkennt-den-client-do/260917-h2s-SUMMARY.md new file mode 100644 index 0000000..0993553 --- /dev/null +++ b/.planning/quick/260917-h2s-desktop-client-web-erkennt-den-client-do/260917-h2s-SUMMARY.md @@ -0,0 +1,109 @@ +--- +phase: quick-260917-h2s +plan: 01 +subsystem: desktop-client, web-middleware +tags: [desktop, tauri, nextjs, middleware, ux] +status: complete +dependency-graph: + requires: [] + provides: + - "with_desktop_marker / update_labels (apps/desktop/src-tauri/src/lib.rs)" + - "withDesktopCookie (apps/web/src/middleware.ts)" + - "isDesktopClient / useIsDesktopClient (apps/web/src/lib/desktop-client.ts)" + - "DesktopContextMenuGuard (apps/web/src/components/desktop/desktop-context-menu-guard.tsx)" + affects: + - "apps/web/src/components/desktop/desktop-download-links.tsx" + - "apps/web/src/app/layout.tsx" + - "apps/desktop/src-tauri/tauri.conf.json" +tech-stack: + added: [] + patterns: + - "Cookie-basierte Client-Erkennung: Query-Parameter auf der ersten Navigation -> Middleware setzt Cookie auf jeder Antwort -> Hook liest es hydration-sicher" +key-files: + created: + - apps/web/src/lib/desktop-client.ts + - apps/web/src/lib/desktop-client.test.ts + - apps/web/src/middleware.test.ts + - apps/web/src/components/desktop/desktop-context-menu-guard.tsx + - apps/web/src/components/desktop/desktop-context-menu-guard.test.tsx + modified: + - apps/desktop/src-tauri/src/lib.rs + - apps/desktop/src-tauri/tauri.conf.json + - apps/desktop/src-tauri/icons/nsis-header.bmp + - apps/desktop/src-tauri/icons/nsis-sidebar.bmp + - apps/web/src/middleware.ts + - apps/web/src/components/desktop/desktop-download-links.tsx + - apps/web/src/components/desktop/desktop-download-links.test.tsx + - apps/web/src/app/layout.tsx + - CHANGELOG.md + - docs/anleitung-anwender.md + - docs/anleitung-entwicklung.md +decisions: + - "Beim Handbuchsatz zu Trotzdem ausführen wurde Der Grund dafür zu Der Grund für die Windows-Meldung umformuliert, weil der neu eingefuegte Satz sonst den Bezug des Pronomens verschoben haette (redaktionelle Praezisierung, kein inhaltlicher Unterschied zum Plan)." +metrics: + duration: 24min + completed: 2026-09-17 +actuals: + tokens: 39000 + tasks: 3 + commits: 3 +plan_head_before: 98fad86 +--- + +# Phase quick-260917-h2s Plan 01: Desktop-Client-Erkennung, Beta-Label, deutscher Installer Summary + +Der Desktop-Client meldet sich jetzt beim Web per Cookie an, wodurch Download-Links und das Browser-Kontextmenü in der App verschwinden; der Beta-Update-Hinweis nennt bei gleicher Version den Commit-Stand statt der verwirrenden gleichen Versionsnummer, und der Windows-Installer läuft auf Deutsch mit Tessera-Grafik und -Symbol. + +## Was wurde gebaut + +**Task 1 — Rust (`apps/desktop/src-tauri/src/lib.rs`, Commit `5bdabf5`):** +- `with_desktop_marker(url)` hängt `desktop=1` als Query-Paar an einen Klon der Adresse an; beide `window.navigate`-Aufrufe (`save_server_url`, Startnavigation im `setup`) nutzen sie. Der im Store gespeicherte `server_url`-Wert bleibt unverändert (Parameter geht nur in die Navigation). +- `update_labels(version_changed, version, commit)` liefert Menü-/Benachrichtigungstext: bei Versionswechsel wie bisher „Version {v} herunterladen"; bei gleicher Version (Beta-Kanal, neuer Commit) „Neuen Beta-Stand herunterladen" / „Neuer Beta-Stand {commit} verfügbar …". +- `mod tests` deckt beide Helfer ab (5 Tests); `cargo fmt --check`, `cargo check`, `cargo clippy`, `cargo test --lib` grün. + +**Task 2 — Web, Tracer (Commit `d9b94bd`):** +- `withDesktopCookie` in `middleware.ts` setzt `tessera_desktop=1` (Path `/`, ein Jahr, `SameSite=lax`, ohne `HttpOnly`, `Secure` nur bei https) auf **jede** Antwort der `middleware`-Funktion, sobald `?desktop=1` anliegt — auch auf dem Frühausstieg für öffentliche Routen und auf Redirects. Die von Plan 260917-gyd zwischenzeitlich ergänzten Rückgaben (u. a. der `next`-Redirect) sind mit eingeschlossen. +- `apps/web/src/lib/desktop-client.ts`: `isDesktopClient()` liest das Cookie synchron (SSR-sicher: `false` ohne `document`); `useIsDesktopClient()` kapselt es per `useEffect`, damit Server- und erster Client-Render übereinstimmen. +- `DesktopDownloadLinks` bricht den Ladeeffekt im Desktop-Client vor dem Request ab und rendert nichts. +- `DesktopContextMenuGuard` (neu, in `layout.tsx` eingebunden) unterdrückt das WebView2-Kontextmenü außerhalb von Eingabefeldern/contenteditable-Bereichen. +- Tracer-Gate: Die komplette Kette (Anfrage mit `?desktop=1` → Cookie auf der Antwort → Hook → Komponente rendert nichts) wurde Ende-zu-Ende durch die volle Testsuite (`pnpm --filter @tessera/web exec vitest run`, 417/417 grün) und `type-check` bestätigt, bevor Task 3 begann. + +**Task 3 — Installer, CHANGELOG, Handbuch (Commit `2cd4adc`):** +- `bundle.windows.nsis` in `tauri.conf.json`: `languages: ["German"]`, `displayLanguageSelector: false`, `installerIcon`, `headerImage`, `sidebarImage`, `installMode: "currentUser"`. +- Beide BMPs aus dem Scratchpad nach `icons/` kopiert (`nsis-header.bmp` 150×57, `nsis-sidebar.bmp` 164×314, beide `BMP3`). +- CHANGELOG: vier neue `Desktop-App:`-Stichpunkte (zwei unter „Geändert", zwei unter „Behoben"). +- `docs/anleitung-anwender.md`: Satz zum deutschen Installationsassistenten (kein Admin nötig); Tray-Eintrag „Update herunterladen" erklärt (Beta-Text). +- `docs/anleitung-entwicklung.md`: Ort der nsis-Konfiguration und Hinweis, dass nur der CI-Bau auf Windows den echten Nachweis liefert. + +## Deviations from Plan + +### Auto-fixed Issues + +None — plan executed exactly as written. Eine redaktionelle Umformulierung (siehe `decisions` oben) war nötig, damit ein Pronomenbezug im Handbuchsatz nicht verrutscht; inhaltlich deckt sich der Text mit der Plan-Vorgabe. + +## Offene Nachweise (nicht lokal prüfbar) + +Wie im Plan vorgesehen, bleibt der Beweis über die WebView2-Grenze durch den Orchestrator nach dem CI-Bau auf der Windows-VM offen: +- Cookie `tessera_desktop=1` im echten Client gesetzt (Bedienprobe) +- Keine Download-Links auf der Anmeldeseite im Client +- Kein Browser-Kontextmenü im Client, aber in Eingabefeldern erhalten +- Beta-Label „Neuen Beta-Stand herunterladen" / Benachrichtigung mit Commit-Kürzel +- Deutscher Installer mit Tessera-Kopf-/Seitenbild und -Symbol + +## Verification + +- `cargo fmt --check && cargo check && cargo clippy && cargo test --lib` (apps/desktop/src-tauri): grün, 5/5 Tests +- `pnpm --filter @tessera/web exec vitest run`: 417/417 Tests grün (63 Dateien) +- `pnpm --filter @tessera/web type-check`: grün +- nsis-Schema-Prüfung (node gegen `NsisConfig.properties`/`NSISInstallerMode`): OK +- `magick identify`: `nsis-header.bmp BMP3 150x57`, `nsis-sidebar.bmp BMP3 164x314` +- `git diff --name-only 98fad86 HEAD` deckt sich exakt mit `files_modified` aus dem Plan-Frontmatter; kein Docker-Build, kein `tauri build`, kein `git push`. + +## Self-Check: PASSED + +- FOUND: apps/desktop/src-tauri/src/lib.rs (with_desktop_marker, update_labels, mod tests) +- FOUND: apps/web/src/middleware.ts (withDesktopCookie) +- FOUND: apps/web/src/lib/desktop-client.ts +- FOUND: apps/web/src/components/desktop/desktop-context-menu-guard.tsx +- FOUND: apps/desktop/src-tauri/icons/nsis-header.bmp, nsis-sidebar.bmp +- FOUND commit 5bdabf5, d9b94bd, 2cd4adc in `git log --oneline`