diff --git a/app/helpers/numeric_questions_helper.rb b/app/helpers/numeric_questions_helper.rb
new file mode 100644
index 000000000..464f42723
--- /dev/null
+++ b/app/helpers/numeric_questions_helper.rb
@@ -0,0 +1,12 @@
+module NumericQuestionsHelper
+ def numeric_question_html_attributes(question)
+ return {} if question["fields-to-add"].blank? || question["result-field"].blank?
+
+ {
+ "data-controller": "numeric-question",
+ "data-action": "numeric-question#calculateFields",
+ "data-target": "#{question['result-field'].to_s.dasherize}-field",
+ "data-calculated": question["fields-to-add"].to_json,
+ }
+ end
+end
diff --git a/app/javascript/controllers/numeric_question_controller.js b/app/javascript/controllers/numeric_question_controller.js
new file mode 100644
index 000000000..6a0a58d78
--- /dev/null
+++ b/app/javascript/controllers/numeric_question_controller.js
@@ -0,0 +1,12 @@
+import { Controller } from "@hotwired/stimulus"
+
+export default class extends Controller {
+ calculateFields() {
+ const affectedField = this.element.dataset.target;
+ const fieldsToAdd = JSON.parse(this.element.dataset.calculated).map(x => `${x.replaceAll("_","-")}-field`);
+ const valuesToAdd = fieldsToAdd.map(x => document.getElementById(x).value).filter(x => x);
+ const newValue = valuesToAdd.map(x => parseInt(x)).reduce((a, b) => a + b, 0);
+ const elementToUpdate = document.getElementById(affectedField);
+ elementToUpdate.value = newValue;
+ }
+}
diff --git a/app/views/form/_numeric_question.html.erb b/app/views/form/_numeric_question.html.erb
index 1b98ed158..6de29a111 100644
--- a/app/views/form/_numeric_question.html.erb
+++ b/app/views/form/_numeric_question.html.erb
@@ -1,5 +1,7 @@
<%= f.govuk_number_field question_key,
hint: { text: question["hint_text"] },
label: { text: question["header"].html_safe, size: "l"},
- min: question["min"], max: question["max"], step: question["step"], width: 20
+ min: question["min"], max: question["max"], step: question["step"],
+ width: 20, :readonly => question["readonly"],
+ **numeric_question_html_attributes(question)
%>
diff --git a/config/forms/2021_2022.json b/config/forms/2021_2022.json
index cc552eb9f..a5b3072ce 100644
--- a/config/forms/2021_2022.json
+++ b/config/forms/2021_2022.json
@@ -287,6 +287,7 @@
"header": "Has the tenant ever served in the UK armed forces?",
"hint_text": "",
"type": "radio",
+ "check_answer_label": "Armed Forces",
"answer_options": {
"0": "Yes - a regular",
"1": "Yes - a reserve",
@@ -302,6 +303,7 @@
"header": "Are they still serving?",
"hint_text": "",
"type": "radio",
+ "check_answer_label": "When did they leave the Armed Forces?",
"answer_options": {
"0": "Yes",
"1": "No - they left up to 5 years ago",
@@ -313,6 +315,7 @@
"header": "Were they seriously injured or ill as a result of their service?",
"hint_text": "",
"type": "radio",
+ "check_answer_label": "Has anyone in the household been seriously injured or ill as a result of their service in the armed forces?",
"answer_options": {
"0": "Yes",
"1": "No",
@@ -323,6 +326,7 @@
"header": "Was the tenant the spouse or civil partner of someone who served in the UK armed forces?",
"hint_text": "",
"type": "radio",
+ "check_answer_label": "Was the tenant the spouse or civil partner of someone who served in the UK armed forces?",
"answer_options": {
"0": "Yes - was the spouse or civil partner of a UK Armed Forces member and have separated within the last 2 years",
"1": "Yes - was the spouse or civil partner of a UK Armed Forces member who died within the last 2 years",
@@ -340,6 +344,7 @@
"header": "Does anyone in the household have any of the following that they expect to last for 12 months or more:
- Physical Condition
- Mental Health Condition
- Other Illness
",
"hint_text": "",
"type": "radio",
+ "check_answer_label": "Physical, mental health or illness in the household",
"answer_options": {
"0": "Yes",
"1": "No",
@@ -357,6 +362,7 @@
"header": "Is anyone in the household pregnant?",
"hint_text": "",
"type": "radio",
+ "check_answer_label": "Pregnancy in the household",
"answer_options": {
"0": "Yes",
"1": "No",
@@ -373,6 +379,7 @@
"header": "Are any of these affected by their condition or illness?",
"hint_text": "Select all that apply",
"type": "checkbox",
+ "check_answer_label": "Disability requirements",
"answer_options": {
"0": "Fully wheelchair accessible housing",
"1": "Wheelchair access to essential rooms",
@@ -395,6 +402,7 @@
"header": "Are any of these affected by their condition or illness?",
"hint_text": "Select all that apply",
"type": "checkbox",
+ "check_answer_label": "Conditions or illnesses",
"answer_options": {
"0": "Vision - such as blindness or partial sight",
"1": "Hearing - such as deafness or partial hearing",
@@ -1136,7 +1144,9 @@
"hint_text": "Eligible for housing benefit or Universal Credit",
"type": "numeric",
"min": 0,
- "step": 1
+ "step": 1,
+ "fields-to-add": ["basic_rent", "service_charge", "personal_service_charge", "support_charge"],
+ "result-field": "total_charge"
},
"service_charge": {
"check_answer_label": "Service Charge",
@@ -1144,7 +1154,9 @@
"hint_text": "Eligible for housing benefit or Universal Credit",
"type": "numeric",
"min": 0,
- "step": 1
+ "step": 1,
+ "fields-to-add": ["basic_rent", "service_charge", "personal_service_charge", "support_charge"],
+ "result-field": "total_charge"
},
"personal_service_charge": {
"check_answer_label": "Personal Service Charge",
@@ -1152,7 +1164,9 @@
"hint_text": "Not eligible for housing benefit or Universal Credit. For example, hot water excluding water rates.",
"type": "numeric",
"min": 0,
- "step": 1
+ "step": 1,
+ "fields-to-add": ["basic_rent", "service_charge", "personal_service_charge", "support_charge"],
+ "result-field": "total_charge"
},
"support_charge": {
"check_answer_label": "Support Charge",
@@ -1160,7 +1174,9 @@
"hint_text": "This is to fund housing-related support services included in the tenancy agreement",
"type": "numeric",
"min": 0,
- "step": 1
+ "step": 1,
+ "fields-to-add": ["basic_rent", "service_charge", "personal_service_charge", "support_charge"],
+ "result-field": "total_charge"
},
"total_charge": {
"check_answer_label": "Total Charge",
@@ -1168,7 +1184,8 @@
"hint_text": "This is the total of rent and all charges",
"type": "numeric",
"min": 0,
- "step": 1
+ "step": 1,
+ "readonly": true
},
"outstanding_amount": {
"check_answer_label": "After housing benefit and/or housing element of UC payment is received, will there be an outstanding amount for basic rent and/or benefit eligible charges?",
diff --git a/spec/features/case_log_spec.rb b/spec/features/case_log_spec.rb
index 46dde63c7..3f2b8039f 100644
--- a/spec/features/case_log_spec.rb
+++ b/spec/features/case_log_spec.rb
@@ -114,6 +114,22 @@ RSpec.describe "Test Features" do
}.from(original_value).to(answer)
end
end
+
+ it "updates total value of the rent", js: true do
+ visit("/case_logs/#{id}/rent")
+
+ fill_in("basic_rent", with: 3)
+ expect(page).to have_field("total-charge-field", with: "3")
+
+ fill_in("service_charge", with: 2)
+ expect(page).to have_field("total-charge-field", with: "5")
+
+ fill_in("personal_service_charge", with: 1)
+ expect(page).to have_field("total-charge-field", with: "6")
+
+ fill_in("support_charge", with: 4)
+ expect(page).to have_field("total-charge-field", with: "10")
+ end
end
describe "Back link directs correctly" do
diff --git a/spec/helpers/numeric_questions_helper_spec.rb b/spec/helpers/numeric_questions_helper_spec.rb
new file mode 100644
index 000000000..48877babe
--- /dev/null
+++ b/spec/helpers/numeric_questions_helper_spec.rb
@@ -0,0 +1,21 @@
+require "rails_helper"
+
+RSpec.describe NumericQuestionsHelper do
+ let(:form) { Form.new(2021, 2022) }
+ let(:questions) { form.questions_for_page("rent") }
+
+ describe "html attributes" do
+ it "returns empty hash if fields-to-add or result-field are empty " do
+ expect(numeric_question_html_attributes(questions["total_charge"])).to eq({})
+ end
+
+ it "returns html attributes if fields-to-add or result-field are not empty " do
+ expect(numeric_question_html_attributes(questions["basic_rent"])).to eq({
+ "data-controller": "numeric-question",
+ "data-action": "numeric-question#calculateFields",
+ "data-target": "#{questions['basic_rent']['result-field'].to_s.dasherize}-field",
+ "data-calculated": questions["basic_rent"]["fields-to-add"].to_json,
+ })
+ end
+ end
+end