// SPDX-FileCopyrightText: 2020 IN COMMON Collective // // SPDX-License-Identifier: AGPL-3.0-or-later // Visit The Stimulus Handbook for more details // https://stimulusjs.org/handbook/introduction // import { Controller } from "stimulus" import 'leaflet/dist/leaflet.css' // Re-uses images from ~leaflet package import 'leaflet-defaulticon-compatibility/dist/leaflet-defaulticon-compatibility.webpack.css' import * as L from 'leaflet' import 'leaflet-defaulticon-compatibility' import "leaflet-providers" import "leaflet.markercluster/dist/leaflet.markercluster.js" import 'leaflet-extra-markers' export default class extends Controller { static targets = [ "container" ] initialize() { console.log("Map controller initialized.") this.mapBoxAPIToken = 'pk.eyJ1IjoibmVtYWVsIiwiYSI6ImNrZzBrYjBudTB3bnMyenFmNWtrN3h3bmMifQ.Rkeyhm-9iIQOV7NAMA5LaA' } connect() { var mapbox = L.tileLayer('https://api.mapbox.com/styles/v1/{id}/tiles/{z}/{x}/{y}?access_token={accessToken}', { attribution: 'Map data © OpenStreetMap contributors, CC-BY-SA, Imagery Mapbox', maxZoom: 18, id: 'mapbox/streets-v11', tileSize: 512, zoomOffset: -1, accessToken: this.mapBoxAPIToken }) var stamen_tr = L.tileLayer.provider('Stamen.Toner') var stamen_wc = L.tileLayer.provider('Stamen.Watercolor') var tiles_osm = L.tileLayer.provider('OpenStreetMap.Mapnik') var tiles_sat = L.tileLayer.provider('Esri.WorldImagery') const tilemaps = { 'osm': tiles_osm, 'mapbox': mapbox, 'watercolor': stamen_wc, 'greyscale': stamen_tr, 'satellite': tiles_sat } const overlays = {} this.map = L.map(this.containerTarget, { zoomDelta: 0.5, zoomSnap: 0.5, layers: [ tiles_osm ], }).setView(this._coordinates(), this._zoom()); L.control.layers(tilemaps, overlays).addTo(this.map) L.DomEvent.on(window, 'hashchange', this.doSomethingCool); // Allow calling the mapController from elsewhere. this.element[this.identifier] = this } disconnect() { this.map.remove(); console.log('Map controller disconnected.') } doSomethingCool() { console.log(window.location.hash) } _coordinates() { return [this.data.get('latitude'), this.data.get('longitude')]; } _zoom() { return this.data.get('zoom'); } }