From 98f6d18bea54e567828a96cbe8095c1b046c1990 Mon Sep 17 00:00:00 2001 From: Smittix Date: Sun, 8 Feb 2026 20:24:51 +0000 Subject: [PATCH] Fix GSM dashboard counters, improve lists, add device detail modal Wire SIGNALS/DEVICES/CROWD counters to monitor_heartbeat SSE data so they update in real-time during monitoring. Redesign device list items as richer cards with type badges, TA/distance, and observation counts. Add clickable device detail modal with full device info and copy support. Improve tower list with signal strength bars. Widen right sidebar and bump list font sizes for readability. Co-Authored-By: Claude Opus 4.6 --- templates/gsm_spy_dashboard.html | 507 +++++++++++++++++++++++++++++-- 1 file changed, 483 insertions(+), 24 deletions(-) diff --git a/templates/gsm_spy_dashboard.html b/templates/gsm_spy_dashboard.html index ff05a7c..3cdc173 100644 --- a/templates/gsm_spy_dashboard.html +++ b/templates/gsm_spy_dashboard.html @@ -428,7 +428,7 @@ position: relative; z-index: 10; display: grid; - grid-template-columns: 280px 1fr 300px; + grid-template-columns: 280px 1fr 340px; grid-template-rows: 1fr auto; gap: 0; height: calc(100vh - 160px); @@ -821,16 +821,15 @@ } .tracked-list-content { - max-height: 400px; overflow-y: auto; } .list-item { - padding: 10px 12px; + padding: 12px 14px; border-bottom: 1px solid var(--border-color); cursor: pointer; transition: background 0.2s; - font-size: 11px; + font-size: 12px; } .list-item:hover { @@ -861,9 +860,9 @@ } .list-item-details { - font-size: 10px; + font-size: 11px; color: var(--text-secondary); - line-height: 1.4; + line-height: 1.5; } .rogue-indicator { @@ -1098,10 +1097,289 @@ /* Responsive adjustments */ @media (max-width: 1400px) { .dashboard { - grid-template-columns: 250px 1fr 280px; + grid-template-columns: 250px 1fr 300px; } } + /* Signal Strength Bar */ + .signal-bar-container { + display: flex; + align-items: center; + gap: 6px; + margin-top: 4px; + } + + .signal-bar-track { + flex: 1; + height: 4px; + background: rgba(255, 255, 255, 0.08); + border-radius: 2px; + overflow: hidden; + } + + .signal-bar-fill { + height: 100%; + border-radius: 2px; + transition: width 0.3s ease; + } + + .signal-bar-label { + font-size: 10px; + font-family: var(--font-mono); + color: var(--text-dim); + min-width: 50px; + text-align: right; + } + + /* Device Card Styles */ + .device-card { + padding: 12px 14px; + border-bottom: 1px solid var(--border-color); + cursor: pointer; + transition: all 0.2s; + font-size: 12px; + } + + .device-card:hover { + background: rgba(74, 163, 255, 0.08); + border-left: 3px solid var(--accent-cyan); + } + + .device-card-top { + display: flex; + justify-content: space-between; + align-items: center; + margin-bottom: 6px; + } + + .device-card-id { + font-weight: 700; + font-family: var(--font-mono); + font-size: 12px; + display: flex; + align-items: center; + gap: 6px; + } + + .device-type-badge { + display: inline-block; + padding: 1px 6px; + border-radius: 3px; + font-size: 9px; + font-weight: 700; + letter-spacing: 0.5px; + text-transform: uppercase; + } + + .device-type-badge.imsi { + background: rgba(56, 193, 128, 0.2); + color: var(--accent-green); + border: 1px solid rgba(56, 193, 128, 0.3); + } + + .device-type-badge.tmsi { + background: rgba(74, 163, 255, 0.2); + color: var(--accent-cyan); + border: 1px solid rgba(74, 163, 255, 0.3); + } + + .device-card-time { + font-size: 10px; + color: var(--text-dim); + font-family: var(--font-mono); + } + + .device-card-mid { + display: flex; + gap: 12px; + font-size: 11px; + color: var(--text-secondary); + margin-bottom: 4px; + } + + .device-card-mid span { + display: flex; + align-items: center; + gap: 3px; + } + + .device-card-bottom { + display: flex; + justify-content: space-between; + align-items: center; + font-size: 10px; + } + + .device-seen-badge { + padding: 1px 6px; + border-radius: 3px; + font-size: 9px; + font-weight: 600; + } + + .device-seen-badge.new { + background: rgba(225, 194, 107, 0.15); + color: var(--accent-yellow); + } + + .device-seen-badge.returning { + background: rgba(56, 193, 128, 0.15); + color: var(--accent-green); + } + + /* Device Detail Modal */ + .device-detail-modal { + display: none; + position: fixed; + top: 0; + left: 0; + right: 0; + bottom: 0; + z-index: 2000; + animation: fadeIn 0.2s ease-out; + } + + .device-detail-modal.active { + display: flex; + justify-content: center; + align-items: center; + } + + .device-detail-backdrop { + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + background: rgba(11, 17, 24, 0.9); + backdrop-filter: blur(4px); + } + + .device-detail-content { + position: relative; + background: var(--bg-panel); + border: 1px solid var(--border-color); + border-radius: 8px; + width: 420px; + max-width: 90vw; + max-height: 80vh; + overflow: hidden; + display: flex; + flex-direction: column; + box-shadow: 0 0 40px rgba(74, 163, 255, 0.25); + animation: slideUp 0.3s ease-out; + } + + .device-detail-header { + padding: 14px 18px; + background: var(--bg-card); + border-bottom: 1px solid var(--border-color); + display: flex; + justify-content: space-between; + align-items: center; + } + + .device-detail-title { + font-size: 14px; + font-weight: 700; + letter-spacing: 1px; + color: var(--accent-cyan); + text-transform: uppercase; + } + + .device-detail-close { + width: 28px; + height: 28px; + border: 1px solid var(--border-color); + background: var(--bg-dark); + color: var(--text-secondary); + border-radius: 4px; + cursor: pointer; + transition: all 0.2s; + font-size: 16px; + display: flex; + align-items: center; + justify-content: center; + } + + .device-detail-close:hover { + border-color: var(--accent-red); + color: var(--accent-red); + } + + .device-detail-body { + padding: 16px 18px; + overflow-y: auto; + flex: 1; + } + + .detail-grid { + display: grid; + grid-template-columns: 1fr 1fr; + gap: 12px; + margin-bottom: 16px; + } + + .detail-field { + display: flex; + flex-direction: column; + gap: 3px; + } + + .detail-field.full-width { + grid-column: 1 / -1; + } + + .detail-field-label { + font-size: 9px; + color: var(--text-dim); + text-transform: uppercase; + letter-spacing: 0.5px; + font-family: var(--font-mono); + } + + .detail-field-value { + font-size: 13px; + font-weight: 600; + color: var(--text-primary); + font-family: var(--font-mono); + display: flex; + align-items: center; + gap: 6px; + } + + .detail-copy-btn { + background: none; + border: 1px solid var(--border-color); + color: var(--text-dim); + border-radius: 3px; + padding: 2px 6px; + font-size: 9px; + cursor: pointer; + transition: all 0.2s; + font-family: var(--font-mono); + } + + .detail-copy-btn:hover { + border-color: var(--accent-cyan); + color: var(--accent-cyan); + } + + .detail-section { + border-top: 1px solid var(--border-color); + padding-top: 12px; + margin-top: 4px; + } + + .detail-section-title { + font-size: 10px; + font-weight: 700; + color: var(--text-secondary); + text-transform: uppercase; + letter-spacing: 1px; + margin-bottom: 10px; + } + @media (max-width: 1024px) { .dashboard { grid-template-columns: 1fr; @@ -1133,6 +1411,16 @@ {% set active_mode = 'gsm' %} {% include 'partials/nav.html' with context %} + + + + {% include 'partials/settings-modal.html' %} +
@@ -1488,6 +1776,19 @@
+ +
+
+
+
+ Device Detail + +
+
+
+
+
+ + +