govuk_design_system_formbuilder 1.2.0b2 → 1.2.0b4

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