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; className?: string; } 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; headerExtra?: 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, headerExtra, }: Props) { const allColumns = actions ? [...columns, { key: '__actions', header: 'اقدامات', className: 'w-[120px]' }] : columns; return (
{/* Toolbar row */} {(onSearchChange !== undefined || headerExtra) && (
{onSearchChange !== undefined && (
onSearchChange(e.target.value)} placeholder={searchPlaceholder} />
)} {headerExtra && <>{headerExtra}}
)}
{allColumns.map((col) => ( ))} {loading ? ( Array.from({ length: 6 }).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)}
); }