govuk_design_system_formbuilder 2.0.0b2 → 2.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: bd1f1c56336a4852ae5915c148e7c47abeef5590f87fc083437a4f4a680addba
4
- data.tar.gz: 929a16808249de59a675c3215837e1522d2982a46497fea6b207e90f9c9d8aa0
3
+ metadata.gz: 7450c096f60fc5960a22c6fa4012c478cd34dbe86bdd1b0fe09e034ad965422c
4
+ data.tar.gz: 62011bc3b81778fb0efc042fc9b04107b36ea69926ee23ba92044606d0f09601
5
5
  SHA512:
6
- metadata.gz: ad2ad55fb5f7752862fde79ec8ffcfba5ef9cb1ea20e30b266c7152a7d78eef6fa9f40682f69a7db395b9f8104645735eb71c1efbc538506d3015fb888542932
7
- data.tar.gz: 2c1d49579c09742a5dc2f8be8ddf7bcee4edb6d2d9d39e610705dfd10efc4bf0df18ad00026cd932d10b790aca1ee93a964079329ee9be0067c4c4f84c84a83a
6
+ metadata.gz: 9bb6242f2b97c9912d25748d07b25a2650a3bb85aaf168e73ff268caef449dda20d99df4ebcd3f460be90ba82c593be3f6732dff2640ac457b0020471676e894
7
+ data.tar.gz: 0f0b32faf4869aa47897e2f5acb517af84992726d1a8b52916f0670999afe284bef3112716416cfbb3f53e806364337ecdac560e5a7a0b9ff7e5a64e53cef2eb
data/README.md CHANGED
@@ -7,41 +7,32 @@
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.8.1-brightgreen)](https://design-system.service.gov.uk)
10
+ [![GOV.UK Design System Version](https://img.shields.io/badge/GOV.UK%20Design%20System-3.9.1-brightgreen)](https://design-system.service.gov.uk)
11
11
 
12
- This gem provides a easy-to-use form builder that generates forms that are
13
- fully-compliant with version 3.8.1 of the [GOV.UK Design System](https://design-system.service.gov.uk/),
14
- minimising the amount of markup you need to write.
12
+ This library provides an easy-to-use form builder for the [GOV.UK Design System](https://design-system.service.gov.uk/).
15
13
 
16
- In addition to the basic markup, the more-advanced functionality of the Design
17
- System is exposed via the API. Adding [JavaScript-enhanced word count
18
- checking](https://govuk-form-builder.netlify.app/form-elements/text-area/)
19
- to text areas or [setting the size and weight of
20
- labels](https://govuk-form-builder.netlify.app/introduction/labels-hints-and-legends/)
21
- on text fields requires only a single argument.
14
+ It is intended to make creating forms **quick**, **easy** and **familiar** for Ruby on Rails developers.
22
15
 
23
16
  ## Documentation 📚
24
17
 
25
18
  The gem comes with [a full guide](https://govuk-form-builder.netlify.app/) that
26
- covers most aspects of day-to-day use, along with code and output examples. The guide
27
- is generated from the builder itself so it will always be up to date.
28
-
29
- If you're still not sure what a form builder is or how it works, don't worry!
30
- [This screencast](https://www.youtube.com/watch?v=PhoFZ0qXAlA) should give you
31
- an idea of what's on offer and the official guide goes into a bit more depth on
32
- how everything works.
19
+ covers most aspects of day-to-day use, along with code and output examples. The
20
+ examples in the guide are generated from the builder itself so it will always
21
+ be up to date.
33
22
 
34
23
  [![Netlify Status](https://api.netlify.com/api/v1/badges/d4c50b8d-6ca3-4797-9ab3-6e0731c72b44/deploy-status)](https://app.netlify.com/sites/govuk-form-builder/deploys)
35
24
 
36
25
  ## What's included 🧳
37
26
 
38
27
  * 100% compatibility with the GOV.UK Design System
39
- * Full control of labels, hints, fieldsets and legends
28
+ * Full control of labels, legends, hints, captions and fieldsets
40
29
  * No overwriting of Rails' default form helpers
41
30
  * Automatic ARIA associations between hints, errors and inputs
42
31
  * Most helpers take blocks for arbitrary content
43
32
  * Additional params for programmatically adding hints to check box and radio
44
33
  button collections
34
+ * Full I18n support
35
+ * Automatic handling of ActiveRecord validation error messages
45
36
  * No external dependencies
46
37
  * An exhaustive test suite
47
38
  * [Extensive technical documentation](https://www.rubydoc.info/gems/govuk_design_system_formbuilder/GOVUKDesignSystemFormBuilder/Builder)
@@ -68,8 +59,9 @@ pre-configured template:
68
59
 
69
60
  ## Setup 🔧
70
61
 
71
- To use the form builder in an ad hoc basis you can specify it
72
- as an argument to `form_for` or `form_with`:
62
+ To use the form builder in an ad hoc basis you can specify it as an argument to
63
+ `form_for` or `form_with`. These examples are written in [Slim](https://slim-lang.com) but
64
+ other templating languages like ERB and [Haml](https://haml.info/) work just as well.
73
65
 
74
66
  ```slim
75
67
  = form_for @some_object, builder: GOVUKDesignSystemFormBuilder::FormBuilder do |f|
@@ -99,16 +91,16 @@ Now we can get started!
99
91
  :name,
100
92
  :description,
101
93
  label: { text: "Which department do you work for?" },
102
- hint_text: "If you don't know ask your manager" }
94
+ hint: { text: "If you don't know ask your manager" }
103
95
 
104
96
  = f.govuk_submit 'Away we go!'
105
97
  ```
106
98
 
107
99
  ## Developing and running the tests 👨🏻‍🏭
108
100
 
109
- The form builder is covered by RSpec, to run all the tests first ensure that
110
- all of the development and testing prerequisite gems are installed. At the root
111
- of a freshly-cloned repo run:
101
+ The form builder is tested with RSpec. To run all the tests first ensure that
102
+ the development and testing prerequisite gems are installed. At the root of a
103
+ freshly-cloned repo run:
112
104
 
113
105
  ```sh
114
106
  bundle
@@ -117,7 +109,7 @@ bundle
117
109
  Now, if everything was successful, run RSpec:
118
110
 
119
111
  ```sh
120
- bundle exec rspec -fd
112
+ bundle exec rspec
121
113
  ```
122
114
 
123
115
  ## Contributing 📦
@@ -21,7 +21,7 @@ module GOVUKDesignSystemFormBuilder
21
21
  # Can be either +xl+, +l+, +m+ or +s+.
22
22
  #
23
23
  # * +:default_legend_tag+ controls the default tag that legends are
24
- # wrapped in. Defaults to +h1+.
24
+ # wrapped in. Defaults to +nil+.
25
25
  #
26
26
  # * +:default_submit_button_text+ sets the value assigned to +govuk_submit+,
27
27
  # defaults to 'Continue'.
@@ -47,7 +47,7 @@ module GOVUKDesignSystemFormBuilder
47
47
  brand: 'govuk',
48
48
 
49
49
  default_legend_size: 'm',
50
- default_legend_tag: 'h1',
50
+ default_legend_tag: nil,
51
51
  default_caption_size: 'm',
52
52
  default_submit_button_text: 'Continue',
53
53
  default_radio_divider_text: 'or',
@@ -26,6 +26,8 @@ module GOVUKDesignSystemFormBuilder
26
26
  # @param form_group [Hash] configures the form group
27
27
  # @option form_group classes [Array,String] sets the form group's classes
28
28
  # @option form_group kwargs [Hash] additional attributes added to the form group
29
+ # @param prefix_text [String] the text placed before the input. No prefix will be added if left +nil+
30
+ # @param suffix_text [String] the text placed after the input. No suffix will be added if left +nil+
29
31
  # @param block [Block] arbitrary HTML that will be rendered between the hint and the input
30
32
  # @return [ActiveSupport::SafeBuffer] HTML output
31
33
  # @see https://design-system.service.gov.uk/components/text-input/ GOV.UK Text input
@@ -49,8 +51,8 @@ module GOVUKDesignSystemFormBuilder
49
51
  # = f.govuk_text_field :callsign,
50
52
  # label: -> { tag.h3('Call-sign') }
51
53
  #
52
- def govuk_text_field(attribute_name, hint: {}, label: {}, caption: {}, width: nil, form_group: {}, **kwargs, &block)
53
- Elements::Inputs::Text.new(self, object_name, attribute_name, hint: hint, label: label, caption: caption, width: width, form_group: form_group, **kwargs, &block).html
54
+ def govuk_text_field(attribute_name, hint: {}, label: {}, caption: {}, width: nil, form_group: {}, prefix_text: nil, suffix_text: nil, **kwargs, &block)
55
+ Elements::Inputs::Text.new(self, object_name, attribute_name, hint: hint, label: label, caption: caption, width: width, form_group: form_group, prefix_text: prefix_text, suffix_text: suffix_text, **kwargs, &block).html
54
56
  end
55
57
 
56
58
  # Generates a input of type +tel+
@@ -76,6 +78,8 @@ module GOVUKDesignSystemFormBuilder
76
78
  # @param form_group [Hash] configures the form group
77
79
  # @option form_group classes [Array,String] sets the form group's classes
78
80
  # @option form_group kwargs [Hash] additional attributes added to the form group
81
+ # @param prefix_text [String] the text placed before the input. No prefix will be added if left +nil+
82
+ # @param suffix_text [String] the text placed after the input. No suffix will be added if left +nil+
79
83
  # @param block [Block] arbitrary HTML that will be rendered between the hint and the input
80
84
  # @return [ActiveSupport::SafeBuffer] HTML output
81
85
  # @see https://design-system.service.gov.uk/components/text-input/ GOV.UK Text input
@@ -100,8 +104,8 @@ module GOVUKDesignSystemFormBuilder
100
104
  # = f.govuk_phone_field :work_number,
101
105
  # label: -> { tag.h3('Work number') }
102
106
  #
103
- def govuk_phone_field(attribute_name, hint: {}, label: {}, caption: {}, width: nil, form_group: {}, **kwargs, &block)
104
- Elements::Inputs::Phone.new(self, object_name, attribute_name, hint: hint, label: label, caption: caption, width: width, form_group: form_group, **kwargs, &block).html
107
+ def govuk_phone_field(attribute_name, hint: {}, label: {}, caption: {}, width: nil, form_group: {}, prefix_text: nil, suffix_text: nil, **kwargs, &block)
108
+ Elements::Inputs::Phone.new(self, object_name, attribute_name, hint: hint, label: label, caption: caption, width: width, form_group: form_group, prefix_text: prefix_text, suffix_text: suffix_text, **kwargs, &block).html
105
109
  end
106
110
 
107
111
  # Generates a input of type +email+
@@ -127,6 +131,8 @@ module GOVUKDesignSystemFormBuilder
127
131
  # @param form_group [Hash] configures the form group
128
132
  # @option form_group classes [Array,String] sets the form group's classes
129
133
  # @option form_group kwargs [Hash] additional attributes added to the form group
134
+ # @param prefix_text [String] the text placed before the input. No prefix will be added if left +nil+
135
+ # @param suffix_text [String] the text placed after the input. No suffix will be added if left +nil+
130
136
  # @param block [Block] arbitrary HTML that will be rendered between the hint and the input
131
137
  # @return [ActiveSupport::SafeBuffer] HTML output
132
138
  # @see https://design-system.service.gov.uk/components/text-input/ GOV.UK Text input
@@ -149,8 +155,8 @@ module GOVUKDesignSystemFormBuilder
149
155
  # = f.govuk_email_field :personal_email,
150
156
  # label: -> { tag.h3('Personal email address') }
151
157
  #
152
- def govuk_email_field(attribute_name, hint: {}, label: {}, caption: {}, width: nil, form_group: {}, **kwargs, &block)
153
- Elements::Inputs::Email.new(self, object_name, attribute_name, hint: hint, label: label, caption: caption, width: width, form_group: form_group, **kwargs, &block).html
158
+ def govuk_email_field(attribute_name, hint: {}, label: {}, caption: {}, width: nil, form_group: {}, prefix_text: nil, suffix_text: nil, **kwargs, &block)
159
+ Elements::Inputs::Email.new(self, object_name, attribute_name, hint: hint, label: label, caption: caption, width: width, form_group: form_group, prefix_text: prefix_text, suffix_text: suffix_text, **kwargs, &block).html
154
160
  end
155
161
 
156
162
  # Generates a input of type +password+
@@ -176,6 +182,8 @@ module GOVUKDesignSystemFormBuilder
176
182
  # @param form_group [Hash] configures the form group
177
183
  # @option form_group classes [Array,String] sets the form group's classes
178
184
  # @option form_group kwargs [Hash] additional attributes added to the form group
185
+ # @param prefix_text [String] the text placed before the input. No prefix will be added if left +nil+
186
+ # @param suffix_text [String] the text placed after the input. No suffix will be added if left +nil+
179
187
  # @param block [Block] arbitrary HTML that will be rendered between the hint and the input
180
188
  # @return [ActiveSupport::SafeBuffer] HTML output
181
189
  # @see https://design-system.service.gov.uk/components/text-input/ GOV.UK Text input
@@ -197,8 +205,8 @@ module GOVUKDesignSystemFormBuilder
197
205
  # = f.govuk_password_field :passcode,
198
206
  # label: -> { tag.h3('What is your secret pass code?') }
199
207
  #
200
- def govuk_password_field(attribute_name, hint: {}, label: {}, width: nil, form_group: {}, caption: {}, **kwargs, &block)
201
- Elements::Inputs::Password.new(self, object_name, attribute_name, hint: hint, label: label, caption: caption, width: width, form_group: form_group, **kwargs, &block).html
208
+ def govuk_password_field(attribute_name, hint: {}, label: {}, width: nil, form_group: {}, caption: {}, prefix_text: nil, suffix_text: nil, **kwargs, &block)
209
+ Elements::Inputs::Password.new(self, object_name, attribute_name, hint: hint, label: label, caption: caption, width: width, form_group: form_group, prefix_text: prefix_text, suffix_text: suffix_text, **kwargs, &block).html
202
210
  end
203
211
 
204
212
  # Generates a input of type +url+
@@ -224,6 +232,8 @@ module GOVUKDesignSystemFormBuilder
224
232
  # @param form_group [Hash] configures the form group
225
233
  # @option form_group classes [Array,String] sets the form group's classes
226
234
  # @option form_group kwargs [Hash] additional attributes added to the form group
235
+ # @param prefix_text [String] the text placed before the input. No prefix will be added if left +nil+
236
+ # @param suffix_text [String] the text placed after the input. No suffix will be added if left +nil+
227
237
  # @param block [Block] arbitrary HTML that will be rendered between the hint and the input
228
238
  # @return [ActiveSupport::SafeBuffer] HTML output
229
239
  # @see https://design-system.service.gov.uk/components/text-input/ GOV.UK Text input
@@ -246,8 +256,8 @@ module GOVUKDesignSystemFormBuilder
246
256
  # = f.govuk_url_field :work_website,
247
257
  # label: -> { tag.h3("Enter your company's website") }
248
258
  #
249
- def govuk_url_field(attribute_name, hint: {}, label: {}, caption: {}, width: nil, form_group: {}, **kwargs, &block)
250
- Elements::Inputs::URL.new(self, object_name, attribute_name, hint: hint, label: label, caption: caption, width: width, form_group: form_group, **kwargs, &block).html
259
+ def govuk_url_field(attribute_name, hint: {}, label: {}, caption: {}, width: nil, form_group: {}, prefix_text: nil, suffix_text: nil, **kwargs, &block)
260
+ Elements::Inputs::URL.new(self, object_name, attribute_name, hint: hint, label: label, caption: caption, width: width, form_group: form_group, prefix_text: prefix_text, suffix_text: suffix_text, **kwargs, &block).html
251
261
  end
252
262
 
253
263
  # Generates a input of type +number+
@@ -273,6 +283,8 @@ module GOVUKDesignSystemFormBuilder
273
283
  # @param form_group [Hash] configures the form group
274
284
  # @option form_group classes [Array,String] sets the form group's classes
275
285
  # @option form_group kwargs [Hash] additional attributes added to the form group
286
+ # @param prefix_text [String] the text placed before the input. No prefix will be added if left +nil+
287
+ # @param suffix_text [String] the text placed after the input. No suffix will be added if left +nil+
276
288
  # @param block [Block] arbitrary HTML that will be rendered between the hint and the input
277
289
  # @return [ActiveSupport::SafeBuffer] HTML output
278
290
  # @see https://design-system.service.gov.uk/components/text-input/ GOV.UK Text input
@@ -298,8 +310,8 @@ module GOVUKDesignSystemFormBuilder
298
310
  # = f.govuk_url_field :personal_best_over_100m,
299
311
  # label: -> { tag.h3("How many seconds does it take you to run 100m?") }
300
312
  #
301
- def govuk_number_field(attribute_name, hint: {}, label: {}, caption: {}, width: nil, form_group: {}, **kwargs, &block)
302
- Elements::Inputs::Number.new(self, object_name, attribute_name, hint: hint, label: label, caption: caption, width: width, form_group: form_group, **kwargs, &block).html
313
+ def govuk_number_field(attribute_name, hint: {}, label: {}, caption: {}, width: nil, form_group: {}, prefix_text: nil, suffix_text: nil, **kwargs, &block)
314
+ Elements::Inputs::Number.new(self, object_name, attribute_name, hint: hint, label: label, caption: caption, width: width, form_group: form_group, prefix_text: prefix_text, suffix_text: suffix_text, **kwargs, &block).html
303
315
  end
304
316
 
305
317
  # Generates a +textarea+ element with a label, optional hint. Also offers
@@ -447,7 +459,7 @@ module GOVUKDesignSystemFormBuilder
447
459
  # @param classes [Array,String] Classes to add to the radio button container.
448
460
  # @option legend text [String] the fieldset legend's text content
449
461
  # @option legend size [String] the size of the fieldset legend font, can be +xl+, +l+, +m+ or +s+
450
- # @option legend tag [Symbol,String] the tag used for the fieldset's header, defaults to +h1+
462
+ # @option legend tag [Symbol,String] the tag used for the fieldset's header, defaults to +h1+.
451
463
  # @option legend hidden [Boolean] control the visibility of the legend. Hidden legends will still be read by screenreaders
452
464
  # @option legend kwargs [Hash] additional arguments are applied as attributes on the +legend+ element
453
465
  # @param caption [Hash] configures or sets the caption content which is inserted above the legend
@@ -488,7 +500,7 @@ module GOVUKDesignSystemFormBuilder
488
500
  # :name,
489
501
  # legend: -> { tag.h3('Which category do you belong to?') }
490
502
  #
491
- def govuk_collection_radio_buttons(attribute_name, collection, value_method, text_method, hint_method = nil, hint: {}, legend: {}, caption: {}, inline: false, small: false, bold_labels: false, classes: nil, form_group: {}, &block)
503
+ def govuk_collection_radio_buttons(attribute_name, collection, value_method, text_method = nil, hint_method = nil, hint: {}, legend: {}, caption: {}, inline: false, small: false, bold_labels: false, classes: nil, form_group: {}, &block)
492
504
  Elements::Radios::Collection.new(
493
505
  self,
494
506
  object_name,
@@ -526,7 +538,7 @@ module GOVUKDesignSystemFormBuilder
526
538
  # @param small [Boolean] controls whether small radio buttons are used instead of regular-sized ones
527
539
  # @option legend text [String] the fieldset legend's text content
528
540
  # @option legend size [String] the size of the fieldset legend font, can be +xl+, +l+, +m+ or +s+
529
- # @option legend tag [Symbol,String] the tag used for the fieldset's header, defaults to +h1+
541
+ # @option legend tag [Symbol,String] the tag used for the fieldset's header, defaults to +h1+.
530
542
  # @option legend hidden [Boolean] control the visibility of the legend. Hidden legends will still be read by screenreaders
531
543
  # @option legend kwargs [Hash] additional arguments are applied as attributes on the +legend+ element
532
544
  # @param caption [Hash] configures or sets the caption content which is inserted above the legend
@@ -623,7 +635,7 @@ module GOVUKDesignSystemFormBuilder
623
635
  # @param legend [NilClass,Hash,Proc] options for configuring the legend. Legend will be omitted if +nil+.
624
636
  # @option legend text [String] the fieldset legend's text content
625
637
  # @option legend size [String] the size of the fieldset legend font, can be +xl+, +l+, +m+ or +s+
626
- # @option legend tag [Symbol,String] the tag used for the fieldset's header, defaults to +h1+
638
+ # @option legend tag [Symbol,String] the tag used for the fieldset's header, defaults to +h1+.
627
639
  # @option legend hidden [Boolean] control the visibility of the legend. Hidden legends will still be read by screenreaders
628
640
  # @param caption [Hash] configures or sets the caption content which is inserted above the legend
629
641
  # @option caption text [String] the caption text
@@ -701,7 +713,7 @@ module GOVUKDesignSystemFormBuilder
701
713
  # @param legend [NilClass,Hash,Proc] options for configuring the legend. Legend will be omitted if +nil+.
702
714
  # @option legend text [String] the fieldset legend's text content
703
715
  # @option legend size [String] the size of the fieldset legend font, can be +xl+, +l+, +m+ or +s+
704
- # @option legend tag [Symbol,String] the tag used for the fieldset's header, defaults to +h1+
716
+ # @option legend tag [Symbol,String] the tag used for the fieldset's header, defaults to +h1+.
705
717
  # @option legend hidden [Boolean] control the visibility of the legend. Hidden legends will still be read by screenreaders
706
718
  # @option legend kwargs [Hash] additional arguments are applied as attributes on the +legend+ element
707
719
  # @param caption [Hash] configures or sets the caption content which is inserted above the legend
@@ -710,6 +722,8 @@ module GOVUKDesignSystemFormBuilder
710
722
  # @option caption kwargs [Hash] additional arguments are applied as attributes on the caption +span+ element
711
723
  # @param classes [Array,String] Classes to add to the checkbox container.
712
724
  # @param form_group [Hash] configures the form group
725
+ # @param multiple [Boolean] when true adds a +[]+ suffix the +name+ of the automatically-generated hidden field
726
+ # (ie. <code>project[invoice_attributes][]</code>). When false, no +[]+ suffix is added (ie. <code>project[accepted]</code>)
713
727
  # @option form_group classes [Array,String] sets the form group's classes
714
728
  # @option form_group kwargs [Hash] additional attributes added to the form group
715
729
  # @param block [Block] a block of HTML that will be used to populate the fieldset
@@ -725,7 +739,7 @@ module GOVUKDesignSystemFormBuilder
725
739
  # = f.govuk_check_box :desired_filling, :lemonade, label: { text: 'Lemonade' }, link_errors: true
726
740
  # = f.govuk_check_box :desired_filling, :fizzy_orange, label: { text: 'Fizzy orange' }
727
741
  #
728
- def govuk_check_boxes_fieldset(attribute_name, legend: {}, caption: {}, hint: {}, small: false, classes: nil, form_group: {}, &block)
742
+ def govuk_check_boxes_fieldset(attribute_name, legend: {}, caption: {}, hint: {}, small: false, classes: nil, form_group: {}, multiple: true, &block)
729
743
  Containers::CheckBoxesFieldset.new(
730
744
  self,
731
745
  object_name,
@@ -736,6 +750,7 @@ module GOVUKDesignSystemFormBuilder
736
750
  small: small,
737
751
  classes: classes,
738
752
  form_group: form_group,
753
+ multiple: multiple,
739
754
  &block
740
755
  ).html
741
756
  end
@@ -744,6 +759,7 @@ module GOVUKDesignSystemFormBuilder
744
759
  #
745
760
  # @param attribute_name [Symbol] The name of the attribute
746
761
  # @param value [Boolean,String,Symbol,Integer] The value of the checkbox when it is checked
762
+ # @param unchecked_value [Boolean,String,Symbol,Integer] The value of the checkbox when it is unchecked
747
763
  # @param hint [Hash,Proc] The content of the hint. No hint will be added if 'text' is left +nil+. When a +Proc+ is
748
764
  # supplied the hint will be wrapped in a +div+ instead of a +span+
749
765
  # @option hint text [String] the hint text
@@ -766,12 +782,13 @@ module GOVUKDesignSystemFormBuilder
766
782
  # label: { text: 'Do you agree with our terms and conditions?' },
767
783
  # hint: { text: 'You will not be able to proceed unless you do' }
768
784
  #
769
- def govuk_check_box(attribute_name, value, hint: {}, label: {}, link_errors: false, multiple: true, &block)
785
+ def govuk_check_box(attribute_name, value, unchecked_value = false, hint: {}, label: {}, link_errors: false, multiple: true, &block)
770
786
  Elements::CheckBoxes::FieldsetCheckBox.new(
771
787
  self,
772
788
  object_name,
773
789
  attribute_name,
774
790
  value,
791
+ unchecked_value,
775
792
  hint: hint,
776
793
  label: label,
777
794
  link_errors: link_errors,
@@ -799,6 +816,8 @@ module GOVUKDesignSystemFormBuilder
799
816
  # @return [ActiveSupport::SafeBuffer] HTML output
800
817
  # @note Only the first additional button or link (passed in via a block) will be given the
801
818
  # correct left margin, subsequent buttons will need to be manually accounted for
819
+ # @note This helper always renders an +<input type='submit'>+ tag, HTML content is not supported inside. You
820
+ # can place +<button>+ tags inside the form to have the same effect
802
821
  # @see https://design-system.service.gov.uk/components/button/#stop-users-from-accidentally-sending-information-more-than-once
803
822
  # GOV.UK double click prevention
804
823
  #
@@ -823,7 +842,7 @@ module GOVUKDesignSystemFormBuilder
823
842
  # @param legend [NilClass,Hash,Proc] options for configuring the legend. Legend will be omitted if +nil+.
824
843
  # @option legend text [String] the fieldset legend's text content
825
844
  # @option legend size [String] the size of the fieldset legend font, can be +xl+, +l+, +m+ or +s+
826
- # @option legend tag [Symbol,String] the tag used for the fieldset's header, defaults to +h1+
845
+ # @option legend tag [Symbol,String] the tag used for the fieldset's header, defaults to +h1+.
827
846
  # @option legend hidden [Boolean] control the visibility of the legend. Hidden legends will still be read by screenreaders
828
847
  # @option legend kwargs [Hash] additional arguments are applied as attributes on the +legend+ element
829
848
  # @param caption [Hash] configures or sets the caption content which is inserted above the legend
@@ -861,13 +880,18 @@ module GOVUKDesignSystemFormBuilder
861
880
  # part of the form that contains the error
862
881
  #
863
882
  # @param title [String] the error summary heading
883
+ # @param link_base_errors_to [Symbol,String] set the field that errors on +:base+ are linked
884
+ # to, as there won't be a field representing the object base.
885
+ #
886
+ # @note Only the first error in the +#errors+ array for each attribute will
887
+ # be included.
864
888
  #
865
889
  # @example An error summary with a custom title
866
890
  # = f.govuk_error_summary 'Uh-oh, spaghettios'
867
891
  #
868
892
  # @see https://design-system.service.gov.uk/components/error-summary/ GOV.UK error summary
869
- def govuk_error_summary(title = config.default_error_summary_title)
870
- Elements::ErrorSummary.new(self, object_name, title).html
893
+ def govuk_error_summary(title = config.default_error_summary_title, link_base_errors_to: nil)
894
+ Elements::ErrorSummary.new(self, object_name, title, link_base_errors_to: link_base_errors_to).html
871
895
  end
872
896
 
873
897
  # Generates a fieldset containing the contents of the block
@@ -876,7 +900,7 @@ module GOVUKDesignSystemFormBuilder
876
900
  # @param described_by [Array<String>] the ids of the elements that describe this fieldset, usually hints and errors
877
901
  # @option legend text [String] the fieldset legend's text content
878
902
  # @option legend size [String] the size of the fieldset legend font, can be +xl+, +l+, +m+ or +s+
879
- # @option legend tag [Symbol,String] the tag used for the fieldset's header, defaults to +h1+
903
+ # @option legend tag [Symbol,String] the tag used for the fieldset's header, defaults to +h1+.
880
904
  # @option legend hidden [Boolean] control the visibility of the legend. Hidden legends will still be read by screenreaders
881
905
  # @option legend kwargs [Hash] additional arguments are applied as attributes on the +legend+ element
882
906
  # @param caption [Hash] configures or sets the caption content which is inserted above the label
@@ -885,13 +909,13 @@ module GOVUKDesignSystemFormBuilder
885
909
  # @option caption kwargs [Hash] additional arguments are applied as attributes on the caption +span+ element
886
910
  #
887
911
  # @example A fieldset containing address fields
888
- # = f.govuk_fieldset legend: { text: 'Address' }
912
+ # = f.govuk_fieldset legend: { text: 'Address' } do
889
913
  # = f.govuk_text_field :street
890
914
  # = f.govuk_text_field :town
891
915
  # = f.govuk_text_field :city
892
916
  #
893
917
  # @example A fieldset with the legend as a proc
894
- # = f.govuk_fieldset legend: -> { tag.h3('Skills') }
918
+ # = f.govuk_fieldset legend: -> { tag.h3('Skills') } do
895
919
  # = f.govuk_text_area :physical
896
920
  # = f.govuk_text_area :mental
897
921
  #
@@ -4,7 +4,7 @@ module GOVUKDesignSystemFormBuilder
4
4
  include Traits::Error
5
5
  include Traits::Hint
6
6
 
7
- def initialize(builder, object_name, attribute_name, hint:, legend:, caption:, small:, classes:, form_group:, &block)
7
+ def initialize(builder, object_name, attribute_name, hint:, legend:, caption:, small:, classes:, form_group:, multiple:, &block)
8
8
  super(builder, object_name, attribute_name, &block)
9
9
 
10
10
  @legend = legend
@@ -13,19 +13,30 @@ module GOVUKDesignSystemFormBuilder
13
13
  @small = small
14
14
  @classes = classes
15
15
  @form_group = form_group
16
+ @multiple = multiple
16
17
  @block_content = capture { block.call }
17
18
  end
18
19
 
19
20
  def html
20
21
  Containers::FormGroup.new(@builder, @object_name, @attribute_name, **@form_group).html do
21
22
  Containers::Fieldset.new(@builder, @object_name, @attribute_name, **fieldset_options).html do
22
- safe_join([hint_element, error_element, checkboxes])
23
+ safe_join([hint_element, error_element, hidden_field, checkboxes])
23
24
  end
24
25
  end
25
26
  end
26
27
 
27
28
  private
28
29
 
30
+ def hidden_field
31
+ return unless @multiple
32
+
33
+ @builder.hidden_field(@attribute_name, value: "", name: hidden_field_name)
34
+ end
35
+
36
+ def hidden_field_name
37
+ format("%<object_name>s[%<attribute_name>s][]", object_name: @object_name, attribute_name: @attribute_name)
38
+ end
39
+
29
40
  def fieldset_options
30
41
  {
31
42
  legend: @legend,
@@ -8,14 +8,15 @@ module GOVUKDesignSystemFormBuilder
8
8
  include Traits::Hint
9
9
  include Traits::Conditional
10
10
 
11
- def initialize(builder, object_name, attribute_name, value, label:, hint:, link_errors:, multiple:, &block)
11
+ def initialize(builder, object_name, attribute_name, value, unchecked_value, label:, hint:, link_errors:, multiple:, &block)
12
12
  super(builder, object_name, attribute_name)
13
13
 
14
- @value = value
15
- @label = label
16
- @hint = hint
17
- @multiple = multiple
18
- @link_errors = link_errors
14
+ @value = value
15
+ @unchecked_value = unchecked_value
16
+ @label = label
17
+ @hint = hint
18
+ @multiple = multiple
19
+ @link_errors = link_errors
19
20
 
20
21
  if block_given?
21
22
  @conditional_content = wrap_conditional(block)
@@ -36,7 +37,7 @@ module GOVUKDesignSystemFormBuilder
36
37
  end
37
38
 
38
39
  def check_box
39
- @builder.check_box(@attribute_name, options, @value, false)
40
+ @builder.check_box(@attribute_name, options, @value, @unchecked_value)
40
41
  end
41
42
 
42
43
  def options
@@ -3,10 +3,11 @@ module GOVUKDesignSystemFormBuilder
3
3
  class ErrorSummary < Base
4
4
  include Traits::Error
5
5
 
6
- def initialize(builder, object_name, title)
7
- @builder = builder
8
- @object_name = object_name
9
- @title = title
6
+ def initialize(builder, object_name, title, link_base_errors_to:)
7
+ @builder = builder
8
+ @object_name = object_name
9
+ @title = title
10
+ @link_base_errors_to = link_base_errors_to
10
11
  end
11
12
 
12
13
  def html
@@ -54,7 +55,11 @@ module GOVUKDesignSystemFormBuilder
54
55
  end
55
56
 
56
57
  def field_id(attribute)
57
- build_id('field-error', attribute_name: attribute)
58
+ if attribute.eql?(:base) && @link_base_errors_to.present?
59
+ build_id('field', attribute_name: @link_base_errors_to)
60
+ else
61
+ build_id('field-error', attribute_name: attribute)
62
+ end
58
63
  end
59
64
 
60
65
  def summary_title_id
@@ -8,6 +8,7 @@ module GOVUKDesignSystemFormBuilder
8
8
  def initialize(builder, object_name, attribute_name, value: nil, text: nil, content: nil, radio: false, checkbox: false, **kwargs)
9
9
  super(builder, object_name, attribute_name)
10
10
 
11
+ @value = value
11
12
  @radio = radio
12
13
  @checkbox = checkbox
13
14
  @html_attributes = kwargs
@@ -15,8 +16,7 @@ module GOVUKDesignSystemFormBuilder
15
16
  if content
16
17
  @raw = capture { content.call }
17
18
  else
18
- @text = retrieve_text(text)
19
- @value = value
19
+ @text = retrieve_text(text)
20
20
  end
21
21
  end
22
22
 
@@ -11,7 +11,7 @@ module GOVUKDesignSystemFormBuilder
11
11
 
12
12
  case legend
13
13
  when NilClass
14
- @active = false
14
+ # do nothing
15
15
  when Proc
16
16
  @raw = capture { legend.call }
17
17
  when Hash
@@ -23,7 +23,7 @@ module GOVUKDesignSystemFormBuilder
23
23
  @caption = caption
24
24
  end
25
25
  else
26
- fail(ArgumentError, %(legend must be a Proc or Hash))
26
+ fail(ArgumentError, %(legend must be a NilClass, Proc or Hash))
27
27
  end
28
28
  end
29
29
 
@@ -38,12 +38,18 @@ module GOVUKDesignSystemFormBuilder
38
38
  end
39
39
 
40
40
  def content
41
- return nil unless active?
41
+ return unless active?
42
42
 
43
- tag.legend(class: classes, **@html_attributes) do
44
- content_tag(@tag, class: heading_classes) do
45
- safe_join([caption_element, @text])
46
- end
43
+ tag.legend(legend_text, class: classes, **@html_attributes)
44
+ end
45
+
46
+ def legend_text
47
+ caption_and_text = safe_join([caption_element, @text])
48
+
49
+ if @tag.present?
50
+ content_tag(@tag, class: heading_classes) { caption_and_text }
51
+ else
52
+ caption_and_text
47
53
  end
48
54
  end
49
55
 
@@ -1,38 +1,58 @@
1
1
  module GOVUKDesignSystemFormBuilder
2
2
  module Traits
3
3
  module Input
4
- def initialize(builder, object_name, attribute_name, hint:, label:, caption:, width:, form_group:, **kwargs, &block)
4
+ def initialize(builder, object_name, attribute_name, hint:, label:, caption:, prefix_text:, suffix_text:, width:, form_group:, **kwargs, &block)
5
5
  super(builder, object_name, attribute_name, &block)
6
6
 
7
7
  @width = width
8
8
  @label = label
9
9
  @caption = caption
10
10
  @hint = hint
11
+ @prefix_text = prefix_text
12
+ @suffix_text = suffix_text
11
13
  @html_attributes = kwargs
12
14
  @form_group = form_group
13
15
  end
14
16
 
15
17
  def html
16
18
  Containers::FormGroup.new(@builder, @object_name, @attribute_name, **@form_group).html do
17
- safe_join([label_element, supplemental_content, hint_element, error_element, input])
19
+ safe_join([label_element, supplemental_content, hint_element, error_element, content])
18
20
  end
19
21
  end
20
22
 
21
23
  private
22
24
 
25
+ def content
26
+ if affixed?
27
+ affixed_input
28
+ else
29
+ input
30
+ end
31
+ end
32
+
33
+ def affixed_input
34
+ content_tag('div', class: %(#{brand}-input__wrapper)) do
35
+ safe_join([prefix, input, suffix])
36
+ end
37
+ end
38
+
23
39
  def input
24
- @builder.send(builder_method, @attribute_name, **input_options, **@html_attributes)
40
+ @builder.send(builder_method, @attribute_name, **options, **@html_attributes)
41
+ end
42
+
43
+ def affixed?
44
+ [@prefix_text, @suffix_text].any?
25
45
  end
26
46
 
27
- def input_options
47
+ def options
28
48
  {
29
49
  id: field_id(link_errors: true),
30
- class: input_classes,
50
+ class: classes,
31
51
  aria: { describedby: described_by(hint_id, error_id, supplemental_id) }
32
52
  }
33
53
  end
34
54
 
35
- def input_classes
55
+ def classes
36
56
  [%(#{brand}-input)].push(width_classes, error_classes).compact
37
57
  end
38
58
 
@@ -64,6 +84,22 @@ module GOVUKDesignSystemFormBuilder
64
84
  else fail(ArgumentError, "invalid width '#{@width}'")
65
85
  end
66
86
  end
87
+
88
+ def prefix
89
+ return nil if @prefix_text.blank?
90
+
91
+ tag.span(@prefix_text, class: %(#{brand}-input__prefix), **affix_options)
92
+ end
93
+
94
+ def suffix
95
+ return nil if @suffix_text.blank?
96
+
97
+ tag.span(@suffix_text, class: %(#{brand}-input__suffix), **affix_options)
98
+ end
99
+
100
+ def affix_options
101
+ { aria: { hidden: true } }
102
+ end
67
103
  end
68
104
  end
69
105
  end
@@ -1,3 +1,3 @@
1
1
  module GOVUKDesignSystemFormBuilder
2
- VERSION = '2.0.0b2'.freeze
2
+ VERSION = '2.1.1'.freeze
3
3
  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: 2.0.0b2
4
+ version: 2.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Peter Yates
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-09-02 00:00:00.000000000 Z
11
+ date: 2020-10-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: actionview
@@ -134,14 +134,14 @@ dependencies:
134
134
  requirements:
135
135
  - - "~>"
136
136
  - !ruby/object:Gem::Version
137
- version: 0.18.5
137
+ version: 0.17.1
138
138
  type: :development
139
139
  prerelease: false
140
140
  version_requirements: !ruby/object:Gem::Requirement
141
141
  requirements:
142
142
  - - "~>"
143
143
  - !ruby/object:Gem::Version
144
- version: 0.18.5
144
+ version: 0.17.1
145
145
  - !ruby/object:Gem::Dependency
146
146
  name: htmlbeautifier
147
147
  requirement: !ruby/object:Gem::Requirement
@@ -176,14 +176,14 @@ dependencies:
176
176
  requirements:
177
177
  - - "~>"
178
178
  - !ruby/object:Gem::Version
179
- version: 3.21.0
179
+ version: 3.23.0
180
180
  type: :development
181
181
  prerelease: false
182
182
  version_requirements: !ruby/object:Gem::Requirement
183
183
  requirements:
184
184
  - - "~>"
185
185
  - !ruby/object:Gem::Version
186
- version: 3.21.0
186
+ version: 3.23.0
187
187
  - !ruby/object:Gem::Dependency
188
188
  name: rubypants
189
189
  requirement: !ruby/object:Gem::Requirement
@@ -303,7 +303,7 @@ metadata:
303
303
  documentation_uri: https://www.rubydoc.info/gems/govuk_design_system_formbuilder/GOVUKDesignSystemFormBuilder/Builder
304
304
  homepage_uri: https://govuk-form-builder.netlify.app
305
305
  source_code_uri: https://github.com/DFE-Digital/govuk_design_system_formbuilder
306
- post_install_message:
306
+ post_install_message:
307
307
  rdoc_options: []
308
308
  require_paths:
309
309
  - lib
@@ -314,12 +314,12 @@ required_ruby_version: !ruby/object:Gem::Requirement
314
314
  version: '0'
315
315
  required_rubygems_version: !ruby/object:Gem::Requirement
316
316
  requirements:
317
- - - ">"
317
+ - - ">="
318
318
  - !ruby/object:Gem::Version
319
- version: 1.3.1
319
+ version: '0'
320
320
  requirements: []
321
321
  rubygems_version: 3.1.2
322
- signing_key:
322
+ signing_key:
323
323
  specification_version: 4
324
324
  summary: GOV.UK-compliant Rails form builder
325
325
  test_files: []