diff --git a/app/helpers/conditional_questions_helper.rb b/app/helpers/conditional_questions_helper.rb index 5a1aa394d..2bed19f38 100644 --- a/app/helpers/conditional_questions_helper.rb +++ b/app/helpers/conditional_questions_helper.rb @@ -3,6 +3,13 @@ module ConditionalQuestionsHelper page.questions.map(&:conditional_for).compact.map(&:keys).flatten end + def find_conditional_question(page, conditional_for, answer_value) + return if conditional_for.nil? + + conditional_key = conditional_for.find { |_, conditional_value| conditional_value.include? answer_value }&.first + page.questions.find { |q| q.id == conditional_key } + end + def display_question_key_div(page, question) "style='display:none;'".html_safe if conditional_questions_for_page(page).include?(question.id) || question.requires_js end diff --git a/app/models/form/page.rb b/app/models/form/page.rb index 2fe6c00d0..333810d5a 100644 --- a/app/models/form/page.rb +++ b/app/models/form/page.rb @@ -27,6 +27,15 @@ class Form::Page subsection.enabled?(case_log) && depends_on_met(case_log) end + # We expect to render only one radio question (with conditionals) + def questions_to_render + if questions.first.type == "radio" + [questions.first] + else + questions + end + end + private def depends_on_met(case_log) diff --git a/app/views/form/_radio_question.html.erb b/app/views/form/_radio_question.html.erb index a079fc21c..dda8f010e 100644 --- a/app/views/form/_radio_question.html.erb +++ b/app/views/form/_radio_question.html.erb @@ -9,10 +9,11 @@ <% if key.starts_with?("divider") %> <%= f.govuk_radio_divider %> <% else %> - <%= f.govuk_radio_button question.id, val, label: { text: val }, **stimulus_html_attributes(question) do %> - <% conditional_key = question.conditional_for&.find { |_, cval| cval.include? val }&.first %> - <% if conditional_key %> - <% conditional_question = @page.questions.find { |q| q.id == conditional_key } %> + <% conditional_question = find_conditional_question(@page, question.conditional_for, val) %> + <% if conditional_question.nil? %> + <%= f.govuk_radio_button question.id, val, label: { text: val }, **stimulus_html_attributes(question) %> + <% else %> + <%= f.govuk_radio_button question.id, val, label: { text: val }, **stimulus_html_attributes(question) do %> <%= render partial: "#{conditional_question.type}_question", locals: { question: conditional_question, caption: caption, page_header: page_header, f: f } %> <% end %> <% end %> diff --git a/app/views/form/page.html.erb b/app/views/form/page.html.erb index d50705ab1..4b0787bef 100644 --- a/app/views/form/page.html.erb +++ b/app/views/form/page.html.erb @@ -29,8 +29,8 @@ <%= form_with model: @case_log, url: form_case_log_path(@case_log), method: "post" do |f| %> <%= f.govuk_error_summary %> - <% @page.questions.map do |question| %> -
<%= display_question_key_div(@page, question) %> > + <% @page.questions_to_render.map do |question| %> +
> <% if question.read_only? %>
<% end %> diff --git a/app/webpacker/controllers/conditional_question_controller.js b/app/webpacker/controllers/conditional_question_controller.js index 53293543d..dcb5c05d7 100644 --- a/app/webpacker/controllers/conditional_question_controller.js +++ b/app/webpacker/controllers/conditional_question_controller.js @@ -23,6 +23,7 @@ export default class extends Controller { Object.entries(conditional_for).map(([targetQuestion, conditions]) => { let div = document.getElementById(targetQuestion + "_div") + if (div == null) return; if(conditions.includes(selectedValue)) { div.style.display = "block" } else { diff --git a/app/webpacker/packs/application.js b/app/webpacker/packs/application.js index dc909ede8..042a803cd 100644 --- a/app/webpacker/packs/application.js +++ b/app/webpacker/packs/application.js @@ -5,15 +5,11 @@ require.context('govuk-frontend/govuk/assets') import '../styles/application.scss' -import Rails from "@rails/ujs" import * as ActiveStorage from "@rails/activestorage" import "channels" -import { initAll } from 'govuk-frontend' +import "controllers" import "@hotwired/turbo-rails" +import { initAll } from 'govuk-frontend' - -Rails.start() ActiveStorage.start() initAll() - -import "controllers" diff --git a/config/application.rb b/config/application.rb index 7bdbfb93e..65810044b 100644 --- a/config/application.rb +++ b/config/application.rb @@ -33,5 +33,7 @@ module DataCollector # config.eager_load_paths << Rails.root.join("extras") config.exceptions_app = routes + + config.action_view.form_with_generates_remote_forms = false end end diff --git a/package.json b/package.json index 56400d918..524c3406e 100644 --- a/package.json +++ b/package.json @@ -12,7 +12,6 @@ "@hotwired/turbo-rails": "^7.1.0", "@rails/actioncable": "^6.0.0", "@rails/activestorage": "^6.0.0", - "@rails/ujs": "^6.0.0", "@rails/webpacker": "5.4.0", "accessible-autocomplete": "^2.0.3", "chart.js": "^3.6.0", diff --git a/yarn.lock b/yarn.lock index d13308c56..6d214eae2 100644 --- a/yarn.lock +++ b/yarn.lock @@ -970,11 +970,6 @@ dependencies: spark-md5 "^3.0.0" -"@rails/ujs@^6.0.0": - version "6.1.4" - resolved "https://registry.yarnpkg.com/@rails/ujs/-/ujs-6.1.4.tgz#093d5341595a02089ed309dec40f3c37da7b1b10" - integrity sha512-O3lEzL5DYbxppMdsFSw36e4BHIlfz/xusynwXGv3l2lhSlvah41qviRpsoAlKXxl37nZAqK+UUF5cnGGK45Mfw== - "@rails/webpacker@5.4.0": version "5.4.0" resolved "https://registry.yarnpkg.com/@rails/webpacker/-/webpacker-5.4.0.tgz#2c64a9ea7e85d2a33e50e86319fe6751df0c47e8"