+
+
+
+
+
+
ESCALATED FOR REVIEW
+
0 alerts queued
+
+
+
+
+ ALERTS PENDING: 0
+ TIME REMAINING: 00:00
+
+
+ `;
+
+ this.panelEl = this.gameContainer.querySelector('#siem-panel');
+ this.alertsListEl = this.gameContainer.querySelector('#siem-alert-list');
+ this.queueListEl = this.gameContainer.querySelector('#siem-queue-list');
+ this.queueCountEl = this.gameContainer.querySelector('#siem-queue-count');
+ this.pendingCountEl = this.gameContainer.querySelector('#siem-pending-count');
+ this.timerEl = this.gameContainer.querySelector('#siem-time-remaining');
+ this.systemClockEl = this.gameContainer.querySelector('#siem-system-clock');
+ this.resultBannerEl = this.gameContainer.querySelector('#siem-result-banner');
+ }
+
+ renderAll() {
+ this.renderAlerts();
+ this.renderQueue();
+ this.updateStatusBar();
+ }
+
+ renderAlerts() {
+ if (!this.alertsListEl) return;
+
+ const previousScrollTop = this.alertsListEl.scrollTop;
+ this.alertsListEl.innerHTML = '';
+
+ this.alerts.forEach((alert) => {
+ const row = document.createElement('div');
+ row.className = `siem-alert-row status-${alert.status}`;
+ row.dataset.alertId = alert.id;
+
+ const severity = document.createElement('span');
+ severity.className = `siem-severity sev-${alert.severity}`;
+ severity.textContent = alert.severity;
+
+ const time = document.createElement('span');
+ time.className = 'siem-time';
+ time.textContent = alert.timestamp;
+
+ const source = document.createElement('span');
+ source.className = 'siem-source';
+ source.textContent = alert.source;
+
+ const description = document.createElement('span');
+ description.className = 'siem-description';
+ description.textContent = alert.description;
+
+ const actions = document.createElement('span');
+ actions.className = 'siem-actions';
+
+ const dismissBtn = document.createElement('button');
+ dismissBtn.className = 'siem-btn dismiss';
+ dismissBtn.textContent = 'DISMISS';
+ dismissBtn.disabled = alert.status !== 'pending' || this.finished;
+ dismissBtn.addEventListener('click', () => this.handleAction(alert.id, 'dismissed'));
+
+ const escalateBtn = document.createElement('button');
+ escalateBtn.className = 'siem-btn escalate';
+ escalateBtn.textContent = 'ESCALATE';
+ escalateBtn.disabled = alert.status !== 'pending' || this.finished;
+ escalateBtn.addEventListener('click', () => this.handleAction(alert.id, 'escalated'));
+
+ const undoBtn = document.createElement('button');
+ undoBtn.className = 'siem-btn dismiss';
+ undoBtn.textContent = 'UNDO';
+ undoBtn.disabled = alert.status !== 'dismissed' || this.finished;
+ undoBtn.addEventListener('click', () => this.handleAction(alert.id, 'pending'));
+
+ // Show dismiss/escalate buttons for pending alerts, undo button for dismissed alerts
+ if (alert.status === 'pending') {
+ actions.appendChild(dismissBtn);
+ actions.appendChild(escalateBtn);
+ } else if (alert.status === 'dismissed') {
+ actions.appendChild(undoBtn);
+ } else if (alert.status === 'escalated') {
+ // Escalated alerts show no buttons
+ }
+
+ row.appendChild(severity);
+ row.appendChild(time);
+ row.appendChild(source);
+ row.appendChild(description);
+ row.appendChild(actions);
+
+ this.alertsListEl.appendChild(row);
+ });
+
+ this.alertsListEl.scrollTop = previousScrollTop;
+ }
+
+ renderQueue() {
+ if (!this.queueListEl || !this.queueCountEl) return;
+
+ const escalated = this.alerts
+ .filter((alert) => alert.status === 'escalated')
+ .sort((a, b) => {
+ const sevDelta = SEVERITY_ORDER[b.severity] - SEVERITY_ORDER[a.severity];
+ if (sevDelta !== 0) return sevDelta;
+ return a.timestamp.localeCompare(b.timestamp);
+ });
+
+ this.queueListEl.innerHTML = '';
+
+ escalated.forEach((alert) => {
+ const item = document.createElement('div');
+ item.className = 'siem-queue-item';
+ item.innerHTML = `
+