'use client' import { useState, useEffect, use } from 'react' import { Loader2, FileText, Download, Printer, MapPin, Send, CheckCircle, XCircle } from 'lucide-react' interface RapportViewData { id: string reportNumber: string data: any generatedAt: string project: { title: string; location: string | null } tenant: { name: string } createdBy: { name: string } | null } export default function RapportViewerPage({ params }: { params: Promise<{ token: string }> }) { const { token } = use(params) const [rapport, setRapport] = useState(null) const [isLoading, setIsLoading] = useState(true) const [error, setError] = useState('') const [showEmailInput, setShowEmailInput] = useState(false) const [emailTo, setEmailTo] = useState('') const [emailSending, setEmailSending] = useState(false) const [emailStatus, setEmailStatus] = useState<'sent' | 'error' | null>(null) useEffect(() => { async function load() { try { const res = await fetch(`/api/rapports/${token}`) if (res.ok) { setRapport(await res.json()) } else { setError('Rapport nicht gefunden oder Link ungültig.') } } catch { setError('Fehler beim Laden des Rapports.') } finally { setIsLoading(false) } } load() }, [token]) if (isLoading) { return (

Rapport wird geladen...

) } if (error || !rapport) { return (

Rapport nicht verfügbar

{error}

) } const d = rapport.data const pdfUrl = `/api/rapports/${token}/pdf` return (
{/* Action bar */}
Lageplan — Einsatzrapport
PDF herunterladen
{/* Email send bar */} {showEmailInput && (
{ setEmailTo(e.target.value); setEmailStatus(null) }} className="flex-1 text-sm border rounded px-3 py-1.5 outline-none focus:ring-2 focus:ring-gray-300" onKeyDown={e => { if (e.key === 'Enter') document.getElementById('send-email-btn')?.click() }} /> {emailStatus === 'sent' && } {emailStatus === 'error' && }
)} {/* Rapport card */}
{/* Header */}
{d.logoUrl && ( Logo )}

Einsatzrapport

{d.organisation} · {d.abteilung}

{rapport.reportNumber}
{d.datum} · {d.uhrzeit}
{/* 1. Einsatzdaten */}
{/* 2. Zeitverlauf */}
{/* 3. Lagebild */}
Getroffene Massnahmen
{Array.isArray(d.massnahmen) ? (
    {d.massnahmen.map((m: string, i: number) => (
  • • {m}
  • ))}
) : (
{d.massnahmen || '—'}
)}
{/* 4. Lageplan-Karte */} {d.mapScreenshot && (
Lageplan
)} {/* 5. Eingesetzte Mittel */} {d.fahrzeuge?.length > 0 && (
{d.fahrzeuge.map((fz: any, i: number) => ( ))}
Fahrzeug Pers. Ausrücken Eintreffen Auftrag
{fz.name} {fz.pers} {fz.ausruecken} {fz.eintreffen} {fz.auftrag}
)} {/* 6. Bemerkungen */}
{d.bemerkungen || '—'}
{/* Unterschriften */}

Einsatzleiter/in · {d.einsatzleiter}

Rapport erstellt durch · {d.rapporteur}

Datum / Visum Kdt

{/* Footer with QR code */}
Erstellt: {d.datum} {d.uhrzeit} · {d.organisation}
Rapport: {rapport.reportNumber}
{d.qrCodeUrl && (
QR-Code Online-Rapport
)}
app.lageplan.ch
) } function Section({ num, title, children }: { num: string; title: string; children: React.ReactNode }) { return (
{num} {title}
{children}
) } function Field({ label, value, mono, highlight, span, last }: { label: string; value: string; mono?: boolean; highlight?: boolean; span?: number; last?: boolean }) { return (
{label}
{value || '—'}
) }