@@ -3,87 +3,99 @@ q-scroll-area(:style="{height: '100%'}")
33 q-card
44 q-toolbar.justify-end
55 q-btn-group
6+ q-btn( color ="green" icon ="mdi-clipboard-arrow-down" @click ="console.log('Imprimer')" size ="md" ) M'assigner le ticket
7+ q-tooltip.text-body2 M'assigner le ticket
68 q-btn( color ="primary" icon ="mdi-printer" @click ="console.log('Imprimer')" size ="md" )
79 q-tooltip.text-body2 Imprimer
810 q-btn( color ="info" icon ="mdi-content-save-all" @click ="console.log('Save')" size ="md" )
911 q-tooltip.text-body2 Sauvegarder
1012 q-btn( color ="red" icon ="mdi-arrow-left" @click ="console.log(router.go(-1))" size ="md" )
1113 q-tooltip.text-body2 Retour
12- q-expansion-item( label ="Enveloppe" ) .bg-gray-4
13- q-card
14- q-card-section
15- q-select.q-my-xs (
16- label ="Appelant(s)" filled v-model ="ticket.envelope.senders"
17- option-label ="name"
18- use-input use-chips multiple
19- new-value-mode ="add-unique"
20- )
21- q-select.q-my-xs (
22- option-label ="name"
23- label ="Appelant(s)" filled v-model ="ticket.envelope.observers"
24- use-input use-chips multiple
25- new-value-mode ="add-unique"
26- )
27- q-select.q-my-xs (
28- option-label ="name"
29- label ="Appelant(s)" filled v-model ="ticket.envelope.assigned"
30- use-input use-chips multiple
31- new-value-mode ="add-unique"
32- )
33- q-expansion-item( label ="Informations" ) .bg-gray-4
34- q-card
35- q-card-section
36- .row.items-center
37- .col-6 Type de ticket :
38- .col-6
39- q-chip( :icon ="typeOfTicket.icon" : color= "typeOfTicket.color" outline ) .q-mx-auto {{ typeOfTicket.label }}
40- q-select.q-my-xs (
41- label ="Projet(s)" filled v-model ="ticket.project"
42- option-label ="name"
43- use-input use-chips
44- new-value-mode ="add-unique"
45- )
46- q-select.q-my-xs (
47- label ="Priorité" filled
48- option-label ="name"
49- use-input use-chips
50- new-value-mode ="add-unique"
51- v-model ="ticket.priority"
52- )
53- q-select.q-my-xs (
54- label ="Impact" filled
55- option-label ="name"
56- use-input use-chips
57- new-value-mode ="add-unique"
58- v-model ="ticket.impact"
59- )
60- q-select.q-my-xs (
61- label ="SLA" filled
62- option-label ="name"
63- use-input use-chips
64- new-value-mode ="add-unique"
65- v-model ="ticket.sla"
66- )
67- q-input.q-my-xs ( label ="Due date" type ="date" filled v-model ="dueDate" )
68- q-input.q-my-xs ( label ="Temps total" type ="time" filled readonly v-model ="totalTime" )
69- q-expansion-item( label ="Cycle de vie" ) .bg-gray-4
70- q-card
71- q-card-section
72- .row.items-center
73- .col-6 Etape de vie :
74- .col-6
75- q-chip( :icon ="lifestepOfTicket?.icon" : color= "lifestepOfTicket?.color" outline ) .q-mx-auto {{ lifestepOfTicket?.label }}
76- .row.items-center
77- .col-6 State :
78- .col-6
79- q-chip( :icon ="stateOfTicket?.icon" : color= "stateOfTicket?.color" outline ) .q-mx-auto {{ stateOfTicket?.name }}
14+ q-card-section.text-right
15+ span.text-caption ( v-if ="countdown>0" ) Enregistrement des changements dans {{ countdown }}s
16+ span.text-caption ( v-else ) Données a jours
17+ q-card-section
18+ q-expansion-item( label ="Enveloppe" ) .bg-gray-4
19+ q-card
20+ q-card-section
21+ q-select.q-my-xs (
22+ label ="Appelant(s)" filled v-model ="ticket.envelope.senders"
23+ option-label ="name"
24+ use-input use-chips multiple
25+ new-value-mode ="add-unique"
26+ )
27+ q-select.q-my-xs (
28+ option-label ="name"
29+ label ="Concerné(s)" filled v-model ="ticket.envelope.observers"
30+ use-input use-chips multiple
31+ new-value-mode ="add-unique"
32+ )
33+ q-select.q-my-xs (
34+ option-label ="name"
35+ label ="Assigné(s)" filled v-model ="ticket.envelope.assigned"
36+ use-input use-chips multiple
37+ new-value-mode ="add-unique"
38+ )
39+ q-expansion-item( label ="Informations" ) .bg-gray-4
40+ q-card
41+ q-card-section
42+ .row.items-center
43+ .col-6 Type de ticket :
44+ .col-6
45+ q-chip( :icon ="typeOfTicket.icon" : color= "typeOfTicket.color" outline ) .q-mx-auto {{ typeOfTicket.label }}
46+ q-select.q-my-xs (
47+ label ="Projet(s)" filled v-model ="ticket.project"
48+ use-input use-chips
49+ new-value-mode ="add-unique"
50+ :options ="projects.data"
51+ option-label ="name"
52+ )
53+ q-select.q-my-xs (
54+ label ="Priorité" filled
55+ use-input use-chips
56+ v-model ="ticket.priority"
57+ :options ="priority"
58+ option-label ="name"
59+ )
60+ q-select.q-my-xs (
61+ label ="Impact" filled
62+ use-input use-chips
63+ new-value-mode ="add-unique"
64+ v-model ="ticket.impact"
65+ :options ="impact"
66+ option-label ="name"
67+ )
68+ q-select.q-my-xs (
69+ label ="SLA" filled
70+ use-input use-chips
71+ new-value-mode ="add-unique"
72+ v-model ="ticket.sla"
73+ :options ="sla.data"
74+ option-label ="name"
75+ )
76+ q-input.q-my-xs ( label ="Due date" type ="date" filled v-model ="dueDate" )
77+ q-input.q-my-xs ( label ="Temps total" type ="time" filled readonly v-model ="totalTime" )
78+ q-expansion-item( label ="Cycle de vie" ) .bg-gray-4
79+ q-card
80+ q-card-section
81+ .row.items-center
82+ .col-6 Etape de vie :
83+ .col-6
84+ q-chip( :icon ="lifestepOfTicket?.icon" : color= "lifestepOfTicket?.color" outline ) .q-mx-auto {{ lifestepOfTicket?.label }}
85+ .row.items-center
86+ .col-6 State :
87+ .col-6
88+ q-chip( :icon ="stateOfTicket?.icon" : color= "stateOfTicket?.color" outline ) .q-mx-auto {{ stateOfTicket?.name }}
8089</template >
8190
8291<script lang="ts" setup>
83- import { ref , onMounted , computed , inject } from ' vue'
92+ import { ref , onMounted , computed , inject , watch } from ' vue'
8493import { ticketType , lifeSteps , useDayjs } from ' #imports' ;
8594import { useHttpApi } from ' ~/composables/useHttpApi' ;
8695import { useRouter } from ' vue-router' ;
96+ import { impact , priority } from ' ~/utils' ;
97+ import { omit } from ' radash'
98+
8799const props = defineProps ({
88100 ticketData: {
89101 type: Object ,
@@ -96,6 +108,15 @@ const ticket = ref(props.ticketData)
96108const { data : states, pending : statesPending, refresh : statesRefresh, error : statesError } = await useHttpApi (' /tickets/state' , {
97109 method: ' get'
98110})
111+
112+ const { data : projects, pending : projectsPending, refresh : projectsRefresh, error : projectsError } = await useHttpApi (' /core/project' , {
113+ method: ' get'
114+ })
115+
116+ const { data : sla, pending : slaPending, refresh : slaRefresh, error : slaError } = await useHttpApi (' /tickets/sla' , {
117+ method: ' get'
118+ })
119+
99120const typeOfTicket = computed (() => {
100121 return ticketType .find ((type : any ) => type .value === ticket .value .type )
101122})
@@ -108,6 +129,48 @@ const stateOfTicket = computed(() => {
108129 return states .value ?.data .find ((state : any ) => state ._id === ticket .value .state .id )
109130})
110131
132+ const countdown = ref (0 )
133+ let interval: NodeJS .Timeout
134+
135+ watch (ticket , (newTicket , oldTicket ) => {
136+ startCountdown ()
137+ console .log (' ticket changed' )
138+ console .log (newTicket )
139+ console .log (oldTicket )
140+ }, { deep: true })
141+
142+ watch (countdown , (newCountdown ) => {
143+ if (newCountdown === 0 ) {
144+ resetCountdown ()
145+ const body = omit (ticket .value , [' _id' , ' metadata' , ' tags' , ' sequence' , ' subject' ])
146+ useHttpApi (` /tickets/ticket/${ticket .value ._id } ` , {
147+ method: ' patch' ,
148+ body
149+ })
150+ }
151+ })
152+
153+ const startCountdown = () => {
154+ resetCountdown ()
155+ interval = setInterval (() => {
156+ countdown .value --
157+ console .log (countdown .value )
158+ }, 1000 )
159+ }
160+
161+ const resetCountdown = () => {
162+ countdown .value = 15
163+ clearInterval (interval )
164+ }
165+
166+ const ticketCountdown = computed (() => {
167+ const dueAt = dayjs (ticket .value .sla .dueAt )
168+ const now = dayjs ()
169+ const diff = dueAt .diff (now , ' second' )
170+ countdown .value = diff
171+ return diff
172+ })
173+
111174const totalTime = computed (() => {
112175 const min = ticket .value .totalTime % 60
113176 const hour = Math .floor (ticket .value .totalTime / 60 )
0 commit comments