From 0be14600fb10a72ebd19f37c5b4cd69a3160ede3 Mon Sep 17 00:00:00 2001 From: "Morten V. Christiansen" Date: Sun, 5 Apr 2026 12:42:57 +0200 Subject: [PATCH] Make off-map indicators clickable --- kort7/app.js | 26 ++++++++++++++++++++++++-- kort7/kort7.html | 9 +++++++++ kort7/tests/kort7.spec.js | 15 +++++++++++++++ 3 files changed, 48 insertions(+), 2 deletions(-) diff --git a/kort7/app.js b/kort7/app.js index cad019c..8e8198b 100644 --- a/kort7/app.js +++ b/kort7/app.js @@ -23,6 +23,20 @@ const playBtn = document.getElementById("playBtn"); const pauseBtn = document.getElementById("pauseBtn"); const resetBtn = document.getElementById("resetBtn"); +function openVehiclePopup(name) { + const v = vehicles[name]; + if (!v) return; + + if (!map.hasLayer(v.marker)) { + v.marker.addTo(map); + } + + v.marker.setLatLng([v.displayLat, v.displayLon]); + setHeading(v.marker, v.displayHeading); + v.marker.setPopupContent(popupHtml(v.name, v)); + v.marker.openPopup(); +} + function carIcon(color) { return L.divIcon({ className: "", @@ -455,13 +469,13 @@ function updateAlerts() { : `Mulig tilstedeværelse fra ${direction.label}`; return ` -
+
+ `; }).join(""); } @@ -515,6 +529,14 @@ resetBtn.addEventListener("click", () => { requestAnimationFrame(tick); }); +offmapIndicatorsEl.addEventListener("click", (event) => { + const button = event.target.closest(".offmap-indicator"); + if (!button) return; + + const vehicleName = button.dataset.vehicle; + openVehiclePopup(vehicleName); +}); + map.on("moveend zoomend", () => { for (const name of vehicleNames) { updateVehicleDisplay(vehicles[name]); diff --git a/kort7/kort7.html b/kort7/kort7.html index 585e24a..a86b118 100644 --- a/kort7/kort7.html +++ b/kort7/kort7.html @@ -76,6 +76,7 @@ grid-template-columns: auto 1fr; gap: 10px; align-items: center; + width: 100%; padding: 9px 11px; border-radius: 12px; background: rgba(18, 18, 18, 0.86); @@ -83,6 +84,14 @@ border: 1px solid rgba(255,255,255,0.12); box-shadow: 0 6px 18px rgba(0,0,0,0.22); font: 12px/1.3 system-ui, sans-serif; + pointer-events: auto; + cursor: pointer; + text-align: left; + } + + .offmap-indicator:hover { + transform: translateY(-1px); + box-shadow: 0 8px 20px rgba(0,0,0,0.28); } .offmap-indicator.covers { diff --git a/kort7/tests/kort7.spec.js b/kort7/tests/kort7.spec.js index fdaaae8..793daef 100644 --- a/kort7/tests/kort7.spec.js +++ b/kort7/tests/kort7.spec.js @@ -90,4 +90,19 @@ test.describe('kort7 vehicle map', () => { await expect(alerts).toContainText('Bil 10: usikkerhed dækker hele kortet'); await expect(alerts).not.toContainText('Bil 8'); }); + + test('opens vehicle popup when clicking an off-map corner indicator', async ({ page }) => { + await page.goto('/kort7.html'); + await page.getByRole('button', { name: 'Pause' }).click(); + + const indicator = page.locator('.offmap-indicator').filter({ hasText: 'Bil 9' }); + await expect(indicator).toBeVisible(); + await indicator.click(); + + const popup = page.locator('.leaflet-popup'); + await expect(popup).toBeVisible(); + await expect(popup).toContainText('Bil 9'); + await expect(popup).toContainText('Usikkerhed:'); + await expect(popup).toContainText('På kortet:'); + }); });