metadata_presenter 0.11.0 → 0.12.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: f28074c7149c34365903ebb2d3f63f679fe15a9365d9d8d52212bf46781506ae
4
- data.tar.gz: b5c02391b3978aaadc551076f9b0823c6e73f585d7e401ac5980d976d6e568f2
3
+ metadata.gz: ea5f406433591e375a3c137f9f12df05ee0b0679cba535293d71e4629773d49b
4
+ data.tar.gz: 65311d8db37019816d041808cb1bf8ae409b5811052d50c05a6e7651ba1cea6b
5
5
  SHA512:
6
- metadata.gz: 2b94a8004d81073a597b09b27844d16d5833a8b68a458423afb330fe1fd880d3a4feea508d7f5ec00e290ce75b7f73e8dc3b5094b5276f75c8477241068ba14a
7
- data.tar.gz: fb7392086d34f13606a4def4b0347190ec45a90fd2f3ec66271b1ef517a2923496e0ce131323ef8b6084491a93d570282204b33a4bf21d4515c0c1185d05fa3e
6
+ metadata.gz: 0b302de50d21f93d1d87f253a6d843b2037138988567911d1d78293d44489d8f3a800b60f3a0ca325a10fac43ac23a5eea7fcddaf4213035409fdf8fd70fd96c
7
+ data.tar.gz: 13e2a9c6aa54657ddfa4ebda15a4defc981ee880581ca55cece8f24996823b4f120db58d1cffa3744df3f650302493e79a816366d9fb3e3cd935433b605a5311
@@ -11,5 +11,14 @@ module MetadataPresenter
11
11
  not_found
12
12
  end
13
13
  end
14
+
15
+ def page_answers_presenters
16
+ PageAnswersPresenter.map(
17
+ view: view_context,
18
+ pages: service.pages,
19
+ answers: @user_data
20
+ )
21
+ end
22
+ helper_method :page_answers_presenters
14
23
  end
15
24
  end
@@ -14,32 +14,6 @@ module MetadataPresenter
14
14
  end
15
15
  end
16
16
 
17
- ## Display user answers on the view
18
- ## When the user doesn't answered yet the component will be blank
19
- # or with data otherwise, so doing the if in every output is not
20
- # pratical.
21
- #
22
- # The below example search for 'first_name' in the user data instance
23
- # variable as long your load_user_data in the controller sets the variable.
24
- #
25
- # @example
26
- # <%=a 'first_name' %>
27
- #
28
- def a(component_key)
29
- if @user_data.present?
30
- @user_data[component_key]
31
- end
32
- end
33
- alias answer a
34
-
35
- ## Display user answers on the view formatted.
36
- ##
37
- def formatted_answer(component_key)
38
- user_answer = answer(component_key)
39
-
40
- simple_format(user_answer) if user_answer.present?
41
- end
42
-
43
17
  # Renders markdown given a text.
44
18
  #
45
19
  # @example
@@ -0,0 +1,19 @@
1
+ module MetadataPresenter
2
+ class DateField
3
+ attr_reader :day, :month, :year
4
+
5
+ def initialize(day:, month:, year:)
6
+ @day = day
7
+ @month = month
8
+ @year = year
9
+ end
10
+
11
+ def present?
12
+ !blank?
13
+ end
14
+
15
+ def blank?
16
+ @day.blank? || @month.blank? || @year.blank?
17
+ end
18
+ end
19
+ end
@@ -17,11 +17,33 @@ module MetadataPresenter
17
17
  end
18
18
 
19
19
  def respond_to_missing?(method_name, include_private = false)
20
- answers[method_name.to_s].present?
20
+ method_name.to_s.in?(components.map(&:id))
21
21
  end
22
22
 
23
23
  def method_missing(method_name, *args, &block)
24
- answers[method_name.to_s]
24
+ component = components.find { |component| component.id == method_name.to_s }
25
+
26
+ if component && component.type == 'date'
27
+ date_answer(component.id)
28
+ else
29
+ answers[method_name.to_s]
30
+ end
31
+ end
32
+
33
+ def date_answer(component_id)
34
+ date = raw_date_answer(component_id)
35
+
36
+ MetadataPresenter::DateField.new(day: date[0], month: date[1], year: date[2])
37
+ end
38
+
39
+ def raw_date_answer(component_id)
40
+ [
41
+ GOVUKDesignSystemFormBuilder::Elements::Date::SEGMENTS[:day],
42
+ GOVUKDesignSystemFormBuilder::Elements::Date::SEGMENTS[:month],
43
+ GOVUKDesignSystemFormBuilder::Elements::Date::SEGMENTS[:year]
44
+ ].map do |segment|
45
+ answers["#{component_id.to_s}(#{segment})"]
46
+ end
25
47
  end
26
48
 
27
49
  private
@@ -0,0 +1,46 @@
1
+ module MetadataPresenter
2
+ class PageAnswersPresenter
3
+ def self.map(view:, pages:, answers:)
4
+ pages.map do |page|
5
+ Array(page.components).map do |component|
6
+ new(
7
+ view: view,
8
+ component: component,
9
+ page: page,
10
+ answers: answers
11
+ )
12
+ end
13
+ end.flatten
14
+ end
15
+
16
+ attr_reader :view, :component, :page, :answers
17
+ delegate :url, to: :page
18
+ delegate :humanised_title, to: :component
19
+
20
+ def initialize(view:, component:, page:, answers:)
21
+ @view = view
22
+ @component = component
23
+ @page = page
24
+ @answers = answers
25
+
26
+ @page_answers = PageAnswers.new(page, answers)
27
+ end
28
+
29
+ def answer
30
+ value = @page_answers.send(component.id)
31
+
32
+ return '' if value.blank?
33
+
34
+ if component.type == 'date'
35
+ I18n.l(
36
+ Date.civil(value.year.to_i, value.month.to_i, value.day.to_i),
37
+ format: '%d %B %Y'
38
+ )
39
+ elsif component.type == 'textarea'
40
+ view.simple_format(value)
41
+ else
42
+ value
43
+ end
44
+ end
45
+ end
46
+ end
@@ -38,7 +38,7 @@ module MetadataPresenter
38
38
  end
39
39
 
40
40
  def valid?
41
- return true if user_answer.blank? && allow_blank?
41
+ return true if allow_blank?
42
42
 
43
43
  if invalid_answer?
44
44
  error_message = custom_error_message || default_error_message
@@ -127,7 +127,7 @@ module MetadataPresenter
127
127
  # @return [TrueClass]
128
128
  #
129
129
  def allow_blank?
130
- true unless self.class.name.demodulize.include?('RequiredValidator')
130
+ user_answer.blank? && !self.class.name.demodulize.include?('RequiredValidator')
131
131
  end
132
132
  end
133
133
  end
@@ -0,0 +1,14 @@
1
+ module MetadataPresenter
2
+ class DateValidator < BaseValidator
3
+ def invalid_answer?
4
+ Date.strptime(
5
+ "#{user_answer.year}-#{user_answer.month}-#{user_answer.day}",
6
+ '%Y-%m-%d'
7
+ )
8
+
9
+ false
10
+ rescue Date::Error
11
+ true
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,5 @@
1
+ <%=
2
+ f.govuk_date_field component.id.to_sym,
3
+ hint: { text: component.hint },
4
+ legend: { text: input_title }
5
+ %>
@@ -27,27 +27,25 @@
27
27
  <%= form_for @page, url: reserved_submissions_path do |f| %>
28
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
- <% @service.pages.each do |page| %>
31
- <% Array(page.components).each do |component| %>
32
- <div class="govuk-summary-list__row">
33
- <dt class="govuk-summary-list__key">
34
- <%= component.humanised_title %>
35
- </dt>
30
+ <% page_answers_presenters.each do |page_answers_presenter| %>
31
+ <div class="govuk-summary-list__row">
32
+ <dt class="govuk-summary-list__key">
33
+ <%= page_answers_presenter.humanised_title %>
34
+ </dt>
36
35
 
37
- <dd class="govuk-summary-list__value">
38
- <%= formatted_answer(component.name) %>
39
- </dd>
40
- <dd class="govuk-summary-list__actions">
41
- <%= link_to(
42
- change_answer_path(url: page.url),
43
- class: 'govuk-link'
44
- ) do %>
45
- Change<span class="govuk-visually-hidden"> Your answer for <%= component.label %></span>
46
- <% end %>
47
- </a>
48
- </dd>
49
- </div>
50
- <% end %>
36
+ <dd class="govuk-summary-list__value">
37
+ <%= page_answers_presenter.answer %>
38
+ </dd>
39
+ <dd class="govuk-summary-list__actions">
40
+ <%= link_to(
41
+ change_answer_path(url: page_answers_presenter.url),
42
+ class: 'govuk-link'
43
+ ) do %>
44
+ Change<span class="govuk-visually-hidden"> Your answer for <%= page_answers_presenter.humanised_title %></span>
45
+ <% end %>
46
+ </a>
47
+ </dd>
48
+ </div>
51
49
  <% end %>
52
50
  </dl>
53
51
  </div>
@@ -0,0 +1,12 @@
1
+ {
2
+ "_id": "component.date",
3
+ "_type": "date",
4
+ "errors": {},
5
+ "hint": "Component hint",
6
+ "legend": "Component legend",
7
+ "name": "component-name",
8
+ "date_type": "day-month-year",
9
+ "validation": {
10
+ "date": true
11
+ }
12
+ }
@@ -0,0 +1,6 @@
1
+ {
2
+ "_id": "error.date",
3
+ "_type": "string.error",
4
+ "description": "Input (date) is not a valid date",
5
+ "value": "Enter a valid date for %{control}"
6
+ }
@@ -201,6 +201,28 @@
201
201
  "heading": "Radio buttons",
202
202
  "url": "/do-you-like-star-wars"
203
203
  },
204
+ {
205
+ "_id": "page.holiday",
206
+ "url": "holiday",
207
+ "_type":"page.singlequestion",
208
+ "_uuid":"ff4557b2-486b-481e-9eef-f315718639e8",
209
+ "heading":"Question",
210
+ "components": [
211
+ {
212
+ "_id": "holiday_date_1",
213
+ "hint": "Component hint",
214
+ "name": "holiday_date_1",
215
+ "_type": "date",
216
+ "legend": "What is the day that you like to take holidays?",
217
+ "errors": {},
218
+ "date_type": "day-month-year",
219
+ "validation": {
220
+ "date": true,
221
+ "required": true
222
+ }
223
+ }
224
+ ]
225
+ },
204
226
  {
205
227
  "_uuid": "e819d0c2-7062-4997-89cf-44d26d098404",
206
228
  "_id": "page._check-answers",
@@ -1,3 +1,3 @@
1
1
  module MetadataPresenter
2
- VERSION = '0.11.0'
2
+ VERSION = '0.12.0'
3
3
  end
@@ -0,0 +1,48 @@
1
+ {
2
+ "$id": "http://gov.uk/schema/v1.0.0/date",
3
+ "_name": "component.date",
4
+ "title": "Date",
5
+ "description": "Let users enter an exact date",
6
+ "type": "object",
7
+ "properties": {
8
+ "_type": {
9
+ "const": "date"
10
+ },
11
+ "name": {
12
+ "inputType": "date"
13
+ },
14
+ "date_type": {
15
+ "title": "Date type",
16
+ "description": "The format for entering dates",
17
+ "type": "string",
18
+ "enum": [
19
+ "day-month-year",
20
+ "month-year",
21
+ "day-month",
22
+ "year"
23
+ ],
24
+ "default": "day-month-year"
25
+ }
26
+ },
27
+ "allOf": [
28
+ {
29
+ "$ref": "definition.fieldset"
30
+ },
31
+ {
32
+ "$ref": "validations#/definitions/date_bundle"
33
+ }
34
+ ],
35
+ "composite": [
36
+ "day",
37
+ "month",
38
+ "year"
39
+ ],
40
+ "definitions": {
41
+ "date_type_enum": {
42
+ "day-month-year": "Day / Month / Year",
43
+ "month-year": "Month / Year",
44
+ "year": "Year",
45
+ "day-month": "Day / Month"
46
+ }
47
+ }
48
+ }
@@ -25,6 +25,15 @@
25
25
  ],
26
26
  "default": true
27
27
  },
28
+ "date": {
29
+ "title": "Date",
30
+ "description": "Whether the user must answer with a valid date",
31
+ "oneOf": [
32
+ {
33
+ "$ref": "definition.conditional.boolean"
34
+ }
35
+ ]
36
+ },
28
37
  "errors_required": {
29
38
  "title": "Error messages for ‘Required’",
30
39
  "allOf": [
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.11.0
4
+ version: 0.12.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-02-12 00:00:00.000000000 Z
11
+ date: 2021-02-15 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -233,12 +233,15 @@ files:
233
233
  - app/helpers/metadata_presenter/application_helper.rb
234
234
  - app/jobs/metadata_presenter/application_job.rb
235
235
  - app/models/metadata_presenter/component.rb
236
+ - app/models/metadata_presenter/date_field.rb
236
237
  - app/models/metadata_presenter/metadata.rb
237
238
  - app/models/metadata_presenter/next_page.rb
238
239
  - app/models/metadata_presenter/page.rb
239
240
  - app/models/metadata_presenter/page_answers.rb
240
241
  - app/models/metadata_presenter/service.rb
242
+ - app/presenters/metadata_presenter/page_answers_presenter.rb
241
243
  - app/validators/metadata_presenter/base_validator.rb
244
+ - app/validators/metadata_presenter/date_validator.rb
242
245
  - app/validators/metadata_presenter/max_length_validator.rb
243
246
  - app/validators/metadata_presenter/min_length_validator.rb
244
247
  - app/validators/metadata_presenter/number_validator.rb
@@ -247,6 +250,7 @@ files:
247
250
  - app/validators/metadata_presenter/validate_schema.rb
248
251
  - app/views/errors/404.html
249
252
  - app/views/layouts/metadata_presenter/application.html.erb
253
+ - app/views/metadata_presenter/component/_date.html.erb
250
254
  - app/views/metadata_presenter/component/_number.html.erb
251
255
  - app/views/metadata_presenter/component/_radios.html.erb
252
256
  - app/views/metadata_presenter/component/_text.html.erb
@@ -260,6 +264,7 @@ files:
260
264
  - config/initializers/default_metadata.rb
261
265
  - config/initializers/schemas.rb
262
266
  - config/routes.rb
267
+ - default_metadata/component/date.json
263
268
  - default_metadata/component/number.json
264
269
  - default_metadata/component/radios.json
265
270
  - default_metadata/component/text.json
@@ -272,6 +277,7 @@ files:
272
277
  - default_metadata/page/singlequestion.json
273
278
  - default_metadata/page/start.json
274
279
  - default_metadata/service/base.json
280
+ - default_metadata/string/error.date.json
275
281
  - default_metadata/string/error.max_length.json
276
282
  - default_metadata/string/error.min_length.json
277
283
  - default_metadata/string/error.number.json
@@ -284,6 +290,7 @@ files:
284
290
  - lib/metadata_presenter/test_helpers.rb
285
291
  - lib/metadata_presenter/version.rb
286
292
  - lib/tasks/metadata_presenter_tasks.rake
293
+ - schemas/component/date.json
287
294
  - schemas/component/number.json
288
295
  - schemas/component/radios.json
289
296
  - schemas/component/text.json