Skip to content

Commit c90f9f2

Browse files
ValentinCrochemorealanpoulain
authored andcommitted
Fix pagination
1 parent 2463ebd commit c90f9f2

File tree

2 files changed

+87
-28
lines changed

2 files changed

+87
-28
lines changed

templates/quasar/components/foo/FooList.vue

Lines changed: 84 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,10 @@
2121
{{/if}}
2222

2323
<q-table
24-
v-model:pagination="pagination"
24+
:pagination="pagination"
2525
:rows="items"
2626
:columns="columns"
27+
:rows-per-page-options="[30]"
2728
:loading="isLoading"
2829
:no-data-label="$t('unavail')"
2930
:no-results-label="$t('noresults')"
@@ -42,6 +43,7 @@
4243
@delete="deleteItem(row)"
4344
/>
4445
</template>
46+
4547
{{#each fields}}
4648
{{#if isReferences}}
4749
<template #body-cell-{{reference.name}}="{ value }">
@@ -119,6 +121,57 @@
119121
</template>
120122
{{/if}}
121123
{{/each}}
124+
125+
<template #pagination="{ pagesNumber }">
126+
<template v-if="view">
127+
<q-btn
128+
v-if="pagesNumber > 2"
129+
:to="view['hydra:first'] ? view['hydra:first'] : { name: 'BookList' }"
130+
:disable="!view['hydra:previous']"
131+
icon="first_page"
132+
color="grey-8"
133+
round
134+
dense
135+
flat
136+
/>
137+
138+
<q-btn
139+
:to="
140+
!view['hydra:previous'] ||
141+
view['hydra:previous'] === view['hydra:first']
142+
? { name: 'BookList' }
143+
: view['hydra:previous']
144+
"
145+
:disable="!view['hydra:previous']"
146+
icon="chevron_left"
147+
color="grey-8"
148+
round
149+
dense
150+
flat
151+
/>
152+
153+
<q-btn
154+
:to="view['hydra:next'] ? view['hydra:next'] : '#'"
155+
:disable="!view['hydra:next']"
156+
icon="chevron_right"
157+
color="grey-8"
158+
round
159+
dense
160+
flat
161+
/>
162+
163+
<q-btn
164+
v-if="pagesNumber > 2"
165+
:to="view['hydra:last'] ? view['hydra:last'] : '#'"
166+
:disable="!view['hydra:next']"
167+
icon="last_page"
168+
color="grey-8"
169+
round
170+
dense
171+
flat
172+
/>
173+
</template>
174+
</template>
122175
</q-table>
123176
</template>
124177

@@ -130,7 +183,7 @@ import Filter from 'src/components/{{lc}}/{{titleUcFirst}}Filter.vue';
130183
import Toolbar from 'src/components/common/CommonToolbar.vue';
131184
import Breadcrumb from 'src/components/common/CommonBreadcrumb.vue';
132185
import ActionCell from 'src/components/common/CommonActionCell.vue';
133-
import { useRouter } from 'vue-router';
186+
import { useRoute, useRouter } from 'vue-router';
134187
import { useI18n } from 'vue-i18n';
135188
{{#if hasDateField}}
136189
import { formatDateTime } from 'src/utils/date';
@@ -146,28 +199,26 @@ import { {{titleUcFirst}} } from 'src/types/{{lc}}';
146199
import { Pagination{{#if parameters.length}}, Filters{{/if}} } from 'src/types/list';
147200
148201
const { t } = useI18n();
202+
const route = useRoute();
149203
const router = useRouter();
150204
const breadcrumb = useBreadcrumb();
151205
152206
const {{lc}}ListStore = use{{titleUcFirst}}ListStore();
153-
const { items, totalItems, error, isLoading } = storeToRefs({{lc}}ListStore);
207+
const { items, totalItems, view, error, isLoading } = storeToRefs({{lc}}ListStore);
154208
155209
const {{lc}}DeleteStore = use{{titleUcFirst}}DeleteStore();
156210
const { deleted, mercureDeleted } = storeToRefs({{lc}}DeleteStore);
157211
158-
async function sendRequest(params = {}) {
159-
await {{lc}}ListStore.getItems(params);
160-
}
161-
162-
useMercureList({ store: {{lc}}ListStore, deleteStore: {{lc}}DeleteStore });
163-
164-
const nextPage = ref(1);
212+
const page = ref('1');
213+
{{#if parameters.length}}
214+
const filters: Ref<Filters> = ref({});
215+
{{/if}}
165216
const pagination: Pagination = {
166217
sortBy: undefined,
167218
descending: false,
168-
page: 1, // page to be displayed
169-
rowsPerPage: 3, // maximum displayed rows
170-
rowsNumber: 10, // max number of rows
219+
page: 1,
220+
rowsPerPage: 3,
221+
rowsNumber: 1,
171222
};
172223
const columns = [
173224
{ name: 'actions', label: t('actions'), field: '' },
@@ -189,22 +240,29 @@ const columns = [
189240
{{/each }}
190241
];
191242
192-
await sendRequest({ pagination });
243+
watch(
244+
() => route.query.page,
245+
(newPage) => {
246+
page.value = newPage as string;
247+
sendRequest();
248+
},
249+
{ immediate: true }
250+
);
193251
194-
watch(items, () => {
195-
pagination.page = nextPage.value;
196-
pagination.rowsNumber = totalItems.value;
197-
nextPage.value = 1;
198-
});
252+
async function sendRequest() {
253+
await {{lc}}ListStore.getItems(page.value, { {{#if parameters.length}}filters: filters.value{{/if}} });
254+
}
199255
200-
{{#if parameters.length}}
201-
const filters: Ref<Filters> = ref({});
256+
useMercureList({ store: {{lc}}ListStore, deleteStore: {{lc}}DeleteStore });
257+
258+
await sendRequest();
259+
260+
pagination.rowsPerPage = items.value.length;
261+
pagination.rowsNumber = totalItems.value;
202262
263+
{{#if parameters.length}}
203264
function onSendFilter() {
204-
sendRequest({
205-
filters: filters.value,
206-
pagination,
207-
});
265+
sendRequest();
208266
}
209267
210268
function resetFilter() {
@@ -233,7 +291,7 @@ function gotToEditPage(item: {{titleUcFirst}}) {
233291
async function deleteItem(item: {{titleUcFirst}}) {
234292
await {{lc}}DeleteStore.deleteItem(item);
235293
236-
sendRequest({ pagination });
294+
sendRequest();
237295
}
238296
239297
useWatchErrors([error]);

templates/quasar/stores/foo/list.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,11 +26,12 @@ export const use{{titleUcFirst}}ListStore = defineStore('{{lc}}List', {
2626
}),
2727

2828
actions: {
29-
async getItems(params: ListParams) {
29+
async getItems(page: string, params: ListParams) {
3030
this.toggleLoading();
3131

3232
try {
33-
const response = await fetch('{{name}}', { params });
33+
const path = page ? `{{name}}?page=${page}` : '{{name}}';
34+
const response = await fetch(path, { params });
3435
const data: PagedCollection<{{titleUcFirst}}> = await response.json();
3536
const hubUrl = extractHubURL(response);
3637

0 commit comments

Comments
 (0)