govuk_design_system_formbuilder 1.2.0b2 → 1.2.0b4

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.
@@ -4,10 +4,11 @@ module GOVUKDesignSystemFormBuilder
4
4
  include Traits::Error
5
5
  include Traits::Hint
6
6
 
7
- def initialize(builder, object_name, attribute_name, hint_text:, legend:, small:, classes:, &block)
7
+ def initialize(builder, object_name, attribute_name, hint_text:, legend:, caption:, small:, classes:, &block)
8
8
  super(builder, object_name, attribute_name, &block)
9
9
 
10
10
  @legend = legend
11
+ @caption = caption
11
12
  @hint_text = hint_text
12
13
  @small = small
13
14
  @classes = classes
@@ -16,7 +17,7 @@ module GOVUKDesignSystemFormBuilder
16
17
 
17
18
  def html
18
19
  Containers::FormGroup.new(@builder, @object_name, @attribute_name).html do
19
- Containers::Fieldset.new(@builder, @object_name, @attribute_name, legend: @legend, described_by: [error_element.error_id, hint_element.hint_id]).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
21
  safe_join(
21
22
  [
22
23
  hint_element.html,
@@ -3,45 +3,52 @@ module GOVUKDesignSystemFormBuilder
3
3
  class Fieldset < Base
4
4
  using PrefixableArray
5
5
 
6
+ include Traits::Caption
6
7
  include Traits::Localisation
7
8
 
8
9
  LEGEND_SIZES = %w(xl l m s).freeze
9
10
 
10
- def initialize(builder, object_name = nil, attribute_name = nil, legend: {}, described_by: nil)
11
- super(builder, object_name, attribute_name)
11
+ def initialize(builder, object_name = nil, attribute_name = nil, legend: {}, caption: {}, described_by: nil, &block)
12
+ super(builder, object_name, attribute_name, &block)
12
13
 
13
- @legend = legend_defaults.merge(legend)
14
14
  @described_by = described_by(described_by)
15
15
  @attribute_name = attribute_name
16
+
17
+ case legend
18
+ when Proc
19
+ @legend_raw = legend.call
20
+ when Hash
21
+ @legend_options = legend_defaults.merge(legend)
22
+ @caption = caption
23
+ else
24
+ fail(ArgumentError, %(legend must be a Proc or Hash))
25
+ end
16
26
  end
17
27
 
18
28
  def html
19
29
  content_tag('fieldset', class: fieldset_classes, aria: { describedby: @described_by }) do
20
- safe_join([build_legend, yield])
30
+ safe_join([legend_content, (@block_content || yield)])
21
31
  end
22
32
  end
23
33
 
24
34
  private
25
35
 
26
- def legend_defaults
27
- {
28
- hidden: false,
29
- text: nil,
30
- tag: config.default_legend_tag,
31
- size: config.default_legend_size
32
- }
36
+ def legend_content
37
+ @legend_raw || build_legend
33
38
  end
34
39
 
35
40
  def build_legend
36
41
  if legend_text.present?
37
42
  content_tag('legend', class: legend_classes) do
38
- tag.send(@legend.dig(:tag), legend_text, class: legend_heading_classes)
43
+ content_tag(@legend_options.dig(:tag), class: legend_heading_classes) do
44
+ safe_join([caption_element.html, legend_text])
45
+ end
39
46
  end
40
47
  end
41
48
  end
42
49
 
43
50
  def legend_text
44
- [@legend.dig(:text), localised_text(:legend)].compact.first
51
+ [@legend_options.dig(:text), localised_text(:legend)].compact.first
45
52
  end
46
53
 
47
54
  def fieldset_classes
@@ -49,17 +56,26 @@ module GOVUKDesignSystemFormBuilder
49
56
  end
50
57
 
51
58
  def legend_classes
52
- size = @legend.dig(:size)
59
+ size = @legend_options.dig(:size)
53
60
  fail "invalid size '#{size}', must be #{LEGEND_SIZES.join(', ')}" unless size.in?(LEGEND_SIZES)
54
61
 
55
62
  [%(fieldset__legend), %(fieldset__legend--#{size})].prefix(brand).tap do |classes|
56
- classes.push(%(#{brand}-visually-hidden)) if @legend.dig(:hidden)
63
+ classes.push(%(#{brand}-visually-hidden)) if @legend_options.dig(:hidden)
57
64
  end
58
65
  end
59
66
 
60
67
  def legend_heading_classes
61
68
  %w(fieldset__heading).prefix(brand)
62
69
  end
70
+
71
+ def legend_defaults
72
+ {
73
+ hidden: false,
74
+ text: nil,
75
+ tag: config.default_legend_tag,
76
+ size: config.default_legend_size
77
+ }
78
+ end
63
79
  end
64
80
  end
65
81
  end
@@ -4,12 +4,13 @@ module GOVUKDesignSystemFormBuilder
4
4
  include Traits::Hint
5
5
  include Traits::Error
6
6
 
7
- def initialize(builder, object_name, attribute_name, hint_text:, legend:, inline:, small:, classes:, &block)
7
+ def initialize(builder, object_name, attribute_name, hint_text:, legend:, caption:, inline:, small:, classes:, &block)
8
8
  super(builder, object_name, attribute_name)
9
9
 
10
10
  @inline = inline
11
11
  @small = small
12
12
  @legend = legend
13
+ @caption = caption
13
14
  @hint_text = hint_text
14
15
  @classes = classes
15
16
  @block_content = capture { block.call }
@@ -17,7 +18,7 @@ module GOVUKDesignSystemFormBuilder
17
18
 
18
19
  def html
19
20
  Containers::FormGroup.new(@builder, @object_name, @attribute_name).html do
20
- Containers::Fieldset.new(@builder, @object_name, @attribute_name, legend: @legend, described_by: [error_element.error_id, hint_element.hint_id]).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
22
  safe_join(
22
23
  [
23
24
  hint_element.html,
@@ -0,0 +1,34 @@
1
+ module GOVUKDesignSystemFormBuilder
2
+ module Elements
3
+ class Caption < Base
4
+ include Traits::Localisation
5
+
6
+ def initialize(builder, object_name, attribute_name, text:, size: 'm')
7
+ super(builder, object_name, attribute_name)
8
+
9
+ @text = caption_text(text)
10
+ @size_class = caption_size_class(size)
11
+ end
12
+
13
+ def html
14
+ return nil if @text.blank?
15
+
16
+ tag.span(@text, class: @size_class)
17
+ end
18
+
19
+ def caption_text(override)
20
+ override || localised_text(:caption)
21
+ end
22
+
23
+ def caption_size_class(size)
24
+ case size
25
+ when 'xl' then %(#{brand}-caption-xl)
26
+ when 'l' then %(#{brand}-caption-l)
27
+ when 'm' then %(#{brand}-caption-m)
28
+ else
29
+ fail ArgumentError, "invalid size '#{size}', must be xl, l or m"
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
@@ -6,7 +6,7 @@ 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: nil, hint_text:, legend:, small:, classes:, &block)
9
+ def initialize(builder, object_name, attribute_name, collection, value_method:, text_method:, hint_method: nil, hint_text:, legend:, caption:, small:, classes:, &block)
10
10
  super(builder, object_name, attribute_name, &block)
11
11
 
12
12
  @collection = collection
@@ -15,13 +15,14 @@ module GOVUKDesignSystemFormBuilder
15
15
  @hint_method = hint_method
16
16
  @small = small
17
17
  @legend = legend
18
+ @caption = caption
18
19
  @hint_text = hint_text
19
20
  @classes = classes
20
21
  end
21
22
 
22
23
  def html
23
24
  Containers::FormGroup.new(@builder, @object_name, @attribute_name).html do
24
- Containers::Fieldset.new(@builder, @object_name, @attribute_name, legend: @legend, described_by: [error_id, hint_id, supplemental_id]).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
26
  safe_join(
26
27
  [
27
28
  supplemental_content.html,
@@ -4,6 +4,7 @@ module GOVUKDesignSystemFormBuilder
4
4
  class FieldsetCheckBox < Base
5
5
  using PrefixableArray
6
6
 
7
+ include Traits::Label
7
8
  include Traits::Hint
8
9
  include Traits::Conditional
9
10
 
@@ -57,7 +58,7 @@ module GOVUKDesignSystemFormBuilder
57
58
  end
58
59
 
59
60
  def label_element
60
- @label_element ||= Elements::Label.new(@builder, @object_name, @attribute_name, checkbox: true, value: @value, **@label, link_errors: @link_errors)
61
+ @label_element ||= Elements::Label.new(@builder, @object_name, @attribute_name, checkbox: true, value: @value, link_errors: @link_errors, **label_args)
61
62
  end
62
63
 
63
64
  def hint_element
@@ -9,10 +9,11 @@ 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:, hint_text:, date_of_birth: false, omit_day:, &block)
12
+ def initialize(builder, object_name, attribute_name, legend:, caption:, hint_text:, date_of_birth: false, omit_day:, &block)
13
13
  super(builder, object_name, attribute_name, &block)
14
14
 
15
15
  @legend = legend
16
+ @caption = caption
16
17
  @hint_text = hint_text
17
18
  @date_of_birth = date_of_birth
18
19
  @omit_day = omit_day
@@ -20,7 +21,7 @@ module GOVUKDesignSystemFormBuilder
20
21
 
21
22
  def html
22
23
  Containers::FormGroup.new(@builder, @object_name, @attribute_name).html do
23
- Containers::Fieldset.new(@builder, @object_name, @attribute_name, legend: @legend, described_by: [error_id, hint_id, supplemental_id]).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
25
  safe_join(
25
26
  [
26
27
  supplemental_content.html,
@@ -8,10 +8,11 @@ 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:, **extra_args, &block)
11
+ def initialize(builder, object_name, attribute_name, hint_text:, label:, caption:, **extra_args, &block)
12
12
  super(builder, object_name, attribute_name, &block)
13
13
 
14
14
  @label = label
15
+ @caption = caption
15
16
  @hint_text = hint_text
16
17
  @extra_args = extra_args
17
18
  end
@@ -3,22 +3,30 @@ module GOVUKDesignSystemFormBuilder
3
3
  class Label < Base
4
4
  using PrefixableArray
5
5
 
6
+ include Traits::Caption
6
7
  include Traits::Localisation
7
8
 
8
- def initialize(builder, object_name, attribute_name, text: nil, value: nil, size: nil, hidden: false, radio: false, checkbox: false, tag: nil, link_errors: true)
9
+ def initialize(builder, object_name, attribute_name, text: nil, value: nil, size: nil, hidden: false, radio: false, checkbox: false, tag: nil, link_errors: true, content: nil, caption: nil)
9
10
  super(builder, object_name, attribute_name)
10
11
 
11
- @value = value # used by field_id
12
- @text = label_text(text, hidden)
13
- @size_class = label_size_class(size)
14
- @radio_class = radio_class(radio)
15
- @checkbox_class = checkbox_class(checkbox)
16
- @tag = tag
17
- @link_errors = link_errors
12
+ # content is passed in directly via a proc and overrides
13
+ # the other display options
14
+ if content
15
+ @content = content.call
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
25
+ end
18
26
  end
19
27
 
20
28
  def html
21
- return nil if @text.blank?
29
+ return nil if [@content, @text].all?(&:blank?)
22
30
 
23
31
  if @tag.present?
24
32
  content_tag(@tag, class: %(#{brand}-label-wrapper)) { build_label }
@@ -36,7 +44,7 @@ module GOVUKDesignSystemFormBuilder
36
44
  for: field_id(link_errors: @link_errors),
37
45
  class: %w(label).prefix(brand).push(@size_class, @weight_class, @radio_class, @checkbox_class).compact
38
46
  ) do
39
- @text
47
+ @content || safe_join([caption_element.html, @text])
40
48
  end
41
49
  end
42
50
 
@@ -6,7 +6,7 @@ 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:, 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:, &block)
10
10
  super(builder, object_name, attribute_name, &block)
11
11
 
12
12
  @collection = collection
@@ -16,6 +16,7 @@ module GOVUKDesignSystemFormBuilder
16
16
  @inline = inline
17
17
  @small = small
18
18
  @legend = legend
19
+ @caption = caption
19
20
  @hint_text = hint_text
20
21
  @classes = classes
21
22
  @bold_labels = hint_method.present? || bold_labels
@@ -23,7 +24,7 @@ module GOVUKDesignSystemFormBuilder
23
24
 
24
25
  def html
25
26
  Containers::FormGroup.new(@builder, @object_name, @attribute_name).html do
26
- Containers::Fieldset.new(@builder, @object_name, @attribute_name, legend: @legend, described_by: [error_id, hint_id, supplemental_id]).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
28
  safe_join(
28
29
  [
29
30
  supplemental_content.html,
@@ -4,6 +4,7 @@ module GOVUKDesignSystemFormBuilder
4
4
  class FieldsetRadioButton < Base
5
5
  using PrefixableArray
6
6
 
7
+ include Traits::Label
7
8
  include Traits::Hint
8
9
  include Traits::Conditional
9
10
 
@@ -41,7 +42,7 @@ module GOVUKDesignSystemFormBuilder
41
42
  private
42
43
 
43
44
  def label_element
44
- @label_element ||= Elements::Label.new(@builder, @object_name, @attribute_name, radio: true, value: @value, **@label, link_errors: @link_errors)
45
+ @label_element ||= Elements::Label.new(@builder, @object_name, @attribute_name, radio: true, value: @value, link_errors: @link_errors, **label_args)
45
46
  end
46
47
 
47
48
  def hint_element
@@ -8,7 +8,7 @@ module GOVUKDesignSystemFormBuilder
8
8
  include Traits::Hint
9
9
  include Traits::Supplemental
10
10
 
11
- def initialize(builder, object_name, attribute_name, collection, value_method:, text_method:, options: {}, html_options: {}, hint_text:, label:, &block)
11
+ def initialize(builder, object_name, attribute_name, collection, value_method:, text_method:, options: {}, html_options: {}, hint_text:, label:, caption:, &block)
12
12
  super(builder, object_name, attribute_name, &block)
13
13
 
14
14
  @collection = collection
@@ -17,6 +17,7 @@ module GOVUKDesignSystemFormBuilder
17
17
  @options = options
18
18
  @html_options = html_options
19
19
  @label = label
20
+ @caption = caption
20
21
  @hint_text = hint_text
21
22
  end
22
23
 
@@ -8,10 +8,11 @@ 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:, rows:, max_words:, max_chars:, threshold:, **extra_args, &block)
11
+ def initialize(builder, object_name, attribute_name, hint_text:, label:, caption:, rows:, max_words:, max_chars:, threshold:, **extra_args, &block)
12
12
  super(builder, object_name, attribute_name, &block)
13
13
 
14
14
  @label = label
15
+ @caption = caption
15
16
  @hint_text = hint_text
16
17
  @extra_args = extra_args
17
18
  @max_words = max_words
@@ -0,0 +1,24 @@
1
+ module GOVUKDesignSystemFormBuilder
2
+ module Traits
3
+ module Caption
4
+ private
5
+
6
+ def caption_element
7
+ @caption_element ||= Elements::Caption.new(
8
+ @builder,
9
+ @object_name,
10
+ @attribute_name,
11
+ **{ text: nil }.merge({ text: caption_text, size: caption_size }.compact)
12
+ )
13
+ end
14
+
15
+ def caption_text
16
+ @caption&.dig(:text)
17
+ end
18
+
19
+ def caption_size
20
+ @caption&.dig(:size)
21
+ end
22
+ end
23
+ end
24
+ end
@@ -1,12 +1,13 @@
1
1
  module GOVUKDesignSystemFormBuilder
2
2
  module Traits
3
3
  module Input
4
- def initialize(builder, object_name, attribute_name, hint_text:, label:, width:, **extra_args, &block)
4
+ def initialize(builder, object_name, attribute_name, hint_text:, label:, caption:, width:, **extra_args, &block)
5
5
  super(builder, object_name, attribute_name, &block)
6
6
 
7
7
  @width = width
8
8
  @extra_args = extra_args
9
9
  @label = label
10
+ @caption = caption
10
11
  @hint_text = hint_text
11
12
  end
12
13
 
@@ -4,7 +4,18 @@ module GOVUKDesignSystemFormBuilder
4
4
  private
5
5
 
6
6
  def label_element
7
- @label_element ||= Elements::Label.new(@builder, @object_name, @attribute_name, **@label)
7
+ @label_element ||= Elements::Label.new(@builder, @object_name, @attribute_name, caption: @caption, **label_args)
8
+ end
9
+
10
+ def label_args
11
+ case @label
12
+ when Hash
13
+ @label
14
+ when Proc
15
+ { content: @label }
16
+ else
17
+ fail(ArgumentError, %(label must be a Proc or Hash))
18
+ end
8
19
  end
9
20
  end
10
21
  end
@@ -40,6 +40,8 @@ module GOVUKDesignSystemFormBuilder
40
40
  config.localisation_schema_hint
41
41
  when :label
42
42
  config.localisation_schema_label
43
+ when :caption
44
+ config.localisation_schema_caption
43
45
  end
44
46
 
45
47
  (contextual_schema || config.localisation_schema_fallback).dup