@cn-ui/table-core
Version:
Headless UI for building powerful tables & datagrids for TS/JS.
52 lines (43 loc) • 1.32 kB
text/typescript
import { Table, Row, RowModel, RowData } from '../types'
import { getMemoOptions, 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)
},
getMemoOptions(table.options, 'debugTable', 'getExpandedRowModel')
)
}
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,
}
}