Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
80 changes: 75 additions & 5 deletions src/js/04-segment-analytics.js
Original file line number Diff line number Diff line change
@@ -1,20 +1,83 @@
;(function () {
'use strict'

// Get common properties from digitalData
const getCommonProperties = () => {
return window.digitalData?.page?.pageInfo?.segment?.commonProperties || {}
}

/**
* Track events with IBM Segment Common Schema
* @param {string} name - Event name (e.g., "CTA Clicked", "UI Interaction")
* @param {object} payload - Event properties
*/
const trackEvent = (name, payload) => {
if (window.analytics) {
window.analytics.track(name, payload || {})
// Merge common properties with event-specific properties
const eventProperties = {
...getCommonProperties(),
...(payload || {}),
}
window.analytics.track(name, eventProperties)
}
}

/**
* Track link clicks with IBM Segment Common Schema
* @param {HTMLElement} element - The link element
* @param {string} name - Event name
* @param {object} payload - Event properties
*/
const trackLinkEvent = (element, name, payload) => {
if (window.analytics) {
window.analytics.trackLink(element, name, payload || {})
const eventProperties = {
...getCommonProperties(),
...(payload || {}),
}
window.analytics.trackLink(element, name, eventProperties)
}
}

// Add click event listeners to all elements with a data-track attribute.
if (window.analytics) {
/**
* Initialize data-attribute tracking for declarative analytics
* Supports both legacy data-track and new IBM schema patterns
*/
const initDataAttributeTracking = () => {
// Handle data-event attributes (IBM Schema pattern)
const handleClick = (event) => {
const target = event.target
const trackingElement = target.closest('[data-event]')

if (!trackingElement) return

const eventName = trackingElement.dataset.event
if (!eventName) return

const properties = {}

// Extract all data attributes and map to event properties
Object.keys(trackingElement.dataset).forEach((key) => {
if (key !== 'event') {
// Map to IBM Segment property names (preserve exact casing per schema)
let propertyKey = key

// Handle special IBM property mappings
if (key === 'cta') propertyKey = 'CTA'
else if (key === 'elementId') propertyKey = 'elementId'
else if (key === 'topLevel') propertyKey = 'topLevel'
else if (key === 'subLevel') propertyKey = 'subLevel'

properties[propertyKey] = trackingElement.dataset[key]
}
})

trackEvent(eventName, properties)
}

document.removeEventListener('click', handleClick)
document.addEventListener('click', handleClick)

// Legacy data-track support for backwards compatibility
const trackedLinkElements = document.querySelectorAll('a[data-track]')
const trackedElements = document.querySelectorAll('[data-track]:not(a)')

Expand All @@ -29,7 +92,14 @@
})
}

// Expose trackEvent and trackLinkEvent to the global scope.
// Initialize tracking when DOM is ready
if (document.readyState === 'loading') {
document.addEventListener('DOMContentLoaded', initDataAttributeTracking)
} else {
initDataAttributeTracking()
}

// Expose functions to the global scope
window.trackEvent = trackEvent
window.trackLinkEvent = trackLinkEvent
})()
23 changes: 0 additions & 23 deletions src/js/10-trustarc-consent.js

This file was deleted.

7 changes: 4 additions & 3 deletions src/partials/footer.hbs
Original file line number Diff line number Diff line change
Expand Up @@ -24,12 +24,13 @@
target="_blank"
data-track="Footer Terms of Use Link Clicked"
>Terms of use</a>
{{#with site.keys.ketchSmartTagUrl}}
{{#with site.keys.ibmAnalyticsEnabled}}
<span id="preferenceCenterContainer">
|
<a
id="preferenceCenterLink"
href="https://www.datastax.com/preferences?redirect_to={{{../site.url}}}{{{../page.url}}}"
href="#"
onclick="event.preventDefault(); if (typeof window.truste !== 'undefined' && window.truste.eu && window.truste.eu.clickListener) { window.truste.eu.clickListener(); }"
data-track="Footer Consent Preference Link Clicked"
>Manage Privacy Choices</a>
</span>
Expand Down Expand Up @@ -93,4 +94,4 @@
>[email protected]</a>
</p>
</div>
</footer>
</footer>
110 changes: 107 additions & 3 deletions src/partials/head-scripts.hbs
Original file line number Diff line number Diff line change
@@ -1,13 +1,117 @@
{{#with site.keys.segment}}
<script>
!function(){var i="analytics",analytics=window[i]=window[i]||[];if(!analytics.initialize)if(analytics.invoked)window.console&&console.error&&console.error("Segment snippet included twice.");else{analytics.invoked=!0;analytics.methods=["trackSubmit","trackClick","trackLink","trackForm","pageview","identify","reset","group","track","ready","alias","debug","page","screen","once","off","on","addSourceMiddleware","addIntegrationMiddleware","setAnonymousId","addDestinationMiddleware","register"];analytics.factory=function(e){return function(){if(window[i].initialized)return window[i][e].apply(window[i],arguments);var n=Array.prototype.slice.call(arguments);if(["track","screen","alias","group","page","identify"].indexOf(e)>-1){var c=document.querySelector("link[rel='canonical']");n.push({__t:"bpc",c:c&&c.getAttribute("href")||void 0,p:location.pathname,u:location.href,s:location.search,t:document.title,r:document.referrer})}n.unshift(e);analytics.push(n);return analytics}};for(var n=0;n<analytics.methods.length;n++){var key=analytics.methods[n];analytics[key]=analytics.factory(key)}analytics.load=function(key,n){var t=document.createElement("script");t.type="text/javascript";t.async=!0;t.setAttribute("data-global-segment-analytics-key",i);t.src="https://cdn.segment.com/analytics.js/v1/" + key + "/analytics.min.js";var r=document.getElementsByTagName("script")[0];r.parentNode.insertBefore(t,r);analytics._loadOptions=n};analytics._writeKey="{{this}}";;analytics.SNIPPET_VERSION="5.2.1";
analytics.load("{{this}}");
}}();
!function(){var i="analytics",analytics=window[i]=window[i]||[];if(!analytics.initialize)if(analytics.invoked)window.console&&console.error&&console.error("Segment snippet included twice.");else{analytics.invoked=!0;analytics.methods=["trackSubmit","trackClick","trackLink","trackForm","pageview","identify","reset","group","track","ready","alias","debug","page","screen","once","off","on","addSourceMiddleware","addIntegrationMiddleware","setAnonymousId","addDestinationMiddleware","register"];analytics.factory=function(e){return function(){if(window[i].initialized)return window[i][e].apply(window[i],arguments);var n=Array.prototype.slice.call(arguments);if(["track","screen","alias","group","page","identify"].indexOf(e)>-1){var c=document.querySelector("link[rel='canonical']");n.push({__t:"bpc",c:c&&c.getAttribute("href")||void 0,p:location.pathname,u:location.href,s:location.search,t:document.title,r:document.referrer})}n.unshift(e);analytics.push(n);return analytics}};for(var n=0;n<analytics.methods.length;n++){var key=analytics.methods[n];analytics[key]=analytics.factory(key)}analytics.load=function(key,n){var t=document.createElement("script");t.type="text/javascript";t.async=!0;t.setAttribute("data-global-segment-analytics-key",i);t.src="https://cdn.segment.com/analytics.js/v1/" + key + "/analytics.min.js";var r=document.getElementsByTagName("script")[0];r.parentNode.insertBefore(t,r);analytics._loadOptions=n};analytics._writeKey="{{this}}";;analytics.SNIPPET_VERSION="5.2.1";}}();
</script>
{{/with}}

{{#with site.keys.ibmAnalyticsEnabled}}
<script>
/* eslint-disable */
// IBM Segment Common Properties - Required for all events
const SEGMENT_COMMON_PROPERTIES = {
productTitle: '<ADD>',
productCode: '<ADD>',
productCodeType: '<ADD>',
ut30: '<ADD>'
};

// IBM Analytics Configuration
window._ibmAnalytics = {
"settings": {
"name": "DataStax",
"tealiumProfileName": "ibm-subsidiary",
},
"trustarc": {
"privacyPolicyLink": "https://ibm.com/privacy"
},
"digitalData.page.services.google.enabled": true
};

window.digitalData = {
"page": {
"pageInfo": {
"ibm": {
"siteId": "IBM_" + _ibmAnalytics.settings.name,
},
{{#with ../site.keys.segment}}
"segment": {
"enabled": true,
"env": "prod",
"key": "{{this}}",
"coremetrics": false,
"carbonComponentEvents": false,
"commonProperties": SEGMENT_COMMON_PROPERTIES
}
{{/with}}
},
"category": {
"primaryCategory": "PC230"
}
}
};

// Google Consent Mode v2 - Set defaults before Google tags load
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}

// Set default consent to denied
gtag('consent', 'default', {
'ad_storage': 'denied',
'ad_user_data': 'denied',
'ad_personalization': 'denied',
'analytics_storage': 'denied'
});

// TrustArc Consent Update Listener for Google Consent Mode
(function() {
function updateGoogleConsent() {
if (typeof window.truste !== 'undefined' && window.truste.cma) {
var consent = window.truste.cma.callApi('getConsent', window.location.href) || {};

// Map TrustArc categories to Google consent types
// Category 0 = Required, 1 = Functional, 2 = Advertising, 3 = Analytics
var hasAdvertising = consent[2] === 1;
var hasAnalytics = consent[3] === 1;

gtag('consent', 'update', {
'ad_storage': hasAdvertising ? 'granted' : 'denied',
'ad_user_data': hasAdvertising ? 'granted' : 'denied',
'ad_personalization': hasAdvertising ? 'granted' : 'denied',
'analytics_storage': hasAnalytics ? 'granted' : 'denied'
});
}
}

// Listen for consent changes
if (window.addEventListener) {
window.addEventListener('cm_data_subject_consent_changed', updateGoogleConsent);
window.addEventListener('cm_consent_preferences_set', updateGoogleConsent);
}

// Initial check after TrustArc loads
if (document.readyState === 'complete') {
updateGoogleConsent();
} else {
window.addEventListener('load', updateGoogleConsent);
}
})();
</script>
<script src="//1.www.s81c.com/common/stats/ibm-common.js" type="text/javascript" async="async"></script>
{{#with ../site.keys.segment}}
<script src="https://consent.trustarc.com/get?name=trustarc-segment-wrapper-v1.1.js" async></script>
<script>
(function() {
function initSegmentWithTrustArc() {
if (typeof TrustArcWrapper !== 'undefined' && window.analytics) {
TrustArcWrapper.withTrustArc(window.analytics).load('{{this}}');
} else {
setTimeout(initSegmentWithTrustArc, 100);
}
}
initSegmentWithTrustArc();
})();
</script>
{{/with}}
{{/with}}

<script>var uiRootPath = '{{{uiRootPath}}}'</script>
Expand Down
38 changes: 31 additions & 7 deletions src/partials/intercom.hbs
Original file line number Diff line number Diff line change
@@ -1,11 +1,35 @@
{{#with site.keys.intercom}}
<script>
window.intercomSettings = {
app_id: "{{this}}",
api_base: "https://api-iam.intercom.io"
};
</script>
<script>
!function(){var t=window,e=t.Intercom;if("function"==typeof e)e("reattach_activator"),e("update",t.intercomSettings);else{var n=document,a=function(){a.c(arguments)};a.q=[],a.c=function(t){a.q.push(t)},t.Intercom=a;var c=function(){var t=n.createElement("script");t.type="text/javascript",t.async=!0,t.src="https://widget.intercom.io/widget/{{this}}";var e=n.getElementsByTagName("script")[0];e.parentNode.insertBefore(t,e)};t.attachEvent?t.attachEvent("onload",c):t.addEventListener("load",c,!1)}}();
(function() {
function loadIntercom() {
// Check for functional consent (category 1)
if (typeof window.truste !== 'undefined' && window.truste.cma) {
var consent = window.truste.cma.callApi('getConsent', window.location.href) || {};
var hasFunctional = consent[1] === 1;

if (hasFunctional) {
window.intercomSettings = {
app_id: "{{this}}",
api_base: "https://api-iam.intercom.io"
};

!function(){var t=window,e=t.Intercom;if("function"==typeof e)e("reattach_activator"),e("update",t.intercomSettings);else{var n=document,a=function(){a.c(arguments)};a.q=[],a.c=function(t){a.q.push(t)},t.Intercom=a;var c=function(){var t=n.createElement("script");t.type="text/javascript",t.async=!0,t.src="https://widget.intercom.io/widget/{{this}}";var e=n.getElementsByTagName("script")[0];e.parentNode.insertBefore(t,e)};t.attachEvent?t.attachEvent("onload",c):t.addEventListener("load",c,!1)}}();
}
}
}

// Listen for consent changes
if (window.addEventListener) {
window.addEventListener('cm_data_subject_consent_changed', loadIntercom);
window.addEventListener('cm_consent_preferences_set', loadIntercom);
}

// Initial check
if (document.readyState === 'complete') {
loadIntercom();
} else {
window.addEventListener('load', loadIntercom);
}
})();
</script>
{{/with}}
Loading