import type { ColumnDef } from '@tanstack/react-table' import type { GriddyColumn, SelectionConfig } from './types' import { DEFAULTS, SELECTION_COLUMN_ID, SELECTION_COLUMN_SIZE } from './constants' /** * Retrieves the original GriddyColumn from a TanStack column's meta. */ export function getGriddyColumn(column: { columnDef: ColumnDef }): GriddyColumn | undefined { return (column.columnDef.meta as { griddy?: GriddyColumn })?.griddy } /** * Maps Griddy's user-facing GriddyColumn definitions to TanStack Table ColumnDef[]. * Optionally prepends a selection checkbox column. */ export function mapColumns( columns: GriddyColumn[], selection?: SelectionConfig, ): ColumnDef[] { const mapped: ColumnDef[] = columns.map((col) => { const isStringAccessor = typeof col.accessor !== 'function' const def: ColumnDef = { id: col.id, // Use accessorKey for string keys (enables TanStack auto-detection of sort/filter), // accessorFn for function accessors ...(isStringAccessor ? { accessorKey: col.accessor as string } : { accessorFn: col.accessor as (row: T) => unknown }), enableColumnFilter: col.filterable ?? false, enableHiding: true, enableResizing: true, enableSorting: col.sortable ?? true, header: () => col.header, maxSize: col.maxWidth ?? DEFAULTS.maxColumnWidth, meta: { griddy: col }, minSize: col.minWidth ?? DEFAULTS.minColumnWidth, size: col.width, // For function accessors, TanStack can't auto-detect the sort type, so default to 'auto' sortingFn: col.sortFn ?? (isStringAccessor ? undefined : 'auto') as any, } if (col.filterFn) def.filterFn = col.filterFn return def }) // Prepend checkbox column if selection is enabled if (selection && selection.mode !== 'none' && selection.showCheckbox !== false) { const checkboxCol: ColumnDef = { cell: 'select-row', // Rendered by TableCell with actual checkbox enableColumnFilter: false, enableHiding: false, enableResizing: false, enableSorting: false, header: selection.mode === 'multi' ? 'select-all' // Rendered by TableHeader with actual checkbox : '', id: SELECTION_COLUMN_ID, size: SELECTION_COLUMN_SIZE, } mapped.unshift(checkboxCol) } return mapped }