adizen-tanstack-table
Version:
Enhanced DataTable with TanStack Table
181 lines (180 loc) • 5.27 kB
TypeScript
import { type Column } from "@tanstack/react-table";
export type SubRowsCellContext<T> = {
getValue: () => unknown;
row: {
original: T;
};
};
export interface ColumnConfig<T> {
id: string;
header: string;
accessorKey?: keyof T;
accessorFn?: (row: T) => string | number | boolean | Date | React.ReactNode;
cell?: (ctx: SubRowsCellContext<T>) => React.ReactNode;
enableSorting?: boolean;
enableColumnFilter?: boolean;
filterType?: "text" | "select" | "date" | "number" | "multi-select";
filterOptions?: FilterOption[];
enableMultiSelect?: boolean;
enableGlobalFilter?: boolean;
enableEditing?: boolean;
editType?: "text" | "select" | "date" | "number";
editOptions?: FilterOption[];
onCellEdit?: (value: string | number | boolean | Date, rowData: T) => Promise<void> | void;
size?: number;
skeleton?: {
width?: string;
height?: string;
};
serverFilterKey?: string;
serverSortKey?: string;
exportConfig?: {
exportValueFn?: (row: any) => string | number | boolean | Date | any;
excludeFromExport?: boolean;
exportHeader?: string;
formatForExport?: (value: any) => string;
};
}
export interface ServerSideConfig<T> {
enabled: boolean;
onDataRequest: (params: ServerSideParams, identifier?: boolean) => Promise<ServerSideResponse<T>>;
totalCount?: number;
loading?: boolean;
debounceMs?: number;
}
export interface ServerSideParams {
page: number;
limit: number;
sortBy?: string;
sortOrder?: "asc" | "desc";
[key: string]: string | number | string[] | undefined;
dateField?: string;
dateRange?: string;
startDate?: string;
endDate?: string;
}
export interface ServerSideResponse<T> {
success: boolean;
message: string;
data: T[];
meta: {
total: number;
page: number;
limit: number;
totalPages: number;
};
}
export interface FilterOption {
label: string;
value: string | number;
}
export interface ColumnFilterProps<T> {
column: Column<T, any>;
filterType?: string;
filterOptions?: FilterOption[];
theme: TableTheme;
serverSide?: boolean;
debounceMs?: number;
onServerFilterChange?: (columnId: string, value: any) => void;
}
export interface ViewState {
id: string;
name: string;
columnVisibility: Record<string, boolean>;
pageSize: number;
isDefault?: boolean;
}
export interface BatchedExportConfig {
enabled: boolean;
threshold?: number;
batchSize?: number;
batchDelay?: number;
maxConcurrentBatches?: number;
shouldUseBatchedExport?: (totalCount: number) => boolean;
}
export declare const DEFAULT_BATCHED_EXPORT_CONFIG: BatchedExportConfig;
export interface EnhancedDataTableProps<T> {
data?: T[];
columns: ColumnConfig<T>[];
loading?: boolean;
skeletonRows?: number;
emptyMessage?: string;
onRowClick?: (item: T) => void;
selectedRowId?: number;
enableGlobalSearch?: boolean;
enableColumnVisibility?: boolean;
enablePagination?: boolean;
enableCSVExport?: boolean;
batchedExportConfig?: BatchedExportConfig;
enableDateRangeFilter?: boolean;
dateFilterField?: string;
enableCustomDateRangeFilter?: boolean;
globalSearchPlaceholder?: string;
initialPageSize?: number;
pageSizeOptions?: number[];
enableCustomViews?: boolean;
viewStorageKey?: string;
onViewChange?: (view: ViewState) => void;
hasSubRows?: boolean;
getSubRows?: (item: T) => any[];
subRowsColumns?: ColumnConfig<any>[];
expandedItems?: Set<number>;
onToggleExpand?: (id: number) => void;
getRowId?: (row: T) => number | string;
theme?: "light" | "dark" | TableTheme;
customTheme?: Partial<TableTheme>;
serverSide?: ServerSideConfig<T>;
}
export interface ExportProgress {
isExporting: boolean;
stage: "preparing" | "fetching" | "processing" | "generating" | "complete" | "error";
totalBatches: number;
completedBatches: number;
currentBatch: number;
totalRecords: number;
processedRecords: number;
startTime?: number;
estimatedTimeRemaining?: number;
totalExportTime?: number;
error?: string;
}
export interface ServerSideState {
currentPage: number;
pageSize: number;
filters: Record<string, any>;
sorting: {
field: string | null;
direction: "asc" | "desc" | null;
};
dateRange: {
field: string | null;
range: string;
startDate: string | null;
endDate: string | null;
};
}
export interface TableTheme {
tableShadow?: string;
headerBg?: string;
headerText?: string;
rowEvenBg?: string;
rowOdd?: string;
rowHover?: string;
rowText?: string;
subRowEvenBg?: string;
subRowOddBg?: string;
subRowHover?: string;
subRowText?: string;
buttonPrimaryBg?: string;
buttonPrimaryText?: string;
buttonPrimaryBorder?: string;
buttonPrimaryHover?: string;
buttonSecondaryBg?: string;
buttonSecondaryText?: string;
buttonSecondaryBorder?: string;
buttonSecondaryHover?: string;
}
export declare const tableThemes: {
light: TableTheme;
dark: TableTheme;
};