UNPKG

@tanstack/table-core

Version:

Headless UI for building powerful tables & datagrids for TS/JS.

60 lines (58 loc) 2.01 kB
import { tableMemo } from "../../utils.js"; import { getDefaultPaginationState } from "./rowPaginationFeature.utils.js"; import { expandRows } from "../row-expanding/createExpandedRowModel.js"; //#region src/features/row-pagination/createPaginatedRowModel.ts /** * Creates a memoized paginated row model factory. * * The factory reads the relevant table state atoms and options, then returns a row model function used by the table row-model pipeline. */ function createPaginatedRowModel() { return (_table) => { const table = _table; return tableMemo({ feature: "rowPaginationFeature", table, fnName: "table.getPaginatedRowModel", memoDeps: () => [ table.getPrePaginatedRowModel(), table.atoms.pagination?.get(), !table.options.paginateExpandedRows ? table.atoms.expanded?.get() : void 0 ], fn: () => _createPaginatedRowModel(table) }); }; } function _createPaginatedRowModel(table) { const prePaginatedRowModel = table.getPrePaginatedRowModel(); const pagination = table.atoms.pagination?.get(); if (!prePaginatedRowModel.rows.length) return prePaginatedRowModel; const { pageSize, pageIndex } = pagination ?? getDefaultPaginationState(); const { rows, flatRows, rowsById } = prePaginatedRowModel; const pageStart = pageSize * pageIndex; const pageEnd = pageStart + pageSize; const paginatedRows = rows.slice(pageStart, pageEnd); let paginatedRowModel; if (!table.options.paginateExpandedRows) paginatedRowModel = expandRows({ rows: paginatedRows, flatRows, rowsById }); else paginatedRowModel = { rows: paginatedRows, flatRows, rowsById }; paginatedRowModel.flatRows = []; const seenFlatRows = /* @__PURE__ */ new Set(); const handleRow = (row) => { if (seenFlatRows.has(row.id)) return; seenFlatRows.add(row.id); paginatedRowModel.flatRows.push(row); if (row.subRows.length) row.subRows.forEach(handleRow); }; paginatedRowModel.rows.forEach(handleRow); return paginatedRowModel; } //#endregion export { createPaginatedRowModel };