From 15191dfc12fa30902a117adb5ce748328a0366ba Mon Sep 17 00:00:00 2001 From: Carlos Vilhena Date: Thu, 27 Jul 2017 15:52:21 +0000 Subject: [PATCH] Refactor how we calculate section and link counts This commit moves the logic of determining how many sections and links are on a given page to a new module, which has more granular functions to extract all the necessary bits from a page to make a decision. This refactoring aims at making it clearer what the steps are. Ideally, each rendering application would set these counts in a meta tag and this code would only read from it, but it's a bit more complicated than that, especially for JS-driven finders. --- app/assets/javascripts/analytics.js | 1 + .../analytics/custom-dimensions.js | 70 +--------- .../javascripts/analytics/page-content.js | 120 ++++++++++++++++++ .../analytics/static-analytics-spec.js | 82 +++++++++++- 4 files changed, 204 insertions(+), 69 deletions(-) create mode 100644 app/assets/javascripts/analytics/page-content.js diff --git a/app/assets/javascripts/analytics.js b/app/assets/javascripts/analytics.js index c72503fb0..d5d4d3918 100644 --- a/app/assets/javascripts/analytics.js +++ b/app/assets/javascripts/analytics.js @@ -7,6 +7,7 @@ //= require govuk/analytics/external-link-tracker //= require govuk/analytics/download-link-tracker +//= require analytics/page-content //= require analytics/custom-dimensions //= require analytics/static-analytics //= require analytics/ecommerce diff --git a/app/assets/javascripts/analytics/custom-dimensions.js b/app/assets/javascripts/analytics/custom-dimensions.js index f0791f675..314f36d24 100644 --- a/app/assets/javascripts/analytics/custom-dimensions.js +++ b/app/assets/javascripts/analytics/custom-dimensions.js @@ -84,75 +84,9 @@ function customDimensionsFromDom() { return { - dimension26: totalNumberOfSections(), - dimension27: totalNumberOfSectionLinks() + dimension26: GOVUK.PageContent.getNumberOfSections(), + dimension27: GOVUK.PageContent.getNumberOfLinks() }; - - function totalNumberOfSections() { - var sidebarSections = $('[data-track-count="sidebarRelatedItemSection"]').length; - var sidebarTaxons = $('[data-track-count="sidebarTaxonSection"]').length; - var accordionSubsections = $('[data-track-count="accordionSection"]').length; - var gridSections = $('a[data-track-category="navGridLinkClicked"]').length; - var browsePageSections = $('#subsection ul:visible').length || - $('#section ul').length; - var topicPageSections = $('.topics-page nav.index-list').length - var documentCollectionSections = $('.document-collection .group-title').length; - var policyAreaSections = $('.topic section h1.label').length; - - // Document collections, being a content item, might have related links. - // That means we need to check for sections on it first, before we default - // to the sections on the side bar. - var sectionCount = - documentCollectionSections || - sidebarSections || - sidebarTaxons || - accordionSubsections || - gridSections || - browsePageSections || - topicPageSections || - policyAreaSections; - - return sectionCount; - } - - function totalNumberOfSectionLinks() { - var relatedLinks = $('a[data-track-category="relatedLinkClicked"]').length; - var accordionLinks = $('a[data-track-category="navAccordionLinkClicked"]').length; - // Grid links are counted both as "sections" (see dimension 26), and as part of the total link count - var gridLinks = $('a[data-track-category="navGridLinkClicked"]').length - + $('a[data-track-category="navGridLeafLinkClicked"]').length; - var leafLinks = $('a[data-track-category="navLeafLinkClicked"]').length; - var browsePageLinks = $('#subsection ul a:visible').length || - $('#section ul a').length; - var subTopicPageLinks = $('.topics-page .index-list ul a').length; - var topicPageLinks = $('.topics-page .topics ul a').length; - var policyAreaLinks = - $('section.document-block a').length + - $('section .collection-list h2 a').length - var whitehallFinderPageLinks = - $('.document-list .document-row h3 a').length; - var documentCollectionLinks = - $('.document-collection .group-document-list li a').length; - var finderLinks = $('.finder-frontend-content li.document a').length; - - // Document collections, being a content item, might have related links. - // That means we need to check for links on it first, before we default - // to the sections on the side bar. - var linksCount = - documentCollectionLinks || - relatedLinks || - accordionLinks || - gridLinks || - leafLinks || - browsePageLinks || - subTopicPageLinks || - topicPageLinks || - policyAreaLinks || - whitehallFinderPageLinks || - finderLinks; - - return linksCount; - } } function abTestCustomDimensions() { diff --git a/app/assets/javascripts/analytics/page-content.js b/app/assets/javascripts/analytics/page-content.js new file mode 100644 index 000000000..8bf9da4b3 --- /dev/null +++ b/app/assets/javascripts/analytics/page-content.js @@ -0,0 +1,120 @@ +(function () { + "use strict"; + window.GOVUK = window.GOVUK || {}; + var PageContent = function () { } + + PageContent.getNumberOfSections = function () { + switch(true) { + case isNavigationGridPage(): + return $('a[data-track-category="navGridLinkClicked"]').length; + case isNavigationAccordionPage(): + return $('[data-track-count="accordionSection"]').length; + case isDocumentCollectionPage(): + return $('.document-collection .group-title').length; + case isMainstreamBrowsePage(): + return $('#subsection ul:visible').length || $('#section ul').length; + case isTopicPage(): + return $('.topics-page nav.index-list').length; + case isPolicyAreaPage(): + return $('.topic section h1.label').length; + default: + // It's a content page, not a "finding" page + var sidebarSections = $('[data-track-count="sidebarRelatedItemSection"]').length; + var sidebarTaxons = $('[data-track-count="sidebarTaxonSection"]').length; + + return sidebarSections || sidebarTaxons; + } + }; + + PageContent.getNumberOfLinks = function () { + switch(true) { + case isNavigationGridPage(): + return $('a[data-track-category="navGridLinkClicked"]').length + + $('a[data-track-category="navGridLeafLinkClicked"]').length; + case isNavigationAccordionPage(): + return $('a[data-track-category="navAccordionLinkClicked"]').length; + case isNavigationLeafPage(): + return $('a[data-track-category="navLeafLinkClicked"]').length; + case isDocumentCollectionPage(): + return $('.document-collection .group-document-list li a').length; + case isMainstreamBrowsePage(): + return $('#subsection ul a:visible').length || + $('#section ul a').length; + case isTopicPage(): + return $('.topics-page .index-list ul a').length || + $('.topics-page .topics ul a').length; + case isPolicyAreaPage(): + return $('section.document-block a').length + + $('section .collection-list h2 a').length; + case isWhitehallFinderPage(): + return $('.document-list .document-row h3 a').length; + case isFinderPage(): + return $('.finder-frontend-content li.document a').length; + default: + // It's a content page, not a "finding" page, count related links + return $('a[data-track-category="relatedLinkClicked"]').length; + } + }; + + function getRenderingApplication () { + return $('meta[name="govuk:rendering-application"]').attr('content'); + }; + + function getFormat () { + return $('meta[name="govuk:format"]').attr('content'); + }; + + function getNavigationPageType () { + return $('meta[name="govuk:navigation-page-type"]').attr('content'); + }; + + function isNavigationGridPage () { + return getRenderingApplication() == 'collections' && + getFormat() == 'taxon' && + getNavigationPageType() == 'grid'; + }; + + function isNavigationAccordionPage () { + return getRenderingApplication() == 'collections' && + getFormat() == 'taxon' && + getNavigationPageType() == 'accordion'; + }; + + function isNavigationLeafPage () { + return getRenderingApplication() == 'collections' && + getFormat() == 'taxon' && + getNavigationPageType() == 'leaf'; + }; + + function isMainstreamBrowsePage () { + return getRenderingApplication() == 'collections' && + getFormat() == 'mainstream_browse_page' + }; + + function isTopicPage () { + return getRenderingApplication() == 'collections' && + getFormat() == 'topic' + }; + + function isPolicyAreaPage () { + return getRenderingApplication() == 'whitehall' && + getFormat() == 'placeholder_policy_area' + }; + + function isDocumentCollectionPage () { + return getRenderingApplication() == 'government-frontend' && + getFormat() == 'document_collection' + }; + + function isFinderPage () { + return getRenderingApplication() == 'finder-frontend' && + getFormat() == 'finder' + }; + + function isWhitehallFinderPage () { + return getRenderingApplication() == 'whitehall' && + getFormat() == 'finder' + }; + + GOVUK.PageContent = PageContent; +})(); diff --git a/spec/javascripts/analytics/static-analytics-spec.js b/spec/javascripts/analytics/static-analytics-spec.js index a1ebd1c30..e17ec332b 100644 --- a/spec/javascripts/analytics/static-analytics-spec.js +++ b/spec/javascripts/analytics/static-analytics-spec.js @@ -216,6 +216,12 @@ describe("GOVUK.StaticAnalytics", function() { describe('when tracking the number of sections and links on a page', function() { describe('on a page with a normal sidebar', function() { beforeEach(function() { + $('head').append('\ +
\ + \ + \ +
\ + ') $('body').append('\
\