govuk_publishing_components 31.1.1 → 31.1.2

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: d8f89b321d55b2623a30beb4b0f53a54a6b5174bbcc1ba7f4e15097fbaf0e4b0
4
- data.tar.gz: db8e005e0bf1068eededf53799905388fe09ea2ca8bb0c5fe62de95e8347e3de
3
+ metadata.gz: 6228168725fc509c3b6313611fb75d4700597c685bb059c58ab4058173adfee5
4
+ data.tar.gz: 4ecefeead36ad35884f76edc0cb679e8449b300e08b95bf05ef9a1bd2ba9c7fe
5
5
  SHA512:
6
- metadata.gz: 29904c326d8df2559116c9adfaaed028ff593a371585a04c1409067b7d21221a937bdace0ab8904b421e744fdc2cd12dcefda6428b370c98dcd3defe7da0b03e
7
- data.tar.gz: 016de6ad1910ffa3563760f7dc8dd79102b4258bf7c56f0f1f72da4815925753252e7b3682e23e4b40942f9f3ca5536e3aeea7afc2fa8f070f8d913bd4bcf5ce
6
+ metadata.gz: 60b6aa5e85acf22e1bb663dc8e87d626f60ded689eb6809ec269868a4dba96bd1c41ae8766a30f8f97e27a5b56ef5044e65db4a2fee5814d150de6aa9731bd68
7
+ data.tar.gz: 06a0a8bd5ca1a14ff13bb0aec9869dba18d3e0e9942d48a712befde02c6738c7b62a2ca9e300f5c3ae320a86adfe507faa74598d74a76740b9da5fbcbf898200
@@ -22,6 +22,7 @@ window.GOVUK.analyticsGa4 = window.GOVUK.analyticsGa4 || {};
22
22
  } else {
23
23
  // initialise GTM
24
24
  window.dataLayer = window.dataLayer || []
25
+ window.dataLayer.push({ 'gtm.blocklist': ['customPixels', 'customScripts', 'html', 'nonGoogleScripts'] })
25
26
  window.dataLayer.push({ 'gtm.start': new Date().getTime(), event: 'gtm.js' })
26
27
 
27
28
  var auth = window.GOVUK.analyticsGa4.vars.auth || ''
@@ -36,7 +37,6 @@ window.GOVUK.analyticsGa4 = window.GOVUK.analyticsGa4 || {};
36
37
  this.googleSrc = 'https://www.googletagmanager.com/gtm.js?id=' + window.GOVUK.analyticsGa4.vars.id + auth + preview
37
38
  newScript.src = this.googleSrc
38
39
  firstScript.parentNode.insertBefore(newScript, firstScript)
39
- window.dataLayer.push({ 'gtm.blocklist': ['customPixels', 'customScripts', 'html', 'nonGoogleScripts'] })
40
40
  }
41
41
  },
42
42
 
@@ -44,17 +44,15 @@ window.GOVUK.analyticsGa4.analyticsModules = window.GOVUK.analyticsGa4.analytics
44
44
  return
45
45
  }
46
46
 
47
- var clickData = {}
48
47
  var href = element.getAttribute('href')
49
48
 
50
49
  if (!href) {
51
50
  return
52
51
  }
53
-
52
+ var clickData = {}
54
53
  var linkAttributes = element.getAttribute('data-ga4-link')
55
54
  if (linkAttributes) {
56
- linkAttributes = JSON.parse(linkAttributes)
57
- clickData = window.GOVUK.extendObject(clickData, linkAttributes)
55
+ clickData = JSON.parse(linkAttributes)
58
56
 
59
57
  /* Since external links can't be determined in the template, we use populated-via-js as a signal
60
58
  for our JavaScript to determine this value. */
@@ -62,41 +60,47 @@ window.GOVUK.analyticsGa4.analyticsModules = window.GOVUK.analyticsGa4.analytics
62
60
  clickData.external = this.isExternalLink(clickData.url) ? 'true' : 'false'
63
61
  }
64
62
 
65
- if (clickData.link_method === 'populated-via-js') {
66
- clickData.link_method = this.getClickType(event)
63
+ if (clickData.method === 'populated-via-js') {
64
+ clickData.method = this.getClickType(event)
67
65
  }
68
66
 
69
67
  if (clickData.index) {
70
- clickData.index = parseInt(linkAttributes.index)
68
+ clickData.index = parseInt(clickData.index)
71
69
  }
72
70
 
73
71
  if (clickData.index_total) {
74
- clickData.index_total = parseInt(linkAttributes.index_total)
72
+ clickData.index_total = parseInt(clickData.index_total)
75
73
  }
76
74
  } else if (this.isMailToLink(href)) {
77
75
  clickData.event_name = 'navigation'
78
76
  clickData.type = 'email'
79
77
  clickData.external = 'true'
80
78
  clickData.url = href
81
- clickData.text = element.textContent.trim()
82
- clickData.link_method = this.getClickType(event)
79
+ clickData.text = this.removeLinesAndExtraSpaces(element.textContent)
80
+ clickData.method = this.getClickType(event)
83
81
  } else if (this.isDownloadLink(href)) {
84
82
  clickData.event_name = 'file_download'
85
83
  clickData.type = this.isPreviewLink(href) ? 'preview' : 'generic download'
86
84
  clickData.external = this.isExternalLink(href) ? 'true' : 'false'
87
85
  clickData.url = href
88
- clickData.text = element.textContent.trim()
89
- clickData.link_method = this.getClickType(event)
86
+ clickData.text = this.removeLinesAndExtraSpaces(element.textContent)
87
+ clickData.method = this.getClickType(event)
90
88
  } else if (this.isExternalLink(href)) {
91
89
  clickData.event_name = 'navigation'
92
90
  clickData.type = 'generic link'
93
91
  clickData.external = 'true'
94
92
  clickData.url = href
95
- clickData.text = element.textContent.trim()
96
- clickData.link_method = this.getClickType(event)
93
+ clickData.text = this.removeLinesAndExtraSpaces(element.textContent)
94
+ clickData.method = this.getClickType(event)
97
95
  }
98
96
 
99
97
  if (Object.keys(clickData).length > 0) {
98
+ if (clickData.url) {
99
+ clickData.url = this.removeCrossDomainParams(clickData.url)
100
+ clickData.link_domain = this.populateLinkDomain(clickData.url)
101
+ clickData.link_path_parts = this.populateLinkPathParts(clickData.url)
102
+ }
103
+
100
104
  var schema = new window.GOVUK.analyticsGa4.Schemas().eventSchema()
101
105
  schema.event = 'event_data'
102
106
 
@@ -112,6 +116,49 @@ window.GOVUK.analyticsGa4.analyticsModules = window.GOVUK.analyticsGa4.analytics
112
116
  }
113
117
  },
114
118
 
119
+ populateLinkPathParts: function (href) {
120
+ var path = ''
121
+ if (this.hrefIsRelative(href) || this.isMailToLink(href)) {
122
+ path = href
123
+ } else {
124
+ // This regex matches a protocol and domain name at the start of a string such as https://www.gov.uk, http://gov.uk, //gov.uk
125
+ path = href.replace(/^(http:||https:)?(\/\/)([^\/]*)/, '') // eslint-disable-line no-useless-escape
126
+ }
127
+
128
+ if (path === '/' || path.length === 0) {
129
+ return
130
+ }
131
+
132
+ /*
133
+ This will create an object with 5 keys that are indexes ("1", "2", etc.)
134
+ The values will be each part of the link path split every 100 characters, or undefined.
135
+ For example: {"1": "/hello/world/etc...", "2": "/more/path/text...", "3": undefined, "4": undefined, "5": undefined}
136
+ Undefined values are needed to override the persistent object in GTM so that any values from old pushes are overwritten.
137
+ */
138
+ var parts = path.match(/.{1,100}/g)
139
+ var obj = {}
140
+ for (var i = 0; i < 5; i++) {
141
+ obj[(i + 1).toString()] = parts[i]
142
+ }
143
+ return obj
144
+ },
145
+
146
+ populateLinkDomain: function (href) {
147
+ // We always want mailto links to have an undefined link_domain
148
+ if (this.isMailToLink(href)) {
149
+ return undefined
150
+ }
151
+
152
+ if (this.hrefIsRelative(href)) {
153
+ return this.getProtocol() + '//' + this.getHostname()
154
+ } else {
155
+ // This regex matches a protocol and domain name at the start of a string such as https://www.gov.uk, http://gov.uk, //gov.uk
156
+ var domainRegex = /^(http:||https:)?(\/\/)([^\/]*)/ // eslint-disable-line no-useless-escape
157
+ var domain = domainRegex.exec(href)[0]
158
+ return domain
159
+ }
160
+ },
161
+
115
162
  appendDomainsWithoutWWW: function (domainsArrays) {
116
163
  // Add domains with www. removed, in case site hrefs are marked up without www. included.
117
164
  for (var i = 0; i < domainsArrays.length; i++) {
@@ -123,6 +170,13 @@ window.GOVUK.analyticsGa4.analyticsModules = window.GOVUK.analyticsGa4.analytics
123
170
  }
124
171
  },
125
172
 
173
+ removeLinesAndExtraSpaces: function (text) {
174
+ text = text.trim()
175
+ text = text.replace(/(\r\n|\n|\r)/gm, ' ') // Replace line breaks with 1 space
176
+ text = text.replace(/\s+/g, ' ') // Replace instances of 2+ spaces with 1 space
177
+ return text
178
+ },
179
+
126
180
  getClickType: function (event) {
127
181
  switch (event.type) {
128
182
  case 'click':
@@ -236,6 +290,10 @@ window.GOVUK.analyticsGa4.analyticsModules = window.GOVUK.analyticsGa4.analytics
236
290
  return string.substring(0, stringToFind.length) === stringToFind
237
291
  },
238
292
 
293
+ stringEndsWith: function (string, stringToFind) {
294
+ return string.substring(string.length - stringToFind.length, string.length) === stringToFind
295
+ },
296
+
239
297
  hrefIsRelative: function (href) {
240
298
  // Checks that a link is relative, but is not a protocol relative url
241
299
  return href[0] === '/' && href[1] !== '/'
@@ -247,6 +305,25 @@ window.GOVUK.analyticsGa4.analyticsModules = window.GOVUK.analyticsGa4.analytics
247
305
 
248
306
  getHostname: function () {
249
307
  return window.location.hostname
308
+ },
309
+
310
+ getProtocol: function () {
311
+ return window.location.protocol
312
+ },
313
+
314
+ removeCrossDomainParams: function (href) {
315
+ if (href.indexOf('_ga') !== -1 || href.indexOf('_gl') !== -1) {
316
+ // _ga & _gl are values needed for cross domain tracking, but we don't want them included in our click tracking.
317
+ href = href.replaceAll(/_g[al]=([^&]*)/g, '')
318
+
319
+ // The following code cleans up inconsistencies such as gov.uk/&&, gov.uk/?&hello=world, gov.uk/?, and gov.uk/&.
320
+ href = href.replaceAll(/(&&)+/g, '&')
321
+ href = href.replace('?&', '?')
322
+ if (this.stringEndsWith(href, '?') || this.stringEndsWith(href, '&')) {
323
+ href = href.substring(0, href.length - 1)
324
+ }
325
+ }
326
+ return href
250
327
  }
251
328
  }
252
329
 
@@ -21,7 +21,9 @@
21
21
  section: this.undefined,
22
22
  action: this.undefined,
23
23
  external: this.undefined,
24
- link_method: this.undefined
24
+ method: this.undefined,
25
+ link_domain: this.undefined,
26
+ link_path_parts: this.undefined
25
27
  }
26
28
  }
27
29
  }
@@ -49,7 +49,7 @@
49
49
  'index': index + 1,
50
50
  'index_total': links.length,
51
51
  'text': link[:icon],
52
- 'link_method': 'populated-via-js'
52
+ 'method': 'populated-via-js'
53
53
  }
54
54
  end
55
55
  if track_as_follow
@@ -61,7 +61,7 @@
61
61
  'text': link[:text],
62
62
  'external': 'populated-via-js',
63
63
  'url': link[:href],
64
- 'link_method': 'populated-via-js'
64
+ 'method': 'populated-via-js'
65
65
  }
66
66
  end
67
67
  %>
@@ -1,3 +1,3 @@
1
1
  module GovukPublishingComponents
2
- VERSION = "31.1.1".freeze
2
+ VERSION = "31.1.2".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: 31.1.1
4
+ version: 31.1.2
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: 2022-10-12 00:00:00.000000000 Z
11
+ date: 2022-10-18 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: govuk_app_config
@@ -1361,7 +1361,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
1361
1361
  - !ruby/object:Gem::Version
1362
1362
  version: '0'
1363
1363
  requirements: []
1364
- rubygems_version: 3.3.23
1364
+ rubygems_version: 3.3.24
1365
1365
  signing_key:
1366
1366
  specification_version: 4
1367
1367
  summary: A gem to document components in GOV.UK frontend applications