diff options
author | Matthew Somerville <matthew-github@dracos.co.uk> | 2019-04-08 09:48:41 +0100 |
---|---|---|
committer | Matthew Somerville <matthew-github@dracos.co.uk> | 2019-05-07 15:42:01 +0100 |
commit | f3ff7807bbb478d11b0d3743ab873ab0b9e37c86 (patch) | |
tree | 0eecd1f5cbba7e915b3254d4f87329c7f71e9116 | |
parent | 47b15ee4909b8a2b9904cc889e8319289abb4d1d (diff) |
[UK] Factor out more found/not-found handling.
-rw-r--r-- | web/cobrands/buckinghamshire/assets.js | 100 | ||||
-rw-r--r-- | web/cobrands/fixmystreet/assets.js | 123 | ||||
-rw-r--r-- | web/cobrands/northamptonshire/assets.js | 96 |
3 files changed, 144 insertions, 175 deletions
diff --git a/web/cobrands/buckinghamshire/assets.js b/web/cobrands/buckinghamshire/assets.js index c872033d3..62a4d505e 100644 --- a/web/cobrands/buckinghamshire/assets.js +++ b/web/cobrands/buckinghamshire/assets.js @@ -287,51 +287,11 @@ var rule_not_owned = new OpenLayers.Rule({ }); highways_style.addRules([rule_owned, rule_not_owned]); -function show_responsibility_error(id) { - hide_responsibility_errors(); - $("#js-roads-responsibility").removeClass("hidden"); - $("#js-roads-responsibility .js-responsibility-message").addClass("hidden"); - $('.js-update-coordinates').attr('href', function(i, href) { - if (href.indexOf('?') != -1) { - href = href.substring(0, href.indexOf('?')); - } - href += '?' + OpenLayers.Util.getParameterString({ - latitude: $('#fixmystreet\\.latitude').val(), - longitude: $('#fixmystreet\\.longitude').val() - }); - return href; - }); - $(id).removeClass("hidden"); -} - -function hide_responsibility_errors() { - $("#js-roads-responsibility").addClass("hidden"); - $("#js-roads-responsibility .js-responsibility-message").addClass("hidden"); -} - -function disable_report_form() { - $("#problem_form").hide(); -} - -function enable_report_form() { - $("#problem_form").show(); -} - -function is_only_body(body) { - if (fixmystreet.bodies && fixmystreet.bodies.length == 1 && fixmystreet.bodies[0] == body) { - return true; - } - return false; -} - $(fixmystreet).on('report_new:highways_change', function() { if (fixmystreet.body_overrides.get_only_send() === 'Highways England') { - hide_responsibility_errors(); - enable_report_form(); $('#bucks_dangerous_msg').hide(); } else { $('#bucks_dangerous_msg').show(); - $(fixmystreet).trigger('report_new:category_change', [ $('#form_category') ]); } }); @@ -352,54 +312,31 @@ fixmystreet.assets.add($.extend(true, {}, defaults, { all_categories: true, actions: { found: function(layer, feature) { - fixmystreet.body_overrides.allow_send(layer.fixmystreet.body); - fixmystreet.body_overrides.remove_only_send(); + var map = { + "HE": '#js-not-council-road-he', + "HWOA": '#js-not-council-road-other' + }; + var msg_id = map[feature.attributes.feature_ty] || '#js-not-council-road'; + + fixmystreet.message_controller.road_found(layer, feature, function(feature) { + if (OpenLayers.Util.indexOf(bucks_types, feature.attributes.feature_ty) != -1) { + var cat = $('select#form_category').val(); + if (cat === 'Flytipping') { + fixmystreet.body_overrides.only_send(layer.fixmystreet.body); + } + return true; + } else { + return false; + } + }, msg_id); // Make sure Flytipping related things reset $('#category_meta').show(); $('#form_road-placement').attr('required', ''); - - if (fixmystreet.assets.selectedFeature()) { - hide_responsibility_errors(); - enable_report_form(); - } else if (OpenLayers.Util.indexOf(bucks_types, feature.attributes.feature_ty) != -1) { - var cat = $('select#form_category').val(); - if (cat === 'Flytipping') { - fixmystreet.body_overrides.only_send(layer.fixmystreet.body); - } - hide_responsibility_errors(); - enable_report_form(); - } else { - // User has clicked a road that Bucks don't maintain. - - var map = { - "HE": '#js-not-council-road-he', - "HWOA": '#js-not-council-road-other' - }; - - fixmystreet.body_overrides.do_not_send(layer.fixmystreet.body); - if (is_only_body(layer.fixmystreet.body)) { - var id = map[feature.attributes.feature_ty] || '#js-not-council-road'; - show_responsibility_error(id); - disable_report_form(); - } - } }, not_found: function(layer) { - // If a feature wasn't found at the location they've clicked, it's - // probably a field or something. Show an error to that effect, - // unless an asset is selected. - fixmystreet.body_overrides.do_not_send(layer.fixmystreet.body); - fixmystreet.body_overrides.remove_only_send(); - if (fixmystreet.assets.selectedFeature()) { - fixmystreet.body_overrides.allow_send(layer.fixmystreet.body); - hide_responsibility_errors(); - enable_report_form(); - } else if (is_only_body(layer.fixmystreet.body)) { - show_responsibility_error("#js-not-a-road"); - disable_report_form(); - } + fixmystreet.message_controller.road_not_found(layer); // If flytipping is picked, we don't want to ask the extra question var cat = $('select#form_category').val(); @@ -411,6 +348,7 @@ fixmystreet.assets.add($.extend(true, {}, defaults, { } } }, + no_asset_msg_id: '#js-not-a-road', usrn: { attribute: 'site_code', field: 'site_code' diff --git a/web/cobrands/fixmystreet/assets.js b/web/cobrands/fixmystreet/assets.js index d4ab43e46..724628930 100644 --- a/web/cobrands/fixmystreet/assets.js +++ b/web/cobrands/fixmystreet/assets.js @@ -922,21 +922,92 @@ $(fixmystreet).on('body_overrides:change', function() { $('#js-councils_text').html(), bodies); }); -/* Handling of the form-top messaging */ +/* +Handling of the form-top messaging: This handles categories that hide the form +and show a message, and categories where assets must be selected or the pin +must be on a road, taking into account Highways England roads. +*/ fixmystreet.message_controller = (function() { var stopperId = 'js-category-stopper', stoppers = []; - /* utility functions */ + // This shows an error message because e.g. an asset isn't selected or a road hasn't been clicked + function show_responsibility_error(id, asset_item, asset_type) { + $("#js-roads-responsibility").removeClass("hidden"); + $("#js-roads-responsibility .js-responsibility-message").addClass("hidden"); + var asset_strings = $('.js-roads-asset'); + if (asset_item) { + asset_strings.html('a <b class="asset-' + asset_type + '">' + asset_item + '</b>'); + } else { + asset_strings.html(asset_strings.data('original')); + } + $('.js-update-coordinates').attr('href', function(i, href) { + if (href.indexOf('?') != -1) { + href = href.substring(0, href.indexOf('?')); + } + href += '?' + OpenLayers.Util.getParameterString({ + latitude: $('#fixmystreet\\.latitude').val(), + longitude: $('#fixmystreet\\.longitude').val() + }); + return href; + }); + $(id).removeClass("hidden"); + } + + // This hides the asset/road not found message + function hide_responsibility_errors() { + $("#js-roads-responsibility").addClass("hidden"); + $("#js-roads-responsibility .js-responsibility-message").addClass("hidden"); + } + + // This shows the reporting form function enable_report_form() { $(".js-hide-if-invalid-category").show(); } + // This hides the reporting form, apart from the category selection function disable_report_form() { $(".js-hide-if-invalid-category").hide(); } + // This hides the responsibility message, and (unless a + // stopper message is shown) reenables the report form + function responsibility_off() { + hide_responsibility_errors(); + if (!document.getElementById(stopperId)) { + enable_report_form(); + } + } + + // This disables the report form and (unless a stopper + // message is shown) shows a responsibility message + function responsibility_on(id, asset_item, asset_type) { + disable_report_form(); + hide_responsibility_errors(); + if (!document.getElementById(stopperId)) { + show_responsibility_error(id, asset_item, asset_type); + } + } + + function is_only_body(body) { + if (fixmystreet.bodies && fixmystreet.bodies.length == 1 && fixmystreet.bodies[0] == body) { + return true; + } + return false; + } + + // make sure we fire the code to check if an asset is selected if + // we change options in the Highways England message + $(fixmystreet).on('report_new:highways_change', function() { + if (fixmystreet.body_overrides.get_only_send() === 'Highways England') { + $('#' + stopperId).remove(); // Get rid of any stopper message + responsibility_off(); // Will also reenable form + } else { + $(fixmystreet).trigger('report_new:category_change', [ $('#form_category') ]); + } + }); + $(fixmystreet).on('report_new:category_change', function() { if (fixmystreet.body_overrides.get_only_send() == 'Highways England') { // If we're sending to Highways England, this message doesn't matter @@ -987,6 +1058,54 @@ fixmystreet.message_controller = (function() { }); return { + asset_found: function() { + responsibility_off(); + return ($('#' + stopperId).length); + }, + + asset_not_found: function(layer) { + if (!layer.visibility) { + responsibility_off(); + } else { + responsibility_on('#js-not-an-asset', layer.fixmystreet.asset_item, layer.fixmystreet.asset_type); + } + }, + + // A road was found; if some roads should still cause disabling/message, + // then you should pass in a criterion function to test the found feature, + // plus an ID of the message to be shown + road_found: function(layer, feature, criterion, msg_id) { + fixmystreet.body_overrides.allow_send(layer.fixmystreet.body); + fixmystreet.body_overrides.remove_only_send(); + if (fixmystreet.assets.selectedFeature()) { + responsibility_off(); + } else if (!criterion || criterion(feature)) { + responsibility_off(); + } else { + fixmystreet.body_overrides.do_not_send(layer.fixmystreet.body); + if (is_only_body(layer.fixmystreet.body)) { + responsibility_on(msg_id); + } + } + }, + + road_not_found: function(layer) { + // If a feature wasn't found at the location they've clicked, it's + // probably a field or something. Show an error to that effect, + // unless an asset is selected. + fixmystreet.body_overrides.do_not_send(layer.fixmystreet.body); + fixmystreet.body_overrides.remove_only_send(); + // don't show the message if clicking on a highways england road + if (fixmystreet.body_overrides.get_only_send() == 'Highways England' || !layer.visibility) { + responsibility_off(); + } else if (fixmystreet.assets.selectedFeature()) { + fixmystreet.body_overrides.allow_send(layer.fixmystreet.body); + responsibility_off(); + } else if (is_only_body(layer.fixmystreet.body)) { + responsibility_on(layer.fixmystreet.no_asset_msg_id, layer.fixmystreet.asset_item, layer.fixmystreet.asset_type); + } + }, + register_category: function(params) { stoppers.push(params); } diff --git a/web/cobrands/northamptonshire/assets.js b/web/cobrands/northamptonshire/assets.js index 1de879d65..dda51407e 100644 --- a/web/cobrands/northamptonshire/assets.js +++ b/web/cobrands/northamptonshire/assets.js @@ -4,33 +4,6 @@ if (!fixmystreet.maps) { return; } -/* utility functions */ -function show_responsibility_error(id, asset_item, asset_type) { - hide_responsibility_errors(); - $("#js-roads-responsibility").removeClass("hidden"); - $("#js-roads-responsibility .js-responsibility-message").addClass("hidden"); - var asset_strings = $('.js-roads-asset'); - if (asset_item) { - asset_strings.html('a <b class="asset-' + asset_type + '">' + asset_item + '</b>'); - } else { - asset_strings.html(asset_strings.data('original')); - } - $(id).removeClass("hidden"); -} - -function hide_responsibility_errors() { - $("#js-roads-responsibility").addClass("hidden"); - $("#js-roads-responsibility .js-responsibility-message").addClass("hidden"); -} - -function enable_report_form() { - $(".js-hide-if-invalid-category").show(); -} - -function disable_report_form() { - $(".js-hide-if-invalid-category").hide(); -} - var is_live = false; if ( location.hostname === 'www.fixmystreet.com' || location.hostname == 'fixmystreet.northamptonshire.gov.uk' ) { is_live = true; @@ -341,18 +314,6 @@ var layers = [ }, ]; -// make sure we fire the code to check if an asset is selected if -// we change options in the Highways England message -$(fixmystreet).on('report_new:highways_change', function() { - if (fixmystreet.body_overrides.get_only_send() === 'Highways England') { - hide_responsibility_errors(); - enable_report_form(); - $('#ncc_streetlights').remove(); - } else { - $(fixmystreet).trigger('report_new:category_change', [ $('#form_category') ]); - } -}); - // This is required so that the found/not found actions are fired on category // select and pin move rather than just on asset select/not select. OpenLayers.Layer.NCCVectorAsset = OpenLayers.Class(OpenLayers.Layer.VectorAsset, { @@ -384,12 +345,9 @@ var northants_defaults = $.extend(true, {}, fixmystreet.assets.alloy_defaults, { select_action: true, actions: { asset_found: function(asset) { - var emergency_state = ncc_is_emergency_category(); - if (emergency_state.relevant && !emergency_state.body) { + if (fixmystreet.message_controller.asset_found()) { return; } - hide_responsibility_errors(); - enable_report_form(); var lonlat = asset.geometry.getBounds().getCenterLonLat(); // Features considered overlapping if within 1M of each other // TODO: Should zoom/marker size be considered when determining if markers overlap? @@ -420,21 +378,7 @@ var northants_defaults = $.extend(true, {}, fixmystreet.assets.alloy_defaults, { }, asset_not_found: function() { $("#overlapping_features_msg").addClass('hidden'); - var emergency_state = ncc_is_emergency_category(); - - if (!layer.visibility) { - if (!emergency_state.relevant || emergency_state.body) { - enable_report_form(); - } - hide_responsibility_errors(); - } else { - disable_report_form(); - if (!emergency_state.relevant || emergency_state.body) { - show_responsibility_error('#js-not-an-asset', this.fixmystreet.asset_item, this.fixmystreet.asset_type); - } else { - hide_responsibility_errors(); - } - } + fixmystreet.message_controller.asset_not_found(this); } } }); @@ -473,30 +417,8 @@ var northants_road_defaults = $.extend(true, {}, fixmystreet.assets.alloy_defaul return feature.fid; }, actions: { - found: function(layer, feature) { - var emergency_state = ncc_is_emergency_category(); - if (!emergency_state.relevant || emergency_state.body) { - enable_report_form(); - } - hide_responsibility_errors(); - }, - not_found: function(layer) { - // don't show the message if clicking on a highways england road - var emergency_state = ncc_is_emergency_category(); - if (fixmystreet.body_overrides.get_only_send() == 'Highways England' || !layer.visibility) { - if (!emergency_state.relevant || emergency_state.body) { - enable_report_form(); - } - hide_responsibility_errors(); - } else { - disable_report_form(); - if (!emergency_state.relevant || emergency_state.body) { - show_responsibility_error(layer.fixmystreet.no_asset_msg_id, layer.fixmystreet.asset_item, layer.fixmystreet.asset_type); - } else { - hide_responsibility_errors(); - } - } - }, + found: fixmystreet.message_controller.road_found, + not_found: fixmystreet.message_controller.road_not_found } }); @@ -608,16 +530,6 @@ fixmystreet.assets.add($.extend(true, {}, northants_road_defaults, { ] })); -function ncc_is_emergency_category() { - var relevant_body = OpenLayers.Util.indexOf(fixmystreet.bodies, northants_defaults.body) > -1; - var relevant_cat = !!$('label[for=form_emergency]').length; - var relevant = relevant_body && relevant_cat; - var currently_shown = !!$('#northants-emergency-message').length; - var body = $('#form_category').data('body'); - - return {relevant: relevant, currently_shown: currently_shown, body: body}; -} - fixmystreet.message_controller.register_category({ body: northants_defaults.body, category: function() { |