Skip to content

Commit d8d0762

Browse files
authored
Fixes
1 parent 873b388 commit d8d0762

File tree

5 files changed

+58
-59
lines changed

5 files changed

+58
-59
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: 22 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,13 @@
11
import { usePaginatedData } from './usePaginatedData';
2-
import * as PrimeVue from '@/types/primevue';
2+
import cloneDeep from 'lodash-es/cloneDeep';
3+
import { DataTableFilterMetaData, DataTableFilterEvent, DataTableSortEvent } from 'primevue';
4+
import { PrimeVueDataFilters } from '@/types';
35

46
export function useLazyDataTable(
5-
initialFilters: PrimeVue.PaginatedDataFilters = {},
7+
initialFilters: PrimeVueDataFilters = {},
68
only: string[] = ['request'],
79
initialsRows: number = 20
810
) {
9-
const defaultFilters = initialFilters;
10-
const defaultRows = initialsRows;
11-
1211
const {
1312
processing,
1413
filters,
@@ -36,19 +35,29 @@ export function useLazyDataTable(
3635
* "Override" parent composable function
3736
* Event driven filtering rather than reactive state
3837
*/
39-
function filter(event: { filters: PrimeVue.PaginatedDataFilters }) {
38+
function filter(event: DataTableFilterEvent) {
4039
pagination.value.page = 1;
41-
filters.value = { ...event.filters };
40+
const newFilters: PrimeVueDataFilters = {};
41+
Object.entries(event.filters).forEach(([key, rawFilter]) => {
42+
if (
43+
rawFilter &&
44+
typeof rawFilter === 'object' &&
45+
'matchMode' in rawFilter
46+
) {
47+
newFilters[key] = rawFilter as DataTableFilterMetaData;
48+
}
49+
});
50+
filters.value = newFilters;
4251
parseEventFilterValues();
4352
fetchData().then(() => {
4453
scrollToTop();
4554
});
4655
}
4756

48-
function sort(event: PrimeVue.SortEvent) {
57+
function sort(event: DataTableSortEvent) {
4958
pagination.value.page = 1;
50-
sorting.value.field = event.sortField;
51-
sorting.value.order = event.sortOrder;
59+
sorting.value.field = String(event.sortField);
60+
sorting.value.order = event.sortOrder || 1;
5261
fetchData().then(() => {
5362
scrollToTop();
5463
});
@@ -59,14 +68,15 @@ export function useLazyDataTable(
5968
* usePaginatedData() resets sorting.value state as a new object, this will not work for DataTable's
6069
*/
6170
function reset() {
71+
const defaultFilters = cloneDeep(initialFilters);
6272
Object.keys(defaultFilters).forEach((key) => {
6373
filters.value[key].value = defaultFilters[key].value;
6474
});
6575
sorting.value.field = '';
6676
sorting.value.order = 1;
6777
pagination.value = {
6878
page: 1,
69-
rows: defaultRows,
79+
rows: initialsRows,
7080
};
7181
fetchData().then(() => {
7282
window.history.replaceState(null, '', window.location.pathname);
@@ -87,4 +97,4 @@ export function useLazyDataTable(
8797
sort,
8898
reset,
8999
};
90-
}
100+
}

resources/js/Composables/usePaginatedData.ts

Lines changed: 29 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -2,39 +2,43 @@ 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+
// TODO: npm install qs
10+
// const queryString = window.location.search;
11+
// const parsed = qs.parse(queryString, { ignoreQueryPrefix: true });
12+
13+
interface PaginatedFilterableSortableQueryParams {
14+
filters?: PrimeVueDataFilters;
15+
page?: string;
16+
rows?: string;
17+
sortField?: string;
18+
sortOrder?: string;
1219
}
1320
interface PaginationState {
1421
page: number;
1522
rows: number;
1623
}
1724
interface SortState {
18-
field: undefined | string;
19-
order: undefined | null | 0 | 1 | -1;
25+
field: string;
26+
order: number;
2027
}
2128

2229
export function usePaginatedData(
23-
initialFilters: PrimeVue.PaginatedDataFilters = {},
30+
initialFilters: PrimeVueDataFilters = {},
2431
only: string[] = ['request'],
2532
initialsRows: number = 20
2633
) {
27-
const defaultFilters = initialFilters;
28-
const defaultRows = initialsRows;
29-
3034
const page = usePage<{
3135
request: {
32-
urlParams: PrimeVue.PaginatedDataUrlParams;
36+
urlParams: PaginatedFilterableSortableQueryParams;
3337
};
3438
}>();
3539

3640
const processing = ref<boolean>(false);
37-
const filters = ref<PrimeVue.PaginatedDataFilters>(initialFilters);
41+
const filters = ref<PrimeVueDataFilters>(cloneDeep(initialFilters));
3842
const sorting = ref<SortState>({
3943
field: '',
4044
order: 1,
@@ -76,7 +80,7 @@ export function usePaginatedData(
7680
router.reload({
7781
only: ['request', ...new Set(only)],
7882
data: {
79-
filters: filters.value,
83+
filters: filters.value as any,
8084
...pagination.value,
8185
sortField: sorting.value.field,
8286
sortOrder: sorting.value.order,
@@ -95,9 +99,9 @@ export function usePaginatedData(
9599
});
96100
}
97101

98-
function paginate(pageStateEvent: PageStateEvent) {
99-
pagination.value.page = pageStateEvent.page + 1;
100-
pagination.value.rows = pageStateEvent.rows;
102+
function paginate(event: PageState | DataTablePageEvent) {
103+
pagination.value.page = event.page + 1;
104+
pagination.value.rows = event.rows;
101105
fetchData().then(() => {
102106
scrollToTop();
103107
});
@@ -114,6 +118,7 @@ export function usePaginatedData(
114118
// Alternatively just use: router.get(window.location.pathname);
115119
// Caveat to the above approach, we would lose state from our page not related to pagination/filtering/sorting
116120

121+
const defaultFilters = cloneDeep(initialFilters);
117122
Object.keys(defaultFilters).forEach((key) => {
118123
filters.value[key].value = defaultFilters[key].value;
119124
});
@@ -123,7 +128,7 @@ export function usePaginatedData(
123128
};
124129
pagination.value = {
125130
page: 1,
126-
rows: defaultRows,
131+
rows: initialsRows,
127132
};
128133
fetchData().then(() => {
129134
window.history.replaceState(null, '', window.location.pathname);
@@ -167,18 +172,17 @@ export function usePaginatedData(
167172
});
168173
}
169174

170-
function parseUrlParams(urlParams: PrimeVue.PaginatedDataUrlParams) {
175+
function parseUrlParams(urlParams: PaginatedFilterableSortableQueryParams) {
171176
filters.value = {
172-
...defaultFilters,
177+
...cloneDeep(initialFilters),
173178
...urlParams?.filters,
174179
};
175180
parseUrlFilterValues();
176181
if (urlParams?.sortField) {
177182
sorting.value.field = urlParams.sortField;
178183
}
179184
if (urlParams?.sortOrder) {
180-
sorting.value.order =
181-
(parseInt(urlParams.sortOrder) as 0 | 1 | -1) || null;
185+
sorting.value.order = parseInt(urlParams.sortOrder);
182186
}
183187
if (urlParams?.page) {
184188
pagination.value.page = parseInt(urlParams.page);
@@ -204,4 +208,4 @@ export function usePaginatedData(
204208
reset,
205209
parseUrlParams,
206210
};
207-
}
211+
}

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)