diff --git a/app/controllers/case_logs_controller.rb b/app/controllers/case_logs_controller.rb index f8bef385a..d6af500a2 100644 --- a/app/controllers/case_logs_controller.rb +++ b/app/controllers/case_logs_controller.rb @@ -105,7 +105,7 @@ private question_params = params["case_log"][question_key] next unless question_params - if question_info["type"] == "checkbox" + if ["checkbox", "validation_override"].include?(question_info["type"]) question_info["answer_options"].keys.reject { |x| x.match(/divider/) }.each do |option| result[option] = question_params.include?(option) end diff --git a/app/controllers/soft_validations_controller.rb b/app/controllers/soft_validations_controller.rb new file mode 100644 index 000000000..ad28ea25e --- /dev/null +++ b/app/controllers/soft_validations_controller.rb @@ -0,0 +1,20 @@ +class SoftValidationsController < ApplicationController + def show + @case_log = CaseLog.find(params[:case_log_id]) + page_key = request.env["PATH_INFO"].split("/")[-2] + form = FormHandler.instance.get_form("2021_2022") + page = form.all_pages[page_key] + if page_requires_soft_validation_override?(page) + errors = @case_log.soft_errors.values.first + render json: { show: true, label: errors.message, hint: errors.hint_text } + else + render json: { show: false } + end + end + +private + + def page_requires_soft_validation_override?(page) + @case_log.soft_errors.present? && @case_log.soft_errors.keys.first == page["soft_validations"]&.keys&.first + end +end diff --git a/app/javascript/controllers/soft_validations_controller.js b/app/javascript/controllers/soft_validations_controller.js new file mode 100644 index 000000000..f25331411 --- /dev/null +++ b/app/javascript/controllers/soft_validations_controller.js @@ -0,0 +1,30 @@ +import { Controller } from "@hotwired/stimulus" + +export default class extends Controller { + initialize() { + let url = window.location.href + "/soft_validations" + let xhr = new XMLHttpRequest() + let div = document.getElementById("soft-validations") + xhr.open("GET", url, true) + xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded") + xhr.onreadystatechange = function () { + if (this.readyState == 4 && this.status == 200) { + let response = JSON.parse(this.response) + if(response["show"]){ + div.style.display = "block" + let innerHTML = div.innerHTML + innerHTML = innerHTML.replace("soft-validations-placeholder-message", response["label"]) + innerHTML = innerHTML.replace("soft-validations-placeholder-hint-text", response["hint"]) + div.innerHTML = innerHTML + } else { + div.style.display = "none" + let buttons = document.getElementsByName(`case_log[override_net_income_validation][]`) + Object.entries(buttons).forEach(([idx, button]) => { + button.checked = false; + }) + } + } + } + xhr.send() + } +} diff --git a/app/views/form/_validation_override_question.html.erb b/app/views/form/_validation_override_question.html.erb index 947791e75..5459844e0 100644 --- a/app/views/form/_validation_override_question.html.erb +++ b/app/views/form/_validation_override_question.html.erb @@ -1,11 +1,11 @@ -
- <%= f.govuk_check_boxes_fieldset @case_log.soft_errors.keys.first, - legend: { text: @case_log.soft_errors.values.first.message, size: "l" }, - hint: { text: @case_log.soft_errors.values.first.hint_text } do %> + diff --git a/app/views/form/page.html.erb b/app/views/form/page.html.erb index dca0b7672..188b16cda 100644 --- a/app/views/form/page.html.erb +++ b/app/views/form/page.html.erb @@ -1,7 +1,5 @@ - - <% content_for :before_content do %> - <%= link_to 'Back', :back, class: "govuk-back-link" %> + <%= link_to 'Back', 'javascript:history.back()', class: "govuk-back-link" %> <% end %> <%= turbo_frame_tag "case_log_form", target: "_top" do %> @@ -19,8 +17,8 @@
<% end %> - <% if @case_log.soft_errors.present? && @case_log.soft_errors.keys.first == page_info["soft_validations"]&.keys&.first %> - <%= render partial: "form/validation_override_question", locals: { f: f } %> + <% if page_info["soft_validations"]&.keys&.first %> + <%= render partial: "form/validation_override_question", locals: { f: f, page_key: page_key, page_info: page_info } %> <% end %> <%= f.hidden_field :page, value: page_key %> diff --git a/config/routes.rb b/config/routes.rb index 63163937b..3bbc0e161 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -11,6 +11,7 @@ Rails.application.routes.draw do resources :case_logs do form.all_pages.keys.map do |page| get page.to_s, to: "case_logs##{page}" + get "#{page}/soft_validations", to: "soft_validations#show" end form.all_subsections.keys.map do |subsection| get "#{subsection}/check_answers", to: "case_logs#check_answers" diff --git a/spec/features/case_log_spec.rb b/spec/features/case_log_spec.rb index f46a64a3e..4d292d01e 100644 --- a/spec/features/case_log_spec.rb +++ b/spec/features/case_log_spec.rb @@ -216,6 +216,17 @@ RSpec.describe "Test Features" do click_link(text: "Back") expect(page).to have_field("case-log-tenant-code-field") end + + it "doesn't get stuck in infinite loops", js: true do + visit("/case_logs") + visit("/case_logs/#{id}/net_income") + fill_in("case-log-net-income-field", with: 740) + choose("case-log-net-income-frequency-weekly-field", allow_label_click: true) + click_button("Save and continue") + click_link(text: "Back") + click_link(text: "Back") + expect(page).to have_current_path("/case_logs") + end end end @@ -230,7 +241,7 @@ RSpec.describe "Test Features" do end end - context "when changing an answer from the check answers page" do + context "when changing an answer from the check answers page", js: true do it "the back button routes correctly" do visit("/case_logs/#{id}/household_characteristics/check_answers") first("a", text: /Answer/).click @@ -388,12 +399,13 @@ RSpec.describe "Test Features" do let(:income_over_soft_limit) { 750 } let(:income_under_soft_limit) { 700 } - it "prompts the user to confirm the value is correct" do + it "prompts the user to confirm the value is correct", js: true do visit("/case_logs/#{case_log.id}/net_income") fill_in("case-log-net-income-field", with: income_over_soft_limit) choose("case-log-net-income-frequency-weekly-field", allow_label_click: true) click_button("Save and continue") expect(page).to have_content("Are you sure this is correct?") + binding.pry check("case-log-override-net-income-validation-override-net-income-validation-field", allow_label_click: true) click_button("Save and continue") expect(page).to have_current_path("/case_logs/#{case_log.id}/net_income_uc_proportion") diff --git a/spec/rails_helper.rb b/spec/rails_helper.rb index 7a6a17442..18f1b0f05 100644 --- a/spec/rails_helper.rb +++ b/spec/rails_helper.rb @@ -9,7 +9,7 @@ require "capybara/rspec" require "database_cleaner/active_record" # Comment to run `js: true specs` with visible browser interaction -Capybara.javascript_driver = :selenium_headless +# Capybara.javascript_driver = :selenium_headless # Add additional requires below this line. Rails is not loaded until this point!