Files
MABEA/frontend
patrickandClaude Sonnet 5 6934276e8a
CI / backend-tests (push) Failing after 1m21s
CI / frontend-build (push) Successful in 22s
Karte 14 Schritt 2 (Admin-Teil) + Frontend für Anhänger-Kopplung
Backend: geraet_instanz-CRUD (Liste/Anlegen/Status ändern inkl. optionalem
Fehlbestand pro Gerät/Löschen), pruefintervall_monate in Objektposition-
Schemas verdrahtet (Prüfdatum -> naechste_pruefung wird automatisch
berechnet, Monatsrechnung ohne neue Dependency).

Frontend: GeraeteInstanzenListe ersetzt das Einzel-SN-Feld im Admin-Portal
(ObjektPositionenPanel) durch eine Instanz-Liste mit Status/Prüfdatum/
Bemerkung je Exemplar - löst das Karte-14-Kernproblem (mehrere Geräte pro
Position). ObjektSection: Anhänger-Kopplung bei Anlage und nachträglich
änderbar.

Kontroll-Erfassung (PositionCard/KontrollPage) bleibt unverändert - die
komplett neue Erfassungs-UI für geraet_sn (Umsetzungsschritt 4, Karte 14)
ist bewusst nicht Teil dieses Commits.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CVgbozhYmuEhiEJHffRXCV
2026-09-04 20:55:09 +02:00
..

MABEA Frontend Sprint 7

React + Vite PWA. Deckt Prompt 11 Screens 1-6 (kompakt zusammengefasst: Objektliste, Kontrolle mit Positionserfassung, Abschluss/Abbruch) und Prompt 17 (Offline-Härtung: IndexedDB-Queue, Statusanzeige je Position, Abschluss blockiert bis alles gespeichert) ab.

Setup (auf dem Zielsystem, nicht lokal)

npm install
cp example.env .env
# .env: VITE_API_BASE_URL auf die Backend-URL setzen
npm run build

npm run build erzeugt dist/ inkl. Service Worker (vite-plugin-pwa) - dieser Ordner wird vom Reverse-Proxy (nginx) ausgeliefert, siehe deploy/.

Fehlende Assets vor Produktivbetrieb

  • public/icon-192.png, public/icon-512.png (PWA-Manifest-Icons) müssen noch ergänzt werden - aktuell nur in vite.config.ts referenziert, keine echten Bilddateien vorhanden.

Architektur-Entscheidungen (Sprint 7)

  • Offline-Queue (src/offline/queue.ts): IndexedDB statt reinem Service-Worker-Cache, weil tatsächliche Formulardaten (Ist-Mengen) über Reload/Absturz hinweg erhalten bleiben müssen. Der Service Worker selbst cached nur den App-Shell (Assets), keine API-Requests.
  • Idempotenz: PUT /kontrollen/{id}/positionen/{material_id} ist backend-seitig ein Upsert (siehe backend/app/services/kontrolle.py) - die Queue kann denselben Eintrag beliebig oft erneut senden, ohne doppelte Kontrollpositionen/Fehlbestände zu erzeugen.
  • Statusanzeige: jede Position zeigt "nicht gespeichert" / "wird übertragen…" / "gespeichert" / "Fehler" - kein stiller Datenverlust bei Verbindungsabbruch (Prompt 17.5).
  • Abschluss-Sperre: der Abschließen-Button ist deaktiviert, solange auch nur eine Position nicht bestätigt gespeichert ist.
  • Client-Fehler (4xx, z. B. Objekt-Sperre durch Übernahme) werden NICHT automatisch wiederholt - der Mitarbeiter sieht den Fehler und muss bewusst reagieren.

E2E-Tests (Playwright)

npm install
npx playwright install chromium
npm run test:e2e

Läuft komplett gegen einen gemockten Backend (e2e/mockApi.ts, page.route) - kein echtes Backend/DB nötig, playwright.config.ts startet npm run dev automatisch. Deckt Login, Objekt-Sperre/Übernahme, Fortschrittsanzeige und die Offline-Queue (Reconnect-Verhalten) ab. Reale Integrationstests gegen ein echtes Backend sowie die Praktiker-Explorations-Session (Testphase 4) sind ein separater, späterer Schritt - dafür wird ein laufendes Test-Deployment gebraucht, kein reiner Code-Schritt.