Bisher standen nur Zahlen da. Jetzt kommen die Inhalte mit. Pull Requests und Issues: bis zu 50 offene je Liste, mit Nummer, Titel, Autor, Alter, Labels und Link. Bei GitHub und Gitea liefert der Issue-Endpunkt auch Pull Requests mit - die werden herausgefiltert. CI-Status des letzten Laufs auf dem Default-Branch: - GitHub ueber actions/runs; dort sind Lauf-Status und Ergebnis getrennt und werden auf einen Wert zusammengefuehrt - GitLab ueber pipelines - Gitea ueber den kombinierten Commit-Status. Das deckt Gitea Actions und externe Systeme wie Woodpecker gleichermassen ab - ein reiner Actions-Endpunkt existiert auf aelteren Instanzen nicht. Commit-Aktivitaet als Balkenreihe. Berechnet aus den ohnehin geholten Commits (jetzt 100 statt 15, angezeigt bleiben 15) statt ueber eigene Statistik-Endpunkte: die gibt es nicht bei allen drei Systemen, und bei GitHub antworten sie beim ersten Aufruf mit 202 und ohne Daten. Beim Testen gegen gitlab-runner fiel auf, dass alle 100 Commits in die letzten 30 Tage fielen - die frueheren Tage haetten faelschlich Null gezeigt, obwohl wir ueber sie nichts wissen. Die Kurve wird deshalb auf den tatsaechlich belegten Zeitraum gekuerzt. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
58 lines
1.5 KiB
TypeScript
58 lines
1.5 KiB
TypeScript
import { cn } from "@/lib/utils";
|
|
|
|
/**
|
|
* Commit-Aktivitaet als kleine Balkenreihe.
|
|
*
|
|
* Bewusst als reines SVG ohne Diagrammbibliothek: es sind dreissig Werte,
|
|
* die Achsen, Legende und Tooltips einer Bibliothek waeren hier nur Ballast.
|
|
*/
|
|
export function Sparkline({
|
|
values,
|
|
className,
|
|
height = 28,
|
|
label = "Commits",
|
|
}: {
|
|
values: number[];
|
|
className?: string;
|
|
height?: number;
|
|
label?: string;
|
|
}) {
|
|
if (!values.length) return null;
|
|
|
|
const total = values.reduce((sum, value) => sum + value, 0);
|
|
if (total === 0) return null;
|
|
|
|
const max = Math.max(...values);
|
|
const gap = 1;
|
|
const barWidth = 3;
|
|
const width = values.length * (barWidth + gap) - gap;
|
|
|
|
return (
|
|
<svg
|
|
viewBox={`0 0 ${width} ${height}`}
|
|
preserveAspectRatio="none"
|
|
className={cn("w-full", className)}
|
|
style={{ height }}
|
|
role="img"
|
|
aria-label={`${label} der letzten ${values.length} Tage: insgesamt ${total}`}
|
|
>
|
|
<title>{`${label} der letzten ${values.length} Tage: insgesamt ${total}`}</title>
|
|
{values.map((value, index) => {
|
|
// Auch ein einzelner Commit soll sichtbar sein, daher die Untergrenze.
|
|
const barHeight = value === 0 ? 1.5 : Math.max(3, (value / max) * height);
|
|
return (
|
|
<rect
|
|
key={index}
|
|
x={index * (barWidth + gap)}
|
|
y={height - barHeight}
|
|
width={barWidth}
|
|
height={barHeight}
|
|
rx={1}
|
|
className={value === 0 ? "fill-white/10" : "fill-violet-400/80"}
|
|
/>
|
|
);
|
|
})}
|
|
</svg>
|
|
);
|
|
}
|