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 @@
-
<% 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!