aboutsummaryrefslogtreecommitdiffstats
path: root/web
diff options
context:
space:
mode:
Diffstat (limited to 'web')
-rw-r--r--web/cobrands/fixmystreet/assets.js7
-rw-r--r--web/js/map-OpenLayers.js34
2 files changed, 35 insertions, 6 deletions
diff --git a/web/cobrands/fixmystreet/assets.js b/web/cobrands/fixmystreet/assets.js
index dd76a8e8f..e24e76495 100644
--- a/web/cobrands/fixmystreet/assets.js
+++ b/web/cobrands/fixmystreet/assets.js
@@ -306,6 +306,8 @@ fixmystreet.add_assets = function(options) {
};
OpenLayers.Util.applyDefaults(lo, layer_options);
asset_fault_layer = new OpenLayers.Layer.Vector("WFS", lo);
+ asset_fault_layer.events.register( 'loadstart', null, fixmystreet.maps.loading_spinner.show);
+ asset_fault_layer.events.register( 'loadend', null, fixmystreet.maps.loading_spinner.hide);
asset_layer.fixmystreet.fault_layer = asset_fault_layer;
}
@@ -316,6 +318,11 @@ fixmystreet.add_assets = function(options) {
asset_layer.events.register( 'loadend', asset_layer, layer_loadend);
asset_layer.events.register( 'visibilitychanged', asset_layer, layer_visibilitychanged);
fixmystreet.map.events.register( 'zoomend', asset_layer, check_zoom_message_visibility);
+
+ // Make sure the user knows something is happening (some asset layers can be sllooowwww)
+ asset_layer.events.register( 'loadstart', null, fixmystreet.maps.loading_spinner.show);
+ asset_layer.events.register( 'loadend', null, fixmystreet.maps.loading_spinner.hide);
+
// Set up handlers for simply hovering over a street light marker
var hover_feature_control = new OpenLayers.Control.SelectFeature(
asset_layer,
diff --git a/web/js/map-OpenLayers.js b/web/js/map-OpenLayers.js
index 7f8ec1755..0f6cca2b5 100644
--- a/web/js/map-OpenLayers.js
+++ b/web/js/map-OpenLayers.js
@@ -229,6 +229,32 @@ $.extend(fixmystreet.utils, {
}
}
fixmystreet.markers.redraw();
+ },
+
+ /* Keep track of how many things are loading simultaneously, and only hide
+ * the loading spinner when everything has finished.
+ * This allows multiple layers to be loading at once without each layer
+ * having to keep track of the others or be responsible for manipulating
+ * the spinner in the DOM.
+ */
+ loading_spinner: {
+ count: 0,
+ show: function() {
+ fixmystreet.maps.loading_spinner.count++;
+ if (fixmystreet.maps.loading_spinner.count > 0) {
+ // Show the loading indicator over the map
+ $('#loading-indicator').removeClass('hidden');
+ $('#loading-indicator').attr('aria-hidden', false);
+ }
+ },
+ hide: function() {
+ fixmystreet.maps.loading_spinner.count--;
+ if (fixmystreet.maps.loading_spinner.count <= 0) {
+ // Remove loading indicator
+ $('#loading-indicator').addClass('hidden');
+ $('#loading-indicator').attr('aria-hidden', true);
+ }
+ }
}
});
@@ -542,6 +568,8 @@ $.extend(fixmystreet.utils, {
fixmystreet.map.removePopup(fixmystreet.map.popups[0]);
}
});
+ fixmystreet.markers.events.register( 'loadstart', null, fixmystreet.maps.loading_spinner.show);
+ fixmystreet.markers.events.register( 'loadend', null, fixmystreet.maps.loading_spinner.hide);
var markers = fixmystreet.maps.markers_list( fixmystreet.pins, true );
fixmystreet.markers.addFeatures( markers );
@@ -851,9 +879,6 @@ OpenLayers.Protocol.FixMyStreet = OpenLayers.Class(OpenLayers.Protocol.HTTP, {
use_page: false,
read: function(options) {
- // Show the loading indicator over the map
- $('#loading-indicator').removeClass('hidden');
- $('#loading-indicator').attr('aria-hidden', false);
// Pass the values of the category, status, and sort fields as query params
options.params = options.params || {};
$.each({ filter_category: 'filter_categories', status: 'statuses', sort: 'sort' }, function(key, id) {
@@ -881,9 +906,6 @@ OpenLayers.Protocol.FixMyStreet = OpenLayers.Class(OpenLayers.Protocol.HTTP, {
/* Pan data handler */
OpenLayers.Format.FixMyStreet = OpenLayers.Class(OpenLayers.Format.JSON, {
read: function(json, filter) {
- // Remove loading indicator
- $('#loading-indicator').addClass('hidden');
- $('#loading-indicator').attr('aria-hidden', true);
var obj;
if (typeof json == 'string') {
obj = OpenLayers.Format.JSON.prototype.read.apply(this, [json, filter]);