From b6787c6ea1951675ed48de4f64dae81e9bae41e6 Mon Sep 17 00:00:00 2001 From: Kat Date: Tue, 25 Jun 2024 16:28:12 +0100 Subject: [PATCH] Allow clearing all error questions --- app/controllers/check_errors_controller.rb | 10 +- app/controllers/form_controller.rb | 10 +- .../confirm_clear_all_answers.html.erb | 32 +++++ .../confirm_clear_answer.html.erb | 2 +- app/views/form/check_errors.html.erb | 2 +- spec/requests/check_errors_controller_spec.rb | 134 +++++++++++++++++- 6 files changed, 177 insertions(+), 13 deletions(-) create mode 100644 app/views/check_errors/confirm_clear_all_answers.html.erb diff --git a/app/controllers/check_errors_controller.rb b/app/controllers/check_errors_controller.rb index b828a4cd9..0cf30efea 100644 --- a/app/controllers/check_errors_controller.rb +++ b/app/controllers/check_errors_controller.rb @@ -8,9 +8,15 @@ class CheckErrorsController < ApplicationController return render_not_found unless @log @related_question_ids = params[@log.model_name.param_key].keys.reject { |id| id == "page_id" } - question_id = @related_question_ids.find { |id| !params[id].nil? } - @question = @log.form.get_question(question_id, @log) @page = @log.form.get_page(params[@log.model_name.param_key]["page_id"]) + + if params["clear_all"] + @questions_to_clear = @related_question_ids.map { |id| @log.form.get_question(id, @log).page.questions.map(&:id) }.flatten + render :confirm_clear_all_answers + else + question_id = @related_question_ids.find { |id| !params[id].nil? } + @question = @log.form.get_question(question_id, @log) + end end private diff --git a/app/controllers/form_controller.rb b/app/controllers/form_controller.rb index 8c4fd9f49..64c73e689 100644 --- a/app/controllers/form_controller.rb +++ b/app/controllers/form_controller.rb @@ -402,11 +402,13 @@ private end def render_check_errors_page - if params[@log.model_name.param_key]["clear_question_id"] - question_id = params[@log.model_name.param_key]["clear_question_id"] - @log.form.get_question(question_id, @log).page.questions.map(&:id).each { |id| @log[id] = nil } + if params[@log.model_name.param_key]["clear_question_ids"].present? + question_ids = params[@log.model_name.param_key]["clear_question_ids"].split(" ") + question_ids.each do |question_id| + @log.form.get_question(question_id, @log).page.questions.map(&:id).each { |id| @log[id] = nil } + end @log.save! - @questions = params[@log.model_name.param_key].keys.reject { |id| %w[clear_question_id page].include?(id) }.map { |id| @log.form.get_question(id, @log) } + @questions = params[@log.model_name.param_key].keys.reject { |id| %w[clear_question_ids page].include?(id) }.map { |id| @log.form.get_question(id, @log) } else responses_for_page = responses_for_page(@page) @log.assign_attributes(responses_for_page) diff --git a/app/views/check_errors/confirm_clear_all_answers.html.erb b/app/views/check_errors/confirm_clear_all_answers.html.erb new file mode 100644 index 000000000..f49ea98cd --- /dev/null +++ b/app/views/check_errors/confirm_clear_all_answers.html.erb @@ -0,0 +1,32 @@ +<% content_for :before_content do %> + <% content_for :title, "Are you sure you want to clear all?" %> +<% end %> + +
+
+

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

+

You've selected <%= @questions_to_clear.count %> answers to clear

+ + <%= govuk_warning_text(text: "You will not be able to undo this action") %> + <%= form_with model: @log, url: send("#{@log.model_name.param_key}_#{@page.id}_path", @log), method: "post", local: true do |f| %> + + <% @related_question_ids.each do |id| %> + <%= f.hidden_field id, value: @log[id] %> + <% end %> + + <%= f.hidden_field :clear_question_ids, value: @questions_to_clear %> + <%= f.hidden_field :page, value: @page.id %> + +
+ <%= f.govuk_submit "Confirm and continue", name: "check_errors" %> + <%= govuk_button_link_to( + "Cancel", + "javascript:history.back()", + secondary: true, + ) %> +
+ <% end %> +
+
diff --git a/app/views/check_errors/confirm_clear_answer.html.erb b/app/views/check_errors/confirm_clear_answer.html.erb index 37d6cdc19..1ef8bc719 100644 --- a/app/views/check_errors/confirm_clear_answer.html.erb +++ b/app/views/check_errors/confirm_clear_answer.html.erb @@ -15,7 +15,7 @@ <%= f.hidden_field id, value: @log[id] %> <% end %> - <%= f.hidden_field :clear_question_id, value: @question.id %> + <%= f.hidden_field :clear_question_ids, value: [@question.id] %> <%= f.hidden_field :page, value: @page.id %>
diff --git a/app/views/form/check_errors.html.erb b/app/views/form/check_errors.html.erb index f50ddf6c1..53fb0c820 100644 --- a/app/views/form/check_errors.html.erb +++ b/app/views/form/check_errors.html.erb @@ -11,7 +11,7 @@ Make sure these answers are correct: - <%= govuk_link_to "Clear all", send("#{@log.model_name.param_key}_confirm_clear_all_answers_path", @log) %> +
diff --git a/spec/requests/check_errors_controller_spec.rb b/spec/requests/check_errors_controller_spec.rb index 179897008..e5bf6647e 100644 --- a/spec/requests/check_errors_controller_spec.rb +++ b/spec/requests/check_errors_controller_spec.rb @@ -59,7 +59,7 @@ RSpec.describe CheckErrorsController, type: :request do it "displays correct clear links" do expect(page).to have_selector("input[type=submit][value='Clear']", count: 3) - expect(page).to have_link("Clear all", href: "/lettings-logs/#{lettings_log.id}/confirm-clear-all-answers") + expect(page).to have_button("Clear all") end end @@ -84,8 +84,8 @@ RSpec.describe CheckErrorsController, type: :request do end it "displays correct clear links" do - expect(page).to have_button("Clear", count: 3) - expect(page).to have_link("Clear all", href: "/sales-logs/#{sales_log.id}/confirm-clear-all-answers") + expect(page.all(:button, value: "Clear").count).to eq(3) + expect(page).to have_button("Clear all") end end end @@ -179,6 +179,66 @@ RSpec.describe CheckErrorsController, type: :request do end end + describe "confirm clear all answers" do + context "when user is signed in" do + context "and clearing all lettings questions" do + let(:params) do + { + id: lettings_log.id, + clear_all: "Clear all", + lettings_log: { + earnings: "100000", + incfreq: "1", + hhmemb: "2", + page_id: "income_amount", + }, + } + end + + before do + sign_in user + post "/lettings-logs/#{lettings_log.id}/confirm-clear-answer", params: + end + + it "displays correct clear links" do + expect(page).to have_content("Are you sure you want to clear all") + expect(page).to have_content("You've selected 5 answers to clear") + expect(page).to have_content("You will not be able to undo this action") + expect(page).to have_link("Cancel") + expect(page).to have_button("Confirm and continue") + end + end + + context "and clearing all sales question" do + let(:params) do + { + id: sales_log.id, + clear_all: "Clear all", + sales_log: { + income1: "100000", + la: "E09000001", + ownershipsch: "1", + page_id: "buyer_1_income", + }, + } + end + + before do + sign_in user + post "/sales-logs/#{sales_log.id}/confirm-clear-answer", params: + end + + it "displays correct clear links" do + expect(page).to have_content("Are you sure you want to clear all") + expect(page).to have_content("You've selected 4 answers to clear") + expect(page).to have_content("You will not be able to undo this action") + expect(page).to have_link("Cancel") + expect(page).to have_button("Confirm and continue") + end + end + end + end + describe "clear answer" do context "when user is not signed in" do it "redirects to sign in page for lettings" do @@ -219,7 +279,7 @@ RSpec.describe CheckErrorsController, type: :request do earnings: "100000", incfreq: "1", hhmemb: "2", - clear_question_id: "hhmemb", + clear_question_ids: "hhmemb", page: "income_amount", }, check_errors: "", @@ -247,7 +307,7 @@ RSpec.describe CheckErrorsController, type: :request do income1: "100000", la: "E09000001", ownershipsch: "1", - clear_question_id: "income1", + clear_question_ids: "income1", page: "buyer_1_income", }, check_errors: "", @@ -327,4 +387,68 @@ RSpec.describe CheckErrorsController, type: :request do end end end + + describe "clear all answers" do + context "when user is signed in" do + context "and clearing all lettings question" do + let(:params) do + { + id: lettings_log.id, + lettings_log: { + earnings: "100000", + incfreq: "1", + hhmemb: "2", + clear_question_ids: "earnings incfreq hhmemb", + page: "income_amount", + }, + check_errors: "", + } + end + + before do + sign_in user + post "/lettings-logs/#{lettings_log.id}/income-amount", params: + end + + it "correctly clears the values" do + expect(page).to have_content("Make sure these answers are correct") + expect(page).to have_content("You didn’t answer this question") + expect(page.all(:button, value: "Clear").count).to eq(0) + expect(lettings_log.reload.earnings).to eq(nil) + expect(lettings_log.reload.incfreq).to eq(nil) + expect(lettings_log.reload.hhmemb).to eq(nil) + end + end + + context "and clearing all sales question" do + let(:params) do + { + id: sales_log.id, + sales_log: { + income1: "100000", + la: "E09000001", + ownershipsch: "1", + clear_question_ids: "income1 la ownershipsch", + page: "buyer_1_income", + }, + check_errors: "", + } + end + + before do + sign_in user + post "/sales-logs/#{sales_log.id}/buyer-1-income", params: + end + + it "displays correct clear links" do + expect(page).to have_content("Make sure these answers are correct") + expect(page).to have_content("You didn’t answer this question") + expect(page.all(:button, value: "Clear").count).to eq(0) + expect(sales_log.reload.income1).to eq(nil) + expect(sales_log.reload.la).to eq(nil) + expect(sales_log.reload.ownershipsch).to eq(nil) + end + end + end + end end