c3lf-system-3/web/src/views/Ticket.vue

99 lines
3.9 KiB
Vue
Raw Normal View History

2024-01-07 20:32:42 +00:00
<template>
<div class="container-fluid px-xl-5 mt-3">
<div class="row">
<div class="col-xl-8 offset-xl-2">
<div class="card bg-dark text-light mb-2" id="filters">
<div class="card-header">
<h3>Ticket #{{ ticket.id }} - {{ ticket.name }}</h3>
</div>
<Timeline :timeline="ticket.timeline" @sendMail="handleMail" @addComment="handleComment"/>
2024-01-07 20:32:42 +00:00
<div class="card-footer d-flex justify-content-between">
<button class="btn btn-secondary mr-2" @click="$router.go(-1)">Back</button>
<!--button class="btn btn-danger" @click="deleteItem({type: 'tickets', id: ticket.id})">
2024-01-07 20:32:42 +00:00
<font-awesome-icon icon="trash"/>
Delete
</button-->
<ClipboardButton :payload="shippingEmail" class="btn btn-primary">
<font-awesome-icon icon="clipboard"/>
Copy DHL contact to clipboard
</ClipboardButton>
2024-01-22 16:21:22 +00:00
<div class="btn-group">
<select class="form-control" v-model="ticket.assigned_to">
<option v-for="user in users" :value="user.username">{{ user.username }}</option>
</select>
<button class="form-control btn btn-success" @click="assigTicket(ticket)">
Assign&nbsp;Ticket
</button>
</div>
<div class="btn-group">
<select class="form-control" v-model="ticket.state">
<option v-for="status in state_options" :value="status.value">{{ status.text }}</option>
</select>
<button class="form-control btn btn-success" @click="changeTicketStatus(ticket)">
Change&nbsp;Status
</button>
</div>
2024-01-07 20:32:42 +00:00
</div>
</div>
</div>
</div>
</div>
</template>
<script>
import {mapActions, mapState} from 'vuex';
import Timeline from "@/components/Timeline.vue";
import ClipboardButton from "@/components/inputs/ClipboardButton.vue";
2024-01-07 20:32:42 +00:00
export default {
name: 'Ticket',
components: {ClipboardButton, Timeline},
2024-01-07 20:32:42 +00:00
computed: {
2024-01-22 16:21:22 +00:00
...mapState(['tickets', 'state_options', 'users']),
2024-01-07 20:32:42 +00:00
ticket() {
const id = parseInt(this.$route.params.id)
const ret = this.tickets.find(ticket => ticket.id === id);
return ret ? ret : {};
},
shippingEmail() {
const domain = document.location.hostname;
return `ticket+${this.ticket.uuid}@${domain}`;
2024-01-07 20:32:42 +00:00
}
},
methods: {
2024-01-22 16:21:22 +00:00
...mapActions(['deleteItem', 'markItemReturned', 'sendMail', 'updateTicketPartial', 'postComment']),
2024-06-22 23:04:32 +00:00
...mapActions(['loadTickets', 'fetchTicketStates', 'loadUsers', 'scheduleAfterInit']),
2024-01-07 20:32:42 +00:00
handleMail(mail) {
this.sendMail({
id: this.ticket.id,
message: mail
})
},
handleComment(comment) {
this.postComment({
id: this.ticket.id,
message: comment
})
},
changeTicketStatus(ticket) {
this.updateTicketPartial({
id: ticket.id,
state: ticket.state
})
2024-01-22 16:21:22 +00:00
},
assigTicket(ticket) {
this.updateTicketPartial({
id: ticket.id,
assigned_to: ticket.assigned_to
})
2024-06-22 23:04:32 +00:00
},
2024-01-07 20:32:42 +00:00
},
2024-06-22 23:04:32 +00:00
mounted() {
this.scheduleAfterInit(() => [this.fetchTicketStates(), this.loadTickets(), this.loadUsers()]);
2024-01-07 20:32:42 +00:00
}
};
</script>
<style scoped>
</style>