Browse Source

Update UI libraries (#2125)

* Update component versions

* Update tables and header

* Update govuk summary

* More tweaks

* lint

* Update govuk-frontend

* update layout file

* include GovukVisuallyHiddenHelper in helpers

* Update missed table body

* More tests

* update styling

* Update @x-govuk/govuk-prototype-components

* Do not set checkbox label sizes
pull/2128/head
kosiakkatrina 12 months ago committed by GitHub
parent
commit
1d1a7adbb2
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 6
      Gemfile
  2. 42
      Gemfile.lock
  3. 24
      app/components/bulk_upload_error_row_component.html.erb
  4. 16
      app/components/bulk_upload_error_summary_table_component.html.erb
  5. 8
      app/components/check_answers_summary_list_card_component.html.erb
  6. 2
      app/components/search_component.html.erb
  7. 2
      app/frontend/application.js
  8. 16
      app/frontend/styles/_filter.scss
  9. 1
      app/helpers/check_answers_helper.rb
  10. 8
      app/helpers/data_sharing_agreement_helper.rb
  11. 1
      app/helpers/duplicate_logs_helper.rb
  12. 1
      app/helpers/log_actions_helper.rb
  13. 10
      app/helpers/organisations_helper.rb
  14. 1
      app/helpers/tab_nav_helper.rb
  15. 1
      app/helpers/tasklist_helper.rb
  16. 10
      app/views/duplicate_logs/_duplicate_log_check_answers.erb
  17. 28
      app/views/duplicate_logs/index.html.erb
  18. 8
      app/views/form/_check_answers_summary_list.html.erb
  19. 24
      app/views/layouts/application.html.erb
  20. 10
      app/views/locations/check_answers.html.erb
  21. 26
      app/views/locations/index.html.erb
  22. 20
      app/views/locations/show.html.erb
  23. 28
      app/views/logs/_delete_logs_table_lettings.html.erb
  24. 28
      app/views/logs/_delete_logs_table_sales.html.erb
  25. 2
      app/views/logs/index.html.erb
  26. 28
      app/views/logs/update_logs.html.erb
  27. 8
      app/views/merge_requests/organisations.html.erb
  28. 10
      app/views/organisation_relationships/_managing_agent_list.erb
  29. 10
      app/views/organisation_relationships/_stock_owner_list.erb
  30. 18
      app/views/organisations/_merged_organisation_details.html.erb
  31. 26
      app/views/organisations/_organisation_list.html.erb
  32. 16
      app/views/organisations/show.html.erb
  33. 30
      app/views/schemes/_scheme_list.html.erb
  34. 2
      app/views/schemes/check_answers.html.erb
  35. 22
      app/views/users/_user_list.html.erb
  36. 78
      app/views/users/show.html.erb
  37. 4
      package.json
  38. 1
      spec/components/create_log_actions_component_spec.rb
  39. 4
      spec/components/search_component_spec.rb
  40. 3
      spec/config/routes_spec.rb
  41. 8
      spec/features/form/form_navigation_spec.rb
  42. 4
      spec/features/form/validations_spec.rb
  43. 22
      spec/features/user_spec.rb
  44. 2
      spec/requests/auth/confirmations_controller_spec.rb
  45. 8
      spec/requests/users_controller_spec.rb
  46. 8
      webpack.config.js
  47. 152
      yarn.lock

6
Gemfile

@ -18,9 +18,9 @@ gem "jsbundling-rails"
# Reduces boot times through caching; required in config/boot.rb
gem "bootsnap", ">= 1.4.4", require: false
# GOV UK frontend components
gem "govuk-components"
gem "govuk-components", "~> 5.0"
# GOV UK component form builder DSL
gem "govuk_design_system_formbuilder", "3.1.2"
gem "govuk_design_system_formbuilder", "~> 5.0"
# Convert Markdown into GOV.UK frontend-styled HTML
gem "govuk_markdown"
# GOV UK Notify
@ -40,7 +40,7 @@ gem "uk_postcode"
# Get rich data from postcode lookups. Wraps postcodes.io
gem "postcodes_io"
# Use Ruby objects to build reusable markup. A React inspired evolution of the presenter pattern
gem "view_component"
gem "view_component", "~> 3.9"
# Use the AWS S3 SDK as storage mechanism
gem "aws-sdk-s3"
# Track changes to models for auditing or versioning.

42
Gemfile.lock

@ -171,23 +171,20 @@ GEM
raabro (~> 1.4)
globalid (1.1.0)
activesupport (>= 5.0)
govuk-components (3.2.1)
actionpack (>= 6.1)
activemodel (>= 6.1)
html-attributes-utils (~> 0.9, >= 0.9.2)
pagy (~> 5.10.1)
railties (>= 6.1)
view_component (~> 2.69.0)
govuk_design_system_formbuilder (3.1.2)
govuk-components (5.0.2)
html-attributes-utils (~> 1.0.0, >= 1.0.0)
pagy (~> 6.0)
view_component (>= 3.9, < 3.10)
govuk_design_system_formbuilder (5.0.0)
actionview (>= 6.1)
activemodel (>= 6.1)
activesupport (>= 6.1)
html-attributes-utils (~> 0.9, >= 0.9.2)
html-attributes-utils (~> 1)
govuk_markdown (2.0.0)
activesupport
redcarpet
hashdiff (1.0.1)
html-attributes-utils (0.9.2)
html-attributes-utils (1.0.2)
activesupport (>= 6.1.4.4)
i18n (1.14.1)
concurrent-ruby (~> 1.0)
@ -203,7 +200,7 @@ GEM
listen (3.8.0)
rb-fsevent (~> 0.10, >= 0.10.3)
rb-inotify (~> 0.9, >= 0.9.10)
loofah (2.21.3)
loofah (2.22.0)
crass (~> 1.0.2)
nokogiri (>= 1.12.0)
mail (2.8.1)
@ -215,7 +212,7 @@ GEM
matrix (0.4.2)
method_source (1.0.0)
mini_mime (1.1.5)
minitest (5.19.0)
minitest (5.20.0)
msgpack (1.6.0)
net-imap (0.3.7)
date
@ -227,11 +224,11 @@ GEM
net-smtp (0.3.3)
net-protocol
nio4r (2.5.9)
nokogiri (1.15.4-arm64-darwin)
nokogiri (1.16.0-arm64-darwin)
racc (~> 1.4)
nokogiri (1.15.4-x86_64-darwin)
nokogiri (1.16.0-x86_64-darwin)
racc (~> 1.4)
nokogiri (1.15.4-x86_64-linux)
nokogiri (1.16.0-x86_64-linux)
racc (~> 1.4)
notifications-ruby-client (5.4.0)
jwt (>= 1.5, < 3)
@ -240,8 +237,7 @@ GEM
childprocess (>= 0.6.3, < 5)
iniparse (~> 1.4)
rexml (~> 3.2)
pagy (5.10.1)
activesupport
pagy (6.2.0)
paper_trail (14.0.0)
activerecord (>= 6.0)
request_store (~> 1.4)
@ -274,7 +270,7 @@ GEM
pundit (2.3.0)
activesupport (>= 3.0.0)
raabro (1.4.0)
racc (1.7.1)
racc (1.7.3)
rack (2.2.8)
rack-attack (6.6.1)
rack (>= 1.0, < 3)
@ -412,8 +408,8 @@ GEM
concurrent-ruby (~> 1.0)
uk_postcode (2.1.8)
unicode-display_width (2.4.2)
view_component (2.69.0)
activesupport (>= 5.0.0, < 8.0)
view_component (3.9.0)
activesupport (>= 5.2.0, < 8.0)
concurrent-ruby (~> 1.0)
method_source (~> 1.0)
warden (1.2.9)
@ -459,8 +455,8 @@ DEPENDENCIES
erb_lint
factory_bot_rails
faker
govuk-components
govuk_design_system_formbuilder (= 3.1.2)
govuk-components (~> 5.0)
govuk_design_system_formbuilder (~> 5.0)
govuk_markdown
jsbundling-rails
json-schema
@ -497,7 +493,7 @@ DEPENDENCIES
timecop (~> 0.9.4)
tzinfo-data
uk_postcode
view_component
view_component (~> 3.9)
web-console (>= 4.1.0)
webmock

24
app/components/bulk_upload_error_row_component.html.erb

@ -9,21 +9,21 @@
<div class="govuk-summary-card__content">
<%= govuk_table do |table| %>
<% table.head do |head| %>
<% head.row do |row| %>
<% row.cell(header: true, text: "Cell") %>
<% row.cell(header: true, text: "Question") %>
<% row.cell(header: true, text: "Error") %>
<% row.cell(header: true, text: "Specification") %>
<%= table.with_head do |head| %>
<% head.with_row do |row| %>
<% row.with_cell(header: true, text: "Cell") %>
<% row.with_cell(header: true, text: "Question") %>
<% row.with_cell(header: true, text: "Error") %>
<% row.with_cell(header: true, text: "Specification") %>
<% end %>
<% table.body do |body| %>
<%= table.with_body do |body| %>
<% bulk_upload_errors.each do |error| %>
<% body.row do |row| %>
<% row.cell(header: true, text: error.cell) %>
<% row.cell(text: question_for_field(error.field)) %>
<% row.cell(text: error.error) %>
<% row.cell(text: error.field.humanize) %>
<% body.with_row do |row| %>
<% row.with_cell(header: true, text: error.cell) %>
<% row.with_cell(text: question_for_field(error.field)) %>
<% row.with_cell(text: error.error) %>
<% row.with_cell(text: error.field.humanize) %>
<% end %>
<% end %>
<% end %>

16
app/components/bulk_upload_error_summary_table_component.html.erb

@ -4,16 +4,16 @@
<% sorted_errors.each do |error| %>
<%= govuk_table do |table| %>
<% table.head do |head| %>
<% head.row do |row| %>
<% row.cell(text: question_for_field(error[0][1].to_sym), header: true) %>
<% row.cell(text: "Column #{error[0][0]}", header: true, numeric: true) %>
<%= table.with_head do |head| %>
<% head.with_row do |row| %>
<% row.with_cell(text: question_for_field(error[0][1].to_sym), header: true) %>
<% row.with_cell(text: "Column #{error[0][0]}", header: true, numeric: true) %>
<% end %>
<% table.body do |body| %>
<% body.row do |row| %>
<% row.cell(text: error[0][2]) %>
<% row.cell(text: pluralize(error[1], "error"), numeric: true) %>
<%= table.with_body do |body| %>
<% body.with_row do |row| %>
<% row.with_cell(text: error[0][2]) %>
<% row.with_cell(text: pluralize(error[1], "error"), numeric: true) %>
<% end %>
<% end %>
<% end %>

8
app/components/check_answers_summary_list_card_component.html.erb

@ -9,9 +9,9 @@
<div class="govuk-summary-card__content">
<%= govuk_summary_list do |summary_list| %>
<% applicable_questions.each do |question| %>
<% summary_list.row do |row| %>
<% row.key { get_question_label(question) } %>
<% row.value do %>
<% summary_list.with_row do |row| %>
<% row.with_key { get_question_label(question) } %>
<% row.with_value do %>
<%= simple_format(
get_answer_label(question),
wrapper_tag: "span",
@ -34,7 +34,7 @@
<% end %>
<% if @log.collection_period_open_for_editing? %>
<% row.action(
<% row.with_action(
text: question.action_text(log),
href: action_href(log, question.page.id),
visually_hidden_text: question.check_answer_label.to_s.downcase,

2
app/components/search_component.html.erb

@ -10,7 +10,7 @@
autocomplete: "off",
class: "app-search__input" %>
<%= f.govuk_submit "Search", classes: "app-search__button" %>
<%= f.govuk_submit "Search", class: "app-search__button" %>
<%= govuk_button_link_to "Clear search", path(current_user), secondary: true, class: "app-search__button" %>
</div>
<% end %>

2
app/frontend/application.js

@ -18,7 +18,7 @@ import './controllers'
import './cookie-banner'
import './styles/application.scss'
require.context('govuk-frontend/govuk/assets')
require.context('govuk-frontend/dist/govuk/assets')
GOVUKFrontend()
GOVUKPrototypeComponents()

16
app/frontend/styles/_filter.scss

@ -3,6 +3,13 @@
margin-bottom: govuk-spacing(2);
}
.govuk-checkboxes__label,
.govuk-radios__label {
&:before {
background-color: govuk-colour("white");
}
}
.app-filter__header {
background-color: govuk-colour("light-grey");
display: flex;
@ -90,15 +97,6 @@
}
}
.govuk-checkboxes__label,
.govuk-radios__label {
@include govuk-font(16);
&:before {
background-color: govuk-colour("white");
}
}
.autocomplete__input {
@include govuk-font(16);
background-color: govuk-colour("white");

1
app/helpers/check_answers_helper.rb

@ -1,5 +1,6 @@
module CheckAnswersHelper
include GovukLinkHelper
include GovukVisuallyHiddenHelper
def display_answered_questions_summary(subsection, lettings_log, current_user)
total = total_count(subsection, lettings_log, current_user)

8
app/helpers/data_sharing_agreement_helper.rb

@ -1,13 +1,13 @@
module DataSharingAgreementHelper
def data_sharing_agreement_row(user:, organisation:, summary_list:)
summary_list.row do |row|
row.key { "Data Sharing Agreement" }
row.action(
summary_list.with_row do |row|
row.with_key { "Data Sharing Agreement" }
row.with_action(
href: data_sharing_agreement_organisation_path(organisation),
text: "View agreement",
)
row.value do
row.with_value do
simple_format(
data_sharing_agreement_first_line(organisation:, user:),
wrapper_tag: "span",

1
app/helpers/duplicate_logs_helper.rb

@ -1,5 +1,6 @@
module DuplicateLogsHelper
include GovukLinkHelper
include GovukVisuallyHiddenHelper
def duplicate_logs_continue_button(all_duplicates, duplicate_log, original_log)
if all_duplicates.count > 1

1
app/helpers/log_actions_helper.rb

@ -1,5 +1,6 @@
module LogActionsHelper
include GovukLinkHelper
include GovukVisuallyHiddenHelper
def edit_actions_for_log(log)
back = back_button_for(log)

10
app/helpers/organisations_helper.rb

@ -23,17 +23,17 @@ module OrganisationsHelper
end
def organisation_name_row(user:, organisation:, summary_list:)
summary_list.row do |row|
row.key { "Name" }
row.value { organisation.name }
summary_list.with_row do |row|
row.with_key { "Name" }
row.with_value { organisation.name }
if user.support?
row.action(
row.with_action(
visually_hidden_text: organisation.name.humanize.downcase,
href: edit_organisation_path(organisation),
html_attributes: { "data-qa": "change-#{organisation.name.downcase}" },
)
else
row.action
row.with_action
end
end
end

1
app/helpers/tab_nav_helper.rb

@ -1,5 +1,6 @@
module TabNavHelper
include GovukLinkHelper
include GovukVisuallyHiddenHelper
def user_cell(user)
link_text = user.name.presence || user.email

1
app/helpers/tasklist_helper.rb

@ -1,5 +1,6 @@
module TasklistHelper
include GovukLinkHelper
include GovukVisuallyHiddenHelper
include CollectionTimeHelper
def breadcrumb_logs_title(log, current_user)

10
app/views/duplicate_logs/_duplicate_log_check_answers.erb

@ -2,10 +2,10 @@
<div class="x-govuk-summary-card__body">
<%= govuk_summary_list do |summary_list| %>
<% log.duplicate_check_questions(current_user).each do |question| %>
<% summary_list.row do |row| %>
<% row.key { duplicate_log_question_label(question) } %>
<% summary_list.with_row do |row| %>
<% row.with_key { duplicate_log_question_label(question) } %>
<% row.value do %>
<% row.with_value do %>
<%= simple_format(
duplicate_log_answer_label(question, log),
wrapper_tag: "span",
@ -25,13 +25,13 @@
<% end %>
<% end %>
<% if @all_duplicates.many? %>
<% row.action(
<% row.with_action(
text: question.action_text(log),
href: change_duplicate_logs_action_href(log, question.page.id, @all_duplicates, @original_log.id),
visually_hidden_text: question.check_answer_label.to_s.downcase,
) %>
<% else %>
<% row.action(
<% row.with_action(
text: question.action_text(log),
href: duplicate_logs_action_href(log, question.page.id, @original_log.id),
visually_hidden_text: question.check_answer_label.to_s.downcase,

28
app/views/duplicate_logs/index.html.erb

@ -11,28 +11,28 @@
</div>
<%= govuk_table do |table| %>
<%= table.head do |head| %>
<%= head.row do |row| %>
<% row.cell header: true, text: "Type of logs" %>
<% row.cell header: true, text: "Log IDs" %>
<% row.cell header: true %>
<%= table.with_head do |head| %>
<%= head.with_row do |row| %>
<% row.with_cell header: true, text: "Type of logs" %>
<% row.with_cell header: true, text: "Log IDs" %>
<% row.with_cell header: true %>
<% end %>
<% end %>
<%= table.body do |body| %>
<%= table.with_body do |body| %>
<% @duplicates[:lettings].each do |duplicate_set| %>
<% body.row do |row| %>
<% row.cell text: "Lettings" %>
<% row.cell text: duplicate_set.map { |id| "Log #{id}" }.join(", ") %>
<% row.cell do %>
<% body.with_row do |row| %>
<% row.with_cell text: "Lettings" %>
<% row.with_cell text: duplicate_set.map { |id| "Log #{id}" }.join(", ") %>
<% row.with_cell do %>
<%= govuk_link_to "Review logs", lettings_log_duplicate_logs_path(duplicate_set.first, original_log_id: duplicate_set.first, referrer: params[:referrer], organisation_id: params[:organisation_id]) %>
<% end %>
<% end %>
<% end %>
<% @duplicates[:sales].each do |duplicate_set| %>
<% body.row do |row| %>
<% row.cell text: "Sales" %>
<% row.cell text: duplicate_set.map { |id| "Log #{id}" }.join(", ") %>
<% row.cell do %>
<% body.with_row do |row| %>
<% row.with_cell text: "Sales" %>
<% row.with_cell text: duplicate_set.map { |id| "Log #{id}" }.join(", ") %>
<% row.with_cell do %>
<%= govuk_link_to "Review logs", sales_log_duplicate_logs_path(duplicate_set.first, original_log_id: duplicate_set.first, referrer: params[:referrer], organisation_id: params[:organisation_id]) %>
<% end %>
<% end %>

8
app/views/form/_check_answers_summary_list.html.erb

@ -1,9 +1,9 @@
<%= govuk_summary_list do |summary_list| %>
<% questions.each do |question| %>
<% summary_list.row do |row| %>
<% row.key { get_question_label(question) } %>
<% summary_list.with_row do |row| %>
<% row.with_key { get_question_label(question) } %>
<% row.value do %>
<% row.with_value do %>
<%= simple_format(
get_answer_label(question, @log),
wrapper_tag: "span",
@ -26,7 +26,7 @@
<% end %>
<% if @log.collection_period_open_for_editing? %>
<% row.action(
<% row.with_action(
text: question.action_text(@log),
href: action_href(@log, question.page.id, referrer),
visually_hidden_text: question.check_answer_label.to_s.downcase,

24
app/views/layouts/application.html.erb

@ -7,12 +7,10 @@
<%= tag.meta name: "viewport", content: "width=device-width, initial-scale=1" %>
<%= tag.meta property: "og:image", content: asset_path("images/govuk-opengraph-image.png") %>
<%= tag.meta name: "theme-color", content: "#0b0c0c" %>
<%= favicon_link_tag asset_path("images/favicon.ico") %>
<%= favicon_link_tag asset_path("images/govuk-mask-icon.svg"), rel: "mask-icon", type: "image/svg", color: "#0b0c0c" %>
<%= favicon_link_tag asset_path("images/govuk-apple-touch-icon.png"), rel: "apple-touch-icon", type: "image/png" %>
<%= favicon_link_tag asset_path("images/govuk-apple-touch-icon-152x152.png"), rel: "apple-touch-icon", type: "image/png", size: "152x152" %>
<%= favicon_link_tag asset_path("images/govuk-apple-touch-icon-167x167.png"), rel: "apple-touch-icon", type: "image/png", size: "167x167" %>
<%= favicon_link_tag asset_path("images/govuk-apple-touch-icon-180x180.png"), rel: "apple-touch-icon", type: "image/png", size: "180x180" %>
<%= favicon_link_tag asset_path("images/favicon.ico"), type: nil, sizes: "48x48" %>
<%= favicon_link_tag asset_path("images/favicon.svg"), type: "image/svg+xml", sizes: "any" %>
<%= favicon_link_tag asset_path("images/govuk-icon-mask.svg"), rel: "mask-icon", color: "#0b0c0c", type: nil %>
<%= favicon_link_tag asset_path("images/govuk-icon-180.png"), rel: "apple-touch-icon", type: nil %>
<%= stylesheet_link_tag "application" %>
<%= javascript_include_tag "vendor/html5shiv.min.js" %>
<script>
@ -69,7 +67,7 @@
<body class="govuk-template__body app-template--wide">
<script>
document.body.className = ((document.body.className) ? document.body.className + " js-enabled" : "js-enabled");
document.body.className += " js-enabled" + ("noModule" in HTMLScriptElement.prototype ? " govuk-frontend-supported" : "");
</script>
<% if cookies[:accept_analytics_cookies] == "on" %>
@ -87,16 +85,16 @@
<%= govuk_header(
classes: govuk_header_classes(current_user),
service_url: current_user.nil? ? root_path : logs_path,
homepage_url: root_path,
navigation_classes: "govuk-header__navigation--end",
) do |component|
component.product_name(name: t("service_name"))
component.with_product_name(name: t("service_name"))
unless FeatureToggle.service_moved? || FeatureToggle.service_unavailable?
if current_user.nil?
component.navigation_item(text: "Sign in", href: user_session_path)
component.with_navigation_item(text: "Sign in", href: user_session_path)
else
component.navigation_item(text: "Your account", href: account_path)
component.navigation_item(text: "Sign out", href: destroy_user_session_path)
component.with_navigation_item(text: "Your account", href: account_path)
component.with_navigation_item(text: "Sign out", href: destroy_user_session_path)
end
end
end %>
@ -126,7 +124,7 @@
success: true, title_heading_level: 3,
title_id: "swanky-notifications"
) do |notification_banner|
notification_banner.heading(text: flash.notice.html_safe)
notification_banner.with_heading(text: flash.notice.html_safe)
if flash[:notification_banner_body]
tag.p flash[:notification_banner_body]&.html_safe
end

10
app/views/locations/check_answers.html.erb

@ -19,18 +19,18 @@
<%= govuk_summary_list do |summary_list| %>
<% display_location_attributes_for_check_answers(@location).each do |attr| %>
<% unless attr[:attribute].eql?("local_authority") && @location.is_la_inferred %>
<%= summary_list.row do |row| %>
<% row.key { attr[:name] } %>
<%= summary_list.with_row do |row| %>
<% row.with_key { attr[:name] } %>
<% if attr[:attribute].eql?("postcode") && @location.is_la_inferred %>
<% row.value do %>
<% row.with_value do %>
<%= details_html(attr) %>
<span class="govuk-!-font-weight-regular app-!-colour-muted"><%= formatted_local_authority_timeline(@location) %></span>
<% end %>
<% else %>
<% row.value { details_html(attr) } %>
<% row.with_value { details_html(attr) } %>
<% end %>
<% if LocationPolicy.new(current_user, @location).update? %>
<% row.action(text: action_text_helper(attr, @location), href: location_edit_path(@location, attr[:attribute])) %>
<% row.with_action(text: action_text_helper(attr, @location), href: location_edit_path(@location, attr[:attribute])) %>
<% end %>
<% end %>
<% end %>

26
app/views/locations/index.html.erb

@ -29,36 +29,36 @@
<%= govuk_section_break(visible: true, size: "m") %>
<%= govuk_table do |table| %>
<%= table.caption(classes: %w[govuk-!-font-size-19 govuk-!-font-weight-regular]) do |caption| %>
<%= table.with_caption(classes: %w[govuk-!-font-size-19 govuk-!-font-weight-regular]) do |caption| %>
<%= render(SearchResultCaptionComponent.new(searched: @searched, count: @pagy.count, item_label:, total_count: @total_count, item: "locations", filters_count: applied_filters_count(@filter_type))) %>
<% end %>
<%= table.head do |head| %>
<%= head.row do |row| %>
<% row.cell(header: true, text: "Postcode", html_attributes: {
<%= table.with_head do |head| %>
<%= head.with_row do |row| %>
<% row.with_cell(header: true, text: "Postcode", html_attributes: {
scope: "col",
}) %>
<% row.cell(header: true, text: "Name", html_attributes: {
<% row.with_cell(header: true, text: "Name", html_attributes: {
scope: "col",
}) %>
<% row.cell(header: true, text: "Location code", html_attributes: {
<% row.with_cell(header: true, text: "Location code", html_attributes: {
scope: "col",
}) %>
<% row.cell(header: true, text: "Status", html_attributes: {
<% row.with_cell(header: true, text: "Status", html_attributes: {
scope: "col",
}) %>
<% end %>
<% end %>
<% @locations.each do |location| %>
<%= table.body do |body| %>
<%= body.row do |row| %>
<% row.cell(text: simple_format(location_cell_postcode(location, if location.confirmed
<%= table.with_body do |body| %>
<%= body.with_row do |row| %>
<% row.with_cell(text: simple_format(location_cell_postcode(location, if location.confirmed
scheme_location_path(@scheme, location)
else
location.postcode.present? ? scheme_location_check_answers_path(@scheme, location, route: "locations") : scheme_location_postcode_path(@scheme, location)
end), { class: "govuk-!-font-weight-bold" }, wrapper_tag: "div")) %>
<% row.cell(text: location.name) %>
<% row.cell(text: location.id) %>
<% row.cell(text: status_tag_from_resource(location)) %>
<% row.with_cell(text: location.name) %>
<% row.with_cell(text: location.id) %>
<% row.with_cell(text: status_tag_from_resource(location)) %>
<% end %>
<% end %>
<% end %>

20
app/views/locations/show.html.erb

@ -16,24 +16,24 @@
<%= govuk_summary_list do |summary_list| %>
<% display_location_attributes(@location).each do |attr| %>
<% unless attr[:attribute].eql?("local_authority") && @location.is_la_inferred %>
<%= summary_list.row do |row| %>
<% row.key { attr[:name] } %>
<%= summary_list.with_row do |row| %>
<% row.with_key { attr[:name] } %>
<% if attr[:attribute].eql?("status") %>
<%= row.value { status_tag_from_resource(@location) } %>
<%= row.with_value { status_tag_from_resource(@location) } %>
<% elsif attr[:attribute].eql?("postcode") && @location.is_la_inferred %>
<% row.value do %>
<% row.with_value do %>
<%= details_html(attr) %>
<span class="govuk-!-font-weight-regular app-!-colour-muted"><%= formatted_local_authority_timeline(@location) %></span>
<% end %>
<% else %>
<%= row.value { details_html(attr) } %>
<%= row.with_value { details_html(attr) } %>
<% end %>
<% if LocationPolicy.new(current_user, @location).update? %>
<% row.action(text: "Change", href: scheme_location_postcode_path(@scheme, @location, referrer: "details")) if attr[:attribute] == "postcode" && current_user.support? %>
<% row.action(text: "Change", href: scheme_location_name_path(@scheme, @location, referrer: "details")) if attr[:attribute] == "name" %>
<% row.action(text: "Change", href: scheme_location_units_path(@scheme, @location, referrer: "details")) if attr[:attribute] == "units" && current_user.support? %>
<% row.action(text: "Change", href: scheme_location_type_of_unit_path(@scheme, @location, referrer: "details")) if attr[:attribute] == "type_of_unit" && current_user.support? %>
<% row.action(text: "Change", href: scheme_location_mobility_standards_path(@scheme, @location, referrer: "details")) if attr[:attribute] == "mobility_standards" && current_user.support? %>
<% row.with_action(text: "Change", href: scheme_location_postcode_path(@scheme, @location, referrer: "details")) if attr[:attribute] == "postcode" && current_user.support? %>
<% row.with_action(text: "Change", href: scheme_location_name_path(@scheme, @location, referrer: "details")) if attr[:attribute] == "name" %>
<% row.with_action(text: "Change", href: scheme_location_units_path(@scheme, @location, referrer: "details")) if attr[:attribute] == "units" && current_user.support? %>
<% row.with_action(text: "Change", href: scheme_location_type_of_unit_path(@scheme, @location, referrer: "details")) if attr[:attribute] == "type_of_unit" && current_user.support? %>
<% row.with_action(text: "Change", href: scheme_location_mobility_standards_path(@scheme, @location, referrer: "details")) if attr[:attribute] == "mobility_standards" && current_user.support? %>
<% end %>
<% end %>
<% end %>

28
app/views/logs/_delete_logs_table_lettings.html.erb

@ -1,24 +1,24 @@
<%= govuk_table do |table| %>
<% table.head do |head| %>
<% head.row do |row| %>
<% row.cell header: true, text: "Log ID" %>
<% row.cell header: true, text: "Tenancy code" %>
<% row.cell header: true, text: "Property reference" %>
<% row.cell header: true, text: "Status" %>
<% row.cell header: true, text: "Delete?" %>
<%= table.with_head do |head| %>
<% head.with_row do |row| %>
<% row.with_cell header: true, text: "Log ID" %>
<% row.with_cell header: true, text: "Tenancy code" %>
<% row.with_cell header: true, text: "Property reference" %>
<% row.with_cell header: true, text: "Status" %>
<% row.with_cell header: true, text: "Delete?" %>
<% end %>
<% end %>
<% table.body do |body| %>
<%= table.with_body do |body| %>
<% f.govuk_check_boxes_fieldset :selected_ids, small: true do %>
<% delete_logs_form.logs.each do |log| %>
<% body.row do |row| %>
<% row.cell do %>
<% body.with_row do |row| %>
<% row.with_cell do %>
<%= govuk_link_to log.id, url_for(log) %>
<% end %>
<% row.cell text: log.tenancycode %>
<% row.cell text: log.propcode %>
<% row.cell text: status_tag(log.status) %>
<% row.cell html_attributes: { class: "checkbox-cell" } do %>
<% row.with_cell text: log.tenancycode %>
<% row.with_cell text: log.propcode %>
<% row.with_cell text: status_tag(log.status) %>
<% row.with_cell html_attributes: { class: "checkbox-cell" } do %>
<% f.govuk_check_box :selected_ids, log.id,
label: { text: log.id, hidden: true },
checked: delete_logs_form.selected_ids.include?(log.id) %>

28
app/views/logs/_delete_logs_table_sales.html.erb

@ -1,24 +1,24 @@
<%= govuk_table do |table| %>
<% table.head do |head| %>
<% head.row do |row| %>
<% row.cell header: true, text: "Log ID" %>
<% row.cell header: true, text: "Purchaser code" %>
<% row.cell header: true, text: "Sale completion date" %>
<% row.cell header: true, text: "Status" %>
<% row.cell header: true, text: "Delete?" %>
<%= table.with_head do |head| %>
<% head.with_row do |row| %>
<% row.with_cell header: true, text: "Log ID" %>
<% row.with_cell header: true, text: "Purchaser code" %>
<% row.with_cell header: true, text: "Sale completion date" %>
<% row.with_cell header: true, text: "Status" %>
<% row.with_cell header: true, text: "Delete?" %>
<% end %>
<% end %>
<% table.body do |body| %>
<%= table.with_body do |body| %>
<% f.govuk_check_boxes_fieldset :selected_ids, small: true do %>
<% delete_logs_form.logs.each do |log| %>
<% body.row do |row| %>
<% row.cell do %>
<% body.with_row do |row| %>
<% row.with_cell do %>
<%= govuk_link_to log.id, url_for(log) %>
<% end %>
<% row.cell text: log.purchid %>
<% row.cell text: log.saledate&.to_formatted_s(:govuk_date) %>
<% row.cell text: status_tag(log.status) %>
<% row.cell html_attributes: { class: "checkbox-cell" } do %>
<% row.with_cell text: log.purchid %>
<% row.with_cell text: log.saledate&.to_formatted_s(:govuk_date) %>
<% row.with_cell text: status_tag(log.status) %>
<% row.with_cell html_attributes: { class: "checkbox-cell" } do %>
<% f.govuk_check_box :selected_ids, log.id,
label: { text: log.id, hidden: true },
checked: delete_logs_form.selected_ids.include?(log.id) %>

2
app/views/logs/index.html.erb

@ -27,7 +27,7 @@
title_heading_level: 3,
title_id: "impacted-logs-banner",
) do |notification_banner| %>
<% notification_banner.heading(text: "A scheme has changed and it has affected #{@unresolved_count} #{'log'.pluralize(@unresolved_count)}") %>
<% notification_banner.with_heading(text: "A scheme has changed and it has affected #{@unresolved_count} #{'log'.pluralize(@unresolved_count)}") %>
<div class="govuk-notification-banner__heading">
<%= govuk_link_to "Update logs", update_logs_lettings_logs_path, class: "govuk-notification-banner__link" %>
</div>

28
app/views/logs/update_logs.html.erb

@ -14,23 +14,23 @@
<% else %>
<%= render partial: "organisations/headings", locals: { main: "You need to update #{@total_count} logs", sub: "" } %>
<%= govuk_table do |table| %>
<% table.head do |head| %>
<% head.row do |row| %>
<% row.cell(header: true, text: "Log ID") %>
<% row.cell(header: true, text: "Tenancy code") %>
<% row.cell(header: true, text: "Property reference") %>
<% row.cell(header: true, text: "Status") %>
<% row.cell(header: true, text: "") %>
<%= table.with_head do |head| %>
<% head.with_row do |row| %>
<% row.with_cell(header: true, text: "Log ID") %>
<% row.with_cell(header: true, text: "Tenancy code") %>
<% row.with_cell(header: true, text: "Property reference") %>
<% row.with_cell(header: true, text: "Status") %>
<% row.with_cell(header: true, text: "") %>
<% end %>
<% end %>
<% @logs.each do |log| %>
<% table.body do |body| %>
<% body.row do |row| %>
<% row.cell(text: log.id) %>
<% row.cell(text: log.tenancycode) %>
<% row.cell(text: log.propcode) %>
<% row.cell(text: status_tag(log.status)) %>
<% row.cell(html_attributes: {
<%= table.with_body do |body| %>
<% body.with_row do |row| %>
<% row.with_cell(text: log.id) %>
<% row.with_cell(text: log.tenancycode) %>
<% row.with_cell(text: log.propcode) %>
<% row.with_cell(text: status_tag(log.status)) %>
<% row.with_cell(html_attributes: {
scope: "row",
class: "govuk-!-text-align-right",
}) do %>

8
app/views/merge_requests/organisations.html.erb

@ -23,10 +23,10 @@
<%= f.govuk_submit "Add organisation", classes: "govuk-button--secondary" %>
<%= govuk_table do |table| %>
<% @merge_request.merging_organisations.order(:name).each do |merging_organisation| %>
<%= table.body do |body| %>
<%= body.row do |row| %>
<% row.cell(text: merging_organisation.name) %>
<% row.cell(html_attributes: {
<%= table.with_body do |body| %>
<%= body.with_row do |row| %>
<% row.with_cell(text: merging_organisation.name) %>
<% row.with_cell(html_attributes: {
scope: "row",
class: "govuk-!-text-align-right",
}) do %>

10
app/views/organisation_relationships/_managing_agent_list.erb

@ -1,14 +1,14 @@
<section class="app-table-group" tabindex="0" aria-labelledby="<%= title.dasherize %>">
<%= govuk_table do |table| %>
<%= table.caption(classes: %w[govuk-!-font-size-19 govuk-!-font-weight-regular]) do |caption| %>
<%= table.with_caption(classes: %w[govuk-!-font-size-19 govuk-!-font-weight-regular]) do |caption| %>
<%= render(SearchResultCaptionComponent.new(searched:, count: pagy.count, item_label:, total_count:, item: "agents", filters_count: 0)) %>
<% end %>
<% @managing_agents.each do |managing_agent| %>
<%= table.body do |body| %>
<%= body.row do |row| %>
<% row.cell(text: managing_agent.name) %>
<%= table.with_body do |body| %>
<%= body.with_row do |row| %>
<% row.with_cell(text: managing_agent.name) %>
<% if current_user.data_coordinator? || current_user.support? %>
<% row.cell(html_attributes: {
<% row.with_cell(html_attributes: {
scope: "row",
class: "govuk-!-text-align-right",
}) do %>

10
app/views/organisation_relationships/_stock_owner_list.erb

@ -1,14 +1,14 @@
<section class="app-table-group" tabindex="0" aria-labelledby="<%= title.dasherize %>">
<%= govuk_table do |table| %>
<%= table.caption(classes: %w[govuk-!-font-size-19 govuk-!-font-weight-regular]) do |caption| %>
<%= table.with_caption(classes: %w[govuk-!-font-size-19 govuk-!-font-weight-regular]) do |caption| %>
<%= render(SearchResultCaptionComponent.new(searched:, count: pagy.count, item_label:, total_count:, item: "stock owners", filters_count: 0)) %>
<% end %>
<% @stock_owners.each do |stock_owner| %>
<%= table.body do |body| %>
<%= body.row do |row| %>
<% row.cell(text: stock_owner.name) %>
<%= table.with_body do |body| %>
<%= body.with_row do |row| %>
<% row.with_cell(text: stock_owner.name) %>
<% if current_user.data_coordinator? || current_user.support? %>
<% row.cell(html_attributes: {
<% row.with_cell(html_attributes: {
scope: "row",
class: "govuk-!-text-align-right",
}) do %>

18
app/views/organisations/_merged_organisation_details.html.erb

@ -3,21 +3,21 @@
<% @organisation.recently_absorbed_organisations_grouped_by_merge_date.each do |merge_date, organisations| %>
<p><strong>Merge date:</strong> <%= merge_date&.to_formatted_s(:govuk_date) %></p>
<%= govuk_table do |table| %>
<%= table.head do |head| %>
<%= head.row do |row| %>
<% row.cell(header: true, text: "Organisation name", html_attributes: { scope: "col", class: "govuk-!-width-one-half" }) %>
<% row.cell(header: true, text: "Organisation ID", html_attributes: { scope: "col", class: "govuk-!-width-one-half" }) %>
<%= table.with_head do |head| %>
<%= head.with_row do |row| %>
<% row.with_cell(header: true, text: "Organisation name", html_attributes: { scope: "col", class: "govuk-!-width-one-half" }) %>
<% row.with_cell(header: true, text: "Organisation ID", html_attributes: { scope: "col", class: "govuk-!-width-one-half" }) %>
<% end %>
<% end %>
<% organisations.each do |absorbed_org| %>
<%= table.body do |body| %>
<%= body.row do |row| %>
<%= table.with_body do |body| %>
<%= body.with_row do |row| %>
<% if current_user.support? %>
<% row.cell(text: simple_format(govuk_link_to(absorbed_org.name, organisation_path(absorbed_org)), { class: "govuk-!-font-weight-bold scheme-name-cell" }, wrapper_tag: "div")) %>
<% row.with_cell(text: simple_format(govuk_link_to(absorbed_org.name, organisation_path(absorbed_org)), { class: "govuk-!-font-weight-bold scheme-name-cell" }, wrapper_tag: "div")) %>
<% else %>
<% row.cell(text: absorbed_org.name) %>
<% row.with_cell(text: absorbed_org.name) %>
<% end %>
<% row.cell(text: "ORG#{absorbed_org.id}") %>
<% row.with_cell(text: "ORG#{absorbed_org.id}") %>
<% end %>
<% end %>
<% end %>

26
app/views/organisations/_organisation_list.html.erb

@ -1,35 +1,35 @@
<section class="app-table-group" tabindex="0" aria-labelledby="<%= title.dasherize %>">
<%= govuk_table do |table| %>
<%= table.caption(classes: %w[govuk-!-font-size-19 govuk-!-font-weight-regular]) do |caption| %>
<%= table.with_caption(classes: %w[govuk-!-font-size-19 govuk-!-font-weight-regular]) do |caption| %>
<%= render(SearchResultCaptionComponent.new(searched:, count: pagy.count, item_label:, total_count:, item: "organisations", filters_count: applied_filters_count(@filter_type))) %>
<% end %>
<%= table.head do |head| %>
<%= head.row do |row| %>
<% row.cell(header: true, text: "Name", html_attributes: {
<%= table.with_head do |head| %>
<%= head.with_row do |row| %>
<% row.with_cell(header: true, text: "Name", html_attributes: {
scope: "col",
}) %>
<% row.cell(header: true, text: "Registration number", html_attributes: {
<% row.with_cell(header: true, text: "Registration number", html_attributes: {
scope: "col",
}) %>
<% row.cell(header: true, text: "Type", html_attributes: {
<% row.with_cell(header: true, text: "Type", html_attributes: {
scope: "col",
}) %>
<% row.cell(header: true, text: "Status", html_attributes: {
<% row.with_cell(header: true, text: "Status", html_attributes: {
scope: "col",
}) %>
<% end %>
<% end %>
<% @organisations.each do |organisation| %>
<%= table.body do |body| %>
<%= body.row do |row| %>
<% row.cell(header: true, html_attributes: {
<%= table.with_body do |body| %>
<%= body.with_row do |row| %>
<% row.with_cell(header: true, html_attributes: {
scope: "row",
}) do %>
<%= govuk_link_to(organisation.name, "organisations/#{organisation.id}/lettings-logs") %>
<% end %>
<% row.cell(text: organisation.housing_registration_no) %>
<% row.cell(text: organisation.display_provider_type) %>
<% row.cell(text: status_tag(organisation.status)) %>
<% row.with_cell(text: organisation.housing_registration_no) %>
<% row.with_cell(text: organisation.display_provider_type) %>
<% row.with_cell(text: status_tag(organisation.status)) %>
<% end %>
<% end %>
<% end %>

16
app/views/organisations/show.html.erb

@ -17,20 +17,20 @@
<%= organisation_name_row(user: current_user, organisation: @organisation, summary_list:) %>
<% display_organisation_attributes(@organisation).each do |attr| %>
<% if can_edit_org?(current_user) && attr[:editable] %>
<%= summary_list.row do |row| %>
<% row.key { attr[:name] } %>
<% row.value { details_html(attr) } %>
<% row.action(
<%= summary_list.with_row do |row| %>
<% row.with_key { attr[:name] } %>
<% row.with_value { details_html(attr) } %>
<% row.with_action(
visually_hidden_text: attr[:name].to_s.humanize.downcase,
href: edit_organisation_path(@organisation),
html_attributes: { "data-qa": "change-#{attr[:name].downcase}" },
) %>
<% end %>
<% else %>
<%= summary_list.row do |row| %>
<% row.key { attr[:name] } %>
<% row.value { details_html(attr) } %>
<% row.action %>
<%= summary_list.with_row do |row| %>
<% row.with_key { attr[:name] } %>
<% row.with_value { details_html(attr) } %>
<% row.with_action %>
<% end %>
<% end %>
<% end %>

30
app/views/schemes/_scheme_list.html.erb

@ -1,6 +1,6 @@
<section class="app-table-group" tabindex="0" aria-labelledby="<%= title.dasherize %>">
<%= govuk_table do |table| %>
<%= table.caption(classes: %w[govuk-!-font-size-19 govuk-!-font-weight-regular]) do |caption| %>
<%= table.with_caption(classes: %w[govuk-!-font-size-19 govuk-!-font-weight-regular]) do |caption| %>
<span class="app-search__caption">
<%= render(SearchResultCaptionComponent.new(searched:, count: pagy.count, item_label:, total_count:, item: "schemes", filters_count: applied_filters_count(@filter_type))) %>
<% if @schemes&.any? %>
@ -10,23 +10,23 @@
<% end %>
</span>
<% end %>
<%= table.head do |head| %>
<%= head.row do |row| %>
<% row.cell(header: true, text: "Scheme", html_attributes: { scope: "col", class: "govuk-!-width-one-quarter" }) %>
<% row.cell(header: true, text: "Stock owner", html_attributes: { scope: "col" }) %>
<% row.cell(header: true, text: "Scheme code", html_attributes: { scope: "col" }) %>
<% row.cell(header: true, text: "Locations", html_attributes: { scope: "col" }) %>
<% row.cell(header: true, text: "Status", html_attributes: { scope: "col" }) %>
<%= table.with_head do |head| %>
<%= head.with_row do |row| %>
<% row.with_cell(header: true, text: "Scheme", html_attributes: { scope: "col", class: "govuk-!-width-one-quarter" }) %>
<% row.with_cell(header: true, text: "Stock owner", html_attributes: { scope: "col" }) %>
<% row.with_cell(header: true, text: "Scheme code", html_attributes: { scope: "col" }) %>
<% row.with_cell(header: true, text: "Locations", html_attributes: { scope: "col" }) %>
<% row.with_cell(header: true, text: "Status", html_attributes: { scope: "col" }) %>
<% end %>
<% end %>
<% @schemes.each do |scheme| %>
<%= table.body do |body| %>
<%= body.row do |row| %>
<% row.cell(text: simple_format(scheme_cell(scheme), { class: "govuk-!-font-weight-bold scheme-name-cell" }, wrapper_tag: "div")) %>
<% row.cell(text: scheme.owning_organisation&.name) %>
<% row.cell(text: scheme.id_to_display) %>
<% row.cell(text: scheme.locations&.count) %>
<% row.cell(text: status_tag_from_resource(scheme)) %>
<%= table.with_body do |body| %>
<%= body.with_row do |row| %>
<% row.with_cell(text: simple_format(scheme_cell(scheme), { class: "govuk-!-font-weight-bold scheme-name-cell" }, wrapper_tag: "div")) %>
<% row.with_cell(text: scheme.owning_organisation&.name) %>
<% row.with_cell(text: scheme.id_to_display) %>
<% row.with_cell(text: scheme.locations&.count) %>
<% row.with_cell(text: status_tag_from_resource(scheme)) %>
<% end %>
<% end %>
<% end %>

2
app/views/schemes/check_answers.html.erb

@ -5,7 +5,7 @@
<%= render partial: "organisations/headings", locals: { main: "Check your changes before creating this scheme", sub: @scheme.service_name } %>
<%= govuk_tabs(title: "Check your answers before creating this scheme") do |component| %>
<% component.tab(label: "Scheme") do %>
<% component.with_tab(label: "Scheme") do %>
<h2 class="govuk-visually-hidden">Scheme</h2>
<dl class="govuk-summary-list">
<% @scheme.check_details_attributes.each do |attr| %>

22
app/views/users/_user_list.html.erb

@ -1,29 +1,29 @@
<section class="app-table-group" tabindex="0" aria-labelledby="<%= title.dasherize %>">
<%= govuk_table do |table| %>
<%= table.caption(classes: %w[govuk-!-font-size-19 govuk-!-font-weight-regular]) do |caption| %>
<%= table.with_caption(classes: %w[govuk-!-font-size-19 govuk-!-font-weight-regular]) do |caption| %>
<%= render(SearchResultCaptionComponent.new(searched:, count: pagy.count, item_label:, total_count:, item: "users", filters_count: applied_filters_count(@filter_type))) %>
<% if current_user.support? %>
<% query = searched.present? ? "?search=#{searched}" : nil %>
<%= govuk_link_to "Download (CSV)", "#{request.path}.csv#{query}", type: "text/csv", style: "white-space: nowrap" %>
<% end %>
<% end %>
<%= table.head do |head| %>
<%= head.row do |row| %>
<% row.cell(header: true, text: "Name and email address", html_attributes: {
<%= table.with_head do |head| %>
<%= head.with_row do |row| %>
<% row.with_cell(header: true, text: "Name and email address", html_attributes: {
scope: "col",
}) %>
<% row.cell(header: true, text: "Organisation and role", html_attributes: {
<% row.with_cell(header: true, text: "Organisation and role", html_attributes: {
scope: "col",
}) %>
<% row.cell(header: true, text: "Last logged in", html_attributes: {
<% row.with_cell(header: true, text: "Last logged in", html_attributes: {
scope: "col",
}) %>
<% end %>
<% end %>
<% users.each do |user| %>
<%= table.body do |body| %>
<%= body.row do |row| %>
<% row.cell(header: true, html_attributes: {
<%= table.with_body do |body| %>
<%= body.with_row do |row| %>
<% row.with_cell(header: true, html_attributes: {
scope: "row",
}) do %>
<%= simple_format(user_cell(user), {}, wrapper_tag: "span") %>
@ -49,8 +49,8 @@
<%= "" %>
<% end %>
<% end %>
<% row.cell(text: simple_format(org_cell(user), {}, wrapper_tag: "div")) %>
<% row.cell(text: user.active? ? user.last_sign_in_at&.to_formatted_s(:govuk_date) : "Deactivated") %>
<% row.with_cell(text: simple_format(org_cell(user), {}, wrapper_tag: "div")) %>
<% row.with_cell(text: user.active? ? user.last_sign_in_at&.to_formatted_s(:govuk_date) : "Deactivated") %>
<%= govuk_link_to users_path(user) do %>
<span class="govuk-visually-hidden">User </span><%= user.id %>
<% end %>

78
app/views/users/show.html.erb

@ -21,95 +21,95 @@
Personal details
</h2>
<%= govuk_summary_list do |summary_list| %>
<%= summary_list.row do |row|
row.key { "Name" }
row.value { @user.name }
<%= summary_list.with_row do |row|
row.with_key { "Name" }
row.with_value { @user.name }
if UserPolicy.new(current_user, @user).edit_names?
row.action(visually_hidden_text: "name", href: aliased_user_edit(@user, current_user), html_attributes: { "data-qa": "change-name" })
row.with_action(visually_hidden_text: "name", href: aliased_user_edit(@user, current_user), html_attributes: { "data-qa": "change-name" })
else
row.action
row.with_action
end
end %>
<%= summary_list.row do |row|
row.key { "Email address" }
row.value { @user.email }
<%= summary_list.with_row do |row|
row.with_key { "Email address" }
row.with_value { @user.email }
if UserPolicy.new(current_user, @user).edit_emails?
row.action(visually_hidden_text: "email address", href: aliased_user_edit(@user, current_user), html_attributes: { "data-qa": "change-email-address" })
row.with_action(visually_hidden_text: "email address", href: aliased_user_edit(@user, current_user), html_attributes: { "data-qa": "change-email-address" })
else
row.action
row.with_action
end
end %>
<%= summary_list.row do |row|
row.key { "Telephone number" }
row.value { @user.phone }
<%= summary_list.with_row do |row|
row.with_key { "Telephone number" }
row.with_value { @user.phone }
if UserPolicy.new(current_user, @user).edit_telephone_numbers?
row.action(visually_hidden_text: "telephone number", href: aliased_user_edit(@user, current_user), html_attributes: { "data-qa": "change-telephone-number" })
row.with_action(visually_hidden_text: "telephone number", href: aliased_user_edit(@user, current_user), html_attributes: { "data-qa": "change-telephone-number" })
else
row.action
row.with_action
end
end %>
<%= summary_list.row do |row|
row.key { "Password" }
row.value { "••••••••" }
<%= summary_list.with_row do |row|
row.with_key { "Password" }
row.with_value { "••••••••" }
if UserPolicy.new(current_user, @user).edit_password?
row.action(
row.with_action(
visually_hidden_text: "password",
href: edit_password_account_path,
html_attributes: { "data-qa": "change-password" },
)
else
row.action
row.with_action
end
end %>
<%= summary_list.row do |row|
row.key { "Organisation" }
row.value { @user.organisation.name }
row.action
<%= summary_list.with_row do |row|
row.with_key { "Organisation" }
row.with_value { @user.organisation.name }
row.with_action
end %>
<%= summary_list.row do |row|
row.key { "Role" }
row.value { @user.role&.humanize }
<%= summary_list.with_row do |row|
row.with_key { "Role" }
row.with_value { @user.role&.humanize }
if UserPolicy.new(current_user, @user).edit_roles?
row.action(
row.with_action(
visually_hidden_text: "role",
href: aliased_user_edit(@user, current_user),
html_attributes: { "data-qa": "change-role" },
)
else
row.action
row.with_action
end
end %>
<%= summary_list.row do |row|
row.key { "Data protection officer" }
row.value { @user.is_data_protection_officer? ? "Yes" : "No" }
<%= summary_list.with_row do |row|
row.with_key { "Data protection officer" }
row.with_value { @user.is_data_protection_officer? ? "Yes" : "No" }
if UserPolicy.new(current_user, @user).edit_dpo?
row.action(
row.with_action(
visually_hidden_text: "if data protection officer",
href: user_edit_dpo_path(@user),
html_attributes: { "data-qa": "change-data-protection-officer" },
)
else
row.action
row.with_action
end
end %>
<%= summary_list.row do |row|
row.key { "Key contact" }
row.value { @user.is_key_contact? ? "Yes" : "No" }
<%= summary_list.with_row do |row|
row.with_key { "Key contact" }
row.with_value { @user.is_key_contact? ? "Yes" : "No" }
if UserPolicy.new(current_user, @user).edit_key_contact?
row.action(
row.with_action(
visually_hidden_text: "if a key contact",
href: user_edit_key_contact_path(@user),
html_attributes: { "data-qa": "change-key-contact" },
)
else
row.action
row.with_action
end
end %>
<% end %>

4
package.json

@ -11,7 +11,7 @@
"@hotwired/stimulus": "^3.0.0",
"@stimulus/polyfills": "^2.0.0",
"@webcomponents/webcomponentsjs": "^2.6.0",
"@x-govuk/govuk-prototype-components": "^2.0.1",
"@x-govuk/govuk-prototype-components": "^3.0.1",
"accessible-autocomplete": "^2.0.3",
"babel-loader": "^8.2.3",
"babel-plugin-macros": "^3.1.0",
@ -20,7 +20,7 @@
"css-loader": "^6.7.1",
"custom-event-polyfill": "^1.0.7",
"file-loader": "^6.2.0",
"govuk-frontend": "4.7.0",
"govuk-frontend": "5.0.0",
"html5shiv": "^3.7.3",
"intersection-observer": "^0.12.0",
"mini-css-extract-plugin": "^2.6.0",

1
spec/components/create_log_actions_component_spec.rb

@ -3,6 +3,7 @@ require "rails_helper"
RSpec.describe CreateLogActionsComponent, type: :component do
include GovukComponentsHelper
include GovukLinkHelper
include GovukVisuallyHiddenHelper
let(:component) { described_class.new(user:, log_type:, bulk_upload:) }
let(:render) { render_inline(component) }

4
spec/components/search_component_spec.rb

@ -6,7 +6,9 @@ RSpec.describe SearchComponent, type: :component do
let(:value) { nil }
before do
allow(request).to receive(:path).and_return("/users")
# rubocop:disable RSpec/AnyInstance
allow_any_instance_of(ActionDispatch::TestRequest).to receive(:path).and_return("/users")
# rubocop:enable RSpec/AnyInstance
render_inline(described_class.new(current_user:, search_label:, value:))
end

3
spec/config/routes_spec.rb

@ -7,10 +7,11 @@ RSpec.describe "routes.rb" do
let(:active_admin_routes_prefix) { "/admin" }
let(:rails_routes_prefix) { "/rails" }
let(:turbo_routes_pattern) { "_historical_location" }
let(:view_component_pattern) { "_system_test_entrypoint" }
let(:project_routes) do
all_routes.reject do |r|
r.starts_with?(active_admin_routes_prefix) || r.starts_with?(rails_routes_prefix) ||
r.include?(turbo_routes_pattern)
r.include?(turbo_routes_pattern) || r.include?(view_component_pattern)
end
end

8
spec/features/form/form_navigation_spec.rb

@ -137,7 +137,7 @@ RSpec.describe "Form Navigation" do
it "shows a validation error on radio questions" do
visit("/lettings-logs/#{id}/renewal")
click_button("Save and continue")
expect(page).to have_selector("#error-summary-title")
expect(page).to have_selector(".govuk-error-summary__title")
expect(page).to have_selector("#lettings-log-renewal-error")
expect(page).to have_title("Error")
end
@ -145,7 +145,7 @@ RSpec.describe "Form Navigation" do
it "shows a validation error on date questions" do
visit("/lettings-logs/#{id}/tenancy-start-date")
click_button("Save and continue")
expect(page).to have_selector("#error-summary-title")
expect(page).to have_selector(".govuk-error-summary__title")
expect(page).to have_selector("#lettings-log-startdate-error")
expect(page).to have_title("Error")
end
@ -156,7 +156,7 @@ RSpec.describe "Form Navigation" do
visit("/lettings-logs/#{id}/armed-forces")
choose("lettings-log-armedforces-1-field", allow_label_click: true)
click_button("Save and continue")
expect(page).to have_selector("#error-summary-title")
expect(page).to have_selector(".govuk-error-summary__title")
expect(page).to have_selector("#lettings-log-leftreg-error")
expect(page).to have_title("Error")
end
@ -170,7 +170,7 @@ RSpec.describe "Form Navigation" do
it "does not show a validation error" do
visit("/lettings-logs/#{id}/tenant-code")
click_button("Save and continue")
expect(page).not_to have_selector("#error-summary-title")
expect(page).not_to have_selector(".govuk-error-summary__title")
expect(page).not_to have_title("Error")
expect(page).to have_current_path("/lettings-logs/#{id}/property-reference")
end

4
spec/features/form/validations_spec.rb

@ -55,7 +55,7 @@ RSpec.describe "validations" do
it "shows validation for under 0" do
visit("/lettings-logs/#{id}/person-1-age")
fill_in_number_question(empty_lettings_log.id, "age1", -5, "person-1-age")
expect(page).to have_selector("#error-summary-title")
expect(page).to have_selector(".govuk-error-summary__title")
expect(page).to have_selector("#lettings-log-age1-error")
expect(page).to have_selector("#lettings-log-age1-field-error")
expect(page).to have_title("Error")
@ -64,7 +64,7 @@ RSpec.describe "validations" do
it "shows validation for over 120" do
visit("/lettings-logs/#{id}/person-1-age")
fill_in_number_question(empty_lettings_log.id, "age1", 121, "person-1-age")
expect(page).to have_selector("#error-summary-title")
expect(page).to have_selector(".govuk-error-summary__title")
expect(page).to have_selector("#lettings-log-age1-error")
expect(page).to have_selector("#lettings-log-age1-field-error")
expect(page).to have_title("Error")

22
spec/features/user_spec.rb

@ -65,7 +65,7 @@ RSpec.describe "User Features" do
it "is shown an error message if they submit without entering an email address" do
visit("/account/password/new")
click_button("Send email")
expect(page).to have_selector("#error-summary-title")
expect(page).to have_selector(".govuk-error-summary__title")
expect(page).to have_selector("#user-email-field-error")
expect(page).to have_title("Error")
end
@ -74,7 +74,7 @@ RSpec.describe "User Features" do
visit("/account/password/new")
fill_in("user[email]", with: "thisisn'tanemail")
click_button("Send email")
expect(page).to have_selector("#error-summary-title")
expect(page).to have_selector(".govuk-error-summary__title")
expect(page).to have_selector("#user-email-field-error")
expect(page).to have_title("Error")
end
@ -166,7 +166,7 @@ RSpec.describe "User Features" do
fill_in("user[email]", with: user.email)
fill_in("user[password]", with: "nonsense")
click_button("Sign in")
expect(page).to have_selector("#error-summary-title")
expect(page).to have_selector(".govuk-error-summary__title")
expect(page).to have_no_css(".govuk-notification-banner.govuk-notification-banner--success")
expect(page).to have_title("Error")
end
@ -174,7 +174,7 @@ RSpec.describe "User Features" do
it "show specific field error messages if a field was omitted" do
visit("/lettings-logs")
click_button("Sign in")
expect(page).to have_selector("#error-summary-title")
expect(page).to have_selector(".govuk-error-summary__title")
expect(page).to have_selector("#user-email-field-error")
expect(page).to have_selector("#user-password-field-error")
expect(page).to have_title("Error")
@ -184,7 +184,7 @@ RSpec.describe "User Features" do
visit("/lettings-logs")
fill_in("user[email]", with: "thisisn'tanemail")
click_button("Sign in")
expect(page).to have_selector("#error-summary-title")
expect(page).to have_selector(".govuk-error-summary__title")
expect(page).to have_selector("#user-email-field-error")
expect(page).to have_content(/Enter an email address in the correct format, like name@example.com/)
expect(page).to have_title("Error")
@ -201,7 +201,7 @@ RSpec.describe "User Features" do
fill_in("user[email]", with: user.email)
fill_in("user[password]", with: "pAssword1")
click_button("Sign in")
expect(page).to have_selector("#error-summary-title")
expect(page).to have_selector(".govuk-error-summary__title")
expect(page).to have_no_css(".govuk-notification-banner.govuk-notification-banner--success")
expect(page).to have_title("Error")
end
@ -379,7 +379,7 @@ RSpec.describe "User Features" do
visit("users/new")
fill_in("user[name]", with: "New User")
click_button("Continue")
expect(page).to have_selector("#error-summary-title")
expect(page).to have_selector(".govuk-error-summary__title")
expect(page).to have_selector("#user-email-field-error")
expect(page).to have_content(/Enter an email address/)
expect(page).to have_title("Error")
@ -390,7 +390,7 @@ RSpec.describe "User Features" do
fill_in("user[name]", with: "New User")
fill_in("user[email]", with: "thisis'tanemail")
click_button("Continue")
expect(page).to have_selector("#error-summary-title")
expect(page).to have_selector(".govuk-error-summary__title")
expect(page).to have_selector("#user-email-field-error")
expect(page).to have_content(/Enter an email address in the correct format, like name@example.com/)
expect(page).to have_title("Error")
@ -676,7 +676,7 @@ RSpec.describe "User Features" do
expect(page).to have_content("Check your email")
expect(page).to have_http_status(:unprocessable_entity)
expect(page).to have_title("Error")
expect(page).to have_selector("#error-summary-title")
expect(page).to have_selector(".govuk-error-summary__title")
end
end
end
@ -689,7 +689,7 @@ RSpec.describe "User Features" do
expect(page).to have_content("Check your email")
expect(page).to have_http_status(:unprocessable_entity)
expect(page).to have_title("Error")
expect(page).to have_selector("#error-summary-title")
expect(page).to have_selector(".govuk-error-summary__title")
end
end
@ -747,7 +747,7 @@ RSpec.describe "User Features" do
it "is shown an error message if they submit without entering an email address" do
visit("/account/password/new")
click_button("Send email")
expect(page).to have_selector("#error-summary-title")
expect(page).to have_selector(".govuk-error-summary__title")
expect(page).to have_selector("#user-email-field-error")
expect(page).to have_title("Error")
end

2
spec/requests/auth/confirmations_controller_spec.rb

@ -81,7 +81,7 @@ RSpec.describe Auth::ConfirmationsController, type: :request do
it "does not show an error message" do
follow_redirect!
expect(page).not_to have_selector("#error-summary-title")
expect(page).not_to have_selector(".govuk-error-summary__title")
end
end
end

8
spec/requests/users_controller_spec.rb

@ -66,7 +66,7 @@ RSpec.describe UsersController, type: :request do
it "shows an error on the same page if passwords don't match" do
expect(response).to have_http_status(:unprocessable_entity)
expect(page).to have_css("h1", class: "govuk-heading-l", text: "Change your password")
expect(page).to have_selector("#error-summary-title")
expect(page).to have_selector(".govuk-error-summary__title")
expect(page).to have_content("passwords you entered do not match")
end
end
@ -351,7 +351,7 @@ RSpec.describe UsersController, type: :request do
it "shows an error if passwords don't match" do
expect(response).to have_http_status(:unprocessable_entity)
expect(page).to have_selector("#error-summary-title")
expect(page).to have_selector(".govuk-error-summary__title")
end
end
end
@ -776,7 +776,7 @@ RSpec.describe UsersController, type: :request do
it "shows an error if passwords don't match" do
expect(response).to have_http_status(:unprocessable_entity)
expect(page).to have_selector("#error-summary-title")
expect(page).to have_selector(".govuk-error-summary__title")
end
end
end
@ -1732,7 +1732,7 @@ RSpec.describe UsersController, type: :request do
it "shows an error if passwords don't match" do
expect(response).to have_http_status(:unprocessable_entity)
expect(page).to have_selector("#error-summary-title")
expect(page).to have_selector(".govuk-error-summary__title")
end
end
end

8
webpack.config.js

@ -39,10 +39,10 @@ module.exports = {
},
resolve: {
alias: {
'govuk-frontend-styles': path.resolve(__dirname, 'node_modules/govuk-frontend/govuk/all.scss'),
'govuk-frontend-styles': path.resolve(__dirname, 'node_modules/govuk-frontend/dist/govuk/all.scss'),
'govuk-prototype-styles': path.resolve(__dirname, 'node_modules/@x-govuk/govuk-prototype-components/x-govuk/all.scss')
},
modules: ['node_modules', 'node_modules/govuk-frontend/govuk']
modules: ['node_modules', 'node_modules/govuk-frontend/dist/govuk']
},
output: {
filename: '[name].js',
@ -57,8 +57,8 @@ module.exports = {
new webpack.optimize.LimitChunkCountPlugin({ maxChunks: 1 }),
new CopyPlugin({
patterns: [
{ from: 'node_modules/govuk-frontend/govuk/assets/images', to: 'images' },
{ from: 'node_modules/govuk-frontend/govuk/assets/fonts', to: 'fonts' },
{ from: 'node_modules/govuk-frontend/dist/govuk/assets/images', to: 'images' },
{ from: 'node_modules/govuk-frontend/dist/govuk/assets/fonts', to: 'fonts' },
{ from: 'node_modules/html5shiv/dist/html5shiv.min.js', to: 'vendor' },
{ from: 'app/frontend/vendor/outerHTML.js', to: 'vendor' },
{ from: 'app/frontend/vendor/polyfill-output-value.js', to: 'vendor' }

152
yarn.lock

@ -1411,15 +1411,15 @@
resolved "https://registry.yarnpkg.com/@webpack-cli/serve/-/serve-1.7.0.tgz#e1993689ac42d2b16e9194376cfb6753f6254db1"
integrity sha512-oxnCNGj88fL+xzV+dacXs44HcDwf1ovs3AuEzvP7mqXw7fQntqIhQ1BRmynh4qEKQSSSRSWVyXRjmTbZIX9V2Q==
"@x-govuk/govuk-prototype-components@^2.0.1":
version "2.0.1"
resolved "https://registry.yarnpkg.com/@x-govuk/govuk-prototype-components/-/govuk-prototype-components-2.0.1.tgz#5b18efd3d2d5904a56604ad545961d588bedfaff"
integrity sha512-10Jf0hOYV8BJJePID04PtYVPJWzuaWWslhTZXtLIRMpxDStDgZlfekGqMiQwyz3MFcLhdch+0hSIRcw9YrAbHg==
"@x-govuk/govuk-prototype-components@^3.0.1":
version "3.0.1"
resolved "https://registry.yarnpkg.com/@x-govuk/govuk-prototype-components/-/govuk-prototype-components-3.0.1.tgz#6f858c014da67c4811919cd6e1e5f7dd65188d26"
integrity sha512-sbMG3RJi5r1eRPK5cOerXjhz1dq5kwH771JoGziIcFZwpVtPIYDAHrCCoH62AVCZAhzuWF2eSRrEo9zghX3sJw==
dependencies:
accessible-autocomplete "^2.0.4"
eventslibjs "^1.2.0"
optionalDependencies:
govuk-prototype-kit "^13.0.1"
govuk-prototype-kit "^13.14.1"
"@xtuc/ieee754@^1.2.0":
version "1.2.0"
@ -1789,7 +1789,7 @@ body-parser@1.20.1:
type-is "~1.6.18"
unpipe "1.0.0"
body-parser@^1.20.1:
body-parser@^1.20.2:
version "1.20.2"
resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.2.tgz#6feb0e21c4724d06de7ff38da36dad4f57a747fd"
integrity sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==
@ -1844,7 +1844,7 @@ browser-sync-ui@^2.29.3:
socket.io-client "^4.4.1"
stream-throttle "^0.1.3"
browser-sync@^2.27.11:
browser-sync@^2.29.3:
version "2.29.3"
resolved "https://registry.yarnpkg.com/browser-sync/-/browser-sync-2.29.3.tgz#c2a3ff00c659eb87a13cae9d7a427e1b4b580ee1"
integrity sha512-NiM38O6XU84+MN+gzspVmXV2fTOoe+jBqIBx3IBdhZrdeURr6ZgznJr/p+hQ+KzkKEiGH/GcC4SQFSL0jV49bg==
@ -2249,10 +2249,10 @@ cross-spawn@^7.0.2, cross-spawn@^7.0.3:
shebang-command "^2.0.0"
which "^2.0.1"
csrf-csrf@^2.2.4:
version "2.2.4"
resolved "https://registry.yarnpkg.com/csrf-csrf/-/csrf-csrf-2.2.4.tgz#449251207815ef711484c88c18463bad1879daa5"
integrity sha512-LuhBmy5RfRmEfeqeYqgaAuS1eDpVtKZB/Eiec9xiKQLBynJxrGVRdM2yRT/YMl1Njo/yKh2L9AYsIwSlTPnx2A==
csrf-csrf@^2.3.0:
version "2.3.0"
resolved "https://registry.yarnpkg.com/csrf-csrf/-/csrf-csrf-2.3.0.tgz#dfcd4e4f1c9efd9896b9ed5fe6074f3474b8ee5d"
integrity sha512-bUVpFobukoKdE2h0VNTgRmPelVnsGcnVavUOCYLFBnl6ss98bW7hPFWsQyuHMVdYK2NGRlQvthUEb4iX5nUb1w==
dependencies:
http-errors "^2.0.0"
@ -2314,7 +2314,7 @@ debug@^3.2.7:
dependencies:
ms "^2.1.1"
debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4, debug@~4.3.1, debug@~4.3.2:
debug@^4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4, debug@~4.3.1, debug@~4.3.2:
version "4.3.4"
resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865"
integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==
@ -2424,7 +2424,7 @@ doctrine@^3.0.0:
dependencies:
esutils "^2.0.2"
dotenv@^16.0.3:
dotenv@^16.3.1:
version "16.3.1"
resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.3.1.tgz#369034de7d7e5b120972693352a3bf112172cc3e"
integrity sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==
@ -3076,10 +3076,10 @@ fs-extra@3.0.1:
jsonfile "^3.0.0"
universalify "^0.1.0"
fs-extra@^11.1.0:
version "11.1.1"
resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-11.1.1.tgz#da69f7c39f3b002378b0954bb6ae7efdc0876e2d"
integrity sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==
fs-extra@^11.1.1:
version "11.2.0"
resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-11.2.0.tgz#e70e17dfad64232287d01929399e0ea7c86b0e5b"
integrity sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==
dependencies:
graceful-fs "^4.2.0"
jsonfile "^6.0.1"
@ -3240,41 +3240,46 @@ globjoin@^0.1.4:
resolved "https://registry.yarnpkg.com/globjoin/-/globjoin-0.1.4.tgz#2f4494ac8919e3767c5cbb691e9f463324285d43"
integrity sha512-xYfnw62CKG8nLkZBfWbhWwDw02CHty86jfPcc2cr3ZfeuK9ysoVPPEUxf21bAD/rWAgk52SuBrLJlefNy8mvFg==
govuk-frontend@4.7.0, govuk-frontend@^4.5.0:
govuk-frontend@4.7.0:
version "4.7.0"
resolved "https://registry.yarnpkg.com/govuk-frontend/-/govuk-frontend-4.7.0.tgz#69950b6c2e69f435ffe9aa60d8dee232dac977de"
integrity sha512-0OsdCusF5qvLWwKziU8zqxiC0nq6WP0ZQuw51ymZ/1V0tO71oIKMlSLN2S9bm8RcEGSoidPt2A34gKxePrLjvg==
govuk-prototype-kit@^13.0.1:
version "13.11.0"
resolved "https://registry.yarnpkg.com/govuk-prototype-kit/-/govuk-prototype-kit-13.11.0.tgz#52e3b5497a78aea89aeb60012d1058dbd79e6061"
integrity sha512-P28YQttSGgDfemhlVsOCnAWtqCyt0eX24ACxLWmx0r2zD1rVeTv4EdmrzfrZBiEMfx2JTa1PQRZYMVmh/BZB+Q==
govuk-frontend@5.0.0:
version "5.0.0"
resolved "https://registry.yarnpkg.com/govuk-frontend/-/govuk-frontend-5.0.0.tgz#c08a4d1115fb31eb39b6d19979c627f816185dd7"
integrity sha512-3WSfvQ+3kw/q/m8jrq/t8XnMUA8D2r0uhGyZaDbIh1gWTJBQzJBHbHiKYI9nc9ixIXdCFsc9RozkgEm57a795g==
govuk-prototype-kit@^13.14.1:
version "13.16.0"
resolved "https://registry.yarnpkg.com/govuk-prototype-kit/-/govuk-prototype-kit-13.16.0.tgz#e4202f652f7800c2d178d26e0000ce8a1ad991e9"
integrity sha512-S9oKOkHDJS3P987JnjFuKlEOzLPl0EuAFh2AoqoX/qsKxiJExzRRmQ/5xzzd16j8YRrSwem+mqSCvczhTYk3Jg==
dependencies:
ansi-colors "^4.1.3"
body-parser "^1.20.1"
browser-sync "^2.27.11"
body-parser "^1.20.2"
browser-sync "^2.29.3"
chokidar "^3.5.3"
cookie-parser "^1.4.6"
cross-spawn "^7.0.3"
csrf-csrf "^2.2.4"
csrf-csrf "^2.3.0"
del "^6.1.1"
dotenv "^16.0.3"
dotenv "^16.3.1"
express "^4.18.2"
express-session "^1.17.3"
fs-extra "^11.1.0"
govuk-frontend "^4.5.0"
inquirer "^8.2.0"
fs-extra "^11.1.1"
govuk-frontend "4.7.0"
inquirer "^8.2.6"
lodash "^4.17.21"
marked "^4.2.5"
nodemon "^2.0.20"
nunjucks "^3.2.3"
marked "^4.3.0"
nodemon "^3.0.1"
nunjucks "^3.2.4"
portscanner "^2.2.0"
require-dir "^1.2.0"
sass "^1.57.1"
sass "^1.69.5"
sync-request "^6.1.0"
tar-stream "^3.1.2"
tar-stream "^3.1.6"
universal-analytics "^0.5.3"
uuid "^9.0.0"
uuid "^9.0.1"
zlib "^1.0.5"
graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.4, graceful-fs@^4.2.9:
@ -3498,10 +3503,10 @@ ini@^1.3.5:
resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c"
integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==
inquirer@^8.2.0:
version "8.2.5"
resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-8.2.5.tgz#d8654a7542c35a9b9e069d27e2df4858784d54f8"
integrity sha512-QAgPDQMEgrDssk1XiwwHoOGYF9BAbUcc1+j+FhEvaOt8/cKRqyLn0U5qA6F74fGhTMGxf92pOvPBeh29jQJDTQ==
inquirer@^8.2.6:
version "8.2.6"
resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-8.2.6.tgz#733b74888195d8d400a67ac332011b5fae5ea562"
integrity sha512-M1WuAmb7pn9zdFRtQYk26ZBoY043Sse0wVDdk4Bppr+JOXyQYybdtvK+l9wUibhtjdjvtoiNy8tk+EgsYIUqKg==
dependencies:
ansi-escapes "^4.2.1"
chalk "^4.1.1"
@ -3517,7 +3522,7 @@ inquirer@^8.2.0:
string-width "^4.1.0"
strip-ansi "^6.0.0"
through "^2.3.6"
wrap-ansi "^7.0.0"
wrap-ansi "^6.0.1"
internal-slot@^1.0.3:
version "1.0.3"
@ -3974,7 +3979,7 @@ map-obj@^4.1.0:
resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-4.3.0.tgz#9304f906e93faae70880da102a9f1df0ea8bb05a"
integrity sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==
marked@^4.2.5:
marked@^4.3.0:
version "4.3.0"
resolved "https://registry.yarnpkg.com/marked/-/marked-4.3.0.tgz#796362821b019f734054582038b116481b456cf3"
integrity sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==
@ -4155,18 +4160,18 @@ node-releases@^2.0.6:
resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.6.tgz#8a7088c63a55e493845683ebf3c828d8c51c5503"
integrity sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==
nodemon@^2.0.20:
version "2.0.22"
resolved "https://registry.yarnpkg.com/nodemon/-/nodemon-2.0.22.tgz#182c45c3a78da486f673d6c1702e00728daf5258"
integrity sha512-B8YqaKMmyuCO7BowF1Z1/mkPqLk6cs/l63Ojtd6otKjMx47Dq1utxfRxcavH1I7VSaL8n5BUaoutadnsX3AAVQ==
nodemon@^3.0.1:
version "3.0.2"
resolved "https://registry.yarnpkg.com/nodemon/-/nodemon-3.0.2.tgz#222dd0de79fc7b7b3eedba422d2b9e5fc678621e"
integrity sha512-9qIN2LNTrEzpOPBaWHTm4Asy1LxXLSickZStAQ4IZe7zsoIpD/A7LWxhZV3t4Zu352uBcqVnRsDXSMR2Sc3lTA==
dependencies:
chokidar "^3.5.2"
debug "^3.2.7"
debug "^4"
ignore-by-default "^1.0.1"
minimatch "^3.1.2"
pstree.remy "^1.1.8"
semver "^5.7.1"
simple-update-notifier "^1.0.7"
semver "^7.5.3"
simple-update-notifier "^2.0.0"
supports-color "^5.5.0"
touch "^3.1.0"
undefsafe "^2.0.5"
@ -4193,7 +4198,7 @@ normalize-path@^3.0.0, normalize-path@~3.0.0:
resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65"
integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==
nunjucks@^3.2.3:
nunjucks@^3.2.4:
version "3.2.4"
resolved "https://registry.yarnpkg.com/nunjucks/-/nunjucks-3.2.4.tgz#f0878eef528ce7b0aa35d67cc6898635fd74649e"
integrity sha512-26XRV6BhkgK0VOxfbU5cQI+ICFUtMLixv1noZn1tGU38kQH5A5nmmbk/O45xdyBhD1esk47nKrY0mvQpZIhRjQ==
@ -4957,10 +4962,10 @@ sass@^1.49.9:
immutable "^4.0.0"
source-map-js ">=0.6.2 <2.0.0"
sass@^1.57.1:
version "1.64.0"
resolved "https://registry.yarnpkg.com/sass/-/sass-1.64.0.tgz#9ca8d0acb1a704b86b7f1197dc310f568fb34638"
integrity sha512-m7YtAGmQta9uANIUJwXesAJMSncqH+3INc8kdVXs6eV6GUC8Qu2IYKQSN8PRLgiQfpca697G94klm2leYMxSHw==
sass@^1.69.5:
version "1.69.7"
resolved "https://registry.yarnpkg.com/sass/-/sass-1.69.7.tgz#6e7e1c8f51e8162faec3e9619babc7da780af3b7"
integrity sha512-rzj2soDeZ8wtE2egyLXgOOHQvaC2iosZrkF6v3EUG+tBwEvhqUCzm0VP3k9gHF9LXbSrRhT5SksoI56Iw8NPnQ==
dependencies:
chokidar ">=3.0.0 <4.0.0"
immutable "^4.0.0"
@ -4994,28 +4999,18 @@ schema-utils@^4.0.0:
ajv-formats "^2.1.1"
ajv-keywords "^5.0.0"
semver@^5.7.1:
version "5.7.2"
resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.2.tgz#48d55db737c3287cd4835e17fa13feace1c41ef8"
integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==
semver@^6.0.0, semver@^6.1.1, semver@^6.1.2, semver@^6.3.0:
version "6.3.1"
resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4"
integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==
semver@^7.0.0, semver@^7.3.4, semver@^7.3.5, semver@^7.3.7:
semver@^7.0.0, semver@^7.3.4, semver@^7.3.5, semver@^7.3.7, semver@^7.5.3:
version "7.5.4"
resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.4.tgz#483986ec4ed38e1c6c48c34894a9182dbff68a6e"
integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==
dependencies:
lru-cache "^6.0.0"
semver@~7.0.0:
version "7.0.0"
resolved "https://registry.yarnpkg.com/semver/-/semver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e"
integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==
send@0.16.2:
version "0.16.2"
resolved "https://registry.yarnpkg.com/send/-/send-0.16.2.tgz#6ecca1e0f8c156d141597559848df64730a6bbc1"
@ -5147,12 +5142,12 @@ signal-exit@^4.0.1:
resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.0.2.tgz#ff55bb1d9ff2114c13b400688fa544ac63c36967"
integrity sha512-MY2/qGx4enyjprQnFaZsHib3Yadh3IXyV2C321GY0pjGfVBu4un0uDJkwgdxqO+Rdx8JMT8IfJIRwbYVz3Ob3Q==
simple-update-notifier@^1.0.7:
version "1.1.0"
resolved "https://registry.yarnpkg.com/simple-update-notifier/-/simple-update-notifier-1.1.0.tgz#67694c121de354af592b347cdba798463ed49c82"
integrity sha512-VpsrsJSUcJEseSbMHkrsrAVSdvVS5I96Qo1QAQ4FxQ9wXFcB+pjj7FB7/us9+GcgfW4ziHtYMc1J0PLczb55mg==
simple-update-notifier@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz#d70b92bdab7d6d90dfd73931195a30b6e3d7cebb"
integrity sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==
dependencies:
semver "~7.0.0"
semver "^7.5.3"
slash@^3.0.0:
version "3.0.0"
@ -5573,7 +5568,7 @@ tapable@^2.1.1, tapable@^2.2.0:
resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0"
integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==
tar-stream@^3.1.2:
tar-stream@^3.1.6:
version "3.1.6"
resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-3.1.6.tgz#6520607b55a06f4a2e2e04db360ba7d338cc5bab"
integrity sha512-B/UyjYwPpMBv+PaFSWAmtYjwdrlEaZQEhMIBFNC5oEG8lpiW8XjcSdmEaClj28ArfKScKHs2nshz3k2le6crsg==
@ -5829,10 +5824,10 @@ uuid@^8.0.0:
resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2"
integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==
uuid@^9.0.0:
version "9.0.0"
resolved "https://registry.yarnpkg.com/uuid/-/uuid-9.0.0.tgz#592f550650024a38ceb0c562f2f6aa435761efb5"
integrity sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==
uuid@^9.0.1:
version "9.0.1"
resolved "https://registry.yarnpkg.com/uuid/-/uuid-9.0.1.tgz#e188d4c8853cc722220392c424cd637f32293f30"
integrity sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==
validate-npm-package-license@^3.0.1:
version "3.0.4"
@ -5965,6 +5960,15 @@ word-wrap@^1.2.3:
resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.5.tgz#d2c45c6dd4fbce621a66f136cbe328afd0410b34"
integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==
wrap-ansi@^6.0.1:
version "6.2.0"
resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53"
integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==
dependencies:
ansi-styles "^4.0.0"
string-width "^4.1.0"
strip-ansi "^6.0.0"
wrap-ansi@^7.0.0:
version "7.0.0"
resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43"

Loading…
Cancel
Save