DataTable
Die Tabelle der Konsole: 36px Kopf, 40px Zeilen ohne Linien, Zahlen rechts, Sortieren, Größe ändern, Auswahl, Virtualisierung.
function Logs() {
const [open, setOpen] = useState<LogRow | null>(null);
const [n, setN] = useState(60);
const data = useMemo(() => logs.slice(0, n), [n]);
return (
<div className="h-480 w-full overflow-y-auto scrollbar-quiet">
<DataTable
aria-label="Request logs"
data={data}
columns={columns}
getRowId={(r) => r.id}
selectable
activeRowId={open?.id}
onRowClick={setOpen}
rowMenu={(r) => (
<>
<Menu.Item icon={icons.openExternal} onClick={() => setOpen(r)}>
Open request
</Menu.Item>
<Menu.Item icon={icons.copy}>Copy request id</Menu.Item>
<Menu.Item icon={icons.filter}>Filter by {r.model}</Menu.Item>
</>
)}
hasMore={n < logs.length}
onLoadMore={() => setN((x) => x + 60)}
/>
<Sheet
open={!!open}
onOpenChange={(o) => !o && setOpen(null)}
title={open ? `${open.method} ${open.endpoint}` : ""}
subtitle={open?.id}
size="md"
modal={false}
>
{open && (
<div className="flex flex-col gap-24">
<RequestTimeline ttfbMs={open.ttfbMs} totalMs={open.latencyMs} />
<KeyValue
items={[
{ label: "Status", value: <StatusCode code={open.status} showText /> },
{ label: "Model", value: open.model, mono: true },
{ label: "Key", value: open.key },
{ label: "Cost", value: `$${open.cost}` },
]}
/>
</div>
)}
</Sheet>
</div>
);
}import { DataTable, col } from "@logicplanes/kaeso-ui";Props
activeRowIdstringDie ID einer Zeile, die als aktiv gilt (in einem Sheet geöffnet).
aria-labelstringDer zugängliche Name der Tabelle.
columnsColumnDef<T, any>[]Die Spalten, als Spaltendefinitionen von TanStack Table.
dataT[]Die Zeilen.
density"default" | "compact" | "comfortable"Wie viel Platz jede Zeile bekommt.
emptyReactNodeWas angezeigt wird, wenn es keine Zeilen gibt, meist ein
Empty.errorReactNodeDie Zeilen ließen sich nicht laden: Die Tabelle sagt es dort, wo ihre Zeilen stünden, und bietet „Erneut versuchen“ an (
onRetry). Fehler sind Toasts, daher wird der Wert nicht angezeigt; zeige die Meldung dort als Toast, wo die Anfrage fehlschlägt.freshRowIdsReadonlySet<string>Gerade eingetroffene Zeilen (eine Live-Liste): Jede zeigt eine Fläche, die über eine Sekunde ausblendet.
getRowId((row: T) => string)Gibt die stabile ID einer Zeile zurück, für Auswahl und Schlüssel.
hasMorebooleanOb sich weitere Zeilen laden lassen.
loadingbooleanZeigt Skelettzeilen, während die erste Seite lädt.
loadingMorebooleanZeigt, dass weitere Zeilen geladen werden.
manualSortingbooleanSortiert wird auf dem Server: Die Daten kommen sortiert an.
onLoadMore(() => void)Wird aufgerufen, um die nächsten Zeilen zu laden.
onRetry(() => void)Zeigt einen Button „Erneut versuchen“, wenn das Laden fehlschlug.
onRowClick((row: T) => void)Wird beim Klick auf eine Zeile aufgerufen; die Zeilen zeigen dann, dass sie sich öffnen lassen.
onSelectionChange((selection: RowSelectionState) => void)Wird mit den ausgewählten Zeilen aufgerufen.
onSortingChange((sorting: SortingState) => void)Wird mit der neuen Sortierung aufgerufen.
refRef<HTMLDivElement>Eine Ref auf das äußere Element.
rowMenu((row: T) => ReactNode)Einträge für das Kontextmenü einer Zeile (Rechtsklick).
selectablebooleanErgänzt jede Zeile um ein Kontrollkästchen.
selectionRowSelectionStateDie ausgewählten Zeilen, bei gesteuerter Auswahl.
sortingSortingStateDie Sortierung, bei gesteuerter Sortierung.
stickyFirstColumnbooleanHält die erste Spalte beim seitlichen Scrollen sichtbar.
virtualizeAbovenumberAb dieser Zeilenzahl werden nur die sichtbaren Zeilen gerendert.