import React from 'react'; import type { BaseTableColumn } from '../BaseTable/types'; export interface DataTableColumn extends BaseTableColumn { filterable?: boolean; filterType?: 'text' | 'select' | 'date' | 'number'; filterOptions?: Array<{ label: string; value: string | number; }>; editable?: boolean; onCellEdit?: (value: any, row: TData, columnKey: string) => void; children?: DataTableColumn[]; } export interface RowAction { label: string; icon?: React.ReactNode; onClick: (row: TData, index: number) => void; disabled?: (row: TData) => boolean; variant?: 'primary' | 'secondary' | 'danger' | 'default'; renderButton: (props: { label: string; icon?: React.ReactNode; onClick: (e: React.MouseEvent) => void; disabled: boolean; variant?: 'primary' | 'secondary' | 'danger' | 'default'; row: TData; index: number; }) => React.ReactNode; } export interface BulkAction { label: string; icon?: React.ReactNode; onClick: (selectedRows: TData[]) => void; disabled?: (selectedRows: TData[]) => boolean; variant?: 'primary' | 'secondary' | 'danger' | 'default'; renderButton: (props: { label: string; icon?: React.ReactNode; onClick: (e: React.MouseEvent) => void; disabled: boolean; variant?: 'primary' | 'secondary' | 'danger' | 'default'; selectedRows: TData[]; }) => React.ReactNode; } export interface DataTableProps { columns: DataTableColumn[]; data: TData[]; striped?: boolean; hoverable?: boolean; bordered?: boolean; compact?: boolean; density?: 'comfortable' | 'standard' | 'compact' | 'spacious'; caption?: string; captionPosition?: 'top' | 'bottom'; emptyText?: string; emptyState?: React.ReactNode; className?: string; stickyHeader?: boolean; virtualized?: boolean; virtualizedRowHeight?: number; height?: string | number; sortable?: boolean; onSort?: (key: string, direction: 'asc' | 'desc') => void; pagination?: { enabled: boolean; pageSize?: number; component?: React.ReactNode; currentPage?: number; onPageChange?: (page: number) => void; }; loading?: React.ReactNode; rowGroups?: Array<{ title?: string; startIndex: number; endIndex: number; renderTitle?: (group: { title?: string; startIndex: number; endIndex: number; }) => React.ReactNode; }>; headerRenderer?: () => React.ReactNode; footerRenderer?: () => React.ReactNode; footer?: Array<{ key: string; label?: string; render: (columns: DataTableColumn[]) => React.ReactNode; }>; rowSelection?: { enabled: boolean; mode?: 'single' | 'multiple'; selectedRowKeys?: (string | number)[]; onSelectionChange?: (selectedRowKeys: (string | number)[], selectedRows: TData[]) => void; getRowId?: (row: TData, index: number) => string | number; renderCheckbox?: (row: TData, index: number, isSelected: boolean) => React.ReactNode; }; filterable?: boolean; filters?: Record; onFilterChange?: (filters: Record) => void; rowActions?: RowAction[]; actionsColumnWidth?: string; bulkActions?: BulkAction[]; onRowClick?: (row: TData, index: number) => void; renderCheckbox: (props: { checked: boolean; indeterminate?: boolean; onChange: (checked: boolean) => void; onClick?: (e: React.MouseEvent) => void; disabled?: boolean; ariaLabel: string; type: 'checkbox' | 'radio'; }) => React.ReactNode; renderInput: (props: { type: 'text' | 'number' | 'date'; value: string; onChange: (value: string) => void; placeholder?: string; ariaLabel: string; }) => React.ReactNode; renderSelect: (props: { value: string; onChange: (value: string) => void; options: Array<{ label: string; value: string | number; }>; ariaLabel: string; }) => React.ReactNode; ariaLabel?: string; ariaLabelledBy?: string; ariaDescribedBy?: string; [key: string]: any; }