diff --git a/app/controllers/notifications_controller.rb b/app/controllers/notifications_controller.rb index 6691d472c..d0181ead6 100644 --- a/app/controllers/notifications_controller.rb +++ b/app/controllers/notifications_controller.rb @@ -1,16 +1,21 @@ class NotificationsController < ApplicationController before_action :authenticate_user!, except: %i[show] before_action :authenticate_scope!, except: %i[show dismiss] + before_action :find_notification, except: %i[new create] + + rescue_from ActiveRecord::RecordNotFound, with: :render_not_found def dismiss - @notification = Notification.find_by(id: params[:notification_id]) @notification.mark_as_read! for: current_user redirect_back(fallback_location: root_path) end def show - @notification = current_user&.support? ? Notification.find_by(id: params[:id]) : Notification.active.find_by(id: params[:id]) - if @notification&.show_additional_page && (@notification&.show_on_unauthenticated_pages || current_user) + if !@notification.show_on_unauthenticated_pages && !current_user + render_not_found and return + end + + if @notification.show_additional_page render "show" else redirect_back(fallback_location: root_path) @@ -31,21 +36,7 @@ class NotificationsController < ApplicationController end end - def check_answers - @notification = Notification.find_by(id: params[:notification_id]) - render_not_found and return unless @notification - - render "notifications/check_answers" - end - - def edit - @notification = Notification.find_by(id: params[:id]) - end - def update - @notification = Notification.find_by(id: params[:id]) - render_not_found and return unless @notification - start_now = params[:notification][:start_now] if @notification.errors.empty? && @notification.update(notification_model_params) @@ -62,6 +53,12 @@ class NotificationsController < ApplicationController end end + def delete + @notification.update!(end_date: Time.zone.now) + flash[:notice] = "The notification has been deleted" + redirect_to root_path + end + private def notification_params @@ -84,4 +81,13 @@ private model_params end + + def find_notification + id = params[:id] || params[:notification_id] + @notification = current_user&.support? ? Notification.find_by(id:) : Notification.active.find_by(id:) + + raise ActiveRecord::RecordNotFound unless @notification + + @notification + end end diff --git a/app/helpers/notifications_helper.rb b/app/helpers/notifications_helper.rb index 67206001c..318918134 100644 --- a/app/helpers/notifications_helper.rb +++ b/app/helpers/notifications_helper.rb @@ -27,11 +27,18 @@ module NotificationsHelper render_normal_markdown(title) end - def render_for_page(title, page_content) - content = page_content - unless /\A\s*#[^#]/.match?(page_content) - content = "# #{title}\n#{page_content}" - end + def render_for_page(notification) + content_includes_own_title = /\A\s*#[^#]/.match?(notification.page_content) + return render_normal_markdown(notification.page_content) if content_includes_own_title + + content = "# #{notification.title}\n#{notification.page_content}" + 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 diff --git a/app/presenters/homepage_presenter.rb b/app/presenters/homepage_presenter.rb index 1cb784e3a..3b3314667 100644 --- a/app/presenters/homepage_presenter.rb +++ b/app/presenters/homepage_presenter.rb @@ -2,7 +2,7 @@ class HomepagePresenter include Rails.application.routes.url_helpers include CollectionTimeHelper - attr_reader :current_year_in_progress_lettings_data, :current_year_completed_lettings_data, :current_year_in_progress_sales_data, :current_year_completed_sales_data, :last_year_in_progress_lettings_data, :last_year_completed_lettings_data, :last_year_in_progress_sales_data, :last_year_completed_sales_data, :incomplete_schemes_data + attr_reader :current_year_in_progress_lettings_data, :current_year_completed_lettings_data, :current_year_in_progress_sales_data, :current_year_completed_sales_data, :last_year_in_progress_lettings_data, :last_year_completed_lettings_data, :last_year_in_progress_sales_data, :last_year_completed_sales_data, :incomplete_schemes_data, :active_notifications def initialize(user) @user = user @@ -25,6 +25,7 @@ class HomepagePresenter path: schemes_path(status: [:incomplete], owning_organisation_select: "all"), } end + @active_notifications = Notification.active if @user.support? end def title_text_for_user diff --git a/app/views/home/index.html.erb b/app/views/home/index.html.erb index bb4792e68..e55dc6c99 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", locals: { active_notifications: @homepage_presenter.active_notifications } %> <% end %>
diff --git a/app/views/notifications/_form.html.erb b/app/views/notifications/_form.html.erb index b65692d59..76a275234 100644 --- a/app/views/notifications/_form.html.erb +++ b/app/views/notifications/_form.html.erb @@ -26,7 +26,7 @@ <% end %> <% end %> - View <%= govuk_link_to "markdown syntax guide at markdownguide.org", "https://www.markdownguide.org/basic-syntax/" %> + <%= govuk_link_to "Find out more about using Markdown at Markdown Guide", "https://www.markdownguide.org/basic-syntax/" %> <%= f.govuk_submit "Continue" %>
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..522bc2840 --- /dev/null +++ b/app/views/notifications/_notification_home_section.html.erb @@ -0,0 +1,17 @@ +
+

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

+ <% active_notifications.each do |notification| %> +
+
+ <%== render_for_home(notification) %> +
+
+ <%= govuk_link_to("Delete notification", notification_delete_confirmation_path(notification), class: "app-!-colour-red") %> +
+
+ <% 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..4107c3050 --- /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/app/views/notifications/show.html.erb b/app/views/notifications/show.html.erb index eda582d90..a3933db55 100644 --- a/app/views/notifications/show.html.erb +++ b/app/views/notifications/show.html.erb @@ -5,7 +5,7 @@
- <%== render_for_page(@notification.title, @notification.page_content) %> + <%== render_for_page(@notification) %>

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