# Fensterkonzept

Die Anwendung ist nach dem Login fensterbasiert. Das Dashboard bleibt die
Hauptfläche und zeigt Status, Live-Verbindung und zusammenfassende Daten. Alle
fachlichen Arbeitsbereiche öffnen als eigene Fenster.

## Grundregeln

- Vor dem Login sind nur Login und Registrierung sichtbar.
- Nach dem Login bleibt das Dashboard die Basisansicht.
- Navigationseinträge außer Dashboard öffnen ein Fenster.
- Ein bereits geöffnetes Fenster wird fokussiert, nicht doppelt geöffnet.
- Fenster können geschlossen und später erneut geöffnet werden.
- Fenster behalten pro Benutzer Position, Größe und Reihenfolge, soweit der
  jeweilige Client das technisch unterstützt.
- Offene Listenfenster müssen auf Live-Events reagieren und ihre Daten
  aktualisieren oder als veraltet markieren.

## Einheitliche Fensteraktionen

- `Öffnen`: Fenster wird erzeugt oder, falls vorhanden, fokussiert.
- `Fokussieren`: Fenster erhält die höchste Z-Reihenfolge.
- `Schließen`: Fenster wird aus der Arbeitsfläche entfernt.
- `Verschieben`: Fensterposition wird geändert.
- `Größe ändern`: Fensterabmessungen werden geändert.
- `Aktualisieren`: Fenster lädt seine Daten neu oder reagiert auf ein
  Backend-Event.

## Webclient

- Fenster werden über der Dashboard-Fläche dargestellt.
- Position und Größe sind per Maus oder Pointer veränderbar.
- Fensterstatus wird im `localStorage` pro Benutzer gespeichert.
- Wiederherstellung erfolgt nach Login oder Reload.

## Desktopclient

- Fenster verwenden native `egui::Window`-Instanzen.
- Benutzerrechte, Firmendaten und Freischaltungen sind als Fenster umgesetzt.
- Weitere fachliche Module folgen demselben Muster.

## Live-Updates

Backend-Änderungen erzeugen Events über die bestehende Socket-Verbindung. Clients
verwenden diese Events, um offene Fenster zu aktualisieren oder deren Status auf
`Aktualisiert` zu setzen.

Für Phase 2 genügt ein gemeinsamer Live-Event-Store pro Client. Fachliche
Module können später gezielt nach Entity-Typ filtern.

## Parallelbearbeitung und Konflikte

- Schreibvorgänge laufen immer über das Backend.
- Das Backend entscheidet final über Berechtigungen und Datenstand.
- Bei konkurrierenden Änderungen wird zunächst eine frische Liste geladen.
- Für spätere fachliche Datensätze wird ein Versionsfeld oder `updated_at`
  benötigt, damit Konflikte vor dem Speichern erkennbar sind.

