diff --git a/blocks/header/header.css b/blocks/header/header.css index 15b1614c..abc72404 100644 --- a/blocks/header/header.css +++ b/blocks/header/header.css @@ -50,7 +50,7 @@ header nav .nav-brand p { } header nav .nav-brand .icon, header nav .nav-brand .icon svg { - width: 150px; + width: 110px; height: 40px; } diff --git a/blocks/header/header.js b/blocks/header/header.js index c564c73b..c413481b 100644 --- a/blocks/header/header.js +++ b/blocks/header/header.js @@ -1,5 +1,7 @@ import { decorateIcons, getMetadata, getLanguagePath } from '../../scripts/lib-franklin.js'; import { addChevronToButtons } from '../../scripts/scripts.js'; +import initLogIn from '../../scripts/login.js'; +import { getImageURL } from '../../scripts/personalisation-helpers.js'; const mobileBreakpoint = 900; let globalWindowWidth = window.innerWidth; @@ -106,6 +108,8 @@ function languageSwitch() { const langSwitch = header.querySelector('.nav-tools ul'); const langLinks = langSwitch.querySelectorAll('li:not(:last-of-type) a'); + initLogIn(langSwitch.querySelector('li:last-of-type a')); + const defaultLanguage = 'en'; const currentLang = document.documentElement.lang; const isInDefaultLang = currentLang === defaultLanguage; @@ -139,13 +143,24 @@ export default async function decorate(block) { // fetch nav content const resp = await fetch(`${getLanguagePath()}${getNavPath()}.plain.html`); if (resp.ok) { - const html = await resp.text(); + let html = await resp.text(); const isCampaignTemplate = document.querySelector('meta[content="campaign"]'); // decorate nav DOM const nav = document.createElement('nav'); + if (window.personalizationData?.content?.profileImageURL) { + const classes = 'icon icon-netcentric-logo icon-decorated personalized'; + const url = getImageURL(window.personalizationData.content.profileImageURL); + const altText = window.personalizationData.content?.firstName || 'Netcentric logo'; + html = html.replace('', ` + + `); + } nav.innerHTML = html; + const classes = isCampaignTemplate ? ['brand'] : ['brand', 'sections', 'search', 'tools']; classes.forEach((e, j) => { const section = nav.children[j]; diff --git a/blocks/personalization-card/personalization-card.css b/blocks/personalization-card/personalization-card.css new file mode 100644 index 00000000..3beb5514 --- /dev/null +++ b/blocks/personalization-card/personalization-card.css @@ -0,0 +1,36 @@ +.personalization-card { + width: var(--section-width); + margin: 0 auto; + padding: 28px 0; + margin-block-end: 30px; + + .card-offer { + padding-inline: 20px; + + @media (min-width: 900px) { + display: flex; + column-gap: 20px; + } + } + + img { + @media (min-width: 900px) { + width: 40%; + } + } + + h1 { + color: inherit; + margin-block: 0; + } +} + +.personalization-card-wrapper { + background-color: var(--c-dark-plum); + margin-inline: 0 !important; + width: 100% !important; +} + +.personalization-card-container { + padding: 0 !important; +} \ No newline at end of file diff --git a/blocks/personalization-card/personalization-card.js b/blocks/personalization-card/personalization-card.js new file mode 100644 index 00000000..95aa9c9b --- /dev/null +++ b/blocks/personalization-card/personalization-card.js @@ -0,0 +1,46 @@ +import { isValidJSON } from '../../scripts/personalisation-helpers.js'; +import { addChevronToButtons } from '../../scripts/scripts.js'; + +function createCardOffer(offer) { + const offerElement = document.createElement('div'); + const title = offer.title?.content ? `

${offer.title?.content}

` : ''; + const text = offer.body?.content ? `

${offer.body?.content}

` : ''; + const button = offer.buttons[0]?.text?.content ? `

${offer.buttons[0]?.text?.content}

` : ''; + const image = offer.image?.url ? `${offer.image?.alt}` : ''; + offerElement.className = 'section dark-plum card-offer'; + offerElement.innerHTML = ` + ${image} +
+ ${title} + ${text} + ${button} +
+ `; + return offerElement; +} + +function handleOffers(block, offer) { + const cardOffer = createCardOffer(offer); + addChevronToButtons(block); + block.append(cardOffer); +} + +export default function decorate(block) { + const content = block.textContent.trim(); + const editedContent = content.replace('Personalization Card:', '').trim(); + if (!isValidJSON(editedContent)) { + block.parentElement.remove(); + return; + } + const data = JSON.parse(editedContent); + block.children[0].remove(); + data.forEach((offer) => { + if (Array.isArray(offer.content)) { + offer.content.forEach((subOffer) => { + handleOffers(block, subOffer); + }); + } else { + handleOffers(block, offer.content); + } + }); +} \ No newline at end of file diff --git a/blocks/personalization-cbe/personalization-cbe.css b/blocks/personalization-cbe/personalization-cbe.css new file mode 100644 index 00000000..689f8004 --- /dev/null +++ b/blocks/personalization-cbe/personalization-cbe.css @@ -0,0 +1,3 @@ +.personalization-cbe { + +} \ No newline at end of file diff --git a/blocks/personalization-cbe/personalization-cbe.js b/blocks/personalization-cbe/personalization-cbe.js new file mode 100644 index 00000000..84d44d51 --- /dev/null +++ b/blocks/personalization-cbe/personalization-cbe.js @@ -0,0 +1,13 @@ +import { isValidJSON } from '../../scripts/personalisation-helpers.js'; + +export default function decorate(block) { + const content = block.textContent.trim(); + const editedContent = content.replace('Personalization CBE:', '').trim(); + if (!isValidJSON(editedContent)) { + block.parentElement.remove(); + return; + } + const data = JSON.parse(editedContent); + block.children[0].remove(); + window.personalizationData = {...data[0]}; +} \ No newline at end of file diff --git a/blocks/personalization-ed/personalization-ed.css b/blocks/personalization-ed/personalization-ed.css new file mode 100644 index 00000000..b37c879b --- /dev/null +++ b/blocks/personalization-ed/personalization-ed.css @@ -0,0 +1,79 @@ +.personalization-ed { + display: grid; + grid-template-columns: 1fr; + column-gap: 20px; + row-gap: 40px; + margin-block-end: 80px; + + > *:first-child { + .img-wrap { + position: relative; + } + + h2 { + font-size: 38px; + } + + p { + font-size: 30px; + } + + @media (min-width: 900px) { + grid-column: span 2; + + .img-mask { + position: absolute; + top: 0; + left: auto; + width: 100%; + height: 100%; + background-color: #000; + opacity: 0.4; + } + + .offer-details { + position: absolute; + top: 40%; + z-index: 2; + left: 20px; + } + + h2, p { + color: #fff; + font-weight: bold; + text-shadow: 0 0 5px rgba(0, 0, 0, 0.5); + } + } + + @media (min-width: 1200px) { + .offer-details { + width: 65%; + } + } + } + + > *:not(:first-child) { + grid-column: span 1; + } + + > *:only-child { + grid-column: span 2; + } + + @media (min-width: 900px) { + grid-template-columns: 1fr 1fr; + } + + .ed-offer { + position: relative; + margin-inline: 20px; + + h2 { + margin-block: 0; + } + } + + img { + display: block; + } +} \ No newline at end of file diff --git a/blocks/personalization-ed/personalization-ed.js b/blocks/personalization-ed/personalization-ed.js new file mode 100644 index 00000000..8714d893 --- /dev/null +++ b/blocks/personalization-ed/personalization-ed.js @@ -0,0 +1,52 @@ +import { isValidJSON, getImageURL, getCookie } from '../../scripts/personalisation-helpers.js'; +import { createOptimizedPicture } from '../../scripts/lib-franklin.js'; + + +function createEdOffer(offer, index) { + const offerElement = document.createElement('div'); + const imageSrc = offer.imageURL ? getImageURL(offer.imageURL) : '/insights/2023/12/media_1db1f637bcc9a28245d76086f2d141781cbcc080d.png?width=2000&format=webply&optimize=medium'; + const subject = offer.subject ? `

${offer.subject}

` : ''; + const button = offer.buttonText ? `

${offer.buttonText}

` : ''; + const isAutenticated = getCookie('ncUser'); + const imgMask = isAutenticated ? '
' : ''; + const imageLoading = !isAutenticated && index === 0; + const offerPicture = createOptimizedPicture(imageSrc, offer.offerName, imageLoading, [{ media: '(min-width: 900px)', width: '2000' }, { width: '1000' }]); + offerElement.classList.add('ed-offer'); + offerElement.innerHTML = ` +
+ ${offerPicture.outerHTML} + ${imgMask} +
+
+ ${subject} +

${offer.text}

+ ${button} +
+ `; + return offerElement; +} + +function handleOffers(block, offer, index) { + const edOffer = createEdOffer(offer, index); + block.append(edOffer); +} + +export default function decorate(block) { + const content = block.textContent.trim(); + const editedContent = content.replace('Personalization ED:', '').trim(); + if (!isValidJSON(editedContent)) { + block.parentElement.remove(); + return; + } + const data = JSON.parse(editedContent); + block.children[0].remove(); + data.forEach((offer, index) => { + if (Array.isArray(offer.content)) { + offer.content.forEach((subOffer, subIndex) => { + handleOffers(block, subOffer, subIndex); + }); + } else { + handleOffers(block, offer.content, index); + } + }); +} \ No newline at end of file diff --git a/icons/netcentric-logo.svg b/icons/netcentric-logo.svg index 124e71fc..5cc022a4 100644 --- a/icons/netcentric-logo.svg +++ b/icons/netcentric-logo.svg @@ -1,2 +1,249 @@ - \ No newline at end of file +AAA0RGp1bWIAAAAeanVtZGMycGEAEQAQgAAAqgA4m3EDYzJwYQAAADQeanVtYgAAAEdqdW1kYzJtYQARABCAAACqADibcQN1cm46dXVpZDpjM2E2ZTFjYS1hYjM0LTRlYjgtYjYyNC0zNzBiMTk2NzE1OWYAAAABtGp1bWIAAAApanVtZGMyYXMAEQAQgAAAqgA4m3EDYzJwYS5hc3NlcnRpb25zAAAAANdqdW1iAAAAJmp1bWRjYm9yABEAEIAAAKoAOJtxA2MycGEuYWN0aW9ucwAAAACpY2JvcqFnYWN0aW9uc4GjZmFjdGlvbmtjMnBhLmVkaXRlZG1zb2Z0d2FyZUFnZW50bUFkb2JlIEZpcmVmbHlxZGlnaXRhbFNvdXJjZVR5cGV4U2h0dHA6Ly9jdi5pcHRjLm9yZy9uZXdzY29kZXMvZGlnaXRhbHNvdXJjZXR5cGUvY29tcG9zaXRlV2l0aFRyYWluZWRBbGdvcml0aG1pY01lZGlhAAAArGp1bWIAAAAoanVtZGNib3IAEQAQgAAAqgA4m3EDYzJwYS5oYXNoLmRhdGEAAAAAfGNib3KlamV4Y2x1c2lvbnOBomVzdGFydBjLZmxlbmd0aBlFsGRuYW1lbmp1bWJmIG1hbmlmZXN0Y2FsZ2ZzaGEyNTZkaGFzaFggVk4MIgiqQULhAYdAEkT4Uct23y/7da0h7Q91eWVMeGVjcGFkSQAAAAAAAAAAAAAAAgtqdW1iAAAAJGp1bWRjMmNsABEAEIAAAKoAOJtxA2MycGEuY2xhaW0AAAAB32Nib3KoaGRjOnRpdGxlb0dlbmVyYXRlZCBJbWFnZWlkYzpmb3JtYXRtaW1hZ2Uvc3ZnK3htbGppbnN0YW5jZUlEeCx4bXA6aWlkOjFhZTdkZDk4LTYwOTAtNDEzNy1iODVhLTJmYmNmNTI1YTA1YW9jbGFpbV9nZW5lcmF0b3J4NkFkb2JlX0lsbHVzdHJhdG9yLzI5LjIgYWRvYmVfYzJwYS8wLjcuNiBjMnBhLXJzLzAuMjUuMnRjbGFpbV9nZW5lcmF0b3JfaW5mb4G/ZG5hbWVxQWRvYmUgSWxsdXN0cmF0b3JndmVyc2lvbmQyOS4y/2lzaWduYXR1cmV4GXNlbGYjanVtYmY9YzJwYS5zaWduYXR1cmVqYXNzZXJ0aW9uc4KiY3VybHg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8rEdI28UFckxnxjmDhYsHV2NwYWRZE4UAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPZZAQAqS4UN9r+zolDR0iXvX/Bon62+Qjatd38001guqw6UDvJtmn/sRKy8s0uGhNN0Wd2WcarCFasIPNvIQbYyOOtfV0kA30slTbbVnropIfbtmw6TOwK0JzjlzlJzQDzXq00vMZc76TxSGEBgmSvVJgTLy4VaGtlbKfP/x6vVPATVEOX+99aYzpAQpUkCaqzo0yb646fXL2yOhMqT6c1h+4Q2kYTMdgLmd9S1F9PMQ2j19cz49AS3ZLq8M75hdYyXdpvmRxcDfF93e3i3NfoF1LzbSxjULbby8mU0lE5HGsLab8htMM0XEHOS+vJcZfVZjH40Zma9LxQsMeMdqoeAjdn3 + + + + + + E + X + P + E + R + I + E + N + C + E + + M + A + N + A + G + E + R + R + O + C + K + S + T + A + R + 20 + 25 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + EST 2017 + + + + + + + + + + + diff --git a/scripts/login.js b/scripts/login.js new file mode 100644 index 00000000..5b3532f3 --- /dev/null +++ b/scripts/login.js @@ -0,0 +1,301 @@ +import { handleHardReload, getCookie } from './personalisation-helpers.js'; + +let userLoggedIn = false; + +function resetForm(form) { + const inputs = form.querySelectorAll('input'); + inputs.forEach((input) => { + input.value = ''; + }); +} + +function resetValidationErrors(form) { + const errorMessages = form.querySelectorAll('.error-message'); + const inputs = form.querySelectorAll('input'); + + errorMessages.forEach((errorMessage) => { + errorMessage.remove(); + }); + inputs.forEach((input) => { + input.classList.remove('error'); + }); +} + +function validateForm(form) { + const inputs = form.querySelectorAll('input'); + let isValid = true; + resetValidationErrors(form); + + inputs.forEach((input) => { + const errorMessage = document.createElement('span'); + input.before(errorMessage); + + if (input.required && !input.value) { + errorMessage.textContent = 'This field is required'; + errorMessage.className = 'error-message'; + isValid = false; + input.classList.add('error'); + } + if (input.dataset.validate === 'email') { + const emailPattern = /^[^\s@]+@[^\s@]+\.[^\s@]+$/; + if (!emailPattern.test(input.value)) { + errorMessage.textContent = 'Please enter a valid email address'; + errorMessage.className = 'error-message'; + isValid = false; + input.classList.add('error'); + } + } + }); + + return isValid; +} + +function createDialog() { + const dialog = document.createElement('dialog'); + dialog.className = 'login-dialog'; + dialog.innerHTML = ` +
+
+
+ + + + + +
+
+
+`; + window.document.body.appendChild(dialog); + return dialog; +} + +function generateUUID() { + let d = new Date().getTime(); + + // Use high-precision timer if available + if (typeof performance !== 'undefined' && typeof performance.now === 'function') { + d += performance.now(); + } + + return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) { + const r = (d + Math.random() * 16) % 16 | 0; + d = Math.floor(d / 16); + return (c === 'x' ? r : (r & 0x3 | 0x8)).toString(16); + }); +} + +async function post(request, callback) { + try { + const response = await fetch(request); + const result = await response.json(); + console.log("Success:", result); + if (callback) callback(); + } catch (error) { + console.error("Error:", error); + } +} + +function sentSignInData(form , callback) { + const data = { + "header": { + "schemaRef": { + "id": "https://ns.adobe.com/netcentricgmbh/schemas/709781f368368fceb6e2fb8c62b4def7ad2d6c2e91f98551", + "contentType": "application/vnd.adobe.xed-full+json;version=1" + }, + "imsOrgId": "FA907D44536A3C2B0A490D4D@AdobeOrg", + "source": { + "name": "postman" + }, + "datasetId": "67b1acd4627d0f2aefaca606" + }, + "body": { + "xdmMeta": { + "schemaRef": { + "id": "https://ns.adobe.com/netcentricgmbh/schemas/709781f368368fceb6e2fb8c62b4def7ad2d6c2e91f98551", + "contentType": "application/vnd.adobe.xed-full+json;version=1" + } + }, + "xdmEntity": { + "_id": generateUUID(), + "identityMap": { + "email": [ + { + "id": form.email.value + } + ] + }, + "consents": { + "marketing": { + "preferred": "email", + "postalMail": { + "val": "y" + }, + "email": { + "val": "y" + }, + "call": { + "val": "n" + }, + "any": { + "val": "y" + } + } + }, + "person": { + "name": { + "lastName": form.lastName.value, + "firstName": form.firstName.value + } + }, + "homeAddress": { + "label": form.company.value + }, + "personalEmail": { + "address": form.email.value + } + } + } + }; + + const request = new Request("https://dcs.adobedc.net/collection/d51a67adf7de6444b4bd4be318417667b13aea942d5d1edd548ad7174419a7be?syncValidation=true", { + method: "POST", + headers: { + "Content-Type": "application/json", + }, + body: JSON.stringify(data), + }); + + post(request, callback); +} + +function createSignInButton(button) { + if (userLoggedIn) return; + const signInButton = document.createElement('a'); + signInButton.href = '#'; + signInButton.textContent = 'Sign Up'; + button.parentElement.append(signInButton); + + const dialog = document.createElement('dialog'); + dialog.className = 'login-dialog'; + dialog.innerHTML = ` +
+
+
+ + + + + + +
+ +
+ + +
+
+ + + + + + + +
+
+
+ `; + window.document.body.appendChild(dialog); + const submitButton = dialog.querySelector('button'); + + signInButton.addEventListener('click', (e) => { + e.preventDefault(); + dialog.showModal(); + }); + + dialog.addEventListener('click', (e) => { + if (e.target === dialog) { + dialog.close(); + resetValidationErrors(document.forms.signInForm); + } + }); + + submitButton.addEventListener('click', (e) => { + e.preventDefault(); + const form = document.forms.signInForm; + const isValid = validateForm(form); + + + if (isValid) { + sentSignInData(form, () => { + dialog.close(); + document.cookie = `ncUser=${form.email.value}`; + userLoggedIn = true; + handleHardReload(window.location.href); + }); + } + }); +} + +function setUpButtonText(button) { + const firstName = window.personalizationData.content?.firstName ? `${window.personalizationData.content.firstName},` : ''; + button.textContent = userLoggedIn ? `${firstName} Log Out` : 'Log In'; +} + +function setUserCookie(data) { + document.cookie = `ncUser=${data}`; + userLoggedIn = true; +} + +function removeUserCookie() { + document.cookie = 'ncUser=; expires=Thu, 01 Jan 1970 00:00:00 UTC;'; + window.personalizationData = {}; + userLoggedIn = false; +} + +export default function initLogIn(button) { + const dialog = createDialog(); + const submitButton = dialog.querySelector('button'); + window.personalizationData = window.personalizationData || {}; + userLoggedIn = getCookie('ncUser'); + setUpButtonText(button); + button.href = '#'; + createSignInButton(button) + + button.addEventListener('click', (e) => { + e.preventDefault(); + + if (userLoggedIn) { + document.cookie = 'userchanged=true'; + removeUserCookie(); + setUpButtonText(button); + handleHardReload(window.location.href); + } else { + resetForm(document.forms.loginForm); + dialog.showModal(); + } + }); + + dialog.addEventListener('click', (e) => { + if (e.target === dialog) { + dialog.close(); + resetValidationErrors(document.forms.loginForm); + } + }); + + submitButton.addEventListener('click', (e) => { + e.preventDefault(); + const form = document.forms.loginForm; + const email = form.email.value; + const isValid = validateForm(form); + + if (isValid) { + document.cookie = 'userchanged=; expires=Thu, 01 Jan 1970 00:00:00 UTC;'; + setUserCookie(email); + setUpButtonText(button); + dialog.close(); + handleHardReload(window.location.href); + } + }); +} \ No newline at end of file diff --git a/scripts/personalisation-helpers.js b/scripts/personalisation-helpers.js new file mode 100644 index 00000000..254e9f48 --- /dev/null +++ b/scripts/personalisation-helpers.js @@ -0,0 +1,40 @@ +async function handleHardReload(url) { + window.location.href = url + '?nocache=' + Math.random()*1e5; +} + +function isValidJSON(str) { + try { + JSON.parse(str); + return true; + } catch (e) { + return false; + } +} + +function getImageURL(imageUrl) { + const validHosts = ['www.netcentric.biz', 'rockstar.moment-innovation.com'] + const url = new URL(imageUrl); + if (validHosts.includes(url.hostname)) { + return url.pathname; + } + return imageUrl; +} + +function getCookie(cookieStartName) { + const decodedCookie = decodeURIComponent(document.cookie); + const ca = decodedCookie.split(';'); + for (let i = 0; i < ca.length; i++) { + const c = ca[i].trim(); + if (c.startsWith(cookieStartName)) { + return c.substring(c.indexOf('=') + 1); + } + } + return ''; +} + +export { + handleHardReload, + isValidJSON, + getImageURL, + getCookie +} \ No newline at end of file diff --git a/styles/styles.css b/styles/styles.css index 97b0508e..d5571502 100644 --- a/styles/styles.css +++ b/styles/styles.css @@ -737,3 +737,93 @@ main .section.text-white { animation: none; } +.login-dialog { + padding: 0; + border: none; + border-radius: 5px; + + &::backdrop { + background-color: rgba(0, 0, 0, 0.5); + cursor: pointer; + } + + .login-dialog-content { + padding: 40px; + + @media (min-width: 900px) { + max-width: 600px; + } + } + + .form-wrapper { + position: relative; + + > div { + margin-bottom: 20px; + } + } + + input { + &.error { + border: 1px solid var(--c-error); + } + } + .error-message { + color: var(--c-error); + font-size: 14px; + margin-top: 5px; + position: absolute; + right: 0; + } + + input:not([type='checkbox']), + button { + box-sizing: border-box; + font-size: 16px; + line-height: 28px; + padding: 8px 16px; + margin-bottom: 20px; + width: 100%; + min-height: 44px; + border: unset; + border-radius: 4px; + outline-color: rgb(84 105 212 / 0.5); + background-color: rgb(255, 255, 255); + box-shadow: rgba(0, 0, 0, 0) 0px 0px 0px 0px, + rgba(0, 0, 0, 0) 0px 0px 0px 0px, + rgba(0, 0, 0, 0) 0px 0px 0px 0px, + rgba(60, 66, 87, 0.16) 0px 0px 0px 1px, + rgba(0, 0, 0, 0) 0px 0px 0px 0px, + rgba(0, 0, 0, 0) 0px 0px 0px 0px, + rgba(0, 0, 0, 0) 0px 0px 0px 0px; + } + + button { + margin-top: 20px; + margin-bottom: 0; + background-color: var(--c-dark-plum); + box-shadow: rgba(0, 0, 0, 0) 0px 0px 0px 0px, + rgba(0, 0, 0, 0) 0px 0px 0px 0px, + rgba(0, 0, 0, 0.12) 0px 1px 1px 0px, + rgb(84, 105, 212) 0px 0px 0px 1px, + rgba(0, 0, 0, 0) 0px 0px 0px 0px, + rgba(0, 0, 0, 0) 0px 0px 0px 0px, + rgba(60, 66, 87, 0.08) 0px 2px 5px 0px; + color: #fff; + font-weight: 600; + cursor: pointer; + } +} + +.icon-netcentric-logo.personalized { + width: 110px !important; + height: 110px !important; + overflow: hidden; + border-radius: 50%; + + img { + object-fit: cover; + height: 100%; + width: 100% ; + } +} \ No newline at end of file