Skip to content

Commit 498cd80

Browse files
authored
Merge pull request #120 from connorabbas/develop
Improvements
2 parents 8d8c9f2 + e5bcece commit 498cd80

File tree

9 files changed

+61
-66
lines changed

9 files changed

+61
-66
lines changed

eslint.config.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ export default typescriptEslint.config(
4747
rules: {
4848
'vue/require-default-prop': 'off',
4949
'vue/attribute-hyphenation': 'off',
50+
'vue/v-on-event-hyphenation': 'off',
5051
'vue/multi-word-component-names': 'off',
5152
'vue/block-lang': 'off',
5253
'@typescript-eslint/no-explicit-any': 'off',

resources/js/Composables/useLazyDataTable.ts

Lines changed: 25 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,17 @@
11
import { usePaginatedData } from './usePaginatedData';
2-
import * as PrimeVue from '@/types/primevue';
2+
import cloneDeep from 'lodash-es/cloneDeep';
3+
import {
4+
DataTableFilterMetaData,
5+
DataTableFilterEvent,
6+
DataTableSortEvent,
7+
} from 'primevue';
8+
import { PrimeVueDataFilters } from '@/types';
39

410
export function useLazyDataTable(
5-
initialFilters: PrimeVue.PaginatedDataFilters = {},
11+
initialFilters: PrimeVueDataFilters = {},
612
only: string[] = ['request'],
713
initialsRows: number = 20
814
) {
9-
const defaultFilters = initialFilters;
10-
const defaultRows = initialsRows;
11-
1215
const {
1316
processing,
1417
filters,
@@ -36,19 +39,29 @@ export function useLazyDataTable(
3639
* "Override" parent composable function
3740
* Event driven filtering rather than reactive state
3841
*/
39-
function filter(event: { filters: PrimeVue.PaginatedDataFilters }) {
42+
function filter(event: DataTableFilterEvent) {
4043
pagination.value.page = 1;
41-
filters.value = { ...event.filters };
44+
const newFilters: PrimeVueDataFilters = {};
45+
Object.entries(event.filters).forEach(([key, rawFilter]) => {
46+
if (
47+
rawFilter &&
48+
typeof rawFilter === 'object' &&
49+
'matchMode' in rawFilter
50+
) {
51+
newFilters[key] = rawFilter as DataTableFilterMetaData;
52+
}
53+
});
54+
filters.value = newFilters;
4255
parseEventFilterValues();
4356
fetchData().then(() => {
4457
scrollToTop();
4558
});
4659
}
4760

48-
function sort(event: PrimeVue.SortEvent) {
61+
function sort(event: DataTableSortEvent) {
4962
pagination.value.page = 1;
50-
sorting.value.field = event.sortField;
51-
sorting.value.order = event.sortOrder;
63+
sorting.value.field = String(event.sortField);
64+
sorting.value.order = event.sortOrder || 1;
5265
fetchData().then(() => {
5366
scrollToTop();
5467
});
@@ -59,14 +72,15 @@ export function useLazyDataTable(
5972
* usePaginatedData() resets sorting.value state as a new object, this will not work for DataTable's
6073
*/
6174
function reset() {
75+
const defaultFilters = cloneDeep(initialFilters);
6276
Object.keys(defaultFilters).forEach((key) => {
6377
filters.value[key].value = defaultFilters[key].value;
6478
});
6579
sorting.value.field = '';
6680
sorting.value.order = 1;
6781
pagination.value = {
6882
page: 1,
69-
rows: defaultRows,
83+
rows: initialsRows,
7084
};
7185
fetchData().then(() => {
7286
window.history.replaceState(null, '', window.location.pathname);

resources/js/Composables/usePaginatedData.ts

Lines changed: 24 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -2,39 +2,39 @@ import { ref, computed, onMounted } from 'vue';
22
import { router, usePage } from '@inertiajs/vue3';
33
import { FilterMatchMode } from '@primevue/core/api';
44
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+
interface PaginatedFilteredSortedQueryParams {
10+
filters?: PrimeVueDataFilters;
11+
page?: string;
12+
rows?: string;
13+
sortField?: string;
14+
sortOrder?: string;
1215
}
1316
interface PaginationState {
1417
page: number;
1518
rows: number;
1619
}
1720
interface SortState {
18-
field: undefined | string;
19-
order: undefined | null | 0 | 1 | -1;
21+
field: string;
22+
order: number;
2023
}
2124

2225
export function usePaginatedData(
23-
initialFilters: PrimeVue.PaginatedDataFilters = {},
26+
initialFilters: PrimeVueDataFilters = {},
2427
only: string[] = ['request'],
2528
initialsRows: number = 20
2629
) {
27-
const defaultFilters = initialFilters;
28-
const defaultRows = initialsRows;
29-
3030
const page = usePage<{
3131
request: {
32-
urlParams: PrimeVue.PaginatedDataUrlParams;
32+
urlParams: PaginatedFilteredSortedQueryParams;
3333
};
3434
}>();
3535

3636
const processing = ref<boolean>(false);
37-
const filters = ref<PrimeVue.PaginatedDataFilters>(initialFilters);
37+
const filters = ref<PrimeVueDataFilters>(cloneDeep(initialFilters));
3838
const sorting = ref<SortState>({
3939
field: '',
4040
order: 1,
@@ -76,7 +76,7 @@ export function usePaginatedData(
7676
router.reload({
7777
only: ['request', ...new Set(only)],
7878
data: {
79-
filters: filters.value,
79+
filters: filters.value as any,
8080
...pagination.value,
8181
sortField: sorting.value.field,
8282
sortOrder: sorting.value.order,
@@ -95,9 +95,9 @@ export function usePaginatedData(
9595
});
9696
}
9797

98-
function paginate(pageStateEvent: PageStateEvent) {
99-
pagination.value.page = pageStateEvent.page + 1;
100-
pagination.value.rows = pageStateEvent.rows;
98+
function paginate(event: PageState | DataTablePageEvent) {
99+
pagination.value.page = event.page + 1;
100+
pagination.value.rows = event.rows;
101101
fetchData().then(() => {
102102
scrollToTop();
103103
});
@@ -114,6 +114,7 @@ export function usePaginatedData(
114114
// Alternatively just use: router.get(window.location.pathname);
115115
// Caveat to the above approach, we would lose state from our page not related to pagination/filtering/sorting
116116

117+
const defaultFilters = cloneDeep(initialFilters);
117118
Object.keys(defaultFilters).forEach((key) => {
118119
filters.value[key].value = defaultFilters[key].value;
119120
});
@@ -123,7 +124,7 @@ export function usePaginatedData(
123124
};
124125
pagination.value = {
125126
page: 1,
126-
rows: defaultRows,
127+
rows: initialsRows,
127128
};
128129
fetchData().then(() => {
129130
window.history.replaceState(null, '', window.location.pathname);
@@ -167,18 +168,17 @@ export function usePaginatedData(
167168
});
168169
}
169170

170-
function parseUrlParams(urlParams: PrimeVue.PaginatedDataUrlParams) {
171+
function parseUrlParams(urlParams: PaginatedFilteredSortedQueryParams) {
171172
filters.value = {
172-
...defaultFilters,
173+
...cloneDeep(initialFilters),
173174
...urlParams?.filters,
174175
};
175176
parseUrlFilterValues();
176177
if (urlParams?.sortField) {
177178
sorting.value.field = urlParams.sortField;
178179
}
179180
if (urlParams?.sortOrder) {
180-
sorting.value.order =
181-
(parseInt(urlParams.sortOrder) as 0 | 1 | -1) || null;
181+
sorting.value.order = parseInt(urlParams.sortOrder);
182182
}
183183
if (urlParams?.page) {
184184
pagination.value.page = parseInt(urlParams.page);

resources/js/Layouts/AuthenticatedLayout.vue

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22
import { ref, useTemplateRef, onMounted, onUnmounted, watchEffect } from 'vue';
33
import { useForm } from '@inertiajs/vue3';
44
import ApplicationLogo from '@/Components/ApplicationLogo.vue';
5-
import Container from '@/Components/Container.vue';
65
import LinksMenu from '@/Components/PrimeVue/LinksMenu.vue';
76
import LinksMenuBar from '@/Components/PrimeVue/LinksMenuBar.vue';
87
import LinksPanelMenu from '@/Components/PrimeVue/LinksPanelMenu.vue';

resources/js/Pages/Dashboard.vue

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,3 @@
1-
<script setup>
2-
import AuthenticatedLayout from '@/Layouts/AuthenticatedLayout.vue';
3-
import Container from '@/Components/Container.vue';
4-
</script>
5-
61
<template>
72
<Head title="Dashboard" />
83
<AuthenticatedLayout>

resources/js/Pages/Profile/Edit.vue

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,9 @@
11
<script setup>
2-
import AuthenticatedLayout from '@/Layouts/AuthenticatedLayout.vue';
3-
import Container from '@/Components/Container.vue';
42
import DeleteUserForm from './Partials/DeleteUserForm.vue';
53
import UpdatePasswordForm from './Partials/UpdatePasswordForm.vue';
64
import UpdateProfileInformationForm from './Partials/UpdateProfileInformationForm.vue';
75
86
defineProps({
9-
auth: Object,
107
mustVerifyEmail: {
118
type: Boolean,
129
},

resources/js/app.js

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,9 @@ import { ZiggyVue } from '../../vendor/tightenco/ziggy';
1010
import PrimeVue from 'primevue/config';
1111
import ToastService from 'primevue/toastservice';
1212

13+
import AuthenticatedLayout from '@/Layouts/AuthenticatedLayout.vue';
14+
import Container from '@/Components/Container.vue';
15+
1316
import customThemePreset from '@/theme-preset.js';
1417
import { useDark } from '@vueuse/core';
1518

@@ -34,6 +37,8 @@ createInertiaApp({
3437
.use(ToastService)
3538
.component('Head', Head)
3639
.component('Link', Link)
40+
.component('AuthenticatedLayout', AuthenticatedLayout)
41+
.component('Container', Container)
3742
.mount(el);
3843
},
3944
progress: {

resources/js/types/index.d.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
import { DataTableFilterMetaData } from 'primevue';
2+
13
export interface User {
24
id: number;
35
name: string;
@@ -8,3 +10,7 @@ export interface User {
810
export type PageProps<
911
T extends Record<string, unknown> = Record<string, unknown>
1012
> = T;
13+
14+
export type PrimeVueDataFilters = {
15+
[key: string]: DataTableFilterMetaData;
16+
};

resources/js/types/primevue.d.ts

Lines changed: 0 additions & 22 deletions
This file was deleted.

0 commit comments

Comments
 (0)