diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 05c02ad16..e95cf4c95 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -42,10 +42,10 @@ jobs: - name: Setup Ruby uses: ruby/setup-ruby@v1 with: - ruby-version: 2.7.7 + ruby-version: 3.2.2 - uses: actions/setup-node@v2-beta with: - node-version: '12' + node-version: '16' - run: npm install -g yarn - uses: nanasess/setup-chromedriver@master - name: Build and run tests diff --git a/.github/workflows/slack_notification.yml b/.github/workflows/slack_notification.yml new file mode 100644 index 000000000..5222ec219 --- /dev/null +++ b/.github/workflows/slack_notification.yml @@ -0,0 +1,40 @@ +name: Check for tests or deployment results +on: + workflow_run: + workflows: ["CI"] + types: [completed] + +jobs: + notify-slack: + runs-on: ubuntu-latest + env: + SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }} + steps: + - name: Extract Slack ID for author + id: extract_slack_id + run: | + #!/bin/bash + # user_string="johndoe:U12345678, janedoe:U87654321, alice:U98765432" + user_string="${{ vars.SLACK_USER_IDS }}" + suid="" + + IFS=", " read -r -a users <<< "$user_string" + for user in "${users[@]}"; do + IFS=':' read -r github_username slack_user_id <<< "$user" + if [ "$github_username" == "${{github.actor}}" ]; then + suid="$slack_user_id" + break + fi + done + + echo "::set-output name=suid::$suid" + - name: tests + uses: ravsamhq/notify-slack-action@v2 + if: ${{ github.event.workflow_run.head_branch != 'main' && github.event.workflow_run.head_branch != 'staging' && github.event.workflow_run.head_branch != 'production' }} + with: + status: ${{ github.event.workflow_run.conclusion }} + notification_title: "Tests ${{github.event.workflow_run.conclusion}} on *${{github.event.workflow_run.head_branch}}* - <${{github.server_url}}/${{github.repository}}/actions/runs/${{github.event.workflow_run.id}}|View ${{github.event.workflow_run.conclusion}}>" + message_format: "{emoji} *${{github.event.workflow_run.name}}* ${{github.event.workflow_run.conclusion}} in <{repo_url}|{repo}>" + footer: "Linked Repo <${{github.server_url}}/${{github.repository}}|${{github.repository}}> | <${{github.server_url}}/${{github.repository}}/actions/runs/${{github.event.workflow_run.id}}|View ${{github.event.workflow_run.conclusion}}>" + mention_users: ${{ steps.extract_slack_id.outputs.suid }} + mention_users_when: "failure,warnings" diff --git a/.ruby-version b/.ruby-version index 1f7da99d4..be94e6f53 100644 --- a/.ruby-version +++ b/.ruby-version @@ -1 +1 @@ -2.7.7 +3.2.2 diff --git a/Dockerfile b/Dockerfile index d10cf70ba..168a91e8b 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,28 +1,30 @@ -ARG RUBY_VERSION=2.7.7 +ARG RUBY_VERSION=3.2.2 -FROM ruby:2.7.7 +FROM ruby:${RUBY_VERSION} ENV HOME=/app WORKDIR /app -# ENV SSL_CERT_DIR=/etc/ssl/certs -# ENV SSL_CERT_FILE=/etc/ssl/certs/ca-certificates.crt - -# Install NodeJS RUN apt-get update -RUN curl -fsSL https://deb.nodesource.com/setup_14.x | bash - -RUN apt-get install -y nodejs +RUN curl -fsSL https://deb.nodesource.com/setup_16.x | bash - +RUN apt-get install -y nodejs npm RUN npm install yarn -g +# ENV SSL_CERT_DIR=/etc/ssl/certs +# ENV SSL_CERT_FILE=/etc/ssl/certs/ca-certificates.crt + ENV CURL_CONNECT_TIMEOUT=0 CURL_TIMEOUT=0 GEM_PATH="$HOME/vendor/bundle/ruby/${RUBY_VERSION}:$GEM_PATH" LANG=${LANG:-en_US.UTF-8} PATH="$HOME/bin:$HOME/vendor/bundle/bin:$HOME/vendor/bundle/ruby/${RUBY_VERSION}/bin:$PATH" RACK_ENV=${RACK_ENV:-production} RAILS_ENV=${RAILS_ENV:-production} RAILS_SERVE_STATIC_FILES=${RAILS_SERVE_STATIC_FILES:-enabled} SECRET_KEY_BASE=${SECRET_KEY_BASE:-PLACEHOLDERSECRETBASEKEY} # Cache bundler COPY Gemfile /app/Gemfile COPY Gemfile.lock /app/Gemfile.lock + RUN bundle config set --local path 'vendor/bundle' RUN bundle config set --local without 'development test' RUN bundle install --jobs 4 --retry 3 COPY . /app + + RUN yarn install RUN RAILS_ENV=production NODE_ENV=production DATABASE_URL=postgresql://localhost/dummy_url bundle exec rake assets:precompile diff --git a/Gemfile b/Gemfile index a1170f438..8813f95ae 100644 --- a/Gemfile +++ b/Gemfile @@ -2,9 +2,9 @@ source 'https://rubygems.org' git_source(:github) { |name| "https://github.com/#{name}.git" } -ruby '~> 2.7.7' +ruby '~> 3.2.2' -gem 'rails', '6.1.7.1' +gem 'rails', '7.1.1' gem 'websocket-extensions', '~> 0.1.5' # SSL redirect @@ -15,22 +15,22 @@ gem 'pg' gem 'activerecord-import' # Track Changes -gem 'paper_trail', '~> 10.3' +gem 'paper_trail', '~> 15.0' # Assets & Templates gem 'sprockets', '~> 3.7.2' gem 'sprockets-rails', '>= 2.0.0' gem 'slim-rails', '~> 3.2.0' gem 'coffee-rails', '5.0' -gem 'jquery-rails', '4.4.0' +gem 'jquery-rails', '~> 4.4' gem 'jquery-ui-rails', '6.0.1' gem 'bootstrap-sass', '~> 3.4' gem 'govuk_frontend_toolkit', '~> 3.1.0' gem 'govuk_template', '0.12.0' -gem 'uglifier', '>= 2.7.2' +gem "terser", "~> 1.1" gem 'js_cookie_rails', '2.1.4' gem 'ckeditor' -gem 'webpacker', '6.0.0.beta.7' +gem 'webpacker' # Autolinking in admin mass user mailer gem 'rails_autolink' @@ -70,7 +70,7 @@ gem 'kaminari' gem 'wicked', '~> 1.1' # Statemachine -gem 'statesman', '3.5.0' +gem 'statesman', '~> 11.0' # Form & Data helpers gem 'simple_form', '~> 5.0' @@ -84,7 +84,7 @@ gem 'prawn-table' gem 'nokogiri' # Uploads -gem 'carrierwave', '~> 2.2.2' +gem 'carrierwave', '~> 2.2.5' gem 'google-cloud-storage', '~> 1.34.1' gem 'carrierwave-google-storage', github: "bitzesty/carrierwave-google-storage", ref: 'c706a21c6c25045cae2e39bcab5bf594af0bcf46' gem 'vigilion', '~> 1.0.4', github: 'vigilion/vigilion-ruby', ref: '7d6a7e5' @@ -124,7 +124,7 @@ gem 'nilify_blanks' gem 'curb', '0.9.10' # Web server -gem 'puma', '~> 5.6.7' +gem 'puma', '~> 5.6.8' # Performance & Error reporting gem 'appsignal' @@ -150,6 +150,8 @@ gem 'rack-canonical-host' gem 'rails-healthcheck' +gem 'matrix', '~> 0.4.1' + group :development do gem 'letter_opener' gem 'rack-mini-profiler', '>= 0.10.1', require: false @@ -157,8 +159,6 @@ group :development do gem 'rubocop', '~> 0.52', require: false # When need to copy model with nested associations gem 'amoeba', '3.0.0' - # for RailsPanel Chrome extension - gem 'meta_request' gem 'listen' # Fixes https://github.com/rails/rails/issues/26658#issuecomment-255590071 @@ -169,7 +169,7 @@ gem 'dotenv-rails' group :development, :test do # Enviroment variables - gem 'rspec-rails', '~> 4.0.1' + gem 'rspec-rails', '~> 6.0' gem 'rspec-github', require: false gem "pry-byebug" gem 'rails-controller-testing' @@ -177,12 +177,12 @@ group :development, :test do end group :test do - gem 'factory_bot_rails' - gem 'capybara', '3.33' + gem 'factory_bot_rails', '6.2' # https://github.com/thoughtbot/factory_bot_rails/issues/433 + gem 'capybara', '~> 3.39' gem 'poltergeist' gem 'database_cleaner-active_record' gem 'launchy' - gem 'turnip', '~> 4.2.0' + gem 'turnip', '~> 4.4.0' gem 'shoulda-matchers', require: false gem 'pdf-inspector', require: 'pdf/inspector' gem 'codeclimate_circle_ci_coverage' diff --git a/Gemfile.lock b/Gemfile.lock index 89bbcb83a..081c0abcb 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -32,90 +32,106 @@ GEM remote: https://rubygems.org/ specs: Ascii85 (1.1.0) - actioncable (6.1.7.1) - actionpack (= 6.1.7.1) - activesupport (= 6.1.7.1) + actioncable (7.1.1) + actionpack (= 7.1.1) + activesupport (= 7.1.1) nio4r (~> 2.0) websocket-driver (>= 0.6.1) - actionmailbox (6.1.7.1) - actionpack (= 6.1.7.1) - activejob (= 6.1.7.1) - activerecord (= 6.1.7.1) - activestorage (= 6.1.7.1) - activesupport (= 6.1.7.1) + zeitwerk (~> 2.6) + actionmailbox (7.1.1) + actionpack (= 7.1.1) + activejob (= 7.1.1) + activerecord (= 7.1.1) + activestorage (= 7.1.1) + activesupport (= 7.1.1) mail (>= 2.7.1) - actionmailer (6.1.7.1) - actionpack (= 6.1.7.1) - actionview (= 6.1.7.1) - activejob (= 6.1.7.1) - activesupport (= 6.1.7.1) + net-imap + net-pop + net-smtp + actionmailer (7.1.1) + actionpack (= 7.1.1) + actionview (= 7.1.1) + activejob (= 7.1.1) + activesupport (= 7.1.1) mail (~> 2.5, >= 2.5.4) - rails-dom-testing (~> 2.0) - actionpack (6.1.7.1) - actionview (= 6.1.7.1) - activesupport (= 6.1.7.1) - rack (~> 2.0, >= 2.0.9) + net-imap + net-pop + net-smtp + rails-dom-testing (~> 2.2) + actionpack (7.1.1) + actionview (= 7.1.1) + activesupport (= 7.1.1) + nokogiri (>= 1.8.5) + rack (>= 2.2.4) + rack-session (>= 1.0.1) rack-test (>= 0.6.3) - rails-dom-testing (~> 2.0) - rails-html-sanitizer (~> 1.0, >= 1.2.0) - actiontext (6.1.7.1) - actionpack (= 6.1.7.1) - activerecord (= 6.1.7.1) - activestorage (= 6.1.7.1) - activesupport (= 6.1.7.1) + rails-dom-testing (~> 2.2) + rails-html-sanitizer (~> 1.6) + actiontext (7.1.1) + actionpack (= 7.1.1) + activerecord (= 7.1.1) + activestorage (= 7.1.1) + activesupport (= 7.1.1) + globalid (>= 0.6.0) nokogiri (>= 1.8.5) - actionview (6.1.7.1) - activesupport (= 6.1.7.1) + actionview (7.1.1) + activesupport (= 7.1.1) builder (~> 3.1) - erubi (~> 1.4) - rails-dom-testing (~> 2.0) - rails-html-sanitizer (~> 1.1, >= 1.2.0) - active_hash (3.2.0) + erubi (~> 1.11) + rails-dom-testing (~> 2.2) + rails-html-sanitizer (~> 1.6) + active_hash (3.2.1) activesupport (>= 5.0.0) - activejob (6.1.7.1) - activesupport (= 6.1.7.1) + activejob (7.1.1) + activesupport (= 7.1.1) globalid (>= 0.3.6) - activemodel (6.1.7.1) - activesupport (= 6.1.7.1) + activemodel (7.1.1) + activesupport (= 7.1.1) activemodel-serializers-xml (1.0.2) activemodel (> 5.x) activesupport (> 5.x) builder (~> 3.1) - activerecord (6.1.7.1) - activemodel (= 6.1.7.1) - activesupport (= 6.1.7.1) - activerecord-import (1.5.0) + activerecord (7.1.1) + activemodel (= 7.1.1) + activesupport (= 7.1.1) + timeout (>= 0.4.0) + activerecord-import (1.5.1) activerecord (>= 4.2) - activestorage (6.1.7.1) - actionpack (= 6.1.7.1) - activejob (= 6.1.7.1) - activerecord (= 6.1.7.1) - activesupport (= 6.1.7.1) + activestorage (7.1.1) + actionpack (= 7.1.1) + activejob (= 7.1.1) + activerecord (= 7.1.1) + activesupport (= 7.1.1) marcel (~> 1.0) - mini_mime (>= 1.1.0) - activesupport (6.1.7.1) + activesupport (7.1.1) + base64 + bigdecimal concurrent-ruby (~> 1.0, >= 1.0.2) + connection_pool (>= 2.2.5) + drb i18n (>= 1.6, < 2) minitest (>= 5.1) + mutex_m tzinfo (~> 2.0) - zeitwerk (~> 2.3) addressable (2.8.5) public_suffix (>= 2.0.2, < 6.0) afm (0.2.2) amoeba (3.0.0) activerecord (>= 3.2.6) - appsignal (3.4.12) + appsignal (3.4.14) rack ast (2.4.2) authy (3.0.1) httpclient (>= 2.5.3.3) - autoprefixer-rails (10.4.13.0) + autoprefixer-rails (10.4.15.0) execjs (~> 2) axiom-types (0.1.1) descendants_tracker (~> 0.0.4) ice_nine (~> 0.11.0) thread_safe (~> 0.3, >= 0.3.1) - bcrypt (3.1.19) + base64 (0.2.0) + bcrypt (3.1.20) + bigdecimal (3.1.4) bindex (0.8.1) binding_of_caller (1.0.0) debug_inspector (>= 0.0.1) @@ -126,15 +142,16 @@ GEM browser (2.4.0) builder (3.2.4) byebug (11.1.3) - capybara (3.33.0) + capybara (3.39.2) addressable + matrix mini_mime (>= 0.1.3) nokogiri (~> 1.8) rack (>= 1.6.0) rack-test (>= 0.6.3) - regexp_parser (~> 1.5) + regexp_parser (>= 1.5, < 3.0) xpath (~> 3.2) - carrierwave (2.2.4) + carrierwave (2.2.5) activemodel (>= 5.0.0) activesupport (>= 5.0.0) addressable (~> 2.6) @@ -174,25 +191,26 @@ GEM crack (0.4.5) rexml crass (1.0.6) - cucumber-gherkin (14.2.0) - cucumber-messages (~> 12.4, >= 12.4.0) - cucumber-messages (12.4.0) - protobuf-cucumber (~> 3.10, >= 3.10.8) + cucumber-gherkin (27.0.0) + cucumber-messages (>= 19.1.4, < 23) + cucumber-messages (22.0.0) + cuke_modeler (3.20.1) + cucumber-gherkin (< 28.0) curb (0.9.10) database_cleaner-active_record (2.1.0) activerecord (>= 5.a) database_cleaner-core (~> 2.0.0) database_cleaner-core (2.0.1) - date (3.3.3) + date (3.3.4) debug_inspector (1.1.0) - decent_decoration (0.1.0) - decent_exposure (~> 3.0) + decent_decoration (0.0.6) + decent_exposure (>= 2.0) decent_exposure (3.0.4) activesupport (>= 4.0) declarative (0.0.20) descendants_tracker (0.0.4) thread_safe (~> 0.3, >= 0.3.1) - devise (4.9.2) + devise (4.9.3) bcrypt (~> 3.0) orm_adapter (~> 0.1) railties (>= 4.1.0) @@ -208,8 +226,7 @@ GEM digest-crc (0.6.5) rake (>= 12.0.0, < 14.0.0) docile (1.4.0) - domain_name (0.5.20190701) - unf (>= 0.0.5, < 1.0.0) + domain_name (0.6.20231109) dotenv (2.8.1) dotenv-rails (2.8.1) dotenv (= 2.8.1) @@ -221,6 +238,8 @@ GEM activesupport (>= 5.0) request_store (>= 1.0) ruby2_keywords + drb (2.2.0) + ruby2_keywords email_validator (2.2.4) activemodel enumerize (2.7.0) @@ -228,7 +247,7 @@ GEM erubi (1.12.0) et-orbi (1.2.7) tzinfo - execjs (2.8.1) + execjs (2.9.1) factory_bot (6.2.1) activesupport (>= 5.0.0) factory_bot_rails (6.2.0) @@ -261,18 +280,18 @@ GEM faraday-retry (1.0.3) faraday_middleware (1.2.0) faraday (~> 1.0) - ffi (1.15.5) - fugit (1.8.1) + ffi (1.16.3) + fugit (1.9.0) et-orbi (~> 1, >= 1.2.7) raabro (~> 1.4) - globalid (1.2.0) + globalid (1.2.1) activesupport (>= 6.1) gon (6.4.0) actionpack (>= 3.0.20) i18n (>= 0.7) multi_json request_store (>= 1.0) - google-apis-core (0.11.1) + google-apis-core (0.11.2) addressable (~> 2.5, >= 2.5.1) googleauth (>= 0.16.2, < 2.a) httpclient (>= 2.8.1, < 3.a) @@ -283,7 +302,7 @@ GEM webrick google-apis-iamcredentials_v1 (0.17.0) google-apis-core (>= 0.11.0, < 2.a) - google-apis-storage_v1 (0.24.0) + google-apis-storage_v1 (0.30.0) google-apis-core (>= 0.11.0, < 2.a) google-cloud-core (1.6.0) google-cloud-env (~> 1.0) @@ -299,10 +318,9 @@ GEM google-cloud-core (~> 1.6) googleauth (>= 0.16.2, < 2.a) mini_mime (~> 1.0) - googleauth (1.7.0) + googleauth (1.8.1) faraday (>= 0.17.3, < 3.a) jwt (>= 1.4, < 3.0) - memoist (~> 0.16) multi_json (~> 1.11) os (>= 0.9, < 2.0) signet (>= 0.16, < 2.a) @@ -326,9 +344,13 @@ GEM image_processing (1.12.2) mini_magick (>= 4.9.5, < 5) ruby-vips (>= 2.0.17, < 3) + io-console (0.6.0) + irb (1.9.0) + rdoc + reline (>= 0.3.8) jbuilder (2.10.2) activesupport (>= 5.0.0) - jquery-rails (4.4.0) + jquery-rails (4.6.0) rails-dom-testing (>= 1, < 3) railties (>= 4.2.0) thor (>= 0.14, < 2.0) @@ -357,12 +379,12 @@ GEM listen (3.8.0) rb-fsevent (~> 0.10, >= 0.10.3) rb-inotify (~> 0.9, >= 0.9.10) - lograge (0.13.0) + lograge (0.14.0) actionpack (>= 4) activesupport (>= 4) railties (>= 4) request_store (~> 1.0) - loofah (2.21.3) + loofah (2.22.0) crass (~> 1.0.2) nokogiri (>= 1.12.0) mail (2.8.1) @@ -370,7 +392,7 @@ GEM net-imap net-pop net-smtp - mail-notify (1.1.0) + mail-notify (1.2.0) actionmailer (>= 5.2.4.6) actionpack (>= 5.2.7.1) actionview (>= 5.2.7.1) @@ -378,49 +400,48 @@ GEM notifications-ruby-client (~> 5.1) rack (>= 2.1.4.1) marcel (1.0.2) - memoist (0.16.2) - meta_request (0.7.4) - rack-contrib (>= 1.1, < 3) - railties (>= 3.0.0, < 7.1) + matrix (0.4.2) method_source (1.0.0) - middleware (0.1.0) mime-types (3.5.1) mime-types-data (~> 3.2015) - mime-types-data (3.2023.0808) + mime-types-data (3.2023.1003) mini_magick (4.12.0) mini_mime (1.1.5) - mini_portile2 (2.8.4) - minitest (5.19.0) + minitest (5.20.0) money (6.16.0) i18n (>= 0.6.4, <= 2) multi_json (1.15.0) multipart-post (2.3.0) - net-imap (0.3.7) + mutex_m (0.2.0) + net-imap (0.4.5) date net-protocol net-pop (0.1.2) net-protocol - net-protocol (0.2.1) + net-protocol (0.2.2) timeout - net-smtp (0.3.3) + net-smtp (0.4.0) net-protocol netrc (0.11.0) nilify_blanks (1.4.0) activerecord (>= 4.0.0) activesupport (>= 4.0.0) - nio4r (2.5.9) - nokogiri (1.15.4) - mini_portile2 (~> 2.8.2) + nio4r (2.7.0) + nokogiri (1.16.2-arm64-darwin) + racc (~> 1.4) + nokogiri (1.16.2-x86_64-darwin) + racc (~> 1.4) + nokogiri (1.16.2-x86_64-linux) racc (~> 1.4) notifications-ruby-client (5.4.0) jwt (>= 1.5, < 3) orm_adapter (0.5.0) os (1.1.4) - paper_trail (10.3.1) - activerecord (>= 4.2) - request_store (~> 1.1) + paper_trail (15.1.0) + activerecord (>= 6.1) + request_store (~> 1.4) parallel (1.23.0) - parser (3.2.2.3) + parser (3.2.2.4) ast (~> 2.4.1) racc pdf-core (0.9.0) @@ -445,19 +466,16 @@ GEM ttfunk (~> 1.7) prawn-table (0.2.2) prawn (>= 1.3.0, < 3.0.0) - protobuf-cucumber (3.10.8) - activesupport (>= 3.2) - middleware - thor - thread_safe pry (0.14.2) coderay (~> 1.1) method_source (~> 1.0) pry-byebug (3.10.1) byebug (~> 11.0) pry (>= 0.13, < 0.15) - public_suffix (5.0.3) - puma (5.6.7) + psych (5.1.1.1) + stringio + public_suffix (5.0.4) + puma (5.6.8) nio4r (~> 2.0) pundit (1.1.0) activesupport (>= 3.0.0) @@ -467,37 +485,39 @@ GEM pusher-signature (~> 0.1.8) pusher-signature (0.1.8) raabro (1.4.0) - racc (1.7.1) + racc (1.7.3) rack (2.2.8) rack-canonical-host (1.2.0) addressable (> 0, < 3) rack (>= 1, < 4) - rack-contrib (2.3.0) - rack (~> 2.0) rack-cors (1.1.1) rack (>= 2.0.0) rack-mini-profiler (3.1.1) rack (>= 1.2.0) rack-proxy (0.7.7) rack + rack-session (1.0.1) + rack (< 3) rack-ssl-enforcer (0.2.9) rack-test (2.1.0) rack (>= 1.3) - rails (6.1.7.1) - actioncable (= 6.1.7.1) - actionmailbox (= 6.1.7.1) - actionmailer (= 6.1.7.1) - actionpack (= 6.1.7.1) - actiontext (= 6.1.7.1) - actionview (= 6.1.7.1) - activejob (= 6.1.7.1) - activemodel (= 6.1.7.1) - activerecord (= 6.1.7.1) - activestorage (= 6.1.7.1) - activesupport (= 6.1.7.1) + rackup (1.0.0) + rack (< 3) + webrick + rails (7.1.1) + actioncable (= 7.1.1) + actionmailbox (= 7.1.1) + actionmailer (= 7.1.1) + actionpack (= 7.1.1) + actiontext (= 7.1.1) + actionview (= 7.1.1) + activejob (= 7.1.1) + activemodel (= 7.1.1) + activerecord (= 7.1.1) + activestorage (= 7.1.1) + activesupport (= 7.1.1) bundler (>= 1.15.0) - railties (= 6.1.7.1) - sprockets-rails (>= 2.0.0) + railties (= 7.1.1) rails-controller-testing (1.0.5) actionpack (>= 5.0.1.rc1) actionview (>= 5.0.1.rc1) @@ -516,20 +536,24 @@ GEM actionview (> 3.1) activesupport (> 3.1) railties (> 3.1) - railties (6.1.7.1) - actionpack (= 6.1.7.1) - activesupport (= 6.1.7.1) - method_source + railties (7.1.1) + actionpack (= 7.1.1) + activesupport (= 7.1.1) + irb + rackup (>= 1.0.0) rake (>= 12.2) - thor (~> 1.0) + thor (~> 1.0, >= 1.2.2) + zeitwerk (~> 2.6) rainbow (3.1.1) - rake (13.0.6) + rake (13.1.0) rb-fsevent (0.11.2) rb-inotify (0.10.1) ffi (~> 1.0) rb-readline (0.5.5) - redis (5.0.7) - redis-client (>= 0.9.0) + rdoc (6.6.0) + psych (>= 4.0.0) + redis (5.0.8) + redis-client (>= 0.17.0) redis-actionpack (5.3.0) actionpack (>= 5, < 8) redis-rack (>= 2.1.0, < 3) @@ -537,7 +561,7 @@ GEM redis-activesupport (5.3.0) activesupport (>= 3, < 8) redis-store (>= 1.3, < 2) - redis-client (0.16.0) + redis-client (0.18.0) connection_pool redis-rack (2.1.4) rack (>= 2.0.8, < 3) @@ -546,16 +570,18 @@ GEM redis-actionpack (>= 5.0, < 6) redis-activesupport (>= 5.0, < 6) redis-store (>= 1.2, < 2) - redis-store (1.9.2) + redis-store (1.10.0) redis (>= 4, < 6) - regexp_parser (1.8.2) + regexp_parser (2.8.2) + reline (0.4.0) + io-console (~> 0.5) representable (3.2.0) declarative (< 0.1.0) trailblazer-option (>= 0.1.1, < 0.2.0) uber (< 0.2.0) request_store (1.5.1) rack (>= 1.4) - responders (3.1.0) + responders (3.1.1) actionpack (>= 5.2) railties (>= 5.2) rest-client (2.1.0) @@ -579,15 +605,15 @@ GEM rspec-mocks (3.12.6) diff-lcs (>= 1.2.0, < 2.0) rspec-support (~> 3.12.0) - rspec-rails (4.0.2) - actionpack (>= 4.2) - activesupport (>= 4.2) - railties (>= 4.2) - rspec-core (~> 3.10) - rspec-expectations (~> 3.10) - rspec-mocks (~> 3.10) - rspec-support (~> 3.10) - rspec-sidekiq (4.0.2) + rspec-rails (6.0.3) + actionpack (>= 6.1) + activesupport (>= 6.1) + railties (>= 6.1) + rspec-core (~> 3.12) + rspec-expectations (~> 3.12) + rspec-mocks (~> 3.12) + rspec-support (~> 3.12) + rspec-sidekiq (4.1.0) rspec-core (~> 3.0) rspec-expectations (~> 3.0) rspec-mocks (~> 3.0) @@ -605,15 +631,15 @@ GEM rubocop-ast (>= 0.6.0) ruby-progressbar (~> 1.7) unicode-display_width (>= 1.4.0, < 2.0) - rubocop-ast (1.29.0) + rubocop-ast (1.30.0) parser (>= 3.2.1.0) ruby-progressbar (1.13.0) ruby-rc4 (0.1.5) - ruby-vips (2.1.4) + ruby-vips (2.2.0) ffi (~> 1.12) ruby2_keywords (0.0.5) rubyzip (2.3.2) - sanitize (6.0.2) + sanitize (6.1.0) crass (~> 1.0.2) nokogiri (>= 1.12.0) sass (3.7.4) @@ -623,7 +649,7 @@ GEM rb-inotify (~> 0.9, >= 0.9.7) sassc (2.4.0) ffi (~> 1.9) - selenium-webdriver (4.9.0) + selenium-webdriver (4.15.0) rexml (~> 3.2, >= 3.2.5) rubyzip (>= 1.2.2, < 3.0) websocket (~> 1.0) @@ -633,21 +659,21 @@ GEM rails (>= 4) shoulda-matchers (5.3.0) activesupport (>= 5.2.0) - sidekiq (7.1.2) + sidekiq (7.2.0) concurrent-ruby (< 2) connection_pool (>= 2.3.0) rack (>= 2.2.4) redis-client (>= 0.14.0) - sidekiq-cron (1.10.1) + sidekiq-cron (1.11.0) fugit (~> 1.8) globalid (>= 1.0.1) sidekiq (>= 6) - signet (0.17.0) + signet (0.18.0) addressable (~> 2.8) faraday (>= 0.17.5, < 3.a) jwt (>= 1.5, < 3.0) multi_json (~> 1.10) - simple_form (5.2.0) + simple_form (5.3.0) actionpack (>= 5.2) activemodel (>= 5.2) simplecov (0.22.0) @@ -674,26 +700,24 @@ GEM activesupport (>= 5.2) sprockets (>= 3.0.0) ssrf_filter (1.1.2) - statesman (3.5.0) + statesman (11.0.0) + stringio (3.0.9) temple (0.8.2) - thor (1.2.2) + terser (1.1.20) + execjs (>= 0.3.0, < 3) + thor (1.3.0) thread_safe (0.3.6) tilt (2.0.11) timecop (0.9.8) - timeout (0.4.0) + timeout (0.4.1) trailblazer-option (0.1.2) ttfunk (1.7.0) - turnip (4.2.0) - cucumber-gherkin (~> 14.0) + turnip (4.4.0) + cuke_modeler (~> 3.15) rspec (>= 3.0, < 4.0) tzinfo (2.0.6) concurrent-ruby (~> 1.0) uber (0.1.0) - uglifier (4.2.0) - execjs (>= 0.3.0, < 3) - unf (0.1.4) - unf_ext - unf_ext (0.0.8.2) unicode-display_width (1.8.0) unicode_utils (1.4.0) vigilion-rails (2.1.0) @@ -705,7 +729,7 @@ GEM descendants_tracker (~> 0.0, >= 0.0.3) warden (1.2.9) rack (>= 2.0.9) - web-console (4.2.0) + web-console (4.2.1) actionview (>= 6.0.0) activemodel (>= 6.0.0) bindex (>= 0.4.0) @@ -714,13 +738,13 @@ GEM addressable (>= 2.3.6) crack (>= 0.3.2) hashdiff (>= 0.4.0, < 2.0.0) - webpacker (6.0.0.beta.7) + webpacker (6.0.0.rc.6) activesupport (>= 5.2) rack-proxy (>= 0.6.1) railties (>= 5.2) semantic_range (>= 2.3.0) webrick (1.8.1) - websocket (1.2.9) + websocket (1.2.10) websocket-driver (0.7.6) websocket-extensions (>= 0.1.0) websocket-extensions (0.1.5) @@ -728,11 +752,13 @@ GEM railties (>= 3.0.7) xpath (3.2.0) nokogiri (~> 1.8) - zeitwerk (2.6.11) - zxcvbn (0.1.9) + zeitwerk (2.6.12) + zxcvbn (0.1.10) PLATFORMS - ruby + arm64-darwin-21 + x86_64-darwin-22 + x86_64-linux DEPENDENCIES active_hash @@ -743,8 +769,8 @@ DEPENDENCIES bootscale bootstrap-sass (~> 3.4) browser (= 2.4.0) - capybara (= 3.33) - carrierwave (~> 2.2.2) + capybara (~> 3.39) + carrierwave (~> 2.2.5) carrierwave-google-storage! ckeditor codeclimate_circle_ci_coverage @@ -763,7 +789,7 @@ DEPENDENCIES draper (~> 4.0) email_validator enumerize - factory_bot_rails + factory_bot_rails (= 6.2) gon (>= 6.4.0) google-cloud-storage (~> 1.34.1) govuk_frontend_toolkit (~> 3.1.0) @@ -771,7 +797,7 @@ DEPENDENCIES hashie (~> 3.5) hiredis jbuilder (~> 2.10.1) - jquery-rails (= 4.4.0) + jquery-rails (~> 4.4) jquery-ui-rails (= 6.0.1) js_cookie_rails (= 2.1.4) json (= 2.3.0) @@ -781,10 +807,10 @@ DEPENDENCIES listen lograge mail-notify (~> 1.0) - meta_request + matrix (~> 0.4.1) nilify_blanks nokogiri - paper_trail (~> 10.3) + paper_trail (~> 15.0) pdf-inspector pg pg_search (~> 2.3.3) @@ -792,14 +818,14 @@ DEPENDENCIES prawn prawn-table pry-byebug - puma (~> 5.6.7) + puma (~> 5.6.8) pundit (~> 1.1) pusher (= 0.15.2) rack-canonical-host rack-cors (~> 1.0) rack-mini-profiler (>= 0.10.1) rack-ssl-enforcer - rails (= 6.1.7.1) + rails (= 7.1.1) rails-controller-testing rails-healthcheck rails-html-sanitizer (>= 1.4.3) @@ -810,7 +836,7 @@ DEPENDENCIES responders (~> 3.0) rest-client rspec-github - rspec-rails (~> 4.0.1) + rspec-rails (~> 6.0) rspec-sidekiq rspec_junit_formatter (= 0.2.3) rubocop (~> 0.52) @@ -824,21 +850,21 @@ DEPENDENCIES slim-rails (~> 3.2.0) sprockets (~> 3.7.2) sprockets-rails (>= 2.0.0) - statesman (= 3.5.0) + statesman (~> 11.0) + terser (~> 1.1) timecop - turnip (~> 4.2.0) - uglifier (>= 2.7.2) + turnip (~> 4.4.0) vigilion (~> 1.0.4)! vigilion-rails (~> 2.1.0) virtus web-console webmock (= 3.13.0) - webpacker (= 6.0.0.beta.7) + webpacker websocket-extensions (~> 0.1.5) wicked (~> 1.1) RUBY VERSION - ruby 2.7.7p221 + ruby 3.2.2p53 BUNDLED WITH 2.4.8 diff --git a/README.md b/README.md index 4e89a3f68..b0734358e 100644 --- a/README.md +++ b/README.md @@ -18,8 +18,8 @@ docker-compose run web bundle exec rake db:migrate ### Pre-requisites -* Ruby 2.7 -* Rails 6.1 +* Ruby 3.2 +* Rails 7.1 * Postgresql 9.5+ * Redis 2.8+ diff --git a/app/assets/javascripts/add_jquery.js b/app/assets/javascripts/add_jquery.js new file mode 100644 index 000000000..e69de29bb diff --git a/app/assets/javascripts/add_jquery_ujs.js b/app/assets/javascripts/add_jquery_ujs.js new file mode 100644 index 000000000..f145da5fc --- /dev/null +++ b/app/assets/javascripts/add_jquery_ujs.js @@ -0,0 +1 @@ +import "jquery_ujs" diff --git a/app/assets/javascripts/application-admin.js.coffee b/app/assets/javascripts/application-admin.js.coffee index 6730e793c..b35d67e1e 100644 --- a/app/assets/javascripts/application-admin.js.coffee +++ b/app/assets/javascripts/application-admin.js.coffee @@ -1,5 +1,5 @@ -#= require jquery -#= require jquery_ujs +#= require jquery3 +#= require jquery-ujs #= require bootstrap-sprockets #= require vendor/file_upload/jquery.ui.widget #= require vendor/file_upload/jquery.iframe-transport @@ -26,9 +26,9 @@ #= require vendor/jquery-debounce #= require clean-paste -$(document).ready(() -> +$( -> $("html").removeClass("no-js").addClass("js") - ($ ".timepicker").timePicker() ($ ".datepicker").datepicker({dateFormat: "dd/mm/yy"}) + ($ ".timepicker").timePicker() ($ "select.select2").select2({width: "style"}) ) diff --git a/app/assets/javascripts/application.js.coffee b/app/assets/javascripts/application.js.coffee index 7cb19b487..6ebe7108c 100644 --- a/app/assets/javascripts/application.js.coffee +++ b/app/assets/javascripts/application.js.coffee @@ -1,5 +1,5 @@ #= require jquery3 -#= require jquery_ujs +#= require jquery-ujs #= require vendor/file_upload/jquery.ui.widget #= require vendor/file_upload/jquery.iframe-transport #= require vendor/file_upload/jquery.fileupload diff --git a/app/assets/javascripts/frontend/custom_questions/support_letters.js.coffee b/app/assets/javascripts/frontend/custom_questions/support_letters.js.coffee index 146b4fb90..45e28c79f 100644 --- a/app/assets/javascripts/frontend/custom_questions/support_letters.js.coffee +++ b/app/assets/javascripts/frontend/custom_questions/support_letters.js.coffee @@ -60,7 +60,6 @@ window.SupportLetters = enable_item_fields_and_controls: (parent) -> parent.find(".js-save-collection").removeClass("govuk-!-display-none") parent.find(".visible-read-only").hide() - parent.find(".remove-link").removeClass("govuk-!-display-none") fields = parent.find("input") fields.removeClass("read-only") parent.find(".govuk-error-message").html("") @@ -124,6 +123,7 @@ window.SupportLetters = SupportLetters.disable_item_fields_and_controls(parent) window.FormValidation.validateStep() SupportLetters.autosave() + SupportLetters.showRemoveLink(parent, data, response) return error: (response) -> @@ -154,3 +154,9 @@ window.SupportLetters = type: 'POST' dataType: 'json' }) + + showRemoveLink: (parent, data, response) -> + removeLink = $(".remove-supporter", parent) + removeLink.data("url", "/users/form_answers/#{response['form_answer_id']}/support_letters/#{response['id']}") + removeLink.attr("aria-label", "Delete support letter from #{data['support_letter']['first_name']} #{data['support_letter']['last_name']}") + removeLink.removeClass("govuk-!-display-none") diff --git a/app/assets/javascripts/frontend/form-validation.js.coffee b/app/assets/javascripts/frontend/form-validation.js.coffee index 128b332f9..fd40f0a05 100644 --- a/app/assets/javascripts/frontend/form-validation.js.coffee +++ b/app/assets/javascripts/frontend/form-validation.js.coffee @@ -355,8 +355,8 @@ window.FormValidation = validateSupportLetters: (question) -> lettersReceived = $(".js-support-letter-received").length if lettersReceived < 2 - @logThis(question, "validateSupportLetters", "Upload at least two letters of support") - @appendMessage(question, "Upload at least two letters of support") + @logThis(question, "validateSupportLetters", "Upload two letters of support") + @appendMessage(question, "Upload two letters of support") @addErrorClass(question) validateSelectionLimit: (question) -> diff --git a/app/assets/javascripts/twofactor.js.coffee b/app/assets/javascripts/twofactor.js.coffee index 811f6ac72..c6cd4d81a 100644 --- a/app/assets/javascripts/twofactor.js.coffee +++ b/app/assets/javascripts/twofactor.js.coffee @@ -1,4 +1,4 @@ -#= require jquery +#= require jquery3 #= require jquery_ujs #= require bootstrap-sprockets #= require devise_authy diff --git a/app/controllers/admin/admins_controller.rb b/app/controllers/admin/admins_controller.rb index 439562e52..402a64611 100644 --- a/app/controllers/admin/admins_controller.rb +++ b/app/controllers/admin/admins_controller.rb @@ -1,5 +1,7 @@ class Admin::AdminsController < Admin::UsersController before_action :find_resource, except: [:index, :new, :create, :login_as_assessor, :login_as_user, :console] + before_action :permit_search_params, except: [:index] + def index params[:search] ||= AdminSearch::DEFAULT_SEARCH params[:search].permit! @@ -21,7 +23,7 @@ def create authorize @resource, :create? @resource.save - location = @resource.persisted? ? admin_admins_path : nil + location = @resource.persisted? ? admin_admins_path(search: params[:search], page: params[:page]) : nil respond_with :admin, @resource, location: location end @@ -34,14 +36,18 @@ def update @resource.update_without_password(resource_params) end - respond_with :admin, @resource, location: admin_admins_path + respond_with :admin, + @resource, + location: admin_admins_path(search: params[:search], page: params[:page]) end def destroy authorize @resource, :destroy? @resource.soft_delete! - respond_with :admin, @resource, location: admin_admins_path + respond_with :admin, + @resource, + location: admin_admins_path(search: params[:search], page: params[:page]) end # NOTE: debug abilities for Admin - BEGIN @@ -80,4 +86,8 @@ def resource_params :first_name, :last_name) end + + def permit_search_params + params[:search].permit! if params[:search].present? + end end diff --git a/app/controllers/admin/assessors_controller.rb b/app/controllers/admin/assessors_controller.rb index 0d5de6920..004bfd902 100644 --- a/app/controllers/admin/assessors_controller.rb +++ b/app/controllers/admin/assessors_controller.rb @@ -1,4 +1,6 @@ class Admin::AssessorsController < Admin::UsersController + before_action :permit_search_params, except: [:index] + def index params[:search] ||= AssessorSearch::DEFAULT_SEARCH params[:search].permit! @@ -21,7 +23,7 @@ def create authorize @resource, :create? @resource.save - location = @resource.persisted? ? admin_assessors_path : nil + location = @resource.persisted? ? admin_assessors_path(search: params[:search], page: params[:page]) : nil respond_with :admin, @resource, location: location, notice: "User has been successfully added." end @@ -34,14 +36,19 @@ def update @resource.update_without_password(resource_params) end - respond_with :admin, @resource, location: admin_assessors_path, notice: "User has been updated." + respond_with :admin, + @resource, + location: admin_assessors_path(search: params[:search], page: params[:page]), + notice: "User has been updated." end def destroy authorize @resource, :destroy? @resource.soft_delete! - respond_with :admin, @resource, location: admin_assessors_path + respond_with :admin, + @resource, + location: admin_assessors_path(search: params[:search], page: params[:page]) end private @@ -59,4 +66,8 @@ def resource_params :first_name, :last_name) end + + def permit_search_params + params[:search].permit! if params[:search].present? + end end diff --git a/app/controllers/admin/form_answers_controller.rb b/app/controllers/admin/form_answers_controller.rb index f27e1ecc2..310f19635 100644 --- a/app/controllers/admin/form_answers_controller.rb +++ b/app/controllers/admin/form_answers_controller.rb @@ -40,7 +40,7 @@ class Admin::FormAnswersController < Admin::BaseController expose(:questions_with_references) do all_form_questions.select do |q| - !q.is_a?(QAEFormBuilder::HeaderQuestion) && + !q.is_a?(QaeFormBuilder::HeaderQuestion) && (q.ref.present? || q.sub_ref.present?) end end diff --git a/app/controllers/admin/group_leaders_controller.rb b/app/controllers/admin/group_leaders_controller.rb index dbd9765b0..8dbc034f9 100644 --- a/app/controllers/admin/group_leaders_controller.rb +++ b/app/controllers/admin/group_leaders_controller.rb @@ -1,4 +1,6 @@ class Admin::GroupLeadersController < Admin::UsersController + before_action :permit_search_params, except: [:index] + def index params[:search] ||= GroupLeaderSearch::DEFAULT_SEARCH params[:search].permit! @@ -20,7 +22,7 @@ def update respond_with :admin, @resource, - location: admin_group_leaders_path, + location: admin_group_leaders_path(search: params[:search], page: params[:page]), notice: "User has been successfully updated." end @@ -28,7 +30,9 @@ def destroy authorize @resource, :destroy? @resource.soft_delete! - respond_with :admin, @resource, location: admin_group_leaders_path + respond_with :admin, + @resource, + location: admin_group_leaders_path(search: params[:search], page: params[:page]) end private @@ -45,4 +49,8 @@ def resource_params :first_name, :last_name) end + + def permit_search_params + params[:search].permit! if params[:search].present? + end end diff --git a/app/controllers/admin/lieutenants_controller.rb b/app/controllers/admin/lieutenants_controller.rb index bac4af611..7e6bdcb22 100644 --- a/app/controllers/admin/lieutenants_controller.rb +++ b/app/controllers/admin/lieutenants_controller.rb @@ -1,4 +1,6 @@ class Admin::LieutenantsController < Admin::UsersController + before_action :permit_search_params, except: [:index] + def index params[:search] ||= LieutenantSearch::DEFAULT_SEARCH params[:search].permit! @@ -30,7 +32,7 @@ def create authorize @resource, :create? @resource.save - location = @resource.persisted? ? admin_lieutenants_path : nil + location = @resource.persisted? ? admin_lieutenants_path(search: params[:search], page: params[:page]) : nil respond_with :admin, @resource, location: location, @@ -48,7 +50,7 @@ def update respond_with :admin, @resource, - location: admin_lieutenants_path, + location: admin_lieutenants_path(search: params[:search], page: params[:page]), notice: "User has been successfully updated." end @@ -60,7 +62,7 @@ def restore respond_with :admin, @resource, - location: admin_lieutenants_path, + location: admin_lieutenants_path(search: params[:search], page: params[:page]), notice: "User has been successfully restored." end @@ -68,7 +70,9 @@ def destroy authorize @resource, :destroy? @resource.soft_delete! - respond_with :admin, @resource, location: admin_lieutenants_path + respond_with :admin, + @resource, + location: admin_lieutenants_path(search: params[:search], page: params[:page]) end private @@ -87,4 +91,8 @@ def resource_params :role, :ceremonial_county_id) end + + def permit_search_params + params[:search].permit! if params[:search].present? + end end diff --git a/app/controllers/admin/users_controller.rb b/app/controllers/admin/users_controller.rb index e01598011..aef27c23d 100644 --- a/app/controllers/admin/users_controller.rb +++ b/app/controllers/admin/users_controller.rb @@ -1,11 +1,11 @@ class Admin::UsersController < Admin::BaseController respond_to :html before_action :find_resource, except: [:index, :new, :create, :deleted, :restore] + before_action :permit_search_params, except: [:index] def index params[:search] ||= UserSearch::DEFAULT_SEARCH params[:search].permit! - authorize User, :index? @search = UserSearch.new(User.all).search(params[:search]) @@ -28,7 +28,7 @@ def create authorize @resource, :create? @resource.save - location = @resource.persisted? ? admin_users_path : nil + location = @resource.persisted? ? admin_users_path(search: params[:search], page: params[:page]) : nil respond_with :admin, @resource, location: location end @@ -41,7 +41,7 @@ def update @resource.update_without_password(resource_params) end - respond_with :admin, @resource, location: admin_users_path + respond_with :admin, @resource, location: admin_users_path(search: params[:search], page: params[:page]) end def resend_confirmation_email @@ -50,7 +50,7 @@ def resend_confirmation_email @resource.send_confirmation_instructions flash[:success] = "Confirmation instructions were successfully sent to #{@resource.decorate.full_name} (#{@resource.email})" respond_with :admin, @resource, - location: admin_users_path + location: admin_users_path(search: params[:search], page: params[:page]) end def unlock @@ -59,7 +59,7 @@ def unlock @resource.unlock_access! flash[:success] = "User #{@resource.decorate.full_name} (#{@resource.email}) successfully unlocked!" respond_with :admin, @resource, - location: edit_admin_user_path(@resource) + location: edit_admin_user_path(@resource, search: params[:search], page: params[:page]) end def log_in @@ -88,4 +88,8 @@ def resource_params :password_confirmation ) end + + def permit_search_params + params[:search].permit! if params[:search].present? + end end diff --git a/app/controllers/assessor/form_answers_controller.rb b/app/controllers/assessor/form_answers_controller.rb index 4ffea4aeb..0639bd0da 100644 --- a/app/controllers/assessor/form_answers_controller.rb +++ b/app/controllers/assessor/form_answers_controller.rb @@ -11,7 +11,7 @@ class Assessor::FormAnswersController < Assessor::BaseController expose(:questions_with_references) do all_form_questions.select do |q| - !q.is_a?(QAEFormBuilder::HeaderQuestion) && + !q.is_a?(QaeFormBuilder::HeaderQuestion) && (q.ref.present? || q.sub_ref.present?) end end @@ -36,7 +36,7 @@ def index scope = current_assessor.applications_scope( params[:year].to_s == "all_years" ? nil : @award_year - ).eligible_for_assessor + ).includes(:assessor_assignments).eligible_for_assessor if search_params[:query].blank? && category_picker.show_award_tabs_for_assessor? scope = scope.where(award_type: category_picker.current_award_type) @@ -73,6 +73,7 @@ def index def show authorize resource, :show? + @admin_verdict = resource.admin_verdict respond_to do |format| format.html @@ -94,13 +95,17 @@ def show def edit authorize resource, :edit? + unless assessor_assignment.status + assessor_assignment.update(status: "viewed") + end + @form = resource.award_form.decorate(answers: HashWithIndifferentAccess.new(resource.document)) end private def resource - @form_answer ||= current_assessor.applications_scope(@award_year).find(params[:id]).decorate + @form_answer ||= current_assessor.applications_scope(@award_year).includes(:assessor_assignments).find(params[:id]).decorate end def category_picker @@ -119,4 +124,9 @@ def resolve_layout "application-assessor" end end + + def assessor_assignment + AssessorAssignment.find_by(assessor_id: current_assessor.id, form_answer_id: resource.id) || + resource.assessor_assignments.build(assessor: current_assessor, award_year: @award_year) + end end diff --git a/app/controllers/form/support_letters_controller.rb b/app/controllers/form/support_letters_controller.rb index 2aa7a0efd..673f6039c 100644 --- a/app/controllers/form/support_letters_controller.rb +++ b/app/controllers/form/support_letters_controller.rb @@ -30,6 +30,9 @@ def new end def destroy + # safeguard for the case when not a user tries to delete a letter + return if current_assessor || current_leutenant + if @support_letter.destroy remove_support_letter_from_document! @form_answer.save diff --git a/app/controllers/form_controller.rb b/app/controllers/form_controller.rb index 0a722a8c4..2316934c9 100644 --- a/app/controllers/form_controller.rb +++ b/app/controllers/form_controller.rb @@ -36,7 +36,7 @@ class FormController < ApplicationController expose(:questions_with_references) do all_form_questions.select do |q| - !q.is_a?(QAEFormBuilder::HeaderQuestion) && + !q.is_a?(QaeFormBuilder::HeaderQuestion) && (q.ref.present? || q.sub_ref.present?) end end diff --git a/app/controllers/lieutenant/form_answers_controller.rb b/app/controllers/lieutenant/form_answers_controller.rb index f72ac4376..d2441cb5d 100644 --- a/app/controllers/lieutenant/form_answers_controller.rb +++ b/app/controllers/lieutenant/form_answers_controller.rb @@ -15,7 +15,7 @@ class Lieutenant::FormAnswersController < Lieutenant::BaseController expose(:questions_with_references) do all_form_questions.select do |q| - !q.is_a?(QAEFormBuilder::HeaderQuestion) && + !q.is_a?(QaeFormBuilder::HeaderQuestion) && (q.ref.present? || q.sub_ref.present?) end end diff --git a/app/controllers/users/support_letters_controller.rb b/app/controllers/users/support_letters_controller.rb index 63ca0af19..940bb16c1 100644 --- a/app/controllers/users/support_letters_controller.rb +++ b/app/controllers/users/support_letters_controller.rb @@ -30,7 +30,7 @@ def create attachment.support_letter = support_letter attachment.save! - render json: support_letter.id, + render json: { id: support_letter.id, form_answer_id: form_answer.id }, status: :created else render json: support_letter.errors.messages.to_json, diff --git a/app/decorators/form_answer_decorator.rb b/app/decorators/form_answer_decorator.rb index ed7d74fc0..4af1182cd 100644 --- a/app/decorators/form_answer_decorator.rb +++ b/app/decorators/form_answer_decorator.rb @@ -168,7 +168,7 @@ def progress_text def average_growth_for(year) if object.sic_code.present? - sic = SICCode.find_by_code(object.sic_code) + sic = SicCode.find_by_code(object.sic_code) sic.by_year(year) if sic end end @@ -182,7 +182,7 @@ def all_average_growths def sic_code_name sic = object.sic_code if sic.present? - SICCode.find_by_code(sic).name + SicCode.find_by_code(sic).name end end @@ -194,7 +194,7 @@ def corp_responsibility_required_keys object.award_form.steps.detect do |step| step.short_title == "Declaration of Corporate Responsibility" end.questions.select do |q| - q.is_a?(QAEFormBuilder::TextareaQuestion) && q.required + q.is_a?(QaeFormBuilder::TextareaQuestion) && q.required end.map(&:key) .map(&:to_s) end @@ -212,7 +212,7 @@ def awarded? def average_growth_legend(years = [1, 2, 3]) growths = years.map { |y| average_growth_for(y) }.uniq growths.map do |g| - note = SICCode::NOTES[g] + note = SicCode::NOTES[g] "#{g} - #{note}" if note end.compact.join("\n") end diff --git a/app/form_pointers/financial_table.rb b/app/form_pointers/financial_table.rb index dd6dea586..9b4475bc0 100644 --- a/app/form_pointers/financial_table.rb +++ b/app/form_pointers/financial_table.rb @@ -142,9 +142,9 @@ def financial_years_number end def one_option_question? - question.is_a?(QAEFormBuilder::OneOptionByYearsLabelQuestionDecorator) || - question.is_a?(QAEFormBuilder::OneOptionByYearsQuestionDecorator) || - question.is_a?(QAEFormBuilder::OneOptionByYearsLabelQuestion) || - question.is_a?(QAEFormBuilder::OneOptionByYearsQuestion) + question.is_a?(QaeFormBuilder::OneOptionByYearsLabelQuestionDecorator) || + question.is_a?(QaeFormBuilder::OneOptionByYearsQuestionDecorator) || + question.is_a?(QaeFormBuilder::OneOptionByYearsLabelQuestion) || + question.is_a?(QaeFormBuilder::OneOptionByYearsQuestion) end end diff --git a/app/form_pointers/financial_year_pointer.rb b/app/form_pointers/financial_year_pointer.rb index 998f235ff..a8885b0e9 100644 --- a/app/form_pointers/financial_year_pointer.rb +++ b/app/form_pointers/financial_year_pointer.rb @@ -21,13 +21,13 @@ def data def fetch_data case question.delegate_obj - when QAEFormBuilder::ByYearsLabelQuestion + when QaeFormBuilder::ByYearsLabelQuestion fetch_year_labels - when QAEFormBuilder::ByYearsQuestion + when QaeFormBuilder::ByYearsQuestion fetch_years - when QAEFormBuilder::OneOptionByYearsLabelQuestion + when QaeFormBuilder::OneOptionByYearsLabelQuestion fetch_one_option_year_labels - when QAEFormBuilder::OneOptionByYearsQuestion + when QaeFormBuilder::OneOptionByYearsQuestion fetch_one_option_years end end diff --git a/app/form_pointers/form_financial_pointer.rb b/app/form_pointers/form_financial_pointer.rb index b49443a57..3dc76ab97 100644 --- a/app/form_pointers/form_financial_pointer.rb +++ b/app/form_pointers/form_financial_pointer.rb @@ -13,10 +13,10 @@ class FormFinancialPointer :options TARGET_FINANCIAL_DATA_QUESTION_TYPES = [ - QAEFormBuilder::ByYearsLabelQuestion, - QAEFormBuilder::ByYearsQuestion, - QAEFormBuilder::OneOptionByYearsLabelQuestion, - QAEFormBuilder::OneOptionByYearsQuestion + QaeFormBuilder::ByYearsLabelQuestion, + QaeFormBuilder::ByYearsQuestion, + QaeFormBuilder::OneOptionByYearsLabelQuestion, + QaeFormBuilder::OneOptionByYearsQuestion ] YEAR_LABELS = %w(day month year) IN_PROGRESS = "-" diff --git a/app/forms/award_years/v2022/qae_forms.rb b/app/forms/award_years/v2022/qae_forms.rb deleted file mode 100644 index 7e345a35a..000000000 --- a/app/forms/award_years/v2022/qae_forms.rb +++ /dev/null @@ -1,4 +0,0 @@ -require 'award_years/v2022/qavs' - -class AwardYears::V2022::QAEForms -end diff --git a/app/forms/award_years/v2022/qavs.rb b/app/forms/award_years/v2022/qavs.rb deleted file mode 100644 index ff3a2171c..000000000 --- a/app/forms/award_years/v2022/qavs.rb +++ /dev/null @@ -1,30 +0,0 @@ -require "award_years/v2022/qavs/qavs_step1" -require "award_years/v2022/qavs/qavs_step2" -require "award_years/v2022/qavs/qavs_step3" -require "award_years/v2022/qavs/qavs_step4" -require "award_years/v2022/qavs/qavs_step5" - -class AwardYears::V2022::QAEForms - class << self - def qavs - @qavs ||= QAEFormBuilder.build "Queen's Award for Voluntary Service Nomination" do - step "nominee", - &AwardYears::V2022::QAEForms.qavs_step1 - - step "recommendation", - &AwardYears::V2022::QAEForms.qavs_step2 - - step "letters_of_support", - { id: :letters_of_support_step }, - &AwardYears::V2022::QAEForms.qavs_step3 - - step "submit_step", - &AwardYears::V2022::QAEForms.qavs_step4 - - step "local_assessment_form", - { id: :local_assessment }, - &AwardYears::V2022::QAEForms.qavs_step5 - end - end - end -end diff --git a/app/forms/award_years/v2023/qae_forms.rb b/app/forms/award_years/v2023/qae_forms.rb deleted file mode 100644 index 2835928a9..000000000 --- a/app/forms/award_years/v2023/qae_forms.rb +++ /dev/null @@ -1,4 +0,0 @@ -require 'award_years/v2023/qavs' - -class AwardYears::V2023::QAEForms -end diff --git a/app/forms/award_years/v2023/qavs.rb b/app/forms/award_years/v2023/qavs.rb deleted file mode 100644 index df3c93452..000000000 --- a/app/forms/award_years/v2023/qavs.rb +++ /dev/null @@ -1,30 +0,0 @@ -require "award_years/v2023/qavs/qavs_step1" -require "award_years/v2023/qavs/qavs_step2" -require "award_years/v2023/qavs/qavs_step3" -require "award_years/v2023/qavs/qavs_step4" -require "award_years/v2023/qavs/qavs_step5" - -class AwardYears::V2023::QAEForms - class << self - def qavs - @qavs ||= QAEFormBuilder.build "King's Award for Voluntary Service Nomination" do - step "nominee", - &AwardYears::V2023::QAEForms.qavs_step1 - - step "recommendation", - &AwardYears::V2023::QAEForms.qavs_step2 - - step "letters_of_support", - { id: :letters_of_support_step }, - &AwardYears::V2023::QAEForms.qavs_step3 - - step "submit_step", - &AwardYears::V2023::QAEForms.qavs_step4 - - step "local_assessment_form", - { id: :local_assessment }, - &AwardYears::V2023::QAEForms.qavs_step5 - end - end - end -end diff --git a/app/forms/award_years/v2024/qae_forms.rb b/app/forms/award_years/v2024/qae_forms.rb deleted file mode 100644 index b86d3a686..000000000 --- a/app/forms/award_years/v2024/qae_forms.rb +++ /dev/null @@ -1,4 +0,0 @@ -require 'award_years/v2024/qavs' - -class AwardYears::V2024::QAEForms -end diff --git a/app/forms/award_years/v2024/qavs.rb b/app/forms/award_years/v2024/qavs.rb deleted file mode 100644 index 492f44e3d..000000000 --- a/app/forms/award_years/v2024/qavs.rb +++ /dev/null @@ -1,30 +0,0 @@ -require "award_years/v2024/qavs/qavs_step1" -require "award_years/v2024/qavs/qavs_step2" -require "award_years/v2024/qavs/qavs_step3" -require "award_years/v2024/qavs/qavs_step4" -require "award_years/v2024/qavs/qavs_step5" - -class AwardYears::V2024::QAEForms - class << self - def qavs - @qavs ||= QAEFormBuilder.build "King's Award for Voluntary Service Nomination" do - step "nominee", - &AwardYears::V2024::QAEForms.qavs_step1 - - step "recommendation", - &AwardYears::V2024::QAEForms.qavs_step2 - - step "letters_of_support", - { id: :letters_of_support_step }, - &AwardYears::V2024::QAEForms.qavs_step3 - - step "submit_step", - &AwardYears::V2024::QAEForms.qavs_step4 - - step "local_assessment_form", - { id: :local_assessment }, - &AwardYears::V2024::QAEForms.qavs_step5 - end - end - end -end diff --git a/app/helpers/winners_awards_helper.rb b/app/helpers/winners_awards_helper.rb index 6e4dd37f3..d3d010c86 100644 --- a/app/helpers/winners_awards_helper.rb +++ b/app/helpers/winners_awards_helper.rb @@ -1,7 +1,6 @@ module WinnersAwardsHelper def static_s3_asset_path(year, file_name) file_path = "winners assets #{year}/#{file_name}" - URI.encode_www_form_component("https://s3-eu-west-1.amazonaws.com/qae-winners-assets/#{file_path}") + "https://s3-eu-west-1.amazonaws.com/qae-winners-assets/#{CGI.escape(file_path)}" end end - diff --git a/app/javascript/components/session_timeout.js b/app/javascript/components/session_timeout.js index faf38b6e1..62601b4a4 100644 --- a/app/javascript/components/session_timeout.js +++ b/app/javascript/components/session_timeout.js @@ -1,5 +1,4 @@ import MicroModal from 'micromodal'; -import 'jquery/src/jquery'; export default function() { var dialogElement = document.getElementById("timeout_dialog"); diff --git a/app/javascript/packs/application.js b/app/javascript/packs/application.js index 8f3a0d040..9ebba16de 100644 --- a/app/javascript/packs/application.js +++ b/app/javascript/packs/application.js @@ -19,7 +19,6 @@ const frontend = require("govuk-frontend/govuk/all") require.context('govuk-frontend/govuk/assets/images', true) import './application.scss'; -import 'jquery/src/jquery'; import MicroModal from 'micromodal'; import AccessibleAutocomplete from '../vendor/accessible-autocomplete.min'; diff --git a/app/models/assessor_assignment.rb b/app/models/assessor_assignment.rb index 50ec5a492..3c111d68f 100644 --- a/app/models/assessor_assignment.rb +++ b/app/models/assessor_assignment.rb @@ -19,10 +19,10 @@ class AssessorAssignment < ApplicationRecord end begin :associations - belongs_to :assessor - belongs_to :form_answer - belongs_to :editable, polymorphic: true - belongs_to :award_year + belongs_to :assessor, optional: true + belongs_to :form_answer, optional: true + belongs_to :editable, polymorphic: true, optional: true + belongs_to :award_year, optional: true end begin :scopes diff --git a/app/models/audit_log.rb b/app/models/audit_log.rb index 9fe1d2ede..0e9fc472d 100644 --- a/app/models/audit_log.rb +++ b/app/models/audit_log.rb @@ -3,8 +3,8 @@ class AuditLog < ApplicationRecord validates :subject_id, presence: true validates :action_type, presence: true - belongs_to :subject, polymorphic: true - belongs_to :auditable, polymorphic: true + belongs_to :subject, polymorphic: true, optional: true + belongs_to :auditable, polymorphic: true, optional: true scope :data_export, -> { where(auditable_type: nil).or(AuditLog.where(action_type: "download_form_answer")) } scope :data_update, -> { where(auditable_type: "FormAnswer").where("action_type != 'download_form_answer'") } diff --git a/app/models/award_year.rb b/app/models/award_year.rb index 4ea20cb20..c8eb38d10 100644 --- a/app/models/award_year.rb +++ b/app/models/award_year.rb @@ -8,7 +8,7 @@ class AwardYear < ApplicationRecord after_create :create_settings - AVAILABLE_YEARS = [2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024] + AVAILABLE_YEARS = [2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024, 2025] DEFAULT_FINANCIAL_DEADLINE_DAY = 17 DEFAULT_FINANCIAL_DEADLINE_MONTH = 9 diff --git a/app/models/comment.rb b/app/models/comment.rb index 641f20a33..74bfbb6b4 100644 --- a/app/models/comment.rb +++ b/app/models/comment.rb @@ -1,6 +1,6 @@ class Comment < ApplicationRecord - belongs_to :commentable, polymorphic: true - belongs_to :authorable, polymorphic: true + belongs_to :commentable, polymorphic: true, optional: true + belongs_to :authorable, polymorphic: true, optional: true validates :body, presence: true diff --git a/app/models/eligibility.rb b/app/models/eligibility.rb index 43f3dab49..550376dc4 100644 --- a/app/models/eligibility.rb +++ b/app/models/eligibility.rb @@ -4,7 +4,7 @@ class Eligibility < ApplicationRecord AWARD_NAME = "" belongs_to :account - belongs_to :form_answer + belongs_to :form_answer, optional: true attr_accessor :current_step, :force_validate_now diff --git a/app/models/feedback.rb b/app/models/feedback.rb index bed274f16..1b518f5f3 100644 --- a/app/models/feedback.rb +++ b/app/models/feedback.rb @@ -2,13 +2,13 @@ class Feedback < ApplicationRecord has_paper_trail unless: Proc.new { |t| Rails.env.test? } - belongs_to :form_answer + belongs_to :form_answer, optional: true store_accessor :document, FeedbackForm.fields scope :submitted, -> { where submitted: true } - belongs_to :authorable, polymorphic: true - belongs_to :award_year + belongs_to :authorable, polymorphic: true, optional: true + belongs_to :award_year, optional: true validates :form_answer_id, uniqueness: true diff --git a/app/models/form_answer.rb b/app/models/form_answer.rb index 93763c7a9..4f8a80ca5 100644 --- a/app/models/form_answer.rb +++ b/app/models/form_answer.rb @@ -1,9 +1,13 @@ -require 'award_years/v2022/qae_forms' -require 'award_years/v2023/qae_forms' -require 'award_years/v2024/qae_forms' +require_relative '../../forms/award_years/v2022/qae_forms' +require_relative '../../forms/award_years/v2023/qae_forms' +require_relative '../../forms/award_years/v2024/qae_forms' +require_relative '../../forms/award_years/v2025/qae_forms' class FormAnswer < ApplicationRecord - include Statesman::Adapters::ActiveRecordQueries +include Statesman::Adapters::ActiveRecordQueries[ + initial_state: :eligibility_in_progress, + transition_class: FormAnswerTransition + ] include PgSearch::Model extend Enumerize include FormAnswerStatesHelper @@ -37,9 +41,9 @@ class FormAnswer < ApplicationRecord begin :associations belongs_to :user - belongs_to :account - belongs_to :award_year - belongs_to :company_details_editable, polymorphic: true + belongs_to :account, optional: true + belongs_to :award_year, optional: true + belongs_to :company_details_editable, polymorphic: true, optional: true belongs_to :ceremonial_county, optional: true has_one :form_basic_eligibility, class_name: 'Eligibility::Basic', dependent: :destroy @@ -51,8 +55,8 @@ class FormAnswer < ApplicationRecord has_one :admin_verdict, dependent: :destroy has_one :group_leader - belongs_to :primary_assessor, class_name: "Assessor", foreign_key: :primary_assessor_id - belongs_to :secondary_assessor, class_name: "Assessor", foreign_key: :secondary_assessor_id + belongs_to :primary_assessor, class_name: "Assessor", foreign_key: :primary_assessor_id, optional: true + belongs_to :secondary_assessor, class_name: "Assessor", foreign_key: :secondary_assessor_id, optional: true has_many :form_answer_attachments, dependent: :destroy has_many :support_letter_attachments, dependent: :destroy @@ -66,7 +70,7 @@ class FormAnswer < ApplicationRecord begin :validations validates :user, presence: true - validates :sic_code, format: { with: SICCode::REGEX }, allow_nil: true, allow_blank: true + validates :sic_code, format: { with: SicCode::REGEX }, allow_nil: true, allow_blank: true validate :validate_answers validates :ineligible_reason_nominator, presence: true, if: proc { state == "admin_not_eligible_nominator" } validates :ineligible_reason_group, presence: true, if: proc { state == "admin_not_eligible_group" } @@ -152,7 +156,7 @@ def award_form elsif self.class.const_defined?(award_form_class_name(year)) self.class.const_get(award_form_class_name(year)) else - AwardYears::V2024::QAEForms # default value + AwardYears::V2025::QaeForms # default value end else raise ArgumentError, "Can not find award form for the nomination in year: #{award_year.year}" @@ -429,7 +433,7 @@ def validate_answers end def award_form_class_name(year) - "::AwardYears::V#{year}::QAEForms" + "::AwardYears::V#{year}::QaeForms" end def self.transition_class diff --git a/app/models/form_answer_attachment.rb b/app/models/form_answer_attachment.rb index fd4c4eb3c..9ea52ad7e 100644 --- a/app/models/form_answer_attachment.rb +++ b/app/models/form_answer_attachment.rb @@ -1,6 +1,6 @@ class FormAnswerAttachment < ApplicationRecord belongs_to :form_answer - belongs_to :attachable, polymorphic: true + belongs_to :attachable, polymorphic: true, optional: true mount_uploader :file, FormAnswerAttachmentUploader scan_file :file diff --git a/app/models/form_answer_progress.rb b/app/models/form_answer_progress.rb index 7d2d0b592..0327009eb 100644 --- a/app/models/form_answer_progress.rb +++ b/app/models/form_answer_progress.rb @@ -1,5 +1,5 @@ class FormAnswerProgress < ApplicationRecord - belongs_to :form_answer + belongs_to :form_answer, optional: true validates :form_answer_id, presence: true diff --git a/app/models/form_answer_transition.rb b/app/models/form_answer_transition.rb index c62212972..f08891410 100644 --- a/app/models/form_answer_transition.rb +++ b/app/models/form_answer_transition.rb @@ -1,7 +1,7 @@ class FormAnswerTransition < ApplicationRecord include Statesman::Adapters::ActiveRecordTransition - belongs_to :form_answer, inverse_of: :form_answer_transitions + belongs_to :form_answer, optional: true, inverse_of: :form_answer_transitions def transitable t_type = metadata["transitable_type"] diff --git a/app/models/group_leader.rb b/app/models/group_leader.rb index 2c373d7a3..874cb95d1 100644 --- a/app/models/group_leader.rb +++ b/app/models/group_leader.rb @@ -21,7 +21,7 @@ class GroupLeader < ApplicationRecord } } - belongs_to :form_answer + belongs_to :form_answer, optional: true scope :by_email, -> { order(:email) } scope :confirmed, -> { where.not(confirmed_at: nil) } diff --git a/app/models/reports/all_entries.rb b/app/models/reports/all_entries.rb index cc0c7b63e..916f9b285 100644 --- a/app/models/reports/all_entries.rb +++ b/app/models/reports/all_entries.rb @@ -1,5 +1,5 @@ class Reports::AllEntries - include Reports::CSVHelper + include Reports::CsvHelper MAPPING = [ { diff --git a/app/models/reports/citation_report.rb b/app/models/reports/citation_report.rb index bb8426c47..8b9b8d386 100644 --- a/app/models/reports/citation_report.rb +++ b/app/models/reports/citation_report.rb @@ -1,7 +1,7 @@ class Reports::CitationReport attr_reader :award_year, :scope - include Reports::CSVHelper + include Reports::CsvHelper MAPPING = [ { diff --git a/app/models/reports/csv_helper.rb b/app/models/reports/csv_helper.rb index 27398d950..022ceeb55 100644 --- a/app/models/reports/csv_helper.rb +++ b/app/models/reports/csv_helper.rb @@ -1,6 +1,6 @@ require "csv" -module Reports::CSVHelper +module Reports::CsvHelper def build CSV.generate(encoding: "UTF-8", force_quotes: true) do |csv| csv << headers diff --git a/app/models/reports/press_book_list.rb b/app/models/reports/press_book_list.rb index bf1355bd8..05e25cdb2 100644 --- a/app/models/reports/press_book_list.rb +++ b/app/models/reports/press_book_list.rb @@ -1,5 +1,5 @@ class Reports::PressBookList - include Reports::CSVHelper + include Reports::CsvHelper MAPPING = [ { diff --git a/app/models/support_letter_attachment.rb b/app/models/support_letter_attachment.rb index c3640ba45..7ba459d4e 100644 --- a/app/models/support_letter_attachment.rb +++ b/app/models/support_letter_attachment.rb @@ -8,7 +8,7 @@ class SupportLetterAttachment < ApplicationRecord begin :associations belongs_to :user belongs_to :form_answer - belongs_to :support_letter + belongs_to :support_letter, optional: true end begin :validations diff --git a/app/pdf_generators/form_pdf.rb b/app/pdf_generators/form_pdf.rb index 354ca1274..88da082cf 100644 --- a/app/pdf_generators/form_pdf.rb +++ b/app/pdf_generators/form_pdf.rb @@ -16,7 +16,7 @@ class FormPdf < Prawn::Document innovation_was_launched_in_the_market ) JUST_NOTES = [ - "QAEFormBuilder::HeaderQuestion" + "QaeFormBuilder::HeaderQuestion" ] DEFAULT_ANSWER_COLOR = "5B5656" diff --git a/app/pdf_generators/qae_pdf_forms/general/question_pointer.rb b/app/pdf_generators/qae_pdf_forms/general/question_pointer.rb index 06487c852..1d5a7f640 100644 --- a/app/pdf_generators/qae_pdf_forms/general/question_pointer.rb +++ b/app/pdf_generators/qae_pdf_forms/general/question_pointer.rb @@ -36,14 +36,14 @@ class QaePdfForms::General::QuestionPointer ANSWER_FONT_END = "".freeze BLOCK_QUESTIONS = [ - QAEFormBuilder::UploadQuestion, - QAEFormBuilder::ByYearsLabelQuestion, - QAEFormBuilder::ByYearsQuestion, - QAEFormBuilder::OneOptionByYearsLabelQuestion, - QAEFormBuilder::OneOptionByYearsQuestion, - QAEFormBuilder::SupportersQuestion, - QAEFormBuilder::TextareaQuestion, - QAEFormBuilder::TextQuestion + QaeFormBuilder::UploadQuestion, + QaeFormBuilder::ByYearsLabelQuestion, + QaeFormBuilder::ByYearsQuestion, + QaeFormBuilder::OneOptionByYearsLabelQuestion, + QaeFormBuilder::OneOptionByYearsQuestion, + QaeFormBuilder::SupportersQuestion, + QaeFormBuilder::TextareaQuestion, + QaeFormBuilder::TextQuestion ] def initialize(ops = {}) @@ -73,7 +73,7 @@ def set_questions_with_references def set_non_header_questions @non_header_questions = form_pdf.all_questions.select do |q| - !q.delegate_obj.is_a?(QAEFormBuilder::HeaderQuestion) + !q.delegate_obj.is_a?(QaeFormBuilder::HeaderQuestion) end end @@ -92,7 +92,7 @@ def render! end def render_bottom_space - if question.delegate_obj.class.to_s != "QAEFormBuilder::HeaderQuestion" || + if question.delegate_obj.class.to_s != "QaeFormBuilder::HeaderQuestion" || question.classes != "regular-question" || question.classes == "application-notice help-notice" @@ -143,7 +143,7 @@ def render_pdf_hint end def render_header_hint - if question.delegate_obj.is_a?(QAEFormBuilder::HeaderQuestion) && + if question.delegate_obj.is_a?(QaeFormBuilder::HeaderQuestion) && (question.ref.present? || question.sub_ref.present?) && SKIP_HEADER_HINT_KEYS.exclude?(question.key.to_s) @@ -337,18 +337,18 @@ def question_block_type(question) def question_answer(question) unless FormPdf::JUST_NOTES.include?(question.delegate_obj.class.to_s) case question.delegate_obj - when QAEFormBuilder::UploadQuestion + when QaeFormBuilder::UploadQuestion form_pdf.indent 7.mm do render_attachments end - when QAEFormBuilder::SicCodeDropdownQuestion + when QaeFormBuilder::SicCodeDropdownQuestion if q_visible? && humanized_answer.present? form_pdf.render_standart_answer_block(question_option_title) else form_pdf.default_bottom_margin form_pdf.text "Select #{question.title}" end - when QAEFormBuilder::OptionsQuestion + when QaeFormBuilder::OptionsQuestion if q_visible? && humanized_answer.present? chosen_option = question.options.detect{ |option| option.value.to_s == humanized_answer.to_s } form_pdf.render_standart_answer_block(question_option_title) @@ -363,29 +363,29 @@ def question_answer(question) end end end - when QAEFormBuilder::ConfirmQuestion + when QaeFormBuilder::ConfirmQuestion if q_visible? && humanized_answer.present? form_pdf.render_standart_answer_block(question_checked_value_title) else question_option_box(question.pdf_text || question.text) end - when QAEFormBuilder::ByYearsLabelQuestion, QAEFormBuilder::OneOptionByYearsLabelQuestion + when QaeFormBuilder::ByYearsLabelQuestion, QaeFormBuilder::OneOptionByYearsLabelQuestion form_pdf.indent 7.mm do render_years_labels_table end - when QAEFormBuilder::ByYearsQuestion, QAEFormBuilder::OneOptionByYearsQuestion + when QaeFormBuilder::ByYearsQuestion, QaeFormBuilder::OneOptionByYearsQuestion render_years_table - when QAEFormBuilder::SupportersQuestion + when QaeFormBuilder::SupportersQuestion form_pdf.indent 7.mm do render_supporters end - when QAEFormBuilder::TextareaQuestion + when QaeFormBuilder::TextareaQuestion title = q_visible? && humanized_answer.present? ? humanized_answer : "" form_pdf.default_bottom_margin render_word_limit render_wysywyg_content - when QAEFormBuilder::CheckboxSeriaQuestion + when QaeFormBuilder::CheckboxSeriaQuestion render_checkbox_selected_values else title = q_visible? && humanized_answer.present? ? humanized_answer : "" @@ -431,11 +431,11 @@ def attachment_by_type(_k, v) def complex_question render_question_title_with_ref_or_not - if question.delegate_obj.class.to_s == "QAEFormBuilder::HeadOfBusinessQuestion" + if question.delegate_obj.class.to_s == "QaeFormBuilder::HeadOfBusinessQuestion" form_pdf.move_up 5.mm end - if question.delegate_obj.class.to_s == "QAEFormBuilder::AddressQuestion" + if question.delegate_obj.class.to_s == "QaeFormBuilder::AddressQuestion" render_context_and_answer_blocks end diff --git a/app/pdf_generators/shared_pdf_helpers/data_helpers.rb b/app/pdf_generators/shared_pdf_helpers/data_helpers.rb index c7a6594b4..ef6744252 100644 --- a/app/pdf_generators/shared_pdf_helpers/data_helpers.rb +++ b/app/pdf_generators/shared_pdf_helpers/data_helpers.rb @@ -21,7 +21,7 @@ def sub_category def sub_category_question all_questions.detect do |q| - q.delegate_obj.is_a?(QAEFormBuilder::OptionsQuestion) && + q.delegate_obj.is_a?(QaeFormBuilder::OptionsQuestion) && q.sub_category_question.present? end end diff --git a/app/services/assessor_assignment_service.rb b/app/services/assessor_assignment_service.rb index 482c6a9e4..b7dc13e2c 100644 --- a/app/services/assessor_assignment_service.rb +++ b/app/services/assessor_assignment_service.rb @@ -14,6 +14,7 @@ def save resource.assign_attributes(update_params) resource.editable = current_subject resource.assessed_at = DateTime.now unless assignment_request? + resource.status = "in_progress" resource.save end diff --git a/app/validators/file_size_validator.rb b/app/validators/file_size_validator.rb index a2f729339..fad3ec6d3 100644 --- a/app/validators/file_size_validator.rb +++ b/app/validators/file_size_validator.rb @@ -56,7 +56,7 @@ def validate_each(record, attribute, value) default_message = options[MESSAGES[key]] errors_options[:message] ||= default_message if default_message - record.errors.add(attribute, MESSAGES[key], errors_options) + record.errors.add(attribute, MESSAGES[key], **errors_options) end end diff --git a/app/views/admin/admins/_form.html.slim b/app/views/admin/admins/_form.html.slim index 0a5be4926..9637833a0 100644 --- a/app/views/admin/admins/_form.html.slim +++ b/app/views/admin/admins/_form.html.slim @@ -1,6 +1,9 @@ .js-admin-strict-password-form -= simple_form_for [:admin, resource], html: { class: 'qae-form' } do |f| += simple_form_for [:admin, resource], + as: :admin, + url: resource.persisted? ? admin_admin_path(resource, search: params[:search], page: params[:page]) : admin_admins_path(search: params[:search], page: params[:page]), + html: { class: 'qae-form' } do |f| = render "shared/users/user_details", f: f @@ -9,6 +12,11 @@ .govuk-button-group class="govuk-!-margin-top-7 govuk-!-margin-bottom-9" = f.button :submit, class: 'govuk-button' - = link_to "Cancel", admin_admins_path, class: 'govuk-button govuk-button--secondary' + = link_to "Cancel", + admin_admins_path(search: params[:search], page: params[:page]), + class: 'govuk-button govuk-button--secondary' - if action_name == "edit" && policy(resource).destroy? - = link_to 'Delete', admin_admin_path(resource), data: { method: :delete, confirm: 'Are you sure you want to delete this user?' }, class: 'govuk-button govuk-button--warning' + = link_to 'Delete', + admin_admin_path(resource, search: params[:search], page: params[:page]), + data: { method: :delete, confirm: 'Are you sure you want to delete this user?' }, + class: 'govuk-button govuk-button--warning' diff --git a/app/views/admin/admins/_list.html.slim b/app/views/admin/admins/_list.html.slim index f16fc5da8..89cef106b 100644 --- a/app/views/admin/admins/_list.html.slim +++ b/app/views/admin/admins/_list.html.slim @@ -24,7 +24,7 @@ div role="region" aria-labelledby="table-list-admin-users-caption" tabindex="0" tr.govuk-table__row th.govuk-table__header scope="row" = link_to admin.full_name, - edit_admin_admin_path(admin), + edit_admin_admin_path(admin, search: params[:search], page: params[:page]), class: "govuk-link", aria: { label: "edit #{ admin.full_name }" } td.govuk-table__cell @@ -43,7 +43,7 @@ div role="region" aria-labelledby="table-list-admin-users-caption" tabindex="0" ' Not confirmed td.govuk-table__cell = link_to "Edit user", - edit_admin_admin_path(admin), + edit_admin_admin_path(admin, search: params[:search], page: params[:page]), class: "govuk-link", id: "edit-#{ admin.first_name.downcase }-#{ admin.last_name.downcase }", aria: { label: "edit #{ admin.full_name }" } diff --git a/app/views/admin/admins/edit.html.slim b/app/views/admin/admins/edit.html.slim new file mode 100644 index 000000000..177f6956f --- /dev/null +++ b/app/views/admin/admins/edit.html.slim @@ -0,0 +1,9 @@ +- title t("admin.users.edit_button.#{controller_name}") + +- content_for :before_main_content do + = link_to "Back to users list", admin_admins_path(search: params[:search], page: params[:page]), class: "govuk-back-link" + +h1.govuk-heading-xl + = t("admin.users.edit_button.#{controller_name}") + += render 'form', resource: @resource diff --git a/app/views/admin/admins/new.html.slim b/app/views/admin/admins/new.html.slim new file mode 100644 index 000000000..5cba2aeee --- /dev/null +++ b/app/views/admin/admins/new.html.slim @@ -0,0 +1,9 @@ +- title t("admin.users.edit_button.#{controller_name}") + +- content_for :before_main_content do + = link_to "Back to users list", admin_admins_path(search: params[:search], page: params[:page]), class: "govuk-back-link" + +h1.govuk-heading-xl + = t("admin.users.new_button.#{controller_name}") + += render 'form', resource: @resource diff --git a/app/views/admin/assessors/_form.html.slim b/app/views/admin/assessors/_form.html.slim index c2df659f2..61f4f426a 100644 --- a/app/views/admin/assessors/_form.html.slim +++ b/app/views/admin/assessors/_form.html.slim @@ -1,4 +1,7 @@ -= simple_form_for [:admin, resource], as: :assessor, url: resource.persisted? ? admin_assessor_path(resource) : admin_assessors_path, html: { class: 'qae-form' } do |f| += simple_form_for [:admin, resource], + as: :assessor, + url: resource.persisted? ? admin_assessor_path(resource, search: params[:search], page: params[:page]) : admin_assessors_path(search: params[:search], page: params[:page]), + html: { class: 'qae-form' } do |f| = render "shared/users/user_details", f: f = f.input :sub_group, @@ -10,11 +13,13 @@ - if f.object.persisted? = render "shared/users/password_change", f: f - .govuk-button-group class="govuk-!-margin-top-7 govuk-!-margin-bottom-9" = f.submit "#{f.object.persisted? ? 'Update' : 'Add'} user", class: 'govuk-button' = link_to "Cancel", - admin_assessors_path, + admin_assessors_path(search: params[:search], page: params[:page]), class: 'govuk-button govuk-button--secondary' - if action_name == "edit" && policy(resource).destroy? - = link_to 'Delete', admin_assessor_path(resource), data: { method: :delete, confirm: 'Are you sure you want to delete this user?' }, class: 'govuk-button govuk-button--warning' + = link_to 'Delete', + admin_assessor_path(resource, search: params[:search], page: params[:page]), + data: { method: :delete, confirm: 'Are you sure you want to delete this user?' }, + class: 'govuk-button govuk-button--warning' diff --git a/app/views/admin/assessors/_list.html.slim b/app/views/admin/assessors/_list.html.slim index f23874a26..28904cdf0 100644 --- a/app/views/admin/assessors/_list.html.slim +++ b/app/views/admin/assessors/_list.html.slim @@ -28,7 +28,7 @@ div role="region" aria-labelledby="table-list-national-assessors-caption" tabind tr.govuk-table__row th.govuk-table__header scope="row" = link_to assessor.full_name, - edit_admin_assessor_path(assessor), + edit_admin_assessor_path(assessor, search: params[:search], page: params[:page]), class: "govuk-link", aria: { label: "edit #{ assessor.full_name }"} td.govuk-table__cell = assessor.sub_group&.text @@ -55,7 +55,7 @@ div role="region" aria-labelledby="table-list-national-assessors-caption" tabind ' Not locked td.govuk-table__cell = link_to "Edit user", - edit_admin_assessor_path(assessor), + edit_admin_assessor_path(assessor, search: params[:search], page: params[:page]), class: "govuk-link", id: "edit #{ assessor.first_name.downcase } #{ assessor.last_name.downcase }", aria: { label: "edit #{ assessor.full_name }"} diff --git a/app/views/admin/assessors/edit.html.slim b/app/views/admin/assessors/edit.html.slim index fa017f4c6..0ad535f1b 100644 --- a/app/views/admin/assessors/edit.html.slim +++ b/app/views/admin/assessors/edit.html.slim @@ -1,7 +1,9 @@ - title t("admin.users.edit_button.#{controller_name}") - content_for :before_main_content do - = link_to "Back to users list", admin_users_path, class: "govuk-back-link" + = link_to "Back to users list", + admin_assessors_path(search: params[:search], page: params[:page]), + class: "govuk-back-link" h1.govuk-heading-xl = t("admin.users.edit_button.#{controller_name}") diff --git a/app/views/admin/assessors/new.html.slim b/app/views/admin/assessors/new.html.slim index 700382380..c1899bbf2 100644 --- a/app/views/admin/assessors/new.html.slim +++ b/app/views/admin/assessors/new.html.slim @@ -1,7 +1,9 @@ - title t("admin.users.new_button.#{controller_name}") - content_for :before_main_content do - = link_to "Back to users list", admin_users_path, class: "govuk-back-link" + = link_to "Back to users list", + admin_assessors_path(search: params[:search], page: params[:page]), + class: "govuk-back-link" h1.govuk-heading-xl = t("admin.users.new_button.#{controller_name}") diff --git a/app/views/admin/form_answers/company_details/_sic_form.html.slim b/app/views/admin/form_answers/company_details/_sic_form.html.slim index af5ee2786..0b4111de5 100644 --- a/app/views/admin/form_answers/company_details/_sic_form.html.slim +++ b/app/views/admin/form_answers/company_details/_sic_form.html.slim @@ -22,7 +22,7 @@ wrapper_html: { class: "form-group" }, input_html: { class: "form-control select2" }, as: :select, - collection: SICCode.collection, + collection: SicCode.collection, include_blank: false, label: false .govuk-button-group diff --git a/app/views/admin/form_answers/list_components/_table_body.html.slim b/app/views/admin/form_answers/list_components/_table_body.html.slim index 36498ae91..03a026677 100644 --- a/app/views/admin/form_answers/list_components/_table_body.html.slim +++ b/app/views/admin/form_answers/list_components/_table_body.html.slim @@ -5,10 +5,10 @@ td.govuk-table__cell = check_box_tag "check_#{obj.id}", obj.id, false, class: "form-answer-check", aria: { label: "Select nomination #{obj.id} for bulk action" } td.td-title.govuk-table__cell - if obj.company_or_nominee_name.present? - = link_to polymorphic_url([namespace_name, obj], search_id: params[:search_id], year: params[:year]), aria: { label: "View submitted nomination for #{obj.company_or_nominee_name}" }, class: 'govuk-link' do + = link_to polymorphic_url([namespace_name, obj], search_id: params[:search_id], year: params[:year], page: params[:page]), aria: { label: "View submitted nomination for #{obj.company_or_nominee_name}" }, class: 'govuk-link', target: :_blank do = obj.company_or_nominee_name - else - = link_to polymorphic_url([namespace_name, obj], search_id: params[:search_id], year: params[:year]), aria: { label: "View submitted nomination, nominee name not yet specified" }, class: 'govuk-link' do + = link_to polymorphic_url([namespace_name, obj], search_id: params[:search_id], year: params[:year], page: params[:page]), aria: { label: "View submitted nomination, nominee name not yet specified" }, class: 'govuk-link', target: :_blank do em ' Not yet specified td.govuk-table__cell = obj.dashboard_status @@ -35,5 +35,5 @@ = obj.last_updated_by td.govuk-table__cell - aria_label = obj.company_or_nominee_name.present? ? "View submitted nomination, for #{obj.company_or_nominee_name}" : "View submitted nomination, nominee name not yet specified" - = link_to polymorphic_url([namespace_name, obj], search_id: params[:search_id], year: params[:year]), aria: { label: aria_label }, class: 'govuk-link' do + = link_to polymorphic_url([namespace_name, obj], search_id: params[:search_id], year: params[:year], page: params[:page]), aria: { label: aria_label }, class: 'govuk-link', target: :_blank do | View diff --git a/app/views/admin/form_answers/show.html.slim b/app/views/admin/form_answers/show.html.slim index d7f296719..8b5414787 100644 --- a/app/views/admin/form_answers/show.html.slim +++ b/app/views/admin/form_answers/show.html.slim @@ -1,5 +1,5 @@ - content_for :before_main_content do - = link_to "Back to nominations list", admin_form_answers_path(search_id: params[:search_id], year: params[:year]), class: "govuk-back-link" + = link_to "Back to nominations list", admin_form_answers_path(search_id: params[:search_id], year: params[:year], page: params[:page]), class: "govuk-back-link" h1.govuk-heading-xl = resource.nominee_name diff --git a/app/views/admin/group_leaders/_form.html.slim b/app/views/admin/group_leaders/_form.html.slim index f24d3787c..40a4d8b7c 100644 --- a/app/views/admin/group_leaders/_form.html.slim +++ b/app/views/admin/group_leaders/_form.html.slim @@ -1,4 +1,7 @@ -= simple_form_for [:admin, resource], as: :group_leader, url: admin_group_leader_path(resource), html: { class: 'qae-form' } do |f| += simple_form_for [:admin, resource], + as: :group_leader, + url: admin_group_leader_path(resource, search: params[:search], page: params[:page]), + html: { class: 'qae-form' } do |f| = render "shared/users/user_details", f: f - if f.object.persisted? @@ -9,8 +12,11 @@ = f.submit "#{f.object.persisted? ? 'Update' : 'Add'} user", class: 'govuk-button' = link_to "Cancel", - admin_group_leaders_path, + admin_group_leaders_path(search: params[:search], page: params[:page]), class: 'govuk-button govuk-button--secondary' - if action_name == "edit" && policy(resource).destroy? - = link_to 'Delete', admin_group_leader_path(resource), data: { method: :delete, confirm: 'Are you sure you want to delete this user?' }, class: 'govuk-button govuk-button--warning' + = link_to 'Delete', + admin_group_leader_path(resource, search: params[:search], page: params[:page]), + data: { method: :delete, confirm: 'Are you sure you want to delete this user?' }, + class: 'govuk-button govuk-button--warning' diff --git a/app/views/admin/group_leaders/_list.html.slim b/app/views/admin/group_leaders/_list.html.slim index 62509f1e9..25b53b98a 100644 --- a/app/views/admin/group_leaders/_list.html.slim +++ b/app/views/admin/group_leaders/_list.html.slim @@ -26,7 +26,7 @@ div role="region" aria-labelledby="table-list-group-leaders-caption" tabindex="0 tr.govuk-table__row th.govuk-table__header scope="row" = link_to group_leader.full_name, - edit_admin_group_leader_path(group_leader), + edit_admin_group_leader_path(group_leader, search: params[:search], page: params[:page]), class: "govuk-link", aria: { label: "Edit #{ group_leader.first_name.downcase } #{ group_leader.last_name.downcase }" } td.govuk-table__cell @@ -52,7 +52,7 @@ div role="region" aria-labelledby="table-list-group-leaders-caption" tabindex="0 ' Not locked td.govuk-table__cell = link_to "Edit user", - edit_admin_group_leader_path(group_leader), + edit_admin_group_leader_path(group_leader, search: params[:search], page: params[:page]), class: "govuk-link", id: "edit-#{ group_leader.first_name.downcase }-#{ group_leader.last_name.downcase }", aria: { label: "Edit #{ group_leader.first_name.downcase } #{ group_leader.last_name.downcase }" } diff --git a/app/views/admin/group_leaders/edit.html.slim b/app/views/admin/group_leaders/edit.html.slim index fa017f4c6..dc1cdea2c 100644 --- a/app/views/admin/group_leaders/edit.html.slim +++ b/app/views/admin/group_leaders/edit.html.slim @@ -1,7 +1,9 @@ - title t("admin.users.edit_button.#{controller_name}") - content_for :before_main_content do - = link_to "Back to users list", admin_users_path, class: "govuk-back-link" + = link_to "Back to users list", + admin_group_leaders_path(search: params[:search], page: params[:page]), + class: "govuk-back-link" h1.govuk-heading-xl = t("admin.users.edit_button.#{controller_name}") diff --git a/app/views/admin/lieutenants/_form.html.slim b/app/views/admin/lieutenants/_form.html.slim index 948a17bb7..e7f3234ff 100644 --- a/app/views/admin/lieutenants/_form.html.slim +++ b/app/views/admin/lieutenants/_form.html.slim @@ -1,4 +1,7 @@ -= simple_form_for [:admin, resource], as: :lieutenant, url: resource.persisted? ? admin_lieutenant_path(resource) : admin_lieutenants_path, html: { class: 'qae-form' } do |f| += simple_form_for [:admin, resource], + as: :lieutenant, + url: resource.persisted? ? admin_lieutenant_path(resource, search: params[:search], page: params[:page]) : admin_lieutenants_path(search: params[:search], page: params[:page]), + html: { class: 'qae-form' } do |f| = render "shared/users/user_details", f: f = f.association :ceremonial_county, @@ -19,7 +22,10 @@ = f.submit "#{f.object.persisted? ? 'Update' : 'Add'} user", class: 'govuk-button' = link_to "Cancel", - admin_lieutenants_path, + admin_lieutenants_path(search: params[:search], page: params[:page]), class: 'govuk-button govuk-button--secondary' - if action_name == "edit" && policy(resource).destroy? - = link_to 'Delete user', admin_lieutenant_path(resource), data: { method: :delete, confirm: 'Are you sure you want to delete this user?' }, class: 'govuk-button govuk-button--warning' + = link_to 'Delete user', + admin_lieutenant_path(resource, search: params[:search], page: params[:page]), + data: { method: :delete, confirm: 'Are you sure you want to delete this user?' }, + class: 'govuk-button govuk-button--warning' diff --git a/app/views/admin/lieutenants/_list.html.slim b/app/views/admin/lieutenants/_list.html.slim index 0e511c5a3..a203d0425 100644 --- a/app/views/admin/lieutenants/_list.html.slim +++ b/app/views/admin/lieutenants/_list.html.slim @@ -41,7 +41,7 @@ div role="region" aria-labelledby="table-list-lieutenancy-office-caption" tabind - else th.govuk-table__header scope="row" = link_to lieutenant.full_name, - edit_admin_lieutenant_path(lieutenant), + edit_admin_lieutenant_path(lieutenant, search: params[:search], page: params[:page]), class: "govuk-link", aria: { label: "edit-#{ lieutenant.first_name.downcase }-#{ lieutenant.last_name.downcase }" } td.govuk-table__cell @@ -71,13 +71,13 @@ div role="region" aria-labelledby="table-list-lieutenancy-office-caption" tabind ' Not locked td.govuk-table__cell - if action_name == "deleted" - = link_to "Restore user", restore_admin_lieutenant_path(lieutenant), + = link_to "Restore user", restore_admin_lieutenant_path(lieutenant, search: params[:search], page: params[:page]), class: "govuk-link", id: "restore-#{ lieutenant.first_name.downcase }-#{ lieutenant.last_name.downcase }", method: :post, aria: { label: "restore-#{ lieutenant.first_name.downcase }-#{ lieutenant.last_name.downcase }" } - else - = link_to "Edit user", edit_admin_lieutenant_path(lieutenant), + = link_to "Edit user", edit_admin_lieutenant_path(lieutenant, search: params[:search], page: params[:page]), class: "govuk-link", id: "edit-#{ lieutenant.first_name.downcase }-#{ lieutenant.last_name.downcase }", aria: { label: "edit-#{ lieutenant.first_name.downcase }-#{ lieutenant.last_name.downcase }" } diff --git a/app/views/admin/lieutenants/edit.html.slim b/app/views/admin/lieutenants/edit.html.slim index fa017f4c6..a57f3d8c1 100644 --- a/app/views/admin/lieutenants/edit.html.slim +++ b/app/views/admin/lieutenants/edit.html.slim @@ -1,7 +1,7 @@ - title t("admin.users.edit_button.#{controller_name}") - content_for :before_main_content do - = link_to "Back to users list", admin_users_path, class: "govuk-back-link" + = link_to "Back to users list", admin_lieutenants_path(search: params[:search], page: params[:page]), class: "govuk-back-link" h1.govuk-heading-xl = t("admin.users.edit_button.#{controller_name}") diff --git a/app/views/admin/lieutenants/new.html.slim b/app/views/admin/lieutenants/new.html.slim index 6ba31bd4b..dab23c28e 100644 --- a/app/views/admin/lieutenants/new.html.slim +++ b/app/views/admin/lieutenants/new.html.slim @@ -1,7 +1,7 @@ - title t("admin.users.edit_button.#{controller_name}") - content_for :before_main_content do - = link_to "Back to users list", admin_users_path, class: "govuk-back-link" + = link_to "Back to users list", admin_lieutenants_path(search: params[:search], page: params[:page]), class: "govuk-back-link" h1.govuk-heading-xl = t("admin.users.new_button.#{controller_name}") diff --git a/app/views/admin/users/_form.html.slim b/app/views/admin/users/_form.html.slim index 2ffeca17f..46efdee0a 100644 --- a/app/views/admin/users/_form.html.slim +++ b/app/views/admin/users/_form.html.slim @@ -1,4 +1,7 @@ -= simple_form_for [:admin, resource], html: { class: "qae-form" } do |f| += simple_form_for [:admin, resource], + as: :user, + url: resource.persisted? ? admin_user_path(resource, search: params[:search], page: params[:page]) : admin_users_path(search: params[:search], page: params[:page]), + html: { class: "qae-form" } do |f| = render "fields_user_details", f: f .govuk-button-group @@ -25,5 +28,5 @@ method: :patch = link_to "Cancel", - admin_users_path, + admin_users_path(search: params[:search], page: params[:page]), class: "govuk-button govuk-button--secondary btn-default btn-md" diff --git a/app/views/admin/users/_list.html.slim b/app/views/admin/users/_list.html.slim index 7f9dd82f0..8ba4a4092 100644 --- a/app/views/admin/users/_list.html.slim +++ b/app/views/admin/users/_list.html.slim @@ -26,7 +26,7 @@ div role="region" aria-labelledby="table-list-nominators-caption" tabindex="0" tr.govuk-table__row th.govuk-table__header scope="row" = link_to user.full_name, - edit_admin_user_path(user), + edit_admin_user_path(user, search: params[:search], page: params[:page]), class: "govuk-link", aria: { label: "edit #{ user.full_name }" } td.govuk-table__cell @@ -54,6 +54,6 @@ div role="region" aria-labelledby="table-list-nominators-caption" tabindex="0" ' Not locked td.govuk-table__cell = link_to "Edit user", - edit_admin_user_path(user), + edit_admin_user_path(user, search: params[:search], page: params[:page]), class: "govuk-link", aria: { label: "edit #{ user.full_name }" } diff --git a/app/views/admin/users/edit.html.slim b/app/views/admin/users/edit.html.slim index fa017f4c6..5300a8e27 100644 --- a/app/views/admin/users/edit.html.slim +++ b/app/views/admin/users/edit.html.slim @@ -1,7 +1,7 @@ - title t("admin.users.edit_button.#{controller_name}") - content_for :before_main_content do - = link_to "Back to users list", admin_users_path, class: "govuk-back-link" + = link_to "Back to users list", admin_users_path(search: params[:search], page: params[:page]), class: "govuk-back-link" h1.govuk-heading-xl = t("admin.users.edit_button.#{controller_name}") diff --git a/app/views/admin/users/index.html.slim b/app/views/admin/users/index.html.slim index faa0910b0..2c43e9238 100644 --- a/app/views/admin/users/index.html.slim +++ b/app/views/admin/users/index.html.slim @@ -33,7 +33,7 @@ role: "button", aria: { label: "Show deleted users" } - = link_to public_send("new_admin_#{controller_name.singularize}_path"), class: 'new-user govuk-button pull-right', role: 'button' do + = link_to public_send("new_admin_#{controller_name.singularize}_path", search: params[:search], page: params[:page]), class: 'new-user govuk-button pull-right', role: 'button' do = t("admin.users.new_button.#{controller_name}") .clear diff --git a/app/views/admin/users/new.html.slim b/app/views/admin/users/new.html.slim index 700382380..c9db05bb7 100644 --- a/app/views/admin/users/new.html.slim +++ b/app/views/admin/users/new.html.slim @@ -1,7 +1,7 @@ - title t("admin.users.new_button.#{controller_name}") - content_for :before_main_content do - = link_to "Back to users list", admin_users_path, class: "govuk-back-link" + = link_to "Back to users list", admin_users_path(search: params[:search], page: params[:page]), class: "govuk-back-link" h1.govuk-heading-xl = t("admin.users.new_button.#{controller_name}") diff --git a/app/views/admins/registrations/new.html.slim b/app/views/admins/registrations/new.html.slim index d9de0f327..01e5d4a55 100644 --- a/app/views/admins/registrations/new.html.slim +++ b/app/views/admins/registrations/new.html.slim @@ -14,7 +14,7 @@ h1.govuk-heading-xl Create an account required: true, label: 'Password', hint: ("#{@minimum_password_length} characters minimum" if @validatable), - input_html: { class: "password-strength-meter js-disable-copy medium", "data-min-password-length" => "10" } + input_html: { class: "password-strength-meter js-disable-copy medium", "data-min-password-length" => "14" } span#password-result-span.input-group-addon i#password-result.glyphicon.glyphicon-ok diff --git a/app/views/assessor/dashboard/index.html.slim b/app/views/assessor/dashboard/index.html.slim index 566de67dc..31ba5a685 100644 --- a/app/views/assessor/dashboard/index.html.slim +++ b/app/views/assessor/dashboard/index.html.slim @@ -8,28 +8,51 @@ p.govuk-body You can download the national assessment guide, which provides helpful tips on approaching the assessment and completing your evaluations. .govuk-body - = link_to "Download KAVS national assessment guide for the 2022 awards (PDF)", - "https://storage.googleapis.com/national-assessor-guidance/QAVS%20Manual%20for%20National%20Assessors%202022%20Round.pdf", + = link_to "Download KAVS national assessment guide for the 2024 awards (PDF)", + "https://storage.googleapis.com/national-assessor-guidance/KAVS%20Manual%20for%20National%20Assessors%202024%20Round.pdf", class: "download-link govuk-link govuk-link--no-visited-state", target: :_blank hr.govuk-section-break.govuk-section-break--m - / details.govuk-details data-module="govuk-details" - / summary.govuk-details__summary - / span.govuk-details__summary-text - / | Get accessible format of the national assessment guide - / .govuk-details__text - / p.govuk-body If you use assistive technology, such as a screen reader, you can use an accessible PDF version of the national assessment guide. - / = link_to "Download KAVS national assessment guide in accessible PDF format", - / "assessor_resources/blank.pdf", - / class: "download-link govuk-link govuk-link--no-visited-state", - / rel: "noreferrer noopener", - / target: :_blank + .button + = link_to "Start reviewing nominations", assessor_form_answers_url, class: "govuk-button govuk-button--start" + + hr.govuk-section-break.govuk-section-break--m.govuk-section-break--visible + + .govuk-grid-row + .govuk-grid-column-two-thirds + h2.govuk-heading-m + | Other useful resources + + p.govuk-body You can also download the local assessment guide for reference, which we provide to Lieutenancies on approaching the assessment and completing their reports. + .govuk-body + = link_to "Download KAVS local assessment guide (PDF)", + "https://storage.googleapis.com/lord-lieutenant-guidance/KAVS%20Guidance%20for%20LLs%202024.pdf", + class: "download-link govuk-link govuk-link--no-visited-state", + rel: "noreferrer noopener", + target: :_blank hr.govuk-section-break.govuk-section-break--m - .button - = link_to "Start reviewing nominations", assessor_form_answers_url, class: "govuk-button govuk-button--start" + p.govuk-body + | You can also download promotional leaflets to help raise awareness of the award. + .govuk-body + = link_to "Download the KAVS leaflet", + "https://storage.googleapis.com/lord-lieutenant-guidance/KAVS%202%20page%20flyer.pdf", + class: "download-link govuk-link govuk-link--no-visited-state", + rel: "noreferrer noopener", + target: :_blank + + hr.govuk-section-break.govuk-section-break--m + + p.govuk-body + | You can download logos, guidance and information on badges/mini crystals. + .govuk-body + = link_to "Download the KAVS logos and guidelines", + "https://kavs.dcms.gov.uk/the-kings-award-for-voluntary-service-emblem-guidelines", + class: "download-link govuk-link govuk-link--no-visited-state", + rel: "noreferrer noopener", + target: :_blank hr.govuk-section-break.govuk-section-break--m diff --git a/app/views/assessor/form_answers/_list_body.html.slim b/app/views/assessor/form_answers/_list_body.html.slim index b94448901..0b707f61b 100644 --- a/app/views/assessor/form_answers/_list_body.html.slim +++ b/app/views/assessor/form_answers/_list_body.html.slim @@ -2,7 +2,7 @@ tbody.govuk-table__body - FormAnswerDecorator.decorate_collection(@form_answers).each do |obj| tr.govuk-table__row th.govuk-table__header scope="row" - = link_to polymorphic_url([namespace_name, obj], search_id: params[:search_id], year: params[:year]), class: 'govuk-link' do + = link_to polymorphic_url([namespace_name, obj], search_id: params[:search_id], year: params[:year], page: params[:page]), class: 'govuk-link', target: :_blank do - unless obj.nominee_name.nil? span = obj.nominee_name @@ -10,11 +10,6 @@ tbody.govuk-table__body em ' Not found - td.govuk-table__cell = obj.dashboard_status - - td.govuk-table__cell - = obj.sub_group.try(:text) || "Not assigned" - td.govuk-table__cell - if obj.ceremonial_county.present? = obj.ceremonial_county.name @@ -31,7 +26,19 @@ tbody.govuk-table__body span.muted = obj.last_updated_by + td.govuk-table__cell + - assignment = obj.assessor_assignments.detect { |aa| aa.assessor_id == current_assessor.id } + - if assignment&.submitted_at + strong.govuk-tag.govuk-tag--green + | Submitted + - elsif assignment&.status == "in_progress" + strong.govuk-tag.govuk-tag--yellow + | In progress + - elsif assignment&.status == "viewed" + strong.govuk-tag.govuk-tag--blue + | Viewed + td.govuk-table__cell - aria_label = obj.company_or_nominee_name.present? ? "View submitted nomination, for #{obj.company_or_nominee_name}" : "View submitted nomination, nominee name not yet specified" - = link_to polymorphic_url([namespace_name, obj], search_id: params[:search_id], year: params[:year]), aria: { label: aria_label }, class: 'govuk-link' do + = link_to polymorphic_url([namespace_name, obj], search_id: params[:search_id], year: params[:year], page: params[:page]), aria: { label: aria_label }, class: 'govuk-link', target: :_blank do | View diff --git a/app/views/assessor/form_answers/_question.html.slim b/app/views/assessor/form_answers/_question.html.slim index 1d2f07610..9078c0863 100644 --- a/app/views/assessor/form_answers/_question.html.slim +++ b/app/views/assessor/form_answers/_question.html.slim @@ -13,7 +13,7 @@ fieldset class=question.fieldset_classes data=question.fieldset_data_hash span.todo = ref.to_s - unless question.title.blank? - - font_size = question.delegate_obj.is_a?(QAEFormBuilder::HeaderQuestion) ? "govuk-!-font-size-36" : "govuk-!-font-size-24" + - font_size = question.delegate_obj.is_a?(QaeFormBuilder::HeaderQuestion) ? "govuk-!-font-size-36" : "govuk-!-font-size-24" span class="govuk-body #{ font_size } govuk-!-font-weight-bold govuk-!-display-block" == question.title diff --git a/app/views/assessor/form_answers/index.html.slim b/app/views/assessor/form_answers/index.html.slim index 16a96fffb..9b814e5cf 100644 --- a/app/views/assessor/form_answers/index.html.slim +++ b/app/views/assessor/form_answers/index.html.slim @@ -46,16 +46,14 @@ h1.govuk-heading-xl tr.govuk-table__row th.sortable.govuk-table__header scope="col" width="250" = sort_link f, "Group name", @search, :company_or_nominee_name, disabled: @search.query? - th.govuk-table__header scope="col" width="250" - | Status - th.govuk-table__header scope="col" width="200" - | National assessor Sub-group th.govuk-table__header scope="col" width="200" | Lord Lieutenancy assigned th.govuk-table__header scope="col" width="200" | Type of group th.sortable.govuk-table__header scope="col" width="130" = sort_link f, "Last updated", @search, :audit_updated_at, disabled: @search.query? + th.govuk-table__header scope="col" width="150" + | Status th.govuk-table__header scope="col" View = render(partial: "list_body") diff --git a/app/views/assessor/form_answers/questions/_address_question.html.slim b/app/views/assessor/form_answers/questions/_address_question.html.slim index f6c1b3ab7..e50a71bb0 100644 --- a/app/views/assessor/form_answers/questions/_address_question.html.slim +++ b/app/views/assessor/form_answers/questions/_address_question.html.slim @@ -65,5 +65,5 @@ div role="group" id="q_#{question.key}" .clear - klass = "#{sub_field_title.parameterize == 'postcode' ? 'govuk-input--width-10' : 'govuk-input--width-20'}" - - klass <<(QAEFormBuilder::AddressQuestionValidator::NO_VALIDATION_SUB_FIELDS.exclude?(sub_field_key) ? " required" : " not-required") + - klass <<(QaeFormBuilder::AddressQuestionValidator::NO_VALIDATION_SUB_FIELDS.exclude?(sub_field_key) ? " required" : " not-required") input.govuk-input.js-trigger-autosave class=klass type="text" id=question.input_name(suffix: sub_field_key) value=question.input_value(suffix: sub_field_key) name=question.input_name(suffix: sub_field_key) autocomplete="off" disabled="disabled" diff --git a/app/views/assessor/form_answers/questions/_assessor_details_question.html.slim b/app/views/assessor/form_answers/questions/_assessor_details_question.html.slim index 45a3c13bc..0237edf6a 100644 --- a/app/views/assessor/form_answers/questions/_assessor_details_question.html.slim +++ b/app/views/assessor/form_answers/questions/_assessor_details_question.html.slim @@ -13,5 +13,5 @@ .clear - klass = "#{sub_field_title.parameterize == "phone-number-optional" ? "govuk-input--width-10" : "govuk-input--width-20"}" - - klass <<(QAEFormBuilder::AssessorDetailsQuestionValidator::NO_VALIDATION_SUB_FIELDS.exclude?(sub_field_key) ? " required" : " not-required") + - klass <<(QaeFormBuilder::AssessorDetailsQuestionValidator::NO_VALIDATION_SUB_FIELDS.exclude?(sub_field_key) ? " required" : " not-required") input.govuk-input.js-trigger-autosave class=klass type="text" id=question.input_name(suffix: sub_field_key) value=question.input_value(suffix: sub_field_key) name=question.input_name(suffix: sub_field_key) autocomplete="off" disabled="disabled" diff --git a/app/views/assessor/form_answers/show.html.slim b/app/views/assessor/form_answers/show.html.slim index 997bbbec1..cff7df50c 100644 --- a/app/views/assessor/form_answers/show.html.slim +++ b/app/views/assessor/form_answers/show.html.slim @@ -1,5 +1,5 @@ -content_for :before_main_content do - = link_to "Back to nominations list", assessor_form_answers_path(search_id: params[:search_id], year: params[:year]), class: "govuk-back-link" + = link_to "Back to nominations list", assessor_form_answers_path(search_id: params[:search_id], year: params[:year], page: params[:page]), class: "govuk-back-link" h1.govuk-heading-xl = @form_answer.nominee_name diff --git a/app/views/group_leader/dashboard/index.html.slim b/app/views/group_leader/dashboard/index.html.slim index bbdd73649..3239cdf40 100644 --- a/app/views/group_leader/dashboard/index.html.slim +++ b/app/views/group_leader/dashboard/index.html.slim @@ -121,7 +121,7 @@ hr.govuk-section-break.govuk-section-break--l.govuk-section-break--visible h3.govuk-heading-s - | May to July 2024 + | May to July =<> @award_year.year | — Royal Garden Party p.govuk-body diff --git a/app/views/lieutenant/form_answers/_list_body.html.slim b/app/views/lieutenant/form_answers/_list_body.html.slim index 60d749ceb..f6738de4f 100644 --- a/app/views/lieutenant/form_answers/_list_body.html.slim +++ b/app/views/lieutenant/form_answers/_list_body.html.slim @@ -2,12 +2,12 @@ tbody.govuk-table__body - FormAnswerDecorator.decorate_collection(@form_answers).each do |obj| tr.govuk-table__row th.govuk-table__header scope="row" - = link_to polymorphic_url([namespace_name, obj], search_id: params[:search_id], year: params[:year]), + = link_to polymorphic_url([namespace_name, obj], search_id: params[:search_id], year: params[:year], page: params[:page]), aria: { label: "View submitted nomination, for #{obj.company_or_nominee_name}" }, class: 'govuk-link' do span = obj.nominee_name - + td.govuk-table__cell = obj.dashboard_status td.govuk-table__cell = obj.document["nominee_address_postcode"] @@ -26,6 +26,6 @@ tbody.govuk-table__body td.govuk-table__cell = link_to "View", - lieutenant_form_answer_path(obj, search_id: params[:search_id], year: params[:year]), + lieutenant_form_answer_path(obj, search_id: params[:search_id], year: params[:year], page: params[:page]), aria: { label: "View submitted nomination, for #{obj.company_or_nominee_name}" }, class: 'govuk-link' diff --git a/app/views/lieutenant/form_answers/show.html.slim b/app/views/lieutenant/form_answers/show.html.slim index b3145d96c..1e630da75 100644 --- a/app/views/lieutenant/form_answers/show.html.slim +++ b/app/views/lieutenant/form_answers/show.html.slim @@ -1,7 +1,7 @@ - title "#{resource.nominee_name} nomination" - content_for :before_main_content do - = link_to "Back to nominations list", lieutenant_form_answers_path(search_id: params[:search_id], year: params[:year]), class: "govuk-back-link" + = link_to "Back to nominations list", lieutenant_form_answers_path(search_id: params[:search_id], year: params[:year], page: params[:page]), class: "govuk-back-link" h1.govuk-heading-xl = resource.nominee_name diff --git a/app/views/qae_form/_address_question.html.slim b/app/views/qae_form/_address_question.html.slim index 809b9886c..baf38cb53 100644 --- a/app/views/qae_form/_address_question.html.slim +++ b/app/views/qae_form/_address_question.html.slim @@ -67,5 +67,5 @@ div role="group" id="q_#{question.key}" .clear - klass = "#{sub_field_title.parameterize == 'postcode' ? 'govuk-input--width-10' : 'govuk-input--width-20'}" - - klass <<(QAEFormBuilder::AddressQuestionValidator::NO_VALIDATION_SUB_FIELDS.exclude?(sub_field_key) ? " required" : " not-required") + - klass <<(QaeFormBuilder::AddressQuestionValidator::NO_VALIDATION_SUB_FIELDS.exclude?(sub_field_key) ? " required" : " not-required") input.govuk-input.js-trigger-autosave class=klass type="text" id=question.input_name(suffix: sub_field_key) value=question.input_value(suffix: sub_field_key) name=question.input_name(suffix: sub_field_key) autocomplete="off" *possible_read_only_ops(question.step.opts[:id]) diff --git a/app/views/qae_form/_assessor_details_question.html.slim b/app/views/qae_form/_assessor_details_question.html.slim index ac45c1804..6ac149794 100644 --- a/app/views/qae_form/_assessor_details_question.html.slim +++ b/app/views/qae_form/_assessor_details_question.html.slim @@ -13,5 +13,5 @@ .clear - klass = "#{sub_field_title.parameterize == "phone-number-optional" ? "govuk-input--width-10" : "govuk-input--width-20"}" - - klass <<(QAEFormBuilder::AssessorDetailsQuestionValidator::NO_VALIDATION_SUB_FIELDS.exclude?(sub_field_key) ? " required" : " not-required") + - klass <<(QaeFormBuilder::AssessorDetailsQuestionValidator::NO_VALIDATION_SUB_FIELDS.exclude?(sub_field_key) ? " required" : " not-required") input.govuk-input.js-trigger-autosave class=klass type="text" id=question.input_name(suffix: sub_field_key) value=question.input_value(suffix: sub_field_key) name=question.input_name(suffix: sub_field_key) autocomplete="off" *possible_read_only_ops(question.step.opts[:id]) diff --git a/app/views/qae_form/_question.html.slim b/app/views/qae_form/_question.html.slim index 1cde1c5e4..d916491bc 100644 --- a/app/views/qae_form/_question.html.slim +++ b/app/views/qae_form/_question.html.slim @@ -15,7 +15,7 @@ fieldset class=question.fieldset_classes data=question.fieldset_data_hash span.todo = ref.to_s - unless question.title.blank? - - font_size = question.delegate_obj.is_a?(QAEFormBuilder::HeaderQuestion) ? "govuk-!-font-size-36" : "govuk-!-font-size-24" + - font_size = question.delegate_obj.is_a?(QaeFormBuilder::HeaderQuestion) ? "govuk-!-font-size-36" : "govuk-!-font-size-24" span class="govuk-body #{ font_size } govuk-!-font-weight-bold govuk-!-display-block" == question.title @@ -44,7 +44,7 @@ fieldset class=question.fieldset_classes data=question.fieldset_data_hash span.todo = ref.to_s - - if question.delegate_obj.is_a?(QAEFormBuilder::HeaderQuestion) + - if question.delegate_obj.is_a?(QaeFormBuilder::HeaderQuestion) - if question.ref || question.sub_ref span.question-context.question-debug.govuk-hint = "Please note #{(question.ref || question.sub_ref).delete(" ")} is just a heading for the following sub-questions." diff --git a/app/views/qae_form/_supporter_fields.html.slim b/app/views/qae_form/_supporter_fields.html.slim index 658c73940..531f51bd6 100644 --- a/app/views/qae_form/_supporter_fields.html.slim +++ b/app/views/qae_form/_supporter_fields.html.slim @@ -43,10 +43,13 @@ li.js-add-example class="#{'read-only js-support-letter-received' if persisted}" button.govuk-button.js-save-collection class=(persisted ? "visuallyhidden" : "") data-save-collection-url=users_form_answer_support_letters_url(@form_answer) | Submit letter of support - - if !admin_in_read_only_mode? && persisted - - if supporter["support_letter_id"].present? && @form_answer.support_letters.find_by_id(supporter["support_letter_id"]) - - url = users_form_answer_support_letter_path(form_answer_id: @form_answer.id, id: supporter["support_letter_id"]) + - if current_form_is_editable? && !current_lieutenant && !current_assessor + - if persisted + - if supporter["support_letter_id"].present? && @form_answer.support_letters.find_by_id(supporter["support_letter_id"]) + - url = users_form_answer_support_letter_path(form_answer_id: @form_answer.id, id: supporter["support_letter_id"]) + - else + - url = "#" + - if current_user || policy(:support_letter).can_remove? + = link_to "Remove", url, class: "govuk-button govuk-button--warning remove-supporter remove-link js-remove-link", data: { url: url }, 'aria-label' => "Delete support letter from #{supporter["first_name"]} #{supporter["last_name"]}" - else - - url = "#" - - if current_user || policy(:support_letter).can_remove? - = link_to "Remove", url, class: "govuk-button govuk-button--warning remove-supporter remove-link js-remove-link", data: { url: url }, 'aria-label' => "Delete support letter from #{supporter["first_name"]} #{supporter["last_name"]}" + = link_to "Remove", "#", class: "govuk-button govuk-button--warning remove-supporter remove-link js-remove-link govuk-!-display-none", data: { url: "#" }, 'aria-label' => "#" diff --git a/app/views/qae_form/_supporter_fields_placeholder.html.slim b/app/views/qae_form/_supporter_fields_placeholder.html.slim index 1eaca2e3c..b95578a8b 100644 --- a/app/views/qae_form/_supporter_fields_placeholder.html.slim +++ b/app/views/qae_form/_supporter_fields_placeholder.html.slim @@ -28,5 +28,8 @@ li.js-add-example class="govuk-!-display-none" span.govuk-error-message input class="js-trigger-autosave js-support-letter-attachment govuk-input medium" name="form[#{question.key}][{index}][letter_of_support]" id="form[#{question.key}][{index}][letter_of_support]" type='file' disabled=true - button.govuk-button.button-alt.js-save-collection data-save-collection-url=users_form_answer_support_letters_url(@form_answer) disabled='disabled' - | Submit letter of support + p + button.govuk-button.button-alt.js-save-collection data-save-collection-url=users_form_answer_support_letters_url(@form_answer) disabled='disabled' + | Submit letter of support + + = link_to "Remove", "#", class: "govuk-button govuk-button--warning remove-supporter remove-link js-remove-link govuk-!-display-none", data: { url: "#" }, 'aria-label' => "#" diff --git a/app/views/qae_form/_supporters_question.html.slim b/app/views/qae_form/_supporters_question.html.slim index 0510d495e..f01f627d6 100644 --- a/app/views/qae_form/_supporters_question.html.slim +++ b/app/views/qae_form/_supporters_question.html.slim @@ -12,5 +12,6 @@ ul.list-add.supporters-list data-need-to-clear-example=true data-add-limit=quest - (0...question.default.to_i).each do |index| = render 'qae_form/supporter_fields', question: question, supporter: {}, index: index -a.govuk-button.govuk-button--secondary.button-add.js-button-add href="#" *possible_read_only_ops(question.step.opts[:id]) - | Add another letter of support +- if current_form_is_editable? + a.govuk-button.govuk-button--secondary.button-add.js-button-add href="#" *possible_read_only_ops(question.step.opts[:id]) + | Add another letter of support diff --git a/app/views/qae_form/show.html.slim b/app/views/qae_form/show.html.slim index 82346d827..21de0e154 100644 --- a/app/views/qae_form/show.html.slim +++ b/app/views/qae_form/show.html.slim @@ -20,7 +20,7 @@ form.qae-form.award-form data-autosave-url=save_form_url(@form_answer) action=sa h2.govuk-error-summary__title#letters-of-support-error-title There was a problem submitting the form .govuk-error-summary__body p.govuk-body - ' Upload at least two letters of support. + ' Upload two letters of support. p.govuk-body = link_to "Add more letters of support", form_form_answer_supporters_path(@form_answer), class: 'govuk-link' diff --git a/app/views/shared/users/_form_password_settings.html.slim b/app/views/shared/users/_form_password_settings.html.slim index 1e70a8bf7..be8e1d673 100644 --- a/app/views/shared/users/_form_password_settings.html.slim +++ b/app/views/shared/users/_form_password_settings.html.slim @@ -28,7 +28,7 @@ h2.govuk-heading-l label: false, input_html: { class: "big medium password-strength-meter js-disable-copy", autocomplete: "off", - "data-min-password-length": "10" } + "data-min-password-length": "14" } span#password-result-span.input-group-addon i#password-result.glyphicon.glyphicon-ok @@ -40,7 +40,7 @@ h2.govuk-heading-l span.govuk-warning-text__assistive Warning p.text-underline Please improve your password p#password-too-short - ' It must be at least 10 characters. + ' It must be at least 14 characters. p#parts-of-email It shouldn't include part or all of your email address. p#password-entropy ' It must be more complex. Consider using whole sentences (with spaces), lyrics or phrases to make it more memorable. Alternatively use password management software to generate a secure password. diff --git a/app/views/shared/users/_password_change.html.slim b/app/views/shared/users/_password_change.html.slim index ef3828a84..8610d67d5 100644 --- a/app/views/shared/users/_password_change.html.slim +++ b/app/views/shared/users/_password_change.html.slim @@ -3,7 +3,7 @@ .input-group = f.input :password, input_html: { class: 'medium js-disable-copy', - data: { min_password_length: "10" }, + data: { min_password_length: "14" }, autocomplete: "off", aria: { invalid: 'false' } }, label: 'New password', diff --git a/app/views/shared/users/_password_guidance.html.slim b/app/views/shared/users/_password_guidance.html.slim index df815984b..a3cdf245a 100644 --- a/app/views/shared/users/_password_guidance.html.slim +++ b/app/views/shared/users/_password_guidance.html.slim @@ -6,7 +6,7 @@ strong.govuk-warning-text__text aria-live="polite" p.text-underline Please improve your password p#password-too-short - ' It must be at least 10 characters. + ' It must be at least 14 characters. p#parts-of-email It shouldn't include part or all of your email address. p#password-entropy ' It must be more complex. Consider using whole sentences (with spaces), lyrics or phrases to make it more memorable. diff --git a/app/views/users/registrations/new.html.slim b/app/views/users/registrations/new.html.slim index 62ce7b07c..63411d47a 100644 --- a/app/views/users/registrations/new.html.slim +++ b/app/views/users/registrations/new.html.slim @@ -40,7 +40,7 @@ required: true, label: 'Password', hint: ("#{@minimum_password_length} characters minimum" if @validatable), - input_html: { class: "password-strength-meter js-disable-copy medium govuk-input--width-10", "data-min-password-length" => "10" } + input_html: { class: "password-strength-meter js-disable-copy medium govuk-input--width-10", "data-min-password-length" => "14" } span#password-result-span.input-group-addon i#password-result.glyphicon.glyphicon-ok diff --git a/config/application.rb b/config/application.rb index 963a194dd..12a567ce9 100644 --- a/config/application.rb +++ b/config/application.rb @@ -8,6 +8,8 @@ module Qae class Application < Rails::Application + config.load_defaults 7.0 + #initializer :regenerate_require_cache, before: :load_environment_config do # Bootscale.regenerate #end @@ -15,6 +17,7 @@ class Application < Rails::Application # Application configuration should go into files in config/initializers # -- all .rb files in that directory are automatically loaded. # config.middleware.use Rack::SslEnforcer, except: "/healthcheck", except_environments: ["development", "test"] + config.autoloader = :zeitwerk if ENV['CORS_HOST'].present? config.middleware.insert_before 0, Rack::Cors do @@ -44,13 +47,19 @@ class Application < Rails::Application #NOTE: This works like Rails 4. For Rails 5, we can use # `config.eager_load_paths << Rails.root.join('lib')` but still it is not recommended for Threadsafty. # Need to take look in to it. - config.enable_dependency_loading = true - config.autoload_paths << Rails.root.join('lib') + config.eager_load = false + + config.autoload_once_paths << "#{root}/lib" + config.autoload_once_paths << "#{root}/forms" + config.autoload_paths << "#{root}/lib" + config.eager_load_paths << "#{root}/lib" config.generators do |g| g.test_framework :rspec end + config.action_mailer.delivery_job = "ActionMailer::MailDeliveryJob" + config.cache_store = :memory_store config.active_record.schema_format = :sql config.active_job.queue_adapter = :sidekiq diff --git a/config/environments/production.rb b/config/environments/production.rb index a69e22ac2..e0a67c40a 100644 --- a/config/environments/production.rb +++ b/config/environments/production.rb @@ -1,4 +1,3 @@ -require 'uglifier' Rails.application.configure do # Settings specified here will take precedence over those in config/application.rb. @@ -29,7 +28,8 @@ } # Compress JavaScripts and CSS. - config.assets.js_compressor = Uglifier.new(compress: { unused: false }) + config.assets.js_compressor = :terser + # config.assets.css_compressor = :sass diff --git a/config/environments/test.rb b/config/environments/test.rb index ca0179387..4760a796a 100644 --- a/config/environments/test.rb +++ b/config/environments/test.rb @@ -45,6 +45,8 @@ # Raises error for missing translations # config.action_view.raise_on_missing_translations = true + config.active_support.disallowed_deprecation = :raise + config.active_support.disallowed_deprecation_warnings = [] config.active_job.queue_adapter = :test config.cache_store = :null_store diff --git a/config/initializers/devise.rb b/config/initializers/devise.rb index e95271626..78d81995c 100644 --- a/config/initializers/devise.rb +++ b/config/initializers/devise.rb @@ -102,7 +102,7 @@ # ==> Configuration for :validatable # Range for password length. Default is 6..128. - config.password_length = 10..128 + config.password_length = 14..128 # Regex to use to validate the email address # config.email_regexp = /\A([\w\.%\+\-]+)@([\w\-]+\.)+([\w]{2,})\z/i diff --git a/config/initializers/new_framework_defaults_7_0.rb b/config/initializers/new_framework_defaults_7_0.rb new file mode 100644 index 000000000..0c6eda1b8 --- /dev/null +++ b/config/initializers/new_framework_defaults_7_0.rb @@ -0,0 +1,148 @@ +# Be sure to restart your server when you modify this file. +# +# This file eases your Rails 7.0 framework defaults upgrade. +# +# Uncomment each configuration one by one to switch to the new default. +# Once your application is ready to run with all new defaults, you can remove +# this file and set the `config.load_defaults` to `7.0`. +# +# Read the Guide for Upgrading Ruby on Rails for more info on each option. +# https://guides.rubyonrails.org/upgrading_ruby_on_rails.html + +# `button_to` view helper will render `