From bd05b8e531a64255c66862af84b0a55f085f7f1f Mon Sep 17 00:00:00 2001 From: Dushan Despotovic <dushan@madetech.com> Date: Fri, 1 Apr 2022 17:13:39 +0100 Subject: [PATCH 1/8] WIP --- app/controllers/form_controller.rb | 12 +++++- app/frontend/application.js | 10 ++++- app/frontend/styles/application.scss | 6 ++- app/views/case_logs/_tasklist.html.erb | 4 ++ app/views/form/review.html.erb | 33 +++++++++++++++ config/forms/2021_2022.json | 51 +++++++----------------- config/routes.rb | 1 + db/schema.rb | 2 +- package.json | 1 + spec/features/form/review_page_spec.rb | 34 ++++++++++++++++ spec/features/form/tasklist_page_spec.rb | 7 ++++ webpack.config.js | 2 +- yarn.lock | 22 +++++++++- 13 files changed, 141 insertions(+), 44 deletions(-) create mode 100644 app/views/form/review.html.erb create mode 100644 spec/features/form/review_page_spec.rb diff --git a/app/controllers/form_controller.rb b/app/controllers/form_controller.rb index 295a82c16..1160fcf06 100644 --- a/app/controllers/form_controller.rb +++ b/app/controllers/form_controller.rb @@ -1,7 +1,7 @@ class FormController < ApplicationController before_action :authenticate_user! - before_action :find_resource, only: [:submit_form] - before_action :find_resource_by_named_id, except: [:submit_form] + before_action :find_resource, only: [:submit_form, :review] + before_action :find_resource_by_named_id, except: [:submit_form, :review] def submit_form if @case_log @@ -37,6 +37,14 @@ class FormController < ApplicationController end end + def review + if @case_log + render "form/review" + else + render_not_found + end + end + FormHandler.instance.forms.each do |_key, form| form.pages.map do |page| define_method(page.id) do |_errors = {}| diff --git a/app/frontend/application.js b/app/frontend/application.js index 98742bb09..708629ad9 100644 --- a/app/frontend/application.js +++ b/app/frontend/application.js @@ -12,9 +12,15 @@ import "custom-event-polyfill" import "intersection-observer" // +// Import GOV.UK Frontend +import GOVUKFrontend from 'govuk-frontend' + +// Import GOV.UK Prototype Components +import GOVUKPrototypeComponents from 'govuk-prototype-components' + require.context("govuk-frontend/govuk/assets") -import { initAll } from "govuk-frontend" import "./styles/application.scss" import "./controllers" -initAll() +GOVUKFrontend.initAll() +GOVUKPrototypeComponents.initAll() diff --git a/app/frontend/styles/application.scss b/app/frontend/styles/application.scss index 3d01074ec..f2251ea5d 100644 --- a/app/frontend/styles/application.scss +++ b/app/frontend/styles/application.scss @@ -10,7 +10,11 @@ $govuk-font-url-function: frontend-font-url; $govuk-image-url-function: frontend-image-url; $govuk-global-styles: true; -@import "~govuk-frontend/govuk/all"; +// Import GOV.UK Frontend +@import "govuk-frontend/govuk/all"; + +// Import GOV.UK Prototype Components +// @import "govuk-prototype-components/x-govuk/all"; @import "accessible-autocomplete"; @import "button"; diff --git a/app/views/case_logs/_tasklist.html.erb b/app/views/case_logs/_tasklist.html.erb index 42adcd340..a1ae6d2f6 100644 --- a/app/views/case_logs/_tasklist.html.erb +++ b/app/views/case_logs/_tasklist.html.erb @@ -24,3 +24,7 @@ </li> <% end %> </ol> + +<h2 class="govuk-heading-m">Review and submit</h2> +<p>Review your answers and submit this log to the Department of Levelling Up, Housing & Communities.</p> +<%= govuk_button_link_to 'Review lettings log', "/logs/#{@case_log.id}/review" %> \ No newline at end of file diff --git a/app/views/form/review.html.erb b/app/views/form/review.html.erb new file mode 100644 index 000000000..b5827d854 --- /dev/null +++ b/app/views/form/review.html.erb @@ -0,0 +1,33 @@ +<% content_for :title, "Review lettings log" %> +<% content_for :breadcrumbs, govuk_breadcrumbs(breadcrumbs: { + "Logs" => "/logs", + "Log #{@case_log.id.to_s}" => "/logs/" + @case_log.id.to_s, + "Review lettings log" => "" +}) %> + +<%= turbo_frame_tag "case_log_form", target: "_top" do %> + <div class="govuk-grid-row"> + <div class="govuk-grid-column-two-thirds-from-desktop"> + <h1 class="govuk-heading-xl"> + <%= content_for(:title) %> + </h1> + <% @case_log.form.sections.map do |section| %> + <h2 class="govuk-heading-m"><%= section.label %></h2> + <% section.subsections.map do |subsection| %> + <div class="x-govuk-summary-card govuk-!-margin-bottom-6"> + <div class="x-govuk-summary-card__header"> + <h3 class="x-govuk-summary-card__title"><%= subsection.label %></h3> + </div> + <div class="x-govuk-summary-card__body"> + <dl class="govuk-summary-list"> + <% subsection.applicable_questions(@case_log).each do |question| %> + <%= render partial: 'form/check_answers_table', locals: { question: question, case_log: @case_log } %> + <% end %> + </dl> + </div> + </div> + <% end %> + <% end %> + </div> + </div> +<% end %> \ No newline at end of file diff --git a/config/forms/2021_2022.json b/config/forms/2021_2022.json index 0b92bf3b2..10efab899 100644 --- a/config/forms/2021_2022.json +++ b/config/forms/2021_2022.json @@ -1110,6 +1110,21 @@ } ], "pages": { + "declaration": { + "header": "", + "description": "", + "questions": { + "declaration": { + "check_answer_label": "", + "header": "Submit this lettings log ", + "hint_text": "", + "type": "checkbox", + "answer_options": { + "declaration": "The tenant has seen the Department for Levelling Up, Housing & Communities (DLUHC) privacy notice" + } + } + } + }, "household_members": { "header": "", "description": "", @@ -5685,42 +5700,6 @@ } } } - }, - "submission": { - "label": "Submission", - "subsections": { - "declaration": { - "label": "Declaration", - "depends_on": [ - { - "setup": "completed", - "household_characteristics": "completed", - "household_situation": "completed", - "household_needs": "completed", - "tenancy_information": "completed", - "property_information": "completed", - "income_and_benefits": "completed" - } - ], - "pages": { - "declaration": { - "header": "", - "description": "", - "questions": { - "declaration": { - "check_answer_label": "", - "header": "Submit this lettings log ", - "hint_text": "", - "type": "checkbox", - "answer_options": { - "declaration": "The tenant has seen the Department for Levelling Up, Housing & Communities (DLUHC) privacy notice" - } - } - } - } - } - } - } } } } diff --git a/config/routes.rb b/config/routes.rb index 4cb364878..3c8995519 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -77,6 +77,7 @@ Rails.application.routes.draw do member do post "form", to: "form#submit_form" + get "review", to: "form#review" end FormHandler.instance.forms.each do |_key, form| diff --git a/db/schema.rb b/db/schema.rb index 61368691c..882dde6f6 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -321,9 +321,9 @@ ActiveRecord::Schema[7.0].define(version: 202202071123100) do t.integer "failed_attempts", default: 0 t.string "unlock_token" t.datetime "locked_at", precision: nil + t.string "phone" t.boolean "is_dpo", default: false t.boolean "is_key_contact", default: false - t.string "phone" t.integer "second_factor_attempts_count", default: 0 t.string "encrypted_otp_secret_key" t.string "encrypted_otp_secret_key_iv" diff --git a/package.json b/package.json index 463c20606..856c0c124 100644 --- a/package.json +++ b/package.json @@ -23,6 +23,7 @@ "custom-event-polyfill": "^1.0.7", "file-loader": "^6.2.0", "govuk-frontend": "^4.0.1", + "govuk-prototype-components": "^0.1.5", "html5shiv": "^3.7.3", "intersection-observer": "^0.12.0", "mini-css-extract-plugin": "^2.6.0", diff --git a/spec/features/form/review_page_spec.rb b/spec/features/form/review_page_spec.rb new file mode 100644 index 000000000..ece35c82e --- /dev/null +++ b/spec/features/form/review_page_spec.rb @@ -0,0 +1,34 @@ +require "rails_helper" +require_relative "helpers" + +RSpec.describe "Form Review Page" do + include Helpers + let(:user) { FactoryBot.create(:user) } + let(:completed_unsubmitted_case_log) do + FactoryBot.create( + :case_log, + :completed, + status: 1, + owning_organisation: user.organisation, + managing_organisation: user.organisation, + ) + end + + before do + sign_in user + end + + context "when the user wishes to review their case log" do + it "the review page can be visited by URL" do + visit("/logs/#{completed_unsubmitted_case_log.id}/review") + expect(page).to have_content("Review lettings log") + end + + it "the review page allows the user to submit a completed case log" do + visit("/logs/#{completed_unsubmitted_case_log.id}/review") + click_button("Submit lettings log") + expect(page).to have_content("Success") + expect(page).to have_content("Log #{completed_unsubmitted_case_log.id} has been submitted") + end + end +end diff --git a/spec/features/form/tasklist_page_spec.rb b/spec/features/form/tasklist_page_spec.rb index 7f869ded4..6acb1ef6a 100644 --- a/spec/features/form/tasklist_page_spec.rb +++ b/spec/features/form/tasklist_page_spec.rb @@ -42,4 +42,11 @@ RSpec.describe "Task List" do visit("/logs/#{empty_case_log.id}") expect(page).to have_link("Skip to next incomplete section", href: /#household-characteristics/) end + + it "has a review section which has a button that allows the data inputter to review the case log" do + visit("/logs/#{case_log.id}") + expect(page).to have_content("Review your answers and submit this log to the Department of Levelling Up, Housing & Communities.") + click_link(text: "Review lettings log") + expect(page).to have_current_path("/logs/#{case_log.id}/review") + end end diff --git a/webpack.config.js b/webpack.config.js index 14ff8fd36..0f7e8f987 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -43,7 +43,7 @@ module.exports = { ], }, resolve: { - modules: ['node_modules', 'node_modules/govuk-frontend/govuk'] + modules: ['node_modules', 'node_modules/govuk-frontend/govuk', 'node_modules/govuk-prototype-components/x-govuk'] }, output: { filename: "[name].js", diff --git a/yarn.lock b/yarn.lock index 9270ef046..51118f2d5 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1164,7 +1164,7 @@ resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d" integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== -accessible-autocomplete@^2.0.3: +accessible-autocomplete@^2.0.3, accessible-autocomplete@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/accessible-autocomplete/-/accessible-autocomplete-2.0.4.tgz#e295256c8d268b97c5ab456a1cb084b553ed3eb0" integrity sha512-2p0txrSpvs5wXFUeQJHMheDPTZVSEmiUHWlEPb7vJnv2Dd1xPfoLnBQQMfNbTSit2pL/9sSQYESuD2Yyohd4Yw== @@ -1647,6 +1647,11 @@ events@^3.2.0: resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== +eventslibjs@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/eventslibjs/-/eventslibjs-1.2.0.tgz#5d242b1d71d7376b999611448e91b7947d8cb9d0" + integrity sha512-nui7FHXHeeZjWkQ1dZ4R3RchkT+164+y1/puiOY1Zc3CPU9W8XzAzdhqvuVQ4EJt7F/W94O5U26/oVFpBOPY3w== + execa@^5.0.0: version "5.1.1" resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" @@ -1797,6 +1802,16 @@ govuk-frontend@^4.0.1: resolved "https://registry.yarnpkg.com/govuk-frontend/-/govuk-frontend-4.0.1.tgz#bceff58ecb399272cba32bd2b357fe16198e3249" integrity sha512-X+B88mqYHoxAz0ID87Uxo3oHqdKBRnNHd3Cz8+u8nvQUAsrEzROFLK+t7sAu7e+fKqCCrJyIgx6Cmr6dIGnohQ== +govuk-prototype-components@^0.1.5: + version "0.1.5" + resolved "https://registry.yarnpkg.com/govuk-prototype-components/-/govuk-prototype-components-0.1.5.tgz#e420c3200660fc6ff0f4df66474e8796ec446d37" + integrity sha512-ssUW5qcxnyJ9B+TRafRjLdeMmAK67cC5TE5TzkVhoMDzdYTQWzfp+FtFg2SFM0dO9pAc1npMVxZ8rUxEA174IQ== + dependencies: + accessible-autocomplete "^2.0.4" + eventslibjs "^1.2.0" + govuk-frontend "^4.0.1" + lodash "^4.17.21" + graceful-fs@^4.1.2, graceful-fs@^4.2.4, graceful-fs@^4.2.9: version "4.2.9" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.9.tgz#041b05df45755e587a24942279b9d113146e1c96" @@ -2040,6 +2055,11 @@ lodash.debounce@^4.0.8: resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" integrity sha1-gteb/zCmfEAF/9XiUVMArZyk168= +lodash@^4.17.21: + version "4.17.21" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== + lru-cache@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" From 0056946aa3e0a557631e9256c7e5f47adcfcf80a Mon Sep 17 00:00:00 2001 From: baarkerlounger <db@slothlife.xyz> Date: Mon, 4 Apr 2022 16:43:47 +0100 Subject: [PATCH 2/8] Unpleasant but works --- app/frontend/application.js | 8 ++------ app/frontend/controllers/govukfrontend_controller.js | 6 ++++-- app/frontend/styles/application.scss | 7 ++----- webpack.config.js | 2 +- 4 files changed, 9 insertions(+), 14 deletions(-) diff --git a/app/frontend/application.js b/app/frontend/application.js index 708629ad9..4bff5c3e9 100644 --- a/app/frontend/application.js +++ b/app/frontend/application.js @@ -12,13 +12,9 @@ import "custom-event-polyfill" import "intersection-observer" // -// Import GOV.UK Frontend -import GOVUKFrontend from 'govuk-frontend' - -// Import GOV.UK Prototype Components -import GOVUKPrototypeComponents from 'govuk-prototype-components' - require.context("govuk-frontend/govuk/assets") +import GOVUKFrontend from "govuk-frontend" +import GOVUKPrototypeComponents from "govuk-prototype-components" import "./styles/application.scss" import "./controllers" diff --git a/app/frontend/controllers/govukfrontend_controller.js b/app/frontend/controllers/govukfrontend_controller.js index 74af6408a..9fdc001af 100644 --- a/app/frontend/controllers/govukfrontend_controller.js +++ b/app/frontend/controllers/govukfrontend_controller.js @@ -1,8 +1,10 @@ -import { initAll } from "govuk-frontend"; +import GOVUKFrontend from "govuk-frontend"; +import GOVUKPrototypeComponents from "govuk-prototype-components" import { Controller } from "@hotwired/stimulus"; export default class extends Controller { connect() { - initAll() + GOVUKFrontend.initAll() + GOVUKPrototypeComponents.initAll() } } diff --git a/app/frontend/styles/application.scss b/app/frontend/styles/application.scss index f2251ea5d..07e8c675a 100644 --- a/app/frontend/styles/application.scss +++ b/app/frontend/styles/application.scss @@ -10,11 +10,8 @@ $govuk-font-url-function: frontend-font-url; $govuk-image-url-function: frontend-image-url; $govuk-global-styles: true; -// Import GOV.UK Frontend -@import "govuk-frontend/govuk/all"; - -// Import GOV.UK Prototype Components -// @import "govuk-prototype-components/x-govuk/all"; +@import "node_modules/govuk-frontend/govuk/all"; +@import "node_modules/govuk-prototype-components/x-govuk/all"; @import "accessible-autocomplete"; @import "button"; diff --git a/webpack.config.js b/webpack.config.js index 0f7e8f987..14ff8fd36 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -43,7 +43,7 @@ module.exports = { ], }, resolve: { - modules: ['node_modules', 'node_modules/govuk-frontend/govuk', 'node_modules/govuk-prototype-components/x-govuk'] + modules: ['node_modules', 'node_modules/govuk-frontend/govuk'] }, output: { filename: "[name].js", From 6cac98ccd4a0140b93647aae69e7a180fd6816fe Mon Sep 17 00:00:00 2001 From: baarkerlounger <db@slothlife.xyz> Date: Mon, 4 Apr 2022 17:46:45 +0100 Subject: [PATCH 3/8] Alias is maybe better? --- app/frontend/styles/application.scss | 4 ++-- webpack.config.js | 4 ++++ 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/app/frontend/styles/application.scss b/app/frontend/styles/application.scss index 07e8c675a..dace6c0a4 100644 --- a/app/frontend/styles/application.scss +++ b/app/frontend/styles/application.scss @@ -10,8 +10,8 @@ $govuk-font-url-function: frontend-font-url; $govuk-image-url-function: frontend-image-url; $govuk-global-styles: true; -@import "node_modules/govuk-frontend/govuk/all"; -@import "node_modules/govuk-prototype-components/x-govuk/all"; +@import "govuk-frontend-styles"; +@import "govuk-prototype-styles"; @import "accessible-autocomplete"; @import "button"; diff --git a/webpack.config.js b/webpack.config.js index 14ff8fd36..77eebab44 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -43,6 +43,10 @@ module.exports = { ], }, resolve: { + alias: { + 'govuk-frontend-styles': path.resolve(__dirname, 'node_modules/govuk-frontend/govuk/all.scss'), + 'govuk-prototype-styles': path.resolve(__dirname, 'node_modules/govuk-prototype-components/x-govuk/all.scss') + }, modules: ['node_modules', 'node_modules/govuk-frontend/govuk'] }, output: { From cc35a483e5be7362ec19e694325eff3a49d431e3 Mon Sep 17 00:00:00 2001 From: Dushan Despotovic <dushan@madetech.com> Date: Wed, 6 Apr 2022 17:11:50 +0100 Subject: [PATCH 4/8] WIP --- app/controllers/form_controller.rb | 9 +++++++++ app/models/form/question.rb | 1 + app/views/case_logs/_success.html.erb | 12 ++++++++++++ app/views/case_logs/index.html.erb | 4 ++++ app/views/form/review.html.erb | 8 +++++++- config/forms/2021_2022.json | 6 +++--- 6 files changed, 36 insertions(+), 4 deletions(-) create mode 100644 app/views/case_logs/_success.html.erb diff --git a/app/controllers/form_controller.rb b/app/controllers/form_controller.rb index 1160fcf06..6d3af2f75 100644 --- a/app/controllers/form_controller.rb +++ b/app/controllers/form_controller.rb @@ -5,6 +5,10 @@ class FormController < ApplicationController def submit_form if @case_log + if is_referrer_review? + @case_log.update!(@case_log.attributes) + redirect_to(send(case_logs_path, @case_log)) + else @page = @case_log.form.get_page(params[:case_log][:page]) responses_for_page = responses_for_page(@page) if @case_log.update(responses_for_page) @@ -110,4 +114,9 @@ private referrer = request.headers["HTTP_REFERER"].presence || "" referrer.present? && CGI.parse(referrer.split("?")[-1]).present? && CGI.parse(referrer.split("?")[-1])["referrer"][0] == "check_answers" end + + def is_referrer_review? + referrer = request.headers["HTTP_REFERER"].presence || "" + referrer.present? && referrer.split("/")[-1].present? && referrer.split("/")[-1] == "review" + end end diff --git a/app/models/form/question.rb b/app/models/form/question.rb index 8d1d43a7c..69cafbe4a 100644 --- a/app/models/form/question.rb +++ b/app/models/form/question.rb @@ -168,6 +168,7 @@ private def checkbox_answer_label(case_log) answer = [] + return "Yes" if id == "declaration" && value_is_yes?(case_log["declaration"]) answer_options.each { |key, options| value_is_yes?(case_log[key]) ? answer << options["value"] : nil } answer.join(", ") end diff --git a/app/views/case_logs/_success.html.erb b/app/views/case_logs/_success.html.erb new file mode 100644 index 000000000..769b4de1c --- /dev/null +++ b/app/views/case_logs/_success.html.erb @@ -0,0 +1,12 @@ +<div class="govuk-notification-banner govuk-notification-banner--success" role="alert" aria-labelledby="govuk-notification-banner-title" data-module="govuk-notification-banner"> + <div class="govuk-notification-banner__header"> + <h2 class="govuk-notification-banner__title" id="govuk-notification-banner-title"> + Success + </h2> + </div> + <div class="govuk-notification-banner__content"> + <h3 class="govuk-notification-banner__heading"> + Log <%= case_log.id %> has been submitted + </h3> + </div> +</div> \ No newline at end of file diff --git a/app/views/case_logs/index.html.erb b/app/views/case_logs/index.html.erb index 8060f3c99..db44e88a4 100644 --- a/app/views/case_logs/index.html.erb +++ b/app/views/case_logs/index.html.erb @@ -1,5 +1,9 @@ <% content_for :title, "Logs" %> +<% if @case_log.present? %> +<%= render partial: "success", locals: { case_log: @case_log } %> +<% end %> + <h1 class="govuk-heading-l"> <%= content_for(:title) %> </h1> diff --git a/app/views/form/review.html.erb b/app/views/form/review.html.erb index b5827d854..fa01de259 100644 --- a/app/views/form/review.html.erb +++ b/app/views/form/review.html.erb @@ -12,7 +12,7 @@ <%= content_for(:title) %> </h1> <% @case_log.form.sections.map do |section| %> - <h2 class="govuk-heading-m"><%= section.label %></h2> + <h2 class="govuk-heading-m"><%= section.label %></h2> <% section.subsections.map do |subsection| %> <div class="x-govuk-summary-card govuk-!-margin-bottom-6"> <div class="x-govuk-summary-card__header"> @@ -28,6 +28,12 @@ </div> <% end %> <% end %> + <div class="govuk-inset-text"> + You can submit changes to this log until the close of the current collection year, 31 March 2022. + </div> + <%= form_with model: @case_log, url: form_case_log_path(@case_log), method: "post" do |f| %> + <%= f.govuk_submit "Submit lettings log", accesskey: "s" %> + <% end %> </div> </div> <% end %> \ No newline at end of file diff --git a/config/forms/2021_2022.json b/config/forms/2021_2022.json index 10efab899..99aa82e44 100644 --- a/config/forms/2021_2022.json +++ b/config/forms/2021_2022.json @@ -1115,9 +1115,9 @@ "description": "", "questions": { "declaration": { - "check_answer_label": "", - "header": "Submit this lettings log ", - "hint_text": "", + "check_answer_label": "Tenant has seen the privacy notice", + "header": "Department for Levelling Up, Housing & Communities privacy notice ", + "hint_text": "Make sure the tenant has seen the Department for Levelling Up, Housing & Communities (DLUHC) privacy notice before submitting this log", "type": "checkbox", "answer_options": { "declaration": "The tenant has seen the Department for Levelling Up, Housing & Communities (DLUHC) privacy notice" From 185fcfa0ed280121ce47f090ead5d5f87e15bca0 Mon Sep 17 00:00:00 2001 From: Dushan Despotovic <dushan@madetech.com> Date: Mon, 11 Apr 2022 12:09:01 +0100 Subject: [PATCH 5/8] remove unneeded partial --- app/views/case_logs/_success.html.erb | 12 ------------ 1 file changed, 12 deletions(-) delete mode 100644 app/views/case_logs/_success.html.erb diff --git a/app/views/case_logs/_success.html.erb b/app/views/case_logs/_success.html.erb deleted file mode 100644 index 769b4de1c..000000000 --- a/app/views/case_logs/_success.html.erb +++ /dev/null @@ -1,12 +0,0 @@ -<div class="govuk-notification-banner govuk-notification-banner--success" role="alert" aria-labelledby="govuk-notification-banner-title" data-module="govuk-notification-banner"> - <div class="govuk-notification-banner__header"> - <h2 class="govuk-notification-banner__title" id="govuk-notification-banner-title"> - Success - </h2> - </div> - <div class="govuk-notification-banner__content"> - <h3 class="govuk-notification-banner__heading"> - Log <%= case_log.id %> has been submitted - </h3> - </div> -</div> \ No newline at end of file From 3c8c196aec620f5ec9042c4b66e9d79fa951e9cb Mon Sep 17 00:00:00 2001 From: Dushan Despotovic <dushan@madetech.com> Date: Mon, 11 Apr 2022 13:52:58 +0100 Subject: [PATCH 6/8] error and success when submitting --- app/controllers/form_controller.rb | 43 +++++++++++++++++--------- app/views/case_logs/index.html.erb | 4 --- app/views/form/review.html.erb | 7 ++--- spec/features/form/review_page_spec.rb | 27 ++++++++++++---- 4 files changed, 52 insertions(+), 29 deletions(-) diff --git a/app/controllers/form_controller.rb b/app/controllers/form_controller.rb index 6d3af2f75..444be4df8 100644 --- a/app/controllers/form_controller.rb +++ b/app/controllers/form_controller.rb @@ -6,25 +6,31 @@ class FormController < ApplicationController def submit_form if @case_log if is_referrer_review? - @case_log.update!(@case_log.attributes) - redirect_to(send(case_logs_path, @case_log)) + if @case_log.completed? + redirect_to(case_logs_path, flash: { notice: "Log #{@case_log.id} has been submitted" }) + else + @case_log.errors.add :base, "All mandatory fields have not been completed, please refer to section status" + session[:errors][:review] = @case_log.errors.to_json + redirect_to(review_case_log_path) + end else - @page = @case_log.form.get_page(params[:case_log][:page]) - responses_for_page = responses_for_page(@page) - if @case_log.update(responses_for_page) - session[:errors] = nil - if is_referrer_check_answers? && !@case_log.form.next_page(@page, @case_log).to_s.include?("value_check") - redirect_to(send("case_log_#{@case_log.form.subsection_for_page(@page).id}_check_answers_path", @case_log)) - elsif @case_log.form.is_last_question?(@page, @case_log.form.subsection_for_page(@page), @case_log) - redirect_to(case_logs_path) + @page = @case_log.form.get_page(params[:case_log][:page]) + responses_for_page = responses_for_page(@page) + if @case_log.update(responses_for_page) + session[:errors] = nil + if is_referrer_check_answers? && !@case_log.form.next_page(@page, @case_log).to_s.include?("value_check") + redirect_to(send("case_log_#{@case_log.form.subsection_for_page(@page).id}_check_answers_path", @case_log)) + elsif @case_log.form.is_last_question?(@page, @case_log.form.subsection_for_page(@page), @case_log) + redirect_to(case_logs_path) + else + redirect_path = @case_log.form.next_page_redirect_path(@page, @case_log) + redirect_to(send(redirect_path, @case_log)) + end else - redirect_path = @case_log.form.next_page_redirect_path(@page, @case_log) + redirect_path = "case_log_#{@page.id}_path" + session[:errors] = @case_log.errors.to_json redirect_to(send(redirect_path, @case_log)) end - else - redirect_path = "case_log_#{@page.id}_path" - session[:errors] = @case_log.errors.to_json - redirect_to(send(redirect_path, @case_log)) end else render_not_found @@ -32,6 +38,7 @@ class FormController < ApplicationController end def check_answers + session[:review_errors] = nil if @case_log current_url = request.env["PATH_INFO"] subsection = @case_log.form.get_subsection(current_url.split("/")[-2]) @@ -43,6 +50,11 @@ class FormController < ApplicationController def review if @case_log + if session["errors"] + JSON(session["errors"]).each do |field, messages| + messages.each { |message| @case_log.errors.add field.to_sym, message } + end + end render "form/review" else render_not_found @@ -52,6 +64,7 @@ class FormController < ApplicationController FormHandler.instance.forms.each do |_key, form| form.pages.map do |page| define_method(page.id) do |_errors = {}| + session[:review_errors] = nil if @case_log if session["errors"] JSON(session["errors"]).each do |field, messages| diff --git a/app/views/case_logs/index.html.erb b/app/views/case_logs/index.html.erb index db44e88a4..8060f3c99 100644 --- a/app/views/case_logs/index.html.erb +++ b/app/views/case_logs/index.html.erb @@ -1,9 +1,5 @@ <% content_for :title, "Logs" %> -<% if @case_log.present? %> -<%= render partial: "success", locals: { case_log: @case_log } %> -<% end %> - <h1 class="govuk-heading-l"> <%= content_for(:title) %> </h1> diff --git a/app/views/form/review.html.erb b/app/views/form/review.html.erb index fa01de259..b3131a200 100644 --- a/app/views/form/review.html.erb +++ b/app/views/form/review.html.erb @@ -5,7 +5,8 @@ "Review lettings log" => "" }) %> -<%= turbo_frame_tag "case_log_form", target: "_top" do %> +<%= form_with model: @case_log, url: form_case_log_path(@case_log), method: "post" do |f| %> + <%= f.govuk_error_summary %> <div class="govuk-grid-row"> <div class="govuk-grid-column-two-thirds-from-desktop"> <h1 class="govuk-heading-xl"> @@ -31,9 +32,7 @@ <div class="govuk-inset-text"> You can submit changes to this log until the close of the current collection year, 31 March 2022. </div> - <%= form_with model: @case_log, url: form_case_log_path(@case_log), method: "post" do |f| %> - <%= f.govuk_submit "Submit lettings log", accesskey: "s" %> - <% end %> </div> </div> + <%= f.govuk_submit "Submit lettings log", accesskey: "s" %> <% end %> \ No newline at end of file diff --git a/spec/features/form/review_page_spec.rb b/spec/features/form/review_page_spec.rb index ece35c82e..23f55cb92 100644 --- a/spec/features/form/review_page_spec.rb +++ b/spec/features/form/review_page_spec.rb @@ -4,11 +4,18 @@ require_relative "helpers" RSpec.describe "Form Review Page" do include Helpers let(:user) { FactoryBot.create(:user) } - let(:completed_unsubmitted_case_log) do + let(:case_log) do + FactoryBot.create( + :case_log, + :in_progress, + owning_organisation: user.organisation, + managing_organisation: user.organisation, + ) + end + let(:completed_case_log) do FactoryBot.create( :case_log, :completed, - status: 1, owning_organisation: user.organisation, managing_organisation: user.organisation, ) @@ -20,15 +27,23 @@ RSpec.describe "Form Review Page" do context "when the user wishes to review their case log" do it "the review page can be visited by URL" do - visit("/logs/#{completed_unsubmitted_case_log.id}/review") + visit("/logs/#{completed_case_log.id}/review") expect(page).to have_content("Review lettings log") end it "the review page allows the user to submit a completed case log" do - visit("/logs/#{completed_unsubmitted_case_log.id}/review") + visit("/logs/#{completed_case_log.id}/review") click_button("Submit lettings log") + expect(page).to have_current_path("/logs") expect(page).to have_content("Success") - expect(page).to have_content("Log #{completed_unsubmitted_case_log.id} has been submitted") - end + expect(page).to have_content("Log #{completed_case_log.id} has been submitted") + end + + it "the review page displays an error message if all mandatory questions have not been completed when submitting" do + visit("/logs/#{case_log.id}/review") + click_button("Submit lettings log") + expect(page).to have_current_path("/logs/#{case_log.id}/review") + expect(page).to have_content("All mandatory fields have not been completed, please refer to section status") + end end end From 55d549bd16bf52c15f0b49db511f2dff803d69b4 Mon Sep 17 00:00:00 2001 From: Dushan Despotovic <dushan@madetech.com> Date: Tue, 12 Apr 2022 15:03:23 +0100 Subject: [PATCH 7/8] add request specs for review page --- app/controllers/form_controller.rb | 6 ++-- spec/requests/form_controller_spec.rb | 43 +++++++++++++++++++++++++++ 2 files changed, 46 insertions(+), 3 deletions(-) diff --git a/app/controllers/form_controller.rb b/app/controllers/form_controller.rb index 444be4df8..5182aeea5 100644 --- a/app/controllers/form_controller.rb +++ b/app/controllers/form_controller.rb @@ -10,7 +10,7 @@ class FormController < ApplicationController redirect_to(case_logs_path, flash: { notice: "Log #{@case_log.id} has been submitted" }) else @case_log.errors.add :base, "All mandatory fields have not been completed, please refer to section status" - session[:errors][:review] = @case_log.errors.to_json + session[:review_errors] = @case_log.errors.to_json redirect_to(review_case_log_path) end else @@ -50,8 +50,8 @@ class FormController < ApplicationController def review if @case_log - if session["errors"] - JSON(session["errors"]).each do |field, messages| + if session[:review_errors] + JSON(session[:review_errors]).each do |field, messages| messages.each { |message| @case_log.errors.add field.to_sym, message } end end diff --git a/spec/requests/form_controller_spec.rb b/spec/requests/form_controller_spec.rb index 32d8016d9..994ed09fa 100644 --- a/spec/requests/form_controller_spec.rb +++ b/spec/requests/form_controller_spec.rb @@ -18,6 +18,25 @@ RSpec.describe FormController, type: :request do managing_organisation: other_organisation, ) end + let(:setup_complete_case_log) do + FactoryBot.create( + :case_log, + :about_completed, + status: 1, + year: 2021, + startdate: Time.zone.local(2021, 10, 10), + owning_organisation: organisation, + managing_organisation: organisation, + ) + end + let(:completed_case_log) do + FactoryBot.create( + :case_log, + :completed, + owning_organisation: organisation, + managing_organisation: organisation, + ) + end let(:headers) { { "Accept" => "text/html" } } context "when a user is not signed in" do @@ -97,6 +116,13 @@ RSpec.describe FormController, type: :request do expect(response).to redirect_to("/logs/#{case_log.id}") end end + + context "when visiting the review page" do + it "renders the review page for the case log" do + get "/logs/#{setup_complete_case_log.id}/review", headers: headers, params: {} + expect(response.body).to match("Review lettings log") + end + end end describe "Submit Form" do @@ -338,6 +364,23 @@ RSpec.describe FormController, type: :request do expect(response).to have_http_status(:not_found) end end + + context "When submitting the case log from the review page" do + + it "redirects to the case logs page on a successful submission of a complete case log" do + post "/logs/#{completed_case_log.id}/form", headers: { "HTTP_REFERER": "/logs/#{completed_case_log.id}/review" } + expect(response).to redirect_to("/logs") + follow_redirect! + expect(Capybara::Node::Simple.new(response.body)).to have_content("Log #{completed_case_log.id} has been submitted") + end + + it "redirects to the review page and presents an error to the user if submitting an incomplete case log" do + post "/logs/#{setup_complete_case_log.id}/form", headers: { "HTTP_REFERER": "/logs/#{setup_complete_case_log.id}/review" } + expect(response).to redirect_to("/logs/#{setup_complete_case_log.id}/review") + follow_redirect! + expect(Capybara::Node::Simple.new(response.body)).to have_content("All mandatory fields have not been completed, please refer to section status") + end + end end end end From 717484590c935f814ca8564971ab7aa32c5659e6 Mon Sep 17 00:00:00 2001 From: Dushan Despotovic <dushan@madetech.com> Date: Tue, 12 Apr 2022 15:04:00 +0100 Subject: [PATCH 8/8] delete unneeded feature spec --- spec/features/form/review_page_spec.rb | 49 -------------------------- 1 file changed, 49 deletions(-) delete mode 100644 spec/features/form/review_page_spec.rb diff --git a/spec/features/form/review_page_spec.rb b/spec/features/form/review_page_spec.rb deleted file mode 100644 index 23f55cb92..000000000 --- a/spec/features/form/review_page_spec.rb +++ /dev/null @@ -1,49 +0,0 @@ -require "rails_helper" -require_relative "helpers" - -RSpec.describe "Form Review Page" do - include Helpers - let(:user) { FactoryBot.create(:user) } - let(:case_log) do - FactoryBot.create( - :case_log, - :in_progress, - owning_organisation: user.organisation, - managing_organisation: user.organisation, - ) - end - let(:completed_case_log) do - FactoryBot.create( - :case_log, - :completed, - owning_organisation: user.organisation, - managing_organisation: user.organisation, - ) - end - - before do - sign_in user - end - - context "when the user wishes to review their case log" do - it "the review page can be visited by URL" do - visit("/logs/#{completed_case_log.id}/review") - expect(page).to have_content("Review lettings log") - end - - it "the review page allows the user to submit a completed case log" do - visit("/logs/#{completed_case_log.id}/review") - click_button("Submit lettings log") - expect(page).to have_current_path("/logs") - expect(page).to have_content("Success") - expect(page).to have_content("Log #{completed_case_log.id} has been submitted") - end - - it "the review page displays an error message if all mandatory questions have not been completed when submitting" do - visit("/logs/#{case_log.id}/review") - click_button("Submit lettings log") - expect(page).to have_current_path("/logs/#{case_log.id}/review") - expect(page).to have_content("All mandatory fields have not been completed, please refer to section status") - end - end -end