import type { RenderableContent } from '@adam-sv/arc'; import { RefObject, type JSX } from 'react'; export interface ITableProps { className?: string; rowClassNameGenerator?: (rowModel: IRow) => string; data: T[]; columnDefinitions: IColumnDefinition[]; pageSize?: number; onClickRow?: (params: IRowEventParams) => unknown; onClickRowContextMenu?: (params: IRowEventParams) => unknown; onClickCell?: (params: ICellEventParams) => unknown; onHoverCell?: (params: ICellEventParams) => unknown; onMouseLeaveCell?: (params: ICellEventParams) => unknown; onHoverColumnHeader?: (params: IHeaderEventParams) => unknown; onClickColumnHeader?: (params: IHeaderEventParams) => unknown; onTableSortChanged?: TableSortEvent; onMouseLeaveColumnHeader?: (params: IHeaderEventParams) => unknown; highlightOnHover?: TableCellHighlightScheme; domRef?: RefObject; defaultSortBy?: { columnTitle: string; direction?: 'asc' | 'desc'; }; } export declare type TableCellHighlightScheme = 'horizontal' | 'vertical' | 'vertical horizontal' | 'horizontal vertical'; export interface ICellEventParams { event: React.MouseEvent; cellModel: ICell; } export interface IHeaderEventParams { event: React.MouseEvent; columnDefinition: IKeyedColumnDefinition; columnIndex: number; cellHighlight: ICellHighlight; eventHandlers: ITableEventHandlers; eventHooks: ITableEventHooks; columnSort: IColumnSort; } export interface IRowEventParams { event: React.MouseEvent; rowModel: IRow; } export interface ITableEventHandlers { didClickRow?: (params: IRowEventParams) => void; didClickRowContextMenu?: (params: IRowEventParams) => void; didClickCell?: (params: ICellEventParams) => void; didHoverCell?: (params: ICellEventParams) => void; didMouseLeaveCell?: (params: ICellEventParams) => void; didHoverColumnHeader?: (params: IHeaderEventParams) => void; didClickColumnHeader?: (params: IHeaderEventParams) => void; didMouseLeaveColumnHeader?: (params: IHeaderEventParams) => void; } export type TableSortEvent = (key: string, direction: 'asc' | 'desc') => void; export interface ITableEventHooks { onTableSortChanged?: TableSortEvent; } export interface IColumnDefinition { title?: string | undefined; headerContentGenerator?: (column: IColumnDefinition) => RenderableContent; cellContentGenerator: (cellModel: ICell) => RenderableContent; cellClassNameGenerator?: (cellModel: ICell) => string; sortKeyGenerator?: (rowDatum: T) => number | string; width?: string; className?: string; headerClassName?: string; cellAlign?: 'left' | 'right' | 'center' | 'justify' | 'char'; cellVAlign?: 'middle' | 'top' | 'bottom' | 'baseline'; } export interface IKeyedColumnDefinition extends IColumnDefinition { key: string; index: number; } export interface ICell { datum: T; columnDefinition: IKeyedColumnDefinition; rowIndex: number; columnIndex: number; tableRef: RefObject; rowHeight: number | undefined; setRowHeight: (height: number) => void; cellHighlight: ICellHighlight; eventHandlers: ITableEventHandlers; } export interface IRow { datum: T; rowIndex: number; columnDefinitions: IKeyedColumnDefinition[]; cellHighlight: ICellHighlight; eventHandlers: ITableEventHandlers; tableRef: RefObject; rowClassNameGenerator?: (rowModel: IRow) => string; } export interface ICellHighlight { highlightedRowIndex: number | undefined; setHighlightedRowIndex: (rowIndex: number | undefined) => void; highlightedColumnIndex: number | undefined; setHighlightedColumnIndex: (rowIndex: number | undefined) => void; highlightScheme?: TableCellHighlightScheme; } export interface IColumnSort { sortDirections: Record; setSortDirections: (direction: Record) => void; sortByColumn: IKeyedColumnDefinition | undefined; setSortByColumn: (column: IKeyedColumnDefinition | undefined) => void; resetPaging: () => void; } export interface IPage { id: string; pageIndex: number; data: T[]; pageHeightMap: Map; setPageHeightMap: (map: Map) => void; rowElements?: JSX.Element[]; } export interface ITableScrollParams { event?: React.UIEvent; pageIndex: number; pages: IPage[]; scrollContainerRef: RefObject; topSpacerHeight: number; hasNextPage: boolean; setPageIndex: (pageIndex: number) => void; }