govuk_design_system_formbuilder 2.2.0 → 2.5.1b1

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.
Files changed (45) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE +21 -0
  3. data/README.md +2 -2
  4. data/lib/govuk_design_system_formbuilder.rb +8 -1
  5. data/lib/govuk_design_system_formbuilder/base.rb +16 -1
  6. data/lib/govuk_design_system_formbuilder/builder.rb +60 -15
  7. data/lib/govuk_design_system_formbuilder/containers/check_boxes_fieldset.rb +2 -2
  8. data/lib/govuk_design_system_formbuilder/containers/fieldset.rb +12 -9
  9. data/lib/govuk_design_system_formbuilder/containers/radio_buttons_fieldset.rb +2 -2
  10. data/lib/govuk_design_system_formbuilder/containers/supplemental.rb +1 -1
  11. data/lib/govuk_design_system_formbuilder/elements/caption.rb +3 -3
  12. data/lib/govuk_design_system_formbuilder/elements/check_boxes/collection.rb +2 -2
  13. data/lib/govuk_design_system_formbuilder/elements/check_boxes/collection_check_box.rb +2 -2
  14. data/lib/govuk_design_system_formbuilder/elements/check_boxes/fieldset_check_box.rb +5 -3
  15. data/lib/govuk_design_system_formbuilder/elements/collection_select.rb +52 -0
  16. data/lib/govuk_design_system_formbuilder/elements/date.rb +37 -15
  17. data/lib/govuk_design_system_formbuilder/elements/error_message.rb +1 -1
  18. data/lib/govuk_design_system_formbuilder/elements/error_summary.rb +11 -4
  19. data/lib/govuk_design_system_formbuilder/elements/file.rb +3 -2
  20. data/lib/govuk_design_system_formbuilder/elements/hint.rb +1 -1
  21. data/lib/govuk_design_system_formbuilder/elements/inputs/email.rb +1 -0
  22. data/lib/govuk_design_system_formbuilder/elements/inputs/number.rb +1 -0
  23. data/lib/govuk_design_system_formbuilder/elements/inputs/password.rb +1 -0
  24. data/lib/govuk_design_system_formbuilder/elements/inputs/phone.rb +1 -0
  25. data/lib/govuk_design_system_formbuilder/elements/inputs/text.rb +1 -0
  26. data/lib/govuk_design_system_formbuilder/elements/inputs/url.rb +1 -0
  27. data/lib/govuk_design_system_formbuilder/elements/label.rb +3 -3
  28. data/lib/govuk_design_system_formbuilder/elements/legend.rb +3 -5
  29. data/lib/govuk_design_system_formbuilder/elements/radios/collection.rb +3 -3
  30. data/lib/govuk_design_system_formbuilder/elements/radios/collection_radio_button.rb +2 -2
  31. data/lib/govuk_design_system_formbuilder/elements/radios/fieldset_radio_button.rb +9 -7
  32. data/lib/govuk_design_system_formbuilder/elements/select.rb +22 -32
  33. data/lib/govuk_design_system_formbuilder/elements/submit.rb +17 -14
  34. data/lib/govuk_design_system_formbuilder/elements/text_area.rb +5 -4
  35. data/lib/govuk_design_system_formbuilder/traits/caption.rb +1 -1
  36. data/lib/govuk_design_system_formbuilder/traits/error.rb +2 -2
  37. data/lib/govuk_design_system_formbuilder/traits/fieldset_item.rb +2 -2
  38. data/lib/govuk_design_system_formbuilder/traits/hint.rb +2 -2
  39. data/lib/govuk_design_system_formbuilder/traits/html_attributes.rb +51 -0
  40. data/lib/govuk_design_system_formbuilder/traits/input.rb +5 -5
  41. data/lib/govuk_design_system_formbuilder/traits/label.rb +1 -1
  42. data/lib/govuk_design_system_formbuilder/traits/select.rb +15 -0
  43. data/lib/govuk_design_system_formbuilder/traits/supplemental.rb +2 -2
  44. data/lib/govuk_design_system_formbuilder/version.rb +1 -1
  45. metadata +48 -16
@@ -2,8 +2,9 @@ module GOVUKDesignSystemFormBuilder
2
2
  module Elements
3
3
  class Submit < Base
4
4
  using PrefixableArray
5
+ include Traits::HTMLAttributes
5
6
 
6
- def initialize(builder, text, warning:, secondary:, classes:, prevent_double_click:, validate:, disabled:, &block)
7
+ def initialize(builder, text, warning:, secondary:, classes:, prevent_double_click:, validate:, disabled:, **kwargs, &block)
7
8
  super(builder, nil, nil)
8
9
 
9
10
  fail ArgumentError, 'buttons can be warning or secondary' if warning && secondary
@@ -15,39 +16,33 @@ module GOVUKDesignSystemFormBuilder
15
16
  @classes = classes
16
17
  @validate = validate
17
18
  @disabled = disabled
19
+ @html_attributes = kwargs
18
20
  @block_content = capture { block.call } if block_given?
19
21
  end
20
22
 
21
23
  def html
22
- @block_content.present? ? button_group : buttons
24
+ @block_content.present? ? button_group : submit
23
25
  end
24
26
 
25
27
  private
26
28
 
27
- def buttons
28
- safe_join([submit, @block_content])
29
- end
30
-
31
29
  def button_group
32
30
  Containers::ButtonGroup.new(@builder, buttons).html
33
31
  end
34
32
 
35
- def submit
36
- @builder.submit(@text, class: classes, **options)
33
+ def buttons
34
+ safe_join([submit, @block_content])
37
35
  end
38
36
 
39
- def classes
40
- %w(button)
41
- .prefix(brand)
42
- .push(warning_class, secondary_class, disabled_class, custom_classes)
43
- .flatten
44
- .compact
37
+ def submit
38
+ @builder.submit(@text, **attributes(@html_attributes))
45
39
  end
46
40
 
47
41
  def options
48
42
  {
49
43
  formnovalidate: !@validate,
50
44
  disabled: @disabled,
45
+ class: classes,
51
46
  data: {
52
47
  module: %(#{brand}-button),
53
48
  'prevent-double-click': @prevent_double_click
@@ -55,6 +50,14 @@ module GOVUKDesignSystemFormBuilder
55
50
  }
56
51
  end
57
52
 
53
+ def classes
54
+ %w(button)
55
+ .prefix(brand)
56
+ .push(warning_class, secondary_class, disabled_class, custom_classes)
57
+ .flatten
58
+ .compact
59
+ end
60
+
58
61
  def warning_class
59
62
  %(#{brand}-button--warning) if @warning
60
63
  end
@@ -7,6 +7,7 @@ module GOVUKDesignSystemFormBuilder
7
7
  include Traits::Hint
8
8
  include Traits::Label
9
9
  include Traits::Supplemental
10
+ include Traits::HTMLAttributes
10
11
 
11
12
  def initialize(builder, object_name, attribute_name, hint:, label:, caption:, rows:, max_words:, max_chars:, threshold:, form_group:, **kwargs, &block)
12
13
  super(builder, object_name, attribute_name, &block)
@@ -24,7 +25,7 @@ module GOVUKDesignSystemFormBuilder
24
25
 
25
26
  def html
26
27
  Containers::CharacterCount.new(@builder, **character_count_options).html do
27
- Containers::FormGroup.new(@builder, @object_name, @attribute_name, **@form_group).html do
28
+ Containers::FormGroup.new(*bound, **@form_group).html do
28
29
  safe_join([label_element, supplemental_content, hint_element, error_element, text_area, limit_description])
29
30
  end
30
31
  end
@@ -37,7 +38,7 @@ module GOVUKDesignSystemFormBuilder
37
38
  end
38
39
 
39
40
  def text_area
40
- @builder.text_area(@attribute_name, **options, **@html_attributes)
41
+ @builder.text_area(@attribute_name, **attributes(@html_attributes))
41
42
  end
42
43
 
43
44
  def classes
@@ -77,7 +78,7 @@ module GOVUKDesignSystemFormBuilder
77
78
  end
78
79
 
79
80
  def limit_description
80
- return nil unless limit?
81
+ return unless limit?
81
82
 
82
83
  tag.span(id: limit_id, class: limit_description_classes, aria: { live: 'polite' }) do
83
84
  "You can enter up to #{limit_quantity} #{limit_type}"
@@ -89,7 +90,7 @@ module GOVUKDesignSystemFormBuilder
89
90
  end
90
91
 
91
92
  def limit_description_id
92
- return nil unless limit?
93
+ return unless limit?
93
94
 
94
95
  limit_id
95
96
  end
@@ -7,7 +7,7 @@ module GOVUKDesignSystemFormBuilder
7
7
  @caption_element ||= if @caption.nil?
8
8
  Elements::Null.new
9
9
  else
10
- Elements::Caption.new(@builder, @object_name, @attribute_name, **@caption)
10
+ Elements::Caption.new(*bound, **@caption)
11
11
  end
12
12
  end
13
13
  end
@@ -2,7 +2,7 @@ module GOVUKDesignSystemFormBuilder
2
2
  module Traits
3
3
  module Error
4
4
  def error_id
5
- return nil unless has_errors?
5
+ return unless has_errors?
6
6
 
7
7
  build_id('error')
8
8
  end
@@ -10,7 +10,7 @@ module GOVUKDesignSystemFormBuilder
10
10
  private
11
11
 
12
12
  def error_element
13
- @error_element ||= Elements::ErrorMessage.new(@builder, @object_name, @attribute_name)
13
+ @error_element ||= Elements::ErrorMessage.new(*bound)
14
14
  end
15
15
  end
16
16
  end
@@ -7,7 +7,7 @@ module GOVUKDesignSystemFormBuilder
7
7
  @label_element ||= if @label.nil?
8
8
  Elements::Null.new
9
9
  else
10
- Elements::Label.new(@builder, @object_name, @attribute_name, **label_content, **label_options)
10
+ Elements::Label.new(*bound, **label_content, **label_options)
11
11
  end
12
12
  end
13
13
 
@@ -19,7 +19,7 @@ module GOVUKDesignSystemFormBuilder
19
19
  @hint_element ||= if @hint.nil?
20
20
  Elements::Null.new
21
21
  else
22
- Elements::Hint.new(@builder, @object_name, @attribute_name, **hint_options, **hint_content)
22
+ Elements::Hint.new(*bound, **hint_options, **hint_content)
23
23
  end
24
24
  end
25
25
 
@@ -2,7 +2,7 @@ module GOVUKDesignSystemFormBuilder
2
2
  module Traits
3
3
  module Hint
4
4
  def hint_id
5
- return nil unless hint_element.active?
5
+ return unless hint_element.active?
6
6
 
7
7
  build_id('hint')
8
8
  end
@@ -13,7 +13,7 @@ module GOVUKDesignSystemFormBuilder
13
13
  @hint_element ||= if @hint.nil?
14
14
  Elements::Null.new
15
15
  else
16
- Elements::Hint.new(@builder, @object_name, @attribute_name, **hint_content)
16
+ Elements::Hint.new(*bound, **hint_content)
17
17
  end
18
18
  end
19
19
 
@@ -0,0 +1,51 @@
1
+ module GOVUKDesignSystemFormBuilder
2
+ module Traits
3
+ module HTMLAttributes
4
+ # Attributes eases working with default and custom attributes by
5
+ # * deeply merging them so both the default (required) attributes are
6
+ # present
7
+ # * joins the arrays into strings to maintain Rails 6.0.3 compatibility
8
+ class Attributes
9
+ def initialize(defaults, custom)
10
+ @merged = defaults.deeper_merge(deep_split_values(custom))
11
+ end
12
+
13
+ def to_h
14
+ deep_join_values(@merged)
15
+ end
16
+
17
+ private
18
+
19
+ def deep_split_values(hash)
20
+ hash.each.with_object({}) do |(key, value), result|
21
+ result[key] = case value
22
+ when Hash
23
+ deep_split_values(value)
24
+ when String
25
+ value.split
26
+ else
27
+ value
28
+ end
29
+ end
30
+ end
31
+
32
+ def deep_join_values(hash)
33
+ hash.each.with_object({}) do |(key, value), result|
34
+ result[key] = case value
35
+ when Hash
36
+ deep_join_values(value)
37
+ when Array
38
+ value.uniq.join(' ').presence
39
+ else
40
+ value
41
+ end
42
+ end
43
+ end
44
+ end
45
+
46
+ def attributes(html_attributes = {})
47
+ Attributes.new(options, html_attributes).to_h
48
+ end
49
+ end
50
+ end
51
+ end
@@ -15,7 +15,7 @@ module GOVUKDesignSystemFormBuilder
15
15
  end
16
16
 
17
17
  def html
18
- Containers::FormGroup.new(@builder, @object_name, @attribute_name, **@form_group).html do
18
+ Containers::FormGroup.new(*bound, **@form_group).html do
19
19
  safe_join([label_element, supplemental_content, hint_element, error_element, content])
20
20
  end
21
21
  end
@@ -31,13 +31,13 @@ module GOVUKDesignSystemFormBuilder
31
31
  end
32
32
 
33
33
  def affixed_input
34
- content_tag('div', class: %(#{brand}-input__wrapper)) do
34
+ tag.div(class: %(#{brand}-input__wrapper)) do
35
35
  safe_join([prefix, input, suffix])
36
36
  end
37
37
  end
38
38
 
39
39
  def input
40
- @builder.send(builder_method, @attribute_name, **options, **@html_attributes)
40
+ @builder.send(builder_method, @attribute_name, **attributes(@html_attributes))
41
41
  end
42
42
 
43
43
  def affixed?
@@ -86,13 +86,13 @@ module GOVUKDesignSystemFormBuilder
86
86
  end
87
87
 
88
88
  def prefix
89
- return nil if @prefix_text.blank?
89
+ return if @prefix_text.blank?
90
90
 
91
91
  tag.span(@prefix_text, class: %(#{brand}-input__prefix), **affix_options)
92
92
  end
93
93
 
94
94
  def suffix
95
- return nil if @suffix_text.blank?
95
+ return if @suffix_text.blank?
96
96
 
97
97
  tag.span(@suffix_text, class: %(#{brand}-input__suffix), **affix_options)
98
98
  end
@@ -7,7 +7,7 @@ module GOVUKDesignSystemFormBuilder
7
7
  @label_element ||= if @label.nil?
8
8
  Elements::Null.new
9
9
  else
10
- Elements::Label.new(@builder, @object_name, @attribute_name, caption: @caption, **label_content)
10
+ Elements::Label.new(*bound, caption: @caption, **label_content)
11
11
  end
12
12
  end
13
13
 
@@ -0,0 +1,15 @@
1
+ module GOVUKDesignSystemFormBuilder
2
+ module Traits
3
+ module Select
4
+ private
5
+
6
+ def classes
7
+ [%(#{brand}-select), error_class].flatten.compact
8
+ end
9
+
10
+ def error_class
11
+ %(#{brand}-select--error) if has_errors?
12
+ end
13
+ end
14
+ end
15
+ end
@@ -2,7 +2,7 @@ module GOVUKDesignSystemFormBuilder
2
2
  module Traits
3
3
  module Supplemental
4
4
  def supplemental_id
5
- return nil if @block_content.blank?
5
+ return if @block_content.blank?
6
6
 
7
7
  build_id('supplemental')
8
8
  end
@@ -10,7 +10,7 @@ module GOVUKDesignSystemFormBuilder
10
10
  private
11
11
 
12
12
  def supplemental_content
13
- @supplemental_content ||= Containers::Supplemental.new(@builder, @object_name, @attribute_name, @block_content)
13
+ @supplemental_content ||= Containers::Supplemental.new(*bound, @block_content)
14
14
  end
15
15
  end
16
16
  end
@@ -1,3 +1,3 @@
1
1
  module GOVUKDesignSystemFormBuilder
2
- VERSION = '2.2.0'.freeze
2
+ VERSION = '2.5.1b1'.freeze
3
3
  end
metadata CHANGED
@@ -1,57 +1,71 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: govuk_design_system_formbuilder
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.2.0
4
+ version: 2.5.1b1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Peter Yates
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-03-09 00:00:00.000000000 Z
11
+ date: 2021-04-24 00:00:00.000000000 Z
12
12
  dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: deep_merge
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: 1.2.1
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: 1.2.1
13
27
  - !ruby/object:Gem::Dependency
14
28
  name: actionview
15
29
  requirement: !ruby/object:Gem::Requirement
16
30
  requirements:
17
31
  - - ">="
18
32
  - !ruby/object:Gem::Version
19
- version: '5.2'
33
+ version: '6.0'
20
34
  type: :runtime
21
35
  prerelease: false
22
36
  version_requirements: !ruby/object:Gem::Requirement
23
37
  requirements:
24
38
  - - ">="
25
39
  - !ruby/object:Gem::Version
26
- version: '5.2'
40
+ version: '6.0'
27
41
  - !ruby/object:Gem::Dependency
28
42
  name: activemodel
29
43
  requirement: !ruby/object:Gem::Requirement
30
44
  requirements:
31
45
  - - ">="
32
46
  - !ruby/object:Gem::Version
33
- version: '5.2'
47
+ version: '6.0'
34
48
  type: :runtime
35
49
  prerelease: false
36
50
  version_requirements: !ruby/object:Gem::Requirement
37
51
  requirements:
38
52
  - - ">="
39
53
  - !ruby/object:Gem::Version
40
- version: '5.2'
54
+ version: '6.0'
41
55
  - !ruby/object:Gem::Dependency
42
56
  name: activesupport
43
57
  requirement: !ruby/object:Gem::Requirement
44
58
  requirements:
45
59
  - - ">="
46
60
  - !ruby/object:Gem::Version
47
- version: '5.2'
61
+ version: '6.0'
48
62
  type: :runtime
49
63
  prerelease: false
50
64
  version_requirements: !ruby/object:Gem::Requirement
51
65
  requirements:
52
66
  - - ">="
53
67
  - !ruby/object:Gem::Version
54
- version: '5.2'
68
+ version: '6.0'
55
69
  - !ruby/object:Gem::Dependency
56
70
  name: rubocop-govuk
57
71
  requirement: !ruby/object:Gem::Requirement
@@ -120,14 +134,14 @@ dependencies:
120
134
  requirements:
121
135
  - - "~>"
122
136
  - !ruby/object:Gem::Version
123
- version: '4.0'
137
+ version: '5.0'
124
138
  type: :development
125
139
  prerelease: false
126
140
  version_requirements: !ruby/object:Gem::Requirement
127
141
  requirements:
128
142
  - - "~>"
129
143
  - !ruby/object:Gem::Version
130
- version: '4.0'
144
+ version: '5.0'
131
145
  - !ruby/object:Gem::Dependency
132
146
  name: simplecov
133
147
  requirement: !ruby/object:Gem::Requirement
@@ -241,19 +255,33 @@ dependencies:
241
255
  - !ruby/object:Gem::Version
242
256
  version: 4.1.0
243
257
  - !ruby/object:Gem::Dependency
244
- name: puma
258
+ name: webrick
259
+ requirement: !ruby/object:Gem::Requirement
260
+ requirements:
261
+ - - "~>"
262
+ - !ruby/object:Gem::Version
263
+ version: 1.7.0
264
+ type: :development
265
+ prerelease: false
266
+ version_requirements: !ruby/object:Gem::Requirement
267
+ requirements:
268
+ - - "~>"
269
+ - !ruby/object:Gem::Version
270
+ version: 1.7.0
271
+ - !ruby/object:Gem::Dependency
272
+ name: slim_lint
245
273
  requirement: !ruby/object:Gem::Requirement
246
274
  requirements:
247
275
  - - "~>"
248
276
  - !ruby/object:Gem::Version
249
- version: '5.2'
277
+ version: 0.20.2
250
278
  type: :development
251
279
  prerelease: false
252
280
  version_requirements: !ruby/object:Gem::Requirement
253
281
  requirements:
254
282
  - - "~>"
255
283
  - !ruby/object:Gem::Version
256
- version: '5.2'
284
+ version: 0.20.2
257
285
  description: A Rails form builder that generates form inputs adhering to the GOV.UK
258
286
  Design System
259
287
  email:
@@ -262,6 +290,7 @@ executables: []
262
290
  extensions: []
263
291
  extra_rdoc_files: []
264
292
  files:
293
+ - LICENSE
265
294
  - README.md
266
295
  - lib/govuk_design_system_formbuilder.rb
267
296
  - lib/govuk_design_system_formbuilder/base.rb
@@ -280,6 +309,7 @@ files:
280
309
  - lib/govuk_design_system_formbuilder/elements/check_boxes/collection_check_box.rb
281
310
  - lib/govuk_design_system_formbuilder/elements/check_boxes/fieldset_check_box.rb
282
311
  - lib/govuk_design_system_formbuilder/elements/check_boxes/label.rb
312
+ - lib/govuk_design_system_formbuilder/elements/collection_select.rb
283
313
  - lib/govuk_design_system_formbuilder/elements/date.rb
284
314
  - lib/govuk_design_system_formbuilder/elements/error_message.rb
285
315
  - lib/govuk_design_system_formbuilder/elements/error_summary.rb
@@ -306,9 +336,11 @@ files:
306
336
  - lib/govuk_design_system_formbuilder/traits/error.rb
307
337
  - lib/govuk_design_system_formbuilder/traits/fieldset_item.rb
308
338
  - lib/govuk_design_system_formbuilder/traits/hint.rb
339
+ - lib/govuk_design_system_formbuilder/traits/html_attributes.rb
309
340
  - lib/govuk_design_system_formbuilder/traits/input.rb
310
341
  - lib/govuk_design_system_formbuilder/traits/label.rb
311
342
  - lib/govuk_design_system_formbuilder/traits/localisation.rb
343
+ - lib/govuk_design_system_formbuilder/traits/select.rb
312
344
  - lib/govuk_design_system_formbuilder/traits/supplemental.rb
313
345
  - lib/govuk_design_system_formbuilder/version.rb
314
346
  homepage: https://govuk-form-builder.netlify.app
@@ -331,11 +363,11 @@ required_ruby_version: !ruby/object:Gem::Requirement
331
363
  version: '0'
332
364
  required_rubygems_version: !ruby/object:Gem::Requirement
333
365
  requirements:
334
- - - ">="
366
+ - - ">"
335
367
  - !ruby/object:Gem::Version
336
- version: '0'
368
+ version: 1.3.1
337
369
  requirements: []
338
- rubygems_version: 3.1.4
370
+ rubygems_version: 3.1.6
339
371
  signing_key:
340
372
  specification_version: 4
341
373
  summary: GOV.UK-compliant Rails form builder