govuk_publishing_components 21.69.0 → 23.0.0

Sign up to get free protection for your applications and to get access to all the features.
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
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: d0b6878bc79789f43fcd57bed78e08d8ccfad470373eea7ee261de9acd93590f
4
- data.tar.gz: b36a5b8dc546bf6b0f450f23f67e2e55692b6f4c9b252ddf813e935e4ba90398
3
+ metadata.gz: 9a8babc3aada8e54a5f1f5b5af0c1806df1dbebb0d0905d259ae826a0d17b58a
4
+ data.tar.gz: '09903013a6e5a36e5ea2c732b0c12e33c73a4decd7f509ba54c2257257c465c8'
5
5
  SHA512:
6
- metadata.gz: 01e13c35538dd4930ce21e50f35dc1cc3f78c8b2a1c5fb795a1e2f7fec0fe415f951a9dbb5f73b0aed742cfef37c24a8d733b6003e1927e74724c46bba55e5a7
7
- data.tar.gz: 9bd4cb3fb94c2fab03c532002bc2a356774c6537f075a560c078bc599fb2fdfac2056fa029522f84be738b94c71dcf1fc3352da4cd2f361b052d376795d6fc55
6
+ metadata.gz: b192ee804bbf98365593eacdf0eeaaa99d47050421777d1ed5d70305ecd7adcbf74ff52b6234325c204a099cbd9288fcd78921f906701c0447676e91d79f025d
7
+ data.tar.gz: 8e31289db6b9f096191eed89dce37599edc713f8c4b5c78661fbd030ca370b6f83648ae8dc651265aa8dc2e3a4e3ceef7361f6b08cd59b1d73c1eb78d54c08c9
@@ -0,0 +1,16 @@
1
+ //= require govuk_publishing_components/lib/cookie-functions
2
+ //= require ./analytics/pii
3
+ //= require ./analytics/google-analytics-universal-tracker
4
+ //= require ./analytics/analytics
5
+ //= require ./analytics/print-intent
6
+ //= require ./analytics/error-tracking
7
+ //= require ./analytics/mailto-link-tracker
8
+ //= require ./analytics/external-link-tracker
9
+ //= require ./analytics/download-link-tracker
10
+ //= require ./analytics/auto-track-event
11
+ //= require ./analytics/page-content
12
+ //= require ./analytics/custom-dimensions
13
+ //= require ./analytics/static-analytics
14
+ //= require ./analytics/ecommerce
15
+ //= require ./analytics/init
16
+ //= require ./analytics/scroll-tracker
@@ -0,0 +1,85 @@
1
+ ;(function (global) {
2
+ 'use strict'
3
+
4
+ var GOVUK = global.GOVUK || {}
5
+ // For usage and initialisation see:
6
+ // https://github.com/alphagov/govuk_frontend_toolkit/blob/master/docs/analytics.md#create-an-analytics-tracker
7
+
8
+ var Analytics = function (config) {
9
+ this.pii = new GOVUK.Pii()
10
+ this.trackers = []
11
+ if (typeof config.universalId !== 'undefined') {
12
+ var universalId = config.universalId
13
+ delete config.universalId
14
+ this.trackers.push(new GOVUK.GoogleAnalyticsUniversalTracker(universalId, config))
15
+ }
16
+ }
17
+
18
+ var PIISafe = function (value) {
19
+ this.value = value
20
+ }
21
+ Analytics.PIISafe = PIISafe
22
+
23
+ Analytics.prototype.sendToTrackers = function (method, args) {
24
+ for (var i = 0, l = this.trackers.length; i < l; i++) {
25
+ var tracker = this.trackers[i]
26
+ var fn = tracker[method]
27
+
28
+ if (typeof fn === 'function') {
29
+ fn.apply(tracker, args)
30
+ }
31
+ }
32
+ }
33
+
34
+ Analytics.load = function () {
35
+ GOVUK.GoogleAnalyticsUniversalTracker.load()
36
+ }
37
+
38
+ Analytics.prototype.defaultPathForTrackPageview = function (location) {
39
+ // Get the page path including querystring, but ignoring the anchor
40
+ // as per default behaviour of GA (see: https://developers.google.com/analytics/devguides/collection/analyticsjs/pages#overview)
41
+ // we ignore the possibility of there being campaign variables in the
42
+ // anchor because we wouldn't know how to detect and parse them if they
43
+ // were present
44
+ return this.pii.stripPIIFromString(location.href.substring(location.origin.length).split('#')[0])
45
+ }
46
+
47
+ Analytics.prototype.trackPageview = function (path, title, options) {
48
+ arguments[0] = arguments[0] || this.defaultPathForTrackPageview(window.location)
49
+ if (arguments.length === 0) { arguments.length = 1 }
50
+ this.sendToTrackers('trackPageview', this.pii.stripPII(arguments))
51
+ }
52
+
53
+ /*
54
+ https://developers.google.com/analytics/devguides/collection/analyticsjs/events
55
+ options.label – Useful for categorizing events (eg nav buttons)
56
+ options.value – Values must be non-negative. Useful to pass counts
57
+ options.nonInteraction – Prevent event from impacting bounce rate
58
+ */
59
+ Analytics.prototype.trackEvent = function (category, action, options) {
60
+ this.sendToTrackers('trackEvent', this.pii.stripPII(arguments))
61
+ }
62
+
63
+ Analytics.prototype.trackShare = function (network, options) {
64
+ this.sendToTrackers('trackSocial', this.pii.stripPII([network, 'share', global.location.pathname, options]))
65
+ }
66
+
67
+ /*
68
+ The custom dimension index must be configured within the
69
+ Universal Analytics profile
70
+ */
71
+ Analytics.prototype.setDimension = function (index, value) {
72
+ this.sendToTrackers('setDimension', this.pii.stripPII(arguments))
73
+ }
74
+
75
+ /*
76
+ Add a beacon to track a page in another GA account on another domain.
77
+ */
78
+ Analytics.prototype.addLinkedTrackerDomain = function (trackerId, name, domain) {
79
+ this.sendToTrackers('addLinkedTrackerDomain', arguments)
80
+ }
81
+
82
+ GOVUK.Analytics = Analytics
83
+
84
+ global.GOVUK = GOVUK
85
+ })(window)
@@ -0,0 +1,30 @@
1
+ ;(function (global) {
2
+ 'use strict'
3
+
4
+ var GOVUK = global.GOVUK || {}
5
+ GOVUK.Modules = GOVUK.Modules || {}
6
+
7
+ GOVUK.Modules.AutoTrackEvent = function () {
8
+ this.start = function (element) {
9
+ var options = { nonInteraction: 1 } // automatic events shouldn't affect bounce rate
10
+ var category = element.data('track-category')
11
+ var action = element.data('track-action')
12
+ var label = element.data('track-label')
13
+ var value = element.data('track-value')
14
+
15
+ if (typeof label === 'string') {
16
+ options.label = label
17
+ }
18
+
19
+ if (value || value === 0) {
20
+ options.value = value
21
+ }
22
+
23
+ if (GOVUK.analytics && GOVUK.analytics.trackEvent) {
24
+ GOVUK.analytics.trackEvent(category, action, options)
25
+ }
26
+ }
27
+ }
28
+
29
+ global.GOVUK = GOVUK
30
+ })(window)
@@ -0,0 +1,120 @@
1
+ /* global GOVUK, $ */
2
+
3
+ (function () {
4
+ 'use strict'
5
+ window.GOVUK = window.GOVUK || {}
6
+ var CustomDimensions = function () { }
7
+
8
+ CustomDimensions.getAndExtendDefaultTrackingOptions = function (extraOptions) {
9
+ var trackingOptions = this.customDimensions()
10
+ return $.extend(trackingOptions, extraOptions)
11
+ }
12
+
13
+ CustomDimensions.customDimensions = function () {
14
+ var dimensions = $.extend(
15
+ {},
16
+ customDimensionsFromBrowser(),
17
+ customDimensionsFromMetaTags(),
18
+ customDimensionsFromDom(),
19
+ abTestCustomDimensions()
20
+ )
21
+
22
+ return $.each(dimensions, function (key, value) {
23
+ dimensions[key] = new GOVUK.Analytics.PIISafe(String(value))
24
+ })
25
+ }
26
+
27
+ function customDimensionsFromBrowser () {
28
+ var customDimensions = {
29
+ dimension15: window.httpStatusCode || 200,
30
+ dimension16: GOVUK.cookie('TLSversion') || 'unknown',
31
+ dimension95: GOVUK.analytics.gaClientId
32
+ }
33
+
34
+ if (window.devicePixelRatio) {
35
+ customDimensions.dimension11 = window.devicePixelRatio
36
+ }
37
+
38
+ return customDimensions
39
+ }
40
+
41
+ function customDimensionsFromMetaTags () {
42
+ var dimensionMappings = {
43
+ section: { dimension: 1 },
44
+ format: { dimension: 2 },
45
+ themes: { dimension: 3, defaultValue: 'other' },
46
+ 'content-id': { dimension: 4, defaultValue: '00000000-0000-0000-0000-000000000000' },
47
+ 'search-result-count': { dimension: 5 },
48
+ 'publishing-government': { dimension: 6 },
49
+ 'political-status': { dimension: 7 },
50
+ 'analytics:organisations': { dimension: 9 },
51
+ 'analytics:world-locations': { dimension: 10 },
52
+ withdrawn: { dimension: 12, defaultValue: 'not withdrawn' },
53
+ 'schema-name': { dimension: 17 },
54
+ 'rendering-application': { dimension: 20 },
55
+ 'search-autocomplete-status': { dimension: 21 },
56
+ 'navigation-legacy': { dimension: 30, defaultValue: 'none' },
57
+ 'navigation-page-type': { dimension: 32, defaultValue: 'none' },
58
+ 'taxon-slug': { dimension: 56, defaultValue: 'other' },
59
+ 'taxon-id': { dimension: 57, defaultValue: 'other' },
60
+ 'taxon-slugs': { dimension: 58, defaultValue: 'other' },
61
+ 'taxon-ids': { dimension: 59, defaultValue: 'other' },
62
+ 'content-has-history': { dimension: 39, defaultValue: 'false' },
63
+ 'publishing-application': { dimension: 89 },
64
+ stepnavs: { dimension: 96 },
65
+ 'relevant-result-shown': { dimension: 83 },
66
+ 'spelling-suggestion': { dimension: 81 }
67
+ }
68
+
69
+ var $metas = $('meta[name^="govuk:"]')
70
+ var customDimensions = {}
71
+ var tags = {}
72
+
73
+ $metas.each(function () {
74
+ var $meta = $(this)
75
+ var key = $meta.attr('name').split('govuk:')[1]
76
+
77
+ var dimension = dimensionMappings[key]
78
+ if (dimension) {
79
+ tags[key] = $meta.attr('content')
80
+ }
81
+ })
82
+
83
+ $.each(dimensionMappings, function (key, dimension) {
84
+ var value = tags[key] || dimension.defaultValue
85
+ if (typeof value !== 'undefined') {
86
+ customDimensions['dimension' + dimension.dimension] = value
87
+ }
88
+ })
89
+
90
+ return customDimensions
91
+ }
92
+
93
+ function customDimensionsFromDom () {
94
+ return {
95
+ dimension26: GOVUK.PageContent.getNumberOfSections(),
96
+ dimension27: GOVUK.PageContent.getNumberOfLinks(),
97
+ dimension23: $('main[id="content"]').attr('lang') || 'unknown',
98
+ dimension38: $('[data-module="global-bar"]').is(':visible') && 'Global Banner viewed'
99
+ }
100
+ }
101
+
102
+ function abTestCustomDimensions () {
103
+ var $abMetas = $('meta[name^="govuk:ab-test"]')
104
+ var customDimensions = {}
105
+
106
+ $abMetas.each(function () {
107
+ var $meta = $(this)
108
+ var dimension = parseInt($meta.data('analytics-dimension'))
109
+ var testNameAndBucket = $meta.attr('content')
110
+
111
+ if (dimension) {
112
+ customDimensions['dimension' + dimension] = testNameAndBucket
113
+ }
114
+ })
115
+
116
+ return customDimensions
117
+ }
118
+
119
+ GOVUK.CustomDimensions = CustomDimensions
120
+ })()
@@ -0,0 +1,41 @@
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.downloadLinkTracker = function (options) {
9
+ options = options || {}
10
+ var downloadLinkSelector = options.selector
11
+
12
+ if (downloadLinkSelector) {
13
+ $('body').on('click', downloadLinkSelector, trackDownload)
14
+ }
15
+
16
+ function trackDownload (evt) {
17
+ var $link = getLinkFromEvent(evt)
18
+ var href = $link.attr('href')
19
+ var evtOptions = { transport: 'beacon' }
20
+ var linkText = $.trim($link.text())
21
+
22
+ if (linkText) {
23
+ evtOptions.label = linkText
24
+ }
25
+
26
+ GOVUK.analytics.trackEvent('Download Link Clicked', href, evtOptions)
27
+ }
28
+
29
+ function getLinkFromEvent (evt) {
30
+ var $target = $(evt.target)
31
+
32
+ if (!$target.is('a')) {
33
+ $target = $target.parents('a')
34
+ }
35
+
36
+ return $target
37
+ }
38
+ }
39
+
40
+ global.GOVUK = GOVUK
41
+ })(window)
@@ -0,0 +1,101 @@
1
+ // https://developers.google.com/analytics/devguides/collection/analyticsjs/enhanced-ecommerce
2
+ /* global GOVUK, $, ga */
3
+
4
+ (function () {
5
+ 'use strict'
6
+ window.GOVUK = window.GOVUK || {}
7
+
8
+ var DEFAULT_LIST_TITLE = 'Site search results'
9
+ var DEFAULT_TRACK_CLICK_LABEL = 'Results'
10
+
11
+ var Ecommerce = function (config) {
12
+ this.init = function (element) {
13
+ // Limiting to 100 characters to avoid noise from extra longs search queries
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
30
+
31
+ addImpression(contentId, path, index + startPosition, searchQuery, listTitle, listSubheading, variant)
32
+ trackProductOnClick($ecommerceRow, contentId, path, index + startPosition, searchQuery, listTitle, listSubheading, variant, trackClickLabel)
33
+ })
34
+ }
35
+
36
+ function constructData (contentId, path, position, listTitle, listSubheading, searchQuery, variant) {
37
+ var data = {
38
+ position: position,
39
+ list: listTitle,
40
+ dimension71: searchQuery
41
+ }
42
+
43
+ if (listSubheading !== undefined) {
44
+ data.dimension94 = listSubheading
45
+ }
46
+
47
+ if (contentId !== undefined) {
48
+ data.id = contentId
49
+ }
50
+
51
+ if (path !== undefined) {
52
+ data.name = path
53
+ }
54
+
55
+ if (variant !== undefined) {
56
+ data.variant = variant
57
+ }
58
+
59
+ return data
60
+ }
61
+
62
+ function addImpression (contentId, path, position, searchQuery, listTitle, listSubheading, variant) {
63
+ if (contentId || path) {
64
+ var impressionData = constructData(contentId, path, position, listTitle, listSubheading, searchQuery, variant)
65
+ ga('ec:addImpression', impressionData)
66
+ }
67
+ }
68
+
69
+ function trackProductOnClick (row, contentId, path, position, searchQuery, listTitle, listSubheading, variant, trackClickLabel) {
70
+ row.click(function () {
71
+ if (contentId || path) {
72
+ var clickData = constructData(contentId, path, position, listTitle, listSubheading, searchQuery, variant)
73
+ ga('ec:addProduct', clickData)
74
+ }
75
+
76
+ ga('ec:setAction', 'click', { list: listTitle })
77
+ GOVUK.analytics.trackEvent('UX', 'click',
78
+ GOVUK.CustomDimensions.getAndExtendDefaultTrackingOptions({ label: trackClickLabel })
79
+ )
80
+ })
81
+ }
82
+ }
83
+
84
+ Ecommerce.ecLoaded = false
85
+ Ecommerce.start = function (element) {
86
+ if (!window.ga) { return }
87
+ element = element || $('[data-analytics-ecommerce]')
88
+ if (element.length > 0) {
89
+ if (!Ecommerce.ecLoaded) {
90
+ ga('require', 'ec')
91
+ Ecommerce.ecLoaded = true
92
+ }
93
+ element.each(function (index) {
94
+ var ecommerce = new Ecommerce()
95
+ ecommerce.init($(this))
96
+ })
97
+ }
98
+ }
99
+
100
+ GOVUK.Ecommerce = Ecommerce
101
+ })()
@@ -0,0 +1,51 @@
1
+ // Extension to track errors using google analytics as a data store.
2
+ ;(function (global) {
3
+ 'use strict'
4
+
5
+ var GOVUK = global.GOVUK || {}
6
+
7
+ GOVUK.analyticsPlugins = GOVUK.analyticsPlugins || {}
8
+
9
+ GOVUK.analyticsPlugins.error = function (options) {
10
+ options = options || {}
11
+ var filenameMustMatch = options.filenameMustMatch
12
+
13
+ var trackJavaScriptError = function (e) {
14
+ var errorFilename = e.filename
15
+ var errorSource = errorFilename + ': ' + e.lineno
16
+
17
+ if (shouldTrackThisError(errorFilename)) {
18
+ GOVUK.analytics.trackEvent('JavaScript Error', e.message, {
19
+ label: errorSource,
20
+ value: 1,
21
+ nonInteraction: true
22
+ })
23
+ }
24
+ }
25
+
26
+ function shouldTrackThisError (errorFilename) {
27
+ // Errors in page should always be tracked
28
+ // If there's no filename filter, everything is tracked
29
+ if (!errorFilename || !filenameMustMatch) {
30
+ return true
31
+ }
32
+
33
+ // If there's a filter and the error matches it, track it
34
+ if (filenameMustMatch.test(errorFilename)) {
35
+ return true
36
+ }
37
+
38
+ return false
39
+ }
40
+
41
+ if (global.addEventListener) {
42
+ global.addEventListener('error', trackJavaScriptError, false)
43
+ } else if (global.attachEvent) {
44
+ global.attachEvent('onerror', trackJavaScriptError)
45
+ } else {
46
+ global.onerror = trackJavaScriptError
47
+ }
48
+ }
49
+
50
+ global.GOVUK = GOVUK
51
+ })(window)