diff --git a/frontend/assets/css/style.css b/frontend/assets/css/style.css index 431a559..6edabab 100644 --- a/frontend/assets/css/style.css +++ b/frontend/assets/css/style.css @@ -127,18 +127,6 @@ body { } /* Network Map */ -.node-tooltip { - position: absolute; - background: #131a2b; - border: 1px solid var(--neptune-border); - border-radius: .375rem; - padding: .5rem .75rem; - font-size: .8rem; - pointer-events: none; - z-index: 1000; - display: none; -} - #networkCanvas { cursor: grab; } @@ -147,6 +135,27 @@ body { cursor: grabbing; } +.node-list-item i { + width: 1rem; + text-align: center; +} + +.nav-pills .nav-link { + color: #94a3b8; +} + +.nav-pills .nav-link.active { + background: var(--neptune-accent); + color: #fff; +} + +kbd { + border: 1px solid var(--neptune-border); + padding: 1px 5px; + border-radius: 3px; + font-size: .7rem; +} + /* Scrollbar */ ::-webkit-scrollbar { width: 6px; } ::-webkit-scrollbar-track { background: var(--neptune-bg); } diff --git a/frontend/assets/js/app.js b/frontend/assets/js/app.js index 6b0fe8d..5730baa 100644 --- a/frontend/assets/js/app.js +++ b/frontend/assets/js/app.js @@ -7,7 +7,6 @@ let shapes = []; let selectedNodeId = null; let selectedShapeId = null; -// Canvas state let canvas, ctx; let canvasNodes = []; let canvasLinks = []; @@ -16,7 +15,6 @@ let panX = 0, panY = 0; let isPanning = false; let panStartX, panStartY; -// Drag state let dragTarget = null; let dragType = null; let dragOffX, dragOffY; @@ -47,13 +45,12 @@ document.addEventListener('DOMContentLoaded', () => { canvas.addEventListener('mousemove', onMouseMove); canvas.addEventListener('mouseup', onMouseUp); canvas.addEventListener('dblclick', onDblClick); - canvas.addEventListener('contextmenu', onContextMenu); + canvas.addEventListener('contextmenu', (e) => e.preventDefault()); window.addEventListener('resize', () => { resizeCanvas(); renderNetwork(); }); - // Keyboard shortcuts document.addEventListener('keydown', (e) => { if (e.key === 'Delete' || e.key === 'Backspace') { - if (document.activeElement === canvas || document.activeElement?.tagName !== 'INPUT') { + if (!document.activeElement || document.activeElement.tagName !== 'INPUT') { if (selectedNodeId) deleteSelectedNode(); else if (selectedShapeId) deleteSelectedShape(); } @@ -63,15 +60,13 @@ document.addEventListener('DOMContentLoaded', () => { selectedShapeId = null; renderNetwork(); renderNodeList(); + renderShapeList(); } }); document.querySelectorAll('[data-bs-toggle="tab"]').forEach(tab => { tab.addEventListener('shown.bs.tab', () => { - if (tab.id === 'network-tab') { - resizeCanvas(); - renderNetwork(); - } + if (tab.id === 'network-tab') { resizeCanvas(); renderNetwork(); } }); }); @@ -95,17 +90,17 @@ async function apiFetch(path, options = {}) { // ==================== TEAMS ==================== async function loadTeams() { teams = await apiFetch('teams'); - const selTeam = document.getElementById('eventTeam'); + const sel = document.getElementById('eventTeam'); const filter = document.getElementById('teamFilter'); - selTeam.innerHTML = ''; + sel.innerHTML = ''; filter.innerHTML = ''; teams.forEach(t => { - selTeam.innerHTML += ``; + sel.innerHTML += ``; filter.innerHTML += ``; }); } -// ==================== EVENTS / TIMELINE ==================== +// ==================== EVENTS ==================== async function loadEvents() { events = await apiFetch('events'); renderTimeline(); @@ -124,21 +119,20 @@ function renderTimeline() { ); if (!filtered.length) { - container.innerHTML = `
No events yet. Create your first incident entry!
No events yet. Create your first incident entry!
${esc(e.description)}
` : ''}