fix: ora le ricerche asincrone non si sovrappongono più alle attività. feat: aggiunta funzione Storico Consuntivazione

This commit is contained in:
VVER440 committed 2026-08-21 00:07:08 +02:00
1 parent ba23635c7d
commit 3650bf5790
9 files changed
+737 -33

No files matched your search

+41 -5
View File
@@ -1,4 +1,4 @@
/**
/**
* ActivityLogView — Storico Attività
* Displays the local SQLite activity log with filters, dual pagination,
* and an expandable JSON detail panel.
@@ -49,9 +49,10 @@ const ActivityLogView = {
<table class="tickets-table" id="activity-table" style="width:100%;">
<thead>
<tr>
<th style="width:160px;">Data/Ora</th>
<th style="width:160px;">Agente</th>
<th style="width:180px;">Azione</th>
<th style="width:150px;">Data/Ora</th>
<th style="width:140px;">Agente</th>
<th style="width:160px;">Azione</th>
<th style="width:140px;">Ticket (TN)</th>
<th style="min-width:60px;text-align:center;">Esito</th>
<th style="width:48px;text-align:center;">≡</th>
</tr>
@@ -77,8 +78,42 @@ const ActivityLogView = {
`;
},
_extractTicketRef(r) {
if (!r.azione) return '—';
try {
const data = typeof r.azione === 'string' ? JSON.parse(r.azione) : r.azione;
if (!data) return '—';
const tn = data.tn || data.ticket_tn || data.target_tn;
const id = data.ticket_id || data.id || data.target_id;
if (tn && id) {
return `<a href="#/tickets/${id}" class="ticket-tn-link" onclick="event.stopPropagation();">#${App.escapeHtml(String(tn))}</a>`;
} else if (tn) {
return `<span style="font-family:var(--font-mono, monospace);font-weight:600;color:var(--accent-primary);">#${App.escapeHtml(String(tn))}</span>`;
} else if (id) {
return `<a href="#/tickets/${id}" class="ticket-tn-link" onclick="event.stopPropagation();">#${id}</a>`;
}
if (Array.isArray(data.tns) && data.tns.length > 0) {
return data.tns.map(t => `<span style="font-family:var(--font-mono, monospace);font-size:0.78rem;font-weight:600;color:var(--accent-primary);">#${App.escapeHtml(String(t))}</span>`).join(', ');
}
if (Array.isArray(data.source_tns) && data.source_tns.length > 0) {
return data.source_tns.map(t => `<span style="font-family:var(--font-mono, monospace);font-size:0.78rem;font-weight:600;color:var(--accent-primary);">#${App.escapeHtml(String(t))}</span>`).join(', ');
}
if (Array.isArray(data.ticket_ids) && data.ticket_ids.length > 0) {
return data.ticket_ids.map(tid => `<a href="#/tickets/${tid}" class="ticket-tn-link" onclick="event.stopPropagation();">#${tid}</a>`).join(', ');
}
return '—';
} catch (_) {
return '—';
}
},
_buildRow(r) {
const dt = r.creato_il ? new Date(r.creato_il).toLocaleString('it-IT') : '—';
const ticketRef = this._extractTicketRef(r);
const esitoBadge = r.esito === 'successo'
? `<span style="display:inline-block;padding:2px 10px;border-radius:12px;background:rgba(34,197,94,0.15);color:#16a34a;font-size:0.75rem;font-weight:600;">✓ successo</span>`
: `<span style="display:inline-block;padding:2px 10px;border-radius:12px;background:rgba(239,68,68,0.15);color:#dc2626;font-size:0.75rem;font-weight:600;">✕ errore</span>`;
@@ -88,13 +123,14 @@ const ActivityLogView = {
<td style="font-size:0.8rem;color:var(--text-secondary);white-space:nowrap;">${dt}</td>
<td style="font-size:0.85rem;">${App.escapeHtml(r.agente_nome || '—')}</td>
<td style="font-size:0.85rem;font-weight:500;">${App.escapeHtml(r.titolo_azione)}</td>
<td style="font-size:0.85rem;">${ticketRef}</td>
<td style="text-align:center;">${esitoBadge}</td>
<td style="text-align:center;">
<button class="btn btn-ghost btn-sm act-detail-btn" data-id="${r.id}" title="Mostra dettaglio" style="padding:4px 8px;font-size:0.85rem;">≡</button>
</td>
</tr>
<tr id="detail-${r.id}" class="act-detail-row" style="display:none;">
<td colspan="5" style="padding:0 var(--space-md) var(--space-md);background:var(--bg-secondary);">
<td colspan="6" style="padding:0 var(--space-md) var(--space-md);background:var(--bg-secondary);">
<pre style="margin:0;padding:var(--space-md);background:var(--bg-tertiary);border-radius:var(--radius-md);font-size:0.78rem;overflow-x:auto;white-space:pre-wrap;word-break:break-all;color:var(--text-primary);border:1px solid var(--border-subtle);">${App.escapeHtml(this._prettyJson(r.azione))}</pre>
</td>
</tr>