govuk_design_system_formbuilder 2.1.0 → 2.1.5

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: c55b78722270c864a735be507e018c420e14bee0e408c59da1bc61777c320bf7
4
- data.tar.gz: b0d291bca6a13a77fe21db5c431bfea86184de8acd82b5e4cc3a3c944fdf322c
3
+ metadata.gz: f2892780c7524701d967f5ed6c409ad4eb741b5a3e6cfaf4ec65389dbaf504a4
4
+ data.tar.gz: 5a231ba3dfebdf493b8563fc2d7c4b11ba66d27963512e24ef6cd9647ba8bee9
5
5
  SHA512:
6
- metadata.gz: a130e8bb5964af17acb89a14f02ecda2ed989c1e18c6ed970a400945be78c5a8fdc0dd735333b026f51b75a5d090c4e6403f3594feedf595b21c294abec13ae7
7
- data.tar.gz: 9afc6f6e12e26bdc2cd4eafc41f2d1e5a972829fd18bd2a2571550b683500320a66f6603d159af0e7c0943b57deeaf8b47267499ac4cf2c3577d207b555cfcba
6
+ metadata.gz: 46966873483f3cec59d97458b1e211ab013d7056c6d18e6bd40749f393e6e5eff96e93ddf38d6888da4316cd26db7d3a6dbd9e744e40d3fa6b2b4ac5386281b8
7
+ data.tar.gz: cff65a82d937855335ef59346acb8d4e2a07e21ca615897c8dd9b0c873e2e919a794ac46dcfdde27054211f573c7be030d1b64a8b5fd1fa325f34ae1ecd8811d
data/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # GOV.UK Design System Form Builder for Rails
2
2
 
3
- [![Build Status](https://travis-ci.com/DFE-Digital/govuk_design_system_formbuilder.svg?branch=master)](https://travis-ci.com/DFE-Digital/govuk_design_system_formbuilder)
3
+ [![Tests](https://github.com/DFE-Digital/govuk_design_system_formbuilder/workflows/Testing/badge.svg)](https://github.com/DFE-Digital/govuk_design_system_formbuilder/actions)
4
4
  [![Maintainability](https://api.codeclimate.com/v1/badges/fde73b5dc9476197281b/maintainability)](https://codeclimate.com/github/DFE-Digital/govuk_design_system_formbuilder/maintainability)
5
5
  [![Gem Version](https://badge.fury.io/rb/govuk_design_system_formbuilder.svg)](https://badge.fury.io/rb/govuk_design_system_formbuilder)
6
6
  [![Gem](https://img.shields.io/gem/dt/govuk_design_system_formbuilder?logo=rubygems)](https://rubygems.org/gems/govuk_design_system_formbuilder)
@@ -850,6 +850,7 @@ module GOVUKDesignSystemFormBuilder
850
850
  # @option caption size [String] the size of the caption, can be +xl+, +l+ or +m+. Defaults to +m+
851
851
  # @option caption kwargs [Hash] additional arguments are applied as attributes on the caption +span+ element
852
852
  # @param omit_day [Boolean] do not render a day input, only capture month and year
853
+ # @param wildcards [Boolean] add an 'X' to the date wildcards so users can add approximate dates
853
854
  # @param form_group [Hash] configures the form group
854
855
  # @option form_group classes [Array,String] sets the form group's classes
855
856
  # @option form_group kwargs [Hash] additional attributes added to the form group
@@ -872,14 +873,16 @@ module GOVUKDesignSystemFormBuilder
872
873
  # @example A date input with legend supplied as a proc
873
874
  # = f.govuk_date_field :finishes_on,
874
875
  # legend: -> { tag.h3('Which category do you belong to?') }
875
- def govuk_date_field(attribute_name, hint: {}, legend: {}, caption: {}, date_of_birth: false, omit_day: false, form_group: {}, &block)
876
- Elements::Date.new(self, object_name, attribute_name, hint: hint, legend: legend, caption: caption, date_of_birth: date_of_birth, omit_day: omit_day, form_group: form_group, &block).html
876
+ def govuk_date_field(attribute_name, hint: {}, legend: {}, caption: {}, date_of_birth: false, omit_day: false, form_group: {}, wildcards: false, &block)
877
+ Elements::Date.new(self, object_name, attribute_name, hint: hint, legend: legend, caption: caption, date_of_birth: date_of_birth, omit_day: omit_day, form_group: form_group, wildcards: wildcards, &block).html
877
878
  end
878
879
 
879
880
  # Generates a summary of errors in the form, each linking to the corresponding
880
881
  # part of the form that contains the error
881
882
  #
882
883
  # @param title [String] the error summary heading
884
+ # @param link_base_errors_to [Symbol,String] set the field that errors on +:base+ are linked
885
+ # to, as there won't be a field representing the object base.
883
886
  #
884
887
  # @note Only the first error in the +#errors+ array for each attribute will
885
888
  # be included.
@@ -888,8 +891,8 @@ module GOVUKDesignSystemFormBuilder
888
891
  # = f.govuk_error_summary 'Uh-oh, spaghettios'
889
892
  #
890
893
  # @see https://design-system.service.gov.uk/components/error-summary/ GOV.UK error summary
891
- def govuk_error_summary(title = config.default_error_summary_title)
892
- Elements::ErrorSummary.new(self, object_name, title).html
894
+ def govuk_error_summary(title = config.default_error_summary_title, link_base_errors_to: nil)
895
+ Elements::ErrorSummary.new(self, object_name, title, link_base_errors_to: link_base_errors_to).html
893
896
  end
894
897
 
895
898
  # Generates a fieldset containing the contents of the block
@@ -30,11 +30,22 @@ module GOVUKDesignSystemFormBuilder
30
30
  end
31
31
 
32
32
  def legend_element
33
- @legend_element ||= Elements::Legend.new(@builder, @object_name, @attribute_name, **legend_options)
33
+ @legend_element ||= if @legend.nil?
34
+ Elements::Null.new
35
+ else
36
+ Elements::Legend.new(@builder, @object_name, @attribute_name, **legend_options)
37
+ end
34
38
  end
35
39
 
36
40
  def legend_options
37
- { legend: @legend, caption: @caption }
41
+ case @legend
42
+ when Hash
43
+ @legend.merge(caption: @caption)
44
+ when Proc
45
+ { content: @legend }
46
+ else
47
+ fail(ArgumentError, %(legend must be a Proc or Hash))
48
+ end
38
49
  end
39
50
  end
40
51
  end
@@ -6,6 +6,7 @@ module GOVUKDesignSystemFormBuilder
6
6
 
7
7
  include Traits::Label
8
8
  include Traits::Hint
9
+ include Traits::FieldsetItem
9
10
  include Traits::Conditional
10
11
 
11
12
  def initialize(builder, object_name, attribute_name, value, unchecked_value, label:, hint:, link_errors:, multiple:, &block)
@@ -54,19 +55,7 @@ module GOVUKDesignSystemFormBuilder
54
55
  %w(checkboxes__input).prefix(brand)
55
56
  end
56
57
 
57
- def label_element
58
- @label_element ||= Elements::Label.new(@builder, @object_name, @attribute_name, **label_content, **label_options)
59
- end
60
-
61
- def label_options
62
- { checkbox: true, value: @value, link_errors: @link_errors }
63
- end
64
-
65
- def hint_element
66
- @hint_element ||= Elements::Hint.new(@builder, @object_name, @attribute_name, **hint_options, **hint_content)
67
- end
68
-
69
- def hint_options
58
+ def fieldset_options
70
59
  { checkbox: true }
71
60
  end
72
61
 
@@ -9,7 +9,7 @@ module GOVUKDesignSystemFormBuilder
9
9
 
10
10
  SEGMENTS = { day: '3i', month: '2i', year: '1i' }.freeze
11
11
 
12
- def initialize(builder, object_name, attribute_name, legend:, caption:, hint:, date_of_birth: false, omit_day:, form_group:, &block)
12
+ def initialize(builder, object_name, attribute_name, legend:, caption:, hint:, date_of_birth: false, omit_day:, form_group:, wildcards:, &block)
13
13
  super(builder, object_name, attribute_name, &block)
14
14
 
15
15
  @legend = legend
@@ -18,6 +18,7 @@ module GOVUKDesignSystemFormBuilder
18
18
  @date_of_birth = date_of_birth
19
19
  @omit_day = omit_day
20
20
  @form_group = form_group
21
+ @wildcards = wildcards
21
22
  end
22
23
 
23
24
  def html
@@ -82,13 +83,19 @@ module GOVUKDesignSystemFormBuilder
82
83
  class: classes(width),
83
84
  name: name(segment),
84
85
  type: 'text',
85
- pattern: '[0-9]*',
86
+ pattern: pattern(segment),
86
87
  inputmode: 'numeric',
87
88
  value: value,
88
89
  autocomplete: date_of_birth_autocomplete_value(segment)
89
90
  )
90
91
  end
91
92
 
93
+ def pattern(segment)
94
+ return '[0-9X]*' if @wildcards && segment.in?(%i(day month))
95
+
96
+ '[0-9]*'
97
+ end
98
+
92
99
  def classes(width)
93
100
  %w(input date-input__input).prefix(brand).tap do |classes|
94
101
  classes.push(%(#{brand}-input--width-#{width}))
@@ -3,10 +3,11 @@ module GOVUKDesignSystemFormBuilder
3
3
  class ErrorSummary < Base
4
4
  include Traits::Error
5
5
 
6
- def initialize(builder, object_name, title)
7
- @builder = builder
8
- @object_name = object_name
9
- @title = title
6
+ def initialize(builder, object_name, title, link_base_errors_to:)
7
+ @builder = builder
8
+ @object_name = object_name
9
+ @title = title
10
+ @link_base_errors_to = link_base_errors_to
10
11
  end
11
12
 
12
13
  def html
@@ -54,7 +55,11 @@ module GOVUKDesignSystemFormBuilder
54
55
  end
55
56
 
56
57
  def field_id(attribute)
57
- build_id('field-error', attribute_name: attribute)
58
+ if attribute.eql?(:base) && @link_base_errors_to.present?
59
+ build_id('field', attribute_name: @link_base_errors_to)
60
+ else
61
+ build_id('field-error', attribute_name: attribute)
62
+ end
58
63
  end
59
64
 
60
65
  def summary_title_id
@@ -25,7 +25,7 @@ module GOVUKDesignSystemFormBuilder
25
25
  end
26
26
 
27
27
  def html
28
- return nil unless active?
28
+ return unless active?
29
29
 
30
30
  content_tag(hint_tag, **hint_options, **@html_attributes) { hint_body }
31
31
  end
@@ -4,46 +4,39 @@ module GOVUKDesignSystemFormBuilder
4
4
  include Traits::Caption
5
5
  include Traits::Localisation
6
6
 
7
- def initialize(builder, object_name, attribute_name, legend:, caption:, **kwargs)
7
+ def initialize(builder, object_name, attribute_name, text: nil, size: config.default_legend_size, hidden: false, tag: config.default_legend_tag, caption: nil, content: nil, **kwargs)
8
8
  super(builder, object_name, attribute_name)
9
9
 
10
- @html_attributes = kwargs
11
-
12
- case legend
13
- when NilClass
14
- # do nothing
15
- when Proc
16
- @raw = capture { legend.call }
17
- when Hash
18
- defaults.merge(legend).tap do |l|
19
- @text = retrieve_text(l.dig(:text))
20
- @hidden = l.dig(:hidden)
21
- @tag = l.dig(:tag)
22
- @size = l.dig(:size)
23
- @caption = caption
24
- end
10
+ if content
11
+ @content = capture { content.call }
25
12
  else
26
- fail(ArgumentError, %(legend must be a NilClass, Proc or Hash))
13
+ @text = retrieve_text(text)
14
+ @tag = tag
15
+ @size_class = size_class(size)
16
+ @tag = tag
17
+ @caption = caption
18
+ @hidden = hidden
19
+ @html_attributes = kwargs
27
20
  end
28
21
  end
29
22
 
30
23
  def html
31
- @raw || content
24
+ @content || legend
32
25
  end
33
26
 
34
27
  private
35
28
 
36
29
  def active?
37
- [@text, @raw].any?(&:present?)
30
+ [@text, @content].any?(&:present?)
38
31
  end
39
32
 
40
- def content
33
+ def legend
41
34
  return unless active?
42
35
 
43
- tag.legend(legend_text, class: classes, **@html_attributes)
36
+ tag.legend(legend_content, class: classes, **@html_attributes)
44
37
  end
45
38
 
46
- def legend_text
39
+ def legend_content
47
40
  caption_and_text = safe_join([caption_element, @text])
48
41
 
49
42
  if @tag.present?
@@ -58,17 +51,14 @@ module GOVUKDesignSystemFormBuilder
58
51
  end
59
52
 
60
53
  def classes
61
- [%(#{brand}-fieldset__legend), size_class, visually_hidden_class].compact
54
+ [%(#{brand}-fieldset__legend), @size_class, visually_hidden_class].compact
62
55
  end
63
56
 
64
- def size_class
65
- case @size
66
- when 'xl' then %(#{brand}-fieldset__legend--xl)
67
- when 'l' then %(#{brand}-fieldset__legend--l)
68
- when 'm' then %(#{brand}-fieldset__legend--m)
69
- when 's' then %(#{brand}-fieldset__legend--s)
57
+ def size_class(size)
58
+ if size.in?(%w(xl l m s))
59
+ %(#{brand}-fieldset__legend--#{size})
70
60
  else
71
- fail "invalid size '#{@size}', must be xl, l, m or s"
61
+ fail "invalid size '#{size}', must be xl, l, m or s"
72
62
  end
73
63
  end
74
64
 
@@ -79,15 +69,6 @@ module GOVUKDesignSystemFormBuilder
79
69
  def heading_classes
80
70
  %(#{brand}-fieldset__heading)
81
71
  end
82
-
83
- def defaults
84
- {
85
- hidden: false,
86
- text: nil,
87
- tag: config.default_legend_tag,
88
- size: config.default_legend_size
89
- }
90
- end
91
72
  end
92
73
  end
93
74
  end
@@ -0,0 +1,19 @@
1
+ module GOVUKDesignSystemFormBuilder
2
+ module Elements
3
+ class Null < Base
4
+ def initialize; end
5
+
6
+ def html
7
+ nil
8
+ end
9
+
10
+ def active?
11
+ false
12
+ end
13
+
14
+ def hint_id
15
+ nil
16
+ end
17
+ end
18
+ end
19
+ end
@@ -6,6 +6,7 @@ module GOVUKDesignSystemFormBuilder
6
6
 
7
7
  include Traits::Label
8
8
  include Traits::Hint
9
+ include Traits::FieldsetItem
9
10
  include Traits::Conditional
10
11
 
11
12
  def initialize(builder, object_name, attribute_name, value, label:, hint:, link_errors:, &block)
@@ -34,26 +35,10 @@ module GOVUKDesignSystemFormBuilder
34
35
  end
35
36
  end
36
37
 
37
- def radio_options
38
+ def fieldset_options
38
39
  { radio: true }
39
40
  end
40
41
 
41
- def label_element
42
- @label_element ||= Elements::Label.new(@builder, @object_name, @attribute_name, **label_content, **label_options)
43
- end
44
-
45
- def label_options
46
- { value: @value, link_errors: @link_errors }.merge(radio_options)
47
- end
48
-
49
- def hint_element
50
- @hint_element ||= Elements::Hint.new(@builder, @object_name, @attribute_name, **hint_options, **hint_content)
51
- end
52
-
53
- def hint_options
54
- { value: @value }.merge(radio_options)
55
- end
56
-
57
42
  def input
58
43
  @builder.radio_button(@attribute_name, @value, **options)
59
44
  end
@@ -4,11 +4,11 @@ module GOVUKDesignSystemFormBuilder
4
4
  private
5
5
 
6
6
  def caption_element
7
- @caption_element ||= Elements::Caption.new(@builder, @object_name, @attribute_name, **caption_options)
8
- end
9
-
10
- def caption_options
11
- @caption
7
+ @caption_element ||= if @caption.nil?
8
+ Elements::Null.new
9
+ else
10
+ Elements::Caption.new(@builder, @object_name, @attribute_name, **@caption)
11
+ end
12
12
  end
13
13
  end
14
14
  end
@@ -0,0 +1,31 @@
1
+ module GOVUKDesignSystemFormBuilder
2
+ module Traits
3
+ module FieldsetItem
4
+ private
5
+
6
+ def label_element
7
+ @label_element ||= if @label.nil?
8
+ Elements::Null.new
9
+ else
10
+ Elements::Label.new(@builder, @object_name, @attribute_name, **label_content, **label_options)
11
+ end
12
+ end
13
+
14
+ def label_options
15
+ { value: @value, link_errors: @link_errors }.merge(fieldset_options)
16
+ end
17
+
18
+ def hint_element
19
+ @hint_element ||= if @hint.nil?
20
+ Elements::Null.new
21
+ else
22
+ Elements::Hint.new(@builder, @object_name, @attribute_name, **hint_options, **hint_content)
23
+ end
24
+ end
25
+
26
+ def hint_options
27
+ { value: @value }.merge(fieldset_options)
28
+ end
29
+ end
30
+ end
31
+ end
@@ -10,13 +10,15 @@ module GOVUKDesignSystemFormBuilder
10
10
  private
11
11
 
12
12
  def hint_element
13
- @hint_element ||= Elements::Hint.new(@builder, @object_name, @attribute_name, **hint_content)
13
+ @hint_element ||= if @hint.nil?
14
+ Elements::Null.new
15
+ else
16
+ Elements::Hint.new(@builder, @object_name, @attribute_name, **hint_content)
17
+ end
14
18
  end
15
19
 
16
20
  def hint_content
17
21
  case @hint
18
- when NilClass
19
- {}
20
22
  when Hash
21
23
  @hint
22
24
  when Proc
@@ -4,7 +4,11 @@ module GOVUKDesignSystemFormBuilder
4
4
  private
5
5
 
6
6
  def label_element
7
- @label_element ||= Elements::Label.new(@builder, @object_name, @attribute_name, caption: @caption, **label_content)
7
+ @label_element ||= if @label.nil?
8
+ Elements::Null.new
9
+ else
10
+ Elements::Label.new(@builder, @object_name, @attribute_name, caption: @caption, **label_content)
11
+ end
8
12
  end
9
13
 
10
14
  def label_content
@@ -1,3 +1,3 @@
1
1
  module GOVUKDesignSystemFormBuilder
2
- VERSION = '2.1.0'.freeze
2
+ VERSION = '2.1.5'.freeze
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: govuk_design_system_formbuilder
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.1.0
4
+ version: 2.1.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Peter Yates
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-10-03 00:00:00.000000000 Z
11
+ date: 2020-11-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: actionview
@@ -58,14 +58,14 @@ dependencies:
58
58
  requirements:
59
59
  - - '='
60
60
  - !ruby/object:Gem::Version
61
- version: 3.17.0
61
+ version: 3.17.2
62
62
  type: :development
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
66
  - - '='
67
67
  - !ruby/object:Gem::Version
68
- version: 3.17.0
68
+ version: 3.17.2
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: pry
71
71
  requirement: !ruby/object:Gem::Requirement
@@ -176,14 +176,14 @@ dependencies:
176
176
  requirements:
177
177
  - - "~>"
178
178
  - !ruby/object:Gem::Version
179
- version: 3.23.0
179
+ version: 3.24.0
180
180
  type: :development
181
181
  prerelease: false
182
182
  version_requirements: !ruby/object:Gem::Requirement
183
183
  requirements:
184
184
  - - "~>"
185
185
  - !ruby/object:Gem::Version
186
- version: 3.23.0
186
+ version: 3.24.0
187
187
  - !ruby/object:Gem::Dependency
188
188
  name: rubypants
189
189
  requirement: !ruby/object:Gem::Requirement
@@ -278,6 +278,7 @@ files:
278
278
  - lib/govuk_design_system_formbuilder/elements/inputs/url.rb
279
279
  - lib/govuk_design_system_formbuilder/elements/label.rb
280
280
  - lib/govuk_design_system_formbuilder/elements/legend.rb
281
+ - lib/govuk_design_system_formbuilder/elements/null.rb
281
282
  - lib/govuk_design_system_formbuilder/elements/radios/collection.rb
282
283
  - lib/govuk_design_system_formbuilder/elements/radios/collection_radio_button.rb
283
284
  - lib/govuk_design_system_formbuilder/elements/radios/fieldset_radio_button.rb
@@ -288,6 +289,7 @@ files:
288
289
  - lib/govuk_design_system_formbuilder/traits/collection_item.rb
289
290
  - lib/govuk_design_system_formbuilder/traits/conditional.rb
290
291
  - lib/govuk_design_system_formbuilder/traits/error.rb
292
+ - lib/govuk_design_system_formbuilder/traits/fieldset_item.rb
291
293
  - lib/govuk_design_system_formbuilder/traits/hint.rb
292
294
  - lib/govuk_design_system_formbuilder/traits/input.rb
293
295
  - lib/govuk_design_system_formbuilder/traits/label.rb