Skip to content

Commit 8a64567

Browse files
committed
Update addPagination.ts
Add server side pagination support
1 parent a1f0517 commit 8a64567

File tree

1 file changed

+46
-16
lines changed

1 file changed

+46
-16
lines changed

src/lib/plugins/addPagination.ts

Lines changed: 46 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -5,19 +5,26 @@ import { derived, writable, type Readable, type Updater, type Writable } from 's
55
export interface PaginationConfig {
66
initialPageIndex?: number;
77
initialPageSize?: number;
8+
serverSide?: boolean;
89
}
910

1011
export interface PaginationState {
1112
pageSize: Writable<number>;
1213
pageIndex: Writable<number>;
1314
pageCount: Readable<number>;
15+
serverItemsCount: Writable<number>;
1416
hasPreviousPage: Readable<boolean>;
1517
hasNextPage: Readable<boolean>;
1618
}
1719

1820
const MIN_PAGE_SIZE = 1;
1921

20-
export const createPageStore = ({ items, initialPageSize, initialPageIndex }: PageStoreConfig) => {
22+
export const createPageStore = ({
23+
items,
24+
initialPageSize,
25+
initialPageIndex,
26+
serverSide,
27+
}: PageStoreConfig) => {
2128
const pageSize = writable(initialPageSize);
2229
const updatePageSize = (fn: Updater<number>) => {
2330
pageSize.update(($pageSize) => {
@@ -26,19 +33,28 @@ export const createPageStore = ({ items, initialPageSize, initialPageIndex }: Pa
2633
});
2734
};
2835
const setPageSize = (newPageSize: number) => updatePageSize(() => newPageSize);
36+
37+
const pageIndex = writable(initialPageIndex);
2938

30-
const pageCount = derived([pageSize, items], ([$pageSize, $items]) => {
31-
const $pageCount = Math.ceil($items.length / $pageSize);
39+
let pageCount;
40+
function calcPageCount([$pageSize, $itemsCount]: [$pageSize: number, $itemsCount: number]) {
41+
const $pageCount = Math.ceil($itemsCount / $pageSize);
3242
pageIndex.update(($pageIndex) => {
3343
if ($pageCount > 0 && $pageIndex >= $pageCount) {
3444
return $pageCount - 1;
3545
}
3646
return $pageIndex;
3747
});
3848
return $pageCount;
39-
});
49+
}
4050

41-
const pageIndex = writable(initialPageIndex);
51+
const serverItemsCount = writable(0);
52+
if (serverSide) {
53+
pageCount = derived([pageSize, serverItemsCount], calcPageCount)
54+
} else {
55+
const itemCount = derived(items, ($items) => $items.length)
56+
pageCount = derived([pageSize, itemCount], calcPageCount)
57+
}
4258

4359
const hasPreviousPage = derived(pageIndex, ($pageIndex) => {
4460
return $pageIndex > 0;
@@ -53,8 +69,9 @@ export const createPageStore = ({ items, initialPageSize, initialPageIndex }: Pa
5369
update: updatePageSize,
5470
set: setPageSize,
5571
},
56-
pageCount,
5772
pageIndex,
73+
pageCount,
74+
serverItemsCount,
5875
hasPreviousPage,
5976
hasNextPage,
6077
};
@@ -64,10 +81,15 @@ export interface PageStoreConfig {
6481
items: Readable<unknown[]>;
6582
initialPageSize?: number;
6683
initialPageIndex?: number;
84+
serverSide?: boolean;
6785
}
6886

6987
export const addPagination =
70-
<Item>({ initialPageIndex = 0, initialPageSize = 10 }: PaginationConfig = {}): TablePlugin<
88+
<Item>({
89+
initialPageIndex = 0,
90+
initialPageSize = 10,
91+
serverSide = false,
92+
}: PaginationConfig = {}): TablePlugin<
7193
Item,
7294
PaginationState,
7395
Record<string, never>,
@@ -76,26 +98,34 @@ export const addPagination =
7698
() => {
7799
const prePaginatedRows = writable<BodyRow<Item>[]>([]);
78100
const paginatedRows = writable<BodyRow<Item>[]>([]);
79-
const { pageSize, pageCount, pageIndex, hasPreviousPage, hasNextPage } = createPageStore({
80-
items: prePaginatedRows,
81-
initialPageIndex,
82-
initialPageSize,
83-
});
101+
const { pageSize, pageIndex, pageCount, serverItemsCount, hasPreviousPage, hasNextPage } =
102+
createPageStore({
103+
items: prePaginatedRows,
104+
initialPageIndex,
105+
initialPageSize,
106+
serverSide,
107+
});
84108
const pluginState: PaginationState = {
85109
pageSize,
86110
pageIndex,
87111
pageCount,
112+
serverItemsCount,
88113
hasPreviousPage,
89114
hasNextPage,
90115
};
91116

92117
const derivePageRows: DeriveRowsFn<Item> = (rows) => {
93118
return derived([rows, pageSize, pageIndex], ([$rows, $pageSize, $pageIndex]) => {
94119
prePaginatedRows.set($rows);
95-
const startIdx = $pageIndex * $pageSize;
96-
const _paginatedRows = $rows.slice(startIdx, startIdx + $pageSize);
97-
paginatedRows.set(_paginatedRows);
98-
return _paginatedRows;
120+
if (!serverSide) {
121+
const startIdx = $pageIndex * $pageSize;
122+
const _paginatedRows = $rows.slice(startIdx, startIdx + $pageSize);
123+
paginatedRows.set(_paginatedRows);
124+
return _paginatedRows;
125+
} else {
126+
paginatedRows.set($rows);
127+
return $rows;
128+
}
99129
});
100130
};
101131

0 commit comments

Comments
 (0)