diff --git a/umap/static/umap/js/umap.browser.js b/umap/static/umap/js/modules/browser.js similarity index 66% rename from umap/static/umap/js/umap.browser.js rename to umap/static/umap/js/modules/browser.js index 6267c9cd..a4e7fedb 100644 --- a/umap/static/umap/js/umap.browser.js +++ b/umap/static/umap/js/modules/browser.js @@ -1,24 +1,26 @@ -L.U.Browser = L.Class.extend({ - options: { - filter: '', - inBbox: false, - }, +// Uses `L._`` from Leaflet.i18n which we cannot import as a module yet +import { DomUtil, DomEvent } from '../../vendors/leaflet/leaflet-src.esm.js' - initialize: function (map) { +export default class Browser { + constructor(map) { this.map = map this.map.on('moveend', this.onMoveEnd, this) - }, + this.options = { + filter: '', + inBbox: false, + } + } - addFeature: function (feature, parent) { + addFeature(feature, parent) { const filter = this.options.filter if (filter && !feature.matchFilter(filter, this.filterKeys)) return if (this.options.inBbox && !feature.isOnScreen(this.bounds)) return - const feature_li = L.DomUtil.create('li', `${feature.getClassName()} feature`), - zoom_to = L.DomUtil.create('i', 'feature-zoom_to', feature_li), - edit = L.DomUtil.create('i', 'show-on-edit feature-edit', feature_li), - del = L.DomUtil.create('i', 'show-on-edit feature-delete', feature_li), - colorBox = L.DomUtil.create('i', 'feature-color', feature_li), - title = L.DomUtil.create('span', 'feature-title', feature_li), + const feature_li = DomUtil.create('li', `${feature.getClassName()} feature`), + zoom_to = DomUtil.create('i', 'feature-zoom_to', feature_li), + edit = DomUtil.create('i', 'show-on-edit feature-edit', feature_li), + del = DomUtil.create('i', 'show-on-edit feature-delete', feature_li), + colorBox = DomUtil.create('i', 'feature-color', feature_li), + title = DomUtil.create('span', 'feature-title', feature_li), symbol = feature._getIconUrl ? L.U.Icon.prototype.formatUrl(feature._getIconUrl(), feature) : null @@ -32,7 +34,7 @@ L.U.Browser = L.Class.extend({ const icon = L.U.Icon.makeIconElement(symbol, colorBox) L.U.Icon.setIconContrast(icon, colorBox, symbol, bgcolor) } - L.DomEvent.on( + DomEvent.on( zoom_to, 'click', function (e) { @@ -41,7 +43,7 @@ L.U.Browser = L.Class.extend({ }, feature ) - L.DomEvent.on( + DomEvent.on( title, 'click', function (e) { @@ -50,44 +52,44 @@ L.U.Browser = L.Class.extend({ }, feature ) - L.DomEvent.on(edit, 'click', feature.edit, feature) - L.DomEvent.on(del, 'click', feature.confirmDelete, feature) + DomEvent.on(edit, 'click', feature.edit, feature) + DomEvent.on(del, 'click', feature.confirmDelete, feature) // HOTFIX. Remove when this is released: // https://github.com/Leaflet/Leaflet/pull/9052 - L.DomEvent.disableClickPropagation(feature_li) + DomEvent.disableClickPropagation(feature_li) parent.appendChild(feature_li) - }, + } - datalayerId: function (datalayer) { + datalayerId(datalayer) { return `browse_data_datalayer_${L.stamp(datalayer)}` - }, + } - onDataLayerChanged: function (e) { + onDataLayerChanged(e) { this.updateDatalayer(e.target) - }, + } - addDataLayer: function (datalayer, parent) { - const container = L.DomUtil.create('div', datalayer.getHidableClass(), parent), - headline = L.DomUtil.create('h5', '', container), - counter = L.DomUtil.create('span', 'datalayer-counter', headline) + addDataLayer(datalayer, parent) { + const container = DomUtil.create('div', datalayer.getHidableClass(), parent), + headline = DomUtil.create('h5', '', container), + counter = DomUtil.create('span', 'datalayer-counter', headline) container.id = this.datalayerId(datalayer) datalayer.renderToolbox(headline) - L.DomUtil.add('span', '', headline, datalayer.options.name) - const ul = L.DomUtil.create('ul', '', container) + DomUtil.add('span', '', headline, datalayer.options.name) + const ul = DomUtil.create('ul', '', container) this.updateDatalayer(datalayer) datalayer.on('datachanged', this.onDataLayerChanged, this) this.map.ui.once('panel:closed', () => { datalayer.off('datachanged', this.onDataLayerChanged, this) }) - }, + } - updateDatalayer: function (datalayer) { + updateDatalayer(datalayer) { // Compute once, but use it for each feature later. this.bounds = this.map.getBounds() - const parent = L.DomUtil.get(this.datalayerId(datalayer)) + const parent = DomUtil.get(this.datalayerId(datalayer)) // Panel is not open if (!parent) return - L.DomUtil.classIf(parent, 'off', !datalayer.isVisible()) + DomUtil.classIf(parent, 'off', !datalayer.isVisible()) const container = parent.querySelector('ul'), counter = parent.querySelector('.datalayer-counter') container.innerHTML = '' @@ -98,16 +100,16 @@ L.U.Browser = L.Class.extend({ count = total == current ? total : `${current}/${total}` counter.textContent = count counter.title = L._('Features in this layer: {count}', { count: count }) - }, + } - onFormChange: function () { + onFormChange() { this.map.eachBrowsableDataLayer((datalayer) => { datalayer.resetLayer(true) this.updateDatalayer(datalayer) }) - }, + } - onMoveEnd: function () { + onMoveEnd() { const isBrowserOpen = !!document.querySelector('.umap-browse-data') if (!isBrowserOpen) return const isListDynamic = this.options.inBbox @@ -115,25 +117,25 @@ L.U.Browser = L.Class.extend({ if (!isListDynamic && !datalayer.hasDynamicData()) return this.updateDatalayer(datalayer) }) - }, + } - open: function () { + open() { // Get once but use it for each feature later this.filterKeys = this.map.getFilterKeys() - const container = L.DomUtil.create('div', 'umap-browse-data') + const container = DomUtil.create('div', 'umap-browse-data') // HOTFIX. Remove when this is released: // https://github.com/Leaflet/Leaflet/pull/9052 - L.DomEvent.disableClickPropagation(container) + DomEvent.disableClickPropagation(container) - const title = L.DomUtil.add( + const title = DomUtil.add( 'h3', 'umap-browse-title', container, this.map.options.name ) - const formContainer = L.DomUtil.create('div', '', container) - const dataContainer = L.DomUtil.create('div', 'umap-browse-features', container) + const formContainer = DomUtil.create('div', '', container) + const dataContainer = DomUtil.create('div', 'umap-browse-features', container) const fields = [ ['options.filter', { handler: 'Input', placeholder: L._('Filter') }], @@ -153,5 +155,5 @@ L.U.Browser = L.Class.extend({ this.map.eachBrowsableDataLayer((datalayer) => { this.addDataLayer(datalayer, dataContainer) }) - }, -}) + } +} diff --git a/umap/static/umap/js/modules/global.js b/umap/static/umap/js/modules/global.js index 381b5497..d73356d4 100644 --- a/umap/static/umap/js/modules/global.js +++ b/umap/static/umap/js/modules/global.js @@ -1,9 +1,10 @@ import * as L from '../../vendors/leaflet/leaflet-src.esm.js' import URLs from './urls.js' +import Browser from './browser.js' import { Request, ServerRequest, RequestError, HTTPError, NOKError } from './request.js' // Import modules and export them to the global scope. // For the not yet module-compatible JS out there. // Copy the leaflet module, it's expected by leaflet plugins to be writeable. window.L = { ...L } -window.umap = { URLs, Request, ServerRequest, RequestError, HTTPError, NOKError } +window.umap = { URLs, Request, ServerRequest, RequestError, HTTPError, NOKError, Browser } diff --git a/umap/static/umap/js/modules/request.js b/umap/static/umap/js/modules/request.js index de1ce4b1..b90fbf92 100644 --- a/umap/static/umap/js/modules/request.js +++ b/umap/static/umap/js/modules/request.js @@ -1,5 +1,5 @@ // Uses `L._`` from Leaflet.i18n which we cannot import as a module yet -import { Evented, DomUtil } from '../../vendors/leaflet/leaflet-src.esm.js' +import { DomUtil } from '../../vendors/leaflet/leaflet-src.esm.js' export class RequestError extends Error {} diff --git a/umap/static/umap/js/umap.js b/umap/static/umap/js/umap.js index b29d6969..cee3d54d 100644 --- a/umap/static/umap/js/umap.js +++ b/umap/static/umap/js/umap.js @@ -423,7 +423,7 @@ L.U.Map.include({ this._controls.permanentCredit = new L.U.PermanentCreditsControl(this) if (this.options.scrollWheelZoom) this.scrollWheelZoom.enable() else this.scrollWheelZoom.disable() - this.browser = new L.U.Browser(this) + this.browser = new window.umap.Browser(this) this.importer = new L.U.Importer(this) this.drop = new L.U.DropControl(this) this.share = new L.U.Share(this) diff --git a/umap/static/umap/test/index.html b/umap/static/umap/test/index.html index 6935dcbd..23c9d52f 100644 --- a/umap/static/umap/test/index.html +++ b/umap/static/umap/test/index.html @@ -44,7 +44,6 @@ -