govuk_publishing_components 27.14.0 → 27.16.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.
Files changed (27) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/javascripts/govuk_publishing_components/analytics/auto-scroll-tracker.js +24 -3
  3. data/app/assets/javascripts/govuk_publishing_components/analytics/custom-dimensions.js +52 -26
  4. data/app/assets/javascripts/govuk_publishing_components/analytics/ecommerce.js +25 -25
  5. data/app/assets/javascripts/govuk_publishing_components/analytics/explicit-cross-domain-links.js +24 -8
  6. data/app/assets/javascripts/govuk_publishing_components/components/cookie-banner.js +1 -0
  7. data/app/assets/javascripts/govuk_publishing_components/components/single-page-notification-button.js +3 -3
  8. data/app/assets/stylesheets/govuk_publishing_components/components/_big-number.scss +15 -2
  9. data/app/assets/stylesheets/govuk_publishing_components/components/_layout-super-navigation-header.scss +10 -8
  10. data/app/views/govuk_publishing_components/components/_big_number.html.erb +0 -1
  11. data/app/views/govuk_publishing_components/components/_button.html.erb +1 -1
  12. data/app/views/govuk_publishing_components/components/_intervention.html.erb +21 -4
  13. data/app/views/govuk_publishing_components/components/_layout_super_navigation_header.html.erb +1 -1
  14. data/app/views/govuk_publishing_components/components/_search.html.erb +25 -9
  15. data/app/views/govuk_publishing_components/components/_single_page_notification_button.html.erb +9 -7
  16. data/app/views/govuk_publishing_components/components/_success_alert.html.erb +4 -1
  17. data/app/views/govuk_publishing_components/components/docs/intervention.yml +11 -0
  18. data/app/views/govuk_publishing_components/components/docs/layout_for_public.yml +1 -1
  19. data/app/views/govuk_publishing_components/components/docs/radio.yml +40 -33
  20. data/app/views/govuk_publishing_components/components/docs/search.yml +25 -0
  21. data/app/views/govuk_publishing_components/components/docs/success_alert.yml +6 -0
  22. data/config/locales/en.yml +3 -1
  23. data/lib/govuk_publishing_components/presenters/button_helper.rb +24 -0
  24. data/lib/govuk_publishing_components/presenters/intervention_helper.rb +20 -2
  25. data/lib/govuk_publishing_components/presenters/single_page_notification_button_helper.rb +4 -7
  26. data/lib/govuk_publishing_components/version.rb +1 -1
  27. metadata +2 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 59c59e65f1434263c7e36d4d89029083fe241185daba81730010af5b865ccabc
4
- data.tar.gz: c4b9a4d0a73f9e0dd3068aeade2e04565e2d69b4739c9dc00c3a820c631089b3
3
+ metadata.gz: 586ea5662dfd4f3951905b244afc78556dc687bf861a05e11e56ff7d2ee172eb
4
+ data.tar.gz: eab6ea6544883bc5fa511f29e589d996eabae18a6661f0772ac45356668f5396
5
5
  SHA512:
6
- metadata.gz: 46b643cba9fcd36653300e4a11679f882eb1f1b5482e4811c38f580e6ad4526c60a3d2f61ecf9a4df13f5abef2c9d4b954ae4cec959159efced1c011b9dd458f
7
- data.tar.gz: cd46ecdd5268be36578fecef171b2b86e7b000c750fbcc9e9000a51485e58559d14d9c9a32e9e623fff757f58559a90bab99f68aa87159bedc9737e3b29d082b
6
+ metadata.gz: f513e048959e7e81b753583f923772b590f5c4da1841e666f4131bc79e8dea9b8cd4571cba7bab859e0d1b4683a1b10ebaa17d56cd6d3ab3a4eff68090837a1c
7
+ data.tar.gz: 5f2d6aa1171a47b3074ba65b0dc5488b9269dc4f7781580df52d7d1c354559d19270bace849b39342c51e3e4ad9342a966354da39dabb6f52838de4c505f0f03
@@ -31,9 +31,21 @@ window.GOVUK.Modules = window.GOVUK.Modules || {};
31
31
  return
32
32
  }
33
33
 
34
+ this.trackType = this.$module.getAttribute('data-track-type')
35
+ var trackHeadings = this.$module.getAttribute('data-track-headings')
36
+ if (trackHeadings) {
37
+ try {
38
+ this.config.trackHeadings = JSON.parse(trackHeadings)
39
+ } catch (e) {
40
+ // if there's a problem with the config, don't start the tracker
41
+ console.error('Scroll tracker configuration error: ' + e.message, window.location)
42
+ window.GOVUK.analyticsVars.scrollTrackerStarted = false
43
+ return
44
+ }
45
+ }
46
+
34
47
  window.GOVUK.analyticsVars.scrollTrackerStarted = true
35
48
 
36
- this.trackType = this.$module.getAttribute('data-track-type')
37
49
  if (this.trackType === 'headings') {
38
50
  this.track = new AutoScrollTracker.Heading(this.config)
39
51
  } else {
@@ -145,15 +157,24 @@ window.GOVUK.Modules = window.GOVUK.Modules || {};
145
157
 
146
158
  // check heading is inside allowed elements, generally ignores everything outside of page content
147
159
  AutoScrollTracker.Heading.prototype.findAllowedHeadings = function () {
148
- var headings = ['h1', 'h2', 'h3', 'h4', 'h5', 'h6']
149
160
  var headingsFound = []
161
+ var headings = ['h1', 'h2', 'h3', 'h4', 'h5', 'h6']
162
+ var trackHeadings = this.config.trackHeadings
150
163
 
164
+ // this is a loop that only happens once as we currently only have one
165
+ // allowed element for headings to be in - 'main'
151
166
  for (var h = 0; h < this.config.allowHeadingsInside.length; h++) {
152
167
  var insideElements = document.querySelectorAll(this.config.allowHeadingsInside[h])
153
168
  for (var e = 0; e < insideElements.length; e++) {
154
169
  var found = insideElements[e].querySelectorAll(headings)
155
170
  for (var f = 0; f < found.length; f++) {
156
- headingsFound.push(found[f])
171
+ if (trackHeadings) {
172
+ if (trackHeadings.includes(found[f].textContent.trim())) {
173
+ headingsFound.push(found[f])
174
+ }
175
+ } else {
176
+ headingsFound.push(found[f])
177
+ }
157
178
  }
158
179
  }
159
180
  }
@@ -1,4 +1,4 @@
1
- /* global GOVUK, $ */
1
+ /* global GOVUK */
2
2
 
3
3
  (function () {
4
4
  'use strict'
@@ -7,11 +7,11 @@
7
7
 
8
8
  CustomDimensions.getAndExtendDefaultTrackingOptions = function (extraOptions) {
9
9
  var trackingOptions = this.customDimensions()
10
- return $.extend(trackingOptions, extraOptions)
10
+ return this.extend(trackingOptions, extraOptions)
11
11
  }
12
12
 
13
13
  CustomDimensions.customDimensions = function () {
14
- var dimensions = $.extend(
14
+ var dimensions = this.extend(
15
15
  {},
16
16
  customDimensionsFromBrowser(),
17
17
  customDimensionsFromMetaTags(),
@@ -19,9 +19,28 @@
19
19
  abTestCustomDimensions()
20
20
  )
21
21
 
22
- return $.each(dimensions, function (key, value) {
23
- dimensions[key] = new GOVUK.Analytics.PIISafe(String(value))
24
- })
22
+ for (var key in dimensions) {
23
+ dimensions[key] = new GOVUK.Analytics.PIISafe(String(dimensions[key]))
24
+ }
25
+ return dimensions
26
+ }
27
+
28
+ CustomDimensions.extend = function (out) {
29
+ out = out || {}
30
+
31
+ for (var i = 1; i < arguments.length; i++) {
32
+ if (!arguments[i]) {
33
+ continue
34
+ }
35
+
36
+ for (var key in arguments[i]) {
37
+ if (Object.prototype.hasOwnProperty.call(arguments[i], key)) {
38
+ out[key] = arguments[i][key]
39
+ }
40
+ }
41
+ }
42
+
43
+ return out
25
44
  }
26
45
 
27
46
  function customDimensionsFromBrowser () {
@@ -70,52 +89,59 @@
70
89
  'spelling-suggestion': { dimension: 81 }
71
90
  }
72
91
 
73
- var $metas = $('meta[name^="govuk:"]')
92
+ var metas = document.querySelectorAll("meta[name^='govuk']")
74
93
  var customDimensions = {}
75
94
  var tags = {}
76
95
 
77
- $metas.each(function () {
78
- var $meta = $(this)
79
- var key = $meta.attr('name').split('govuk:')[1]
80
-
81
- var dimension = dimensionMappings[key]
96
+ for (var i = 0; i < metas.length; i++) {
97
+ var meta = metas[i]
98
+ var metaKey = meta.getAttribute('name').split('govuk:')[1]
99
+ var dimension = dimensionMappings[metaKey]
82
100
  if (dimension) {
83
- tags[key] = $meta.attr('content')
101
+ tags[metaKey] = meta.getAttribute('content')
84
102
  }
85
- })
103
+ }
86
104
 
87
- $.each(dimensionMappings, function (key, dimension) {
88
- var value = tags[key] || dimension.defaultValue
105
+ for (var key in dimensionMappings) {
106
+ var value = tags[key] || dimensionMappings[key].defaultValue
89
107
  if (typeof value !== 'undefined') {
90
- customDimensions['dimension' + dimension.dimension] = value
108
+ customDimensions['dimension' + dimensionMappings[key].dimension] = value
91
109
  }
92
- })
110
+ }
93
111
 
94
112
  return customDimensions
95
113
  }
96
114
 
97
115
  function customDimensionsFromDom () {
116
+ var mainLang = document.getElementById('content')
117
+ if (mainLang) {
118
+ mainLang = mainLang.getAttribute('lang')
119
+ }
120
+ var globalBar = document.querySelector('[data-module="global-bar"]') || false
121
+ if (globalBar) {
122
+ globalBar = globalBar.style.display !== 'none'
123
+ }
98
124
  return {
99
125
  dimension26: GOVUK.PageContent.getNumberOfSections(),
100
126
  dimension27: GOVUK.PageContent.getNumberOfLinks(),
101
- dimension23: $('main[id="content"]').attr('lang') || 'unknown',
102
- dimension38: $('[data-module="global-bar"]').is(':visible') && 'Global Banner viewed'
127
+ dimension23: mainLang || 'unknown',
128
+ dimension38: globalBar && 'Global Banner viewed'
103
129
  }
104
130
  }
105
131
 
106
132
  function abTestCustomDimensions () {
107
- var $abMetas = $('meta[name^="govuk:ab-test"]')
133
+ var abMetas = document.querySelectorAll("meta[name^='govuk:ab-test']")
108
134
  var customDimensions = {}
109
135
 
110
- $abMetas.each(function () {
111
- var $meta = $(this)
112
- var dimension = parseInt($meta.data('analytics-dimension'))
113
- var testNameAndBucket = $meta.attr('content')
136
+ for (var i = 0; i < abMetas.length; i++) {
137
+ var meta = abMetas[i]
138
+ var dimension = parseInt(meta.getAttribute('data-analytics-dimension'))
139
+ var testNameAndBucket = meta.getAttribute('content')
114
140
 
115
141
  if (dimension) {
116
142
  customDimensions['dimension' + dimension] = testNameAndBucket
117
143
  }
118
- })
144
+ }
119
145
 
120
146
  return customDimensions
121
147
  }
@@ -1,5 +1,5 @@
1
1
  // https://developers.google.com/analytics/devguides/collection/analyticsjs/enhanced-ecommerce
2
- /* global GOVUK, $, ga */
2
+ /* global GOVUK, ga */
3
3
 
4
4
  (function () {
5
5
  'use strict'
@@ -12,25 +12,25 @@
12
12
  this.init = function (element) {
13
13
  // Limiting to 100 characters to avoid noise from extra longs search queries
14
14
  // and to stop the size of the payload going over 8k limit.
15
- var searchQuery = GOVUK.analytics.stripPII(element.attr('data-search-query')).substring(0, 100).toLowerCase()
16
- var ecommerceRows = element.find('[data-ecommerce-row]')
17
- var startPosition = parseInt(element.data('ecommerce-start-index'), 10)
18
- var listTitle = element.data('list-title') || DEFAULT_LIST_TITLE
19
- var variant = element.data('ecommerce-variant')
20
- var trackClickLabel = element.data('track-click-label') || DEFAULT_TRACK_CLICK_LABEL
21
-
22
- ecommerceRows.each(function (index, ecommerceRow) {
23
- var $ecommerceRow = $(ecommerceRow)
24
- var listSubheading = $ecommerceRow.data('ecommerce-subheading') || undefined
25
- var contentId = $ecommerceRow.attr('data-ecommerce-content-id')
26
- var path = $ecommerceRow.attr('data-ecommerce-path')
27
-
28
- var indexOverride = $ecommerceRow.attr('data-ecommerce-index')
29
- index = indexOverride ? parseInt(indexOverride, 10) - 1 : index
15
+ var searchQuery = GOVUK.analytics.stripPII(element.getAttribute('data-search-query')).substring(0, 100).toLowerCase()
16
+ var ecommerceRows = element.querySelectorAll('[data-ecommerce-row]')
17
+ var startPosition = parseInt(element.getAttribute('data-ecommerce-start-index'), 10)
18
+ var listTitle = element.getAttribute('data-list-title') || DEFAULT_LIST_TITLE
19
+ var variant = element.getAttribute('data-ecommerce-variant') || undefined
20
+ var trackClickLabel = element.getAttribute('data-track-click-label') || DEFAULT_TRACK_CLICK_LABEL
21
+
22
+ for (var i = 0; i < ecommerceRows.length; i++) {
23
+ var ecommerceRow = ecommerceRows[i]
24
+ var listSubheading = ecommerceRow.getAttribute('data-ecommerce-subheading') || undefined
25
+ var contentId = ecommerceRow.getAttribute('data-ecommerce-content-id') || undefined
26
+ var path = ecommerceRow.getAttribute('data-ecommerce-path')
27
+
28
+ var indexOverride = ecommerceRow.getAttribute('data-ecommerce-index')
29
+ var index = indexOverride ? parseInt(indexOverride, 10) - 1 : i
30
30
 
31
31
  addImpression(contentId, path, index + startPosition, searchQuery, listTitle, listSubheading, variant)
32
- trackProductOnClick($ecommerceRow, contentId, path, index + startPosition, searchQuery, listTitle, listSubheading, variant, trackClickLabel)
33
- })
32
+ trackProductOnClick(ecommerceRow, contentId, path, index + startPosition, searchQuery, listTitle, listSubheading, variant, trackClickLabel)
33
+ }
34
34
  }
35
35
 
36
36
  function constructData (contentId, path, position, listTitle, listSubheading, searchQuery, variant) {
@@ -67,7 +67,7 @@
67
67
  }
68
68
 
69
69
  function trackProductOnClick (row, contentId, path, position, searchQuery, listTitle, listSubheading, variant, trackClickLabel) {
70
- row.click(function () {
70
+ row.addEventListener('click', function () {
71
71
  if (contentId || path) {
72
72
  var clickData = constructData(contentId, path, position, listTitle, listSubheading, searchQuery, variant)
73
73
  ga('ec:addProduct', clickData)
@@ -82,18 +82,18 @@
82
82
  }
83
83
 
84
84
  Ecommerce.ecLoaded = false
85
- Ecommerce.start = function (element) {
85
+ Ecommerce.start = function (elements) {
86
86
  if (!window.ga) { return }
87
- element = element || $('[data-analytics-ecommerce]')
88
- if (element.length > 0) {
87
+ elements = elements || document.querySelectorAll('[data-analytics-ecommerce]')
88
+ if (elements.length > 0) {
89
89
  if (!Ecommerce.ecLoaded) {
90
90
  ga('require', 'ec')
91
91
  Ecommerce.ecLoaded = true
92
92
  }
93
- element.each(function (index) {
93
+ for (var i = 0; i < elements.length; i++) {
94
94
  var ecommerce = new Ecommerce()
95
- ecommerce.init($(this))
96
- })
95
+ ecommerce.init(elements[i])
96
+ }
97
97
  }
98
98
  }
99
99
 
@@ -10,12 +10,18 @@
10
10
 
11
11
  var cookieBannerEngaged = GOVUK.cookie('cookies_preferences_set')
12
12
 
13
- // If not engaged, append only ?cookie-consent=not-engaged
14
- // If engaged and rejected, append only ?cookie-consent=reject
15
- // If engaged and accepted usage, append ?_ga=clientid if available and cookie-consent=accept
13
+ // If not engaged, append only ?cookie_consent=not-engaged
14
+ // If engaged and rejected, append only ?cookie_consent=reject
15
+ // If engaged and accepted usage, append ?_ga=clientid if available and cookie_consent=accept
16
16
 
17
17
  if (cookieBannerEngaged !== 'true') {
18
18
  this.decorate(element, 'cookie_consent=not-engaged')
19
+ this.start = this.start.bind(this, $module)
20
+
21
+ // if the user has not engaged with the cookie banner yet, listen for the cookie consent accept/reject events
22
+ // re-start the module if cookies are accepted or rejected on the current page – setting cookie preferences does not reload the page
23
+ window.addEventListener('cookie-consent', this.start)
24
+ window.addEventListener('cookie-reject', this.start)
19
25
  return
20
26
  }
21
27
  var cookieConsent = GOVUK.getConsentCookie()
@@ -50,6 +56,8 @@
50
56
  this.decorate = function (element, param) {
51
57
  var attribute = 'href'
52
58
  var attributeValue = element.getAttribute(attribute)
59
+ var cookieConsentParameterPattern = /cookie_consent=[^&]*/
60
+ var paramIsCookieConsent = param.match(cookieConsentParameterPattern)
53
61
 
54
62
  if (!attributeValue) {
55
63
  attribute = 'action'
@@ -58,13 +66,21 @@
58
66
 
59
67
  if (!attributeValue) { return }
60
68
 
61
- if (attributeValue.includes('?')) {
62
- attributeValue += '&' + param
63
- element.setAttribute(attribute, attributeValue)
69
+ var attributeHasCookieConsent = attributeValue.match(cookieConsentParameterPattern)
70
+
71
+ if (attributeHasCookieConsent && paramIsCookieConsent) {
72
+ // if the decorate function has received a cookie_consent parameter, but the target element already has a cookie_consent parameter, replace the existing parameter with the new value
73
+ attributeValue = attributeValue.replace(cookieConsentParameterPattern, param)
64
74
  } else {
65
- attributeValue += '?' + param
66
- element.setAttribute(attribute, attributeValue)
75
+ // otherwise, simply append the parameter to the target element href query string
76
+ if (attributeValue.includes('?')) {
77
+ attributeValue += '&' + param
78
+ } else {
79
+ attributeValue += '?' + param
80
+ }
67
81
  }
82
+
83
+ element.setAttribute(attribute, attributeValue)
68
84
  }
69
85
  }
70
86
 
@@ -97,6 +97,7 @@ window.GOVUK.Modules = window.GOVUK.Modules || {};
97
97
  this.$module.cookieBannerConfirmationMessage.focus()
98
98
  window.GOVUK.cookie('cookies_preferences_set', 'true', { days: 365 })
99
99
  window.GOVUK.setDefaultConsentCookie()
100
+ window.GOVUK.triggerEvent(window, 'cookie-reject')
100
101
  }
101
102
 
102
103
  CookieBanner.prototype.showConfirmationMessage = function () {
@@ -26,9 +26,9 @@ window.GOVUK.Modules = window.GOVUK.Modules || {};
26
26
  var html = document.createElement('div')
27
27
  html.innerHTML = newButton
28
28
  // test that the html returned contains the button component; if yes, swap the button for the updated version
29
- var responseHasButton = html.querySelector('form.gem-c-single-page-notification-button .gem-c-single-page-notification-button__submit')
30
- if (responseHasButton) {
31
- this.$module.outerHTML = newButton
29
+ var responseButtonContainer = html.querySelector('form.gem-c-single-page-notification-button')
30
+ if (responseButtonContainer) {
31
+ this.$module.parentNode.replaceChild(responseButtonContainer, this.$module)
32
32
  }
33
33
  }
34
34
  }
@@ -1,13 +1,26 @@
1
1
  .gem-c-big-number {
2
2
  margin-bottom: govuk-spacing(3);
3
+ @include govuk-typography-common;
4
+ @include govuk-text-colour;
3
5
  }
4
6
 
5
7
  .gem-c-big-number__value {
6
- @include govuk-font($size: 80, $weight: bold);
8
+ font-size: 80px;
9
+ @include govuk-typography-weight-bold;
10
+ line-height: 1;
11
+
12
+ @if $govuk-typography-use-rem {
13
+ font-size: govuk-px-to-rem(80px);
14
+ }
7
15
  }
8
16
 
9
17
  .gem-c-big-number__label {
10
- @include govuk-font($size: 16, $weight: bold, $line-height: 2);
18
+ font-size: 16px;
19
+ @include govuk-typography-weight-bold;
20
+
21
+ @if $govuk-typography-use-rem {
22
+ font-size: govuk-px-to-rem(16px);
23
+ }
11
24
 
12
25
  // This pseudo element is to bypass an issue with NVDA where block level elements are dictated separately.
13
26
  // What's happening here is that the label and the number technically have an inline relationship but appear to have a block relationship thanks to this element
@@ -102,6 +102,7 @@ $icon-size: 20px;
102
102
  $chevron-indent-spacing: 7px;
103
103
  $black-bar-height: 50px;
104
104
  $search-width-or-height: $black-bar-height;
105
+ $pseudo-underline-height: 3px;
105
106
 
106
107
  @mixin chevron($colour, $update: false) {
107
108
  @if ($update == true) {
@@ -111,7 +112,7 @@ $search-width-or-height: $black-bar-height;
111
112
  @include prefixed-transform($rotate: 45deg, $translateY: -35%);
112
113
  border-bottom: 2px solid $colour;
113
114
  border-right: 2px solid $colour;
114
- content: " ";
115
+ content: "";
115
116
  display: inline-block;
116
117
  height: 8px;
117
118
  margin: 0 8px 0 2px;
@@ -123,7 +124,7 @@ $search-width-or-height: $black-bar-height;
123
124
  @mixin make-selectable-area-bigger {
124
125
  background: none;
125
126
  bottom: 0;
126
- content: " ";
127
+ content: "";
127
128
  left: 0;
128
129
  position: absolute;
129
130
  right: 0;
@@ -133,11 +134,11 @@ $search-width-or-height: $black-bar-height;
133
134
  @mixin pseudo-underline {
134
135
  background: none;
135
136
  bottom: 0;
136
- content: " ";
137
- height: 3px;
138
- left: govuk-spacing(3);
137
+ content: "";
138
+ height: $pseudo-underline-height;
139
+ left: govuk-spacing(5);
139
140
  position: absolute;
140
- right: govuk-spacing(3);
141
+ right: govuk-spacing(6);
141
142
  top: auto;
142
143
  }
143
144
 
@@ -441,7 +442,7 @@ $search-width-or-height: $black-bar-height;
441
442
  font-size: govuk-px-to-rem(16px);
442
443
  }
443
444
  height: $black-bar-height;
444
- padding: govuk-spacing(3);
445
+ padding: govuk-spacing(3) govuk-spacing(6) govuk-spacing(3) govuk-spacing(5);
445
446
  position: relative;
446
447
  text-decoration: none;
447
448
 
@@ -762,7 +763,7 @@ $search-width-or-height: $black-bar-height;
762
763
 
763
764
  &:hover {
764
765
  background: govuk-colour("black");
765
- border-bottom: govuk-spacing(1) solid govuk-colour("mid-grey");
766
+ border-bottom: $pseudo-underline-height solid govuk-colour("mid-grey");
766
767
  color: govuk-colour("mid-grey");
767
768
  }
768
769
 
@@ -845,6 +846,7 @@ $search-width-or-height: $black-bar-height;
845
846
 
846
847
  // Navigation menu items.
847
848
  .gem-c-layout-super-navigation-header__navigation-second-items {
849
+ list-style: none;
848
850
  margin: 0;
849
851
  padding: govuk-spacing(6) govuk-spacing(4);
850
852
 
@@ -1,5 +1,4 @@
1
1
  <%
2
- href ||= nil
3
2
  number ||= nil
4
3
  label ||= nil
5
4
  href ||= nil
@@ -27,5 +27,5 @@
27
27
  <% end %>
28
28
 
29
29
  <% if button.info_text %>
30
- <%= tag.span button.info_text, class: button.info_text_classes %>
30
+ <%= tag.span button.info_text, button.info_text_options %>
31
31
  <% end %>
@@ -3,6 +3,7 @@
3
3
  suggestion_link_text ||= false
4
4
  suggestion_link_url ||= false
5
5
  suggestion_text ||= nil
6
+ new_tab ||= false
6
7
 
7
8
  data_attributes ||= {}
8
9
  data_attributes[:module] = 'intervention'
@@ -13,17 +14,33 @@
13
14
  aria_attributes[:label] = 'Intervention'
14
15
 
15
16
  local_assigns[:query_string] ||= request.query_string
17
+ local_assigns[:suggestion_link_text] = suggestion_link_text
18
+ local_assigns[:suggestion_link_url] = suggestion_link_url
16
19
 
17
20
  intervention_helper = GovukPublishingComponents::Presenters::InterventionHelper.new(local_assigns)
18
21
  dismiss_href = intervention_helper.dismiss_link
22
+
23
+ suggestion_tag_options = {
24
+ class: "govuk-link gem-c-intervention__suggestion-link",
25
+ href: suggestion_link_url,
26
+ data: suggestion_data_attributes,
27
+ }
28
+
29
+ if new_tab && (suggestion_link_text && suggestion_link_url)
30
+ target = "_blank"
31
+ rel = intervention_helper.security_attr
32
+
33
+ suggestion_tag_options.merge!({ target: target, rel: rel })
34
+
35
+ suggestion_link_text = intervention_helper.accessible_text
36
+ end
19
37
  %>
20
- <% if suggestion_text or (suggestion_link_text and suggestion_link_text) %>
38
+ <% if suggestion_text || (suggestion_link_text && suggestion_link_url) %>
21
39
  <%= tag.section class: "gem-c-intervention", role: "region", aria: aria_attributes, data: data_attributes do %>
22
40
  <p class="govuk-body">
23
41
  <%= tag.span suggestion_text, class: "gem-c-intervention__textwrapper" if suggestion_text %>
24
- <% if suggestion_link_text and suggestion_link_url %>
25
- <%= tag.a suggestion_link_text, class: "govuk-link gem-c-intervention__suggestion-link", href: suggestion_link_url, data: suggestion_data_attributes %>
26
-
42
+ <% if suggestion_link_text && suggestion_link_url %>
43
+ <%= tag.a suggestion_link_text, suggestion_tag_options %>
27
44
  <% end %>
28
45
  </p>
29
46
 
@@ -144,7 +144,7 @@
144
144
  </div>
145
145
  <div class="govuk-grid-column-two-thirds-from-desktop">
146
146
  <% if link[:menu_contents].present? %>
147
- <ul class="govuk-list gem-c-layout-super-navigation-header__navigation-second-items gem-c-layout-super-navigation-header__navigation-second-items--<%= link[:label].parameterize %>">
147
+ <ul class="gem-c-layout-super-navigation-header__navigation-second-items gem-c-layout-super-navigation-header__navigation-second-items--<%= link[:label].parameterize %>">
148
148
  <% link[:menu_contents].each do | item | %>
149
149
  <%
150
150
  has_description = item[:description].present?
@@ -1,9 +1,12 @@
1
1
  <%
2
2
  shared_helper = GovukPublishingComponents::Presenters::SharedHelper.new(local_assigns)
3
+ heading_helper = GovukPublishingComponents::Presenters::HeadingHelper.new(local_assigns)
3
4
 
4
5
  aria_controls ||= nil
5
6
  button_text ||= t("components.search_box.search_button")
6
7
  id ||= "search-main-" + SecureRandom.hex(4)
8
+ wrap_label_in_a_heading ||= false
9
+ label_margin_bottom ||= nil
7
10
  label_size ||= nil
8
11
  label_text ||= t("components.search_box.label")
9
12
  name ||= "q"
@@ -14,13 +17,6 @@
14
17
  data_attributes ||= {}
15
18
  data_attributes[:module] = 'gem-track-click'
16
19
 
17
- label_classes = []
18
- if (shared_helper.valid_heading_size?(label_size))
19
- label_classes << "govuk-label govuk-label--#{label_size}"
20
- else
21
- label_classes << "gem-c-search__label"
22
- end
23
-
24
20
  classes = %w[gem-c-search govuk-!-display-none-print]
25
21
  classes << (shared_helper.get_margin_top)
26
22
  classes << (shared_helper.get_margin_bottom) if local_assigns[:margin_bottom]
@@ -32,11 +28,31 @@
32
28
  classes << "gem-c-search--on-white"
33
29
  end
34
30
  classes << "gem-c-search--separate-label" if local_assigns.include?(:inline_label) or local_assigns.include?(:label_size)
31
+
32
+ label_classes = []
33
+ if (shared_helper.valid_heading_size?(label_size))
34
+ label_classes << "govuk-label govuk-label--#{label_size}"
35
+ else
36
+ label_classes << "gem-c-search__label"
37
+ end
38
+ label_classes << "govuk-!-margin-bottom-#{label_margin_bottom}" if [*1..9].include?(label_margin_bottom) and local_assigns.include?(:inline_label)
39
+
40
+ tag_label = capture do
41
+ tag.label({ for: id, class: label_classes }) do
42
+ label_text
43
+ end
44
+ end
35
45
  %>
36
46
 
37
47
  <div class="<%= classes.join(" ") %>" data-module="gem-toggle-input-class-on-focus">
38
- <%= tag.label({ for: id, class: label_classes }) do %>
39
- <%= label_text %>
48
+ <% if wrap_label_in_a_heading %>
49
+ <%= content_tag(shared_helper.get_heading_level, {
50
+ class: "govuk-!-margin-0",
51
+ }) do %>
52
+ <%= tag_label %>
53
+ <% end %>
54
+ <% else %>
55
+ <%= tag_label %>
40
56
  <% end %>
41
57
  <div class="gem-c-search__item-wrapper">
42
58
  <%= tag.input(
@@ -2,16 +2,18 @@
2
2
  component_helper = GovukPublishingComponents::Presenters::SinglePageNotificationButtonHelper.new(local_assigns)
3
3
  shared_helper = GovukPublishingComponents::Presenters::SharedHelper.new(local_assigns)
4
4
 
5
- wrapper_classes = %w(gem-c-single-page-notification-button govuk-!-display-none-print)
5
+ wrapper_classes = %w(govuk-!-display-none-print)
6
6
  wrapper_classes << shared_helper.get_margin_bottom
7
7
  %>
8
8
  <% button_text = capture do %>
9
9
  <svg class="gem-c-single-page-notification-button__icon" aria-hidden="true" xmlns="http://www.w3.org/2000/svg" height="18" width="18" viewBox="0 0 459.334 459.334"><path fill="currentColor" d="M177.216 404.514c-.001.12-.009.239-.009.359 0 30.078 24.383 54.461 54.461 54.461s54.461-24.383 54.461-54.461c0-.12-.008-.239-.009-.359H175.216zM403.549 336.438l-49.015-72.002v-89.83c0-60.581-43.144-111.079-100.381-122.459V24.485C254.152 10.963 243.19 0 229.667 0s-24.485 10.963-24.485 24.485v27.663c-57.237 11.381-100.381 61.879-100.381 122.459v89.83l-49.015 72.002a24.76 24.76 0 0 0 20.468 38.693H383.08a24.761 24.761 0 0 0 20.469-38.694z"/></svg><%= component_helper.button_text %>
10
10
  <% end %>
11
- <%= tag.form class: wrapper_classes, action: "/email/subscriptions/single-page/new", method: "POST", data: component_helper.data do %>
12
- <input type="hidden" name="base_path" value="<%= component_helper.base_path %>">
13
- <%= content_tag(:button, button_text, {
14
- class: "govuk-body-s gem-c-single-page-notification-button__submit",
15
- type: "submit",
16
- }) %>
11
+ <%= tag.div class: wrapper_classes, data: { module: "gem-track-click"} do %>
12
+ <%= tag.form class: "gem-c-single-page-notification-button", action: "/email/subscriptions/single-page/new", method: "POST", data: component_helper.data do %>
13
+ <input type="hidden" name="base_path" value="<%= component_helper.base_path %>">
14
+ <%= content_tag(:button, button_text, {
15
+ class: "govuk-body-s gem-c-single-page-notification-button__submit",
16
+ type: "submit",
17
+ }) %>
18
+ <% end %>
17
19
  <% end if component_helper.base_path %>
@@ -1,9 +1,12 @@
1
1
  <%
2
2
  description ||= nil
3
3
  title_id ||= "govuk-notification-banner-title-#{SecureRandom.hex(4)}"
4
+ shared_helper = GovukPublishingComponents::Presenters::SharedHelper.new(local_assigns)
5
+ classes = %w(gem-c-success-alert govuk-notification-banner govuk-notification-banner--success)
6
+ classes << shared_helper.get_margin_bottom if local_assigns[:margin_bottom]
4
7
  %>
5
8
 
6
- <%= tag.div class: "gem-c-success-alert govuk-notification-banner govuk-notification-banner--success",
9
+ <%= tag.div class: classes,
7
10
  role: "alert",
8
11
  tabindex: "-1",
9
12
  aria: {
@@ -38,6 +38,17 @@ examples:
38
38
  suggestion_link_text: "You can now apply for a permit online."
39
39
  suggestion_link_url: "/permit"
40
40
 
41
+ open_suggestion_link_in_new_tab:
42
+ description: |
43
+ When sending users to another online task, you don't want to completely hijack
44
+ their original flow on GOV.UK. Adding the option to open links in a new tab helps to address this.
45
+ Link text should tell the user that the link opens in a new tab.
46
+ Note: "(opens in a new tab)" is added to link text if the phrase isn't included.
47
+ data:
48
+ suggestion_link_text: "You can now apply for a permit online"
49
+ suggestion_link_url: "www.google.com/permit"
50
+ new_tab: true
51
+
41
52
  with_data_attributes:
42
53
  description: |
43
54
  This example shows the use of `suggestion_data_attributes` and
@@ -69,7 +69,7 @@ examples:
69
69
  <h2 class="govuk-heading-l">This is a title</h2>
70
70
  <p class="govuk-body">This is some body text with <a href="https://example.com">a link</a>.
71
71
  with_current_account_navigation:
72
- description: "The account layout renders with an account-specific nav to help users navigate different areas of their account. This flag is here to allow control over which option in the nav is highlighted as `current`. Valid options are currently `your-account`, `manage`, and `security`."
72
+ description: "The account layout renders with an account-specific nav to help users navigate different areas of their account. This flag is here to allow control over which option in the nav is highlighted as `current`. Valid options are currently `your-account` and `manage`."
73
73
  data:
74
74
  show_account_layout: true
75
75
  account_nav_location: "manage"
@@ -37,6 +37,7 @@ govuk_frontend_components:
37
37
  examples:
38
38
  default:
39
39
  data:
40
+ heading: How do you want to sign in?
40
41
  name: "radio-group"
41
42
  items:
42
43
  - value: "government-gateway"
@@ -45,6 +46,7 @@ examples:
45
46
  text: "Use GOV.UK Verify"
46
47
  with_small_radios:
47
48
  data:
49
+ heading: How do you want to sign in?
48
50
  name: "radio-group"
49
51
  small: true
50
52
  items:
@@ -52,9 +54,10 @@ examples:
52
54
  text: "Use Government Gateway"
53
55
  - value: "govuk-verify"
54
56
  text: "Use GOV.UK Verify"
55
- with_bold:
56
- description: Used to provide better contrast between long labels and hint text, Note that the `:or` option [is documented as a string due to a bug](https://github.com/alphagov/govuk_publishing_components/issues/102)
57
+ with_bold_labels:
58
+ description: Used to provide better contrast between long labels and hint text.
57
59
  data:
60
+ heading: How do you want to sign in?
58
61
  name: "radio-group-bold"
59
62
  items:
60
63
  - value: "government-gateway"
@@ -65,9 +68,10 @@ examples:
65
68
  text: "Use GOV.UK Verify"
66
69
  hint_text: "You'll have an account if you've already proved your identity with a certified company, such as the Post Office."
67
70
  bold: true
68
- with_bottom_margin:
71
+ with_custom_bottom_margin:
69
72
  description: The component accepts a number for margin bottom from `0` to `9` (`0px` to `60px`) using the [GOV.UK Frontend spacing scale](https://design-system.service.gov.uk/styles/spacing/#the-responsive-spacing-scale). It defaults to a margin bottom of `30px` (`6`).
70
73
  data:
74
+ heading: How do you want to sign in?
71
75
  name: "radio-group"
72
76
  margin_bottom: 9
73
77
  items:
@@ -77,6 +81,7 @@ examples:
77
81
  text: "Use GOV.UK Verify"
78
82
  with_hint_on_form_group:
79
83
  data:
84
+ heading: How do you want to sign in?
80
85
  name: "radio-group-error"
81
86
  id_prefix: "hint"
82
87
  hint: "You’ll need to prove your identity using one of the following methods"
@@ -97,10 +102,10 @@ examples:
97
102
  text: "Yes"
98
103
  - value: "no"
99
104
  text: "No"
100
- with_heading:
105
+ with_custom_heading_size:
101
106
  description: |
102
- By default, text supplied for the `legend` is wrapped inside a `h2`.
103
-
107
+ By default, text supplied for the `legend` is wrapped inside a `h2`.
108
+
104
109
  The font size of this heading can be changed using the `heading_size` option. Valid options are `s`, `m`, `l`, `xl`, defaulting to `m` if no option is passed.
105
110
  data:
106
111
  name: "radio-group-description"
@@ -113,10 +118,10 @@ examples:
113
118
  text: "Green"
114
119
  - value: "blue"
115
120
  text: "Blue"
116
- with_different_heading_level:
121
+ with_custom_heading_level:
117
122
  description: |
118
123
  By default, text supplied for the `legend` is wrapped inside a `h2`. This can be changed using the `heading_level` option.
119
-
124
+
120
125
  If `heading_level` is `1` and `heading_size` is not set, the text size will be `xl`.
121
126
  data:
122
127
  name: "radio-group-description"
@@ -129,22 +134,10 @@ examples:
129
134
  text: "Green"
130
135
  - value: "blue"
131
136
  text: "Blue"
132
- with_heading_and_hint:
133
- data:
134
- name: "radio-group-heading"
135
- heading: "What is your favourite colour?"
136
- hint: "If your favourite is not below, pick the colour closest to it."
137
- items:
138
- - value: "red"
139
- text: "Red"
140
- - value: "green"
141
- text: "Green"
142
- - value: "blue"
143
- text: "Blue"
144
- with_page_header_and_caption:
137
+ with_page_heading_and_caption:
145
138
  description: |
146
139
  A caption can be added using the `heading_caption` option. Captions will only be displayed if text for the heading option is present.
147
-
140
+
148
141
  The pattern is used across GOV.UK to show a high-level section that this page belongs to.
149
142
  data:
150
143
  name: "radio-group-heading"
@@ -167,7 +160,7 @@ examples:
167
160
  text: "Yes"
168
161
  - value: "no"
169
162
  text: "No"
170
- with_description_only:
163
+ with_description:
171
164
  data:
172
165
  name: "radio-group-description"
173
166
  heading: "What is your favourite colour?"
@@ -217,6 +210,7 @@ examples:
217
210
  text: "Blue"
218
211
  with_hint_text_on_radios:
219
212
  data:
213
+ heading: How do you want to sign in?
220
214
  name: "radio-group-hint-text"
221
215
  items:
222
216
  - value: "government-gateway"
@@ -227,6 +221,7 @@ examples:
227
221
  text: "Use GOV.UK Verify"
228
222
  with_checked_option:
229
223
  data:
224
+ heading: How do you want to sign in?
230
225
  name: "radio-group-checked"
231
226
  items:
232
227
  - value: "government-gateway"
@@ -236,15 +231,17 @@ examples:
236
231
  checked: true
237
232
  with_data_attributes:
238
233
  data:
234
+ heading: How do you want to sign in?
239
235
  name: "radio-group-data-attributes"
240
236
  items:
241
- - value: "cool-button"
242
- text: "Best button in town"
243
- data_attributes: { "contextual-guidance": "cool-buttons-guidance" }
244
- - value: "no-data-attributes-button"
245
- text: "Worst button in town"
237
+ - value: "government-gateway"
238
+ text: "Use Government Gateway"
239
+ - value: "govuk-verify"
240
+ text: "Use GOV.UK Verify"
241
+ data_attributes: { "contextual-guidance": "government-gateway" }
246
242
  with_custom_id_prefix:
247
243
  data:
244
+ heading: How do you want to sign in?
248
245
  id_prefix: 'custom'
249
246
  name: "radio-custom-id-prefix"
250
247
  items:
@@ -255,6 +252,7 @@ examples:
255
252
  with_or_divider:
256
253
  description: "See [related service manual guidance for this pattern](https://www.gov.uk/service-manual/design/writing-for-user-interfaces#ask-questions-that-users-can-understand)"
257
254
  data:
255
+ heading: How do you want to sign in?
258
256
  name: "radio-group-or-divider"
259
257
  items:
260
258
  - value: "government-gateway"
@@ -267,6 +265,7 @@ examples:
267
265
  extreme:
268
266
  description: 'Note that the `:or` option [is documented as a string due to a bug](https://github.com/alphagov/govuk_publishing_components/issues/102)'
269
267
  data:
268
+ heading: How do you want to sign in?
270
269
  id_prefix: 'extreme'
271
270
  name: "radio-custom-extreme"
272
271
  items:
@@ -289,6 +288,7 @@ examples:
289
288
  bold: true
290
289
  with_error_on_form_group:
291
290
  data:
291
+ heading: How do you want to sign in?
292
292
  name: "radio-group-error"
293
293
  id_prefix: "error"
294
294
  error_message: "Please select one option"
@@ -300,6 +300,7 @@ examples:
300
300
  with_error_and_hint_on_form_group:
301
301
  description: ""
302
302
  data:
303
+ heading: How do you want to sign in?
303
304
  name: "radio-group-error"
304
305
  id_prefix: "error"
305
306
  error_message: "Please select one option"
@@ -311,6 +312,7 @@ examples:
311
312
  text: "Use GOV.UK Verify"
312
313
  with_error_items_on_form_group:
313
314
  data:
315
+ heading: How do you want to sign in?
314
316
  name: "radio-group-error"
315
317
  id_prefix: "error"
316
318
  error_items:
@@ -325,6 +327,7 @@ examples:
325
327
  text: "Use GOV.UK Verify"
326
328
  conditional:
327
329
  data:
330
+ heading: How do you want to sign in?
328
331
  name: "radio-group-conditional"
329
332
  id_prefix: "conditional"
330
333
  items:
@@ -336,7 +339,8 @@ examples:
336
339
  conditional: "You’ll need to prove your identity using GOV.UK Verify"
337
340
  conditional_checked:
338
341
  data:
339
- name: "radio-group-conditional"
342
+ heading: How do you want to sign in?
343
+ name: "radio-group-conditional-checked"
340
344
  id_prefix: "conditional-checked"
341
345
  items:
342
346
  - value: "government-gateway"
@@ -348,6 +352,7 @@ examples:
348
352
  conditional: "You’ll need to prove your identity using GOV.UK Verify"
349
353
  tracking-url:
350
354
  data:
355
+ heading: How do you want to sign in?
351
356
  name: "radio-group-tracking-url"
352
357
  id_prefix: "tracking-url"
353
358
  items:
@@ -360,15 +365,17 @@ examples:
360
365
  inline:
361
366
  description: "When providing few options, radio buttons should be inline rather than stacked. We recommend this for two small options like yes and no, on and off"
362
367
  data:
368
+ heading: Have you changed your name?
363
369
  name: "inline-radios"
364
370
  inline: true
365
371
  items:
366
- - value: "on"
367
- text: "On"
368
- - value: "off"
369
- text: "Off"
372
+ - value: "yes"
373
+ text: "Yes"
374
+ - value: "no"
375
+ text: "No"
370
376
  with_custom_id_attribute:
371
377
  data:
378
+ heading: How do you want to sign in?
372
379
  name: "radio-group"
373
380
  id: "radio-group"
374
381
  items:
@@ -69,3 +69,28 @@ examples:
69
69
  Allows the label text size to be set to `xl`, `l`, `m`, or `s`. If this is set, then `inline_label` is automatically set to `false`.
70
70
  data:
71
71
  label_size: "xl"
72
+ wrap_label_inside_a_heading:
73
+ description: |
74
+ Puts the label inside a heading; heading level defaults to 2 if not set.
75
+
76
+ (The size of the label can still be set with `label_size` to appear more like a heading.)
77
+ data:
78
+ wrap_label_in_a_heading: true
79
+ heading_level: 1
80
+ with_margin_bottom:
81
+ description: |
82
+ Allows the spacing at the bottom of the component to be adjusted.
83
+
84
+ This accepts a number from 0 to 9 (0px to 60px) using the [GOV.UK Frontend spacing scale](https://design-system.service.gov.uk/styles/spacing/#the-responsive-spacing-scale). It defaults to having no margin bottom.
85
+ data:
86
+ margin_bottom: 9
87
+ with_margin_bottom_for_the_label:
88
+ description: |
89
+ Allows the spacing between the label and the input be adjusted.
90
+
91
+ Requires `inline_label` to be false.
92
+
93
+ This accepts a number from 0 to 9 (0px to 60px) using the [GOV.UK Frontend spacing scale](https://design-system.service.gov.uk/styles/spacing/#the-responsive-spacing-scale). It defaults to having no margin bottom.
94
+ data:
95
+ label_margin_bottom: 9
96
+ inline_label: false
@@ -37,3 +37,9 @@ examples:
37
37
  orci. Proin semper porttitor ipsum, vel maximus justo rutrum vel.
38
38
  Morbi volutpat facilisis libero. Donec posuere eget odio non egestas.
39
39
  Nullam sed neque quis turpis.
40
+ with_custom_margin_bottom:
41
+ description: |
42
+ The component accepts a number for margin bottom from 0 to 9 (0px to 60px) using the [GOV.UK Frontend spacing scale](https://design-system.service.gov.uk/styles/spacing/#the-responsive-spacing-scale). The default margins for the component are inherited from the [notification-banner](https://github.com/alphagov/govuk-frontend/blob/main/package/govuk/components/notification-banner/_index.scss) styles defined in the Design System.
43
+ data:
44
+ message: Message to alert the user to a successful action goes here
45
+ margin_bottom: 3
@@ -86,8 +86,10 @@ en:
86
86
  news_and_communications: News and communications
87
87
  statistics: Statistics
88
88
  worldwide: Worldwide
89
+ intervention:
90
+ accessible_link_text_suffix: " (opens in a new tab)"
89
91
  layout_footer:
90
- copyright_html: <a class="govuk-footer__link govuk-footer__copyright-logo" href="http://www.nationalarchives.gov.uk/information-management/re-using-public-sector-information/copyright-and-re-use/crown-copyright/">© Crown copyright</a>
92
+ copyright_html: <a class="govuk-footer__link govuk-footer__copyright-logo" href="https://www.nationalarchives.gov.uk/information-management/re-using-public-sector-information/uk-government-licensing-framework/crown-copyright/">© Crown copyright</a>
91
93
  licence_html: All content is available under the <a class="govuk-footer__link" href="https://www.nationalarchives.gov.uk/doc/open-government-licence/version/3/" rel="license">Open Government Licence v3.0</a>, except where otherwise stated
92
94
  support_links: Support links
93
95
  layout_for_public:
@@ -11,6 +11,7 @@ module GovukPublishingComponents
11
11
  :rel,
12
12
  :data_attributes,
13
13
  :margin_bottom,
14
+ :id,
14
15
  :inline_layout,
15
16
  :target,
16
17
  :type,
@@ -49,16 +50,39 @@ module GovukPublishingComponents
49
50
  @value = local_assigns[:value]
50
51
  @classes = local_assigns[:classes]
51
52
  @aria_label = local_assigns[:aria_label]
53
+ @info_text_id = "info-text-id-#{SecureRandom.hex(4)}"
54
+ @button_id = "button-id-#{SecureRandom.hex(4)}"
52
55
  end
53
56
 
54
57
  def link?
55
58
  href.present?
56
59
  end
57
60
 
61
+ def info_text?
62
+ info_text.present?
63
+ end
64
+
65
+ def aria_labelledby
66
+ if info_text?
67
+ text = "#{@button_id} "
68
+ text << @info_text_id
69
+ text
70
+ end
71
+ end
72
+
73
+ def info_text_options
74
+ options = { class: info_text_classes }
75
+ options[:aria] = { hidden: true } if info_text?
76
+ options[:id] = @info_text_id if info_text?
77
+ options
78
+ end
79
+
58
80
  def html_options
59
81
  options = { class: css_classes }
60
82
  options[:role] = "button" if link?
61
83
  options[:type] = button_type
84
+ options[:id] = @button_id if info_text?
85
+ options[:aria] = { labelledby: aria_labelledby }
62
86
  options[:rel] = rel if rel
63
87
  options[:data] = data_attributes if data_attributes
64
88
  options[:title] = title if title
@@ -1,10 +1,17 @@
1
1
  module GovukPublishingComponents
2
2
  module Presenters
3
3
  class InterventionHelper
4
- attr_reader :query_string
5
-
6
4
  def initialize(local_assigns)
5
+ @accessible_text_suffix = I18n.t("components.intervention.accessible_link_text_suffix")
7
6
  @query_string = local_assigns[:query_string]
7
+ @suggestion_link_text = local_assigns[:suggestion_link_text]
8
+ @suggestion_link_url = local_assigns[:suggestion_link_url]
9
+ end
10
+
11
+ def accessible_text
12
+ @suggestion_link_text << @accessible_text_suffix unless @suggestion_link_text.include?(@accessible_text_suffix)
13
+
14
+ @suggestion_link_text
8
15
  end
9
16
 
10
17
  def dismiss_link
@@ -14,6 +21,17 @@ module GovukPublishingComponents
14
21
  "?hide-intervention=true"
15
22
  end
16
23
  end
24
+
25
+ def security_attr
26
+ rel = "noopener noreferrer"
27
+ rel << " external" unless @suggestion_link_url.start_with?("/", "https://gov.uk", "https://www.gov.uk")
28
+
29
+ rel
30
+ end
31
+
32
+ private
33
+
34
+ attr_reader :accessible_text_suffix, :query_string, :suggestion_link_text, :suggestion_link_url
17
35
  end
18
36
  end
19
37
  end
@@ -14,15 +14,12 @@ module GovukPublishingComponents
14
14
  end
15
15
 
16
16
  def data
17
- module_names = %w[gem-track-click]
18
- module_names << "single-page-notification-button" if js_enhancement
19
-
20
- @data_attributes[:label] = base_path
17
+ @data_attributes[:track_label] = base_path
21
18
  # data-action for tracking should have the format of e.g. "Unsubscribe-button-top", or "Subscribe-button-bottom"
22
19
  # when button_location is not present data-action will fall back to "Unsubscribe-button"/"Subscribe-button"
23
- @data_attributes[:action] = [button_type, "button", button_location].compact.join("-")
24
- @data_attributes[:module] = module_names.join(" ")
25
- @data_attributes[:category] = "Single-page-notification-button"
20
+ @data_attributes[:track_action] = [button_type, "button", button_location].compact.join("-")
21
+ @data_attributes[:module] = "single-page-notification-button" if js_enhancement
22
+ @data_attributes[:track_category] = "Single-page-notification-button"
26
23
  # This attribute is passed through to the personalisation API to ensure when a new button is returned from the API, it has the same button_location
27
24
  @data_attributes[:button_location] = button_location
28
25
  @data_attributes
@@ -1,3 +1,3 @@
1
1
  module GovukPublishingComponents
2
- VERSION = "27.14.0".freeze
2
+ VERSION = "27.16.0".freeze
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: govuk_publishing_components
3
3
  version: !ruby/object:Gem::Version
4
- version: 27.14.0
4
+ version: 27.16.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - GOV.UK Dev
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-11-18 00:00:00.000000000 Z
11
+ date: 2021-12-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: govuk_app_config