Skip to content

Commit e8a1a3d

Browse files
authored
Merge pull request #145 from connorabbas/admin-develop
Pull master, updated composables implementation
2 parents 18e3e40 + 56b3516 commit e8a1a3d

File tree

6 files changed

+50
-39
lines changed

6 files changed

+50
-39
lines changed

app/Http/Middleware/HandleInertiaRequests.php

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -47,9 +47,6 @@ public function share(Request $request): array
4747
'auth' => [
4848
'user' => $authenticatedUser,
4949
],
50-
'request' => [
51-
'urlParams' => $request->query(),
52-
],
5350
];
5451
}
5552
}

package-lock.json

Lines changed: 13 additions & 4 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 {

resources/js/Pages/Admin/Users/Index.vue

Lines changed: 7 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -45,14 +45,10 @@ const {
4545
filter,
4646
sort,
4747
hardReset,
48-
} = useLazyDataTable(
49-
{
50-
name: { value: null, matchMode: FilterMatchMode.CONTAINS },
51-
email: { value: null, matchMode: FilterMatchMode.CONTAINS },
52-
},
53-
['users'],
54-
props.users.per_page
55-
);
48+
} = useLazyDataTable('users', {
49+
name: { value: null, matchMode: FilterMatchMode.CONTAINS },
50+
email: { value: null, matchMode: FilterMatchMode.CONTAINS },
51+
}, props.users.per_page);
5652
</script>
5753

5854
<template>
@@ -130,9 +126,7 @@ const {
130126
type="text"
131127
placeholder="Search by name"
132128
fluid
133-
@input="
134-
debounceInputFilter(filterCallback)
135-
"
129+
@input="debounceInputFilter(filterCallback)"
136130
/>
137131
</template>
138132
<template #body="slotProps">
@@ -151,9 +145,7 @@ const {
151145
type="text"
152146
placeholder="Search by Email"
153147
fluid
154-
@input="
155-
debounceInputFilter(filterCallback)
156-
"
148+
@input="debounceInputFilter(filterCallback)"
157149
/>
158150
</template>
159151
<template #body="slotProps">
@@ -169,9 +161,7 @@ const {
169161
text
170162
rounded
171163
icon="pi pi-ellipsis-v"
172-
@click="
173-
toggleUserContextMenu($event, data)
174-
"
164+
@click="toggleUserContextMenu($event, data)"
175165
/>
176166
</template>
177167
</Column>

0 commit comments

Comments
 (0)