-
-
Notifications
You must be signed in to change notification settings - Fork 3.2k
/
Copy pathgetPaginationRowModel.ts
69 lines (57 loc) · 1.88 KB
/
getPaginationRowModel.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
import { Table, RowModel, Row, RowData } from '../types'
import { getMemoOptions, memo } from '../utils'
import { expandRows } from './getExpandedRowModel'
export function getPaginationRowModel<TData extends RowData>(opts?: {
initialSync: boolean
}): (table: Table<TData>) => () => RowModel<TData> {
return table =>
memo(
() => [
table.getState().pagination,
table.getPrePaginationRowModel(),
table.options.paginateExpandedRows
? undefined
: table.getState().expanded,
],
(pagination, rowModel) => {
if (!rowModel.rows.length) {
return rowModel
}
const { pageSize, pageIndex } = pagination
let { rows, flatRows, rowsById } = rowModel
const pageStart = pageSize * pageIndex
const pageEnd = pageStart + pageSize
rows = rows.slice(pageStart, pageEnd)
let paginatedRowModel: RowModel<TData>
if (!table.options.paginateExpandedRows) {
paginatedRowModel = expandRows({
rows,
flatRows,
rowsById,
})
} else {
paginatedRowModel = {
rows,
flatRows,
rowsById,
}
}
paginatedRowModel.flatRows = []
// keep track of the already added flatRows, to avoid duplication of already expanded sub-rows
const addedFlatRowsSet = new Set()
const handleRow = (row: Row<TData>) => {
if (addedFlatRowsSet.has(row.id)) {
return
}
paginatedRowModel.flatRows.push(row)
addedFlatRowsSet.add(row.id)
if (row.subRows.length) {
row.subRows.forEach(handleRow)
}
}
paginatedRowModel.rows.forEach(handleRow)
return paginatedRowModel
},
getMemoOptions(table.options, 'debugTable', 'getPaginationRowModel')
)
}