ccs-frontend_helpers 0.2.0 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 294fb84084e25efd871cf66bf4513023648669964b1fbc026aece725bcd64c78
4
- data.tar.gz: cd55ae750739c51a9561871d5d2c782a067ace1b04f7014e3b41d05349db6f68
3
+ metadata.gz: fca2cbae35b1e0e0845af49145d1c9141bdcf235dea294ab305acbbeb301f781
4
+ data.tar.gz: 3e874c9bc894b40c56efefd54397f134b697ad717ce5b4ab9a3247fe36160d67
5
5
  SHA512:
6
- metadata.gz: d64eb288f9595343e58ec37eec080a925928b908273c1880efd409a3cde6f9015567221838496084c03d3799dd54ea7ae10328e4c545d446d0f876b0892efb9c
7
- data.tar.gz: d1c288ab82c3c78b1049a1bf8d580b515d213d52758aedf378799262efa854880eab99e69251e0cf74502bb29af8da7fa965adf6275f8755672896dc49787a43
6
+ metadata.gz: 6109e7f5c6a7bb6d210c47b07ce9e88f83ccb81a6c76fba097bf9ce467423aca549230686f78ec6fcabfe8e48443f9cfe9c41f8cb947181631ce33895ee7ccf6
7
+ data.tar.gz: c6cd26aedc098f409ecb4a625daef8236f3eabe9a071dfb611d6352f9c5e6595034de5b3a9d5b260c724cec5b1be41bd1e974153e43d6b1e9a8e6b47cfeae662
data/CHANGELOG.md CHANGED
@@ -1,3 +1,17 @@
1
+ ## [0.4.0] - 2024-05-20
2
+
3
+ Update components to be compatible with GOV.UK Frontend v5.4
4
+
5
+ ## [0.3.0] - 2024-04-12
6
+
7
+ Update components to be compatible with GOV.UK Frontend v5.3
8
+
9
+ ### 🆕 New features
10
+
11
+ The following GOV.UK helpers have been added:
12
+
13
+ - Password input
14
+
1
15
  ## [0.2.0] - 2024-03-13
2
16
 
3
17
  ### 💥 Breaking changes
data/Gemfile CHANGED
@@ -7,7 +7,7 @@ gemspec
7
7
 
8
8
  # Gems for building the package
9
9
  gem 'bundler', '~> 2.3'
10
- gem 'rake', '~> 13.1'
10
+ gem 'rake', '~> 13.2'
11
11
 
12
12
  # Gems for testing the package
13
13
  gem 'capybara', '~> 3.40.0'
@@ -16,10 +16,10 @@ gem 'simplecov', '~> 0.21'
16
16
  gem 'nokogiri-diff', '~> 0.3.0'
17
17
 
18
18
  # Gems for linting/formatting the package
19
- gem 'rubocop', '~> 1.62'
20
- gem 'rubocop-rails', '~> 2.24'
19
+ gem 'rubocop', '~> 1.63'
20
+ gem 'rubocop-rails', '~> 2.25'
21
21
  gem 'rubocop-rake', '~> 0.6'
22
- gem 'rubocop-rspec', '~> 2.27'
22
+ gem 'rubocop-rspec', '~> 2.29'
23
23
 
24
24
  # Gems for documenting the package
25
25
  gem 'yard', '~> 0.9'
data/Gemfile.lock CHANGED
@@ -1,41 +1,41 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- ccs-frontend_helpers (0.2.0)
4
+ ccs-frontend_helpers (0.4.0)
5
5
  rails (>= 6.0)
6
6
 
7
7
  GEM
8
8
  remote: https://rubygems.org/
9
9
  specs:
10
- actioncable (7.1.3.2)
11
- actionpack (= 7.1.3.2)
12
- activesupport (= 7.1.3.2)
10
+ actioncable (7.1.3.3)
11
+ actionpack (= 7.1.3.3)
12
+ activesupport (= 7.1.3.3)
13
13
  nio4r (~> 2.0)
14
14
  websocket-driver (>= 0.6.1)
15
15
  zeitwerk (~> 2.6)
16
- actionmailbox (7.1.3.2)
17
- actionpack (= 7.1.3.2)
18
- activejob (= 7.1.3.2)
19
- activerecord (= 7.1.3.2)
20
- activestorage (= 7.1.3.2)
21
- activesupport (= 7.1.3.2)
16
+ actionmailbox (7.1.3.3)
17
+ actionpack (= 7.1.3.3)
18
+ activejob (= 7.1.3.3)
19
+ activerecord (= 7.1.3.3)
20
+ activestorage (= 7.1.3.3)
21
+ activesupport (= 7.1.3.3)
22
22
  mail (>= 2.7.1)
23
23
  net-imap
24
24
  net-pop
25
25
  net-smtp
26
- actionmailer (7.1.3.2)
27
- actionpack (= 7.1.3.2)
28
- actionview (= 7.1.3.2)
29
- activejob (= 7.1.3.2)
30
- activesupport (= 7.1.3.2)
26
+ actionmailer (7.1.3.3)
27
+ actionpack (= 7.1.3.3)
28
+ actionview (= 7.1.3.3)
29
+ activejob (= 7.1.3.3)
30
+ activesupport (= 7.1.3.3)
31
31
  mail (~> 2.5, >= 2.5.4)
32
32
  net-imap
33
33
  net-pop
34
34
  net-smtp
35
35
  rails-dom-testing (~> 2.2)
36
- actionpack (7.1.3.2)
37
- actionview (= 7.1.3.2)
38
- activesupport (= 7.1.3.2)
36
+ actionpack (7.1.3.3)
37
+ actionview (= 7.1.3.3)
38
+ activesupport (= 7.1.3.3)
39
39
  nokogiri (>= 1.8.5)
40
40
  racc
41
41
  rack (>= 2.2.4)
@@ -43,35 +43,35 @@ GEM
43
43
  rack-test (>= 0.6.3)
44
44
  rails-dom-testing (~> 2.2)
45
45
  rails-html-sanitizer (~> 1.6)
46
- actiontext (7.1.3.2)
47
- actionpack (= 7.1.3.2)
48
- activerecord (= 7.1.3.2)
49
- activestorage (= 7.1.3.2)
50
- activesupport (= 7.1.3.2)
46
+ actiontext (7.1.3.3)
47
+ actionpack (= 7.1.3.3)
48
+ activerecord (= 7.1.3.3)
49
+ activestorage (= 7.1.3.3)
50
+ activesupport (= 7.1.3.3)
51
51
  globalid (>= 0.6.0)
52
52
  nokogiri (>= 1.8.5)
53
- actionview (7.1.3.2)
54
- activesupport (= 7.1.3.2)
53
+ actionview (7.1.3.3)
54
+ activesupport (= 7.1.3.3)
55
55
  builder (~> 3.1)
56
56
  erubi (~> 1.11)
57
57
  rails-dom-testing (~> 2.2)
58
58
  rails-html-sanitizer (~> 1.6)
59
- activejob (7.1.3.2)
60
- activesupport (= 7.1.3.2)
59
+ activejob (7.1.3.3)
60
+ activesupport (= 7.1.3.3)
61
61
  globalid (>= 0.3.6)
62
- activemodel (7.1.3.2)
63
- activesupport (= 7.1.3.2)
64
- activerecord (7.1.3.2)
65
- activemodel (= 7.1.3.2)
66
- activesupport (= 7.1.3.2)
62
+ activemodel (7.1.3.3)
63
+ activesupport (= 7.1.3.3)
64
+ activerecord (7.1.3.3)
65
+ activemodel (= 7.1.3.3)
66
+ activesupport (= 7.1.3.3)
67
67
  timeout (>= 0.4.0)
68
- activestorage (7.1.3.2)
69
- actionpack (= 7.1.3.2)
70
- activejob (= 7.1.3.2)
71
- activerecord (= 7.1.3.2)
72
- activesupport (= 7.1.3.2)
68
+ activestorage (7.1.3.3)
69
+ actionpack (= 7.1.3.3)
70
+ activejob (= 7.1.3.3)
71
+ activerecord (= 7.1.3.3)
72
+ activesupport (= 7.1.3.3)
73
73
  marcel (~> 1.0)
74
- activesupport (7.1.3.2)
74
+ activesupport (7.1.3.3)
75
75
  base64
76
76
  bigdecimal
77
77
  concurrent-ruby (~> 1.0, >= 1.0.2)
@@ -85,7 +85,7 @@ GEM
85
85
  public_suffix (>= 2.0.2, < 6.0)
86
86
  ast (2.4.2)
87
87
  base64 (0.2.0)
88
- bigdecimal (3.1.6)
88
+ bigdecimal (3.1.8)
89
89
  builder (3.2.4)
90
90
  capybara (3.40.0)
91
91
  addressable
@@ -106,13 +106,13 @@ GEM
106
106
  erubi (1.12.0)
107
107
  globalid (1.2.1)
108
108
  activesupport (>= 6.1)
109
- i18n (1.14.4)
109
+ i18n (1.14.5)
110
110
  concurrent-ruby (~> 1.0)
111
111
  io-console (0.7.2)
112
- irb (1.11.2)
113
- rdoc
112
+ irb (1.13.1)
113
+ rdoc (>= 4.0.0)
114
114
  reline (>= 0.4.2)
115
- json (2.7.1)
115
+ json (2.7.2)
116
116
  language_server-protocol (3.17.0.3)
117
117
  loofah (2.22.0)
118
118
  crass (~> 1.0.2)
@@ -122,37 +122,37 @@ GEM
122
122
  net-imap
123
123
  net-pop
124
124
  net-smtp
125
- marcel (1.0.2)
125
+ marcel (1.0.4)
126
126
  matrix (0.4.2)
127
127
  mini_mime (1.1.5)
128
- minitest (5.22.2)
128
+ minitest (5.23.0)
129
129
  mutex_m (0.2.0)
130
- net-imap (0.4.10)
130
+ net-imap (0.4.11)
131
131
  date
132
132
  net-protocol
133
133
  net-pop (0.1.2)
134
134
  net-protocol
135
135
  net-protocol (0.2.2)
136
136
  timeout
137
- net-smtp (0.4.0.1)
137
+ net-smtp (0.5.0)
138
138
  net-protocol
139
- nio4r (2.7.0)
140
- nokogiri (1.16.2-x86_64-darwin)
139
+ nio4r (2.7.3)
140
+ nokogiri (1.16.5-x86_64-darwin)
141
141
  racc (~> 1.4)
142
- nokogiri (1.16.2-x86_64-linux)
142
+ nokogiri (1.16.5-x86_64-linux)
143
143
  racc (~> 1.4)
144
144
  nokogiri-diff (0.3.0)
145
145
  nokogiri (~> 1.5)
146
146
  tdiff (~> 0.4)
147
147
  parallel (1.24.0)
148
- parser (3.3.0.5)
148
+ parser (3.3.1.0)
149
149
  ast (~> 2.4.1)
150
150
  racc
151
151
  psych (5.1.2)
152
152
  stringio
153
153
  public_suffix (5.0.4)
154
- racc (1.7.3)
155
- rack (3.0.9.1)
154
+ racc (1.8.0)
155
+ rack (3.0.11)
156
156
  rack-session (2.0.0)
157
157
  rack (>= 3.0.0)
158
158
  rack-test (2.1.0)
@@ -160,20 +160,20 @@ GEM
160
160
  rackup (2.1.0)
161
161
  rack (>= 3)
162
162
  webrick (~> 1.8)
163
- rails (7.1.3.2)
164
- actioncable (= 7.1.3.2)
165
- actionmailbox (= 7.1.3.2)
166
- actionmailer (= 7.1.3.2)
167
- actionpack (= 7.1.3.2)
168
- actiontext (= 7.1.3.2)
169
- actionview (= 7.1.3.2)
170
- activejob (= 7.1.3.2)
171
- activemodel (= 7.1.3.2)
172
- activerecord (= 7.1.3.2)
173
- activestorage (= 7.1.3.2)
174
- activesupport (= 7.1.3.2)
163
+ rails (7.1.3.3)
164
+ actioncable (= 7.1.3.3)
165
+ actionmailbox (= 7.1.3.3)
166
+ actionmailer (= 7.1.3.3)
167
+ actionpack (= 7.1.3.3)
168
+ actiontext (= 7.1.3.3)
169
+ actionview (= 7.1.3.3)
170
+ activejob (= 7.1.3.3)
171
+ activemodel (= 7.1.3.3)
172
+ activerecord (= 7.1.3.3)
173
+ activestorage (= 7.1.3.3)
174
+ activesupport (= 7.1.3.3)
175
175
  bundler (>= 1.15.0)
176
- railties (= 7.1.3.2)
176
+ railties (= 7.1.3.3)
177
177
  rails-dom-testing (2.2.0)
178
178
  activesupport (>= 5.0.0)
179
179
  minitest
@@ -181,22 +181,23 @@ GEM
181
181
  rails-html-sanitizer (1.6.0)
182
182
  loofah (~> 2.21)
183
183
  nokogiri (~> 1.14)
184
- railties (7.1.3.2)
185
- actionpack (= 7.1.3.2)
186
- activesupport (= 7.1.3.2)
184
+ railties (7.1.3.3)
185
+ actionpack (= 7.1.3.3)
186
+ activesupport (= 7.1.3.3)
187
187
  irb
188
188
  rackup (>= 1.0.0)
189
189
  rake (>= 12.2)
190
190
  thor (~> 1.0, >= 1.2.2)
191
191
  zeitwerk (~> 2.6)
192
192
  rainbow (3.1.1)
193
- rake (13.1.0)
194
- rdoc (6.6.2)
193
+ rake (13.2.1)
194
+ rdoc (6.6.3.1)
195
195
  psych (>= 4.0.0)
196
- regexp_parser (2.9.0)
197
- reline (0.4.2)
196
+ regexp_parser (2.9.2)
197
+ reline (0.5.7)
198
198
  io-console (~> 0.5)
199
- rexml (3.2.6)
199
+ rexml (3.2.8)
200
+ strscan (>= 3.0.9)
200
201
  rspec (3.13.0)
201
202
  rspec-core (~> 3.13.0)
202
203
  rspec-expectations (~> 3.13.0)
@@ -210,7 +211,7 @@ GEM
210
211
  diff-lcs (>= 1.2.0, < 2.0)
211
212
  rspec-support (~> 3.13.0)
212
213
  rspec-support (3.13.1)
213
- rubocop (1.62.1)
214
+ rubocop (1.63.5)
214
215
  json (~> 2.3)
215
216
  language_server-protocol (>= 3.17.0)
216
217
  parallel (~> 1.10)
@@ -221,23 +222,26 @@ GEM
221
222
  rubocop-ast (>= 1.31.1, < 2.0)
222
223
  ruby-progressbar (~> 1.7)
223
224
  unicode-display_width (>= 2.4.0, < 3.0)
224
- rubocop-ast (1.31.2)
225
- parser (>= 3.3.0.4)
225
+ rubocop-ast (1.31.3)
226
+ parser (>= 3.3.1.0)
226
227
  rubocop-capybara (2.20.0)
227
228
  rubocop (~> 1.41)
228
229
  rubocop-factory_bot (2.25.1)
229
230
  rubocop (~> 1.41)
230
- rubocop-rails (2.24.0)
231
+ rubocop-rails (2.25.0)
231
232
  activesupport (>= 4.2.0)
232
233
  rack (>= 1.1)
233
234
  rubocop (>= 1.33.0, < 2.0)
234
235
  rubocop-ast (>= 1.31.1, < 2.0)
235
236
  rubocop-rake (0.6.0)
236
237
  rubocop (~> 1.0)
237
- rubocop-rspec (2.27.1)
238
+ rubocop-rspec (2.29.2)
238
239
  rubocop (~> 1.40)
239
240
  rubocop-capybara (~> 2.17)
240
241
  rubocop-factory_bot (~> 2.22)
242
+ rubocop-rspec_rails (~> 2.28)
243
+ rubocop-rspec_rails (2.28.3)
244
+ rubocop (~> 1.40)
241
245
  ruby-progressbar (1.13.0)
242
246
  simplecov (0.22.0)
243
247
  docile (~> 1.1)
@@ -246,8 +250,9 @@ GEM
246
250
  simplecov-html (0.12.3)
247
251
  simplecov_json_formatter (0.1.4)
248
252
  stringio (3.1.0)
253
+ strscan (3.1.0)
249
254
  tdiff (0.4.0)
250
- thor (1.3.0)
255
+ thor (1.3.1)
251
256
  timeout (0.4.1)
252
257
  tzinfo (2.0.6)
253
258
  concurrent-ruby (~> 1.0)
@@ -259,7 +264,7 @@ GEM
259
264
  xpath (3.2.0)
260
265
  nokogiri (~> 1.8)
261
266
  yard (0.9.36)
262
- zeitwerk (2.6.13)
267
+ zeitwerk (2.6.14)
263
268
 
264
269
  PLATFORMS
265
270
  x86_64-darwin-19
@@ -271,12 +276,12 @@ DEPENDENCIES
271
276
  capybara (~> 3.40.0)
272
277
  ccs-frontend_helpers!
273
278
  nokogiri-diff (~> 0.3.0)
274
- rake (~> 13.1)
279
+ rake (~> 13.2)
275
280
  rspec (~> 3.13)
276
- rubocop (~> 1.62)
277
- rubocop-rails (~> 2.24)
281
+ rubocop (~> 1.63)
282
+ rubocop-rails (~> 2.25)
278
283
  rubocop-rake (~> 0.6)
279
- rubocop-rspec (~> 2.27)
284
+ rubocop-rspec (~> 2.29)
280
285
  simplecov (~> 0.21)
281
286
  yard (~> 0.9)
282
287
 
data/README.md CHANGED
@@ -14,6 +14,8 @@ The following table shows the version of CCS Frontend Helpers that you should us
14
14
 
15
15
  | CCS Frontend Helpers Version | Target GOV.UK Frontend Version |
16
16
  | ----------------------------- | ------------------------------ |
17
+ | [0.4.0](https://github.com/tim-s-ccs/ccs-frontend_helpers/releases/tag/v0.4.0) | [5.4.0](https://github.com/alphagov/govuk-frontend/releases/tag/v5.4.0) |
18
+ | [0.3.0](https://github.com/tim-s-ccs/ccs-frontend_helpers/releases/tag/v0.3.0) | [5.3.0](https://github.com/alphagov/govuk-frontend/releases/tag/v5.3.0) |
17
19
  | [0.2.0](https://github.com/tim-s-ccs/ccs-frontend_helpers/releases/tag/v0.2.0) | [5.2.0](https://github.com/alphagov/govuk-frontend/releases/tag/v5.2.0) |
18
20
  | [0.1.2](https://github.com/tim-s-ccs/ccs-frontend_helpers/releases/tag/v0.1.2) | [4.7.0](https://github.com/alphagov/govuk-frontend/releases/tag/v4.7.0) |
19
21
 
@@ -37,7 +37,6 @@ module CCS
37
37
  def initialize(navigation: nil, meta: nil, **options)
38
38
  super(**options)
39
39
 
40
- @options[:attributes][:role] = 'contentinfo'
41
40
  @options[:copyright] ||= '© Crown copyright'
42
41
 
43
42
  @navigation = navigation&.map { |navigation_item| Navigation.new(context: @context, **navigation_item) }
@@ -45,7 +45,6 @@ module CCS
45
45
  def initialize(service_authentication_items: nil, navigation: nil, menu_button: nil, service: nil, **options)
46
46
  super(**options)
47
47
 
48
- @options[:attributes][:role] = 'banner'
49
48
  @options[:container_classes] ||= 'govuk-width-container'
50
49
  @options[:homepage_url] ||= 'https://www.crowncommercial.gov.uk'
51
50
 
@@ -31,7 +31,7 @@ module CCS
31
31
  # @option options [String] :classes additional CSS classes for the error summary HTML
32
32
  # @option options [Hash] :attributes ({}) any additional attributes that will be added as part of the HTML
33
33
 
34
- def initialize(title:, error_summary_items:, description: nil, **options)
34
+ def initialize(title:, error_summary_items: [], description: nil, **options)
35
35
  super(**options)
36
36
 
37
37
  @title = title
@@ -51,9 +51,11 @@ module CCS
51
51
  concat(tag.h2(title, class: 'govuk-error-summary__title'))
52
52
  concat(tag.div(class: 'govuk-error-summary__body') do
53
53
  concat(tag.p(description)) if description
54
- concat(tag.ul(class: 'govuk-list govuk-error-summary__list') do
55
- error_summary_items.each { |error_summary_item| concat(error_summary_item.render) }
56
- end)
54
+ if error_summary_items.any?
55
+ concat(tag.ul(class: 'govuk-list govuk-error-summary__list') do
56
+ error_summary_items.each { |error_summary_item| concat(error_summary_item.render) }
57
+ end)
58
+ end
57
59
  end)
58
60
  end
59
61
  end
@@ -0,0 +1,62 @@
1
+ module CCS
2
+ module Components
3
+ module GovUK
4
+ class Field < Base
5
+ class Input < Field
6
+ class CharacterCount
7
+ # = GOV.UK Character count message
8
+ #
9
+ # This is used to generate the character count message
10
+ #
11
+ # @!attribute [r] count_message
12
+ # @return [Hint] Hint with the count message
13
+ # @!attribute [r] after_input
14
+ # @return [String] Text or HTML for after the textarea input
15
+
16
+ class CountMessage
17
+ include ActionView::Context
18
+ include ActionView::Helpers
19
+
20
+ private
21
+
22
+ attr_reader :count_message, :after_input
23
+
24
+ public
25
+
26
+ # @param character_count_attribute [String] the name of the field as it will appear in the textarea
27
+ # @param context [ActionView::Base] the view context
28
+ # @param character_count_options (see CCS::Components::GovUK::Field::Input::CharacterCount.get_character_count_from_group_options)
29
+ # @param after_input [String] Text or HTML that goes after the input
30
+ #
31
+ # @option (see CCS::Components::GovUK::Field::Input::CharacterCount.get_character_count_from_group_options)
32
+
33
+ def initialize(character_count_attribute:, context:, character_count_options:, after_input: nil)
34
+ count_message = character_count_options[:textarea_description] || {}
35
+
36
+ count_message_length = character_count_options[:maxwords] || character_count_options[:maxlength]
37
+ count_message_default = "You can enter up to %<count>s #{character_count_options[:maxwords] ? 'words' : 'characters'}"
38
+
39
+ text = count_message_length ? format(count_message[:count_message] || count_message_default, count: count_message_length) : ''
40
+ classes = "govuk-character-count__message #{count_message[:classes]}".rstrip
41
+
42
+ @count_message = Hint.new(text: text, classes: classes, attributes: { id: "#{character_count_attribute}-info" }, context: context)
43
+ @after_input = after_input
44
+ end
45
+
46
+ # Generates the HTML for the GOV.UK Character count message
47
+ #
48
+ # @return [ActiveSupport::SafeBuffer]
49
+
50
+ def render
51
+ capture do
52
+ concat(count_message.render)
53
+ concat(after_input) if after_input
54
+ end
55
+ end
56
+ end
57
+ end
58
+ end
59
+ end
60
+ end
61
+ end
62
+ end
@@ -1,5 +1,5 @@
1
1
  require_relative 'textarea'
2
- require_relative '../../hint'
2
+ require_relative 'character_count/count_message'
3
3
 
4
4
  module CCS
5
5
  module Components
@@ -21,12 +21,9 @@ module CCS
21
21
  # @return [Hash] HTML options for the character count
22
22
 
23
23
  class CharacterCount
24
- include ActionView::Context
25
- include ActionView::Helpers
26
-
27
24
  private
28
25
 
29
- attr_reader :textarea, :textarea_description, :character_count_html_options
26
+ attr_reader :textarea, :textarea_description
30
27
 
31
28
  public
32
29
 
@@ -41,21 +38,10 @@ module CCS
41
38
  def initialize(attribute:, context:, character_count_options: {}, **options)
42
39
  character_count_attribute = options[:form] ? "#{options[:form].object_name}_#{attribute}" : attribute
43
40
 
44
- initialise_textarea(attribute, character_count_attribute, context, options)
45
- initialise_character_count_html_options(character_count_options)
46
- initialise_textarea_description(character_count_attribute, context, character_count_options)
41
+ initialise_textarea(attribute, character_count_attribute, character_count_options, context, options)
47
42
  end
48
43
 
49
- # Generates the HTML for the GOV.UK Character count component
50
- #
51
- # @return [ActiveSupport::SafeBuffer]
52
-
53
- def render
54
- tag.div(**character_count_html_options) do
55
- concat(textarea.render)
56
- concat(textarea_description.render)
57
- end
58
- end
44
+ delegate :render, to: :textarea
59
45
 
60
46
  private
61
47
 
@@ -63,19 +49,23 @@ module CCS
63
49
  #
64
50
  # @param attribute [Symbol] the attribute of the field
65
51
  # @param character_count_attribute [String] the name of the field as it will appear in the textarea
52
+ # @param character_count_options [Hash] options for the character count
66
53
  # @param context [ActionView::Base] the view context
67
54
  # @param options [Hash] options that will be used for the textarea
68
55
  #
69
56
  # @option (see CCS::Components::GovUK::Field::Input::Textarea#initialize)
70
57
 
71
- def initialise_textarea(attribute, character_count_attribute, context, options)
58
+ def initialise_textarea(attribute, character_count_attribute, character_count_options, context, options)
59
+ set_character_count_from_group_options(character_count_options, options)
60
+
72
61
  ((options[:attributes] ||= {})[:aria] ||= {})[:describedby] = [options.dig(:attributes, :aria, :describedby), "#{character_count_attribute}-info"].compact.join(' ')
73
62
  options[:classes] = "govuk-js-character-count #{options[:classes]}".rstrip
74
63
 
75
- @textarea = Textarea.new(attribute: attribute, context: context, **options)
64
+ count_message = CountMessage.new(character_count_attribute: character_count_attribute, context: context, character_count_options: character_count_options, after_input: options.delete(:after_input))
65
+ @textarea = Textarea.new(attribute: attribute, context: context, after_input: count_message.render, **options)
76
66
  end
77
67
 
78
- # Initialises the charcter count options
68
+ # Sets the charcter count form group options
79
69
  #
80
70
  # @param character_count_options [Hash] options for the charcter count
81
71
  #
@@ -91,50 +81,29 @@ module CCS
91
81
  # - +:count_message+ replaced the default text for the count message.
92
82
  # If you want the count number to appear, put %<count>s in the string and it will be replaced with the number
93
83
  # - +classes+ additional CSS classes for the textarea description HTML
94
- # @option character_count_options [Hash] :characters_under_limit Message displayed when the number of characters is under the configured maximum, maxlength
84
+ # @option character_count_options [String] :characters_under_limit Message displayed when the number of characters is under the configured maximum, maxlength
95
85
  # @option character_count_options [String] :characters_at_limit_text Message displayed when the number of characters reaches the configured maximum, maxlength
96
- # @option character_count_options [Hash] :characters_over_limit Message displayed when the number of characters is over the configured maximum, maxlength
97
- # @option character_count_options [Hash] :words_under_limit Message displayed when the number of words is under the configured maximum, maxwords
86
+ # @option character_count_options [String] :characters_over_limit Message displayed when the number of characters is over the configured maximum, maxlength
87
+ # @option character_count_options [String] :words_under_limit Message displayed when the number of words is under the configured maximum, maxwords
98
88
  # @option character_count_options [String] :words_at_limit_text Message displayed when the number of words reaches the configured maximum, maxwords
99
- # @option character_count_options [Hash] :words_over_limit Message displayed when the number of words is over the configured maximum, maxwords
89
+ # @option character_count_options [String] :words_over_limit Message displayed when the number of words is over the configured maximum, maxwords
100
90
 
101
- def initialise_character_count_html_options(character_count_options)
102
- character_count_html_options = { class: 'govuk-character-count', data: { module: 'govuk-character-count' } }
91
+ def set_character_count_from_group_options(character_count_options, options)
92
+ (options[:form_group] ||= {})[:classes] = "govuk-character-count #{options.dig(:form_group, :classes)}".rstrip
93
+ ((options[:form_group][:attributes] ||= {})[:data] ||= {})[:module] = 'govuk-character-count'
103
94
 
104
95
  %i[maxlength threshold maxwords].each do |data_attribute|
105
- character_count_html_options[:data][data_attribute] = character_count_options[data_attribute].to_s if character_count_options[data_attribute]
96
+ options[:form_group][:attributes][:data][data_attribute] = character_count_options[data_attribute].to_s if character_count_options[data_attribute]
106
97
  end
107
98
 
108
- get_chacrter_count_translations(character_count_options).each do |data_attribute, value|
109
- character_count_html_options[:data][data_attribute] = value
99
+ get_chacrter_count_translations(character_count_options) do |data_attribute, value|
100
+ options[:form_group][:attributes][:data][data_attribute] = value
110
101
  end
111
-
112
- @character_count_html_options = character_count_html_options
113
- end
114
-
115
- # Initialises the charcter count textarea description
116
- #
117
- # @param character_count_attribute [String] the name of the field as it will appear in the textarea
118
- # @param context [ActionView::Base] the view context
119
- # @param (see initialise_character_count_html_options)
120
- #
121
- # @option (see initialise_character_count_html_options)
122
-
123
- def initialise_textarea_description(character_count_attribute, context, character_count_options)
124
- textarea_description = character_count_options[:textarea_description] || {}
125
-
126
- textarea_description_length = character_count_options[:maxwords] || character_count_options[:maxlength]
127
- textarea_description_default = "You can enter up to %<count>s #{character_count_options[:maxwords] ? 'words' : 'characters'}"
128
-
129
- text = textarea_description_length ? format(textarea_description[:count_message] || textarea_description_default, count: textarea_description_length) : ''
130
- classes = "govuk-character-count__message #{textarea_description[:classes]}".rstrip
131
-
132
- @textarea_description = Hint.new(text: text, classes: classes, attributes: { id: "#{character_count_attribute}-info" }, context: context)
133
102
  end
134
103
 
135
104
  # rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
136
105
 
137
- # Returns the translation options for character count
106
+ # Generator for the translation options for character count
138
107
  #
139
108
  # @param (see initialise_character_count_html_options)
140
109
  #
@@ -143,24 +112,25 @@ module CCS
143
112
  # @return [Hash]
144
113
 
145
114
  def get_chacrter_count_translations(character_count_options)
146
- character_count_data_options = {}
147
-
148
115
  %i[characters_at_limit words_at_limit].each do |data_attribute|
149
116
  data_attribute_name = :"#{data_attribute}_text"
150
- character_count_data_options[:"i18n.#{data_attribute.to_s.gsub('_', '-')}"] = character_count_options[data_attribute_name] if character_count_options[data_attribute_name]
117
+
118
+ next unless character_count_options[data_attribute_name]
119
+
120
+ yield :"i18n.#{data_attribute.to_s.gsub('_', '-')}", character_count_options[data_attribute_name]
151
121
  end
152
122
 
153
123
  %i[characters_under_limit characters_over_limit words_under_limit words_over_limit].each do |data_attribute|
154
124
  next unless character_count_options[data_attribute]
155
125
 
156
126
  %i[other one].each do |plural_rule|
157
- character_count_data_options[:"i18n.#{data_attribute.to_s.gsub('_', '-')}.#{plural_rule}"] = character_count_options[data_attribute][plural_rule] if character_count_options[data_attribute][plural_rule]
127
+ next unless character_count_options[data_attribute][plural_rule]
128
+
129
+ yield :"i18n.#{data_attribute.to_s.gsub('_', '-')}.#{plural_rule}", character_count_options[data_attribute][plural_rule]
158
130
  end
159
131
  end
160
132
 
161
- character_count_data_options[:'i18n.textarea-description.other'] = character_count_options[:textarea_description][:count_message] if character_count_options.dig(:textarea_description, :count_message) && !(character_count_options[:maxwords] || character_count_options[:maxlength])
162
-
163
- character_count_data_options
133
+ yield :'i18n.textarea-description.other', character_count_options[:textarea_description][:count_message] if character_count_options.dig(:textarea_description, :count_message) && !(character_count_options[:maxwords] || character_count_options[:maxlength])
164
134
  end
165
135
 
166
136
  # rubocop:enable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity