import type { ComponentProps } from 'react'; import type { SortingFn, NoInfer, SortingState, Row, ExpandedState } from '@tanstack/react-table'; export type NvDatatableMode = 'client' | 'server'; export type NvDatatableProps = { mode?: NvDatatableMode; columns?: Array>; rows: Array; pagination?: NvDatatablePaginationConfig; sorting?: NvDatatableSortingConfig; filtering?: NvDatatableFilteringConfig; selection?: NvDatatableSelectionConfigWithMode; onRowClick?: (args: NvDatatableRowClickEventArgs) => void; renderPagination?: (api: NvDatatableRenderPaginationAPI) => React.ReactNode; renderFiltering?: (api: NvDatatableRenderFilteringAPI) => React.ReactNode; expandable?: NvDatatableExpandableConfig; stickyHeader?: boolean; suppressHydrationWarning?: boolean; } & Pick, 'className' | 'style'>; export interface NvDatatableRowClickEventArgs { row: T; rowIndex: number; } export type NvDatatableSelectionMode = 'none' | 'single' | 'multiple'; export interface NvDatatableSelectionConfig { mode?: NvDatatableSelectionMode; getRowId?: (row: T) => string; selectedRowIds?: Set; initialSelectedRowIds?: Set; onSelectionChange?: (selectedRowIds: Set) => void; enableSelectAll?: boolean; deselectOnFilter?: boolean; checkboxColumnWidth?: number; } export type NvDatatableSelectionConfigWithMode = (NvDatatableSelectionConfig & { mode?: 'none'; }) | (NvDatatableSelectionConfig & { mode: Exclude; getRowId: (row: T) => string; }); export type NvDatatableColumnAlign = 'left' | 'center' | 'right'; export interface NvDatatableColumn { field: K; headerName?: string; width?: number; align?: NvDatatableColumnAlign; resizable?: boolean; hidden?: boolean; valueFormatter?: (params: NvTableValueFormatterParams) => F; renderCell?: (params: NvTableRenderCellParams) => React.ReactNode; renderHeader?: (params: NvTableRenderHeaderParams) => React.ReactNode; sortable?: boolean; sortingFn?: SortingFn | string; sortDescFirst?: boolean; invertSorting?: boolean; sortUndefined?: 'first' | 'last' | false | -1 | 1; } export interface NvTableRenderHeaderParams { headerName: string; field: Field; } export interface NvTableRenderCellParams { value: Value | NoInfer; row: Row; field: Field; rowIndex: number; } export interface NvTableValueFormatterParams { value: Value; row: Row; field: Field; } export interface NvDatatablePaginationConfig { infinite?: boolean; initialPageSize?: number; pageSizeOptions?: number[]; labels?: { page?: string; total?: string; pageSizeOption?: string; }; totalRowCount?: number; totalPageCount?: number; onPaginationChange?: (state: { pageIndex: number; pageSize: number; }) => void; hasMore?: boolean; isLoading?: boolean; loadMoreThreshold?: number; onLoadMore?: () => void; } export interface NvDatatableRenderPaginationAPI { pageIndex: number; pageSize: number; pageCount: number; rowCount: number; firstPage: () => void; previousPage: () => void; nextPage: () => void; lastPage: () => void; setPageIndex: (index: number) => void; setPageSize: (size: number) => void; canPreviousPage: boolean; canNextPage: boolean; isLoading?: boolean; hasMore?: boolean; } export type NvDataTableSortingState = SortingState; export interface NvDatatableSortingConfig { enableMultiSort?: boolean; enableSortingRemoval?: boolean; maxMultiSortColCount?: number; sortDescFirst?: boolean; initialSortState?: NvDataTableSortingState; sortState?: NvDataTableSortingState; onSortingChange?: (sorting: SortingState) => void; } export interface NvDatatableFilteringConfig { filterState?: unknown; onFilterChange?: (filterState: unknown) => void; globalFilterFn?: (row: Row, columnId: string, filterValue: unknown) => boolean; debounceMs?: number; } export interface NvDatatableRenderFilteringAPI { filterState: unknown; setGlobalFilter: (value: unknown) => void; resetFilters: () => void; totalRows: number; filteredRows: number; } export interface NvDatatableExpandableConfig { renderExpandedContent: (params: NvDatatableExpandedContentParams) => React.ReactNode | null | undefined; collapsible?: boolean; expandedState?: ExpandedState; onExpandedChange?: (expandedState: ExpandedState) => void; getRowCanExpand?: (row: T) => boolean; toggleColumnWidth?: number; } export interface NvDatatableExpandedContentParams { row: T; rowIndex: number; } export type { ExpandedState };