aboutsummaryrefslogtreecommitdiffstats
path: root/perllib/FixMyStreet/App
diff options
context:
space:
mode:
Diffstat (limited to 'perllib/FixMyStreet/App')
-rw-r--r--perllib/FixMyStreet/App/Controller/Around.pm46
-rw-r--r--perllib/FixMyStreet/App/Controller/My.pm20
-rw-r--r--perllib/FixMyStreet/App/Controller/Reports.pm38
3 files changed, 99 insertions, 5 deletions
diff --git a/perllib/FixMyStreet/App/Controller/Around.pm b/perllib/FixMyStreet/App/Controller/Around.pm
index 413af814f..5bfe1ada2 100644
--- a/perllib/FixMyStreet/App/Controller/Around.pm
+++ b/perllib/FixMyStreet/App/Controller/Around.pm
@@ -165,10 +165,15 @@ sub display_location : Private {
$c->stash->{all_pins} = $all_pins;
my $interval = $all_pins ? undef : $c->cobrand->on_map_default_max_pin_age;
+ $c->forward( '/reports/stash_report_filter_status' );
+
+ # Check the category to filter by, if any, is valid
+ $c->forward('check_and_stash_category');
+
# get the map features
my ( $on_map_all, $on_map, $around_map, $distance ) =
FixMyStreet::Map::map_features( $c, $latitude, $longitude,
- $interval );
+ $interval, $c->stash->{filter_category}, $c->stash->{filter_problem_states} );
# copy the found reports to the stash
$c->stash->{on_map} = $on_map;
@@ -221,6 +226,45 @@ sub check_location_is_acceptable : Private {
return $c->forward('/council/load_and_check_areas');
}
+=head2 check_and_stash_category
+
+Check that the 'filter_category' query param is valid, if it's present. Stores
+the validated string in the stash as filter_category.
+Puts all the valid categories in filter_categories on the stash.
+
+=cut
+
+sub check_and_stash_category : Private {
+ my ( $self, $c ) = @_;
+
+ my $all_areas = $c->stash->{all_areas};
+ my @bodies = $c->model('DB::Body')->search(
+ { 'body_areas.area_id' => [ keys %$all_areas ], deleted => 0 },
+ { join => 'body_areas' }
+ )->all;
+ my %bodies = map { $_->id => $_ } @bodies;
+
+ my @contacts = $c->model('DB::Contact')->not_deleted->search(
+ {
+ body_id => [ keys %bodies ],
+ },
+ {
+ columns => [ 'category' ],
+ order_by => [ 'category' ],
+ distinct => 1
+ }
+ )->all;
+ my @categories = map { $_->category } @contacts;
+ $c->stash->{filter_categories} = \@categories;
+
+
+ my $category = $c->req->param('filter_category');
+ my %categories_mapped = map { $_ => 1 } @categories;
+ if ( defined $category && $categories_mapped{$category} ) {
+ $c->stash->{filter_category} = $category;
+ }
+}
+
=head2 /ajax
Handle the ajax calls that the map makes when it is dragged. The info returned
diff --git a/perllib/FixMyStreet/App/Controller/My.pm b/perllib/FixMyStreet/App/Controller/My.pm
index bbef1f8d8..b3d341a68 100644
--- a/perllib/FixMyStreet/App/Controller/My.pm
+++ b/perllib/FixMyStreet/App/Controller/My.pm
@@ -28,17 +28,26 @@ sub my : Path : Args(0) {
my $p_page = $c->req->params->{p} || 1;
my $u_page = $c->req->params->{u} || 1;
+ $c->forward( '/reports/stash_report_filter_status' );
+
my $pins = [];
my $problems = {};
+ my $states = $c->stash->{filter_problem_states};
my $params = {
- state => [ FixMyStreet::DB::Result::Problem->visible_states() ],
+ state => [ keys %$states ],
};
$params = {
%{ $c->cobrand->problems_clause },
%$params
} if $c->cobrand->problems_clause;
+ my $category = $c->req->param('filter_category');
+ if ( $category ) {
+ $params->{category} = $category;
+ $c->stash->{filter_category} = $category;
+ }
+
my $rs = $c->user->problems->search( $params, {
order_by => { -desc => 'confirmed' },
rows => 50
@@ -55,6 +64,7 @@ sub my : Path : Args(0) {
};
my $state = $problem->is_fixed ? 'fixed' : $problem->is_closed ? 'closed' : 'confirmed';
push @{ $problems->{$state} }, $problem;
+ push @{ $problems->{all} }, $problem;
}
$c->stash->{problems_pager} = $rs->pager;
$c->stash->{problems} = $problems;
@@ -71,6 +81,14 @@ sub my : Path : Args(0) {
$c->stash->{updates} = \@updates;
$c->stash->{updates_pager} = $rs->pager;
+ my @categories = $c->user->problems->search( undef, {
+ columns => [ 'category' ],
+ distinct => 1,
+ order_by => [ 'category' ],
+ } )->all;
+ @categories = map { $_->category } @categories;
+ $c->stash->{filter_categories} = \@categories;
+
$c->stash->{page} = 'my';
FixMyStreet::Map::display_map(
$c,
diff --git a/perllib/FixMyStreet/App/Controller/Reports.pm b/perllib/FixMyStreet/App/Controller/Reports.pm
index 352c47da8..5a044c9af 100644
--- a/perllib/FixMyStreet/App/Controller/Reports.pm
+++ b/perllib/FixMyStreet/App/Controller/Reports.pm
@@ -109,6 +109,7 @@ sub ward : Path : Args(2) {
$c->forward( 'ward_check', [ $ward ] )
if $ward;
$c->forward( 'check_canonical_url', [ $body ] );
+ $c->forward( 'stash_report_filter_status' );
$c->forward( 'load_and_group_problems' );
my $body_short = $c->cobrand->short_name( $c->stash->{body} );
@@ -120,6 +121,15 @@ sub ward : Path : Args(2) {
$c->stash->{stats} = $c->cobrand->get_report_stats();
+ my @categories = $c->stash->{body}->contacts->search( undef, {
+ columns => [ 'category' ],
+ distinct => 1,
+ order_by => [ 'category' ],
+ } )->all;
+ @categories = map { $_->category } @categories;
+ $c->stash->{filter_categories} = \@categories;
+ $c->stash->{filter_category} = $c->req->param('filter_category');
+
my $pins = $c->stash->{pins};
$c->stash->{page} = 'reports'; # So the map knows to make clickable pins
@@ -374,12 +384,14 @@ sub load_and_group_problems : Private {
my ( $self, $c ) = @_;
my $page = $c->req->params->{p} || 1;
+ # NB: If 't' is specified, it will override 'status'.
my $type = $c->req->params->{t} || 'all';
- my $category = $c->req->params->{c} || '';
+ my $category = $c->req->params->{c} || $c->req->params->{filter_category} || '';
+ my $states = $c->stash->{filter_problem_states};
my $where = {
non_public => 0,
- state => [ FixMyStreet::DB::Result::Problem->visible_states() ]
+ state => [ keys %$states ]
};
my $not_open = [ FixMyStreet::DB::Result::Problem::fixed_states(), FixMyStreet::DB::Result::Problem::closed_states() ];
@@ -430,7 +442,7 @@ sub load_and_group_problems : Private {
my $problems = $c->cobrand->problems->search(
$where,
{
- order_by => { -desc => 'lastupdate' },
+ order_by => $c->cobrand->reports_ordering,
rows => $c->cobrand->reports_per_page,
}
)->page( $page );
@@ -485,6 +497,26 @@ sub redirect_body : Private {
$c->res->redirect( $c->uri_for($url, $c->req->params ) );
}
+sub stash_report_filter_status : Private {
+ my ( $self, $c ) = @_;
+
+ my $status = $c->req->param('status') || $c->cobrand->on_map_default_status;
+ if ( $status eq 'all' ) {
+ $c->stash->{filter_status} = 'all';
+ $c->stash->{filter_problem_states} = FixMyStreet::DB::Result::Problem->visible_states();
+ } elsif ( $status eq 'open' ) {
+ $c->stash->{filter_status} = 'open';
+ $c->stash->{filter_problem_states} = FixMyStreet::DB::Result::Problem->open_states();
+ } elsif ( $status eq 'fixed' ) {
+ $c->stash->{filter_status} = 'fixed';
+ $c->stash->{filter_problem_states} = FixMyStreet::DB::Result::Problem->fixed_states();
+ } else {
+ $c->stash->{filter_status} = $c->cobrand->on_map_default_status;
+ }
+
+ return 1;
+}
+
sub add_row {
my ( $c, $problem, $body, $problems, $pins ) = @_;
push @{$problems->{$body}}, $problem;