@@ -2,7 +2,6 @@ import { ref, computed, onMounted } from 'vue';
2
2
import { router } from '@inertiajs/vue3' ;
3
3
import { FilterMatchMode } from '@primevue/core/api' ;
4
4
import debounce from 'lodash-es/debounce' ;
5
- import cloneDeep from 'lodash-es/cloneDeep' ;
6
5
import { PageState , DataTablePageEvent } from 'primevue' ;
7
6
import { PrimeVueDataFilters } from '@/types' ;
8
7
import qs from 'qs' ;
@@ -24,13 +23,13 @@ interface SortState {
24
23
}
25
24
26
25
export function usePaginatedData (
27
- propDataToFetch : string ,
26
+ propDataToFetch : string | string [ ] ,
28
27
initialFilters : PrimeVueDataFilters = { } ,
29
28
initialRows : number = 20
30
29
) {
31
30
const urlParams = ref < PaginatedFilteredSortedQueryParams > ( { } ) ;
32
31
const processing = ref < boolean > ( false ) ;
33
- const filters = ref < PrimeVueDataFilters > ( cloneDeep ( initialFilters ) ) ;
32
+ const filters = ref < PrimeVueDataFilters > ( structuredClone ( initialFilters ) ) ;
34
33
const sorting = ref < SortState > ( {
35
34
field : '' ,
36
35
order : 1 ,
@@ -44,9 +43,9 @@ export function usePaginatedData(
44
43
return ( pagination . value . page - 1 ) * pagination . value . rows ;
45
44
} ) ;
46
45
const filteredOrSorted = computed ( ( ) => {
47
- const filters = urlParams . value ?. filters || { } ;
46
+ const paramsFilters = urlParams . value ?. filters || { } ;
48
47
const sortField = urlParams . value ?. sortField || null ;
49
- const isFiltering = Object . values ( filters ) . some (
48
+ const isFiltering = Object . values ( paramsFilters ) . some (
50
49
( filter ) => filter . value !== null && filter . value !== ''
51
50
) ;
52
51
const isSorting = sortField !== null && sortField !== '' ;
@@ -64,11 +63,11 @@ export function usePaginatedData(
64
63
ignoreQueryPrefix : true ,
65
64
strictNullHandling : true ,
66
65
decoder : function ( str , defaultDecoder ) {
67
- // set empty string values to null
68
66
const value = defaultDecoder ( str ) ;
69
67
return value === '' ? null : value ;
70
68
} ,
71
69
} ) as PaginatedFilteredSortedQueryParams ;
70
+
72
71
urlParams . value = { ...params } ;
73
72
}
74
73
@@ -79,9 +78,16 @@ export function usePaginatedData(
79
78
} ) ;
80
79
}
81
80
82
- function fetchData ( ) {
81
+ function fetchData ( options : {
82
+ onSuccess ?: ( page : any ) => void ;
83
+ onError ?: ( errors : any ) => void ;
84
+ onFinish ?: ( ) => void ;
85
+ } = { } ) {
86
+ const { onSuccess : successCallback , onError : errorCallback , onFinish : finishCallback } = options ;
87
+
83
88
return new Promise ( ( resolve , reject ) => {
84
89
processing . value = true ;
90
+
85
91
router . visit ( window . location . pathname , {
86
92
method : 'get' ,
87
93
data : {
@@ -94,28 +100,42 @@ export function usePaginatedData(
94
100
preserveUrl : false ,
95
101
showProgress : true ,
96
102
replace : true ,
97
- only : [ propDataToFetch ] ,
103
+ only : Array . isArray ( propDataToFetch ) ? propDataToFetch : [ propDataToFetch ] ,
98
104
onSuccess : ( page ) => {
105
+ if ( typeof successCallback === 'function' ) {
106
+ successCallback ( page ) ;
107
+ }
108
+
99
109
resolve ( page ) ;
100
110
} ,
101
111
onError : ( errors ) => {
112
+ if ( typeof errorCallback === 'function' ) {
113
+ errorCallback ( errors ) ;
114
+ }
115
+
102
116
reject ( errors ) ;
103
117
} ,
104
118
onFinish : ( ) => {
105
119
setUrlParams ( ) ;
106
120
processing . value = false ;
121
+
122
+ if ( typeof finishCallback === 'function' ) {
123
+ finishCallback ( ) ;
124
+ }
107
125
} ,
108
126
} ) ;
109
127
} ) ;
110
128
}
111
129
112
130
function paginate ( event : PageState | DataTablePageEvent ) {
113
- if ( event . rows != pagination . value . rows ) {
131
+ if ( event . rows !== pagination . value . rows ) {
114
132
pagination . value . page = 1 ;
115
133
} else {
116
134
pagination . value . page = event . page + 1 ;
117
135
}
136
+
118
137
pagination . value . rows = event . rows ;
138
+
119
139
fetchData ( ) . then ( ( ) => {
120
140
scrollToTop ( ) ;
121
141
} ) ;
@@ -129,19 +149,23 @@ export function usePaginatedData(
129
149
}
130
150
131
151
function reset ( ) {
132
- const defaultFilters = cloneDeep ( initialFilters ) ;
152
+ const defaultFilters = structuredClone ( initialFilters ) ;
153
+
133
154
Object . keys ( defaultFilters ) . forEach ( ( key ) => {
134
155
filters . value [ key ] . value = defaultFilters [ key ] . value ;
135
156
filters . value [ key ] . matchMode = defaultFilters [ key ] . matchMode ;
136
157
} ) ;
158
+
137
159
sorting . value = {
138
160
field : '' ,
139
161
order : 1 ,
140
162
} ;
163
+
141
164
pagination . value = {
142
165
page : 1 ,
143
166
rows : initialRows ,
144
167
} ;
168
+
145
169
fetchData ( ) ;
146
170
}
147
171
@@ -151,23 +175,25 @@ export function usePaginatedData(
151
175
preserveUrl : false ,
152
176
showProgress : true ,
153
177
replace : true ,
154
- only : [ propDataToFetch ] ,
178
+ only : Array . isArray ( propDataToFetch ) ? propDataToFetch : [ propDataToFetch ] ,
155
179
} ) ;
156
180
}
157
181
158
182
function parseUrlFilterValues ( ) {
159
183
Object . keys ( filters . value ) . forEach ( ( key ) => {
160
184
const filter = filters . value [ key ] ;
185
+
161
186
if ( ! filter ?. value || ! filter ?. matchMode ) {
162
187
return ;
163
188
}
189
+
164
190
if (
165
191
filter . matchMode == FilterMatchMode . DATE_IS ||
166
192
filter . matchMode == FilterMatchMode . DATE_IS_NOT ||
167
193
filter . matchMode == FilterMatchMode . DATE_BEFORE ||
168
194
filter . matchMode == FilterMatchMode . DATE_AFTER
169
195
) {
170
- filters . value [ key ] . value = new Date ( filter . value ) ;
196
+ filters . value [ key ] . value = new Date ( filter . value as string ) ;
171
197
} else if ( filter . matchMode == FilterMatchMode . BETWEEN ) {
172
198
filter . value . forEach ( ( value : any , index : number ) => {
173
199
if ( typeof value === 'string' ) {
@@ -190,12 +216,10 @@ export function usePaginatedData(
190
216
} else {
191
217
// Unique array values
192
218
const unique = [ ...new Set ( filter . value ) ] ;
219
+
193
220
filter . value = unique ;
194
221
filter . value . forEach ( ( value : any , index : number ) => {
195
- if (
196
- typeof value === 'string' &&
197
- ! isNaN ( Number ( value ) )
198
- ) {
222
+ if ( typeof value === 'string' && ! isNaN ( Number ( value ) ) ) {
199
223
filter . value [ index ] = Number ( value ) ;
200
224
}
201
225
} ) ;
@@ -204,23 +228,28 @@ export function usePaginatedData(
204
228
} ) ;
205
229
}
206
230
207
- function parseUrlParams ( urlParams : PaginatedFilteredSortedQueryParams ) {
231
+ function parseUrlParams ( urlParamsObj : PaginatedFilteredSortedQueryParams ) {
208
232
filters . value = {
209
- ...cloneDeep ( initialFilters ) ,
210
- ...urlParams ?. filters ,
233
+ ...structuredClone ( initialFilters ) ,
234
+ ...urlParamsObj ?. filters ,
211
235
} ;
236
+
212
237
parseUrlFilterValues ( ) ;
213
- if ( urlParams ?. sortField ) {
214
- sorting . value . field = urlParams . sortField ;
238
+
239
+ if ( urlParamsObj ?. sortField ) {
240
+ sorting . value . field = urlParamsObj . sortField ;
215
241
}
216
- if ( urlParams ?. sortOrder ) {
217
- sorting . value . order = parseInt ( urlParams . sortOrder ) ;
242
+
243
+ if ( urlParamsObj ?. sortOrder ) {
244
+ sorting . value . order = parseInt ( urlParamsObj . sortOrder ) ;
218
245
}
219
- if ( urlParams ?. page ) {
220
- pagination . value . page = parseInt ( urlParams . page ) ;
246
+
247
+ if ( urlParamsObj ?. page ) {
248
+ pagination . value . page = parseInt ( urlParamsObj . page ) ;
221
249
}
222
- if ( urlParams ?. rows ) {
223
- pagination . value . rows = parseInt ( urlParams . rows ) ;
250
+
251
+ if ( urlParamsObj ?. rows ) {
252
+ pagination . value . rows = parseInt ( urlParamsObj . rows ) ;
224
253
}
225
254
}
226
255
@@ -245,4 +274,4 @@ export function usePaginatedData(
245
274
hardReset,
246
275
parseUrlParams,
247
276
} ;
248
- }
277
+ }
0 commit comments