metadata_presenter 3.3.7 → 3.3.9

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 5b3ba182294bff21c9555433a3e5ac319ee1aae0f83e437c85b4045c2881d4d0
4
- data.tar.gz: 709711ebb0368b79ea07e00cb2547f38dec2a50c988438393e705187b742bbb2
3
+ metadata.gz: 686438bb706d255bb141b89fe969fd8bc2a948221aca64973243806bb944d6ac
4
+ data.tar.gz: f812f2ce0b2d47038fcfdb86d627d29a5b33eacaf7f435601b381bc58314b218
5
5
  SHA512:
6
- metadata.gz: 10a3f4918c792c57b5f7e717511168f45a2c3bf51e66c6d44c5c071a3137a0945fd4f11abe13a3c694f35c445ef74c89e69664a85de8a9048342a0873a80973b
7
- data.tar.gz: 9689d77e3b0fb63fa7d63b5817d4bcafd613de6b0d00a99a4fd9cced7593080c5841f486c873d592d45df2c855e5568e253f5b0ef03d04db4d10971d0ae2b557
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.7'.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,29 +1,29 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: metadata_presenter
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.3.7
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-12 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
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - ">="
17
+ - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: 2.1.5
19
+ version: 4.1.1
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - ">="
24
+ - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: 2.1.5
26
+ version: 4.1.1
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: json-schema
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -42,14 +42,14 @@ dependencies:
42
42
  name: kramdown
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - ">="
45
+ - - "~>"
46
46
  - !ruby/object:Gem::Version
47
47
  version: 2.4.0
48
48
  type: :runtime
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
- - - ">="
52
+ - - "~>"
53
53
  - !ruby/object:Gem::Version
54
54
  version: 2.4.0
55
55
  - !ruby/object:Gem::Dependency
@@ -70,14 +70,14 @@ dependencies:
70
70
  name: rails
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
- - - ">="
73
+ - - "~>"
74
74
  - !ruby/object:Gem::Version
75
75
  version: 7.0.0
76
76
  type: :runtime
77
77
  prerelease: false
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
- - - ">="
80
+ - - "~>"
81
81
  - !ruby/object:Gem::Version
82
82
  version: 7.0.0
83
83
  - !ruby/object:Gem::Dependency
@@ -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