crown_marketplace_utils 0.1.0.beta.2 → 0.1.0.beta.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (29) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +7 -0
  3. data/Gemfile +0 -4
  4. data/Gemfile.lock +44 -29
  5. data/README.md +37 -13
  6. data/crown_marketplace_utils.gemspec +9 -8
  7. data/lib/crown_marketplace_utils/gov_uk_helper/button.rb +2 -0
  8. data/lib/crown_marketplace_utils/gov_uk_helper/details.rb +1 -1
  9. data/lib/crown_marketplace_utils/gov_uk_helper/error_message.rb +1 -1
  10. data/lib/crown_marketplace_utils/gov_uk_helper/field/character_count.rb +190 -0
  11. data/lib/crown_marketplace_utils/gov_uk_helper/field/checkboxes.rb +219 -0
  12. data/lib/crown_marketplace_utils/gov_uk_helper/field/date_input.rb +234 -0
  13. data/lib/crown_marketplace_utils/gov_uk_helper/field/file_upload.rb +125 -0
  14. data/lib/crown_marketplace_utils/gov_uk_helper/field/input.rb +194 -0
  15. data/lib/crown_marketplace_utils/gov_uk_helper/field/radios.rb +219 -0
  16. data/lib/crown_marketplace_utils/gov_uk_helper/field/select.rb +170 -0
  17. data/lib/crown_marketplace_utils/gov_uk_helper/field/textarea.rb +140 -0
  18. data/lib/crown_marketplace_utils/gov_uk_helper/field.rb +305 -0
  19. data/lib/crown_marketplace_utils/gov_uk_helper/fieldset.rb +75 -0
  20. data/lib/crown_marketplace_utils/gov_uk_helper/form_group.rb +0 -3
  21. data/lib/crown_marketplace_utils/gov_uk_helper/header.rb +172 -0
  22. data/lib/crown_marketplace_utils/gov_uk_helper/label.rb +97 -0
  23. data/lib/crown_marketplace_utils/gov_uk_helper/notification_banner.rb +139 -0
  24. data/lib/crown_marketplace_utils/gov_uk_helper/pagination.rb +214 -0
  25. data/lib/crown_marketplace_utils/gov_uk_helper/step_by_step_navigation.rb +225 -0
  26. data/lib/crown_marketplace_utils/gov_uk_helper/tag.rb +39 -0
  27. data/lib/crown_marketplace_utils/gov_uk_helper.rb +32 -0
  28. data/lib/crown_marketplace_utils/version.rb +1 -1
  29. metadata +60 -30
@@ -0,0 +1,219 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../field'
4
+
5
+ module CrownMarketplaceUtils
6
+ module GovUkHelper
7
+ module Field
8
+ # = GOV.UK Checkboxes
9
+ #
10
+ # This helper is used for generating the checkboxes component from the
11
+ # {https://design-system.service.gov.uk/components/checkboxes GDS - Components - Checkboxes}
12
+ #
13
+ # This is considered a Field module and so makes use of the methods in {CrownMarketplaceUtils::GovUkHelper::Field}
14
+
15
+ module Checkboxes
16
+ include Field
17
+
18
+ # Generates the HTML for the GOV.UK Checkboxes component
19
+ #
20
+ # @param attribute [String, Symbol] the attribute of the raido buttons
21
+ # @param items [Array] array of checkbox items, see {_govuk_checkboxes_fields}
22
+ # @param error_message [String] the error message to be displayed
23
+ # @param govuk_checkboxes_options [Hash] options that will be used for the parts of the fieldset, form group, hint and checkbox buttons
24
+ #
25
+ # @option govuk_checkboxes_options [Hash] :form_group see {govuk_fields}
26
+ # @option govuk_checkboxes_options [Hash] :fieldset see {govuk_fields}
27
+ # @option govuk_checkboxes_options [Hash] :hint see {govuk_field}
28
+ # @option govuk_checkboxes_options [Hash] :checkboxes ({}) the options that will be used when rendering the checkbox buttons.
29
+ # See {govuk_checkboxes_fields} for more details.
30
+ #
31
+ # @return [ActiveSupport::SafeBuffer] the HTML for the GOV.UK Checkboxes
32
+ # which can then be rendered on the page
33
+
34
+ def govuk_checkboxes(attribute, items, error_message = nil, **govuk_checkboxes_options)
35
+ govuk_fields(:checkboxes, attribute, error_message, **govuk_checkboxes_options) do |govuk_field_options|
36
+ concat(govuk_checkboxes_fields(attribute, items, **govuk_field_options))
37
+ end
38
+ end
39
+
40
+ # Generates the HTML for the GOV.UK Checkboxes component using an ActiveModel.
41
+ # Unlike {govuk_checkboxes}, 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 checked checkboxes
44
+ # @param attribute [String, Symbol] the attribute of the raido buttons
45
+ # @param items [Array] array of checkbox items, see {_govuk_checkboxes_fields}
46
+ # @param govuk_checkboxes_options [Hash] options that will be used for the parts of the fieldset, form group, hint and checkbox buttons
47
+ #
48
+ # @option (see govuk_checkboxes)
49
+ #
50
+ # @return (see govuk_checkboxes)
51
+
52
+ def govuk_checkboxes_with_model(model, attribute, items, **govuk_checkboxes_options)
53
+ values = model.send(attribute) || []
54
+ items.each { |item| item[:checked] = values.include?(item[:value]) }
55
+
56
+ govuk_fields_with_model(:checkboxes, model, attribute, **govuk_checkboxes_options) do |govuk_field_options|
57
+ concat(govuk_checkboxes_fields(attribute, items, **govuk_field_options))
58
+ end
59
+ end
60
+
61
+ # Generates the HTML for the GOV.UK Checkboxes component using an ActionView::Helpers::FormBuilder.
62
+ # Unlike {govuk_checkboxes}, the method will be able to automatically determine if the error message needs to be shown.
63
+ #
64
+ # @param form [ActionView::Helpers::FormBuilder] the form builder used to create the checkbox buttons
65
+ # @param attribute [String, Symbol] the attribute of the raido buttons
66
+ # @param items [Array] array of checkbox items, see {_govuk_checkboxes_fields}
67
+ # @param govuk_checkboxes_options [Hash] options that will be used for the parts of the fieldset, form group, hint and checkbox buttons
68
+ #
69
+ # @option (see govuk_checkboxes)
70
+ #
71
+ # @return (see govuk_checkboxes)
72
+
73
+ def govuk_checkboxes_with_form(form, attribute, items, **govuk_checkboxes_options)
74
+ govuk_fields_with_form(:checkboxes, form, attribute, **govuk_checkboxes_options) do |govuk_field_options|
75
+ concat(govuk_checkboxes_fields_with_form(form, attribute, items, **govuk_field_options))
76
+ end
77
+ end
78
+
79
+ private
80
+
81
+ # Generates the checkboxes HTML for {govuk_checkboxes}
82
+ #
83
+ # @param attribute [String, Symbol] the attribute of the raido buttons
84
+ # @param items [Array] array of checkbox items, see {_govuk_checkboxes_fields}
85
+ # @param govuk_checkboxes_options [Hash] options that will be used in customising the HTML
86
+ #
87
+ # @option (see _govuk_checkboxes_fields)
88
+ #
89
+ # @return [ActiveSupport::SafeBuffer] the HTML for the checkbox buttons which is used in {govuk_checkboxes}
90
+
91
+ def govuk_checkboxes_fields(attribute, items, **govuk_checkboxes_options)
92
+ _govuk_checkboxes_fields(items, **govuk_checkboxes_options) do |checkbox_item|
93
+ govuk_checkbox_item(attribute, checkbox_item)
94
+ end
95
+ end
96
+
97
+ # Generates the checkboxes HTML for {govuk_checkboxes_with_form}
98
+ #
99
+ # @param form [ActionView::Helpers::FormBuilder] the form builder used to create the checkbox buttons
100
+ # @param attribute [String, Symbol] the attribute of the raido buttons
101
+ # @param items [Array] array of checkbox items, see {_govuk_checkboxes_fields}
102
+ # @param govuk_checkboxes_options [Hash] options that will be used in customising the HTML
103
+ #
104
+ # @option (see _govuk_checkboxes_fields)
105
+ #
106
+ # @return [ActiveSupport::SafeBuffer] the HTML for the checkbox buttons which is used in {govuk_checkboxes_with_form}
107
+
108
+ def govuk_checkboxes_fields_with_form(form, attribute, items, **govuk_checkboxes_options)
109
+ _govuk_checkboxes_fields(items, **govuk_checkboxes_options) do |checkbox_item|
110
+ govuk_checkbox_item_with_form(form, attribute, checkbox_item)
111
+ end
112
+ end
113
+
114
+ # Wrapper method used by {govuk_checkboxes_fields} and {govuk_checkboxes_fields_with_form} to generate the checkboxes HTML
115
+ #
116
+ # @param items [Array] array of checkbox items.
117
+ # Each item is a hash which can be:
118
+ # - +:divider+ text to separate checkbox items
119
+ # - checkbox item, see {_govuk_checkbox_item}
120
+ # @param govuk_checkboxes_options [Hash] options that will be used in customising the HTML
121
+ #
122
+ # @option govuk_checkboxes_options [String] :classes additional CSS classes for the checkboxes HTML
123
+ # @option govuk_checkboxes_options [Hash] :attributes ({ module: 'govuk-checkboxes' }) any additional attributes that will added as part of the HTML
124
+ #
125
+ # @yield the checkbox item HTML generated by {govuk_checkboxes_fields} or {govuk_checkboxes_fields_with_form}
126
+ #
127
+ # @yieldparam checkbox_item [Hash] the current checkbox item to be rendered
128
+ #
129
+ # @return [ActiveSupport::SafeBuffer] the HTML for the checkbox buttons which is used in {govuk_checkboxes_fields} or {govuk_checkboxes_fields_with_form}
130
+
131
+ def _govuk_checkboxes_fields(items, **govuk_checkboxes_options)
132
+ govuk_checkboxes_classes = ['govuk-checkboxes']
133
+ govuk_checkboxes_classes << govuk_checkboxes_options[:classes]
134
+ ((govuk_checkboxes_options[:attributes] ||= {})[:data] ||= {}).merge!({ module: 'govuk-checkboxes' })
135
+
136
+ tag.div(class: govuk_checkboxes_classes, **govuk_checkboxes_options[:attributes]) do
137
+ capture do
138
+ items.each do |checkbox_item|
139
+ concat(
140
+ if checkbox_item[:divider]
141
+ tag.div(checkbox_item[:divider], class: 'govuk-checkboxes__divider')
142
+ else
143
+ tag.div(class: 'govuk-checkboxes__item') do
144
+ yield(checkbox_item)
145
+ end
146
+ end
147
+ )
148
+ end
149
+ end
150
+ end
151
+ end
152
+
153
+ # Generates the HTML for a checkbox button for {govuk_checkboxes_fields_with_form}
154
+ #
155
+ # @param (see _govuk_checkbox_item)
156
+ #
157
+ # @option (see _govuk_checkbox_item)
158
+ #
159
+ # @return (see _govuk_checkbox_item)
160
+
161
+ def govuk_checkbox_item(attribute, checkbox_item)
162
+ _govuk_checkbox_item(attribute, checkbox_item) do
163
+ checkbox_item[:attributes][:id] ||= "#{sanitize_to_id(attribute)}_#{sanitize_to_id(checkbox_item[:value])}"
164
+
165
+ concat(check_box_tag("#{attribute}[]", checkbox_item[:value], checkbox_item[:checked], class: 'govuk-checkboxes__input', **checkbox_item[:attributes]))
166
+ concat(govuk_label(checkbox_item[:attributes][:id], checkbox_item[:label][:text], **checkbox_item[:label]))
167
+ end
168
+ end
169
+
170
+ # Generates the HTML for a checkbox button for {govuk_checkboxes_fields}
171
+ #
172
+ # @param (see _govuk_checkbox_item)
173
+ # @param form [ActionView::Helpers::FormBuilder] the form builder used to create the checkbox buttons
174
+ #
175
+ # @option (see _govuk_checkbox_item)
176
+ #
177
+ # @return (see _govuk_checkbox_item)
178
+
179
+ def govuk_checkbox_item_with_form(form, attribute, checkbox_item)
180
+ _govuk_checkbox_item(attribute, checkbox_item) do
181
+ (checkbox_item[:label][:attributes] ||= {})[:value] = checkbox_item[:value]
182
+ checkbox_item[:label][:attributes][:for] = checkbox_item[:attributes][:id] if checkbox_item[:attributes][:id]
183
+
184
+ concat(form.check_box(attribute, checkbox_item[:attributes].merge({ class: 'govuk-checkboxes__input', multiple: true, include_hidden: false }), checkbox_item[:value]))
185
+ concat(govuk_label_with_form(form, attribute, checkbox_item[:label][:text], **checkbox_item[:label]))
186
+ end
187
+ end
188
+
189
+ # Wrapper method used by {govuk_checkbox_item} and {govuk_checkbox_item_with_form} to generate the checkboxes HTML
190
+ # including the label and hint, if there is one.
191
+ #
192
+ # @param attribute [String, Symbol] the attribute of the raido buttons
193
+ # @param checkbox_item [Hash] the options for the checkbox item
194
+ #
195
+ # @option checkbox_item [String] :classes additional CSS classes for the checkbox button HTML
196
+ # @option checkbox_item [Hash] :label the parameters that will be used to create the label for the checkbox button, see {govuk_label}
197
+ # @option checkbox_item [Hash] :hint (nil) the parameters that will be used to create the hint for the checkbox button, see {govuk_hint}.
198
+ # If no hint is given then no hint will be rendered
199
+ # @option checkbox_item [Hash] :attributes ({}) any additional attributes that will be added as part of the checkbox button HTML
200
+ #
201
+ # @return [ActiveSupport::SafeBuffer] the HTML for the checkbox buttons, label and hint
202
+ # which is used in {govuk_checkbox_item} and {govuk_checkbox_item_with_form}
203
+
204
+ def _govuk_checkbox_item(attribute, checkbox_item)
205
+ checkbox_item[:attributes] ||= {}
206
+ checkbox_item[:label] ||= {}
207
+ checkbox_item[:label][:classes] = "govuk-checkboxes__label #{checkbox_item[:label][:classes]}".rstrip
208
+
209
+ set_item_options_for_hint('checkboxes', attribute, checkbox_item) if checkbox_item[:hint]
210
+
211
+ capture do
212
+ yield
213
+ concat(govuk_hint(checkbox_item[:hint][:text], **checkbox_item[:hint])) if checkbox_item[:hint]
214
+ end
215
+ end
216
+ end
217
+ end
218
+ end
219
+ end
@@ -0,0 +1,234 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../field'
4
+ require_relative 'input'
5
+
6
+ module CrownMarketplaceUtils
7
+ module GovUkHelper
8
+ module Field
9
+ # = GOV.UK Date Input
10
+ #
11
+ # This helper is used for generating the date input component from the
12
+ # {https://design-system.service.gov.uk/components/date-input GDS - Components - Date Input}
13
+ #
14
+ # This is considered a Field module and so makes use of the methods in {CrownMarketplaceUtils::GovUkHelper::Field}
15
+
16
+ module DateInput
17
+ include Field
18
+ include Input
19
+
20
+ # Generates the HTML for the GOV.UK date input component
21
+ #
22
+ # @param attribute [String, Symbol] the attribute of the date input
23
+ # @param error_message [String] the error message to be displayed
24
+ # @param govuk_date_input_options [Hash] options that will be used for the parts of the fieldset, form group, hint and date input
25
+ #
26
+ # @option govuk_date_input_options [Hash] :form_group see {govuk_fields}
27
+ # @option govuk_date_input_options [Hash] :fieldset see {govuk_fields}
28
+ # @option govuk_date_input_options [Hash] :hint see {govuk_field}
29
+ # @option govuk_date_input_options [Hash] :date_input_options ({}) the options that will be used when rendering the date input.
30
+ # See {govuk_date_input_fields} for more details.
31
+ #
32
+ # @return [ActiveSupport::SafeBuffer] the HTML for the GOV.UK Date Input
33
+ # which can then be rendered on the page
34
+
35
+ def govuk_date_input(attribute, error_message = nil, **govuk_date_input_options)
36
+ set_govuk_date_input_fieldset_options(**govuk_date_input_options)
37
+
38
+ govuk_fields(:date_input, attribute, error_message, **govuk_date_input_options) do |govuk_field_options|
39
+ concat(govuk_date_input_fields(attribute, error_message, **govuk_field_options))
40
+ end
41
+ end
42
+
43
+ # Generates the HTML for the GOV.UK date input component using an ActiveModel.
44
+ # Unlike {govuk_date_input_with_model}, the method will be able to automatically determine if the error message needs to be shown.
45
+ #
46
+ # @param model [ActiveModel] model that will be used to find an error message and the value of the date inputs
47
+ # @param attribute [String, Symbol] the attribute of the date input
48
+ # @param govuk_date_input_options [Hash] options that will be used for the parts of the fieldset, form group, hint and date input
49
+ #
50
+ # @option (see govuk_date_input)
51
+ #
52
+ # @return (see govuk_date_input)
53
+
54
+ def govuk_date_input_with_model(model, attribute, **govuk_date_input_options)
55
+ set_govuk_date_input_fieldset_options(**govuk_date_input_options)
56
+
57
+ govuk_fields_with_model(:date_input, model, attribute, **govuk_date_input_options) do |govuk_field_options, any_errors|
58
+ concat(govuk_date_input_fields_with_model(model, attribute, any_errors, **govuk_field_options))
59
+ end
60
+ end
61
+
62
+ # Generates the HTML for the GOV.UK date input component using an ActionView::Helpers::FormBuilder.
63
+ # Unlike {govuk_date_input_with_model}, the method will be able to automatically determine if the error message needs to be shown.
64
+ #
65
+ # @param form [ActionView::Helpers::FormBuilder] the form builder used to create the date inputs
66
+ # @param attribute [String, Symbol] the attribute of the date input
67
+ # @param govuk_date_input_options [Hash] options that will be used for the parts of the fieldset, form group, hint and date input
68
+ #
69
+ # @option (see govuk_date_input)
70
+ #
71
+ # @return (see govuk_date_input)
72
+
73
+ def govuk_date_input_with_form(form, attribute, **govuk_date_input_options)
74
+ set_govuk_date_input_fieldset_options(**govuk_date_input_options)
75
+
76
+ govuk_fields_with_form(:date_input, form, attribute, **govuk_date_input_options) do |govuk_field_options, any_errors|
77
+ concat(govuk_date_input_fields_with_form(form, attribute, any_errors, **govuk_field_options))
78
+ end
79
+ end
80
+
81
+ private
82
+
83
+ # Generates the date inputs HTML for {govuk_date_input}
84
+ #
85
+ # @param (see _govuk_date_input_fields)
86
+ #
87
+ # @option (see _govuk_date_input_fields)
88
+ #
89
+ # @return [ActiveSupport::SafeBuffer] the HTML for the date inputs which is used in {govuk_date_input}
90
+
91
+ def govuk_date_input_fields(attribute, any_errors, **govuk_date_input_options)
92
+ _govuk_date_input_fields(attribute, any_errors, **govuk_date_input_options) do |date_item_attribute, date_item_input_options|
93
+ govuk_input(
94
+ date_item_attribute,
95
+ **date_item_input_options
96
+ )
97
+ end
98
+ end
99
+
100
+ # Generates the date inputs HTML for {govuk_date_input_with_model}
101
+ #
102
+ # @param model [ActiveModel] model that will be used to find an error message and the value of the date inputs
103
+ # @param (see _govuk_date_input_fields)
104
+ #
105
+ # @option (see _govuk_date_input_fields)
106
+ #
107
+ # @return [ActiveSupport::SafeBuffer] the HTML for the date inputs which is used in {govuk_date_input_with_model}
108
+
109
+ def govuk_date_input_fields_with_model(model, attribute, any_errors, **govuk_date_input_options)
110
+ _govuk_date_input_fields(attribute, any_errors, **govuk_date_input_options) do |date_item_attribute, date_item_input_options|
111
+ govuk_input_with_model(
112
+ model,
113
+ date_item_attribute,
114
+ **date_item_input_options
115
+ )
116
+ end
117
+ end
118
+
119
+ # Generates the date inputs HTML for {govuk_date_input_with_form}
120
+ #
121
+ # @param form [ActionView::Helpers::FormBuilder] the form builder used to create the date inputs
122
+ # @param (see _govuk_date_input_fields)
123
+ #
124
+ # @option (see _govuk_date_input_fields)
125
+ #
126
+ # @return [ActiveSupport::SafeBuffer] the HTML for the date inputs which is used in {govuk_date_input_with_form}
127
+
128
+ def govuk_date_input_fields_with_form(form, attribute, any_errors, **govuk_date_input_options)
129
+ _govuk_date_input_fields(attribute, any_errors, **govuk_date_input_options) do |date_item_attribute, date_item_input_options|
130
+ govuk_input_with_form(
131
+ form,
132
+ date_item_attribute,
133
+ **date_item_input_options
134
+ )
135
+ end
136
+ end
137
+
138
+ # Sets the role for the fieldset to group
139
+ #
140
+ # @param govuk_date_input_options [Hash] options that will be used for the parts of the fieldset, form group, hint and date input
141
+
142
+ def set_govuk_date_input_fieldset_options(**govuk_date_input_options)
143
+ (govuk_date_input_options[:fieldset][:attributes] ||= {})[:role] = 'group'
144
+ end
145
+
146
+ # Wrapper method used by {govuk_date_input_fields}, {govuk_date_input_fields_with_model} and {govuk_date_input_fields_with_form}
147
+ # to generate the date inputs HTML
148
+ #
149
+ # @param attribute [String, Symbol] the attribute of the date input
150
+ # @param any_errors [Boolean] flag to indicate if the inputs need the error class
151
+ # @param govuk_date_input_options [Hash] options that will be used in customising the HTML
152
+ #
153
+ # @option govuk_date_input_options [String] :classes additional CSS classes for the date inputs HTML
154
+ # @option govuk_date_input_options[Array] :date_items an array of the date items that will be rendered.
155
+ # Each date item hash must contain the +:name+ to add as suffix to attribute.
156
+ # Anything else in the hash will be used as options in a {govuk_input}.
157
+ # @option govuk_date_input_options [Hash] :attributes ({}) any additional attributes that will added as part of the HTML
158
+ #
159
+ # @yield the date input item HTML generated by the parent method
160
+ #
161
+ # @yieldparam date_item_attribute [String] the attribute for individual date input
162
+ # @yieldparam date_item_input_options [Hash] the HTML options used for the date input item
163
+ #
164
+ # @return [ActiveSupport::SafeBuffer] the HTML for the date inputs which is used in
165
+ # {govuk_date_input_fields}, {govuk_date_input_fields_with_model} and {govuk_date_input_fields_with_form}
166
+
167
+ def _govuk_date_input_fields(attribute, any_errors, **govuk_date_input_options)
168
+ govuk_date_input_classes = ['govuk-date-input']
169
+ govuk_date_input_classes << govuk_date_input_options[:classes]
170
+ date_items = govuk_date_input_options[:date_items] || [
171
+ {
172
+ name: 'day',
173
+ input: {
174
+ classes: 'govuk-input--width-2'
175
+ }
176
+ },
177
+ {
178
+ name: 'month',
179
+ input: {
180
+ classes: 'govuk-input--width-2'
181
+ }
182
+ },
183
+ {
184
+ name: 'year',
185
+ input: {
186
+ classes: 'govuk-input--width-4'
187
+ }
188
+ }
189
+ ]
190
+
191
+ govuk_date_input_options[:attributes] ||= {}
192
+
193
+ tag.div(class: govuk_date_input_classes, **govuk_date_input_options[:attributes]) do
194
+ capture do
195
+ enumerate_and_set_date_input_options(date_items, any_errors) do |date_item_input_options|
196
+ concat(tag.div(class: 'govuk-date-input__item') do
197
+ concat(yield("#{attribute}_#{date_item_input_options[:name]}", date_item_input_options))
198
+ end)
199
+ end
200
+ end
201
+ end
202
+ end
203
+
204
+ # rubocop:disable Metrics/CyclomaticComplexity
205
+
206
+ # Enumerates and inititalises the attributes of each date input item and is used by {_govuk_date_input_fields}
207
+ #
208
+ # @param date_items [Array] an array of the date item hashes that will be inititalised
209
+ # @param any_errors [Boolean] flag to indicate if the inputs need the error class
210
+ #
211
+ # @yield the date input item HTML generated by teach date input item
212
+ #
213
+ # @yieldparam date_item_input_options [Hash] the HTML options used for the date input item
214
+
215
+ def enumerate_and_set_date_input_options(date_items, any_errors)
216
+ date_items.each do |date_item_input_options|
217
+ (date_item_input_options[:input] ||= {})[:attributes] ||= {}
218
+
219
+ date_item_input_options[:input][:classes] = "govuk-date-input__input #{date_item_input_options[:input][:classes]} #{'govuk-input--error' if any_errors}".rstrip
220
+
221
+ date_item_input_options[:input][:attributes][:inputmode] ||= 'numeric'
222
+
223
+ date_item_input_options[:label] ||= {}
224
+ date_item_input_options[:label][:text] ||= date_item_input_options[:name].capitalize
225
+ date_item_input_options[:label][:classes] = 'govuk-date-input__label'
226
+
227
+ yield(date_item_input_options)
228
+ end
229
+ end
230
+ # rubocop:enable Metrics/CyclomaticComplexity
231
+ end
232
+ end
233
+ end
234
+ end
@@ -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