metadata_presenter 3.3.8 → 3.3.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/app/controllers/metadata_presenter/engine_controller.rb +14 -0
- data/app/controllers/metadata_presenter/service_controller.rb +22 -0
- data/app/controllers/metadata_presenter/submissions_controller.rb +2 -0
- data/app/models/metadata_presenter/address_fieldset.rb +37 -0
- data/app/models/metadata_presenter/component.rb +0 -6
- data/app/models/metadata_presenter/evaluate_content_conditionals.rb +2 -2
- data/app/models/metadata_presenter/page_answers.rb +15 -2
- data/app/presenters/metadata_presenter/page_answers_presenter.rb +6 -0
- data/app/validators/metadata_presenter/address_validator.rb +46 -0
- data/app/validators/metadata_presenter/base_validator.rb +3 -3
- data/app/validators/metadata_presenter/postcode_validator.rb +53 -0
- data/app/views/metadata_presenter/attribute/_external_start_page_info.html.erb +12 -0
- data/app/views/metadata_presenter/component/_address.html.erb +46 -0
- data/app/views/metadata_presenter/header/show.html.erb +2 -2
- data/app/views/metadata_presenter/page/content.html.erb +3 -0
- data/app/views/metadata_presenter/page/multiplequestions.html.erb +3 -0
- data/app/views/metadata_presenter/page/singlequestion.html.erb +4 -0
- data/config/initializers/supported_components.rb +2 -2
- data/config/locales/en.yml +14 -0
- data/default_metadata/component/address.json +13 -0
- data/default_metadata/string/error.address.json +6 -0
- data/default_metadata/string/error.postcode.json +6 -0
- data/fixtures/version.json +89 -56
- data/lib/metadata_presenter/version.rb +1 -1
- data/schemas/component/address.json +31 -0
- data/schemas/errors/errors.json +19 -0
- data/schemas/validations/validations.json +18 -0
- metadata +25 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 72f903ea69aac642330788eb582ca3ca0f23b6be19bb46675dd57e9c65435a9e
|
4
|
+
data.tar.gz: b937d1215881c6634dab4ac6844cc9f4a9d5e34bda404c8d71fc26d5800ffeea
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c4cb42cfa3147e7b5ba49fa4d847fdfe3af0a568851a525da702f080d08c03bbe8c0f94b01eacf6b5191c04d793a3051a47ecf19338095a35563a5f9d033cecf
|
7
|
+
data.tar.gz: ef5eb881fc90c4bc68057740d6caa4370a14c5328480044384b6ac7c582f0d49dc1acf32e04f61b9cc5f32f275de694485de210ca230df534137e2e7a0fe2440
|
@@ -8,38 +8,52 @@ module MetadataPresenter
|
|
8
8
|
before_action :show_maintenance_page
|
9
9
|
|
10
10
|
def reload_user_data
|
11
|
+
# :nocov:
|
11
12
|
if defined? super
|
12
13
|
super
|
14
|
+
# :nocov:
|
13
15
|
else
|
14
16
|
load_user_data
|
15
17
|
end
|
16
18
|
end
|
17
19
|
|
18
20
|
def save_form_progress
|
21
|
+
# :nocov:
|
19
22
|
if defined? super
|
20
23
|
super
|
24
|
+
# :nocov:
|
21
25
|
end
|
22
26
|
end
|
23
27
|
|
24
28
|
def get_saved_progress(uuid)
|
29
|
+
# :nocov:
|
25
30
|
if defined? super
|
26
31
|
super(uuid)
|
32
|
+
# :nocov:
|
27
33
|
end
|
28
34
|
end
|
29
35
|
|
30
36
|
def increment_record_counter(uuid)
|
37
|
+
# :nocov:
|
31
38
|
if defined? super
|
32
39
|
super(uuid)
|
40
|
+
# :nocov:
|
33
41
|
end
|
34
42
|
end
|
35
43
|
|
36
44
|
def invalidate_record(uuid)
|
45
|
+
# :nocov:
|
37
46
|
if defined? super
|
38
47
|
super(uuid)
|
48
|
+
# :nocov:
|
39
49
|
end
|
40
50
|
end
|
41
51
|
|
42
52
|
def back_link
|
53
|
+
if use_external_start_page? && first_page?
|
54
|
+
return external_start_page_url
|
55
|
+
end
|
56
|
+
|
43
57
|
previous_page = PreviousPage.new(
|
44
58
|
service:,
|
45
59
|
user_data: load_user_data,
|
@@ -1,8 +1,30 @@
|
|
1
1
|
module MetadataPresenter
|
2
2
|
class ServiceController < EngineController
|
3
3
|
def start
|
4
|
+
if use_external_start_page?
|
5
|
+
return redirect_to_next_page
|
6
|
+
end
|
7
|
+
|
4
8
|
@page = service.start_page
|
5
9
|
render template: @page.template
|
6
10
|
end
|
11
|
+
|
12
|
+
private
|
13
|
+
|
14
|
+
def redirect_to_next_page
|
15
|
+
next_page = NextPage.new(
|
16
|
+
service:,
|
17
|
+
session:,
|
18
|
+
user_data: reload_user_data,
|
19
|
+
current_page_url: service.start_page.url,
|
20
|
+
previous_answers: []
|
21
|
+
).find
|
22
|
+
|
23
|
+
if next_page.present?
|
24
|
+
redirect_to_page next_page.url
|
25
|
+
else
|
26
|
+
not_found
|
27
|
+
end
|
28
|
+
end
|
7
29
|
end
|
8
30
|
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
module MetadataPresenter
|
2
|
+
class AddressFieldset
|
3
|
+
extend ActiveModel::Translation
|
4
|
+
include ActiveModel::Validations
|
5
|
+
include ActionView::Helpers
|
6
|
+
|
7
|
+
DEFAULT_COUNTRY = 'United Kingdom'.freeze
|
8
|
+
FIELDS = %w[
|
9
|
+
address_line_one
|
10
|
+
address_line_two
|
11
|
+
city
|
12
|
+
county
|
13
|
+
postcode
|
14
|
+
country
|
15
|
+
].freeze
|
16
|
+
|
17
|
+
attr_reader(*FIELDS)
|
18
|
+
|
19
|
+
def initialize(address)
|
20
|
+
FIELDS.each do |field|
|
21
|
+
next unless address[field]
|
22
|
+
|
23
|
+
instance_variable_set(:"@#{field}", conform(address[field]))
|
24
|
+
end
|
25
|
+
|
26
|
+
@country ||= DEFAULT_COUNTRY
|
27
|
+
end
|
28
|
+
|
29
|
+
def to_a
|
30
|
+
instance_values.values_at(*FIELDS).compact_blank
|
31
|
+
end
|
32
|
+
|
33
|
+
def conform(address_field)
|
34
|
+
sanitize(address_field, tags: [], attributes: []).strip
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -88,12 +88,6 @@ class MetadataPresenter::Component < MetadataPresenter::Metadata
|
|
88
88
|
end
|
89
89
|
end
|
90
90
|
|
91
|
-
def find_conditional_content_by_uuid(uuid)
|
92
|
-
metadata['conditionals'].select do |conditional|
|
93
|
-
conditional['_uuid'] == uuid
|
94
|
-
end
|
95
|
-
end
|
96
|
-
|
97
91
|
private
|
98
92
|
|
99
93
|
def validation_bundle_key
|
@@ -25,7 +25,7 @@ module MetadataPresenter
|
|
25
25
|
if candidate_component.conditionals.count == 1
|
26
26
|
# if there are only and rules or the particular case where there is only one condition
|
27
27
|
evaluation_conditions << evaluate_condition(candidate_component.conditionals[0])
|
28
|
-
|
28
|
+
candidate_component.uuid if evaluation_conditions.flatten.all?
|
29
29
|
elsif candidate_component.conditionals.count > 1
|
30
30
|
# if there are or rule
|
31
31
|
if candidate_component.conditionals[0][:_type] == 'and'
|
@@ -40,7 +40,7 @@ module MetadataPresenter
|
|
40
40
|
candidate_component.conditionals.map do |conditional|
|
41
41
|
evaluation_conditions << evaluate_condition(conditional)
|
42
42
|
end
|
43
|
-
|
43
|
+
candidate_component.uuid if evaluation_conditions.flatten.any?
|
44
44
|
end
|
45
45
|
end
|
46
46
|
end
|
@@ -34,11 +34,15 @@ module MetadataPresenter
|
|
34
34
|
answer_object.to_h if answer_object.present?
|
35
35
|
elsif component && component.type == 'checkboxes'
|
36
36
|
answers[method_name.to_s].to_a
|
37
|
+
elsif component && component.type == 'address'
|
38
|
+
address_answer(method_name.to_s)
|
37
39
|
else
|
38
40
|
sanitize(answers[method_name.to_s])
|
39
41
|
end
|
40
42
|
end
|
41
43
|
|
44
|
+
private
|
45
|
+
|
42
46
|
def upload_answer(component_id, _count)
|
43
47
|
file_details = answers[component_id.to_s]
|
44
48
|
|
@@ -141,8 +145,6 @@ module MetadataPresenter
|
|
141
145
|
end
|
142
146
|
end
|
143
147
|
|
144
|
-
private
|
145
|
-
|
146
148
|
def sanitize_filename(answer)
|
147
149
|
sanitize(filename(update_filename(answer)))
|
148
150
|
end
|
@@ -173,5 +175,16 @@ module MetadataPresenter
|
|
173
175
|
file_extension = File.extname(answer)
|
174
176
|
%w[.jfif .jpg].include?(file_extension)
|
175
177
|
end
|
178
|
+
|
179
|
+
# NOTE: Address component is different to other components in the sense it can
|
180
|
+
# produce different validation errors in different fields, and we need to track
|
181
|
+
# those errors between page renders, thus needing memoisation.
|
182
|
+
def address_answer(component_id)
|
183
|
+
@address_answer ||= {}
|
184
|
+
|
185
|
+
@address_answer[component_id] ||= MetadataPresenter::AddressFieldset.new(
|
186
|
+
answers.fetch(component_id, {})
|
187
|
+
)
|
188
|
+
end
|
176
189
|
end
|
177
190
|
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
module MetadataPresenter
|
2
|
+
class AddressValidator < BaseValidator
|
3
|
+
REQUIRED_FIELDS = %i[
|
4
|
+
address_line_one
|
5
|
+
city
|
6
|
+
postcode
|
7
|
+
country
|
8
|
+
].freeze
|
9
|
+
|
10
|
+
OPTIONAL_FIELDS = %i[
|
11
|
+
address_line_two
|
12
|
+
county
|
13
|
+
].freeze
|
14
|
+
|
15
|
+
def valid?
|
16
|
+
return true if allow_blank?
|
17
|
+
|
18
|
+
validate_required_fields
|
19
|
+
|
20
|
+
user_answer.errors.empty?
|
21
|
+
end
|
22
|
+
|
23
|
+
private
|
24
|
+
|
25
|
+
def allow_blank?
|
26
|
+
component.validation.compact_blank.keys.exclude?('required')
|
27
|
+
end
|
28
|
+
|
29
|
+
def validate_required_fields
|
30
|
+
REQUIRED_FIELDS.each { |field| add_error_if_blank(field) }
|
31
|
+
end
|
32
|
+
|
33
|
+
def add_error_if_blank(field)
|
34
|
+
if user_answer.send(field).blank?
|
35
|
+
error_message = default_error_message(field: translated_field(field))
|
36
|
+
|
37
|
+
page_answers.errors.add([component.id, field].join('.'), error_message)
|
38
|
+
user_answer.errors.add(field, error_message)
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
def translated_field(field)
|
43
|
+
MetadataPresenter::AddressFieldset.human_attribute_name(field).downcase
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
@@ -73,14 +73,14 @@ module MetadataPresenter
|
|
73
73
|
# @return [String] returns the default error message
|
74
74
|
# @raise [MetadataPresenter::NoDefaultMessage] raises no default message if
|
75
75
|
# is not present
|
76
|
-
def default_error_message
|
76
|
+
def default_error_message(params = {})
|
77
77
|
default_error_message_key = "error.#{schema_key}"
|
78
78
|
default_message = Rails.application
|
79
79
|
.config
|
80
80
|
.default_metadata[default_error_message_key]
|
81
81
|
|
82
82
|
if default_message.present?
|
83
|
-
default_message['value'] % error_message_hash
|
83
|
+
default_message['value'] % error_message_hash.merge(params)
|
84
84
|
else
|
85
85
|
raise NoDefaultMessage, "No default message found for key '#{default_error_message_key}'."
|
86
86
|
end
|
@@ -129,7 +129,7 @@ module MetadataPresenter
|
|
129
129
|
# blank values. We should not allow blank when performing the required
|
130
130
|
# validation.
|
131
131
|
#
|
132
|
-
# @return [
|
132
|
+
# @return [Boolean]
|
133
133
|
#
|
134
134
|
def allow_blank?
|
135
135
|
user_answer.blank? && !self.class.name.demodulize.include?('RequiredValidator')
|
@@ -0,0 +1,53 @@
|
|
1
|
+
module MetadataPresenter
|
2
|
+
class PostcodeValidator < BaseValidator
|
3
|
+
require 'uk_postcode'
|
4
|
+
|
5
|
+
VALIDATABLE_COUNTRIES = [
|
6
|
+
'UK',
|
7
|
+
'U.K.',
|
8
|
+
'England',
|
9
|
+
'United Kingdom',
|
10
|
+
'Scotland',
|
11
|
+
'Wales',
|
12
|
+
'Cymru',
|
13
|
+
'Channel Islands',
|
14
|
+
'Isle of Man',
|
15
|
+
'Northern Ireland'
|
16
|
+
].freeze
|
17
|
+
|
18
|
+
def valid?
|
19
|
+
validate_postcode if postcode.present?
|
20
|
+
|
21
|
+
user_answer.errors.empty?
|
22
|
+
end
|
23
|
+
|
24
|
+
private
|
25
|
+
|
26
|
+
def country
|
27
|
+
user_answer.country
|
28
|
+
end
|
29
|
+
|
30
|
+
def postcode
|
31
|
+
user_answer.postcode
|
32
|
+
end
|
33
|
+
|
34
|
+
def parsed_postcode
|
35
|
+
@parsed_postcode ||= UKPostcode.parse(postcode)
|
36
|
+
end
|
37
|
+
|
38
|
+
def valid_postcode?
|
39
|
+
parsed_postcode.full_valid?
|
40
|
+
end
|
41
|
+
|
42
|
+
def validatable_country?
|
43
|
+
VALIDATABLE_COUNTRIES.grep(/\A#{country}\z/i).any?
|
44
|
+
end
|
45
|
+
|
46
|
+
def validate_postcode
|
47
|
+
return if !validatable_country? || valid_postcode?
|
48
|
+
|
49
|
+
page_answers.errors.add([component.id, :postcode].join('.'), default_error_message)
|
50
|
+
user_answer.errors.add(:postcode, default_error_message)
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
<div class="govuk-notification-banner" role="region" aria-labelledby="govuk-notification-banner-title" data-module="govuk-notification-banner">
|
2
|
+
<div class="govuk-notification-banner__header">
|
3
|
+
<h2 class="govuk-notification-banner__title" id="govuk-notification-banner-title">
|
4
|
+
<%= I18n.t('presenter.external_start_page_info.important') %>
|
5
|
+
</h2>
|
6
|
+
</div>
|
7
|
+
<div class="govuk-notification-banner__content">
|
8
|
+
<p class="govuk-notification-banner__heading">
|
9
|
+
<%= I18n.t('presenter.external_start_page_info.content', href: govuk_link_to(I18n.t('presenter.external_start_page_info.link_text'), 'https://moj-forms.service.justice.gov.uk/building-and-editing/#start-page')).html_safe %>
|
10
|
+
</p>
|
11
|
+
</div>
|
12
|
+
</div>
|
@@ -0,0 +1,46 @@
|
|
1
|
+
<% hint_id = f.field_id(component.id, [:hint]).tr('_', '-') if component.hint.present? %>
|
2
|
+
|
3
|
+
<%= f.govuk_fieldset legend: { text: input_title }, described_by: hint_id do %>
|
4
|
+
<%= f.fields_for component.id, f.object.send(component.id) do |a| %>
|
5
|
+
<% if component.hint.present? %>
|
6
|
+
<div class="govuk-hint govuk-!-margin-bottom-6" id="<%= hint_id %>" data-fb-default-text="<%= default_text('hint') %>">
|
7
|
+
<%= component.hint %>
|
8
|
+
</div>
|
9
|
+
<% end %>
|
10
|
+
|
11
|
+
<%=
|
12
|
+
a.govuk_text_field :address_line_one,
|
13
|
+
label: { text: MetadataPresenter::AddressFieldset.human_attribute_name('address_line_one') },
|
14
|
+
autocorrect: 'off', autocomplete: 'address-line1'
|
15
|
+
%>
|
16
|
+
<%=
|
17
|
+
a.govuk_text_field :address_line_two,
|
18
|
+
label: { text: MetadataPresenter::AddressFieldset.human_attribute_name('address_line_two') },
|
19
|
+
autocorrect: 'off', autocomplete: 'address-line2'
|
20
|
+
%>
|
21
|
+
<%=
|
22
|
+
a.govuk_text_field :city,
|
23
|
+
label: { text: MetadataPresenter::AddressFieldset.human_attribute_name('city') },
|
24
|
+
width: 'two-thirds',
|
25
|
+
autocorrect: 'off', autocomplete: 'address-level2'
|
26
|
+
%>
|
27
|
+
<%=
|
28
|
+
a.govuk_text_field :county,
|
29
|
+
label: { text: MetadataPresenter::AddressFieldset.human_attribute_name('county') },
|
30
|
+
width: 'two-thirds',
|
31
|
+
autocorrect: 'off', autocomplete: 'address-level1'
|
32
|
+
%>
|
33
|
+
<%=
|
34
|
+
a.govuk_text_field :postcode,
|
35
|
+
label: { text: MetadataPresenter::AddressFieldset.human_attribute_name('postcode') },
|
36
|
+
width: 'one-quarter',
|
37
|
+
autocorrect: 'off', autocomplete: 'postal-code'
|
38
|
+
%>
|
39
|
+
<%=
|
40
|
+
a.govuk_text_field :country,
|
41
|
+
label: { text: MetadataPresenter::AddressFieldset.human_attribute_name('country') },
|
42
|
+
width: 'one-quarter',
|
43
|
+
autocorrect: 'off', autocomplete: 'country-name'
|
44
|
+
%>
|
45
|
+
<% end %>
|
46
|
+
<% end %>
|
@@ -28,10 +28,10 @@
|
|
28
28
|
</div>
|
29
29
|
<% if service.service_name.present? %>
|
30
30
|
<div class="govuk-header__content">
|
31
|
-
<a href="<%=
|
31
|
+
<a href="<%= start_page_url %>" class="govuk-header__link govuk-header__service-name">
|
32
32
|
<%= service.service_name %>
|
33
33
|
</a>
|
34
|
+
</div>
|
34
35
|
<% end %>
|
35
|
-
</div>
|
36
36
|
</div>
|
37
37
|
</header>
|
@@ -1,6 +1,9 @@
|
|
1
1
|
<div class="fb-main-grid-wrapper" data-fb-pagetype="<%= @page.type %>">
|
2
2
|
<div class="govuk-grid-row">
|
3
3
|
<div class="govuk-grid-column-two-thirds">
|
4
|
+
<% if editor_preview? && use_external_start_page? && first_page? %>
|
5
|
+
<%= render 'metadata_presenter/attribute/external_start_page_info' %>
|
6
|
+
<% end %>
|
4
7
|
|
5
8
|
<%= render partial:'metadata_presenter/component/conditional_component_banner'%>
|
6
9
|
|
@@ -1,6 +1,9 @@
|
|
1
1
|
<div class="fb-main-grid-wrapper" data-fb-pagetype="<%= @page.type %>">
|
2
2
|
<div class="govuk-grid-row">
|
3
3
|
<div class="govuk-grid-column-two-thirds">
|
4
|
+
<% if editor_preview? && use_external_start_page? && first_page? %>
|
5
|
+
<%= render 'metadata_presenter/attribute/external_start_page_info' %>
|
6
|
+
<% end %>
|
4
7
|
|
5
8
|
<%= render partial:'metadata_presenter/component/conditional_component_banner'%>
|
6
9
|
|
@@ -2,6 +2,10 @@
|
|
2
2
|
<div class="govuk-grid-row">
|
3
3
|
<div class="govuk-grid-column-two-thirds">
|
4
4
|
|
5
|
+
<% if editor_preview? && use_external_start_page? && first_page? %>
|
6
|
+
<%= render 'metadata_presenter/attribute/external_start_page_info' %>
|
7
|
+
<% end %>
|
8
|
+
|
5
9
|
<%= render 'metadata_presenter/attribute/section_heading' %>
|
6
10
|
|
7
11
|
<%= form_for @page_answers, as: :answers, url: @page.url, method: :post, authenticity_token: false do |f| %>
|
@@ -17,11 +17,11 @@ Rails.application.config.supported_components =
|
|
17
17
|
content: %w(content)
|
18
18
|
},
|
19
19
|
multiplequestions: {
|
20
|
-
input: %w(text textarea email number date radios checkboxes),
|
20
|
+
input: %w(text textarea email number date address radios checkboxes),
|
21
21
|
content: %w(content)
|
22
22
|
},
|
23
23
|
singlequestion: {
|
24
|
-
input: %w(text textarea number date radios checkboxes email upload multiupload autocomplete),
|
24
|
+
input: %w(text textarea number date address radios checkboxes email upload multiupload autocomplete),
|
25
25
|
content: %w()
|
26
26
|
}
|
27
27
|
})
|
data/config/locales/en.yml
CHANGED
@@ -17,6 +17,10 @@ en:
|
|
17
17
|
rejected: rejected
|
18
18
|
confirmation: You've %{action} analytics cookies.
|
19
19
|
hide: Hide this message
|
20
|
+
external_start_page_info:
|
21
|
+
important: 'Important'
|
22
|
+
content: "Your form has a %{href}. Links to your form's 'home' page, such as your form's name in the header, will not work until the GOV.UK page has been published."
|
23
|
+
link_text: 'GOV.UK start page'
|
20
24
|
maintenance:
|
21
25
|
maintenance_page_heading: 'Sorry, this form is unavailable'
|
22
26
|
maintenance_page_content: "If you were in the middle of completing the form, your data has not been saved.\r\n\r\nThe form will be available again from 9am on Monday 19 November 2018.\r\n\r\n\r\n\r\n### Other ways to apply\r\n\r\nContact us if your application is urgent \r\n\r\nEmail: \r\nTelephone: \r\nMonday to Friday, 9am to 5pm \r\n[Find out about call charges](https://www.gov.uk/call-charges)"
|
@@ -171,3 +175,13 @@ en:
|
|
171
175
|
- "[date when you performed your basic accessibility check]"
|
172
176
|
- "[insert team or organisation here]"
|
173
177
|
url: 'accessibility'
|
178
|
+
|
179
|
+
activemodel:
|
180
|
+
attributes:
|
181
|
+
metadata_presenter/address_fieldset:
|
182
|
+
address_line_one: Address line 1
|
183
|
+
address_line_two: Address line 2 (optional)
|
184
|
+
city: Town or city
|
185
|
+
county: County (optional)
|
186
|
+
postcode: Postcode
|
187
|
+
country: Country
|
data/fixtures/version.json
CHANGED
@@ -1,104 +1,110 @@
|
|
1
1
|
{
|
2
2
|
"_id": "service.base",
|
3
|
-
"_type": "service.base",
|
4
3
|
"flow": {
|
5
|
-
"
|
6
|
-
"_type": "flow.page",
|
4
|
+
"0c022e95-0748-4dda-8ba5-12fd1d2f596b": {
|
7
5
|
"next": {
|
8
|
-
"default": "
|
9
|
-
}
|
6
|
+
"default": "e8708909-922e-4eaf-87a5-096f7a713fcb"
|
7
|
+
},
|
8
|
+
"_type": "flow.page"
|
10
9
|
},
|
11
|
-
"
|
12
|
-
"_type": "flow.page",
|
10
|
+
"2ef7d11e-0307-49e9-9fe2-345dc528dd66": {
|
13
11
|
"next": {
|
14
|
-
"default": "
|
15
|
-
}
|
12
|
+
"default": "2ef7d11e-0307-49e9-9fe2-345dc528dd67"
|
13
|
+
},
|
14
|
+
"_type": "flow.page"
|
16
15
|
},
|
17
|
-
"
|
18
|
-
"_type": "flow.page",
|
16
|
+
"2ef7d11e-0307-49e9-9fe2-345dc528dd67": {
|
19
17
|
"next": {
|
20
|
-
"default": "
|
21
|
-
}
|
18
|
+
"default": "c7755991-436b-4495-afa6-803db58cefbc"
|
19
|
+
},
|
20
|
+
"_type": "flow.page"
|
22
21
|
},
|
23
22
|
"4b8c6bf3-878a-4446-9198-48351b3e2185": {
|
24
|
-
"_type": "flow.page",
|
25
23
|
"next": {
|
26
24
|
"default": "54ccc6cd-60c0-4749-947b-a97af1bc0aa2"
|
27
|
-
}
|
25
|
+
},
|
26
|
+
"_type": "flow.page"
|
28
27
|
},
|
29
28
|
"54ccc6cd-60c0-4749-947b-a97af1bc0aa2": {
|
30
|
-
"_type": "flow.page",
|
31
29
|
"next": {
|
32
30
|
"default": "b8335af2-6642-4e2f-8192-0dd12279eec7"
|
33
|
-
}
|
34
|
-
|
35
|
-
"b8335af2-6642-4e2f-8192-0dd12279eec7": {
|
36
|
-
"_type": "flow.page",
|
37
|
-
"next": {
|
38
|
-
"default": "68fbb180-9a2a-48f6-9da6-545e28b8d35a"
|
39
|
-
}
|
31
|
+
},
|
32
|
+
"_type": "flow.page"
|
40
33
|
},
|
41
34
|
"68fbb180-9a2a-48f6-9da6-545e28b8d35a": {
|
42
|
-
"_type": "flow.page",
|
43
35
|
"next": {
|
44
36
|
"default": "7806cd64-0c05-450e-ba6f-2325c8b22d46"
|
45
|
-
}
|
37
|
+
},
|
38
|
+
"_type": "flow.page"
|
46
39
|
},
|
47
|
-
"
|
48
|
-
"_type": "flow.page",
|
40
|
+
"6984b0a4-d432-4628-89b7-410170b6f148": {
|
49
41
|
"next": {
|
50
|
-
"default": "
|
51
|
-
}
|
42
|
+
"default": "e337070b-f636-49a3-a65c-f506675265f0"
|
43
|
+
},
|
44
|
+
"_type": "flow.page"
|
52
45
|
},
|
53
|
-
"
|
54
|
-
"_type": "flow.page",
|
46
|
+
"778e364b-9a7f-4829-8eb2-510e08f156a3": {
|
55
47
|
"next": {
|
56
|
-
"default": "
|
57
|
-
}
|
48
|
+
"default": ""
|
49
|
+
},
|
50
|
+
"_type": "flow.page"
|
58
51
|
},
|
59
|
-
"
|
60
|
-
"_type": "flow.page",
|
52
|
+
"7806cd64-0c05-450e-ba6f-2325c8b22d46": {
|
61
53
|
"next": {
|
62
|
-
"default": "
|
63
|
-
}
|
54
|
+
"default": "0c022e95-0748-4dda-8ba5-12fd1d2f596b"
|
55
|
+
},
|
56
|
+
"_type": "flow.page"
|
64
57
|
},
|
65
58
|
"80420693-d6f2-4fce-a860-777ca774a6f5": {
|
66
|
-
"_type": "flow.page",
|
67
59
|
"next": {
|
68
60
|
"default": "2ef7d11e-0307-49e9-9fe2-345dc528dd66"
|
69
|
-
}
|
61
|
+
},
|
62
|
+
"_type": "flow.page"
|
70
63
|
},
|
71
|
-
"
|
72
|
-
"_type": "flow.page",
|
64
|
+
"9e1ba77f-f1e5-42f4-b090-437aa9af7f73": {
|
73
65
|
"next": {
|
74
|
-
"default": "
|
75
|
-
}
|
66
|
+
"default": "adcb61c3-52b1-479b-be51-1bb610876d54"
|
67
|
+
},
|
68
|
+
"_type": "flow.page"
|
76
69
|
},
|
77
|
-
"
|
78
|
-
"_type": "flow.page",
|
70
|
+
"adcb61c3-52b1-479b-be51-1bb610876d54": {
|
79
71
|
"next": {
|
80
|
-
"default": "
|
81
|
-
}
|
72
|
+
"default": "4b8c6bf3-878a-4446-9198-48351b3e2185"
|
73
|
+
},
|
74
|
+
"_type": "flow.page"
|
75
|
+
},
|
76
|
+
"b8335af2-6642-4e2f-8192-0dd12279eec7": {
|
77
|
+
"next": {
|
78
|
+
"default": "68fbb180-9a2a-48f6-9da6-545e28b8d35a"
|
79
|
+
},
|
80
|
+
"_type": "flow.page"
|
82
81
|
},
|
83
82
|
"c7755991-436b-4495-afa6-803db58cefbc": {
|
84
|
-
"_type": "flow.page",
|
85
83
|
"next": {
|
86
|
-
"default": "
|
87
|
-
}
|
84
|
+
"default": "6984b0a4-d432-4628-89b7-410170b6f148"
|
85
|
+
},
|
86
|
+
"_type": "flow.page"
|
87
|
+
},
|
88
|
+
"cf6dc32f-502c-4215-8c27-1151a45735bb": {
|
89
|
+
"next": {
|
90
|
+
"default": "9e1ba77f-f1e5-42f4-b090-437aa9af7f73"
|
91
|
+
},
|
92
|
+
"_type": "flow.page"
|
88
93
|
},
|
89
94
|
"e337070b-f636-49a3-a65c-f506675265f0": {
|
90
|
-
"_type": "flow.page",
|
91
95
|
"next": {
|
92
96
|
"default": "778e364b-9a7f-4829-8eb2-510e08f156a3"
|
93
|
-
}
|
97
|
+
},
|
98
|
+
"_type": "flow.page"
|
94
99
|
},
|
95
|
-
"
|
96
|
-
"_type": "flow.page",
|
100
|
+
"e8708909-922e-4eaf-87a5-096f7a713fcb": {
|
97
101
|
"next": {
|
98
|
-
"default": ""
|
99
|
-
}
|
102
|
+
"default": "80420693-d6f2-4fce-a860-777ca774a6f5"
|
103
|
+
},
|
104
|
+
"_type": "flow.page"
|
100
105
|
}
|
101
106
|
},
|
107
|
+
"_type": "service.base",
|
102
108
|
"pages": [
|
103
109
|
{
|
104
110
|
"_id": "page.start",
|
@@ -675,6 +681,33 @@
|
|
675
681
|
],
|
676
682
|
"section_heading": ""
|
677
683
|
},
|
684
|
+
{
|
685
|
+
"_id": "page.postal-address",
|
686
|
+
"url": "postal-address",
|
687
|
+
"body": "Body section",
|
688
|
+
"lede": "",
|
689
|
+
"_type": "page.singlequestion",
|
690
|
+
"_uuid": "6984b0a4-d432-4628-89b7-410170b6f148",
|
691
|
+
"heading": "",
|
692
|
+
"components": [
|
693
|
+
{
|
694
|
+
"_id": "postal-address_address_1",
|
695
|
+
"hint": "",
|
696
|
+
"name": "postal-address_address_1",
|
697
|
+
"_type": "address",
|
698
|
+
"_uuid": "f72db038-d1cd-4c0d-baea-570b3e4863f5",
|
699
|
+
"errors": {},
|
700
|
+
"legend": "Confirm your postal address",
|
701
|
+
"collection": "components",
|
702
|
+
"validation": {
|
703
|
+
"address": true,
|
704
|
+
"required": true,
|
705
|
+
"postcode": true
|
706
|
+
}
|
707
|
+
}
|
708
|
+
],
|
709
|
+
"section_heading": ""
|
710
|
+
},
|
678
711
|
{
|
679
712
|
"_id": "page.check-answers",
|
680
713
|
"url": "check-answers",
|
@@ -0,0 +1,31 @@
|
|
1
|
+
{
|
2
|
+
"$id": "http://gov.uk/schema/v1.0.0/address",
|
3
|
+
"_name": "component.address",
|
4
|
+
"title": "Address",
|
5
|
+
"description": "Let users enter their address",
|
6
|
+
"type": "object",
|
7
|
+
"properties": {
|
8
|
+
"_type": {
|
9
|
+
"const": "address"
|
10
|
+
}
|
11
|
+
},
|
12
|
+
"allOf": [
|
13
|
+
{
|
14
|
+
"$ref": "definition.fieldset"
|
15
|
+
},
|
16
|
+
{
|
17
|
+
"$ref": "definition.width_class.input"
|
18
|
+
},
|
19
|
+
{
|
20
|
+
"$ref": "validations#/definitions/errors_address"
|
21
|
+
}
|
22
|
+
],
|
23
|
+
"composite": [
|
24
|
+
"address_line_one",
|
25
|
+
"address_line_two",
|
26
|
+
"city",
|
27
|
+
"county",
|
28
|
+
"postcode",
|
29
|
+
"country"
|
30
|
+
]
|
31
|
+
}
|
data/schemas/errors/errors.json
CHANGED
@@ -20,6 +20,14 @@
|
|
20
20
|
}
|
21
21
|
]
|
22
22
|
},
|
23
|
+
"address": {
|
24
|
+
"title": "Error strings for required address fields",
|
25
|
+
"allOf": [
|
26
|
+
{
|
27
|
+
"$ref": "#/definitions/error_strings"
|
28
|
+
}
|
29
|
+
]
|
30
|
+
},
|
23
31
|
"min_length": {
|
24
32
|
"title": "Error strings for minimum length",
|
25
33
|
"allOf": [
|
@@ -95,6 +103,17 @@
|
|
95
103
|
}
|
96
104
|
}
|
97
105
|
},
|
106
|
+
"address_errors": {
|
107
|
+
"properties": {
|
108
|
+
"errors": {
|
109
|
+
"properties": {
|
110
|
+
"address": {
|
111
|
+
"$ref": "#/definitions/address"
|
112
|
+
}
|
113
|
+
}
|
114
|
+
}
|
115
|
+
}
|
116
|
+
},
|
98
117
|
"string_errors": {
|
99
118
|
"properties": {
|
100
119
|
"errors": {
|
@@ -34,6 +34,24 @@
|
|
34
34
|
}
|
35
35
|
]
|
36
36
|
},
|
37
|
+
"address": {
|
38
|
+
"title": "Address",
|
39
|
+
"description": "Address required fields",
|
40
|
+
"oneOf": [
|
41
|
+
{
|
42
|
+
"$ref": "definition.conditional.boolean"
|
43
|
+
}
|
44
|
+
],
|
45
|
+
"default": true
|
46
|
+
},
|
47
|
+
"errors_address": {
|
48
|
+
"title": "Error messages for 'Address'",
|
49
|
+
"allOf": [
|
50
|
+
{
|
51
|
+
"$ref": "#/definitions/error_strings"
|
52
|
+
}
|
53
|
+
]
|
54
|
+
},
|
37
55
|
"errors_required": {
|
38
56
|
"title": "Error messages for ‘Required’",
|
39
57
|
"allOf": [
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: metadata_presenter
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.3.
|
4
|
+
version: 3.3.10
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- MoJ Forms
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2024-01-26 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: govuk_design_system_formbuilder
|
@@ -122,6 +122,20 @@ dependencies:
|
|
122
122
|
- - ">="
|
123
123
|
- !ruby/object:Gem::Version
|
124
124
|
version: '0'
|
125
|
+
- !ruby/object:Gem::Dependency
|
126
|
+
name: uk_postcode
|
127
|
+
requirement: !ruby/object:Gem::Requirement
|
128
|
+
requirements:
|
129
|
+
- - ">="
|
130
|
+
- !ruby/object:Gem::Version
|
131
|
+
version: '0'
|
132
|
+
type: :runtime
|
133
|
+
prerelease: false
|
134
|
+
version_requirements: !ruby/object:Gem::Requirement
|
135
|
+
requirements:
|
136
|
+
- - ">="
|
137
|
+
- !ruby/object:Gem::Version
|
138
|
+
version: '0'
|
125
139
|
- !ruby/object:Gem::Dependency
|
126
140
|
name: better_errors
|
127
141
|
requirement: !ruby/object:Gem::Requirement
|
@@ -328,6 +342,7 @@ files:
|
|
328
342
|
- app/helpers/metadata_presenter/default_metadata.rb
|
329
343
|
- app/helpers/metadata_presenter/default_text.rb
|
330
344
|
- app/jobs/metadata_presenter/application_job.rb
|
345
|
+
- app/models/metadata_presenter/address_fieldset.rb
|
331
346
|
- app/models/metadata_presenter/autocomplete_item.rb
|
332
347
|
- app/models/metadata_presenter/branch_destinations.rb
|
333
348
|
- app/models/metadata_presenter/column_number.rb
|
@@ -371,6 +386,7 @@ files:
|
|
371
386
|
- app/presenters/metadata_presenter/page_answers_presenter.rb
|
372
387
|
- app/validators/email_confirmation_validator.rb
|
373
388
|
- app/validators/metadata_presenter/accept_validator.rb
|
389
|
+
- app/validators/metadata_presenter/address_validator.rb
|
374
390
|
- app/validators/metadata_presenter/autocomplete_validator.rb
|
375
391
|
- app/validators/metadata_presenter/base_upload_validator.rb
|
376
392
|
- app/validators/metadata_presenter/base_validator.rb
|
@@ -389,6 +405,7 @@ files:
|
|
389
405
|
- app/validators/metadata_presenter/minimum_validator.rb
|
390
406
|
- app/validators/metadata_presenter/multiupload_validator.rb
|
391
407
|
- app/validators/metadata_presenter/number_validator.rb
|
408
|
+
- app/validators/metadata_presenter/postcode_validator.rb
|
392
409
|
- app/validators/metadata_presenter/required_validator.rb
|
393
410
|
- app/validators/metadata_presenter/validate_answers.rb
|
394
411
|
- app/validators/metadata_presenter/validate_schema.rb
|
@@ -409,9 +426,11 @@ files:
|
|
409
426
|
- app/views/metadata_presenter/analytics/_ua.html.erb
|
410
427
|
- app/views/metadata_presenter/analytics/analytics.html.erb
|
411
428
|
- app/views/metadata_presenter/attribute/_body.html.erb
|
429
|
+
- app/views/metadata_presenter/attribute/_external_start_page_info.html.erb
|
412
430
|
- app/views/metadata_presenter/attribute/_heading.html.erb
|
413
431
|
- app/views/metadata_presenter/attribute/_lede.html.erb
|
414
432
|
- app/views/metadata_presenter/attribute/_section_heading.html.erb
|
433
|
+
- app/views/metadata_presenter/component/_address.html.erb
|
415
434
|
- app/views/metadata_presenter/component/_autocomplete.html.erb
|
416
435
|
- app/views/metadata_presenter/component/_checkboxes.html.erb
|
417
436
|
- app/views/metadata_presenter/component/_components.html.erb
|
@@ -460,6 +479,7 @@ files:
|
|
460
479
|
- config/initializers/supported_components.rb
|
461
480
|
- config/locales/en.yml
|
462
481
|
- config/routes.rb
|
482
|
+
- default_metadata/component/address.json
|
463
483
|
- default_metadata/component/autocomplete.json
|
464
484
|
- default_metadata/component/checkboxes.json
|
465
485
|
- default_metadata/component/content.json
|
@@ -489,6 +509,7 @@ files:
|
|
489
509
|
- default_metadata/page/start.json
|
490
510
|
- default_metadata/service/base.json
|
491
511
|
- default_metadata/string/error.accept.json
|
512
|
+
- default_metadata/string/error.address.json
|
492
513
|
- default_metadata/string/error.autocomplete.json
|
493
514
|
- default_metadata/string/error.catch_all.json
|
494
515
|
- default_metadata/string/error.date.json
|
@@ -505,6 +526,7 @@ files:
|
|
505
526
|
- default_metadata/string/error.minimum.json
|
506
527
|
- default_metadata/string/error.multiupload.json
|
507
528
|
- default_metadata/string/error.number.json
|
529
|
+
- default_metadata/string/error.postcode.json
|
508
530
|
- default_metadata/string/error.required.json
|
509
531
|
- default_metadata/string/error.virus_scan.json
|
510
532
|
- default_metadata/validations/date_after.json
|
@@ -554,6 +576,7 @@ files:
|
|
554
576
|
- lib/metadata_presenter/engine.rb
|
555
577
|
- lib/metadata_presenter/test_helpers.rb
|
556
578
|
- lib/metadata_presenter/version.rb
|
579
|
+
- schemas/component/address.json
|
557
580
|
- schemas/component/autocomplete.json
|
558
581
|
- schemas/component/checkboxes.json
|
559
582
|
- schemas/component/content.json
|