aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDave Arter <davea@mysociety.org>2018-01-11 20:47:28 +0000
committerDave Arter <davea@mysociety.org>2018-02-13 12:39:50 +0000
commita66db9d58a29ada7080837c6223fec78cdd444cc (patch)
treed19cba4c7cabf8d46ab054c90b32a33b1c4430f5
parentdf717b92c41418b287140ddb999c64f21b4fb6ca (diff)
Improvements to asset layer user interaction
This commit allows asset layers to be added to the map that have more complex behaviours than simply 'click a marker'. - Layers can be non-interactive and/or always visible Previously an asset layer would only be shown when its associated category was chosen from the dropdown. You can now add layers which are always visible, as well as ignoring user input. Useful for, e.g. showing an LLPG overlay on the map. - Stylemaps can be provided for individual layers This means you can, for example, have custom rules for styling features based on their attributes or other complex rules. - Functions can be used for the feature/report field mapping Instead of a one-to-one mapping between feature attributes and fields on the new report form, you can provide a callback function which can provide a calculated value to the report form.
-rw-r--r--web/cobrands/fixmystreet/assets.js93
1 files changed, 60 insertions, 33 deletions
diff --git a/web/cobrands/fixmystreet/assets.js b/web/cobrands/fixmystreet/assets.js
index 5cbd8923a..2cef581f2 100644
--- a/web/cobrands/fixmystreet/assets.js
+++ b/web/cobrands/fixmystreet/assets.js
@@ -34,8 +34,13 @@ function asset_selected(e) {
// Set the extra field to the value of the selected feature
$.each(this.fixmystreet.attributes, function (field_name, attribute_name) {
- var id = e.feature.attributes[attribute_name];
- $("#form_" + field_name).val(id);
+ var field_value;
+ if (typeof attribute_name === 'function') {
+ field_value = attribute_name.apply(e.feature);
+ } else {
+ field_value = e.feature.attributes[attribute_name];
+ }
+ $("#form_" + field_name).val(field_value);
});
// Hide the normal markers layer to keep things simple, but
@@ -121,7 +126,9 @@ function layer_visibilitychanged() {
// to show the marker again.
fixmystreet.markers.setVisibility(true);
}
- select_nearest_asset.call(this);
+ if (!this.fixmystreet.non_interactive) {
+ select_nearest_asset.call(this);
+ }
}
function zoom_to_assets(layer) {
@@ -208,7 +215,7 @@ function get_asset_stylemap() {
popupYOffset: -40,
graphicOpacity: 1.0
}),
- 'temporary': new OpenLayers.Style({
+ 'hover': new OpenLayers.Style({
fillColor: "#55BB00",
fillOpacity: 0.8,
strokeColor: "#000000",
@@ -297,7 +304,7 @@ fixmystreet.add_assets = function(options) {
visibility: false,
maxResolution: options.max_resolution,
minResolution: options.min_resolution,
- styleMap: get_asset_stylemap()
+ styleMap: options.stylemap || get_asset_stylemap()
};
if (options.srsName !== undefined) {
layer_options.projection = new OpenLayers.Projection(options.srsName);
@@ -333,43 +340,63 @@ fixmystreet.add_assets = function(options) {
asset_layer.fixmystreet.fault_layer = asset_fault_layer;
}
- // Set up handlers for selecting/unselecting markers and panning/zooming the map
- var select_feature_control = new OpenLayers.Control.SelectFeature( asset_layer );
- asset_layer.events.register( 'featureselected', asset_layer, asset_selected);
- asset_layer.events.register( 'featureunselected', asset_layer, asset_unselected);
- 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);
+ var hover_feature_control, select_feature_control;
+ if (!options.non_interactive) {
+ // Set up handlers for selecting/unselecting markers
+ select_feature_control = new OpenLayers.Control.SelectFeature( asset_layer );
+ asset_layer.events.register( 'featureselected', asset_layer, asset_selected);
+ asset_layer.events.register( 'featureunselected', asset_layer, asset_unselected);
+ // When panning/zooming the map check that this layer is still correctly shown
+ // and any selected marker is preserved
+ asset_layer.events.register( 'loadend', asset_layer, layer_loadend);
+ }
+
+ // Even if an asset layer is marked as non-interactive it can still have
+ // a hover style which we'll need to set up.
+ if (!options.non_interactive || (options.stylemap && options.stylemap.styles.hover)) {
+ // Set up handlers for simply hovering over a street light marker
+ hover_feature_control = new OpenLayers.Control.SelectFeature(
+ asset_layer,
+ {
+ hover: true,
+ highlightOnly: true,
+ renderIntent: 'hover'
+ }
+ );
+ hover_feature_control.events.register('beforefeaturehighlighted', null, function(e) {
+ // Don't let marker go from selected->hover state,
+ // as it causes some mad flickering effect.
+ if (e.feature.renderIntent == 'select') {
+ return false;
+ }
+ });
+ }
+ if (options.asset_category) {
+ fixmystreet.map.events.register( 'zoomend', asset_layer, check_zoom_message_visibility);
+ }
+ if (!options.always_visible) {
+ asset_layer.events.register( 'visibilitychanged', asset_layer, layer_visibilitychanged);
+ }
// 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,
- {
- hover: true,
- highlightOnly: true,
- renderIntent: 'temporary'
- }
- );
- hover_feature_control.events.register('beforefeaturehighlighted', null, function(e) {
- // Don't let marker go from selected->hover state,
- // as it causes some mad flickering effect.
- if (e.feature.renderIntent == 'select') {
- return false;
- }
- });
-
fixmystreet.map.addLayer(asset_layer);
+ if (options.always_visible) {
+ asset_layer.setVisibility(true);
+ }
if (asset_fault_layer) {
fixmystreet.map.addLayer(asset_fault_layer);
}
- fixmystreet.map.addControl( hover_feature_control );
- hover_feature_control.activate();
- fixmystreet.map.addControl( select_feature_control );
- select_feature_control.activate();
+ if (hover_feature_control) {
+ fixmystreet.map.addControl( hover_feature_control );
+ hover_feature_control.activate();
+ }
+ if (select_feature_control) {
+ fixmystreet.map.addControl( select_feature_control );
+ select_feature_control.activate();
+ }
// Make sure the fault markers always appear beneath the street lights
if (asset_fault_layer) {