metadata_presenter 2.17.11 → 2.17.14

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: 5c0fc8809f2ded3ff926abae242977d1e502bb49f2dfecc64c91c8fd43e3ca8d
4
- data.tar.gz: afaf9751bf92bfccdfb9b5ca8362b179b6999acab4efb1e098f51873ef15149e
3
+ metadata.gz: e97452ef08994e231a3652ad8f9ccdae67668e04bb3e449fd958a0872e4320ca
4
+ data.tar.gz: 6bacb894b8f40bda5ac33ffa4625d9a0970ba676d11184cdd97c8c1c5db2d0d4
5
5
  SHA512:
6
- metadata.gz: e738295503ef40d85ea5129be00bd0896e8f0b7273a27bce1f8203a3b12e7d2e4f50cc5d214f9503c308aa0d3033bbe69f31499b5584da64725ea90b77066fc9
7
- data.tar.gz: 0c4d1f59c8809212399ea14d8446dff1088d26446463a3eabf9ba6c0435df16c4a05901f2d66c5fde4ae969d16a0149b6b71505fda987bad2b4f13529a4bcaf7
6
+ metadata.gz: c446088262eea4845c754ed6f17b30237fc50acdd1b9f96b9bb78e2acb28d45445bf50d26a699188497ef58e90e8799fa2d7d384f350dac509e46d98b77faa36
7
+ data.tar.gz: e583b37191f8d82e357c06eb0bd17113bf2531ae1f7e4de3a40991d20ddcb4ce2877bf9cfa8bc81ae8da1964ab5c0b0150154feb2e6f8e7a013eed632fdf07e1
@@ -4,7 +4,7 @@ module MetadataPresenter
4
4
 
5
5
  def create
6
6
  @previous_answers = reload_user_data.deep_dup
7
- @page_answers = PageAnswers.new(page, answers_params)
7
+ @page_answers = PageAnswers.new(page, answers_params, autocomplete_items(page.components))
8
8
 
9
9
  upload_files if upload?
10
10
 
@@ -43,6 +43,8 @@ module MetadataPresenter
43
43
 
44
44
  def render_validation_error
45
45
  @user_data = answers_params
46
+ load_autocomplete_items
47
+
46
48
  render template: page.template, status: :unprocessable_entity
47
49
  end
48
50
 
@@ -57,6 +57,13 @@ module MetadataPresenter
57
57
  end
58
58
  helper_method :analytics_tags_present?
59
59
 
60
+ def load_autocomplete_items
61
+ if @page.autocomplete_component_present?
62
+ items = autocomplete_items(@page.components)
63
+ @page.assign_autocomplete_items(items)
64
+ end
65
+ end
66
+
60
67
  private
61
68
 
62
69
  def not_found
@@ -5,10 +5,7 @@ module MetadataPresenter
5
5
  @page ||= service.find_page_by_url(request.env['PATH_INFO'])
6
6
 
7
7
  if @page
8
- if @page.autocomplete_component_present?
9
- items = autocomplete_items(@page.components)
10
- @page.assign_autocomplete_items(items)
11
- end
8
+ load_autocomplete_items
12
9
 
13
10
  @page_answers = PageAnswers.new(@page, @user_data)
14
11
  render template: @page.template
@@ -1,6 +1,6 @@
1
1
  class MetadataPresenter::AutocompleteItem < MetadataPresenter::Metadata
2
2
  def id
3
- value
3
+ { text: text, value: value }.to_json
4
4
  end
5
5
 
6
6
  def name
@@ -10,6 +10,17 @@ class MetadataPresenter::Component < MetadataPresenter::Metadata
10
10
  # Threshold percentage at which the remaining count is shown
11
11
  VALIDATION_STRING_LENGTH_THRESHOLD = 75
12
12
 
13
+ # Overriding here because autocomplete component's items property is non interactable
14
+ # in the Editor therefore it does not need to exist in the data-fb-content-data
15
+ # attribute on the page. The data-fb-content-data attribute is what is used to
16
+ # update user interactable elements such as the component question or page section
17
+ # heading etc.
18
+ def to_json(*_args)
19
+ return super unless autocomplete?
20
+
21
+ JSON.parse(super).to_json(except: 'items')
22
+ end
23
+
13
24
  def to_partial_path
14
25
  "metadata_presenter/component/#{type}"
15
26
  end
@@ -25,7 +36,7 @@ class MetadataPresenter::Component < MetadataPresenter::Metadata
25
36
  end
26
37
 
27
38
  def item_klass
28
- type == 'autocomplete' ? MetadataPresenter::AutocompleteItem : MetadataPresenter::Item
39
+ autocomplete? ? MetadataPresenter::AutocompleteItem : MetadataPresenter::Item
29
40
  end
30
41
 
31
42
  SUPPORTS_BRANCHING = %w[radios checkboxes].freeze
@@ -34,6 +45,10 @@ class MetadataPresenter::Component < MetadataPresenter::Metadata
34
45
  type.in?(SUPPORTS_BRANCHING)
35
46
  end
36
47
 
48
+ def autocomplete?
49
+ type == 'autocomplete'
50
+ end
51
+
37
52
  def content?
38
53
  type == 'content'
39
54
  end
@@ -106,7 +106,7 @@ module MetadataPresenter
106
106
  end
107
107
 
108
108
  def autocomplete_component_present?
109
- components.any? { |component| component.type == 'autocomplete' }
109
+ components.any?(&:autocomplete?)
110
110
  end
111
111
 
112
112
  def assign_autocomplete_items(items)
@@ -3,16 +3,17 @@ module MetadataPresenter
3
3
  include ActiveModel::Model
4
4
  include ActiveModel::Validations
5
5
  include ActionView::Helpers
6
- attr_reader :page, :answers, :uploaded_files
6
+ attr_reader :page, :answers, :uploaded_files, :autocomplete_items
7
7
 
8
- def initialize(page, answers)
8
+ def initialize(page, answers, autocomplete_items = nil)
9
9
  @page = page
10
10
  @answers = answers
11
+ @autocomplete_items = autocomplete_items
11
12
  @uploaded_files = []
12
13
  end
13
14
 
14
15
  def validate_answers
15
- ValidateAnswers.new(self, components: components).valid?
16
+ ValidateAnswers.new(self, components: components, autocomplete_items: autocomplete_items).valid?
16
17
  end
17
18
 
18
19
  delegate :components, to: :page
@@ -83,5 +83,9 @@ module MetadataPresenter
83
83
  def upload(file_hash)
84
84
  file_hash['original_filename']
85
85
  end
86
+
87
+ def autocomplete(value)
88
+ JSON.parse(value)['text']
89
+ end
86
90
  end
87
91
  end
@@ -0,0 +1,21 @@
1
+ module MetadataPresenter
2
+ class AutocompleteValidator < BaseValidator
3
+ attr_reader :autocomplete_items
4
+
5
+ def initialize(page_answers:, component:, autocomplete_items:)
6
+ super(page_answers: page_answers, component: component)
7
+
8
+ @autocomplete_items = autocomplete_items
9
+ end
10
+
11
+ def invalid_answer?
12
+ return if autocomplete_item_list.blank?
13
+
14
+ autocomplete_item_list.exclude?(JSON.parse(user_answer))
15
+ end
16
+
17
+ def autocomplete_item_list
18
+ @autocomplete_item_list ||= autocomplete_items[component.uuid]
19
+ end
20
+ end
21
+ end
@@ -1,10 +1,11 @@
1
1
  module MetadataPresenter
2
2
  class ValidateAnswers
3
- attr_reader :page_answers, :components
3
+ attr_reader :page_answers, :components, :autocomplete_items
4
4
 
5
- def initialize(page_answers, components:)
5
+ def initialize(page_answers, components:, autocomplete_items:)
6
6
  @page_answers = page_answers
7
7
  @components = Array(components)
8
+ @autocomplete_items = autocomplete_items
8
9
  end
9
10
 
10
11
  def valid?
@@ -21,8 +22,10 @@ module MetadataPresenter
21
22
  components.map { |component|
22
23
  component_validations(component).map do |key|
23
24
  "MetadataPresenter::#{key.classify}Validator".constantize.new(
24
- page_answers: page_answers,
25
- component: component
25
+ {
26
+ component: component,
27
+ page_answers: page_answers
28
+ }.merge(autocomplete_param(key))
26
29
  )
27
30
  end
28
31
  }.compact.flatten
@@ -33,5 +36,9 @@ module MetadataPresenter
33
36
 
34
37
  component.validation.select { |_, value| value.present? }.keys
35
38
  end
39
+
40
+ def autocomplete_param(key)
41
+ key == 'autocomplete_item' ? { autocomplete_items: autocomplete_items } : {}
42
+ end
36
43
  end
37
44
  end
@@ -14,8 +14,8 @@
14
14
  <link rel="apple-touch-icon" sizes="152x152" href="<%= asset_pack_url('media/images/govuk-apple-touch-icon-152x152.png') %>">
15
15
  <link rel="apple-touch-icon" href="<%= asset_pack_url('media/images/govuk-apple-touch-icon.png') %>">
16
16
 
17
- <%= stylesheet_pack_tag 'govuk' %>
18
- <%= stylesheet_link_tag 'application', media: 'all' %>
17
+ <%= javascript_pack_tag 'runner_application', 'govuk', defer: true %>
18
+ <%= stylesheet_pack_tag 'govuk', 'runner_application', media: 'all' %>
19
19
 
20
20
  <% if allow_analytics? %>
21
21
  <%= render template: 'metadata_presenter/analytics/analytics' %>
@@ -30,15 +30,12 @@
30
30
  <%= render template: 'metadata_presenter/header/show' %>
31
31
  <div class="govuk-width-container govuk-body-m">
32
32
  <main class="govuk-main-wrapper govuk-main-wrapper--auto-spacing" id="main-content" role="main">
33
- <% if back_link.present? %>
34
- <a class="govuk-back-link" href="<%= back_link %>">Back</a>
35
- <% end %>
36
-
33
+ <% if back_link.present? %>
34
+ <a class="govuk-back-link" href="<%= back_link %>">Back</a>
35
+ <% end %>
37
36
  <%= yield %>
38
37
  </main>
39
38
  </div>
40
39
  <%= render template: 'metadata_presenter/footer/footer' %>
41
- <%= javascript_pack_tag 'runner_application' %>
42
- <%= javascript_pack_tag 'govuk' %>
43
40
  </body>
44
41
  </html>
@@ -3,14 +3,19 @@
3
3
  component.items,
4
4
  :id,
5
5
  :name,
6
+ selected: component.value,
6
7
  label: { text: input_title },
7
8
  hint: {
8
9
  data: { "fb-default-text" => default_text('hint') },
9
10
  text: component.hint
10
11
  },
11
- class: "govuk-!-width-two-thirds"
12
+ class: "govuk-!-width-two-thirds fb-autocomplete",
13
+ options: {
14
+ include_blank: true
15
+ }
12
16
  %>
13
17
 
14
18
  <% if editable? %>
15
19
  <%= render partial: '/partials/editable_autocomplete', locals: { component: component } %>
16
20
  <% end %>
21
+
@@ -7,6 +7,7 @@
7
7
  "name": "component-name",
8
8
  "legend": "Question",
9
9
  "validation": {
10
- "required": true
10
+ "required": true,
11
+ "autocomplete": true
11
12
  }
12
13
  }
@@ -0,0 +1,6 @@
1
+ {
2
+ "_id": "error.autocomplete",
3
+ "_type": "string.error",
4
+ "description": "Autocomplete item is not on the list",
5
+ "value": "Select an option from the list"
6
+ }
@@ -0,0 +1,7 @@
1
+ {
2
+ "4dc23b9c-9757-4526-813d-b43efbe07dad": [
3
+ { "text": "Afghanistan", "value": "AF"},
4
+ { "text": "Albania", "value": "AL"},
5
+ { "text": "Australia", "value": "AU"}
6
+ ]
7
+ }
@@ -595,7 +595,8 @@
595
595
  },
596
596
  "legend": "Countries",
597
597
  "validation": {
598
- "required": true
598
+ "required": true,
599
+ "autocomplete": true
599
600
  }
600
601
  }
601
602
  ],
@@ -1,3 +1,3 @@
1
1
  module MetadataPresenter
2
- VERSION = '2.17.11'.freeze
2
+ VERSION = '2.17.14'.freeze
3
3
  end
@@ -4,14 +4,12 @@
4
4
  "title": "Autocomplete",
5
5
  "description": "Let users select one option from an auto-completing list",
6
6
  "type": "object",
7
- "allOf": [
8
- {
9
- "$ref": "definition.select"
10
- }
11
- ],
12
7
  "properties": {
13
8
  "_type": {
14
9
  "const": "autocomplete"
10
+ },
11
+ "items": {
12
+ "$ref": "definition.select"
15
13
  }
16
14
  }
17
15
  }
@@ -2,15 +2,9 @@
2
2
  "$id": "http://gov.uk/schema/v1.0.0/definition/select",
3
3
  "_name": "definition.select",
4
4
  "title": "Select component definition",
5
- "properties": {
6
- "items": {
7
- "title": "Items",
8
- "description": "Items that users can select",
9
- "type": "array",
10
- "items": {
11
- "$ref": "definition.select_item"
12
- }
13
- }
5
+ "type": "array",
6
+ "items": {
7
+ "$ref": "definition.select_item"
14
8
  },
15
9
  "required": [
16
10
  "items"
@@ -17,12 +17,8 @@
17
17
  "type": "string"
18
18
  }
19
19
  },
20
- "allOf": [
21
- {
22
- "$ref": "definition.component"
23
- }
24
- ],
25
20
  "required": [
21
+ "text",
26
22
  "value"
27
23
  ],
28
24
  "category": [
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: 2.17.11
4
+ version: 2.17.14
5
5
  platform: ruby
6
6
  authors:
7
7
  - MoJ Forms
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-07-27 00:00:00.000000000 Z
11
+ date: 2022-08-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: govuk_design_system_formbuilder
@@ -299,6 +299,7 @@ files:
299
299
  - app/operators/metadata_presenter/operator.rb
300
300
  - app/presenters/metadata_presenter/page_answers_presenter.rb
301
301
  - app/validators/metadata_presenter/accept_validator.rb
302
+ - app/validators/metadata_presenter/autocomplete_validator.rb
302
303
  - app/validators/metadata_presenter/base_validator.rb
303
304
  - app/validators/metadata_presenter/date_after_validator.rb
304
305
  - app/validators/metadata_presenter/date_before_validator.rb
@@ -390,6 +391,7 @@ files:
390
391
  - default_metadata/page/start.json
391
392
  - default_metadata/service/base.json
392
393
  - default_metadata/string/error.accept.json
394
+ - default_metadata/string/error.autocomplete.json
393
395
  - default_metadata/string/error.date.json
394
396
  - default_metadata/string/error.date_after.json
395
397
  - default_metadata/string/error.date_before.json
@@ -435,6 +437,7 @@ files:
435
437
  - fixtures/branching_8.png
436
438
  - fixtures/branching_9.json
437
439
  - fixtures/branching_9.png
440
+ - fixtures/countries.json
438
441
  - fixtures/exit_only_service.json
439
442
  - fixtures/invalid_content_page.json
440
443
  - fixtures/no_component_page.json