/** * Ticket Detail View * Shows full ticket info with quick-edit dropdowns, article timeline, and add-note form. */ const TicketDetailView = { ticketId: null, htmlMode: false, originalValues: {}, async render(id) { this.ticketId = id; this.htmlMode = localStorage.getItem('otrs_turbo_html_mode') === 'true'; const container = document.getElementById('view-container'); container.innerHTML = '
Caricamento ticket...
${App.escapeHtml(subject)}
`; if (this.noteQuill) { this.noteQuill.root.innerHTML = body; } } // If subject is empty but body is provided, fill subject with truncated plain text of body if (body && !subject) { const tempDiv = document.createElement('div'); tempDiv.innerHTML = body; const plainText = tempDiv.textContent || tempDiv.innerText || ''; subject = plainText.trim().substring(0, 50) || 'Nota interna'; document.getElementById('note-subject').value = subject; } // If both are still empty, show warning if (!body && !subject) { Toast.warning('Inserisci un oggetto o il corpo della nota prima di inviare'); return; } try { noteSendBtn.disabled = true; noteSendBtn.innerHTML = ' Invio...'; const res = await App.api(`/api/tickets/${this.ticketId}/articles`, { method: 'POST', body: JSON.stringify({ subject, body, time_unit }), }); Toast.success(res.message || 'Nota aggiunta!'); App.updateDailyTimer(); this.render(this.ticketId); } catch (err) { Toast.error('Errore: ' + err.message); noteSendBtn.disabled = false; noteSendBtn.innerHTML = 'Invia Nota'; } }); // Retrodate Ticket Event Listeners const btnEditTicketDate = document.getElementById('btn-edit-ticket-date'); const ticketDateEditor = document.getElementById('ticket-date-editor'); const ticketDateText = document.getElementById('ticket-date-text'); const btnSaveTicketDate = document.getElementById('btn-save-ticket-date'); const btnCancelTicketDate = document.getElementById('btn-cancel-ticket-date'); const inputTicketDate = document.getElementById('input-ticket-date'); if (btnEditTicketDate) { btnEditTicketDate.addEventListener('click', () => { btnEditTicketDate.style.display = 'none'; ticketDateText.style.display = 'none'; ticketDateEditor.style.display = 'flex'; }); btnCancelTicketDate.addEventListener('click', () => { ticketDateEditor.style.display = 'none'; btnEditTicketDate.style.display = 'inline-flex'; ticketDateText.style.display = 'inline'; }); btnSaveTicketDate.addEventListener('click', async () => { const val = inputTicketDate.value; if (!val) { Toast.warning('Scegli una data/ora valida.'); return; } try { btnSaveTicketDate.disabled = true; await App.api(`/api/tickets/${this.ticketId}/retrodata-ticket`, { method: 'POST', body: JSON.stringify({ create_time: val }) }); Toast.success('Data creazione ticket aggiornata!'); this.render(this.ticketId); } catch (err) { Toast.error('Errore retrodatazione ticket: ' + err.message); btnSaveTicketDate.disabled = false; } }); } // Retrodate Articles Event Listeners document.querySelectorAll('.retrodate-container[data-article-id]').forEach(container => { const articleId = container.dataset.articleId; const btnEdit = container.querySelector('.btn-edit-article-date'); const editor = container.querySelector('.retrodate-editor'); const timeText = container.querySelector('.article-time'); const btnSave = container.querySelector('.btn-save-article-date'); const btnCancel = container.querySelector('.btn-cancel-article-date'); const input = container.querySelector('.input-article-date'); if (btnEdit) { btnEdit.addEventListener('click', () => { btnEdit.style.display = 'none'; timeText.style.display = 'none'; editor.style.display = 'flex'; }); btnCancel.addEventListener('click', () => { editor.style.display = 'none'; btnEdit.style.display = 'inline-flex'; timeText.style.display = 'inline'; }); btnSave.addEventListener('click', async () => { const val = input.value; if (!val) { Toast.warning('Scegli una data/ora valida.'); return; } try { btnSave.disabled = true; await App.api(`/api/tickets/articles/${articleId}/retrodata-article`, { method: 'POST', body: JSON.stringify({ create_time: val }) }); Toast.success('Data creazione articolo aggiornata!'); this.render(this.ticketId); } catch (err) { Toast.error('Errore retrodatazione articolo: ' + err.message); btnSave.disabled = false; } }); } }); // HTML Mode Toggle Listener const htmlToggle = document.getElementById('html-toggle'); if (htmlToggle) { htmlToggle.addEventListener('change', (e) => { const isChecked = e.target.checked; localStorage.setItem('otrs_turbo_html_mode', isChecked); this.htmlMode = isChecked; this.render(this.ticketId); }); } }, };