@@ -5,19 +5,26 @@ import { derived, writable, type Readable, type Updater, type Writable } from 's
5
5
export interface PaginationConfig {
6
6
initialPageIndex ?: number ;
7
7
initialPageSize ?: number ;
8
+ serverSide ?: boolean ;
8
9
}
9
10
10
11
export interface PaginationState {
11
12
pageSize : Writable < number > ;
12
13
pageIndex : Writable < number > ;
13
14
pageCount : Readable < number > ;
15
+ serverItemsCount : Writable < number > ;
14
16
hasPreviousPage : Readable < boolean > ;
15
17
hasNextPage : Readable < boolean > ;
16
18
}
17
19
18
20
const MIN_PAGE_SIZE = 1 ;
19
21
20
- export const createPageStore = ( { items, initialPageSize, initialPageIndex } : PageStoreConfig ) => {
22
+ export const createPageStore = ( {
23
+ items,
24
+ initialPageSize,
25
+ initialPageIndex,
26
+ serverSide,
27
+ } : PageStoreConfig ) => {
21
28
const pageSize = writable ( initialPageSize ) ;
22
29
const updatePageSize = ( fn : Updater < number > ) => {
23
30
pageSize . update ( ( $pageSize ) => {
@@ -26,19 +33,28 @@ export const createPageStore = ({ items, initialPageSize, initialPageIndex }: Pa
26
33
} ) ;
27
34
} ;
28
35
const setPageSize = ( newPageSize : number ) => updatePageSize ( ( ) => newPageSize ) ;
36
+
37
+ const pageIndex = writable ( initialPageIndex ) ;
29
38
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 ) ;
32
42
pageIndex . update ( ( $pageIndex ) => {
33
43
if ( $pageCount > 0 && $pageIndex >= $pageCount ) {
34
44
return $pageCount - 1 ;
35
45
}
36
46
return $pageIndex ;
37
47
} ) ;
38
48
return $pageCount ;
39
- } ) ;
49
+ }
40
50
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
+ }
42
58
43
59
const hasPreviousPage = derived ( pageIndex , ( $pageIndex ) => {
44
60
return $pageIndex > 0 ;
@@ -53,8 +69,9 @@ export const createPageStore = ({ items, initialPageSize, initialPageIndex }: Pa
53
69
update : updatePageSize ,
54
70
set : setPageSize ,
55
71
} ,
56
- pageCount,
57
72
pageIndex,
73
+ pageCount,
74
+ serverItemsCount,
58
75
hasPreviousPage,
59
76
hasNextPage,
60
77
} ;
@@ -64,10 +81,15 @@ export interface PageStoreConfig {
64
81
items : Readable < unknown [ ] > ;
65
82
initialPageSize ?: number ;
66
83
initialPageIndex ?: number ;
84
+ serverSide ?: boolean ;
67
85
}
68
86
69
87
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 <
71
93
Item ,
72
94
PaginationState ,
73
95
Record < string , never > ,
@@ -76,26 +98,34 @@ export const addPagination =
76
98
( ) => {
77
99
const prePaginatedRows = writable < BodyRow < Item > [ ] > ( [ ] ) ;
78
100
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
+ } ) ;
84
108
const pluginState : PaginationState = {
85
109
pageSize,
86
110
pageIndex,
87
111
pageCount,
112
+ serverItemsCount,
88
113
hasPreviousPage,
89
114
hasNextPage,
90
115
} ;
91
116
92
117
const derivePageRows : DeriveRowsFn < Item > = ( rows ) => {
93
118
return derived ( [ rows , pageSize , pageIndex ] , ( [ $rows , $pageSize , $pageIndex ] ) => {
94
119
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
+ }
99
129
} ) ;
100
130
} ;
101
131
0 commit comments