diff options
author | Matthew Somerville <matthew@mysociety.org> | 2019-11-11 13:46:21 +0000 |
---|---|---|
committer | Dave Arter <davea@mysociety.org> | 2019-12-09 12:50:07 +0000 |
commit | d06536b5db5453d1383e272b83c41a9efd5aff53 (patch) | |
tree | 1122fcfc9885f7a6c07d1c8ff098f7a8df9cbf6d | |
parent | 0c91a1c3cfd0e188a9781501870fb177cf450f99 (diff) |
[TfL] Change .com categories depending on click.
Reorder so that asset stuff fires later.
-rw-r--r-- | web/cobrands/fixmystreet/fixmystreet.js | 24 | ||||
-rw-r--r-- | web/cobrands/tfl/assets.js | 177 |
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 */ |