11<template lang="pug">
2- q-page.container
3- q-table(
4- title ="Journal des jobs"
5- v-model:expanded ="expanded"
6- :rows ="rows || []"
7- :columns ="columns"
8- :rows-per-page-options ="[18, 100, 0]"
9- row-key ="jobId"
10- bordered
11- dense
12- flat
13- )
14- template( v-slot:top-right )
2+ q-page.container.q-pa-sm
3+ q-card( bordered square flat style ='border-bottom: none;' )
4+ q-card-section.q-pa-none
5+ q-toolbar( bordered dense style ='height: 28px; line-height: 28px;' )
6+ q-toolbar-title Journal des jobs
7+ q-btn(
8+ icon ='mdi-refresh'
9+ color ='primary'
10+ flat
11+ round
12+ dense
13+ :loading ='pending'
14+ :disable ='pending'
15+ @click ='refreshJobs'
16+ )
17+
18+ q-separator
19+ q-toolbar( bordered dense style ='height: 28px; line-height: 28px;' )
20+ q-space
1521 q-select(
1622 v-model ="stateFilter"
1723 :options ="foptions"
@@ -23,8 +29,22 @@ q-page.container
2329 style ="width: 150px"
2430 map-options
2531 )
26- template( v-slot:append )
27- q-icon( name ="mdi-filter" )
32+ q-table(
33+ flat
34+ bordered
35+ dense
36+ binary-state-sort
37+ v-model:pagination ='pagination'
38+ v-model:expanded ='expanded'
39+ :rows ='rows || []'
40+ :columns ='columns'
41+ :rows-per-page-options ='[16, 32, 64, 100]'
42+ :loading ='pending'
43+ :pagination-label ='(firstRowIndex, endRowIndex, totalRowsNumber) => `${firstRowIndex}-${endRowIndex} sur ${totalRowsNumber} lignes`'
44+ row-key ='jobId'
45+ @request ='onRequest'
46+ )
47+ template( v-slot:top-right )
2848 template( v-slot:no-data )
2949 div.text-center.q-pa-md
3050 span Aucune donnée à afficher.
@@ -113,13 +133,23 @@ export default defineComponent({
113133 },
114134 async setup() {
115135 const { monacoOptions } = useDebug ()
116- const $route = useRoute ()
136+ const route = useRoute ()
137+ const router = useRouter ()
138+ const pagination = ref ({
139+ sortBy: ' date' ,
140+ descending: true ,
141+ page: route .query .page ? parseInt (route .query .page as string , 10 ) : 1 ,
142+ rowsPerPage: route .query .limit ? parseInt (route .query .limit as string , 10 ) : 16 ,
143+ rowsNumber: 0 ,
144+ })
117145 const query = computed (() => {
146+ const { page, limit, skip, ... restQuery } = route .query
147+
118148 return {
119- limit: 2000 ,
120- skip: 0 ,
149+ limit: pagination . value . rowsPerPage ,
150+ skip: ( pagination . value . page - 1 ) * pagination . value . rowsPerPage ,
121151 ' sort[metadata.lastUpdatedAt]' : ' desc' ,
122- ... $route . query ,
152+ ... restQuery ,
123153 }
124154 })
125155
@@ -131,17 +161,18 @@ export default defineComponent({
131161 } = await useHttp <any >(' /core/jobs' , {
132162 method: ' GET' ,
133163 transform : (result ) => {
134- const data = result ?.data ?.map ((enr ) => {
135- return enr
136- })
137-
138- return data || []
164+ return result ?.data || []
165+ },
166+ onResponse({ response }) {
167+ pagination .value .rowsNumber = response ?._data ?.total || 0
139168 },
140169 query ,
141170 })
142171
143172 return {
144173 monacoOptions ,
174+ router ,
175+ pagination ,
145176 rows ,
146177 pending ,
147178 error ,
@@ -181,16 +212,35 @@ export default defineComponent({
181212 },
182213 },
183214 methods: {
215+ async onRequest(props ): Promise <void > {
216+ const { page, rowsPerPage } = props .pagination
217+
218+ this .pagination .page = page
219+ this .pagination .rowsPerPage = rowsPerPage
220+
221+ await this .router .replace ({
222+ query: {
223+ ... this .$route .query ,
224+ page: ` ${page } ` ,
225+ limit: ` ${rowsPerPage } ` ,
226+ },
227+ })
228+ },
229+ async refreshJobs(): Promise <void > {
230+ await this .refresh ()
231+ },
184232 updateStateFilter(selection : { value: string | null }): void {
185233 const query = {
186234 ... this .$route .query ,
235+ page: ' 1' ,
187236 }
188237
189238 if (! selection .value ) {
190239 delete query [' filters[:state]' ]
191240 } else {
192241 query [' filters[:state]' ] = selection .value
193242 }
243+ delete query .skip
194244
195245 this .$router .replace ({
196246 query ,
0 commit comments