ccs-frontend_helpers 0.1.0.rc.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.rspec +2 -0
- data/.rubocop.yml +127 -0
- data/CHANGELOG.md +44 -0
- data/Gemfile +10 -0
- data/Gemfile.lock +241 -0
- data/LICENSE.txt +21 -0
- data/README.md +102 -0
- data/Rakefile +10 -0
- data/ccs-frontend_helpers.gemspec +47 -0
- data/lib/ccs/frontend_helpers/ccs_frontend/dashboard_panels.rb +79 -0
- data/lib/ccs/frontend_helpers/ccs_frontend/footer.rb +141 -0
- data/lib/ccs/frontend_helpers/ccs_frontend/header.rb +205 -0
- data/lib/ccs/frontend_helpers/ccs_frontend/logo.rb +49 -0
- data/lib/ccs/frontend_helpers/ccs_frontend.rb +20 -0
- data/lib/ccs/frontend_helpers/govuk_frontend/accordion.rb +115 -0
- data/lib/ccs/frontend_helpers/govuk_frontend/back_link.rb +39 -0
- data/lib/ccs/frontend_helpers/govuk_frontend/breadcrumbs.rb +76 -0
- data/lib/ccs/frontend_helpers/govuk_frontend/button.rb +127 -0
- data/lib/ccs/frontend_helpers/govuk_frontend/cookie_banner.rb +136 -0
- data/lib/ccs/frontend_helpers/govuk_frontend/details.rb +46 -0
- data/lib/ccs/frontend_helpers/govuk_frontend/error_message.rb +67 -0
- data/lib/ccs/frontend_helpers/govuk_frontend/error_summary.rb +100 -0
- data/lib/ccs/frontend_helpers/govuk_frontend/field/character_count.rb +165 -0
- data/lib/ccs/frontend_helpers/govuk_frontend/field/checkboxes.rb +200 -0
- data/lib/ccs/frontend_helpers/govuk_frontend/field/date_input.rb +153 -0
- data/lib/ccs/frontend_helpers/govuk_frontend/field/file_upload.rb +83 -0
- data/lib/ccs/frontend_helpers/govuk_frontend/field/input.rb +153 -0
- data/lib/ccs/frontend_helpers/govuk_frontend/field/radios.rb +201 -0
- data/lib/ccs/frontend_helpers/govuk_frontend/field/select.rb +124 -0
- data/lib/ccs/frontend_helpers/govuk_frontend/field/textarea.rb +106 -0
- data/lib/ccs/frontend_helpers/govuk_frontend/field.rb +213 -0
- data/lib/ccs/frontend_helpers/govuk_frontend/fieldset.rb +71 -0
- data/lib/ccs/frontend_helpers/govuk_frontend/footer.rb +183 -0
- data/lib/ccs/frontend_helpers/govuk_frontend/form_group.rb +50 -0
- data/lib/ccs/frontend_helpers/govuk_frontend/header.rb +161 -0
- data/lib/ccs/frontend_helpers/govuk_frontend/hint.rb +38 -0
- data/lib/ccs/frontend_helpers/govuk_frontend/inset_text.rb +44 -0
- data/lib/ccs/frontend_helpers/govuk_frontend/label.rb +92 -0
- data/lib/ccs/frontend_helpers/govuk_frontend/notification_banner.rb +136 -0
- data/lib/ccs/frontend_helpers/govuk_frontend/pagination.rb +336 -0
- data/lib/ccs/frontend_helpers/govuk_frontend/panel.rb +51 -0
- data/lib/ccs/frontend_helpers/govuk_frontend/phase_banner.rb +49 -0
- data/lib/ccs/frontend_helpers/govuk_frontend/skip_link.rb +40 -0
- data/lib/ccs/frontend_helpers/govuk_frontend/step_by_step_navigation.rb +215 -0
- data/lib/ccs/frontend_helpers/govuk_frontend/summary_list.rb +226 -0
- data/lib/ccs/frontend_helpers/govuk_frontend/table.rb +124 -0
- data/lib/ccs/frontend_helpers/govuk_frontend/tabs.rb +95 -0
- data/lib/ccs/frontend_helpers/govuk_frontend/tag.rb +42 -0
- data/lib/ccs/frontend_helpers/govuk_frontend/warning_text.rb +53 -0
- data/lib/ccs/frontend_helpers/govuk_frontend.rb +82 -0
- data/lib/ccs/frontend_helpers/shared_methods.rb +27 -0
- data/lib/ccs/frontend_helpers/version.rb +7 -0
- data/lib/ccs/frontend_helpers.rb +20 -0
- data/sig/ccs/frontend_helpers.rbs +6 -0
- metadata +241 -0
@@ -0,0 +1,213 @@
|
|
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 CCS
|
9
|
+
module FrontendHelpers
|
10
|
+
module GovUKFrontend
|
11
|
+
# = GOV.UK Field
|
12
|
+
#
|
13
|
+
# This module contains methods to wrap the:
|
14
|
+
# - fieldset
|
15
|
+
# - form group
|
16
|
+
# - label
|
17
|
+
# - hint
|
18
|
+
# - error message
|
19
|
+
# around some kind of input.
|
20
|
+
#
|
21
|
+
# The wrapper functions in this module are used
|
22
|
+
# to create the fields using the structure of a GDS input field component.
|
23
|
+
|
24
|
+
module Field
|
25
|
+
include Fieldset
|
26
|
+
include FormGroup
|
27
|
+
include Hint
|
28
|
+
include Label
|
29
|
+
|
30
|
+
# Generates the HTML to wrap arround a GDS input field component.
|
31
|
+
#
|
32
|
+
# @param field [Symbol] the type of the field
|
33
|
+
# @param attribute [String, Symbol] the attribute of the field
|
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 [String] :error_message (nil) the error message to be displayed
|
37
|
+
# @option govuk_field_options [ActiveModel] :model (nil) optional model that can be used to find an error message
|
38
|
+
# @option govuk_field_options [ActionView::Helpers::FormBuilder] :form (nil) optional form builder used to create
|
39
|
+
# the field and find the error message
|
40
|
+
# @option govuk_field_options [Hash] :form_group ({}) the options for govuk_form_group {govuk_form_group}
|
41
|
+
# @option govuk_field_options [Hash] :label the parameters that will be used to create the label for the field, see {govuk_label}
|
42
|
+
# @option govuk_field_options [Hash] :hint (nil) the parameters that will be used to create the hint for the field, see {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 the specific 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
|
+
# @yieldparam error_message [String] flag to indicate if there are any erros
|
51
|
+
#
|
52
|
+
# @return [ActiveSupport::SafeBuffer] the HTML that wraps arround the field
|
53
|
+
|
54
|
+
def govuk_field(field, attribute, **govuk_field_options)
|
55
|
+
set_label_for_if_custom_id(field, govuk_field_options)
|
56
|
+
set_hint_id(attribute, govuk_field_options)
|
57
|
+
error_message = find_field_error_message(attribute, govuk_field_options)
|
58
|
+
|
59
|
+
govuk_form_group(attribute, error_message: error_message, **(govuk_field_options[:form_group] || {})) do |display_error_message|
|
60
|
+
set_field_described_by(field, attribute, error_message, govuk_field_options)
|
61
|
+
|
62
|
+
concat(govuk_label(attribute, govuk_field_options[:label][:text], form: govuk_field_options[:form], **govuk_field_options[:label]))
|
63
|
+
concat(govuk_hint(govuk_field_options[:hint][:text], **govuk_field_options[:hint])) if govuk_field_options[:hint]
|
64
|
+
concat(display_error_message)
|
65
|
+
yield(govuk_field_options[field], error_message)
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
# Generates the HTML to wrap arround a GDS input fields component.
|
70
|
+
# These are inputs that require being wrapped in a fieldset, for example radio buttons.
|
71
|
+
#
|
72
|
+
# @param field [Symbol] the type of the fields
|
73
|
+
# @param attribute [String, Symbol] the attribute of the fields
|
74
|
+
# @param govuk_fields_options [Hash] options that will be used for the parts of the fieldset, form group, hint and fields
|
75
|
+
#
|
76
|
+
# @option govuk_fields_options [String] :error_message (nil) the error message to be displayed
|
77
|
+
# @option govuk_fields_options [ActiveModel] :model (nil) optional model that can be used to find an error message
|
78
|
+
# @option govuk_fields_options [ActionView::Helpers::FormBuilder] :form (nil) optional form builder used to create
|
79
|
+
# the field and find the error message
|
80
|
+
# @option govuk_fields_options [Hash] :form_group ({}) the options for govuk_form_group {govuk_form_group}
|
81
|
+
# @option govuk_fields_options [Hash] :fieldset ({}) the options for govuk_fieldset {govuk_fieldset}
|
82
|
+
# @option govuk_fields_options [Hash] :hint (nil) the parameters that will be used to create the hint for the field, see {govuk_hint}.
|
83
|
+
# If no hint is given then no hint will be rendered
|
84
|
+
# @option govuk_fields_options [Hash] :field_options ({}) the options that will be used when rendering the fields.
|
85
|
+
# For more details look at a module that uses +Field+.
|
86
|
+
#
|
87
|
+
# @yield the fields HTML
|
88
|
+
#
|
89
|
+
# @yieldparam govuk_fields_options [Hash] the HTML options used when rendering the fields
|
90
|
+
# @yieldparam error_message [String] flag to indicate if there are any erros
|
91
|
+
#
|
92
|
+
# @return [ActiveSupport::SafeBuffer] the HTML that wraps arround the fields
|
93
|
+
|
94
|
+
def govuk_fields(field, attribute, **govuk_fields_options)
|
95
|
+
set_hint_id(attribute, govuk_fields_options)
|
96
|
+
error_message = find_field_error_message(attribute, govuk_fields_options)
|
97
|
+
|
98
|
+
govuk_form_group(attribute, error_message: error_message, **(govuk_fields_options[:form_group] || {})) do |display_error_message|
|
99
|
+
set_field_described_by(:fieldset, attribute, error_message, govuk_fields_options)
|
100
|
+
(govuk_fields_options[field] ||= {})[:attributes] ||= {}
|
101
|
+
|
102
|
+
govuk_fieldset(**govuk_fields_options[:fieldset]) do
|
103
|
+
concat(govuk_hint(govuk_fields_options[:hint][:text], **govuk_fields_options[:hint])) if govuk_fields_options[:hint]
|
104
|
+
concat(display_error_message)
|
105
|
+
yield(govuk_fields_options[field], error_message)
|
106
|
+
end
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
110
|
+
private
|
111
|
+
|
112
|
+
# If present, will find the error message for the field
|
113
|
+
#
|
114
|
+
# @param attribute [String, Symbol] the attribute of the fields
|
115
|
+
#
|
116
|
+
# @option govuk_field_options [String] :error_message (nil) the error message to be displayed
|
117
|
+
# @option govuk_field_options [ActiveModel] :model (nil) optional model that can be used to find an error message
|
118
|
+
# @option govuk_field_options [ActionView::Helpers::FormBuilder] :form (nil) optional form builder used to create
|
119
|
+
# the field and find the error message
|
120
|
+
#
|
121
|
+
# @return [String] the error message
|
122
|
+
|
123
|
+
def find_field_error_message(attribute, govuk_field_options)
|
124
|
+
if govuk_field_options[:model]
|
125
|
+
govuk_field_options[:model].errors[attribute].first
|
126
|
+
elsif govuk_field_options[:form]
|
127
|
+
govuk_field_options[:form].object.errors[attribute].first
|
128
|
+
else
|
129
|
+
govuk_field_options[:error_message]
|
130
|
+
end
|
131
|
+
end
|
132
|
+
|
133
|
+
# Sets the label +for+ if a custom ID has been given for the field.
|
134
|
+
#
|
135
|
+
# @param govuk_field_options [Hash] see {govuk_field} for details
|
136
|
+
|
137
|
+
def set_label_for_if_custom_id(field, govuk_field_options)
|
138
|
+
field_id = govuk_field_options.dig(field, :attributes, :id)
|
139
|
+
|
140
|
+
govuk_field_options[:label] ||= {}
|
141
|
+
(govuk_field_options[:label][:attributes] ||= {})[:for] = field_id if field_id
|
142
|
+
end
|
143
|
+
|
144
|
+
# Sets the hint ID if there is a hint, and the ID for the hint has not been sent
|
145
|
+
#
|
146
|
+
# @param attribute [String, Symbol] the attribute of the field
|
147
|
+
# @param govuk_field_options [Hash] see {govuk_field} for details
|
148
|
+
|
149
|
+
def set_hint_id(attribute, govuk_field_options)
|
150
|
+
return if !govuk_field_options[:hint] || govuk_field_options.dig(:hint, :attributes, :id)
|
151
|
+
|
152
|
+
govuk_field_options[:hint] ||= {}
|
153
|
+
(govuk_field_options[:hint][:attributes] ||= {})[:id] = "#{attribute}-hint"
|
154
|
+
end
|
155
|
+
|
156
|
+
# Adds the aira-describedby attribute for the field
|
157
|
+
# if there is a hint or an error message
|
158
|
+
#
|
159
|
+
# @param attribute [String, Symbol] the attribute of the input
|
160
|
+
# @param error_message [String] used to indicate if there is an error
|
161
|
+
# @param govuk_field_options [Hash] see {#govuk_field} for details
|
162
|
+
|
163
|
+
def set_field_described_by(field, attribute, error_message, govuk_field_options)
|
164
|
+
aria_described_by = []
|
165
|
+
aria_described_by << govuk_field_options.dig(field, :attributes, :aria, :describedby)
|
166
|
+
aria_described_by << govuk_field_options[:hint][:attributes][:id] if govuk_field_options[:hint]
|
167
|
+
aria_described_by << "#{attribute}-error" if error_message
|
168
|
+
aria_described_by.compact!
|
169
|
+
|
170
|
+
govuk_field_options[field] ||= {}
|
171
|
+
govuk_field_options[field][:attributes] ||= {}
|
172
|
+
|
173
|
+
return unless aria_described_by.any?
|
174
|
+
|
175
|
+
(govuk_field_options[field][:attributes][:aria] ||= {})[:describedby] = aria_described_by.join(' ')
|
176
|
+
end
|
177
|
+
|
178
|
+
# Sets the hint attributes and adds the aira-describedby attribute for a fields item
|
179
|
+
#
|
180
|
+
# @param type [String] the type of the item
|
181
|
+
# @param attribute [String, Symbol] the attribute of the item
|
182
|
+
# @param item [Hash] the options for that item
|
183
|
+
|
184
|
+
def set_item_options_for_hint(type, attribute, item)
|
185
|
+
return unless item[:hint]
|
186
|
+
|
187
|
+
(item[:hint] ||= {})[:attributes] ||= {}
|
188
|
+
item[:hint][:classes] = "govuk-#{type}__hint #{item[:hint][:classes]}".rstrip
|
189
|
+
item[:hint][:attributes][:id] ||= "#{attribute}_#{item[:value]}-item-hint"
|
190
|
+
|
191
|
+
(item[:attributes][:aria] ||= {})[:describedby] = item[:hint][:attributes][:id]
|
192
|
+
end
|
193
|
+
|
194
|
+
# Sets the conditional attributes and adds the data-aira-controls attribute for a fields item
|
195
|
+
#
|
196
|
+
# @param type [String] the type of the item
|
197
|
+
# @param attribute [String, Symbol] the attribute of the item
|
198
|
+
# @param item [Hash] the options for that item
|
199
|
+
|
200
|
+
def set_conditional_item_options(type, attribute, item)
|
201
|
+
return unless item[:conditional]
|
202
|
+
|
203
|
+
item[:conditional][:attributes] ||= {}
|
204
|
+
item[:conditional][:attributes][:class] = "govuk-#{type}__conditional #{"govuk-#{type}__conditional--hidden" unless item[:checked]}".rstrip
|
205
|
+
item[:conditional][:attributes][:id] ||= sanitize_to_id("#{attribute}_#{item[:value]}_conditional")
|
206
|
+
(item[:attributes][:data] ||= {})[:'aria-controls'] = item[:conditional][:attributes][:id]
|
207
|
+
end
|
208
|
+
end
|
209
|
+
end
|
210
|
+
end
|
211
|
+
|
212
|
+
ActionView::Base.field_error_proc = proc { |html_tag, _instance| html_tag }
|
213
|
+
end
|
@@ -0,0 +1,71 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'action_view'
|
4
|
+
|
5
|
+
require_relative '../shared_methods'
|
6
|
+
|
7
|
+
module CCS
|
8
|
+
module FrontendHelpers
|
9
|
+
module GovUKFrontend
|
10
|
+
# = GOV.UK Fieldset
|
11
|
+
#
|
12
|
+
# This helper is used for generating the fieldset component from the
|
13
|
+
# {https://design-system.service.gov.uk/components/fieldset GDS - Components - Fieldset}
|
14
|
+
|
15
|
+
module Fieldset
|
16
|
+
include SharedMethods
|
17
|
+
include ActionView::Context
|
18
|
+
include ActionView::Helpers::TagHelper
|
19
|
+
include ActionView::Helpers::TextHelper
|
20
|
+
|
21
|
+
# Generates the HTML for the GOV.UK Fieldset component
|
22
|
+
#
|
23
|
+
# @param govuk_fieldset_options [Hash] options that will be used in customising the HTML
|
24
|
+
#
|
25
|
+
# @option govuk_fieldset_options [String] :classes additional CSS classes for the fieldset HTML
|
26
|
+
# @option govuk_fieldset_options [Hash] :legend options for the legend which are used in {#govuk_legend}
|
27
|
+
# @option govuk_fieldset_options [Hash] :attributes ({}) any additional attributes that will added as part of the HTML
|
28
|
+
#
|
29
|
+
# @yield HTML that will be contained within the 'govuk-fieldset' div and under the legend
|
30
|
+
#
|
31
|
+
# @return [ActiveSupport::SafeBuffer] the HTML for the GOV.UK Fieldset
|
32
|
+
# which can then be rendered on the page
|
33
|
+
|
34
|
+
def govuk_fieldset(**govuk_fieldset_options)
|
35
|
+
initialise_attributes_and_set_classes(govuk_fieldset_options, 'govuk-fieldset')
|
36
|
+
|
37
|
+
tag.fieldset(**govuk_fieldset_options[:attributes]) do
|
38
|
+
concat(govuk_legend(govuk_fieldset_options[:legend])) if govuk_fieldset_options[:legend]
|
39
|
+
yield
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
private
|
44
|
+
|
45
|
+
# Generates the HTML for the Legend as part of {#govuk_fieldset}
|
46
|
+
#
|
47
|
+
# @param govuk_legend_options [Hash] options that will be used in the legend
|
48
|
+
#
|
49
|
+
# @option govuk_legend_options [String] :classes additional CSS classes for the legend HTML
|
50
|
+
# @option govuk_legend_options [String] :text the text for the legend
|
51
|
+
# @option govuk_legend_options [boolean] :is_page_heading (false) if the legend is also the heading it will rendered in a h1
|
52
|
+
# @option govuk_legend_options [Hash] :caption an optional hash with the +text+ and +classes+ that will be used
|
53
|
+
# to render a caption before the h1 if the legend is a page heading
|
54
|
+
#
|
55
|
+
# @return [ActiveSupport::SafeBuffer] the HTML for the GOV.UK Fieldset
|
56
|
+
# which can then be rendered on the page
|
57
|
+
|
58
|
+
def govuk_legend(govuk_legend_options)
|
59
|
+
tag.legend(class: "govuk-fieldset__legend #{govuk_legend_options[:classes]}".rstrip) do
|
60
|
+
if govuk_legend_options[:is_page_heading]
|
61
|
+
concat(tag.span(govuk_legend_options[:caption][:text], class: govuk_legend_options[:caption][:classes])) if govuk_legend_options[:caption]
|
62
|
+
concat(tag.h1(govuk_legend_options[:text], class: 'govuk-fieldset__heading'))
|
63
|
+
else
|
64
|
+
govuk_legend_options[:text]
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
@@ -0,0 +1,183 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'action_view'
|
4
|
+
|
5
|
+
require_relative '../shared_methods'
|
6
|
+
|
7
|
+
module CCS
|
8
|
+
module FrontendHelpers
|
9
|
+
module GovUKFrontend
|
10
|
+
# = GOV.UK Footer
|
11
|
+
#
|
12
|
+
# This helper is used for generating the footer component from the
|
13
|
+
# {https://design-system.service.gov.uk/components/footer GDS - Components - Footer}
|
14
|
+
|
15
|
+
module Footer
|
16
|
+
include SharedMethods
|
17
|
+
include ActionView::Context
|
18
|
+
include ActionView::Helpers::FormTagHelper
|
19
|
+
include ActionView::Helpers::TagHelper
|
20
|
+
include ActionView::Helpers::TextHelper
|
21
|
+
include ActionView::Helpers::UrlHelper
|
22
|
+
|
23
|
+
# rubocop:disable Metrics/AbcSize
|
24
|
+
|
25
|
+
# Generates the HTML for the GOV.UK Footer component
|
26
|
+
#
|
27
|
+
# @param govuk_footer_options [Hash] options that will be used in customising the HTML
|
28
|
+
#
|
29
|
+
# @option govuk_footer_options [String] :classes additional CSS classes for the footer HTML
|
30
|
+
# @option govuk_footer_options [String] :container_class classes that can be added to the inner container
|
31
|
+
# @option govuk_footer_options [Array] :navigation (see: {govuk_footer_navigation})
|
32
|
+
# @option govuk_footer_options [Hash] :meta (see: {govuk_footer_meta})
|
33
|
+
# @option govuk_footer_options [ActiveSupport::SafeBuffer,String] :content_licence The content licence information. See {govuk_footer_content_licence}
|
34
|
+
# @option govuk_footer_options [ActiveSupport::SafeBuffer,String] :copyright The copyright information. See {govuk_footer_copyright}
|
35
|
+
# @option govuk_footer_options [Hash] :attributes additional attributes that will added as part of the HTML
|
36
|
+
#
|
37
|
+
# @return [ActiveSupport::SafeBuffer] the HTML for the GOV.UK Footer
|
38
|
+
# which can then be rendered on the page
|
39
|
+
|
40
|
+
def govuk_footer(**govuk_footer_options)
|
41
|
+
initialise_attributes_and_set_classes(govuk_footer_options, 'govuk-footer')
|
42
|
+
|
43
|
+
govuk_footer_options[:attributes][:role] = 'contentinfo'
|
44
|
+
|
45
|
+
tag.footer(**govuk_footer_options[:attributes]) do
|
46
|
+
tag.div(class: "govuk-width-container #{govuk_footer_options[:container_classes]}".rstrip) do
|
47
|
+
if govuk_footer_options[:navigation]
|
48
|
+
concat(tag.div(class: 'govuk-footer__navigation') do
|
49
|
+
govuk_footer_options[:navigation].each { |navigation_item| concat(govuk_footer_navigation(navigation_item)) }
|
50
|
+
end)
|
51
|
+
concat(tag.hr(class: 'govuk-footer__section-break'))
|
52
|
+
end
|
53
|
+
concat(tag.div(class: 'govuk-footer__meta') do
|
54
|
+
concat(tag.div(class: 'govuk-footer__meta-item govuk-footer__meta-item--grow') do
|
55
|
+
concat(govuk_footer_meta(govuk_footer_options[:meta])) if govuk_footer_options[:meta]
|
56
|
+
concat(govuk_footer_logo)
|
57
|
+
concat(govuk_footer_content_licence(govuk_footer_options[:content_licence]))
|
58
|
+
end)
|
59
|
+
concat(govuk_footer_copyright(govuk_footer_options[:copyright]))
|
60
|
+
end)
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
private
|
66
|
+
|
67
|
+
# Generates the HTML for the navigation section in {govuk_footer}
|
68
|
+
#
|
69
|
+
# @param navigation_item [Hash] options that will be used for the navigation section
|
70
|
+
#
|
71
|
+
# @option navigation_item [String] :title title for a section
|
72
|
+
# @option navigation_item [String] :width (default: 'fall') width of each navigation section in the footer
|
73
|
+
# @option navigation_item [Integer] :columns amount of columns to display items in navigation section of the footer
|
74
|
+
# @option navigation_item [Array] :items array of items to display in the list in navigation section of the footer.
|
75
|
+
# Each item can have the following options:
|
76
|
+
# - +:text+ list item text
|
77
|
+
# - +:href+ list item href
|
78
|
+
# - +:attributes+ HTML attributes to add to the link
|
79
|
+
#
|
80
|
+
# @return [ActiveSupport::SafeBuffer] the HTML for the navigation section in {govuk_footer}
|
81
|
+
|
82
|
+
def govuk_footer_navigation(navigation_item)
|
83
|
+
tag.div(class: "govuk-footer__section govuk-grid-column-#{navigation_item[:width] || 'full'}") do
|
84
|
+
concat(tag.h2(navigation_item[:title], class: 'govuk-footer__heading govuk-heading-m'))
|
85
|
+
concat(tag.ul(class: "govuk-footer__list #{"govuk-footer__list--columns-#{navigation_item[:columns]}" if navigation_item[:columns]}".rstrip) do
|
86
|
+
navigation_item[:items].each do |item|
|
87
|
+
concat(tag.li(class: 'govuk-footer__list-item') do
|
88
|
+
(item[:attributes] ||= {})[:class] = 'govuk-footer__link'
|
89
|
+
|
90
|
+
link_to(item[:text], item[:href], **item[:attributes])
|
91
|
+
end)
|
92
|
+
end
|
93
|
+
end)
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
# Generates the HTML for the meta section in {govuk_footer}
|
98
|
+
#
|
99
|
+
# @param meta [Hash] options that will be used for the meta section
|
100
|
+
#
|
101
|
+
# @option meta [String] :visually_hidden_title (default: 'Support links') title for a meta item section
|
102
|
+
# @option meta [ActiveSupport::SafeBuffer,String] :text text to add to the meta section of the footer,
|
103
|
+
# which will appear below any links specified using meta.items
|
104
|
+
# @option meta [Array] :items array of items to display in the list in meta section of the footer.
|
105
|
+
# Each item can have the following options:
|
106
|
+
# - +:text+ list item text
|
107
|
+
# - +:href+ list item href
|
108
|
+
# - +:attributes+ HTML attributes to add to the link
|
109
|
+
#
|
110
|
+
# @return [ActiveSupport::SafeBuffer] the HTML for the meta section in {govuk_footer}
|
111
|
+
|
112
|
+
def govuk_footer_meta(meta)
|
113
|
+
concat(tag.h2(meta[:visually_hidden_title] || 'Support links', class: 'govuk-visually-hidden'))
|
114
|
+
if meta[:items]
|
115
|
+
concat(tag.ul(class: 'govuk-footer__inline-list') do
|
116
|
+
meta[:items].each do |meta_item|
|
117
|
+
concat(tag.li(class: 'govuk-footer__inline-list-item') do
|
118
|
+
(meta_item[:attributes] ||= {})[:class] = 'govuk-footer__link'
|
119
|
+
|
120
|
+
link_to(meta_item[:text], meta_item[:href], **meta_item[:attributes])
|
121
|
+
end)
|
122
|
+
end
|
123
|
+
end)
|
124
|
+
end
|
125
|
+
concat(tag.div(meta[:text], class: 'govuk-footer__meta-custom')) if meta[:text]
|
126
|
+
end
|
127
|
+
|
128
|
+
# rubocop:enable Metrics/AbcSize
|
129
|
+
|
130
|
+
# Generates the logo used in {govuk_footer}
|
131
|
+
#
|
132
|
+
# @return [ActiveSupport::SafeBuffer]
|
133
|
+
|
134
|
+
def govuk_footer_logo
|
135
|
+
tag.svg(
|
136
|
+
class: 'govuk-footer__licence-logo',
|
137
|
+
aria: { hidden: 'true' },
|
138
|
+
focusable: 'false',
|
139
|
+
xmlns: 'http://www.w3.org/2000/svg',
|
140
|
+
viewBox: '0 0 483.2 195.7',
|
141
|
+
height: '17',
|
142
|
+
width: '41'
|
143
|
+
) do
|
144
|
+
tag.path(
|
145
|
+
fill: 'currentColor',
|
146
|
+
d: 'M421.5 142.8V.1l-50.7 32.3v161.1h112.4v-50.7zm-122.3-9.6A47.12 47.12 0 0 1 221 97.8c0-26 21.1-47.1 47.1-47.1 16.7 0 31.4 8.7 39.7 21.8l42.7-27.2A97.63 97.63 0 0 0 268.1 0c-36.5 0-68.3 20.1-85.1 49.7A98 98 0 0 0 97.8 0C43.9 0 0 43.9 0 97.8s43.9 97.8 97.8 97.8c36.5 0 68.3-20.1 85.1-49.7a97.76 97.76 0 0 0 149.6 25.4l19.4 22.2h3v-87.8h-80l24.3 27.5zM97.8 145c-26 0-47.1-21.1-47.1-47.1s21.1-47.1 47.1-47.1 47.2 21 47.2 47S123.8 145 97.8 145'
|
147
|
+
)
|
148
|
+
end
|
149
|
+
end
|
150
|
+
|
151
|
+
# Generates the content licence used in {govuk_footer}
|
152
|
+
#
|
153
|
+
# @param content_licence [ActiveSupport::SafeBuffer,String] the content licence information. Defaults to Open Government Licence (OGL) v3 licence
|
154
|
+
#
|
155
|
+
# @return [ActiveSupport::SafeBuffer] the HTML for the content licence used in {govuk_footer}
|
156
|
+
|
157
|
+
def govuk_footer_content_licence(content_licence)
|
158
|
+
tag.span(class: 'govuk-footer__licence-description') do
|
159
|
+
if content_licence
|
160
|
+
concat(content_licence)
|
161
|
+
else
|
162
|
+
concat('All content is available under the')
|
163
|
+
concat(link_to('Open Government Licence v3.0', 'https://www.nationalarchives.gov.uk/doc/open-government-licence/version/3/', class: 'govuk-footer__link', rel: 'license'))
|
164
|
+
concat(', except where otherwise stated')
|
165
|
+
end
|
166
|
+
end
|
167
|
+
end
|
168
|
+
|
169
|
+
# Generates the copyright used in {govuk_footer}
|
170
|
+
#
|
171
|
+
# @param copyright [ActiveSupport::SafeBuffer,String] the copyright information, this defaults to Crown Copyright
|
172
|
+
#
|
173
|
+
# @return [ActiveSupport::SafeBuffer] the HTML for the copyright used in {govuk_footer}
|
174
|
+
|
175
|
+
def govuk_footer_copyright(copyright)
|
176
|
+
tag.div(class: 'govuk-footer__meta-item') do
|
177
|
+
link_to(copyright || '© Crown copyright', 'https://www.nationalarchives.gov.uk/information-management/re-using-public-sector-information/uk-government-licensing-framework/crown-copyright/', class: 'govuk-footer__link govuk-footer__copyright-logo')
|
178
|
+
end
|
179
|
+
end
|
180
|
+
end
|
181
|
+
end
|
182
|
+
end
|
183
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative 'error_message'
|
4
|
+
|
5
|
+
module CCS
|
6
|
+
module FrontendHelpers
|
7
|
+
module GovUKFrontend
|
8
|
+
# = GOV.UK FormGroup
|
9
|
+
#
|
10
|
+
# This helper is used for generating the form group component from the Government Design Systems
|
11
|
+
|
12
|
+
module FormGroup
|
13
|
+
include ErrorMessage
|
14
|
+
|
15
|
+
# Generates the HTML for the GOV.UK Form Group component
|
16
|
+
#
|
17
|
+
# @param attribute [String, Symbol] the attribute that the form group is for
|
18
|
+
# @param govuk_form_group_options [Hash] options that will be used in customising the HTML
|
19
|
+
#
|
20
|
+
# @option govuk_form_group_options [String] :classes additional CSS classes for the form group HTML
|
21
|
+
# @option govuk_form_group_options [String] :error_message (nil) the error message to be displayed
|
22
|
+
# @option govuk_form_group_options [ActiveModel] :model (nil) model that will be used to find an error message
|
23
|
+
# @option govuk_form_group_options [Hash] :attributes ({}) any additional attributes that will added as part of the HTML
|
24
|
+
#
|
25
|
+
# @yield HTML that will be contained within the 'govuk-form-group' div
|
26
|
+
#
|
27
|
+
# @yieldparam displayed_error_message [ActiveSupport::SafeBuffer] the HTML for the error message (if there is one)
|
28
|
+
#
|
29
|
+
# @return [ActiveSupport::SafeBuffer] the HTML for the GOV.UK Form Group
|
30
|
+
# which can then be rendered on the page
|
31
|
+
|
32
|
+
def govuk_form_group(attribute, **govuk_form_group_options)
|
33
|
+
error_message = if govuk_form_group_options[:model]
|
34
|
+
model.errors[attribute].first
|
35
|
+
else
|
36
|
+
govuk_form_group_options[:error_message]
|
37
|
+
end
|
38
|
+
|
39
|
+
initialise_attributes_and_set_classes(govuk_form_group_options, "govuk-form-group #{'govuk-form-group--error' if error_message}".rstrip)
|
40
|
+
|
41
|
+
govuk_form_group_options[:attributes][:id] ||= "#{attribute}-form-group"
|
42
|
+
|
43
|
+
tag.div(**govuk_form_group_options[:attributes]) do
|
44
|
+
yield((govuk_error_message(error_message, attribute) if error_message))
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|