From 43a11e3e40ac4967dd0b1ec42cc157745b7123fa Mon Sep 17 00:00:00 2001 From: "Renisha Christie. A" <29401459+crisner@users.noreply.github.com> Date: Sun, 23 Feb 2020 11:08:32 +0530 Subject: [PATCH] Improve layer menu (#409) * Refactor layers menu to not remove active layers on map move * Fix layer group title not showing when its layers are visible * Remove bounds that is no longer relevant * Limit requesting data to layer extents * Add cypress intellisense support and update package-lock file * Add tests to check layer filtering * Remove references to layerData.json * Fixed failing tests --- cypress/integration/eonetFiresLayer.spec.js | 6 +- cypress/integration/fractrackerMobile.spec.js | 4 +- cypress/integration/layersMenu.spec.js | 73 +++++++++++ dist/LeafletEnvironmentalLayers.js | 104 +++++++++++---- jsconfig.json | 6 + package-lock.json | 120 +++++++++--------- src/fracTrackerMobileLayer.js | 7 +- src/indigenousLayers.js | 7 +- src/layercode.js | 20 ++- src/toxicReleaseLayer.js | 7 +- src/util/layersBrowser.js | 59 ++++++--- 11 files changed, 306 insertions(+), 107 deletions(-) create mode 100644 cypress/integration/layersMenu.spec.js create mode 100644 jsconfig.json diff --git a/cypress/integration/eonetFiresLayer.spec.js b/cypress/integration/eonetFiresLayer.spec.js index 35a9d0d59..53a352d4e 100644 --- a/cypress/integration/eonetFiresLayer.spec.js +++ b/cypress/integration/eonetFiresLayer.spec.js @@ -1,7 +1,7 @@ describe('Eonet fires layer', function() { it('adds markers on click', function() { cy.openWindow('/example/index.html#lat=43.00&lon=-83.00&zoom=3&layers=Standard') - cy.wait(5000) + cy.wait(200) cy.window().then((win) => { cy.fixture('eonetFiresLayer').then((data) => { cy.stub(win.EonetFiresLayer, 'requestData', function() { @@ -9,7 +9,7 @@ describe('Eonet fires layer', function() { }) }) - cy.get('#menu-EONET_Fires label').click({ force: true }) + cy.get('#menu-eonetFiresLayer label').click({ force: true }) cy.get('.leaflet-marker-pane').children().should('have.length', 4) }) }) @@ -38,7 +38,7 @@ describe('Eonet fires layer', function() { }) it('removes markers from the map and the layer name from the hash when clicked again', function() { - cy.get('#menu-EONET_Fires label').click({ force: true }) + cy.get('#menu-eonetFiresLayer label').click({ force: true }) cy.hash().should('eq', '#lat=43.00&lon=-82.97&zoom=3&layers=Standard') cy.get('.leaflet-marker-pane').children().should('have.length', 0) cy.get('.leaflet-overlay-pane svg g').children().should('have.length', 0) diff --git a/cypress/integration/fractrackerMobile.spec.js b/cypress/integration/fractrackerMobile.spec.js index 1f5b7aa21..807640cff 100644 --- a/cypress/integration/fractrackerMobile.spec.js +++ b/cypress/integration/fractrackerMobile.spec.js @@ -9,7 +9,7 @@ describe('FractrackerMobile layer', function() { }) }) - cy.get('#menu-FracTracker_mobile label').click({ force: true }) + cy.get('#menu-fracTrackerMobile label').click({ force: true }) cy.get('.leaflet-overlay-pane svg g').children().should('have.length', 2) }) }) @@ -50,7 +50,7 @@ describe('FractrackerMobile layer', function() { }) it('removes markers from the map and the layer name from the hash when clicked again', function() { - cy.get('#menu-FracTracker_mobile label').click({ force: true }) + cy.get('#menu-fracTrackerMobile label').click({ force: true }) cy.hash().should('eq', '#lat=41.624&lon=-91.626&zoom=5&layers=Standard') cy.get('.leaflet-marker-pane').children().should('have.length', 0) cy.get('.leaflet-overlay-pane svg g').children().should('have.length', 0) diff --git a/cypress/integration/layersMenu.spec.js b/cypress/integration/layersMenu.spec.js new file mode 100644 index 000000000..9fa1494bb --- /dev/null +++ b/cypress/integration/layersMenu.spec.js @@ -0,0 +1,73 @@ +describe('Layers menu filters and displays layers on map', function() { + it('filters layers at map initialization', function() { + cy.openWindow('/example/index.html#lat=43.00&lon=-83.00&zoom=3&layers=Standard') + cy.wait(200) + cy.get('.leaflet-control-layers').trigger('mouseover') + cy.get('.layer-info-container').should('have.css', 'display', 'block').then((layers) => { + const layersArray = Array.prototype.slice.call(layers) + expect(layersArray.filter(layer => layer.style.display === 'block').length).to.equal(9) + }) + cy.get('.leaflet-control-layers').trigger('mouseout') + }) + + it('adds an alert displaying the number of new layers on map movement', function() { + cy.window().its('map').invoke('setView',[38.565, -100.767], 5) + cy.wait(200) + cy.get('.leaflet-control-layers-toggle .rounded-circle') + .should('have.css', 'display', 'flex') + .invoke('text').should('eq', '13') + }) + + it('adds layers to the menu on map movement', function() { + cy.get('.leaflet-control-layers').trigger('mouseover') + cy.get('.layer-info-container').should('have.css', 'display', 'block').then((layers) => { + const layersArray = Array.prototype.slice.call(layers) + expect(layersArray.filter(layer => layer.style.display === 'block').length).to.equal(14) + }) + }) + + it('removes alert after layer menu is expanded', function() { + cy.get('.leaflet-control-layers').trigger('mouseout') + cy.get('.leaflet-control-layers-toggle .rounded-circle') + .should('have.css', 'display', 'none') + .invoke('text').should('eq', '') + }) + + it('removes layers from the menu on map movement', function() { + cy.window().its('map').invoke('setView',[43.00, -83.00], 3) + cy.wait(300) + cy.get('.leaflet-control-layers').trigger('mouseover') + cy.get('.layer-info-container').should('have.css', 'display', 'block').then((layers) => { + const layersArray = Array.prototype.slice.call(layers) + expect(layersArray.filter(layer => layer.style.display === 'block').length).to.equal(9) + }) + }) + + it('retains an active layer when map view does not intersect with its extents', function() { + cy.window().its('map').invoke('setView',[38.565, -100.767], 5) + cy.wait(300) + cy.get('.leaflet-control-layers').trigger('mouseover') + cy.get('#groupName-justiceMap a[data-toggle="collapse"]').click() + cy.get('div#justiceMap.layers-sub-list.collapse.show').children('div') + .last('label').click() + .find('input[type="checkbox"]').should('be.checked') + cy.window().its('map').invoke('setView',[43.00, -83.00], 3) + cy.wait(300) + cy.get('#groupName-justiceMap').should('have.css', 'display', 'block') + cy.get('div#justiceMap.layers-sub-list.collapse.show').children('div') + .last('label').should('have.css', 'display', 'block') + cy.get('div#justiceMap.layers-sub-list.collapse.show').children('div') + .first('label').should('have.css', 'display', 'none') + }) + + it('filters out the layer on map move after it is unchecked', function() { + cy.get('div#justiceMap.layers-sub-list.collapse.show').children('div') + .last('label').click() + .find('input[type="checkbox"]').should('not.be.checked') + cy.window().its('map').invoke('setView',[43.00, -85.00], 3) + cy.wait(300) + cy.get('#groupName-justiceMap').should('have.css', 'display', 'none') + cy.get('div#justiceMap.layers-sub-list.collapse.show').children('div') + .last('label').should('have.css', 'display', 'none') + }) +}) \ No newline at end of file diff --git a/dist/LeafletEnvironmentalLayers.js b/dist/LeafletEnvironmentalLayers.js index fad9da864..436719777 100644 --- a/dist/LeafletEnvironmentalLayers.js +++ b/dist/LeafletEnvironmentalLayers.js @@ -26413,8 +26413,13 @@ L.GeoJSON.FracTrackerMobile = L.GeoJSON.extend( }, onAdd: function(map) { - map.on('moveend', this.requestData, this); + var info = require('./info.json'); this._map = map; + map.on('moveend', function() { + if(this._map && this._map.getZoom() > info.fracTrackerMobile.extents.minZoom - 1) { + this.requestData(); + } + }, this); this.requestData(); }, @@ -26505,7 +26510,7 @@ L.geoJSON.fracTrackerMobile = function(options) { return new L.GeoJSON.FracTrackerMobile(options); }; -},{}],12:[function(require,module,exports){ +},{"./info.json":13}],12:[function(require,module,exports){ L.LayerGroup.IndigenousLayers = L.LayerGroup.extend( { @@ -26524,8 +26529,13 @@ L.LayerGroup.IndigenousLayers = L.LayerGroup.extend( }, onAdd: function(map) { - map.on('moveend', this.requestData, this); + var info = require('./info.json'); this._map = map; + map.on('moveend', function() { + if(this._map && this._map.getZoom() > info.indigenousLands.extents.minZoom - 1) { + this.requestData(); + } + }, this); this.requestData(); }, @@ -26642,7 +26652,7 @@ L.layerGroup.indigenousLayers = function(name, options) { return new L.LayerGroup.IndigenousLayers(name, options); }; -},{}],13:[function(require,module,exports){ +},{"./info.json":13}],13:[function(require,module,exports){ module.exports={ "aqicnLayer": { "name": "Air Quality Index", @@ -27000,9 +27010,25 @@ L.LayerGroup.LayerCode = L.LayerGroup.extend( }, onAdd: function(map) { - map.on('moveend', this.requestData, this); + var info = require('./info.json'); this._map = map; - this.requestData(); + switch(this.layer) { + case this.layer: + if (this.layer === 'fractracker' || this.layer === 'skytruth' || + this.layer === 'odorreport' || this.layer === 'mapknitter') { + map.on('moveend', function() { + if(this._map && this._map.getZoom() > info[this.layer].extents.minZoom - 1) { + this.requestData(); + } + }, this); + } + default: + if (this.layer === 'luftdaten' || this.layer === 'openaq' || + this.layer === 'opensense' || this.layer === 'purpleairmarker') { + map.on('moveend', this.requestData, this); + } + this.requestData(); + } }, onRemove: function(map) { @@ -29578,8 +29604,13 @@ L.LayerGroup.ToxicReleaseLayer = L.LayerGroup.extend( }, onAdd: function(map) { - map.on('moveend', this.requestData, this); + var info = require('./info.json'); this._map = map; + map.on('moveend', function() { + if(this._map && this._map.getZoom() > info.toxicReleaseLayer.extents.minZoom - 1) { + this.requestData(); + } + }, this); this.requestData(); }, @@ -30236,6 +30267,8 @@ L.Control.LayersBrowser = L.Control.Layers.extend({ baseLayersCount += !obj.overlay ? 1 : 0; } + this._showGroupTitle(); // Show group title when atleast one of its layers is active + map.on('moveend', function() { if(this.options.newLayers.length > 0) { this._layersLink.style.marginLeft = '2.9em'; @@ -30246,6 +30279,8 @@ L.Control.LayersBrowser = L.Control.Layers.extend({ this._alertBadge.style.display = 'none'; this._alertBadge.innerHTML = ''; } + + this._showGroupTitle(); // Show group title when atleast one of its layers is active }, this); // Hide base layers section if there's only one layer. @@ -30395,6 +30430,7 @@ L.Control.LayersBrowser = L.Control.Layers.extend({ groupName.innerHTML = elements.name; var titleHolder = document.createElement('div'); + titleHolder.id = 'groupName-' + obj.group; titleHolder.className = 'clearfix layer-info-container'; titleHolder.appendChild(layerGroup); layerGroup.appendChild(chevron); @@ -30406,7 +30442,9 @@ L.Control.LayersBrowser = L.Control.Layers.extend({ var separator = this._createSeparator(); - this._hideOutOfBounds(obj, [titleHolder, separator]); + if(this._grpTitleVisible && !this._grpTitleVisible[obj.group]) { // Hide group title only if none of its layers are active + this._hideOutOfBounds(obj, [titleHolder, separator]); + } var container = obj.overlay ? this._overlaysList : this._baseLayersList; container.appendChild(titleHolder); @@ -30523,9 +30561,16 @@ L.Control.LayersBrowser = L.Control.Layers.extend({ }); }, - _hideElements: function(obj, data, layerName, elements, removeLayer) { + /** + * + * @param {Object} obj - layer object + * @param {Object} data - layer information from info.json + * @param {string} layerName + * @param {Object[]} elements - Reference to DOM elements + * @param {boolean} isNotGlobal - true if the layer passed in is not a globally available layer + */ + _hideElements: function(obj, data, layerName, elements, isNotGlobal) { var map = this._map; - var removeFrmMap = removeLayer; var currentBounds = map.getBounds(); var currentZoom = map.getZoom(); var bounds; @@ -30534,35 +30579,50 @@ L.Control.LayersBrowser = L.Control.Layers.extend({ bounds = data.extents && data.extents.bounds && L.latLngBounds(data.extents.bounds); zoom = data.extents && data.extents.minZoom && data.extents.minZoom; for(var i in elements) { - if((bounds && !bounds.intersects(currentBounds) && map.hasLayer(layerName) && removeFrmMap) || - ( zoom && (currentZoom < zoom) && map.hasLayer(layerName) && removeFrmMap)) { - elements[i].style.display = 'none'; - // Remove layer from map if active - map.removeLayer(layerName); - } else if((bounds && !bounds.intersects(currentBounds)) || (zoom && (currentZoom < zoom))) { + if((bounds && !bounds.intersects(currentBounds) && !map.hasLayer(layerName)) || + ( zoom && (currentZoom < zoom) && !map.hasLayer(layerName))) { elements[i].style.display = 'none'; - this._existingLayers(obj, false, removeFrmMap); + this._existingLayers(obj, false, isNotGlobal); + } else if(obj.group) { + this._grpTitleVisible = this._grpTitleVisible || {}; + this._grpTitleVisible[obj.group] = true; // Keep track of group titles to be visible when its layers are active + elements[i].style.display = 'block'; + this._existingLayers(obj, true, isNotGlobal); } else { elements[i].style.display = 'block'; - this._existingLayers(obj, true, removeFrmMap); + this._existingLayers(obj, true, isNotGlobal); } }; }; }, - _existingLayers: function(obj, doesExist, isInitialized) { - if(doesExist && isInitialized && !this.options.existingLayers[obj.name]) { // Check if there is a new layer in current bounds + _showGroupTitle: function() { + for(var i in this._grpTitleVisible) { + if(this._grpTitleVisible[i]) { + var groupName = 'groupName-' + i; + var grpHolder = document.getElementById(groupName); + var grpSelector = grpHolder && grpHolder.nextElementSibling; + if(grpHolder) { + grpHolder.style.display = 'block'; + grpSelector.style.display = 'block'; + } + } + } + this._grpTitleVisible = {}; // Reset list of group titles that need to be visible + }, + + _existingLayers: function(obj, doesExist, isNotGlobal) { + if(doesExist && isNotGlobal && !this.options.existingLayers[obj.name]) { // Check if there is a new layer in current bounds this.options.newLayers = [...this.options.newLayers, obj.name]; this.options.existingLayers[obj.name] = true; } else if(doesExist) { this.options.existingLayers[obj.name] = true; // layer exists upon inititalization - } else if(isInitialized && this.options.existingLayers[obj.name]) { // Remove from new layers if the layer no longer exists within current bounds + } else if(isNotGlobal && this.options.existingLayers[obj.name]) { // Remove from new layers if the layer no longer exists within current bounds this.options.newLayers = this.options.newLayers.filter(layer => layer !== obj.name); this.options.existingLayers[obj.name] = false; } else { this.options.existingLayers[obj.name] = false; // layer does not exist upon inititalization } - }, _getLayerData: function(obj) { diff --git a/jsconfig.json b/jsconfig.json new file mode 100644 index 000000000..f28c4eea9 --- /dev/null +++ b/jsconfig.json @@ -0,0 +1,6 @@ +{ + "include": [ + "./node_modules/cypress", + "cypress/**/*.js" + ] +} \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index dc6633cec..d56fef3d4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1264,7 +1264,7 @@ "JSONStream": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", - "integrity": "sha1-MgjB8I06TZkmGrZPkjArwV4RHKA=", + "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", "dev": true, "requires": { "jsonparse": "^1.2.0", @@ -1292,7 +1292,7 @@ "acorn-node": { "version": "1.8.2", "resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-1.8.2.tgz", - "integrity": "sha1-EUyV1kU55T3t4j3oudlt98euKvg=", + "integrity": "sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==", "dev": true, "requires": { "acorn": "^7.0.0", @@ -1309,9 +1309,9 @@ } }, "acorn-walk": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.0.0.tgz", - "integrity": "sha1-yLpvDxqsSwqeMtHwrxK+dpUo82s=", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.1.1.tgz", + "integrity": "sha512-wdlPY2tm/9XBr7QkKlq0WQVgiuGTX6YWPyRyBviSoScBuLfTVQhvwg6wJ369GJ/1nPfTLMfnrFIfjqVg6d+jQQ==", "dev": true }, "ajv": { @@ -1449,7 +1449,7 @@ "asn1.js": { "version": "4.10.1", "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", - "integrity": "sha1-ucK/WAXx5kqt7tbfOiv6+1pz9aA=", + "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", "dev": true, "requires": { "bn.js": "^4.0.0", @@ -1460,7 +1460,7 @@ "assert": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", - "integrity": "sha1-VcEJqvbgrv2z3EtxJAxwv1dLGOs=", + "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", "dev": true, "requires": { "object-assign": "^4.1.1", @@ -1576,7 +1576,7 @@ "base64-js": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz", - "integrity": "sha1-WOzoy3XdB+ce0IxzarxfrE2/jfE=", + "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==", "dev": true }, "basic-auth": { @@ -1610,7 +1610,7 @@ "bn.js": { "version": "4.11.8", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", - "integrity": "sha1-LN4J617jQfSEdGuwMJsyU7GxRC8=", + "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==", "dev": true }, "body": { @@ -1670,7 +1670,7 @@ "browser-pack": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/browser-pack/-/browser-pack-6.1.0.tgz", - "integrity": "sha1-w0uhDQuc4WK1ryJ8cTHJLC7NV3Q=", + "integrity": "sha512-erYug8XoqzU3IfcU8fUgyHqyOXqIE4tUTTQ+7mqUjQlvnXkOO6OlT9c/ZoJVHYoAaqGxr09CN53G7XIsO4KtWA==", "dev": true, "requires": { "JSONStream": "^1.0.3", @@ -1684,7 +1684,7 @@ "browser-resolve": { "version": "1.11.3", "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.11.3.tgz", - "integrity": "sha1-m3y7PQ9RDky4a9vXlhJNKLWJCvY=", + "integrity": "sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ==", "dev": true, "requires": { "resolve": "1.1.7" @@ -1701,7 +1701,7 @@ "browserify": { "version": "16.5.0", "resolved": "https://registry.npmjs.org/browserify/-/browserify-16.5.0.tgz", - "integrity": "sha1-ocK8BDG+wR/SkVGUFYLj9kXt6IE=", + "integrity": "sha512-6bfI3cl76YLAnCZ75AGu/XPOsqUhRyc0F/olGIJeCxtfxF2HvPKEcmjU9M8oAPxl4uBY1U7Nry33Q6koV3f2iw==", "dev": true, "requires": { "JSONStream": "^1.0.3", @@ -1757,7 +1757,7 @@ "browserify-aes": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", - "integrity": "sha1-Mmc0ZC9APavDADIJhTu3CtQo70g=", + "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", "dev": true, "requires": { "buffer-xor": "^1.0.3", @@ -1782,7 +1782,7 @@ "browserify-cipher": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", - "integrity": "sha1-jWR0wbhwv9q807z8wZNKEOlPFfA=", + "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", "dev": true, "requires": { "browserify-aes": "^1.0.4", @@ -1793,7 +1793,7 @@ "browserify-des": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", - "integrity": "sha1-OvTx9Zg5QDVy8cZiBDdfen9wPpw=", + "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", "dev": true, "requires": { "cipher-base": "^1.0.1", @@ -1860,7 +1860,7 @@ "browserify-zlib": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", - "integrity": "sha1-KGlFnZqjviRf6P4sofRuLn9U1z8=", + "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", "dev": true, "requires": { "pako": "~1.0.5" @@ -1880,7 +1880,7 @@ "buffer": { "version": "5.4.3", "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.4.3.tgz", - "integrity": "sha1-P7ycaetxPTI+P8Gole7gcQwHIRU=", + "integrity": "sha512-zvj65TkFeIt3i6aj5bIvJDzjjQQGs4o/sNoezg1F1kYap9Nu2jcUdpwzRSJTHMMzG0H7bZkn4rNQpImhuxWX2A==", "dev": true, "requires": { "base64-js": "^1.0.2", @@ -1926,7 +1926,7 @@ "cached-path-relative": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/cached-path-relative/-/cached-path-relative-1.0.2.tgz", - "integrity": "sha1-oT30GW0md2IgzDNW6xR6Utuixts=", + "integrity": "sha512-5r2GqsoEb4qMTTN9J+WzXfjov+hjxT+j3u5K+kIVNIwAd99DLCJE9pBIMP1qVeybV6JiijL385Oz0DcYxfbOIg==", "dev": true }, "cachedir": { @@ -2030,7 +2030,7 @@ "cipher-base": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", - "integrity": "sha1-h2Dk7MJy9MNjUy+SbYdKriwTl94=", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", "dev": true, "requires": { "inherits": "^2.0.1", @@ -2267,7 +2267,7 @@ "create-ecdh": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz", - "integrity": "sha1-yREbbzMEXEaX8UR4f5JUzcd8Rf8=", + "integrity": "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==", "dev": true, "requires": { "bn.js": "^4.1.0", @@ -2277,7 +2277,7 @@ "create-hash": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", - "integrity": "sha1-iJB4rxGmN1a8+1m9IhmWvjqe8ZY=", + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", "dev": true, "requires": { "cipher-base": "^1.0.1", @@ -2290,7 +2290,7 @@ "create-hmac": { "version": "1.1.7", "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", - "integrity": "sha1-aRcMeLOrlXFHsriwRXLkfq0iQ/8=", + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", "dev": true, "requires": { "cipher-base": "^1.0.3", @@ -2337,7 +2337,7 @@ "crypto-browserify": { "version": "3.12.0", "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", - "integrity": "sha1-OWz58xN/A+S45TLFj2mCVOAPgOw=", + "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", "dev": true, "requires": { "browserify-cipher": "^1.0.0", @@ -2728,7 +2728,7 @@ "dash-ast": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/dash-ast/-/dash-ast-1.0.0.tgz", - "integrity": "sha1-EgKbpfsviqbwqGF5WyPBtLbCfTc=", + "integrity": "sha512-Vy4dx7gquTeMcQR/hDkYLGUnwVil6vk4FOOct+djUnHOUWt+zJPJAaRIXaAFkPXtJjvlY7o3rfRu0/3hpnwoUA==", "dev": true }, "dashdash": { @@ -2830,7 +2830,7 @@ "detective": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/detective/-/detective-5.2.0.tgz", - "integrity": "sha1-/rKnfoW5BOzepFmtiXzJCpm9Kns=", + "integrity": "sha512-6SsIx+nUUbuK0EthKjv0zrdnajCCXVYGmbYYiYjFVpzcjwEs/JMDZ8tPRG29J/HhN56t3GJp2cGSWDRjjot8Pg==", "dev": true, "requires": { "acorn-node": "^1.6.1", @@ -2841,7 +2841,7 @@ "diffie-hellman": { "version": "5.0.3", "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", - "integrity": "sha1-QOjumPVaIUlgcUaSHGPhrl89KHU=", + "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", "dev": true, "requires": { "bn.js": "^4.1.0", @@ -2885,7 +2885,7 @@ "domain-browser": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", - "integrity": "sha1-PTH1AZGmdJ3RN1p/Ui6CPULlTto=", + "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", "dev": true }, "domelementtype": { @@ -3309,13 +3309,13 @@ "events": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/events/-/events-2.1.0.tgz", - "integrity": "sha1-KpoeGOYQbg6BKqnr1KgZs8KcC6U=", + "integrity": "sha512-3Zmiobend8P9DjmKAty0Era4jV8oJ0yGYe2nJJAxgymF9+N8F2m0hhZiMoWtcfepExzNKZumFU3ksdQbInGWCg==", "dev": true }, "evp_bytestokey": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", - "integrity": "sha1-f8vbGY3HGVlDLv4ThCaE4FJaywI=", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", "dev": true, "requires": { "md5.js": "^1.3.4", @@ -4323,7 +4323,7 @@ "get-assigned-identifiers": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/get-assigned-identifiers/-/get-assigned-identifiers-1.2.0.tgz", - "integrity": "sha1-bb9BHeZIy6+NkWnrsNLVdhkeL/E=", + "integrity": "sha512-mBBwmeGTrxEMO4pMaaf/uUEFHnYtwr8FTe8Y/mer4rcV/bye0qGm6pw1bGZFGStxC5O76c5ZAVBGnqHmOaJpdQ==", "dev": true }, "get-stdin": { @@ -4831,7 +4831,7 @@ "has": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha1-ci18v8H2qoJB8W3YFOAR4fQeh5Y=", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", "dev": true, "requires": { "function-bind": "^1.1.1" @@ -4871,7 +4871,7 @@ "hash.js": { "version": "1.1.7", "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", - "integrity": "sha1-C6vKU46NTuSg+JiNaIZlN6ADz0I=", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", "dev": true, "requires": { "inherits": "^2.0.3", @@ -5084,7 +5084,7 @@ "ieee754": { "version": "1.1.13", "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", - "integrity": "sha1-7BaFWOlaoYH9h9N/VcMrvLZwi4Q=", + "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==", "dev": true }, "ignore": { @@ -5234,7 +5234,7 @@ "insert-module-globals": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/insert-module-globals/-/insert-module-globals-7.2.0.tgz", - "integrity": "sha1-7IfltCcoR54ye9XFxxYR3ftHUro=", + "integrity": "sha512-VE6NlW+WGn2/AeOMd496AHFYmE7eLKkUY6Ty31k4og5vmA3Fjuwe9v6ifH6Xx/Hz27QvdoMoviw1/pqWRB09Sw==", "dev": true, "requires": { "JSONStream": "^1.0.3", @@ -5621,7 +5621,7 @@ "labeled-stream-splicer": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/labeled-stream-splicer/-/labeled-stream-splicer-2.0.2.tgz", - "integrity": "sha1-QqQaFqvNRv0EYwbPTyw1dv/7HCE=", + "integrity": "sha512-Ca4LSXFFZUjPScRaqOcFxneA0VpKZr4MMYCljyQr4LIewTLb3Y0IUTIsnBBsVubIeEfxeSZpSjSsRM8APEQaAw==", "dev": true, "requires": { "inherits": "^2.0.1", @@ -6106,7 +6106,7 @@ "md5.js": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", - "integrity": "sha1-tdB7jjIW4+J81yjXL3DR5qNCAF8=", + "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", "dev": true, "requires": { "hash-base": "^3.0.0", @@ -6162,7 +6162,7 @@ "miller-rabin": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", - "integrity": "sha1-8IA1HIZbDcViqEYpZtqlNUPHik0=", + "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", "dev": true, "requires": { "bn.js": "^4.0.0", @@ -6199,7 +6199,7 @@ "minimalistic-assert": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha1-LhlN4ERibUoQ5/f7wAznPoPk1cc=", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", "dev": true }, "minimalistic-crypto-utils": { @@ -6497,9 +6497,9 @@ "dev": true }, "pako": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.10.tgz", - "integrity": "sha1-Qyi621CGpCaqkPVBl31JVdpclzI=", + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", "dev": true }, "parent-module": { @@ -6523,7 +6523,7 @@ "parse-asn1": { "version": "5.1.5", "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.5.tgz", - "integrity": "sha1-ADJxND2ljclMrOSU+u89IUfs6g4=", + "integrity": "sha512-jkMYn1dcJqF6d5CpU689bq7w/b5ALS9ROVSpQDPrZsqqesUJii9qutvoT5ltGedNXMO2e16YUWIghG9KxaViTQ==", "dev": true, "requires": { "asn1.js": "^4.0.0", @@ -6558,7 +6558,7 @@ "path-browserify": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", - "integrity": "sha1-5sTd1+06onxoogzE5Q4aTug7vEo=", + "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==", "dev": true }, "path-exists": { @@ -6614,7 +6614,7 @@ "pbkdf2": { "version": "3.0.17", "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.17.tgz", - "integrity": "sha1-l2wgZTBhexTrsyEUI597CTNuk6Y=", + "integrity": "sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA==", "dev": true, "requires": { "create-hash": "^1.1.2", @@ -6787,7 +6787,7 @@ "public-encrypt": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", - "integrity": "sha1-T8ydd6B+SLp1J+fL4N4z0HATMeA=", + "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", "dev": true, "requires": { "bn.js": "^4.1.0", @@ -6887,7 +6887,7 @@ "randombytes": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha1-32+ENy8CcNxlzfYpE0mrekc9Tyo=", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", "dev": true, "requires": { "safe-buffer": "^5.1.0" @@ -6896,7 +6896,7 @@ "randomfill": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", - "integrity": "sha1-ySGW/IarQr6YPxvzF3giSTHWFFg=", + "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", "dev": true, "requires": { "randombytes": "^2.0.5", @@ -7237,7 +7237,7 @@ "ripemd160": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", - "integrity": "sha1-ocGm9iR1FXe6XQeRTLyShQWFiQw=", + "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", "dev": true, "requires": { "hash-base": "^3.0.0", @@ -7301,7 +7301,7 @@ "sha.js": { "version": "2.4.11", "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", - "integrity": "sha1-N6XPC4HsvGlD3hCbopYNGyZYSuc=", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", "dev": true, "requires": { "inherits": "^2.0.1", @@ -7489,7 +7489,7 @@ "stream-browserify": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", - "integrity": "sha1-h1IdOKRKp+6RzhzSpH3wy0ndZgs=", + "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", "dev": true, "requires": { "inherits": "~2.0.1", @@ -7509,7 +7509,7 @@ "stream-http": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-3.1.0.tgz", - "integrity": "sha1-Ivsz/ptAVrTsz1i9j0AMS5k//lc=", + "integrity": "sha512-cuB6RgO7BqC4FBYzmnvhob5Do3wIdIsXAgGycHJnW+981gHqoYcYz9lqjJrk8WXRddbwPuqPYRl+bag6mYv4lw==", "dev": true, "requires": { "builtin-status-codes": "^3.0.0", @@ -7519,9 +7519,9 @@ }, "dependencies": { "readable-stream": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.4.0.tgz", - "integrity": "sha1-pRwmdUZY4KPCHb9ZFjvUW6b0R/w=", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", "dev": true, "requires": { "inherits": "^2.0.3", @@ -7534,7 +7534,7 @@ "stream-splicer": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/stream-splicer/-/stream-splicer-2.0.1.tgz", - "integrity": "sha1-CxO37itax+BgmnRj2DiZWJo2P80=", + "integrity": "sha512-Xizh4/NPuYSyAXyT7g8IvdJ9HJpxIGL9PjyhtywCZvvP0OPIdqyrr4dMikeuvY8xahpdKEBlBTySe583totajg==", "dev": true, "requires": { "inherits": "^2.0.1", @@ -7653,7 +7653,7 @@ "syntax-error": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/syntax-error/-/syntax-error-1.4.0.tgz", - "integrity": "sha1-LZ1P9cBkrLcRWUo+O5UFStUdkHw=", + "integrity": "sha512-YPPlu67mdnHGTup2A8ff7BC2Pjq0e0Yp/IyTFN03zWO0RcK07uLcbi7C2KpGR2FvWbaB0+bfE27a+sBKebSo7w==", "dev": true, "requires": { "acorn-node": "^1.2.0" @@ -7862,7 +7862,7 @@ "tty-browserify": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.1.tgz", - "integrity": "sha1-PwUlHuF5BN/QZ3VGZw25ZRaCuBE=", + "integrity": "sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw==", "dev": true }, "tunnel-agent": { @@ -7923,13 +7923,13 @@ "umd": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/umd/-/umd-3.0.3.tgz", - "integrity": "sha1-qp/mU8QrkJdnhInAEACstp8LJs8=", + "integrity": "sha512-4IcGSufhFshvLNcMCV80UnQVlZ5pMOC8mvNPForqwA4+lzYQuetTESLDQkeLmihq8bRcnpbQa48Wb8Lh16/xow==", "dev": true }, "undeclared-identifiers": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/undeclared-identifiers/-/undeclared-identifiers-1.1.3.tgz", - "integrity": "sha1-klTB03vawKwrUt5LZyJ5LSqR4w8=", + "integrity": "sha512-pJOW4nxjlmfwKApE4zvxLScM/njmwj/DiUBv7EabwE4O8kRUy+HIwxQtZLBPll/jx1LJyBcqNfB3/cpv9EZwOw==", "dev": true, "requires": { "acorn-node": "^1.3.0", @@ -8048,7 +8048,7 @@ "util": { "version": "0.10.4", "resolved": "https://registry.npmjs.org/util/-/util-0.10.4.tgz", - "integrity": "sha1-OqASW/5mikZy3liFfTrOJ+y3aQE=", + "integrity": "sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==", "dev": true, "requires": { "inherits": "2.0.3" diff --git a/src/fracTrackerMobileLayer.js b/src/fracTrackerMobileLayer.js index 79e1d9693..9b37d9257 100644 --- a/src/fracTrackerMobileLayer.js +++ b/src/fracTrackerMobileLayer.js @@ -9,8 +9,13 @@ L.GeoJSON.FracTrackerMobile = L.GeoJSON.extend( }, onAdd: function(map) { - map.on('moveend', this.requestData, this); + var info = require('./info.json'); this._map = map; + map.on('moveend', function() { + if(this._map && this._map.getZoom() > info.fracTrackerMobile.extents.minZoom - 1) { + this.requestData(); + } + }, this); this.requestData(); }, diff --git a/src/indigenousLayers.js b/src/indigenousLayers.js index 9e3ac8a75..7671740d8 100644 --- a/src/indigenousLayers.js +++ b/src/indigenousLayers.js @@ -16,8 +16,13 @@ L.LayerGroup.IndigenousLayers = L.LayerGroup.extend( }, onAdd: function(map) { - map.on('moveend', this.requestData, this); + var info = require('./info.json'); this._map = map; + map.on('moveend', function() { + if(this._map && this._map.getZoom() > info.indigenousLands.extents.minZoom - 1) { + this.requestData(); + } + }, this); this.requestData(); }, diff --git a/src/layercode.js b/src/layercode.js index 96736befa..e5fd6f5b5 100644 --- a/src/layercode.js +++ b/src/layercode.js @@ -18,9 +18,25 @@ L.LayerGroup.LayerCode = L.LayerGroup.extend( }, onAdd: function(map) { - map.on('moveend', this.requestData, this); + var info = require('./info.json'); this._map = map; - this.requestData(); + switch(this.layer) { + case this.layer: + if (this.layer === 'fractracker' || this.layer === 'skytruth' || + this.layer === 'odorreport' || this.layer === 'mapknitter') { + map.on('moveend', function() { + if(this._map && this._map.getZoom() > info[this.layer].extents.minZoom - 1) { + this.requestData(); + } + }, this); + } + default: + if (this.layer === 'luftdaten' || this.layer === 'openaq' || + this.layer === 'opensense' || this.layer === 'purpleairmarker') { + map.on('moveend', this.requestData, this); + } + this.requestData(); + } }, onRemove: function(map) { diff --git a/src/toxicReleaseLayer.js b/src/toxicReleaseLayer.js index 208d581db..0d2a3ee5c 100644 --- a/src/toxicReleaseLayer.js +++ b/src/toxicReleaseLayer.js @@ -28,8 +28,13 @@ L.LayerGroup.ToxicReleaseLayer = L.LayerGroup.extend( }, onAdd: function(map) { - map.on('moveend', this.requestData, this); + var info = require('./info.json'); this._map = map; + map.on('moveend', function() { + if(this._map && this._map.getZoom() > info.toxicReleaseLayer.extents.minZoom - 1) { + this.requestData(); + } + }, this); this.requestData(); }, diff --git a/src/util/layersBrowser.js b/src/util/layersBrowser.js index 0ecf5ca51..76d920aed 100644 --- a/src/util/layersBrowser.js +++ b/src/util/layersBrowser.js @@ -190,6 +190,8 @@ L.Control.LayersBrowser = L.Control.Layers.extend({ baseLayersCount += !obj.overlay ? 1 : 0; } + this._showGroupTitle(); // Show group title when atleast one of its layers is active + map.on('moveend', function() { if(this.options.newLayers.length > 0) { this._layersLink.style.marginLeft = '2.9em'; @@ -200,6 +202,8 @@ L.Control.LayersBrowser = L.Control.Layers.extend({ this._alertBadge.style.display = 'none'; this._alertBadge.innerHTML = ''; } + + this._showGroupTitle(); // Show group title when atleast one of its layers is active }, this); // Hide base layers section if there's only one layer. @@ -349,6 +353,7 @@ L.Control.LayersBrowser = L.Control.Layers.extend({ groupName.innerHTML = elements.name; var titleHolder = document.createElement('div'); + titleHolder.id = 'groupName-' + obj.group; titleHolder.className = 'clearfix layer-info-container'; titleHolder.appendChild(layerGroup); layerGroup.appendChild(chevron); @@ -360,7 +365,9 @@ L.Control.LayersBrowser = L.Control.Layers.extend({ var separator = this._createSeparator(); - this._hideOutOfBounds(obj, [titleHolder, separator]); + if(this._grpTitleVisible && !this._grpTitleVisible[obj.group]) { // Hide group title only if none of its layers are active + this._hideOutOfBounds(obj, [titleHolder, separator]); + } var container = obj.overlay ? this._overlaysList : this._baseLayersList; container.appendChild(titleHolder); @@ -477,9 +484,16 @@ L.Control.LayersBrowser = L.Control.Layers.extend({ }); }, - _hideElements: function(obj, data, layerName, elements, removeLayer) { + /** + * + * @param {Object} obj - layer object + * @param {Object} data - layer information from info.json + * @param {string} layerName + * @param {Object[]} elements - Reference to DOM elements + * @param {boolean} isNotGlobal - true if the layer passed in is not a globally available layer + */ + _hideElements: function(obj, data, layerName, elements, isNotGlobal) { var map = this._map; - var removeFrmMap = removeLayer; var currentBounds = map.getBounds(); var currentZoom = map.getZoom(); var bounds; @@ -488,35 +502,50 @@ L.Control.LayersBrowser = L.Control.Layers.extend({ bounds = data.extents && data.extents.bounds && L.latLngBounds(data.extents.bounds); zoom = data.extents && data.extents.minZoom && data.extents.minZoom; for(var i in elements) { - if((bounds && !bounds.intersects(currentBounds) && map.hasLayer(layerName) && removeFrmMap) || - ( zoom && (currentZoom < zoom) && map.hasLayer(layerName) && removeFrmMap)) { + if((bounds && !bounds.intersects(currentBounds) && !map.hasLayer(layerName)) || + ( zoom && (currentZoom < zoom) && !map.hasLayer(layerName))) { elements[i].style.display = 'none'; - // Remove layer from map if active - map.removeLayer(layerName); - } else if((bounds && !bounds.intersects(currentBounds)) || (zoom && (currentZoom < zoom))) { - elements[i].style.display = 'none'; - this._existingLayers(obj, false, removeFrmMap); + this._existingLayers(obj, false, isNotGlobal); + } else if(obj.group) { + this._grpTitleVisible = this._grpTitleVisible || {}; + this._grpTitleVisible[obj.group] = true; // Keep track of group titles to be visible when its layers are active + elements[i].style.display = 'block'; + this._existingLayers(obj, true, isNotGlobal); } else { elements[i].style.display = 'block'; - this._existingLayers(obj, true, removeFrmMap); + this._existingLayers(obj, true, isNotGlobal); } }; }; }, - _existingLayers: function(obj, doesExist, isInitialized) { - if(doesExist && isInitialized && !this.options.existingLayers[obj.name]) { // Check if there is a new layer in current bounds + _showGroupTitle: function() { + for(var i in this._grpTitleVisible) { + if(this._grpTitleVisible[i]) { + var groupName = 'groupName-' + i; + var grpHolder = document.getElementById(groupName); + var grpSelector = grpHolder && grpHolder.nextElementSibling; + if(grpHolder) { + grpHolder.style.display = 'block'; + grpSelector.style.display = 'block'; + } + } + } + this._grpTitleVisible = {}; // Reset list of group titles that need to be visible + }, + + _existingLayers: function(obj, doesExist, isNotGlobal) { + if(doesExist && isNotGlobal && !this.options.existingLayers[obj.name]) { // Check if there is a new layer in current bounds this.options.newLayers = [...this.options.newLayers, obj.name]; this.options.existingLayers[obj.name] = true; } else if(doesExist) { this.options.existingLayers[obj.name] = true; // layer exists upon inititalization - } else if(isInitialized && this.options.existingLayers[obj.name]) { // Remove from new layers if the layer no longer exists within current bounds + } else if(isNotGlobal && this.options.existingLayers[obj.name]) { // Remove from new layers if the layer no longer exists within current bounds this.options.newLayers = this.options.newLayers.filter(layer => layer !== obj.name); this.options.existingLayers[obj.name] = false; } else { this.options.existingLayers[obj.name] = false; // layer does not exist upon inititalization } - }, _getLayerData: function(obj) {