class SupportView extends EICDomContent {
TICKET_STATUSES = [
{id: 0, label: '', severity: ''},
{id: 1, label: 'new', severity: 'info'},
{id: 2, label: 'opened', severity: 'warning'},
{id: 3, label: 'opened', severity: 'warning'},
{id: 4, label: 'closed', severity: 'success'},
{id: 5, label: '(state5)', severity: 'danger'},
{id: 6, label: '(state6)', severity: 'danger'},
{id: 7, label: 'opened', severity: 'warning'},
]
constructor() {
super();
Object.assign(this, app.helpers.basicDialogs)
}
DOMContentLoaded(options) {
this.components = ui.eicfy(this.el)
for(let model in options.models) this[model] = options.models[model];
this.gridTickets = new DataGrid(this.find('.support-tickets .list [eicdatagrid]'), {
headers: [
{ label: 'Ticket', filter: 'text', sortable: true},
{ label: 'Modified', type: 'dateTime', sortable: true},
{ label: 'Status', type: 'markup', filter: 'list', sortable: true},
]
});
this.btTicketsRefresh = new Button(null, {icon: 'icon-refresh', severity: 'primary', rounded: true, size: 'xsmall', hint: 'Refresh the list'})
this.btTicketsRefresh.addEventListener('click', this.refreshTicketsList.bind(this));
this.gridTickets.el.querySelector('header .cell.actions').append(this.btTicketsRefresh.el);
this.gridTickets.onRowClick = this.onTicketSelect.bind(this);
this.gridConsole = new DataGrid(this.find('.support-console [eicdatagrid]'), {
headers: [
{ label: 'Time', filter: 'text', sortable: true},
{ label: 'Level', filter: 'list', sortable: true},
{ label: 'Error', filter: 'text', sortable: true},
{ label: 'Url', filter: 'text', sortable: true},
],
actions: [],
height: '30vh'
});
this.gridConsole.onRowClick = this.showErrDetails.bind(this)
this.ticketDetail = this.find('.support-tickets .inspector');
ui.hide(this.ticketDetail);
this.btReply = this.find('.support-tickets .inspector footer .cta button');
this.btReply.addEventListener('click', this.onTicketReplyOpen.bind(this))
this.attachments = this.components.find(item => item.el.name == 'attachments')
this.attachments.activeEditor = BinaryFileContentSelector;
this.replyForm = new Form(this.find('.support-tickets .inspector footer .reply-form'));
ui.hide(this.replyForm.el);
this.replyForm.el.querySelector('button.send').addEventListener('click', this.onTicketReply.bind(this))
this.replyForm.el.querySelector('button.cancel').addEventListener('click', this.onTicketReplyCancel.bind(this))
this.btIssueNew = this.components.find(item => item.el.classList.contains('create'));
this.btIssueNew.addEventListener('click', this.onTicketCreate.bind(this));
this.refreshConsole();
this.refreshTicketsList()
}
DOMContentFocused() {
if(!this.refreshTo) this.refreshTo = setTimeout(this.checkUp2Date.bind(this),500)
this.refreshConsole();
}
DOMContentBlured() {
if(this.refreshTo) {
clearTimeout(this.refreshTo)
this.refreshTo = null
}
}
refreshTicketsList(event=null){
if(event){
event.stopPropagation();
event.preventDefault();
}
this.gridTickets.loading = true;
this.tickets.list()
.then(this.refreshTickets.bind(this));
}
refreshTickets(payload) {
this.gridTickets.loading = false;
this.gridTickets.clear();
let tickets = payload.reverse();
if(tickets.length > 0) {
for(let ticket of tickets) {
let status = this.TICKET_STATUSES.find(item => item.id == (ticket.state.id || 0))
this.gridTickets.addRow(ticket.id, [
`${ticket.title} (#${ticket.number})`,
ticket.state.lastActivity,
`${status.label}`,
], true);
}
this.gridTickets.filter()
this.tickets.get(tickets[0].id)
.then(this.refreshInspector.bind(this));
}
}
clearInspector() {
ui.show(this.ticketDetail, 'grid');
this.ticketDetail.classList.remove('loading');
this.ticketDetail.querySelector('header h1').innerHTML = ''
this.ticketDetail.querySelector('header h2').innerHTML = ''
this.ticketDetail.querySelector('section').innerHTML = '';
this.replyForm.el.querySelector('textarea').innerHTML = '';
this.attachments.clear();
}
freezeInspector() {
ui.show(this.ticketDetail, 'grid');
this.ticketDetail.classList.add('loading');
}
refreshInspector(payload) {
let ticket = payload.ticket;
let articles = payload.articles.reverse();
this.clearInspector();
let content = this.ticketDetail.querySelector('section');
this.ticketDetail.querySelector('header h1').innerHTML = `${ticket.title} (#${ticket.number})`;
this.ticketDetail.querySelector('header h2').innerHTML = ticket.typeofissue || 'General issue';
this.replyForm.el.querySelector('button.send').dataset.id = ticket.id;
let lastDate = null;
for(let article of articles) {
let message = article.body
.split("\n").join('
')
.split(' -> ').join(' → ')
let currentDate = ui.format.date( article.created )
if(lastDate != currentDate ) {
content.append(ui.create(`