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)
}
}