diff --git a/app/components/check_answers_summary_list_card_component.html.erb b/app/components/check_answers_summary_list_card_component.html.erb index 4f3df47fa..4c1f9aa2d 100644 --- a/app/components/check_answers_summary_list_card_component.html.erb +++ b/app/components/check_answers_summary_list_card_component.html.erb @@ -36,7 +36,7 @@ <% if @log.collection_period_open_for_editing? %> <% row.with_action( text: question.action_text(log, correcting_hard_validation: @correcting_hard_validation), - href: @correcting_hard_validation ? correct_validation_action_href(question, log, applicable_questions.map(&:id)) : action_href(question, log), + href: correct_validation_action_href(question, log, applicable_questions.map(&:id), @correcting_hard_validation), visually_hidden_text: question.check_answer_label.to_s.downcase, ) %> <% end %> diff --git a/app/components/check_answers_summary_list_card_component.rb b/app/components/check_answers_summary_list_card_component.rb index f229b76d4..5242c7f41 100644 --- a/app/components/check_answers_summary_list_card_component.rb +++ b/app/components/check_answers_summary_list_card_component.rb @@ -34,7 +34,9 @@ class CheckAnswersSummaryListCardComponent < ViewComponent::Base send("#{log.model_name.param_key}_#{question.page.id}_path", log, referrer:) end - def correct_validation_action_href(question, log, _related_question_ids) + def correct_validation_action_href(question, log, _related_question_ids, correcting_hard_validation) + return action_href(question, log) unless correcting_hard_validation + if question.displayed_as_answered?(log) send("#{log.model_name.param_key}_confirm_clear_answer_path", log, question_id: question.id) else diff --git a/app/controllers/check_errors_controller.rb b/app/controllers/check_errors_controller.rb index b828a4cd9..f246e0b01 100644 --- a/app/controllers/check_errors_controller.rb +++ b/app/controllers/check_errors_controller.rb @@ -8,9 +8,21 @@ 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| + question = @log.form.get_question(id, @log) + next if question.subsection.id == "setup" + + question.page.questions.map(&:id) + }.flatten.compact + + 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..ed7e8ba58 100644 --- a/app/controllers/form_controller.rb +++ b/app/controllers/form_controller.rb @@ -230,7 +230,9 @@ private if params[@log.model_name.param_key]["check_errors"] @page = form.get_page(params[@log.model_name.param_key]["page"]) flash[:notice] = "You have successfully updated #{@page.questions.map(&:check_answer_label).to_sentence}" - return send("#{@log.class.name.underscore}_#{params[@log.model_name.param_key]['original_page_id']}_path", @log, { check_errors: true, related_question_ids: params[@log.model_name.param_key]["related_question_ids"].split(" ") }.compact) + original_page_id = params[@log.model_name.param_key]["original_page_id"] + related_question_ids = params[@log.model_name.param_key]["related_question_ids"].split(" ") + return send("#{@log.class.name.underscore}_#{original_page_id}_path", @log, { check_errors: true, related_question_ids: }.compact) end if params["referrer"] == "check_errors" @@ -402,11 +404,16 @@ 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| + question = @log.form.get_question(question_id, @log) + next if question.subsection.id == "setup" + + question.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/helpers/check_errors_helper.rb b/app/helpers/check_errors_helper.rb new file mode 100644 index 000000000..6d1ff0166 --- /dev/null +++ b/app/helpers/check_errors_helper.rb @@ -0,0 +1,11 @@ +module CheckErrorsHelper + include GovukLinkHelper + + def check_errors_answer_text(question, log) + question.displayed_as_answered?(log) ? "Change" : "Answer" + end + + def check_errors_answer_link(log, question, page, applicable_questions) + send("#{log.model_name.param_key}_#{question.page.id}_path", log, referrer: "check_errors", original_page_id: page.id, related_question_ids: applicable_questions.map(&:id)) + end +end 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..27fa3ea0c 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) %> +
@@ -48,10 +48,10 @@ <% end %>
- <% if question.displayed_as_answered?(@log) %> - + <% if !question.displayed_as_answered?(@log) || question.subsection.id == "setup" %> + <%= govuk_link_to check_errors_answer_text(question, @log), check_errors_answer_link(@log, question, @page, applicable_questions) %> <% else %> - <%= govuk_link_to "Answer", send("#{@log.model_name.param_key}_#{question.page.id}_path", @log, referrer: "check_errors", original_page_id: @page.id, related_question_ids: applicable_questions.map(&:id)) %> + <% end %>
diff --git a/spec/requests/check_errors_controller_spec.rb b/spec/requests/check_errors_controller_spec.rb index 179897008..f0f1887aa 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 @@ -83,9 +83,10 @@ RSpec.describe CheckErrorsController, type: :request do post "/sales-logs/#{sales_log.id}/buyer-1-income", params: params 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") + it "displays correct clear and change links" do + expect(page.all(:button, value: "Clear").count).to eq(2) + expect(page).to have_link("Change", count: 1) + expect(page).to have_button("Clear all") end end end @@ -179,6 +180,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 3 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 +280,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 +308,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 +388,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).not_to eq(nil) + end + end + end + end end