From d607a1101dd2bf12d0cd1491024b3e9b86fd2a15 Mon Sep 17 00:00:00 2001 From: patrick Date: Sun, 6 Sep 2026 22:50:42 +0200 Subject: [PATCH] =?UTF-8?q?fix(ui):=20Pr=C3=BCftermine/Ablaufdaten=20verli?= =?UTF-8?q?nken,=20Pr=C3=BCfung=20direkt=20aus=20der=20Akte=20erfassbar?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Dashboard-Listen "Nächste Prüftermine"/"Bevorstehende Ablaufdaten" hatten keinen Link zum betroffenen Objekt - ein überfälliger Termin war nicht erreichbar. Zusätzlich: "Prüfung heute durchgeführt"-Button je Gerät auf der Akte (PATCH /geraete/{id}), bisher nur über die Admin-Objektbearbeitung möglich. Co-Authored-By: Claude Sonnet 5 Claude-Session: https://claude.ai/code/session_01CVgbozhYmuEhiEJHffRXCV --- frontend/src/pages/AktePage.tsx | 37 ++++++++++++++++++++++------ frontend/src/pages/DashboardPage.tsx | 6 +++-- 2 files changed, 34 insertions(+), 9 deletions(-) diff --git a/frontend/src/pages/AktePage.tsx b/frontend/src/pages/AktePage.tsx index 521c53c..ccc6d52 100644 --- a/frontend/src/pages/AktePage.tsx +++ b/frontend/src/pages/AktePage.tsx @@ -2,6 +2,7 @@ import { useEffect, useState } from "react"; import { Link, useParams } from "react-router-dom"; import { apiRequest } from "../api/client"; +import { useAuth } from "../auth/AuthContext"; import type { Akte } from "../api/types"; import { DokumentePanel } from "../components/DokumentePanel"; import { ReadinessBadge } from "../components/status/ReadinessBadge"; @@ -18,18 +19,33 @@ const MANGEL_PRIORITAET_LABEL: Record = { // Einzelseiten - konsumiert den FILE-001-Aggregations-Endpunkt. export function AktePage() { const { objektId } = useParams<{ objektId: string }>(); + const { istVerantwortlich } = useAuth(); const [akte, setAkte] = useState(null); const [fehler, setFehler] = useState(null); const [laedt, setLaedt] = useState(true); - useEffect(() => { + function laden() { if (!objektId) return; setLaedt(true); apiRequest(`/akte/objekt/${objektId}`) .then(setAkte) .catch(() => setFehler("Akte konnte nicht geladen werden.")) .finally(() => setLaedt(false)); - }, [objektId]); + } + + useEffect(laden, [objektId]); + + async function pruefungDurchgefuehrt(geraetId: string) { + try { + await apiRequest(`/geraete/${geraetId}`, { + method: "PATCH", + body: { status: "einsatzbereit", pruefdatum: new Date().toISOString().slice(0, 10) }, + }); + laden(); + } catch { + setFehler("Prüfung konnte nicht erfasst werden."); + } + } if (laedt) return

Lade…

; if (fehler) return
{fehler}
; @@ -114,11 +130,18 @@ export function AktePage() { {akte.geraete.length > 0 && (
    {akte.geraete.map((g) => ( -
  • - SN {g.seriennummer} —{" "} - {g.status} - {g.naechste_pruefung && ( - · nächste Prüfung {new Date(g.naechste_pruefung).toLocaleDateString("de-DE")} +
  • + + SN {g.seriennummer} —{" "} + {g.status} + {g.naechste_pruefung && ( + · nächste Prüfung {new Date(g.naechste_pruefung).toLocaleDateString("de-DE")} + )} + + {istVerantwortlich && ( + )}
  • ))} diff --git a/frontend/src/pages/DashboardPage.tsx b/frontend/src/pages/DashboardPage.tsx index 8835342..4374bf5 100644 --- a/frontend/src/pages/DashboardPage.tsx +++ b/frontend/src/pages/DashboardPage.tsx @@ -218,7 +218,8 @@ export function DashboardPage() { {prueftermine.map((p, i) => (
  • - {p.bezeichnung} ({p.faelligkeitsdatum}) + {p.bezeichnung}{" "} + ({p.faelligkeitsdatum})
  • @@ -236,7 +237,8 @@ export function DashboardPage() { {ablaufdaten.map((a) => (
  • - Objekt #{a.objekt_id} – Material #{a.material_id} ({a.ablaufdatum}) + Objekt #{a.objekt_id} – Material #{a.material_id}{" "} + ({a.ablaufdatum})