diff --git a/README.md b/README.md index ab098aa84..c1afaf7f5 100644 --- a/README.md +++ b/README.md @@ -163,7 +163,10 @@ Assumptions made by the format: ## JSON Form Validation against Schema To validate the form JSON against the schema you can run: -`rake form_definition:validate["config/forms/2021_22.json"]` +`rake form_definition:validate["config/forms/2021_2022.json"]` + +n.b. You may have to escape square brackets in zsh +`rake form_definition:validate\["config/forms/2021_2022.json"\]` This will validate the given form definition against the schema in `config/forms/schema/generic.json`. diff --git a/app/controllers/case_logs_controller.rb b/app/controllers/case_logs_controller.rb index 8eb60af6a..1f6936520 100644 --- a/app/controllers/case_logs_controller.rb +++ b/app/controllers/case_logs_controller.rb @@ -107,6 +107,8 @@ private day = params["case_log"]["#{question_key}(3i)"] month = params["case_log"]["#{question_key}(2i)"] year = params["case_log"]["#{question_key}(1i)"] + next unless day.present? && month.present? && year.present? + result[question_key] = Date.new(year.to_i, month.to_i, day.to_i) end next unless question_params diff --git a/app/helpers/check_answers_helper.rb b/app/helpers/check_answers_helper.rb index 1cc1bc65e..6282f9d06 100644 --- a/app/helpers/check_answers_helper.rb +++ b/app/helpers/check_answers_helper.rb @@ -60,6 +60,8 @@ module CheckAnswersHelper case_log[question_key].blank? || !condition.include?(case_log[question_key]) when "radio" case_log[question_key].blank? || !condition.include?(case_log[question_key]) + when "select" + case_log[question_key].blank? || !condition.include?(case_log[question_key]) else raise "Not implemented yet" end diff --git a/app/javascript/controllers/soft_validations_controller.js b/app/javascript/controllers/soft_validations_controller.js index a408e4460..2c223ce1c 100644 --- a/app/javascript/controllers/soft_validations_controller.js +++ b/app/javascript/controllers/soft_validations_controller.js @@ -5,7 +5,7 @@ export default class extends Controller { initialize() { let url = window.location.href + "/soft_validations" - this.fetch_retry(url, { headers: { accept: "application/json" } }, 2) + this.fetch_retry(url, { headers: { accept: "application/json" } }, 5) } fetch_retry(url, options, n) { diff --git a/app/javascript/styles/_task-list.scss b/app/javascript/styles/_task-list.scss index 755836e3f..603a6d55c 100644 --- a/app/javascript/styles/_task-list.scss +++ b/app/javascript/styles/_task-list.scss @@ -81,11 +81,6 @@ } } -// turbo-frame { -// display: block; -// border: 1px solid blue -// } - .app-task-list__item:target, .tasklist_item_highlight{ background-color: $govuk-focus-colour; diff --git a/app/javascript/styles/application.scss b/app/javascript/styles/application.scss index 4caf03bda..7e1158bd7 100644 --- a/app/javascript/styles/application.scss +++ b/app/javascript/styles/application.scss @@ -11,4 +11,11 @@ $govuk-image-url-function: frontend-image-url; @import "~govuk-frontend/govuk/all"; -@import '_task-list' +@import '_task-list'; + +$govuk-global-styles: true; + +// turbo-frame { +// display: block; +// border: 1px solid blue +// } diff --git a/app/models/case_log.rb b/app/models/case_log.rb index f373745fd..718e3fda2 100644 --- a/app/models/case_log.rb +++ b/app/models/case_log.rb @@ -10,7 +10,7 @@ class CaseLogValidator < ActiveModel::Validator # If we've come from the form UI we only want to validate the specific fields # that have just been submitted. If we're submitting a log via API or Bulk Upload # we want to validate all data fields. - page_to_validate = options[:page] + page_to_validate = record.page if page_to_validate public_send("validate_#{page_to_validate}", record) if respond_to?("validate_#{page_to_validate}") else @@ -41,7 +41,7 @@ class CaseLog < ApplicationRecord default_scope -> { kept } scope :not_completed, -> { where.not(status: "completed") } - validates_with CaseLogValidator, ({ page: @page } || {}) + validates_with CaseLogValidator before_save :update_status! attr_accessor :page diff --git a/app/views/case_logs/_log_list.html.erb b/app/views/case_logs/_log_list.html.erb index 3edfabe06..c0f856f09 100644 --- a/app/views/case_logs/_log_list.html.erb +++ b/app/views/case_logs/_log_list.html.erb @@ -12,7 +12,7 @@ <% case_logs.map do |log| %> - <%= link_to log.id, case_log_path(log) %> + <%= link_to log.id, case_log_path(log), class: "govuk-link" %> <%= log.property_postcode %> diff --git a/app/views/case_logs/edit.html.erb b/app/views/case_logs/edit.html.erb index 551ce0cb5..349cc6914 100644 --- a/app/views/case_logs/edit.html.erb +++ b/app/views/case_logs/edit.html.erb @@ -5,11 +5,11 @@ <%= @case_log.id %>

This submission is - <%= @case_log.status %>

+ <%= @case_log.status.to_s.humanize %>

You've completed <%= get_subsections_count(@form, @case_log, :completed) %> of <%= get_subsections_count(@form, @case_log, :all) %> sections.

<% next_incomplete_section=get_next_incomplete_section(@form, @case_log) %> - > diff --git a/app/views/form/check_answers.html.erb b/app/views/form/check_answers.html.erb index 49ebeda0f..26b153f8f 100644 --- a/app/views/form/check_answers.html.erb +++ b/app/views/form/check_answers.html.erb @@ -10,7 +10,7 @@ <%end %> <%end %> <% end %> - <%= form_with action: '/case_logs', method: "next_page", builder: GOVUKDesignSystemFormBuilder::FormBuilder do |f| %> + <%= form_with model: @case_log, method: "get", builder: GOVUKDesignSystemFormBuilder::FormBuilder do |f| %> <%= f.govuk_submit "Save and continue" %> <% end %> diff --git a/app/views/form/page.html.erb b/app/views/form/page.html.erb index 2a5793703..d47e89e7b 100644 --- a/app/views/form/page.html.erb +++ b/app/views/form/page.html.erb @@ -3,25 +3,28 @@ <% end %> <%= turbo_frame_tag "case_log_form", target: "_top" do %> +

+
+ <% if page_info["header"].present? %> +

+ <%= page_info["header"] %> +

+ <% end %> + <%= form_with model: @case_log, method: "submit_form", builder: GOVUKDesignSystemFormBuilder::FormBuilder do |f| %> + <%= f.govuk_error_summary %> + <% page_info["questions"].map do |question_key, question| %> +
<%= display_question_key_div(page_info, question_key) %> > + <%= render partial: "form/#{question["type"]}_question", locals: { question_key: question_key.to_sym, question: question, f: f } %> +
+ <% end %> - <% if page_info["header"].present? %> -

- <%= page_info["header"] %> -

- <% end %> - <%= form_with model: @case_log, url: form_case_log_path(@case_log), method: "post", builder: GOVUKDesignSystemFormBuilder::FormBuilder do |f| %> - <%= f.govuk_error_summary %> - <% page_info["questions"].map do |question_key, question| %> -
<%= display_question_key_div(page_info, question_key) %> > - <%= render partial: "form/#{question["type"]}_question", locals: { question_key: question_key.to_sym, question: question, f: f } %> -
- <% end %> + <% 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 %> - <% 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 %> - <%= f.govuk_submit "Save and continue" %> - <% end %> + <%= f.hidden_field :page, value: page_key %> + <%= f.govuk_submit "Save and continue" %> + <% end %> +
+
<% end %> diff --git a/app/views/layouts/_footer.html.erb b/app/views/layouts/_footer.html.erb new file mode 100644 index 000000000..ffba80da2 --- /dev/null +++ b/app/views/layouts/_footer.html.erb @@ -0,0 +1,48 @@ +
+ + +
diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb index 343307b55..7ea45b6e4 100644 --- a/app/views/layouts/application.html.erb +++ b/app/views/layouts/application.html.erb @@ -72,34 +72,7 @@ diff --git a/lib/tasks/form_definition.rake b/lib/tasks/form_definition.rake index 7061acc56..8155f76e1 100644 --- a/lib/tasks/form_definition.rake +++ b/lib/tasks/form_definition.rake @@ -12,13 +12,11 @@ def get_all_form_paths(directories) end namespace :form_definition do - desc "Validate JSON against Generic Form Schema" + desc "Validate all JSON against Generic Form Schema" task validate_all: :environment do - puts Rails.root.to_s - directories = ["config/forms", "spec/fixtures/forms"] - paths = get_all_form_paths(directories) + ["config/forms/schema/generic.json"] + paths = get_all_form_paths(directories) paths.each do |path| Rake::Task["form_definition:validate"].reenable @@ -26,11 +24,26 @@ namespace :form_definition do end end + desc "Validate Single JSON against Generic Form Schema" + task :validate, %i[path] => :environment do |_task, args| + path = Rails.root.join("config/forms/schema/generic.json") + file = File.open(path) + schema = JSON.parse(file.read) + meta_schema = JSON::Validator.validator_for_name("draft4").metaschema + + puts path + + if JSON::Validator.validate(meta_schema, schema) + puts "Schema Definition is Valid" + else + puts "Schema Definition in #{path} is not valid against draft4 json schema." + next + end + path = Rails.root.join(args.path) file = File.open(path) form_definition = JSON.parse(file.read) - schema = JSON::Validator.validator_for_name("draft4").metaschema puts path puts JSON::Validator.fully_validate(schema, form_definition, strict: true) diff --git a/spec/features/case_log_spec.rb b/spec/features/case_log_spec.rb index b48572d62..5552b0c85 100644 --- a/spec/features/case_log_spec.rb +++ b/spec/features/case_log_spec.rb @@ -43,7 +43,7 @@ RSpec.describe "Test Features" do it "displays a tasklist header" do visit("/case_logs/#{id}") expect(page).to have_content("Tasklist for log #{id}") - expect(page).to have_content("This submission is #{status}") + expect(page).to have_content("This submission is #{status.humanize}") end it "displays a section status" do diff --git a/spec/lib/tasks/form_definition_validator_spec.rb b/spec/lib/tasks/form_definition_validator_spec.rb index 55479fe7b..c61b39c3e 100644 --- a/spec/lib/tasks/form_definition_validator_spec.rb +++ b/spec/lib/tasks/form_definition_validator_spec.rb @@ -11,7 +11,7 @@ describe "rake form_definition:validate_all", type: :task do end it "runs the validate task for each form definition in the project" do - expect(Rake::Task["form_definition:validate"]).to receive(:invoke).exactly(5).times + expect(Rake::Task["form_definition:validate"]).to receive(:invoke).exactly(4).times task.invoke end end @@ -22,11 +22,12 @@ describe "rake form_definition:validate", type: :task do before do Rake.application.rake_require("tasks/form_definition") Rake::Task.define_task(:environment) + allow(JSON::Validator).to receive(:validate).and_return(true) task.reenable end it "runs the validate task for the given form definition" do - expect(JSON::Validator).to receive(:validate!).at_least(1).time + expect(JSON::Validator).to receive(:validate!).at_least(2).times task.invoke("config/forms/2021_2022.json") end end