Aggiunte stored procedure più utili le altre pfff
This commit is contained in:
@@ -15,6 +15,12 @@ const TicketDetailView = {
|
||||
await App.ensureLookups();
|
||||
const data = await App.api(`/api/tickets/${id}`);
|
||||
const { ticket, articles } = data;
|
||||
const localISO = (dateStr) => {
|
||||
if (!dateStr) return '';
|
||||
const d = new Date(dateStr);
|
||||
return new Date(d.getTime() - d.getTimezoneOffset() * 60000).toISOString().slice(0, 16);
|
||||
};
|
||||
|
||||
const totalTime = articles.reduce((sum, a) => {
|
||||
const val = parseFloat(a.time_unit);
|
||||
return sum + (isNaN(val) ? 0 : val);
|
||||
@@ -131,12 +137,24 @@ const TicketDetailView = {
|
||||
<div class="article-header">
|
||||
<div class="article-sender">
|
||||
<span class="article-sender-badge ${(a.sender_type || 'system').toLowerCase()}">${a.sender_type || 'System'}</span>
|
||||
<span style="font-size: 0.72rem; color: var(--text-muted); font-family: monospace; margin-right: var(--space-xs);">ID: ${a.article_id}</span>
|
||||
<span class="article-from">${App.escapeHtml(a.a_from || a.creator_first + ' ' + a.creator_last || 'Sistema')}</span>
|
||||
${a.channel_name ? `<span style="font-size:0.72rem;color:var(--text-muted);">via ${a.channel_name}</span>` : ''}
|
||||
</div>
|
||||
<div style="display:flex; gap: var(--space-sm); align-items:center;">
|
||||
${a.time_unit ? `<span class="badge" style="background:var(--info-bg);color:var(--info);font-size:0.75rem;padding:2px 8px;border-radius:4px;">⏱ ${parseFloat(a.time_unit)} min</span>` : ''}
|
||||
<span class="article-time">${App.formatDateTime(a.create_time)}</span>
|
||||
|
||||
<div class="retrodate-container" data-article-id="${a.article_id}">
|
||||
<span class="article-time">${App.formatDateTime(a.create_time)}</span>
|
||||
<button class="retrodate-btn-edit btn-edit-article-date" title="Retrodata Articolo">✏️</button>
|
||||
<div class="retrodate-editor" style="display:none;">
|
||||
<input type="datetime-local" class="retrodate-input input-article-date" value="${localISO(a.create_time)}" />
|
||||
<div class="retrodate-actions">
|
||||
<button class="retrodate-btn-action save btn-save-article-date" title="Salva">✓</button>
|
||||
<button class="retrodate-btn-action cancel btn-cancel-article-date" title="Annulla">✗</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
${a.a_subject ? `<div class="article-subject">${App.escapeHtml(a.a_subject)}</div>` : ''}
|
||||
@@ -162,7 +180,19 @@ const TicketDetailView = {
|
||||
</div>
|
||||
<div class="meta-row">
|
||||
<span class="meta-label">Creato</span>
|
||||
<span class="meta-value">${App.formatDateTime(ticket.create_time)}</span>
|
||||
<span class="meta-value">
|
||||
<div class="retrodate-container" id="ticket-retrodate-container">
|
||||
<span id="ticket-date-text">${App.formatDateTime(ticket.create_time)}</span>
|
||||
<button class="retrodate-btn-edit" id="btn-edit-ticket-date" title="Retrodata Creazione Ticket">✏️</button>
|
||||
<div class="retrodate-editor" id="ticket-date-editor" style="display:none;">
|
||||
<input type="datetime-local" class="retrodate-input" id="input-ticket-date" value="${localISO(ticket.create_time)}" />
|
||||
<div class="retrodate-actions">
|
||||
<button class="retrodate-btn-action save" id="btn-save-ticket-date" title="Salva">✓</button>
|
||||
<button class="retrodate-btn-action cancel" id="btn-cancel-ticket-date" title="Annulla">✗</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</span>
|
||||
</div>
|
||||
<div class="meta-row">
|
||||
<span class="meta-label">Modificato</span>
|
||||
@@ -338,5 +368,94 @@ const TicketDetailView = {
|
||||
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;
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
},
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user