11
22<template lang="pug">
3- div
4- .q-pa-md
5- tk-searchfilters( :fields ="fieldsList" )
6- .q-pa-md
7- q-table(
8- :rows ="tickets.data" : rows- per- page- options= "[5, 10, 15]" : loading= "pending" : columns= "columns" row-key ="sequence" : visible- columns= "visibleColumns"
9- v-model:pagination ="pagination" title ="Tickets" @request ="onRequest"
10- rows-per-page-label ="Lignes par page" no-data-label ="Aucune donnée" loading-label ="Chargement..." no-results-label ="Aucun résultat"
11- :pagination-label ="(firstRowIndex, endRowIndex, totalRowsNumber) => `${firstRowIndex}-${endRowIndex} sur ${totalRowsNumber} lignes`"
12- selection ="multiple" v-model:selected ="selected" virtual-scroll :selected-rows-label ="(numberOfRows) => `${numberOfRows} tickets sélectionnées`"
13- )
14- template( v-slot:top )
15- .col-12.col-sm
16- q-btn-group( rounded flat )
17- q-btn( icon ="mdi-eye-check-outline" color ="primary" rounded @click ="markAsRead" size ="md" : disable= "selected.length === 0" primary )
18- q-tooltip.text-body2 ( transition-show ="scale" transition-hide ="scale" ) Marqué comme lu
19- q-btn( flat icon ="mdi-merge" color ="primary" rounded @click ="mergeTickets" size ="md" : disable= "selected.length === 0 || selected.length === 1" )
20- q-tooltip.text-body2 ( transition-show ="scale" transition-hide ="scale" ) Fusionner les tickets sélectionnés
21- q-btn( flat icon ="mdi-eye" color ="primary" rounded @click ="goToTicket(selected[0])" size ="md" : disable= "selected.length === 0 || selected.length !== 1" )
22- q-tooltip.text-body2 ( transition-show ="scale" transition-hide ="scale" ) Afficher les tickets sélectionnés
23- q-btn( flat icon ="mdi-delete" color ="primary" rounded @click ="deleteTickets" size ="md" : disable= "selected.length === 0" )
24- q-tooltip.text-body2 ( transition-show ="scale" transition-hide ="scale" ) Supprimer les tickets sélectionnés
25- .col-12.col-sm.flex.justify-end
26- q-btn-group( rounded flat )
27- q-btn( flat icon ="mdi-table-headers-eye" color ="primary" )
28- q-tooltip.text-body2 ( transition-show ="scale" transition-hide ="scale" ) Afficher/cacher des colones
29- q-menu( max-width ="350px" max-height ="350px" ) .q-pa-md
30- .row
31- .col-6 ( v-for ="column in columns" : key= "column.value" )
32- q-toggle( v-model ="visibleColumns" : label= "column.label" : val= "column.name" )
33- q-btn( flat icon ="mdi-refresh" @click ="refresh" color ="primary" )
34- q-tooltip.text-body2 ( transition-show ="scale" transition-hide ="scale" ) Rafraichir
35- q-btn( icon ="mdi-plus" color ="primary" @click ="$router.push('/tickets/create')" ) Créer
36- template( v-slot:body-cell-actions ="props" )
37- q-td( :props ="props" )
38- q-btn-group( flat rounded )
39- q-btn( icon ="mdi-eye" color ="primary" @click ="goToTicket(props.row)" size ="sm" flat )
40- q-tooltip.text-body2 ( transition-show ="scale" transition-hide ="scale" ) Afficher le ticket
41- q-btn( icon ="mdi-delete" color ="primary" @click ="deleteTickets" size ="sm" flat )
42- q-tooltip.text-body2 ( transition-show ="scale" transition-hide ="scale" ) Supprimer le ticket
43- template( v-slot:body-cell-states ="props" )
44- q-td( :props ="props" )
45- q-icon( name ="mdi-circle " : color= "props.row.lifestep ? 'green' : 'red' " size ="xs" ) .q-mx-xs
46- q-icon( :name ="getType(props.row.type).icon" : color= "getType(props.row.type).color" size ="xs" ) .q-mx-xs
47- q-icon( v-if ="props.row.state && props.row.state.icon" : name= "getState(props.row.state).icon" : color= "getState(props.row.state).color" size ="xs" ) .q-mx-xs
3+ q-page
4+ .q-pa-md
5+ tk-searchfilters( :fields ="fieldsList" )
6+ .q-pa-md
7+ q-table(
8+ :rows ="tickets.data" : rows- per- page- options= "[5, 10, 15]" : loading= "pending" : columns= "columns" row-key ="sequence" : visible- columns= "visibleColumns"
9+ v-model:pagination ="pagination" title ="Tickets" @request ="onRequest"
10+ rows-per-page-label ="Lignes par page" no-data-label ="Aucune donnée" loading-label ="Chargement..." no-results-label ="Aucun résultat"
11+ :pagination-label ="(firstRowIndex, endRowIndex, totalRowsNumber) => `${firstRowIndex}-${endRowIndex} sur ${totalRowsNumber} lignes`"
12+ selection ="multiple" v-model:selected ="selected" virtual-scroll :selected-rows-label ="(numberOfRows) => `${numberOfRows} tickets sélectionnées`"
13+ )
14+ template( v-slot:top )
15+ .col-12.col-sm
16+ q-btn-group( rounded flat )
17+ q-btn( icon ="mdi-eye-check-outline" color ="primary" rounded @click ="markAsRead" size ="md" : disable= "selected.length === 0" primary )
18+ q-tooltip.text-body2 ( transition-show ="scale" transition-hide ="scale" ) Marqué comme lu
19+ q-btn( flat icon ="mdi-merge" color ="primary" rounded @click ="mergeTickets" size ="md" : disable= "selected.length === 0 || selected.length === 1" )
20+ q-tooltip.text-body2 ( transition-show ="scale" transition-hide ="scale" ) Fusionner les tickets sélectionnés
21+ q-btn( flat icon ="mdi-eye" color ="primary" rounded @click ="goToTicket(selected[0])" size ="md" : disable= "selected.length === 0 || selected.length !== 1" )
22+ q-tooltip.text-body2 ( transition-show ="scale" transition-hide ="scale" ) Afficher les tickets sélectionnés
23+ q-btn( flat icon ="mdi-delete" color ="primary" rounded @click ="deleteTickets" size ="md" : disable= "selected.length === 0" )
24+ q-tooltip.text-body2 ( transition-show ="scale" transition-hide ="scale" ) Supprimer les tickets sélectionnés
25+ .col-12.col-sm.flex.justify-end
26+ q-btn-group( rounded flat )
27+ q-btn( flat icon ="mdi-table-headers-eye" color ="primary" )
28+ q-tooltip.text-body2 ( transition-show ="scale" transition-hide ="scale" ) Afficher/cacher des colones
29+ q-menu( max-width ="350px" max-height ="350px" ) .q-pa-md
30+ .row
31+ .col-6 ( v-for ="column in columns" : key= "column.value" )
32+ q-toggle( v-model ="visibleColumns" : label= "column.label" : val= "column.name" )
33+ q-btn( flat icon ="mdi-refresh" @click ="refresh" color ="primary" )
34+ q-tooltip.text-body2 ( transition-show ="scale" transition-hide ="scale" ) Rafraichir
35+ q-btn( icon ="mdi-plus" color ="primary" @click ="$router.push('/tickets/create')" ) Créer
36+ template( v-slot:body-cell-actions ="props" )
37+ q-td( :props ="props" )
38+ q-btn-group( flat rounded )
39+ q-btn( icon ="mdi-eye" color ="primary" @click ="goToTicket(props.row)" size ="sm" flat )
40+ q-tooltip.text-body2 ( transition-show ="scale" transition-hide ="scale" ) Afficher le ticket
41+ q-btn( icon ="mdi-delete" color ="primary" @click ="deleteTickets" size ="sm" flat )
42+ q-tooltip.text-body2 ( transition-show ="scale" transition-hide ="scale" ) Supprimer le ticket
43+ template( v-slot:body-cell-states ="props" )
44+ q-td( :props ="props" )
45+ q-icon( : name ="getLifeStep(props.row.lifestep).icon " : color= "getLifeStep( props.row.lifestep).color " size ="xs" ) .q-mx-xs
46+ q-icon( :name ="getType(props.row.type).icon" : color= "getType(props.row.type).color" size ="xs" ) .q-mx-xs
47+ q-icon( v-if ="props.row.state && props.row.state.icon" : name= "getState(props.row.state).icon" : color= "getState(props.row.state).color" size ="xs" ) .q-mx-xs
4848
49- template( v-slot:body-cell-envelope.senders.name ="props" )
50- q-td( :props ="props" )
51- span.q-ml-sm {{ props.row.envelope.senders.length === 0 ? "Pas d'appelant" : props.row.envelope.senders[0].name }}
52- span( v-if ="props.row.envelope.senders.length > 1" ) , {{ props.row.envelope.senders.length -1 }} autre{{ props.row.envelope.senders.length === 2 ? '' : 's' }}...
53- q-tooltip.text-body2 ( transition-show ="scale" transition-hide ="scale" ) ...{{ [...props.row.envelope.senders].slice(1).map(s => s.name).join(', ') }}
49+ template( v-slot:body-cell-envelope.senders.name ="props" )
50+ q-td( :props ="props" )
51+ span.q-ml-sm {{ props.row.envelope.senders.length === 0 ? "Pas d'appelant" : props.row.envelope.senders[0].name }}
52+ span( v-if ="props.row.envelope.senders.length > 1" ) , {{ props.row.envelope.senders.length -1 }} autre{{ props.row.envelope.senders.length === 2 ? '' : 's' }}...
53+ q-tooltip.text-body2 ( transition-show ="scale" transition-hide ="scale" ) ...{{ [...props.row.envelope.senders].slice(1).map(s => s.name).join(', ') }}
5454
55- template( v-slot:body-cell-envelope.observers.name ="props" )
56- q-td( :props ="props" )
57- span.q-ml-sm {{ props.row.envelope.observers.length === 0 ? "Pas de concerné" : props.row.envelope.observers[0].name }}
58- span( v-if ="props.row.envelope.observers.length > 1" ) , {{ props.row.envelope.observers.length -1 }} autre{{ props.row.envelope.observers.length === 2 ? '' : 's' }}...
59- q-tooltip.text-body2 ( transition-show ="scale" transition-hide ="scale" ) ...{{ [...props.row.envelope.observers].slice(1).map(s => s.name).join(', ') }}
55+ template( v-slot:body-cell-envelope.observers.name ="props" )
56+ q-td( :props ="props" )
57+ span.q-ml-sm {{ props.row.envelope.observers.length === 0 ? "Pas de concerné" : props.row.envelope.observers[0].name }}
58+ span( v-if ="props.row.envelope.observers.length > 1" ) , {{ props.row.envelope.observers.length -1 }} autre{{ props.row.envelope.observers.length === 2 ? '' : 's' }}...
59+ q-tooltip.text-body2 ( transition-show ="scale" transition-hide ="scale" ) ...{{ [...props.row.envelope.observers].slice(1).map(s => s.name).join(', ') }}
6060
61- template( v-slot:body-cell-envelope.assigned.name ="props" )
62- q-td( :props ="props" )
63- span.q-ml-sm {{ props.row.envelope.assigned.length === 0 ? "Pas d'assigné" : props.row.envelope.assigned[0].name }}
64- span( v-if ="props.row.envelope.assigned.length > 1" ) , {{ props.row.envelope.assigned.length -1 }} autre{{ props.row.envelope.assigned.length === 2 ? '' : 's' }}...
65- q-tooltip.text-body2 ( transition-show ="scale" transition-hide ="scale" ) ...{{ [...props.row.envelope.assigned].slice(1).map(s => s.name).join(', ') }}
61+ template( v-slot:body-cell-envelope.assigned.name ="props" )
62+ q-td( :props ="props" )
63+ span.q-ml-sm {{ props.row.envelope.assigned.length === 0 ? "Pas d'assigné" : props.row.envelope.assigned[0].name }}
64+ span( v-if ="props.row.envelope.assigned.length > 1" ) , {{ props.row.envelope.assigned.length -1 }} autre{{ props.row.envelope.assigned.length === 2 ? '' : 's' }}...
65+ q-tooltip.text-body2 ( transition-show ="scale" transition-hide ="scale" ) ...{{ [...props.row.envelope.assigned].slice(1).map(s => s.name).join(', ') }}
6666</template >
6767
6868<script lang="ts" setup>
@@ -72,6 +72,7 @@ import { computed, useDayjs, onMounted, onBeforeMount } from "#imports";
7272import { useRoute , useRouter } from " nuxt/app" ;
7373import type { QTableProps } from " quasar" ;
7474import type { components } from ' #build/types/service-api'
75+ import { ticketType , lifeSteps } from " #imports" ;
7576type Ticket = components [" schemas" ][' TicketDto' ]
7677type State = components [" schemas" ][' StatesDto' ]
7778
@@ -80,27 +81,27 @@ const route = useRoute()
8081const router = useRouter ()
8182
8283const { data : tickets, pending, refresh, error } = await useHttpApi (' /tickets/ticket' , {
83- method: ' get' ,
84- query: computed (() => {
85- return {
86- ... route .query ,
87- }
88- })
84+ method: ' get' ,
85+ query: computed (() => {
86+ return {
87+ ... route .query ,
88+ }
89+ })
8990}).catch ((err ) => console .error (err ))
9091const { data : categories, pending : categoriesPending, refresh : categoriesRefresh, error : categoriesError } = await useHttpApi (' /core/categories' , {
91- method: ' get'
92+ method: ' get'
9293})
9394const { data : states, pending : statesPending, refresh : statesRefresh, error : statesError } = await useHttpApi (' /tickets/state' , {
94- method: ' get'
95+ method: ' get'
9596})
9697
9798onMounted (async () => {
98- pagination .value ! .rowsNumber = tickets .value ?.total
99- const query = { ... route .query }
100- const limit = query .limit ?? 10
101- const skip = query .skip ?? 0
102- pagination .value ! .rowsPerPage = parseInt (limit as string )
103- pagination .value ! .page = parseInt (skip as string ) / parseInt (limit as string ) + 1
99+ pagination .value ! .rowsNumber = tickets .value ?.total
100+ const query = { ... route .query }
101+ const limit = query .limit ?? 10
102+ const skip = query .skip ?? 0
103+ pagination .value ! .rowsPerPage = parseInt (limit as string )
104+ pagination .value ! .page = parseInt (skip as string ) / parseInt (limit as string ) + 1
104105
105106 let sortKey = ' updatedAt'
106107 let sortDirection = ' desc'
@@ -116,16 +117,6 @@ onMounted(async () => {
116117})
117118
118119const selected = ref <Ticket []>([])
119- const ticketType = ref <{
120- label: string ,
121- value: number ,
122- icon: string ,
123- color: string
124- }[]>([
125- { label: ' Incident' , value: 1 , icon: ' mdi-account-alert' , color: ' red' },
126- { label: ' Demande' , value: 2 , icon: ' mdi-account-question' , color: ' primary' },
127- ])
128-
129120const columns = ref <QTableProps [' columns' ]>([
130121 {
131122 name: ' states' ,
@@ -225,13 +216,13 @@ const pagination = ref<QTableProps['pagination']>({
225216})
226217
227218const onRequest = async (props : any ) => {
228- const { page, rowsPerPage, sortBy, descending } = props .pagination
229- pagination .value ! .rowsNumber = tickets .value ?.total
230- pagination .value ! .page = page
231- pagination .value ! .rowsPerPage = rowsPerPage
232- pagination .value ! .sortBy = sortBy
233- pagination .value ! .descending = descending
234- paginationQuery ()
219+ const { page, rowsPerPage, sortBy, descending } = props .pagination
220+ pagination .value ! .rowsNumber = tickets .value ?.total
221+ pagination .value ! .page = page
222+ pagination .value ! .rowsPerPage = rowsPerPage
223+ pagination .value ! .sortBy = sortBy
224+ pagination .value ! .descending = descending
225+ paginationQuery ()
235226}
236227
237228const paginationQuery = () => {
@@ -282,14 +273,19 @@ const fieldsList = computed(() => {
282273})
283274
284275const getState = (state : { id: string , name: string }) => {
285- const findedState = states .value ?.data .find ((s : any ) => {
286- return s ._id === state .id
287- })
288- return findedState
276+ const findedState = states .value ?.data .find ((s : any ) => {
277+ return s ._id === state .id
278+ })
279+ return findedState
289280}
290281
291282const getType = (type : number ) => {
292- return ticketType .value .find (t => t .value === type )
283+ return ticketType .find (t => t .value === type )
284+ }
285+
286+ const getLifeStep = (type : number ) => {
287+ const lifeStep = lifeSteps .find (l => l .value === type )
288+ return lifeStep
293289}
294290
295291const markAsRead = () => {
@@ -307,6 +303,5 @@ const deleteTickets = () => {
307303provide (' fieldsList' , fieldsList )
308304provide (' stateFetch' , { data: states , pending: statesPending , refresh: statesRefresh , error: statesError })
309305provide (' categoriesFetch' , { data: categories , pending: categoriesPending , refresh: categoriesRefresh , error: categoriesError })
310- provide (' ticketType' , ticketType )
311306
312307 </script >
0 commit comments