Skip to content

Commit 85c4c5c

Browse files
q-page + enum as static in front
1 parent e550cf3 commit 85c4c5c

File tree

6 files changed

+125
-123
lines changed

6 files changed

+125
-123
lines changed

app/src/components/searchfilters/RightSelect.vue

Lines changed: 15 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -13,16 +13,16 @@ q-select(
1313
@add="addFilter($event)"
1414
@remove="removeFilter($event)"
1515
)
16-
template(v-slot:option="{ index, itemProps, opt, selected, toggleOption }")
17-
q-item-label(v-bind="itemProps" v-if="opt.header" header) {{ opt.label }}
18-
//@click.capture='addFilter({index, value: opt})'
19-
q-item(v-bind="itemProps" v-else)
20-
q-item-section(side)
21-
q-icon(:name="opt.icon" :color="opt.color" size="xs")
22-
q-item-section
23-
q-item-label(v-html="opt.label")
24-
q-item-section(side)
25-
q-toggle(:model-value="selected" @update:model-value="toggleOption")
16+
template(v-slot:option="{ index, itemProps, opt, selected, toggleOption }")
17+
q-item-label(v-bind="itemProps" v-if="opt.header" header) {{ opt.label }}
18+
//@click.capture='addFilter({index, value: opt})'
19+
q-item(v-bind="itemProps" v-else)
20+
q-item-section(side)
21+
q-icon(:name="opt.icon" :color="opt.color" size="xs")
22+
q-item-section
23+
q-item-label(v-html="opt.label")
24+
q-item-section(side)
25+
q-toggle(:model-value="selected" @update:model-value="toggleOption")
2626

2727
</template>
2828

@@ -32,7 +32,7 @@ import type { Ref } from 'vue'
3232
import { useHttpApi } from "~/composables/useHttpApi";
3333
import type { components } from '#build/types/service-api'
3434
import { useRoute, useRouter } from 'nuxt/app';
35-
35+
import { ticketType, lifeSteps } from "#imports";
3636
type Category = components['schemas']['CategoriesDto']
3737
type State = components['schemas']['StatesDto']
3838
@@ -49,12 +49,7 @@ const router = useRouter()
4949
5050
const { data: statesData } = inject('stateFetch')
5151
const { data: categoriesData } = inject('categoriesFetch')
52-
const ticketType: {
53-
label: string,
54-
value: number,
55-
icon: string,
56-
color: string
57-
}[] | undefined = inject('ticketType')
52+
5853
onMounted(() => {
5954
getFilters()
6055
})
@@ -88,12 +83,6 @@ const getFilters = () => {
8883
8984
9085
const filters = ref<Option[]>([])
91-
const lifeSteps = ref<Option[]>([
92-
{ label: 'Lifestep', header: true },
93-
{ label: 'Ouvert', value: '1', group: 'lifestep', icon: 'mdi-circle', color: "green" },
94-
{ label: 'Clos', value: '0', group: 'lifestep', icon: 'mdi-circle', color: "red" },
95-
])
96-
9786
const options = computed(() => {
9887
// const categories: Option[] = categoriesData.value.data.map((category: Category) => {
9988
// return {
@@ -103,7 +92,7 @@ const options = computed(() => {
10392
// }
10493
// }) ?? []
10594
// categories.unshift({ label: 'Catégories', header: true })
106-
const ticketTypeOptions: Option[] = ticketType.value.map((type) => {
95+
const ticketTypeOptions: Option[] = ticketType.map((type) => {
10796
return {
10897
label: type.label,
10998
value: type.value.toString(),
@@ -123,8 +112,9 @@ const options = computed(() => {
123112
}
124113
}) ?? []
125114
states.unshift({ label: 'États', header: true })
115+
lifeSteps.unshift({ label: 'Étapes de vie', header: true })
126116
return [
127-
...lifeSteps.value,
117+
...lifeSteps,
128118
...ticketTypeOptions,
129119
// ...categories,
130120
...states

app/src/layouts/default.vue

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,3 +5,10 @@ q-layout
55
nuxt-page
66
tk-footer
77
</template>
8+
9+
<style>
10+
.q-page-container {
11+
height: 100vh !important;
12+
width: 100% !important;
13+
}
14+
</style>

app/src/pages/index.vue

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
<template lang='pug'>
2-
div
2+
q-page
33
tk-hook(name="accueil" :data='{exemple: 1}' debug)
44
span Accueil
55
tk-hook(name="index.accueil.bottom")

app/src/pages/tickets.vue

Lines changed: 92 additions & 97 deletions
Original file line numberDiff line numberDiff line change
@@ -1,68 +1,68 @@
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";
7272
import { useRoute, useRouter } from "nuxt/app";
7373
import type { QTableProps } from "quasar";
7474
import type { components } from '#build/types/service-api'
75+
import { ticketType, lifeSteps } from "#imports";
7576
type Ticket = components["schemas"]['TicketDto']
7677
type State = components["schemas"]['StatesDto']
7778
@@ -80,27 +81,27 @@ const route = useRoute()
8081
const router = useRouter()
8182
8283
const { 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))
9091
const { data: categories, pending: categoriesPending, refresh: categoriesRefresh, error: categoriesError } = await useHttpApi('/core/categories', {
91-
method: 'get'
92+
method: 'get'
9293
})
9394
const { data: states, pending: statesPending, refresh: statesRefresh, error: statesError } = await useHttpApi('/tickets/state', {
94-
method: 'get'
95+
method: 'get'
9596
})
9697
9798
onMounted(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
118119
const 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-
129120
const columns = ref<QTableProps['columns']>([
130121
{
131122
name: 'states',
@@ -225,13 +216,13 @@ const pagination = ref<QTableProps['pagination']>({
225216
})
226217
227218
const 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
237228
const paginationQuery = () => {
@@ -282,14 +273,19 @@ const fieldsList = computed(() => {
282273
})
283274
284275
const 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
291282
const 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
295291
const markAsRead = () => {
@@ -307,6 +303,5 @@ const deleteTickets = () => {
307303
provide('fieldsList', fieldsList)
308304
provide('stateFetch', { data: states, pending: statesPending, refresh: statesRefresh, error: statesError })
309305
provide('categoriesFetch', { data: categories, pending: categoriesPending, refresh: categoriesRefresh, error: categoriesError })
310-
provide('ticketType', ticketType)
311306
312307
</script>

app/src/utils/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export * from './statics'

app/src/utils/statics.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
export const ticketType = [
2+
{ label: 'Incident', value: 1, icon: 'mdi-account-alert', color: 'red' },
3+
{ label: 'Demande', value: 2, icon: 'mdi-account-question', color: 'primary' },
4+
]
5+
6+
export const lifeSteps = [
7+
{ label: 'Ouvert', value: 1, group: 'lifestep', icon: 'mdi-circle', color: 'green' },
8+
{ label: 'Clos', value: 0, group: 'lifestep', icon: 'mdi-circle', color: 'red' },
9+
]

0 commit comments

Comments
 (0)