@@ -2,39 +2,43 @@ import { ref, computed, onMounted } from 'vue';
2
2
import { router , usePage } from '@inertiajs/vue3' ;
3
3
import { FilterMatchMode } from '@primevue/core/api' ;
4
4
import debounce from 'lodash-es/debounce' ;
5
- import * as PrimeVue from '@/types/primevue' ;
6
-
7
- interface PageStateEvent {
8
- first : number ;
9
- rows : number ;
10
- page : number ;
11
- pageCount : number ;
5
+ import cloneDeep from 'lodash-es/cloneDeep' ;
6
+ import { PageState , DataTablePageEvent } from 'primevue' ;
7
+ import { PrimeVueDataFilters } from '@/types' ;
8
+
9
+ // TODO: npm install qs
10
+ // const queryString = window.location.search;
11
+ // const parsed = qs.parse(queryString, { ignoreQueryPrefix: true });
12
+
13
+ interface PaginatedFilterableSortableQueryParams {
14
+ filters ?: PrimeVueDataFilters ;
15
+ page ?: string ;
16
+ rows ?: string ;
17
+ sortField ?: string ;
18
+ sortOrder ?: string ;
12
19
}
13
20
interface PaginationState {
14
21
page : number ;
15
22
rows : number ;
16
23
}
17
24
interface SortState {
18
- field : undefined | string ;
19
- order : undefined | null | 0 | 1 | - 1 ;
25
+ field : string ;
26
+ order : number ;
20
27
}
21
28
22
29
export function usePaginatedData (
23
- initialFilters : PrimeVue . PaginatedDataFilters = { } ,
30
+ initialFilters : PrimeVueDataFilters = { } ,
24
31
only : string [ ] = [ 'request' ] ,
25
32
initialsRows : number = 20
26
33
) {
27
- const defaultFilters = initialFilters ;
28
- const defaultRows = initialsRows ;
29
-
30
34
const page = usePage < {
31
35
request : {
32
- urlParams : PrimeVue . PaginatedDataUrlParams ;
36
+ urlParams : PaginatedFilterableSortableQueryParams ;
33
37
} ;
34
38
} > ( ) ;
35
39
36
40
const processing = ref < boolean > ( false ) ;
37
- const filters = ref < PrimeVue . PaginatedDataFilters > ( initialFilters ) ;
41
+ const filters = ref < PrimeVueDataFilters > ( cloneDeep ( initialFilters ) ) ;
38
42
const sorting = ref < SortState > ( {
39
43
field : '' ,
40
44
order : 1 ,
@@ -76,7 +80,7 @@ export function usePaginatedData(
76
80
router . reload ( {
77
81
only : [ 'request' , ...new Set ( only ) ] ,
78
82
data : {
79
- filters : filters . value ,
83
+ filters : filters . value as any ,
80
84
...pagination . value ,
81
85
sortField : sorting . value . field ,
82
86
sortOrder : sorting . value . order ,
@@ -95,9 +99,9 @@ export function usePaginatedData(
95
99
} ) ;
96
100
}
97
101
98
- function paginate ( pageStateEvent : PageStateEvent ) {
99
- pagination . value . page = pageStateEvent . page + 1 ;
100
- pagination . value . rows = pageStateEvent . rows ;
102
+ function paginate ( event : PageState | DataTablePageEvent ) {
103
+ pagination . value . page = event . page + 1 ;
104
+ pagination . value . rows = event . rows ;
101
105
fetchData ( ) . then ( ( ) => {
102
106
scrollToTop ( ) ;
103
107
} ) ;
@@ -114,6 +118,7 @@ export function usePaginatedData(
114
118
// Alternatively just use: router.get(window.location.pathname);
115
119
// Caveat to the above approach, we would lose state from our page not related to pagination/filtering/sorting
116
120
121
+ const defaultFilters = cloneDeep ( initialFilters ) ;
117
122
Object . keys ( defaultFilters ) . forEach ( ( key ) => {
118
123
filters . value [ key ] . value = defaultFilters [ key ] . value ;
119
124
} ) ;
@@ -123,7 +128,7 @@ export function usePaginatedData(
123
128
} ;
124
129
pagination . value = {
125
130
page : 1 ,
126
- rows : defaultRows ,
131
+ rows : initialsRows ,
127
132
} ;
128
133
fetchData ( ) . then ( ( ) => {
129
134
window . history . replaceState ( null , '' , window . location . pathname ) ;
@@ -167,18 +172,17 @@ export function usePaginatedData(
167
172
} ) ;
168
173
}
169
174
170
- function parseUrlParams ( urlParams : PrimeVue . PaginatedDataUrlParams ) {
175
+ function parseUrlParams ( urlParams : PaginatedFilterableSortableQueryParams ) {
171
176
filters . value = {
172
- ...defaultFilters ,
177
+ ...cloneDeep ( initialFilters ) ,
173
178
...urlParams ?. filters ,
174
179
} ;
175
180
parseUrlFilterValues ( ) ;
176
181
if ( urlParams ?. sortField ) {
177
182
sorting . value . field = urlParams . sortField ;
178
183
}
179
184
if ( urlParams ?. sortOrder ) {
180
- sorting . value . order =
181
- ( parseInt ( urlParams . sortOrder ) as 0 | 1 | - 1 ) || null ;
185
+ sorting . value . order = parseInt ( urlParams . sortOrder ) ;
182
186
}
183
187
if ( urlParams ?. page ) {
184
188
pagination . value . page = parseInt ( urlParams . page ) ;
@@ -204,4 +208,4 @@ export function usePaginatedData(
204
208
reset,
205
209
parseUrlParams,
206
210
} ;
207
- }
211
+ }
0 commit comments