style: aggiunte iconcine per copia numero ticket e titolo nella pagina di riepilogo del ticket e copia titolo nella pagina ticket/a mio carico. style: rimosso link apri in otrs sul titolo dell'header di un ticket

This commit is contained in:
2026-07-14 08:24:44 +02:00
parent 964241d8ec
commit 47d11c311e
2 changed files with 42 additions and 27 deletions
+24 -9
View File
@@ -153,13 +153,14 @@ const TicketDetailView = {
<div class="card"> <div class="card">
<div class="ticket-header"> <div class="ticket-header">
<div class="ticket-header-info"> <div class="ticket-header-info">
<div class="ticket-number">#${ticket.tn}</div> <div class="ticket-number" style="display:inline-flex; align-items:center; gap:6px;">
<h2 class="ticket-detail-title"> <span class="copy-ticket-btn" data-tn="${ticket.tn}" style="cursor: pointer; font-size: 0.85rem;" title="Copia numero ticket">📋</span>
${data.otrsWebUrl ? ` #${ticket.tn}
<a href="${data.otrsWebUrl}" target="_blank" style="color:inherit; text-decoration:none; border-bottom:1px dashed transparent; transition:border-bottom 0.1s ease;" onmouseover="this.style.borderBottom='1px dashed var(--text-primary)'" onmouseout="this.style.borderBottom='transparent'" title="Apri in OTRS"> -
</div>
<h2 class="ticket-detail-title" style="display:inline-flex; align-items:center; gap:6px; flex-wrap:wrap;">
<span class="copy-ticket-btn" data-tn="${App.escapeHtml(ticket.title || '')}" style="cursor: pointer; font-size: 0.85rem;" title="Copia titolo ticket">📋</span>
${App.escapeHtml(ticket.title || '(senza titolo)')} ${App.escapeHtml(ticket.title || '(senza titolo)')}
</a>
` : App.escapeHtml(ticket.title || '(senza titolo)')}
</h2> </h2>
<div class="ticket-meta-badges"> <div class="ticket-meta-badges">
<span class="badge badge-state" data-state-type="${(ticket.state_type || '').toLowerCase()}">${ticket.state_name}</span> <span class="badge badge-state" data-state-type="${(ticket.state_type || '').toLowerCase()}">${ticket.state_name}</span>
@@ -521,7 +522,7 @@ const TicketDetailView = {
modules: { modules: {
toolbar: [ toolbar: [
['bold', 'italic', 'underline', 'strike'], ['bold', 'italic', 'underline', 'strike'],
[{ 'list': 'ordered'}, { 'list': 'bullet' }], [{ 'list': 'ordered' }, { 'list': 'bullet' }],
['link', 'image'], ['link', 'image'],
['clean'] ['clean']
], ],
@@ -529,7 +530,7 @@ const TicketDetailView = {
bindings: { bindings: {
tab: { tab: {
key: 'Tab', key: 'Tab',
handler: function() { handler: function () {
return true; return true;
} }
} }
@@ -1292,7 +1293,7 @@ const TicketDetailView = {
if (doc && doc.readyState === 'complete') { if (doc && doc.readyState === 'complete') {
attachImageClick(); attachImageClick();
} }
} catch (_) {} } catch (_) { }
}); });
document.querySelectorAll('.attachment-badge[data-is-image="true"]').forEach(badge => { document.querySelectorAll('.attachment-badge[data-is-image="true"]').forEach(badge => {
@@ -1302,5 +1303,19 @@ const TicketDetailView = {
this.openImageLightbox(badge.href); this.openImageLightbox(badge.href);
}); });
}); });
document.querySelectorAll('.copy-ticket-btn').forEach(btn => {
btn.addEventListener('click', (e) => {
e.stopPropagation();
const tn = btn.dataset.tn;
if (tn) {
navigator.clipboard.writeText(tn).then(() => {
Toast.success('Copiato negli appunti!');
}).catch(err => {
Toast.error('Errore durante la copia: ' + err.message);
});
}
});
});
}, },
}; };
+1 -1
View File
@@ -153,7 +153,7 @@ const TicketListView = {
</td> </td>
<td style="color:var(--text-tertiary);font-size:0.78rem;">${App.formatDateTime(t.create_time)}</td> <td style="color:var(--text-tertiary);font-size:0.78rem;">${App.formatDateTime(t.create_time)}</td>
<td><span class="badge badge-state" data-state-type="${(t.state_type || '').toLowerCase()}">${t.state_name}</span></td> <td><span class="badge badge-state" data-state-type="${(t.state_type || '').toLowerCase()}">${t.state_name}</span></td>
<td class="ticket-title-cell"><a href="#/tickets/${t.id}" class="ticket-title-link" onclick="event.stopPropagation()">${App.escapeHtml(t.title || '(senza titolo)')}</a></td> <td class="ticket-title-cell"><span class="copy-ticket-btn" data-tn="${t.title}" style="cursor: pointer; font-size: 0.82rem; display: inline-flex; align-items: center; margin-right: 4px;" onclick="event.stopPropagation();" title="Copia titolo ticket">📋</span><a href="#/tickets/${t.id}" class="ticket-title-link" onclick="event.stopPropagation()">${App.escapeHtml(t.title || '(senza titolo)')}</a></td>
<td class="queue-cell"><span class="badge badge-queue">${App.escapeHtml(shortQueue)}</span><div class="queue-tooltip">${App.escapeHtml(t.queue_name)}</div></td> <td class="queue-cell"><span class="badge badge-queue">${App.escapeHtml(shortQueue)}</span><div class="queue-tooltip">${App.escapeHtml(t.queue_name)}</div></td>
<td style="color:var(--text-secondary);font-size:0.82rem;">${t.owner_first || ''} ${t.owner_last || ''}</td> <td style="color:var(--text-secondary);font-size:0.82rem;">${t.owner_first || ''} ${t.owner_last || ''}</td>
<td style="color:var(--text-secondary);font-size:0.82rem;">${t.customer_first ? `${t.customer_first} ${t.customer_last}` : (t.customer_user_id || '—')}</td> <td style="color:var(--text-secondary);font-size:0.82rem;">${t.customer_first ? `${t.customer_first} ${t.customer_last}` : (t.customer_user_id || '—')}</td>