"use client"; import type { ReactNode } from "react"; import { ArrowDown, ArrowUp, ArrowUpDown } from "lucide-react"; import { Button } from "@/components/ui/button"; export type DataTableColumn = { key: string; label: string; sortable?: boolean; className?: string; render: (row: T) => ReactNode; }; type Props = { columns: DataTableColumn[]; rows: T[]; rowKey: (row: T) => string | number; sortKey: string; sortDirection: "asc" | "desc"; loading?: boolean; error?: string; emptyTitle: string; emptyDescription: string; onSort: (key: string) => void; }; export default function DataTable({ columns, rows, rowKey, sortKey, sortDirection, loading = false, error, emptyTitle, emptyDescription, onSort, }: Props) { return (
{columns.map((column) => { const active = sortKey === column.key; const SortIcon = active ? sortDirection === "asc" ? ArrowUp : ArrowDown : ArrowUpDown; return ( ); })} {loading && ( )} {!loading && error && ( )} {!loading && !error && rows.length === 0 && ( )} {!loading && !error && rows.map((row) => ( {columns.map((column) => ( ))} ))}
{column.sortable ? ( ) : ( column.label )}
Daten werden geladen...
{error}

{emptyTitle}

{emptyDescription}

{column.render(row)}
); }