Raju2024's picture
Upload 1072 files
e3278e4 verified
import React from 'react';
import {
Table,
TableBody,
TableCell,
TableHead,
TableHeaderCell,
TableRow,
Text,
Badge,
Icon,
Button,
Card,
} from "@tremor/react";
import { Tooltip } from "antd";
interface Column {
header: string;
accessor: string;
cellRenderer?: (value: any, row: any) => React.ReactNode;
width?: string;
style?: React.CSSProperties;
}
interface Action<T = any> {
icon?: React.ComponentType<any>;
onClick: (item: T) => void;
condition?: () => boolean;
tooltip?: string;
}
interface DeleteModalProps {
isOpen: boolean;
onConfirm: () => void;
onCancel: () => void;
title: string;
message: string;
}
interface DataTableProps {
data: any[];
columns: Column[];
actions?: Action[];
emptyMessage?: string;
deleteModal?: DeleteModalProps;
}
const DataTable: React.FC<DataTableProps> = ({
data,
columns,
actions,
emptyMessage = "No data available",
deleteModal
}) => {
const renderCell = (column: Column, row: any) => {
const value = row[column.accessor];
if (column.cellRenderer) {
return column.cellRenderer(value, row);
}
// Default cell rendering based on value type
if (Array.isArray(value)) {
return (
<div style={{ display: "flex", flexDirection: "column" }}>
{value.length === 0 ? (
<Badge size="xs" className="mb-1" color="red">
<Text>None</Text>
</Badge>
) : (
value.map((item: any, index: number) => (
<Badge
key={index}
size="xs"
className="mb-1"
color="blue"
>
<Text>
{String(item).length > 30
? `${String(item).slice(0, 30)}...`
: item}
</Text>
</Badge>
))
)}
</div>
);
}
return value?.toString() || '';
};
return (
<Card className="w-full mx-auto flex-auto overflow-y-auto max-h-[40vh]">
<Table>
<TableHead>
<TableRow>
{columns.map((column, index) => (
<TableHeaderCell key={index}>{column.header}</TableHeaderCell>
))}
{actions && actions.length > 0 && (
<TableHeaderCell>Actions</TableHeaderCell>
)}
</TableRow>
</TableHead>
<TableBody>
{data && data.length > 0 ? (
data.map((row, rowIndex) => (
<TableRow key={rowIndex}>
{columns.map((column, colIndex) => (
<TableCell
key={colIndex}
style={{
maxWidth: column.width || "4px",
whiteSpace: "pre-wrap",
overflow: "hidden",
...column.style
}}
>
{column.accessor === 'id' ? (
<Tooltip title={row[column.accessor]}>
{renderCell(column, row)}
</Tooltip>
) : (
renderCell(column, row)
)}
</TableCell>
))}
{actions && actions.length > 0 && (
<TableCell>
{actions.map((action, actionIndex) => (
// @ts-ignore
action.condition?.(row) !== false && (
<Tooltip key={actionIndex} title={action.tooltip}>
<Icon
// @ts-ignore
icon={action.icon}
size="sm"
onClick={() => action.onClick(row)}
className="cursor-pointer mx-1"
/>
</Tooltip>
)
))}
</TableCell>
)}
</TableRow>
))
) : (
<TableRow>
<TableCell colSpan={columns.length + (actions ? 1 : 0)}>
<Text className="text-center">{emptyMessage}</Text>
</TableCell>
</TableRow>
)}
</TableBody>
</Table>
</Card>
);
};
export default DataTable;
export type { Action, Column, DataTableProps, DeleteModalProps };