"use client"; import { useMemo } from "react"; import { useQuery } from "convex/react"; import { FunctionReturnType } from "convex/server"; import { Activity, Files, SquarePen } from "lucide-react"; import Link from "next/link"; import { api } from "@/convex/_generated/api"; import { Skeleton } from "@/components/ui/skeleton"; import { Badge } from "@/components/ui/badge"; type AuditDashboardRowsResult = FunctionReturnType; type AuditRow = Extract[number], { kind: "audit" }>; type AuditDashboardRow = NonNullable[number]; const statusText: Record = { draft: "Entwurf", approved: "Freigegeben", published: "Veröffentlicht", deactivated: "Deaktiviert", }; const fallbackStatus = "Unbekannt"; const generationStageText: Record = { audit_generation: "Audit-Generierung", classification: "Klassifikation", multimodalAudit: "Multimodale Analyse", germanCopy: "Deutsche Texte", qualityReview: "Qualitätsprüfung", }; function formatPageCount(pageCount: number) { return `${pageCount} Seite${pageCount === 1 ? "" : "n"}`; } function getStatusLabel(status: AuditRow["status"]) { return statusText[status] ?? fallbackStatus; } function getGenerationStatusLabel( row: Extract, ) { if (row.status === "pending") { return "Wartet auf Start"; } if (row.status === "failed") { return "Fehlgeschlagen"; } if (row.status === "canceled") { return "Abgebrochen"; } if (row.status === "succeeded") { return "Wartet auf finales Audit"; } return "Generierung läuft"; } function getStageLabel(stage: string) { return generationStageText[stage] ?? stage; } function AuditsBoardLoading() { return (

Interne Audit-Übersicht

Audits

Audits werden geladen...

{Array.from({ length: 4 }, (_, index) => ( ))}
); } export function AuditsBoard() { const dashboardRows = useQuery(api.audits.listDashboardRows, { limit: 100 }); const rows = useMemo(() => { if (!dashboardRows) { return []; } return [...dashboardRows].sort((a, b) => b.updatedAt - a.updatedAt); }, [dashboardRows]); if (dashboardRows === undefined) { return ; } if (rows.length === 0) { return (

Interne Audit-Übersicht

Audits

Noch keine Audits

Sobald neue Audits oder laufende Audit-Generierungen angelegt wurden, erscheinen sie hier als kompakte Zeilen.

); } return (

Interne Audit-Übersicht

Audits

Slug Domain Status Seiten/Phase Aktion
{rows.map((row: AuditDashboardRow) => (

{row.title}

{row.kind === "generation" ? (

Run {row.runId}

) : null}

{row.checkedDomain}

{row.kind === "audit" ? getStatusLabel(row.status) : getGenerationStatusLabel(row)}

{row.kind === "audit" ? ( <> {formatPageCount(row.pageCount)} ) : ( <> {getStageLabel(row.latestStage)} )} {row.kind === "generation" && row.errorSummary ? ( {row.errorSummary} ) : null}

{row.kind === "audit" ? ( Öffnen ) : ( Pipeline )}
))}
); }