govuk_publishing_components 21.68.1 → 23.2.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (47) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/images/govuk_publishing_components/action-link-arrow--simple-light.png +0 -0
  3. data/app/assets/images/govuk_publishing_components/action-link-arrow--simple-light.svg +4 -0
  4. data/app/assets/javascripts/govuk_publishing_components/analytics.js +16 -0
  5. data/app/assets/javascripts/govuk_publishing_components/analytics/analytics.js +85 -0
  6. data/app/assets/javascripts/govuk_publishing_components/analytics/auto-track-event.js +30 -0
  7. data/app/assets/javascripts/govuk_publishing_components/analytics/custom-dimensions.js +120 -0
  8. data/app/assets/javascripts/govuk_publishing_components/analytics/download-link-tracker.js +41 -0
  9. data/app/assets/javascripts/govuk_publishing_components/analytics/ecommerce.js +101 -0
  10. data/app/assets/javascripts/govuk_publishing_components/analytics/error-tracking.js +51 -0
  11. data/app/assets/javascripts/govuk_publishing_components/analytics/external-link-tracker.js +56 -0
  12. data/app/assets/javascripts/govuk_publishing_components/analytics/google-analytics-universal-tracker.js +198 -0
  13. data/app/assets/javascripts/govuk_publishing_components/analytics/init.js +48 -0
  14. data/app/assets/javascripts/govuk_publishing_components/analytics/mailto-link-tracker.js +38 -0
  15. data/app/assets/javascripts/govuk_publishing_components/analytics/page-content.js +129 -0
  16. data/app/assets/javascripts/govuk_publishing_components/analytics/pii.js +74 -0
  17. data/app/assets/javascripts/govuk_publishing_components/analytics/print-intent.js +39 -0
  18. data/app/assets/javascripts/govuk_publishing_components/analytics/scroll-tracker.js +513 -0
  19. data/app/assets/javascripts/govuk_publishing_components/analytics/static-analytics.js +132 -0
  20. data/app/assets/javascripts/govuk_publishing_components/lib/track-click.js +61 -0
  21. data/app/assets/stylesheets/govuk_publishing_components/components/_action-link.scss +20 -10
  22. data/app/assets/stylesheets/govuk_publishing_components/components/_layout-header.scss +5 -0
  23. data/app/assets/stylesheets/govuk_publishing_components/components/_print-link.scss +23 -20
  24. data/app/assets/stylesheets/govuk_publishing_components/components/_search.scss +7 -1
  25. data/app/assets/stylesheets/govuk_publishing_components/components/_subscription-links.scss +1 -1
  26. data/app/assets/stylesheets/govuk_publishing_components/components/print/_govspeak.scss +4 -0
  27. data/app/views/govuk_publishing_components/components/_action_link.html.erb +2 -0
  28. data/app/views/govuk_publishing_components/components/_contents_list.html.erb +8 -13
  29. data/app/views/govuk_publishing_components/components/_govspeak.html.erb +8 -12
  30. data/app/views/govuk_publishing_components/components/_input.html.erb +17 -4
  31. data/app/views/govuk_publishing_components/components/_layout_for_public.html.erb +0 -1
  32. data/app/views/govuk_publishing_components/components/_layout_header.html.erb +6 -5
  33. data/app/views/govuk_publishing_components/components/_panel.html.erb +5 -2
  34. data/app/views/govuk_publishing_components/components/_print_link.html.erb +26 -11
  35. data/app/views/govuk_publishing_components/components/docs/action_link.yml +8 -0
  36. data/app/views/govuk_publishing_components/components/docs/contents_list.yml +0 -37
  37. data/app/views/govuk_publishing_components/components/docs/govspeak.yml +1 -6
  38. data/app/views/govuk_publishing_components/components/docs/input.yml +7 -3
  39. data/app/views/govuk_publishing_components/components/docs/layout_header.yml +0 -3
  40. data/app/views/govuk_publishing_components/components/docs/panel.yml +4 -0
  41. data/app/views/govuk_publishing_components/components/docs/print_link.yml +5 -0
  42. data/app/views/govuk_publishing_components/components/layout_header/_header_logo.html.erb +3 -1
  43. data/config/initializers/assets.rb +1 -0
  44. data/config/locales/et.yml +4 -0
  45. data/config/locales/fr.yml +4 -0
  46. data/lib/govuk_publishing_components/version.rb +1 -1
  47. metadata +23 -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,48 @@
1
+ var analyticsInit = function (gaProperty, gaPropertyCrossDomain, 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
+ var disabler = 'ga-disable-' + gaProperty
18
+ window[disabler] = true
19
+
20
+ if (consentCookie && consentCookie.usage) {
21
+ window[disabler] = false
22
+
23
+ // Load Google Analytics libraries
24
+ window.GOVUK.StaticAnalytics.load()
25
+
26
+ // Use document.domain in dev, preview and staging so that tracking works
27
+ // Otherwise explicitly set the domain as www.gov.uk (and not gov.uk).
28
+ var cookieDomain = (document.domain === 'www.gov.uk') ? '.www.gov.uk' : document.domain
29
+
30
+ // Configure profiles, setup custom vars, track initial pageview
31
+ var analytics = new window.GOVUK.StaticAnalytics({
32
+ universalId: gaProperty,
33
+ cookieDomain: cookieDomain,
34
+ allowLinker: true
35
+ })
36
+
37
+ // Make interface public for virtual pageviews and events
38
+ window.GOVUK.analytics = analytics
39
+
40
+ if (linkedDomains && linkedDomains.length > 0) {
41
+ window.GOVUK.analytics.addLinkedTrackerDomain(gaPropertyCrossDomain, 'govuk', linkedDomains)
42
+ }
43
+ } else {
44
+ window.GOVUK.analytics = dummyAnalytics
45
+ }
46
+ }
47
+
48
+ 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
+ })()