| import { |
| Table, |
| TableBody, |
| TableCaption, |
| TableCell, |
| TableHead, |
| TableHeader, |
| TableRow, |
| } from "@/components/ui/table" |
| import { Skeleton } from "@/components/ui/skeleton" |
|
|
| interface TableData { |
| [key: string]: string | number; |
| } |
|
|
| interface TableProps { |
| data: TableData[] | undefined; |
| caption?: string; |
| } |
|
|
| export function GenericTable({ data, caption }: TableProps) { |
| const headers = data && data.length > 0 ? ['#', ...Object.keys(data[0])] : []; |
| const isLoading = !data; |
| const isEmpty = data && data.length === 0; |
|
|
| const renderSkeleton = (count: number) => ( |
| [...Array(count)].map((_, index) => ( |
| <TableCell key={index}> |
| <Skeleton className="h-4 w-full" /> |
| </TableCell> |
| )) |
| ); |
|
|
| const renderHeaders = () => headers.map((header, index) => ( |
| <TableHead |
| key={header} |
| className={`${index === 0 ? 'text-right' : 'text-left'} text-black font-bold`} |
| > |
| {header.toUpperCase()} |
| </TableHead> |
| )); |
|
|
| const renderRows = () => { |
| if (isLoading) { |
| return [...Array(10)].map((_, index) => <TableRow key={index}>{renderSkeleton(5)}</TableRow>); |
| } |
| if (isEmpty) { |
| return ( |
| <TableRow> |
| <TableCell colSpan={headers.length || 1} className="text-center py-4"> |
| No results found |
| </TableCell> |
| </TableRow> |
| ); |
| } |
| return data.map((row, index) => ( |
| <TableRow key={index}> |
| <TableCell className="text-right font-medium">{index + 1}</TableCell> |
| {Object.entries(row).map(([key, value]) => ( |
| <TableCell |
| key={`${index}-${key}`} |
| className={key.toLowerCase().includes('amount') ? 'text-right' : ''} |
| > |
| {value} |
| </TableCell> |
| ))} |
| </TableRow> |
| )); |
| }; |
|
|
| return ( |
| <Table> |
| {caption && <TableCaption>{caption}</TableCaption>} |
| <TableHeader> |
| <TableRow> |
| {isLoading ? renderSkeleton(5) : isEmpty ? null : renderHeaders()} |
| </TableRow> |
| </TableHeader> |
| <TableBody> |
| {renderRows()} |
| </TableBody> |
| </Table> |
| ); |
| } |
|
|