diff --git a/artifacts/skillguard/public/opengraph.jpg b/artifacts/skillguard/public/opengraph.jpg index 2828bf9..01f6431 100644 Binary files a/artifacts/skillguard/public/opengraph.jpg and b/artifacts/skillguard/public/opengraph.jpg differ diff --git a/artifacts/skillguard/src/pages/scan-report.tsx b/artifacts/skillguard/src/pages/scan-report.tsx index c4f5b69..e144103 100644 --- a/artifacts/skillguard/src/pages/scan-report.tsx +++ b/artifacts/skillguard/src/pages/scan-report.tsx @@ -11,7 +11,8 @@ import { Button } from "@/components/ui/button"; import { Progress } from "@/components/ui/progress"; import { VerdictBadge, SeverityBadge, AxisBadge } from "@/components/ui-helpers"; import { formatDate } from "@/lib/format"; -import { ShieldQuestion, AlertTriangle, Download, FileCode, CheckCircle2, Code, Shield } from "lucide-react"; +import { ShieldQuestion, AlertTriangle, Download, FileCode, CheckCircle2, Code, Shield, FileDown } from "lucide-react"; +import type { ScanDetail } from "@workspace/api-client-react"; export default function ScanReport() { const [, params] = useRoute("/berichte/:id"); @@ -78,6 +79,19 @@ export default function ScanReport() { URL.revokeObjectURL(url); }; + const handleExportPdf = () => { + const html = buildReportHtml(data); + const printWindow = window.open("", "_blank"); + if (!printWindow) return; + printWindow.document.open(); + printWindow.document.write(html); + printWindow.document.close(); + printWindow.focus(); + printWindow.onload = () => { + printWindow.print(); + }; + }; + return (
Keine Auffälligkeiten gefunden. Der analysierte Skill entspricht den Sicherheits- und Datenschutzrichtlinien.
` + : data.findings.map((f, i) => { + const location = (f.file || f.line) + ? `` + : ""; + const snippet = f.snippet + ? `${escapeHtml(f.snippet)}`
+ : "";
+ const remediation = f.remediation
+ ? `${escapeHtml(f.description)}
+ ${snippet} + ${remediation} +
+ ${escapeHtml(title)} | ${escapeHtml(verdict)}
+ Erstellt am ${escapeHtml(formatDate(data.createdAt))} | Quelle: ${escapeHtml(source)} | ${escapeHtml(data.fileCount)} ${data.fileCount === 1 ? "Datei" : "Dateien"}${data.aiUsed ? " | KI-Analyse aktiv" : ""}
+
| Kennzahl | Anzahl |
|---|---|
| Kritisch | ${escapeHtml(counts.critical)} |
| Hoch | ${escapeHtml(counts.high)} |
| Mittel | ${escapeHtml(counts.medium)} |
| Niedrig | ${escapeHtml(counts.low)} |
| Info | ${escapeHtml(counts.info)} |
| IT-Sicherheit | ${escapeHtml(counts.security)} |
| Datenschutz | ${escapeHtml(counts.privacy)} |
| Gesamt | ${escapeHtml(counts.total)} |
| Pfad | Typ | Sprache | Größe |
|---|---|---|---|
| Keine Dateien verfügbar. | |||
| ${escapeHtml(file.path)} | +${escapeHtml(KIND_LABELS[file.kind] ?? file.kind)} | +${escapeHtml(file.language || "-")} | +${escapeHtml(file.size)} B | +