govuk_publishing_components 21.69.0 → 23.0.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 (36) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/javascripts/govuk_publishing_components/analytics.js +16 -0
  3. data/app/assets/javascripts/govuk_publishing_components/analytics/analytics.js +85 -0
  4. data/app/assets/javascripts/govuk_publishing_components/analytics/auto-track-event.js +30 -0
  5. data/app/assets/javascripts/govuk_publishing_components/analytics/custom-dimensions.js +120 -0
  6. data/app/assets/javascripts/govuk_publishing_components/analytics/download-link-tracker.js +41 -0
  7. data/app/assets/javascripts/govuk_publishing_components/analytics/ecommerce.js +101 -0
  8. data/app/assets/javascripts/govuk_publishing_components/analytics/error-tracking.js +51 -0
  9. data/app/assets/javascripts/govuk_publishing_components/analytics/external-link-tracker.js +56 -0
  10. data/app/assets/javascripts/govuk_publishing_components/analytics/google-analytics-universal-tracker.js +198 -0
  11. data/app/assets/javascripts/govuk_publishing_components/analytics/init.js.erb +50 -0
  12. data/app/assets/javascripts/govuk_publishing_components/analytics/mailto-link-tracker.js +38 -0
  13. data/app/assets/javascripts/govuk_publishing_components/analytics/page-content.js +129 -0
  14. data/app/assets/javascripts/govuk_publishing_components/analytics/pii.js +74 -0
  15. data/app/assets/javascripts/govuk_publishing_components/analytics/print-intent.js +39 -0
  16. data/app/assets/javascripts/govuk_publishing_components/analytics/scroll-tracker.js +513 -0
  17. data/app/assets/javascripts/govuk_publishing_components/analytics/static-analytics.js +132 -0
  18. data/app/assets/javascripts/govuk_publishing_components/lib/track-click.js +61 -0
  19. data/app/assets/stylesheets/govuk_publishing_components/components/_action-link.scss +4 -10
  20. data/app/views/govuk_publishing_components/components/_contents_list.html.erb +8 -13
  21. data/app/views/govuk_publishing_components/components/_govspeak.html.erb +8 -12
  22. data/app/views/govuk_publishing_components/components/_input.html.erb +17 -4
  23. data/app/views/govuk_publishing_components/components/_layout_for_public.html.erb +0 -1
  24. data/app/views/govuk_publishing_components/components/_layout_header.html.erb +6 -5
  25. data/app/views/govuk_publishing_components/components/_panel.html.erb +5 -2
  26. data/app/views/govuk_publishing_components/components/docs/contents_list.yml +0 -37
  27. data/app/views/govuk_publishing_components/components/docs/govspeak.yml +1 -6
  28. data/app/views/govuk_publishing_components/components/docs/input.yml +7 -3
  29. data/app/views/govuk_publishing_components/components/docs/layout_header.yml +0 -3
  30. data/app/views/govuk_publishing_components/components/docs/panel.yml +4 -0
  31. data/app/views/govuk_publishing_components/components/layout_header/_header_logo.html.erb +3 -1
  32. data/config/initializers/assets.rb +1 -0
  33. data/config/locales/et.yml +4 -0
  34. data/config/locales/fr.yml +4 -0
  35. data/lib/govuk_publishing_components/version.rb +1 -1
  36. metadata +21 -2
@@ -0,0 +1,56 @@
1
+ ;(function (global) {
2
+ 'use strict'
3
+
4
+ var $ = global.jQuery
5
+ var GOVUK = global.GOVUK || {}
6
+
7
+ GOVUK.analyticsPlugins = GOVUK.analyticsPlugins || {}
8
+ GOVUK.analyticsPlugins.externalLinkTracker = function (options) {
9
+ options = options || {}
10
+ var externalLinkUploadCustomDimension = options.externalLinkUploadCustomDimension
11
+ var currentHost = GOVUK.analyticsPlugins.externalLinkTracker.getHostname()
12
+ var externalLinkSelector = 'a[href^="http"]:not(a[href*="' + currentHost + '"])'
13
+
14
+ $('body').on('click', externalLinkSelector, trackClickEvent)
15
+
16
+ function trackClickEvent (evt) {
17
+ var $link = getLinkFromEvent(evt)
18
+ var options = { transport: 'beacon' }
19
+ var href = $link.attr('href')
20
+ var linkText = $.trim($link.text())
21
+
22
+ if (linkText) {
23
+ options.label = linkText
24
+ }
25
+
26
+ if (externalLinkUploadCustomDimension !== undefined) {
27
+ // This custom dimension will be used to duplicate the url information
28
+ // that we normally send in an "event action". This will be used to join
29
+ // up with a scheduled custom upload called "External Link Status".
30
+ // We can only join uploads on custom dimensions, not on `event actions`
31
+ // where we normally add the url info.
32
+ var externalLinkToJoinUploadOn = href
33
+
34
+ GOVUK.analytics.setDimension(externalLinkUploadCustomDimension, externalLinkToJoinUploadOn)
35
+ }
36
+
37
+ GOVUK.analytics.trackEvent('External Link Clicked', href, options)
38
+ }
39
+
40
+ function getLinkFromEvent (evt) {
41
+ var $target = $(evt.target)
42
+
43
+ if (!$target.is('a')) {
44
+ $target = $target.parents('a')
45
+ }
46
+
47
+ return $target
48
+ }
49
+ }
50
+
51
+ GOVUK.analyticsPlugins.externalLinkTracker.getHostname = function () {
52
+ return global.location.hostname
53
+ }
54
+
55
+ global.GOVUK = GOVUK
56
+ })(window)
@@ -0,0 +1,198 @@
1
+ ;(function (global) {
2
+ 'use strict'
3
+
4
+ var $ = global.jQuery
5
+ var GOVUK = global.GOVUK || {}
6
+ var pii
7
+
8
+ var GoogleAnalyticsUniversalTracker = function (trackingId, fieldsObject) {
9
+ pii = new GOVUK.Pii()
10
+
11
+ function configureProfile () {
12
+ // https://developers.google.com/analytics/devguides/collection/analyticsjs/command-queue-reference#create
13
+ sendToGa('create', trackingId, fieldsObject)
14
+ }
15
+
16
+ function anonymizeIp () {
17
+ // https://developers.google.com/analytics/devguides/collection/analyticsjs/advanced#anonymizeip
18
+ sendToGa('set', 'anonymizeIp', true)
19
+ }
20
+
21
+ function disableAdFeatures () {
22
+ // https://developers.google.com/analytics/devguides/collection/analyticsjs/field-reference#allowAdFeatures
23
+ sendToGa('set', 'allowAdFeatures', false)
24
+ }
25
+
26
+ function stripTitlePII () {
27
+ sendToGa('set', 'title', pii.stripPII(document.title))
28
+ }
29
+
30
+ function stripLocationPII () {
31
+ sendToGa('set', 'location', pii.stripPII(window.location.href))
32
+ }
33
+
34
+ // Support legacy cookieDomain param
35
+ if (typeof fieldsObject === 'string') {
36
+ fieldsObject = { cookieDomain: fieldsObject }
37
+ }
38
+
39
+ configureProfile()
40
+ anonymizeIp()
41
+ disableAdFeatures()
42
+ stripTitlePII()
43
+ stripLocationPII()
44
+ }
45
+
46
+ GoogleAnalyticsUniversalTracker.load = function () {
47
+ /* eslint-disable */
48
+ (function (i, s, o, g, r, a, m) { i['GoogleAnalyticsObject'] = r; i[r] = i[r] || function () {
49
+ (i[r].q = i[r].q || []).push(arguments) }, i[r].l = 1 * new Date(); a = s.createElement(o),
50
+ m = s.getElementsByTagName(o)[0]; a.async = 1; a.src = g; m.parentNode.insertBefore(a, m)
51
+ })(global, document, 'script', 'https://www.google-analytics.com/analytics.js', 'ga')
52
+ /* eslint-enable */
53
+ }
54
+
55
+ // https://developers.google.com/analytics/devguides/collection/analyticsjs/pages
56
+ GoogleAnalyticsUniversalTracker.prototype.trackPageview = function (path, title, options) {
57
+ var pageviewObject
58
+ var trackerName = ''
59
+
60
+ if (typeof path === 'string') {
61
+ pageviewObject = { page: path }
62
+ }
63
+
64
+ if (typeof title === 'string') {
65
+ pageviewObject = pageviewObject || {}
66
+ pageviewObject.title = title
67
+ }
68
+
69
+ // Set an options object for the pageview (e.g. transport, sessionControl)
70
+ // https://developers.google.com/analytics/devguides/collection/analyticsjs/field-reference#transport
71
+ if (typeof options === 'object') {
72
+ pageviewObject = $.extend(pageviewObject || {}, options)
73
+
74
+ // trackerName is optional
75
+ if (typeof options.trackerName === 'string') {
76
+ trackerName = options.trackerName + '.'
77
+ delete options.trackerName
78
+ }
79
+ }
80
+
81
+ if (!$.isEmptyObject(pageviewObject)) {
82
+ sendToGa(trackerName + 'send', 'pageview', pageviewObject)
83
+ } else {
84
+ sendToGa(trackerName + 'send', 'pageview')
85
+ }
86
+ }
87
+
88
+ // https://developers.google.com/analytics/devguides/collection/analyticsjs/events
89
+ GoogleAnalyticsUniversalTracker.prototype.trackEvent = function (category, action, options) {
90
+ options = options || {}
91
+ var value
92
+ var trackerName = ''
93
+ var evt = {
94
+ hitType: 'event',
95
+ eventCategory: category,
96
+ eventAction: action
97
+ }
98
+
99
+ // Label is optional
100
+ if (typeof options.label === 'string') {
101
+ evt.eventLabel = options.label
102
+ delete options.label
103
+ }
104
+
105
+ // Value is optional, but when used must be an
106
+ // integer, otherwise the event will be invalid
107
+ // and not logged
108
+ if (options.value || options.value === 0) {
109
+ value = parseInt(options.value, 10)
110
+ if (typeof value === 'number' && !isNaN(value)) {
111
+ options.eventValue = value
112
+ }
113
+ delete options.value
114
+ }
115
+
116
+ // trackerName is optional
117
+ if (typeof options.trackerName === 'string') {
118
+ trackerName = options.trackerName + '.'
119
+ delete options.trackerName
120
+ }
121
+
122
+ // Prevents an event from affecting bounce rate
123
+ // https://developers.google.com/analytics/devguides/collection/analyticsjs/events#implementation
124
+ if (options.nonInteraction) {
125
+ options.nonInteraction = 1
126
+ }
127
+
128
+ if (typeof options === 'object') {
129
+ $.extend(evt, options)
130
+ }
131
+
132
+ sendToGa(trackerName + 'send', evt)
133
+ }
134
+
135
+ /*
136
+ https://developers.google.com/analytics/devguides/collection/analyticsjs/social-interactions
137
+ network – The network on which the action occurs (e.g. Facebook, Twitter)
138
+ action – The type of action that happens (e.g. Like, Send, Tweet)
139
+ target – Specifies the target of a social interaction.
140
+ This value is typically a URL but can be any text.
141
+ */
142
+ GoogleAnalyticsUniversalTracker.prototype.trackSocial = function (network, action, target, options) {
143
+ var trackingOptions = {
144
+ hitType: 'social',
145
+ socialNetwork: network,
146
+ socialAction: action,
147
+ socialTarget: target
148
+ }
149
+
150
+ $.extend(trackingOptions, options)
151
+
152
+ sendToGa('send', trackingOptions)
153
+ }
154
+
155
+ /*
156
+ https://developers.google.com/analytics/devguides/collection/analyticsjs/cross-domain
157
+ trackerId - the UA account code to track the domain against
158
+ name - name for the tracker
159
+ domain - the domain to track (must be an array of strings)
160
+ sendPageView - optional argument which controls the legacy behaviour of sending a pageview
161
+ on creation of the linked domain.
162
+ */
163
+ GoogleAnalyticsUniversalTracker.prototype.addLinkedTrackerDomain = function (trackerId, name, domain, sendPageView) {
164
+ sendToGa('create',
165
+ trackerId,
166
+ 'auto',
167
+ { name: name })
168
+ // Load the plugin.
169
+ sendToGa(name + '.require', 'linker')
170
+
171
+ // Define which domains to autoLink.
172
+ sendToGa(name + '.linker:autoLink', domain)
173
+
174
+ sendToGa(name + '.set', 'anonymizeIp', true)
175
+ sendToGa(name + '.set', 'allowAdFeatures', false)
176
+ sendToGa(name + '.set', 'title', pii.stripPII(document.title))
177
+ sendToGa(name + '.set', 'location', pii.stripPII(window.location.href))
178
+
179
+ if (typeof sendPageView === 'undefined' || sendPageView === true) {
180
+ sendToGa(name + '.send', 'pageview')
181
+ }
182
+ }
183
+
184
+ // https://developers.google.com/analytics/devguides/collection/analyticsjs/custom-dims-mets
185
+ GoogleAnalyticsUniversalTracker.prototype.setDimension = function (index, value) {
186
+ sendToGa('set', 'dimension' + index, String(value))
187
+ }
188
+
189
+ function sendToGa () {
190
+ if (typeof global.ga === 'function') {
191
+ global.ga.apply(global, arguments)
192
+ }
193
+ }
194
+
195
+ GOVUK.GoogleAnalyticsUniversalTracker = GoogleAnalyticsUniversalTracker
196
+
197
+ global.GOVUK = GOVUK
198
+ })(window)
@@ -0,0 +1,50 @@
1
+ var analyticsInit = function(linkedDomains) {
2
+ "use strict";
3
+
4
+ var consentCookie = window.GOVUK.getConsentCookie();
5
+
6
+ var dummyAnalytics = {
7
+ addLinkedTrackerDomain: function(){},
8
+ setDimension: function(){},
9
+ setOptionsForNextPageView: function(){},
10
+ trackEvent: function(){},
11
+ trackPageview: function(){},
12
+ trackShare: function(){},
13
+ };
14
+
15
+ // Disable analytics by default
16
+ // This will be reversed below, if the consent cookie says usage cookies are allowed
17
+ window['ga-disable-UA-26179049-1'] = true;
18
+
19
+ if (consentCookie && consentCookie["usage"]) {
20
+ window['ga-disable-UA-26179049-1'] = false;
21
+
22
+ // Load Google Analytics libraries
23
+ GOVUK.StaticAnalytics.load();
24
+
25
+ // Use document.domain in dev, preview and staging so that tracking works
26
+ // Otherwise explicitly set the domain as www.gov.uk (and not gov.uk).
27
+ var cookieDomain = (document.domain == 'www.gov.uk') ? '.www.gov.uk' : document.domain;
28
+
29
+ var universalId = "UA-26179049-1";
30
+ var secondaryId = "UA-145652997-1";
31
+
32
+ // Configure profiles, setup custom vars, track initial pageview
33
+ var analytics = new GOVUK.StaticAnalytics({
34
+ universalId: universalId,
35
+ cookieDomain: cookieDomain,
36
+ allowLinker: true
37
+ });
38
+
39
+ // Make interface public for virtual pageviews and events
40
+ GOVUK.analytics = analytics;
41
+
42
+ if (linkedDomains && linkedDomains.length > 0) {
43
+ GOVUK.analytics.addLinkedTrackerDomain(secondaryId, 'govuk', linkedDomains);
44
+ }
45
+ } else {
46
+ GOVUK.analytics = dummyAnalytics
47
+ }
48
+ }
49
+
50
+ window.GOVUK.analyticsInit = analyticsInit
@@ -0,0 +1,38 @@
1
+ ;(function (global) {
2
+ 'use strict'
3
+
4
+ var $ = global.jQuery
5
+ var GOVUK = global.GOVUK || {}
6
+
7
+ GOVUK.analyticsPlugins = GOVUK.analyticsPlugins || {}
8
+ GOVUK.analyticsPlugins.mailtoLinkTracker = function () {
9
+ var mailtoLinkSelector = 'a[href^="mailto:"]'
10
+
11
+ $('body').on('click', mailtoLinkSelector, trackClickEvent)
12
+
13
+ function trackClickEvent (evt) {
14
+ var $link = getLinkFromEvent(evt)
15
+ var options = { transport: 'beacon' }
16
+ var href = $link.attr('href')
17
+ var linkText = $.trim($link.text())
18
+
19
+ if (linkText) {
20
+ options.label = linkText
21
+ }
22
+
23
+ GOVUK.analytics.trackEvent('Mailto Link Clicked', href, options)
24
+ }
25
+
26
+ function getLinkFromEvent (evt) {
27
+ var $target = $(evt.target)
28
+
29
+ if (!$target.is('a')) {
30
+ $target = $target.parents('a')
31
+ }
32
+
33
+ return $target
34
+ }
35
+ }
36
+
37
+ global.GOVUK = GOVUK
38
+ })(window)
@@ -0,0 +1,129 @@
1
+ /* global GOVUK, $ */
2
+
3
+ (function () {
4
+ 'use strict'
5
+ window.GOVUK = window.GOVUK || {}
6
+ var PageContent = function () { }
7
+
8
+ PageContent.getNumberOfSections = function () {
9
+ switch (true) {
10
+ case isNavigationGridPage():
11
+ return 1 + $('.parent-topic-contents').length
12
+ case isNavigationAccordionPage():
13
+ return $('[data-track-count="accordionSection"]').length
14
+ case isDocumentCollectionPage():
15
+ return $('.document-collection .group-title').length
16
+ case isMainstreamBrowsePage():
17
+ return $('#subsection ul:visible').length || $('#section ul').length
18
+ case isTopicPage():
19
+ return $('.topics-page nav.index-list').length
20
+ case isPolicyAreaPage():
21
+ return $('.topic section h1.label').length
22
+ case isFinderPage():
23
+ case isWhitehallFinderPage():
24
+ case isNavigationLeafPage():
25
+ // The default in finders should be one, so it's comparable with A-Z
26
+ // lists in other navigation pages. Request made by performance
27
+ // analysts.
28
+ return 1
29
+ default:
30
+ // It's a content page, not a "finding" page
31
+ var sidebarSections = $('[data-track-count="sidebarRelatedItemSection"]').length
32
+ var sidebarTaxons = $('[data-track-count="sidebarTaxonSection"]').length
33
+
34
+ return sidebarSections || sidebarTaxons
35
+ }
36
+ }
37
+
38
+ PageContent.getNumberOfLinks = function () {
39
+ switch (true) {
40
+ case isNavigationGridPage():
41
+ return $('a[data-track-category="navGridLinkClicked"]').length +
42
+ $('a[data-track-category="navGridLeafLinkClicked"]').length
43
+ case isNavigationAccordionPage():
44
+ return $('a[data-track-category="navAccordionLinkClicked"]').length
45
+ case isNavigationLeafPage():
46
+ return $('a[data-track-category="navLeafLinkClicked"]').length
47
+ case isDocumentCollectionPage():
48
+ return $('.document-collection .group-document-list li a').length
49
+ case isMainstreamBrowsePage():
50
+ return $('#subsection ul a:visible').length ||
51
+ $('#section ul a').length
52
+ case isTopicPage():
53
+ return $('.topics-page .index-list ul a').length ||
54
+ $('.topics-page .topics ul a').length
55
+ case isPolicyAreaPage():
56
+ return $('section.document-block a').length +
57
+ $('section .collection-list h2 a').length
58
+ case isWhitehallFinderPage():
59
+ return $('.document-list .document-row h3 a').length
60
+ case isFinderPage():
61
+ return $('.finder-frontend-content li.document a').length
62
+ default:
63
+ // It's a content page, not a "finding" page, count related links
64
+ return $('a[data-track-category="relatedLinkClicked"]').length
65
+ }
66
+ }
67
+
68
+ function getRenderingApplication () {
69
+ return $('meta[name="govuk:rendering-application"]').attr('content')
70
+ };
71
+
72
+ function getFormat () {
73
+ return $('meta[name="govuk:format"]').attr('content')
74
+ };
75
+
76
+ function getNavigationPageType () {
77
+ return $('meta[name="govuk:navigation-page-type"]').attr('content')
78
+ };
79
+
80
+ function isNavigationGridPage () {
81
+ return getRenderingApplication() === 'collections' &&
82
+ getFormat() === 'taxon' &&
83
+ getNavigationPageType() === 'grid'
84
+ };
85
+
86
+ function isNavigationAccordionPage () {
87
+ return getRenderingApplication() === 'collections' &&
88
+ getFormat() === 'taxon' &&
89
+ getNavigationPageType() === 'accordion'
90
+ };
91
+
92
+ function isNavigationLeafPage () {
93
+ return getRenderingApplication() === 'collections' &&
94
+ getFormat() === 'taxon' &&
95
+ getNavigationPageType() === 'leaf'
96
+ };
97
+
98
+ function isMainstreamBrowsePage () {
99
+ return getRenderingApplication() === 'collections' &&
100
+ getFormat() === 'mainstream_browse_page'
101
+ };
102
+
103
+ function isTopicPage () {
104
+ return getRenderingApplication() === 'collections' &&
105
+ getFormat() === 'topic'
106
+ };
107
+
108
+ function isPolicyAreaPage () {
109
+ return getRenderingApplication() === 'whitehall' &&
110
+ getFormat() === 'placeholder_policy_area'
111
+ };
112
+
113
+ function isDocumentCollectionPage () {
114
+ return getRenderingApplication() === 'government-frontend' &&
115
+ getFormat() === 'document_collection'
116
+ };
117
+
118
+ function isFinderPage () {
119
+ return getRenderingApplication() === 'finder-frontend' &&
120
+ getFormat() === 'finder'
121
+ };
122
+
123
+ function isWhitehallFinderPage () {
124
+ return getRenderingApplication() === 'whitehall' &&
125
+ getFormat() === 'finder'
126
+ };
127
+
128
+ GOVUK.PageContent = PageContent
129
+ })()