import { Table, Row, RowModel, RowData } from '../types' import { getMemoOptions, memo } from '../utils' export function getExpandedRowModel(): ( table: Table ) => () => RowModel { 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(rowModel: RowModel) { const expandedRows: Row[] = [] const handleRow = (row: Row) => { 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, } }