ccs-frontend_helpers 0.2.0 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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