diff --git a/html/static/js/map-admin.js b/html/static/js/map-admin.js new file mode 100644 index 00000000..28cc664e --- /dev/null +++ b/html/static/js/map-admin.js @@ -0,0 +1,148 @@ +// A test of maplibre-gl in a custom element +class MapAdmin extends HTMLElement { + constructor() { + super(); + + // Create a shadow DOM + this.attachShadow({ mode: "open" }); + + // Initial render + this.render(); + + this._map = null; + + // markers shown on the map + this._markers = []; + } + + // Lifecycle: when element is added to the DOM + connectedCallback() { + // Initialize the map when the element is added to the DOM + setTimeout(() => this._initializeMap(), 0); + } + + disconnectedCallback() { + if (this._map) { + this._map.remove(); + } + } + + _initializeMap() { + const centroid = JSON.parse(this.getAttribute("centroid")); + const organization_id = this.getAttribute("organization-id"); + const tegola = this.getAttribute("tegola"); + const xmin = parseFloat(this.getAttribute("xmin")); + const ymin = parseFloat(this.getAttribute("ymin")); + const xmax = parseFloat(this.getAttribute("xmax")); + const ymax = parseFloat(this.getAttribute("ymax")); + const bounds = [ + [xmin, ymin], + [xmax, ymax], + ]; + + const mapElement = this.shadowRoot.querySelector("#map"); + + this._map = new maplibregl.Map({ + center: centroid.coordinates, + container: mapElement, + style: "https://tiles.stadiamaps.com/styles/alidade_smooth.json", // Style URL; see our documentation for more options + }).fitBounds(bounds, { + padding: { top: 10, bottom: 10, left: 10, right: 10 }, + }); + this._map.on("load", () => { + this.dispatchEvent(new CustomEvent("load"), { + bubbles: true, + composed: true, // Allows event to cross shadow DOM boundary + detail: { + map: this, + }, + }); + }); + } + + // Initial render of component + render() { + this.shadowRoot.innerHTML = ` + + +