aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMatthew Somerville <matthew@mysociety.org>2019-11-11 13:46:21 +0000
committerDave Arter <davea@mysociety.org>2019-12-09 12:50:07 +0000
commitd06536b5db5453d1383e272b83c41a9efd5aff53 (patch)
tree1122fcfc9885f7a6c07d1c8ff098f7a8df9cbf6d
parent0c91a1c3cfd0e188a9781501870fb177cf450f99 (diff)
[TfL] Change .com categories depending on click.
Reorder so that asset stuff fires later.
-rw-r--r--web/cobrands/fixmystreet/fixmystreet.js24
-rw-r--r--web/cobrands/tfl/assets.js177
2 files changed, 154 insertions, 47 deletions
diff --git a/web/cobrands/fixmystreet/fixmystreet.js b/web/cobrands/fixmystreet/fixmystreet.js
index ea0e1e905..1a513a1a5 100644
--- a/web/cobrands/fixmystreet/fixmystreet.js
+++ b/web/cobrands/fixmystreet/fixmystreet.js
@@ -503,10 +503,12 @@ $.extend(fixmystreet.set_up, {
});
},
- category_groups: function(old_group) {
+ // no_event makes sure no change event is fired (so we don't end up in an infinite loop)
+ // and also only sets up the main group dropdown, assuming the subs are left alone
+ category_groups: function(old_group, no_event) {
var $category_select = $("select#form_category");
if (!$category_select.hasClass('js-grouped-select')) {
- if ($category_select.val() !== '-- Pick a category --') {
+ if (!no_event && $category_select.val() !== '-- Pick a category --') {
$category_select.change();
}
return;
@@ -544,7 +546,9 @@ $.extend(fixmystreet.set_up, {
var $el = $(el);
var $options = $el.find("option");
- if ($options.length == 1) {
+ if ($options.length === 0) {
+ /// Pass empty optgroups
+ } else if ($options.length == 1) {
add_option($options.get(0));
} else {
var label = $el.attr("label");
@@ -553,6 +557,16 @@ $.extend(fixmystreet.set_up, {
$opt.data("subcategory_id", subcategory_id);
$group_select.append($opt);
+ if (no_event) {
+ $options.each(function() {
+ // Make sure any preselected value is preserved in the new UI:
+ if (this.selected) {
+ $group_select.val(label);
+ }
+ });
+ return;
+ }
+
var $sub_select = $("<select></select>").addClass("form-control js-subcategory validCategory");
$sub_select.attr("id", subcategory_id);
$sub_select.append($empty_option.clone());
@@ -593,7 +607,9 @@ $.extend(fixmystreet.set_up, {
if (old_group !== '-- Pick a category --' && $category_select.val() == '-- Pick a category --') {
$group_select.val(old_group);
}
- $group_select.change();
+ if (!no_event) {
+ $group_select.change();
+ }
},
hide_name: function() {
diff --git a/web/cobrands/tfl/assets.js b/web/cobrands/tfl/assets.js
index 61759f9b8..262039688 100644
--- a/web/cobrands/tfl/assets.js
+++ b/web/cobrands/tfl/assets.js
@@ -4,6 +4,18 @@ if (!fixmystreet.maps) {
return;
}
+var cleaning_categories = [
+ 'Street cleaning',
+ 'Street Cleaning',
+ 'Accumulated Litter',
+ 'Street Cleaning Enquiry',
+ 'Street Cleansing'
+];
+var cleaning_groups = [
+ 'Street cleaning'
+];
+var tfl_council_category = 'General Litter / Rubbish Collection';
+
var defaults = {
http_options: {
url: "https://tilma.mysociety.org/mapserver/tfl",
@@ -19,47 +31,14 @@ var defaults = {
min_resolution: 0.5971642833948135,
geometryName: 'msGeometry',
srsName: "EPSG:3857",
- strategy_class: OpenLayers.Strategy.FixMyStreet,
- body: "TfL"
+ strategy_class: OpenLayers.Strategy.FixMyStreet
};
-
-var asset_defaults = $.extend(true, {}, defaults, {
- select_action: true,
- no_asset_msg_id: '#js-not-an-asset',
- actions: {
- asset_found: fixmystreet.message_controller.asset_found,
- asset_not_found: fixmystreet.message_controller.asset_not_found
- }
-});
-
-fixmystreet.assets.add(asset_defaults, {
- http_options: {
- params: {
- TYPENAME: "trafficsignals"
- }
- },
- asset_id_field: 'Site',
- attributes: {
- site: 'Site',
- },
- asset_group: "Traffic Lights",
- asset_item: 'traffic signal'
-});
-
-fixmystreet.assets.add(asset_defaults, {
- http_options: {
- params: {
- TYPENAME: "busstops"
- }
- },
- asset_id_field: 'STOP_CODE',
- attributes: {
- stop_code: 'STOP_CODE',
- },
- asset_group: "Bus Stops and Shelters",
- asset_item: 'bus stop'
-});
-
+if (fixmystreet.cobrand === 'tfl') {
+ // On .com we change the categories depending on where is clicked; on the
+ // cobrand we use the standard 'Please click on a road' message which needs
+ // the body to be set so is_only_body passes.
+ defaults.body = 'TfL';
+}
/* Red routes (TLRN) asset layer & handling for disabling form when red route
is not selected for specific categories. */
@@ -108,6 +87,18 @@ var tlrn_categories = [
"Worn out road markings"
];
+function is_tlrn_category_only(category, bodies) {
+ return OpenLayers.Util.indexOf(tlrn_categories, category) > -1 &&
+ OpenLayers.Util.indexOf(bodies, 'TfL') > -1 &&
+ bodies.length <= 1;
+}
+
+function regenerate_category_groups() {
+ var old_category_group = $('#category_group').val() || $('#filter_group').val();
+ $('#category_group').remove();
+ fixmystreet.set_up.category_groups(old_category_group, true);
+}
+
var red_routes_layer = fixmystreet.assets.add(defaults, {
http_options: {
url: "https://tilma.mysociety.org/mapserver/tfl",
@@ -119,13 +110,72 @@ var red_routes_layer = fixmystreet.assets.add(defaults, {
max_resolution: 9.554628534317017,
road: true,
non_interactive: true,
- asset_category: tlrn_categories,
+ always_visible: true,
+ all_categories: true,
nearest_radius: 0.1,
stylemap: tlrn_stylemap,
no_asset_msg_id: '#js-not-tfl-road',
actions: {
- found: fixmystreet.message_controller.road_found,
- not_found: fixmystreet.message_controller.road_not_found
+ found: function(layer, feature) {
+ fixmystreet.message_controller.road_found(layer, feature);
+
+ if (fixmystreet.cobrand === 'tfl' || !fixmystreet.reporting_data) {
+ return;
+ }
+
+ // On a TfL road, remove any council categories, except street cleaning
+ var changed = false;
+ $('#form_category').find('option').each(function(i, option) {
+ var val = option.value;
+ if (OpenLayers.Util.indexOf(cleaning_categories, val) > -1) {
+ return;
+ }
+ var optgroup = $(option).closest('optgroup').attr('label');
+ if (OpenLayers.Util.indexOf(cleaning_groups, optgroup) > -1) {
+ return;
+ }
+ if (val === tfl_council_category) {
+ changed = true;
+ $(option).remove();
+ }
+ var data = fixmystreet.reporting_data.by_category[val];
+ if (data && OpenLayers.Util.indexOf(data.bodies, 'TfL') === -1) {
+ changed = true;
+ $(option).remove();
+ }
+ });
+ if (changed) {
+ regenerate_category_groups();
+ }
+ },
+ not_found: function(layer) {
+ var category = $('#form_category').val();
+ if (is_tlrn_category_only(category, fixmystreet.bodies)) {
+ fixmystreet.message_controller.road_not_found(layer);
+ } else {
+ fixmystreet.message_controller.road_found(layer);
+ }
+
+ if (fixmystreet.cobrand === 'tfl' || !fixmystreet.reporting_data) {
+ return;
+ }
+
+ // On non-TfL, remove any TfL-road-only categories
+ var changed = false;
+ $('#form_category').find('option').each(function(i, option) {
+ if (option.value === tfl_council_category) {
+ $(option).remove();
+ }
+ var data = fixmystreet.reporting_data.by_category[option.value];
+ if (data && is_tlrn_category_only(option.value, data.bodies)) {
+ changed = true;
+ $(option).remove();
+ }
+ });
+ if (changed) {
+ regenerate_category_groups();
+ }
+ }
}
});
if (red_routes_layer) {
@@ -141,6 +191,47 @@ if (red_routes_layer) {
});
}
+/* Point asset layers, bus stops and traffic lights. This comes after the red
+ * route so its check for asset not clicked on happens after whether red route
+ * clicked on or not */
+
+var asset_defaults = $.extend(true, {}, defaults, {
+ body: 'TfL',
+ select_action: true,
+ no_asset_msg_id: '#js-not-an-asset',
+ actions: {
+ asset_found: fixmystreet.message_controller.asset_found,
+ asset_not_found: fixmystreet.message_controller.asset_not_found
+ }
+});
+
+fixmystreet.assets.add(asset_defaults, {
+ http_options: {
+ params: {
+ TYPENAME: "trafficsignals"
+ }
+ },
+ asset_id_field: 'Site',
+ attributes: {
+ site: 'Site',
+ },
+ asset_group: "Traffic Lights",
+ asset_item: 'traffic signal'
+});
+
+fixmystreet.assets.add(asset_defaults, {
+ http_options: {
+ params: {
+ TYPENAME: "busstops"
+ }
+ },
+ asset_id_field: 'STOP_CODE',
+ attributes: {
+ stop_code: 'STOP_CODE',
+ },
+ asset_group: "Bus Stops and Shelters",
+ asset_item: 'bus stop'
+});
/* Roadworks asset layer */