From 68fef67a85d2ab01eb1875f8b5e8ddd1e210490f Mon Sep 17 00:00:00 2001 From: Andrei Bogdan Date: Tue, 7 Nov 2023 17:01:07 +0200 Subject: [PATCH 1/6] Add decorate Links --- solutions/scripts/scripts.js | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/solutions/scripts/scripts.js b/solutions/scripts/scripts.js index b6279a54b..f1fbf7c00 100644 --- a/solutions/scripts/scripts.js +++ b/solutions/scripts/scripts.js @@ -276,6 +276,30 @@ export default function decorateLinkedPictures(main) { }); } +/** + * Decorates links. + * @param {Element} block + */ +export function decorateLinks(block) { + [...block.querySelectorAll('.button-container a')] + .filter(({ href }) => !!href) + .forEach((link) => { + // handling links + if (link.getAttribute('href').startsWith('https://www.bitdefender.com.au/site/Store/buy')) { + // add adobe_mc parameter to the link + const url = new URL(link.href); + url.searchParams.set('adobe_mc', 'MCAID%3D%7CMCORGID'); + link.href = url.href; + } + + const url = new URL(link.href); + const external = !url.host.match('macktrucks.com') && !url.host.match('.hlx.(page|live)') && !url.host.match('localhost'); + if (url.host.match('build.macktrucks.com') || url.pathname.endsWith('.pdf') || external) { + link.target = '_blank'; + } + }); +} + /** * Decorates the main element. * @param {Element} main The main element @@ -289,6 +313,7 @@ export function decorateMain(main) { decorateLinkedPictures(main); decorateSections(main); decorateBlocks(main); + decorateLinks(main); } /** From 9ce78a08a3830013e59766e75e66d745e3c76498 Mon Sep 17 00:00:00 2001 From: Andrei Bogdan Date: Thu, 9 Nov 2023 09:01:39 +0200 Subject: [PATCH 2/6] remove liveness & readiness --- solutions/scripts/scripts.js | 25 +++++++++++++++++++------ 1 file changed, 19 insertions(+), 6 deletions(-) diff --git a/solutions/scripts/scripts.js b/solutions/scripts/scripts.js index f1fbf7c00..fa2a16c35 100644 --- a/solutions/scripts/scripts.js +++ b/solutions/scripts/scripts.js @@ -276,6 +276,25 @@ export default function decorateLinkedPictures(main) { }); } +export function appendAdobeMcLinks(selector) { + try { + const visitor = Visitor.getInstance('0E920C0F53DA9E9B0A490D45@AdobeOrg', { + trackingServer: 'sstats.bitdefender.com', + trackingServerSecure: 'sstats.bitdefender.com', + marketingCloudServer: 'sstats.bitdefender.com', + marketingCloudServerSecure: 'sstats.bitdefender.com', + }); + const wrapperSelector = document.querySelector(selector); + const hrefSelector = '[href*=".bitdefender."]'; + wrapperSelector.querySelectorAll(hrefSelector).forEach((link) => { + const destinationURLWithVisitorIDs = visitor.appendVisitorIDsTo(link.href); + link.href = destinationURLWithVisitorIDs.replace(/MCAID%3D.*%7CMCORGID/, 'MCAID%3D%7CMCORGID'); + }); + } catch (e) { + console.error(e); + } +} + /** * Decorates links. * @param {Element} block @@ -291,12 +310,6 @@ export function decorateLinks(block) { url.searchParams.set('adobe_mc', 'MCAID%3D%7CMCORGID'); link.href = url.href; } - - const url = new URL(link.href); - const external = !url.host.match('macktrucks.com') && !url.host.match('.hlx.(page|live)') && !url.host.match('localhost'); - if (url.host.match('build.macktrucks.com') || url.pathname.endsWith('.pdf') || external) { - link.target = '_blank'; - } }); } From 4fb4043696f3cb492377f16861bfae7725689039 Mon Sep 17 00:00:00 2001 From: Andrei Bogdan Date: Thu, 9 Nov 2023 09:26:04 +0200 Subject: [PATCH 3/6] Test Visitor call --- solutions/scripts/scripts.js | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/solutions/scripts/scripts.js b/solutions/scripts/scripts.js index fa2a16c35..7425908d3 100644 --- a/solutions/scripts/scripts.js +++ b/solutions/scripts/scripts.js @@ -276,7 +276,11 @@ export default function decorateLinkedPictures(main) { }); } -export function appendAdobeMcLinks(selector) { +/** + * Decorete links with adobe_mc parameter. + * @param {Element} selector + */ +function appendAdobeMcLinks(selector) { try { const visitor = Visitor.getInstance('0E920C0F53DA9E9B0A490D45@AdobeOrg', { trackingServer: 'sstats.bitdefender.com', @@ -304,12 +308,13 @@ export function decorateLinks(block) { .filter(({ href }) => !!href) .forEach((link) => { // handling links - if (link.getAttribute('href').startsWith('https://www.bitdefender.com.au/site/Store/buy')) { - // add adobe_mc parameter to the link - const url = new URL(link.href); - url.searchParams.set('adobe_mc', 'MCAID%3D%7CMCORGID'); - link.href = url.href; - } + appendAdobeMcLinks(link); + // if (link.getAttribute('href').startsWith('https://www.bitdefender.com.au/site/Store/buy')) { + // // add adobe_mc parameter to the link + // const url = new URL(link.href); + // url.searchParams.set('adobe_mc', 'MCAID%3D%7CMCORGID'); + // link.href = url.href; + // } }); } @@ -326,7 +331,7 @@ export function decorateMain(main) { decorateLinkedPictures(main); decorateSections(main); decorateBlocks(main); - decorateLinks(main); + // decorateLinks(main); } /** @@ -541,6 +546,7 @@ async function loadPage() { await window.hlx.plugins.load('lazy'); await loadLazy(document); loadDelayed(); + decorateLinks(document.querySelector('main')); } loadPage(); From 455299f74d8817a66f6c1703264c479457401b5f Mon Sep 17 00:00:00 2001 From: Andrei Bogdan Date: Thu, 9 Nov 2023 12:09:14 +0200 Subject: [PATCH 4/6] Add adobe_mc param --- solutions/scripts/scripts.js | 36 +++++++++++++++++------------------- 1 file changed, 17 insertions(+), 19 deletions(-) diff --git a/solutions/scripts/scripts.js b/solutions/scripts/scripts.js index e855b64a8..817f06a38 100644 --- a/solutions/scripts/scripts.js +++ b/solutions/scripts/scripts.js @@ -301,6 +301,7 @@ export default function decorateLinkedPictures(main) { */ function appendAdobeMcLinks(selector) { try { + // eslint-disable-next-line no-undef const visitor = Visitor.getInstance('0E920C0F53DA9E9B0A490D45@AdobeOrg', { trackingServer: 'sstats.bitdefender.com', trackingServerSecure: 'sstats.bitdefender.com', @@ -309,34 +310,31 @@ function appendAdobeMcLinks(selector) { }); const wrapperSelector = document.querySelector(selector); const hrefSelector = '[href*=".bitdefender."]'; + wrapperSelector.querySelectorAll(hrefSelector).forEach((link) => { const destinationURLWithVisitorIDs = visitor.appendVisitorIDsTo(link.href); + link.href = destinationURLWithVisitorIDs.replace(/MCAID%3D.*%7CMCORGID/, 'MCAID%3D%7CMCORGID'); }); } catch (e) { + // eslint-disable-next-line no-console console.error(e); } } -/** - * Decorates links. - * @param {Element} block - */ -export function decorateLinks(block) { - [...block.querySelectorAll('.button-container a')] - .filter(({ href }) => !!href) - .forEach((link) => { - // handling links - appendAdobeMcLinks(link); - // if (link.getAttribute('href').startsWith('https://www.bitdefender.com.au/site/Store/buy')) { - // // add adobe_mc parameter to the link - // const url = new URL(link.href); - // url.searchParams.set('adobe_mc', 'MCAID%3D%7CMCORGID'); - // link.href = url.href; - // } - }); +function checkAEPDataCollection() { + // Check if Adobe Experience Platform Data Collection is loaded + if (window.adobe && window.adobe.target && window.adobe.target.getOffer) { + // Your custom code here + appendAdobeMcLinks('main'); + // Stop checking, as AEP Data Collection is now loaded + // eslint-disable-next-line no-use-before-define + clearInterval(checkInterval); + } } +// Set an interval to check every 100 milliseconds (adjust as needed) + /** * Decorates the main element. * @param {Element} main The main element @@ -350,7 +348,6 @@ export function decorateMain(main) { decorateLinkedPictures(main); decorateSections(main); decorateBlocks(main); - // decorateLinks(main); } /** @@ -573,7 +570,8 @@ async function loadPage() { await window.hlx.plugins.load('lazy'); await loadLazy(document); loadDelayed(); - decorateLinks(document.querySelector('main')); } loadPage(); + +const checkInterval = setInterval(checkAEPDataCollection, 100); From 9e79926c7d5dc2e5fbfaf3e83c500312f3e3feba Mon Sep 17 00:00:00 2001 From: Andrei Bogdan Date: Tue, 14 Nov 2023 18:38:16 +0200 Subject: [PATCH 5/6] Move to Lazyloading checkAEPDataCollection --- solutions/scripts/scripts.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/solutions/scripts/scripts.js b/solutions/scripts/scripts.js index 817f06a38..693b5c26c 100644 --- a/solutions/scripts/scripts.js +++ b/solutions/scripts/scripts.js @@ -29,6 +29,8 @@ export const DEFAULT_COUNTRY = 'au'; export const METADATA_ANAYTICS_TAGS = 'analytics-tags'; +let checkInterval = null; + const hreflangMap = { 'en-ro': 'https://www.bitdefender.ro', de: 'https://www.bitdefender.de', @@ -333,8 +335,6 @@ function checkAEPDataCollection() { } } -// Set an interval to check every 100 milliseconds (adjust as needed) - /** * Decorates the main element. * @param {Element} main The main element @@ -547,6 +547,8 @@ async function loadLazy(doc) { link.setAttribute('href', `${value}${window.location.pathname.replace(/\/us\/en/, '')}`); document.head.appendChild(link); }); + + checkInterval = setInterval(checkAEPDataCollection, 100); } /** @@ -573,5 +575,3 @@ async function loadPage() { } loadPage(); - -const checkInterval = setInterval(checkAEPDataCollection, 100); From b261e9b130878182c8b5ad6df81d5784bc4c23d4 Mon Sep 17 00:00:00 2001 From: Andrei Bogdan Date: Wed, 15 Nov 2023 15:25:58 +0200 Subject: [PATCH 6/6] Fix quote-carousel --- .../blocks/quote-carousel/quote-carousel.js | 4 ++-- solutions/scripts/lib-franklin.js | 16 +++++++++------- solutions/scripts/scripts.js | 6 +++--- 3 files changed, 14 insertions(+), 12 deletions(-) diff --git a/solutions/blocks/quote-carousel/quote-carousel.js b/solutions/blocks/quote-carousel/quote-carousel.js index 36ec87dd4..bdcc3cd96 100644 --- a/solutions/blocks/quote-carousel/quote-carousel.js +++ b/solutions/blocks/quote-carousel/quote-carousel.js @@ -8,7 +8,7 @@ function createSlide(item, index) { const paragraphs = Array.from(item.querySelectorAll('p')); const quote = paragraphs.find((paragraph) => { const strongOrEm = paragraph.querySelector('strong, em'); - return !strongOrEm && paragraph.textContent.trim() !== ''; + return !strongOrEm && paragraph.innerHTML.trim() !== ''; }); const author = item.querySelector('p > strong'); @@ -30,7 +30,7 @@ function createSlide(item, index) {
-

${quote?.textContent}

+

${quote?.innerHTML}

${author?.textContent}

${description?.textContent}

`, diff --git a/solutions/scripts/lib-franklin.js b/solutions/scripts/lib-franklin.js index 52487bf11..f9db6fe60 100644 --- a/solutions/scripts/lib-franklin.js +++ b/solutions/scripts/lib-franklin.js @@ -225,19 +225,21 @@ export async function decorateIcons(element) { } })); - const symbols = Object - .keys(ICONS_CACHE).filter((k) => !svgSprite.querySelector(`#icons-sprite-${k}`)) - .map((k) => ICONS_CACHE[k]) - .filter((v) => !v.styled) - .map((v) => v.html) - .join('\n'); + const symbols = Object.values(ICONS_CACHE).filter((v) => !v.styled).map((v) => v.html).join('\n'); svgSprite.innerHTML += symbols; icons.forEach((span) => { const iconName = Array.from(span.classList).find((c) => c.startsWith('icon-')).substring(5); const parent = span.firstElementChild?.tagName === 'A' ? span.firstElementChild : span; + + // Set aria-label if the parent is an anchor tag + const spanParent = span.parentElement; + if (spanParent.tagName === 'A' && !spanParent.hasAttribute('aria-label')) { + spanParent.setAttribute('aria-label', iconName); + } + // Styled icons need to be inlined as-is, while unstyled ones can leverage the sprite - if (ICONS_CACHE[iconName].styled) { + if (ICONS_CACHE[iconName] && ICONS_CACHE[iconName].styled) { parent.innerHTML = ICONS_CACHE[iconName].html; } else { parent.innerHTML = ``; diff --git a/solutions/scripts/scripts.js b/solutions/scripts/scripts.js index 693b5c26c..a7431f638 100644 --- a/solutions/scripts/scripts.js +++ b/solutions/scripts/scripts.js @@ -340,10 +340,10 @@ function checkAEPDataCollection() { * @param {Element} main The main element */ // eslint-disable-next-line import/prefer-default-export -export function decorateMain(main) { +export async function decorateMain(main) { // hopefully forward compatible button decoration decorateButtons(main); - decorateIcons(main); + await decorateIcons(main); decorateTags(main); decorateLinkedPictures(main); decorateSections(main); @@ -508,7 +508,7 @@ async function loadEager(doc) { } const main = doc.querySelector('main'); if (main) { - decorateMain(main); + await decorateMain(main); buildCtaSections(main); buildTwoColumnsSection(main); detectModalButtons(main);