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.
- 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
|