Skip to content

Commit 8d8c9f2

Browse files
authored
Merge pull request #117 from connorabbas/develop
Composable fixes
2 parents 4b763df + 873b388 commit 8d8c9f2

File tree

2 files changed

+50
-11
lines changed

2 files changed

+50
-11
lines changed

resources/js/Composables/useLazyDataTable.ts

Lines changed: 28 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,13 @@ import { usePaginatedData } from './usePaginatedData';
22
import * as PrimeVue from '@/types/primevue';
33

44
export function useLazyDataTable(
5-
defaultFilters: PrimeVue.PaginatedDataFilters = {},
5+
initialFilters: PrimeVue.PaginatedDataFilters = {},
66
only: string[] = ['request'],
77
initialsRows: number = 20
88
) {
9+
const defaultFilters = initialFilters;
10+
const defaultRows = initialsRows;
11+
912
const {
1013
processing,
1114
filters,
@@ -17,8 +20,7 @@ export function useLazyDataTable(
1720
scrollToTop,
1821
fetchData,
1922
paginate,
20-
reset,
21-
} = usePaginatedData(defaultFilters, only, initialsRows);
23+
} = usePaginatedData(initialFilters, only, initialsRows);
2224

2325
function parseEventFilterValues() {
2426
Object.keys(filters.value).forEach((key) => {
@@ -30,6 +32,10 @@ export function useLazyDataTable(
3032
});
3133
}
3234

35+
/**
36+
* "Override" parent composable function
37+
* Event driven filtering rather than reactive state
38+
*/
3339
function filter(event: { filters: PrimeVue.PaginatedDataFilters }) {
3440
pagination.value.page = 1;
3541
filters.value = { ...event.filters };
@@ -48,6 +54,25 @@ export function useLazyDataTable(
4854
});
4955
}
5056

57+
/**
58+
* "Override" parent composable function
59+
* usePaginatedData() resets sorting.value state as a new object, this will not work for DataTable's
60+
*/
61+
function reset() {
62+
Object.keys(defaultFilters).forEach((key) => {
63+
filters.value[key].value = defaultFilters[key].value;
64+
});
65+
sorting.value.field = '';
66+
sorting.value.order = 1;
67+
pagination.value = {
68+
page: 1,
69+
rows: defaultRows,
70+
};
71+
fetchData().then(() => {
72+
window.history.replaceState(null, '', window.location.pathname);
73+
});
74+
}
75+
5176
return {
5277
processing,
5378
filters,

resources/js/Composables/usePaginatedData.ts

Lines changed: 22 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -20,24 +20,27 @@ interface SortState {
2020
}
2121

2222
export function usePaginatedData(
23-
defaultFilters: PrimeVue.PaginatedDataFilters = {},
23+
initialFilters: PrimeVue.PaginatedDataFilters = {},
2424
only: string[] = ['request'],
2525
initialsRows: number = 20
2626
) {
27+
const defaultFilters = initialFilters;
28+
const defaultRows = initialsRows;
29+
2730
const page = usePage<{
2831
request: {
2932
urlParams: PrimeVue.PaginatedDataUrlParams;
3033
};
3134
}>();
3235

3336
const processing = ref<boolean>(false);
34-
const filters = ref<PrimeVue.PaginatedDataFilters>(defaultFilters);
37+
const filters = ref<PrimeVue.PaginatedDataFilters>(initialFilters);
3538
const sorting = ref<SortState>({
3639
field: '',
3740
order: 1,
3841
});
3942
const pagination = ref<PaginationState>({
40-
page: parseInt(page.props.request.urlParams?.page ?? '1'),
43+
page: 1,
4144
rows: initialsRows,
4245
});
4346

@@ -108,16 +111,23 @@ export function usePaginatedData(
108111
}
109112

110113
function reset() {
111-
filters.value = defaultFilters;
114+
// Alternatively just use: router.get(window.location.pathname);
115+
// Caveat to the above approach, we would lose state from our page not related to pagination/filtering/sorting
116+
117+
Object.keys(defaultFilters).forEach((key) => {
118+
filters.value[key].value = defaultFilters[key].value;
119+
});
112120
sorting.value = {
113121
field: '',
114122
order: 1,
115123
};
116124
pagination.value = {
117125
page: 1,
118-
rows: initialsRows,
126+
rows: defaultRows,
119127
};
120-
fetchData();
128+
fetchData().then(() => {
129+
window.history.replaceState(null, '', window.location.pathname);
130+
});
121131
}
122132

123133
function parseUrlFilterValues() {
@@ -164,10 +174,14 @@ export function usePaginatedData(
164174
};
165175
parseUrlFilterValues();
166176
if (urlParams?.sortField) {
167-
sorting.value.field = urlParams?.sortField;
177+
sorting.value.field = urlParams.sortField;
168178
}
169179
if (urlParams?.sortOrder) {
170-
sorting.value.order = parseInt(urlParams?.sortOrder) ? 1 : 0;
180+
sorting.value.order =
181+
(parseInt(urlParams.sortOrder) as 0 | 1 | -1) || null;
182+
}
183+
if (urlParams?.page) {
184+
pagination.value.page = parseInt(urlParams.page);
171185
}
172186
}
173187

0 commit comments

Comments
 (0)