govuk_design_system_formbuilder 1.2.3 → 1.2.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (24) hide show
  1. checksums.yaml +4 -4
  2. data/lib/govuk_design_system_formbuilder/builder.rb +3 -0
  3. data/lib/govuk_design_system_formbuilder/containers/character_count.rb +8 -7
  4. data/lib/govuk_design_system_formbuilder/containers/check_boxes.rb +8 -1
  5. data/lib/govuk_design_system_formbuilder/containers/check_boxes_fieldset.rb +9 -1
  6. data/lib/govuk_design_system_formbuilder/containers/fieldset.rb +21 -11
  7. data/lib/govuk_design_system_formbuilder/containers/radio_buttons_fieldset.rb +9 -1
  8. data/lib/govuk_design_system_formbuilder/containers/radios.rb +8 -1
  9. data/lib/govuk_design_system_formbuilder/containers/supplemental.rb +1 -3
  10. data/lib/govuk_design_system_formbuilder/elements/check_boxes/collection.rb +9 -1
  11. data/lib/govuk_design_system_formbuilder/elements/check_boxes/fieldset_check_box.rb +5 -1
  12. data/lib/govuk_design_system_formbuilder/elements/date.rb +37 -31
  13. data/lib/govuk_design_system_formbuilder/elements/hint.rb +10 -10
  14. data/lib/govuk_design_system_formbuilder/elements/label.rb +19 -15
  15. data/lib/govuk_design_system_formbuilder/elements/radios/collection.rb +9 -1
  16. data/lib/govuk_design_system_formbuilder/elements/radios/collection_radio_button.rb +11 -1
  17. data/lib/govuk_design_system_formbuilder/elements/radios/fieldset_radio_button.rb +6 -2
  18. data/lib/govuk_design_system_formbuilder/elements/select.rb +10 -6
  19. data/lib/govuk_design_system_formbuilder/elements/submit.rb +3 -3
  20. data/lib/govuk_design_system_formbuilder/elements/text_area.rb +23 -18
  21. data/lib/govuk_design_system_formbuilder/traits/input.rb +6 -6
  22. data/lib/govuk_design_system_formbuilder/traits/label.rb +2 -2
  23. data/lib/govuk_design_system_formbuilder/version.rb +1 -1
  24. metadata +8 -8
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: b04804863d4a75157988de721c6fda535eb35df444b8a99a8830b7b9758f8e03
4
- data.tar.gz: 162d14ae3760447cf707bc89195daa2a66ca104265258d751b1082325ed56aa8
3
+ metadata.gz: 5d0ec456d05c0f92a86c39b688f0ac2a498160f473002f2fb4004567f4b17496
4
+ data.tar.gz: 0aa054ef3feb33eaf5b402aaea08ab2942e9b9be6708f04de41c1255e455dc86
5
5
  SHA512:
6
- metadata.gz: 71814ceeaf1bb257102a0b4f3e04675bf44aa10a3b85837420d30295bf1b77e9f63c6498dc6d0a8560c5cfb7abcecd7ec057d7ce73a7b2f0f682849eae71a7ba
7
- data.tar.gz: 16d9e596f3a56b25a5413aed0b996d1965cd0be1a2fb6653217cea9b41b1334f9918a75f71ea0f6ba51844b617bd0a2a3a0686c4c8fb34f05b999afce50f8f67
6
+ metadata.gz: 8a79e3ac6187857d917f7eb253abfbb414b8ed44a3a4488a29f82052ca234daeba9f1926a0df12697544fa266420ebe8eba8ab26840fe8d371b713d82c2df312
7
+ data.tar.gz: 1334ddb5eb6a36dfbcd5b8f91b50548ecfac38481682e683aec5071d2f91b7577f3cadd532c8dd8c1b1c5dba34fa837479ef55d5f63669b15756159e5b9fb5aa
@@ -312,7 +312,10 @@ module GOVUKDesignSystemFormBuilder
312
312
  # @option label size [String] the size of the label font, can be +xl+, +l+, +m+, +s+ or nil
313
313
  # @option label tag [Symbol,String] the label's wrapper tag, intended to allow labels to act as page headings
314
314
  # @option label hidden [Boolean] control the visability of the label. Hidden labels will stil be read by screenreaders
315
+ # @param options [Hash] Options hash passed through to Rails' +collection_select+ helper
316
+ # @param html_options [Hash] HTML Options hash passed through to Rails' +collection_select+ helper
315
317
  # @param block [Block] arbitrary HTML that will be rendered between the hint and the input
318
+ # @see https://api.rubyonrails.org/classes/ActionView/Helpers/FormOptionsHelper.html#method-i-collection_select Rails collection_select (called by govuk_collection_select)
316
319
  # @return [ActiveSupport::SafeBuffer] HTML output
317
320
  #
318
321
  # @example A select box with hint
@@ -14,17 +14,18 @@ module GOVUKDesignSystemFormBuilder
14
14
  def html
15
15
  return yield unless limit?
16
16
 
17
- content_tag(
18
- 'div',
19
- class: %(#{brand}-character-count),
20
- data: { module: %(#{brand}-character-count) }.merge(**limit, **threshold).compact
21
- ) do
22
- yield
23
- end
17
+ content_tag('div', **character_count_options) { yield }
24
18
  end
25
19
 
26
20
  private
27
21
 
22
+ def character_count_options
23
+ {
24
+ class: %(#{brand}-character-count),
25
+ data: { module: %(#{brand}-character-count) }.merge(**limit, **threshold).compact
26
+ }
27
+ end
28
+
28
29
  def limit
29
30
  if @max_words
30
31
  { maxwords: @max_words }
@@ -10,13 +10,20 @@ module GOVUKDesignSystemFormBuilder
10
10
  end
11
11
 
12
12
  def html
13
- content_tag('div', class: check_boxes_classes, data: { module: %(#{brand}-checkboxes) }) do
13
+ content_tag('div', **check_boxes_options) do
14
14
  yield
15
15
  end
16
16
  end
17
17
 
18
18
  private
19
19
 
20
+ def check_boxes_options
21
+ {
22
+ class: check_boxes_classes,
23
+ data: { module: %(#{brand}-checkboxes) }
24
+ }
25
+ end
26
+
20
27
  def check_boxes_classes
21
28
  %w(checkboxes).prefix(brand).tap do |c|
22
29
  c.push(%(#{brand}-checkboxes--small)) if @small
@@ -17,7 +17,7 @@ module GOVUKDesignSystemFormBuilder
17
17
 
18
18
  def html
19
19
  Containers::FormGroup.new(@builder, @object_name, @attribute_name).html do
20
- Containers::Fieldset.new(@builder, @object_name, @attribute_name, legend: @legend, caption: @caption, described_by: [error_element.error_id, hint_element.hint_id]).html do
20
+ Containers::Fieldset.new(@builder, @object_name, @attribute_name, **fieldset_options).html do
21
21
  safe_join([hint_element, error_element, checkboxes])
22
22
  end
23
23
  end
@@ -25,6 +25,14 @@ module GOVUKDesignSystemFormBuilder
25
25
 
26
26
  private
27
27
 
28
+ def fieldset_options
29
+ {
30
+ legend: @legend,
31
+ caption: @caption,
32
+ described_by: [error_element.error_id, hint_element.hint_id]
33
+ }
34
+ end
35
+
28
36
  def checkboxes
29
37
  Containers::CheckBoxes.new(@builder, small: @small, classes: @classes).html do
30
38
  @block_content
@@ -26,18 +26,29 @@ module GOVUKDesignSystemFormBuilder
26
26
  end
27
27
 
28
28
  def html
29
- content_tag('fieldset', class: fieldset_classes, aria: { describedby: @described_by }) do
30
- safe_join([legend_content, (@block_content || yield)])
29
+ content_tag('fieldset', **fieldset_options) do
30
+ safe_join([legend, (@block_content || yield)])
31
31
  end
32
32
  end
33
33
 
34
34
  private
35
35
 
36
- def legend_content
37
- @legend_raw || legend
36
+ def fieldset_options
37
+ {
38
+ class: fieldset_classes,
39
+ aria: { describedby: @described_by }
40
+ }
41
+ end
42
+
43
+ def fieldset_classes
44
+ %w(fieldset).prefix(brand)
38
45
  end
39
46
 
40
47
  def legend
48
+ @legend_raw || legend_content
49
+ end
50
+
51
+ def legend_content
41
52
  if legend_text.present?
42
53
  content_tag('legend', class: legend_classes) do
43
54
  content_tag(@legend_options.dig(:tag), class: legend_heading_classes) do
@@ -48,18 +59,17 @@ module GOVUKDesignSystemFormBuilder
48
59
  end
49
60
 
50
61
  def legend_text
51
- [@legend_options.dig(:text), localised_text(:legend)].compact.first
62
+ @legend_options.dig(:text) || localised_text(:legend)
52
63
  end
53
64
 
54
- def fieldset_classes
55
- %w(fieldset).prefix(brand)
65
+ def legend_size
66
+ @legend_options.dig(:size).tap do |size|
67
+ fail "invalid size '#{size}', must be #{LEGEND_SIZES.join(', ')}" unless size.in?(LEGEND_SIZES)
68
+ end
56
69
  end
57
70
 
58
71
  def legend_classes
59
- size = @legend_options.dig(:size)
60
- fail "invalid size '#{size}', must be #{LEGEND_SIZES.join(', ')}" unless size.in?(LEGEND_SIZES)
61
-
62
- [%(fieldset__legend), %(fieldset__legend--#{size})].prefix(brand).tap do |classes|
72
+ [%(fieldset__legend), %(fieldset__legend--#{legend_size})].prefix(brand).tap do |classes|
63
73
  classes.push(%(#{brand}-visually-hidden)) if @legend_options.dig(:hidden)
64
74
  end
65
75
  end
@@ -18,7 +18,7 @@ module GOVUKDesignSystemFormBuilder
18
18
 
19
19
  def html
20
20
  Containers::FormGroup.new(@builder, @object_name, @attribute_name).html do
21
- Containers::Fieldset.new(@builder, @object_name, @attribute_name, legend: @legend, caption: @caption, described_by: [error_element.error_id, hint_element.hint_id]).html do
21
+ Containers::Fieldset.new(@builder, @object_name, @attribute_name, **fieldset_options).html do
22
22
  safe_join([hint_element, error_element, radios])
23
23
  end
24
24
  end
@@ -26,6 +26,14 @@ module GOVUKDesignSystemFormBuilder
26
26
 
27
27
  private
28
28
 
29
+ def fieldset_options
30
+ {
31
+ legend: @legend,
32
+ caption: @caption,
33
+ described_by: [error_element.error_id, hint_element.hint_id]
34
+ }
35
+ end
36
+
29
37
  def radios
30
38
  Containers::Radios.new(@builder, inline: @inline, small: @small, classes: @classes).html do
31
39
  @block_content
@@ -13,13 +13,20 @@ module GOVUKDesignSystemFormBuilder
13
13
  end
14
14
 
15
15
  def html
16
- content_tag('div', class: radios_classes, data: { module: %(#{brand}-radios) }) do
16
+ content_tag('div', **radios_options) do
17
17
  yield
18
18
  end
19
19
  end
20
20
 
21
21
  private
22
22
 
23
+ def radios_options
24
+ {
25
+ class: radios_classes,
26
+ data: { module: %(#{brand}-radios) }
27
+ }
28
+ end
29
+
23
30
  def radios_classes
24
31
  %w(radios).prefix(brand).tap do |c|
25
32
  c.push(%(#{brand}-radios--inline)) if @inline
@@ -10,9 +10,7 @@ module GOVUKDesignSystemFormBuilder
10
10
  def html
11
11
  return nil if @content.blank?
12
12
 
13
- content_tag('div', id: supplemental_id) do
14
- @content
15
- end
13
+ content_tag('div', id: supplemental_id) { @content }
16
14
  end
17
15
 
18
16
  def supplemental_id
@@ -22,7 +22,7 @@ module GOVUKDesignSystemFormBuilder
22
22
 
23
23
  def html
24
24
  Containers::FormGroup.new(@builder, @object_name, @attribute_name).html do
25
- Containers::Fieldset.new(@builder, @object_name, @attribute_name, legend: @legend, caption: @caption, described_by: [error_id, hint_id, supplemental_id]).html do
25
+ Containers::Fieldset.new(@builder, @object_name, @attribute_name, **fieldset_options).html do
26
26
  safe_join([supplemental_content, hint_element, error_element, check_boxes])
27
27
  end
28
28
  end
@@ -30,6 +30,14 @@ module GOVUKDesignSystemFormBuilder
30
30
 
31
31
  private
32
32
 
33
+ def fieldset_options
34
+ {
35
+ legend: @legend,
36
+ caption: @caption,
37
+ described_by: [error_id, hint_id, supplemental_id]
38
+ }
39
+ end
40
+
33
41
  def check_boxes
34
42
  Containers::CheckBoxes.new(@builder, small: @small, classes: @classes).html do
35
43
  collection
@@ -50,7 +50,11 @@ module GOVUKDesignSystemFormBuilder
50
50
  end
51
51
 
52
52
  def label_element
53
- @label_element ||= Elements::Label.new(@builder, @object_name, @attribute_name, checkbox: true, value: @value, link_errors: @link_errors, **label_options)
53
+ @label_element ||= Elements::Label.new(@builder, @object_name, @attribute_name, **label_content, **label_options)
54
+ end
55
+
56
+ def label_options
57
+ { checkbox: true, value: @value, link_errors: @link_errors }
54
58
  end
55
59
 
56
60
  def hint_element
@@ -21,7 +21,7 @@ module GOVUKDesignSystemFormBuilder
21
21
 
22
22
  def html
23
23
  Containers::FormGroup.new(@builder, @object_name, @attribute_name).html do
24
- Containers::Fieldset.new(@builder, @object_name, @attribute_name, legend: @legend, caption: @caption, described_by: [error_id, hint_id, supplemental_id]).html do
24
+ Containers::Fieldset.new(@builder, @object_name, @attribute_name, **fieldset_options).html do
25
25
  safe_join([supplemental_content, hint_element, error_element, date])
26
26
  end
27
27
  end
@@ -29,6 +29,10 @@ module GOVUKDesignSystemFormBuilder
29
29
 
30
30
  private
31
31
 
32
+ def fieldset_options
33
+ { legend: @legend, caption: @caption, described_by: [error_id, hint_id, supplemental_id] }
34
+ end
35
+
32
36
  def date
33
37
  content_tag('div', class: %(#{brand}-date-input)) do
34
38
  safe_join([day, month, year])
@@ -42,61 +46,63 @@ module GOVUKDesignSystemFormBuilder
42
46
  def day
43
47
  return nil if omit_day?
44
48
 
45
- date_part_input(:day, link_errors: true)
49
+ date_part(:day, width: 2, link_errors: true)
46
50
  end
47
51
 
48
52
  def month
49
- date_part_input(:month, link_errors: omit_day?)
53
+ date_part(:month, width: 2, link_errors: omit_day?)
50
54
  end
51
55
 
52
56
  def year
53
- date_part_input(:year, width: 4)
57
+ date_part(:year, width: 4)
54
58
  end
55
59
 
56
- def date_part_input(segment, width: 2, link_errors: false)
60
+ def date_part(segment, width:, link_errors: false)
57
61
  value = @builder.object.try(@attribute_name).try(segment)
58
62
 
59
63
  content_tag('div', class: %w(date-input__item).prefix(brand)) do
60
64
  content_tag('div', class: %w(form-group).prefix(brand)) do
61
- safe_join(
62
- [
63
- tag.label(
64
- segment.capitalize,
65
- class: date_part_label_classes,
66
- for: date_part_attribute_id(segment, link_errors)
67
- ),
68
-
69
- tag.input(
70
- id: date_part_attribute_id(segment, link_errors),
71
- class: date_part_input_classes(width),
72
- name: date_part_attribute_name(segment),
73
- type: 'text',
74
- pattern: '[0-9]*',
75
- inputmode: 'numeric',
76
- value: value,
77
- autocomplete: date_of_birth_autocomplete_value(segment)
78
- )
79
- ]
80
- )
65
+ safe_join([label(segment, link_errors), input(segment, link_errors, width, value)])
81
66
  end
82
67
  end
83
68
  end
84
69
 
85
- def date_part_input_classes(width)
70
+ def label(segment, link_errors)
71
+ tag.label(
72
+ segment.capitalize,
73
+ class: label_classes,
74
+ for: input_id(segment, link_errors)
75
+ )
76
+ end
77
+
78
+ def input(segment, link_errors, width, value)
79
+ tag.input(
80
+ id: input_id(segment, link_errors),
81
+ class: input_classes(width),
82
+ name: input_name(segment),
83
+ type: 'text',
84
+ pattern: '[0-9]*',
85
+ inputmode: 'numeric',
86
+ value: value,
87
+ autocomplete: date_of_birth_autocomplete_value(segment)
88
+ )
89
+ end
90
+
91
+ def input_classes(width)
86
92
  %w(input date-input__input).prefix(brand).tap do |classes|
87
93
  classes.push(%(#{brand}-input--width-#{width}))
88
94
  classes.push(%(#{brand}-input--error)) if has_errors?
89
95
  end
90
96
  end
91
97
 
92
- def date_part_label_classes
98
+ def label_classes
93
99
  %w(label date-input__label).prefix(brand)
94
100
  end
95
101
 
96
102
  # if the field has errors we want the govuk_error_summary to
97
103
  # be able to link to the day field. Otherwise, generate IDs
98
104
  # in the normal fashion
99
- def date_part_attribute_id(segment, link_errors)
105
+ def input_id(segment, link_errors)
100
106
  if has_errors? && link_errors
101
107
  field_id(link_errors: link_errors)
102
108
  else
@@ -104,11 +110,11 @@ module GOVUKDesignSystemFormBuilder
104
110
  end
105
111
  end
106
112
 
107
- def date_part_attribute_name(segment)
113
+ def input_name(segment)
108
114
  format(
109
- "%<object_name>s[%<attribute_name>s(%<segment>s)]",
115
+ "%<object_name>s[%<input_name>s(%<segment>s)]",
110
116
  object_name: @object_name,
111
- attribute_name: @attribute_name,
117
+ input_name: @attribute_name,
112
118
  segment: SEGMENTS.fetch(segment)
113
119
  )
114
120
  end
@@ -9,10 +9,10 @@ module GOVUKDesignSystemFormBuilder
9
9
  def initialize(builder, object_name, attribute_name, text, value = nil, radio: false, checkbox: false)
10
10
  super(builder, object_name, attribute_name)
11
11
 
12
- @value = value
13
- @hint_text = hint_text(text)
14
- @radio_class = radio_class(radio)
15
- @checkbox_class = checkbox_class(checkbox)
12
+ @value = value
13
+ @hint_text = hint_text(text)
14
+ @radio = radio
15
+ @checkbox = checkbox
16
16
  end
17
17
 
18
18
  def html
@@ -24,19 +24,19 @@ module GOVUKDesignSystemFormBuilder
24
24
  private
25
25
 
26
26
  def hint_text(supplied)
27
- [supplied.presence, localised_text(:hint)].compact.first
27
+ supplied.presence || localised_text(:hint)
28
28
  end
29
29
 
30
30
  def hint_classes
31
- %w(hint).prefix(brand).push(@radio_class, @checkbox_class).compact
31
+ %w(hint).prefix(brand).push(radio_class, checkbox_class).compact
32
32
  end
33
33
 
34
- def radio_class(radio)
35
- radio ? %(#{brand}-radios__hint) : nil
34
+ def radio_class
35
+ @radio ? %(#{brand}-radios__hint) : nil
36
36
  end
37
37
 
38
- def checkbox_class(checkbox)
39
- checkbox ? %(#{brand}-checkboxes__hint) : nil
38
+ def checkbox_class
39
+ @checkbox ? %(#{brand}-checkboxes__hint) : nil
40
40
  end
41
41
  end
42
42
  end
@@ -14,14 +14,14 @@ module GOVUKDesignSystemFormBuilder
14
14
  if content
15
15
  @content = content.call
16
16
  else
17
- @value = value # used by field_id
18
- @text = label_text(text, hidden)
19
- @size_class = label_size_class(size)
20
- @radio_class = radio_class(radio)
21
- @checkbox_class = checkbox_class(checkbox)
22
- @tag = tag
23
- @link_errors = link_errors
24
- @caption = caption
17
+ @value = value # used by field_id
18
+ @text = label_text(text, hidden)
19
+ @size_class = label_size_class(size)
20
+ @radio = radio
21
+ @checkbox = checkbox
22
+ @tag = tag
23
+ @link_errors = link_errors
24
+ @caption = caption
25
25
  end
26
26
  end
27
27
 
@@ -38,7 +38,7 @@ module GOVUKDesignSystemFormBuilder
38
38
  private
39
39
 
40
40
  def label
41
- @builder.label(@attribute_name, label_options) do
41
+ @builder.label(@attribute_name, **label_options) do
42
42
  @content || safe_join([caption, @text])
43
43
  end
44
44
  end
@@ -57,20 +57,24 @@ module GOVUKDesignSystemFormBuilder
57
57
  {
58
58
  value: @value,
59
59
  for: field_id(link_errors: @link_errors),
60
- class: %w(label).prefix(brand).push(@size_class, @weight_class, @radio_class, @checkbox_class).compact
60
+ class: %w(label).prefix(brand).push(@size_class, @weight_class, radio_class, checkbox_class).compact
61
61
  }
62
62
  end
63
63
 
64
64
  def caption
65
- caption_element.html unless [@radio_class, @checkbox_class].any?
65
+ caption_element.html unless [@radio, @checkbox].any?
66
66
  end
67
67
 
68
- def radio_class(radio)
69
- radio ? %(#{brand}-radios__label) : nil
68
+ def radio_class
69
+ return nil unless @radio
70
+
71
+ %(#{brand}-radios__label)
70
72
  end
71
73
 
72
- def checkbox_class(checkbox)
73
- checkbox ? %(#{brand}-checkboxes__label) : nil
74
+ def checkbox_class
75
+ return nil unless @checkbox
76
+
77
+ %(#{brand}-checkboxes__label)
74
78
  end
75
79
 
76
80
  def label_size_class(size)
@@ -24,7 +24,7 @@ module GOVUKDesignSystemFormBuilder
24
24
 
25
25
  def html
26
26
  Containers::FormGroup.new(@builder, @object_name, @attribute_name).html do
27
- Containers::Fieldset.new(@builder, @object_name, @attribute_name, legend: @legend, caption: @caption, described_by: [error_id, hint_id, supplemental_id]).html do
27
+ Containers::Fieldset.new(@builder, @object_name, @attribute_name, **fieldset_options).html do
28
28
  safe_join([supplemental_content, hint_element, error_element, radios])
29
29
  end
30
30
  end
@@ -32,6 +32,14 @@ module GOVUKDesignSystemFormBuilder
32
32
 
33
33
  private
34
34
 
35
+ def fieldset_options
36
+ {
37
+ legend: @legend,
38
+ caption: @caption,
39
+ described_by: [error_id, hint_id, supplemental_id]
40
+ }
41
+ end
42
+
35
43
  def radios
36
44
  Containers::Radios.new(@builder, inline: @inline, small: @small, classes: @classes).html do
37
45
  safe_join(collection)
@@ -47,7 +47,17 @@ module GOVUKDesignSystemFormBuilder
47
47
  end
48
48
 
49
49
  def label_element
50
- @label_element ||= Elements::Label.new(@builder, @object_name, @attribute_name, text: @label_text, value: @value, radio: true, size: label_size, link_errors: @link_errors)
50
+ @label_element ||= Elements::Label.new(@builder, @object_name, @attribute_name, **label_options)
51
+ end
52
+
53
+ def label_options
54
+ {
55
+ text: @label_text,
56
+ value: @value,
57
+ radio: true,
58
+ size: label_size,
59
+ link_errors: @link_errors
60
+ }
51
61
  end
52
62
 
53
63
  def label_size
@@ -35,7 +35,11 @@ module GOVUKDesignSystemFormBuilder
35
35
  end
36
36
 
37
37
  def label_element
38
- @label_element ||= Elements::Label.new(@builder, @object_name, @attribute_name, radio: true, value: @value, link_errors: @link_errors, **label_options)
38
+ @label_element ||= Elements::Label.new(@builder, @object_name, @attribute_name, **label_content, **label_options)
39
+ end
40
+
41
+ def label_options
42
+ { radio: true, value: @value, link_errors: @link_errors }
39
43
  end
40
44
 
41
45
  def hint_element
@@ -43,7 +47,7 @@ module GOVUKDesignSystemFormBuilder
43
47
  end
44
48
 
45
49
  def input
46
- @builder.radio_button(@attribute_name, @value, input_options)
50
+ @builder.radio_button(@attribute_name, @value, **input_options)
47
51
  end
48
52
 
49
53
  def input_options
@@ -1,8 +1,6 @@
1
1
  module GOVUKDesignSystemFormBuilder
2
2
  module Elements
3
3
  class Select < Base
4
- using PrefixableArray
5
-
6
4
  include Traits::Error
7
5
  include Traits::Label
8
6
  include Traits::Hint
@@ -30,7 +28,7 @@ module GOVUKDesignSystemFormBuilder
30
28
  private
31
29
 
32
30
  def select
33
- @builder.collection_select(@attribute_name, @collection, @value_method, @text_method, @options, select_options)
31
+ @builder.collection_select(@attribute_name, @collection, @value_method, @text_method, @options, **select_options)
34
32
  end
35
33
 
36
34
  def select_options
@@ -42,9 +40,15 @@ module GOVUKDesignSystemFormBuilder
42
40
  end
43
41
 
44
42
  def select_classes
45
- %w(select).prefix(brand).tap do |classes|
46
- classes.push(%(#{brand}-select--error)) if has_errors?
47
- end
43
+ [%(#{brand}-select), select_error_class, select_custom_classes].flatten.compact
44
+ end
45
+
46
+ def select_error_class
47
+ %(#{brand}-select--error) if has_errors?
48
+ end
49
+
50
+ def select_custom_classes
51
+ @html_options.dig(:class)
48
52
  end
49
53
  end
50
54
  end
@@ -30,7 +30,7 @@ module GOVUKDesignSystemFormBuilder
30
30
  def submit_classes
31
31
  %w(button)
32
32
  .prefix(brand)
33
- .push(warning_class, secondary_class, disabled_class, @classes, padding_class(@block_content.present?))
33
+ .push(warning_class, secondary_class, disabled_class, padding_class, @classes)
34
34
  .compact
35
35
  end
36
36
 
@@ -53,8 +53,8 @@ module GOVUKDesignSystemFormBuilder
53
53
  %(#{brand}-button--secondary) if @secondary
54
54
  end
55
55
 
56
- def padding_class(content_present)
57
- %(#{brand}-!-margin-right-1) if content_present
56
+ def padding_class
57
+ %(#{brand}-!-margin-right-1) if @block_content
58
58
  end
59
59
 
60
60
  def disabled_class
@@ -11,18 +11,18 @@ module GOVUKDesignSystemFormBuilder
11
11
  def initialize(builder, object_name, attribute_name, hint_text:, label:, caption:, rows:, max_words:, max_chars:, threshold:, **kwargs, &block)
12
12
  super(builder, object_name, attribute_name, &block)
13
13
 
14
- @label = label
15
- @caption = caption
16
- @hint_text = hint_text
17
- @attributes = kwargs
18
- @max_words = max_words
19
- @max_chars = max_chars
20
- @threshold = threshold
21
- @rows = rows
14
+ @label = label
15
+ @caption = caption
16
+ @hint_text = hint_text
17
+ @max_words = max_words
18
+ @max_chars = max_chars
19
+ @threshold = threshold
20
+ @rows = rows
21
+ @html_attributes = kwargs
22
22
  end
23
23
 
24
24
  def html
25
- Containers::CharacterCount.new(@builder, max_words: @max_words, max_chars: @max_chars, threshold: @threshold).html do
25
+ Containers::CharacterCount.new(@builder, **character_count_options).html do
26
26
  Containers::FormGroup.new(@builder, @object_name, @attribute_name).html do
27
27
  safe_join([label_element, supplemental_content, hint_element, error_element, text_area, limit_description])
28
28
  end
@@ -31,8 +31,12 @@ module GOVUKDesignSystemFormBuilder
31
31
 
32
32
  private
33
33
 
34
+ def character_count_options
35
+ { max_words: @max_words, max_chars: @max_chars, threshold: @threshold }
36
+ end
37
+
34
38
  def text_area
35
- @builder.text_area(@attribute_name, **text_area_options, **@attributes.merge(rows: @rows))
39
+ @builder.text_area(@attribute_name, **text_area_options, **@html_attributes)
36
40
  end
37
41
 
38
42
  def text_area_classes
@@ -46,6 +50,7 @@ module GOVUKDesignSystemFormBuilder
46
50
  {
47
51
  id: field_id(link_errors: true),
48
52
  class: text_area_classes,
53
+ rows: @rows,
49
54
  aria: { describedby: described_by(hint_id, error_id, supplemental_id, limit_description_id) },
50
55
  }
51
56
  end
@@ -59,9 +64,17 @@ module GOVUKDesignSystemFormBuilder
59
64
  end
60
65
 
61
66
  def limit?
67
+ limit_quantity.present?
68
+ end
69
+
70
+ def limit_quantity
62
71
  @max_words || @max_chars
63
72
  end
64
73
 
74
+ def limit_type
75
+ @max_words.present? ? 'words' : 'characters'
76
+ end
77
+
65
78
  def limit_description
66
79
  return nil unless limit?
67
80
 
@@ -74,14 +87,6 @@ module GOVUKDesignSystemFormBuilder
74
87
  %w(hint character-count__message).prefix(brand)
75
88
  end
76
89
 
77
- def limit_quantity
78
- @max_words || @max_chars
79
- end
80
-
81
- def limit_type
82
- @max_words.present? ? 'words' : 'characters'
83
- end
84
-
85
90
  def limit_description_id
86
91
  return nil unless limit?
87
92
 
@@ -4,11 +4,11 @@ module GOVUKDesignSystemFormBuilder
4
4
  def initialize(builder, object_name, attribute_name, hint_text:, label:, caption:, width:, **kwargs, &block)
5
5
  super(builder, object_name, attribute_name, &block)
6
6
 
7
- @width = width
8
- @attributes = kwargs
9
- @label = label
10
- @caption = caption
11
- @hint_text = hint_text
7
+ @width = width
8
+ @label = label
9
+ @caption = caption
10
+ @hint_text = hint_text
11
+ @html_attributes = kwargs
12
12
  end
13
13
 
14
14
  def html
@@ -20,7 +20,7 @@ module GOVUKDesignSystemFormBuilder
20
20
  private
21
21
 
22
22
  def input
23
- @builder.send(builder_method, @attribute_name, **input_options.merge(@attributes))
23
+ @builder.send(builder_method, @attribute_name, **input_options, **@html_attributes)
24
24
  end
25
25
 
26
26
  def input_options
@@ -4,10 +4,10 @@ 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_options)
7
+ @label_element ||= Elements::Label.new(@builder, @object_name, @attribute_name, caption: @caption, **label_content)
8
8
  end
9
9
 
10
- def label_options
10
+ def label_content
11
11
  case @label
12
12
  when Hash
13
13
  @label
@@ -1,3 +1,3 @@
1
1
  module GOVUKDesignSystemFormBuilder
2
- VERSION = '1.2.3'.freeze
2
+ VERSION = '1.2.4'.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: 1.2.3
4
+ version: 1.2.4
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-06-27 00:00:00.000000000 Z
11
+ date: 2020-07-02 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.14.0
61
+ version: 3.16.0
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.14.0
68
+ version: 3.16.0
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.19.0
179
+ version: 3.20.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.19.0
186
+ version: 3.20.0
187
187
  - !ruby/object:Gem::Dependency
188
188
  name: rubypants
189
189
  requirement: !ruby/object:Gem::Requirement
@@ -204,14 +204,14 @@ dependencies:
204
204
  requirements:
205
205
  - - "~>"
206
206
  - !ruby/object:Gem::Version
207
- version: 2.3.0
207
+ version: 2.4.0
208
208
  type: :development
209
209
  prerelease: false
210
210
  version_requirements: !ruby/object:Gem::Requirement
211
211
  requirements:
212
212
  - - "~>"
213
213
  - !ruby/object:Gem::Version
214
- version: 2.3.0
214
+ version: 2.4.0
215
215
  - !ruby/object:Gem::Dependency
216
216
  name: sass
217
217
  requirement: !ruby/object:Gem::Requirement