aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMatthew Somerville <matthew-github@dracos.co.uk>2019-04-08 09:48:41 +0100
committerMatthew Somerville <matthew-github@dracos.co.uk>2019-05-07 15:42:01 +0100
commitf3ff7807bbb478d11b0d3743ab873ab0b9e37c86 (patch)
tree0eecd1f5cbba7e915b3254d4f87329c7f71e9116
parent47b15ee4909b8a2b9904cc889e8319289abb4d1d (diff)
[UK] Factor out more found/not-found handling.
-rw-r--r--web/cobrands/buckinghamshire/assets.js100
-rw-r--r--web/cobrands/fixmystreet/assets.js123
-rw-r--r--web/cobrands/northamptonshire/assets.js96
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() {