diff options
Diffstat (limited to 'web')
-rw-r--r-- | web/cobrands/angus/js.js | 4 | ||||
-rw-r--r-- | web/cobrands/bristol/js.js | 16 | ||||
-rw-r--r-- | web/cobrands/fixmystreet/assets.js | 271 | ||||
-rw-r--r-- | web/cobrands/fixmystreet/staff.js | 4 | ||||
-rw-r--r-- | web/vendor/OpenLayers.Projection.OrdnanceSurvey.js | 12 |
5 files changed, 186 insertions, 121 deletions
diff --git a/web/cobrands/angus/js.js b/web/cobrands/angus/js.js index f3e7bf211..566b3a842 100644 --- a/web/cobrands/angus/js.js +++ b/web/cobrands/angus/js.js @@ -4,7 +4,7 @@ if (!fixmystreet.maps) { return; } -$(fixmystreet.add_assets({ +fixmystreet.assets.add({ wfs_url: "https://data.angus.gov.uk/geoserver/services/wfs", wfs_feature: "lighting_column_v", wfs_fault_feature: "lighting_faults_v", @@ -18,6 +18,6 @@ $(fixmystreet.add_assets({ column_id: 'n' }, geometryName: 'g' -})); +}); })(); diff --git a/web/cobrands/bristol/js.js b/web/cobrands/bristol/js.js index 1fc23d61a..9a4d1ec46 100644 --- a/web/cobrands/bristol/js.js +++ b/web/cobrands/bristol/js.js @@ -19,32 +19,32 @@ var options = { geometryName: 'SHAPE' }; -$(fixmystreet.add_assets($.extend({}, options, { +fixmystreet.assets.add($.extend({}, options, { wfs_feature: "COD_ASSETS_AREA", asset_type: 'area', asset_category: "Bridges/Subways", asset_item: 'bridge/subway' -}))); +})); -$(fixmystreet.add_assets($.extend({}, options, { +fixmystreet.assets.add($.extend({}, options, { asset_category: "Gully/Drainage", asset_item: 'gully', filter_key: 'COD_ASSET_TYPE', filter_value: 'GULLY' -}))); +})); -$(fixmystreet.add_assets($.extend({}, options, { +fixmystreet.assets.add($.extend({}, options, { asset_category: "Grit Bins", asset_item: 'grit bin', filter_key: 'COD_ASSET_TYPE', filter_value: 'GRITBIN' -}))); +})); -$(fixmystreet.add_assets($.extend({}, options, { +fixmystreet.assets.add($.extend({}, options, { asset_category: "Street Lighting", asset_item: 'street light', filter_key: 'COD_ASSET_TYPE', filter_value: 'SL' -}))); +})); })(); diff --git a/web/cobrands/fixmystreet/assets.js b/web/cobrands/fixmystreet/assets.js index e24e76495..a6ecbadb2 100644 --- a/web/cobrands/fixmystreet/assets.js +++ b/web/cobrands/fixmystreet/assets.js @@ -17,7 +17,7 @@ function asset_selected(e) { close_fault_popup(); var lonlat = e.feature.geometry.getBounds().getCenterLonLat(); - // Check if there is a known fault with the light that's been clicked, + // Check if there is a known fault with the asset that's been clicked, // and disallow selection if so. var fault_feature = find_matching_feature(e.feature, this.fixmystreet.fault_layer, this.fixmystreet.asset_id_field); if (!!fault_feature) { @@ -34,13 +34,18 @@ 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 // move the green marker to the point of the click to stop - // it jumping around unexpectedly if the user deselects street light. + // it jumping around unexpectedly if the user deselects the asset. fixmystreet.markers.setVisibility(false); fixmystreet.markers.features[0].move(lonlat); @@ -108,7 +113,7 @@ function check_zoom_message_visibility() { function layer_visibilitychanged() { check_zoom_message_visibility.call(this); - var layers = fixmystreet.map.getLayersByName('WFS'); + var layers = fixmystreet.map.getLayersBy('assets', true); var visible = 0; for (var i = 0; i<layers.length; i++) { if (layers[i].getVisibility()) { @@ -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) { @@ -184,6 +191,10 @@ function layer_loadend() { } function get_asset_stylemap() { + // fixmystreet.pin_prefix isn't always available here (e.g. on /report/new), + // so get it from the DOM directly + var pin_prefix = fixmystreet.pin_prefix || document.getElementById('js-map-data').getAttribute('data-pin_prefix'); + return new OpenLayers.StyleMap({ 'default': new OpenLayers.Style({ fillColor: "#FFFF00", @@ -194,13 +205,13 @@ function get_asset_stylemap() { pointRadius: 6 }), 'select': new OpenLayers.Style({ - externalGraphic: fixmystreet.pin_prefix + "pin-spot.png", + externalGraphic: pin_prefix + "pin-spot.png", fillColor: "#55BB00", graphicWidth: 48, graphicHeight: 64, graphicXOffset: -24, graphicYOffset: -56, - backgroundGraphic: fixmystreet.pin_prefix + "pin-shadow.png", + backgroundGraphic: pin_prefix + "pin-shadow.png", backgroundWidth: 60, backgroundHeight: 30, backgroundXOffset: -7, @@ -208,7 +219,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", @@ -233,54 +244,57 @@ function get_fault_stylemap() { }); } -fixmystreet.add_assets = function(options) { - var asset_layer = null; - var asset_fault_layer = null; +fixmystreet.assets = { + layers: [], + controls: [], - function add_assets() { - if (asset_layer !== null) { - // Layer has already been added - return; - } - if (window.fixmystreet === undefined) { - // We're on a page without a map, yet somehow still got called... - // Nothing to do. - return; - } - if (fixmystreet.map === undefined) { - // Map's not loaded yet, let's try again soon... - setTimeout(add_assets, 250); - return; - } - if (fixmystreet.page != 'new' && fixmystreet.page != 'around') { - // We only want to show light markers when making a new report - return; - } + add: function(options) { + var asset_fault_layer = null; - // An interactive layer for selecting a street light - var protocol_options = { - version: "1.1.0", - url: options.wfs_url, - featureType: options.wfs_feature, - geometryName: options.geometryName - }; - if (fixmystreet.wmts_config) { - protocol_options.srsName = fixmystreet.wmts_config.map_projection; - } - if (options.propertyNames) { - protocol_options.propertyNames = options.propertyNames; + // An interactive layer for selecting an asset (e.g. street light) + var protocol_options; + var protocol; + if (options.http_options !== undefined) { + protocol_options = OpenLayers.Util.extend(options.http_options, {}); + if (protocol_options.format_class) { + protocol_options.format = new protocol_options.format_class(protocol_options.format_options); + } else { + protocol_options.format = new OpenLayers.Format.GML({ + geometryName: options.geometryName + }); + } + protocol = new OpenLayers.Protocol.HTTP(protocol_options); + } else { + protocol_options = { + version: "1.1.0", + url: options.wfs_url, + featureType: options.wfs_feature, + geometryName: options.geometryName + }; + if (options.srsName !== undefined) { + protocol_options.srsName = options.srsName; + } else if (fixmystreet.wmts_config) { + protocol_options.srsName = fixmystreet.wmts_config.map_projection; + } + if (options.propertyNames) { + protocol_options.propertyNames = options.propertyNames; + } + protocol = new OpenLayers.Protocol.WFS(protocol_options); } - var protocol = new OpenLayers.Protocol.WFS(protocol_options); + var StrategyClass = options.strategy_class || OpenLayers.Strategy.BBOX; var layer_options = { fixmystreet: options, - strategies: [new OpenLayers.Strategy.BBOX()], + strategies: [new StrategyClass()], protocol: protocol, visibility: false, maxResolution: options.max_resolution, minResolution: options.min_resolution, - styleMap: get_asset_stylemap() + styleMap: options.stylemap || get_asset_stylemap(), + assets: true }; - if (fixmystreet.wmts_config) { + if (options.srsName !== undefined) { + layer_options.projection = new OpenLayers.Projection(options.srsName); + } else if (fixmystreet.wmts_config) { layer_options.projection = new OpenLayers.Projection(fixmystreet.wmts_config.map_projection); } if (options.filter_key) { @@ -290,9 +304,10 @@ fixmystreet.add_assets = function(options) { value: options.filter_value }); } - asset_layer = new OpenLayers.Layer.Vector("WFS", layer_options); - // A non-interactive layer to display existing street light faults + var asset_layer = new OpenLayers.Layer.Vector(options.name || "WFS", layer_options); + + // A non-interactive layer to display existing asset faults if (options.wfs_fault_feature) { var po = { featureType: options.wfs_fault_feature @@ -302,7 +317,8 @@ fixmystreet.add_assets = function(options) { var lo = { strategies: [new OpenLayers.Strategy.BBOX()], protocol: fault_protocol, - styleMap: get_fault_stylemap() + styleMap: get_fault_stylemap(), + assets: true }; OpenLayers.Util.applyDefaults(lo, layer_options); asset_fault_layer = new OpenLayers.Layer.Vector("WFS", lo); @@ -311,81 +327,122 @@ 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 an asset 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.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); + fixmystreet.assets.layers.push(asset_layer); + if (options.always_visible) { + asset_layer.setVisibility(true); + } if (asset_fault_layer) { - fixmystreet.map.addLayer(asset_fault_layer); + fixmystreet.assets.layers.push(asset_fault_layer); + } + if (hover_feature_control) { + fixmystreet.assets.controls.push(hover_feature_control); + } + if (select_feature_control) { + fixmystreet.assets.controls.push(select_feature_control); } - fixmystreet.map.addControl( hover_feature_control ); - hover_feature_control.activate(); - fixmystreet.map.addControl( select_feature_control ); - select_feature_control.activate(); - // Make sure the fault markers always appear beneath the street lights + // Make sure the fault markers always appear beneath the linked assets if (asset_fault_layer) { asset_fault_layer.setZIndex(asset_layer.getZIndex()-1); } - // Show/hide the asset layer when the category is chosen - $("#problem_form").on("change.category", "select#form_category", function(){ - var category = $(this).val(); - if (category == options.asset_category) { - asset_layer.setVisibility(true); - if (asset_fault_layer) { - asset_fault_layer.setVisibility(true); + if (!asset_layer.fixmystreet.always_visible) { + // Show/hide the asset layer when the category is chosen + $("#problem_form").on("change.category", "select#form_category", function(){ + var category = $(this).val(); + if (category == options.asset_category) { + asset_layer.setVisibility(true); + if (asset_fault_layer) { + asset_fault_layer.setVisibility(true); + } + zoom_to_assets(asset_layer); + } else { + asset_layer.setVisibility(false); + if (asset_fault_layer) { + asset_fault_layer.setVisibility(false); + } } - zoom_to_assets(asset_layer); - } else { - asset_layer.setVisibility(false); - if (asset_fault_layer) { - asset_fault_layer.setVisibility(false); + }); + } + }, + + init: function() { + if (fixmystreet.page != 'new' && fixmystreet.page != 'around') { + // We only want to show asset markers when making a new report + return; + } + + // Make sure the assets get hidden if the back button is pressed + fixmystreet.maps.display_around = (function(original) { + function hide_assets() { + for (var i = 0; i < fixmystreet.assets.layers.length; i++) { + var layer = fixmystreet.assets.layers[i]; + if (!layer.fixmystreet.always_visible) { + layer.setVisibility(false); + } } + fixmystreet.markers.setVisibility(true); + original.apply(fixmystreet.maps); } - }); - } - - // Make sure the assets get hidden if the back button is pressed - fixmystreet.maps.display_around = (function(original) { - function hide_assets() { - asset_layer.setVisibility(false); - if (asset_fault_layer) { - asset_fault_layer.setVisibility(false); + return hide_assets; + })(fixmystreet.maps.display_around); + + for (var i = 0; i < fixmystreet.assets.layers.length; i++) { + var layer = fixmystreet.assets.layers[i]; + fixmystreet.map.addLayer(layer); + if (layer.fixmystreet.asset_category) { + fixmystreet.map.events.register( 'zoomend', layer, check_zoom_message_visibility); } - fixmystreet.markers.setVisibility(true); - original.apply(fixmystreet.maps); } - return hide_assets; - })(fixmystreet.maps.display_around); - return add_assets; + for (i = 0; i < fixmystreet.assets.controls.length; i++) { + fixmystreet.map.addControl(fixmystreet.assets.controls[i]); + fixmystreet.assets.controls[i].activate(); + } + } }; +$(function() { + fixmystreet.assets.init(); +}); + })(); diff --git a/web/cobrands/fixmystreet/staff.js b/web/cobrands/fixmystreet/staff.js index f2b98744b..37bfeabaf 100644 --- a/web/cobrands/fixmystreet/staff.js +++ b/web/cobrands/fixmystreet/staff.js @@ -432,8 +432,8 @@ $.extend(fixmystreet.set_up, { $.extend(fixmystreet.hooks, { update_problem_fields: function(args) { if (args.prefill_reports && args.role == 'inspector') { - var title = args.category + ' problem has been scheduled for fixing'; - var description = args.category + ' problem found - scheduled for fixing by ' + args.body; + var title = 'A ' + args.category + ' problem has been found'; + var description = 'A ' + args.category + ' problem has been found by ' + args.body; var $title_field = $('#form_title'); var $description_field = $('#form_detail'); diff --git a/web/vendor/OpenLayers.Projection.OrdnanceSurvey.js b/web/vendor/OpenLayers.Projection.OrdnanceSurvey.js index 85574d8e0..339f57a93 100644 --- a/web/vendor/OpenLayers.Projection.OrdnanceSurvey.js +++ b/web/vendor/OpenLayers.Projection.OrdnanceSurvey.js @@ -107,11 +107,19 @@ OpenLayers.Projection.OS = { }, goog2osgb: function(point) { - return OpenLayers.Projection.OS.projectForwardBritish(OpenLayers.Layer.SphericalMercator.projectInverse(point)); + var p1 = OpenLayers.Layer.SphericalMercator.inverseMercator(point.x, point.y); + var p2 = OpenLayers.Projection.OS.projectForwardBritish({x: p1.lon, y: p1.lat}); + point.x = p2.x; + point.y = p2.y; + return point; }, osgb2goog: function(point) { - return OpenLayers.Layer.SphericalMercator.projectForward(OpenLayers.Projection.OS.projectInverseBritish(point)); + var p1 = OpenLayers.Projection.OS.projectInverseBritish(point); + var p2 = OpenLayers.Layer.SphericalMercator.forwardMercator(p1.x, p1.y); + point.x = p2.lon; + point.y = p2.lat; + return point; }, /***** |