Skip to content

Commit 34ad78d

Browse files
authored
Merge pull request #146 from connorabbas/develop
Updated paginated data composables implementation
2 parents a552f81 + 3d0a0f3 commit 34ad78d

File tree

5 files changed

+39
-18
lines changed

5 files changed

+39
-18
lines changed

app/Http/Middleware/HandleInertiaRequests.php

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -34,9 +34,6 @@ public function share(Request $request): array
3434
'auth' => [
3535
'user' => $request->user(),
3636
],
37-
'request' => [
38-
'urlParams' => $request->query(),
39-
],
4037
];
4138
}
4239
}

package-lock.json

Lines changed: 9 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
"@primevue/themes": "^4.2.2",
1414
"@tailwindcss/vite": "^4.0.0",
1515
"@types/lodash-es": "^4.17.12",
16+
"@types/qs": "^6.9.18",
1617
"@typescript-eslint/eslint-plugin": "^8.19.1",
1718
"@typescript-eslint/parser": "^8.19.1",
1819
"@vitejs/plugin-vue": "^5.0.0",
@@ -27,6 +28,7 @@
2728
"lodash-es": "^4.17.21",
2829
"primeicons": "^7.0.0",
2930
"primevue": "^4.2.2",
31+
"qs": "^6.14.0",
3032
"tailwindcss": "^4.0.0",
3133
"tailwindcss-primeui": "^0.3.2",
3234
"typescript": "^5.7.3",

resources/js/Composables/useLazyDataTable.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@ import { DataTableFilterMetaData, DataTableFilterEvent, DataTableSortEvent } fro
44
import { PrimeVueDataFilters } from '@/types';
55

66
export function useLazyDataTable(
7+
propDataToFetch: string,
78
initialFilters: PrimeVueDataFilters = {},
8-
only: string[] = ['request'],
99
initialsRows: number = 20
1010
) {
1111
const {
@@ -20,7 +20,7 @@ export function useLazyDataTable(
2020
fetchData,
2121
paginate,
2222
hardReset,
23-
} = usePaginatedData(initialFilters, only, initialsRows);
23+
} = usePaginatedData(propDataToFetch, initialFilters, initialsRows);
2424

2525
function parseEventFilterValues() {
2626
Object.keys(filters.value).forEach((key) => {

resources/js/Composables/usePaginatedData.ts

Lines changed: 26 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
11
import { ref, computed, onMounted } from 'vue';
2-
import { router, usePage } from '@inertiajs/vue3';
2+
import { router } from '@inertiajs/vue3';
33
import { FilterMatchMode } from '@primevue/core/api';
44
import debounce from 'lodash-es/debounce';
55
import cloneDeep from 'lodash-es/cloneDeep';
66
import { PageState, DataTablePageEvent } from 'primevue';
77
import { PrimeVueDataFilters } from '@/types';
8+
import qs from 'qs';
89

910
interface PaginatedFilteredSortedQueryParams {
1011
filters?: PrimeVueDataFilters;
@@ -23,16 +24,11 @@ interface SortState {
2324
}
2425

2526
export 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

Comments
 (0)