govuk_design_system_formbuilder 1.0.1 → 1.1.0.beta.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/govuk_design_system_formbuilder.rb +47 -3
- data/lib/govuk_design_system_formbuilder/base.rb +7 -56
- data/lib/govuk_design_system_formbuilder/builder.rb +15 -10
- data/lib/govuk_design_system_formbuilder/containers/check_boxes_fieldset.rb +5 -2
- data/lib/govuk_design_system_formbuilder/containers/fieldset.rb +21 -8
- data/lib/govuk_design_system_formbuilder/containers/form_group.rb +1 -1
- data/lib/govuk_design_system_formbuilder/containers/radio_buttons_fieldset.rb +5 -2
- data/lib/govuk_design_system_formbuilder/containers/radios.rb +3 -1
- data/lib/govuk_design_system_formbuilder/containers/supplemental.rb +5 -6
- data/lib/govuk_design_system_formbuilder/elements/check_boxes/collection.rb +6 -2
- data/lib/govuk_design_system_formbuilder/elements/check_boxes/collection_check_box.rb +6 -2
- data/lib/govuk_design_system_formbuilder/elements/check_boxes/fieldset_check_box.rb +4 -1
- data/lib/govuk_design_system_formbuilder/elements/check_boxes/hint.rb +3 -1
- data/lib/govuk_design_system_formbuilder/elements/check_boxes/label.rb +1 -1
- data/lib/govuk_design_system_formbuilder/elements/date.rb +6 -2
- data/lib/govuk_design_system_formbuilder/elements/error_message.rb +3 -1
- data/lib/govuk_design_system_formbuilder/elements/error_summary.rb +3 -1
- data/lib/govuk_design_system_formbuilder/elements/file.rb +6 -1
- data/lib/govuk_design_system_formbuilder/elements/hint.rb +11 -2
- data/lib/govuk_design_system_formbuilder/elements/inputs/base.rb +5 -0
- data/lib/govuk_design_system_formbuilder/elements/label.rb +3 -3
- data/lib/govuk_design_system_formbuilder/elements/radios/collection.rb +6 -2
- data/lib/govuk_design_system_formbuilder/elements/radios/collection_radio_button.rb +8 -4
- data/lib/govuk_design_system_formbuilder/elements/radios/fieldset_radio_button.rb +3 -0
- data/lib/govuk_design_system_formbuilder/elements/select.rb +6 -1
- data/lib/govuk_design_system_formbuilder/elements/submit.rb +1 -1
- data/lib/govuk_design_system_formbuilder/elements/text_area.rb +14 -0
- data/lib/govuk_design_system_formbuilder/traits/collection_item.rb +16 -0
- data/lib/govuk_design_system_formbuilder/traits/conditional.rb +17 -0
- data/lib/govuk_design_system_formbuilder/traits/error.rb +17 -0
- data/lib/govuk_design_system_formbuilder/traits/hint.rb +17 -0
- data/lib/govuk_design_system_formbuilder/traits/label.rb +11 -0
- data/lib/govuk_design_system_formbuilder/traits/localisation.rb +21 -0
- data/lib/govuk_design_system_formbuilder/traits/supplemental.rb +17 -0
- data/lib/govuk_design_system_formbuilder/version.rb +1 -1
- metadata +30 -9
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b9c9499b630e3696a4d327de2e886f683126009aaf04a40d415c52d03fd48fdf
|
4
|
+
data.tar.gz: ae9a0f7b5c079b689da3e719031632a4007ad51b7e7bf4800575d8ba8b529b61
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 32d92bf557aec39313728bb51ac4e43ac4a0ba983749a9bce6b9f2b8a107062ecdbd413bb1fb1583844781230f6c8e33f5f3c4eac84d7cbf432bdf0137e6e89d
|
7
|
+
data.tar.gz: ef4303cf4ea3ee8082f2597f8cf7f5d84e2b3182dd566fc9c77ad9bc3e21867be362356eb3b94519d132bbed8471c473e9ad023ce38fb4aa97208ecf195001df
|
@@ -1,3 +1,13 @@
|
|
1
|
+
require 'active_support/configurable'
|
2
|
+
|
3
|
+
require 'govuk_design_system_formbuilder/traits/collection_item'
|
4
|
+
require 'govuk_design_system_formbuilder/traits/conditional'
|
5
|
+
require 'govuk_design_system_formbuilder/traits/error'
|
6
|
+
require 'govuk_design_system_formbuilder/traits/hint'
|
7
|
+
require 'govuk_design_system_formbuilder/traits/label'
|
8
|
+
require 'govuk_design_system_formbuilder/traits/localisation'
|
9
|
+
require 'govuk_design_system_formbuilder/traits/supplemental'
|
10
|
+
|
1
11
|
require 'govuk_design_system_formbuilder/version'
|
2
12
|
require 'govuk_design_system_formbuilder/builder'
|
3
13
|
require 'govuk_design_system_formbuilder/base'
|
@@ -40,6 +50,42 @@ require 'govuk_design_system_formbuilder/containers/character_count'
|
|
40
50
|
require 'govuk_design_system_formbuilder/containers/supplemental'
|
41
51
|
|
42
52
|
module GOVUKDesignSystemFormBuilder
|
53
|
+
include ActiveSupport::Configurable
|
54
|
+
|
55
|
+
DEFAULTS = {
|
56
|
+
default_legend_size: 'm',
|
57
|
+
default_legend_tag: 'h1',
|
58
|
+
default_submit_button_text: 'Continue',
|
59
|
+
default_radio_divider_text: 'or',
|
60
|
+
default_error_summary_title: 'There is a problem'
|
61
|
+
}.freeze
|
62
|
+
|
63
|
+
DEFAULTS.keys.each { |k| config_accessor(k) { DEFAULTS[k] } }
|
64
|
+
|
65
|
+
class << self
|
66
|
+
# Configure the form builder in the usual manner. All of the
|
67
|
+
# keys in {DEFAULTS} can be configured as per the example below
|
68
|
+
#
|
69
|
+
# @example
|
70
|
+
# GOVUKDesignSystemFormBuilder.configure do |conf|
|
71
|
+
# conf.default_legend_size = 'xl'
|
72
|
+
# conf.default_error_summary_title = 'OMG'
|
73
|
+
# end
|
74
|
+
def configure
|
75
|
+
yield(config)
|
76
|
+
end
|
77
|
+
|
78
|
+
# Resets each of the configurable values to its default
|
79
|
+
#
|
80
|
+
# @note This method is only really intended for use to clean up
|
81
|
+
# during testing
|
82
|
+
def reset!
|
83
|
+
configure do |c|
|
84
|
+
DEFAULTS.each { |k, v| c.send("#{k}=", v) }
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
43
89
|
class FormBuilder < ActionView::Helpers::FormBuilder
|
44
90
|
delegate :content_tag, :tag, :safe_join, :safe_concat, :capture, :link_to, :raw, to: :@template
|
45
91
|
|
@@ -47,7 +93,5 @@ module GOVUKDesignSystemFormBuilder
|
|
47
93
|
end
|
48
94
|
|
49
95
|
# Disable Rails' div.field_with_error wrapper
|
50
|
-
ActionView::Base.field_error_proc =
|
51
|
-
html_tag.html_safe
|
52
|
-
end
|
96
|
+
ActionView::Base.field_error_proc = ->(html_tag, _instance) { html_tag }
|
53
97
|
end
|
@@ -1,29 +1,18 @@
|
|
1
1
|
module GOVUKDesignSystemFormBuilder
|
2
2
|
class Base
|
3
|
+
include Traits::Localisation
|
4
|
+
|
3
5
|
delegate :capture, :content_tag, :safe_join, :tag, :raw, :link_to, to: :@builder
|
6
|
+
delegate :config, to: GOVUKDesignSystemFormBuilder
|
4
7
|
|
5
8
|
def initialize(builder, object_name, attribute_name, &block)
|
6
|
-
@builder
|
7
|
-
@object_name
|
9
|
+
@builder = builder
|
10
|
+
@object_name = object_name
|
8
11
|
@attribute_name = attribute_name
|
9
|
-
@block_content
|
10
|
-
end
|
11
|
-
|
12
|
-
def hint_element
|
13
|
-
@hint_element ||= Elements::Hint.new(@builder, @object_name, @attribute_name, @hint_text)
|
14
|
-
end
|
15
|
-
|
16
|
-
def error_element
|
17
|
-
@error_element ||= Elements::ErrorMessage.new(@builder, @object_name, @attribute_name)
|
18
|
-
end
|
19
|
-
|
20
|
-
def label_element
|
21
|
-
@label_element ||= Elements::Label.new(@builder, @object_name, @attribute_name, **@label)
|
12
|
+
@block_content = capture { block.call } if block_given?
|
22
13
|
end
|
23
14
|
|
24
|
-
|
25
|
-
@supplemental_content ||= Containers::Supplemental.new(@builder, @object_name, @attribute_name, @block_content)
|
26
|
-
end
|
15
|
+
private
|
27
16
|
|
28
17
|
# returns the id value used for the input
|
29
18
|
#
|
@@ -46,53 +35,15 @@ module GOVUKDesignSystemFormBuilder
|
|
46
35
|
end
|
47
36
|
end
|
48
37
|
|
49
|
-
def hint_id
|
50
|
-
return nil unless @hint_text.present?
|
51
|
-
|
52
|
-
build_id('hint')
|
53
|
-
end
|
54
|
-
|
55
|
-
def error_id
|
56
|
-
return nil unless has_errors?
|
57
|
-
|
58
|
-
build_id('error')
|
59
|
-
end
|
60
|
-
|
61
|
-
def conditional_id
|
62
|
-
build_id('conditional')
|
63
|
-
end
|
64
|
-
|
65
|
-
def supplemental_id
|
66
|
-
return nil unless @block_content.present?
|
67
|
-
|
68
|
-
build_id('supplemental')
|
69
|
-
end
|
70
|
-
|
71
|
-
# Provides an id for use by the textual description of character and word limits.
|
72
|
-
#
|
73
|
-
# @note In order for the GOV.UK Frontend JavaScript to pick up this associated field
|
74
|
-
# it has to have the same id as the text area with the additional suffix of '-info'
|
75
|
-
def limit_id
|
76
|
-
[field_id(link_errors: true), 'info'].join('-')
|
77
|
-
end
|
78
|
-
|
79
38
|
def has_errors?
|
80
39
|
@builder.object.errors.any? &&
|
81
40
|
@builder.object.errors.messages.dig(@attribute_name).present?
|
82
41
|
end
|
83
42
|
|
84
|
-
def wrap_conditional(block)
|
85
|
-
content_tag('div', class: conditional_classes, id: conditional_id) do
|
86
|
-
capture { block.call }
|
87
|
-
end
|
88
|
-
end
|
89
|
-
|
90
43
|
def described_by(*ids)
|
91
44
|
ids.flatten.compact.join(' ').presence
|
92
45
|
end
|
93
46
|
|
94
|
-
private
|
95
|
-
|
96
47
|
# Builds the values used for HTML id attributes throughout the builder
|
97
48
|
#
|
98
49
|
# @param id_type [String] a description of the id's type, eg +hint+, +error+
|
@@ -1,5 +1,6 @@
|
|
1
1
|
module GOVUKDesignSystemFormBuilder
|
2
2
|
module Builder
|
3
|
+
delegate :config, to: GOVUKDesignSystemFormBuilder
|
3
4
|
# Generates a input of type +text+
|
4
5
|
#
|
5
6
|
# @param attribute_name [Symbol] The name of the attribute
|
@@ -201,9 +202,12 @@ module GOVUKDesignSystemFormBuilder
|
|
201
202
|
#
|
202
203
|
# @param attribute_name [Symbol] The name of the attribute
|
203
204
|
# @param collection [Enumerable<Object>] Options to be added to the +select+ element
|
204
|
-
# @param value_method [Symbol] The method called against each member of the collection to provide the value
|
205
|
-
#
|
206
|
-
# @param
|
205
|
+
# @param value_method [Symbol, Proc] The method called against each member of the collection to provide the value.
|
206
|
+
# When a +Proc+ is provided it must take a single argument that is a single member of the collection
|
207
|
+
# @param text_method [Symbol, Proc] The method called against each member of the collection to provide the label text.
|
208
|
+
# When a +Proc+ is provided it must take a single argument that is a single member of the collection
|
209
|
+
# @param hint_method [Symbol, Proc] The method called against each member of the collection to provide the hint text.
|
210
|
+
# When a +Proc+ is provided it must take a single argument that is a single member of the collection
|
207
211
|
# @param hint_text [String] The content of the fieldset hint. No hint will be injected if left +nil+
|
208
212
|
# @param legend [Hash] options for configuring the legend
|
209
213
|
# @param inline [Boolean] controls whether the radio buttons are displayed inline or not
|
@@ -214,7 +218,7 @@ module GOVUKDesignSystemFormBuilder
|
|
214
218
|
# @option legend tag [Symbol,String] the tag used for the fieldset's header, defaults to +h1+, defaults to +h1+
|
215
219
|
# @return [ActiveSupport::SafeBuffer] HTML output
|
216
220
|
#
|
217
|
-
# @example A collection of radio buttons for favourite colours
|
221
|
+
# @example A collection of radio buttons for favourite colours, labels capitalised via a proc
|
218
222
|
#
|
219
223
|
# @colours = [
|
220
224
|
# OpenStruct.new(id: 'red', name: 'Red', description: 'Roses are red'),
|
@@ -224,7 +228,7 @@ module GOVUKDesignSystemFormBuilder
|
|
224
228
|
# = f.govuk_collection_radio_buttons :favourite_colour,
|
225
229
|
# @colours,
|
226
230
|
# :id,
|
227
|
-
#
|
231
|
+
# ->(option) { option.name.upcase },
|
228
232
|
# :description,
|
229
233
|
# legend: { text: 'Pick your favourite colour', size: 'm' },
|
230
234
|
# hint_text: 'If you cannot find the exact match choose something close',
|
@@ -307,7 +311,7 @@ module GOVUKDesignSystemFormBuilder
|
|
307
311
|
# @return [ActiveSupport::SafeBuffer] HTML output
|
308
312
|
# @example A custom divider
|
309
313
|
# = govuk_radio_divider 'Alternatively'
|
310
|
-
def govuk_radio_divider(text =
|
314
|
+
def govuk_radio_divider(text = config.default_radio_divider_text)
|
311
315
|
tag.div(text, class: %w(govuk-radios__divider))
|
312
316
|
end
|
313
317
|
|
@@ -316,8 +320,9 @@ module GOVUKDesignSystemFormBuilder
|
|
316
320
|
# @param attribute_name [Symbol] The name of the attribute
|
317
321
|
# @param collection [Enumerable<Object>] Options to be added to the +select+ element
|
318
322
|
# @param value_method [Symbol] The method called against each member of the collection to provide the value
|
319
|
-
# @param text_method [Symbol] The method called against each member of the collection to provide the text
|
320
|
-
# @param hint_method [Symbol] The method called against each member of the collection to provide the hint text
|
323
|
+
# @param text_method [Symbol] The method called against each member of the collection to provide the label text
|
324
|
+
# @param hint_method [Symbol, Proc] The method called against each member of the collection to provide the hint text.
|
325
|
+
# When a +Proc+ is provided it must take a single argument that is a single member of the collection
|
321
326
|
# @param hint_text [String] The content of the fieldset hint. No hint will be injected if left +nil+
|
322
327
|
# @param small [Boolean] controls whether small check boxes are used instead of regular-sized ones
|
323
328
|
# @param legend [Hash] options for configuring the legend
|
@@ -450,7 +455,7 @@ module GOVUKDesignSystemFormBuilder
|
|
450
455
|
# = f.govuk_submit "Proceed", prevent_double_click: true do
|
451
456
|
# = link_to 'Cancel', some_other_path, class: 'govuk-button__secondary'
|
452
457
|
#
|
453
|
-
def govuk_submit(text =
|
458
|
+
def govuk_submit(text = config.default_submit_button_text, warning: false, secondary: false, prevent_double_click: true, validate: false, &block)
|
454
459
|
Elements::Submit.new(self, text, warning: warning, secondary: secondary, prevent_double_click: prevent_double_click, validate: validate, &block).html
|
455
460
|
end
|
456
461
|
|
@@ -496,7 +501,7 @@ module GOVUKDesignSystemFormBuilder
|
|
496
501
|
# = f.govuk_error_summary 'Uh-oh, spaghettios'
|
497
502
|
#
|
498
503
|
# @see https://design-system.service.gov.uk/components/error-summary/ GOV.UK error summary
|
499
|
-
def govuk_error_summary(title =
|
504
|
+
def govuk_error_summary(title = config.default_error_summary_title)
|
500
505
|
Elements::ErrorSummary.new(self, object_name, title).html
|
501
506
|
end
|
502
507
|
|
@@ -1,6 +1,9 @@
|
|
1
1
|
module GOVUKDesignSystemFormBuilder
|
2
2
|
module Containers
|
3
|
-
class CheckBoxesFieldset <
|
3
|
+
class CheckBoxesFieldset < Base
|
4
|
+
include Traits::Error
|
5
|
+
include Traits::Hint
|
6
|
+
|
4
7
|
def initialize(builder, object_name, attribute_name, hint_text:, legend:, small:, &block)
|
5
8
|
super(builder, object_name, attribute_name, &block)
|
6
9
|
|
@@ -12,7 +15,7 @@ module GOVUKDesignSystemFormBuilder
|
|
12
15
|
|
13
16
|
def html
|
14
17
|
Containers::FormGroup.new(@builder, @object_name, @attribute_name).html do
|
15
|
-
Containers::Fieldset.new(@builder, legend: @legend, described_by: [error_element.error_id, hint_element.hint_id]).html do
|
18
|
+
Containers::Fieldset.new(@builder, @object_name, @attribute_name, legend: @legend, described_by: [error_element.error_id, hint_element.hint_id]).html do
|
16
19
|
safe_join(
|
17
20
|
[
|
18
21
|
hint_element.html,
|
@@ -1,13 +1,14 @@
|
|
1
1
|
module GOVUKDesignSystemFormBuilder
|
2
2
|
module Containers
|
3
|
-
class Fieldset <
|
4
|
-
LEGEND_DEFAULTS = { text: nil, tag: 'h1', size: 'm' }.freeze
|
3
|
+
class Fieldset < Base
|
5
4
|
LEGEND_SIZES = %w(xl l m s).freeze
|
6
5
|
|
7
|
-
def initialize(builder, legend: {}, described_by: nil)
|
8
|
-
|
9
|
-
|
10
|
-
@
|
6
|
+
def initialize(builder, object_name = nil, attribute_name = nil, legend: {}, described_by: nil)
|
7
|
+
super(builder, object_name, attribute_name)
|
8
|
+
|
9
|
+
@legend = legend_defaults.merge(legend)
|
10
|
+
@described_by = described_by(described_by)
|
11
|
+
@attribute_name = attribute_name
|
11
12
|
end
|
12
13
|
|
13
14
|
def html
|
@@ -18,14 +19,26 @@ module GOVUKDesignSystemFormBuilder
|
|
18
19
|
|
19
20
|
private
|
20
21
|
|
22
|
+
def legend_defaults
|
23
|
+
{
|
24
|
+
text: nil,
|
25
|
+
tag: config.default_legend_tag,
|
26
|
+
size: config.default_legend_size
|
27
|
+
}
|
28
|
+
end
|
29
|
+
|
21
30
|
def build_legend
|
22
|
-
if
|
31
|
+
if legend_text.present?
|
23
32
|
content_tag('legend', class: legend_classes) do
|
24
|
-
tag.send(@legend.dig(:tag),
|
33
|
+
tag.send(@legend.dig(:tag), legend_text, class: legend_heading_classes)
|
25
34
|
end
|
26
35
|
end
|
27
36
|
end
|
28
37
|
|
38
|
+
def legend_text
|
39
|
+
[@legend.dig(:text), localised_text('fieldset')].compact.first
|
40
|
+
end
|
41
|
+
|
29
42
|
def fieldset_classes
|
30
43
|
%w(govuk-fieldset)
|
31
44
|
end
|
@@ -1,6 +1,9 @@
|
|
1
1
|
module GOVUKDesignSystemFormBuilder
|
2
2
|
module Containers
|
3
|
-
class RadioButtonsFieldset <
|
3
|
+
class RadioButtonsFieldset < Base
|
4
|
+
include Traits::Hint
|
5
|
+
include Traits::Error
|
6
|
+
|
4
7
|
def initialize(builder, object_name, attribute_name, hint_text:, legend:, inline:, small:, &block)
|
5
8
|
super(builder, object_name, attribute_name)
|
6
9
|
|
@@ -13,7 +16,7 @@ module GOVUKDesignSystemFormBuilder
|
|
13
16
|
|
14
17
|
def html
|
15
18
|
Containers::FormGroup.new(@builder, @object_name, @attribute_name).html do
|
16
|
-
Containers::Fieldset.new(@builder, legend: @legend, described_by: [error_element.error_id, hint_element.hint_id]).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
|
17
20
|
safe_join(
|
18
21
|
[
|
19
22
|
hint_element.html,
|
@@ -1,15 +1,14 @@
|
|
1
1
|
module GOVUKDesignSystemFormBuilder
|
2
2
|
module Containers
|
3
|
-
class Supplemental <
|
3
|
+
class Supplemental < Base
|
4
4
|
def initialize(builder, object_name, attribute_name, content)
|
5
|
-
|
6
|
-
|
7
|
-
@
|
8
|
-
@content = content
|
5
|
+
super(builder, object_name, attribute_name)
|
6
|
+
|
7
|
+
@content = content
|
9
8
|
end
|
10
9
|
|
11
10
|
def html
|
12
|
-
return nil
|
11
|
+
return nil if @content.blank?
|
13
12
|
|
14
13
|
content_tag('div', id: supplemental_id) do
|
15
14
|
@content
|
@@ -1,7 +1,11 @@
|
|
1
1
|
module GOVUKDesignSystemFormBuilder
|
2
2
|
module Elements
|
3
3
|
module CheckBoxes
|
4
|
-
class Collection <
|
4
|
+
class Collection < Base
|
5
|
+
include Traits::Error
|
6
|
+
include Traits::Hint
|
7
|
+
include Traits::Supplemental
|
8
|
+
|
5
9
|
def initialize(builder, object_name, attribute_name, collection, value_method:, text_method:, hint_method: nil, hint_text:, legend:, small:, &block)
|
6
10
|
super(builder, object_name, attribute_name, &block)
|
7
11
|
|
@@ -16,7 +20,7 @@ module GOVUKDesignSystemFormBuilder
|
|
16
20
|
|
17
21
|
def html
|
18
22
|
Containers::FormGroup.new(@builder, @object_name, @attribute_name).html do
|
19
|
-
Containers::Fieldset.new(@builder, legend: @legend, described_by: [error_id, hint_id, supplemental_id]).html do
|
23
|
+
Containers::Fieldset.new(@builder, @object_name, @attribute_name, legend: @legend, described_by: [error_id, hint_id, supplemental_id]).html do
|
20
24
|
safe_join(
|
21
25
|
[
|
22
26
|
hint_element.html,
|
@@ -1,13 +1,17 @@
|
|
1
1
|
module GOVUKDesignSystemFormBuilder
|
2
2
|
module Elements
|
3
3
|
module CheckBoxes
|
4
|
-
class CollectionCheckBox <
|
4
|
+
class CollectionCheckBox < Base
|
5
|
+
include Traits::CollectionItem
|
6
|
+
include Traits::Hint
|
7
|
+
|
5
8
|
def initialize(builder, object_name, attribute_name, checkbox, hint_method = nil, link_errors: false)
|
6
9
|
super(builder, object_name, attribute_name)
|
10
|
+
|
7
11
|
@checkbox = checkbox
|
8
12
|
@item = checkbox.object
|
9
13
|
@value = checkbox.value
|
10
|
-
@hint_text = @item
|
14
|
+
@hint_text = retrieve(@item, hint_method)
|
11
15
|
@link_errors = link_errors
|
12
16
|
end
|
13
17
|
|
@@ -1,7 +1,10 @@
|
|
1
1
|
module GOVUKDesignSystemFormBuilder
|
2
2
|
module Elements
|
3
3
|
module CheckBoxes
|
4
|
-
class FieldsetCheckBox <
|
4
|
+
class FieldsetCheckBox < Base
|
5
|
+
include Traits::Hint
|
6
|
+
include Traits::Conditional
|
7
|
+
|
5
8
|
def initialize(builder, object_name, attribute_name, value, label:, hint_text:, link_errors:, multiple:, &block)
|
6
9
|
super(builder, object_name, attribute_name)
|
7
10
|
|
@@ -1,7 +1,9 @@
|
|
1
1
|
module GOVUKDesignSystemFormBuilder
|
2
2
|
module Elements
|
3
3
|
module CheckBoxes
|
4
|
-
class Hint <
|
4
|
+
class Hint < Base
|
5
|
+
include Traits::Hint
|
6
|
+
|
5
7
|
def initialize(builder, object_name, attribute_name, hint_text, value:)
|
6
8
|
super(builder, object_name, attribute_name)
|
7
9
|
|
@@ -1,7 +1,7 @@
|
|
1
1
|
module GOVUKDesignSystemFormBuilder
|
2
2
|
module Elements
|
3
3
|
module CheckBoxes
|
4
|
-
class Label <
|
4
|
+
class Label < Base
|
5
5
|
def initialize(builder, object_name, attribute_name, checkbox, value:, link_errors: true)
|
6
6
|
super(builder, object_name, attribute_name)
|
7
7
|
|
@@ -1,6 +1,10 @@
|
|
1
1
|
module GOVUKDesignSystemFormBuilder
|
2
2
|
module Elements
|
3
|
-
class Date <
|
3
|
+
class Date < Base
|
4
|
+
include Traits::Error
|
5
|
+
include Traits::Hint
|
6
|
+
include Traits::Supplemental
|
7
|
+
|
4
8
|
SEGMENTS = { day: '3i', month: '2i', year: '1i' }.freeze
|
5
9
|
|
6
10
|
def initialize(builder, object_name, attribute_name, legend:, hint_text:, date_of_birth: false, omit_day:, &block)
|
@@ -14,7 +18,7 @@ module GOVUKDesignSystemFormBuilder
|
|
14
18
|
|
15
19
|
def html
|
16
20
|
Containers::FormGroup.new(@builder, @object_name, @attribute_name).html do
|
17
|
-
Containers::Fieldset.new(@builder, legend: @legend, described_by: [error_id, hint_id, supplemental_id]).html do
|
21
|
+
Containers::Fieldset.new(@builder, @object_name, @attribute_name, legend: @legend, described_by: [error_id, hint_id, supplemental_id]).html do
|
18
22
|
safe_join(
|
19
23
|
[
|
20
24
|
hint_element.html,
|
@@ -1,6 +1,8 @@
|
|
1
1
|
module GOVUKDesignSystemFormBuilder
|
2
2
|
module Elements
|
3
|
-
class ErrorMessage <
|
3
|
+
class ErrorMessage < Base
|
4
|
+
include Traits::Error
|
5
|
+
|
4
6
|
def initialize(builder, object_name, attribute_name)
|
5
7
|
super(builder, object_name, attribute_name)
|
6
8
|
end
|
@@ -1,6 +1,11 @@
|
|
1
1
|
module GOVUKDesignSystemFormBuilder
|
2
2
|
module Elements
|
3
|
-
class File <
|
3
|
+
class File < Base
|
4
|
+
include Traits::Error
|
5
|
+
include Traits::Hint
|
6
|
+
include Traits::Label
|
7
|
+
include Traits::Supplemental
|
8
|
+
|
4
9
|
def initialize(builder, object_name, attribute_name, hint_text:, label:, **extra_args, &block)
|
5
10
|
super(builder, object_name, attribute_name, &block)
|
6
11
|
|
@@ -1,11 +1,13 @@
|
|
1
1
|
module GOVUKDesignSystemFormBuilder
|
2
2
|
module Elements
|
3
|
-
class Hint <
|
3
|
+
class Hint < Base
|
4
|
+
include Traits::Hint
|
5
|
+
|
4
6
|
def initialize(builder, object_name, attribute_name, text, value = nil, radio: false, checkbox: false)
|
5
7
|
super(builder, object_name, attribute_name)
|
6
8
|
|
7
9
|
@value = value
|
8
|
-
@hint_text = text
|
10
|
+
@hint_text = hint_text(text)
|
9
11
|
@radio_class = radio_class(radio)
|
10
12
|
@checkbox_class = checkbox_class(checkbox)
|
11
13
|
end
|
@@ -18,6 +20,13 @@ module GOVUKDesignSystemFormBuilder
|
|
18
20
|
|
19
21
|
private
|
20
22
|
|
23
|
+
def hint_text(supplied)
|
24
|
+
[
|
25
|
+
supplied.presence,
|
26
|
+
localised_text('hint')
|
27
|
+
].compact.first
|
28
|
+
end
|
29
|
+
|
21
30
|
def hint_classes
|
22
31
|
%w(govuk-hint).push(@radio_class, @checkbox_class).compact
|
23
32
|
end
|
@@ -2,6 +2,11 @@ module GOVUKDesignSystemFormBuilder
|
|
2
2
|
module Elements
|
3
3
|
module Inputs
|
4
4
|
class Base < GOVUKDesignSystemFormBuilder::Base
|
5
|
+
include Traits::Error
|
6
|
+
include Traits::Hint
|
7
|
+
include Traits::Label
|
8
|
+
include Traits::Supplemental
|
9
|
+
|
5
10
|
def initialize(builder, object_name, attribute_name, hint_text:, label:, width:, **extra_args, &block)
|
6
11
|
super(builder, object_name, attribute_name, &block)
|
7
12
|
|
@@ -1,6 +1,6 @@
|
|
1
1
|
module GOVUKDesignSystemFormBuilder
|
2
2
|
module Elements
|
3
|
-
class Label <
|
3
|
+
class Label < Base
|
4
4
|
def initialize(builder, object_name, attribute_name, text: nil, value: nil, size: nil, hidden: false, radio: false, checkbox: false, tag: nil, link_errors: true)
|
5
5
|
super(builder, object_name, attribute_name)
|
6
6
|
|
@@ -37,12 +37,12 @@ module GOVUKDesignSystemFormBuilder
|
|
37
37
|
end
|
38
38
|
|
39
39
|
def label_text(option_text, hidden)
|
40
|
-
text = [option_text, @value, @attribute_name.capitalize].compact.first
|
40
|
+
text = [option_text, @value, localised_text('label'), @attribute_name.capitalize].compact.first.to_s
|
41
41
|
|
42
42
|
if hidden
|
43
43
|
tag.span(text, class: %w(govuk-visually-hidden))
|
44
44
|
else
|
45
|
-
|
45
|
+
text
|
46
46
|
end
|
47
47
|
end
|
48
48
|
|
@@ -1,7 +1,11 @@
|
|
1
1
|
module GOVUKDesignSystemFormBuilder
|
2
2
|
module Elements
|
3
3
|
module Radios
|
4
|
-
class Collection <
|
4
|
+
class Collection < Base
|
5
|
+
include Traits::Error
|
6
|
+
include Traits::Hint
|
7
|
+
include Traits::Supplemental
|
8
|
+
|
5
9
|
def initialize(builder, object_name, attribute_name, collection, value_method:, text_method:, hint_method:, hint_text:, legend:, inline:, small:, bold_labels:, &block)
|
6
10
|
super(builder, object_name, attribute_name, &block)
|
7
11
|
|
@@ -18,7 +22,7 @@ module GOVUKDesignSystemFormBuilder
|
|
18
22
|
|
19
23
|
def html
|
20
24
|
Containers::FormGroup.new(@builder, @object_name, @attribute_name).html do
|
21
|
-
Containers::Fieldset.new(@builder, legend: @legend, described_by: [error_id, hint_id, supplemental_id]).html do
|
25
|
+
Containers::Fieldset.new(@builder, @object_name, @attribute_name, legend: @legend, described_by: [error_id, hint_id, supplemental_id]).html do
|
22
26
|
safe_join(
|
23
27
|
[
|
24
28
|
hint_element.html,
|
@@ -2,16 +2,20 @@ module GOVUKDesignSystemFormBuilder
|
|
2
2
|
module Elements
|
3
3
|
module Radios
|
4
4
|
class CollectionRadioButton < Base
|
5
|
+
include Traits::Hint
|
6
|
+
include Traits::CollectionItem
|
7
|
+
|
5
8
|
# @param link_errors [Boolean] used to control the id generated for radio buttons. The
|
6
9
|
# error summary requires that the id of the first radio is linked-to from the corresponding
|
7
10
|
# error message. As when the summary is built what happens later in the form is unknown, we
|
8
11
|
# need to control this to ensure the link is generated correctly
|
9
12
|
def initialize(builder, object_name, attribute_name, item, value_method:, text_method:, hint_method:, link_errors: false, bold_labels:)
|
10
13
|
super(builder, object_name, attribute_name)
|
14
|
+
|
11
15
|
@item = item
|
12
|
-
@value = item
|
13
|
-
@
|
14
|
-
@hint_text = item
|
16
|
+
@value = retrieve(item, value_method)
|
17
|
+
@label_text = retrieve(item, text_method)
|
18
|
+
@hint_text = retrieve(item, hint_method)
|
15
19
|
@link_errors = link_errors
|
16
20
|
@bold_labels = bold_labels
|
17
21
|
end
|
@@ -41,7 +45,7 @@ module GOVUKDesignSystemFormBuilder
|
|
41
45
|
end
|
42
46
|
|
43
47
|
def label_element
|
44
|
-
@label_element ||= Elements::Label.new(@builder, @object_name, @attribute_name, text: @
|
48
|
+
@label_element ||= Elements::Label.new(@builder, @object_name, @attribute_name, text: @label_text, value: @value, radio: true, size: label_size, link_errors: @link_errors)
|
45
49
|
end
|
46
50
|
|
47
51
|
def label_size
|
@@ -2,6 +2,9 @@ module GOVUKDesignSystemFormBuilder
|
|
2
2
|
module Elements
|
3
3
|
module Radios
|
4
4
|
class FieldsetRadioButton < Base
|
5
|
+
include Traits::Hint
|
6
|
+
include Traits::Conditional
|
7
|
+
|
5
8
|
def initialize(builder, object_name, attribute_name, value, label:, hint_text:, link_errors:, &block)
|
6
9
|
super(builder, object_name, attribute_name)
|
7
10
|
|
@@ -1,6 +1,11 @@
|
|
1
1
|
module GOVUKDesignSystemFormBuilder
|
2
2
|
module Elements
|
3
|
-
class Select <
|
3
|
+
class Select < Base
|
4
|
+
include Traits::Error
|
5
|
+
include Traits::Label
|
6
|
+
include Traits::Hint
|
7
|
+
include Traits::Supplemental
|
8
|
+
|
4
9
|
def initialize(builder, object_name, attribute_name, collection, value_method:, text_method:, options: {}, html_options: {}, hint_text:, label:, &block)
|
5
10
|
super(builder, object_name, attribute_name, &block)
|
6
11
|
|
@@ -1,6 +1,6 @@
|
|
1
1
|
module GOVUKDesignSystemFormBuilder
|
2
2
|
module Elements
|
3
|
-
class Submit <
|
3
|
+
class Submit < Base
|
4
4
|
def initialize(builder, text, warning:, secondary:, prevent_double_click:, validate:, &block)
|
5
5
|
fail ArgumentError, 'buttons can be warning or secondary' if warning && secondary
|
6
6
|
|
@@ -1,8 +1,14 @@
|
|
1
1
|
module GOVUKDesignSystemFormBuilder
|
2
2
|
module Elements
|
3
3
|
class TextArea < Base
|
4
|
+
include Traits::Error
|
5
|
+
include Traits::Hint
|
6
|
+
include Traits::Label
|
7
|
+
include Traits::Supplemental
|
8
|
+
|
4
9
|
def initialize(builder, object_name, attribute_name, hint_text:, label:, rows:, max_words:, max_chars:, threshold:, **extra_args, &block)
|
5
10
|
super(builder, object_name, attribute_name, &block)
|
11
|
+
|
6
12
|
@label = label
|
7
13
|
@hint_text = hint_text
|
8
14
|
@extra_args = extra_args
|
@@ -43,6 +49,14 @@ module GOVUKDesignSystemFormBuilder
|
|
43
49
|
end
|
44
50
|
end
|
45
51
|
|
52
|
+
# Provides an id for use by the textual description of character and word limits.
|
53
|
+
#
|
54
|
+
# @note In order for the GOV.UK Frontend JavaScript to pick up this associated field
|
55
|
+
# it has to have the same id as the text area with the additional suffix of '-info'
|
56
|
+
def limit_id
|
57
|
+
[field_id(link_errors: true), 'info'].join('-')
|
58
|
+
end
|
59
|
+
|
46
60
|
def limit?
|
47
61
|
@max_words || @max_chars
|
48
62
|
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module GOVUKDesignSystemFormBuilder
|
2
|
+
module Traits
|
3
|
+
module Conditional
|
4
|
+
private
|
5
|
+
|
6
|
+
def conditional_id
|
7
|
+
build_id('conditional')
|
8
|
+
end
|
9
|
+
|
10
|
+
def wrap_conditional(block)
|
11
|
+
content_tag('div', class: conditional_classes, id: conditional_id) do
|
12
|
+
capture { block.call }
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module GOVUKDesignSystemFormBuilder
|
2
|
+
module Traits
|
3
|
+
module Error
|
4
|
+
def error_id
|
5
|
+
return nil unless has_errors?
|
6
|
+
|
7
|
+
build_id('error')
|
8
|
+
end
|
9
|
+
|
10
|
+
private
|
11
|
+
|
12
|
+
def error_element
|
13
|
+
@error_element ||= Elements::ErrorMessage.new(@builder, @object_name, @attribute_name)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module GOVUKDesignSystemFormBuilder
|
2
|
+
module Traits
|
3
|
+
module Hint
|
4
|
+
def hint_id
|
5
|
+
return nil if @hint_text.blank?
|
6
|
+
|
7
|
+
build_id('hint')
|
8
|
+
end
|
9
|
+
|
10
|
+
private
|
11
|
+
|
12
|
+
def hint_element
|
13
|
+
@hint_element ||= Elements::Hint.new(@builder, @object_name, @attribute_name, @hint_text)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module GOVUKDesignSystemFormBuilder
|
2
|
+
module Traits
|
3
|
+
module Localisation
|
4
|
+
private
|
5
|
+
|
6
|
+
def localised_text(context)
|
7
|
+
key = localisation_key(context)
|
8
|
+
|
9
|
+
return nil unless I18n.exists?(key)
|
10
|
+
|
11
|
+
I18n.translate(key)
|
12
|
+
end
|
13
|
+
|
14
|
+
def localisation_key(context)
|
15
|
+
return nil unless @object_name.present? && @attribute_name.present?
|
16
|
+
|
17
|
+
['helpers', context, @object_name, @attribute_name].join('.')
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module GOVUKDesignSystemFormBuilder
|
2
|
+
module Traits
|
3
|
+
module Supplemental
|
4
|
+
def supplemental_id
|
5
|
+
return nil if @block_content.blank?
|
6
|
+
|
7
|
+
build_id('supplemental')
|
8
|
+
end
|
9
|
+
|
10
|
+
private
|
11
|
+
|
12
|
+
def supplemental_content
|
13
|
+
@supplemental_content ||= Containers::Supplemental.new(@builder, @object_name, @attribute_name, @block_content)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: govuk_design_system_formbuilder
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.1
|
4
|
+
version: 1.1.0.beta.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Peter Yates
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-
|
11
|
+
date: 2019-12-17 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: actionview
|
@@ -53,19 +53,19 @@ dependencies:
|
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: '5.2'
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
|
-
name: govuk
|
56
|
+
name: rubocop-govuk
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
58
58
|
requirements:
|
59
59
|
- - "~>"
|
60
60
|
- !ruby/object:Gem::Version
|
61
|
-
version: '
|
61
|
+
version: '2'
|
62
62
|
type: :development
|
63
63
|
prerelease: false
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
66
|
- - "~>"
|
67
67
|
- !ruby/object:Gem::Version
|
68
|
-
version: '
|
68
|
+
version: '2'
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: pry
|
71
71
|
requirement: !ruby/object:Gem::Requirement
|
@@ -204,14 +204,14 @@ dependencies:
|
|
204
204
|
requirements:
|
205
205
|
- - "~>"
|
206
206
|
- !ruby/object:Gem::Version
|
207
|
-
version: 3.
|
207
|
+
version: 3.13.0
|
208
208
|
type: :development
|
209
209
|
prerelease: false
|
210
210
|
version_requirements: !ruby/object:Gem::Requirement
|
211
211
|
requirements:
|
212
212
|
- - "~>"
|
213
213
|
- !ruby/object:Gem::Version
|
214
|
-
version: 3.
|
214
|
+
version: 3.13.0
|
215
215
|
- !ruby/object:Gem::Dependency
|
216
216
|
name: sassc
|
217
217
|
requirement: !ruby/object:Gem::Requirement
|
@@ -226,6 +226,20 @@ dependencies:
|
|
226
226
|
- - "~>"
|
227
227
|
- !ruby/object:Gem::Version
|
228
228
|
version: 2.2.1
|
229
|
+
- !ruby/object:Gem::Dependency
|
230
|
+
name: sass
|
231
|
+
requirement: !ruby/object:Gem::Requirement
|
232
|
+
requirements:
|
233
|
+
- - ">="
|
234
|
+
- !ruby/object:Gem::Version
|
235
|
+
version: '0'
|
236
|
+
type: :development
|
237
|
+
prerelease: false
|
238
|
+
version_requirements: !ruby/object:Gem::Requirement
|
239
|
+
requirements:
|
240
|
+
- - ">="
|
241
|
+
- !ruby/object:Gem::Version
|
242
|
+
version: '0'
|
229
243
|
- !ruby/object:Gem::Dependency
|
230
244
|
name: slim
|
231
245
|
requirement: !ruby/object:Gem::Requirement
|
@@ -283,6 +297,13 @@ files:
|
|
283
297
|
- lib/govuk_design_system_formbuilder/elements/select.rb
|
284
298
|
- lib/govuk_design_system_formbuilder/elements/submit.rb
|
285
299
|
- lib/govuk_design_system_formbuilder/elements/text_area.rb
|
300
|
+
- lib/govuk_design_system_formbuilder/traits/collection_item.rb
|
301
|
+
- lib/govuk_design_system_formbuilder/traits/conditional.rb
|
302
|
+
- lib/govuk_design_system_formbuilder/traits/error.rb
|
303
|
+
- lib/govuk_design_system_formbuilder/traits/hint.rb
|
304
|
+
- lib/govuk_design_system_formbuilder/traits/label.rb
|
305
|
+
- lib/govuk_design_system_formbuilder/traits/localisation.rb
|
306
|
+
- lib/govuk_design_system_formbuilder/traits/supplemental.rb
|
286
307
|
- lib/govuk_design_system_formbuilder/version.rb
|
287
308
|
homepage: https://govuk-form-builder.netlify.com
|
288
309
|
licenses:
|
@@ -304,9 +325,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
304
325
|
version: '0'
|
305
326
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
306
327
|
requirements:
|
307
|
-
- - "
|
328
|
+
- - ">"
|
308
329
|
- !ruby/object:Gem::Version
|
309
|
-
version:
|
330
|
+
version: 1.3.1
|
310
331
|
requirements: []
|
311
332
|
rubygems_version: 3.0.3
|
312
333
|
signing_key:
|