diff --git a/.planning/STATE.md b/.planning/STATE.md index 5cf3e67..a9508ff 100644 --- a/.planning/STATE.md +++ b/.planning/STATE.md @@ -31,7 +31,7 @@ See: .planning/PROJECT.md (updated 2026-07-17) Phase: 18 (desktop-client-fertigstellen) — COMPLETE (2026-09-17, Verifikation passed, Windows-Bedienprobe bestanden) Plan: 6 of 6 Status: Alle 18 Phasen abgeschlossen; Version 1.2.0 freigegeben. Kein laufender Meilenstein. Nach 1.2.0 auf main (Beta): Bildmarke in Akzentfarbe, CI-Desktop-Skip, Favoriten-Symbol/-Sortierung, Desktop-Server-Adresse, Update in der App (signiert), Versionszeile auf der Setup-Seite — alles verifiziert und auf VM/CI nachgewiesen -Last activity: 2026-09-29 - Completed quick task 260929-9wc: Eigene Module (Admin legt Seitenleisten-Eintraege mit eingebetteter https-Seite an); nur lokal committet, nicht gepusht +Last activity: 2026-09-29 - Quick 260929-9wc (Eigene Module) + 260929-d37 (Desktop-App nur einmal starten); main auf beta gepusht, live unveraendert auf 1.5.2 Progress: [██████████] 99% @@ -478,6 +478,7 @@ Gerettet aus `.continue-here.md`. Relevant fuer die noch offenen Live-Tests. | 260925-bow | **Was-ist-neu-Fenster nach Versionswechsel.** Spalte `User.lastSeenReleaseVersion` (Migration 20260925120000), Versionsnummer allein aus der API (`GET /users/me/release-notice`, Semver-Funktionen in packages/shared), Fenster im Portal-Rahmen einmal nach Versionswechsel, gemerkt erst beim Schliessen (`POST`), nur freigegebene Versionen (`dev` nie), hoechstens 3 Versionen + Hinweis auf aeltere + Link /changelog; neue Konten bekommen die laufende Version eingetragen; vorhandene ohne Stand sehen nur die aktuelle. Changelog-Text bleibt serverseitig. Browser: 1.3.0 -> Fenster 1.4.0, Verstanden merkt 1.4.0, kein zweites Mal; 1.0.0 -> 1.4.0/1.3.1/1.3.0 + „2 aelteren Versionen“; Link-Kontrast nachgebessert. api 1435, web 924 gruen. | 2026-09-25 | 59db32a,187fb76,5ae9aaa,b3b7b5d | [260925-bow-was-ist-neu-fenster-beim-ersten-anmelden](./quick/260925-bow-was-ist-neu-fenster-beim-ersten-anmelden/) | | 260928-ujj | **Design Mosaik uebernommen + Hintergrund pro Benutzer.** Merge design/mosaik (76d17fe, inkl. RESIZE_AXIS_FALLBACK), Spalte `User.dashboardBackground` JSONB (Migration 20260928120000), `PATCH /users/me/dashboard-background` mit `parseDashboardBackground` aus packages/shared (Preset-Liste, imageId nur UUID), Web liest aus Sitzung, alte localStorage-Wahl einmalig uebernommen. Browser: Duenen gewaehlt, DB-Zeile gesetzt, nach localStorage-Loeschen weiter sichtbar. api 1462, web 952 gruen; Freigabe als 1.5.0. | 2026-09-28 | 9fa0a3f,0aaa152,cb45d26 | [260928-ujj-design-mosaik-uebernehmen-und-als-1-5-0-](./quick/260928-ujj-design-mosaik-uebernehmen-und-als-1-5-0-/) | | 260929-9wc | **Eigene Module (nur lokal, nicht gepusht).** Modell `CustomModule` + Migration 20260929120000 mit RLS (Muster ProxmoxServer), `/custom-modules` (GET alle Angemeldeten, POST/PATCH/DELETE Admin, nur https ohne Zugangsdaten), `MODULE_CATEGORIES` in packages/shared, Seitenleisten-Eintrag unter gewaehlter Kategorie, Rahmen-Seite `/modules/custom/[id]` mit XFRAME_SANDBOX + no-referrer + „In neuem Tab öffnen“, Verwaltung `/admin/custom-modules`, Zugriffsklassifikation 61/224/6. Gruppen-Beschraenkung zurueckgestellt (ModuleGrant haengt an Module). api 1495, web 992 gruen; Browser dunkel 9 Schritte bestanden. | 2026-09-29 | b9d87be,e7fc4de,e48c0de | [260929-9wc-eigene-module-admin-legt-seitenleisten-e](./quick/260929-9wc-eigene-module-admin-legt-seitenleisten-e/) | +| 260929-d37 | **Desktop-App nur einmal starten.** User-Meldung Windows 11: beim Systemstart zwei Instanzen/zwei Tray-Symbole. `tauri-plugin-single-instance` 2.4.5 als erstes Plugin, zweiter Start ruft `show_main_window` (neuer Helper, ersetzt 3 Kopien) und beendet sich. cargo build/test (44)/clippy gruen. Windows-Pruefung offen (VM 8233 oder User-PC nach naechster Desktop-Version). | 2026-09-29 | c0b145a,0751198 | [260929-d37-desktop-client-nur-einmal-starten-single](./quick/260929-d37-desktop-client-nur-einmal-starten-single/) | ## Deferred Items @@ -523,4 +524,4 @@ Last session: 2026-09-22T13:40:00Z Resumed: 2026-09-21 (abends) ueber /gsd-resume-work; seitdem Bilderrahmen, XFrame (inkl. Ausschnitt), Desktop-Korrekturen, Freigabe 1.3.0, Bilder in den Dateibereich. Stopped at: hk4 fertig und nachgewiesen. Dem Nutzer vorgelegt: erst das Aufraeumen (Modul bringt seine Kachel selbst mit), dann Proxmox-Modul + Kachel — Antwort steht aus. Resume file: None -Last activity: 2026-09-29 - Completed quick task 260929-9wc: Eigene Module (Admin legt Seitenleisten-Eintraege mit eingebetteter https-Seite an); nur lokal committet, nicht gepusht +Last activity: 2026-09-29 - Quick 260929-9wc (Eigene Module) + 260929-d37 (Desktop-App nur einmal starten); main auf beta gepusht, live unveraendert auf 1.5.2 diff --git a/.planning/quick/260929-d37-desktop-client-nur-einmal-starten-single/260929-d37-PLAN.md b/.planning/quick/260929-d37-desktop-client-nur-einmal-starten-single/260929-d37-PLAN.md new file mode 100644 index 0000000..63ef40d --- /dev/null +++ b/.planning/quick/260929-d37-desktop-client-nur-einmal-starten-single/260929-d37-PLAN.md @@ -0,0 +1,55 @@ +--- +quick_id: 260929-d37 +type: quick +wave: 1 +autonomous: true +files_modified: + - apps/desktop/src-tauri/Cargo.toml + - apps/desktop/src-tauri/Cargo.lock + - apps/desktop/src-tauri/src/lib.rs + - CHANGELOG.md +--- + +# Quick 260929-d37: Desktop-Client nur einmal starten (Single-Instance) + +## Problem + +User report (29.09.2026, Windows 11): at system start Tessera launches twice and two tray icons appear. +`apps/desktop/src-tauri/src/lib.rs` has no single-instance guard. Autostart via `tauri-plugin-autostart` +(HKCU Run key, only set when the user ticks "Mit Windows starten"); a second launch source (Windows 11 +"restart restartable apps after sign-in", a stale Run/Startup entry from an older install, or a manual +double-click) starts a second full process with its own tray icon. + +## Goal + +Only one Tessera desktop process runs per user session. A second launch hands off to the running one +(show + unminimize + focus the main window) and exits immediately — no second tray icon. + +## Task 1: Single-instance plugin + +- files: apps/desktop/src-tauri/Cargo.toml, apps/desktop/src-tauri/Cargo.lock, apps/desktop/src-tauri/src/lib.rs +- action: + - Add `tauri-plugin-single-instance = "2"` to `[dependencies]` (resolve with cargo; lockfile updated). + - Register it as the FIRST plugin in `tauri::Builder` (plugin docs require it to be registered first): + `.plugin(tauri_plugin_single_instance::init(|app, _argv, _cwd| { focus main window }))`. + - Callback: reuse the exact show/unminimize/set_focus sequence already used by the tray "open" handler + (around lib.rs:820-835). If that sequence is duplicated 3x already, extract a small helper + `fn show_main_window(app: &AppHandle)` and use it in all places (keep behavior identical). + - Short German comment above the plugin line explaining why (double start at Windows sign-in, two tray icons). + - No capabilities/permissions change needed (plugin has no JS API); verify by building. +- verify: `cd apps/desktop/src-tauri && cargo build` succeeds; `cargo test` (existing unit tests) green; `cargo clippy` no new warnings if clippy is available. +- done: builds, tests green, commit `fix(desktop): nur eine Instanz — zweiter Start holt das Fenster nach vorne`. + +## Task 2: CHANGELOG + +- files: CHANGELOG.md +- action: under `## Unveröffentlicht` add a `### Behoben` section (after `### Neu`) with one plain-German bullet (app text uses "Sie"), e.g.: + "Desktop-App: Tessera startet nicht mehr doppelt. Wird die App ein zweites Mal gestartet – etwa beim Anmelden an Windows –, holt sie nur das vorhandene Fenster nach vorne; im Infobereich erscheint nur noch ein Symbol." + Follow existing CHANGELOG style; run the repo's changelog/umlaut checks if any exist (web tests touching CHANGELOG, e.g. `pnpm --filter web test -- changelog`). +- done: commit `docs(changelog): Desktop-App startet nicht mehr doppelt`. + +## Constraints + +- Commit locally only. NEVER `git push`. +- Do not touch the desktop version numbers (release process handles them). +- Real Windows verification is not possible from here; state in SUMMARY that the Windows check (VM 8233 or user's PC after next desktop release) is open. diff --git a/.planning/quick/260929-d37-desktop-client-nur-einmal-starten-single/260929-d37-SUMMARY.md b/.planning/quick/260929-d37-desktop-client-nur-einmal-starten-single/260929-d37-SUMMARY.md new file mode 100644 index 0000000..e6d68b1 --- /dev/null +++ b/.planning/quick/260929-d37-desktop-client-nur-einmal-starten-single/260929-d37-SUMMARY.md @@ -0,0 +1,41 @@ +--- +quick_id: 260929-d37 +status: complete +commits: 2 +plan_head_before: bc26010 +plan_head_after: 0751198 +--- + +# Quick 260929-d37: Desktop-Client nur einmal starten (Single-Instance) + +`tauri-plugin-single-instance` (2.4.5) ist als erstes Plugin im `tauri::Builder` registriert. Ein zweiter Start holt das Fenster der laufenden Instanz nach vorne und beendet sich, es entsteht kein zweites Tray-Symbol. + +## Tasks + +1. **Single-Instance-Plugin** — Commit `c0b145a` (`fix(desktop): nur eine Instanz — zweiter Start holt das Fenster nach vorne`) + - `Cargo.toml` und `Cargo.lock` um `tauri-plugin-single-instance = "2"` erweitert. + - Die Sequenz unminimize/show/set_focus stand dreimal in `lib.rs` (Tray "open", "change_server", Tray-Linksklick). Sie ist jetzt der Helper `show_main_window(&AppHandle)`, den auch der Single-Instance-Callback nutzt. Das Verhalten der Tray-Handler ist unverändert. Bei "change_server" läuft `navigate` weiterhin vor dem Anzeigen. + - Kurzer deutscher Kommentar über der Plugin-Zeile. +2. **CHANGELOG** — Commit `0751198` (`docs(changelog): Desktop-App startet nicht mehr doppelt`) + - Unter "Unveröffentlicht" neuer Abschnitt "Behoben" mit einem Eintrag. + +## Verifikation + +- `cargo build`: ok +- `cargo test`: 44 Tests grün +- `cargo clippy`: keine Warnungen +- Vitest `changelog.test.ts`, `release-notes.test.ts`, `changelog-page.test.tsx`: 33 Tests grün + +## Deviations from Plan + +None - plan executed exactly as written. + +## Offen + +Die Prüfung unter Windows steht aus, weil sie von hier aus nicht möglich ist. Sie kann in der Windows-Test-VM 8233 oder auf dem PC des Users nach dem nächsten Desktop-Release erfolgen: App zweimal starten, es darf nur ein Tray-Symbol erscheinen und das Fenster kommt nach vorne. Die Desktop-Versionsnummern sind unverändert. + +## Known Stubs + +None. + +## Self-Check: PASSED