diff options
Diffstat (limited to 'perllib/FixMyStreet')
-rw-r--r-- | perllib/FixMyStreet/App/Controller/Around.pm | 15 | ||||
-rw-r--r-- | perllib/FixMyStreet/App/Controller/Location.pm | 15 | ||||
-rw-r--r-- | perllib/FixMyStreet/App/Controller/Report.pm | 13 | ||||
-rw-r--r-- | perllib/FixMyStreet/DB/ResultSet/Problem.pm | 9 | ||||
-rw-r--r-- | perllib/FixMyStreet/Map.pm | 18 |
5 files changed, 49 insertions, 21 deletions
diff --git a/perllib/FixMyStreet/App/Controller/Around.pm b/perllib/FixMyStreet/App/Controller/Around.pm index b870c1a19..d1bf2d950 100644 --- a/perllib/FixMyStreet/App/Controller/Around.pm +++ b/perllib/FixMyStreet/App/Controller/Around.pm @@ -49,7 +49,8 @@ sub index : Path : Args(0) { my $partial_report = $c->forward('load_partial'); # Try to create a location for whatever we have - my $ret = $c->forward('/location/determine_location_from_coords') + my $ret = $c->forward('/location/determine_location_from_bbox') + || $c->forward('/location/determine_location_from_coords') || $c->forward('/location/determine_location_from_pc'); unless ($ret) { return $c->res->redirect('/') unless $c->get_param('pc') || $partial_report; @@ -174,7 +175,11 @@ sub display_location : Private { my $latitude = $c->stash->{latitude}; my $longitude = $c->stash->{longitude}; - $c->forward('map_features', [ { latitude => $latitude, longitude => $longitude } ] ); + if (my $bbox = $c->stash->{bbox}) { + $c->forward('map_features', [ { bbox => $bbox } ]); + } else { + $c->forward('map_features', [ { latitude => $latitude, longitude => $longitude } ]); + } FixMyStreet::Map::display_map( $c, @@ -285,8 +290,8 @@ the map. sub ajax : Private { my ( $self, $c ) = @_; - my $bbox = $c->get_param('bbox'); - unless ($bbox) { + my $ret = $c->forward('/location/determine_location_from_bbox'); + unless ($ret) { $c->res->status(404); $c->res->body(''); return; @@ -295,7 +300,7 @@ sub ajax : Private { my %valid_categories = map { $_ => 1 } $c->get_param_list('filter_category', 1); $c->stash->{filter_category} = \%valid_categories; - $c->forward('map_features', [ { bbox => $bbox } ]); + $c->forward('map_features', [ { bbox => $c->stash->{bbox} } ]); $c->forward('/reports/ajax', [ 'around/on_map_list_items.html' ]); } diff --git a/perllib/FixMyStreet/App/Controller/Location.pm b/perllib/FixMyStreet/App/Controller/Location.pm index cb2077ede..8d5b0b147 100644 --- a/perllib/FixMyStreet/App/Controller/Location.pm +++ b/perllib/FixMyStreet/App/Controller/Location.pm @@ -110,6 +110,21 @@ sub determine_location_from_pc : Private { return; } +sub determine_location_from_bbox : Private { + my ( $self, $c ) = @_; + + my $bbox = $c->get_param('bbox'); + return unless $bbox; + + my ($min_lon, $min_lat, $max_lon, $max_lat) = split /,/, $bbox; + my $longitude = ($max_lon + $min_lon ) / 2; + my $latitude = ($max_lat + $min_lat ) / 2; + $c->stash->{bbox} = $bbox; + $c->stash->{latitude} = $latitude; + $c->stash->{longitude} = $longitude; + return $c->forward('check_location'); +} + =head2 check_location Just make sure that for UK installs, our co-ordinates are indeed in the UK. diff --git a/perllib/FixMyStreet/App/Controller/Report.pm b/perllib/FixMyStreet/App/Controller/Report.pm index 3913f4906..da5420500 100644 --- a/perllib/FixMyStreet/App/Controller/Report.pm +++ b/perllib/FixMyStreet/App/Controller/Report.pm @@ -525,20 +525,19 @@ sub nearby_json : Private { ); my @pins = map { my $p = $_->problem; - my $colour = $c->cobrand->pin_colour( $p, 'around' ); - [ $p->latitude, $p->longitude, - $colour, - $p->id, $p->title_safe, 'small', JSON->false + $p = $p->pin_data($c, 'around'); + [ $p->{latitude}, $p->{longitude}, $p->{colour}, + $p->{id}, $p->{title}, 'small', JSON->false ] } @$nearby; - my $on_map_list_html = $c->render_fragment( + my $list_html = $c->render_fragment( 'around/on_map_list_items.html', - { on_map => [], around_map => $nearby } + { around_map => [], on_map => $nearby } ); my $json = { pins => \@pins }; - $json->{reports_list} = $on_map_list_html if $on_map_list_html; + $json->{reports_list} = $list_html if $list_html; my $body = encode_json($json); $c->res->content_type('application/json; charset=utf-8'); $c->res->body($body); diff --git a/perllib/FixMyStreet/DB/ResultSet/Problem.pm b/perllib/FixMyStreet/DB/ResultSet/Problem.pm index 5cbf4e8f0..ae45351c4 100644 --- a/perllib/FixMyStreet/DB/ResultSet/Problem.pm +++ b/perllib/FixMyStreet/DB/ResultSet/Problem.pm @@ -140,10 +140,11 @@ sub _recent { # Problems around a location sub around_map { - my ( $rs, %p) = @_; + my ( $rs, $c, %p) = @_; my $attr = { order_by => $p{order}, }; + $attr->{rows} = $c->cobrand->reports_per_page; unless ( $p{states} ) { $p{states} = FixMyStreet::DB::Result::Problem->visible_states(); @@ -157,8 +158,10 @@ sub around_map { }; $q->{category} = $p{categories} if $p{categories} && @{$p{categories}}; - my @problems = mySociety::Locale::in_gb_locale { $rs->search( $q, $attr )->include_comment_counts->all }; - return \@problems; + my $problems = mySociety::Locale::in_gb_locale { + $rs->search( $q, $attr )->include_comment_counts->page($p{page}); + }; + return $problems; } # Admin functions diff --git a/perllib/FixMyStreet/Map.pm b/perllib/FixMyStreet/Map.pm index 46a098117..e0e3c3128 100644 --- a/perllib/FixMyStreet/Map.pm +++ b/perllib/FixMyStreet/Map.pm @@ -88,15 +88,21 @@ sub map_features { $p{latitude} = ($p{max_lat} + $p{min_lat} ) / 2; } - my $on_map = $c->cobrand->problems_on_map->around_map( %p ); + $p{page} = $c->get_param('p') || 1; + my $on_map = $c->cobrand->problems_on_map->around_map( $c, %p ); + my $pager = $c->stash->{pager} = $on_map->pager; + $on_map = [ $on_map->all ]; my $dist = FixMyStreet::Gaze::get_radius_containing_population( $p{latitude}, $p{longitude} ); - my $limit = 20; - my @ids = map { $_->id } @$on_map; - my $nearby = $c->model('DB::Nearby')->nearby( - $c, $dist, \@ids, $limit, @p{"latitude", "longitude", "categories", "states"} - ); + my $nearby; + if (@$on_map < $pager->entries_per_page && $pager->current_page == 1) { + my $limit = 20; + my @ids = map { $_->id } @$on_map; + $nearby = $c->model('DB::Nearby')->nearby( + $c, $dist, \@ids, $limit, @p{"latitude", "longitude", "categories", "states"} + ); + } return ( $on_map, $nearby, $dist ); } |