govuk_design_system_formbuilder 1.2.4 → 1.2.5

Sign up to get free protection for your applications and to get access to all the features.
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