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.
- checksums.yaml +4 -4
- data/README.md +2 -2
- data/lib/govuk_design_system_formbuilder.rb +2 -1
- data/lib/govuk_design_system_formbuilder/builder.rb +202 -73
- data/lib/govuk_design_system_formbuilder/containers/check_boxes_fieldset.rb +3 -2
- data/lib/govuk_design_system_formbuilder/containers/fieldset.rb +31 -15
- data/lib/govuk_design_system_formbuilder/containers/radio_buttons_fieldset.rb +3 -2
- data/lib/govuk_design_system_formbuilder/elements/caption.rb +34 -0
- data/lib/govuk_design_system_formbuilder/elements/check_boxes/collection.rb +3 -2
- data/lib/govuk_design_system_formbuilder/elements/check_boxes/fieldset_check_box.rb +2 -1
- data/lib/govuk_design_system_formbuilder/elements/date.rb +3 -2
- data/lib/govuk_design_system_formbuilder/elements/file.rb +2 -1
- data/lib/govuk_design_system_formbuilder/elements/label.rb +18 -10
- data/lib/govuk_design_system_formbuilder/elements/radios/collection.rb +3 -2
- data/lib/govuk_design_system_formbuilder/elements/radios/fieldset_radio_button.rb +2 -1
- data/lib/govuk_design_system_formbuilder/elements/select.rb +2 -1
- data/lib/govuk_design_system_formbuilder/elements/text_area.rb +2 -1
- data/lib/govuk_design_system_formbuilder/traits/caption.rb +24 -0
- data/lib/govuk_design_system_formbuilder/traits/input.rb +2 -1
- data/lib/govuk_design_system_formbuilder/traits/label.rb +12 -1
- data/lib/govuk_design_system_formbuilder/traits/localisation.rb +2 -0
- data/lib/govuk_design_system_formbuilder/version.rb +1 -1
- metadata +10 -36
@@ -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([
|
30
|
+
safe_join([legend_content, (@block_content || yield)])
|
21
31
|
end
|
22
32
|
end
|
23
33
|
|
24
34
|
private
|
25
35
|
|
26
|
-
def
|
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
|
-
|
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
|
-
[@
|
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 = @
|
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 @
|
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,
|
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
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
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,
|
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,
|
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
|