Skip to content

Commit 3162971

Browse files
committed
fix: pass serverItemSize as prop
1 parent b88a036 commit 3162971

File tree

3 files changed

+34
-24
lines changed

3 files changed

+34
-24
lines changed

docs/src/routes/docs/[...3]plugins/[...7]add-pagination/+page.md

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,14 @@ If `true`, the pagination plugin will have no effect on the rows of the table. I
6464

6565
_Defaults to `false`_.
6666

67+
### `serverItemCount: Writable<number>`
68+
69+
The total number of items expected from the server.
70+
71+
When using server-side pagination, the number of items in `$data` only reflects the number of items in the page and not the number of total items. To calculate the right number of pages required, the plugin needs to know how many items in total are expected.
72+
73+
_Required when `serverSide = true`_.
74+
6775
## Column Options
6876

6977
:::callout
@@ -138,12 +146,6 @@ Whether a next page is available.
138146

139147
The total number of pages derived from the number of rows and page size.
140148

141-
### `serverItemCount: Writable<number>`
142-
143-
The total number of items expected from the server.
144-
145-
When using server-side pagination, the number of items in `$data` only reflects the number of items in the page and not the number of total items. To calculate the right number of pages required, the plugin needs to know how many items in total are expected.
146-
147149
## Examples
148150

149151
### Simple pagination

src/lib/plugins/addPagination.ts

Lines changed: 22 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -2,17 +2,24 @@ import type { BodyRow } from '../bodyRows';
22
import type { DeriveRowsFn, NewTablePropSet, TablePlugin } from '../types/TablePlugin';
33
import { derived, writable, type Readable, type Updater, type Writable } from 'svelte/store';
44

5-
export interface PaginationConfig {
5+
export type PaginationConfig = {
66
initialPageIndex?: number;
77
initialPageSize?: number;
8-
serverSide?: boolean;
9-
}
8+
} & (
9+
| {
10+
serverSide?: false | undefined;
11+
serverItemCount?: undefined;
12+
}
13+
| {
14+
serverSide: true;
15+
serverItemCount: Readable<number>;
16+
}
17+
);
1018

1119
export interface PaginationState {
1220
pageSize: Writable<number>;
1321
pageIndex: Writable<number>;
1422
pageCount: Readable<number>;
15-
serverItemCount: Writable<number>;
1623
hasPreviousPage: Readable<boolean>;
1724
hasNextPage: Readable<boolean>;
1825
}
@@ -24,6 +31,7 @@ export const createPageStore = ({
2431
initialPageSize,
2532
initialPageIndex,
2633
serverSide,
34+
serverItemCount,
2735
}: PageStoreConfig) => {
2836
const pageSize = writable(initialPageSize);
2937
const updatePageSize = (fn: Updater<number>) => {
@@ -50,9 +58,8 @@ export const createPageStore = ({
5058
return $pageCount;
5159
}
5260

53-
const serverItemCount = writable(0);
5461
let pageCount;
55-
if (serverSide) {
62+
if (serverSide && serverItemCount != null) {
5663
pageCount = derived([pageSize, serverItemCount], calcPageCountAndLimitIndex);
5764
} else {
5865
const itemCount = derived(items, ($items) => $items.length);
@@ -85,13 +92,15 @@ export interface PageStoreConfig {
8592
initialPageSize?: number;
8693
initialPageIndex?: number;
8794
serverSide?: boolean;
95+
serverItemCount?: Readable<number>;
8896
}
8997

9098
export const addPagination =
9199
<Item>({
92100
initialPageIndex = 0,
93101
initialPageSize = 10,
94102
serverSide = false,
103+
serverItemCount,
95104
}: PaginationConfig = {}): TablePlugin<
96105
Item,
97106
PaginationState,
@@ -101,18 +110,17 @@ export const addPagination =
101110
() => {
102111
const prePaginatedRows = writable<BodyRow<Item>[]>([]);
103112
const paginatedRows = writable<BodyRow<Item>[]>([]);
104-
const { pageSize, pageIndex, pageCount, serverItemCount, hasPreviousPage, hasNextPage } =
105-
createPageStore({
106-
items: prePaginatedRows,
107-
initialPageIndex,
108-
initialPageSize,
109-
serverSide,
110-
});
113+
const { pageSize, pageIndex, pageCount, hasPreviousPage, hasNextPage } = createPageStore({
114+
items: prePaginatedRows,
115+
initialPageIndex,
116+
initialPageSize,
117+
serverSide,
118+
serverItemCount,
119+
});
111120
const pluginState: PaginationState = {
112121
pageSize,
113122
pageIndex,
114123
pageCount,
115-
serverItemCount,
116124
hasPreviousPage,
117125
hasNextPage,
118126
};

src/routes/+page.svelte

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@
6464
page: addPagination({
6565
initialPageSize: 20,
6666
serverSide: serverSide,
67+
serverItemCount: readable(40) as any,
6768
}),
6869
resize: addResizedColumns(),
6970
export: addDataExport(),
@@ -265,7 +266,7 @@
265266
const { filterValues } = pluginStates.filter;
266267
const { filterValue } = pluginStates.tableFilter;
267268
const { selectedDataIds } = pluginStates.select;
268-
const { pageIndex, pageCount, pageSize, hasPreviousPage, hasNextPage, serverItemCount } =
269+
const { pageIndex, pageCount, pageSize, hasPreviousPage, hasNextPage } =
269270
pluginStates.page;
270271
const { expandedIds } = pluginStates.expand;
271272
const { columnIdOrder } = pluginStates.orderColumns;
@@ -276,8 +277,6 @@
276277
const { exportedData } = pluginStates.export;
277278
const { exportedData: exportedJson } = pluginStates.exportJson;
278279
const { exportedData: exportedCsv } = pluginStates.exportCsv;
279-
280-
$serverItemCount = 6;
281280
</script>
282281

283282
<h1>svelte-headless-table</h1>
@@ -325,10 +324,11 @@
325324
{/if}
326325
</button>
327326
{/if}
328-
{#if props.filter !== undefined}
327+
{#if props.filter?.render !== undefined}
329328
<Render of={props.filter.render} />
330329
{/if}
331330
{#if !props.resize.disabled}
331+
<!-- svelte-ignore a11y-click-events-have-key-events -->
332332
<div class="resizer" on:click|stopPropagation use:props.resize.drag use:props.resize.reset />
333333
{/if}
334334
</th>

0 commit comments

Comments
 (0)