diff --git a/assets/js/contacts_map_hook.js b/assets/js/contacts_map_hook.js index 238cf291..2be531db 100644 --- a/assets/js/contacts_map_hook.js +++ b/assets/js/contacts_map_hook.js @@ -113,22 +113,65 @@ export const ContactsMap = { } dotLayer.addTo(this.map) - // Build legend - const legend = L.control({position: "bottomright"}) - legend.onAdd = function() { + // Build interactive band filter + const bandControl = L.control({position: "bottomright"}) + const self = this + bandControl.onAdd = function(map) { const div = L.DomUtil.create("div") - div.style.cssText = "background:rgba(30,30,40,0.9);color:#fff;padding:8px 12px;border-radius:8px;font-size:11px;line-height:1.6;" + div.style.cssText = "background:rgba(30,30,40,0.95);color:#fff;padding:8px 12px;border-radius:8px;font-size:11px;line-height:1.8;" + L.DomEvent.disableClickPropagation(div) + L.DomEvent.disableScrollPropagation(div) const sorted = Object.entries(byBand).sort((a, b) => parseInt(a[0]) - parseInt(b[0])) - let html = "
Bands
" + + let html = `
+ Bands + + + + +
` + for (const [band, entries] of sorted) { const color = bandColor(parseInt(band)) const label = bandLabel(parseInt(band)) - html += `
${label} (${entries.length.toLocaleString()})
` + html += `` } + div.innerHTML = html + + // Wire up checkboxes + div.querySelectorAll("input[data-band]").forEach(cb => { + cb.addEventListener("change", () => { + const band = cb.dataset.band + if (cb.checked) { + bandLayers[band].addTo(map) + } else { + bandLayers[band].remove() + } + }) + }) + + div.querySelector("#bands-all").addEventListener("click", () => { + div.querySelectorAll("input[data-band]").forEach(cb => { + cb.checked = true + bandLayers[cb.dataset.band].addTo(map) + }) + }) + + div.querySelector("#bands-none").addEventListener("click", () => { + div.querySelectorAll("input[data-band]").forEach(cb => { + cb.checked = false + bandLayers[cb.dataset.band].remove() + }) + }) + return div } - legend.addTo(this.map) + bandControl.addTo(this.map) } }