From c301ae4d49e3f4771cacb2a718ef7449284a516a Mon Sep 17 00:00:00 2001 From: Rachael Booth Date: Mon, 9 Sep 2024 17:15:26 +0100 Subject: [PATCH] CLDC-3607: Allow support users to delete notifications (by setting their end date) --- app/controllers/notifications_controller.rb | 16 ++++++++++ app/helpers/notifications_helper.rb | 7 +++++ app/views/home/index.html.erb | 4 +-- .../_notification_home_section.html.erb | 17 +++++++++++ .../delete_confirmation.html.erb | 27 +++++++++++++++++ config/locales/en.yml | 5 ++++ config/routes.rb | 2 ++ .../requests/notifications_controller_spec.rb | 29 ++++++++++++++++++- 8 files changed, 103 insertions(+), 4 deletions(-) create mode 100644 app/views/notifications/_notification_home_section.html.erb create mode 100644 app/views/notifications/delete_confirmation.html.erb diff --git a/app/controllers/notifications_controller.rb b/app/controllers/notifications_controller.rb index 6691d472c..d74bbe999 100644 --- a/app/controllers/notifications_controller.rb +++ b/app/controllers/notifications_controller.rb @@ -62,6 +62,22 @@ class NotificationsController < ApplicationController end end + def delete_confirmation + @notification = Notification.find_by(id: params[:notification_id]) + render_not_found and return unless @notification + + render "notifications/delete_confirmation" + end + + def delete + @notification = Notification.find_by(id: params[:notification_id]) + render_not_found and return unless @notification + + @notification.update!(end_date: Time.zone.now) + flash[:notice] = "The notification has been deleted" + redirect_to root_path + end + private def notification_params diff --git a/app/helpers/notifications_helper.rb b/app/helpers/notifications_helper.rb index 67206001c..f59d836ab 100644 --- a/app/helpers/notifications_helper.rb +++ b/app/helpers/notifications_helper.rb @@ -35,6 +35,13 @@ module NotificationsHelper render_normal_markdown(content) end + def render_for_home(notification) + return render_normal_markdown(notification.title) unless notification.show_additional_page + + content = "#{notification.title} \n[#{notification.link_text}](#{notification_path(notification)})" + render_normal_markdown(content) + end + private def render_normal_markdown(content) diff --git a/app/views/home/index.html.erb b/app/views/home/index.html.erb index bb4792e68..6ff6c2ccc 100644 --- a/app/views/home/index.html.erb +++ b/app/views/home/index.html.erb @@ -7,9 +7,7 @@ <% if @current_user.support? %> -
- <%= govuk_button_link_to "Create a new notification", new_notification_path %> -
+ <%= render partial: "notifications/notification_home_section" %> <% end %>
diff --git a/app/views/notifications/_notification_home_section.html.erb b/app/views/notifications/_notification_home_section.html.erb new file mode 100644 index 000000000..723107b7f --- /dev/null +++ b/app/views/notifications/_notification_home_section.html.erb @@ -0,0 +1,17 @@ +
+

<%== I18n.t("active_notifications", count: Notification.active.count) %>

+ <% Notification.active.each do |notification| %> +
+
+ <%== render_for_home(notification) %> +
+
+ <%= govuk_link_to("Delete notification", notification_delete_confirmation_path(notification)) %> +
+
+ <% end %> +
+ +
+ <%= govuk_button_link_to "Create a new notification", new_notification_path %> +
diff --git a/app/views/notifications/delete_confirmation.html.erb b/app/views/notifications/delete_confirmation.html.erb new file mode 100644 index 000000000..60d7c49b4 --- /dev/null +++ b/app/views/notifications/delete_confirmation.html.erb @@ -0,0 +1,27 @@ +<% content_for :before_content do %> + <% content_for :title, "Are you sure you want to delete this notification?" %> + <%= govuk_back_link(href: :back) %> +<% end %> + +
+
+

+ <%= content_for(:title) %> +

+ +

<%== render_for_summary("**Notification:** #{@notification.title}") %>

+ +

Users will no longer see this notification.

+ + <%= govuk_warning_text(text: "You will not be able to undo this action.") %> + +
+ <%= govuk_button_to( + "Delete notification", + notification_delete_path(@notification), + method: :delete, + ) %> + <%= govuk_button_link_to "Cancel", root_path, html: { method: :get }, secondary: true %> +
+
+
diff --git a/config/locales/en.yml b/config/locales/en.yml index 89c7152f2..66d7d2531 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -41,6 +41,11 @@ en: create_password: "Create a password to finish setting up your account" reset_password: "Reset your password" + active_notifications: + zero: "There are no active notifications" + one: "There is one active notification:" + other: "There are %{count} active notifications:" + activemodel: errors: models: diff --git a/config/routes.rb b/config/routes.rb index 507a8da2a..73a7239ca 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -141,6 +141,8 @@ Rails.application.routes.draw do resources :notifications do get "dismiss", to: "notifications#dismiss" get "check-answers", to: "notifications#check_answers" + get "delete-confirmation", to: "notifications#delete_confirmation" + delete "delete", to: "notifications#delete" end resources :organisations do diff --git a/spec/requests/notifications_controller_spec.rb b/spec/requests/notifications_controller_spec.rb index 9a5284582..0982057ab 100644 --- a/spec/requests/notifications_controller_spec.rb +++ b/spec/requests/notifications_controller_spec.rb @@ -101,6 +101,17 @@ RSpec.describe NotificationsController, type: :request do end end end + + describe "#delete" do + let(:notification) { create(:notification, end_date: nil) } + let(:request) { delete notification_delete_path(notification) } + + it "sets end_date on the notification" do + request + notification.reload + expect(notification.end_date).to be < Time.zone.now + end + end end context "when user is signed in as a non-support user" do @@ -125,12 +136,28 @@ RSpec.describe NotificationsController, type: :request do describe "#update" do let(:notification) { create(:notification) } - let(:request) { patch notification_path(notification), params: { "notification": { title: "Test Create" } } } + let(:request) { patch notification_path(notification), params: { "notification": { title: "Test Update" } } } it "returns not found" do request expect(response).to have_http_status(:not_found) end end + + describe "#delete" do + let(:notification) { create(:notification, end_date: nil) } + let(:request) { delete notification_delete_path(notification) } + + it "returns not found" do + request + expect(response).to have_http_status(:not_found) + end + + it "does not set end_date on the notification" do + request + notification.reload + expect(notification.end_date).to be_nil + end + end end end