metadata_presenter 0.19.2 → 0.23.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 (35) 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 +4 -10
  5. data/app/models/metadata_presenter/component.rb +5 -1
  6. data/app/models/metadata_presenter/date_field.rb +2 -0
  7. data/app/models/metadata_presenter/metadata.rb +3 -3
  8. data/app/models/metadata_presenter/page.rb +1 -1
  9. data/app/models/metadata_presenter/page_answers.rb +5 -7
  10. data/app/models/metadata_presenter/service.rb +1 -1
  11. data/app/presenters/metadata_presenter/page_answers_presenter.rb +11 -4
  12. data/app/validators/metadata_presenter/validate_answers.rb +4 -4
  13. data/app/validators/metadata_presenter/validate_schema.rb +6 -1
  14. data/app/views/metadata_presenter/attribute/_heading.html.erb +7 -0
  15. data/app/views/metadata_presenter/component/_components.html.erb +20 -0
  16. data/app/views/metadata_presenter/page/checkanswers.html.erb +8 -4
  17. data/app/views/metadata_presenter/page/confirmation.html.erb +8 -0
  18. data/app/views/metadata_presenter/page/content.html.erb +7 -13
  19. data/app/views/metadata_presenter/page/multiplequestions.html.erb +8 -13
  20. data/app/views/metadata_presenter/page/start.html.erb +2 -11
  21. data/default_metadata/component/checkboxes.json +4 -1
  22. data/default_metadata/component/date.json +1 -0
  23. data/default_metadata/component/number.json +1 -0
  24. data/default_metadata/component/radios.json +4 -1
  25. data/default_metadata/page/confirmation.json +2 -1
  26. data/fixtures/invalid_content_page.json +72 -0
  27. data/fixtures/no_component_page.json +60 -0
  28. data/fixtures/version.json +23 -5
  29. data/lib/metadata_presenter/test_helpers.rb +1 -2
  30. data/lib/metadata_presenter/version.rb +1 -1
  31. data/schemas/page/checkanswers.json +8 -10
  32. data/schemas/page/confirmation.json +8 -0
  33. data/schemas/page/content.json +8 -0
  34. data/schemas/service/base.json +20 -1
  35. metadata +58 -26
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 7fdc2ca570d7337ef8bfba8df57ab38d444b7e453a07ab3392d8f2830f4f1e7e
4
- data.tar.gz: 53df5ed65e3a1d6641d6ffe7ce94c8a8ee74eb2e6dd81d585a471687d3d1410c
3
+ metadata.gz: d1b2ff20300f6b643a7c83f8885c640b375babed55cd30798ca079bbd67b0506
4
+ data.tar.gz: ba841ff80433e9ff917a2d006eca7a53f618193640815e7594415a8945003c57
5
5
  SHA512:
6
- metadata.gz: e9145e44db62185b092f1332d0aa402ab2b744326601995b3ae5b147ffe8ab1cf75258b48b62baea3362ee7f4308ef1047329ae1ffc87aab76fd0a87c95c1628
7
- data.tar.gz: f8129072990d12422e89d8a4b6fcdc078dfc326ff25d2078e1100e15ca5f2c8b9a2e86ff6e31cedfbf7b66fe0d9dd03518c12062aa5fe13274f8e8cf4ecf8e3a
6
+ metadata.gz: 1298d445703206b693fb9153255362433a4476bca5e982aac89a847c8a902013d066e729bdf645ba48fd0b5f4a780b972a94a14740b3db8ba55879439e6fd33f
7
+ data.tar.gz: 12439df97cda7c675df1f53ebb4151ebdfc64509c64ce08b466c9f16ed67b2f02fb06e9777458c5da37bfc27c54ad5f4368372f07c56292a624d2d36f24196ef
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)
@@ -1,14 +1,8 @@
1
1
  module MetadataPresenter
2
2
  module ApplicationHelper
3
3
  def main_title(component:, tag: :h1, classes: 'govuk-heading-xl')
4
- if component.legend.present?
5
- content_tag(:h1, class: 'govuk-heading-xl') do
6
- component.legend
7
- end
8
- else
9
- content_tag(tag, class: classes) do
10
- component.label
11
- end
4
+ content_tag(tag, class: classes) do
5
+ component.humanised_title
12
6
  end
13
7
  end
14
8
 
@@ -18,9 +12,9 @@ module MetadataPresenter
18
12
  # <%=m '# Some markdown' %>
19
13
  #
20
14
  def m(text)
21
- (Kramdown::Document.new(text).to_html).html_safe
15
+ Kramdown::Document.new(text).to_html.html_safe
22
16
  end
23
- alias to_markdown m
17
+ alias_method :to_markdown, :m
24
18
 
25
19
  def default_text(property)
26
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
@@ -12,4 +12,8 @@ class MetadataPresenter::Component < MetadataPresenter::Metadata
12
12
  MetadataPresenter::Item.new(item, editor: editor?)
13
13
  end
14
14
  end
15
+
16
+ def content?
17
+ type == 'content'
18
+ end
15
19
  end
@@ -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?
@@ -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
 
@@ -11,7 +11,7 @@ module MetadataPresenter
11
11
  end
12
12
 
13
13
  def editable_attributes
14
- self.to_h.reject { |k,_| k.in?([:_id, :_type, :steps]) }
14
+ to_h.reject { |k, _| k.in?(%i[_id _type steps]) }
15
15
  end
16
16
 
17
17
  def components
@@ -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,9 +1,10 @@
1
1
  module MetadataPresenter
2
2
  class PageAnswersPresenter
3
- FIRST_ANSWER = 0.freeze
3
+ FIRST_ANSWER = 0
4
+ NO_USER_INPUT = %w[page.checkanswers page.confirmation page.content].freeze
4
5
 
5
6
  def self.map(view:, pages:, answers:)
6
- pages.map do |page|
7
+ user_input_pages(pages).map { |page|
7
8
  Array(page.components).map do |component|
8
9
  new(
9
10
  view: view,
@@ -12,10 +13,15 @@ module MetadataPresenter
12
13
  answers: answers
13
14
  )
14
15
  end
15
- end.reject { |page| page.empty? }
16
+ }.reject(&:empty?)
17
+ end
18
+
19
+ def self.user_input_pages(pages)
20
+ pages.reject { |page| page.type.in?(NO_USER_INPUT) }
16
21
  end
17
22
 
18
23
  attr_reader :view, :component, :page, :answers
24
+
19
25
  delegate :url, to: :page
20
26
  delegate :humanised_title, to: :component
21
27
 
@@ -32,6 +38,7 @@ module MetadataPresenter
32
38
  value = @page_answers.send(component.id)
33
39
 
34
40
  return '' if value.blank?
41
+
35
42
  if self.class.private_method_defined?(component.type.to_sym)
36
43
  send(component.type.to_sym, value)
37
44
  else
@@ -57,7 +64,7 @@ module MetadataPresenter
57
64
  end
58
65
 
59
66
  def checkboxes(value)
60
- value.join("<br>").html_safe
67
+ value.join('<br>').html_safe
61
68
  end
62
69
  end
63
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 %>
@@ -0,0 +1,20 @@
1
+ <% @page.components.each_with_index do |component, index| %>
2
+ <div class="fb-editable"
3
+ id="<%= component.id %>"
4
+ data-fb-content-type="<%= component.type %>"
5
+ data-fb-content-id="<%= "page[components[#{index}]]" %>"
6
+ data-fb-content-data="<%= component.to_json %>">
7
+
8
+ <%= render partial: component, locals: {
9
+ f: f,
10
+ component: component,
11
+ component_id: "page[components[#{index}]]",
12
+ input_title: main_title(
13
+ component: component,
14
+ tag: :h2,
15
+ classes: classes
16
+ )
17
+ }
18
+ %>
19
+ </div>
20
+ <% end %>
@@ -11,10 +11,6 @@
11
11
  </h1>
12
12
  <% end %>
13
13
 
14
- <%= render 'metadata_presenter/attribute/lede' %>
15
-
16
- <%= render 'metadata_presenter/attribute/body' %>
17
-
18
14
  <%= form_for @page, url: reserved_submissions_path do |f| %>
19
15
  <div data-block-id="page.checkanswers.answers" data-block-type="answers">
20
16
  <dl class="fb-block fb-block-answers govuk-summary-list">
@@ -68,6 +64,14 @@
68
64
  </div>
69
65
  <% end %>
70
66
 
67
+ <%= render partial: 'metadata_presenter/component/components',
68
+ locals: {
69
+ f: f,
70
+ components: @page.components,
71
+ tag: nil,
72
+ classes: nil
73
+ } %>
74
+
71
75
  <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">
72
76
  Accept and send application
73
77
  </button>
@@ -13,3 +13,11 @@
13
13
  <%= render 'metadata_presenter/attribute/body' %>
14
14
  </div>
15
15
  </div>
16
+
17
+ <%= render partial: 'metadata_presenter/component/components',
18
+ locals: {
19
+ f: nil,
20
+ components: @page.components,
21
+ tag: nil,
22
+ classes: nil
23
+ } %>
@@ -17,20 +17,14 @@
17
17
  <%= render 'metadata_presenter/attribute/body' %>
18
18
 
19
19
  <%= form_for @page_answers, as: :answers, url: @page.url, method: :post do |f| %>
20
- <%= f.govuk_error_summary %>
21
20
 
22
- <% @page.components.each_with_index do |component, index| %>
23
- <div class="fb-editable"
24
- data-fb-content-type="<%= component._type %>"
25
- data-fb-content-id="<%= "page[components[#{index}]]" %>"
26
- data-fb-content-data="<%= component.to_json %>">
27
- <%= render partial: component, locals: {
28
- component: component,
29
- f: f,
30
- input_title: main_title(component: component) }
31
- %>
32
- </div>
33
- <% end %>
21
+ <%= render partial: 'metadata_presenter/component/components',
22
+ locals: {
23
+ f: f,
24
+ components: @page.components,
25
+ tag: nil,
26
+ classes: nil
27
+ } %>
34
28
 
35
29
  <%= f.govuk_submit(disabled: editable?) %>
36
30
  <% end %>
@@ -3,23 +3,18 @@
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 %>
11
- <% @page.components.each_with_index do |component, index| %>
12
- <%= render partial: component, locals: {
13
- component: component,
14
- component_id: "page[components[#{index}]]",
10
+
11
+ <%= render partial: 'metadata_presenter/component/components', locals: {
15
12
  f: f,
16
- input_title: main_title(
17
- component: component,
18
- tag: :h2,
19
- classes: 'govuk-heading-m govuk-!-margin-top-8'
20
- ) }
21
- %>
22
- <% end %>
13
+ components: @page.components,
14
+ tag: :h2,
15
+ classes: 'govuk-heading-m govuk-!-margin-top-8'
16
+ }
17
+ %>
23
18
 
24
19
  <%= f.govuk_submit(disabled: editable?) %>
25
20
  <% end %>
@@ -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 %>
@@ -20,5 +20,8 @@
20
20
  }
21
21
  ],
22
22
  "name": "component-name",
23
- "legend": "Question"
23
+ "legend": "Question",
24
+ "validation": {
25
+ "required": true
26
+ }
24
27
  }
@@ -7,6 +7,7 @@
7
7
  "name": "component-name",
8
8
  "date_type": "day-month-year",
9
9
  "validation": {
10
+ "required": true,
10
11
  "date": true
11
12
  }
12
13
  }
@@ -7,6 +7,7 @@
7
7
  "name": "component-name",
8
8
  "width_class_input": "10",
9
9
  "validation": {
10
+ "required": true,
10
11
  "number": true
11
12
  }
12
13
  }
@@ -20,5 +20,8 @@
20
20
  }
21
21
  ],
22
22
  "name": "component-name",
23
- "legend": "Question"
23
+ "legend": "Question",
24
+ "validation": {
25
+ "required": true
26
+ }
24
27
  }
@@ -1,5 +1,6 @@
1
1
  {
2
2
  "_id": "page.confirmation",
3
3
  "_type": "page.confirmation",
4
- "heading": "Application complete"
4
+ "heading": "Application complete",
5
+ "components": []
5
6
  }
@@ -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
+ }
@@ -326,20 +326,31 @@
326
326
  "section_heading": "Chain of Command",
327
327
  "heading": "Tell me how many lights you see",
328
328
  "body": "There are four lights!",
329
- "components": [],
329
+ "components": [
330
+ {
331
+ "_id": "how-many-lights_content_1",
332
+ "_type": "content",
333
+ "html": "What lights?"
334
+ }
335
+ ],
330
336
  "url": "how-many-lights"
331
337
  },
332
338
  {
333
339
  "_uuid": "e819d0c2-7062-4997-89cf-44d26d098404",
334
340
  "_id": "page._check-answers",
335
341
  "_type": "page.checkanswers",
336
- "body": "Optional content",
337
342
  "heading": "Review your answer",
338
- "lede": "First paragraph",
339
343
  "section_heading": "This section is optional",
340
344
  "send_body": "By submitting this answer you confirm all your answers",
341
345
  "send_heading": "Send your answer",
342
- "url": "/check-answers"
346
+ "url": "/check-answers",
347
+ "components": [
348
+ {
349
+ "_id": "check-answers_content_1",
350
+ "_type": "content",
351
+ "html": "Check yourself before you wreck yourself."
352
+ }
353
+ ]
343
354
  },
344
355
  {
345
356
  "_uuid": "b238a22f-c180-48d0-a7d9-8aad2036f1f2",
@@ -348,7 +359,14 @@
348
359
  "body": "You'll receive a confirmation email",
349
360
  "heading": "Complaint sent",
350
361
  "lede": "Optional lede",
351
- "url": "/confirmation"
362
+ "url": "/confirmation",
363
+ "components": [
364
+ {
365
+ "_id": "confirmation_content_1",
366
+ "_type": "content",
367
+ "html": "Some day I will be the most powerful Jedi ever!"
368
+ }
369
+ ]
352
370
  }
353
371
  ],
354
372
  "locale": "en"
@@ -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.19.2'
2
+ VERSION = '0.23.0'.freeze
3
3
  end
@@ -17,16 +17,6 @@
17
17
  "type": "string",
18
18
  "default": "Check your answers"
19
19
  },
20
- "lede": {
21
- "title": "Lede",
22
- "type": "string",
23
- "description": "Content before the body"
24
- },
25
- "body": {
26
- "title": "Body",
27
- "type": "string",
28
- "description": "Optional content before showing the summary"
29
- },
30
20
  "summary_of": {
31
21
  "title": "Summary of",
32
22
  "description": "Page/section that summary summarises"
@@ -45,6 +35,14 @@
45
35
  "content": true,
46
36
  "multiline": true,
47
37
  "default": "By submitting this application you confirm that, to the best of your knowledge, the details you are providing are correct."
38
+ },
39
+ "components": {
40
+ "title": "Components",
41
+ "description": "The form or content elements used on the page",
42
+ "type": "array",
43
+ "items": {
44
+ "$ref": "component.content"
45
+ }
48
46
  }
49
47
  },
50
48
  "required": [
@@ -19,6 +19,14 @@
19
19
  },
20
20
  "lede": {
21
21
  "multiline": true
22
+ },
23
+ "components": {
24
+ "title": "Components",
25
+ "description": "The form or content elements used on the page",
26
+ "type": "array",
27
+ "items": {
28
+ "$ref": "component.content"
29
+ }
22
30
  }
23
31
  },
24
32
  "required": [
@@ -7,6 +7,14 @@
7
7
  "properties": {
8
8
  "_type": {
9
9
  "const": "page.content"
10
+ },
11
+ "components": {
12
+ "title": "Components",
13
+ "description": "The form or content elements used on the page",
14
+ "type": "array",
15
+ "items": {
16
+ "$ref": "component.content"
17
+ }
10
18
  }
11
19
  },
12
20
  "allOf": [
@@ -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.19.2
4
+ version: 0.23.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-18 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,9 +281,11 @@ 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
288
+ - app/views/metadata_presenter/component/_components.html.erb
259
289
  - app/views/metadata_presenter/component/_content.html.erb
260
290
  - app/views/metadata_presenter/component/_date.html.erb
261
291
  - app/views/metadata_presenter/component/_number.html.erb
@@ -299,6 +329,8 @@ files:
299
329
  - default_metadata/string/error.number.json
300
330
  - default_metadata/string/error.required.json
301
331
  - default_text/content.json
332
+ - fixtures/invalid_content_page.json
333
+ - fixtures/no_component_page.json
302
334
  - fixtures/non_finished_service.json
303
335
  - fixtures/service.json
304
336
  - fixtures/version.json