From 5fc8079df66be06c45ce76755d569a37b86504c2 Mon Sep 17 00:00:00 2001 From: patrick Date: Mon, 7 Sep 2026 12:02:47 +0200 Subject: [PATCH] =?UTF-8?q?feat(dashboard):=20Dashboard-Start=20f=C3=BCr?= =?UTF-8?q?=20Verantwortliche,=20Kachel-Anpassung,=20Status-Monitor?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Dashboard immer Startseite für Verantwortliche (Mitarbeiter -> Objekte), kaputte Startseiten-Auswahl entfernt. Neu gemeldete Mängel als eigener Hinweis. Kacheln per Anpassen-Modus verschieb-/ausblendbar (localStorage), Status-Monitor-Modus mit Vollbild und Auto-Refresh (60s). DashboardPage dabei in kleine Dateien pro Kachel gesplittet. Co-Authored-By: Claude Sonnet 5 Claude-Session: https://claude.ai/code/session_01CVgbozhYmuEhiEJHffRXCV --- DEVLOG.md | 1923 +++++++++++++++++ backend/DEVLOG.md | 128 ++ frontend/DEVLOG.md | 267 +++ frontend/src/App.tsx | 5 +- frontend/src/components/AppShell.tsx | 2 - frontend/src/components/StartseiteAuswahl.tsx | 29 - frontend/src/pages/DashboardPage.tsx | 349 --- frontend/src/pages/LoginPage.tsx | 3 +- .../src/pages/dashboard/DashboardPage.tsx | 215 ++ frontend/src/pages/dashboard/TileFrame.tsx | 49 + frontend/src/pages/dashboard/layout.ts | 55 + .../pages/dashboard/tiles/AblaufdatenTile.tsx | 28 + .../pages/dashboard/tiles/AktivitaetTile.tsx | 34 + .../pages/dashboard/tiles/AufgabenTile.tsx | 58 + .../tiles/EinsatzbereitschaftTile.tsx | 74 + .../pages/dashboard/tiles/KennzahlenTile.tsx | 19 + .../src/pages/dashboard/tiles/MaengelTile.tsx | 58 + .../dashboard/tiles/PrueftermineTile.tsx | 28 + .../dashboard/tiles/QualifikationTile.tsx | 26 + frontend/src/pages/dashboard/types.ts | 55 + frontend/src/settings/startseite.ts | 30 - 21 files changed, 3020 insertions(+), 415 deletions(-) delete mode 100644 frontend/src/components/StartseiteAuswahl.tsx delete mode 100644 frontend/src/pages/DashboardPage.tsx create mode 100644 frontend/src/pages/dashboard/DashboardPage.tsx create mode 100644 frontend/src/pages/dashboard/TileFrame.tsx create mode 100644 frontend/src/pages/dashboard/layout.ts create mode 100644 frontend/src/pages/dashboard/tiles/AblaufdatenTile.tsx create mode 100644 frontend/src/pages/dashboard/tiles/AktivitaetTile.tsx create mode 100644 frontend/src/pages/dashboard/tiles/AufgabenTile.tsx create mode 100644 frontend/src/pages/dashboard/tiles/EinsatzbereitschaftTile.tsx create mode 100644 frontend/src/pages/dashboard/tiles/KennzahlenTile.tsx create mode 100644 frontend/src/pages/dashboard/tiles/MaengelTile.tsx create mode 100644 frontend/src/pages/dashboard/tiles/PrueftermineTile.tsx create mode 100644 frontend/src/pages/dashboard/tiles/QualifikationTile.tsx create mode 100644 frontend/src/pages/dashboard/types.ts delete mode 100644 frontend/src/settings/startseite.ts diff --git a/DEVLOG.md b/DEVLOG.md index 6e1b075..c64fc94 100644 --- a/DEVLOG.md +++ b/DEVLOG.md @@ -4388,3 +4388,1926 @@ Keine Commits in dieser Session. - arbeitskacheln/12_personnel.md | 169 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ --- +## 2026-09-05 15:42 – 15:48 (5m) +**Beschreibung:** Claude Code Session +**Projekt:** asb-material + +### Commits +- c5d689d docs: Readiness-Backlog aktualisiert - UNKNOWN-Fund als erledigt markiert +- fab3a06 fix(dashboard): nie kontrollierte Objekte gelten nicht mehr als einsatzbereit +- f158cb8 docs: Readiness-Epic komplettiert (READY-001..005) + +### Geänderte Dateien +- arbeitskacheln/00_index.md | 6 +++--- +- arbeitskacheln/13_readiness.md | 17 ++++++++--------- + +--- +## 2026-09-05 15:49 – 15:50 (1m) +**Beschreibung:** Claude Code Session +**Projekt:** asb-material + +### Commits +- dcba53c docs: Documents-Epic komplettiert (DOC-001..005) + +### Geänderte Dateien +- arbeitskacheln/00_index.md | 3 ++- +- arbeitskacheln/14_documents.md | 127 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + +--- +## 2026-09-05 15:57 – 15:58 (1m) +**Beschreibung:** Claude Code Session +**Projekt:** asb-material + +### Commits +- 8f9816b docs: Mobile-Epic komplettiert + Subagenten-Zuordnung je Epic ergänzt + +### Geänderte Dateien +- arbeitskacheln/00_index.md | 36 +++++++++++++++++++++++-- +- arbeitskacheln/15_mobile.md | 130 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + +--- +## 2026-09-05 15:58 – 15:59 (1m) +**Beschreibung:** Claude Code Session +**Projekt:** asb-material + +### Commits +- 0ee3ece docs: Operations-Epic (Platzhalter) + Backlog-Detaillierung abgeschlossen + +### Geänderte Dateien +- arbeitskacheln/00_index.md | 3 ++- +- arbeitskacheln/16_operations.md | 81 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + +--- +## 2026-09-05 16:57 – 17:00 (2m) +**Beschreibung:** Claude Code Session +**Projekt:** asb-material + +### Commits +Keine Commits in dieser Session. + +### Geänderte Dateien +- arbeitskacheln/00_index.md | 3 +- +- arbeitskacheln/16_operations.md | 81 +++++++++++++++++++++++++++++++++++++++++ + +--- +## 2026-09-05 17:03 – 17:06 (3m) +**Beschreibung:** Claude Code Session +**Projekt:** arbeitskacheln + +### Commits +- 2bd97aa docs: alte arbeitskarten (Karte 01-14) gegen arbeitskacheln-Backlog abgeglichen + +### Geänderte Dateien +- arbeitskacheln/00_index.md | 33 ++++++++++++++++++++++++++++++--- +- arbeitskacheln/06_inventory.md | 26 +++++++++++++++++++------- +- arbeitskacheln/17_zustaendigkeit.md | 74 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +- arbeitskacheln/18_notifications.md | 68 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +- arbeitskacheln/19_satelliten_server.md | 63 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +- arbeitskacheln/DEVLOG.md | 14 ++++++++++++++ +- arbeitskarten/00_index.md | 34 +++++++++++++--------------------- +- arbeitskarten/01_rollen_zuordnung.md | 14 -------------- +- arbeitskarten/02_rechte_stammdaten.md | 10 ---------- +- arbeitskarten/03_sollmengen_recht.md | 11 ----------- +- arbeitskarten/04_organisationsstruktur.md | 15 --------------- +- arbeitskarten/05_benachrichtigungen.md | 15 --------------- +- arbeitskarten/06_geraet_pc_mobil.md | 11 ----------- +- arbeitskarten/07_sofort_nachfuellung.md | 10 ---------- +- arbeitskarten/08_mindermenge_gueltigkeit.md | 11 ----------- +- arbeitskarten/09_authentifizierung.md | 10 ---------- +- arbeitskarten/10_qr_barcode.md | 42 ------------------------------------------ +- arbeitskarten/11_systemumfang_ressourcenmanagement.md | 18 ------------------ +- arbeitskarten/12_eskalation.md | 22 ---------------------- +- arbeitskarten/13_satelliten_server.md | 39 --------------------------------------- +- arbeitskarten/14_pruef_wartungspflicht.md | 98 -------------------------------------------------------------------------------------------------- + +--- +## 2026-09-05 17:06 – 17:07 (0m) +**Beschreibung:** Claude Code Session +**Projekt:** asb-material + +### Commits +- c7dd47f chore: arbeitskarten-Ordner entfernt, arbeitskacheln ist alleiniger Backlog-Stand + +### Geänderte Dateien +- arbeitskarten/00_index.md | 16 ---------------- + +--- +## 2026-09-05 17:10 – 17:19 (8m) +**Beschreibung:** Claude Code Session +**Projekt:** asb-material + +### Commits +Keine Commits in dieser Session. + +### Geänderte Dateien +- arbeitskarten/00_index.md | 16 ---------------- + +--- +## 2026-09-05 17:22 – 17:24 (2m) +**Beschreibung:** Claude Code Session +**Projekt:** asb-material + +### Commits +Keine Commits in dieser Session. + +### Geänderte Dateien +- arbeitskarten/00_index.md | 16 ---------------- + +--- +## 2026-09-05 17:33 – 17:57 (24m) +**Beschreibung:** Claude Code Session +**Projekt:** asb-material + +### Commits +- fca9ee8 fix(ci): CI-Testdatenbank-Encoding + 3 echte Session-/Logikfehler behoben + +### Geänderte Dateien +- .gitea/workflows/ci.yml | 7 ++++++- +- backend/app/api/v1/endpoints/geraet_instanz.py | 11 ++++++++--- +- backend/app/api/v1/endpoints/objekte.py | 10 ++++++++++ +- backend/app/services/geraet_instanz.py | 17 +++++++++++++++++ +- backend/tests/test_lagerbewegung.py | 6 +++++- +- frontend/src/pages/KontrollPage.tsx | 4 ++++ +- frontend/src/pages/kontrolle/NachfuellDialog.tsx | 44 ++++++++++++++++++++++++++++++++++++++++++-- +- frontend/src/pages/kontrolle/useKontrolle.ts | 12 ++++++++++++ + +--- +## 2026-09-05 20:32 – 20:33 (1m) +**Beschreibung:** Claude Code Session +**Projekt:** asb-material + +### Commits +Keine Commits in dieser Session. + +### Geänderte Dateien +- .gitea/workflows/ci.yml | 7 ++++++- +- backend/app/api/v1/endpoints/geraet_instanz.py | 11 ++++++++--- +- backend/app/api/v1/endpoints/objekte.py | 10 ++++++++++ +- backend/app/services/geraet_instanz.py | 17 +++++++++++++++++ +- backend/tests/test_lagerbewegung.py | 6 +++++- +- frontend/src/pages/KontrollPage.tsx | 4 ++++ +- frontend/src/pages/kontrolle/NachfuellDialog.tsx | 44 ++++++++++++++++++++++++++++++++++++++++++-- +- frontend/src/pages/kontrolle/useKontrolle.ts | 12 ++++++++++++ + +--- +## 2026-09-05 20:33 – 20:34 (1m) +**Beschreibung:** Claude Code Session +**Projekt:** asb-material + +### Commits +Keine Commits in dieser Session. + +### Geänderte Dateien +- .gitea/workflows/ci.yml | 7 ++++++- +- backend/app/api/v1/endpoints/geraet_instanz.py | 11 ++++++++--- +- backend/app/api/v1/endpoints/objekte.py | 10 ++++++++++ +- backend/app/services/geraet_instanz.py | 17 +++++++++++++++++ +- backend/tests/test_lagerbewegung.py | 6 +++++- +- frontend/src/pages/KontrollPage.tsx | 4 ++++ +- frontend/src/pages/kontrolle/NachfuellDialog.tsx | 44 ++++++++++++++++++++++++++++++++++++++++++-- +- frontend/src/pages/kontrolle/useKontrolle.ts | 12 ++++++++++++ + +--- +## 2026-09-05 20:35 – 20:36 (1m) +**Beschreibung:** Claude Code Session +**Projekt:** asb-material + +### Commits +Keine Commits in dieser Session. + +### Geänderte Dateien +- .gitea/workflows/ci.yml | 7 ++++++- +- backend/app/api/v1/endpoints/geraet_instanz.py | 11 ++++++++--- +- backend/app/api/v1/endpoints/objekte.py | 10 ++++++++++ +- backend/app/services/geraet_instanz.py | 17 +++++++++++++++++ +- backend/tests/test_lagerbewegung.py | 6 +++++- +- frontend/src/pages/KontrollPage.tsx | 4 ++++ +- frontend/src/pages/kontrolle/NachfuellDialog.tsx | 44 ++++++++++++++++++++++++++++++++++++++++++-- +- frontend/src/pages/kontrolle/useKontrolle.ts | 12 ++++++++++++ + +--- +## 2026-09-05 20:35 – 20:36 (1m) +**Beschreibung:** Claude Code Session +**Projekt:** asb-material + +### Commits +Keine Commits in dieser Session. + +### Geänderte Dateien +- .gitea/workflows/ci.yml | 7 ++++++- +- backend/app/api/v1/endpoints/geraet_instanz.py | 11 ++++++++--- +- backend/app/api/v1/endpoints/objekte.py | 10 ++++++++++ +- backend/app/services/geraet_instanz.py | 17 +++++++++++++++++ +- backend/tests/test_lagerbewegung.py | 6 +++++- +- frontend/src/pages/KontrollPage.tsx | 4 ++++ +- frontend/src/pages/kontrolle/NachfuellDialog.tsx | 44 ++++++++++++++++++++++++++++++++++++++++++-- +- frontend/src/pages/kontrolle/useKontrolle.ts | 12 ++++++++++++ + +--- +## 2026-09-05 20:35 – 20:36 (1m) +**Beschreibung:** Claude Code Session +**Projekt:** asb-material + +### Commits +Keine Commits in dieser Session. + +### Geänderte Dateien +- .gitea/workflows/ci.yml | 7 ++++++- +- backend/app/api/v1/endpoints/geraet_instanz.py | 11 ++++++++--- +- backend/app/api/v1/endpoints/objekte.py | 10 ++++++++++ +- backend/app/services/geraet_instanz.py | 17 +++++++++++++++++ +- backend/tests/test_lagerbewegung.py | 6 +++++- +- frontend/src/pages/KontrollPage.tsx | 4 ++++ +- frontend/src/pages/kontrolle/NachfuellDialog.tsx | 44 ++++++++++++++++++++++++++++++++++++++++++-- +- frontend/src/pages/kontrolle/useKontrolle.ts | 12 ++++++++++++ + +--- +## 2026-09-05 20:35 – 20:36 (1m) +**Beschreibung:** Claude Code Session +**Projekt:** asb-material + +### Commits +Keine Commits in dieser Session. + +### Geänderte Dateien +- .gitea/workflows/ci.yml | 7 ++++++- +- backend/app/api/v1/endpoints/geraet_instanz.py | 11 ++++++++--- +- backend/app/api/v1/endpoints/objekte.py | 10 ++++++++++ +- backend/app/services/geraet_instanz.py | 17 +++++++++++++++++ +- backend/tests/test_lagerbewegung.py | 6 +++++- +- frontend/src/pages/KontrollPage.tsx | 4 ++++ +- frontend/src/pages/kontrolle/NachfuellDialog.tsx | 44 ++++++++++++++++++++++++++++++++++++++++++-- +- frontend/src/pages/kontrolle/useKontrolle.ts | 12 ++++++++++++ + +--- +## 2026-09-05 20:35 – 20:36 (1m) +**Beschreibung:** Claude Code Session +**Projekt:** asb-material + +### Commits +Keine Commits in dieser Session. + +### Geänderte Dateien +- .gitea/workflows/ci.yml | 7 ++++++- +- backend/app/api/v1/endpoints/geraet_instanz.py | 11 ++++++++--- +- backend/app/api/v1/endpoints/objekte.py | 10 ++++++++++ +- backend/app/services/geraet_instanz.py | 17 +++++++++++++++++ +- backend/tests/test_lagerbewegung.py | 6 +++++- +- frontend/src/pages/KontrollPage.tsx | 4 ++++ +- frontend/src/pages/kontrolle/NachfuellDialog.tsx | 44 ++++++++++++++++++++++++++++++++++++++++++-- +- frontend/src/pages/kontrolle/useKontrolle.ts | 12 ++++++++++++ + +--- +## 2026-09-05 20:59 – 21:02 (2m) +**Beschreibung:** Claude Code Session +**Projekt:** asb-material + +### Commits +Keine Commits in dieser Session. + +### Geänderte Dateien +- .gitea/workflows/ci.yml | 7 ++++++- +- backend/app/api/v1/endpoints/geraet_instanz.py | 11 ++++++++--- +- backend/app/api/v1/endpoints/objekte.py | 10 ++++++++++ +- backend/app/services/geraet_instanz.py | 17 +++++++++++++++++ +- backend/tests/test_lagerbewegung.py | 6 +++++- +- frontend/src/pages/KontrollPage.tsx | 4 ++++ +- frontend/src/pages/kontrolle/NachfuellDialog.tsx | 44 ++++++++++++++++++++++++++++++++++++++++++-- +- frontend/src/pages/kontrolle/useKontrolle.ts | 12 ++++++++++++ + +--- +## 2026-09-05 21:04 – 21:04 (0m) +**Beschreibung:** Claude Code Session +**Projekt:** asb-material + +### Commits +Keine Commits in dieser Session. + +### Geänderte Dateien +- .gitea/workflows/ci.yml | 7 ++++++- +- backend/app/api/v1/endpoints/geraet_instanz.py | 11 ++++++++--- +- backend/app/api/v1/endpoints/objekte.py | 10 ++++++++++ +- backend/app/services/geraet_instanz.py | 17 +++++++++++++++++ +- backend/tests/test_lagerbewegung.py | 6 +++++- +- frontend/src/pages/KontrollPage.tsx | 4 ++++ +- frontend/src/pages/kontrolle/NachfuellDialog.tsx | 44 ++++++++++++++++++++++++++++++++++++++++++-- +- frontend/src/pages/kontrolle/useKontrolle.ts | 12 ++++++++++++ + +--- +## 2026-09-05 21:05 – 21:05 (0m) +**Beschreibung:** Claude Code Session +**Projekt:** asb-material + +### Commits +Keine Commits in dieser Session. + +### Geänderte Dateien +- .gitea/workflows/ci.yml | 7 ++++++- +- backend/app/api/v1/endpoints/geraet_instanz.py | 11 ++++++++--- +- backend/app/api/v1/endpoints/objekte.py | 10 ++++++++++ +- backend/app/services/geraet_instanz.py | 17 +++++++++++++++++ +- backend/tests/test_lagerbewegung.py | 6 +++++- +- frontend/src/pages/KontrollPage.tsx | 4 ++++ +- frontend/src/pages/kontrolle/NachfuellDialog.tsx | 44 ++++++++++++++++++++++++++++++++++++++++++-- +- frontend/src/pages/kontrolle/useKontrolle.ts | 12 ++++++++++++ + +--- +## 2026-09-05 21:06 – 21:14 (8m) +**Beschreibung:** Claude Code Session +**Projekt:** asb-material + +### Commits +- 84c11af feat(akte): Digital-File-Epic - Aggregations-Endpunkt + Übersichtsseite (FILE-001..006) + +### Geänderte Dateien +- backend/app/api/v1/api.py | 2 ++ +- backend/app/api/v1/endpoints/akte.py | 23 +++++++++++++++++++++++ +- backend/app/schemas/akte.py | 36 ++++++++++++++++++++++++++++++++++++ +- backend/app/services/akte.py | 134 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +- backend/tests/test_akte.py | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +- frontend/src/App.tsx | 9 +++++++++ +- frontend/src/api/types.ts | 20 ++++++++++++++++++++ +- frontend/src/pages/AktePage.tsx | 155 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +- frontend/src/pages/ObjektListPage.tsx | 8 ++++++++ + +--- +## 2026-09-05 21:16 – 21:16 (0m) +**Beschreibung:** Claude Code Session +**Projekt:** asb-material + +### Commits +Keine Commits in dieser Session. + +### Geänderte Dateien +- backend/app/api/v1/api.py | 2 ++ +- backend/app/api/v1/endpoints/akte.py | 23 +++++++++++++++++++++++ +- backend/app/schemas/akte.py | 36 ++++++++++++++++++++++++++++++++++++ +- backend/app/services/akte.py | 134 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +- backend/tests/test_akte.py | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +- frontend/src/App.tsx | 9 +++++++++ +- frontend/src/api/types.ts | 20 ++++++++++++++++++++ +- frontend/src/pages/AktePage.tsx | 155 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +- frontend/src/pages/ObjektListPage.tsx | 8 ++++++++ + +--- +## 2026-09-05 21:32 – 21:33 (1m) +**Beschreibung:** Claude Code Session +**Projekt:** asb-material + +### Commits +- ca0befd docs: Digital-File-Epic als umgesetzt markiert, Mobile-Epic-Verweise aktualisiert + +### Geänderte Dateien +- arbeitskacheln/03_digital_file.md | 14 ++++++++------ +- arbeitskacheln/15_mobile.md | 22 ++++++++++++---------- + +--- +## 2026-09-05 21:34 – 21:44 (9m) +**Beschreibung:** Claude Code Session +**Projekt:** asb-material + +### Commits +- cce643f docs: Warehouse-Epic Kern als umgesetzt markiert +- f7367f6 feat(lager): Warehouse-Epic Kern (WH-001..004+007) + +### Geänderte Dateien +- arbeitskacheln/07_warehouse.md | 16 +++++++++------- + +--- +## 2026-09-05 21:45 – 21:45 (0m) +**Beschreibung:** Claude Code Session +**Projekt:** asb-material + +### Commits +Keine Commits in dieser Session. + +### Geänderte Dateien +- arbeitskacheln/07_warehouse.md | 16 +++++++++------- + +--- +## 2026-09-05 21:56 – 21:56 (0m) +**Beschreibung:** Claude Code Session +**Projekt:** asb-material + +### Commits +Keine Commits in dieser Session. + +### Geänderte Dateien +- arbeitskacheln/07_warehouse.md | 16 +++++++++------- + +--- +## 2026-09-05 21:58 – 21:58 (0m) +**Beschreibung:** Claude Code Session +**Projekt:** asb-material + +### Commits +Keine Commits in dieser Session. + +### Geänderte Dateien +- arbeitskacheln/07_warehouse.md | 16 +++++++++------- + +--- +## 2026-09-05 22:12 – 22:12 (0m) +**Beschreibung:** Claude Code Session +**Projekt:** asb-material + +### Commits +Keine Commits in dieser Session. + +### Geänderte Dateien +- arbeitskacheln/07_warehouse.md | 16 +++++++++------- + +--- +## 2026-09-05 22:12 – 22:14 (1m) +**Beschreibung:** Claude Code Session +**Projekt:** asb-material + +### Commits +Keine Commits in dieser Session. + +### Geänderte Dateien +- arbeitskacheln/07_warehouse.md | 16 +++++++++------- + +--- +## 2026-09-05 22:20 – 22:20 (0m) +**Beschreibung:** Claude Code Session +**Projekt:** asb-material + +### Commits +Keine Commits in dieser Session. + +### Geänderte Dateien +- arbeitskacheln/07_warehouse.md | 16 +++++++++------- + +--- +## 2026-09-05 22:21 – 22:34 (13m) +**Beschreibung:** Claude Code Session +**Projekt:** asb-material + +### Commits +- 0249921 feat(vorlage): Vorlage direkt editierbar ohne Versionszwang (Nutzer-Vorgabe) + +### Geänderte Dateien +- backend/alembic/versions/0020_sollmenge_vorlage.py | 38 ++++++++++++++++++++++++++++++++++++++ +- backend/app/api/v1/endpoints/objekte.py | 10 +++------- +- backend/app/api/v1/endpoints/vorlagen.py | 20 +++++++++++++++++++- +- backend/app/models/objektposition.py | 8 +++++++- +- backend/app/services/kontrolle/erfassung.py | 5 ++--- +- backend/app/services/objekte.py | 25 ++++++++++--------------- +- backend/app/services/vorlagen.py | 21 +++++++++++++++++++++ +- backend/tests/test_vorlagen.py | 64 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++- +- frontend/src/pages/admin/VorlageSection.tsx | 20 ++++++++++++-------- + +--- +## 2026-09-05 22:38 – 22:39 (0m) +**Beschreibung:** Claude Code Session +**Projekt:** asb-material + +### Commits +Keine Commits in dieser Session. + +### Geänderte Dateien +- backend/alembic/versions/0020_sollmenge_vorlage.py | 38 ++++++++++++++++++++++++++++++++++++++ +- backend/app/api/v1/endpoints/objekte.py | 10 +++------- +- backend/app/api/v1/endpoints/vorlagen.py | 20 +++++++++++++++++++- +- backend/app/models/objektposition.py | 8 +++++++- +- backend/app/services/kontrolle/erfassung.py | 5 ++--- +- backend/app/services/objekte.py | 25 ++++++++++--------------- +- backend/app/services/vorlagen.py | 21 +++++++++++++++++++++ +- backend/tests/test_vorlagen.py | 64 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++- +- frontend/src/pages/admin/VorlageSection.tsx | 20 ++++++++++++-------- + +--- +## 2026-09-05 22:39 – 22:39 (0m) +**Beschreibung:** Claude Code Session +**Projekt:** asb-material + +### Commits +Keine Commits in dieser Session. + +### Geänderte Dateien +- backend/alembic/versions/0020_sollmenge_vorlage.py | 38 ++++++++++++++++++++++++++++++++++++++ +- backend/app/api/v1/endpoints/objekte.py | 10 +++------- +- backend/app/api/v1/endpoints/vorlagen.py | 20 +++++++++++++++++++- +- backend/app/models/objektposition.py | 8 +++++++- +- backend/app/services/kontrolle/erfassung.py | 5 ++--- +- backend/app/services/objekte.py | 25 ++++++++++--------------- +- backend/app/services/vorlagen.py | 21 +++++++++++++++++++++ +- backend/tests/test_vorlagen.py | 64 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++- +- frontend/src/pages/admin/VorlageSection.tsx | 20 ++++++++++++-------- + +--- +## 2026-09-05 22:39 – 22:39 (0m) +**Beschreibung:** Claude Code Session +**Projekt:** asb-material + +### Commits +Keine Commits in dieser Session. + +### Geänderte Dateien +- backend/alembic/versions/0020_sollmenge_vorlage.py | 38 ++++++++++++++++++++++++++++++++++++++ +- backend/app/api/v1/endpoints/objekte.py | 10 +++------- +- backend/app/api/v1/endpoints/vorlagen.py | 20 +++++++++++++++++++- +- backend/app/models/objektposition.py | 8 +++++++- +- backend/app/services/kontrolle/erfassung.py | 5 ++--- +- backend/app/services/objekte.py | 25 ++++++++++--------------- +- backend/app/services/vorlagen.py | 21 +++++++++++++++++++++ +- backend/tests/test_vorlagen.py | 64 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++- +- frontend/src/pages/admin/VorlageSection.tsx | 20 ++++++++++++-------- + +--- +## 2026-09-05 22:40 – 22:40 (0m) +**Beschreibung:** Claude Code Session +**Projekt:** asb-material + +### Commits +Keine Commits in dieser Session. + +### Geänderte Dateien +- backend/alembic/versions/0020_sollmenge_vorlage.py | 38 ++++++++++++++++++++++++++++++++++++++ +- backend/app/api/v1/endpoints/objekte.py | 10 +++------- +- backend/app/api/v1/endpoints/vorlagen.py | 20 +++++++++++++++++++- +- backend/app/models/objektposition.py | 8 +++++++- +- backend/app/services/kontrolle/erfassung.py | 5 ++--- +- backend/app/services/objekte.py | 25 ++++++++++--------------- +- backend/app/services/vorlagen.py | 21 +++++++++++++++++++++ +- backend/tests/test_vorlagen.py | 64 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++- +- frontend/src/pages/admin/VorlageSection.tsx | 20 ++++++++++++-------- + +--- +## 2026-09-05 23:14 – 23:16 (2m) +**Beschreibung:** Claude Code Session +**Projekt:** asb-material + +### Commits +- 0706197 docs: externe Roadmap (Shelf/Resgrid/Emergency Mgmt-Vergleich) gegen Backlog abgeglichen + +### Geänderte Dateien +- arbeitskacheln/00_index.md | 29 +++++++++++++++++++++++++++++ + +--- +## 2026-09-05 23:17 – 23:17 (0m) +**Beschreibung:** Claude Code Session +**Projekt:** asb-material + +### Commits +- eab1877 docs: Dispatch-Karte-Widerspruch geklärt - keine Dispatch-Karte + +### Geänderte Dateien +- arbeitskacheln/00_index.md | 10 ++++++---- + +--- +## 2026-09-05 23:17 – 23:17 (0m) +**Beschreibung:** Claude Code Session +**Projekt:** asb-material + +### Commits +Keine Commits in dieser Session. + +### Geänderte Dateien +- arbeitskacheln/00_index.md | 10 ++++++---- + +--- +## 2026-09-05 23:18 – 23:18 (0m) +**Beschreibung:** Claude Code Session +**Projekt:** asb-material + +### Commits +Keine Commits in dieser Session. + +### Geänderte Dateien +- arbeitskacheln/00_index.md | 10 ++++++---- + +--- +## 2026-09-05 23:19 – 23:20 (0m) +**Beschreibung:** Claude Code Session +**Projekt:** asb-material + +### Commits +- cdb4367 docs: Epic-Zähler im Index korrigiert (16 -> 19) + +### Geänderte Dateien +- arbeitskacheln/00_index.md | 4 +++- + +--- +## 2026-09-05 23:20 – 23:20 (0m) +**Beschreibung:** Claude Code Session +**Projekt:** asb-material + +### Commits +Keine Commits in dieser Session. + +### Geänderte Dateien +- arbeitskacheln/00_index.md | 4 +++- + +--- +## 2026-09-05 23:21 – 23:22 (0m) +**Beschreibung:** Claude Code Session +**Projekt:** asb-material + +### Commits +- c71597b docs: Leitlinie ergänzt - gute Inhalte aus Vergleichsprojekten übernehmen, schlechte klein halten + +### Geänderte Dateien +- arbeitskacheln/00_index.md | 19 +++++++++++++++++++ + +--- +## 2026-09-05 23:23 – 23:25 (2m) +**Beschreibung:** Claude Code Session +**Projekt:** asb-material + +### Commits +- 4fa7ace feat(vorlage): Beladungsplanung per Drag&Drop (Shelf-inspiriert) + +### Geänderte Dateien +- frontend/src/pages/admin/BeladungsplanerBoard.tsx | 131 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +- frontend/src/pages/admin/VorlageSection.tsx | 47 +++++++---------------------------------------- + +--- +## 2026-09-05 23:25 – 23:25 (0m) +**Beschreibung:** Claude Code Session +**Projekt:** asb-material + +### Commits +Keine Commits in dieser Session. + +### Geänderte Dateien +- frontend/src/pages/admin/BeladungsplanerBoard.tsx | 131 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +- frontend/src/pages/admin/VorlageSection.tsx | 47 +++++++---------------------------------------- + +--- +## 2026-09-05 23:27 – 23:27 (0m) +**Beschreibung:** Claude Code Session +**Projekt:** asb-material + +### Commits +Keine Commits in dieser Session. + +### Geänderte Dateien +- frontend/src/pages/admin/BeladungsplanerBoard.tsx | 131 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +- frontend/src/pages/admin/VorlageSection.tsx | 47 +++++++---------------------------------------- + +--- +## 2026-09-05 23:27 – 23:27 (0m) +**Beschreibung:** Claude Code Session +**Projekt:** asb-material + +### Commits +Keine Commits in dieser Session. + +### Geänderte Dateien +- frontend/src/pages/admin/BeladungsplanerBoard.tsx | 131 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +- frontend/src/pages/admin/VorlageSection.tsx | 47 +++++++---------------------------------------- + +--- +## 2026-09-05 23:28 – 23:28 (0m) +**Beschreibung:** Claude Code Session +**Projekt:** asb-material + +### Commits +Keine Commits in dieser Session. + +### Geänderte Dateien +- frontend/src/pages/admin/BeladungsplanerBoard.tsx | 131 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +- frontend/src/pages/admin/VorlageSection.tsx | 47 +++++++---------------------------------------- + +--- +## 2026-09-05 23:30 – 23:30 (0m) +**Beschreibung:** Claude Code Session +**Projekt:** mabea-mcp + +### Commits +Keine Commits in dieser Session. + +### Geänderte Dateien +- frontend/src/pages/admin/BeladungsplanerBoard.tsx | 131 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +- frontend/src/pages/admin/VorlageSection.tsx | 47 +++++++---------------------------------------- + +--- +## 2026-09-05 23:31 – 23:33 (2m) +**Beschreibung:** Claude Code Session +**Projekt:** asb-material + +### Commits +- a6f0c51 fix(beladungsplaner): Klick-zum-Zuordnen statt HTML5-Drag&Drop + +### Geänderte Dateien +- frontend/src/pages/admin/BeladungsplanerBoard.tsx | 186 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++----------------------------------------------------------------------------------- + +--- +## 2026-09-05 23:41 – 23:42 (1m) +**Beschreibung:** Claude Code Session +**Projekt:** asb-material + +### Commits +Keine Commits in dieser Session. + +### Geänderte Dateien +- frontend/src/pages/admin/BeladungsplanerBoard.tsx | 186 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++----------------------------------------------------------------------------------- + +--- +## 2026-09-05 23:42 – 23:42 (0m) +**Beschreibung:** Claude Code Session +**Projekt:** asb-material + +### Commits +Keine Commits in dieser Session. + +### Geänderte Dateien +- frontend/src/pages/admin/BeladungsplanerBoard.tsx | 186 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++----------------------------------------------------------------------------------- + +--- +## 2026-09-05 23:42 – 23:42 (0m) +**Beschreibung:** Claude Code Session +**Projekt:** asb-material + +### Commits +Keine Commits in dieser Session. + +### Geänderte Dateien +- frontend/src/pages/admin/BeladungsplanerBoard.tsx | 186 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++----------------------------------------------------------------------------------- + +--- +## 2026-09-05 23:42 – 23:42 (0m) +**Beschreibung:** Claude Code Session +**Projekt:** asb-material + +### Commits +Keine Commits in dieser Session. + +### Geänderte Dateien +- frontend/src/pages/admin/BeladungsplanerBoard.tsx | 186 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++----------------------------------------------------------------------------------- + +--- +## 2026-09-05 23:42 – 23:49 (7m) +**Beschreibung:** Claude Code Session +**Projekt:** asb-material + +### Commits +- 0c8f375 refactor: Code-Review-Fixes (Reuse/Simplification/Efficiency) aus dieser Session + +### Geänderte Dateien +- backend/app/api/v1/endpoints/lager.py | 31 ++++++++++++++++++------------- +- backend/app/api/v1/endpoints/vorlagen.py | 19 +++++++++---------- +- backend/app/schemas/historie.py | 2 +- +- backend/app/services/akte.py | 41 ++++++++++------------------------------- +- backend/app/services/vorlagen.py | 20 +++++++++++++------- + +--- +## 2026-09-05 23:51 – 23:51 (0m) +**Beschreibung:** Claude Code Session +**Projekt:** asb-material + +### Commits +Keine Commits in dieser Session. + +### Geänderte Dateien +- backend/app/api/v1/endpoints/lager.py | 31 ++++++++++++++++++------------- +- backend/app/api/v1/endpoints/vorlagen.py | 19 +++++++++---------- +- backend/app/schemas/historie.py | 2 +- +- backend/app/services/akte.py | 41 ++++++++++------------------------------- +- backend/app/services/vorlagen.py | 20 +++++++++++++------- + +--- +## 2026-09-05 23:55 – 23:55 (0m) +**Beschreibung:** Claude Code Session +**Projekt:** asb-material + +### Commits +Keine Commits in dieser Session. + +### Geänderte Dateien +- backend/app/api/v1/endpoints/lager.py | 31 ++++++++++++++++++------------- +- backend/app/api/v1/endpoints/vorlagen.py | 19 +++++++++---------- +- backend/app/schemas/historie.py | 2 +- +- backend/app/services/akte.py | 41 ++++++++++------------------------------- +- backend/app/services/vorlagen.py | 20 +++++++++++++------- + +--- +## 2026-09-05 23:56 – 23:57 (0m) +**Beschreibung:** Claude Code Session +**Projekt:** asb-material + +### Commits +Keine Commits in dieser Session. + +### Geänderte Dateien +- backend/app/api/v1/endpoints/lager.py | 31 ++++++++++++++++++------------- +- backend/app/api/v1/endpoints/vorlagen.py | 19 +++++++++---------- +- backend/app/schemas/historie.py | 2 +- +- backend/app/services/akte.py | 41 ++++++++++------------------------------- +- backend/app/services/vorlagen.py | 20 +++++++++++++------- + +--- +## 2026-09-06 09:32 – 09:32 (0m) +**Beschreibung:** Claude Code Session +**Projekt:** asb-material + +### Commits +Keine Commits in dieser Session. + +### Geänderte Dateien +- backend/app/api/v1/endpoints/lager.py | 31 ++++++++++++++++++------------- +- backend/app/api/v1/endpoints/vorlagen.py | 19 +++++++++---------- +- backend/app/schemas/historie.py | 2 +- +- backend/app/services/akte.py | 41 ++++++++++------------------------------- +- backend/app/services/vorlagen.py | 20 +++++++++++++------- + +--- +## 2026-09-06 09:33 – 09:35 (2m) +**Beschreibung:** Claude Code Session +**Projekt:** asb-material + +### Commits +Keine Commits in dieser Session. + +### Geänderte Dateien +- backend/app/api/v1/endpoints/lager.py | 31 ++++++++++++++++++------------- +- backend/app/api/v1/endpoints/vorlagen.py | 19 +++++++++---------- +- backend/app/schemas/historie.py | 2 +- +- backend/app/services/akte.py | 41 ++++++++++------------------------------- +- backend/app/services/vorlagen.py | 20 +++++++++++++------- + +--- +## 2026-09-06 09:36 – 09:36 (0m) +**Beschreibung:** Claude Code Session +**Projekt:** asb-material + +### Commits +- b33d1c8 feat(warehouse): WH-005 Umlagerung zwischen Lagerplätzen + +### Geänderte Dateien +- arbeitskacheln/07_warehouse.md | 17 ++++++++--------- +- arbeitskacheln/18_notifications.md | 15 ++++++++------- +- backend/app/api/v1/endpoints/lager.py | 41 ++++++++++++++++++++++++++++++++++++++++- +- backend/app/schemas/lager.py | 7 +++++++ +- backend/app/services/lager.py | 45 +++++++++++++++++++++++++++++++++++++++++++++ +- backend/tests/test_lager.py | 55 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ + +--- +## 2026-09-06 09:36 – 09:37 (0m) +**Beschreibung:** Claude Code Session +**Projekt:** asb-material + +### Commits +Keine Commits in dieser Session. + +### Geänderte Dateien +- arbeitskacheln/07_warehouse.md | 17 ++++++++--------- +- arbeitskacheln/18_notifications.md | 15 ++++++++------- +- backend/app/api/v1/endpoints/lager.py | 41 ++++++++++++++++++++++++++++++++++++++++- +- backend/app/schemas/lager.py | 7 +++++++ +- backend/app/services/lager.py | 45 +++++++++++++++++++++++++++++++++++++++++++++ +- backend/tests/test_lager.py | 55 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ + +--- +## 2026-09-06 09:39 – 09:40 (1m) +**Beschreibung:** Claude Code Session +**Projekt:** asb-material + +### Commits +Keine Commits in dieser Session. + +### Geänderte Dateien +- arbeitskacheln/07_warehouse.md | 17 ++++++++--------- +- arbeitskacheln/18_notifications.md | 15 ++++++++------- +- backend/app/api/v1/endpoints/lager.py | 41 ++++++++++++++++++++++++++++++++++++++++- +- backend/app/schemas/lager.py | 7 +++++++ +- backend/app/services/lager.py | 45 +++++++++++++++++++++++++++++++++++++++++++++ +- backend/tests/test_lager.py | 55 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ + +--- +## 2026-09-06 09:40 – 09:40 (0m) +**Beschreibung:** Claude Code Session +**Projekt:** asb-material + +### Commits +Keine Commits in dieser Session. + +### Geänderte Dateien +- arbeitskacheln/07_warehouse.md | 17 ++++++++--------- +- arbeitskacheln/18_notifications.md | 15 ++++++++------- +- backend/app/api/v1/endpoints/lager.py | 41 ++++++++++++++++++++++++++++++++++++++++- +- backend/app/schemas/lager.py | 7 +++++++ +- backend/app/services/lager.py | 45 +++++++++++++++++++++++++++++++++++++++++++++ +- backend/tests/test_lager.py | 55 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ + +--- +## 2026-09-06 09:41 – 09:41 (0m) +**Beschreibung:** Claude Code Session +**Projekt:** asb-material + +### Commits +Keine Commits in dieser Session. + +### Geänderte Dateien +- arbeitskacheln/07_warehouse.md | 17 ++++++++--------- +- arbeitskacheln/18_notifications.md | 15 ++++++++------- +- backend/app/api/v1/endpoints/lager.py | 41 ++++++++++++++++++++++++++++++++++++++++- +- backend/app/schemas/lager.py | 7 +++++++ +- backend/app/services/lager.py | 45 +++++++++++++++++++++++++++++++++++++++++++++ +- backend/tests/test_lager.py | 55 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ + +--- +## 2026-09-06 09:41 – 09:42 (1m) +**Beschreibung:** Claude Code Session +**Projekt:** asb-material + +### Commits +- 0126375 fix(mobile): MOBILE-002 Scan routet zur Akte statt zur Kontrolle + +### Geänderte Dateien +- arbeitskacheln/15_mobile.md | 6 ++---- +- frontend/src/pages/ObjektListPage.tsx | 9 +++++---- +- frontend/src/pages/admin/LagerSection.tsx | 47 ++++++++++++++++++++++++++++++++++++++++++++--- + +--- +## 2026-09-06 09:42 – 09:43 (0m) +**Beschreibung:** Claude Code Session +**Projekt:** asb-material + +### Commits +Keine Commits in dieser Session. + +### Geänderte Dateien +- arbeitskacheln/15_mobile.md | 6 ++---- +- frontend/src/pages/ObjektListPage.tsx | 9 +++++---- +- frontend/src/pages/admin/LagerSection.tsx | 47 ++++++++++++++++++++++++++++++++++++++++++++--- + +--- +## 2026-09-06 09:43 – 09:43 (0m) +**Beschreibung:** Claude Code Session +**Projekt:** asb-material + +### Commits +Keine Commits in dieser Session. + +### Geänderte Dateien +- arbeitskacheln/15_mobile.md | 6 ++---- +- frontend/src/pages/ObjektListPage.tsx | 9 +++++---- +- frontend/src/pages/admin/LagerSection.tsx | 47 ++++++++++++++++++++++++++++++++++++++++++++--- + +--- +## 2026-09-06 09:50 – 09:50 (0m) +**Beschreibung:** Claude Code Session +**Projekt:** asb-material + +### Commits +Keine Commits in dieser Session. + +### Geänderte Dateien +- arbeitskacheln/15_mobile.md | 6 ++---- +- frontend/src/pages/ObjektListPage.tsx | 9 +++++---- +- frontend/src/pages/admin/LagerSection.tsx | 47 ++++++++++++++++++++++++++++++++++++++++++++--- + +--- +## 2026-09-06 09:53 – 09:54 (1m) +**Beschreibung:** Claude Code Session +**Projekt:** asb-material + +### Commits +Keine Commits in dieser Session. + +### Geänderte Dateien +- arbeitskacheln/15_mobile.md | 6 ++---- +- frontend/src/pages/ObjektListPage.tsx | 9 +++++---- +- frontend/src/pages/admin/LagerSection.tsx | 47 ++++++++++++++++++++++++++++++++++++++++++++--- + +--- +## 2026-09-06 09:57 – 09:57 (0m) +**Beschreibung:** Claude Code Session +**Projekt:** frontend + +### Commits +- bccb8d1 feat(ui): UI-001 Designsystem-Grundlage - Dark Mode + Readiness-Farbtokens + +### Geänderte Dateien +- arbeitskacheln/00_index.md | 7 +++--- +- arbeitskacheln/20_ui_redesign.md | 173 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +- frontend/src/components/AppShell.tsx | 2 ++ +- frontend/src/components/ThemeToggle.tsx | 58 ++++++++++++++++++++++++++++++++++++++++++++++++ +- frontend/src/styles/global.css | 114 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + +--- +## 2026-09-06 09:57 – 09:58 (0m) +**Beschreibung:** Claude Code Session +**Projekt:** asb-material + +### Commits +Keine Commits in dieser Session. + +### Geänderte Dateien +- arbeitskacheln/00_index.md | 7 +++--- +- arbeitskacheln/20_ui_redesign.md | 173 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +- frontend/src/components/AppShell.tsx | 2 ++ +- frontend/src/components/ThemeToggle.tsx | 58 ++++++++++++++++++++++++++++++++++++++++++++++++ +- frontend/src/styles/global.css | 114 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + +--- +## 2026-09-06 09:58 – 09:58 (0m) +**Beschreibung:** Claude Code Session +**Projekt:** asb-material + +### Commits +Keine Commits in dieser Session. + +### Geänderte Dateien +- arbeitskacheln/00_index.md | 7 +++--- +- arbeitskacheln/20_ui_redesign.md | 173 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +- frontend/src/components/AppShell.tsx | 2 ++ +- frontend/src/components/ThemeToggle.tsx | 58 ++++++++++++++++++++++++++++++++++++++++++++++++ +- frontend/src/styles/global.css | 114 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + +--- +## 2026-09-06 13:06 – 13:09 (2m) +**Beschreibung:** Claude Code Session +**Projekt:** asb-material + +### Commits +Keine Commits in dieser Session. + +### Geänderte Dateien +- arbeitskacheln/00_index.md | 7 ++++--- +- arbeitskacheln/20_ui_redesign.md | 173 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +- frontend/src/components/AppShell.tsx | 2 ++ +- frontend/src/components/ThemeToggle.tsx | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +- frontend/src/styles/global.css | 114 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + +--- +## 2026-09-06 13:09 – 13:09 (0m) +**Beschreibung:** Claude Code Session +**Projekt:** asb-material + +### Commits +- 16a42c6 feat(ui): UI-002 Command Palette und Deep-Links statt Nav-Umbau + +### Geänderte Dateien +- arbeitskacheln/20_ui_redesign.md | 11 +++++- +- frontend/src/components/AppShell.tsx | 9 +++++ +- frontend/src/components/CommandPalette.tsx | 143 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +- frontend/src/pages/AdminPage.tsx | 10 +++++- +- frontend/src/pages/ObjektListPage.tsx | 13 ++++++- +- frontend/src/styles/global.css | 55 +++++++++++++++++++++++++++++ + +--- +## 2026-09-06 13:10 – 13:10 (0m) +**Beschreibung:** Claude Code Session +**Projekt:** asb-material + +### Commits +Keine Commits in dieser Session. + +### Geänderte Dateien +- arbeitskacheln/20_ui_redesign.md | 11 +++++- +- frontend/src/components/AppShell.tsx | 9 +++++ +- frontend/src/components/CommandPalette.tsx | 143 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +- frontend/src/pages/AdminPage.tsx | 10 +++++- +- frontend/src/pages/ObjektListPage.tsx | 13 ++++++- +- frontend/src/styles/global.css | 55 +++++++++++++++++++++++++++++ + +--- +## 2026-09-06 13:12 – 13:12 (0m) +**Beschreibung:** Claude Code Session +**Projekt:** asb-material + +### Commits +Keine Commits in dieser Session. + +### Geänderte Dateien +- arbeitskacheln/20_ui_redesign.md | 11 +++++- +- frontend/src/components/AppShell.tsx | 9 +++++ +- frontend/src/components/CommandPalette.tsx | 143 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +- frontend/src/pages/AdminPage.tsx | 10 +++++- +- frontend/src/pages/ObjektListPage.tsx | 13 ++++++- +- frontend/src/styles/global.css | 55 +++++++++++++++++++++++++++++ + +--- +## 2026-09-06 13:12 – 13:16 (3m) +**Beschreibung:** Claude Code Session +**Projekt:** asb-material + +### Commits +Keine Commits in dieser Session. + +### Geänderte Dateien +- arbeitskacheln/20_ui_redesign.md | 11 +++++- +- frontend/src/components/AppShell.tsx | 9 +++++ +- frontend/src/components/CommandPalette.tsx | 143 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +- frontend/src/pages/AdminPage.tsx | 10 +++++- +- frontend/src/pages/ObjektListPage.tsx | 13 ++++++- +- frontend/src/styles/global.css | 55 +++++++++++++++++++++++++++++ + +--- +## 2026-09-06 13:19 – 13:19 (0m) +**Beschreibung:** Claude Code Session +**Projekt:** asb-material + +### Commits +- b6ada2b feat(inventory): INV-007 Ausgabe/Rückgabe von Material und Leihgeräten + +### Geänderte Dateien +- arbeitskacheln/06_inventory.md | 20 ++++++--- +- backend/alembic/versions/0021_ausgabe.py | 41 +++++++++++++++++ +- backend/app/api/v1/api.py | 2 + +- backend/app/api/v1/endpoints/ausgabe.py | 63 ++++++++++++++++++++++++++ +- backend/app/models/__init__.py | 3 ++ +- backend/app/models/ausgabe.py | 41 +++++++++++++++++ +- backend/app/schemas/ausgabe.py | 29 ++++++++++++ +- backend/app/services/ausgabe.py | 45 +++++++++++++++++++ +- backend/tests/test_ausgabe.py | 53 ++++++++++++++++++++++ +- frontend/src/api/types.ts | 13 ++++++ +- frontend/src/components/CommandPalette.tsx | 1 + +- frontend/src/pages/AdminPage.tsx | 10 +++++ +- frontend/src/pages/admin/AusgabeSection.tsx | 181 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + +--- +## 2026-09-06 13:19 – 13:21 (2m) +**Beschreibung:** Claude Code Session +**Projekt:** asb-material + +### Commits +Keine Commits in dieser Session. + +### Geänderte Dateien +- arbeitskacheln/06_inventory.md | 20 ++++++--- +- backend/alembic/versions/0021_ausgabe.py | 41 +++++++++++++++++ +- backend/app/api/v1/api.py | 2 + +- backend/app/api/v1/endpoints/ausgabe.py | 63 ++++++++++++++++++++++++++ +- backend/app/models/__init__.py | 3 ++ +- backend/app/models/ausgabe.py | 41 +++++++++++++++++ +- backend/app/schemas/ausgabe.py | 29 ++++++++++++ +- backend/app/services/ausgabe.py | 45 +++++++++++++++++++ +- backend/tests/test_ausgabe.py | 53 ++++++++++++++++++++++ +- frontend/src/api/types.ts | 13 ++++++ +- frontend/src/components/CommandPalette.tsx | 1 + +- frontend/src/pages/AdminPage.tsx | 10 +++++ +- frontend/src/pages/admin/AusgabeSection.tsx | 181 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + +--- +## 2026-09-06 13:21 – 13:25 (3m) +**Beschreibung:** Claude Code Session +**Projekt:** asb-material + +### Commits +Keine Commits in dieser Session. + +### Geänderte Dateien +- arbeitskacheln/06_inventory.md | 20 ++++++--- +- backend/alembic/versions/0021_ausgabe.py | 41 +++++++++++++++++ +- backend/app/api/v1/api.py | 2 + +- backend/app/api/v1/endpoints/ausgabe.py | 63 ++++++++++++++++++++++++++ +- backend/app/models/__init__.py | 3 ++ +- backend/app/models/ausgabe.py | 41 +++++++++++++++++ +- backend/app/schemas/ausgabe.py | 29 ++++++++++++ +- backend/app/services/ausgabe.py | 45 +++++++++++++++++++ +- backend/tests/test_ausgabe.py | 53 ++++++++++++++++++++++ +- frontend/src/api/types.ts | 13 ++++++ +- frontend/src/components/CommandPalette.tsx | 1 + +- frontend/src/pages/AdminPage.tsx | 10 +++++ +- frontend/src/pages/admin/AusgabeSection.tsx | 181 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + +--- +## 2026-09-06 13:30 – 13:30 (0m) +**Beschreibung:** Claude Code Session +**Projekt:** asb-material + +### Commits +Keine Commits in dieser Session. + +### Geänderte Dateien +- arbeitskacheln/06_inventory.md | 20 ++++++--- +- backend/alembic/versions/0021_ausgabe.py | 41 +++++++++++++++++ +- backend/app/api/v1/api.py | 2 + +- backend/app/api/v1/endpoints/ausgabe.py | 63 ++++++++++++++++++++++++++ +- backend/app/models/__init__.py | 3 ++ +- backend/app/models/ausgabe.py | 41 +++++++++++++++++ +- backend/app/schemas/ausgabe.py | 29 ++++++++++++ +- backend/app/services/ausgabe.py | 45 +++++++++++++++++++ +- backend/tests/test_ausgabe.py | 53 ++++++++++++++++++++++ +- frontend/src/api/types.ts | 13 ++++++ +- frontend/src/components/CommandPalette.tsx | 1 + +- frontend/src/pages/AdminPage.tsx | 10 +++++ +- frontend/src/pages/admin/AusgabeSection.tsx | 181 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + +--- +## 2026-09-06 13:32 – 13:33 (0m) +**Beschreibung:** Claude Code Session +**Projekt:** frontend + +### Commits +- ed9ba29 feat(ui): UI-004 Dashboard "Was ist jetzt zu tun?"-Karte + +### Geänderte Dateien +- arbeitskacheln/20_ui_redesign.md | 11 ++++++++++- +- frontend/src/pages/DashboardPage.tsx | 41 +++++++++++++++++++++++++++++++++++++++++ +- frontend/src/styles/global.css | 8 ++++++++ + +--- +## 2026-09-06 13:35 – 13:36 (1m) +**Beschreibung:** Claude Code Session +**Projekt:** asb-material + +### Commits +Keine Commits in dieser Session. + +### Geänderte Dateien +- arbeitskacheln/20_ui_redesign.md | 11 ++++++++++- +- frontend/src/pages/DashboardPage.tsx | 41 +++++++++++++++++++++++++++++++++++++++++ +- frontend/src/styles/global.css | 8 ++++++++ + +--- +## 2026-09-06 13:36 – 13:37 (0m) +**Beschreibung:** Claude Code Session +**Projekt:** asb-material + +### Commits +- 21ea63a feat(ui): Dashboard als Startseite für Verantwortliche + einstellbar + +### Geänderte Dateien +- frontend/src/App.tsx | 10 +++++++++- +- frontend/src/components/AppShell.tsx | 2 ++ +- frontend/src/components/StartseiteAuswahl.tsx | 29 +++++++++++++++++++++++++++++ +- frontend/src/pages/LoginPage.tsx | 3 ++- +- frontend/src/settings/startseite.ts | 30 ++++++++++++++++++++++++++++++ + +--- +## 2026-09-06 13:38 – 13:38 (0m) +**Beschreibung:** Claude Code Session +**Projekt:** asb-material + +### Commits +Keine Commits in dieser Session. + +### Geänderte Dateien +- frontend/src/App.tsx | 10 +++++++++- +- frontend/src/components/AppShell.tsx | 2 ++ +- frontend/src/components/StartseiteAuswahl.tsx | 29 +++++++++++++++++++++++++++++ +- frontend/src/pages/LoginPage.tsx | 3 ++- +- frontend/src/settings/startseite.ts | 30 ++++++++++++++++++++++++++++++ + +--- +## 2026-09-06 13:38 – 13:39 (0m) +**Beschreibung:** Claude Code Session +**Projekt:** asb-material + +### Commits +Keine Commits in dieser Session. + +### Geänderte Dateien +- frontend/src/App.tsx | 10 +++++++++- +- frontend/src/components/AppShell.tsx | 2 ++ +- frontend/src/components/StartseiteAuswahl.tsx | 29 +++++++++++++++++++++++++++++ +- frontend/src/pages/LoginPage.tsx | 3 ++- +- frontend/src/settings/startseite.ts | 30 ++++++++++++++++++++++++++++++ + +--- +## 2026-09-06 13:39 – 13:39 (0m) +**Beschreibung:** Claude Code Session +**Projekt:** asb-material + +### Commits +- 0132bb9 docs: Benutzerhandbuch mit Funktionsübersicht und Tastenkombinationen + +### Geänderte Dateien +- docs/BENUTZERHANDBUCH.md | 103 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + +--- +## 2026-09-06 13:39 – 13:39 (0m) +**Beschreibung:** Claude Code Session +**Projekt:** asb-material + +### Commits +Keine Commits in dieser Session. + +### Geänderte Dateien +- docs/BENUTZERHANDBUCH.md | 103 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + +--- +## 2026-09-06 21:35 – 21:35 (0m) +**Beschreibung:** Claude Code Session +**Projekt:** frontend + +### Commits +- 209b541 feat(ui): UI-005 begründete Einsatzbereitschaft + Dokumente in der Akte + +### Geänderte Dateien +- arbeitskacheln/20_ui_redesign.md | 15 ++++++- +- backend/app/schemas/akte.py | 2 + +- backend/app/services/akte.py | 5 +++ +- backend/app/services/dashboard.py | 175 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++------------ +- backend/tests/test_akte.py | 15 +++++++ +- frontend/src/api/client.ts | 18 ++++++++ +- frontend/src/api/types.ts | 2 + +- frontend/src/components/DokumentePanel.tsx | 26 ++++++++--- +- frontend/src/components/status/gruendeText.ts | 13 ++++++ +- frontend/src/pages/AktePage.tsx | 27 ++++++----- +- frontend/src/pages/DashboardPage.tsx | 13 +----- + +--- +## 2026-09-06 21:36 – 21:36 (0m) +**Beschreibung:** Claude Code Session +**Projekt:** asb-material + +### Commits +Keine Commits in dieser Session. + +### Geänderte Dateien +- arbeitskacheln/20_ui_redesign.md | 15 ++++++- +- backend/app/schemas/akte.py | 2 + +- backend/app/services/akte.py | 5 +++ +- backend/app/services/dashboard.py | 175 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++------------ +- backend/tests/test_akte.py | 15 +++++++ +- frontend/src/api/client.ts | 18 ++++++++ +- frontend/src/api/types.ts | 2 + +- frontend/src/components/DokumentePanel.tsx | 26 ++++++++--- +- frontend/src/components/status/gruendeText.ts | 13 ++++++ +- frontend/src/pages/AktePage.tsx | 27 ++++++----- +- frontend/src/pages/DashboardPage.tsx | 13 +----- + +--- +## 2026-09-06 21:37 – 21:37 (0m) +**Beschreibung:** Claude Code Session +**Projekt:** asb-material + +### Commits +Keine Commits in dieser Session. + +### Geänderte Dateien +- arbeitskacheln/20_ui_redesign.md | 15 ++++++- +- backend/app/schemas/akte.py | 2 + +- backend/app/services/akte.py | 5 +++ +- backend/app/services/dashboard.py | 175 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++------------ +- backend/tests/test_akte.py | 15 +++++++ +- frontend/src/api/client.ts | 18 ++++++++ +- frontend/src/api/types.ts | 2 + +- frontend/src/components/DokumentePanel.tsx | 26 ++++++++--- +- frontend/src/components/status/gruendeText.ts | 13 ++++++ +- frontend/src/pages/AktePage.tsx | 27 ++++++----- +- frontend/src/pages/DashboardPage.tsx | 13 +----- + +--- +## 2026-09-06 21:39 – 21:39 (0m) +**Beschreibung:** Claude Code Session +**Projekt:** frontend + +### Commits +- fbc3b22 feat(ui): UI-006 Abweichungen in der Kontrolle dauerhaft hervorheben + +### Geänderte Dateien +- arbeitskacheln/20_ui_redesign.md | 9 ++++++++- +- frontend/src/pages/KontrollPage.tsx | 4 ++-- +- frontend/src/pages/kontrolle/PositionCard.tsx | 16 +++++++++++++--- + +--- +## 2026-09-06 21:41 – 21:42 (0m) +**Beschreibung:** Claude Code Session +**Projekt:** frontend + +### Commits +- 30e2db6 feat(ui): UI-007 Aktionsleiste auf der Objektakte + +### Geänderte Dateien +- arbeitskacheln/20_ui_redesign.md | 8 +++++++- +- frontend/src/pages/AktePage.tsx | 17 +++++++++++------ +- frontend/src/pages/MangelListePage.tsx | 9 ++++++++- + +--- +## 2026-09-06 21:44 – 21:46 (1m) +**Beschreibung:** Claude Code Session +**Projekt:** frontend + +### Commits +- 9a3eb7d feat(ui): UI-008 echte Status-Badges statt badge-neutral, Epic 20 komplett + +### Geänderte Dateien +- arbeitskacheln/00_index.md | 2 +- +- arbeitskacheln/20_ui_redesign.md | 9 ++++++++- +- frontend/src/pages/FehlbestandListePage.tsx | 12 +++++++++++- +- frontend/src/pages/MangelListePage.tsx | 13 +++++++++++-- +- frontend/src/pages/admin/BeladungsplanerBoard.tsx | 4 ++-- +- frontend/src/pages/admin/GeraeteInstanzenListe.tsx | 9 ++++++++- +- frontend/src/pages/kontrolle/NachfuellDialog.tsx | 2 +- + +--- +## 2026-09-06 22:03 – 22:04 (0m) +**Beschreibung:** Claude Code Session +**Projekt:** frontend + +### Commits +- 9281840 feat(ui): globaler Aktivitäts-Feed auf dem Dashboard + +### Geänderte Dateien +- arbeitskacheln/20_ui_redesign.md | 4 ++++ +- frontend/src/components/status/ereignisText.ts | 21 +++++++++++++++++++++ +- frontend/src/pages/AktePage.tsx | 3 ++- +- frontend/src/pages/DashboardPage.tsx | 33 +++++++++++++++++++++++++++++++-- + +--- +## 2026-09-06 22:04 – 22:04 (0m) +**Beschreibung:** Claude Code Session +**Projekt:** asb-material + +### Commits +Keine Commits in dieser Session. + +### Geänderte Dateien +- arbeitskacheln/20_ui_redesign.md | 4 ++++ +- frontend/src/components/status/ereignisText.ts | 21 +++++++++++++++++++++ +- frontend/src/pages/AktePage.tsx | 3 ++- +- frontend/src/pages/DashboardPage.tsx | 33 +++++++++++++++++++++++++++++++-- + +--- +## 2026-09-06 22:18 – 22:22 (3m) +**Beschreibung:** Claude Code Session +**Projekt:** asb-material + +### Commits +Keine Commits in dieser Session. + +### Geänderte Dateien +- arbeitskacheln/20_ui_redesign.md | 4 ++++ +- frontend/src/components/status/ereignisText.ts | 21 +++++++++++++++++++++ +- frontend/src/pages/AktePage.tsx | 3 ++- +- frontend/src/pages/DashboardPage.tsx | 33 +++++++++++++++++++++++++++++++-- + +--- +## 2026-09-06 22:26 – 22:28 (1m) +**Beschreibung:** Claude Code Session +**Projekt:** backend + +### Commits +- 9721873 fix(kontrolle): doppelten Fehlbestand bei Folge-Kontrolle vermieden + +### Geänderte Dateien +- backend/app/services/dashboard.py | 17 ++++++----------- +- backend/app/services/kontrolle/erfassung.py | 50 ++++++++++++++++++++++++++++++++++++++++++-------- +- backend/tests/test_dashboard.py | 3 --- +- backend/tests/test_kontrolle.py | 67 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +- frontend/src/api/client.ts | 2 +- +- frontend/src/components/CommandPalette.tsx | 2 +- +- frontend/src/components/ThemeToggle.tsx | 2 +- +- frontend/src/components/status/FristBadge.tsx | 2 +- +- frontend/src/components/status/InspectionStatus.tsx | 2 +- +- frontend/src/components/status/InventoryStatus.tsx | 2 +- +- frontend/src/components/status/ReadinessBadge.tsx | 2 +- +- frontend/src/components/status/SyncStatus.tsx | 2 +- +- frontend/src/pages/AdminPage.tsx | 2 +- +- frontend/src/pages/AktePage.tsx | 2 +- +- frontend/src/pages/DashboardPage.tsx | 4 ---- +- frontend/src/pages/FehlbestandListePage.tsx | 2 +- +- frontend/src/pages/MangelListePage.tsx | 4 ++-- +- frontend/src/pages/ObjektListPage.tsx | 8 +++----- +- frontend/src/pages/admin/GeraeteInstanzenListe.tsx | 2 +- +- frontend/src/pages/kontrolle/PositionCard.tsx | 2 +- + +--- +## 2026-09-06 22:50 – 22:51 (0m) +**Beschreibung:** Claude Code Session +**Projekt:** frontend + +### Commits +- d607a11 fix(ui): Prüftermine/Ablaufdaten verlinken, Prüfung direkt aus der Akte erfassbar + +### Geänderte Dateien +- frontend/src/pages/AktePage.tsx | 37 ++++++++++++++++++++++++++++++------- +- frontend/src/pages/DashboardPage.tsx | 6 ++++-- + +--- +## 2026-09-06 22:50 – 22:51 (0m) +**Beschreibung:** Claude Code Session +**Projekt:** frontend + +### Commits +- d607a11 fix(ui): Prüftermine/Ablaufdaten verlinken, Prüfung direkt aus der Akte erfassbar + +### Geänderte Dateien +- frontend/src/pages/AktePage.tsx | 37 ++++++++++++++++++++++++++++++------- +- frontend/src/pages/DashboardPage.tsx | 6 ++++-- + +--- +## 2026-09-06 22:53 – 22:53 (0m) +**Beschreibung:** Claude Code Session +**Projekt:** asb-material + +### Commits +Keine Commits in dieser Session. + +### Geänderte Dateien +- frontend/src/pages/AktePage.tsx | 37 ++++++++++++++++++++++++++++++------- +- frontend/src/pages/DashboardPage.tsx | 6 ++++-- + +--- +## 2026-09-06 23:10 – 23:16 (5m) +**Beschreibung:** Claude Code Session +**Projekt:** backend + +### Commits +Keine Commits in dieser Session. + +### Geänderte Dateien +- frontend/src/pages/AktePage.tsx | 37 ++++++++++++++++++++++++++++++------- +- frontend/src/pages/DashboardPage.tsx | 6 ++++-- + +--- +## 2026-09-06 23:17 – 23:18 (1m) +**Beschreibung:** Claude Code Session +**Projekt:** asb-material + +### Commits +- 2a4d391 feat(maintenance): MAINT-Epic (Wartungspläne/-aufträge, Werkstatt) + Akte-Redesign + +### Geänderte Dateien +- arbeitskacheln/10_maintenance.md | 40 ++++++++----- +- arbeitskacheln/21_akte_redesign.md | 39 +++++++++++++ +- backend/alembic/versions/0022_wartung.py | 82 ++++++++++++++++++++++++++ +- backend/app/api/v1/api.py | 2 + +- backend/app/api/v1/endpoints/wartung.py | 153 +++++++++++++++++++++++++++++++++++++++++++++++++ +- backend/app/models/__init__.py | 14 +++++ +- backend/app/models/wartung.py | 80 ++++++++++++++++++++++++++ +- backend/app/schemas/akte.py | 13 +++++ +- backend/app/schemas/dokument.py | 2 +- +- backend/app/schemas/wartung.py | 101 ++++++++++++++++++++++++++++++++ +- backend/app/services/akte.py | 33 ++++++++++- +- backend/app/services/datumshilfen.py | 10 ++++ +- backend/app/services/geraet_instanz.py | 13 +---- +- backend/app/services/wartung.py | 216 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +- backend/tests/test_akte.py | 4 ++ +- backend/tests/test_wartung.py | 214 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +- frontend/src/api/types.ts | 62 ++++++++++++++++++++ +- frontend/src/components/CommandPalette.tsx | 1 + +- frontend/src/components/WartungSection.tsx | 191 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +- frontend/src/pages/AdminPage.tsx | 10 ++++ +- frontend/src/pages/AktePage.tsx | 63 +++++++++++++++----- +- frontend/src/pages/admin/WartungsplanSection.tsx | 153 +++++++++++++++++++++++++++++++++++++++++++++++++ +- frontend/src/styles/global.css | 53 +++++++++++++++++ + +--- +## 2026-09-06 23:18 – 23:19 (0m) +**Beschreibung:** Claude Code Session +**Projekt:** asb-material + +### Commits +Keine Commits in dieser Session. + +### Geänderte Dateien +- arbeitskacheln/10_maintenance.md | 40 ++++++++----- +- arbeitskacheln/21_akte_redesign.md | 39 +++++++++++++ +- backend/alembic/versions/0022_wartung.py | 82 ++++++++++++++++++++++++++ +- backend/app/api/v1/api.py | 2 + +- backend/app/api/v1/endpoints/wartung.py | 153 +++++++++++++++++++++++++++++++++++++++++++++++++ +- backend/app/models/__init__.py | 14 +++++ +- backend/app/models/wartung.py | 80 ++++++++++++++++++++++++++ +- backend/app/schemas/akte.py | 13 +++++ +- backend/app/schemas/dokument.py | 2 +- +- backend/app/schemas/wartung.py | 101 ++++++++++++++++++++++++++++++++ +- backend/app/services/akte.py | 33 ++++++++++- +- backend/app/services/datumshilfen.py | 10 ++++ +- backend/app/services/geraet_instanz.py | 13 +---- +- backend/app/services/wartung.py | 216 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +- backend/tests/test_akte.py | 4 ++ +- backend/tests/test_wartung.py | 214 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +- frontend/src/api/types.ts | 62 ++++++++++++++++++++ +- frontend/src/components/CommandPalette.tsx | 1 + +- frontend/src/components/WartungSection.tsx | 191 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +- frontend/src/pages/AdminPage.tsx | 10 ++++ +- frontend/src/pages/AktePage.tsx | 63 +++++++++++++++----- +- frontend/src/pages/admin/WartungsplanSection.tsx | 153 +++++++++++++++++++++++++++++++++++++++++++++++++ +- frontend/src/styles/global.css | 53 +++++++++++++++++ + +--- +## 2026-09-06 23:24 – 23:24 (0m) +**Beschreibung:** Claude Code Session +**Projekt:** frontend + +### Commits +- a12dfb3 fix(ui): Akte-Header und Gründe-Liste überlappten sich + +### Geänderte Dateien +- frontend/src/pages/AktePage.tsx | 32 +++++++++++++++++--------------- + +--- +## 2026-09-06 23:31 – 23:31 (0m) +**Beschreibung:** Claude Code Session +**Projekt:** backend + +### Commits +- 300b30e fix(akte): Beladung zeigt bei Geräten mit SN falsche Ist-Menge + +### Geänderte Dateien +- backend/app/services/akte.py | 17 ++++++++++++++--- +- backend/tests/test_akte.py | 63 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + +--- +## 2026-09-06 23:38 – 23:38 (0m) +**Beschreibung:** Claude Code Session +**Projekt:** backend + +### Commits +- a18ec5b fix(kontrolle): Kontrolle bucht Ist-Menge jetzt immer, nicht nur bei Abweichung + +### Geänderte Dateien +- backend/app/services/kontrolle/erfassung.py | 14 +++++++++----- +- backend/tests/test_kontrolle.py | 4 +--- +- backend/tests/test_mindermenge.py | 3 ++- + +--- +## 2026-09-06 23:45 – 23:46 (0m) +**Beschreibung:** Claude Code Session +**Projekt:** asb-material + +### Commits +Keine Commits in dieser Session. + +### Geänderte Dateien +- backend/app/services/kontrolle/erfassung.py | 14 +++++++++----- +- backend/tests/test_kontrolle.py | 4 +--- +- backend/tests/test_mindermenge.py | 3 ++- + +--- +## 2026-09-06 23:48 – 23:49 (0m) +**Beschreibung:** Claude Code Session +**Projekt:** frontend + +### Commits +- cc016f0 feat(akte): Ablaufdatum in der Beladung-Tabelle + +### Geänderte Dateien +- backend/app/schemas/akte.py | 3 ++- +- backend/app/services/akte.py | 1 + +- backend/tests/test_akte.py | 1 + +- frontend/src/api/types.ts | 1 + +- frontend/src/pages/AktePage.tsx | 11 +++++++++++ + +--- +## 2026-09-06 23:50 – 23:50 (0m) +**Beschreibung:** Claude Code Session +**Projekt:** asb-material + +### Commits +Keine Commits in dieser Session. + +### Geänderte Dateien +- backend/app/schemas/akte.py | 3 ++- +- backend/app/services/akte.py | 1 + +- backend/tests/test_akte.py | 1 + +- frontend/src/api/types.ts | 1 + +- frontend/src/pages/AktePage.tsx | 11 +++++++++++ + +--- +## 2026-09-06 23:52 – 23:53 (1m) +**Beschreibung:** Claude Code Session +**Projekt:** asb-material + +### Commits +Keine Commits in dieser Session. + +### Geänderte Dateien +- backend/app/schemas/akte.py | 3 ++- +- backend/app/services/akte.py | 1 + +- backend/tests/test_akte.py | 1 + +- frontend/src/api/types.ts | 1 + +- frontend/src/pages/AktePage.tsx | 11 +++++++++++ + +--- +## 2026-09-06 23:55 – 23:55 (0m) +**Beschreibung:** Claude Code Session +**Projekt:** asb-material + +### Commits +Keine Commits in dieser Session. + +### Geänderte Dateien +- backend/app/schemas/akte.py | 3 ++- +- backend/app/services/akte.py | 1 + +- backend/tests/test_akte.py | 1 + +- frontend/src/api/types.ts | 1 + +- frontend/src/pages/AktePage.tsx | 11 +++++++++++ + +--- +## 2026-09-06 23:58 – 23:58 (0m) +**Beschreibung:** Claude Code Session +**Projekt:** asb-material + +### Commits +Keine Commits in dieser Session. + +### Geänderte Dateien +- backend/app/schemas/akte.py | 3 ++- +- backend/app/services/akte.py | 1 + +- backend/tests/test_akte.py | 1 + +- frontend/src/api/types.ts | 1 + +- frontend/src/pages/AktePage.tsx | 11 +++++++++++ + +--- +## 2026-09-06 23:59 – 23:59 (0m) +**Beschreibung:** Claude Code Session +**Projekt:** asb-material + +### Commits +Keine Commits in dieser Session. + +### Geänderte Dateien +- backend/app/schemas/akte.py | 3 ++- +- backend/app/services/akte.py | 1 + +- backend/tests/test_akte.py | 1 + +- frontend/src/api/types.ts | 1 + +- frontend/src/pages/AktePage.tsx | 11 +++++++++++ + +--- +## 2026-09-07 00:06 – 00:07 (0m) +**Beschreibung:** Claude Code Session +**Projekt:** backend + +### Commits +- 85ca441 fix(vorlagen): fehlendes Fach wird beim Anlegen einer Vorlage automatisch ergänzt + +### Geänderte Dateien +- backend/app/services/vorlagen.py | 21 +++++++++++++++++++++ +- backend/tests/test_vorlagen.py | 22 ++++++++++++++++++++++ + +--- +## 2026-09-07 00:09 – 00:10 (0m) +**Beschreibung:** Claude Code Session +**Projekt:** frontend + +### Commits +- 8e89755 feat(ui): Fächer-Liste nach Objekttyp filterbar + +### Geänderte Dateien +- frontend/src/pages/admin/FachSection.tsx | 12 +++++++++--- + +--- +## 2026-09-07 00:11 – 00:11 (0m) +**Beschreibung:** Claude Code Session +**Projekt:** asb-material + +### Commits +Keine Commits in dieser Session. + +### Geänderte Dateien +- frontend/src/pages/admin/FachSection.tsx | 12 +++++++++--- + +--- +## 2026-09-07 00:17 – 00:19 (1m) +**Beschreibung:** Claude Code Session +**Projekt:** frontend + +### Commits +- 5f568c3 feat(fach): Duplikate case-insensitiv verhindern, Verwendung anzeigen und ersetzen/zusammenführen + +### Geänderte Dateien +- backend/app/api/v1/endpoints/stammdaten.py | 86 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++- +- backend/app/schemas/stammdaten.py | 10 ++++++++ +- backend/app/services/vorlagen.py | 7 +++--- +- backend/tests/test_stammdaten.py | 102 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +- frontend/src/pages/admin/FachSection.tsx | 92 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-------- + +--- +## 2026-09-07 00:23 – 00:24 (0m) +**Beschreibung:** Claude Code Session +**Projekt:** frontend + +### Commits +- 06baf03 feat(material): Material-Dubletten zusammenführen + +### Geänderte Dateien +- backend/app/api/v1/endpoints/stammdaten.py | 44 +++++++++++++++++++++++++++ +- backend/app/schemas/stammdaten.py | 9 ++++++ +- backend/app/services/material_merge.py | 63 +++++++++++++++++++++++++++++++++++++++ +- backend/tests/test_stammdaten.py | 84 +++++++++++++++++++++++++++++++++++++++++++++++++++ +- frontend/src/pages/admin/MaterialSection.tsx | 119 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-------- + +--- +## 2026-09-07 00:24 – 00:24 (0m) +**Beschreibung:** Claude Code Session +**Projekt:** asb-material + +### Commits +Keine Commits in dieser Session. + +### Geänderte Dateien +- backend/app/api/v1/endpoints/stammdaten.py | 44 +++++++++++++++++++++++++++ +- backend/app/schemas/stammdaten.py | 9 ++++++ +- backend/app/services/material_merge.py | 63 +++++++++++++++++++++++++++++++++++++++ +- backend/tests/test_stammdaten.py | 84 +++++++++++++++++++++++++++++++++++++++++++++++++++ +- frontend/src/pages/admin/MaterialSection.tsx | 119 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-------- + +--- +## 2026-09-07 00:27 – 00:27 (0m) +**Beschreibung:** Claude Code Session +**Projekt:** frontend + +### Commits +- 456fc29 fix(dashboard): Ablaufdaten zeigen Namen statt roher IDs + +### Geänderte Dateien +- backend/app/schemas/dashboard.py | 2 ++ +- backend/app/services/dashboard.py | 7 +++++-- +- frontend/src/pages/DashboardPage.tsx | 4 +++- + +--- +## 2026-09-07 00:31 – 00:31 (0m) +**Beschreibung:** Claude Code Session +**Projekt:** asb-material + +### Commits +Keine Commits in dieser Session. + +### Geänderte Dateien +- backend/app/schemas/dashboard.py | 2 ++ +- backend/app/services/dashboard.py | 7 +++++-- +- frontend/src/pages/DashboardPage.tsx | 4 +++- + +--- +## 2026-09-07 00:32 – 00:32 (0m) +**Beschreibung:** Claude Code Session +**Projekt:** asb-material + +### Commits +Keine Commits in dieser Session. + +### Geänderte Dateien +- backend/app/schemas/dashboard.py | 2 ++ +- backend/app/services/dashboard.py | 7 +++++-- +- frontend/src/pages/DashboardPage.tsx | 4 +++- + +--- +## 2026-09-07 00:36 – 00:36 (0m) +**Beschreibung:** Claude Code Session +**Projekt:** frontend + +### Commits +- 1c2f2d3 refactor(admin): Objekte-Verwaltung entschlackt, Akte statt Redundanz + +### Geänderte Dateien +- frontend/src/pages/admin/ObjektAnlegenFormular.tsx | 145 ++++++++++++++++++ +- frontend/src/pages/admin/ObjektSection.tsx | 559 ++++++++++++++++++------------------------------------------------- + +--- +## 2026-09-07 00:39 – 00:39 (0m) +**Beschreibung:** Claude Code Session +**Projekt:** asb-material + +### Commits +Keine Commits in dieser Session. + +### Geänderte Dateien +- frontend/src/pages/admin/ObjektAnlegenFormular.tsx | 145 ++++++++++++++++++ +- frontend/src/pages/admin/ObjektSection.tsx | 559 ++++++++++++++++++------------------------------------------------- + +--- +## 2026-09-07 00:49 – 00:51 (1m) +**Beschreibung:** Claude Code Session +**Projekt:** asb-material + +### Commits +- 9b2701e feat(kontrolle): Ablaufdatum als nur Monat/Jahr erfassbar + +### Geänderte Dateien +- frontend/src/pages/kontrolle/PositionCard.tsx | 48 ++++++++++++++++++++++++++++++++++-------------- + +--- +## 2026-09-07 00:52 – 00:52 (0m) +**Beschreibung:** Claude Code Session +**Projekt:** asb-material + +### Commits +Keine Commits in dieser Session. + +### Geänderte Dateien +- frontend/src/pages/kontrolle/PositionCard.tsx | 48 ++++++++++++++++++++++++++++++++++-------------- + +--- +## 2026-09-07 00:52 – 00:52 (0m) +**Beschreibung:** Claude Code Session +**Projekt:** asb-material + +### Commits +Keine Commits in dieser Session. + +### Geänderte Dateien +- frontend/src/pages/kontrolle/PositionCard.tsx | 48 ++++++++++++++++++++++++++++++++++-------------- + +--- +## 2026-09-07 11:56 – 11:57 (0m) +**Beschreibung:** Claude Code Session +**Projekt:** frontend + +### Commits +Keine Commits in dieser Session. + +### Geänderte Dateien +- frontend/src/pages/kontrolle/PositionCard.tsx | 48 ++++++++++++++++++++++++++++++++++-------------- + +--- +## 2026-09-07 11:57 – 11:57 (0m) +**Beschreibung:** Claude Code Session +**Projekt:** asb-material + +### Commits +Keine Commits in dieser Session. + +### Geänderte Dateien +- frontend/src/pages/kontrolle/PositionCard.tsx | 48 ++++++++++++++++++++++++++++++++++-------------- + +--- diff --git a/backend/DEVLOG.md b/backend/DEVLOG.md index 8653330..429cf56 100644 --- a/backend/DEVLOG.md +++ b/backend/DEVLOG.md @@ -260,3 +260,131 @@ Keine Commits in dieser Session. - frontend/src/pages/admin/ObjektSection.tsx | 94 ++++++++++++++++++++------------------ --- +## 2026-09-06 21:46 – 21:49 (3m) +**Beschreibung:** Claude Code Session +**Projekt:** asb-material + +### Commits +Keine Commits in dieser Session. + +### Geänderte Dateien +- arbeitskacheln/00_index.md | 2 +- +- arbeitskacheln/20_ui_redesign.md | 9 ++++++++- +- frontend/src/pages/FehlbestandListePage.tsx | 12 +++++++++++- +- frontend/src/pages/MangelListePage.tsx | 13 +++++++++++-- +- frontend/src/pages/admin/BeladungsplanerBoard.tsx | 4 ++-- +- frontend/src/pages/admin/GeraeteInstanzenListe.tsx | 9 ++++++++- +- frontend/src/pages/kontrolle/NachfuellDialog.tsx | 2 +- + +--- +## 2026-09-06 21:58 – 21:59 (1m) +**Beschreibung:** Claude Code Session +**Projekt:** backend + +### Commits +Keine Commits in dieser Session. + +### Geänderte Dateien +- arbeitskacheln/00_index.md | 2 +- +- arbeitskacheln/20_ui_redesign.md | 9 ++++++++- +- frontend/src/pages/FehlbestandListePage.tsx | 12 +++++++++++- +- frontend/src/pages/MangelListePage.tsx | 13 +++++++++++-- +- frontend/src/pages/admin/BeladungsplanerBoard.tsx | 4 ++-- +- frontend/src/pages/admin/GeraeteInstanzenListe.tsx | 9 ++++++++- +- frontend/src/pages/kontrolle/NachfuellDialog.tsx | 2 +- + +--- +## 2026-09-06 22:23 – 22:26 (2m) +**Beschreibung:** Claude Code Session +**Projekt:** asb-material + +### Commits +Keine Commits in dieser Session. + +### Geänderte Dateien +- arbeitskacheln/20_ui_redesign.md | 4 ++++ +- frontend/src/components/status/ereignisText.ts | 21 +++++++++++++++++++++ +- frontend/src/pages/AktePage.tsx | 3 ++- +- frontend/src/pages/DashboardPage.tsx | 33 +++++++++++++++++++++++++++++++-- + +--- +## 2026-09-06 22:41 – 22:43 (2m) +**Beschreibung:** Claude Code Session +**Projekt:** asb-material + +### Commits +Keine Commits in dieser Session. + +### Geänderte Dateien +- backend/app/services/dashboard.py | 17 ++++++----------- +- backend/app/services/kontrolle/erfassung.py | 50 ++++++++++++++++++++++++++++++++++++++++++-------- +- backend/tests/test_dashboard.py | 3 --- +- backend/tests/test_kontrolle.py | 67 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +- frontend/src/api/client.ts | 2 +- +- frontend/src/components/CommandPalette.tsx | 2 +- +- frontend/src/components/ThemeToggle.tsx | 2 +- +- frontend/src/components/status/FristBadge.tsx | 2 +- +- frontend/src/components/status/InspectionStatus.tsx | 2 +- +- frontend/src/components/status/InventoryStatus.tsx | 2 +- +- frontend/src/components/status/ReadinessBadge.tsx | 2 +- +- frontend/src/components/status/SyncStatus.tsx | 2 +- +- frontend/src/pages/AdminPage.tsx | 2 +- +- frontend/src/pages/AktePage.tsx | 2 +- +- frontend/src/pages/DashboardPage.tsx | 4 ---- +- frontend/src/pages/FehlbestandListePage.tsx | 2 +- +- frontend/src/pages/MangelListePage.tsx | 4 ++-- +- frontend/src/pages/ObjektListPage.tsx | 8 +++----- +- frontend/src/pages/admin/GeraeteInstanzenListe.tsx | 2 +- +- frontend/src/pages/kontrolle/PositionCard.tsx | 2 +- + +--- +## 2026-09-06 22:55 – 23:06 (11m) +**Beschreibung:** Claude Code Session +**Projekt:** asb-material + +### Commits +Keine Commits in dieser Session. + +### Geänderte Dateien +- frontend/src/pages/AktePage.tsx | 37 ++++++++++++++++++++++++++++++------- +- frontend/src/pages/DashboardPage.tsx | 6 ++++-- + +--- +## 2026-09-06 23:28 – 23:30 (2m) +**Beschreibung:** Claude Code Session +**Projekt:** asb-material + +### Commits +Keine Commits in dieser Session. + +### Geänderte Dateien +- frontend/src/pages/AktePage.tsx | 32 +++++++++++++++++--------------- + +--- +## 2026-09-06 23:34 – 23:37 (3m) +**Beschreibung:** Claude Code Session +**Projekt:** asb-material + +### Commits +Keine Commits in dieser Session. + +### Geänderte Dateien +- backend/app/services/akte.py | 17 ++++++++++++++--- +- backend/tests/test_akte.py | 63 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + +--- +## 2026-09-07 00:04 – 00:06 (2m) +**Beschreibung:** Claude Code Session +**Projekt:** asb-material + +### Commits +Keine Commits in dieser Session. + +### Geänderte Dateien +- backend/app/schemas/akte.py | 3 ++- +- backend/app/services/akte.py | 1 + +- backend/tests/test_akte.py | 1 + +- frontend/src/api/types.ts | 1 + +- frontend/src/pages/AktePage.tsx | 11 +++++++++++ + +--- diff --git a/frontend/DEVLOG.md b/frontend/DEVLOG.md index 9860161..4a1e949 100644 --- a/frontend/DEVLOG.md +++ b/frontend/DEVLOG.md @@ -284,3 +284,270 @@ Keine Commits in dieser Session. - frontend/src/pages/admin/ObjektSection.tsx | 7 + --- +## 2026-09-06 09:54 – 09:55 (1m) +**Beschreibung:** Claude Code Session +**Projekt:** asb-material + +### Commits +Keine Commits in dieser Session. + +### Geänderte Dateien +- arbeitskacheln/15_mobile.md | 6 ++---- +- frontend/src/pages/ObjektListPage.tsx | 9 +++++---- +- frontend/src/pages/admin/LagerSection.tsx | 47 ++++++++++++++++++++++++++++++++++++++++++++--- + +--- +## 2026-09-06 13:30 – 13:32 (1m) +**Beschreibung:** Claude Code Session +**Projekt:** asb-material + +### Commits +- 79ddb37 feat(ui): UI-003 zentrale Statuskomponenten + SyncStatus-Lücke geschlossen + +### Geänderte Dateien +- arbeitskacheln/20_ui_redesign.md | 13 ++++++++++++- +- frontend/src/components/AppShell.tsx | 2 ++ +- frontend/src/components/status/FristBadge.tsx | 31 +++++++++++++++++++++++++++++++ +- frontend/src/components/status/InspectionStatus.tsx | 6 ++++++ +- frontend/src/components/status/InventoryStatus.tsx | 6 ++++++ +- frontend/src/components/status/ReadinessBadge.tsx | 40 ++++++++++++++++++++++++++++++++++++++++ +- frontend/src/components/status/SyncStatus.tsx | 44 ++++++++++++++++++++++++++++++++++++++++++++ +- frontend/src/pages/DashboardPage.tsx | 61 ++++++++++++++++++++++++++++++++++++------------------------- + +--- +## 2026-09-06 13:41 – 13:46 (4m) +**Beschreibung:** Claude Code Session +**Projekt:** asb-material + +### Commits +Keine Commits in dieser Session. + +### Geänderte Dateien +- docs/BENUTZERHANDBUCH.md | 103 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + +--- +## 2026-09-06 21:37 – 21:38 (1m) +**Beschreibung:** Claude Code Session +**Projekt:** asb-material + +### Commits +Keine Commits in dieser Session. + +### Geänderte Dateien +- arbeitskacheln/20_ui_redesign.md | 15 ++++++- +- backend/app/schemas/akte.py | 2 + +- backend/app/services/akte.py | 5 +++ +- backend/app/services/dashboard.py | 175 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++------------ +- backend/tests/test_akte.py | 15 +++++++ +- frontend/src/api/client.ts | 18 ++++++++ +- frontend/src/api/types.ts | 2 + +- frontend/src/components/DokumentePanel.tsx | 26 ++++++++--- +- frontend/src/components/status/gruendeText.ts | 13 ++++++ +- frontend/src/pages/AktePage.tsx | 27 ++++++----- +- frontend/src/pages/DashboardPage.tsx | 13 +----- + +--- +## 2026-09-06 21:39 – 21:41 (1m) +**Beschreibung:** Claude Code Session +**Projekt:** asb-material + +### Commits +Keine Commits in dieser Session. + +### Geänderte Dateien +- arbeitskacheln/20_ui_redesign.md | 9 ++++++++- +- frontend/src/pages/KontrollPage.tsx | 4 ++-- +- frontend/src/pages/kontrolle/PositionCard.tsx | 16 +++++++++++++--- + +--- +## 2026-09-06 21:42 – 21:44 (2m) +**Beschreibung:** Claude Code Session +**Projekt:** asb-material + +### Commits +Keine Commits in dieser Session. + +### Geänderte Dateien +- arbeitskacheln/20_ui_redesign.md | 8 +++++++- +- frontend/src/pages/AktePage.tsx | 17 +++++++++++------ +- frontend/src/pages/MangelListePage.tsx | 9 ++++++++- + +--- +## 2026-09-06 21:59 – 22:03 (3m) +**Beschreibung:** Claude Code Session +**Projekt:** backend + +### Commits +- 65203a0 fix(dashboard): "nie kontrolliert" ging bei zusätzlichen Gründen verloren + +### Geänderte Dateien +- backend/app/schemas/dashboard.py | 1 + +- backend/app/services/dashboard.py | 22 ++++++++++++++++++++-- +- backend/tests/test_dashboard.py | 13 ++++++++++--- +- frontend/src/pages/DashboardPage.tsx | 11 +++++++++-- + +--- +## 2026-09-06 22:48 – 22:50 (1m) +**Beschreibung:** Claude Code Session +**Projekt:** backend + +### Commits +Keine Commits in dieser Session. + +### Geänderte Dateien +- backend/app/services/dashboard.py | 17 ++++++----------- +- backend/app/services/kontrolle/erfassung.py | 50 ++++++++++++++++++++++++++++++++++++++++++-------- +- backend/tests/test_dashboard.py | 3 --- +- backend/tests/test_kontrolle.py | 67 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +- frontend/src/api/client.ts | 2 +- +- frontend/src/components/CommandPalette.tsx | 2 +- +- frontend/src/components/ThemeToggle.tsx | 2 +- +- frontend/src/components/status/FristBadge.tsx | 2 +- +- frontend/src/components/status/InspectionStatus.tsx | 2 +- +- frontend/src/components/status/InventoryStatus.tsx | 2 +- +- frontend/src/components/status/ReadinessBadge.tsx | 2 +- +- frontend/src/components/status/SyncStatus.tsx | 2 +- +- frontend/src/pages/AdminPage.tsx | 2 +- +- frontend/src/pages/AktePage.tsx | 2 +- +- frontend/src/pages/DashboardPage.tsx | 4 ---- +- frontend/src/pages/FehlbestandListePage.tsx | 2 +- +- frontend/src/pages/MangelListePage.tsx | 4 ++-- +- frontend/src/pages/ObjektListPage.tsx | 8 +++----- +- frontend/src/pages/admin/GeraeteInstanzenListe.tsx | 2 +- +- frontend/src/pages/kontrolle/PositionCard.tsx | 2 +- + +--- +## 2026-09-06 23:20 – 23:24 (3m) +**Beschreibung:** Claude Code Session +**Projekt:** asb-material + +### Commits +Keine Commits in dieser Session. + +### Geänderte Dateien +- arbeitskacheln/10_maintenance.md | 40 ++++++++----- +- arbeitskacheln/21_akte_redesign.md | 39 +++++++++++++ +- backend/alembic/versions/0022_wartung.py | 82 ++++++++++++++++++++++++++ +- backend/app/api/v1/api.py | 2 + +- backend/app/api/v1/endpoints/wartung.py | 153 +++++++++++++++++++++++++++++++++++++++++++++++++ +- backend/app/models/__init__.py | 14 +++++ +- backend/app/models/wartung.py | 80 ++++++++++++++++++++++++++ +- backend/app/schemas/akte.py | 13 +++++ +- backend/app/schemas/dokument.py | 2 +- +- backend/app/schemas/wartung.py | 101 ++++++++++++++++++++++++++++++++ +- backend/app/services/akte.py | 33 ++++++++++- +- backend/app/services/datumshilfen.py | 10 ++++ +- backend/app/services/geraet_instanz.py | 13 +---- +- backend/app/services/wartung.py | 216 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +- backend/tests/test_akte.py | 4 ++ +- backend/tests/test_wartung.py | 214 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +- frontend/src/api/types.ts | 62 ++++++++++++++++++++ +- frontend/src/components/CommandPalette.tsx | 1 + +- frontend/src/components/WartungSection.tsx | 191 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +- frontend/src/pages/AdminPage.tsx | 10 ++++ +- frontend/src/pages/AktePage.tsx | 63 +++++++++++++++----- +- frontend/src/pages/admin/WartungsplanSection.tsx | 153 +++++++++++++++++++++++++++++++++++++++++++++++++ +- frontend/src/styles/global.css | 53 +++++++++++++++++ + +--- +## 2026-09-06 23:46 – 23:47 (1m) +**Beschreibung:** Claude Code Session +**Projekt:** asb-material + +### Commits +Keine Commits in dieser Session. + +### Geänderte Dateien +- backend/app/services/kontrolle/erfassung.py | 14 +++++++++----- +- backend/tests/test_kontrolle.py | 4 +--- +- backend/tests/test_mindermenge.py | 3 ++- + +--- +## 2026-09-07 00:08 – 00:09 (0m) +**Beschreibung:** Claude Code Session +**Projekt:** asb-material + +### Commits +Keine Commits in dieser Session. + +### Geänderte Dateien +- backend/app/services/vorlagen.py | 21 +++++++++++++++++++++ +- backend/tests/test_vorlagen.py | 22 ++++++++++++++++++++++ + +--- +## 2026-09-07 00:13 – 00:17 (3m) +**Beschreibung:** Claude Code Session +**Projekt:** asb-material + +### Commits +Keine Commits in dieser Session. + +### Geänderte Dateien +- frontend/src/pages/admin/FachSection.tsx | 12 +++++++++--- + +--- +## 2026-09-07 00:19 – 00:22 (3m) +**Beschreibung:** Claude Code Session +**Projekt:** asb-material + +### Commits +Keine Commits in dieser Session. + +### Geänderte Dateien +- backend/app/api/v1/endpoints/stammdaten.py | 86 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++- +- backend/app/schemas/stammdaten.py | 10 ++++++++ +- backend/app/services/vorlagen.py | 7 +++--- +- backend/tests/test_stammdaten.py | 102 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +- frontend/src/pages/admin/FachSection.tsx | 92 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-------- + +--- +## 2026-09-07 00:25 – 00:26 (1m) +**Beschreibung:** Claude Code Session +**Projekt:** asb-material + +### Commits +Keine Commits in dieser Session. + +### Geänderte Dateien +- backend/app/api/v1/endpoints/stammdaten.py | 44 +++++++++++++++++++++++++++ +- backend/app/schemas/stammdaten.py | 9 ++++++ +- backend/app/services/material_merge.py | 63 +++++++++++++++++++++++++++++++++++++++ +- backend/tests/test_stammdaten.py | 84 +++++++++++++++++++++++++++++++++++++++++++++++++++ +- frontend/src/pages/admin/MaterialSection.tsx | 119 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-------- + +--- +## 2026-09-07 00:32 – 00:35 (2m) +**Beschreibung:** Claude Code Session +**Projekt:** asb-material + +### Commits +Keine Commits in dieser Session. + +### Geänderte Dateien +- backend/app/schemas/dashboard.py | 2 ++ +- backend/app/services/dashboard.py | 7 +++++-- +- frontend/src/pages/DashboardPage.tsx | 4 +++- + +--- +## 2026-09-07 11:53 – 11:56 (2m) +**Beschreibung:** Claude Code Session +**Projekt:** asb-material + +### Commits +Keine Commits in dieser Session. + +### Geänderte Dateien +- frontend/src/pages/kontrolle/PositionCard.tsx | 48 ++++++++++++++++++++++++++++++++++-------------- + +--- +## 2026-09-07 11:58 – 12:02 (3m) +**Beschreibung:** Claude Code Session +**Projekt:** asb-material + +### Commits +Keine Commits in dieser Session. + +### Geänderte Dateien +- frontend/src/pages/kontrolle/PositionCard.tsx | 48 ++++++++++++++++++++++++++++++++++-------------- + +--- diff --git a/frontend/src/App.tsx b/frontend/src/App.tsx index dad4d2c..70ac7fc 100644 --- a/frontend/src/App.tsx +++ b/frontend/src/App.tsx @@ -5,13 +5,12 @@ import { AuthProvider, useAuth } from "./auth/AuthContext"; import { AppShell } from "./components/AppShell"; import { AdminPage } from "./pages/AdminPage"; import { AktePage } from "./pages/AktePage"; -import { DashboardPage } from "./pages/DashboardPage"; +import { DashboardPage } from "./pages/dashboard/DashboardPage"; import { FehlbestandListePage } from "./pages/FehlbestandListePage"; import { KontrollPage } from "./pages/KontrollPage"; import { LoginPage } from "./pages/LoginPage"; import { MangelListePage } from "./pages/MangelListePage"; import { ObjektListPage } from "./pages/ObjektListPage"; -import { startseitenPfad } from "./settings/startseite"; function GeschuetzteRoute({ children }: { children: ReactNode }) { const { eingeloggt } = useAuth(); @@ -24,7 +23,7 @@ function GeschuetzteRoute({ children }: { children: ReactNode }) { function Startseite() { const { eingeloggt, istVerantwortlich } = useAuth(); if (!eingeloggt) return ; - return ; + return ; } function AdminRoute({ children }: { children: ReactNode }) { diff --git a/frontend/src/components/AppShell.tsx b/frontend/src/components/AppShell.tsx index 401c018..31b4739 100644 --- a/frontend/src/components/AppShell.tsx +++ b/frontend/src/components/AppShell.tsx @@ -3,7 +3,6 @@ import { NavLink, useNavigate } from "react-router-dom"; import { useAuth } from "../auth/AuthContext"; import { CommandPalette } from "./CommandPalette"; -import { StartseiteAuswahl } from "./StartseiteAuswahl"; import { SyncStatus } from "./status/SyncStatus"; import { ThemeToggle } from "./ThemeToggle"; @@ -49,7 +48,6 @@ export function AppShell({ children }: { children: ReactNode }) { {istAdmin ? "Administration" : "Verwaltung"} )} - {istVerantwortlich && } - {detailsOffen && ( -
    - {bereitschaft.details.map((d) => ( -
  • - - {d.name} ({d.code}) - - - - - {d.gruende.map((g) => GRUND_TEXT[g] ?? g).join(", ")} - - -
  • - ))} -
- )} - - )} - - -
-

Nächste Prüftermine

- {prueftermine.length === 0 ? ( -

Keine anstehenden oder überfälligen Geräteprüfungen.

- ) : ( -
    - {prueftermine.map((p, i) => ( -
  • - - {p.bezeichnung}{" "} - ({p.faelligkeitsdatum}) - - -
  • - ))} -
- )} -
- -
-

Bevorstehende Ablaufdaten

- {ablaufdaten.length === 0 ? ( -

Keine bald ablaufenden Chargen.

- ) : ( -
    - {ablaufdaten.map((a) => ( -
  • - - {a.objekt_name} – {a.material_name}{" "} - ({a.ablaufdatum}) - - -
  • - ))} -
- )} -
- -
-

Kennzahlen

- {kennzahlen && ( -
    -
  • Offene Fehlbestände: {kennzahlen.anzahl_offener_fehlbestaende}
  • -
  • - Genehmigte Mindermengen: {kennzahlen.anzahl_genehmigter_mindermengen} -
  • -
  • - Kürzlich erledigt (7 Tage): {kennzahlen.anzahl_kuerzlich_erledigter_fehlbestaende} -
  • -
  • - Problematische Objekte: {kennzahlen.anzahl_problematischer_objekte} -
  • -
  • Objekte gesamt: {kennzahlen.anzahl_objekte_gesamt}
  • -
- )} -
- -
-

Mängel

-

{maengelOffenAnzahl} offen

- {maengelKritischAnzahl > 0 && ( -

- {maengelKritischAnzahl} kritisch (blockiert Einsatzbereitschaft) -

- )} - {maengelOffenListe.length > 0 && ( - <> - - {maengelOffen && ( -
    - {maengelOffenListe.map((m) => ( -
  • - {m.beschreibung} - - {m.prioritaet} - -
  • - ))} -
- )} - - )} - {maengelOffenListe.length === 0 &&

Keine offenen Mängel.

} -
- -
-

Qualifikationsablauf

- {qualifikationsablaeufe.length === 0 ? ( -

Keine bald ablaufenden Qualifikationen.

- ) : ( -
    - {qualifikationsablaeufe.map((q) => ( -
  • - - {q.benutzer_name} ({q.qualifikationstyp_name}) - - - {q.gueltig_bis} ({q.verbleibende_tage} Tage) - -
  • - ))} -
- )} -
- -
-

Letzte Aktivität

- {aktivitaet.length === 0 ? ( -

Noch keine Ereignisse.

- ) : ( -
    - {aktivitaet.map((h) => ( -
  • - - {EREIGNIS_LABEL[h.ereignistyp] ?? h.ereignistyp} - {h.entitaet_typ === "objekt" && ( - <> - {" "} - #{h.entitaet_id} - - )} - {h.benutzer_name && · {h.benutzer_name}} - - {new Date(h.zeitpunkt).toLocaleString("de-DE")} -
  • - ))} -
- )} -
- - )} - - ); -} diff --git a/frontend/src/pages/LoginPage.tsx b/frontend/src/pages/LoginPage.tsx index 121f5da..8f1931b 100644 --- a/frontend/src/pages/LoginPage.tsx +++ b/frontend/src/pages/LoginPage.tsx @@ -4,7 +4,6 @@ import { useNavigate } from "react-router-dom"; import { apiRequest } from "../api/client"; import { useAuth } from "../auth/AuthContext"; import type { Me } from "../api/types"; -import { startseitenPfad } from "../settings/startseite"; const VERANTWORTLICH_ROLLEN = ["administration", "materialverantwortlicher", "leitungsverantwortlicher"]; @@ -27,7 +26,7 @@ export function LoginPage() { // selbst /auth/me abfragen statt auf den Context zu warten. const me = await apiRequest("/auth/me"); const istVerantwortlich = me.rollen.some((r) => VERANTWORTLICH_ROLLEN.includes(r)); - navigate(startseitenPfad(istVerantwortlich)); + navigate(istVerantwortlich ? "/dashboard" : "/objekte"); } catch { setFehler("Login oder Passwort falsch"); } finally { diff --git a/frontend/src/pages/dashboard/DashboardPage.tsx b/frontend/src/pages/dashboard/DashboardPage.tsx new file mode 100644 index 0000000..366c576 --- /dev/null +++ b/frontend/src/pages/dashboard/DashboardPage.tsx @@ -0,0 +1,215 @@ +import { useCallback, useEffect, useState } from "react"; + +import { apiRequest } from "../../api/client"; +import type { HistorieEintrag, Mangel } from "../../api/types"; +import type { DashboardTileId } from "./layout"; +import { layoutLaden, layoutSpeichern, STANDARD_REIHENFOLGE } from "./layout"; +import { TileFrame } from "./TileFrame"; +import { AblaufdatenTile } from "./tiles/AblaufdatenTile"; +import { AktivitaetTile } from "./tiles/AktivitaetTile"; +import { AufgabenTile } from "./tiles/AufgabenTile"; +import { EinsatzbereitschaftTile } from "./tiles/EinsatzbereitschaftTile"; +import { KennzahlenTile } from "./tiles/KennzahlenTile"; +import { MaengelTile } from "./tiles/MaengelTile"; +import { PrueftermineTile } from "./tiles/PrueftermineTile"; +import { QualifikationTile } from "./tiles/QualifikationTile"; +import type { Ablaufdatumeintrag, Einsatzbereitschaft, Kennzahlen, Prueftermineintrag, Qualifikationsablauf } from "./types"; + +const AKTUALISIERUNGS_INTERVALL_MS = 60_000; + +const TITEL: Record = { + aufgaben: "Was ist jetzt zu tun?", + einsatzbereitschaft: "Einsatzbereitschaft", + prueftermine: "Nächste Prüftermine", + ablaufdaten: "Bevorstehende Ablaufdaten", + kennzahlen: "Kennzahlen", + maengel: "Mängel", + qualifikation: "Qualifikationsablauf", + aktivitaet: "Letzte Aktivität", +}; + +export function DashboardPage() { + const [bereitschaft, setBereitschaft] = useState(null); + const [prueftermine, setPrueftermine] = useState([]); + const [ablaufdaten, setAblaufdaten] = useState([]); + const [kennzahlen, setKennzahlen] = useState(null); + const [maengel, setMaengel] = useState([]); + const [qualifikationsablaeufe, setQualifikationsablaeufe] = useState([]); + const [aktivitaet, setAktivitaet] = useState([]); + const [laedt, setLaedt] = useState(true); + const [fehler, setFehler] = useState(null); + const [layout, setLayout] = useState(() => layoutLaden()); + const [bearbeitenModus, setBearbeitenModus] = useState(false); + const [monitorModus, setMonitorModus] = useState(false); + + const ladeDaten = useCallback(() => { + return Promise.all([ + apiRequest("/dashboard/einsatzbereitschaft"), + apiRequest("/dashboard/prueftermine"), + apiRequest("/dashboard/ablaufdaten"), + apiRequest("/dashboard/kennzahlen"), + apiRequest("/maengel"), + apiRequest("/dashboard/qualifikationsablaeufe"), + apiRequest("/historie?limit=15"), + ]) + .then(([b, p, a, k, m, q, h]) => { + setBereitschaft(b); + setPrueftermine(p); + setAblaufdaten(a); + setKennzahlen(k); + setMaengel(m); + setQualifikationsablaeufe(q); + setAktivitaet(h); + setFehler(null); + }) + .catch(() => setFehler("Dashboard-Daten konnten nicht geladen werden.")); + }, []); + + // Status-Monitor-Anwendungsfall (Dashboard läuft dauerhaft auf einem Bildschirm) - + // periodisch neu laden statt nur einmalig beim Öffnen. + useEffect(() => { + ladeDaten().finally(() => setLaedt(false)); + const intervall = setInterval(ladeDaten, AKTUALISIERUNGS_INTERVALL_MS); + return () => clearInterval(intervall); + }, [ladeDaten]); + + useEffect(() => { + function fullscreenGeaendert() { + if (!document.fullscreenElement) setMonitorModus(false); + } + document.addEventListener("fullscreenchange", fullscreenGeaendert); + return () => document.removeEventListener("fullscreenchange", fullscreenGeaendert); + }, []); + + function tileVerschieben(id: DashboardTileId, richtung: -1 | 1) { + const index = layout.reihenfolge.indexOf(id); + const zielIndex = index + richtung; + if (zielIndex < 0 || zielIndex >= layout.reihenfolge.length) return; + const neueReihenfolge = [...layout.reihenfolge]; + [neueReihenfolge[index], neueReihenfolge[zielIndex]] = [neueReihenfolge[zielIndex], neueReihenfolge[index]]; + const neuesLayout = { ...layout, reihenfolge: neueReihenfolge }; + setLayout(neuesLayout); + layoutSpeichern(neuesLayout); + } + + function ausblendenUmschalten(id: DashboardTileId) { + const istAusgeblendet = layout.ausgeblendet.includes(id); + const neuesLayout = { + ...layout, + ausgeblendet: istAusgeblendet ? layout.ausgeblendet.filter((x) => x !== id) : [...layout.ausgeblendet, id], + }; + setLayout(neuesLayout); + layoutSpeichern(neuesLayout); + } + + function layoutZuruecksetzen() { + const neuesLayout = { reihenfolge: STANDARD_REIHENFOLGE, ausgeblendet: [] }; + setLayout(neuesLayout); + layoutSpeichern(neuesLayout); + } + + async function monitorUmschalten() { + if (monitorModus) { + if (document.fullscreenElement) await document.exitFullscreen(); + setMonitorModus(false); + return; + } + setBearbeitenModus(false); + try { + await document.documentElement.requestFullscreen(); + } catch { + // Fullscreen optional - Monitor-Modus funktioniert auch im Fenster + } + setMonitorModus(true); + } + + const maengelKritischAnzahl = maengel.filter((m) => m.status !== "erledigt" && m.prioritaet === "hoch").length; + const maengelNeuAnzahl = maengel.filter((m) => m.status === "neu").length; + const pruefungenUeberfaellig = prueftermine.filter((p) => p.status === "abgelaufen").length; + const ablaufdatenAbgelaufen = ablaufdaten.filter((a) => a.status === "abgelaufen").length; + + function tileInhalt(id: DashboardTileId) { + switch (id) { + case "aufgaben": + return bereitschaft ? ( + + ) : null; + case "einsatzbereitschaft": + return bereitschaft ? : null; + case "prueftermine": + return ; + case "ablaufdaten": + return ; + case "kennzahlen": + return kennzahlen ? : null; + case "maengel": + return ( + + ); + case "qualifikation": + return ; + case "aktivitaet": + return ; + default: + return null; + } + } + + return ( +
+
+

Dashboard

+
+ {!monitorModus && ( + + )} + {bearbeitenModus && ( + + )} + +
+
+ {fehler &&
{fehler}
} + {laedt &&

Lade…

} + {!laedt && bereitschaft && ( +
+ {layout.reihenfolge.map((id, index) => { + const ausgeblendet = layout.ausgeblendet.includes(id); + if (ausgeblendet && !bearbeitenModus) return null; + const inhalt = tileInhalt(id); + if (!inhalt) return null; + return ( + 0} + kannRunterVerschieben={index < layout.reihenfolge.length - 1} + onAusblendenUmschalten={() => ausblendenUmschalten(id)} + onHoch={() => tileVerschieben(id, -1)} + onRunter={() => tileVerschieben(id, 1)} + > + {inhalt} + + ); + })} +
+ )} +
+ ); +} diff --git a/frontend/src/pages/dashboard/TileFrame.tsx b/frontend/src/pages/dashboard/TileFrame.tsx new file mode 100644 index 0000000..040a885 --- /dev/null +++ b/frontend/src/pages/dashboard/TileFrame.tsx @@ -0,0 +1,49 @@ +import type { ReactNode } from "react"; + +interface Props { + title: string; + vollbreite?: boolean; + bearbeitenAktiv: boolean; + ausgeblendet: boolean; + kannHochVerschieben: boolean; + kannRunterVerschieben: boolean; + onAusblendenUmschalten: () => void; + onHoch: () => void; + onRunter: () => void; + children: ReactNode; +} + +export function TileFrame({ + title, + vollbreite, + bearbeitenAktiv, + ausgeblendet, + kannHochVerschieben, + kannRunterVerschieben, + onAusblendenUmschalten, + onHoch, + onRunter, + children, +}: Props) { + return ( +
+
+

{title}

+ {bearbeitenAktiv && ( +
+ + + +
+ )} +
+ {!ausgeblendet && children} +
+ ); +} diff --git a/frontend/src/pages/dashboard/layout.ts b/frontend/src/pages/dashboard/layout.ts new file mode 100644 index 0000000..7c5f080 --- /dev/null +++ b/frontend/src/pages/dashboard/layout.ts @@ -0,0 +1,55 @@ +export type DashboardTileId = + | "aufgaben" + | "einsatzbereitschaft" + | "prueftermine" + | "ablaufdaten" + | "kennzahlen" + | "maengel" + | "qualifikation" + | "aktivitaet"; + +export const STANDARD_REIHENFOLGE: DashboardTileId[] = [ + "aufgaben", + "einsatzbereitschaft", + "prueftermine", + "ablaufdaten", + "kennzahlen", + "maengel", + "qualifikation", + "aktivitaet", +]; + +export interface DashboardLayout { + reihenfolge: DashboardTileId[]; + ausgeblendet: DashboardTileId[]; +} + +const SPEICHER_KEY = "mabea-dashboard-layout"; + +function istGueltigeId(wert: unknown): wert is DashboardTileId { + return typeof wert === "string" && (STANDARD_REIHENFOLGE as string[]).includes(wert); +} + +export function layoutLaden(): DashboardLayout { + try { + const roh = localStorage.getItem(SPEICHER_KEY); + if (!roh) return { reihenfolge: STANDARD_REIHENFOLGE, ausgeblendet: [] }; + const geparst = JSON.parse(roh); + const gespeicherteReihenfolge = Array.isArray(geparst.reihenfolge) + ? geparst.reihenfolge.filter(istGueltigeId) + : []; + const fehlende = STANDARD_REIHENFOLGE.filter((id) => !gespeicherteReihenfolge.includes(id)); + const ausgeblendet = Array.isArray(geparst.ausgeblendet) ? geparst.ausgeblendet.filter(istGueltigeId) : []; + return { reihenfolge: [...gespeicherteReihenfolge, ...fehlende], ausgeblendet }; + } catch { + return { reihenfolge: STANDARD_REIHENFOLGE, ausgeblendet: [] }; + } +} + +export function layoutSpeichern(layout: DashboardLayout): void { + try { + localStorage.setItem(SPEICHER_KEY, JSON.stringify(layout)); + } catch { + // Speichern optional - Layout fällt auf Standard zurück + } +} diff --git a/frontend/src/pages/dashboard/tiles/AblaufdatenTile.tsx b/frontend/src/pages/dashboard/tiles/AblaufdatenTile.tsx new file mode 100644 index 0000000..a4048d2 --- /dev/null +++ b/frontend/src/pages/dashboard/tiles/AblaufdatenTile.tsx @@ -0,0 +1,28 @@ +import { Link } from "react-router-dom"; + +import { InventoryStatus } from "../../../components/status/InventoryStatus"; +import type { Ablaufdatumeintrag } from "../types"; + +interface Props { + ablaufdaten: Ablaufdatumeintrag[]; +} + +export function AblaufdatenTile({ ablaufdaten }: Props) { + if (ablaufdaten.length === 0) { + return

Keine bald ablaufenden Chargen.

; + } + + return ( +
    + {ablaufdaten.map((a) => ( +
  • + + {a.objekt_name} – {a.material_name}{" "} + ({a.ablaufdatum}) + + +
  • + ))} +
+ ); +} diff --git a/frontend/src/pages/dashboard/tiles/AktivitaetTile.tsx b/frontend/src/pages/dashboard/tiles/AktivitaetTile.tsx new file mode 100644 index 0000000..5d6f9c6 --- /dev/null +++ b/frontend/src/pages/dashboard/tiles/AktivitaetTile.tsx @@ -0,0 +1,34 @@ +import { Link } from "react-router-dom"; + +import type { HistorieEintrag } from "../../../api/types"; +import { EREIGNIS_LABEL } from "../../../components/status/ereignisText"; + +interface Props { + aktivitaet: HistorieEintrag[]; +} + +export function AktivitaetTile({ aktivitaet }: Props) { + if (aktivitaet.length === 0) { + return

Noch keine Ereignisse.

; + } + + return ( +
    + {aktivitaet.map((h) => ( +
  • + + {EREIGNIS_LABEL[h.ereignistyp] ?? h.ereignistyp} + {h.entitaet_typ === "objekt" && ( + <> + {" "} + #{h.entitaet_id} + + )} + {h.benutzer_name && · {h.benutzer_name}} + + {new Date(h.zeitpunkt).toLocaleString("de-DE")} +
  • + ))} +
+ ); +} diff --git a/frontend/src/pages/dashboard/tiles/AufgabenTile.tsx b/frontend/src/pages/dashboard/tiles/AufgabenTile.tsx new file mode 100644 index 0000000..c495abd --- /dev/null +++ b/frontend/src/pages/dashboard/tiles/AufgabenTile.tsx @@ -0,0 +1,58 @@ +import { Link } from "react-router-dom"; + +import type { Einsatzbereitschaft, Kennzahlen } from "../types"; + +interface Props { + kennzahlen: Kennzahlen | null; + maengelNeuAnzahl: number; + maengelKritischAnzahl: number; + pruefungenUeberfaellig: number; + ablaufdatenAbgelaufen: number; + bereitschaft: Einsatzbereitschaft; +} + +export function AufgabenTile({ + kennzahlen, + maengelNeuAnzahl, + maengelKritischAnzahl, + pruefungenUeberfaellig, + ablaufdatenAbgelaufen, + bereitschaft, +}: Props) { + const aufgaben = [ + kennzahlen && kennzahlen.anzahl_offener_fehlbestaende > 0 + ? { text: `${kennzahlen.anzahl_offener_fehlbestaende} offene Fehlbestände`, ziel: "/fehlbestaende" } + : null, + maengelNeuAnzahl > 0 + ? { text: `${maengelNeuAnzahl} neue Mängelmeldung${maengelNeuAnzahl === 1 ? "" : "en"}`, ziel: "/maengel" } + : null, + maengelKritischAnzahl > 0 + ? { text: `${maengelKritischAnzahl} kritische Mängel offen`, ziel: "/maengel" } + : null, + pruefungenUeberfaellig > 0 + ? { text: `${pruefungenUeberfaellig} Geräteprüfungen überfällig`, ziel: null } + : null, + ablaufdatenAbgelaufen > 0 + ? { text: `${ablaufdatenAbgelaufen} Chargen abgelaufen`, ziel: null } + : null, + bereitschaft.nie_kontrolliert_gesamt > 0 + ? { text: `${bereitschaft.nie_kontrolliert_gesamt} Objekte noch nie kontrolliert`, ziel: "/objekte" } + : null, + ].filter((a): a is { text: string; ziel: string | null } => a !== null); + + if (aufgaben.length === 0) { + return ( +

+ ✅ Nichts Dringendes offen. +

+ ); + } + + return ( +
    + {aufgaben.map((a, i) => ( +
  • {a.ziel ? {a.text} : {a.text}}
  • + ))} +
+ ); +} diff --git a/frontend/src/pages/dashboard/tiles/EinsatzbereitschaftTile.tsx b/frontend/src/pages/dashboard/tiles/EinsatzbereitschaftTile.tsx new file mode 100644 index 0000000..2935cb6 --- /dev/null +++ b/frontend/src/pages/dashboard/tiles/EinsatzbereitschaftTile.tsx @@ -0,0 +1,74 @@ +import { useState } from "react"; +import { Link } from "react-router-dom"; + +import { GRUND_TEXT } from "../../../components/status/gruendeText"; +import type { Readiness } from "../../../components/status/ReadinessBadge"; +import { ReadinessBadge } from "../../../components/status/ReadinessBadge"; +import type { Einsatzbereitschaft } from "../types"; + +// Spiegelt die Fallunterscheidung in app/services/dashboard.py::einsatzbereitschaft - +// welche Kombination von Gründen zu welcher Kategorie führt. +function readinessVonGruenden(gruende: string[]): Readiness { + if (gruende.length === 1 && gruende[0] === "mindermenge_genehmigt") return "limited"; + if (gruende.length === 1 && gruende[0] === "noch_nie_kontrolliert") return "unknown"; + return "not-ready"; +} + +interface Props { + bereitschaft: Einsatzbereitschaft; +} + +export function EinsatzbereitschaftTile({ bereitschaft }: Props) { + const [detailsOffen, setDetailsOffen] = useState(false); + + return ( + <> +

+ {bereitschaft.einsatzbereit}{" "} + + von {bereitschaft.gesamt} einsatzbereit + +

+
+ + {bereitschaft.eingeschraenkt_einsatzbereit > 0 && ( + + )} + {bereitschaft.unbekannt > 0 && } + {bereitschaft.nicht_einsatzbereit > 0 && ( + + )} +
+ {bereitschaft.nie_kontrolliert_gesamt > bereitschaft.unbekannt && ( +

+ Davon {bereitschaft.nie_kontrolliert_gesamt} insgesamt noch nie kontrolliert (auch bei Objekten mit weiteren + Problemen). +

+ )} + {bereitschaft.details.length > 0 && ( + <> + + {detailsOffen && ( +
    + {bereitschaft.details.map((d) => ( +
  • + + {d.name} ({d.code}) + + + + + {d.gruende.map((g) => GRUND_TEXT[g] ?? g).join(", ")} + + +
  • + ))} +
+ )} + + )} + + ); +} diff --git a/frontend/src/pages/dashboard/tiles/KennzahlenTile.tsx b/frontend/src/pages/dashboard/tiles/KennzahlenTile.tsx new file mode 100644 index 0000000..a0f3744 --- /dev/null +++ b/frontend/src/pages/dashboard/tiles/KennzahlenTile.tsx @@ -0,0 +1,19 @@ +import type { Kennzahlen } from "../types"; + +interface Props { + kennzahlen: Kennzahlen; +} + +export function KennzahlenTile({ kennzahlen }: Props) { + return ( +
    +
  • Offene Fehlbestände: {kennzahlen.anzahl_offener_fehlbestaende}
  • +
  • Genehmigte Mindermengen: {kennzahlen.anzahl_genehmigter_mindermengen}
  • +
  • + Kürzlich erledigt (7 Tage): {kennzahlen.anzahl_kuerzlich_erledigter_fehlbestaende} +
  • +
  • Problematische Objekte: {kennzahlen.anzahl_problematischer_objekte}
  • +
  • Objekte gesamt: {kennzahlen.anzahl_objekte_gesamt}
  • +
+ ); +} diff --git a/frontend/src/pages/dashboard/tiles/MaengelTile.tsx b/frontend/src/pages/dashboard/tiles/MaengelTile.tsx new file mode 100644 index 0000000..6eb358c --- /dev/null +++ b/frontend/src/pages/dashboard/tiles/MaengelTile.tsx @@ -0,0 +1,58 @@ +import { useState } from "react"; +import { Link } from "react-router-dom"; + +import type { Mangel } from "../../../api/types"; + +interface Props { + maengel: Mangel[]; + maengelNeuAnzahl: number; + maengelKritischAnzahl: number; +} + +export function MaengelTile({ maengel, maengelNeuAnzahl, maengelKritischAnzahl }: Props) { + const [maengelOffen, setMaengelOffen] = useState(false); + const maengelOffenListe = maengel.filter((m) => m.status !== "erledigt"); + + return ( + <> +

{maengelOffenListe.length} offen

+ {maengelNeuAnzahl > 0 && ( +

+ {maengelNeuAnzahl} neu gemeldet +

+ )} + {maengelKritischAnzahl > 0 && ( +

+ {maengelKritischAnzahl} kritisch (blockiert Einsatzbereitschaft) +

+ )} + {maengelOffenListe.length > 0 && ( + <> + + {maengelOffen && ( +
    + {maengelOffenListe.map((m) => ( +
  • + + {m.beschreibung} + {m.status === "neu" && ( + + neu + + )} + + + {m.prioritaet} + +
  • + ))} +
+ )} + + )} + {maengelOffenListe.length === 0 &&

Keine offenen Mängel.

} + + ); +} diff --git a/frontend/src/pages/dashboard/tiles/PrueftermineTile.tsx b/frontend/src/pages/dashboard/tiles/PrueftermineTile.tsx new file mode 100644 index 0000000..5cdcb3c --- /dev/null +++ b/frontend/src/pages/dashboard/tiles/PrueftermineTile.tsx @@ -0,0 +1,28 @@ +import { Link } from "react-router-dom"; + +import { InspectionStatus } from "../../../components/status/InspectionStatus"; +import type { Prueftermineintrag } from "../types"; + +interface Props { + prueftermine: Prueftermineintrag[]; +} + +export function PrueftermineTile({ prueftermine }: Props) { + if (prueftermine.length === 0) { + return

Keine anstehenden oder überfälligen Geräteprüfungen.

; + } + + return ( +
    + {prueftermine.map((p, i) => ( +
  • + + {p.bezeichnung}{" "} + ({p.faelligkeitsdatum}) + + +
  • + ))} +
+ ); +} diff --git a/frontend/src/pages/dashboard/tiles/QualifikationTile.tsx b/frontend/src/pages/dashboard/tiles/QualifikationTile.tsx new file mode 100644 index 0000000..4a31bfb --- /dev/null +++ b/frontend/src/pages/dashboard/tiles/QualifikationTile.tsx @@ -0,0 +1,26 @@ +import type { Qualifikationsablauf } from "../types"; + +interface Props { + qualifikationsablaeufe: Qualifikationsablauf[]; +} + +export function QualifikationTile({ qualifikationsablaeufe }: Props) { + if (qualifikationsablaeufe.length === 0) { + return

Keine bald ablaufenden Qualifikationen.

; + } + + return ( +
    + {qualifikationsablaeufe.map((q) => ( +
  • + + {q.benutzer_name} ({q.qualifikationstyp_name}) + + + {q.gueltig_bis} ({q.verbleibende_tage} Tage) + +
  • + ))} +
+ ); +} diff --git a/frontend/src/pages/dashboard/types.ts b/frontend/src/pages/dashboard/types.ts new file mode 100644 index 0000000..ef31a4a --- /dev/null +++ b/frontend/src/pages/dashboard/types.ts @@ -0,0 +1,55 @@ +export interface Kennzahlen { + anzahl_offener_fehlbestaende: number; + anzahl_genehmigter_mindermengen: number; + anzahl_kuerzlich_erledigter_fehlbestaende: number; + anzahl_bevorstehender_ablaufdaten: number; + anzahl_problematischer_objekte: number; + anzahl_objekte_gesamt: number; +} + +export interface Qualifikationsablauf { + benutzer_qualifikation_id: string; + benutzer_id: number; + benutzer_name: string; + qualifikationstyp_id: number; + qualifikationstyp_name: string; + gueltig_bis: string; + verbleibende_tage: number; + status: string; +} + +export interface ObjektMangel { + objekt_id: number; + code: string; + name: string; + gruende: string[]; +} + +export interface Einsatzbereitschaft { + einsatzbereit: number; + eingeschraenkt_einsatzbereit: number; + unbekannt: number; + nicht_einsatzbereit: number; + gesamt: number; + nie_kontrolliert_gesamt: number; + details: ObjektMangel[]; +} + +export interface Prueftermineintrag { + typ: string; + objekt_id: number; + bezeichnung: string; + faelligkeitsdatum: string; + verbleibende_tage: number; + status: string; +} + +export interface Ablaufdatumeintrag { + objekt_id: number; + objekt_name: string; + material_id: number; + material_name: string; + ablaufdatum: string; + verbleibende_tage: number; + status: string; +} diff --git a/frontend/src/settings/startseite.ts b/frontend/src/settings/startseite.ts deleted file mode 100644 index 1512c2b..0000000 --- a/frontend/src/settings/startseite.ts +++ /dev/null @@ -1,30 +0,0 @@ -export type StartseitePraeferenz = "auto" | "dashboard" | "objekte"; - -const SPEICHER_KEY = "mabea-startseite"; - -export function gespeichertePraeferenz(): StartseitePraeferenz { - try { - const wert = localStorage.getItem(SPEICHER_KEY); - if (wert === "dashboard" || wert === "objekte") return wert; - } catch { - // localStorage evtl. blockiert - "auto" als Fallback - } - return "auto"; -} - -export function praeferenzSpeichern(praeferenz: StartseitePraeferenz): void { - try { - if (praeferenz === "auto") localStorage.removeItem(SPEICHER_KEY); - else localStorage.setItem(SPEICHER_KEY, praeferenz); - } catch { - // Speichern optional - } -} - -/** "auto" = bisheriges Verhalten (Verantwortliche -> Dashboard, sonst Objekte). */ -export function startseitenPfad(istVerantwortlich: boolean): string { - const praeferenz = gespeichertePraeferenz(); - if (praeferenz === "dashboard" && istVerantwortlich) return "/dashboard"; - if (praeferenz === "objekte") return "/objekte"; - return istVerantwortlich ? "/dashboard" : "/objekte"; -}