diff options
-rw-r--r-- | CHANGELOG.md | 1 | ||||
-rw-r--r-- | perllib/FixMyStreet/App/Controller/Admin.pm | 30 | ||||
-rw-r--r-- | t/app/controller/admin/users.t | 58 | ||||
-rw-r--r-- | templates/web/base/admin/user-alerts.html | 11 |
4 files changed, 96 insertions, 4 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md index 54851de5d..3b7342f92 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,7 @@ - Clearer relocation options while you’re reporting a problem #2238 - Admin improvements - List number of alerts on report page #669 + - viewing and managing of user alerts in admin #676 - Bugfixes: - Add perl 5.26/5.28 support. - Fix subcategory issues when visiting /report/new directly #2276 diff --git a/perllib/FixMyStreet/App/Controller/Admin.pm b/perllib/FixMyStreet/App/Controller/Admin.pm index e13a4b7ca..d757cec9a 100644 --- a/perllib/FixMyStreet/App/Controller/Admin.pm +++ b/perllib/FixMyStreet/App/Controller/Admin.pm @@ -1512,10 +1512,6 @@ sub user_edit : Path('user_edit') : Args(1) { $c->forward('fetch_all_bodies'); $c->forward('fetch_body_areas', [ $user->from_body ]) if $user->from_body; - unless ( $c->cobrand->moniker eq 'zurich' ) { - $c->forward('user_alert_details'); - } - if ( defined $c->flash->{status_message} ) { $c->stash->{status_message} = '<p><em>' . $c->flash->{status_message} . '</em></p>'; @@ -1538,6 +1534,8 @@ sub user_edit : Path('user_edit') : Args(1) { my %args = ( email => $email ); $args{user_id} = $id if $user->email ne $email || !$user->email_verified; $c->forward('send_login_email', [ \%args ]); + } elsif ( $c->get_param('update_alerts') ) { + $c->forward('update_alerts'); } elsif ( $c->get_param('submit') ) { my $edited = 0; @@ -1717,6 +1715,11 @@ sub user_edit : Path('user_edit') : Args(1) { $c->stash->{contacts} = \@all_contacts; } + # this goes after in case we've delete any alerts + unless ( $c->cobrand->moniker eq 'zurich' ) { + $c->forward('user_alert_details'); + } + return 1; } @@ -1945,6 +1948,25 @@ sub ban_user : Private { return 1; } +sub update_alerts : Private { + my ($self, $c) = @_; + + my $changes; + for my $alert ( $c->stash->{user}->alerts ) { + my $edit_option = $c->get_param('edit_alert[' . $alert->id . ']'); + next unless $edit_option; + $changes = 1; + if ( $edit_option eq 'delete' ) { + $alert->delete; + } elsif ( $edit_option eq 'disable' ) { + $alert->disable; + } elsif ( $edit_option eq 'enable' ) { + $alert->confirm; + } + } + $c->flash->{status_message} = _("Updated!") if $changes; +} + sub user_logout_everywhere : Private { my ( $self, $c, $user ) = @_; my $sessions = $user->get_extra_metadata('sessions'); diff --git a/t/app/controller/admin/users.t b/t/app/controller/admin/users.t index 37d95feed..d9e984454 100644 --- a/t/app/controller/admin/users.t +++ b/t/app/controller/admin/users.t @@ -515,6 +515,64 @@ subtest "Removing account from admin" => sub { is $user->email, 'removed-' . $user->id . '@example.org', 'Email gone' }; +subtest "can view list of user's alerts" => sub { + $mech->get_ok( '/admin/user_edit/' . $user->id ); + $mech->content_lacks("User's alerts", 'no list of alerts'); + + $mech->create_problems_for_body(1, 2514, 'Title', { user => $user }); + my $p = FixMyStreet::DB->resultset('Problem')->search({ user_id => $user->id })->first; + + my $alert = FixMyStreet::DB->resultset('Alert')->find_or_create({ + user_id => $user->id, + alert_type => 'new_updates', + parameter => $p->id + }); + + + $mech->get_ok( '/admin/user_edit/' . $user->id ); + $mech->content_contains("User's alerts", 'has list of alerts'); + $mech->content_contains($alert->id, 'lists alert'); +}; + +subtest "can edit list of user's alerts" => sub { + $mech->get_ok( '/admin/user_edit/' . $user->id ); + + my $alert = FixMyStreet::DB->resultset('Alert')->search({ + user_id => $user->id, + alert_type => 'new_updates', + })->first; + + $mech->content_like(qr[<td>${\$alert->id}</td>\s*<td>new_updates</td>]m, 'alert on page'); + + $mech->submit_form_ok( { + with_fields => { + 'edit_alert[' . $alert->id . ']' => 'disable' + } + }, 'disabling alert'); + + $alert->discard_changes; + ok $alert->whendisabled, 'alert disabled'; + + $mech->submit_form_ok( { + with_fields => { + 'edit_alert[' . $alert->id . ']' => 'enable' + } + }, 'enabling alert'); + + $alert->discard_changes; + is $alert->whendisabled, undef, 'alert enabled'; + + $mech->submit_form_ok( { + with_fields => { + 'edit_alert[' . $alert->id . ']' => 'delete', + } + }, 'deleting alert'); + + $mech->content_unlike(qr[<td>${\$alert->id}</td>\s*<td>new_updates</td>]m, 'alert not on page'); + + is $user->alerts->count, 0, 'alert deleted'; +}; + subtest "View timeline" => sub { $mech->get_ok('/admin/timeline'); }; diff --git a/templates/web/base/admin/user-alerts.html b/templates/web/base/admin/user-alerts.html index 1da9729d7..6058e595b 100644 --- a/templates/web/base/admin/user-alerts.html +++ b/templates/web/base/admin/user-alerts.html @@ -1,5 +1,8 @@ [% IF alerts.size %] <h3>[% loc("User's alerts") %]</h3> +<form method="POST"> +<input type="hidden" name="token" value="[% csrf_token %]" > +<input type="hidden" name="update_alerts" value="1" > <table> <tr> <th>[% loc('ID') %]</th> @@ -7,6 +10,9 @@ <th>[% loc('Confirmed') %]</th> <th>[% loc('State') %]</th> <th>[% loc('Details') %]</th> + <th>[% loc('Enable') %]</th> + <th>[% loc('Disable') %]</th> + <th>[% loc('Delete') %]</th> </tr> [% FOREACH alert IN alerts %] <tr> @@ -43,7 +49,12 @@ [% alert.parameter %] [% alert.parameter2 %] [% END %] </td> + <td><input type="radio" name="edit_alert[[% alert.id %]]" value="enable"[% ' disabled' UNLESS alert.whendisabled %]></td> + <td><input type="radio" name="edit_alert[[% alert.id %]]" value="disable"[% ' disabled' IF alert.whendisabled %]></td> + <td><input type="radio" name="edit_alert[[% alert.id %]]" value="delete"></td> </tr> [% END %] </table> +<input type="submit" value="[% loc('Update') %]"> +</form> [% END %] |