govuk_design_system_formbuilder 1.1.10 → 1.2.0
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 +7 -1
- data/lib/govuk_design_system_formbuilder/base.rb +12 -0
- data/lib/govuk_design_system_formbuilder/builder.rb +311 -74
- data/lib/govuk_design_system_formbuilder/containers/character_count.rb +2 -2
- data/lib/govuk_design_system_formbuilder/containers/check_boxes.rb +5 -3
- data/lib/govuk_design_system_formbuilder/containers/check_boxes_fieldset.rb +3 -2
- data/lib/govuk_design_system_formbuilder/containers/fieldset.rb +37 -16
- data/lib/govuk_design_system_formbuilder/containers/form_group.rb +4 -2
- data/lib/govuk_design_system_formbuilder/containers/radio_buttons_fieldset.rb +3 -2
- data/lib/govuk_design_system_formbuilder/containers/radios.rb +7 -5
- 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/collection_check_box.rb +5 -3
- data/lib/govuk_design_system_formbuilder/elements/check_boxes/fieldset_check_box.rb +7 -4
- data/lib/govuk_design_system_formbuilder/elements/check_boxes/label.rb +8 -2
- data/lib/govuk_design_system_formbuilder/elements/date.rb +15 -11
- data/lib/govuk_design_system_formbuilder/elements/error_message.rb +4 -2
- data/lib/govuk_design_system_formbuilder/elements/error_summary.rb +4 -4
- data/lib/govuk_design_system_formbuilder/elements/file.rb +6 -3
- data/lib/govuk_design_system_formbuilder/elements/hint.rb +5 -3
- data/lib/govuk_design_system_formbuilder/elements/inputs/email.rb +2 -0
- data/lib/govuk_design_system_formbuilder/elements/inputs/number.rb +2 -0
- data/lib/govuk_design_system_formbuilder/elements/inputs/password.rb +2 -0
- data/lib/govuk_design_system_formbuilder/elements/inputs/phone.rb +2 -0
- data/lib/govuk_design_system_formbuilder/elements/inputs/text.rb +2 -0
- data/lib/govuk_design_system_formbuilder/elements/inputs/url.rb +2 -0
- data/lib/govuk_design_system_formbuilder/elements/label.rb +30 -20
- data/lib/govuk_design_system_formbuilder/elements/radios/collection.rb +3 -2
- data/lib/govuk_design_system_formbuilder/elements/radios/collection_radio_button.rb +4 -2
- data/lib/govuk_design_system_formbuilder/elements/radios/fieldset_radio_button.rb +7 -4
- data/lib/govuk_design_system_formbuilder/elements/select.rb +6 -3
- data/lib/govuk_design_system_formbuilder/elements/submit.rb +10 -7
- data/lib/govuk_design_system_formbuilder/elements/text_area.rb +12 -5
- data/lib/govuk_design_system_formbuilder/traits/caption.rb +24 -0
- data/lib/govuk_design_system_formbuilder/traits/input.rb +16 -16
- data/lib/govuk_design_system_formbuilder/traits/label.rb +12 -1
- data/lib/govuk_design_system_formbuilder/traits/localisation.rb +18 -10
- data/lib/govuk_design_system_formbuilder/version.rb +1 -1
- metadata +16 -43
- data/lib/govuk_design_system_formbuilder/elements/check_boxes/hint.rb +0 -32
@@ -1,6 +1,8 @@
|
|
1
1
|
module GOVUKDesignSystemFormBuilder
|
2
2
|
module Elements
|
3
3
|
class ErrorMessage < Base
|
4
|
+
using PrefixableArray
|
5
|
+
|
4
6
|
include Traits::Error
|
5
7
|
|
6
8
|
def initialize(builder, object_name, attribute_name)
|
@@ -10,10 +12,10 @@ module GOVUKDesignSystemFormBuilder
|
|
10
12
|
def html
|
11
13
|
return nil unless has_errors?
|
12
14
|
|
13
|
-
content_tag('span', class:
|
15
|
+
content_tag('span', class: %(#{brand}-error-message), id: error_id) do
|
14
16
|
safe_join(
|
15
17
|
[
|
16
|
-
tag.span('Error: ', class:
|
18
|
+
tag.span('Error: ', class: %(#{brand}-visually-hidden)),
|
17
19
|
message
|
18
20
|
]
|
19
21
|
)
|
@@ -17,7 +17,7 @@ module GOVUKDesignSystemFormBuilder
|
|
17
17
|
[
|
18
18
|
tag.h2(@title, id: error_summary_title_id, class: summary_class('title')),
|
19
19
|
content_tag('div', class: summary_class('body')) do
|
20
|
-
content_tag('ul', class: [
|
20
|
+
content_tag('ul', class: [%(#{brand}-list), summary_class('list')]) do
|
21
21
|
safe_join(
|
22
22
|
@builder.object.errors.messages.map do |attribute, messages|
|
23
23
|
error_list_item(attribute, messages.first)
|
@@ -50,9 +50,9 @@ module GOVUKDesignSystemFormBuilder
|
|
50
50
|
|
51
51
|
def summary_class(part = nil)
|
52
52
|
if part
|
53
|
-
|
53
|
+
%(#{brand}-error-summary).concat('__', part)
|
54
54
|
else
|
55
|
-
|
55
|
+
%(#{brand}-error-summary)
|
56
56
|
end
|
57
57
|
end
|
58
58
|
|
@@ -73,7 +73,7 @@ module GOVUKDesignSystemFormBuilder
|
|
73
73
|
tabindex: -1,
|
74
74
|
role: 'alert',
|
75
75
|
data: {
|
76
|
-
module:
|
76
|
+
module: %(#{brand}-error-summary)
|
77
77
|
},
|
78
78
|
aria: {
|
79
79
|
labelledby: error_summary_title_id
|
@@ -1,15 +1,18 @@
|
|
1
1
|
module GOVUKDesignSystemFormBuilder
|
2
2
|
module Elements
|
3
3
|
class File < Base
|
4
|
+
using PrefixableArray
|
5
|
+
|
4
6
|
include Traits::Error
|
5
7
|
include Traits::Hint
|
6
8
|
include Traits::Label
|
7
9
|
include Traits::Supplemental
|
8
10
|
|
9
|
-
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)
|
10
12
|
super(builder, object_name, attribute_name, &block)
|
11
13
|
|
12
14
|
@label = label
|
15
|
+
@caption = caption
|
13
16
|
@hint_text = hint_text
|
14
17
|
@extra_args = extra_args
|
15
18
|
end
|
@@ -37,8 +40,8 @@ module GOVUKDesignSystemFormBuilder
|
|
37
40
|
private
|
38
41
|
|
39
42
|
def file_classes
|
40
|
-
%w(
|
41
|
-
c.push(
|
43
|
+
%w(file-upload).prefix(brand).tap do |c|
|
44
|
+
c.push(%(#{brand}-file-upload--error)) if has_errors?
|
42
45
|
end
|
43
46
|
end
|
44
47
|
end
|
@@ -1,6 +1,8 @@
|
|
1
1
|
module GOVUKDesignSystemFormBuilder
|
2
2
|
module Elements
|
3
3
|
class Hint < Base
|
4
|
+
using PrefixableArray
|
5
|
+
|
4
6
|
include Traits::Hint
|
5
7
|
include Traits::Localisation
|
6
8
|
|
@@ -29,15 +31,15 @@ module GOVUKDesignSystemFormBuilder
|
|
29
31
|
end
|
30
32
|
|
31
33
|
def hint_classes
|
32
|
-
%w(
|
34
|
+
%w(hint).prefix(brand).push(@radio_class, @checkbox_class).compact
|
33
35
|
end
|
34
36
|
|
35
37
|
def radio_class(radio)
|
36
|
-
radio ?
|
38
|
+
radio ? %(#{brand}-radios__hint) : nil
|
37
39
|
end
|
38
40
|
|
39
41
|
def checkbox_class(checkbox)
|
40
|
-
checkbox ?
|
42
|
+
checkbox ? %(#{brand}-checkboxes__hint) : nil
|
41
43
|
end
|
42
44
|
end
|
43
45
|
end
|
@@ -1,25 +1,35 @@
|
|
1
1
|
module GOVUKDesignSystemFormBuilder
|
2
2
|
module Elements
|
3
3
|
class Label < Base
|
4
|
+
using PrefixableArray
|
5
|
+
|
6
|
+
include Traits::Caption
|
4
7
|
include Traits::Localisation
|
5
8
|
|
6
|
-
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)
|
7
10
|
super(builder, object_name, attribute_name)
|
8
11
|
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
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
|
16
26
|
end
|
17
27
|
|
18
28
|
def html
|
19
|
-
return nil if @text.blank?
|
29
|
+
return nil if [@content, @text].all?(&:blank?)
|
20
30
|
|
21
31
|
if @tag.present?
|
22
|
-
content_tag(@tag, class:
|
32
|
+
content_tag(@tag, class: %(#{brand}-label-wrapper)) { build_label }
|
23
33
|
else
|
24
34
|
build_label
|
25
35
|
end
|
@@ -32,36 +42,36 @@ module GOVUKDesignSystemFormBuilder
|
|
32
42
|
@attribute_name,
|
33
43
|
value: @value,
|
34
44
|
for: field_id(link_errors: @link_errors),
|
35
|
-
class: %w(
|
45
|
+
class: %w(label).prefix(brand).push(@size_class, @weight_class, @radio_class, @checkbox_class).compact
|
36
46
|
) do
|
37
|
-
@text
|
47
|
+
@content || safe_join([caption_element.html, @text])
|
38
48
|
end
|
39
49
|
end
|
40
50
|
|
41
51
|
def label_text(option_text, hidden)
|
42
|
-
text = [option_text,
|
52
|
+
text = [option_text, localised_text(:label), @attribute_name.capitalize].compact.first.to_s
|
43
53
|
|
44
54
|
if hidden
|
45
|
-
tag.span(text, class: %w(
|
55
|
+
tag.span(text, class: %w(visually-hidden).prefix(brand))
|
46
56
|
else
|
47
57
|
text
|
48
58
|
end
|
49
59
|
end
|
50
60
|
|
51
61
|
def radio_class(radio)
|
52
|
-
radio ?
|
62
|
+
radio ? %(#{brand}-radios__label) : nil
|
53
63
|
end
|
54
64
|
|
55
65
|
def checkbox_class(checkbox)
|
56
|
-
checkbox ?
|
66
|
+
checkbox ? %(#{brand}-checkboxes__label) : nil
|
57
67
|
end
|
58
68
|
|
59
69
|
def label_size_class(size)
|
60
70
|
case size
|
61
|
-
when 'xl' then
|
62
|
-
when 'l' then
|
63
|
-
when 'm' then
|
64
|
-
when 's' then
|
71
|
+
when 'xl' then %(#{brand}-label--xl)
|
72
|
+
when 'l' then %(#{brand}-label--l)
|
73
|
+
when 'm' then %(#{brand}-label--m)
|
74
|
+
when 's' then %(#{brand}-label--s)
|
65
75
|
when nil then nil
|
66
76
|
else
|
67
77
|
fail "invalid size '#{size}', must be xl, l, m, s or nil"
|
@@ -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,
|
@@ -2,6 +2,8 @@ module GOVUKDesignSystemFormBuilder
|
|
2
2
|
module Elements
|
3
3
|
module Radios
|
4
4
|
class CollectionRadioButton < Base
|
5
|
+
using PrefixableArray
|
6
|
+
|
5
7
|
include Traits::Hint
|
6
8
|
include Traits::CollectionItem
|
7
9
|
|
@@ -21,7 +23,7 @@ module GOVUKDesignSystemFormBuilder
|
|
21
23
|
end
|
22
24
|
|
23
25
|
def html
|
24
|
-
content_tag('div', class:
|
26
|
+
content_tag('div', class: %(#{brand}-radios__item)) do
|
25
27
|
safe_join(
|
26
28
|
[
|
27
29
|
@builder.radio_button(
|
@@ -29,7 +31,7 @@ module GOVUKDesignSystemFormBuilder
|
|
29
31
|
@value,
|
30
32
|
id: field_id(link_errors: @link_errors),
|
31
33
|
aria: { describedby: hint_id },
|
32
|
-
class: %w(
|
34
|
+
class: %w(radios__input).prefix(brand)
|
33
35
|
),
|
34
36
|
label_element.html,
|
35
37
|
hint_element.html
|
@@ -2,6 +2,9 @@ module GOVUKDesignSystemFormBuilder
|
|
2
2
|
module Elements
|
3
3
|
module Radios
|
4
4
|
class FieldsetRadioButton < Base
|
5
|
+
using PrefixableArray
|
6
|
+
|
7
|
+
include Traits::Label
|
5
8
|
include Traits::Hint
|
6
9
|
include Traits::Conditional
|
7
10
|
|
@@ -22,7 +25,7 @@ module GOVUKDesignSystemFormBuilder
|
|
22
25
|
def html
|
23
26
|
safe_join(
|
24
27
|
[
|
25
|
-
content_tag('div', class:
|
28
|
+
content_tag('div', class: %(#{brand}-radios__item)) do
|
26
29
|
safe_join(
|
27
30
|
[
|
28
31
|
input,
|
@@ -39,7 +42,7 @@ module GOVUKDesignSystemFormBuilder
|
|
39
42
|
private
|
40
43
|
|
41
44
|
def label_element
|
42
|
-
@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)
|
43
46
|
end
|
44
47
|
|
45
48
|
def hint_element
|
@@ -53,12 +56,12 @@ module GOVUKDesignSystemFormBuilder
|
|
53
56
|
id: field_id(link_errors: @link_errors),
|
54
57
|
aria: { describedby: hint_id },
|
55
58
|
data: { 'aria-controls' => @conditional_id },
|
56
|
-
class: %w(
|
59
|
+
class: %w(radios__input).prefix(brand)
|
57
60
|
)
|
58
61
|
end
|
59
62
|
|
60
63
|
def conditional_classes
|
61
|
-
%w(
|
64
|
+
%w(radios__conditional radios__conditional--hidden).prefix(brand)
|
62
65
|
end
|
63
66
|
end
|
64
67
|
end
|
@@ -1,12 +1,14 @@
|
|
1
1
|
module GOVUKDesignSystemFormBuilder
|
2
2
|
module Elements
|
3
3
|
class Select < Base
|
4
|
+
using PrefixableArray
|
5
|
+
|
4
6
|
include Traits::Error
|
5
7
|
include Traits::Label
|
6
8
|
include Traits::Hint
|
7
9
|
include Traits::Supplemental
|
8
10
|
|
9
|
-
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)
|
10
12
|
super(builder, object_name, attribute_name, &block)
|
11
13
|
|
12
14
|
@collection = collection
|
@@ -15,6 +17,7 @@ module GOVUKDesignSystemFormBuilder
|
|
15
17
|
@options = options
|
16
18
|
@html_options = html_options
|
17
19
|
@label = label
|
20
|
+
@caption = caption
|
18
21
|
@hint_text = hint_text
|
19
22
|
end
|
20
23
|
|
@@ -50,8 +53,8 @@ module GOVUKDesignSystemFormBuilder
|
|
50
53
|
end
|
51
54
|
|
52
55
|
def select_classes
|
53
|
-
%w(
|
54
|
-
classes.push(
|
56
|
+
%w(select).prefix(brand).tap do |classes|
|
57
|
+
classes.push(%(#{brand}-select--error)) if has_errors?
|
55
58
|
end
|
56
59
|
end
|
57
60
|
end
|
@@ -1,7 +1,9 @@
|
|
1
1
|
module GOVUKDesignSystemFormBuilder
|
2
2
|
module Elements
|
3
3
|
class Submit < Base
|
4
|
-
|
4
|
+
using PrefixableArray
|
5
|
+
|
6
|
+
def initialize(builder, text, warning:, secondary:, classes:, prevent_double_click:, validate:, &block)
|
5
7
|
fail ArgumentError, 'buttons can be warning or secondary' if warning && secondary
|
6
8
|
|
7
9
|
@builder = builder
|
@@ -9,6 +11,7 @@ module GOVUKDesignSystemFormBuilder
|
|
9
11
|
@prevent_double_click = prevent_double_click
|
10
12
|
@warning = warning
|
11
13
|
@secondary = secondary
|
14
|
+
@classes = classes
|
12
15
|
@validate = validate
|
13
16
|
@block_content = capture { block.call } if block_given?
|
14
17
|
end
|
@@ -18,9 +21,10 @@ module GOVUKDesignSystemFormBuilder
|
|
18
21
|
[
|
19
22
|
@builder.submit(
|
20
23
|
@text,
|
21
|
-
class: %w(
|
24
|
+
class: %w(button).prefix(brand).push(
|
22
25
|
warning_class,
|
23
26
|
secondary_class,
|
27
|
+
@classes,
|
24
28
|
padding_class(@block_content.present?)
|
25
29
|
).compact,
|
26
30
|
**extra_args
|
@@ -33,23 +37,22 @@ module GOVUKDesignSystemFormBuilder
|
|
33
37
|
private
|
34
38
|
|
35
39
|
def warning_class
|
36
|
-
|
40
|
+
%(#{brand}-button--warning) if @warning
|
37
41
|
end
|
38
42
|
|
39
43
|
def secondary_class
|
40
|
-
|
44
|
+
%(#{brand}-button--secondary) if @secondary
|
41
45
|
end
|
42
46
|
|
43
47
|
def padding_class(content_present)
|
44
|
-
|
48
|
+
%(#{brand}-!-margin-right-1) if content_present
|
45
49
|
end
|
46
50
|
|
47
51
|
def extra_args
|
48
52
|
{
|
49
53
|
formnovalidate: !@validate,
|
50
54
|
data: {
|
51
|
-
module:
|
52
|
-
'prevent-double-click' => @prevent_double_click
|
55
|
+
module: %(#{brand}-button), 'prevent-double-click' => @prevent_double_click
|
53
56
|
}.select { |_k, v| v.present? }
|
54
57
|
}
|
55
58
|
end
|