diff --git a/docs/js/google-tag-manager.js b/docs/js/google-tag-manager.js new file mode 100644 index 0000000..7c9426e --- /dev/null +++ b/docs/js/google-tag-manager.js @@ -0,0 +1,10 @@ +(function (w, d, s, l, i) { + w[l] = w[l] || []; + w[l].push({ "gtm.start": new Date().getTime(), event: "gtm.js" }); + var f = d.getElementsByTagName(s)[0], + j = d.createElement(s), + dl = l != "dataLayer" ? "&l=" + l : ""; + j.async = true; + j.src = "https://www.googletagmanager.com/gtm.js?id=" + i + dl; + f.parentNode.insertBefore(j, f); +})(window, document, "script", "dataLayer", "GTM-5RDZ55LR"); diff --git a/docs/js/search-tracking.js b/docs/js/search-tracking.js index 2709a09..e29bdd1 100644 --- a/docs/js/search-tracking.js +++ b/docs/js/search-tracking.js @@ -102,6 +102,8 @@ ...payload, }), }); + }); + } catch (error) { console.warn("Analytics API error:", error); } @@ -130,6 +132,7 @@ function trackResultClick(resultUrl, resultTitle, resultRank) { const _q = lastSearchQuery.trim(); + // Send result_click event exactly like Vue.js reference sendAnalyticsEvent("doc-search-click", { result_url: resultUrl, @@ -218,6 +221,7 @@ let searchTimeout; let lastTrackedQuery = ""; + // Update context when search becomes active (like Vue.js modal opening) const updateContextOnSearchActivation = () => { try { @@ -268,6 +272,7 @@ // Track search result clicks with enhanced logic document.addEventListener("click", function (e) { + // Multiple ways to detect search result clicks const isSearchResult = e.target.closest(".md-search-result__item") || @@ -285,6 +290,7 @@ return; } + // Check if search is active (more lenient check) const searchContainer = document.querySelector(".md-search"); const searchInput = document.querySelector(".md-search__input"); @@ -301,20 +307,21 @@ // Update context right before tracking click (ensure fresh data) updateContextOnSearchActivation(); - const resultInfo = extractResultInfo(e.target); + const resultInfo = extractResultInfo(e.target); - if (resultInfo && resultInfo.url) { + if (resultInfo && resultInfo.url) { trackResultClick(resultInfo.url, resultInfo.title, resultInfo.rank); } else { console.warn("Could not extract result info from clicked element"); } - }); + }); + } /** * Initialize feedback tracking - new functionality for page feedback */ - function initializeFeedbackTracking() { + function initializeFeedbackTracking() { // Track feedback button clicks document.addEventListener("click", function (e) { @@ -323,7 +330,8 @@ if (!feedbackButton) { return; - } + } + // Get feedback value from data-md-value attribute const feedbackValue = feedbackButton.getAttribute("data-md-value"); @@ -344,7 +352,7 @@ // Track the feedback trackPageFeedback(feedbackValueNum, pageUrl, pageTitle); }); - + } /** @@ -395,7 +403,7 @@ testClickDetection: function () { const searchResults = document.querySelectorAll( ".md-search-result__item, .md-search-result, [data-md-component='search-result']" - ); + ); return searchResults; }, testFeedbackDetection: function () { diff --git a/mkdocs.yml b/mkdocs.yml index eeb3b93..2a66d3d 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -18,14 +18,15 @@ extra_css: - css/landing-page.css extra_javascript: - https://unpkg.com/openapi-explorer@0/dist/browser/openapi-explorer.min.js - - js/ms-clarity.js - - js/zinc.js - - js/vector_co.js + # - js/ms-clarity.js + # - js/zinc.js + # - js/vector_co.js - js/search-close-minimal.js - js/search-tracking.js - https://buttons.github.io/buttons.js - - js/reo.js + # - js/reo.js - js/landing-individual-card-ms-tracking.js + - js/google-tag-manager.js extra: # social: # - icon: fontawesome/brands/linkedin