crown_marketplace_utils 0.1.0.beta.3 → 0.1.0.beta.4

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,125 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../field'
4
+
5
+ module CrownMarketplaceUtils
6
+ module GovUkHelper
7
+ module Field
8
+ # = GOV.UK File Upload
9
+ #
10
+ # This helper is used for generating the file upload component from the
11
+ # {https://design-system.service.gov.uk/components/file-upload GDS - Components - File Upload}
12
+ #
13
+ # This is considered a Field module and so makes use of the methods in {CrownMarketplaceUtils::GovUkHelper::Field}
14
+
15
+ module FileUpload
16
+ include Field
17
+
18
+ # Generates the HTML for the GOV.UK file upload component
19
+ #
20
+ # @param attribute [String, Symbol] the attribute of the file upload
21
+ # @param error_message [String] the error message to be displayed
22
+ # @param govuk_file_upload_options [Hash] options that will be used for the parts of the form group, label, hint and file upload
23
+ #
24
+ # @option govuk_file_upload_options [Hash] :form_group see {govuk_field}
25
+ # @option govuk_file_upload_options [Hash] :label see {govuk_field}
26
+ # @option govuk_file_upload_options [Hash] :hint see {govuk_field}
27
+ # @option govuk_file_upload_options [Hash] :file_upload ({}) the options that will be used when rendering the file upload.
28
+ # See {govuk_file_upload_field} for more details.
29
+ #
30
+ # @return [ActiveSupport::SafeBuffer] the HTML for the GOV.UK File Upload
31
+ # which can then be rendered on the page
32
+
33
+ def govuk_file_upload(attribute, error_message = nil, **govuk_file_upload_options)
34
+ govuk_field(:file_upload, attribute, error_message, **govuk_file_upload_options) do |govuk_field_options|
35
+ concat(govuk_file_upload_field(attribute, error_message, **govuk_field_options))
36
+ end
37
+ end
38
+
39
+ # Generates the HTML for the GOV.UK file upload component using an ActiveModel.
40
+ # Unlike {govuk_file_upload}, the method will be able to automatically determine if the error message needs to be shown.
41
+ #
42
+ # @param model [ActiveModel] model that will be used to find an error message for the file upload
43
+ # @param attribute [String, Symbol] the attribute of the file upload
44
+ # @param govuk_file_upload_options [Hash] options that will be used for the parts of the form group, label, hint and file upload
45
+ #
46
+ # @option (see govuk_file_upload)
47
+ #
48
+ # @return (see govuk_file_upload)
49
+
50
+ def govuk_file_upload_with_model(model, attribute, **govuk_file_upload_options)
51
+ govuk_field_with_model(:file_upload, model, attribute, **govuk_file_upload_options) do |govuk_field_options, error_message|
52
+ concat(govuk_file_upload_field(attribute, error_message, **govuk_field_options))
53
+ end
54
+ end
55
+
56
+ # Generates the HTML for the GOV.UK file upload component using an ActionView::Helpers::FormBuilder.
57
+ # Unlike {govuk_file_upload}, the method will be able to automatically determine if the error message needs to be shown.
58
+ #
59
+ # @param form [ActionView::Helpers::FormBuilder] the form builder used to create the file upload input
60
+ # @param attribute [String, Symbol] the attribute of the file upload
61
+ # @param govuk_file_upload_options [Hash] options that will be used for the parts of the form group, label, hint and file upload
62
+ #
63
+ # @option (see govuk_file_upload)
64
+ #
65
+ # @return (see govuk_file_upload)
66
+
67
+ def govuk_file_upload_with_form(form, attribute, **govuk_file_upload_options)
68
+ govuk_field_with_form(:file_upload, form, attribute, **govuk_file_upload_options) do |govuk_field_options, error_message|
69
+ concat(govuk_file_upload_field_with_form(form, attribute, error_message, **govuk_field_options))
70
+ end
71
+ end
72
+
73
+ private
74
+
75
+ # Generates the file upload HTML for {govuk_file_upload} and {govuk_file_upload_with_model}
76
+ #
77
+ # @param attribute [String, Symbol] the attribute of the file upload
78
+ # @param error_message [String] the error message to be displayed
79
+ # @param govuk_file_upload_options [Hash] options that will be used in customising the HTML
80
+ #
81
+ # @option (see set_file_upload_options)
82
+ #
83
+ # @return [ActiveSupport::SafeBuffer] the HTML for the file upload field which is used in {govuk_file_upload} and {govuk_file_upload_with_model}
84
+
85
+ def govuk_file_upload_field(attribute, error_message, **govuk_file_upload_options)
86
+ set_file_upload_options(error_message, govuk_file_upload_options)
87
+
88
+ file_field_tag(attribute, class: govuk_file_upload_options[:classes], **govuk_file_upload_options[:attributes])
89
+ end
90
+
91
+ # Generates the file upload HTML for {govuk_file_upload_with_form}
92
+ #
93
+ # @param form [ActionView::Helpers::FormBuilder] the form builder used to create the file upload input
94
+ # @param attribute [String, Symbol] the attribute of the file upload
95
+ # @param error_message [String] used to indicate if there is an error which will add an extra classes
96
+ # @param govuk_file_upload_options [Hash] options that will be used in customising the HTML
97
+ #
98
+ # @option (see set_file_upload_options)
99
+ #
100
+ # @return [ActiveSupport::SafeBuffer] the HTML for the file upload field which is used in {govuk_file_upload_with_form}
101
+
102
+ def govuk_file_upload_field_with_form(form, attribute, error_message, **govuk_file_upload_options)
103
+ set_file_upload_options(error_message, govuk_file_upload_options)
104
+
105
+ form.file_field(attribute, class: govuk_file_upload_options[:classes], **govuk_file_upload_options[:attributes])
106
+ end
107
+
108
+ # Initialises the attributes for the file upload input
109
+ #
110
+ # @param error_message [String] used to indicate if there is an error which will add extra classes
111
+ # @param govuk_file_upload_options [Hash] options that will be used in customising the HTML
112
+ #
113
+ # @option govuk_file_upload_options [String] :classes additional CSS classes for the file iupload HTML
114
+ # @option govuk_file_upload_options [Hash] :attributes ({}) any additional attributes that will added as part of the HTML
115
+
116
+ def set_file_upload_options(error_message, govuk_file_upload_options)
117
+ govuk_file_upload_options[:classes] = "govuk-file-upload #{govuk_file_upload_options[:classes]}".rstrip
118
+ govuk_file_upload_options[:classes] << ' govuk-file-upload--error' if error_message
119
+
120
+ govuk_file_upload_options[:attributes] ||= {}
121
+ end
122
+ end
123
+ end
124
+ end
125
+ end
@@ -21,11 +21,11 @@ module CrownMarketplaceUtils
21
21
  # @param error_message [String] the error message to be displayed
22
22
  # @param govuk_input_options [Hash] options that will be used for the parts of the form group, label, hint and input
23
23
  #
24
- # @option govuk_input_options [Hash] :form_group_options see {govuk_field}
24
+ # @option govuk_input_options [Hash] :form_group see {govuk_field}
25
25
  # @option govuk_input_options [Hash] :label see {govuk_field}
26
26
  # @option govuk_input_options [Hash] :hint see {govuk_field}
27
- # @option govuk_input_options [Hash] :input_options ({}) the options that will be used when rendering the input.
28
- # See {govuk_input_field} for more details.
27
+ # @option govuk_input_options [Hash] :input ({}) the options that will be used when rendering the input.
28
+ # See {govuk_input_field} for more details.
29
29
  #
30
30
  # @return [ActiveSupport::SafeBuffer] the HTML for the GOV.UK Input
31
31
  # which can then be rendered on the page
@@ -36,18 +36,33 @@ module CrownMarketplaceUtils
36
36
  end
37
37
  end
38
38
 
39
+ # Generates the HTML for the GOV.UK input component using an ActiveModel.
40
+ # Unlike {govuk_input}, the method will be able to automatically determine if the error message needs to be shown.
41
+ #
42
+ # @param model [ActiveModel] model that will be used to find an error message and the value of the input
43
+ # @param attribute [String, Symbol] the attribute of the input
44
+ # @param govuk_input_options [Hash] options that will be used for the parts of the form group, label, hint and input
45
+ #
46
+ # @option (see govuk_input)
47
+ #
48
+ # @return (see govuk_input)
49
+
50
+ def govuk_input_with_model(model, attribute, **govuk_input_options)
51
+ govuk_field_with_model(:input, model, attribute, **govuk_input_options) do |govuk_field_options, error_message|
52
+ govuk_field_options[:value] = model.send(attribute)
53
+
54
+ concat(govuk_input_field(attribute, error_message, **govuk_field_options))
55
+ end
56
+ end
57
+
39
58
  # Generates the HTML for the GOV.UK input component using an ActionView::Helpers::FormBuilder.
40
59
  # Unlike {govuk_input}, the method will be able to automatically determine if the error message needs to be shown.
41
60
  #
42
- # @param form [ActionView::Helpers::FormBuilder] :form the form builder used to create the input
61
+ # @param form [ActionView::Helpers::FormBuilder] the form builder used to create the input
43
62
  # @param attribute [String, Symbol] the attribute of the input
44
63
  # @param govuk_input_options [Hash] options that will be used for the parts of the form group, label, hint and input
45
64
  #
46
- # @option govuk_input_options [Hash] :form_group_options see {govuk_field_with_form}
47
- # @option govuk_input_options [Hash] :label see {govuk_field_with_form}
48
- # @option govuk_input_options [Hash] :hint see {govuk_field_with_form}
49
- # @option govuk_input_options [Hash] :input_options ({}) the options that will be used when rendering the input.
50
- # See {govuk_input_field_with_form} for more details.
65
+ # @option (see govuk_input)
51
66
  #
52
67
  # @return (see govuk_input)
53
68
 
@@ -59,7 +74,7 @@ module CrownMarketplaceUtils
59
74
 
60
75
  private
61
76
 
62
- # Generates the input HTML for {govuk_input}
77
+ # Generates the input HTML for {govuk_input} and {govuk_input_with_model}
63
78
  #
64
79
  # @param attribute [String, Symbol] the attribute of the input
65
80
  # @param error_message [String] used to indicate if there is an error which will add extra classes
@@ -71,15 +86,17 @@ module CrownMarketplaceUtils
71
86
 
72
87
  def govuk_input_field(attribute, error_message, **govuk_text_input_options)
73
88
  _govuk_input_field(error_message, **govuk_text_input_options) do |govuk_text_input_classes, govuk_text_input_attributes|
74
- text_field_tag(attribute, govuk_text_input_options[:value], class: govuk_text_input_classes, **govuk_text_input_attributes)
89
+ field_type = :"#{get_field_type(govuk_text_input_options[:field_type])}_tag"
90
+
91
+ send(field_type, attribute, govuk_text_input_options[:value], class: govuk_text_input_classes, **govuk_text_input_attributes)
75
92
  end
76
93
  end
77
94
 
78
95
  # Generates the input HTML for {govuk_input_with_form}
79
96
  #
80
- # @param form [ActionView::Helpers::FormBuilder] :form the form builder used to create the input
97
+ # @param form [ActionView::Helpers::FormBuilder] the form builder used to create the input
81
98
  # @param attribute [String, Symbol] the attribute of the input
82
- # @param error_message [String] used to indicate if there is an error which will add extra classes
99
+ # @param error_message [String] used to indicate if there is an error which will add an extra classes
83
100
  # @param govuk_text_input_options [Hash] options that will be used in customising the HTML
84
101
  #
85
102
  # @option (see _govuk_input_field)
@@ -88,7 +105,9 @@ module CrownMarketplaceUtils
88
105
 
89
106
  def govuk_input_field_with_form(form, attribute, error_message, **govuk_text_input_options)
90
107
  _govuk_input_field(error_message, **govuk_text_input_options) do |govuk_text_input_classes, govuk_text_input_attributes|
91
- form.text_field(attribute, class: govuk_text_input_classes, **govuk_text_input_attributes)
108
+ field_type = get_field_type(govuk_text_input_options[:field_type])
109
+
110
+ form.send(field_type, attribute, class: govuk_text_input_classes, **govuk_text_input_attributes)
92
111
  end
93
112
  end
94
113
 
@@ -99,6 +118,7 @@ module CrownMarketplaceUtils
99
118
  #
100
119
  # @option govuk_text_input_options [String] :classes additional CSS classes for the input HTML
101
120
  # @option govuk_text_input_options [String] :value (nil) the value of the input
121
+ # @option govuk_text_input_options [Symbol] :field_type the type of the input field, see {get_field_type} for options
102
122
  # @option govuk_text_input_options [Hash] :prefix (nil) optional prefix for the input field. See {govuk_fix} for more details.
103
123
  # @option govuk_text_input_options [Hash] :suffix (nil) optional suffix for the input field. See {govuk_fix} for more details.
104
124
  # @option govuk_text_input_options [Hash] :attributes ({}) any additional attributes that will added as part of the HTML
@@ -111,9 +131,9 @@ module CrownMarketplaceUtils
111
131
  # @return [ActiveSupport::SafeBuffer] the HTML for the input field which is used in {govuk_input_field} or {govuk_input_field_with_form}
112
132
 
113
133
  def _govuk_input_field(error_message, **govuk_text_input_options)
114
- govuk_text_input_classes = ['govuk-input']
115
- govuk_text_input_classes += ['govuk-input--error'] if error_message
116
- govuk_text_input_classes << govuk_text_input_options[:classes]
134
+ govuk_text_input_classes = "govuk-input #{govuk_text_input_options[:classes]}".rstrip
135
+ govuk_text_input_classes << ' govuk-input--error' if error_message
136
+
117
137
  govuk_text_input_options[:attributes] ||= {}
118
138
 
119
139
  input_html = yield(govuk_text_input_classes, govuk_text_input_options[:attributes])
@@ -152,9 +172,23 @@ module CrownMarketplaceUtils
152
172
 
153
173
  tag.div(govuk_fix_options[:text], class: govuk_fix_classes, **govuk_fix_options[:attributes])
154
174
  end
175
+
176
+ # Returns the field type used to create the rails input tag
177
+ #
178
+ # @param field_type [Symbol] the type of the field, defaults to text
179
+ # Allowed values are:
180
+ # - +:email+
181
+ # - +:password+
182
+
183
+ def get_field_type(field_type)
184
+ case field_type
185
+ when :email, :password
186
+ :"#{field_type}_field"
187
+ else
188
+ :text_field
189
+ end
190
+ end
155
191
  end
156
192
  end
157
193
  end
158
194
  end
159
-
160
- ActionView::Base.field_error_proc = proc { |html_tag, _instance| html_tag }
@@ -22,11 +22,11 @@ module CrownMarketplaceUtils
22
22
  # @param error_message [String] the error message to be displayed
23
23
  # @param govuk_radios_options [Hash] options that will be used for the parts of the fieldset, form group, hint and radio buttons
24
24
  #
25
- # @option govuk_radios_options [Hash] :form_group_options see {govuk_fields}
26
- # @option govuk_radios_options [Hash] :fieldset_options see {govuk_fields}
25
+ # @option govuk_radios_options [Hash] :form_group see {govuk_fields}
26
+ # @option govuk_radios_options [Hash] :fieldset see {govuk_fields}
27
27
  # @option govuk_radios_options [Hash] :hint see {govuk_field}
28
- # @option govuk_radios_options [Hash] :radios_options ({}) the options that will be used when rendering the radio buttons.
29
- # See {govuk_radios_fields} for more details.
28
+ # @option govuk_radios_options [Hash] :radios ({}) the options that will be used when rendering the radio buttons.
29
+ # See {govuk_radios_fields} for more details.
30
30
  #
31
31
  # @return [ActiveSupport::SafeBuffer] the HTML for the GOV.UK Radios
32
32
  # which can then be rendered on the page
@@ -37,6 +37,27 @@ module CrownMarketplaceUtils
37
37
  end
38
38
  end
39
39
 
40
+ # Generates the HTML for the GOV.UK Radios component using an ActiveModel.
41
+ # Unlike {govuk_radios}, the method will be able to automatically determine if the error message needs to be shown.
42
+ #
43
+ # @param model [ActiveModel] model that will be used to find an error message and the selected radio button
44
+ # @param attribute [String, Symbol] the attribute of the raido buttons
45
+ # @param items [Array] array of radio items, see {_govuk_radios_fields}
46
+ # @param govuk_radios_options [Hash] options that will be used for the parts of the fieldset, form group, hint and radio buttons
47
+ #
48
+ # @option (see govuk_radios)
49
+ #
50
+ # @return (see govuk_radios)
51
+
52
+ def govuk_radios_with_model(model, attribute, items, **govuk_radios_options)
53
+ value = model.send(attribute)
54
+ items.each { |item| item[:checked] = item[:value] == value }
55
+
56
+ govuk_fields_with_model(:radios, model, attribute, **govuk_radios_options) do |govuk_field_options|
57
+ concat(govuk_radios_fields(attribute, items, **govuk_field_options))
58
+ end
59
+ end
60
+
40
61
  # Generates the HTML for the GOV.UK Radios component using an ActionView::Helpers::FormBuilder.
41
62
  # Unlike {govuk_radios}, the method will be able to automatically determine if the error message needs to be shown.
42
63
  #
@@ -45,11 +66,7 @@ module CrownMarketplaceUtils
45
66
  # @param items [Array] array of radio items, see {_govuk_radios_fields}
46
67
  # @param govuk_radios_options [Hash] options that will be used for the parts of the fieldset, form group, hint and radio buttons
47
68
  #
48
- # @option govuk_radios_options [Hash] :form_group_options see {govuk_fields_with_form}
49
- # @option govuk_radios_options [Hash] :fieldset_options see {govuk_fields_with_form}
50
- # @option govuk_radios_options [Hash] :hint see {govuk_fields_with_form}
51
- # @option govuk_radios_options [Hash] :radios_options ({}) the options that will be used when rendering the radio buttons.
52
- # See {govuk_radios_fields_with_form} for more details.
69
+ # @option (see govuk_radios)
53
70
  #
54
71
  # @return (see govuk_radios)
55
72
 
@@ -79,7 +96,7 @@ module CrownMarketplaceUtils
79
96
 
80
97
  # Generates the radios HTML for {govuk_radios_with_form}
81
98
  #
82
- # @param form [ActionView::Helpers::FormBuilder] :form the form builder used to create the radio buttons
99
+ # @param form [ActionView::Helpers::FormBuilder] the form builder used to create the radio buttons
83
100
  # @param attribute [String, Symbol] the attribute of the raido buttons
84
101
  # @param items [Array] array of radio items, see {_govuk_radios_fields}
85
102
  # @param govuk_radios_options [Hash] options that will be used in customising the HTML
@@ -146,7 +163,7 @@ module CrownMarketplaceUtils
146
163
  label_attribute = radio_item[:attributes][:id] || "#{attribute}[#{radio_item[:value]}]"
147
164
 
148
165
  concat(radio_button_tag(attribute, radio_item[:value], radio_item[:checked], class: 'govuk-radios__input', **radio_item[:attributes]))
149
- concat(govuk_label(label_attribute, radio_item[:label][:text], **radio_item[:label][:options]))
166
+ concat(govuk_label(label_attribute, radio_item[:label][:text], **radio_item[:label]))
150
167
  end
151
168
  end
152
169
 
@@ -161,11 +178,11 @@ module CrownMarketplaceUtils
161
178
 
162
179
  def govuk_radio_item_with_form(form, attribute, radio_item)
163
180
  _govuk_radio_item(attribute, radio_item) do
164
- (radio_item[:label][:options][:attributes] ||= {})[:value] = radio_item[:value]
165
- radio_item[:label][:options][:attributes][:for] = radio_item[:attributes][:id] if radio_item[:attributes][:id]
181
+ (radio_item[:label][:attributes] ||= {})[:value] = radio_item[:value]
182
+ radio_item[:label][:attributes][:for] = radio_item[:attributes][:id] if radio_item[:attributes][:id]
166
183
 
167
184
  concat(form.radio_button(attribute, radio_item[:value], class: 'govuk-radios__input', **radio_item[:attributes]))
168
- concat(govuk_label_with_form(form, attribute, radio_item[:label][:text], **radio_item[:label][:options]))
185
+ concat(govuk_label_with_form(form, attribute, radio_item[:label][:text], **radio_item[:label]))
169
186
  end
170
187
  end
171
188
 
@@ -176,12 +193,9 @@ module CrownMarketplaceUtils
176
193
  # @param radio_item [Hash] the options for the radio item
177
194
  #
178
195
  # @option radio_item [String] :classes additional CSS classes for the radio button HTML
179
- # @option radio_item [Hash] :label the parameters that will be used to create the label for the radio button:
180
- # - +:text+ (required) - the label text
181
- # - +:options+ - default: { } - the options for govuk_label {govuk_label}
182
- # @option radio_item [Hash] :hint (nil) the parameters that will be used to create the hint for the field
183
- # - +:text+ (required) - the hint text
184
- # - +:options+ - default: { } - the options for govuk_hint {govuk_hint}
196
+ # @option radio_item [Hash] :label the parameters that will be used to create the label for the radio button, see {govuk_label}
197
+ # @option radio_item [Hash] :hint (nil) the parameters that will be used to create the hint for the radio button, see {govuk_hint}.
198
+ # If no hint is given then no hint will be rendered
185
199
  # @option radio_item [Hash] :attributes ({}) any additional attributes that will be added as part of the radio button HTML
186
200
  #
187
201
  # @return [ActiveSupport::SafeBuffer] the HTML for the radio buttons, label and hint
@@ -189,14 +203,14 @@ module CrownMarketplaceUtils
189
203
 
190
204
  def _govuk_radio_item(attribute, radio_item)
191
205
  radio_item[:attributes] ||= {}
192
- radio_item[:label][:options] ||= {}
193
- radio_item[:label][:options][:classes] = "govuk-radios__label #{radio_item[:label][:options][:classes]}".rstrip
206
+ radio_item[:label] ||= {}
207
+ radio_item[:label][:classes] = "govuk-radios__label #{radio_item[:label][:classes]}".rstrip
194
208
 
195
209
  set_item_options_for_hint('radios', attribute, radio_item) if radio_item[:hint]
196
210
 
197
211
  capture do
198
212
  yield
199
- concat(govuk_hint(radio_item[:hint][:text], **radio_item[:hint][:options])) if radio_item[:hint]
213
+ concat(govuk_hint(radio_item[:hint][:text], **radio_item[:hint])) if radio_item[:hint]
200
214
  end
201
215
  end
202
216
  end
@@ -24,11 +24,11 @@ module CrownMarketplaceUtils
24
24
  # @param error_message [String] the error message to be displayed
25
25
  # @param govuk_select_options [Hash] options that will be used for the parts of the form group, label, hint and select
26
26
  #
27
- # @option govuk_select_options [Hash] :form_group_options see {govuk_field}
27
+ # @option govuk_select_options [Hash] :form_group see {govuk_field}
28
28
  # @option govuk_select_options [Hash] :label see {govuk_field}
29
29
  # @option govuk_select_options [Hash] :hint see {govuk_field}
30
- # @option govuk_select_options [Hash] :select_options ({}) the options that will be used when rendering the select field.
31
- # See {govuk_select_field} for more details.
30
+ # @option govuk_select_options [Hash] :select ({}) the options that will be used when rendering the select field.
31
+ # See {govuk_select_field} for more details.
32
32
  #
33
33
  # @return [ActiveSupport::SafeBuffer] the HTML for the GOV.UK Select
34
34
  # which can then be rendered on the page
@@ -39,19 +39,35 @@ module CrownMarketplaceUtils
39
39
  end
40
40
  end
41
41
 
42
+ # Generates the HTML for the GOV.UK Select component using an ActiveModel.
43
+ # Unlike {govuk_select}, the method will be able to automatically determine if the error message needs to be shown.
44
+ #
45
+ # @param model [ActiveModel] model that will be used to find an error message and the selected options
46
+ # @param attribute [String, Symbol] the attribute of the select field
47
+ # @param items [Array] array of option items for the select, see {govuk_map_select_items}
48
+ # @param govuk_select_options [Hash] options that will be used for the parts of the form group, label, hint and select
49
+ #
50
+ # @option see govuk_select)
51
+ #
52
+ # @return (see govuk_select)
53
+
54
+ def govuk_select_with_model(model, attribute, items, **govuk_select_options)
55
+ (govuk_select_options[:select] ||= {})[:selected] = model.send(attribute)
56
+
57
+ govuk_field_with_model(:select, model, attribute, **govuk_select_options) do |govuk_field_options, error_message|
58
+ concat(govuk_select_field(attribute, items, error_message, **govuk_field_options))
59
+ end
60
+ end
61
+
42
62
  # Generates the HTML for the GOV.UK Select component using an ActionView::Helpers::FormBuilder.
43
63
  # Unlike {govuk_select}, the method will be able to automatically determine if the error message needs to be shown.
44
64
  #
45
- # @param form [ActionView::Helpers::FormBuilder] :form the form builder used to create the select field
65
+ # @param form [ActionView::Helpers::FormBuilder] the form builder used to create the select field
46
66
  # @param attribute [String, Symbol] the attribute of the select field
47
67
  # @param items [Array] array of option items for the select, see {govuk_map_select_items}
48
68
  # @param govuk_select_options [Hash] options that will be used for the parts of the form group, label, hint and select
49
69
  #
50
- # @option govuk_select_options [Hash] :form_group_options see {govuk_field_with_form}
51
- # @option govuk_select_options [Hash] :label see {govuk_field_with_form}
52
- # @option govuk_select_options [Hash] :hint see {govuk_field_with_form}
53
- # @option govuk_select_options [Hash] :select_options ({}) the options that will be used when rendering the select field.
54
- # See {govuk_select_field_with_form} for more details.
70
+ # @option see govuk_select)
55
71
  #
56
72
  # @return (see govuk_select)
57
73
 
@@ -70,49 +86,49 @@ module CrownMarketplaceUtils
70
86
  # @param error_message [String] used to indicate if there is an error which will add extra classes
71
87
  # @param govuk_select_options [Hash] options that will be used in customising the HTML
72
88
  #
73
- # @option (see _govuk_select_field)
89
+ # @option (see set_govuk_select_field_options)
74
90
  #
75
91
  # @return [ActiveSupport::SafeBuffer] the HTML for the select field which is used in {govuk_select}
76
92
 
77
93
  def govuk_select_field(attribute, items, error_message, **govuk_select_options)
78
- _govuk_select_field(error_message, **govuk_select_options) do |govuk_select_classes, govuk_select_attributes|
79
- select_tag(
80
- attribute,
81
- options_for_select(
82
- govuk_map_select_items(items),
83
- govuk_select_options[:selected]
84
- ),
85
- class: govuk_select_classes,
86
- **govuk_select_attributes
87
- )
88
- end
94
+ set_govuk_select_field_options(error_message, govuk_select_options)
95
+
96
+ select_tag(
97
+ attribute,
98
+ options_for_select(
99
+ govuk_map_select_items(items),
100
+ govuk_select_options[:selected]
101
+ ),
102
+ class: govuk_select_options[:classes],
103
+ **govuk_select_options[:attributes]
104
+ )
89
105
  end
90
106
 
91
107
  # Generates the select HTML for {govuk_select_with_form}
92
108
  #
93
- # @param form [ActionView::Helpers::FormBuilder] :form the form builder used to create the select field
109
+ # @param form [ActionView::Helpers::FormBuilder] the form builder used to create the select field
94
110
  # @param attribute [String, Symbol] the attribute of the select field
95
111
  # @param items [Array] array of option items for the select, see {govuk_map_select_items}
96
112
  # @param error_message [String] used to indicate if there is an error which will add extra classes
97
113
  # @param govuk_select_options [Hash] options that will be used in customising the HTML
98
114
  #
99
- # @option (see _govuk_select_field)
115
+ # @option (see set_govuk_select_field_options)
100
116
  #
101
117
  # @return [ActiveSupport::SafeBuffer] the HTML for the select field which is used in {govuk_select_with_form}
102
118
 
103
119
  def govuk_select_field_with_form(form, attribute, items, error_message, **govuk_select_options)
104
- _govuk_select_field(error_message, **govuk_select_options) do |govuk_select_classes, govuk_select_attributes|
105
- form.select(
106
- attribute,
107
- govuk_map_select_items(items),
108
- govuk_select_options[:select_options] || {},
109
- class: govuk_select_classes,
110
- **govuk_select_attributes
111
- )
112
- end
120
+ set_govuk_select_field_options(error_message, govuk_select_options)
121
+
122
+ form.select(
123
+ attribute,
124
+ govuk_map_select_items(items),
125
+ govuk_select_options[:select] || {},
126
+ class: govuk_select_options[:classes],
127
+ **govuk_select_options[:attributes]
128
+ )
113
129
  end
114
130
 
115
- # Wrapper method used by {govuk_select_field} and {govuk_select_field_with_form} to generate the select HTML
131
+ # Initialises the attributes for the select input
116
132
  #
117
133
  # @param error_message [String] used to indicate if there is an error which will add extra classes
118
134
  # @param govuk_select_options [Hash] options that will be used in customising the HTML
@@ -120,21 +136,11 @@ module CrownMarketplaceUtils
120
136
  # @option govuk_select_options [String] :classes additional CSS classes for the select HTML
121
137
  # @option govuk_select_options [String] :selected (nil) the selected option
122
138
  # @option govuk_select_options [Hash] :attributes ({}) any additional attributes that will added as part of the HTML
123
- #
124
- # @yield the select HTML generated by {govuk_select_field} or {govuk_select_field_with_form}
125
- #
126
- # @yieldparam govuk_select_classes [Array] the classes for the select HTML
127
- # @yieldparam govuk_select_attributes [Hash] additional attributes that will added as part of the HTML
128
- #
129
- # @return [ActiveSupport::SafeBuffer] the HTML for the select field which is used in {govuk_select_field} or {govuk_select_field_with_form}
130
139
 
131
- def _govuk_select_field(error_message, **govuk_select_options)
132
- govuk_select_classes = ['govuk-select']
133
- govuk_select_classes += ['govuk-select--error'] if error_message
134
- govuk_select_classes << govuk_select_options[:classes]
140
+ def set_govuk_select_field_options(error_message, govuk_select_options)
141
+ govuk_select_options[:classes] = "govuk-select #{govuk_select_options[:classes]}".rstrip
142
+ govuk_select_options[:classes] << ' govuk-select--error' if error_message
135
143
  govuk_select_options[:attributes] ||= {}
136
-
137
- yield(govuk_select_classes, govuk_select_options[:attributes])
138
144
  end
139
145
 
140
146
  # Maps the items into an array that can be used to generate the options for
@@ -162,5 +168,3 @@ module CrownMarketplaceUtils
162
168
  end
163
169
  end
164
170
  end
165
-
166
- ActionView::Base.field_error_proc = proc { |html_tag, _instance| html_tag }