mirror of
https://github.com/Tria-plc/edr-platform.git
synced 2026-09-07 18:55:42 +00:00
53 lines
1.6 KiB
TypeScript
53 lines
1.6 KiB
TypeScript
import { ReactNode } from 'react';
|
|
|
|
interface Column<T> {
|
|
key: string;
|
|
label: string;
|
|
render?: (item: T) => ReactNode;
|
|
}
|
|
|
|
interface TableProps<T> {
|
|
data: T[];
|
|
columns: Column<T>[];
|
|
onRowClick?: (item: T) => void;
|
|
}
|
|
|
|
export default function Table<T extends Record<string, any>>({ data, columns, onRowClick }: TableProps<T>) {
|
|
return (
|
|
<div className="overflow-x-auto">
|
|
<table className="w-full">
|
|
<thead className="bg-gray-50 dark:bg-gray-800">
|
|
<tr>
|
|
{columns.map((column) => (
|
|
<th
|
|
key={column.key}
|
|
className="px-6 py-3 text-left text-xs font-medium uppercase tracking-wider text-gray-500 dark:text-gray-400"
|
|
>
|
|
{column.label}
|
|
</th>
|
|
))}
|
|
</tr>
|
|
</thead>
|
|
<tbody className="divide-y divide-gray-200 dark:divide-gray-700 bg-white dark:bg-gray-900">
|
|
{data.map((item, index) => (
|
|
<tr
|
|
key={item.id || index}
|
|
onClick={() => onRowClick?.(item)}
|
|
className={onRowClick ? 'cursor-pointer hover:bg-gray-50 dark:hover:bg-gray-800' : ''}
|
|
>
|
|
{columns.map((column) => (
|
|
<td key={column.key} className="whitespace-nowrap px-6 py-4 text-sm text-gray-900 dark:text-gray-100">
|
|
{column.render ? column.render(item) : item[column.key]}
|
|
</td>
|
|
))}
|
|
</tr>
|
|
))}
|
|
</tbody>
|
|
</table>
|
|
{data.length === 0 && (
|
|
<div className="py-12 text-center text-gray-500 dark:text-gray-400">No data available</div>
|
|
)}
|
|
</div>
|
|
);
|
|
}
|