metadata_presenter 3.3.8 → 3.3.9

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 328dab1045a2324860917bc91f334eb353622109395a58381846b86a4f48654d
4
- data.tar.gz: 559913cd057f2e6fbe76bc5f5b42d7dca5e4c80288a567546425817fc511c896
3
+ metadata.gz: 686438bb706d255bb141b89fe969fd8bc2a948221aca64973243806bb944d6ac
4
+ data.tar.gz: f812f2ce0b2d47038fcfdb86d627d29a5b33eacaf7f435601b381bc58314b218
5
5
  SHA512:
6
- metadata.gz: de3b47dab8a26bcc6b346a391d5152727a1b68c7417d378c8153b5a0861205591ec8aed96a2db5c91c3edc8e2194ffa8b60039dbf76a2150cbea0a9082f5e04a
7
- data.tar.gz: aec951701f792b9a0d34e674bc83965ca3bf74504d5a891ed924b8a363cb5f8ac1f924dfc13e186b6520e464360a974f129ac84584c10eb080b44ea67ba95442
6
+ metadata.gz: 9e1ca38299788d27690f79e36df3fb40cb770bfba680143989e0f0c5782c93de5d0787843298ab58429f6167c104ba77a7f793ae1a404b28efa4c4190a8dc813
7
+ data.tar.gz: 93b4f74dc4150ac14fb05ce8714b0e78e9a8348e8fbd97f7530d24c96806e4a4b24c4386aa27389372dd2475c28edcd013085394eadf5b1ecf97c63516e517c7
@@ -8,34 +8,44 @@ 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
 
@@ -33,9 +33,11 @@ module MetadataPresenter
33
33
  # So in the Runner we defined the #create_save_and_return_submission in the parent
34
34
  # controller and in the Editor we don't.
35
35
  #
36
+ # :nocov:
36
37
  if defined?(super)
37
38
  super
38
39
  end
40
+ # :nocov:
39
41
  end
40
42
  end
41
43
  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
- return candidate_component.uuid if evaluation_conditions.flatten.all?
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
- return candidate_component.uuid if evaluation_conditions.flatten.any?
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
@@ -93,5 +93,11 @@ module MetadataPresenter
93
93
  def autocomplete(value)
94
94
  JSON.parse(value)['text']
95
95
  end
96
+
97
+ def address(value)
98
+ view.simple_format(
99
+ value.to_a.join("\r\n"), {}, wrapper_tag: 'span'
100
+ )
101
+ end
96
102
  end
97
103
  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 [TrueClass]
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,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 %>
@@ -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
  })
@@ -171,3 +171,13 @@ en:
171
171
  - "[date when you performed your basic accessibility check]"
172
172
  - "[insert team or organisation here]"
173
173
  url: 'accessibility'
174
+
175
+ activemodel:
176
+ attributes:
177
+ metadata_presenter/address_fieldset:
178
+ address_line_one: Address line 1
179
+ address_line_two: Address line 2 (optional)
180
+ city: Town or city
181
+ county: County (optional)
182
+ postcode: Postcode
183
+ country: Country
@@ -0,0 +1,13 @@
1
+ {
2
+ "_id": "component.address",
3
+ "_type": "address",
4
+ "errors": {},
5
+ "legend": "Address question",
6
+ "hint": "",
7
+ "name": "component-name",
8
+ "validation": {
9
+ "required": true,
10
+ "address": true,
11
+ "postcode": true
12
+ }
13
+ }
@@ -0,0 +1,6 @@
1
+ {
2
+ "_id": "error.address",
3
+ "_type": "string.error",
4
+ "description": "Input (address) is blank",
5
+ "value": "Enter %{field} for \"%{control}\""
6
+ }
@@ -0,0 +1,6 @@
1
+ {
2
+ "_id": "error.postcode",
3
+ "_type": "string.error",
4
+ "description": "Postcode format is not valid",
5
+ "value": "Enter a valid UK postcode for \"%{control}\""
6
+ }
@@ -1,104 +1,110 @@
1
1
  {
2
2
  "_id": "service.base",
3
- "_type": "service.base",
4
3
  "flow": {
5
- "cf6dc32f-502c-4215-8c27-1151a45735bb": {
6
- "_type": "flow.page",
4
+ "0c022e95-0748-4dda-8ba5-12fd1d2f596b": {
7
5
  "next": {
8
- "default": "9e1ba77f-f1e5-42f4-b090-437aa9af7f73"
9
- }
6
+ "default": "e8708909-922e-4eaf-87a5-096f7a713fcb"
7
+ },
8
+ "_type": "flow.page"
10
9
  },
11
- "9e1ba77f-f1e5-42f4-b090-437aa9af7f73": {
12
- "_type": "flow.page",
10
+ "2ef7d11e-0307-49e9-9fe2-345dc528dd66": {
13
11
  "next": {
14
- "default": "adcb61c3-52b1-479b-be51-1bb610876d54"
15
- }
12
+ "default": "2ef7d11e-0307-49e9-9fe2-345dc528dd67"
13
+ },
14
+ "_type": "flow.page"
16
15
  },
17
- "adcb61c3-52b1-479b-be51-1bb610876d54": {
18
- "_type": "flow.page",
16
+ "2ef7d11e-0307-49e9-9fe2-345dc528dd67": {
19
17
  "next": {
20
- "default": "4b8c6bf3-878a-4446-9198-48351b3e2185"
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
- "7806cd64-0c05-450e-ba6f-2325c8b22d46": {
48
- "_type": "flow.page",
40
+ "6984b0a4-d432-4628-89b7-410170b6f148": {
49
41
  "next": {
50
- "default": "0c022e95-0748-4dda-8ba5-12fd1d2f596b"
51
- }
42
+ "default": "e337070b-f636-49a3-a65c-f506675265f0"
43
+ },
44
+ "_type": "flow.page"
52
45
  },
53
- "0c022e95-0748-4dda-8ba5-12fd1d2f596b": {
54
- "_type": "flow.page",
46
+ "778e364b-9a7f-4829-8eb2-510e08f156a3": {
55
47
  "next": {
56
- "default": "e8708909-922e-4eaf-87a5-096f7a713fcb"
57
- }
48
+ "default": ""
49
+ },
50
+ "_type": "flow.page"
58
51
  },
59
- "e8708909-922e-4eaf-87a5-096f7a713fcb": {
60
- "_type": "flow.page",
52
+ "7806cd64-0c05-450e-ba6f-2325c8b22d46": {
61
53
  "next": {
62
- "default": "80420693-d6f2-4fce-a860-777ca774a6f5"
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
- "2ef7d11e-0307-49e9-9fe2-345dc528dd66": {
72
- "_type": "flow.page",
64
+ "9e1ba77f-f1e5-42f4-b090-437aa9af7f73": {
73
65
  "next": {
74
- "default": "2ef7d11e-0307-49e9-9fe2-345dc528dd67"
75
- }
66
+ "default": "adcb61c3-52b1-479b-be51-1bb610876d54"
67
+ },
68
+ "_type": "flow.page"
76
69
  },
77
- "2ef7d11e-0307-49e9-9fe2-345dc528dd67": {
78
- "_type": "flow.page",
70
+ "adcb61c3-52b1-479b-be51-1bb610876d54": {
79
71
  "next": {
80
- "default": "c7755991-436b-4495-afa6-803db58cefbc"
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": "e337070b-f636-49a3-a65c-f506675265f0"
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
- "778e364b-9a7f-4829-8eb2-510e08f156a3": {
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",
@@ -1,3 +1,3 @@
1
1
  module MetadataPresenter
2
- VERSION = '3.3.8'.freeze
2
+ VERSION = '3.3.9'.freeze
3
3
  end
@@ -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
+ }
@@ -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.8
4
+ version: 3.3.9
5
5
  platform: ruby
6
6
  authors:
7
7
  - MoJ Forms
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-12-15 00:00:00.000000000 Z
11
+ date: 2024-01-23 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
@@ -412,6 +429,7 @@ files:
412
429
  - app/views/metadata_presenter/attribute/_heading.html.erb
413
430
  - app/views/metadata_presenter/attribute/_lede.html.erb
414
431
  - app/views/metadata_presenter/attribute/_section_heading.html.erb
432
+ - app/views/metadata_presenter/component/_address.html.erb
415
433
  - app/views/metadata_presenter/component/_autocomplete.html.erb
416
434
  - app/views/metadata_presenter/component/_checkboxes.html.erb
417
435
  - app/views/metadata_presenter/component/_components.html.erb
@@ -460,6 +478,7 @@ files:
460
478
  - config/initializers/supported_components.rb
461
479
  - config/locales/en.yml
462
480
  - config/routes.rb
481
+ - default_metadata/component/address.json
463
482
  - default_metadata/component/autocomplete.json
464
483
  - default_metadata/component/checkboxes.json
465
484
  - default_metadata/component/content.json
@@ -489,6 +508,7 @@ files:
489
508
  - default_metadata/page/start.json
490
509
  - default_metadata/service/base.json
491
510
  - default_metadata/string/error.accept.json
511
+ - default_metadata/string/error.address.json
492
512
  - default_metadata/string/error.autocomplete.json
493
513
  - default_metadata/string/error.catch_all.json
494
514
  - default_metadata/string/error.date.json
@@ -505,6 +525,7 @@ files:
505
525
  - default_metadata/string/error.minimum.json
506
526
  - default_metadata/string/error.multiupload.json
507
527
  - default_metadata/string/error.number.json
528
+ - default_metadata/string/error.postcode.json
508
529
  - default_metadata/string/error.required.json
509
530
  - default_metadata/string/error.virus_scan.json
510
531
  - default_metadata/validations/date_after.json
@@ -554,6 +575,7 @@ files:
554
575
  - lib/metadata_presenter/engine.rb
555
576
  - lib/metadata_presenter/test_helpers.rb
556
577
  - lib/metadata_presenter/version.rb
578
+ - schemas/component/address.json
557
579
  - schemas/component/autocomplete.json
558
580
  - schemas/component/checkboxes.json
559
581
  - schemas/component/content.json