govuk_publishing_components 35.13.1 → 35.13.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 +4 -4
- data/app/assets/javascripts/govuk_publishing_components/analytics-ga4/ga4-core.js +2 -1
- data/app/assets/javascripts/govuk_publishing_components/analytics-ga4/ga4-form-tracker.js +2 -1
- data/app/assets/javascripts/govuk_publishing_components/analytics-ga4/ga4-page-views.js +3 -0
- data/app/assets/javascripts/govuk_publishing_components/analytics-ga4/ga4-schemas.js +4 -1
- data/app/assets/javascripts/govuk_publishing_components/analytics-ga4/ga4-scroll-tracker.js +11 -0
- data/app/assets/javascripts/govuk_publishing_components/analytics-ga4/ga4-video-tracker.js +88 -0
- data/app/assets/javascripts/govuk_publishing_components/analytics-ga4.js +1 -0
- data/app/assets/javascripts/govuk_publishing_components/lib/govspeak/youtube-link-enhancement.js +7 -0
- data/app/assets/stylesheets/govuk_publishing_components/components/_select.scss +2 -1
- data/app/views/govuk_publishing_components/components/_attachment.html.erb +1 -3
- data/lib/govuk_publishing_components/version.rb +1 -1
- metadata +4 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d89a426d686fe0891582f8851ff7b27c57a457b838dccd81aa07a4868a9a9975
|
4
|
+
data.tar.gz: b267048c6e6bd91689fcedbad4e16835de62ff50aee68e94684ec4533ad7c5ab
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9dcd81b321da508d0475825320afa9674bfbac1bf1ef73f5ce32ccd66d0f5225e08b569a9819ca34672c13e919e154e02570b51109613e53d9bc79945a0f3482
|
7
|
+
data.tar.gz: 24bf0744fc140a4644c5b12d0de816869298a1927a25e3b1e126d0644b4bae78cd6ae5409d194e48465429e049517440321d39b12edd1ee783e717f54446659f
|
@@ -241,7 +241,8 @@ window.GOVUK.analyticsGa4 = window.GOVUK.analyticsGa4 || {};
|
|
241
241
|
|
242
242
|
try {
|
243
243
|
var ga4LinkData = JSON.parse(module.getAttribute('data-ga4-link'))
|
244
|
-
|
244
|
+
// use index_total if it already exists, otherwise calculate it and set it
|
245
|
+
ga4LinkData.index_total = ga4LinkData.index_total || totalLinks
|
245
246
|
module.setAttribute('data-ga4-link', JSON.stringify(ga4LinkData))
|
246
247
|
} catch (e) {
|
247
248
|
// if there's a problem with the config, don't start the tracker
|
@@ -84,12 +84,13 @@ window.GOVUK.Modules = window.GOVUK.Modules || {};
|
|
84
84
|
var labelText = input.label.innerText || input.label.textContent
|
85
85
|
var inputType = elem.getAttribute('type')
|
86
86
|
var inputNodename = elem.nodeName
|
87
|
+
var inputTypes = ['text', 'search', 'email', 'number']
|
87
88
|
|
88
89
|
if (inputType === 'checkbox' && elem.checked) {
|
89
90
|
input.answer = labelText
|
90
91
|
} else if (inputNodename === 'SELECT' && elem.options[elem.selectedIndex].value) {
|
91
92
|
input.answer = elem.options[elem.selectedIndex].text
|
92
|
-
} else if ((inputType
|
93
|
+
} else if (inputTypes.indexOf(inputType) !== -1 && elem.value) {
|
93
94
|
if (this.includeTextInputValues) {
|
94
95
|
var PIIRemover = new window.GOVUK.analyticsGa4.PIIRemover()
|
95
96
|
input.answer = PIIRemover.stripPIIWithOverride(elem.value, true, true)
|
@@ -29,6 +29,9 @@ window.GOVUK.analyticsGa4.analyticsModules = window.GOVUK.analyticsGa4.analytics
|
|
29
29
|
content_id: this.getMetaContent('content-id'),
|
30
30
|
|
31
31
|
browse_topic: this.getMetaContent('section'),
|
32
|
+
navigation_page_type: this.getMetaContent('navigation-page-type'),
|
33
|
+
navigation_list_type: this.getMetaContent('navigation-list-type'),
|
34
|
+
step_navs: this.getMetaContent('stepnavs'),
|
32
35
|
taxonomy_level1: this.getMetaContent('themes'),
|
33
36
|
taxonomy_main: this.getMetaContent('taxon-slug'),
|
34
37
|
taxonomy_main_id: this.getMetaContent('taxon-id'),
|
@@ -29,7 +29,10 @@
|
|
29
29
|
link_domain: this.undefined,
|
30
30
|
link_path_parts: this.undefined,
|
31
31
|
tool_name: this.undefined,
|
32
|
-
percent_scrolled: this.undefined
|
32
|
+
percent_scrolled: this.undefined,
|
33
|
+
video_current_time: this.undefined,
|
34
|
+
video_duration: this.undefined,
|
35
|
+
video_percent: this.undefined
|
33
36
|
}
|
34
37
|
}
|
35
38
|
}
|
@@ -60,6 +60,8 @@ window.GOVUK.Modules = window.GOVUK.Modules || {};
|
|
60
60
|
window.addEventListener('scroll', this.scrollEvent)
|
61
61
|
this.resizeEvent = this.onResize.bind(this)
|
62
62
|
window.addEventListener('resize', this.resizeEvent)
|
63
|
+
this.resetEvent = this.onReset.bind(this)
|
64
|
+
window.addEventListener('dynamic-page-update', this.resetEvent)
|
63
65
|
|
64
66
|
// check if the page height changes e.g. accordion opened
|
65
67
|
this.interval = window.setInterval(function () {
|
@@ -115,6 +117,7 @@ window.GOVUK.Modules = window.GOVUK.Modules || {};
|
|
115
117
|
data.type = node.eventData.type
|
116
118
|
// following will be undefined if tracking percentages
|
117
119
|
data.text = node.eventData.text
|
120
|
+
data.section = node.eventData.text
|
118
121
|
data.index = node.eventData.index
|
119
122
|
// following will be undefined if tracking headings
|
120
123
|
data.percent_scrolled = node.eventData.percent_scrolled
|
@@ -131,6 +134,14 @@ window.GOVUK.Modules = window.GOVUK.Modules || {};
|
|
131
134
|
return scroll <= top && (scroll + this.windowHeight) >= bottom
|
132
135
|
}
|
133
136
|
|
137
|
+
// if reset, we set all nodes 'alreadySeen' to false
|
138
|
+
// used when the page content is dynamically updated e.g. search
|
139
|
+
Ga4ScrollTracker.prototype.onReset = function () {
|
140
|
+
for (var i = 0; i < this.trackedNodes.length; i++) {
|
141
|
+
this.trackedNodes[i].alreadySeen = false
|
142
|
+
}
|
143
|
+
}
|
144
|
+
|
134
145
|
Ga4ScrollTracker.Heading = function (config) {
|
135
146
|
this.config = config
|
136
147
|
}
|
@@ -0,0 +1,88 @@
|
|
1
|
+
window.GOVUK = window.GOVUK || {}
|
2
|
+
window.GOVUK.analyticsGa4 = window.GOVUK.analyticsGa4 || {}
|
3
|
+
window.GOVUK.analyticsGa4.analyticsModules = window.GOVUK.analyticsGa4.analyticsModules || {};
|
4
|
+
|
5
|
+
(function (analyticsModules) {
|
6
|
+
'use strict'
|
7
|
+
|
8
|
+
var VideoTracker = {
|
9
|
+
init: function () {
|
10
|
+
this.handlers = {}
|
11
|
+
},
|
12
|
+
|
13
|
+
configureVideo: function (event) {
|
14
|
+
var player = event.target
|
15
|
+
var videoId = player.id
|
16
|
+
var duration = player.getDuration()
|
17
|
+
var percentages = [25, 50, 75]
|
18
|
+
|
19
|
+
for (var i = 0; i < percentages.length; i++) {
|
20
|
+
var percent = percentages[i]
|
21
|
+
var position = (duration / 100) * percent
|
22
|
+
this.handlers['video-' + videoId + '-' + percent + '-percent-begin'] = position
|
23
|
+
// interval is once a second, so end point must be at least one second beyond begin point
|
24
|
+
this.handlers['video-' + videoId + '-' + percent + '-percent-end'] = position + 2
|
25
|
+
}
|
26
|
+
},
|
27
|
+
|
28
|
+
trackVideo: function (event, state) {
|
29
|
+
var videoTracker = window.GOVUK.analyticsGa4.analyticsModules.VideoTracker
|
30
|
+
var player = event.target
|
31
|
+
var videoId = player.id
|
32
|
+
clearInterval(videoTracker.handlers['video-' + videoId])
|
33
|
+
|
34
|
+
if (state === 'VideoUnstarted') {
|
35
|
+
videoTracker.handlers['video-' + videoId] = setInterval(videoTracker.checkProgress, 1000, player)
|
36
|
+
videoTracker.sendData(player, 'start', 0) // VideoUnstarted seems to only happen the first time video is played
|
37
|
+
} else if (state === 'VideoPlaying') {
|
38
|
+
videoTracker.handlers['video-' + videoId] = setInterval(videoTracker.checkProgress, 1000, player)
|
39
|
+
} else if (state === 'VideoEnded') {
|
40
|
+
if (!videoTracker.handlers['video-' + videoId + '-100']) {
|
41
|
+
videoTracker.sendData(player, 'complete', 100)
|
42
|
+
videoTracker.handlers['video-' + videoId + '-100'] = true
|
43
|
+
}
|
44
|
+
}
|
45
|
+
},
|
46
|
+
|
47
|
+
checkProgress: function (player) {
|
48
|
+
var videoId = player.id
|
49
|
+
var videoTracker = window.GOVUK.analyticsGa4.analyticsModules.VideoTracker
|
50
|
+
var pos = player.getCurrentTime()
|
51
|
+
var percentages = [25, 50, 75]
|
52
|
+
|
53
|
+
// this looks really clunky and long hand
|
54
|
+
// but we have to do this once a second so doing the minimum before dropping out
|
55
|
+
// of an if statement is more efficient than combining all these statements into one
|
56
|
+
for (var i = 0; i < percentages.length; i++) {
|
57
|
+
if (pos >= videoTracker.handlers['video-' + videoId + '-' + percentages[i] + '-percent-begin']) {
|
58
|
+
if (pos < videoTracker.handlers['video-' + videoId + '-' + percentages[i] + '-percent-end']) {
|
59
|
+
if (!videoTracker.handlers['video-' + videoId + '-' + percentages[i]]) {
|
60
|
+
videoTracker.sendData(player, 'progress', percentages[i])
|
61
|
+
videoTracker.handlers['video-' + videoId + '-' + percentages[i]] = true
|
62
|
+
}
|
63
|
+
return
|
64
|
+
}
|
65
|
+
}
|
66
|
+
}
|
67
|
+
},
|
68
|
+
|
69
|
+
sendData: function (player, event, position) {
|
70
|
+
var data = {}
|
71
|
+
data.event_name = 'video_' + event
|
72
|
+
data.type = 'video'
|
73
|
+
data.url = player.getVideoUrl()
|
74
|
+
data.text = player.videoTitle
|
75
|
+
data.action = event
|
76
|
+
data.video_current_time = Math.round(player.getCurrentTime())
|
77
|
+
data.video_duration = Math.ceil(player.getDuration()) // number returned from the API varies, so round up
|
78
|
+
data.video_percent = position
|
79
|
+
|
80
|
+
var schemas = new window.GOVUK.analyticsGa4.Schemas()
|
81
|
+
var schema = schemas.mergeProperties(data, 'event_data')
|
82
|
+
|
83
|
+
window.GOVUK.analyticsGa4.core.sendData(schema)
|
84
|
+
}
|
85
|
+
}
|
86
|
+
|
87
|
+
analyticsModules.VideoTracker = VideoTracker
|
88
|
+
})(window.GOVUK.analyticsGa4.analyticsModules)
|
data/app/assets/javascripts/govuk_publishing_components/lib/govspeak/youtube-link-enhancement.js
CHANGED
@@ -116,6 +116,9 @@
|
|
116
116
|
// https://github.com/alphagov/govuk_publishing_components/pull/908#discussion_r302913995
|
117
117
|
var videoTitle = options.title
|
118
118
|
event.target.getIframe().title = videoTitle + ' (video)'
|
119
|
+
if (window.GOVUK.analyticsGa4.analyticsModules.VideoTracker) {
|
120
|
+
window.GOVUK.analyticsGa4.analyticsModules.VideoTracker.configureVideo(event)
|
121
|
+
}
|
119
122
|
},
|
120
123
|
onStateChange: function (event) {
|
121
124
|
var eventData = event.data
|
@@ -140,6 +143,10 @@
|
|
140
143
|
|
141
144
|
window.GOVUK.analytics.trackEvent(tracking.category, tracking.action, tracking.label)
|
142
145
|
}
|
146
|
+
|
147
|
+
if (window.GOVUK.analyticsGa4.analyticsModules.VideoTracker) {
|
148
|
+
window.GOVUK.analyticsGa4.analyticsModules.VideoTracker.trackVideo(event, states[eventData])
|
149
|
+
}
|
143
150
|
}
|
144
151
|
}
|
145
152
|
})
|
@@ -43,8 +43,6 @@
|
|
43
43
|
"HTML",
|
44
44
|
class: "gem-c-attachment__attribute",
|
45
45
|
)
|
46
|
-
data_attributes[:module] ? data_attributes[:module] << " ga4-link-tracker" : data_attributes[:module] = "ga4-link-tracker"
|
47
|
-
data_attributes[:ga4_link] = { "event_name": "navigation", "type": "attachment" }.to_json
|
48
46
|
when "external"
|
49
47
|
attributes << tag.span(
|
50
48
|
attachment.url,
|
@@ -53,7 +51,7 @@
|
|
53
51
|
end
|
54
52
|
|
55
53
|
%>
|
56
|
-
<%= tag.section class: class_names(container_class_names) do %>
|
54
|
+
<%= tag.section class: class_names(container_class_names), data: { module: "ga4-link-tracker", ga4_track_links_only: "", ga4_link: { 'event_name': 'navigation', 'type': 'attachment' } } do %>
|
57
55
|
<%= tag.div class: "gem-c-attachment__thumbnail" do %>
|
58
56
|
<%= link_to attachment.url,
|
59
57
|
class: "govuk-link",
|
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: 35.13.
|
4
|
+
version: 35.13.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: 2023-08-
|
11
|
+
date: 2023-08-15 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: govuk_app_config
|
@@ -451,6 +451,7 @@ files:
|
|
451
451
|
- app/assets/javascripts/govuk_publishing_components/analytics-ga4/ga4-scroll-tracker.js
|
452
452
|
- app/assets/javascripts/govuk_publishing_components/analytics-ga4/ga4-smart-answer-results-tracker.js
|
453
453
|
- app/assets/javascripts/govuk_publishing_components/analytics-ga4/ga4-specialist-link-tracker.js
|
454
|
+
- app/assets/javascripts/govuk_publishing_components/analytics-ga4/ga4-video-tracker.js
|
454
455
|
- app/assets/javascripts/govuk_publishing_components/analytics-ga4/init-ga4.js
|
455
456
|
- app/assets/javascripts/govuk_publishing_components/analytics-ga4/pii-remover.js
|
456
457
|
- app/assets/javascripts/govuk_publishing_components/analytics.js
|
@@ -1467,7 +1468,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
1467
1468
|
- !ruby/object:Gem::Version
|
1468
1469
|
version: '0'
|
1469
1470
|
requirements: []
|
1470
|
-
rubygems_version: 3.4.
|
1471
|
+
rubygems_version: 3.4.18
|
1471
1472
|
signing_key:
|
1472
1473
|
specification_version: 4
|
1473
1474
|
summary: A gem to document components in GOV.UK frontend applications
|