govuk_design_system_formbuilder 1.2.4 → 1.2.5

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 (31) hide show
  1. checksums.yaml +4 -4
  2. data/lib/govuk_design_system_formbuilder/builder.rb +46 -29
  3. data/lib/govuk_design_system_formbuilder/containers/character_count.rb +2 -2
  4. data/lib/govuk_design_system_formbuilder/containers/check_boxes.rb +13 -12
  5. data/lib/govuk_design_system_formbuilder/containers/check_boxes_fieldset.rb +9 -8
  6. data/lib/govuk_design_system_formbuilder/containers/fieldset.rb +12 -62
  7. data/lib/govuk_design_system_formbuilder/containers/form_group.rb +18 -10
  8. data/lib/govuk_design_system_formbuilder/containers/radio_buttons_fieldset.rb +10 -9
  9. data/lib/govuk_design_system_formbuilder/containers/radios.rb +17 -13
  10. data/lib/govuk_design_system_formbuilder/containers/supplemental.rb +2 -0
  11. data/lib/govuk_design_system_formbuilder/elements/caption.rb +6 -4
  12. data/lib/govuk_design_system_formbuilder/elements/check_boxes/collection.rb +12 -11
  13. data/lib/govuk_design_system_formbuilder/elements/check_boxes/collection_check_box.rb +2 -2
  14. data/lib/govuk_design_system_formbuilder/elements/check_boxes/fieldset_check_box.rb +11 -11
  15. data/lib/govuk_design_system_formbuilder/elements/date.rb +19 -18
  16. data/lib/govuk_design_system_formbuilder/elements/error_message.rb +3 -3
  17. data/lib/govuk_design_system_formbuilder/elements/error_summary.rb +15 -15
  18. data/lib/govuk_design_system_formbuilder/elements/file.rb +11 -10
  19. data/lib/govuk_design_system_formbuilder/elements/hint.rb +4 -4
  20. data/lib/govuk_design_system_formbuilder/elements/inputs/email.rb +2 -0
  21. data/lib/govuk_design_system_formbuilder/elements/label.rb +11 -11
  22. data/lib/govuk_design_system_formbuilder/elements/legend.rb +79 -0
  23. data/lib/govuk_design_system_formbuilder/elements/radios/collection.rb +14 -13
  24. data/lib/govuk_design_system_formbuilder/elements/radios/collection_radio_button.rb +2 -2
  25. data/lib/govuk_design_system_formbuilder/elements/radios/fieldset_radio_button.rb +2 -2
  26. data/lib/govuk_design_system_formbuilder/elements/select.rb +18 -17
  27. data/lib/govuk_design_system_formbuilder/elements/submit.rb +9 -4
  28. data/lib/govuk_design_system_formbuilder/elements/text_area.rb +7 -6
  29. data/lib/govuk_design_system_formbuilder/traits/input.rb +8 -7
  30. data/lib/govuk_design_system_formbuilder/version.rb +1 -1
  31. metadata +3 -2
@@ -8,17 +8,18 @@ module GOVUKDesignSystemFormBuilder
8
8
  include Traits::Label
9
9
  include Traits::Supplemental
10
10
 
11
- def initialize(builder, object_name, attribute_name, hint_text:, label:, caption:, **kwargs, &block)
11
+ def initialize(builder, object_name, attribute_name, hint_text:, label:, caption:, form_group_classes:, **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
- @extra_options = kwargs
14
+ @label = label
15
+ @caption = caption
16
+ @hint_text = hint_text
17
+ @extra_options = kwargs
18
+ @form_group_classes = form_group_classes
18
19
  end
19
20
 
20
21
  def html
21
- Containers::FormGroup.new(@builder, @object_name, @attribute_name).html do
22
+ Containers::FormGroup.new(@builder, @object_name, @attribute_name, classes: @form_group_classes).html do
22
23
  safe_join([label_element, supplemental_content, hint_element, error_element, file])
23
24
  end
24
25
  end
@@ -26,18 +27,18 @@ module GOVUKDesignSystemFormBuilder
26
27
  private
27
28
 
28
29
  def file
29
- @builder.file_field(@attribute_name, **file_options, **@extra_options)
30
+ @builder.file_field(@attribute_name, **options, **@extra_options)
30
31
  end
31
32
 
32
- def file_options
33
+ def options
33
34
  {
34
35
  id: field_id(link_errors: true),
35
- class: file_classes,
36
+ class: classes,
36
37
  aria: { describedby: described_by(hint_id, error_id, supplemental_id) }
37
38
  }
38
39
  end
39
40
 
40
- def file_classes
41
+ def classes
41
42
  %w(file-upload).prefix(brand).tap do |c|
42
43
  c.push(%(#{brand}-file-upload--error)) if has_errors?
43
44
  end
@@ -10,7 +10,7 @@ module GOVUKDesignSystemFormBuilder
10
10
  super(builder, object_name, attribute_name)
11
11
 
12
12
  @value = value
13
- @hint_text = hint_text(text)
13
+ @hint_text = retrieve_text(text)
14
14
  @radio = radio
15
15
  @checkbox = checkbox
16
16
  end
@@ -18,16 +18,16 @@ module GOVUKDesignSystemFormBuilder
18
18
  def html
19
19
  return nil if @hint_text.blank?
20
20
 
21
- tag.span(@hint_text, class: hint_classes, id: hint_id)
21
+ tag.span(@hint_text, class: classes, id: hint_id)
22
22
  end
23
23
 
24
24
  private
25
25
 
26
- def hint_text(supplied)
26
+ def retrieve_text(supplied)
27
27
  supplied.presence || localised_text(:hint)
28
28
  end
29
29
 
30
- def hint_classes
30
+ def classes
31
31
  %w(hint).prefix(brand).push(radio_class, checkbox_class).compact
32
32
  end
33
33
 
@@ -10,6 +10,8 @@ module GOVUKDesignSystemFormBuilder
10
10
  include Traits::Label
11
11
  include Traits::Supplemental
12
12
 
13
+ private
14
+
13
15
  def builder_method
14
16
  :email_field
15
17
  end
@@ -15,8 +15,8 @@ module GOVUKDesignSystemFormBuilder
15
15
  @content = content.call
16
16
  else
17
17
  @value = value # used by field_id
18
- @text = label_text(text, hidden)
19
- @size_class = label_size_class(size)
18
+ @text = retrieve_text(text, hidden)
19
+ @size_class = size_class(size)
20
20
  @radio = radio
21
21
  @checkbox = checkbox
22
22
  @tag = tag
@@ -38,12 +38,12 @@ module GOVUKDesignSystemFormBuilder
38
38
  private
39
39
 
40
40
  def label
41
- @builder.label(@attribute_name, **label_options) do
41
+ @builder.label(@attribute_name, **options) do
42
42
  @content || safe_join([caption, @text])
43
43
  end
44
44
  end
45
45
 
46
- def label_text(option_text, hidden)
46
+ def retrieve_text(option_text, hidden)
47
47
  text = [option_text, localised_text(:label), @attribute_name.capitalize].compact.first.to_s
48
48
 
49
49
  if hidden
@@ -53,7 +53,7 @@ module GOVUKDesignSystemFormBuilder
53
53
  end
54
54
  end
55
55
 
56
- def label_options
56
+ def options
57
57
  {
58
58
  value: @value,
59
59
  for: field_id(link_errors: @link_errors),
@@ -77,13 +77,13 @@ module GOVUKDesignSystemFormBuilder
77
77
  %(#{brand}-checkboxes__label)
78
78
  end
79
79
 
80
- def label_size_class(size)
80
+ def size_class(size)
81
81
  case size
82
- when 'xl' then %(#{brand}-label--xl)
83
- when 'l' then %(#{brand}-label--l)
84
- when 'm' then %(#{brand}-label--m)
85
- when 's' then %(#{brand}-label--s)
86
- when nil then nil
82
+ when 'xl' then %(#{brand}-label--xl)
83
+ when 'l' then %(#{brand}-label--l)
84
+ when 'm' then %(#{brand}-label--m)
85
+ when 's' then %(#{brand}-label--s)
86
+ when nil then nil
87
87
  else
88
88
  fail "invalid size '#{size}', must be xl, l, m, s or nil"
89
89
  end
@@ -0,0 +1,79 @@
1
+ module GOVUKDesignSystemFormBuilder
2
+ module Elements
3
+ class Legend < Base
4
+ include Traits::Caption
5
+ include Traits::Localisation
6
+
7
+ def initialize(builder, object_name, attribute_name, legend:, caption:)
8
+ super(builder, object_name, attribute_name)
9
+
10
+ case legend
11
+ when Proc
12
+ @raw = legend.call
13
+ when Hash
14
+ defaults.merge(legend).tap do |l|
15
+ @text = text(l.dig(:text))
16
+ @hidden = l.dig(:hidden)
17
+ @tag = l.dig(:tag)
18
+ @size = l.dig(:size)
19
+ @caption = caption
20
+ end
21
+ else
22
+ fail(ArgumentError, %(legend must be a Proc or Hash))
23
+ end
24
+ end
25
+
26
+ def html
27
+ @raw || content
28
+ end
29
+
30
+ private
31
+
32
+ def content
33
+ if @text.present?
34
+ content_tag('legend', class: classes) do
35
+ content_tag(@tag, class: heading_classes) do
36
+ safe_join([caption_element, @text])
37
+ end
38
+ end
39
+ end
40
+ end
41
+
42
+ def text(supplied_text)
43
+ supplied_text || localised_text(:legend)
44
+ end
45
+
46
+ def classes
47
+ [%(#{brand}-fieldset__legend), size_class, visually_hidden_class].compact
48
+ end
49
+
50
+ def size_class
51
+ case @size
52
+ when 'xl' then %(#{brand}-fieldset__legend--xl)
53
+ when 'l' then %(#{brand}-fieldset__legend--l)
54
+ when 'm' then %(#{brand}-fieldset__legend--m)
55
+ when 's' then %(#{brand}-fieldset__legend--s)
56
+ else
57
+ fail "invalid size '#{@size}', must be xl, l, m or s"
58
+ end
59
+ end
60
+
61
+ def visually_hidden_class
62
+ %(#{brand}-visually-hidden) if @hidden
63
+ end
64
+
65
+ def heading_classes
66
+ %(#{brand}-fieldset__heading)
67
+ end
68
+
69
+ def defaults
70
+ {
71
+ hidden: false,
72
+ text: nil,
73
+ tag: config.default_legend_tag,
74
+ size: config.default_legend_size
75
+ }
76
+ end
77
+ end
78
+ end
79
+ end
@@ -6,24 +6,25 @@ module GOVUKDesignSystemFormBuilder
6
6
  include Traits::Hint
7
7
  include Traits::Supplemental
8
8
 
9
- def initialize(builder, object_name, attribute_name, collection, value_method:, text_method:, hint_method:, hint_text:, legend:, caption:, inline:, small:, bold_labels:, classes:, &block)
9
+ def initialize(builder, object_name, attribute_name, collection, value_method:, text_method:, hint_method:, hint_text:, legend:, caption:, inline:, small:, bold_labels:, classes:, form_group_classes:, &block)
10
10
  super(builder, object_name, attribute_name, &block)
11
11
 
12
- @collection = collection
13
- @value_method = value_method
14
- @text_method = text_method
15
- @hint_method = hint_method
16
- @inline = inline
17
- @small = small
18
- @legend = legend
19
- @caption = caption
20
- @hint_text = hint_text
21
- @classes = classes
22
- @bold_labels = hint_method.present? || bold_labels
12
+ @collection = collection
13
+ @value_method = value_method
14
+ @text_method = text_method
15
+ @hint_method = hint_method
16
+ @inline = inline
17
+ @small = small
18
+ @legend = legend
19
+ @caption = caption
20
+ @hint_text = hint_text
21
+ @classes = classes
22
+ @form_group_classes = form_group_classes
23
+ @bold_labels = hint_method.present? || bold_labels
23
24
  end
24
25
 
25
26
  def html
26
- Containers::FormGroup.new(@builder, @object_name, @attribute_name).html do
27
+ Containers::FormGroup.new(@builder, @object_name, @attribute_name, classes: @form_group_classes).html do
27
28
  Containers::Fieldset.new(@builder, @object_name, @attribute_name, **fieldset_options).html do
28
29
  safe_join([supplemental_content, hint_element, error_element, radios])
29
30
  end
@@ -31,10 +31,10 @@ module GOVUKDesignSystemFormBuilder
31
31
  private
32
32
 
33
33
  def radio
34
- @builder.radio_button(@attribute_name, @value, **radio_options)
34
+ @builder.radio_button(@attribute_name, @value, **options)
35
35
  end
36
36
 
37
- def radio_options
37
+ def options
38
38
  {
39
39
  id: field_id(link_errors: @link_errors),
40
40
  aria: { describedby: hint_id },
@@ -47,10 +47,10 @@ module GOVUKDesignSystemFormBuilder
47
47
  end
48
48
 
49
49
  def input
50
- @builder.radio_button(@attribute_name, @value, **input_options)
50
+ @builder.radio_button(@attribute_name, @value, **options)
51
51
  end
52
52
 
53
- def input_options
53
+ def options
54
54
  {
55
55
  id: field_id(link_errors: @link_errors),
56
56
  aria: { describedby: hint_id },
@@ -6,21 +6,22 @@ module GOVUKDesignSystemFormBuilder
6
6
  include Traits::Hint
7
7
  include Traits::Supplemental
8
8
 
9
- def initialize(builder, object_name, attribute_name, collection, value_method:, text_method:, options: {}, html_options: {}, hint_text:, label:, caption:, &block)
9
+ def initialize(builder, object_name, attribute_name, collection, value_method:, text_method:, options: {}, html_options: {}, hint_text:, label:, caption:, form_group_classes:, &block)
10
10
  super(builder, object_name, attribute_name, &block)
11
11
 
12
- @collection = collection
13
- @value_method = value_method
14
- @text_method = text_method
15
- @options = options
16
- @html_options = html_options
17
- @label = label
18
- @caption = caption
19
- @hint_text = hint_text
12
+ @collection = collection
13
+ @value_method = value_method
14
+ @text_method = text_method
15
+ @options = options
16
+ @html_options = html_options
17
+ @label = label
18
+ @caption = caption
19
+ @hint_text = hint_text
20
+ @form_group_classes = form_group_classes
20
21
  end
21
22
 
22
23
  def html
23
- Containers::FormGroup.new(@builder, @object_name, @attribute_name).html do
24
+ Containers::FormGroup.new(@builder, @object_name, @attribute_name, classes: @form_group_classes).html do
24
25
  safe_join([label_element, supplemental_content, hint_element, error_element, select])
25
26
  end
26
27
  end
@@ -28,26 +29,26 @@ module GOVUKDesignSystemFormBuilder
28
29
  private
29
30
 
30
31
  def select
31
- @builder.collection_select(@attribute_name, @collection, @value_method, @text_method, @options, **select_options)
32
+ @builder.collection_select(@attribute_name, @collection, @value_method, @text_method, @options, **options)
32
33
  end
33
34
 
34
- def select_options
35
+ def options
35
36
  @html_options.deep_merge(
36
37
  id: field_id(link_errors: true),
37
- class: select_classes,
38
+ class: classes,
38
39
  aria: { describedby: described_by(hint_id, error_id, supplemental_id) }
39
40
  )
40
41
  end
41
42
 
42
- def select_classes
43
- [%(#{brand}-select), select_error_class, select_custom_classes].flatten.compact
43
+ def classes
44
+ [%(#{brand}-select), error_class, custom_classes].flatten.compact
44
45
  end
45
46
 
46
- def select_error_class
47
+ def error_class
47
48
  %(#{brand}-select--error) if has_errors?
48
49
  end
49
50
 
50
- def select_custom_classes
51
+ def custom_classes
51
52
  @html_options.dig(:class)
52
53
  end
53
54
  end
@@ -24,17 +24,18 @@ module GOVUKDesignSystemFormBuilder
24
24
  private
25
25
 
26
26
  def submit
27
- @builder.submit(@text, class: submit_classes, **submit_options)
27
+ @builder.submit(@text, class: classes, **options)
28
28
  end
29
29
 
30
- def submit_classes
30
+ def classes
31
31
  %w(button)
32
32
  .prefix(brand)
33
- .push(warning_class, secondary_class, disabled_class, padding_class, @classes)
33
+ .push(warning_class, secondary_class, disabled_class, padding_class, custom_classes)
34
+ .flatten
34
35
  .compact
35
36
  end
36
37
 
37
- def submit_options
38
+ def options
38
39
  {
39
40
  formnovalidate: !@validate,
40
41
  disabled: @disabled,
@@ -60,6 +61,10 @@ module GOVUKDesignSystemFormBuilder
60
61
  def disabled_class
61
62
  %(#{brand}-button--disabled) if @disabled
62
63
  end
64
+
65
+ def custom_classes
66
+ Array.wrap(@classes)
67
+ end
63
68
  end
64
69
  end
65
70
  end
@@ -8,7 +8,7 @@ module GOVUKDesignSystemFormBuilder
8
8
  include Traits::Label
9
9
  include Traits::Supplemental
10
10
 
11
- def initialize(builder, object_name, attribute_name, hint_text:, label:, caption:, rows:, max_words:, max_chars:, threshold:, **kwargs, &block)
11
+ def initialize(builder, object_name, attribute_name, hint_text:, label:, caption:, rows:, max_words:, max_chars:, threshold:, form_group_classes:, **kwargs, &block)
12
12
  super(builder, object_name, attribute_name, &block)
13
13
 
14
14
  @label = label
@@ -18,12 +18,13 @@ module GOVUKDesignSystemFormBuilder
18
18
  @max_chars = max_chars
19
19
  @threshold = threshold
20
20
  @rows = rows
21
+ @form_group_classes = form_group_classes
21
22
  @html_attributes = kwargs
22
23
  end
23
24
 
24
25
  def html
25
26
  Containers::CharacterCount.new(@builder, **character_count_options).html do
26
- Containers::FormGroup.new(@builder, @object_name, @attribute_name).html do
27
+ Containers::FormGroup.new(@builder, @object_name, @attribute_name, classes: @form_group_classes).html do
27
28
  safe_join([label_element, supplemental_content, hint_element, error_element, text_area, limit_description])
28
29
  end
29
30
  end
@@ -36,20 +37,20 @@ module GOVUKDesignSystemFormBuilder
36
37
  end
37
38
 
38
39
  def text_area
39
- @builder.text_area(@attribute_name, **text_area_options, **@html_attributes)
40
+ @builder.text_area(@attribute_name, **options, **@html_attributes)
40
41
  end
41
42
 
42
- def text_area_classes
43
+ def classes
43
44
  %w(textarea).prefix(brand).tap do |classes|
44
45
  classes.push(%(#{brand}-textarea--error)) if has_errors?
45
46
  classes.push(%(#{brand}-js-character-count)) if limit?
46
47
  end
47
48
  end
48
49
 
49
- def text_area_options
50
+ def options
50
51
  {
51
52
  id: field_id(link_errors: true),
52
- class: text_area_classes,
53
+ class: classes,
53
54
  rows: @rows,
54
55
  aria: { describedby: described_by(hint_id, error_id, supplemental_id, limit_description_id) },
55
56
  }
@@ -1,18 +1,19 @@
1
1
  module GOVUKDesignSystemFormBuilder
2
2
  module Traits
3
3
  module Input
4
- def initialize(builder, object_name, attribute_name, hint_text:, label:, caption:, width:, **kwargs, &block)
4
+ def initialize(builder, object_name, attribute_name, hint_text:, label:, caption:, width:, form_group_classes:, **kwargs, &block)
5
5
  super(builder, object_name, attribute_name, &block)
6
6
 
7
- @width = width
8
- @label = label
9
- @caption = caption
10
- @hint_text = hint_text
11
- @html_attributes = kwargs
7
+ @width = width
8
+ @label = label
9
+ @caption = caption
10
+ @hint_text = hint_text
11
+ @html_attributes = kwargs
12
+ @form_group_classes = form_group_classes
12
13
  end
13
14
 
14
15
  def html
15
- Containers::FormGroup.new(@builder, @object_name, @attribute_name).html do
16
+ Containers::FormGroup.new(@builder, @object_name, @attribute_name, classes: @form_group_classes).html do
16
17
  safe_join([label_element, supplemental_content, hint_element, error_element, input])
17
18
  end
18
19
  end