diff options
Diffstat (limited to 'web')
-rw-r--r-- | web/cobrands/bromley/assets.js | 16 | ||||
-rw-r--r-- | web/cobrands/fixmystreet/assets.js | 91 |
2 files changed, 62 insertions, 45 deletions
diff --git a/web/cobrands/bromley/assets.js b/web/cobrands/bromley/assets.js index 083d8210f..f88d06749 100644 --- a/web/cobrands/bromley/assets.js +++ b/web/cobrands/bromley/assets.js @@ -25,7 +25,20 @@ var defaults = { strategy_class: OpenLayers.Strategy.FixMyStreet }; +OpenLayers.Layer.VectorAssetBromley = OpenLayers.Class(OpenLayers.Layer.VectorAsset, { + relevant: function() { + var relevant = OpenLayers.Layer.VectorAsset.prototype.relevant.apply(this, arguments), + subcategories = this.fixmystreet.subcategories, + subcategory = $('#form_service_sub_code').val(), + relevant_sub = OpenLayers.Util.indexOf(subcategories, subcategory) > -1; + return relevant && relevant_sub; + }, + + CLASS_NAME: 'OpenLayers.Layer.VectorAssetBromley' +}); + fixmystreet.assets.add($.extend(true, {}, defaults, { + class: OpenLayers.Layer.VectorAssetBromley, http_options: { params: { TYPENAME: "Streetlights" @@ -36,16 +49,19 @@ fixmystreet.assets.add($.extend(true, {}, defaults, { feature_id: 'FEATURE_ID' }, asset_category: ["Street Lighting and Road Signs"], + subcategories: [ 'SL_LAMP', 'SL_NOT_WORK', 'SL_ON_DAY', 'SL_BLOCK_VEG' ], asset_item: 'street light' })); fixmystreet.assets.add($.extend(true, {}, defaults, { + class: OpenLayers.Layer.VectorAssetBromley, http_options: { params: { TYPENAME: "Bins" } }, asset_category: ["Parks and Greenspace", "Street Cleansing"], + subcategories: ['PG_OFLOW_DOG', 'SC_LIT_BIN'], asset_item: 'park bin', asset_item_message: 'For our parks, pick a <b class="asset-spot">bin</b> from the map »' })); diff --git a/web/cobrands/fixmystreet/assets.js b/web/cobrands/fixmystreet/assets.js index 2cd93eb33..c1347ef2f 100644 --- a/web/cobrands/fixmystreet/assets.js +++ b/web/cobrands/fixmystreet/assets.js @@ -23,6 +23,13 @@ OpenLayers.Layer.VectorAsset = OpenLayers.Class(OpenLayers.Layer.Vector, { $(fixmystreet).on('report_new:category_change', this.update_layer_visibility.bind(this)); }, + relevant: function() { + var category = $('select#form_category').val(), + layer = this.fixmystreet; + return OpenLayers.Util.indexOf(layer.asset_category, category) != -1 && + ( !layer.body || OpenLayers.Util.indexOf(fixmystreet.bodies, layer.body) != -1 ); + }, + update_layer_visibility: function() { if (!fixmystreet.map) { return; @@ -30,8 +37,7 @@ OpenLayers.Layer.VectorAsset = OpenLayers.Class(OpenLayers.Layer.Vector, { if (!this.fixmystreet.always_visible) { // Show/hide the asset layer when the category is chosen - var category = $('#problem_form select#form_category').val(); - if (fixmystreet.assets.check_layer_relevant(this.fixmystreet, category)) { + if (this.relevant()) { this.setVisibility(true); if (this.fixmystreet.fault_layer) { this.fixmystreet.fault_layer.setVisibility(true); @@ -50,6 +56,34 @@ OpenLayers.Layer.VectorAsset = OpenLayers.Class(OpenLayers.Layer.Vector, { } }, + select_nearest_asset: function() { + // The user's green marker might be on the map the first time we show the + // assets, so snap it to the closest asset marker if so. + if (!fixmystreet.markers.getVisibility() || !(this.getVisibility() && this.inRange)) { + return; + } + var threshold = 50; // metres + var marker = fixmystreet.markers.features[0]; + if (marker === undefined) { + // No marker to be found so bail out + return; + } + var nearest_feature = this.getNearestFeature(marker.geometry, threshold); + if (nearest_feature) { + this.get_select_control().select(nearest_feature); + } + }, + + get_select_control: function() { + var controls = fixmystreet.map.getControlsByClass('OpenLayers.Control.SelectFeature'); + for (var i=0; i<controls.length; i++) { + var control = controls[i]; + if (control.layer == this && !control.hover) { + return control; + } + } + }, + zoom_to_assets: function() { // This function is called when the asset category is // selected, and will zoom the map in to the first level that @@ -83,7 +117,7 @@ OpenLayers.Layer.VectorNearest = OpenLayers.Class(OpenLayers.Layer.VectorAsset, this.getNearest(lonlat); this.updateUSRNField(); if (this.fixmystreet.road) { - var valid_category = this.fixmystreet.all_categories || (this.fixmystreet.asset_category && fixmystreet.assets.check_layer_relevant( this.fixmystreet, $('select#form_category').val() ) ); + var valid_category = this.fixmystreet.all_categories || (this.fixmystreet.asset_category && this.relevant()); if (!valid_category || !this.selected_feature) { this.road_not_found(); } else { @@ -215,7 +249,7 @@ function asset_selected(e) { { size: new OpenLayers.Size(0, 0), offset: new OpenLayers.Pixel(0, 0) }, true, close_fault_popup); fixmystreet.map.addPopup(fault_popup); - get_select_control(this).unselect(e.feature); + this.get_select_control().unselect(e.feature); return; } @@ -297,11 +331,11 @@ function check_zoom_message_visibility() { if (this.fixmystreet.non_interactive) { return; } - var category = $("#problem_form select#form_category").val(), + var category = $("select#form_category").val(), prefix = category.replace(/[^a-z]/gi, ''), id = "category_meta_message_" + prefix, $p = $('#' + id); - if (fixmystreet.assets.check_layer_relevant(this.fixmystreet, category)) { + if (this.relevant()) { if ($p.length === 0) { $p = $("<p>").prop("id", id).prop('class', 'category_meta_message'); $p.insertAfter('#form_category_row'); @@ -320,8 +354,8 @@ function check_zoom_message_visibility() { } else { $.each(this.fixmystreet.asset_category, function(i, c) { var prefix = c.replace(/[^a-z]/gi, ''), - id = "category_meta_message_" + prefix, - $p = $('#' + id); + id = "category_meta_message_" + prefix, + $p = $('#' + id); $p.remove(); }); } @@ -350,46 +384,18 @@ function layer_visibilitychanged() { fixmystreet.markers.setVisibility(true); } if (!this.fixmystreet.non_interactive) { - select_nearest_asset.call(this); + this.select_nearest_asset(); } } -function get_select_control(layer) { - var controls = fixmystreet.map.getControlsByClass('OpenLayers.Control.SelectFeature'); - for (var i=0; i<controls.length; i++) { - var control = controls[i]; - if (control.layer == layer && !control.hover) { - return control; - } - } -} - -function select_nearest_asset() { - // The user's green marker might be on the map the first time we show the - // assets, so snap it to the closest asset marker if so. - if (!fixmystreet.markers.getVisibility() || !(this.getVisibility() && this.inRange)) { - return; - } - var threshold = 50; // metres - var marker = fixmystreet.markers.features[0]; - if (marker === undefined) { - // No marker to be found so bail out - return; - } - var nearest_feature = this.getNearestFeature(marker.geometry, threshold); - if (nearest_feature) { - get_select_control(this).select(nearest_feature); - } -} - function layer_loadend() { - select_nearest_asset.call(this); + this.select_nearest_asset(); // Preserve the selected marker when panning/zooming, if it's still on the map if (selected_feature !== null && !(selected_feature in this.selectedFeatures)) { var replacement_feature = find_matching_feature(selected_feature, this, this.fixmystreet.asset_id_field); if (!!replacement_feature) { - get_select_control(this).select(replacement_feature); + this.get_select_control().select(replacement_feature); } } } @@ -549,7 +555,7 @@ fixmystreet.assets = { layer_options.strategies.push(new OpenLayers.Strategy.Filter({filter: layer_options.filter})); } - var layer_class = OpenLayers.Layer.VectorAsset; + var layer_class = options.class || OpenLayers.Layer.VectorAsset; if (options.usrn || options.road) { layer_class = OpenLayers.Layer.VectorNearest; } @@ -682,11 +688,6 @@ fixmystreet.assets = { fixmystreet.map.addControl(fixmystreet.assets.controls[i]); fixmystreet.assets.controls[i].activate(); } - }, - - check_layer_relevant: function(layer, category) { - return OpenLayers.Util.indexOf(layer.asset_category, category) != -1 && - ( !layer.body || OpenLayers.Util.indexOf(fixmystreet.bodies, layer.body) != -1 ); } }; |