"use client"; import { useMemo } from "react"; import { useQuery } from "convex/react"; import { FunctionReturnType } from "convex/server"; import { 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 AuditsListResult = FunctionReturnType; type AuditRow = NonNullable[number]; const statusText: Record = { draft: "Entwurf", approved: "Freigegeben", published: "Veröffentlicht", deactivated: "Deaktiviert", }; const fallbackStatus = "Unbekannt"; function formatPageCount(pages: AuditRow["checkedPages"]) { return `${pages.length} Seite${pages.length === 1 ? "" : "n"}`; } function getStatusLabel(status: AuditRow["status"]) { return statusText[status] ?? fallbackStatus; } function AuditsBoardLoading() { return (

Interne Audit-Übersicht

Audits

Audits werden geladen...

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

Interne Audit-Übersicht

Audits

Noch keine Audits

Sobald neue Audits angelegt wurden, erscheinen sie hier als kompakte Zeilen.

); } return (

Interne Audit-Übersicht

Audits

Slug Domain Status Seitenanzahl Aktion
{rows.map((audit: AuditRow) => (

{audit.slug}

{audit.checkedDomain}

{getStatusLabel(audit.status)}

{formatPageCount(audit.checkedPages)}

Öffnen
))}
); }