import React from "react"; import { PROTOKOLL_TYPES } from "../constants.js"; import { formatDate } from "../utils.js"; import { Header } from "../components/UI.jsx"; export default function Documents({ data, setView }) { const protocols = (data.protocols || []).sort((a, b) => (b.date || "").localeCompare(a.date || "")); const deliveryNotes = (data.deliveryNotes || []).sort((a, b) => (b.date || "").localeCompare(a.date || "")); const letterTemplates = data.letterTemplates || []; const recentProtos = protocols.slice(0, 6); const recentNotes = deliveryNotes.slice(0, 5); const protoByType = PROTOKOLL_TYPES.map(t => ({ type: t, count: protocols.filter(p => p.type === t).length, })).filter(r => r.count > 0).sort((a, b) => b.count - a.count); const maxTypeCount = protoByType[0]?.count || 1; const getClient = (n) => { if (n.clientId) return (data.persons||[]).filter(p=>p.isAuftraggeber).find(c => c.id === n.clientId)?.name || "—"; if (n.projectId) { const proj = data.projects?.find(p => p.id === n.projectId); if (proj?.clientId) return (data.persons||[]).filter(p=>p.isAuftraggeber).find(c => c.id === proj.clientId)?.name || "—"; } return "—"; }; const getProject = (n) => { if (!n.projectId) return null; return data.projects?.find(p => p.id === n.projectId)?.name || null; }; const SectionCard = ({ title, count, action, onAction, children, accent }) => (
{title} {count > 0 && ( {count} )}
{children}
); return (
{/* KPI-Zeile */}
{[ { label: "Protokolle", count: protocols.length, sub: `${recentProtos.length > 0 ? formatDate(recentProtos[0]?.date) : "—"} zuletzt`, view: "protokolle", color: "#2d6a4f", bg: "#e8f5ee" }, { label: "Lieferscheine", count: deliveryNotes.length, sub: `${recentNotes.length > 0 ? formatDate(recentNotes[0]?.date) : "—"} zuletzt`, view: "lieferscheine", color: "#1a4e8a", bg: "#e8f0fa" }, { label: "Briefvorlagen", count: letterTemplates.length, sub: "Vorlagen", view: "letters", color: "#7a3e8a", bg: "#f3eafa" }, ].map(({ label, count, sub, view: v, color, bg }) => (
setView(v)}>
{label.toUpperCase()}
{count}
{sub}
→ Öffnen
))}
{/* Linke Spalte */}
{/* Letzte Protokolle */} setView("protokolle")} accent="#e8f5ee"> {recentProtos.length === 0 ? (
Noch keine Protokolle erfasst.
) : ( {recentProtos.map(p => { const proj = getProject(p); return ( ); })}
Datum Typ Titel Projekt Einträge
{formatDate(p.date)} {p.type || "—"} {p.title || } {proj || } {(p.entries || []).length}
)}
{/* Letzte Lieferscheine */} setView("lieferscheine")} accent="#e8f0fa"> {recentNotes.length === 0 ? (
Noch keine Lieferscheine erfasst.
) : ( {recentNotes.map(n => ( ))}
Nr. Datum Kunde Projekt Positionen
{n.number || "—"} {formatDate(n.date)} {getClient(n)} {getProject(n) || } {(n.items || []).length}
)}
{/* Rechte Spalte */}
{/* Protokoll-Typen */} {protoByType.length > 0 && (
PROTOKOLLE NACH TYP
{protoByType.map(({ type, count }) => { const pct = (count / maxTypeCount) * 100; return (
{type} {count}
); })}
)} {/* Briefvorlagen */}
0 ? "1px solid #ece8e2" : "none" }}> BRIEFVORLAGEN
{letterTemplates.length === 0 ? (
Noch keine Briefvorlagen erstellt.
) : (
{letterTemplates.map(t => (
{t.name || "Unbenannt"} {t.body ? `${t.body.replace(/<[^>]+>/g, "").slice(0, 40)}…` : "—"}
))}
)}
); }