crown_marketplace_utils 0.1.0.beta.3 → 0.1.0.beta.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (39) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +1 -1
  3. data/Gemfile.lock +5 -5
  4. data/README.md +3 -4
  5. data/lib/crown_marketplace_utils/helpers/gov_uk_helper/accordion.rb +116 -0
  6. data/lib/crown_marketplace_utils/helpers/gov_uk_helper/back_link.rb +34 -0
  7. data/lib/crown_marketplace_utils/{gov_uk_helper → helpers/gov_uk_helper}/breadcrumbs.rb +2 -2
  8. data/lib/crown_marketplace_utils/{gov_uk_helper → helpers/gov_uk_helper}/button.rb +13 -19
  9. data/lib/crown_marketplace_utils/{gov_uk_helper → helpers/gov_uk_helper}/details.rb +1 -1
  10. data/lib/crown_marketplace_utils/{gov_uk_helper → helpers/gov_uk_helper}/error_message.rb +1 -1
  11. data/lib/crown_marketplace_utils/{gov_uk_helper → helpers/gov_uk_helper}/field/character_count.rb +40 -68
  12. data/lib/crown_marketplace_utils/{gov_uk_helper → helpers/gov_uk_helper}/field/checkboxes.rb +65 -71
  13. data/lib/crown_marketplace_utils/helpers/gov_uk_helper/field/date_input.rb +153 -0
  14. data/lib/crown_marketplace_utils/helpers/gov_uk_helper/field/file_upload.rb +94 -0
  15. data/lib/crown_marketplace_utils/helpers/gov_uk_helper/field/input.rb +156 -0
  16. data/lib/crown_marketplace_utils/{gov_uk_helper → helpers/gov_uk_helper}/field/radios.rb +65 -67
  17. data/lib/crown_marketplace_utils/helpers/gov_uk_helper/field/select.rb +134 -0
  18. data/lib/crown_marketplace_utils/helpers/gov_uk_helper/field/textarea.rb +105 -0
  19. data/lib/crown_marketplace_utils/helpers/gov_uk_helper/field.rb +215 -0
  20. data/lib/crown_marketplace_utils/{gov_uk_helper → helpers/gov_uk_helper}/fieldset.rb +2 -2
  21. data/lib/crown_marketplace_utils/{gov_uk_helper → helpers/gov_uk_helper}/form_group.rb +10 -21
  22. data/lib/crown_marketplace_utils/{gov_uk_helper → helpers/gov_uk_helper}/header.rb +3 -3
  23. data/lib/crown_marketplace_utils/{gov_uk_helper → helpers/gov_uk_helper}/hint.rb +1 -1
  24. data/lib/crown_marketplace_utils/helpers/gov_uk_helper/label.rb +88 -0
  25. data/lib/crown_marketplace_utils/{gov_uk_helper → helpers/gov_uk_helper}/notification_banner.rb +1 -1
  26. data/lib/crown_marketplace_utils/helpers/gov_uk_helper/pagination.rb +338 -0
  27. data/lib/crown_marketplace_utils/{gov_uk_helper → helpers/gov_uk_helper}/step_by_step_navigation.rb +1 -1
  28. data/lib/crown_marketplace_utils/{gov_uk_helper → helpers/gov_uk_helper}/tag.rb +1 -1
  29. data/lib/crown_marketplace_utils/helpers/gov_uk_helper/warning_text.rb +52 -0
  30. data/lib/crown_marketplace_utils/{gov_uk_helper.rb → helpers/gov_uk_helper.rb} +11 -1
  31. data/lib/crown_marketplace_utils/version.rb +1 -1
  32. data/lib/crown_marketplace_utils.rb +1 -1
  33. metadata +28 -23
  34. data/lib/crown_marketplace_utils/gov_uk_helper/field/input.rb +0 -160
  35. data/lib/crown_marketplace_utils/gov_uk_helper/field/select.rb +0 -166
  36. data/lib/crown_marketplace_utils/gov_uk_helper/field/textarea.rb +0 -127
  37. data/lib/crown_marketplace_utils/gov_uk_helper/field.rb +0 -263
  38. data/lib/crown_marketplace_utils/gov_uk_helper/label.rb +0 -97
  39. data/lib/crown_marketplace_utils/gov_uk_helper/pagination.rb +0 -214
@@ -1,263 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative 'fieldset'
4
- require_relative 'form_group'
5
- require_relative 'hint'
6
- require_relative 'label'
7
-
8
- module CrownMarketplaceUtils
9
- module GovUkHelper
10
- # = GOV.UK Field
11
- #
12
- # This module contains methods to wrap the:
13
- # - fieldset
14
- # - form group
15
- # - label
16
- # - hint
17
- # - error message
18
- # around some kind of input.
19
- #
20
- # The wrapper functions in this module are used
21
- # to create the fields using the structure of a GDS input field component.
22
-
23
- module Field
24
- include Fieldset
25
- include FormGroup
26
- include Hint
27
- include Label
28
-
29
- # Generates the HTML to wrap arround a GDS input field component.
30
- #
31
- # @param type [Symbol] the type of the field
32
- # @param attribute [String, Symbol] the attribute of the field
33
- # @param error_message [String] the error message to be displayed
34
- # @param govuk_field_options [Hash] options that will be used for the parts of the form group, label, hint and field
35
- #
36
- # @option govuk_field_options [Hash] :form_group_options ({}) the options for govuk_form_group {govuk_form_group}
37
- # @option govuk_field_options [Hash] :label the parameters that will be used to create the label for the field:
38
- # - +:text+ (required) - the label text
39
- # - +:options+ - default: { } - the options for govuk_label {govuk_label}
40
- # @option govuk_field_options [Hash] :hint (nil) the parameters that will be used to create the hint for the field
41
- # - +:text+ (required) - the hint text
42
- # - +:options+ - default: { } - the options for govuk_hint {govuk_hint}
43
- # If no hint is given then no hint will be rendered
44
- # @option govuk_field_options [Hash] :field_options ({}) the options that will be used when rendering the field.
45
- # For more details look at a module that uses +Field+.
46
- #
47
- # @yield the field HTML
48
- #
49
- # @yieldparam govuk_field_options [Hash] the HTML options used when rendering the field
50
- #
51
- # @return [ActiveSupport::SafeBuffer] the HTML that wraps arround the field
52
-
53
- def govuk_field(type, attribute, error_message = nil, **govuk_field_options)
54
- field_key = :"#{type}_options"
55
-
56
- set_label_for_if_custom_id(field_key, govuk_field_options)
57
- set_hint_id(attribute, govuk_field_options)
58
-
59
- govuk_form_group(attribute, error_message, **(govuk_field_options[:form_group_options] || {})) do |display_error_message|
60
- set_field_described_by(field_key, attribute, error_message, govuk_field_options)
61
-
62
- capture do
63
- concat(govuk_label(attribute, govuk_field_options[:label][:text], **govuk_field_options[:label][:options]))
64
- concat(govuk_hint(govuk_field_options[:hint][:text], **govuk_field_options[:hint][:options])) if govuk_field_options[:hint]
65
- concat(display_error_message)
66
- yield(govuk_field_options[field_key])
67
- end
68
- end
69
- end
70
-
71
- # Generates the HTML to wrap arround a GDS input field component using an ActionView::Helpers::FormBuilder.
72
- # Unlike {govuk_field}, the method will be able to automatically determine if the error message needs to be shown.
73
- #
74
- # @param type [Symbol] the type of the field
75
- # @param form [ActionView::Helpers::FormBuilder] :form the form builder used to create the label
76
- # @param attribute [String, Symbol] the attribute of the field
77
- # @param govuk_field_options [Hash] options that will be used for the parts of the form group, label, hint and field
78
- #
79
- # @option govuk_field_options [Hash] :form_group_options ({}) the options for govuk_form_group {govuk_form_group}
80
- # @option govuk_field_options [Hash] :label the parameters that will be used to create the label for the field:
81
- # - +:text+ (required) - the label text
82
- # - +:options+ - default: { } - the options for govuk_label {govuk_label}
83
- # @option govuk_field_options [Hash] :hint (nil) the parameters that will be used to create the hint for the field
84
- # - +:text+ (required) - the hint text
85
- # - +:options+ - default: { } - the options for govuk_hint {govuk_hint}
86
- # If no hint is given then no hint will be rendered
87
- # @option govuk_field_options [Hash] :field_options ({}) the options that will be used when rendering the field.
88
- # For more details look at a module that uses +Field+.
89
- #
90
- # @yield the field HTML
91
- #
92
- # @yieldparam govuk_field_options [Hash] the HTML options used when rendering the field
93
- # @yieldparam error_message [ActiveSupport::SafeBuffer] used by the field to indicate if there is an error
94
- #
95
- # @return (see govuk_field)
96
-
97
- def govuk_field_with_form(type, form, attribute, **govuk_field_options)
98
- field_key = :"#{type}_options"
99
-
100
- set_label_for_if_custom_id(field_key, govuk_field_options)
101
- set_hint_id(attribute, govuk_field_options)
102
-
103
- govuk_form_group_with_model(form.object, attribute, **(govuk_field_options[:form_group_options] || {})) do |display_error_message|
104
- set_field_described_by(field_key, attribute, display_error_message, govuk_field_options)
105
-
106
- capture do
107
- concat(govuk_label_with_form(form, attribute, govuk_field_options[:label][:text], **(govuk_field_options[:label][:options] || {})))
108
- concat(govuk_hint(govuk_field_options[:hint][:text], **govuk_field_options[:hint][:options])) if govuk_field_options[:hint]
109
- concat(display_error_message)
110
- yield(govuk_field_options[field_key], display_error_message)
111
- end
112
- end
113
- end
114
-
115
- # Generates the HTML to wrap arround a GDS input fields component.
116
- # These are inputs that require being wrapped in a fieldset, for example radio buttons.
117
- #
118
- # @param type [Symbol] the type of the fields
119
- # @param attribute [String, Symbol] the attribute of the fields
120
- # @param error_message [String] the error message to be displayed
121
- # @param govuk_fields_options [Hash] options that will be used for the parts of the fieldset, form group, hint and fields
122
- #
123
- # @option govuk_fields_options [Hash] :form_group_options ({}) the options for govuk_form_group {govuk_form_group}
124
- # @option govuk_fields_options [Hash] :fieldset_options ({}) the options for govuk_fieldset {govuk_fieldset}
125
- # @option govuk_fields_options [Hash] :hint (nil) the parameters that will be used to create the hint for the fields
126
- # - +:text+ (required) - the hint text
127
- # - +:options+ - default: { } - the options for govuk_hint {govuk_hint}
128
- # If no hint is given then no hint will be rendered
129
- # @option govuk_fields_options [Hash] :field_options ({}) the options that will be used when rendering the fields.
130
- # For more details look at a module that uses +Field+.
131
- #
132
- # @yield the fields HTML
133
- #
134
- # @yieldparam govuk_fields_options [Hash] the HTML options used when rendering the fields
135
- #
136
- # @return [ActiveSupport::SafeBuffer] the HTML that wraps arround the fields
137
-
138
- def govuk_fields(type, attribute, error_message = nil, **govuk_fields_options)
139
- field_key = :"#{type}_options"
140
-
141
- set_hint_id(attribute, govuk_fields_options)
142
-
143
- govuk_form_group(attribute, error_message, **(govuk_fields_options[:form_group_options] || {})) do |display_error_message|
144
- set_field_described_by(:fieldset_options, attribute, error_message, govuk_fields_options)
145
- (govuk_fields_options[field_key] ||= {})[:attributes] ||= {}
146
-
147
- govuk_fieldset(**govuk_fields_options[:fieldset_options]) do
148
- capture do
149
- concat(govuk_hint(govuk_fields_options[:hint][:text], **govuk_fields_options[:hint][:options])) if govuk_fields_options[:hint]
150
- concat(display_error_message)
151
- yield(govuk_fields_options[field_key])
152
- end
153
- end
154
- end
155
- end
156
-
157
- # Generates the HTML to wrap arround a GDS input fields component using an ActionView::Helpers::FormBuilder.
158
- # These are inputs that require being wrapped in a fieldset, for example radio buttons.
159
- #
160
- # Unlike {govuk_fields}, the method will be able to automatically determine if the error message needs to be shown.
161
- #
162
- # @param type [Symbol] the type of the fields
163
- # @param form [ActionView::Helpers::FormBuilder] :form the form builder used to create the label
164
- # @param attribute [String, Symbol] the attribute of the fields
165
- # @param govuk_fields_options [Hash] options that will be used for the parts of the fieldset, form group, hint and fields
166
- #
167
- # @option govuk_fields_options [Hash] :form_group_options ({}) the options for govuk_form_group {govuk_form_group}
168
- # @option govuk_fields_options [Hash] :fieldset_options ({}) the options for govuk_fieldset {govuk_fieldset}
169
- # @option govuk_fields_options [Hash] :hint (nil) the parameters that will be used to create the hint for the fields
170
- # - +:text+ (required) - the hint text
171
- # - +:options+ - default: { } - the options for govuk_hint {govuk_hint}
172
- # If no hint is given then no hint will be rendered
173
- # @option govuk_fields_options [Hash] :field_options ({}) the options that will be used when rendering the fields.
174
- # For more details look at a module that uses +Field+.
175
- #
176
- # @yield the fields HTML
177
- #
178
- # @yieldparam govuk_fields_options [Hash] the HTML options used when rendering the fields
179
- #
180
- # @return (see govuk_fields)
181
-
182
- def govuk_fields_with_form(type, form, attribute, **govuk_fields_options)
183
- field_key = :"#{type}_options"
184
-
185
- set_hint_id(attribute, govuk_fields_options)
186
-
187
- govuk_form_group_with_model(form.object, attribute, **(govuk_fields_options[:form_group_options] || {})) do |display_error_message|
188
- set_field_described_by(:fieldset_options, attribute, display_error_message, govuk_fields_options)
189
- (govuk_fields_options[field_key] ||= {})[:attributes] ||= {}
190
-
191
- govuk_fieldset(**govuk_fields_options[:fieldset_options]) do
192
- capture do
193
- concat(govuk_hint(govuk_fields_options[:hint][:text], **govuk_fields_options[:hint][:options])) if govuk_fields_options[:hint]
194
- concat(display_error_message)
195
- yield(govuk_fields_options[field_key])
196
- end
197
- end
198
- end
199
- end
200
-
201
- private
202
-
203
- # Sets the label +for+ if a custom ID has been given for the field.
204
- #
205
- # @param govuk_field_options [Hash] see {govuk_field} for details
206
-
207
- def set_label_for_if_custom_id(field_key, govuk_field_options)
208
- field_id = govuk_field_options.dig(field_key, :attributes, :id)
209
-
210
- govuk_field_options[:label][:options] ||= {}
211
- (govuk_field_options[:label][:options][:attributes] ||= {}).merge!({ for: field_id }) if field_id
212
- end
213
-
214
- # Sets the hint ID if there is a hint, and the ID for the hint has not been sent
215
- #
216
- # @param attribute [String, Symbol] the attribute of the field
217
- # @param govuk_field_options [Hash] see {govuk_field} for details
218
-
219
- def set_hint_id(attribute, govuk_field_options)
220
- return if !govuk_field_options[:hint] || govuk_field_options.dig(:hint, :options, :attributes, :id)
221
-
222
- govuk_field_options[:hint][:options] ||= {}
223
- (govuk_field_options[:hint][:options][:attributes] ||= {}).merge!({ id: "#{attribute}-hint" })
224
- end
225
-
226
- # Adds the aira-describedby attribute for the field
227
- # if there is a hint or an error message
228
- #
229
- # @param attribute [String, Symbol] the attribute of the input
230
- # @param error_message [String] used to indicate if there is an error
231
- # @param govuk_field_options [Hash] see {#govuk_field} for details
232
-
233
- def set_field_described_by(field_key, attribute, error_message, govuk_field_options)
234
- aria_described_by = []
235
- aria_described_by << govuk_field_options.dig(field_key, :attributes, :aria, :describedby)
236
- aria_described_by << govuk_field_options[:hint][:options][:attributes][:id] if govuk_field_options[:hint]
237
- aria_described_by << "#{attribute}-error" if error_message
238
- aria_described_by.compact!
239
-
240
- govuk_field_options[field_key] ||= {}
241
- govuk_field_options[field_key][:attributes] ||= {}
242
-
243
- return unless aria_described_by.any?
244
-
245
- (govuk_field_options[field_key][:attributes][:aria] ||= {}).merge!({ describedby: aria_described_by.join(' ') })
246
- end
247
-
248
- # Sets the hint classes and adds the aira-describedby attribute for a fields item
249
- #
250
- # @param type [String] the type of the item
251
- # @param attribute [String, Symbol] the attribute of the item
252
- # @param item [Hash] the options for that item
253
-
254
- def set_item_options_for_hint(type, attribute, item)
255
- (item[:hint][:options] ||= {})[:attributes] ||= {}
256
- item[:hint][:options][:classes] = "govuk-#{type}__hint #{item[:hint][:options][:classes]}".rstrip
257
- item[:hint][:options][:attributes][:id] ||= "#{attribute}_#{item[:value]}-item-hint"
258
-
259
- (item[:attributes][:aria] ||= {})[:describedby] = item[:hint][:options][:attributes][:id]
260
- end
261
- end
262
- end
263
- end
@@ -1,97 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'action_view'
4
-
5
- module CrownMarketplaceUtils
6
- module GovUkHelper
7
- # = GOV.UK label
8
- #
9
- # This helper is used for generating the label component from the Government Design Systems
10
-
11
- module Label
12
- include ActionView::Context
13
- include ActionView::Helpers::TagHelper
14
- include ActionView::Helpers::TextHelper
15
- include ActionView::Helpers::FormTagHelper
16
-
17
- # Generates the HTML for the GOV.UK label component
18
- #
19
- # @param attribute [String, Symbol] the attribute of the input that requires a label
20
- # @param label_text [String] the label text, it is ignored if a block is given
21
- # @param govuk_label_options [Hash] options that will be used in customising the HTML
22
- #
23
- # @option govuk_label_options [String] :classes additional CSS classes for the label HTML
24
- # @option govuk_label_options [Boolean] :is_page_heading (false) if the legend is also the heading it will rendered in a h1
25
- # @option govuk_label_options [Hash] :attributes ({}) any additional attributes that will added as part of the HTML
26
- #
27
- # @yield HTML that will be contained within the 'govuk-label' label
28
- #
29
- # @return [ActiveSupport::SafeBuffer] the HTML for the GOV.UK Label
30
- # which can then be rendered on the page
31
-
32
- def govuk_label(attribute, label_text = nil, **govuk_label_options)
33
- _govuk_label(**govuk_label_options) do |govuk_label_classes, govuk_label_attributes|
34
- label_tag(attribute, class: govuk_label_classes, **govuk_label_attributes) do
35
- if block_given?
36
- yield
37
- else
38
- concat(label_text)
39
- end
40
- end
41
- end
42
- end
43
-
44
- # Generates the HTML for the GOV.UK label component using an ActionView::Helpers::FormBuilder
45
- #
46
- # @param form [ActionView::Helpers::FormBuilder] :form the form builder used to create the label
47
- # @param attribute [String, Symbol] the attribute of the input that requires a label
48
- # @param label_text [String] the label text, it is ignored if a block is given
49
- # @param govuk_label_options [Hash] options that will be used in customising the HTML
50
- #
51
- # @option (see govuk_label)
52
- #
53
- # @yield (see govuk_label)
54
- #
55
- # @return (see govuk_label)
56
-
57
- def govuk_label_with_form(form, attribute, label_text = nil, **govuk_label_options, &block)
58
- _govuk_label(**govuk_label_options) do |govuk_label_classes, govuk_label_attributes|
59
- if block_given?
60
- form.label(attribute, class: govuk_label_classes, **govuk_label_attributes, &block)
61
- else
62
- form.label(attribute, label_text, class: govuk_label_classes, **govuk_label_attributes)
63
- end
64
- end
65
- end
66
-
67
- private
68
-
69
- # Wrapper method used by {#govuk_label} and {#govuk_label_with_form} to generate the Label HTML
70
- #
71
- # @param govuk_label_options [Hash] options that will be used in customising the HTML
72
- #
73
- # @option (see govuk_label)
74
- #
75
- # @yield the label HTML generated by {#govuk_label} or {#govuk_label_with_form}
76
- #
77
- # @yieldparam govuk_label_classes [Array] the classes for the label HTML
78
- # @yieldparam govuk_label_attributes [Hash] additional attributes that will added as part of the HTML
79
- #
80
- # @return (see govuk_label)
81
-
82
- def _govuk_label(**govuk_label_options)
83
- govuk_label_classes = ['govuk-label']
84
- govuk_label_classes << govuk_label_options[:classes]
85
- govuk_label_options[:attributes] ||= {}
86
-
87
- label_html = yield(govuk_label_classes, govuk_label_options[:attributes])
88
-
89
- if govuk_label_options[:is_page_heading]
90
- tag.h1(label_html, class: 'govuk-label-wrapper')
91
- else
92
- label_html
93
- end
94
- end
95
- end
96
- end
97
- end
@@ -1,214 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'action_view'
4
-
5
- module CrownMarketplaceUtils
6
- module GovUkHelper
7
- # = GOV.UK Pagination
8
- #
9
- # This helper is used for generating the pagination component from the
10
- # {https://design-system.service.gov.uk/components/pagination GDS - Components - Pagination}
11
-
12
- module Pagination
13
- include ActionView::Context
14
- include ActionView::Helpers::TagHelper
15
- include ActionView::Helpers::TextHelper
16
- include ActionView::Helpers::UrlHelper
17
-
18
- # rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
19
-
20
- # Generates the HTML for the GOV.UK Pagination component
21
- #
22
- # @param govuk_pagination_options [Hash] options that will be used in customising the HTML
23
- #
24
- # @option govuk_pagination_options [String] :classes additional CSS classes for the pagination HTML
25
- # @option govuk_pagination_options [Array] :items an array of items for the pagination (see: {govuk_pagination_items})
26
- # @option govuk_pagination_options [Hash] :previous the previous link (see: {govuk_pagination_previous})
27
- # @option govuk_pagination_options [Hash] :next the next link (see: {govuk_pagination_next})
28
- # @option govuk_pagination_options [Hash] :attributes ({role: 'navigation', aria: { label: 'results' }})
29
- # any additional attributes that will added as part of the HTML
30
- #
31
- # @return [ActiveSupport::SafeBuffer] the HTML for the GOV.UK Pagination
32
- # which can then be rendered on the page
33
-
34
- def govuk_pagination(**govuk_pagination_options)
35
- govuk_pagination_classes = ['govuk-pagination']
36
- govuk_pagination_classes << govuk_pagination_options[:classes]
37
-
38
- block_is_level = govuk_pagination_options[:items].blank? && (govuk_pagination_options[:next].present? || govuk_pagination_options[:previous].present?)
39
-
40
- govuk_pagination_classes << 'govuk-pagination--block' if block_is_level
41
-
42
- (govuk_pagination_options[:attributes] ||= {}).merge({ role: 'navigation' })
43
- (govuk_pagination_options[:attributes][:aria] ||= {})[:label] ||= 'results'
44
-
45
- tag.nav(class: govuk_pagination_classes, **govuk_pagination_options[:attributes]) do
46
- capture do
47
- concat(govuk_pagination_previous(block_is_level, **govuk_pagination_options[:previous])) if govuk_pagination_options[:previous]
48
- concat(govuk_pagination_items(govuk_pagination_options[:items])) if govuk_pagination_options[:items]
49
- concat(govuk_pagination_next(block_is_level, **govuk_pagination_options[:next])) if govuk_pagination_options[:next]
50
- end
51
- end
52
- end
53
-
54
- # rubocop:enable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
55
-
56
- private
57
-
58
- # Generates the previous link for {govuk_pagination}
59
- #
60
- # @param block_is_level [Boolean] when there are no items, this will be true and will add extra classe
61
- # to the link to make the next and previous pagination links level
62
- # @param govuk_pagination_previous_options [Hash] options that will be used in customising the HTML
63
- #
64
- # @option govuk_pagination_previous_options [String] :href the URL for the link
65
- # @option govuk_pagination_previous_options [String] :text ('Previous') the text for the link
66
- # @option govuk_pagination_previous_options [String] :lable_text additional text for the link when the pagination block is level
67
- # @option govuk_pagination_previous_options [Hash] :attributes ({}) any additional attributes that will added as part of the HTML
68
- #
69
- # @return [ActiveSupport::SafeBuffer] the HTML for the previous link which is used in {govuk_pagination}
70
-
71
- def govuk_pagination_previous(block_is_level, **govuk_pagination_previous_options)
72
- govuk_pagination_previous_classes = ['govuk-pagination__link-title']
73
- govuk_pagination_previous_classes << 'govuk-pagination__link-title--decorated' if block_is_level && !govuk_pagination_previous_options[:lable_text]
74
-
75
- tag.div(class: 'govuk-pagination__prev') do
76
- link_to(govuk_pagination_previous_options[:href], class: 'govuk-link govuk-pagination__link', rel: 'prev', **(govuk_pagination_previous_options[:attributes] || {})) do
77
- capture do
78
- concat(govuk_pagination_icon(:prev))
79
- concat(tag.span(govuk_pagination_previous_options[:text] || 'Previous', class: govuk_pagination_previous_classes))
80
- concat(govuk_pagination_icon_label_text(block_is_level, govuk_pagination_previous_options[:lable_text]))
81
- end
82
- end
83
- end
84
- end
85
-
86
- # Generates the next link for {govuk_pagination}
87
- #
88
- # @param block_is_level [Boolean] when there are no items, this will be true and will add extra classe
89
- # to the link to make the next and previous pagination links level
90
- # @param govuk_pagination_next_options [Hash] options that will be used in customising the HTML
91
- #
92
- # @option govuk_pagination_next_options [String] :href the URL for the link
93
- # @option govuk_pagination_next_options [String] :text ('Next') the text for the link
94
- # @option govuk_pagination_next_options [String] :lable_text additional text for the link when the pagination block is level
95
- # @option govuk_pagination_next_options [Hash] :attributes ({}) any additional attributes that will added as part of the HTML
96
- #
97
- # @return [ActiveSupport::SafeBuffer] the HTML for the next link which is used in {govuk_pagination}
98
-
99
- def govuk_pagination_next(block_is_level, **govuk_pagination_next_options)
100
- govuk_pagination_next_classes = ['govuk-pagination__link-title']
101
- govuk_pagination_next_classes << 'govuk-pagination__link-title--decorated' if block_is_level && !govuk_pagination_next_options[:lable_text]
102
-
103
- tag.div(class: 'govuk-pagination__next') do
104
- link_to(govuk_pagination_next_options[:href], class: 'govuk-link govuk-pagination__link', rel: 'next', **(govuk_pagination_next_options[:attributes] || {})) do
105
- capture do
106
- concat(govuk_pagination_icon(:next)) if block_is_level
107
- concat(tag.span(govuk_pagination_next_options[:text] || 'Next', class: govuk_pagination_next_classes))
108
- concat(govuk_pagination_icon_label_text(block_is_level, govuk_pagination_next_options[:lable_text]))
109
- concat(govuk_pagination_icon(:next)) unless block_is_level
110
- end
111
- end
112
- end
113
- end
114
-
115
- # Generates the item links for {govuk_pagination}
116
- #
117
- # @param govuk_pagination_items [Array(Hash)] an array of item hashes for the pagination.
118
- # There are two types of item:
119
- # - {govuk_pagination_item_ellipsis ellipsis item}
120
- # - {govuk_pagination_item_number number item}
121
- #
122
- # @return [ActiveSupport::SafeBuffer] the HTML for the lits of items which is used in {govuk_pagination}
123
-
124
- def govuk_pagination_items(govuk_pagination_items)
125
- tag.ul(class: 'govuk-pagination__list') do
126
- capture do
127
- govuk_pagination_items.each do |govuk_pagination_item|
128
- case govuk_pagination_item[:type]
129
- when :ellipsis
130
- concat(govuk_pagination_item_ellipsis)
131
- when :number
132
- concat(govuk_pagination_item_number(govuk_pagination_item))
133
- end
134
- end
135
- end
136
- end
137
- end
138
-
139
- # Generates the icon for:
140
- # - {govuk_pagination_previous}
141
- # - {govuk_pagination_next}
142
- #
143
- # @param type [Symbol] the type of the pagination icon (+:prev+ or +:next+)
144
- #
145
- # @return [ActiveSupport::SafeBuffer]
146
-
147
- def govuk_pagination_icon(type)
148
- tag.svg(class: "govuk-pagination__icon govuk-pagination__icon--#{type}", xmlns: 'http://www.w3.org/2000/svg', height: '13', width: '15', aria: { hidden: 'true' }, focusable: 'false', viewBox: '0 0 15 13') do
149
- tag.path(d: PAGINATION_ICON_PATHS[type])
150
- end
151
- end
152
-
153
- # Generates the label text for:
154
- # - {govuk_pagination_previous}
155
- # - {govuk_pagination_next}
156
- #
157
- # @param block_is_level [Boolean] when there are no items, this will be true
158
- # @param label_text [String] the additional text for the link
159
- #
160
- # @return [ActiveSupport::SafeBuffer]
161
-
162
- def govuk_pagination_icon_label_text(block_is_level, label_text)
163
- return unless block_is_level && label_text
164
-
165
- capture do
166
- concat(tag.span(':', class: 'govuk-visually-hidden'))
167
- concat(tag.span(label_text, class: 'govuk-pagination__link-label'))
168
- end
169
- end
170
-
171
- # Generates the ellipsis HTML for {govuk_pagination_items}
172
- #
173
- # @return [ActiveSupport::SafeBuffer] the HTML for an ellipsis item which is used in {govuk_pagination_items}
174
-
175
- def govuk_pagination_item_ellipsis
176
- tag.li('⋯', class: 'govuk-pagination__item govuk-pagination__item--ellipses')
177
- end
178
-
179
- # Generates the number item HTML for {govuk_pagination_items}
180
- #
181
- # @param govuk_pagination_item [Hash] options that will be used in customising the HTML
182
- #
183
- # @option govuk_pagination_item [String] :href the URL for the link
184
- # @option govuk_pagination_item [String] :number the number for the link
185
- # @option govuk_pagination_item [String] :current is this item the current page
186
- # @option govuk_pagination_item [Hash] :attributes ({aria: { label: 'Page <NUMBER>' } })
187
- # any additional attributes that will added as part of the HTML
188
- #
189
- # @return [ActiveSupport::SafeBuffer] the HTML for an number item which is used in {govuk_pagination_items}
190
-
191
- def govuk_pagination_item_number(govuk_pagination_item)
192
- govuk_pagination_item_classes = ['govuk-pagination__item']
193
- (govuk_pagination_item[:attributes] ||= {})[:aria] ||= {}
194
- govuk_pagination_item[:attributes][:aria][:label] ||= "Page #{govuk_pagination_item[:number]}"
195
-
196
- if govuk_pagination_item[:current]
197
- govuk_pagination_item_classes << 'govuk-pagination__item--current'
198
- govuk_pagination_item[:attributes][:aria][:current] = 'page'
199
- end
200
-
201
- tag.li(class: govuk_pagination_item_classes) do
202
- link_to(govuk_pagination_item[:href], govuk_pagination_item[:number], class: 'govuk-link govuk-pagination__link', **govuk_pagination_item[:attributes])
203
- end
204
- end
205
-
206
- # The paths for the pagination next and previous icons
207
-
208
- PAGINATION_ICON_PATHS = {
209
- prev: 'm6.5938-0.0078125-6.7266 6.7266 6.7441 6.4062 1.377-1.449-4.1856-3.9768h12.896v-2h-12.984l4.2931-4.293-1.414-1.414z',
210
- next: 'm8.107-0.0078125-1.4136 1.414 4.2926 4.293h-12.986v2h12.896l-4.1855 3.9766 1.377 1.4492 6.7441-6.4062-6.7246-6.7266z'
211
- }.freeze
212
- end
213
- end
214
- end