import React from 'react'; import { MagnifyingGlassIcon } from '@heroicons/react/24/outline'; export interface Column { key: string; header: string; render?: (row: T) => React.ReactNode; sortable?: boolean; } interface Props { columns: Column[]; data: T[]; loading?: boolean; searchValue?: string; onSearchChange?: (v: string) => void; searchPlaceholder?: string; actions?: (row: T) => React.ReactNode; emptyMessage?: string; emptyAction?: React.ReactNode; } function SkeletonRow({ cols }: { cols: number }) { return ( {Array.from({ length: cols }).map((_, i) => (
))} ); } export default function DataTable({ columns, data, loading, searchValue, onSearchChange, searchPlaceholder = 'جستجو...', actions, emptyMessage = 'هیچ موردی یافت نشد', emptyAction, }: Props) { const allColumns = actions ? [...columns, { key: '__actions', header: 'اقدامات' }] : columns; return (
{onSearchChange !== undefined && (
onSearchChange(e.target.value)} placeholder={searchPlaceholder} className="w-full h-10 pr-9 pl-3 border border-gray-300 rounded-[10px] text-sm focus:outline-none focus:ring-2 focus:ring-primary-500 focus:border-transparent" />
)}
{allColumns.map((col) => ( ))} {loading ? ( Array.from({ length: 5 }).map((_, i) => ( )) ) : data.length === 0 ? ( ) : ( data.map((row, rowIdx) => ( {columns.map((col) => ( ))} {actions && ( )} )) )}
{col.header}

{emptyMessage}

{emptyAction}
{col.render ? col.render(row) : ((row as Record)[col.key] as React.ReactNode) ?? '—'}
{actions(row)}
); }