feat: add graticule toggle control to all Leaflet maps

Adds a bottomleft grid button (MapUtils.addGraticuleControl) to every
map in the app — Meshtastic, MeshCore, Drone, SSTV/ISS, BT Locate,
WebSDR, and Weather Satellite — defaulting to visible. The weather
satellite map's bespoke addStyledGridOverlay() is removed in favour of
the shared implementation. Also updates map-utils.css with button
styles and map-utils.js with the new addGraticuleControl() method.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
James Smith
2026-05-21 11:09:39 +01:00
parent 30a0085f1d
commit 592d11aae2
10 changed files with 137 additions and 85 deletions
+13 -11
View File
@@ -16,9 +16,9 @@ const Meshtastic = (function() {
// Map state
let meshMap = null;
let meshMarkers = {}; // nodeId -> marker
let localNodeId = null;
let clickDelegationAttached = false;
let meshMarkers = {}; // nodeId -> marker
let localNodeId = null;
let clickDelegationAttached = false;
/**
* Initialize the Meshtastic mode
@@ -33,14 +33,14 @@ const Meshtastic = (function() {
/**
* Setup event delegation for dynamically created elements
*/
function setupEventDelegation() {
if (clickDelegationAttached) return;
clickDelegationAttached = true;
// Handle button clicks in Leaflet popups and elsewhere
document.addEventListener('click', function(e) {
const tracerouteBtn = e.target.closest('.mesh-traceroute-btn');
if (tracerouteBtn) {
function setupEventDelegation() {
if (clickDelegationAttached) return;
clickDelegationAttached = true;
// Handle button clicks in Leaflet popups and elsewhere
document.addEventListener('click', function(e) {
const tracerouteBtn = e.target.closest('.mesh-traceroute-btn');
if (tracerouteBtn) {
const nodeId = tracerouteBtn.dataset.nodeId;
if (nodeId) {
sendTraceroute(nodeId);
@@ -137,6 +137,8 @@ const Meshtastic = (function() {
}
}
if (typeof MapUtils !== 'undefined') MapUtils.addGraticuleControl(meshMap);
// Handle resize
setTimeout(() => {
if (meshMap) meshMap.invalidateSize();