@justjarethb/table-core
Version:
Fork of @tanstack/table-core with support for event listeners in different windows
55 lines (46 loc) • 1.4 kB
text/typescript
import { Table, Row, RowModel, RowData } from '../types'
import { memo } from '../utils'
export function getExpandedRowModel<TData extends RowData>(): (
table: Table<TData>
) => () => RowModel<TData> {
return table =>
memo(
() => [
table.getState().expanded,
table.getPreExpandedRowModel(),
table.options.paginateExpandedRows,
],
(expanded, rowModel, paginateExpandedRows) => {
if (
!rowModel.rows.length ||
(expanded !== true && !Object.keys(expanded ?? {}).length)
) {
return rowModel
}
if (!paginateExpandedRows) {
// Only expand rows at this point if they are being paginated
return rowModel
}
return expandRows(rowModel)
},
{
key: process.env.NODE_ENV === 'development' && 'getExpandedRowModel',
debug: () => table.options.debugAll ?? table.options.debugTable,
}
)
}
export function expandRows<TData extends RowData>(rowModel: RowModel<TData>) {
const expandedRows: Row<TData>[] = []
const handleRow = (row: Row<TData>) => {
expandedRows.push(row)
if (row.subRows?.length && row.getIsExpanded()) {
row.subRows.forEach(handleRow)
}
}
rowModel.rows.forEach(handleRow)
return {
rows: expandedRows,
flatRows: rowModel.flatRows,
rowsById: rowModel.rowsById,
}
}