govuk_publishing_components 27.15.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.
- checksums.yaml +4 -4
- data/app/assets/javascripts/govuk_publishing_components/analytics/custom-dimensions.js +52 -26
- data/app/assets/javascripts/govuk_publishing_components/analytics/ecommerce.js +25 -25
- data/app/assets/stylesheets/govuk_publishing_components/components/_big-number.scss +15 -2
- data/app/views/govuk_publishing_components/components/_intervention.html.erb +21 -4
- data/app/views/govuk_publishing_components/components/_success_alert.html.erb +4 -1
- data/app/views/govuk_publishing_components/components/docs/intervention.yml +11 -0
- data/app/views/govuk_publishing_components/components/docs/success_alert.yml +6 -0
- data/config/locales/en.yml +2 -0
- data/lib/govuk_publishing_components/presenters/intervention_helper.rb +20 -2
- data/lib/govuk_publishing_components/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 586ea5662dfd4f3951905b244afc78556dc687bf861a05e11e56ff7d2ee172eb
|
4
|
+
data.tar.gz: eab6ea6544883bc5fa511f29e589d996eabae18a6661f0772ac45356668f5396
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f513e048959e7e81b753583f923772b590f5c4da1841e666f4131bc79e8dea9b8cd4571cba7bab859e0d1b4683a1b10ebaa17d56cd6d3ab3a4eff68090837a1c
|
7
|
+
data.tar.gz: 5f2d6aa1171a47b3074ba65b0dc5488b9269dc4f7781580df52d7d1c354559d19270bace849b39342c51e3e4ad9342a966354da39dabb6f52838de4c505f0f03
|
@@ -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
|
10
|
+
return this.extend(trackingOptions, extraOptions)
|
11
11
|
}
|
12
12
|
|
13
13
|
CustomDimensions.customDimensions = function () {
|
14
|
-
var dimensions =
|
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
|
-
|
23
|
-
dimensions[key] = new GOVUK.Analytics.PIISafe(String(
|
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
|
92
|
+
var metas = document.querySelectorAll("meta[name^='govuk']")
|
74
93
|
var customDimensions = {}
|
75
94
|
var tags = {}
|
76
95
|
|
77
|
-
|
78
|
-
var
|
79
|
-
var
|
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[
|
101
|
+
tags[metaKey] = meta.getAttribute('content')
|
84
102
|
}
|
85
|
-
}
|
103
|
+
}
|
86
104
|
|
87
|
-
|
88
|
-
var value = tags[key] ||
|
105
|
+
for (var key in dimensionMappings) {
|
106
|
+
var value = tags[key] || dimensionMappings[key].defaultValue
|
89
107
|
if (typeof value !== 'undefined') {
|
90
|
-
customDimensions['dimension' +
|
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:
|
102
|
-
dimension38:
|
127
|
+
dimension23: mainLang || 'unknown',
|
128
|
+
dimension38: globalBar && 'Global Banner viewed'
|
103
129
|
}
|
104
130
|
}
|
105
131
|
|
106
132
|
function abTestCustomDimensions () {
|
107
|
-
var
|
133
|
+
var abMetas = document.querySelectorAll("meta[name^='govuk:ab-test']")
|
108
134
|
var customDimensions = {}
|
109
135
|
|
110
|
-
|
111
|
-
var
|
112
|
-
var dimension = parseInt(
|
113
|
-
var testNameAndBucket =
|
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,
|
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.
|
16
|
-
var ecommerceRows = element.
|
17
|
-
var startPosition = parseInt(element.
|
18
|
-
var listTitle = element.
|
19
|
-
var variant = element.
|
20
|
-
var trackClickLabel = element.
|
21
|
-
|
22
|
-
ecommerceRows.
|
23
|
-
var
|
24
|
-
var listSubheading =
|
25
|
-
var contentId =
|
26
|
-
var path =
|
27
|
-
|
28
|
-
var indexOverride =
|
29
|
-
index = indexOverride ? parseInt(indexOverride, 10) - 1 :
|
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(
|
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
|
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 (
|
85
|
+
Ecommerce.start = function (elements) {
|
86
86
|
if (!window.ga) { return }
|
87
|
-
|
88
|
-
if (
|
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
|
-
|
93
|
+
for (var i = 0; i < elements.length; i++) {
|
94
94
|
var ecommerce = new Ecommerce()
|
95
|
-
ecommerce.init(
|
96
|
-
}
|
95
|
+
ecommerce.init(elements[i])
|
96
|
+
}
|
97
97
|
}
|
98
98
|
}
|
99
99
|
|
@@ -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
|
-
|
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
|
-
|
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
|
@@ -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
|
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
|
25
|
-
<%= tag.a suggestion_link_text,
|
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
|
|
@@ -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:
|
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
|
@@ -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
|
data/config/locales/en.yml
CHANGED
@@ -86,6 +86,8 @@ 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
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
|
@@ -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
|
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.
|
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
|
+
date: 2021-12-03 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: govuk_app_config
|