UNPKG

adizen-tanstack-table

Version:

Enhanced DataTable with TanStack Table

181 lines (180 loc) 5.27 kB
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; };