diff options
21 files changed, 286 insertions, 107 deletions
diff --git a/perllib/FixMyStreet/App/Controller/Report/New.pm b/perllib/FixMyStreet/App/Controller/Report/New.pm index c41b65e2a..554fbc3b7 100644 --- a/perllib/FixMyStreet/App/Controller/Report/New.pm +++ b/perllib/FixMyStreet/App/Controller/Report/New.pm @@ -143,6 +143,7 @@ sub report_new_ajax : Path('mobile') : Args(0) { $c->forward('setup_categories_and_bodies'); $c->forward('setup_report_extra_fields'); + $c->forward('check_for_category'); $c->forward('process_report'); $c->forward('process_user'); $c->forward('/photo/process_photo'); @@ -253,10 +254,7 @@ sub category_extras_ajax : Path('category_extras') : Args(0) { $c->forward('setup_report_extra_fields'); $c->forward('check_for_category'); - my $category = $c->stash->{category} || ""; - $category = '' if $category eq _('-- Pick a category --'); - - $c->stash->{json_response} = $c->forward('by_category_ajax_data', [ 'one', $category ]); + $c->stash->{json_response} = $c->forward('by_category_ajax_data', [ 'one', $c->stash->{category} ]); $c->forward('send_json_response'); } @@ -949,12 +947,12 @@ sub process_report : Private { 'title', 'detail', 'pc', # 'detail_size', 'may_show_name', # - 'category', # 'subcategory', # 'partial', # 'service', # 'non_public', ); + $params{category} = $c->stash->{category}; # load the report my $report = $c->stash->{report}; @@ -1025,7 +1023,16 @@ sub process_report : Private { my $body_string = do { if (my $single_body_only = $c->get_param('single_body_only')) { my $body = $c->model('DB::Body')->search({ name => $single_body_only })->first; - $body ? $body->id : '-1'; + if ($body) { + # Drop the contacts down to those in this body + # (potentially none for e.g. Highways England) + # so that set_report_extras doesn't error when + # there are 'missing' extra fields + @contacts = grep { $_->body->id == $body->id } @contacts; + $body->id; + } else { + '-1'; + } } else { my $contact_options = {}; $contact_options->{do_not_send} = [ $c->get_param_list('do_not_send', 1) ]; @@ -1133,7 +1140,7 @@ sub set_report_extras : Private { foreach my $item (@metalist) { my ($metas, $param_prefix) = @$item; foreach my $field ( @$metas ) { - if ( lc( $field->{required} ) eq 'true' && !$c->cobrand->category_extra_hidden($field)) { + if ( lc( $field->{required} || '' ) eq 'true' && !$c->cobrand->category_extra_hidden($field)) { unless ( $c->get_param($param_prefix . $field->{code}) ) { $c->stash->{field_errors}->{ 'x' . $field->{code} } = _('This information is required'); } @@ -1520,9 +1527,56 @@ sub generate_map : Private { sub check_for_category : Private { my ( $self, $c ) = @_; - $c->stash->{category} = $c->get_param('category') || $c->stash->{report}->category; + my $category = $c->get_param('category') || $c->stash->{report}->category || ''; + $category = '' if $category eq _('Loading...') || $category eq _('-- Pick a category --'); + $c->stash->{category} = $category; - return 1; + # Bit of a copy of set_report_extras, because we need the results here, but + # don't want to run all of that fn until later as it e.g. alters field + # errors at that point. Also, the report might already have some answers in + # too if e.g. gone via social login... TODO Improve this? + my $extra = $c->stash->{report}->get_extra_fields; + my %current = map { $_->{name} => $_ } @$extra; + + my @contacts = grep { $_->category eq $category } @{$c->stash->{contacts}}; + my @metalist = map { @{$_->get_metadata_for_storage} } @contacts; + my @extra; + foreach my $field (@metalist) { + push @extra, { + name => $field->{code}, + description => $field->{description}, + value => $c->get_param($field->{code}) || $current{$field->{code}}{value} || '', + }; + } + $c->stash->{report}->set_extra_fields( @extra ); + + # Work out if the selected category (or category extra question answer) should lead + # to a message being shown not to use the form + if ( $c->stash->{category_extras}->{$category} && @{ $c->stash->{category_extras}->{$category} } >= 1 ) { + my $disable_form_messages = $c->forward('disable_form_message'); + if ($disable_form_messages->{all}) { + $c->stash->{disable_form_message} = $disable_form_messages->{all}; + } elsif (my $code = $disable_form_messages->{code}) { + my $answer = $c->get_param($code); + my $message = $disable_form_messages->{message}; + if ($answer) { + foreach (@{$disable_form_messages->{answers}}) { + if ($answer eq $_) { + $c->stash->{disable_form_message} = $message; + } + } + } else { + $c->stash->{have_disable_qn_to_answer} = 1; + } + } + } + + if ($c->get_param('submit_category_part_only') || $c->stash->{disable_form_message}) { + # If we've clicked the first-part category button (no-JS only probably), + # or the category submitted will be showing a disabled form message, + # we only want to reshow the form + $c->stash->{force_form_not_submitted} = 1; + } } =head2 redirect_or_confirm_creation diff --git a/perllib/FixMyStreet/Cobrand/Bexley.pm b/perllib/FixMyStreet/Cobrand/Bexley.pm index 26470617a..a395543bd 100644 --- a/perllib/FixMyStreet/Cobrand/Bexley.pm +++ b/perllib/FixMyStreet/Cobrand/Bexley.pm @@ -9,6 +9,7 @@ sub council_area { 'Bexley' } sub council_name { 'London Borough of Bexley' } sub council_url { 'bexley' } sub get_geocoder { 'OSM' } +sub map_type { 'OSM' } sub disambiguate_location { my $self = shift; diff --git a/perllib/FixMyStreet/DB/Result/Problem.pm b/perllib/FixMyStreet/DB/Result/Problem.pm index 09c6cb06d..8159d7251 100644 --- a/perllib/FixMyStreet/DB/Result/Problem.pm +++ b/perllib/FixMyStreet/DB/Result/Problem.pm @@ -376,13 +376,6 @@ sub check_for_errors { $errors{name} = _('Please enter your name'); } - if ( $self->category - && $self->category eq _('-- Pick a category --') ) - { - $errors{category} = _('Please choose a category'); - $self->category(undef); - } - return \%errors; } diff --git a/t/app/controller/report_new_open311.t b/t/app/controller/report_new_open311.t index b52e0af18..52f1ddc6e 100644 --- a/t/app/controller/report_new_open311.t +++ b/t/app/controller/report_new_open311.t @@ -62,6 +62,12 @@ my $contact4 = $mech->create_contact_ok( { description => 'Asset ID', code => 'central_asset_id', required => 'true', automated => 'hidden_field', variable => 'true', order => '2' }, ] }, ); +# Another one to switch to in disable form test +$mech->create_contact_ok( + body_id => $body2->id, # Edinburgh + category => 'Something Other', + email => '104', +); # test that the various bit of form get filled in and errors correctly # generated. @@ -310,6 +316,47 @@ subtest "Category extras includes form disabling string" => sub { answers => [ 'yes' ], }; } + + # Test new non-JS form disabling flow + $mech->get_ok('/report/new?latitude=55.952055&longitude=-3.189579'); + $mech->content_contains('name="submit_category_part_only"'); + $mech->submit_form_ok({ with_fields => { category => 'Pothole' } }); + $mech->content_contains('<div id="js-category-stopper" class="box-warning" role="alert" aria-live="assertive">'); + $mech->content_contains('Please ring us!'); + # Switch to another, okay, category + $mech->submit_form_ok({ with_fields => { category => 'Something Other' } }); + $mech->content_lacks('<div id="js-category-stopper" class="box-warning" role="alert" aria-live="assertive">'); + $mech->content_lacks('Please ring us!'); + + # Remove the required extra field so its error checking doesn't get in the way + my $extra = $contact4->get_extra_fields; + @$extra = grep { $_->{code} ne 'size' } @$extra; + $contact4->set_extra_fields(@$extra); + $contact4->update; + + # Test submission of whole form, switching back to a blocked category at the same time + $mech->submit_form_ok({ with_fields => { + category => 'Pothole', title => 'Title', detail => 'Detail', + username => 'testing@example.org', name => 'Testing Example', + } }); + $mech->content_contains('<div id="js-category-stopper" class="box-warning" role="alert" aria-live="assertive">'); + $mech->content_contains('Please ring us!'); + + # Test special answer disabling of form + $extra = $contact4->get_extra_fields; + @$extra = grep { $_->{code} ne 'ring' } @$extra; # Remove that all-category one + $contact4->set_extra_fields(@$extra); + $contact4->update; + $mech->get_ok('/report/new?latitude=55.952055&longitude=-3.189579'); + $mech->content_contains('name="submit_category_part_only"'); + $mech->submit_form_ok({ with_fields => { category => 'Pothole' } }); + $mech->content_contains('name="submit_category_part_only"'); + $mech->submit_form_ok({ with_fields => { dangerous => 'no' } }); + $mech->content_lacks('<div id="js-category-stopper" class="box-warning" role="alert" aria-live="assertive">'); + $mech->content_lacks('Please please ring'); + $mech->submit_form_ok({ with_fields => { dangerous => 'yes' } }); + $mech->content_contains('<div id="js-category-stopper" class="box-warning" role="alert" aria-live="assertive">'); + $mech->content_contains('Please please ring'); }; }; diff --git a/t/app/model/problem.t b/t/app/model/problem.t index 503fa9276..e973febc1 100644 --- a/t/app/model/problem.t +++ b/t/app/model/problem.t @@ -106,15 +106,6 @@ for my $test ( } }, { - desc => 'bad category', - changed => { - category => '-- Pick a category --', - }, - errors => { - category => 'Please choose a category', - } - }, - { desc => 'correct category', changed => { category => 'Horse!', diff --git a/templates/web/base/report/form/user_loggedout_by_email.html b/templates/web/base/report/form/user_loggedout_by_email.html index 4ae3db868..33526cc46 100644 --- a/templates/web/base/report/form/user_loggedout_by_email.html +++ b/templates/web/base/report/form/user_loggedout_by_email.html @@ -25,11 +25,7 @@ </div> [% END %] - [% IF c.cobrand.social_auth_enabled AND NOT email_required %] - [% PROCESS 'report/form/user_loggedout_email.html' name='username_register' required=0 %] - [% ELSE %] - [% PROCESS 'report/form/user_loggedout_email.html' name='username_register' required=1 %] - [% END %] + [% PROCESS 'report/form/user_loggedout_email.html' name='username_register' %] [% IF type != 'update' AND c.config.SMS_AUTHENTICATION %] [% UNLESS c.cobrand.call_hook('disable_phone_number_entry') %] diff --git a/templates/web/base/report/form/user_loggedout_email.html b/templates/web/base/report/form/user_loggedout_email.html index c32691eb4..9f631987b 100644 --- a/templates/web/base/report/form/user_loggedout_email.html +++ b/templates/web/base/report/form/user_loggedout_email.html @@ -15,6 +15,5 @@ [% END %] <input type="[% username_type %]" name="username" id="form_[% name %]" value="[% username_value | html %]" - [% IF required %]required[% END %] class="form-control required"> <!-- /user_loggedout_email.html --> diff --git a/templates/web/base/report/form/user_loggedout_password.html b/templates/web/base/report/form/user_loggedout_password.html index 02cfc9525..40a028b24 100644 --- a/templates/web/base/report/form/user_loggedout_password.html +++ b/templates/web/base/report/form/user_loggedout_password.html @@ -8,11 +8,7 @@ <a class="js-new-report-hide-sign-in" href="#">[% loc('Fill in your details manually.') %]</a> </p> - [% IF c.cobrand.social_auth_enabled %] - [% PROCESS 'report/form/user_loggedout_email.html' name='username_sign_in' required=0 %] - [% ELSE %] - [% PROCESS 'report/form/user_loggedout_email.html' name='username_sign_in' required=1 %] - [% END %] + [% PROCESS 'report/form/user_loggedout_email.html' name='username_sign_in' %] <label for="password_sign_in">[% loc('Your password') %]</label> [% IF field_errors.password %] diff --git a/templates/web/base/report/new/category_extras_fields.html b/templates/web/base/report/new/category_extras_fields.html index dd5c3911d..e9237f83b 100644 --- a/templates/web/base/report/new/category_extras_fields.html +++ b/templates/web/base/report/new/category_extras_fields.html @@ -1,6 +1,6 @@ [%- FOR meta IN metas %] [%- meta_name = meta.code -%] - [%- x_meta_name = 'x' _ meta.code # For report_meta and field_erros lookup, as TT hides codes starting "_" -%] + [%- x_meta_name = 'x' _ meta.code # For report_meta and field_errors lookup, as TT hides codes starting "_" -%] [% IF c.cobrand.category_extra_hidden(meta) AND NOT show_hidden %] diff --git a/templates/web/base/report/new/category_wrapper.html b/templates/web/base/report/new/category_wrapper.html index 6cbb55229..32785b450 100644 --- a/templates/web/base/report/new/category_wrapper.html +++ b/templates/web/base/report/new/category_wrapper.html @@ -19,6 +19,11 @@ [% PROCESS "report/new/duplicate_suggestions.html" %] +[% IF disable_form_message %] +<div id="js-category-stopper" class="box-warning" role="alert" aria-live="assertive"> + [% disable_form_message %] +</div> +[% ELSE %] <div id="js-post-category-messages" class="js-hide-if-invalid-category_extras"> [%# This section includes 'Pick an asset' text, roadworks info, extra category questions %] @@ -26,3 +31,4 @@ [% PROCESS "report/new/category_extras.html" %] [%- END %] </div> +[% END %] diff --git a/templates/web/base/report/new/form_report.html b/templates/web/base/report/new/form_report.html index e5facc305..52133ba68 100644 --- a/templates/web/base/report/new/form_report.html +++ b/templates/web/base/report/new/form_report.html @@ -1,3 +1,5 @@ +[% SET form_show_category_only = NOT category || field_errors.category || disable_form_message || have_disable_qn_to_answer %] + <!-- report/new/form_report.html --> [% INCLUDE 'report/new/form_heading.html' %] @@ -7,7 +9,17 @@ [% PROCESS "report/new/category_wrapper.html" %] [% TRY %][% PROCESS 'report/new/after_category.html' %][% CATCH file %][% END %] -<div class="js-hide-if-invalid-category"> + +[% IF form_show_category_only %] + <div class="hidden-js"> + <input class="btn btn--primary btn--block btn--final" type="submit" name="submit_category_part_only" value="[% loc('Submit') %]"> + </div> + [% SET field_required = '' %] +[% ELSE %] + [% SET field_required = ' required' %] +[% END %] + +<div class="js-hide-if-invalid-category[% ' hidden-nojs' IF form_show_category_only %]"> [% TRY %][% PROCESS 'report/new/_form_labels.html' %][% CATCH file %][% END %] <h2 class="form-section-heading js-hide-if-private-category">[% loc( 'Public details' ) %]</h2> @@ -67,7 +79,7 @@ <p class='form-error'>[% field_errors.detail %]</p> [% END %] - <textarea class="form-control" rows="7" cols="26" name="detail" id="form_detail" [% IF form_detail_placeholder %]aria-describedby="detail-hint"[% END %] required>[% report.detail | html %]</textarea> + <textarea class="form-control" rows="7" cols="26" name="detail" id="form_detail" [% IF form_detail_placeholder %]aria-describedby="detail-hint"[% END %][% field_required %]>[% report.detail | html %]</textarea> [% TRY %][% PROCESS 'report/new/inline-tips.html' %][% CATCH file %][% END %] diff --git a/templates/web/base/report/new/form_title.html b/templates/web/base/report/new/form_title.html index a20d836ac..423a0cf0e 100644 --- a/templates/web/base/report/new/form_title.html +++ b/templates/web/base/report/new/form_title.html @@ -5,4 +5,4 @@ [% IF field_errors.title %] <p class='form-error'>[% field_errors.title %]</p> [% END %] -<input class="form-control" type="text" value="[% report.title | html %]" name="title" id="form_title" aria-describedby="title-hint" required autocomplete="off"> +<input class="form-control" type="text" value="[% report.title | html %]" name="title" id="form_title" aria-describedby="title-hint"[% field_required %] autocomplete="off"> diff --git a/templates/web/base/report/new/form_user.html b/templates/web/base/report/new/form_user.html index 49ef70abd..73e1b5d33 100644 --- a/templates/web/base/report/new/form_user.html +++ b/templates/web/base/report/new/form_user.html @@ -1,5 +1,5 @@ <!-- report/new/form_user.html --> -<div class="js-hide-if-invalid-category"> +<div class="js-hide-if-invalid-category[% ' hidden-nojs' IF form_show_category_only %]"> [% PROCESS 'report/form/user.html' type='report' %] diff --git a/templates/web/bristol/footer_extra_js.html b/templates/web/bristol/footer_extra_js.html index deff4e395..644576b72 100644 --- a/templates/web/bristol/footer_extra_js.html +++ b/templates/web/bristol/footer_extra_js.html @@ -6,6 +6,8 @@ IF bodyclass.match('mappage'); scripts.push( version('/vendor/OpenLayers.Projection.OrdnanceSurvey.js'), version('/cobrands/fixmystreet/assets.js'), + version('/cobrands/fixmystreet-uk-councils/roadworks.js'), + version('/cobrands/bristol/js.js'), version('/cobrands/bristol/assets.js'), version('/cobrands/highways/assets.js'), ); diff --git a/templates/web/bromley/report/form/user_loggedout_email.html b/templates/web/bromley/report/form/user_loggedout_email.html index 78b4a0044..8aad16289 100644 --- a/templates/web/bromley/report/form/user_loggedout_email.html +++ b/templates/web/bromley/report/form/user_loggedout_email.html @@ -18,5 +18,4 @@ [% END %] <input type="[% username_type %]" name="username" id="form_[% name %]" value="[% username_value | html %]" - [% IF required %]required[% END %] class="form-control required"> diff --git a/templates/web/northamptonshire/report/new/roads_message.html b/templates/web/northamptonshire/report/new/roads_message.html index 06244b36e..0394a9c5c 100644 --- a/templates/web/northamptonshire/report/new/roads_message.html +++ b/templates/web/northamptonshire/report/new/roads_message.html @@ -3,7 +3,8 @@ <p>Please select <span class="js-roads-asset" data-original="an item">an item</span> from the map on which to make a report.</p> </div> <div id="js-not-a-road" class="hidden js-responsibility-message"> - <p>The location you have selected doesn't appear to be on <span class="js-roads-asset" data-original="a road">a road</span>.</p> - <p>Please select <span class="js-roads-asset" data-original="a road">a road</span> on which to make a report.</p> + <p>This area is not under the responsibility of Northamptonshire + County Council and therefore we are unable to accept reports in + this area / street.</p> </div> </div> diff --git a/web/cobrands/bexley/js.js b/web/cobrands/bexley/js.js index d0f2e8963..e0d87d66d 100644 --- a/web/cobrands/bexley/js.js +++ b/web/cobrands/bexley/js.js @@ -62,20 +62,23 @@ var labeled_defaults = $.extend(true, {}, defaults, { } }); -fixmystreet.assets.add(defaults, { +var road_defaults = $.extend(true, {}, defaults, { + stylemap: fixmystreet.assets.stylemap_invisible, + always_visible: true, + non_interactive: true +}); + +fixmystreet.assets.add(road_defaults, { http_options: { params: { TYPENAME: "Streets", } }, - always_visible: true, - non_interactive: true, nearest_radius: 100, usrn: { attribute: 'NSG_REF', field: 'NSGRef' - }, - stylemap: fixmystreet.assets.stylemap_invisible + } }); fixmystreet.assets.add(labeled_defaults, { @@ -111,5 +114,31 @@ fixmystreet.assets.add(defaults, { asset_item: 'public toilet' }); +fixmystreet.assets.add(road_defaults, { + http_options: { + url: "https://tilma.mysociety.org/mapserver/tfl", + params: { + TYPENAME: "RedRoutes" + } + }, + road: true, + all_categories: true, + actions: { + found: function(layer, feature) { + var category = $('select#form_category').val(), + relevant = (category !== 'Street cleaning'); + if (!fixmystreet.assets.selectedFeature() && relevant) { + fixmystreet.body_overrides.only_send('TfL'); + $('#category_meta').empty(); + } else { + fixmystreet.body_overrides.remove_only_send(); + } + }, + not_found: function(layer) { + fixmystreet.body_overrides.remove_only_send(); + } + } +}); + })(); diff --git a/web/cobrands/bristol/js.js b/web/cobrands/bristol/js.js new file mode 100644 index 000000000..c2431607f --- /dev/null +++ b/web/cobrands/bristol/js.js @@ -0,0 +1,24 @@ +(function(){ + +if (!fixmystreet.maps) { + return; +} + +var org_id = '1015'; +var body = "Bristol City Council"; +fixmystreet.assets.add(fixmystreet.roadworks.layer_future, { + http_options: { params: { organisation_id: org_id } }, + body: body +}); +fixmystreet.assets.add(fixmystreet.roadworks.layer_planned, { + http_options: { params: { organisation_id: org_id } }, + body: body +}); + +fixmystreet.roadworks.config = { + summary_heading_text: 'Location', + extra_dates_text: '<small>Please note that dates are updated by the contractor carrying out the works and the finish date may be incorrect in cases of unauthorised or overrunning works</small>', + skip_delays: true +}; + +})(); diff --git a/web/cobrands/fixmystreet-uk-councils/roadworks.js b/web/cobrands/fixmystreet-uk-councils/roadworks.js index 083f669c8..f4da4c310 100644 --- a/web/cobrands/fixmystreet-uk-councils/roadworks.js +++ b/web/cobrands/fixmystreet-uk-councils/roadworks.js @@ -186,33 +186,38 @@ fixmystreet.roadworks.display_message = function(feature) { desc = attr.works_desc.replace(/\\n/g, '\n'); var config = this.config, + summary_heading_text = config.summary_heading_text || 'Summary', tag_top = config.tag_top || 'p', colon = config.colon ? ':' : ''; - var $msg = $('<div class="js-roadworks-message js-roadworks-message-' + feature.layer.id + ' box-warning"><' + tag_top + '>Roadworks are scheduled near this location, so you may not need to report your issue.</' + tag_top + '></div>'); - var $dl = $("<dl></dl>").appendTo($msg); - $dl.append("<dt>Dates" + colon + "</dt>"); - $dl.append($("<dd></dd>").text(start + " until " + end)); - $dl.append("<dt>Summary" + colon + "</dt>"); - var $summary = $("<dd></dd>").appendTo($dl); - tooltip.split("\n").forEach(function(para) { - if (para.match(/^(\d{2}\s+\w{3}\s+(\d{2}:\d{2}\s+)?\d{4}( - )?){2}/)) { - // skip showing the date again - return; - } - if (config.skip_delays && para.match(/^delays/)) { - // skip showing traffic delay information - return; - } - $summary.append(para).append("<br />"); - }); - if (desc) { - $dl.append("<dt>Description" + colon + "</dt>"); - $dl.append($("<dd></dd>").text(desc)); + var $msg = $('<div class="js-roadworks-message js-roadworks-message-' + feature.layer.id + ' box-warning"><' + tag_top + '>Roadworks are scheduled near this location, so you may not need to report your issue.</' + tag_top + '></div>'); + var $dl = $("<dl></dl>").appendTo($msg); + $dl.append("<dt>Dates" + colon + "</dt>"); + var $dates = $("<dd></dd>").appendTo($dl); + $dates.text(start + " until " + end); + if (config.extra_dates_text) { + $dates.append('<br>' + config.extra_dates_text); + } + $dl.append("<dt>" + summary_heading_text + colon + "</dt>"); + var $summary = $("<dd></dd>").appendTo($dl); + tooltip.split("\n").forEach(function(para) { + if (para.match(/^(\d{2}\s+\w{3}\s+(\d{2}:\d{2}\s+)?\d{4}( - )?){2}/)) { + // skip showing the date again + return; } - if (config.text_after) { - $dl.append(config.text_after); + if (config.skip_delays && para.match(/^delays/)) { + // skip showing traffic delay information + return; } + $summary.append(para).append("<br />"); + }); + if (desc) { + $dl.append("<dt>Description" + colon + "</dt>"); + $dl.append($("<dd></dd>").text(desc)); + } + if (config.text_after) { + $dl.append(config.text_after); + } $msg.prependTo('#js-post-category-messages'); }; diff --git a/web/cobrands/fixmystreet/assets.js b/web/cobrands/fixmystreet/assets.js index 5a25cc128..c30fa2b5e 100644 --- a/web/cobrands/fixmystreet/assets.js +++ b/web/cobrands/fixmystreet/assets.js @@ -275,8 +275,9 @@ function init_asset_layer(layer, pins_layer) { layer.fixmystreet.fault_layer.setZIndex(layer.getZIndex()-1); } - if (fixmystreet.page == 'new' && (layer.fixmystreet.usrn || layer.fixmystreet.road)) { - // If the user visits /report/new directly and doesn't change the pin + if (layer.fixmystreet.usrn || layer.fixmystreet.road) { + // If an asset layer only loads once a category is selected, or if the + // user visits /report/new directly and doesn't change the pin // location, then the assets:selected/maps:update_pin events are never // fired and USRN's checkFeature is never called. This results in a // report whose location was never looked up against the USRN layer, @@ -866,6 +867,19 @@ $(function() { fixmystreet.assets.init(); }); +OpenLayers.Geometry.MultiPolygon.prototype.containsPoint = function(point) { + var numPolygons = this.components.length; + var contained = false; + for(var i=0; i<numPolygons; ++i) { + polygon = this.components[i].containsPoint(point); + if (polygon) { + contained = polygon; + break; + } + } + return contained; +}; + OpenLayers.Layer.Vector.prototype.getFeatureAtPoint = function(point) { for (var i = 0; i < this.features.length; i++) { var feature = this.features[i]; @@ -1088,18 +1102,34 @@ fixmystreet.message_controller = (function() { 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 + function is_matching_stopper(stopper, i) { + var only_send = fixmystreet.body_overrides.get_only_send(); + var body = $('#form_category').data('body'); + + if (OpenLayers.Util.indexOf(ignored_bodies, body) > -1) { + return false; + } + + var category = $('#form_category').val(); + if (category != stopper.category) { + return false; + } + if (only_send == 'TfL') { + return false; + } + + if (stopper.answers) { + var answer = $('#form_' + stopper.code).val(); + if (OpenLayers.Util.indexOf(stopper.answers, answer) > -1) { + return true; + } + return false; } else { - $(fixmystreet).trigger('report_new:category_change'); + return true; } - }); + } - $(fixmystreet).on('report_new:category_change', function() { + function check_for_stopper() { var only_send = fixmystreet.body_overrides.get_only_send(); if (only_send == 'Highways England') { // If we're sending to Highways England, this message doesn't matter @@ -1107,31 +1137,7 @@ fixmystreet.message_controller = (function() { } var $id = $('#' + stopperId); - var body = $('#form_category').data('body'); - var matching = $.grep(stoppers, function(stopper, i) { - if (OpenLayers.Util.indexOf(ignored_bodies, body) > -1) { - return false; - } - - var category = $('#form_category').val(); - if (category != stopper.category) { - return false; - } - if (only_send == 'TfL') { - return false; - } - - if (stopper.answers) { - var answer = $('#form_' + stopper.code).val(); - if (OpenLayers.Util.indexOf(stopper.answers, answer) > -1) { - return true; - } - return false; - } else { - return true; - } - }); - + var matching = $.grep(stoppers, is_matching_stopper); if (!matching.length) { $id.remove(); if ( !$('#js-roads-responsibility').is(':visible') && !$('#js-duplicate-reports').is(':visible') ) { @@ -1157,8 +1163,21 @@ fixmystreet.message_controller = (function() { $msg.insertBefore('#js-post-category-messages'); } disable_report_form(stopper.keep_category_extras); + } + + // 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'); + } }); + $(fixmystreet).on('report_new:category_change', check_for_stopper); + return { asset_found: function() { responsibility_off(); @@ -1212,6 +1231,8 @@ fixmystreet.message_controller = (function() { stoppers = []; }, + check_for_stopper: check_for_stopper, + add_ignored_body: function(body) { ignored_bodies.push(body); } diff --git a/web/cobrands/westminster/assets.js b/web/cobrands/westminster/assets.js index e015f35a1..1c0358301 100644 --- a/web/cobrands/westminster/assets.js +++ b/web/cobrands/westminster/assets.js @@ -101,12 +101,15 @@ fixmystreet.assets.add(defaults, { found: function(layer, feature) { if (!fixmystreet.assets.selectedFeature()) { fixmystreet.body_overrides.only_send('TfL'); + $('#category_meta').empty(); } else { fixmystreet.body_overrides.remove_only_send(); } + fixmystreet.message_controller.check_for_stopper(); }, not_found: function(layer) { fixmystreet.body_overrides.remove_only_send(); + fixmystreet.message_controller.check_for_stopper(); } } }); |