Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion packages/table-core/src/core/columns/constructColumn.ts
Original file line number Diff line number Diff line change
Expand Up @@ -112,7 +112,7 @@ export function constructColumn<
column.columnDef = resolvedColumnDef as ColumnDef<TFeatures, TData, TValue>
column.columns = []
column.depth = depth
column.id = `${String(id)}`
column.id = '' + id
column.parent = parent

// Initialize instance-specific data for features that need it
Expand Down
123 changes: 81 additions & 42 deletions packages/table-core/src/core/columns/coreColumnsFeature.utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,9 @@ export function column_getFlatColumns<
>(
column: Column<TFeatures, TData, TValue>,
): Array<Column<TFeatures, TData, TValue>> {
return [column, ...column.columns.flatMap((col) => col.getFlatColumns())]
const arr = column.columns.flatMap((col) => col.getFlatColumns())
arr.unshift(column)
return arr
}

/**
Expand Down Expand Up @@ -65,6 +67,28 @@ export function column_getLeafColumns<
return [column]
}

const defaultColumnDef_header: Partial<
ColumnDef<any, any, unknown>
>['header'] = (props) => {
const resolvedColumnDef = props.header.column.columnDef as ColumnDefResolved<
{},
any
>

if (resolvedColumnDef.accessorKey) {
return resolvedColumnDef.accessorKey
}

if (resolvedColumnDef.accessorFn) {
return resolvedColumnDef.id
}

return null
}
const defaultColumnDef_cell: Partial<ColumnDef<any, any, unknown>>['cell'] = (
props,
) => props.renderValue<any>()?.toString?.() ?? null

/**
* Merges built-in, feature, and user default column definitions.
*
Expand All @@ -83,27 +107,59 @@ export function table_getDefaultColumnDef<
>(
table: Table_Internal<TFeatures, TData>,
): Partial<ColumnDef<TFeatures, TData, unknown>> {
return {
header: (props) => {
const resolvedColumnDef = props.header.column
.columnDef as ColumnDefResolved<{}, TData>
const defaultColumn = {
header: defaultColumnDef_header,
cell: defaultColumnDef_cell,
}

for (
let i = 0, features = Object.values(table._features);
i < features.length;
i++
) {
Object.assign(defaultColumn, features[i].getDefaultColumnDef?.())
}

return Object.assign(defaultColumn, table.options.defaultColumn)
}

const table_getAllColumns_recurseColumns = <
TFeatures extends TableFeatures,
TData extends RowData,
>(
table: Table_Internal<TFeatures, TData>,
colDefs: ReadonlyArray<ColumnDef<TFeatures, TData, unknown>>,
parent: Column<TFeatures, TData, unknown> | undefined,
depth: number,
): Array<Column<TFeatures, TData, unknown>> => {
const result: Array<Column<TFeatures, TData, unknown>> = new Array(
colDefs.length,
)

for (let i = 0; i < colDefs.length; i++) {
const columnDef = colDefs[i]!

if (resolvedColumnDef.accessorKey) {
return resolvedColumnDef.accessorKey
}
const column = constructColumn(table, columnDef, depth, parent)

if (resolvedColumnDef.accessorFn) {
return resolvedColumnDef.id
}
const groupingColumnDef = columnDef as GroupColumnDef<
TFeatures,
TData,
unknown
>

return null
},
cell: (props) => props.renderValue<any>()?.toString?.() ?? null,
...Object.values(table._features).reduce((obj, feature) => {
return Object.assign(obj, feature.getDefaultColumnDef?.())
}, {}),
...table.options.defaultColumn,
} as Partial<ColumnDef<TFeatures, TData, unknown>>
column.columns = groupingColumnDef.columns
? table_getAllColumns_recurseColumns(
table,
groupingColumnDef.columns,
column,
depth + 1,
)
: []

result[i] = column
}

return result
}

/**
Expand All @@ -123,29 +179,12 @@ export function table_getAllColumns<
>(
table: Table_Internal<TFeatures, TData>,
): Array<Column<TFeatures, TData, unknown>> {
const recurseColumns = (
colDefs: ReadonlyArray<ColumnDef<TFeatures, TData, unknown>>,
parent?: Column<TFeatures, TData, unknown>,
depth = 0,
): Array<Column<TFeatures, TData, unknown>> => {
return colDefs.map((columnDef) => {
const column = constructColumn(table, columnDef, depth, parent)

const groupingColumnDef = columnDef as GroupColumnDef<
TFeatures,
TData,
unknown
>

column.columns = groupingColumnDef.columns
? recurseColumns(groupingColumnDef.columns, column, depth + 1)
: []

return column
})
}

return recurseColumns(table.options.columns)
return table_getAllColumns_recurseColumns(
table,
table.options.columns,
undefined,
0,
)
}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,10 +23,7 @@ export function column_getFacetedMinMaxValues<
column: Column_Internal<TFeatures, TData, TValue>,
table: Table_Internal<TFeatures, TData>,
): [number, number] | undefined {
const facetedMinMaxValuesFn =
table.options.features.facetedMinMaxValues?.(table, column.id) ??
(() => undefined)
return facetedMinMaxValuesFn()
return table.options.features.facetedMinMaxValues?.(table, column.id)?.()
}

/**
Expand All @@ -49,10 +46,7 @@ export function column_getFacetedRowModel<
column: Column_Internal<TFeatures, TData, TValue> | undefined,
table: Table_Internal<TFeatures, TData>,
): RowModel<TFeatures, TData> {
const facetedRowModelFn =
table.options.features.facetedRowModel?.(table, column?.id ?? '') ??
(() => table.getPreFilteredRowModel())
return facetedRowModelFn()
return table.options.features.facetedRowModel?.(table, column?.id ?? '')?.() ?? table.getPreFilteredRowModel()
}

/**
Expand All @@ -74,10 +68,7 @@ export function column_getFacetedUniqueValues<
column: Column_Internal<TFeatures, TData, TValue>,
table: Table_Internal<TFeatures, TData>,
): Map<any, number> {
const facetedUniqueValuesFn =
table.options.features.facetedUniqueValues?.(table, column.id) ??
(() => new Map<any, number>())
return facetedUniqueValuesFn()
return table.options.features.facetedUniqueValues?.(table, column.id)?.() ?? new Map<any, number>()
}

/**
Expand All @@ -95,10 +86,7 @@ export function table_getGlobalFacetedMinMaxValues<
TFeatures extends TableFeatures,
TData extends RowData,
>(table: Table_Internal<TFeatures, TData>): undefined | [number, number] {
const facetedMinMaxValuesFn =
table.options.features.facetedMinMaxValues?.(table, '__global__') ??
(() => undefined)
return facetedMinMaxValuesFn()
return table.options.features.facetedMinMaxValues?.(table, '__global__')?.()
}

/**
Expand All @@ -117,10 +105,7 @@ export function table_getGlobalFacetedRowModel<
TFeatures extends TableFeatures,
TData extends RowData,
>(table: Table_Internal<TFeatures, TData>): RowModel<TFeatures, TData> {
const facetedRowModelFn =
table.options.features.facetedRowModel?.(table, '__global__') ??
(() => table.getPreFilteredRowModel())
return facetedRowModelFn()
return table.options.features.facetedRowModel?.(table, '__global__')?.() ?? table.getPreFilteredRowModel()
}

/**
Expand All @@ -138,8 +123,5 @@ export function table_getGlobalFacetedUniqueValues<
TFeatures extends TableFeatures,
TData extends RowData,
>(table: Table_Internal<TFeatures, TData>): Map<any, number> {
const facetedUniqueValuesFn =
table.options.features.facetedUniqueValues?.(table, '__global__') ??
(() => new Map())
return facetedUniqueValuesFn()
return table.options.features.facetedUniqueValues?.(table, '__global__')?.() ?? new Map()
}
Original file line number Diff line number Diff line change
Expand Up @@ -51,14 +51,12 @@ function _createFacetedUniqueValues<

for (let j = 0; j < values.length; j++) {
const value = values[j]
if (facetedUniqueValues.has(value)) {
facetedUniqueValues.set(
value,
(facetedUniqueValues.get(value) ?? 0) + 1,
)
} else {
facetedUniqueValues.set(value, 1)
}

const prevValue = facetedUniqueValues.get(value)
facetedUniqueValues.set(
value,
prevValue ? (prevValue + 1) : 1,
)
}
}

Expand Down
Loading