2023-05-02 06:42:16 +00:00
|
|
|
import { Fragment, PropsWithChildren } from 'react';
|
|
|
|
import { Row } from '@tanstack/react-table';
|
2022-04-19 18:43:36 +00:00
|
|
|
|
|
|
|
interface Props<T extends Record<string, unknown> = Record<string, unknown>> {
|
|
|
|
isLoading?: boolean;
|
|
|
|
rows: Row<T>[];
|
|
|
|
emptyContent?: string;
|
2023-05-02 06:42:16 +00:00
|
|
|
renderRow(row: Row<T>): React.ReactNode;
|
2022-04-19 18:43:36 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
export function TableContent<
|
|
|
|
T extends Record<string, unknown> = Record<string, unknown>
|
|
|
|
>({
|
|
|
|
isLoading = false,
|
|
|
|
rows,
|
|
|
|
emptyContent = 'No items available',
|
|
|
|
renderRow,
|
|
|
|
}: Props<T>) {
|
|
|
|
if (isLoading) {
|
|
|
|
return <TableContentOneColumn>Loading...</TableContentOneColumn>;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!rows.length) {
|
|
|
|
return <TableContentOneColumn>{emptyContent}</TableContentOneColumn>;
|
|
|
|
}
|
|
|
|
|
|
|
|
return (
|
|
|
|
<>
|
2023-05-02 06:42:16 +00:00
|
|
|
{rows.map((row) => (
|
|
|
|
<Fragment key={row.id}>{renderRow(row)}</Fragment>
|
|
|
|
))}
|
2022-04-19 18:43:36 +00:00
|
|
|
</>
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
function TableContentOneColumn({ children }: PropsWithChildren<unknown>) {
|
|
|
|
// using MAX_SAFE_INTEGER to make sure the single column will be the size of the table
|
|
|
|
return (
|
|
|
|
<tr>
|
2023-02-12 21:04:24 +00:00
|
|
|
<td colSpan={Number.MAX_SAFE_INTEGER} className="text-muted text-center">
|
2022-04-19 18:43:36 +00:00
|
|
|
{children}
|
|
|
|
</td>
|
|
|
|
</tr>
|
|
|
|
);
|
|
|
|
}
|