diff options
-rw-r--r-- | perllib/FixMyStreet/App/Controller/Report/New.pm | 40 | ||||
-rw-r--r-- | t/app/controller/report_new.t | 6 | ||||
-rw-r--r-- | templates/web/fixmystreet.com/report/new/unresponsive_body.html | 11 |
3 files changed, 30 insertions, 27 deletions
diff --git a/perllib/FixMyStreet/App/Controller/Report/New.pm b/perllib/FixMyStreet/App/Controller/Report/New.pm index 2de1d8551..b6292facb 100644 --- a/perllib/FixMyStreet/App/Controller/Report/New.pm +++ b/perllib/FixMyStreet/App/Controller/Report/New.pm @@ -286,7 +286,9 @@ sub by_category_ajax_data : Private { # unresponsive must return empty string if okay, as that's what mobile app checks if ($type eq 'one' || ($type eq 'all' && $unresponsive)) { $body->{unresponsive} = $unresponsive; - if ($type eq 'all' && $unresponsive) { + # Check for no bodies here, because if there are any (say one + # unresponsive, one not), can use default display code for that. + if ($type eq 'all' && !@$bodies) { $body->{councils_text} = $c->render_fragment( 'report/new/councils_text.html', $vars); $body->{councils_text_private} = $c->render_fragment( 'report/new/councils_text_private.html'); } @@ -635,7 +637,6 @@ sub setup_categories_and_bodies : Private { my @bodies = $c->model('DB::Body')->active->for_areas(keys %$all_areas)->all; my %bodies = map { $_->id => $_ } @bodies; - my $first_body = ( values %bodies )[0]; my $contacts # = $c # @@ -654,17 +655,18 @@ sub setup_categories_and_bodies : Private { (); # categories for which the reports are not public $c->stash->{unresponsive} = {}; - if (keys %bodies == 1 && $first_body->send_method && $first_body->send_method eq 'Refused') { - # If there's only one body, and it's set to refused, we can show the + my @refused_bodies = grep { ($_->send_method || "") eq 'Refused' } values %bodies; + if (@refused_bodies && @refused_bodies == values %bodies) { + # If all bodies are set to Refused, we can show the # message immediately, before they select a category. + my $k = 'ALL'; if ($c->action->name eq 'category_extras_ajax' && $c->req->method eq 'POST') { # The mobile app doesn't currently use this, in which case make # sure the message is output, either below with a category, or when # a blank category call is made. - $c->stash->{unresponsive}{""} = $first_body->id; - } else { - $c->stash->{unresponsive}{ALL} = $first_body->id; + $k = ""; } + $c->stash->{unresponsive}{$k} = { map { $_ => 1 } keys %bodies }; } # keysort does not appear to obey locale so use strcoll (see i18n.t) @@ -694,14 +696,12 @@ sub setup_categories_and_bodies : Private { $non_public_categories{ $contact->category } = 1 if $contact->non_public; - unless ( $seen{$contact->category} ) { - push @category_options, $contact; + my $body_send_method = $contact->body->send_method || ''; + $c->stash->{unresponsive}{$contact->category}{$contact->body_id} = 1 + if !$c->stash->{unresponsive}{ALL} && + ($contact->email =~ /^REFUSED$/i || $body_send_method eq 'Refused'); - my $body_send_method = $bodies{$contact->body_id}->send_method || ''; - $c->stash->{unresponsive}{$contact->category} = $contact->body_id - if !$c->stash->{unresponsive}{ALL} && - ($contact->email =~ /^REFUSED$/i || $body_send_method eq 'Refused'); - } + push @category_options, $contact unless $seen{$contact->category}; $seen{$contact->category} = $contact; } @@ -1052,17 +1052,17 @@ sub contacts_to_bodies : Private { @contacts = @contacts_filtered if scalar @contacts_filtered; } - if ($c->stash->{unresponsive}{$category} || $c->stash->{unresponsive}{ALL} || !@contacts) { - []; - } else { + my $unresponsive = $c->stash->{unresponsive}{$category} || $c->stash->{unresponsive}{ALL}; + if ($unresponsive) { + @contacts = grep { !$unresponsive->{$_->body_id} } @contacts; + } elsif (@contacts) { if ( $c->cobrand->call_hook('singleton_bodies_str') ) { # Cobrands like Zurich can only ever have a single body: 'x', because some functionality # relies on string comparison against bodies_str. - [ $contacts[0]->body ]; - } else { - [ map { $_->body } @contacts ]; + @contacts = ($contacts[0]); } } + [ map { $_->body } @contacts ]; } sub set_report_extras : Private { diff --git a/t/app/controller/report_new.t b/t/app/controller/report_new.t index 66b802873..40264f073 100644 --- a/t/app/controller/report_new.t +++ b/t/app/controller/report_new.t @@ -1807,9 +1807,9 @@ subtest "unresponsive body handling works" => sub { my $body_id = $contact1->body->id; my $extra_details = $mech->get_ok_json('/report/new/ajax?latitude=55.952055&longitude=-3.189579'); like $extra_details->{top_message}, qr{Edinburgh.*accept reports.*/unresponsive\?body=$body_id}; - is $extra_details->{unresponsive}, $body_id, "unresponsive json set"; + is_deeply $extra_details->{unresponsive}, { $body_id => 1 }, "unresponsive json set"; $extra_details = $mech->get_ok_json('/report/new/category_extras?category=Street%20lighting&latitude=55.952055&longitude=-3.189579'); - is $extra_details->{unresponsive}, $body_id, "unresponsive json set"; + is_deeply $extra_details->{unresponsive}, { $body_id => 1 }, "unresponsive json set"; my $test_email = 'test-2@example.com'; $mech->log_out_ok; @@ -1886,7 +1886,7 @@ subtest "unresponsive body handling works" => sub { $extra_details = $mech->get_ok_json('/report/new/ajax?latitude=51.896268&longitude=-2.093063'); like $extra_details->{by_category}{$contact3->category}{category_extra}, qr/Cheltenham.*Trees.*unresponsive.*category=Trees/s; $extra_details = $mech->get_ok_json('/report/new/category_extras?category=Trees&latitude=51.896268&longitude=-2.093063'); - is $extra_details->{unresponsive}, $contact3->body->id, "unresponsive json set"; + is_deeply $extra_details->{unresponsive}, { $contact3->body->id => 1 }, "unresponsive json set"; $mech->get_ok('/around'); $mech->submit_form_ok( { with_fields => { pc => 'GL50 2PR', } }, "submit location" ); diff --git a/templates/web/fixmystreet.com/report/new/unresponsive_body.html b/templates/web/fixmystreet.com/report/new/unresponsive_body.html index 0a34475bc..54a9fb195 100644 --- a/templates/web/fixmystreet.com/report/new/unresponsive_body.html +++ b/templates/web/fixmystreet.com/report/new/unresponsive_body.html @@ -1,8 +1,10 @@ -[% SET soon = bodies.$body_id.name == 'Northamptonshire County Council' %] +[% +SET first = body_id.keys.first; # Might be more than one, but showing one will do +SET soon = bodies.$first.name == 'Northamptonshire County Council' %] <div class="box-warning"> <h1>Important message</h1> <p> - <span class="unresponsive-council">[% bodies.$body_id.name %]</span> doesn’t currently accept + <span class="unresponsive-council">[% bodies.$first.name %]</span> doesn’t currently accept [% IF soon %] FixMyStreet reports – though it will do so soon. [% ELSE %] @@ -12,6 +14,7 @@ reports from third party reporting sites such as FixMyStreet. [% END %] </p> - <p>We can make your report public, but [% 'at the moment' IF soon %] we can’t send it to the council.</p> - <a href="[% c.cobrand.base_url %]/unresponsive?body=[% body_id %][% IF category %];category=[% category | uri %][% END %]" class="btn">[% soon ? 'Find out more' : 'What can I do instead?' %]</a> + <p>We can make your report public, but [% 'at the moment' IF soon %] we can’t send it to + [% IF bodies.size > 1 %] that [% ELSE %] the [% END %] council.</p> + <a href="[% c.cobrand.base_url %]/unresponsive?body=[% first %][% IF category %];category=[% category | uri %][% END %]" class="btn">[% soon ? 'Find out more' : 'What can I do instead?' %]</a> </div> |