metadata_presenter 0.1.7 → 0.3.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 572898025ea58ab49d58705271698b852dc8f767a09990bec46b21448f4a0ff0
4
- data.tar.gz: f860c16e83a513ab1629863413ea04a884444d5a6e5aa8780cb5da68528b3dc2
3
+ metadata.gz: c9e3f6b76b6bf4eed008016daa3a808265c1d4b83662b5dcb266e2a41e344220
4
+ data.tar.gz: e78d47a469498797c62954ee7ab41d6994371f5abd9240ec34c39d59256f3fec
5
5
  SHA512:
6
- metadata.gz: e6a890f0059389dad5abe6cdad977e8a549da2457316c22157692b16972274b6276a07f21717e082de2ba8aef4c905ebae15bf4c1d62184a9908b7a84ffec386
7
- data.tar.gz: 25d762491ce278fc57dd769004ea87a5c1c90caff7a27e7ac3c946de2ad261d5bba75361ceda4bf8dc7a2ea775ff31cbeb10bed6e1ba2891f62b78c5b8350c03
6
+ metadata.gz: aebdfa27ae782818f1f4fc62fa974f100797e3866504257c3e1a7e676102b9051094015ecb1b2c8309bf2cb1eb8220805530d2cda7794ec2a76a2d32a94cf62b
7
+ data.tar.gz: 11db360d2d50f04c2a78f351224abe80a9514c631900adf4670a7da9be2a184eb92c57125b94527c7a6623ac1f96c512068aa753df20499ce439b2d00522746f
data/README.md CHANGED
@@ -47,6 +47,7 @@ that you need to write the following methods in your controller:
47
47
 
48
48
  1. save_user_data
49
49
  2. load_user_data
50
+ 3. editable?
50
51
 
51
52
  The user answers can be accessed via `params[:answers]`.
52
53
 
@@ -63,6 +64,18 @@ An example of implementation:
63
64
  end
64
65
  ```
65
66
 
67
+ The `editable?` is related if the pages and components could be editable in the
68
+ mountable app:
69
+
70
+ ```ruby
71
+ class MyAwesomeController
72
+ def editable?
73
+ false
74
+ end
75
+ helper_method :editable?
76
+ end
77
+ ```
78
+
66
79
  ## Generate documentation
67
80
 
68
81
  Run `rake doc` and open the doc/index.html
@@ -1,5 +1,7 @@
1
1
  module MetadataPresenter
2
2
  class AnswersController < EngineController
3
+ before_action :check_page_exists
4
+
3
5
  def create
4
6
  if page.validate_answers(answers_params)
5
7
  save_user_data # method signature
@@ -12,15 +14,16 @@ module MetadataPresenter
12
14
  private
13
15
 
14
16
  def page
15
- @page ||= MetadataPresenter::Page.new(
16
- service.find_page(params[:page_url]).metadata
17
- )
17
+ @page ||= begin
18
+ current_page = service.find_page_by_url(page_url)
19
+ MetadataPresenter::Page.new(current_page.metadata) if current_page
20
+ end
18
21
  end
19
22
 
20
23
  def redirect_to_next_page
21
24
  next_page = NextPage.new(service).find(
22
25
  session: session,
23
- current_page_url: params[:page_url]
26
+ current_page_url: page_url
24
27
  )
25
28
 
26
29
  if next_page.present?
@@ -38,5 +41,13 @@ module MetadataPresenter
38
41
  def answers_params
39
42
  params[:answers] ? params[:answers].permit! : {}
40
43
  end
44
+
45
+ def page_url
46
+ request.env['PATH_INFO']
47
+ end
48
+
49
+ def check_page_exists
50
+ not_found if page.blank?
51
+ end
41
52
  end
42
53
  end
@@ -2,7 +2,7 @@ module MetadataPresenter
2
2
  class PagesController < EngineController
3
3
  def show
4
4
  @user_data = load_user_data # method signature
5
- @page ||= service.find_page(request.env['PATH_INFO'])
5
+ @page ||= service.find_page_by_url(request.env['PATH_INFO'])
6
6
 
7
7
  if @page
8
8
  render template: @page.template
@@ -1,5 +1,23 @@
1
1
  module MetadataPresenter
2
2
  module ApplicationHelper
3
+ ## Display user answers on the view
4
+ ## When the user doesn't answered yet the component will be blank
5
+ # or with data otherwise, so doing the if in every output is not
6
+ # pratical.
7
+ #
8
+ # The below example search for 'first_name' in the user data instance
9
+ # variable as long your load_user_data in the controller sets the variable.
10
+ #
11
+ # @example
12
+ # <%= a('first_name') %>
13
+ #
14
+ def a(component_key)
15
+ if @user_data.present?
16
+ @user_data[component_key]
17
+ end
18
+ end
19
+ alias answer a
20
+
3
21
  def to_markdown(text)
4
22
  (Kramdown::Document.new(text).to_html).html_safe
5
23
  end
@@ -1,5 +1,5 @@
1
1
  class MetadataPresenter::Component < MetadataPresenter::Metadata
2
2
  def to_partial_path
3
- "component/#{type}"
3
+ "metadata_presenter/component/#{type}"
4
4
  end
5
5
  end
@@ -9,7 +9,7 @@ module MetadataPresenter
9
9
  def find(session:, current_page_url:)
10
10
  if session[:return_to_check_you_answer].present?
11
11
  session[:return_to_check_you_answer] = nil
12
- service.pages.find { |page| page.type == 'page.summary' }
12
+ service.pages.find { |page| page.type == 'page.checkanswers' }
13
13
  else
14
14
  service.next_page(from: current_page_url)
15
15
  end
@@ -6,10 +6,18 @@ module MetadataPresenter
6
6
  ValidateAnswers.new(page: self, answers: answers).valid?
7
7
  end
8
8
 
9
+ def uuid
10
+ _uuid
11
+ end
12
+
9
13
  def ==(other)
10
14
  id == other.id if other.respond_to? :id
11
15
  end
12
16
 
17
+ def editable_attributes
18
+ self.to_h.reject { |k,_| k.in?([:_id, :_type, :steps]) }
19
+ end
20
+
13
21
  def components
14
22
  metadata.components&.map do |component|
15
23
  MetadataPresenter::Component.new(component)
@@ -7,12 +7,16 @@ class MetadataPresenter::Service < MetadataPresenter::Metadata
7
7
  pages.first
8
8
  end
9
9
 
10
- def find_page(path)
11
- pages.find { |page| page.url == path }
10
+ def find_page_by_url(url)
11
+ pages.find { |page| strip_slash(page.url) == strip_slash(url) }
12
+ end
13
+
14
+ def find_page_by_uuid(uuid)
15
+ pages.find { |page| page.uuid == uuid }
12
16
  end
13
17
 
14
18
  def next_page(from:)
15
- current_page = find_page(from)
19
+ current_page = find_page_by_url(from)
16
20
  pages[pages.index(current_page) + 1] if current_page.present?
17
21
  end
18
22
 
@@ -25,4 +29,12 @@ class MetadataPresenter::Service < MetadataPresenter::Metadata
25
29
  page.type == 'page.confirmation'
26
30
  end
27
31
  end
32
+
33
+ private
34
+
35
+ def strip_slash(url)
36
+ return url if url == '/'
37
+
38
+ url.gsub(/^\//, '')
39
+ end
28
40
  end
@@ -3,5 +3,5 @@
3
3
  label: { text: component.label },
4
4
  hint: { text: component.hint },
5
5
  name: "answers[#{component.name}]",
6
- value: @user_data[component.name]
6
+ value: answer(component.name)
7
7
  %>
@@ -25,7 +25,7 @@
25
25
  <% end %>
26
26
 
27
27
  <%= form_for @page, url: reserved_submissions_path do |f| %>
28
- <div data-block-id="page.summary.answers" data-block-type="answers">
28
+ <div data-block-id="page.checkanswers.answers" data-block-type="answers">
29
29
  <dl class="fb-block fb-block-answers govuk-summary-list">
30
30
  <% @service.pages.each do |page| %>
31
31
  <% Array(page.components).each do |component| %>
@@ -35,7 +35,7 @@
35
35
  </dt>
36
36
 
37
37
  <dd class="govuk-summary-list__value">
38
- <%= @user_data[component.name] %>
38
+ <%=a component.name %>
39
39
  </dd>
40
40
  <dd class="govuk-summary-list__actions">
41
41
  <%= link_to(
@@ -66,7 +66,7 @@
66
66
  </div>
67
67
  <% end %>
68
68
 
69
- <button 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">
69
+ <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">
70
70
  Accept and send application
71
71
  </button>
72
72
  <% end %>
@@ -5,13 +5,13 @@
5
5
  <%= @page.heading.html_safe %>
6
6
  </h1>
7
7
 
8
- <%= form_for @page, url: reserved_answers_path(@page.url) do |f| %>
8
+ <%= form_for @page, url: @page.url, method: :post do |f| %>
9
9
  <%= f.govuk_error_summary %>
10
10
  <% @page.components.each do |component| %>
11
11
  <%= render partial: component, locals: { component: component, f: f } %>
12
12
  <% end %>
13
13
 
14
- <%= f.govuk_submit %>
14
+ <%= f.govuk_submit(disabled: editable?) %>
15
15
  <% end %>
16
16
  </div>
17
17
  </div>
@@ -25,8 +25,8 @@
25
25
  </p>
26
26
  <%- end %>
27
27
 
28
- <%= form_tag(reserved_answers_path(@page.url), method: :post) do %>
29
- <button class='govuk-button govuk-button--start govuk-!-margin-top-2'>
28
+ <%= form_tag(@page.url, method: :post) do %>
29
+ <button <%= 'disabled' if editable? %> class='govuk-button govuk-button--start govuk-!-margin-top-2'>
30
30
  Start
31
31
  <svg class="govuk-button__start-icon" xmlns="http://www.w3.org/2000/svg" width="17.5" height="19" viewBox="0 0 33 40" aria-hidden="true" focusable="false">
32
32
  <path fill="currentColor" d="M0 0h13l20 20-20 20H0l20-20z" />
data/config/routes.rb CHANGED
@@ -1,8 +1,10 @@
1
1
  MetadataPresenter::Engine.routes.draw do
2
2
  root to: 'service#start'
3
3
 
4
- post '/reserved/:page_url/answers', to: 'answers#create', as: :reserved_answers
5
4
  post '/reserved/submissions', to: 'submissions#create', as: :reserved_submissions
6
5
  get '/reserved/change-answer', to: 'change_answer#create', as: :change_answer
6
+
7
+ post '/', to: 'answers#create'
8
+ match '*path', to: 'answers#create', via: :post
7
9
  match '*path', to: 'pages#show', via: :all
8
10
  end
@@ -0,0 +1,8 @@
1
+ {
2
+ "_id": "component.text",
3
+ "_type": "text",
4
+ "errors": {},
5
+ "hint": "Component hint",
6
+ "label": "Component label",
7
+ "name": "component-name"
8
+ }
@@ -1,6 +1,8 @@
1
1
  {
2
- "_id": "page.summary",
2
+ "_id": "page.checkanswers",
3
+ "_type": "page.checkanswers",
3
4
  "heading": "Check your answers",
4
5
  "send_heading": "Now send your application",
5
- "send_body": "By submitting this application you confirm that, to the best of your knowledge, the details you are providing are correct."
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": []
6
8
  }
@@ -1,4 +1,5 @@
1
1
  {
2
2
  "_id": "page.confirmation",
3
+ "_type": "page.confirmation",
3
4
  "heading": "Required - Confirmation"
4
5
  }
@@ -0,0 +1,9 @@
1
+ {
2
+ "_id": "page.singlequestion",
3
+ "_type": "page.singlequestion",
4
+ "heading": "Question",
5
+ "lede": "This is the lede",
6
+ "body": "Body section",
7
+ "components": [],
8
+ "url": ""
9
+ }
@@ -0,0 +1,10 @@
1
+ {
2
+ "_id": "page.start",
3
+ "_type": "page.start",
4
+ "heading": "Service name goes here",
5
+ "lede": "This is your start page first paragraph. You can only have one paragraph here.",
6
+ "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.",
7
+ "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.",
8
+ "steps": [],
9
+ "url": "/"
10
+ }
@@ -3,16 +3,6 @@
3
3
  "_type": "service.base",
4
4
  "service_name": "Service name",
5
5
  "configuration": {},
6
- "pages": [
7
- {
8
- "_id": "page.start",
9
- "_type": "page.start",
10
- "heading": "Service name goes here",
11
- "lede": "This is your start page first paragraph. You can only have one paragraph here.",
12
- "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.",
13
- "steps": [],
14
- "url": "/"
15
- }
16
- ],
6
+ "pages": [],
17
7
  "locale": "en"
18
8
  }
@@ -35,6 +35,7 @@
35
35
  },
36
36
  "pages": [
37
37
  {
38
+ "_uuid": "9626b2e9-5ef0-4070-8331-ac55151b22c4",
38
39
  "_id": "page.start",
39
40
  "_type": "page.start",
40
41
  "heading": "Service name goes here",
@@ -36,6 +36,7 @@
36
36
  },
37
37
  "pages": [
38
38
  {
39
+ "_uuid": "fa391697-ae82-4416-adc3-3433e54ce535",
39
40
  "_id": "page.start",
40
41
  "_type": "page.start",
41
42
  "heading": "Service name goes here",
@@ -52,6 +53,7 @@
52
53
  "url": "/"
53
54
  },
54
55
  {
56
+ "_uuid": "847c4a0c-1c5f-4391-8847-42c8d82f1d0b",
55
57
  "_id": "page.name",
56
58
  "_type": "page.singlequestion",
57
59
  "components": [
@@ -71,6 +73,7 @@
71
73
  "url": "/name"
72
74
  },
73
75
  {
76
+ "_uuid": "ccf49acb-ad33-4fd3-8a7e-f0594b86cc96",
74
77
  "_id": "page.email-address",
75
78
  "_type": "page.singlequestion",
76
79
  "heading": "Email address",
@@ -102,6 +105,7 @@
102
105
  "url": "/email-address"
103
106
  },
104
107
  {
108
+ "_uuid": "7b748584-100e-4d81-a54a-5049190136cc",
105
109
  "_id": "page.parent_name",
106
110
  "_type": "page.singlequestion",
107
111
  "components": [
@@ -121,8 +125,9 @@
121
125
  "url": "/parent-name"
122
126
  },
123
127
  {
128
+ "_uuid": "e819d0c2-7062-4997-89cf-44d26d098404",
124
129
  "_id": "page._check-answers",
125
- "_type": "page.summary",
130
+ "_type": "page.checkanswers",
126
131
  "body": "Optional content",
127
132
  "heading": "Review your answer",
128
133
  "lede": "First paragraph",
@@ -132,6 +137,7 @@
132
137
  "url": "/check-answers"
133
138
  },
134
139
  {
140
+ "_uuid": "b238a22f-c180-48d0-a7d9-8aad2036f1f2",
135
141
  "_id": "page._confirmation",
136
142
  "_type": "page.confirmation",
137
143
  "body": "You'll receive a confirmation email",
@@ -0,0 +1,21 @@
1
+ module MetadataPresenter
2
+ module TestHelpers
3
+ def service
4
+ MetadataPresenter::Service.new(service_metadata)
5
+ end
6
+
7
+ def fixtures_directory
8
+ @_fixtures_directory ||=
9
+ Pathname.new(MetadataPresenter::Engine.root.join('fixtures'))
10
+ end
11
+
12
+ def service_metadata
13
+ metadata_fixture(:version)
14
+ JSON.parse(File.read(fixtures_directory.join('version.json')))
15
+ end
16
+
17
+ def metadata_fixture(fixture_name)
18
+ JSON.parse(File.read(fixtures_directory.join("#{fixture_name}.json")))
19
+ end
20
+ end
21
+ end
@@ -1,3 +1,3 @@
1
1
  module MetadataPresenter
2
- VERSION = '0.1.7'
2
+ VERSION = '0.3.2'
3
3
  end
@@ -4,6 +4,10 @@
4
4
  "id_seed": "url",
5
5
  "title": "Page definition",
6
6
  "properties": {
7
+ "_uuid": {
8
+ "title": "Unique identifier of the page",
9
+ "description": "Used internally in the editor and the runner."
10
+ },
7
11
  "url": {
8
12
  "title": "URL",
9
13
  "description": "The page’s relative url - it must not contain any spaces",
@@ -95,6 +99,7 @@
95
99
  }
96
100
  ],
97
101
  "required": [
102
+ "_uuid",
98
103
  "url"
99
104
  ],
100
105
  "category": [
@@ -1,12 +1,12 @@
1
1
  {
2
- "$id": "http://gov.uk/schema/v1.0.0/page/summary",
3
- "_name": "page.summary",
2
+ "$id": "http://gov.uk/schema/v1.0.0/page/checkanswers",
3
+ "_name": "page.checkanswers",
4
4
  "title": "Check answers",
5
5
  "description": "Let users check and change their answers before submitting",
6
6
  "type": "object",
7
7
  "properties": {
8
8
  "_type": {
9
- "const": "page.summary"
9
+ "const": "page.checkanswers"
10
10
  },
11
11
  "section_heading": {
12
12
  "title": "Section heading",
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: 0.1.7
4
+ version: 0.3.2
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-01-15 00:00:00.000000000 Z
11
+ date: 2021-02-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -247,18 +247,21 @@ files:
247
247
  - app/views/layouts/metadata_presenter/application.html.erb
248
248
  - app/views/metadata_presenter/component/_text.html.erb
249
249
  - app/views/metadata_presenter/header/show.html.erb
250
+ - app/views/metadata_presenter/page/checkanswers.html.erb
250
251
  - app/views/metadata_presenter/page/confirmation.html.erb
251
252
  - app/views/metadata_presenter/page/form.html.erb
252
253
  - app/views/metadata_presenter/page/singlequestion.html.erb
253
254
  - app/views/metadata_presenter/page/start.html.erb
254
- - app/views/metadata_presenter/page/summary.html.erb
255
255
  - config/initializers/default_metadata.rb
256
256
  - config/initializers/schemas.rb
257
257
  - config/routes.rb
258
+ - default_metadata/component/text.json
258
259
  - default_metadata/config/meta.json
259
260
  - default_metadata/config/service.json
261
+ - default_metadata/page/checkanswers.json
260
262
  - default_metadata/page/confirmation.json
261
- - default_metadata/page/summary.json
263
+ - default_metadata/page/singlequestion.json
264
+ - default_metadata/page/start.json
262
265
  - default_metadata/service/base.json
263
266
  - default_metadata/string/error.max_length.json
264
267
  - default_metadata/string/error.min_length.json
@@ -268,6 +271,7 @@ files:
268
271
  - fixtures/version.json
269
272
  - lib/metadata_presenter.rb
270
273
  - lib/metadata_presenter/engine.rb
274
+ - lib/metadata_presenter/test_helpers.rb
271
275
  - lib/metadata_presenter/version.rb
272
276
  - lib/tasks/metadata_presenter_tasks.rake
273
277
  - schemas/condition/condition.json
@@ -305,9 +309,9 @@ files:
305
309
  - schemas/definition/width_class.json
306
310
  - schemas/errors/errors.json
307
311
  - schemas/link/link.json
312
+ - schemas/page/checkanswers.json
308
313
  - schemas/page/confirmation.json
309
314
  - schemas/page/start.json
310
- - schemas/page/summary.json
311
315
  - schemas/request/service.json
312
316
  - schemas/service/base.json
313
317
  - schemas/service/configuration.json