enhance
Deploy / deploy (push) Successful in 9s

This commit is contained in:
2026-05-06 13:03:10 +02:00
parent daf95349d2
commit f91b2ad773
2 changed files with 46 additions and 11 deletions
+32 -11
View File
@@ -322,9 +322,18 @@ pre.raw-line { background: var(--bs-tertiary-bg); padding: .75rem; border-radius
<div class="modal-content">
<div class="modal-header"><h5 class="modal-title">Alert Detail</h5><button type="button" class="btn-close" data-bs-dismiss="modal"></button></div>
<div class="modal-body" id="detailBody"></div>
<div class="modal-footer">
<button class="btn btn-success btn-sm" id="ackBtn"><i class="bi bi-check-circle"></i> Acknowledge</button>
<button class="btn btn-secondary btn-sm" data-bs-dismiss="modal">Close</button>
<div class="modal-footer d-flex justify-content-between">
<div>
<select class="form-select form-select-sm" id="statusSelect">
<option value="open">Open</option>
<option value="acknowledged">Acknowledge</option>
<option value="resolved">Resolved</option>
</select>
</div>
<div>
<button class="btn btn-primary btn-sm" id="updateStatusBtn"><i class="bi bi-check2"></i> Update</button>
<button class="btn btn-secondary btn-sm" data-bs-dismiss="modal">Close</button>
</div>
</div>
</div></div></div>
@@ -629,7 +638,10 @@ async function loadAlerts() {
<td class="log-line">${esc(a.message)}</td>
<td>${esc(a.source_name || '—')}</td>
<td class="text-secondary" style="white-space:nowrap">${new Date(a.created_at).toLocaleString()}</td>
<td>${a.status === 'open' ? `<button class="btn btn-outline-success btn-sm py-0" onclick="event.stopPropagation();ackAlert(${a.id})"><i class="bi bi-check"></i></button>` : ''}</td>
<td style="white-space:nowrap">
${a.status === 'open' ? `<button class="btn btn-outline-success btn-sm py-0 me-1" onclick="event.stopPropagation();quickAction(${a.id},'acknowledged')" title="Acknowledge"><i class="bi bi-check"></i></button>` : ''}
${a.status !== 'resolved' ? `<button class="btn btn-outline-secondary btn-sm py-0" onclick="event.stopPropagation();quickAction(${a.id},'resolved')" title="Resolve"><i class="bi bi-check-all"></i></button>` : ''}
</td>
</tr>`).join('');
}
const label = query ? 'search results' : 'alerts';
@@ -655,21 +667,30 @@ function showAlert(id) {
<dt class="col-sm-3">Message</dt><dd class="col-sm-9">${esc(a.message)}</dd>
<dt class="col-sm-3">Raw Line</dt><dd class="col-sm-9"><pre class="raw-line">${esc(a.raw_line)}</pre></dd>
</dl>`;
document.getElementById('ackBtn').style.display = a.status === 'open' ? '' : 'none';
document.getElementById('statusSelect').value = a.status;
new bootstrap.Modal(document.getElementById('detailModal')).show();
}
document.getElementById('ackBtn').addEventListener('click', async () => {
if (currentAlertId) await ackAlert(currentAlertId);
document.getElementById('updateStatusBtn').addEventListener('click', async () => {
const newStatus = document.getElementById('statusSelect').value;
if (currentAlertId) await updateAlertStatus(currentAlertId, newStatus);
bootstrap.Modal.getInstance(document.getElementById('detailModal')).hide();
});
async function ackAlert(id) {
async function updateAlertStatus(id, status) {
try {
await api(`/alerts/${id}/ack`, { method: 'POST' });
toast('Alert #' + id + ' acknowledged');
await api(`/alerts/${id}/status`, { method: 'POST', body: JSON.stringify({ status }) });
toast('Alert #' + id + ' ' + status);
loadPage(document.querySelector('.sidebar .nav-link.active')?.dataset.page || 'dashboard');
} catch (e) { toast('Failed to acknowledge', 'danger'); }
} catch (e) { toast('Failed to update status', 'danger'); }
}
async function quickAction(id, status) {
try {
await api(`/alerts/${id}/status`, { method: 'POST', body: JSON.stringify({ status }) });
toast('Alert #' + id + ' ' + status);
loadPage(document.querySelector('.sidebar .nav-link.active')?.dataset.page || 'dashboard');
} catch (e) { toast('Failed', 'danger'); }
}
document.getElementById('filterSeverity').addEventListener('change', loadAlerts);