govuk_design_system_formbuilder 1.2.1 → 1.2.6

Sign up to get free protection for your applications and to get access to all the features.
Files changed (34) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +2 -2
  3. data/lib/govuk_design_system_formbuilder.rb +4 -0
  4. data/lib/govuk_design_system_formbuilder/builder.rb +49 -29
  5. data/lib/govuk_design_system_formbuilder/containers/character_count.rb +8 -7
  6. data/lib/govuk_design_system_formbuilder/containers/check_boxes.rb +18 -10
  7. data/lib/govuk_design_system_formbuilder/containers/check_boxes_fieldset.rb +18 -9
  8. data/lib/govuk_design_system_formbuilder/containers/fieldset.rb +15 -55
  9. data/lib/govuk_design_system_formbuilder/containers/form_group.rb +18 -10
  10. data/lib/govuk_design_system_formbuilder/containers/radio_buttons_fieldset.rb +19 -10
  11. data/lib/govuk_design_system_formbuilder/containers/radios.rb +22 -11
  12. data/lib/govuk_design_system_formbuilder/containers/supplemental.rb +3 -3
  13. data/lib/govuk_design_system_formbuilder/elements/caption.rb +8 -6
  14. data/lib/govuk_design_system_formbuilder/elements/check_boxes/collection.rb +21 -12
  15. data/lib/govuk_design_system_formbuilder/elements/check_boxes/collection_check_box.rb +2 -2
  16. data/lib/govuk_design_system_formbuilder/elements/check_boxes/fieldset_check_box.rb +16 -12
  17. data/lib/govuk_design_system_formbuilder/elements/date.rb +48 -41
  18. data/lib/govuk_design_system_formbuilder/elements/error_message.rb +3 -3
  19. data/lib/govuk_design_system_formbuilder/elements/error_summary.rb +15 -15
  20. data/lib/govuk_design_system_formbuilder/elements/file.rb +11 -10
  21. data/lib/govuk_design_system_formbuilder/elements/hint.rb +13 -13
  22. data/lib/govuk_design_system_formbuilder/elements/inputs/email.rb +2 -0
  23. data/lib/govuk_design_system_formbuilder/elements/label.rb +31 -23
  24. data/lib/govuk_design_system_formbuilder/elements/legend.rb +79 -0
  25. data/lib/govuk_design_system_formbuilder/elements/radios/collection.rb +23 -14
  26. data/lib/govuk_design_system_formbuilder/elements/radios/collection_radio_button.rb +13 -3
  27. data/lib/govuk_design_system_formbuilder/elements/radios/fieldset_radio_button.rb +7 -3
  28. data/lib/govuk_design_system_formbuilder/elements/select.rb +24 -19
  29. data/lib/govuk_design_system_formbuilder/elements/submit.rb +14 -6
  30. data/lib/govuk_design_system_formbuilder/elements/text_area.rb +29 -23
  31. data/lib/govuk_design_system_formbuilder/traits/input.rb +9 -8
  32. data/lib/govuk_design_system_formbuilder/traits/label.rb +2 -2
  33. data/lib/govuk_design_system_formbuilder/version.rb +1 -1
  34. metadata +9 -8
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 03bf04be59daef7eecb295ca78d3a26399c474840e93ddc7866db8a79a00985f
4
- data.tar.gz: 0bea59a672cdeedd539ac1e9a1a00435a434ddc2f7324b4e8df75db8ccc36595
3
+ metadata.gz: c59892549c7150380bda02c9c078026fee857d2e8edacf90e7c4ca4f9be3613f
4
+ data.tar.gz: 70687f4b813f7b61aa4312e8a7d59ae883cfa4c1bd3d1b3e4a1318b3354d23b2
5
5
  SHA512:
6
- metadata.gz: 22028ec7e2f2b6d6ea5497a24dbfd88e7bf99fd22c5794f35d369814efd1728bd43c3a95adbc1e9805b4b1c54acf31c66db460d70dcb1504535de171e044bdb2
7
- data.tar.gz: 640a062cc8f40cc68acc6779284357d24b3963d4f7b417b5a2383fdca85fa5fc064b382e2250098e950202485ab87a0603b766ce4b5d728412b4df04baa9e937
6
+ metadata.gz: 3f868193dc418ed5cebefad1456918b95be96108001b68ddedd523e7df151544e49691f675615ae9617e6a05e35891e7790ea7624cdf50b84a98811162b86660
7
+ data.tar.gz: c7183ad3f84bef8c71d4f303a4c3637f725b7a851732c777774e301178a24ebaac2f971c26e4ca4c70a34c2829e3f94f431c419e752ba535062be941d8fbc1c2
data/README.md CHANGED
@@ -7,10 +7,10 @@
7
7
  [![Test Coverage](https://api.codeclimate.com/v1/badges/fde73b5dc9476197281b/test_coverage)](https://codeclimate.com/github/DFE-Digital/govuk_design_system_formbuilder/test_coverage)
8
8
  [![Dependabot Status](https://api.dependabot.com/badges/status?host=github&repo=DFE-Digital/govuk_design_system_formbuilder)](https://dependabot.com)
9
9
  [![GitHub license](https://img.shields.io/github/license/DFE-Digital/govuk_design_system_formbuilder)](https://github.com/DFE-Digital/govuk_design_system_formbuilder/blob/master/LICENSE)
10
- [![GOV.UK Design System Version](https://img.shields.io/badge/GOV.UK%20Design%20System-3.7.0-brightgreen)](https://design-system.service.gov.uk)
10
+ [![GOV.UK Design System Version](https://img.shields.io/badge/GOV.UK%20Design%20System-3.8.0-brightgreen)](https://design-system.service.gov.uk)
11
11
 
12
12
  This gem provides a easy-to-use form builder that generates forms that are
13
- fully-compliant with version 3.7.0 of the [GOV.UK Design System](https://design-system.service.gov.uk/),
13
+ fully-compliant with version 3.8.0 of the [GOV.UK Design System](https://design-system.service.gov.uk/),
14
14
  minimising the amount of markup you need to write.
15
15
 
16
16
  In addition to the basic markup, the more-advanced functionality of the Design
@@ -14,6 +14,9 @@ module GOVUKDesignSystemFormBuilder
14
14
  # * +:brand+ sets the value used to prefix all classes, used to allow the
15
15
  # builder to be branded for alternative (similar) design systems.
16
16
  #
17
+ # * +:default_caption_size+ controls the default size of caption text.
18
+ # Can be either +xl+, +l+ or +m+.
19
+ #
17
20
  # * +:default_legend_size+ controls the default size of legend text.
18
21
  # Can be either +xl+, +l+, +m+ or +s+.
19
22
  #
@@ -45,6 +48,7 @@ module GOVUKDesignSystemFormBuilder
45
48
 
46
49
  default_legend_size: 'm',
47
50
  default_legend_tag: 'h1',
51
+ default_caption_size: 'm',
48
52
  default_submit_button_text: 'Continue',
49
53
  default_radio_divider_text: 'or',
50
54
  default_error_summary_title: 'There is a problem',
@@ -17,6 +17,7 @@ module GOVUKDesignSystemFormBuilder
17
17
  # @option caption text [String] the caption text
18
18
  # @option caption size [String] the size of the caption, can be +xl+, +l+ or +m+. Defaults to +m+
19
19
  # @option args [Hash] args additional arguments are applied as attributes to the +input+ element
20
+ # @param form_group_classes [Array,String] Classes to add to the surrounding +form-group+
20
21
  # @param block [Block] arbitrary HTML that will be rendered between the hint and the input
21
22
  # @return [ActiveSupport::SafeBuffer] HTML output
22
23
  # @see https://design-system.service.gov.uk/components/text-input/ GOV.UK Text input
@@ -40,8 +41,8 @@ module GOVUKDesignSystemFormBuilder
40
41
  # = f.govuk_text_field :callsign,
41
42
  # label: -> { tag.h3('Call-sign') }
42
43
  #
43
- def govuk_text_field(attribute_name, hint_text: nil, label: {}, caption: {}, width: nil, **args, &block)
44
- Elements::Inputs::Text.new(self, object_name, attribute_name, hint_text: hint_text, label: label, caption: caption, width: width, **args, &block).html
44
+ def govuk_text_field(attribute_name, hint_text: nil, label: {}, caption: {}, width: nil, form_group_classes: nil, **args, &block)
45
+ Elements::Inputs::Text.new(self, object_name, attribute_name, hint_text: hint_text, label: label, caption: caption, width: width, form_group_classes: form_group_classes, **args, &block).html
45
46
  end
46
47
 
47
48
  # Generates a input of type +tel+
@@ -59,6 +60,7 @@ module GOVUKDesignSystemFormBuilder
59
60
  # @option caption text [String] the caption text
60
61
  # @option caption size [String] the size of the caption, can be +xl+, +l+ or +m+. Defaults to +m+
61
62
  # @option args [Hash] args additional arguments are applied as attributes to the +input+ element
63
+ # @param form_group_classes [Array,String] Classes to add to the surrounding +form-group+
62
64
  # @param block [Block] arbitrary HTML that will be rendered between the hint and the input
63
65
  # @return [ActiveSupport::SafeBuffer] HTML output
64
66
  # @see https://design-system.service.gov.uk/components/text-input/ GOV.UK Text input
@@ -83,8 +85,8 @@ module GOVUKDesignSystemFormBuilder
83
85
  # = f.govuk_phone_field :work_number,
84
86
  # label: -> { tag.h3('Work number') }
85
87
  #
86
- def govuk_phone_field(attribute_name, hint_text: nil, label: {}, caption: {}, width: nil, **args, &block)
87
- Elements::Inputs::Phone.new(self, object_name, attribute_name, hint_text: hint_text, label: label, caption: caption, width: width, **args, &block).html
88
+ def govuk_phone_field(attribute_name, hint_text: nil, label: {}, caption: {}, width: nil, form_group_classes: nil, **args, &block)
89
+ Elements::Inputs::Phone.new(self, object_name, attribute_name, hint_text: hint_text, label: label, caption: caption, width: width, form_group_classes: form_group_classes, **args, &block).html
88
90
  end
89
91
 
90
92
  # Generates a input of type +email+
@@ -102,6 +104,7 @@ module GOVUKDesignSystemFormBuilder
102
104
  # @option caption text [String] the caption text
103
105
  # @option caption size [String] the size of the caption, can be +xl+, +l+ or +m+. Defaults to +m+
104
106
  # @option args [Hash] args additional arguments are applied as attributes to the +input+ element
107
+ # @param form_group_classes [Array,String] Classes to add to the surrounding +form-group+
105
108
  # @param block [Block] arbitrary HTML that will be rendered between the hint and the input
106
109
  # @return [ActiveSupport::SafeBuffer] HTML output
107
110
  # @see https://design-system.service.gov.uk/components/text-input/ GOV.UK Text input
@@ -124,8 +127,8 @@ module GOVUKDesignSystemFormBuilder
124
127
  # = f.govuk_email_field :personal_email,
125
128
  # label: -> { tag.h3('Personal email address') }
126
129
  #
127
- def govuk_email_field(attribute_name, hint_text: nil, label: {}, caption: {}, width: nil, **args, &block)
128
- Elements::Inputs::Email.new(self, object_name, attribute_name, hint_text: hint_text, label: label, caption: caption, width: width, **args, &block).html
130
+ def govuk_email_field(attribute_name, hint_text: nil, label: {}, caption: {}, width: nil, form_group_classes: nil, **args, &block)
131
+ Elements::Inputs::Email.new(self, object_name, attribute_name, hint_text: hint_text, label: label, caption: caption, width: width, form_group_classes: form_group_classes, **args, &block).html
129
132
  end
130
133
 
131
134
  # Generates a input of type +password+
@@ -143,6 +146,7 @@ module GOVUKDesignSystemFormBuilder
143
146
  # @option caption text [String] the caption text
144
147
  # @option caption size [String] the size of the caption, can be +xl+, +l+ or +m+. Defaults to +m+
145
148
  # @option args [Hash] args additional arguments are applied as attributes to the +input+ element
149
+ # @param form_group_classes [Array,String] Classes to add to the surrounding +form-group+
146
150
  # @param block [Block] arbitrary HTML that will be rendered between the hint and the input
147
151
  # @return [ActiveSupport::SafeBuffer] HTML output
148
152
  # @see https://design-system.service.gov.uk/components/text-input/ GOV.UK Text input
@@ -164,8 +168,8 @@ module GOVUKDesignSystemFormBuilder
164
168
  # = f.govuk_password_field :passcode,
165
169
  # label: -> { tag.h3('What is your secret pass code?') }
166
170
  #
167
- def govuk_password_field(attribute_name, hint_text: nil, label: {}, width: nil, caption: {}, **args, &block)
168
- Elements::Inputs::Password.new(self, object_name, attribute_name, hint_text: hint_text, label: label, caption: caption, width: width, **args, &block).html
171
+ def govuk_password_field(attribute_name, hint_text: nil, label: {}, width: nil, form_group_classes: nil, caption: {}, **args, &block)
172
+ Elements::Inputs::Password.new(self, object_name, attribute_name, hint_text: hint_text, label: label, caption: caption, width: width, form_group_classes: form_group_classes, **args, &block).html
169
173
  end
170
174
 
171
175
  # Generates a input of type +url+
@@ -183,6 +187,7 @@ module GOVUKDesignSystemFormBuilder
183
187
  # @option caption text [String] the caption text
184
188
  # @option caption size [String] the size of the caption, can be +xl+, +l+ or +m+. Defaults to +m+
185
189
  # @option args [Hash] args additional arguments are applied as attributes to the +input+ element
190
+ # @param form_group_classes [Array,String] Classes to add to the surrounding +form-group+
186
191
  # @param block [Block] arbitrary HTML that will be rendered between the hint and the input
187
192
  # @return [ActiveSupport::SafeBuffer] HTML output
188
193
  # @see https://design-system.service.gov.uk/components/text-input/ GOV.UK Text input
@@ -205,8 +210,8 @@ module GOVUKDesignSystemFormBuilder
205
210
  # = f.govuk_url_field :work_website,
206
211
  # label: -> { tag.h3("Enter your company's website") }
207
212
  #
208
- def govuk_url_field(attribute_name, hint_text: nil, label: {}, caption: {}, width: nil, **args, &block)
209
- Elements::Inputs::URL.new(self, object_name, attribute_name, hint_text: hint_text, label: label, caption: caption, width: width, **args, &block).html
213
+ def govuk_url_field(attribute_name, hint_text: nil, label: {}, caption: {}, width: nil, form_group_classes: nil, **args, &block)
214
+ Elements::Inputs::URL.new(self, object_name, attribute_name, hint_text: hint_text, label: label, caption: caption, width: width, form_group_classes: form_group_classes, **args, &block).html
210
215
  end
211
216
 
212
217
  # Generates a input of type +number+
@@ -224,6 +229,7 @@ module GOVUKDesignSystemFormBuilder
224
229
  # @option caption text [String] the caption text
225
230
  # @option caption size [String] the size of the caption, can be +xl+, +l+ or +m+. Defaults to +m+
226
231
  # @option args [Hash] args additional arguments are applied as attributes to the +input+ element
232
+ # @param form_group_classes [Array,String] Classes to add to the surrounding +form-group+
227
233
  # @param block [Block] arbitrary HTML that will be rendered between the hint and the input
228
234
  # @return [ActiveSupport::SafeBuffer] HTML output
229
235
  # @see https://design-system.service.gov.uk/components/text-input/ GOV.UK Text input
@@ -249,8 +255,8 @@ module GOVUKDesignSystemFormBuilder
249
255
  # = f.govuk_url_field :personal_best_over_100m,
250
256
  # label: -> { tag.h3("How many seconds does it take you to run 100m?") }
251
257
  #
252
- def govuk_number_field(attribute_name, hint_text: nil, label: {}, caption: {}, width: nil, **args, &block)
253
- Elements::Inputs::Number.new(self, object_name, attribute_name, hint_text: hint_text, label: label, caption: caption, width: width, **args, &block).html
258
+ def govuk_number_field(attribute_name, hint_text: nil, label: {}, caption: {}, width: nil, form_group_classes: nil, **args, &block)
259
+ Elements::Inputs::Number.new(self, object_name, attribute_name, hint_text: hint_text, label: label, caption: caption, width: width, form_group_classes: form_group_classes, **args, &block).html
254
260
  end
255
261
 
256
262
  # Generates a +textarea+ element with a label, optional hint. Also offers
@@ -272,6 +278,7 @@ module GOVUKDesignSystemFormBuilder
272
278
  # @param threshold [Integer] only show the +max_words+ and +max_chars+ warnings once a threshold (percentage) is reached
273
279
  # @param rows [Integer] sets the initial number of rows
274
280
  # @option args [Hash] args additional arguments are applied as attributes to the +textarea+ element
281
+ # @param form_group_classes [Array,String] Classes to add to the surrounding +form-group+
275
282
  # @param block [Block] arbitrary HTML that will be rendered between the hint and the input
276
283
  # @return [ActiveSupport::SafeBuffer] HTML output
277
284
  # @see https://design-system.service.gov.uk/components/textarea/ GOV.UK text area component
@@ -297,8 +304,8 @@ module GOVUKDesignSystemFormBuilder
297
304
  # = f.govuk_text_area :instructions,
298
305
  # label: -> { tag.h3("How do you set it up?") }
299
306
  #
300
- def govuk_text_area(attribute_name, hint_text: nil, label: {}, caption: {}, max_words: nil, max_chars: nil, rows: 5, threshold: nil, **args, &block)
301
- Elements::TextArea.new(self, object_name, attribute_name, hint_text: hint_text, label: label, caption: caption, max_words: max_words, max_chars: max_chars, rows: rows, threshold: threshold, **args, &block).html
307
+ def govuk_text_area(attribute_name, hint_text: nil, label: {}, caption: {}, max_words: nil, max_chars: nil, rows: 5, threshold: nil, form_group_classes: nil, **args, &block)
308
+ Elements::TextArea.new(self, object_name, attribute_name, hint_text: hint_text, label: label, caption: caption, max_words: max_words, max_chars: max_chars, rows: rows, threshold: threshold, form_group_classes: form_group_classes, **args, &block).html
302
309
  end
303
310
 
304
311
  # Generates a +select+ element containing +option+ for each member in the provided collection
@@ -312,7 +319,11 @@ module GOVUKDesignSystemFormBuilder
312
319
  # @option label size [String] the size of the label font, can be +xl+, +l+, +m+, +s+ or nil
313
320
  # @option label tag [Symbol,String] the label's wrapper tag, intended to allow labels to act as page headings
314
321
  # @option label hidden [Boolean] control the visability of the label. Hidden labels will stil be read by screenreaders
322
+ # @param options [Hash] Options hash passed through to Rails' +collection_select+ helper
323
+ # @param html_options [Hash] HTML Options hash passed through to Rails' +collection_select+ helper
324
+ # @param form_group_classes [Array,String] Classes to add to the surrounding +form-group+
315
325
  # @param block [Block] arbitrary HTML that will be rendered between the hint and the input
326
+ # @see https://api.rubyonrails.org/classes/ActionView/Helpers/FormOptionsHelper.html#method-i-collection_select Rails collection_select (called by govuk_collection_select)
316
327
  # @return [ActiveSupport::SafeBuffer] HTML output
317
328
  #
318
329
  # @example A select box with hint
@@ -332,7 +343,7 @@ module GOVUKDesignSystemFormBuilder
332
343
  # = f.govuk_collection_select(:team, @teams, :id, :name) do
333
344
  # label: -> { tag.h3("Which team did you represent?") }
334
345
  #
335
- def govuk_collection_select(attribute_name, collection, value_method, text_method, options: {}, html_options: {}, hint_text: nil, label: {}, caption: {}, &block)
346
+ def govuk_collection_select(attribute_name, collection, value_method, text_method, options: {}, html_options: {}, hint_text: nil, label: {}, caption: {}, form_group_classes: nil, &block)
336
347
  Elements::Select.new(
337
348
  self,
338
349
  object_name,
@@ -345,6 +356,7 @@ module GOVUKDesignSystemFormBuilder
345
356
  caption: caption,
346
357
  options: options,
347
358
  html_options: html_options,
359
+ form_group_classes: form_group_classes,
348
360
  &block
349
361
  ).html
350
362
  end
@@ -373,7 +385,7 @@ module GOVUKDesignSystemFormBuilder
373
385
  # @param inline [Boolean] controls whether the radio buttons are displayed inline or not
374
386
  # @param small [Boolean] controls whether small radio buttons are used instead of regular-sized ones
375
387
  # @param bold_labels [Boolean] controls whether the radio button labels are bold
376
- # @param classes [String] Classes to add to the radio button container.
388
+ # @param classes [Array,String] Classes to add to the radio button container.
377
389
  # @option legend text [String] the fieldset legend's text content
378
390
  # @option legend size [String] the size of the fieldset legend font, can be +xl+, +l+, +m+ or +s+
379
391
  # @option legend tag [Symbol,String] the tag used for the fieldset's header, defaults to +h1+
@@ -415,7 +427,7 @@ module GOVUKDesignSystemFormBuilder
415
427
  # :name,
416
428
  # legend: -> { tag.h3('Which category do you belong to?') }
417
429
  #
418
- def govuk_collection_radio_buttons(attribute_name, collection, value_method, text_method, hint_method = nil, hint_text: nil, legend: {}, caption: {}, inline: false, small: false, bold_labels: false, classes: nil, &block)
430
+ def govuk_collection_radio_buttons(attribute_name, collection, value_method, text_method, hint_method = nil, hint_text: nil, legend: {}, caption: {}, inline: false, small: false, bold_labels: false, classes: nil, form_group_classes: nil, &block)
419
431
  Elements::Radios::Collection.new(
420
432
  self,
421
433
  object_name,
@@ -431,6 +443,7 @@ module GOVUKDesignSystemFormBuilder
431
443
  small: small,
432
444
  bold_labels: bold_labels,
433
445
  classes: classes,
446
+ form_group_classes: form_group_classes,
434
447
  &block
435
448
  ).html
436
449
  end
@@ -454,8 +467,9 @@ module GOVUKDesignSystemFormBuilder
454
467
  # @param caption [Hash] configures or sets the caption content which is inserted above the legend
455
468
  # @option caption text [String] the caption text
456
469
  # @option caption size [String] the size of the caption, can be +xl+, +l+ or +m+. Defaults to +m+
470
+ # @param form_group_classes [Array,String] Classes to add to the surrounding +form-group+
457
471
  # @param block [Block] a block of HTML that will be used to populate the fieldset
458
- # @param classes [String] Classes to add to the radio button container.
472
+ # @param classes [Array,String] Classes to add to the radio button container.
459
473
  # @see https://design-system.service.gov.uk/components/radios/ GOV.UK Radios
460
474
  # @see https://design-system.service.gov.uk/styles/typography/#headings-with-captions Headings with captions
461
475
  # @return [ActiveSupport::SafeBuffer] HTML output
@@ -477,8 +491,8 @@ module GOVUKDesignSystemFormBuilder
477
491
  # = f.govuk_radio_button :burger_id, :regular, label: { text: 'Hamburger' }, link_errors: true
478
492
  # = f.govuk_radio_button :burger_id, :cheese, label: { text: 'Cheeseburger' }
479
493
  #
480
- def govuk_radio_buttons_fieldset(attribute_name, hint_text: nil, legend: {}, caption: {}, inline: false, small: false, classes: nil, &block)
481
- Containers::RadioButtonsFieldset.new(self, object_name, attribute_name, hint_text: hint_text, legend: legend, caption: caption, inline: inline, small: small, classes: classes, &block).html
494
+ def govuk_radio_buttons_fieldset(attribute_name, hint_text: nil, legend: {}, caption: {}, inline: false, small: false, classes: nil, form_group_classes: nil, &block)
495
+ Containers::RadioButtonsFieldset.new(self, object_name, attribute_name, hint_text: hint_text, legend: legend, caption: caption, inline: inline, small: small, classes: classes, form_group_classes: form_group_classes, &block).html
482
496
  end
483
497
 
484
498
  # Generates a radio button
@@ -529,7 +543,7 @@ module GOVUKDesignSystemFormBuilder
529
543
  # When a +Proc+ is provided it must take a single argument that is a single member of the collection
530
544
  # @param hint_text [String] The content of the fieldset hint. No hint will be injected if left +nil+
531
545
  # @param small [Boolean] controls whether small check boxes are used instead of regular-sized ones
532
- # @param classes [String] Classes to add to the checkbox container.
546
+ # @param classes [Array,String] Classes to add to the checkbox container.
533
547
  # @param legend [Hash,Proc] options for configuring the legend
534
548
  # @option legend text [String] the fieldset legend's text content
535
549
  # @option legend size [String] the size of the fieldset legend font, can be +xl+, +l+, +m+ or +s+
@@ -538,6 +552,7 @@ module GOVUKDesignSystemFormBuilder
538
552
  # @param caption [Hash] configures or sets the caption content which is inserted above the legend
539
553
  # @option caption text [String] the caption text
540
554
  # @option caption size [String] the size of the caption, can be +xl+, +l+ or +m+. Defaults to +m+
555
+ # @param form_group_classes [Array,String] Classes to add to the surrounding +form-group+
541
556
  # @param block [Block] any HTML passed in will be injected into the fieldset, after the hint and before the checkboxes
542
557
  # @return [ActiveSupport::SafeBuffer] HTML output
543
558
  #
@@ -574,7 +589,7 @@ module GOVUKDesignSystemFormBuilder
574
589
  # :name,
575
590
  # legend: -> { tag.h3('What kind of sandwich do you want?') }
576
591
  #
577
- def govuk_collection_check_boxes(attribute_name, collection, value_method, text_method, hint_method = nil, hint_text: nil, legend: {}, caption: {}, small: false, classes: nil, &block)
592
+ def govuk_collection_check_boxes(attribute_name, collection, value_method, text_method, hint_method = nil, hint_text: nil, legend: {}, caption: {}, small: false, classes: nil, form_group_classes: nil, &block)
578
593
  Elements::CheckBoxes::Collection.new(
579
594
  self,
580
595
  object_name,
@@ -588,6 +603,7 @@ module GOVUKDesignSystemFormBuilder
588
603
  caption: caption,
589
604
  small: small,
590
605
  classes: classes,
606
+ form_group_classes: form_group_classes,
591
607
  &block
592
608
  ).html
593
609
  end
@@ -608,7 +624,8 @@ module GOVUKDesignSystemFormBuilder
608
624
  # @param caption [Hash] configures or sets the caption content which is inserted above the legend
609
625
  # @option caption text [String] the caption text
610
626
  # @option caption size [String] the size of the caption, can be +xl+, +l+ or +m+. Defaults to +m+
611
- # @param classes [String] Classes to add to the checkbox container.
627
+ # @param classes [Array,String] Classes to add to the checkbox container.
628
+ # @param form_group_classes [Array,String] Classes to add to the surrounding +form-group+
612
629
  # @param block [Block] a block of HTML that will be used to populate the fieldset
613
630
  # @return [ActiveSupport::SafeBuffer] HTML output
614
631
  #
@@ -622,7 +639,7 @@ module GOVUKDesignSystemFormBuilder
622
639
  # = f.govuk_check_box :desired_filling, :lemonade, label: { text: 'Lemonade' }, link_errors: true
623
640
  # = f.govuk_check_box :desired_filling, :fizzy_orange, label: { text: 'Fizzy orange' }
624
641
  #
625
- def govuk_check_boxes_fieldset(attribute_name, legend: {}, caption: {}, hint_text: {}, small: false, classes: nil, &block)
642
+ def govuk_check_boxes_fieldset(attribute_name, legend: {}, caption: {}, hint_text: {}, small: false, classes: nil, form_group_classes: nil, &block)
626
643
  Containers::CheckBoxesFieldset.new(
627
644
  self,
628
645
  object_name,
@@ -632,6 +649,7 @@ module GOVUKDesignSystemFormBuilder
632
649
  caption: caption,
633
650
  small: small,
634
651
  classes: classes,
652
+ form_group_classes: form_group_classes,
635
653
  &block
636
654
  ).html
637
655
  end
@@ -677,7 +695,7 @@ module GOVUKDesignSystemFormBuilder
677
695
  # @param text [String] the button text
678
696
  # @param warning [Boolean] makes the button red ({https://design-system.service.gov.uk/components/button/#warning-buttons warning}) when true
679
697
  # @param secondary [Boolean] makes the button grey ({https://design-system.service.gov.uk/components/button/#secondary-buttons secondary}) when true
680
- # @param classes [String] Classes to add to the submit button
698
+ # @param classes [Array,String] Classes to add to the submit button
681
699
  # @param prevent_double_click [Boolean] adds JavaScript to safeguard the
682
700
  # form from being submitted more than once
683
701
  # @param validate [Boolean] adds the formnovalidate to the submit button when true, this disables all
@@ -718,6 +736,7 @@ module GOVUKDesignSystemFormBuilder
718
736
  # @option caption text [String] the caption text
719
737
  # @option caption size [String] the size of the caption, can be +xl+, +l+ or +m+. Defaults to +m+
720
738
  # @param omit_day [Boolean] do not render a day input, only capture month and year
739
+ # @param form_group_classes [Array,String] Classes to add to the surrounding +form-group+
721
740
  # @param block [Block] arbitrary HTML that will be rendered between the hint and the input group
722
741
  # @param date_of_birth [Boolean] if +true+ {https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes/autocomplete#Values birth date auto completion attributes}
723
742
  # will be added to the inputs
@@ -737,8 +756,8 @@ module GOVUKDesignSystemFormBuilder
737
756
  # @example A date input with legend supplied as a proc
738
757
  # = f.govuk_date_field :finishes_on,
739
758
  # legend: -> { tag.h3('Which category do you belong to?') }
740
- def govuk_date_field(attribute_name, hint_text: nil, legend: {}, caption: {}, date_of_birth: false, omit_day: false, &block)
741
- Elements::Date.new(self, object_name, attribute_name, hint_text: hint_text, legend: legend, caption: caption, date_of_birth: date_of_birth, omit_day: omit_day, &block).html
759
+ def govuk_date_field(attribute_name, hint_text: nil, legend: {}, caption: {}, date_of_birth: false, omit_day: false, form_group_classes: nil, &block)
760
+ Elements::Date.new(self, object_name, attribute_name, hint_text: hint_text, legend: legend, caption: caption, date_of_birth: date_of_birth, omit_day: omit_day, form_group_classes: form_group_classes, &block).html
742
761
  end
743
762
 
744
763
  # Generates a summary of errors in the form, each linking to the corresponding
@@ -796,6 +815,7 @@ module GOVUKDesignSystemFormBuilder
796
815
  # @option caption size [String] the size of the caption, can be +xl+, +l+ or +m+. Defaults to +m+
797
816
  # @param hint_text [String] The content of the hint. No hint will be injected if left +nil+
798
817
  # @option args [Hash] args additional arguments are applied as attributes to the +input+ element
818
+ # @param form_group_classes [Array,String] Classes to add to the surrounding +form-group+
799
819
  # @param block [Block] arbitrary HTML that will be rendered between the hint and the input
800
820
  #
801
821
  # @example A photo upload field with file type specifier and injected content
@@ -814,8 +834,8 @@ module GOVUKDesignSystemFormBuilder
814
834
  # @note Remember to set +multipart: true+ when creating a form with file
815
835
  # uploads, {https://guides.rubyonrails.org/form_helpers.html#uploading-files see
816
836
  # the Rails documentation} for more information
817
- def govuk_file_field(attribute_name, label: {}, caption: {}, hint_text: nil, **args, &block)
818
- Elements::File.new(self, object_name, attribute_name, label: label, caption: caption, hint_text: hint_text, **args, &block).html
837
+ def govuk_file_field(attribute_name, label: {}, caption: {}, hint_text: nil, form_group_classes: nil, **args, &block)
838
+ Elements::File.new(self, object_name, attribute_name, label: label, caption: caption, hint_text: hint_text, form_group_classes: form_group_classes, **args, &block).html
819
839
  end
820
840
  end
821
841
  end
@@ -14,17 +14,18 @@ module GOVUKDesignSystemFormBuilder
14
14
  def html
15
15
  return yield unless limit?
16
16
 
17
- content_tag(
18
- 'div',
19
- class: %(#{brand}-character-count),
20
- data: { module: %(#{brand}-character-count) }.merge(**limit, **threshold).compact
21
- ) do
22
- yield
23
- end
17
+ content_tag('div', **options) { yield }
24
18
  end
25
19
 
26
20
  private
27
21
 
22
+ def options
23
+ {
24
+ class: %(#{brand}-character-count),
25
+ data: { module: %(#{brand}-character-count) }.merge(**limit, **threshold).compact
26
+ }
27
+ end
28
+
28
29
  def limit
29
30
  if @max_words
30
31
  { maxwords: @max_words }
@@ -1,8 +1,6 @@
1
1
  module GOVUKDesignSystemFormBuilder
2
2
  module Containers
3
3
  class CheckBoxes < Base
4
- using PrefixableArray
5
-
6
4
  def initialize(builder, small:, classes: nil)
7
5
  @builder = builder
8
6
  @small = small
@@ -10,18 +8,28 @@ module GOVUKDesignSystemFormBuilder
10
8
  end
11
9
 
12
10
  def html
13
- content_tag('div', class: check_boxes_classes, data: { module: %(#{brand}-checkboxes) }) do
14
- yield
15
- end
11
+ content_tag('div', **options) { yield }
16
12
  end
17
13
 
18
14
  private
19
15
 
20
- def check_boxes_classes
21
- %w(checkboxes).prefix(brand).tap do |c|
22
- c.push(%(#{brand}-checkboxes--small)) if @small
23
- c.push(@classes) if @classes
24
- end
16
+ def options
17
+ {
18
+ class: classes,
19
+ data: { module: %(#{brand}-checkboxes) }
20
+ }
21
+ end
22
+
23
+ def classes
24
+ [%(#{brand}-checkboxes), small_class, custom_classes].flatten.compact
25
+ end
26
+
27
+ def small_class
28
+ %(#{brand}-checkboxes--small) if @small
29
+ end
30
+
31
+ def custom_classes
32
+ Array.wrap(@classes)
25
33
  end
26
34
  end
27
35
  end
@@ -4,20 +4,21 @@ 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:, caption:, small:, classes:, &block)
7
+ def initialize(builder, object_name, attribute_name, hint_text:, legend:, caption:, small:, classes:, form_group_classes:, &block)
8
8
  super(builder, object_name, attribute_name, &block)
9
9
 
10
- @legend = legend
11
- @caption = caption
12
- @hint_text = hint_text
13
- @small = small
14
- @classes = classes
15
- @block_content = capture { block.call }
10
+ @legend = legend
11
+ @caption = caption
12
+ @hint_text = hint_text
13
+ @small = small
14
+ @classes = classes
15
+ @form_group_classes = form_group_classes
16
+ @block_content = capture { block.call }
16
17
  end
17
18
 
18
19
  def html
19
- Containers::FormGroup.new(@builder, @object_name, @attribute_name).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
+ Containers::FormGroup.new(@builder, @object_name, @attribute_name, classes: @form_group_classes).html do
21
+ Containers::Fieldset.new(@builder, @object_name, @attribute_name, **fieldset_options).html do
21
22
  safe_join([hint_element, error_element, checkboxes])
22
23
  end
23
24
  end
@@ -25,6 +26,14 @@ module GOVUKDesignSystemFormBuilder
25
26
 
26
27
  private
27
28
 
29
+ def fieldset_options
30
+ {
31
+ legend: @legend,
32
+ caption: @caption,
33
+ described_by: [error_element.error_id, hint_element.hint_id]
34
+ }
35
+ end
36
+
28
37
  def checkboxes
29
38
  Containers::CheckBoxes.new(@builder, small: @small, classes: @classes).html do
30
39
  @block_content