11import { ref , computed , onMounted } from 'vue' ;
2- import { router , usePage } from '@inertiajs/vue3' ;
2+ import { router } from '@inertiajs/vue3' ;
33import { FilterMatchMode } from '@primevue/core/api' ;
44import debounce from 'lodash-es/debounce' ;
55import cloneDeep from 'lodash-es/cloneDeep' ;
66import { PageState , DataTablePageEvent } from 'primevue' ;
77import { PrimeVueDataFilters } from '@/types' ;
8+ import qs from 'qs' ;
89
910interface PaginatedFilteredSortedQueryParams {
1011 filters ?: PrimeVueDataFilters ;
@@ -23,16 +24,11 @@ interface SortState {
2324}
2425
2526export function usePaginatedData (
27+ propDataToFetch : string ,
2628 initialFilters : PrimeVueDataFilters = { } ,
27- only : string [ ] = [ 'request' ] ,
2829 initialsRows : number = 20
2930) {
30- const page = usePage < {
31- request : {
32- urlParams : PaginatedFilteredSortedQueryParams ;
33- } ;
34- } > ( ) ;
35-
31+ const urlParams = ref < PaginatedFilteredSortedQueryParams > ( { } ) ;
3632 const processing = ref < boolean > ( false ) ;
3733 const filters = ref < PrimeVueDataFilters > ( cloneDeep ( initialFilters ) ) ;
3834 const sorting = ref < SortState > ( {
@@ -48,8 +44,8 @@ export function usePaginatedData(
4844 return ( pagination . value . page - 1 ) * pagination . value . rows ;
4945 } ) ;
5046 const filteredOrSorted = computed ( ( ) => {
51- const filters = page . props ?. request ?. urlParams ?. filters || { } ;
52- const sortField = page . props ?. request ?. urlParams ?. sortField || null ;
47+ const filters = urlParams . value ?. filters || { } ;
48+ const sortField = urlParams . value ?. sortField || null ;
5349 const isFiltering = Object . values ( filters ) . some (
5450 ( filter ) => filter . value !== null && filter . value !== ''
5551 ) ;
@@ -62,6 +58,20 @@ export function usePaginatedData(
6258 filterCallback ( ) ;
6359 } , 300 ) ;
6460
61+ function setUrlParams ( ) {
62+ const queryString = window . location . search ;
63+ const params = qs . parse ( queryString , {
64+ ignoreQueryPrefix : true ,
65+ strictNullHandling : true ,
66+ decoder : function ( str , defaultDecoder ) {
67+ // set empty string values to null
68+ const value = defaultDecoder ( str ) ;
69+ return value === '' ? null : value ;
70+ } ,
71+ } ) as PaginatedFilteredSortedQueryParams ;
72+ urlParams . value = { ...params } ;
73+ }
74+
6575 function scrollToTop ( ) {
6676 window . scrollTo ( {
6777 top : 0 ,
@@ -84,14 +94,15 @@ export function usePaginatedData(
8494 preserveUrl : false ,
8595 showProgress : true ,
8696 replace : true ,
87- only : [ 'request' , ... new Set ( only ) ] ,
97+ only : [ propDataToFetch ] ,
8898 onSuccess : ( page ) => {
8999 resolve ( page ) ;
90100 } ,
91101 onError : ( errors ) => {
92102 reject ( errors ) ;
93103 } ,
94104 onFinish : ( ) => {
105+ setUrlParams ( ) ;
95106 processing . value = false ;
96107 } ,
97108 } ) ;
@@ -140,7 +151,7 @@ export function usePaginatedData(
140151 preserveUrl : false ,
141152 showProgress : true ,
142153 replace : true ,
143- only : [ 'request' , ... new Set ( only ) ] ,
154+ only : [ propDataToFetch ] ,
144155 } ) ;
145156 }
146157
@@ -154,6 +165,7 @@ export function usePaginatedData(
154165 filters . value [ key ] . value = new Date ( filter . value ) ;
155166 } else if (
156167 typeof filter . value === 'string' &&
168+ filter . value !== '' &&
157169 ! isNaN ( Number ( filter . value ) )
158170 ) {
159171 filters . value [ key ] . value = Number ( filter . value ) ;
@@ -199,7 +211,8 @@ export function usePaginatedData(
199211 }
200212
201213 onMounted ( ( ) => {
202- parseUrlParams ( page . props . request . urlParams ) ;
214+ setUrlParams ( ) ;
215+ parseUrlParams ( urlParams . value ) ;
203216 } ) ;
204217
205218 return {
0 commit comments