@ackplus/react-tanstack-data-table
Version:
A powerful React data table component built with MUI and TanStack Table
115 lines (114 loc) • 3.99 kB
TypeScript
import { Row, SortingState, ColumnResizeMode, ColumnPinningState, RowData } from '@tanstack/react-table';
import { ReactNode } from 'react';
import type { CustomColumnFilterState, TableFilters, TableState } from '../../types';
import { DataTableColumn } from '../../types';
import { DataTableSlots, PartialSlotProps } from '../../types/slots.types';
import { DataTableSize } from '../../utils/table-helpers';
import { SelectionState } from '../../features/custom-selection.feature';
export type SelectMode = 'page' | 'all';
declare module '@tanstack/table-core' {
interface ColumnMeta<TData extends RowData, TValue> {
}
}
export interface DataTableProps<T> {
columns: DataTableColumn<T>[];
data?: T[];
totalRow?: number;
idKey?: keyof T;
extraFilter?: ReactNode | null;
footerFilter?: ReactNode | null;
dataMode?: 'client' | 'server';
initialState?: Partial<TableState>;
initialLoadData?: boolean;
onDataStateChange?: (filters: Partial<TableState>) => void;
onFetchData?: (filters: Partial<TableFilters>) => Promise<{
data: T[];
total: number;
}>;
exportFilename?: string;
onExportProgress?: (progress: {
processedRows: number;
totalRows: number;
percentage: number;
}) => void;
onExportComplete?: (result: {
success: boolean;
filename: string;
totalRows: number;
}) => void;
onExportError?: (error: {
message: string;
code: string;
}) => void;
onServerExport?: (filters?: Partial<TableState>, selection?: SelectionState) => Promise<{
data: any[];
total: number;
}>;
onExportCancel?: () => void;
enableRowSelection?: boolean | ((row: Row<T>) => boolean);
enableMultiRowSelection?: boolean;
selectMode?: SelectMode;
isRowSelectable?: (params: {
row: T;
id: string;
}) => boolean;
onRowSelectionChange?: (selectedRows: T[], selection?: SelectionState) => void;
onSelectionChange?: (selection: SelectionState) => void;
enableBulkActions?: boolean;
bulkActions?: (selectionState: SelectionState) => ReactNode;
enableColumnResizing?: boolean;
columnResizeMode?: ColumnResizeMode;
enableColumnDragging?: boolean;
onColumnDragEnd?: (columnOrder: string[]) => void;
enableColumnPinning?: boolean;
onColumnPinningChange?: (pinning: ColumnPinningState) => void;
enableExpanding?: boolean;
getRowCanExpand?: (row: Row<T>) => boolean;
renderSubComponent?: (row: Row<T>) => ReactNode;
enablePagination?: boolean;
paginationMode?: 'client' | 'server';
enableGlobalFilter?: boolean;
enableColumnFilter?: boolean;
filterMode?: 'client' | 'server';
enableSorting?: boolean;
sortingMode?: 'client' | 'server';
onSortingChange?: (sorting: SortingState) => void;
enableHover?: boolean;
enableStripes?: boolean;
tableContainerProps?: any;
tableProps?: any;
fitToScreen?: boolean;
tableSize?: DataTableSize;
enableStickyHeaderOrFooter?: boolean;
maxHeight?: string | number;
enableVirtualization?: boolean;
estimateRowHeight?: number;
enableColumnVisibility?: boolean;
enableTableSizeControl?: boolean;
enableExport?: boolean;
enableReset?: boolean;
loading?: boolean;
emptyMessage?: string;
skeletonRows?: number;
onColumnFiltersChange?: (filterState: CustomColumnFilterState) => void;
onDataChange?: (data: T[]) => void;
selectionColumn?: {
width?: number;
pinLeft?: boolean;
customColumn?: DataTableColumn<any>;
id?: string;
};
actionColumn?: {
pinRight?: boolean;
customColumn?: DataTableColumn<any>;
id?: string;
};
expandingColumn?: {
width?: number;
pinLeft?: boolean;
customColumn?: DataTableColumn<any>;
id?: string;
};
slots?: Partial<DataTableSlots<T>>;
slotProps?: PartialSlotProps<T>;
}