+32
-11
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user