metadata_presenter 0.21.0 → 0.25.0

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.
Files changed (31) hide show
  1. checksums.yaml +4 -4
  2. data/Rakefile +1 -1
  3. data/app/controllers/metadata_presenter/engine_controller.rb +1 -1
  4. data/app/helpers/metadata_presenter/application_helper.rb +2 -2
  5. data/app/models/metadata_presenter/component.rb +1 -1
  6. data/app/models/metadata_presenter/date_field.rb +2 -0
  7. data/app/models/metadata_presenter/item.rb +0 -4
  8. data/app/models/metadata_presenter/metadata.rb +3 -3
  9. data/app/models/metadata_presenter/page.rb +27 -1
  10. data/app/models/metadata_presenter/page_answers.rb +5 -7
  11. data/app/models/metadata_presenter/service.rb +1 -1
  12. data/app/presenters/metadata_presenter/page_answers_presenter.rb +7 -5
  13. data/app/validators/metadata_presenter/validate_answers.rb +4 -4
  14. data/app/validators/metadata_presenter/validate_schema.rb +6 -1
  15. data/app/views/metadata_presenter/attribute/_heading.html.erb +7 -0
  16. data/app/views/metadata_presenter/component/_components.html.erb +20 -0
  17. data/app/views/metadata_presenter/page/checkanswers.html.erb +14 -1
  18. data/app/views/metadata_presenter/page/confirmation.html.erb +3 -1
  19. data/app/views/metadata_presenter/page/content.html.erb +3 -1
  20. data/app/views/metadata_presenter/page/multiplequestions.html.erb +4 -3
  21. data/app/views/metadata_presenter/page/start.html.erb +2 -11
  22. data/config/initializers/page_components.rb +19 -0
  23. data/default_metadata/page/checkanswers.json +2 -1
  24. data/fixtures/invalid_content_page.json +72 -0
  25. data/fixtures/no_component_page.json +60 -0
  26. data/fixtures/version.json +7 -6
  27. data/lib/metadata_presenter/test_helpers.rb +1 -2
  28. data/lib/metadata_presenter/version.rb +1 -1
  29. data/schemas/page/checkanswers.json +8 -0
  30. data/schemas/service/base.json +20 -1
  31. metadata +58 -26
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: ca4bd2a3c36d8d5c7c21cf4105aacb4b5cdd5e347a976c7a83d21dc473b35a86
4
- data.tar.gz: eb4131ac71104e5c62772cf0a93176156eb946d7d968c1c1e36a92e9e2a5ad36
3
+ metadata.gz: a35099977b4c88777f6fef3c8102abcea16dfa668920b05dc2d3de208f7ddfbe
4
+ data.tar.gz: e3251c67520b40aa6735adde064679adf4261dfa8bcb5310f17ef79e70caf173
5
5
  SHA512:
6
- metadata.gz: '068e67ec41b9add6e7d9629656dc0a3d39ed32ec0b374ba01599a0b29ec275db7296ebfd120eecd428d13c403cf4edb25a7843f3beba362004e723c74f75dd79'
7
- data.tar.gz: 85c7e4caf55464ec1f95f85519f90aabd16c9324889daed683617736a5f54034645dc302248690ccdcd21ba908f4f930d06d421e70a1594e2fe48bb43658b68b
6
+ metadata.gz: 44c3c7661eec4c14f8071565e0919c93105a5489857bd506fda5b0b6c631a7d76d95598d65f11cedba70fd8386a910be52f5ef06e38f1cb15a79f1ea3b7421f3
7
+ data.tar.gz: 4fb6607dd2626128cf87d1fa1296166635de4d235c5bf30cc3ed0089e9ff8b7b215d1e095a6ce6047b794163ccd287f0ed74184ccf0a8a656d404c2cf4a00668
data/Rakefile CHANGED
@@ -21,7 +21,7 @@ end
21
21
 
22
22
  task default: :rspec
23
23
 
24
- APP_RAKEFILE = File.expand_path("spec/dummy/Rakefile", __dir__)
24
+ APP_RAKEFILE = File.expand_path('spec/dummy/Rakefile', __dir__)
25
25
  load 'rails/tasks/engine.rake'
26
26
  load 'rails/tasks/statistics.rake'
27
27
  Bundler::GemHelper.install_tasks
@@ -17,7 +17,7 @@ module MetadataPresenter
17
17
  private
18
18
 
19
19
  def not_found
20
- render template: 'errors/404', status: 404
20
+ render template: 'errors/404', status: :not_found
21
21
  end
22
22
 
23
23
  def redirect_to_page(url)
@@ -12,9 +12,9 @@ module MetadataPresenter
12
12
  # <%=m '# Some markdown' %>
13
13
  #
14
14
  def m(text)
15
- (Kramdown::Document.new(text).to_html).html_safe
15
+ Kramdown::Document.new(text).to_html.html_safe
16
16
  end
17
- alias to_markdown m
17
+ alias_method :to_markdown, :m
18
18
 
19
19
  def default_text(property)
20
20
  MetadataPresenter::DefaultText[property]
@@ -4,7 +4,7 @@ class MetadataPresenter::Component < MetadataPresenter::Metadata
4
4
  end
5
5
 
6
6
  def humanised_title
7
- self.label || self.legend
7
+ label || legend
8
8
  end
9
9
 
10
10
  def items
@@ -9,7 +9,9 @@ module MetadataPresenter
9
9
  end
10
10
 
11
11
  def present?
12
+ # rubocop:disable Rails/Present
12
13
  !blank?
14
+ # rubocop:enable Rails/Present
13
15
  end
14
16
 
15
17
  def blank?
@@ -1,8 +1,4 @@
1
1
  class MetadataPresenter::Item < MetadataPresenter::Metadata
2
- def id
3
- label
4
- end
5
-
6
2
  def name
7
3
  label
8
4
  end
@@ -9,8 +9,8 @@ class MetadataPresenter::Metadata
9
9
  @editor = editor
10
10
  end
11
11
 
12
- def to_json
13
- self.to_h.to_json
12
+ def to_json(*_args)
13
+ to_h.to_json
14
14
  end
15
15
 
16
16
  def id
@@ -21,7 +21,7 @@ class MetadataPresenter::Metadata
21
21
  metadata._type
22
22
  end
23
23
 
24
- def respond_to_missing?(method_name, include_private = false)
24
+ def respond_to_missing?(method_name, _include_private = false)
25
25
  metadata.respond_to?(method_name)
26
26
  end
27
27
 
@@ -1,4 +1,7 @@
1
1
  module MetadataPresenter
2
+ class PageComponentsNotDefinedError < StandardError
3
+ end
4
+
2
5
  class Page < MetadataPresenter::Metadata
3
6
  include ActiveModel::Validations
4
7
 
@@ -11,7 +14,7 @@ module MetadataPresenter
11
14
  end
12
15
 
13
16
  def editable_attributes
14
- self.to_h.reject { |k,_| k.in?([:_id, :_type, :steps]) }
17
+ to_h.reject { |k, _| k.in?(%i[_id _type steps]) }
15
18
  end
16
19
 
17
20
  def components
@@ -27,5 +30,28 @@ module MetadataPresenter
27
30
  def template
28
31
  "metadata_presenter/#{type.gsub('.', '/')}"
29
32
  end
33
+
34
+ def input_components
35
+ page_components(raw_type)[:input_components]
36
+ end
37
+
38
+ def content_components
39
+ page_components(raw_type)[:content_components]
40
+ end
41
+
42
+ private
43
+
44
+ def page_components(page_type)
45
+ values = Rails.application.config.page_components[page_type]
46
+ if values.blank?
47
+ raise PageComponentsNotDefinedError, "No page components defined for #{page_type} in config initialiser"
48
+ end
49
+
50
+ values
51
+ end
52
+
53
+ def raw_type
54
+ type.gsub('page.', '')
55
+ end
30
56
  end
31
57
  end
@@ -12,16 +12,14 @@ module MetadataPresenter
12
12
  ValidateAnswers.new(self, components: components).valid?
13
13
  end
14
14
 
15
- def components
16
- page.components
17
- end
15
+ delegate :components, to: :page
18
16
 
19
- def respond_to_missing?(method_name, include_private = false)
17
+ def respond_to_missing?(method_name, _include_private = false)
20
18
  method_name.to_s.in?(components.map(&:id))
21
19
  end
22
20
 
23
- def method_missing(method_name, *args, &block)
24
- component = components.find { |component| component.id == method_name.to_s }
21
+ def method_missing(method_name, *_args)
22
+ component = components.find { |c| c.id == method_name.to_s }
25
23
 
26
24
  if component && component.type == 'date'
27
25
  date_answer(component.id)
@@ -42,7 +40,7 @@ module MetadataPresenter
42
40
  GOVUKDesignSystemFormBuilder::Elements::Date::SEGMENTS[:month],
43
41
  GOVUKDesignSystemFormBuilder::Elements::Date::SEGMENTS[:year]
44
42
  ].map do |segment|
45
- answers["#{component_id.to_s}(#{segment})"]
43
+ answers["#{component_id}(#{segment})"]
46
44
  end
47
45
  end
48
46
 
@@ -1,6 +1,6 @@
1
1
  class MetadataPresenter::Service < MetadataPresenter::Metadata
2
2
  def pages
3
- @_pages ||= metadata.pages.map do |page|
3
+ @pages ||= metadata.pages.map do |page|
4
4
  MetadataPresenter::Page.new(page, editor: editor?)
5
5
  end
6
6
  end
@@ -1,10 +1,10 @@
1
1
  module MetadataPresenter
2
2
  class PageAnswersPresenter
3
- FIRST_ANSWER = 0.freeze
4
- NO_USER_INPUT = %w(page.checkanswers page.confirmation page.content).freeze
3
+ FIRST_ANSWER = 0
4
+ NO_USER_INPUT = %w[page.checkanswers page.confirmation page.content].freeze
5
5
 
6
6
  def self.map(view:, pages:, answers:)
7
- user_input_pages(pages).map do |page|
7
+ user_input_pages(pages).map { |page|
8
8
  Array(page.components).map do |component|
9
9
  new(
10
10
  view: view,
@@ -13,7 +13,7 @@ module MetadataPresenter
13
13
  answers: answers
14
14
  )
15
15
  end
16
- end.reject { |page| page.empty? }
16
+ }.reject(&:empty?)
17
17
  end
18
18
 
19
19
  def self.user_input_pages(pages)
@@ -21,6 +21,7 @@ module MetadataPresenter
21
21
  end
22
22
 
23
23
  attr_reader :view, :component, :page, :answers
24
+
24
25
  delegate :url, to: :page
25
26
  delegate :humanised_title, to: :component
26
27
 
@@ -37,6 +38,7 @@ module MetadataPresenter
37
38
  value = @page_answers.send(component.id)
38
39
 
39
40
  return '' if value.blank?
41
+
40
42
  if self.class.private_method_defined?(component.type.to_sym)
41
43
  send(component.type.to_sym, value)
42
44
  else
@@ -62,7 +64,7 @@ module MetadataPresenter
62
64
  end
63
65
 
64
66
  def checkboxes(value)
65
- value.join("<br>").html_safe
67
+ value.join('<br>').html_safe
66
68
  end
67
69
  end
68
70
  end
@@ -8,7 +8,7 @@ module MetadataPresenter
8
8
  end
9
9
 
10
10
  def valid?
11
- validators.map { |validator| validator.valid? }.all?
11
+ validators.map(&:valid?).all?
12
12
  end
13
13
 
14
14
  def invalid?
@@ -18,20 +18,20 @@ module MetadataPresenter
18
18
  private
19
19
 
20
20
  def validators
21
- components.map do |component|
21
+ components.map { |component|
22
22
  component_validations(component).map do |key|
23
23
  "MetadataPresenter::#{key.classify}Validator".constantize.new(
24
24
  page_answers: page_answers,
25
25
  component: component
26
26
  )
27
27
  end
28
- end.compact.flatten
28
+ }.compact.flatten
29
29
  end
30
30
 
31
31
  def component_validations(component)
32
32
  return [] if component.validation.blank?
33
33
 
34
- component.validation.select { |_,value| value.present? }.keys
34
+ component.validation.select { |_, value| value.present? }.keys
35
35
  end
36
36
  end
37
37
  end
@@ -7,6 +7,11 @@ class MetadataPresenter::ValidateSchema
7
7
  return unless controller.request.post?
8
8
 
9
9
  validate(controller.request.params, 'request.service')
10
+
11
+ metadata = controller.request.params['metadata']
12
+ Array(metadata['pages']).each do |page|
13
+ validate(page, page['_type'])
14
+ end
10
15
  rescue JSON::Schema::ValidationError, JSON::Schema::SchemaError, SchemaNotFoundError => e
11
16
  controller.render(
12
17
  json: ErrorsSerializer.new(message: e.message).attributes,
@@ -32,7 +37,7 @@ class MetadataPresenter::ValidateSchema
32
37
  JSON::Validator.add_schema(jschema)
33
38
  JSON::Validator.schema_for_uri(schema_name).schema
34
39
  rescue Errno::ENOENT
35
- raise SchemaNotFoundError.new("Schema not found => #{schema_name}")
40
+ raise SchemaNotFoundError, "Schema not found => #{schema_name}"
36
41
  end
37
42
  end
38
43
  end
@@ -0,0 +1,7 @@
1
+ <% if @page.heading %>
2
+ <h1 class="fb-editable govuk-heading-xl"
3
+ data-fb-content-id="page[heading]"
4
+ data-fb-content-type="element">
5
+ <%= @page.heading %>
6
+ </h1>
7
+ <%- end %>
@@ -18,3 +18,23 @@
18
18
  %>
19
19
  </div>
20
20
  <% end %>
21
+
22
+ <% if editable? %>
23
+ <ul class="component-activated-menu govuk-navigation editor-button govuk-button fb-govuk-button">
24
+ <% if input_components.present? %>
25
+ <ul>
26
+ <% input_components.each do |component| %>
27
+ <li><a href="#add-input-component" data-component-type="<%= component %>"></a>+ Add <%= component %> component</li>
28
+ <% end %>
29
+ </ul>
30
+ <% end %>
31
+
32
+ <% if content_components.present? %>
33
+ <ul>
34
+ <% content_components.each do |component| %>
35
+ <li><a href="#add-content-component" data-component-type="<%= component %>">+ Add <%= component %> component</a></li>
36
+ <% end %>
37
+ </ul>
38
+ <% end %>
39
+ </ul>
40
+ <% end %>
@@ -12,6 +12,17 @@
12
12
  <% end %>
13
13
 
14
14
  <%= form_for @page, url: reserved_submissions_path do |f| %>
15
+
16
+ <%= render partial: 'metadata_presenter/component/components',
17
+ locals: {
18
+ f: f,
19
+ components: @page.extra_components,
20
+ tag: nil,
21
+ classes: nil,
22
+ input_components: @page.input_components,
23
+ content_components: @page.content_components
24
+ } %>
25
+
15
26
  <div data-block-id="page.checkanswers.answers" data-block-type="answers">
16
27
  <dl class="fb-block fb-block-answers govuk-summary-list">
17
28
  <% pages_presenters.each do |page_answers_presenters| %>
@@ -69,7 +80,9 @@
69
80
  f: f,
70
81
  components: @page.components,
71
82
  tag: nil,
72
- classes: nil
83
+ classes: nil,
84
+ input_components: @page.input_components,
85
+ content_components: @page.content_components
73
86
  } %>
74
87
 
75
88
  <button <%= 'disabled' if editable? %> data-prevent-double-click="true" class="fb-block fb-block-actions govuk-button" data-module="govuk-button" data-block-id="actions" data-block-type="actions">
@@ -19,5 +19,7 @@
19
19
  f: nil,
20
20
  components: @page.components,
21
21
  tag: nil,
22
- classes: nil
22
+ classes: nil,
23
+ input_components: @page.input_components,
24
+ content_components: @page.content_components
23
25
  } %>
@@ -23,7 +23,9 @@
23
23
  f: f,
24
24
  components: @page.components,
25
25
  tag: nil,
26
- classes: nil
26
+ classes: nil,
27
+ input_components: @page.input_components,
28
+ content_components: @page.content_components
27
29
  } %>
28
30
 
29
31
  <%= f.govuk_submit(disabled: editable?) %>
@@ -3,8 +3,7 @@
3
3
  <div class="govuk-grid-column-two-thirds">
4
4
 
5
5
  <%= render 'metadata_presenter/attribute/section_heading' %>
6
-
7
- <h1 class="govuk-heading-xl"><%= @page.heading %></h1>
6
+ <%= render 'metadata_presenter/attribute/heading' %>
8
7
 
9
8
  <%= form_for @page_answers, as: :answers, url: @page.url, method: :post do |f| %>
10
9
  <%= f.govuk_error_summary %>
@@ -13,7 +12,9 @@
13
12
  f: f,
14
13
  components: @page.components,
15
14
  tag: :h2,
16
- classes: 'govuk-heading-m govuk-!-margin-top-8'
15
+ classes: 'govuk-heading-m govuk-!-margin-top-8',
16
+ input_components: @page.input_components,
17
+ content_components: @page.content_components
17
18
  }
18
19
  %>
19
20
 
@@ -2,18 +2,9 @@
2
2
  <div class="govuk-grid-row">
3
3
  <div class="govuk-grid-column-two-thirds">
4
4
 
5
- <%= render 'metadata_presenter/attribute/section_heading' %>
6
-
7
- <% if @page.heading %>
8
- <h1 class="fb-editable govuk-heading-xl"
9
- data-fb-content-id="page[heading]"
10
- data-fb-content-type="element">
11
- <%= @page.heading %>
12
- </h1>
13
- <% end %>
14
-
5
+ <%= render 'metadata_presenter/attribute/section_heading' %>
6
+ <%= render 'metadata_presenter/attribute/heading' %>
15
7
  <%= render 'metadata_presenter/attribute/lede' %>
16
-
17
8
  <%= render 'metadata_presenter/attribute/body' %>
18
9
 
19
10
  <%= form_tag(root_path, method: :post) do %>
@@ -0,0 +1,19 @@
1
+ Rails.application.config.page_components =
2
+ ActiveSupport::HashWithIndifferentAccess.new({
3
+ checkanswers: {
4
+ input_components: %w(),
5
+ content_components: %w(content)
6
+ },
7
+ confirmation: {
8
+ input_components: %w(),
9
+ content_components: %w(content)
10
+ },
11
+ content: {
12
+ input_components: %w(),
13
+ content_components: %w(content)
14
+ },
15
+ multiplequestions: {
16
+ input_components: %w(text textarea number date radios checkboxes),
17
+ content_components: %w(content)
18
+ }
19
+ })
@@ -4,5 +4,6 @@
4
4
  "heading": "Check your answers",
5
5
  "send_heading": "Now send your application",
6
6
  "send_body": "By submitting this application you confirm that, to the best of your knowledge, the details you are providing are correct.",
7
- "components": []
7
+ "components": [],
8
+ "extra_components": []
8
9
  }
@@ -0,0 +1,72 @@
1
+ {
2
+ "_id": "service.base",
3
+ "_type": "service.base",
4
+ "service_name": "Service name",
5
+ "created_by": "4634ec01-5618-45ec-a4e2-bb5aa587e751",
6
+ "configuration": {
7
+ "service": {
8
+ "_id": "config.service",
9
+ "_type": "config.service"
10
+ },
11
+ "meta": {
12
+ "_id": "config.meta",
13
+ "_type": "config.meta",
14
+ "items": [
15
+ {
16
+ "_id": "config.meta--link",
17
+ "_type": "link",
18
+ "href": "/cookies",
19
+ "text": "Cookies"
20
+ },
21
+ {
22
+ "_id": "config.meta--link--2",
23
+ "_type": "link",
24
+ "href": "/privacy",
25
+ "text": "Privacy"
26
+ },
27
+ {
28
+ "_id": "config.meta--link--3",
29
+ "_type": "link",
30
+ "href": "/accessibility",
31
+ "text": "Accessibility"
32
+ }
33
+ ]
34
+ }
35
+ },
36
+ "pages": [
37
+ {
38
+ "_uuid": "9626b2e9-5ef0-4070-8331-ac55151b22c4",
39
+ "_id": "page.start",
40
+ "_type": "page.start",
41
+ "heading": "Service name goes here",
42
+ "lede": "Use this service to:",
43
+ "body": "Use this service to:\r\n\r\n* do something\r\n* update your name, address or other details\r\n* do something else\r\n\r\nRegistering takes around 5 minutes.",
44
+ "before_you_start": "###Before you start\r\nYou can also register by post.\r\n\r\nThe online service is also available in Welsh (Cymraeg).\r\n\r\nYou cannot register for this service if you’re in the UK illegally.",
45
+ "steps": [],
46
+ "url": "/"
47
+ },
48
+ {
49
+ "_uuid": "1ed3e4ad-5098-41c9-b4b6-426e89f7804e",
50
+ "_id": "page.how-many-lights",
51
+ "_type": "page.content",
52
+ "section_heading": "Chain of Command",
53
+ "heading": "Tell me how many lights you see",
54
+ "body": "There are four lights!",
55
+ "components": [
56
+ {
57
+ "_id": "name_text_1",
58
+ "_type": "text",
59
+ "label": "Full name",
60
+ "name": "name_text_1",
61
+ "validation": {
62
+ "required": true,
63
+ "max_length": 10,
64
+ "min_length": 2
65
+ }
66
+ }
67
+ ],
68
+ "url": "how-many-lights"
69
+ }
70
+ ],
71
+ "locale": "en"
72
+ }
@@ -0,0 +1,60 @@
1
+ {
2
+ "_id": "service.base",
3
+ "_type": "service.base",
4
+ "service_name": "Service name",
5
+ "created_by": "4634ec01-5618-45ec-a4e2-bb5aa587e751",
6
+ "configuration": {
7
+ "service": {
8
+ "_id": "config.service",
9
+ "_type": "config.service"
10
+ },
11
+ "meta": {
12
+ "_id": "config.meta",
13
+ "_type": "config.meta",
14
+ "items": [
15
+ {
16
+ "_id": "config.meta--link",
17
+ "_type": "link",
18
+ "href": "/cookies",
19
+ "text": "Cookies"
20
+ },
21
+ {
22
+ "_id": "config.meta--link--2",
23
+ "_type": "link",
24
+ "href": "/privacy",
25
+ "text": "Privacy"
26
+ },
27
+ {
28
+ "_id": "config.meta--link--3",
29
+ "_type": "link",
30
+ "href": "/accessibility",
31
+ "text": "Accessibility"
32
+ }
33
+ ]
34
+ }
35
+ },
36
+ "pages": [
37
+ {
38
+ "_uuid": "9626b2e9-5ef0-4070-8331-ac55151b22c4",
39
+ "_id": "page.start",
40
+ "_type": "page.start",
41
+ "heading": "Service name goes here",
42
+ "lede": "Use this service to:",
43
+ "body": "Use this service to:\r\n\r\n* do something\r\n* update your name, address or other details\r\n* do something else\r\n\r\nRegistering takes around 5 minutes.",
44
+ "before_you_start": "###Before you start\r\nYou can also register by post.\r\n\r\nThe online service is also available in Welsh (Cymraeg).\r\n\r\nYou cannot register for this service if you’re in the UK illegally.",
45
+ "steps": [],
46
+ "url": "/"
47
+ },
48
+ {
49
+ "_uuid": "b238a22f-c180-48d0-a7d9-8aad2036f1f2",
50
+ "_id": "page._confirmation",
51
+ "_type": "page.confirmation",
52
+ "body": "You'll receive a confirmation email",
53
+ "heading": "Complaint sent",
54
+ "lede": "Optional lede",
55
+ "url": "/confirmation",
56
+ "components": []
57
+ }
58
+ ],
59
+ "locale": "en"
60
+ }
@@ -178,14 +178,14 @@
178
178
  "legend": "Do you like Star Wars?",
179
179
  "items": [
180
180
  {
181
- "_id": "do-you-like-star-wars_radio_1",
181
+ "_id": "do-you-like-star-wars_radios_1_item_1",
182
182
  "_type": "radio",
183
183
  "label": "Only on weekends",
184
184
  "hint": "Optional item hint",
185
185
  "value": "only-on-weekends"
186
186
  },
187
187
  {
188
- "_id": "do-you-like-star-wars_radio_2",
188
+ "_id": "do-you-like-star-wars_radios_1_item_2",
189
189
  "_type": "radio",
190
190
  "label": "Hell no!",
191
191
  "hint": "Optional item hint",
@@ -236,21 +236,21 @@
236
236
  "legend": "What would you like on your burger?",
237
237
  "items": [
238
238
  {
239
- "_id": "burgers_checkbox_1",
239
+ "_id": "burgers_checkboxes_1_item_1",
240
240
  "_type": "checkbox",
241
241
  "label": "Beef, cheese, tomato",
242
242
  "hint": "Optional item hint",
243
243
  "value": "beef-cheese-tomato"
244
244
  },
245
245
  {
246
- "_id": "burgers_checkbox_2",
246
+ "_id": "burgers_checkboxes_1_item_2",
247
247
  "_type": "checkbox",
248
248
  "label": "Chicken, cheese, tomato",
249
249
  "hint": "Optional item hint",
250
250
  "value": "chicken-cheese-tomato"
251
251
  },
252
252
  {
253
- "_id": "burgers_checkbox_3",
253
+ "_id": "burgers_checkboxes_1_item_3",
254
254
  "_type": "checkbox",
255
255
  "label": "Mozzarella, cheddar, feta",
256
256
  "hint": "Optional item hint",
@@ -350,7 +350,8 @@
350
350
  "_type": "content",
351
351
  "html": "Check yourself before you wreck yourself."
352
352
  }
353
- ]
353
+ ],
354
+ "extra_components": []
354
355
  },
355
356
  {
356
357
  "_uuid": "b238a22f-c180-48d0-a7d9-8aad2036f1f2",
@@ -5,13 +5,12 @@ module MetadataPresenter
5
5
  end
6
6
 
7
7
  def fixtures_directory
8
- @_fixtures_directory ||=
8
+ @fixtures_directory ||=
9
9
  Pathname.new(MetadataPresenter::Engine.root.join('fixtures'))
10
10
  end
11
11
 
12
12
  def service_metadata
13
13
  metadata_fixture(:version)
14
- JSON.parse(File.read(fixtures_directory.join('version.json')))
15
14
  end
16
15
 
17
16
  def metadata_fixture(fixture_name)
@@ -1,3 +1,3 @@
1
1
  module MetadataPresenter
2
- VERSION = '0.21.0'
2
+ VERSION = '0.25.0'.freeze
3
3
  end
@@ -43,6 +43,14 @@
43
43
  "items": {
44
44
  "$ref": "component.content"
45
45
  }
46
+ },
47
+ "extra_components": {
48
+ "title": "Extra Components",
49
+ "description": "More form or content elements used on the page",
50
+ "type": "array",
51
+ "items": {
52
+ "$ref": "component.content"
53
+ }
46
54
  }
47
55
  },
48
56
  "required": [
@@ -35,7 +35,26 @@
35
35
  "pages": {
36
36
  "type": "array",
37
37
  "items": {
38
- "$ref": "definition.page"
38
+ "anyOf": [
39
+ {
40
+ "$ref": "page.start"
41
+ },
42
+ {
43
+ "$ref": "page.checkanswers"
44
+ },
45
+ {
46
+ "$ref": "page.confirmation"
47
+ },
48
+ {
49
+ "$ref": "page.content"
50
+ },
51
+ {
52
+ "$ref": "page.multiplequestions"
53
+ },
54
+ {
55
+ "$ref": "page.singlequestion"
56
+ }
57
+ ]
39
58
  }
40
59
  }
41
60
  },
metadata CHANGED
@@ -1,35 +1,43 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: metadata_presenter
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.21.0
4
+ version: 0.25.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - MoJ Online
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-03-29 00:00:00.000000000 Z
11
+ date: 2021-03-31 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: rails
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: 6.0.3.4
20
- - - "<"
21
- - !ruby/object:Gem::Version
22
- version: 6.2.0
19
+ version: 2.1.5
23
20
  type: :runtime
24
21
  prerelease: false
25
22
  version_requirements: !ruby/object:Gem::Requirement
26
23
  requirements:
27
24
  - - ">="
28
25
  - !ruby/object:Gem::Version
29
- version: 6.0.3.4
30
- - - "<"
26
+ version: 2.1.5
27
+ - !ruby/object:Gem::Dependency
28
+ name: json-schema
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
31
32
  - !ruby/object:Gem::Version
32
- version: 6.2.0
33
+ version: 2.8.1
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: 2.8.1
33
41
  - !ruby/object:Gem::Dependency
34
42
  name: kramdown
35
43
  requirement: !ruby/object:Gem::Requirement
@@ -45,35 +53,41 @@ dependencies:
45
53
  - !ruby/object:Gem::Version
46
54
  version: 2.3.0
47
55
  - !ruby/object:Gem::Dependency
48
- name: govuk_design_system_formbuilder
56
+ name: rails
49
57
  requirement: !ruby/object:Gem::Requirement
50
58
  requirements:
51
59
  - - ">="
52
60
  - !ruby/object:Gem::Version
53
- version: 2.1.5
61
+ version: 6.0.3.4
62
+ - - "<"
63
+ - !ruby/object:Gem::Version
64
+ version: 6.2.0
54
65
  type: :runtime
55
66
  prerelease: false
56
67
  version_requirements: !ruby/object:Gem::Requirement
57
68
  requirements:
58
69
  - - ">="
59
70
  - !ruby/object:Gem::Version
60
- version: 2.1.5
71
+ version: 6.0.3.4
72
+ - - "<"
73
+ - !ruby/object:Gem::Version
74
+ version: 6.2.0
61
75
  - !ruby/object:Gem::Dependency
62
- name: json-schema
76
+ name: better_errors
63
77
  requirement: !ruby/object:Gem::Requirement
64
78
  requirements:
65
79
  - - ">="
66
80
  - !ruby/object:Gem::Version
67
- version: 2.8.1
68
- type: :runtime
81
+ version: '0'
82
+ type: :development
69
83
  prerelease: false
70
84
  version_requirements: !ruby/object:Gem::Requirement
71
85
  requirements:
72
86
  - - ">="
73
87
  - !ruby/object:Gem::Version
74
- version: 2.8.1
88
+ version: '0'
75
89
  - !ruby/object:Gem::Dependency
76
- name: sqlite3
90
+ name: binding_of_caller
77
91
  requirement: !ruby/object:Gem::Requirement
78
92
  requirements:
79
93
  - - ">="
@@ -87,7 +101,7 @@ dependencies:
87
101
  - !ruby/object:Gem::Version
88
102
  version: '0'
89
103
  - !ruby/object:Gem::Dependency
90
- name: byebug
104
+ name: brakeman
91
105
  requirement: !ruby/object:Gem::Requirement
92
106
  requirements:
93
107
  - - ">="
@@ -101,7 +115,7 @@ dependencies:
101
115
  - !ruby/object:Gem::Version
102
116
  version: '0'
103
117
  - !ruby/object:Gem::Dependency
104
- name: rspec-rails
118
+ name: byebug
105
119
  requirement: !ruby/object:Gem::Requirement
106
120
  requirements:
107
121
  - - ">="
@@ -115,7 +129,7 @@ dependencies:
115
129
  - !ruby/object:Gem::Version
116
130
  version: '0'
117
131
  - !ruby/object:Gem::Dependency
118
- name: better_errors
132
+ name: rspec-rails
119
133
  requirement: !ruby/object:Gem::Requirement
120
134
  requirements:
121
135
  - - ">="
@@ -129,7 +143,21 @@ dependencies:
129
143
  - !ruby/object:Gem::Version
130
144
  version: '0'
131
145
  - !ruby/object:Gem::Dependency
132
- name: binding_of_caller
146
+ name: rubocop
147
+ requirement: !ruby/object:Gem::Requirement
148
+ requirements:
149
+ - - "~>"
150
+ - !ruby/object:Gem::Version
151
+ version: 1.10.0
152
+ type: :development
153
+ prerelease: false
154
+ version_requirements: !ruby/object:Gem::Requirement
155
+ requirements:
156
+ - - "~>"
157
+ - !ruby/object:Gem::Version
158
+ version: 1.10.0
159
+ - !ruby/object:Gem::Dependency
160
+ name: rubocop-govuk
133
161
  requirement: !ruby/object:Gem::Requirement
134
162
  requirements:
135
163
  - - ">="
@@ -157,7 +185,7 @@ dependencies:
157
185
  - !ruby/object:Gem::Version
158
186
  version: '0'
159
187
  - !ruby/object:Gem::Dependency
160
- name: site_prism
188
+ name: simplecov-console
161
189
  requirement: !ruby/object:Gem::Requirement
162
190
  requirements:
163
191
  - - ">="
@@ -171,7 +199,7 @@ dependencies:
171
199
  - !ruby/object:Gem::Version
172
200
  version: '0'
173
201
  - !ruby/object:Gem::Dependency
174
- name: simplecov-console
202
+ name: site_prism
175
203
  requirement: !ruby/object:Gem::Requirement
176
204
  requirements:
177
205
  - - ">="
@@ -185,7 +213,7 @@ dependencies:
185
213
  - !ruby/object:Gem::Version
186
214
  version: '0'
187
215
  - !ruby/object:Gem::Dependency
188
- name: yard
216
+ name: sqlite3
189
217
  requirement: !ruby/object:Gem::Requirement
190
218
  requirements:
191
219
  - - ">="
@@ -199,7 +227,7 @@ dependencies:
199
227
  - !ruby/object:Gem::Version
200
228
  version: '0'
201
229
  - !ruby/object:Gem::Dependency
202
- name: brakeman
230
+ name: yard
203
231
  requirement: !ruby/object:Gem::Requirement
204
232
  requirements:
205
233
  - - ">="
@@ -253,6 +281,7 @@ files:
253
281
  - app/views/errors/404.html
254
282
  - app/views/layouts/metadata_presenter/application.html.erb
255
283
  - app/views/metadata_presenter/attribute/_body.html.erb
284
+ - app/views/metadata_presenter/attribute/_heading.html.erb
256
285
  - app/views/metadata_presenter/attribute/_lede.html.erb
257
286
  - app/views/metadata_presenter/attribute/_section_heading.html.erb
258
287
  - app/views/metadata_presenter/component/_checkboxes.html.erb
@@ -274,6 +303,7 @@ files:
274
303
  - app/views/metadata_presenter/page/start.html.erb
275
304
  - config/initializers/default_metadata.rb
276
305
  - config/initializers/default_text.rb
306
+ - config/initializers/page_components.rb
277
307
  - config/initializers/schemas.rb
278
308
  - config/routes.rb
279
309
  - default_metadata/component/checkboxes.json
@@ -300,6 +330,8 @@ files:
300
330
  - default_metadata/string/error.number.json
301
331
  - default_metadata/string/error.required.json
302
332
  - default_text/content.json
333
+ - fixtures/invalid_content_page.json
334
+ - fixtures/no_component_page.json
303
335
  - fixtures/non_finished_service.json
304
336
  - fixtures/service.json
305
337
  - fixtures/version.json