govuk_design_system_formbuilder 1.2.4 → 1.2.5

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 (31) hide show
  1. checksums.yaml +4 -4
  2. data/lib/govuk_design_system_formbuilder/builder.rb +46 -29
  3. data/lib/govuk_design_system_formbuilder/containers/character_count.rb +2 -2
  4. data/lib/govuk_design_system_formbuilder/containers/check_boxes.rb +13 -12
  5. data/lib/govuk_design_system_formbuilder/containers/check_boxes_fieldset.rb +9 -8
  6. data/lib/govuk_design_system_formbuilder/containers/fieldset.rb +12 -62
  7. data/lib/govuk_design_system_formbuilder/containers/form_group.rb +18 -10
  8. data/lib/govuk_design_system_formbuilder/containers/radio_buttons_fieldset.rb +10 -9
  9. data/lib/govuk_design_system_formbuilder/containers/radios.rb +17 -13
  10. data/lib/govuk_design_system_formbuilder/containers/supplemental.rb +2 -0
  11. data/lib/govuk_design_system_formbuilder/elements/caption.rb +6 -4
  12. data/lib/govuk_design_system_formbuilder/elements/check_boxes/collection.rb +12 -11
  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 +11 -11
  15. data/lib/govuk_design_system_formbuilder/elements/date.rb +19 -18
  16. data/lib/govuk_design_system_formbuilder/elements/error_message.rb +3 -3
  17. data/lib/govuk_design_system_formbuilder/elements/error_summary.rb +15 -15
  18. data/lib/govuk_design_system_formbuilder/elements/file.rb +11 -10
  19. data/lib/govuk_design_system_formbuilder/elements/hint.rb +4 -4
  20. data/lib/govuk_design_system_formbuilder/elements/inputs/email.rb +2 -0
  21. data/lib/govuk_design_system_formbuilder/elements/label.rb +11 -11
  22. data/lib/govuk_design_system_formbuilder/elements/legend.rb +79 -0
  23. data/lib/govuk_design_system_formbuilder/elements/radios/collection.rb +14 -13
  24. data/lib/govuk_design_system_formbuilder/elements/radios/collection_radio_button.rb +2 -2
  25. data/lib/govuk_design_system_formbuilder/elements/radios/fieldset_radio_button.rb +2 -2
  26. data/lib/govuk_design_system_formbuilder/elements/select.rb +18 -17
  27. data/lib/govuk_design_system_formbuilder/elements/submit.rb +9 -4
  28. data/lib/govuk_design_system_formbuilder/elements/text_area.rb +7 -6
  29. data/lib/govuk_design_system_formbuilder/traits/input.rb +8 -7
  30. data/lib/govuk_design_system_formbuilder/version.rb +1 -1
  31. metadata +3 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 5d0ec456d05c0f92a86c39b688f0ac2a498160f473002f2fb4004567f4b17496
4
- data.tar.gz: 0aa054ef3feb33eaf5b402aaea08ab2942e9b9be6708f04de41c1255e455dc86
3
+ metadata.gz: 702ad71c46989cfeb455ced19e6c9c426685947bac6c6057f902bf1deb44eb97
4
+ data.tar.gz: 263eda546cf3f17b3611613e77c0f24f9c52995015752c4cc534f914b0c689be
5
5
  SHA512:
6
- metadata.gz: 8a79e3ac6187857d917f7eb253abfbb414b8ed44a3a4488a29f82052ca234daeba9f1926a0df12697544fa266420ebe8eba8ab26840fe8d371b713d82c2df312
7
- data.tar.gz: 1334ddb5eb6a36dfbcd5b8f91b50548ecfac38481682e683aec5071d2f91b7577f3cadd532c8dd8c1b1c5dba34fa837479ef55d5f63669b15756159e5b9fb5aa
6
+ metadata.gz: 063007b8ff7a1ab6c2bb1c470b36895047217d8149b84fb1a9b8aac12b0a3d5e7910828bd0e44bc2aafafa972f4c5f032bea0bc55cd7ae60fe99c32a716a9156
7
+ data.tar.gz: 20cd7ac352b111277d57843b810eebb6cb73ef50c719501115b8a6f91264abd4b34646431c6ae9794df88378c0ee4f0bc835c7a5c633b3b251003581b0353664
@@ -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
@@ -314,6 +321,7 @@ module GOVUKDesignSystemFormBuilder
314
321
  # @option label hidden [Boolean] control the visability of the label. Hidden labels will stil be read by screenreaders
315
322
  # @param options [Hash] Options hash passed through to Rails' +collection_select+ helper
316
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+
317
325
  # @param block [Block] arbitrary HTML that will be rendered between the hint and the input
318
326
  # @see https://api.rubyonrails.org/classes/ActionView/Helpers/FormOptionsHelper.html#method-i-collection_select Rails collection_select (called by govuk_collection_select)
319
327
  # @return [ActiveSupport::SafeBuffer] HTML output
@@ -335,7 +343,7 @@ module GOVUKDesignSystemFormBuilder
335
343
  # = f.govuk_collection_select(:team, @teams, :id, :name) do
336
344
  # label: -> { tag.h3("Which team did you represent?") }
337
345
  #
338
- 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)
339
347
  Elements::Select.new(
340
348
  self,
341
349
  object_name,
@@ -348,6 +356,7 @@ module GOVUKDesignSystemFormBuilder
348
356
  caption: caption,
349
357
  options: options,
350
358
  html_options: html_options,
359
+ form_group_classes: form_group_classes,
351
360
  &block
352
361
  ).html
353
362
  end
@@ -376,7 +385,7 @@ module GOVUKDesignSystemFormBuilder
376
385
  # @param inline [Boolean] controls whether the radio buttons are displayed inline or not
377
386
  # @param small [Boolean] controls whether small radio buttons are used instead of regular-sized ones
378
387
  # @param bold_labels [Boolean] controls whether the radio button labels are bold
379
- # @param classes [String] Classes to add to the radio button container.
388
+ # @param classes [Array,String] Classes to add to the radio button container.
380
389
  # @option legend text [String] the fieldset legend's text content
381
390
  # @option legend size [String] the size of the fieldset legend font, can be +xl+, +l+, +m+ or +s+
382
391
  # @option legend tag [Symbol,String] the tag used for the fieldset's header, defaults to +h1+
@@ -418,7 +427,7 @@ module GOVUKDesignSystemFormBuilder
418
427
  # :name,
419
428
  # legend: -> { tag.h3('Which category do you belong to?') }
420
429
  #
421
- 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)
422
431
  Elements::Radios::Collection.new(
423
432
  self,
424
433
  object_name,
@@ -434,6 +443,7 @@ module GOVUKDesignSystemFormBuilder
434
443
  small: small,
435
444
  bold_labels: bold_labels,
436
445
  classes: classes,
446
+ form_group_classes: form_group_classes,
437
447
  &block
438
448
  ).html
439
449
  end
@@ -457,8 +467,9 @@ module GOVUKDesignSystemFormBuilder
457
467
  # @param caption [Hash] configures or sets the caption content which is inserted above the legend
458
468
  # @option caption text [String] the caption text
459
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+
460
471
  # @param block [Block] a block of HTML that will be used to populate the fieldset
461
- # @param classes [String] Classes to add to the radio button container.
472
+ # @param classes [Array,String] Classes to add to the radio button container.
462
473
  # @see https://design-system.service.gov.uk/components/radios/ GOV.UK Radios
463
474
  # @see https://design-system.service.gov.uk/styles/typography/#headings-with-captions Headings with captions
464
475
  # @return [ActiveSupport::SafeBuffer] HTML output
@@ -480,8 +491,8 @@ module GOVUKDesignSystemFormBuilder
480
491
  # = f.govuk_radio_button :burger_id, :regular, label: { text: 'Hamburger' }, link_errors: true
481
492
  # = f.govuk_radio_button :burger_id, :cheese, label: { text: 'Cheeseburger' }
482
493
  #
483
- def govuk_radio_buttons_fieldset(attribute_name, hint_text: nil, legend: {}, caption: {}, inline: false, small: false, classes: nil, &block)
484
- 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
485
496
  end
486
497
 
487
498
  # Generates a radio button
@@ -532,7 +543,7 @@ module GOVUKDesignSystemFormBuilder
532
543
  # When a +Proc+ is provided it must take a single argument that is a single member of the collection
533
544
  # @param hint_text [String] The content of the fieldset hint. No hint will be injected if left +nil+
534
545
  # @param small [Boolean] controls whether small check boxes are used instead of regular-sized ones
535
- # @param classes [String] Classes to add to the checkbox container.
546
+ # @param classes [Array,String] Classes to add to the checkbox container.
536
547
  # @param legend [Hash,Proc] options for configuring the legend
537
548
  # @option legend text [String] the fieldset legend's text content
538
549
  # @option legend size [String] the size of the fieldset legend font, can be +xl+, +l+, +m+ or +s+
@@ -541,6 +552,7 @@ module GOVUKDesignSystemFormBuilder
541
552
  # @param caption [Hash] configures or sets the caption content which is inserted above the legend
542
553
  # @option caption text [String] the caption text
543
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+
544
556
  # @param block [Block] any HTML passed in will be injected into the fieldset, after the hint and before the checkboxes
545
557
  # @return [ActiveSupport::SafeBuffer] HTML output
546
558
  #
@@ -577,7 +589,7 @@ module GOVUKDesignSystemFormBuilder
577
589
  # :name,
578
590
  # legend: -> { tag.h3('What kind of sandwich do you want?') }
579
591
  #
580
- 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)
581
593
  Elements::CheckBoxes::Collection.new(
582
594
  self,
583
595
  object_name,
@@ -591,6 +603,7 @@ module GOVUKDesignSystemFormBuilder
591
603
  caption: caption,
592
604
  small: small,
593
605
  classes: classes,
606
+ form_group_classes: form_group_classes,
594
607
  &block
595
608
  ).html
596
609
  end
@@ -611,7 +624,8 @@ module GOVUKDesignSystemFormBuilder
611
624
  # @param caption [Hash] configures or sets the caption content which is inserted above the legend
612
625
  # @option caption text [String] the caption text
613
626
  # @option caption size [String] the size of the caption, can be +xl+, +l+ or +m+. Defaults to +m+
614
- # @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+
615
629
  # @param block [Block] a block of HTML that will be used to populate the fieldset
616
630
  # @return [ActiveSupport::SafeBuffer] HTML output
617
631
  #
@@ -625,7 +639,7 @@ module GOVUKDesignSystemFormBuilder
625
639
  # = f.govuk_check_box :desired_filling, :lemonade, label: { text: 'Lemonade' }, link_errors: true
626
640
  # = f.govuk_check_box :desired_filling, :fizzy_orange, label: { text: 'Fizzy orange' }
627
641
  #
628
- 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)
629
643
  Containers::CheckBoxesFieldset.new(
630
644
  self,
631
645
  object_name,
@@ -635,6 +649,7 @@ module GOVUKDesignSystemFormBuilder
635
649
  caption: caption,
636
650
  small: small,
637
651
  classes: classes,
652
+ form_group_classes: form_group_classes,
638
653
  &block
639
654
  ).html
640
655
  end
@@ -680,7 +695,7 @@ module GOVUKDesignSystemFormBuilder
680
695
  # @param text [String] the button text
681
696
  # @param warning [Boolean] makes the button red ({https://design-system.service.gov.uk/components/button/#warning-buttons warning}) when true
682
697
  # @param secondary [Boolean] makes the button grey ({https://design-system.service.gov.uk/components/button/#secondary-buttons secondary}) when true
683
- # @param classes [String] Classes to add to the submit button
698
+ # @param classes [Array,String] Classes to add to the submit button
684
699
  # @param prevent_double_click [Boolean] adds JavaScript to safeguard the
685
700
  # form from being submitted more than once
686
701
  # @param validate [Boolean] adds the formnovalidate to the submit button when true, this disables all
@@ -721,6 +736,7 @@ module GOVUKDesignSystemFormBuilder
721
736
  # @option caption text [String] the caption text
722
737
  # @option caption size [String] the size of the caption, can be +xl+, +l+ or +m+. Defaults to +m+
723
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+
724
740
  # @param block [Block] arbitrary HTML that will be rendered between the hint and the input group
725
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}
726
742
  # will be added to the inputs
@@ -740,8 +756,8 @@ module GOVUKDesignSystemFormBuilder
740
756
  # @example A date input with legend supplied as a proc
741
757
  # = f.govuk_date_field :finishes_on,
742
758
  # legend: -> { tag.h3('Which category do you belong to?') }
743
- def govuk_date_field(attribute_name, hint_text: nil, legend: {}, caption: {}, date_of_birth: false, omit_day: false, &block)
744
- 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
745
761
  end
746
762
 
747
763
  # Generates a summary of errors in the form, each linking to the corresponding
@@ -799,6 +815,7 @@ module GOVUKDesignSystemFormBuilder
799
815
  # @option caption size [String] the size of the caption, can be +xl+, +l+ or +m+. Defaults to +m+
800
816
  # @param hint_text [String] The content of the hint. No hint will be injected if left +nil+
801
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+
802
819
  # @param block [Block] arbitrary HTML that will be rendered between the hint and the input
803
820
  #
804
821
  # @example A photo upload field with file type specifier and injected content
@@ -817,8 +834,8 @@ module GOVUKDesignSystemFormBuilder
817
834
  # @note Remember to set +multipart: true+ when creating a form with file
818
835
  # uploads, {https://guides.rubyonrails.org/form_helpers.html#uploading-files see
819
836
  # the Rails documentation} for more information
820
- def govuk_file_field(attribute_name, label: {}, caption: {}, hint_text: nil, **args, &block)
821
- 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
822
839
  end
823
840
  end
824
841
  end
@@ -14,12 +14,12 @@ module GOVUKDesignSystemFormBuilder
14
14
  def html
15
15
  return yield unless limit?
16
16
 
17
- content_tag('div', **character_count_options) { yield }
17
+ content_tag('div', **options) { yield }
18
18
  end
19
19
 
20
20
  private
21
21
 
22
- def character_count_options
22
+ def options
23
23
  {
24
24
  class: %(#{brand}-character-count),
25
25
  data: { module: %(#{brand}-character-count) }.merge(**limit, **threshold).compact
@@ -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,25 +8,28 @@ module GOVUKDesignSystemFormBuilder
10
8
  end
11
9
 
12
10
  def html
13
- content_tag('div', **check_boxes_options) 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_options
16
+ def options
21
17
  {
22
- class: check_boxes_classes,
18
+ class: classes,
23
19
  data: { module: %(#{brand}-checkboxes) }
24
20
  }
25
21
  end
26
22
 
27
- def check_boxes_classes
28
- %w(checkboxes).prefix(brand).tap do |c|
29
- c.push(%(#{brand}-checkboxes--small)) if @small
30
- c.push(@classes) if @classes
31
- end
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)
32
33
  end
33
34
  end
34
35
  end
@@ -4,19 +4,20 @@ 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::FormGroup.new(@builder, @object_name, @attribute_name, classes: @form_group_classes).html do
20
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
@@ -1,90 +1,40 @@
1
1
  module GOVUKDesignSystemFormBuilder
2
2
  module Containers
3
3
  class Fieldset < Base
4
- using PrefixableArray
5
-
6
- include Traits::Caption
7
- include Traits::Localisation
8
-
9
- LEGEND_SIZES = %w(xl l m s).freeze
10
-
11
4
  def initialize(builder, object_name = nil, attribute_name = nil, legend: {}, caption: {}, described_by: nil, &block)
12
5
  super(builder, object_name, attribute_name, &block)
13
6
 
7
+ @legend = legend
8
+ @caption = caption
14
9
  @described_by = described_by(described_by)
15
10
  @attribute_name = attribute_name
16
-
17
- case legend
18
- when Proc
19
- @legend_raw = legend.call
20
- when Hash
21
- @legend_options = legend_defaults.merge(legend)
22
- @caption = caption
23
- else
24
- fail(ArgumentError, %(legend must be a Proc or Hash))
25
- end
26
11
  end
27
12
 
28
13
  def html
29
- content_tag('fieldset', **fieldset_options) do
30
- safe_join([legend, (@block_content || yield)])
14
+ content_tag('fieldset', **options) do
15
+ safe_join([legend_element, (@block_content || yield)])
31
16
  end
32
17
  end
33
18
 
34
19
  private
35
20
 
36
- def fieldset_options
21
+ def options
37
22
  {
38
- class: fieldset_classes,
23
+ class: classes,
39
24
  aria: { describedby: @described_by }
40
25
  }
41
26
  end
42
27
 
43
- def fieldset_classes
44
- %w(fieldset).prefix(brand)
45
- end
46
-
47
- def legend
48
- @legend_raw || legend_content
49
- end
50
-
51
- def legend_content
52
- if legend_text.present?
53
- content_tag('legend', class: legend_classes) do
54
- content_tag(@legend_options.dig(:tag), class: legend_heading_classes) do
55
- safe_join([caption_element, legend_text])
56
- end
57
- end
58
- end
59
- end
60
-
61
- def legend_text
62
- @legend_options.dig(:text) || localised_text(:legend)
63
- end
64
-
65
- def legend_size
66
- @legend_options.dig(:size).tap do |size|
67
- fail "invalid size '#{size}', must be #{LEGEND_SIZES.join(', ')}" unless size.in?(LEGEND_SIZES)
68
- end
69
- end
70
-
71
- def legend_classes
72
- [%(fieldset__legend), %(fieldset__legend--#{legend_size})].prefix(brand).tap do |classes|
73
- classes.push(%(#{brand}-visually-hidden)) if @legend_options.dig(:hidden)
74
- end
28
+ def classes
29
+ %(#{brand}-fieldset)
75
30
  end
76
31
 
77
- def legend_heading_classes
78
- %w(fieldset__heading).prefix(brand)
32
+ def legend_element
33
+ @legend_element ||= Elements::Legend.new(@builder, @object_name, @attribute_name, **legend_options)
79
34
  end
80
35
 
81
- def legend_defaults
82
- {
83
- hidden: false,
84
- text: nil,
85
- tag: config.default_legend_tag,
86
- size: config.default_legend_size
87
- }
36
+ def legend_options
37
+ { legend: @legend, caption: @caption }
88
38
  end
89
39
  end
90
40
  end