From 3be818def5183b361bb5bbde4af7c29d5b08efda Mon Sep 17 00:00:00 2001 From: Valdas <13677203+jvaldas@users.noreply.github.com> Date: Mon, 10 Feb 2025 17:07:21 +0100 Subject: [PATCH 01/33] Update netcentric-logo.svg with rockstar2025 --- icons/netcentric-logo.svg | 249 +++++++++++++++++++++++++++++++++++++- 1 file changed, 248 insertions(+), 1 deletion(-) 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 + + + + + + + + + + + From 023c13db9e1ba2d34366aa5ec85251acbc55b616 Mon Sep 17 00:00:00 2001 From: Joan Beltran Date: Fri, 14 Feb 2025 12:37:03 +0100 Subject: [PATCH 02/33] add login form --- blocks/header/header.js | 3 ++ scripts/login.js | 87 +++++++++++++++++++++++++++++++++++++++++ styles/styles.css | 52 ++++++++++++++++++++++++ 3 files changed, 142 insertions(+) create mode 100644 scripts/login.js diff --git a/blocks/header/header.js b/blocks/header/header.js index c564c73b..60c6fdca 100644 --- a/blocks/header/header.js +++ b/blocks/header/header.js @@ -1,5 +1,6 @@ import { decorateIcons, getMetadata, getLanguagePath } from '../../scripts/lib-franklin.js'; import { addChevronToButtons } from '../../scripts/scripts.js'; +import initLogIn from '../../scripts/login.js'; const mobileBreakpoint = 900; let globalWindowWidth = window.innerWidth; @@ -106,6 +107,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; diff --git a/scripts/login.js b/scripts/login.js new file mode 100644 index 00000000..6580d675 --- /dev/null +++ b/scripts/login.js @@ -0,0 +1,87 @@ +let userLoggedIn = false; + +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 ''; +} + +function validateForm(form) { + return true; +} + +function createDialog() { + const dialog = document.createElement('dialog'); + dialog.className = 'login-dialog'; + dialog.innerHTML = ` +
+ +
+`; + window.document.body.appendChild(dialog); + return dialog; +} + +function setUpButtonText(button) { + button.textContent = userLoggedIn ? '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;'; + userLoggedIn = false; +} + +export default function initLogIn(button) { + const dialog = createDialog(); + const submitButton = dialog.querySelector('button'); + userLoggedIn = getCookie('ncUser'); + setUpButtonText(button); + button.href = '#'; + + button.addEventListener('click', (e) => { + e.preventDefault(); + + if (userLoggedIn) { + removeUserCookie() + setUpButtonText(button); + } else { + dialog.showModal(); + } + }); + + dialog.addEventListener('click', (e) => { + if (e.target === dialog) { + dialog.close(); + } + }); + + submitButton.addEventListener('click', (e) => { + e.preventDefault(); + const form = document.forms.loginForm; + const email = form.email.value; + const isValid = validateForm(form); + + if (isValid) { + setUserCookie(email); + setUpButtonText(button); + dialog.close(); + } + }); +} \ No newline at end of file diff --git a/styles/styles.css b/styles/styles.css index 97b0508e..33405391 100644 --- a/styles/styles.css +++ b/styles/styles.css @@ -737,3 +737,55 @@ 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; + } + + input, + 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; + } +} \ No newline at end of file From 30bb774d58a5321a1c5209a85c11edc082d7c46e Mon Sep 17 00:00:00 2001 From: Joan Beltran Date: Fri, 14 Feb 2025 14:33:53 +0100 Subject: [PATCH 03/33] basic validation --- scripts/login.js | 60 ++++++++++++++++++++++++++++++++++++++++++----- styles/styles.css | 17 ++++++++++++++ 2 files changed, 71 insertions(+), 6 deletions(-) diff --git a/scripts/login.js b/scripts/login.js index 6580d675..35e029a8 100644 --- a/scripts/login.js +++ b/scripts/login.js @@ -12,8 +12,52 @@ function getCookie(cookieStartName) { return ''; } +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) { - return true; + 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() { @@ -22,11 +66,13 @@ function createDialog() { dialog.innerHTML = `
`; @@ -62,6 +108,7 @@ export default function initLogIn(button) { removeUserCookie() setUpButtonText(button); } else { + resetForm(document.forms.loginForm); dialog.showModal(); } }); @@ -69,6 +116,7 @@ export default function initLogIn(button) { dialog.addEventListener('click', (e) => { if (e.target === dialog) { dialog.close(); + resetValidationErrors(document.forms.loginForm); } }); diff --git a/styles/styles.css b/styles/styles.css index 33405391..2a98da96 100644 --- a/styles/styles.css +++ b/styles/styles.css @@ -751,6 +751,23 @@ main .section.text-white { padding: 40px; } + .form-wrapper { + position: relative; + } + + 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, button { box-sizing: border-box; From acb4838b043653bc8bb1fd4a47ca02293698ab7e Mon Sep 17 00:00:00 2001 From: Joan Beltran Date: Mon, 17 Feb 2025 11:41:00 +0100 Subject: [PATCH 04/33] reload when adding/removing the cookie --- scripts/login.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/scripts/login.js b/scripts/login.js index 35e029a8..cc011868 100644 --- a/scripts/login.js +++ b/scripts/login.js @@ -107,6 +107,7 @@ export default function initLogIn(button) { if (userLoggedIn) { removeUserCookie() setUpButtonText(button); + window.location.reload(); } else { resetForm(document.forms.loginForm); dialog.showModal(); @@ -130,6 +131,7 @@ export default function initLogIn(button) { setUserCookie(email); setUpButtonText(button); dialog.close(); + window.location.reload(); } }); } \ No newline at end of file From 4a744656bb80c79c211b9025fe0d5cd6dbcd0f96 Mon Sep 17 00:00:00 2001 From: Joan Beltran Date: Tue, 25 Feb 2025 16:03:08 +0100 Subject: [PATCH 05/33] add userchanged cookie --- scripts/login.js | 1 + 1 file changed, 1 insertion(+) diff --git a/scripts/login.js b/scripts/login.js index cc011868..0a878e2d 100644 --- a/scripts/login.js +++ b/scripts/login.js @@ -86,6 +86,7 @@ function setUpButtonText(button) { function setUserCookie(data) { document.cookie = `ncUser=${data}`; + document.cookie = 'userchanged=true'; userLoggedIn = true; } From 3ba2334a642df120096c910822388f86cf13810f Mon Sep 17 00:00:00 2001 From: Joan Beltran Date: Wed, 26 Feb 2025 16:36:42 +0100 Subject: [PATCH 06/33] style personalisation --- .../personalization-card.css | 28 +++++++++++++++++ .../personalization-card.js | 30 +++++++++++++++++++ .../personalization-cbe.css | 28 +++++++++++++++++ .../personalization-cbe.js | 30 +++++++++++++++++++ .../personalization-ed/personalization-ed.css | 28 +++++++++++++++++ .../personalization-ed/personalization-ed.js | 30 +++++++++++++++++++ 6 files changed, 174 insertions(+) create mode 100644 blocks/personalization-card/personalization-card.css create mode 100644 blocks/personalization-card/personalization-card.js create mode 100644 blocks/personalization-cbe/personalization-cbe.css create mode 100644 blocks/personalization-cbe/personalization-cbe.js create mode 100644 blocks/personalization-ed/personalization-ed.css create mode 100644 blocks/personalization-ed/personalization-ed.js diff --git a/blocks/personalization-card/personalization-card.css b/blocks/personalization-card/personalization-card.css new file mode 100644 index 00000000..47782e42 --- /dev/null +++ b/blocks/personalization-card/personalization-card.css @@ -0,0 +1,28 @@ +.personalization-card { + display: grid; + grid-template-columns: 1fr; + grid-column-gap: 20px; + margin-top: 20px; + + > *:first-child { + grid-column: span 2; + } + + > *:not(:first-child) { + grid-column: span 1; + } + + > *:only-child { + grid-column: span 2; + } + + @media (min-width: 600px) { + grid-template-columns: 1fr 1fr; + } + + .card-offer { + border: 1px solid #e0e0e0; + padding: 20px; + margin-block-end: 20px; + } +} \ 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..e0756195 --- /dev/null +++ b/blocks/personalization-card/personalization-card.js @@ -0,0 +1,30 @@ +function isValidJSON(str) { + try { + JSON.parse(str); + return true; + } catch (e) { + return false; + } +} + +function createCardOffer(offer) { + const offerElement = document.createElement('div'); + offerElement.classList.add('card-offer'); + offerElement.innerHTML = ` +

${offer.content?.body?.content}

+ `; + return offerElement; +} + +export default function decorate(block) { + const content = block.textContent.trim(); + const editedContent = content.replace('Personalization Card:', '').trim(); + if(!isValidJSON(editedContent)) return; + const data = JSON.parse(editedContent); + block.children[0].remove(); + data.forEach((offer) => { + const cardOffer = createCardOffer(offer); + block.append(cardOffer); + }); + block.append(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..ac6a338b --- /dev/null +++ b/blocks/personalization-cbe/personalization-cbe.css @@ -0,0 +1,28 @@ +.personalization-cbe { + display: grid; + grid-template-columns: 1fr; + grid-column-gap: 20px; + margin-top: 20px; + + > *:first-child { + grid-column: span 2; + } + + > *:not(:first-child) { + grid-column: span 1; + } + + > *:only-child { + grid-column: span 2; + } + + @media (min-width: 600px) { + grid-template-columns: 1fr 1fr; + } + + .cbe-offer { + border: 1px solid #2f78c4; + padding: 20px; + margin-block-end: 20px; + } +} \ 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..fa35b2cc --- /dev/null +++ b/blocks/personalization-cbe/personalization-cbe.js @@ -0,0 +1,30 @@ +function isValidJSON(str) { + try { + JSON.parse(str); + return true; + } catch (e) { + return false; + } +} + +function createCbeOffer(offer) { + const offerElement = document.createElement('div'); + offerElement.classList.add('cbe-offer'); + offerElement.innerHTML = ` +

${offer.content?.content}

+ `; + return offerElement; +} + +export default function decorate(block) { + const content = block.textContent.trim(); + const editedContent = content.replace('Personalization CBE:', '').trim(); + if(!isValidJSON(editedContent)) return; + const data = JSON.parse(editedContent); + block.children[0].remove(); + data.forEach((offer) => { + const cbeOffer = createCbeOffer(offer); + block.append(cbeOffer); + }); + block.append(content); +} \ 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..edb29413 --- /dev/null +++ b/blocks/personalization-ed/personalization-ed.css @@ -0,0 +1,28 @@ +.personalization-ed { + display: grid; + grid-template-columns: 1fr; + grid-column-gap: 20px; + margin-top: 20px; + + > *:first-child { + grid-column: span 2; + } + + > *:not(:first-child) { + grid-column: span 1; + } + + > *:only-child { + grid-column: span 2; + } + + @media (min-width: 600px) { + grid-template-columns: 1fr 1fr; + } + + .ed-offer { + border: 1px solid #06c7cc; + padding: 20px; + margin-block-end: 20px; + } +} \ 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..4a18d117 --- /dev/null +++ b/blocks/personalization-ed/personalization-ed.js @@ -0,0 +1,30 @@ +function isValidJSON(str) { + try { + JSON.parse(str); + return true; + } catch (e) { + return false; + } +} + +function createEdOffer(offer) { + const offerElement = document.createElement('div'); + offerElement.classList.add('ed-offer'); + offerElement.innerHTML = ` +

${offer.content?.content}

+ `; + return offerElement; +} + +export default function decorate(block) { + const content = block.textContent.trim(); + const editedContent = content.replace('Personalization ED:', '').trim(); + if(!isValidJSON(editedContent)) return; + const data = JSON.parse(editedContent); + block.children[0].remove(); + data.forEach((offer) => { + const edOffer = createEdOffer(offer); + block.append(edOffer); + }); + block.append(content); +} \ No newline at end of file From f970d1297a92533b45e1a2a51f65afb010aa825b Mon Sep 17 00:00:00 2001 From: Joan Beltran Date: Tue, 4 Mar 2025 18:48:26 +0100 Subject: [PATCH 07/33] different levels of offers --- .../personalization-card/personalization-card.js | 14 ++++++++++++-- blocks/personalization-cbe/personalization-cbe.js | 14 ++++++++++++-- blocks/personalization-ed/personalization-ed.js | 14 ++++++++++++-- 3 files changed, 36 insertions(+), 6 deletions(-) diff --git a/blocks/personalization-card/personalization-card.js b/blocks/personalization-card/personalization-card.js index e0756195..9005392b 100644 --- a/blocks/personalization-card/personalization-card.js +++ b/blocks/personalization-card/personalization-card.js @@ -16,6 +16,11 @@ function createCardOffer(offer) { return offerElement; } +function handleOffers(block, offer) { + const cardOffer = createCardOffer(offer); + block.append(cardOffer); +} + export default function decorate(block) { const content = block.textContent.trim(); const editedContent = content.replace('Personalization Card:', '').trim(); @@ -23,8 +28,13 @@ export default function decorate(block) { const data = JSON.parse(editedContent); block.children[0].remove(); data.forEach((offer) => { - const cardOffer = createCardOffer(offer); - block.append(cardOffer); + if (Array.isArray(offer.content)) { + offer.forEach((subOffer) => { + handleOffers(block, subOffer); + }); + } else { + handleOffers(block, offer); + } }); block.append(content); } \ No newline at end of file diff --git a/blocks/personalization-cbe/personalization-cbe.js b/blocks/personalization-cbe/personalization-cbe.js index fa35b2cc..c5dee981 100644 --- a/blocks/personalization-cbe/personalization-cbe.js +++ b/blocks/personalization-cbe/personalization-cbe.js @@ -16,6 +16,11 @@ function createCbeOffer(offer) { return offerElement; } +function handleOffers(block, offer) { + const cbeOffer = createCbeOffer(offer); + block.append(cbeOffer); +} + export default function decorate(block) { const content = block.textContent.trim(); const editedContent = content.replace('Personalization CBE:', '').trim(); @@ -23,8 +28,13 @@ export default function decorate(block) { const data = JSON.parse(editedContent); block.children[0].remove(); data.forEach((offer) => { - const cbeOffer = createCbeOffer(offer); - block.append(cbeOffer); + if (Array.isArray(offer.content)) { + offer.forEach((subOffer) => { + handleOffers(block, subOffer); + }); + } else { + handleOffers(block, offer); + } }); block.append(content); } \ No newline at end of file diff --git a/blocks/personalization-ed/personalization-ed.js b/blocks/personalization-ed/personalization-ed.js index 4a18d117..b2e91f68 100644 --- a/blocks/personalization-ed/personalization-ed.js +++ b/blocks/personalization-ed/personalization-ed.js @@ -16,6 +16,11 @@ function createEdOffer(offer) { return offerElement; } +function handleOffers(block, offer) { + const edOffer = createEdOffer(offer); + block.append(edOffer); +} + export default function decorate(block) { const content = block.textContent.trim(); const editedContent = content.replace('Personalization ED:', '').trim(); @@ -23,8 +28,13 @@ export default function decorate(block) { const data = JSON.parse(editedContent); block.children[0].remove(); data.forEach((offer) => { - const edOffer = createEdOffer(offer); - block.append(edOffer); + if (Array.isArray(offer.content)) { + offer.forEach((subOffer) => { + handleOffers(block, subOffer); + }); + } else { + handleOffers(block, offer); + } }); block.append(content); } \ No newline at end of file From 3e2a59bcce4be0bcaa03822356ac02a59147e86c Mon Sep 17 00:00:00 2001 From: Joan Beltran Date: Wed, 5 Mar 2025 12:11:41 +0100 Subject: [PATCH 08/33] fix suboffers --- blocks/personalization-card/personalization-card.js | 6 +++--- blocks/personalization-cbe/personalization-cbe.js | 6 +++--- blocks/personalization-ed/personalization-ed.js | 6 +++--- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/blocks/personalization-card/personalization-card.js b/blocks/personalization-card/personalization-card.js index 9005392b..118eb7f7 100644 --- a/blocks/personalization-card/personalization-card.js +++ b/blocks/personalization-card/personalization-card.js @@ -11,7 +11,7 @@ function createCardOffer(offer) { const offerElement = document.createElement('div'); offerElement.classList.add('card-offer'); offerElement.innerHTML = ` -

${offer.content?.body?.content}

+

${offer.body?.content}

`; return offerElement; } @@ -29,11 +29,11 @@ export default function decorate(block) { block.children[0].remove(); data.forEach((offer) => { if (Array.isArray(offer.content)) { - offer.forEach((subOffer) => { + offer.content.forEach((subOffer) => { handleOffers(block, subOffer); }); } else { - handleOffers(block, offer); + handleOffers(block, offer.content); } }); block.append(content); diff --git a/blocks/personalization-cbe/personalization-cbe.js b/blocks/personalization-cbe/personalization-cbe.js index c5dee981..860ad793 100644 --- a/blocks/personalization-cbe/personalization-cbe.js +++ b/blocks/personalization-cbe/personalization-cbe.js @@ -11,7 +11,7 @@ function createCbeOffer(offer) { const offerElement = document.createElement('div'); offerElement.classList.add('cbe-offer'); offerElement.innerHTML = ` -

${offer.content?.content}

+

${offer.content}

`; return offerElement; } @@ -29,11 +29,11 @@ export default function decorate(block) { block.children[0].remove(); data.forEach((offer) => { if (Array.isArray(offer.content)) { - offer.forEach((subOffer) => { + offer.content.forEach((subOffer) => { handleOffers(block, subOffer); }); } else { - handleOffers(block, offer); + handleOffers(block, offer.content); } }); block.append(content); diff --git a/blocks/personalization-ed/personalization-ed.js b/blocks/personalization-ed/personalization-ed.js index b2e91f68..6fdef2ed 100644 --- a/blocks/personalization-ed/personalization-ed.js +++ b/blocks/personalization-ed/personalization-ed.js @@ -11,7 +11,7 @@ function createEdOffer(offer) { const offerElement = document.createElement('div'); offerElement.classList.add('ed-offer'); offerElement.innerHTML = ` -

${offer.content?.content}

+

${offer.content}

`; return offerElement; } @@ -29,11 +29,11 @@ export default function decorate(block) { block.children[0].remove(); data.forEach((offer) => { if (Array.isArray(offer.content)) { - offer.forEach((subOffer) => { + offer.content.forEach((subOffer) => { handleOffers(block, subOffer); }); } else { - handleOffers(block, offer); + handleOffers(block, offer.content); } }); block.append(content); From e7608eec19f73e81a27bf0c2bb9bdc37f9a43db4 Mon Sep 17 00:00:00 2001 From: Joan Beltran Date: Wed, 5 Mar 2025 12:44:04 +0100 Subject: [PATCH 09/33] hard reload on login logout --- .../personalization-card.js | 9 +------ .../personalization-cbe.js | 9 +------ .../personalization-ed/personalization-ed.js | 9 +------ scripts/login.js | 6 +++-- scripts/personalisation-helpers.js | 26 +++++++++++++++++++ 5 files changed, 33 insertions(+), 26 deletions(-) create mode 100644 scripts/personalisation-helpers.js diff --git a/blocks/personalization-card/personalization-card.js b/blocks/personalization-card/personalization-card.js index 118eb7f7..acd67ffc 100644 --- a/blocks/personalization-card/personalization-card.js +++ b/blocks/personalization-card/personalization-card.js @@ -1,11 +1,4 @@ -function isValidJSON(str) { - try { - JSON.parse(str); - return true; - } catch (e) { - return false; - } -} +import { isValidJSON } from '../../scripts/personalisation-helpers.js'; function createCardOffer(offer) { const offerElement = document.createElement('div'); diff --git a/blocks/personalization-cbe/personalization-cbe.js b/blocks/personalization-cbe/personalization-cbe.js index 860ad793..00737c77 100644 --- a/blocks/personalization-cbe/personalization-cbe.js +++ b/blocks/personalization-cbe/personalization-cbe.js @@ -1,11 +1,4 @@ -function isValidJSON(str) { - try { - JSON.parse(str); - return true; - } catch (e) { - return false; - } -} +import { isValidJSON } from '../../scripts/personalisation-helpers.js'; function createCbeOffer(offer) { const offerElement = document.createElement('div'); diff --git a/blocks/personalization-ed/personalization-ed.js b/blocks/personalization-ed/personalization-ed.js index 6fdef2ed..aa4e1c0a 100644 --- a/blocks/personalization-ed/personalization-ed.js +++ b/blocks/personalization-ed/personalization-ed.js @@ -1,11 +1,4 @@ -function isValidJSON(str) { - try { - JSON.parse(str); - return true; - } catch (e) { - return false; - } -} +import { isValidJSON } from '../../scripts/personalisation-helpers.js'; function createEdOffer(offer) { const offerElement = document.createElement('div'); diff --git a/scripts/login.js b/scripts/login.js index 0a878e2d..a2a2ca34 100644 --- a/scripts/login.js +++ b/scripts/login.js @@ -1,3 +1,5 @@ +import { handleHardReload } from './personalisation-helpers.js'; + let userLoggedIn = false; function getCookie(cookieStartName) { @@ -108,7 +110,7 @@ export default function initLogIn(button) { if (userLoggedIn) { removeUserCookie() setUpButtonText(button); - window.location.reload(); + handleHardReload(window.location.href); } else { resetForm(document.forms.loginForm); dialog.showModal(); @@ -132,7 +134,7 @@ export default function initLogIn(button) { setUserCookie(email); setUpButtonText(button); dialog.close(); - window.location.reload(); + 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..d1781acd --- /dev/null +++ b/scripts/personalisation-helpers.js @@ -0,0 +1,26 @@ +async function handleHardReload(url) { + await fetch(url, { + headers: { + Pragma: 'no-cache', + Expires: '-1', + 'Cache-Control': 'no-cache', + }, + }); + window.location.href = url; + // This is to ensure reload with url's having '#' + window.location.reload(); +} + +function isValidJSON(str) { + try { + JSON.parse(str); + return true; + } catch (e) { + return false; + } +} + +export { + handleHardReload, + isValidJSON +} \ No newline at end of file From c0889ebdf6f4926837a1c59f713f98f344f9e60c Mon Sep 17 00:00:00 2001 From: Joan Beltran Date: Wed, 5 Mar 2025 15:10:39 +0100 Subject: [PATCH 10/33] nocache --- scripts/personalisation-helpers.js | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/scripts/personalisation-helpers.js b/scripts/personalisation-helpers.js index d1781acd..d78d0fd8 100644 --- a/scripts/personalisation-helpers.js +++ b/scripts/personalisation-helpers.js @@ -1,11 +1,5 @@ async function handleHardReload(url) { - await fetch(url, { - headers: { - Pragma: 'no-cache', - Expires: '-1', - 'Cache-Control': 'no-cache', - }, - }); + await fetch(url+ '?nocache=' + Math.random()*1e5|0); window.location.href = url; // This is to ensure reload with url's having '#' window.location.reload(); From 20ea2517119909ffe41caed371a21973039d2e07 Mon Sep 17 00:00:00 2001 From: Joan Beltran Date: Wed, 5 Mar 2025 15:38:57 +0100 Subject: [PATCH 11/33] adding nocache param --- scripts/personalisation-helpers.js | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/scripts/personalisation-helpers.js b/scripts/personalisation-helpers.js index d78d0fd8..ed79e483 100644 --- a/scripts/personalisation-helpers.js +++ b/scripts/personalisation-helpers.js @@ -1,8 +1,5 @@ async function handleHardReload(url) { - await fetch(url+ '?nocache=' + Math.random()*1e5|0); - window.location.href = url; - // This is to ensure reload with url's having '#' - window.location.reload(); + window.location.href = url + '?nocache=' + Math.random()*1e5; } function isValidJSON(str) { From 6b30b770a3f5e41f4bc2327b5dffd0575dc498ee Mon Sep 17 00:00:00 2001 From: Joan Beltran Date: Thu, 6 Mar 2025 18:56:26 +0100 Subject: [PATCH 12/33] add images --- blocks/header/header.css | 2 +- .../personalization-card.css | 5 ++--- .../personalization-cbe.css | 18 +++++++++++++----- .../personalization-cbe/personalization-cbe.js | 6 ++++-- .../personalization-ed/personalization-ed.css | 18 +++++++++++++----- .../personalization-ed/personalization-ed.js | 6 ++++-- scripts/personalisation-helpers.js | 12 +++++++++++- 7 files changed, 48 insertions(+), 19 deletions(-) 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/personalization-card/personalization-card.css b/blocks/personalization-card/personalization-card.css index 47782e42..ef0cf25c 100644 --- a/blocks/personalization-card/personalization-card.css +++ b/blocks/personalization-card/personalization-card.css @@ -1,8 +1,8 @@ .personalization-card { display: grid; grid-template-columns: 1fr; - grid-column-gap: 20px; - margin-top: 20px; + gap: 20px; + margin-block-end: 80px; > *:first-child { grid-column: span 2; @@ -23,6 +23,5 @@ .card-offer { border: 1px solid #e0e0e0; padding: 20px; - margin-block-end: 20px; } } \ No newline at end of file diff --git a/blocks/personalization-cbe/personalization-cbe.css b/blocks/personalization-cbe/personalization-cbe.css index ac6a338b..9c87083a 100644 --- a/blocks/personalization-cbe/personalization-cbe.css +++ b/blocks/personalization-cbe/personalization-cbe.css @@ -1,11 +1,19 @@ .personalization-cbe { display: grid; grid-template-columns: 1fr; - grid-column-gap: 20px; - margin-top: 20px; + column-gap: 20px; + row-gap: 40px; + margin-block-end: 80px; > *:first-child { grid-column: span 2; + display: flex; + column-gap: 20px; + align-items: center; + + img { + width: calc(50% - 10px); + } } > *:not(:first-child) { @@ -21,8 +29,8 @@ } .cbe-offer { - border: 1px solid #2f78c4; - padding: 20px; - margin-block-end: 20px; + h2 { + margin-block: 0; + } } } \ No newline at end of file diff --git a/blocks/personalization-cbe/personalization-cbe.js b/blocks/personalization-cbe/personalization-cbe.js index 00737c77..adfa5ed3 100644 --- a/blocks/personalization-cbe/personalization-cbe.js +++ b/blocks/personalization-cbe/personalization-cbe.js @@ -1,9 +1,11 @@ -import { isValidJSON } from '../../scripts/personalisation-helpers.js'; +import { isValidJSON, getImageURL } from '../../scripts/personalisation-helpers.js'; function createCbeOffer(offer) { const offerElement = document.createElement('div'); + const imageSrc = offer.imageURL ? getImageURL(offer.imageURL) : '/insights/2023/12/media_1db1f637bcc9a28245d76086f2d141781cbcc080d.png?width=2000&format=webply&optimize=medium'; offerElement.classList.add('cbe-offer'); offerElement.innerHTML = ` + ${offer.offerName}

${offer.content}

`; return offerElement; @@ -29,5 +31,5 @@ export default function decorate(block) { handleOffers(block, offer.content); } }); - block.append(content); + // block.append(content); } \ No newline at end of file diff --git a/blocks/personalization-ed/personalization-ed.css b/blocks/personalization-ed/personalization-ed.css index edb29413..f4c06740 100644 --- a/blocks/personalization-ed/personalization-ed.css +++ b/blocks/personalization-ed/personalization-ed.css @@ -1,11 +1,19 @@ .personalization-ed { display: grid; grid-template-columns: 1fr; - grid-column-gap: 20px; - margin-top: 20px; + column-gap: 20px; + row-gap: 40px; + margin-block-end: 80px; > *:first-child { grid-column: span 2; + display: flex; + column-gap: 20px; + align-items: center; + + img { + width: calc(50% - 10px); + } } > *:not(:first-child) { @@ -21,8 +29,8 @@ } .ed-offer { - border: 1px solid #06c7cc; - padding: 20px; - margin-block-end: 20px; + h2 { + margin-block: 0; + } } } \ No newline at end of file diff --git a/blocks/personalization-ed/personalization-ed.js b/blocks/personalization-ed/personalization-ed.js index aa4e1c0a..cc1f5b96 100644 --- a/blocks/personalization-ed/personalization-ed.js +++ b/blocks/personalization-ed/personalization-ed.js @@ -1,9 +1,11 @@ -import { isValidJSON } from '../../scripts/personalisation-helpers.js'; +import { isValidJSON, getImageURL } from '../../scripts/personalisation-helpers.js'; function createEdOffer(offer) { const offerElement = document.createElement('div'); + const imageSrc = offer.imageURL ? getImageURL(offer.imageURL) : '/insights/2023/12/media_1db1f637bcc9a28245d76086f2d141781cbcc080d.png?width=2000&format=webply&optimize=medium'; offerElement.classList.add('ed-offer'); offerElement.innerHTML = ` + ${offer.offerName}

${offer.content}

`; return offerElement; @@ -29,5 +31,5 @@ export default function decorate(block) { handleOffers(block, offer.content); } }); - block.append(content); + // block.append(content); } \ No newline at end of file diff --git a/scripts/personalisation-helpers.js b/scripts/personalisation-helpers.js index ed79e483..43df337c 100644 --- a/scripts/personalisation-helpers.js +++ b/scripts/personalisation-helpers.js @@ -11,7 +11,17 @@ function isValidJSON(str) { } } +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; +} + export { handleHardReload, - isValidJSON + isValidJSON, + getImageURL } \ No newline at end of file From ea396c440b07ff2e42d1aa25f7b1d6db630ffa15 Mon Sep 17 00:00:00 2001 From: Joan Beltran Date: Fri, 7 Mar 2025 10:25:40 +0100 Subject: [PATCH 13/33] style first offer --- .../personalization-cbe.css | 32 ++++++++++++++++--- .../personalization-cbe.js | 5 ++- .../personalization-ed/personalization-ed.css | 32 ++++++++++++++++--- .../personalization-ed/personalization-ed.js | 5 ++- 4 files changed, 62 insertions(+), 12 deletions(-) diff --git a/blocks/personalization-cbe/personalization-cbe.css b/blocks/personalization-cbe/personalization-cbe.css index 9c87083a..00693633 100644 --- a/blocks/personalization-cbe/personalization-cbe.css +++ b/blocks/personalization-cbe/personalization-cbe.css @@ -7,12 +7,28 @@ > *:first-child { grid-column: span 2; - display: flex; - column-gap: 20px; - align-items: center; - img { - width: calc(50% - 10px); + .img-wrap { + position: relative; + } + + .img-mask { + position: absolute; + top: 0; + left: auto; + width: 100%; + height: 100%; + background-color: #000; + opacity: 0.5; + } + + h2 { + width: 50%; + position: absolute; + top: 50%; + z-index: 2; + left: 20px; + color: #fff; } } @@ -29,8 +45,14 @@ } .cbe-offer { + position: relative; + h2 { margin-block: 0; } } + + img { + display: block; + } } \ No newline at end of file diff --git a/blocks/personalization-cbe/personalization-cbe.js b/blocks/personalization-cbe/personalization-cbe.js index adfa5ed3..6b77ed2a 100644 --- a/blocks/personalization-cbe/personalization-cbe.js +++ b/blocks/personalization-cbe/personalization-cbe.js @@ -5,7 +5,10 @@ function createCbeOffer(offer) { const imageSrc = offer.imageURL ? getImageURL(offer.imageURL) : '/insights/2023/12/media_1db1f637bcc9a28245d76086f2d141781cbcc080d.png?width=2000&format=webply&optimize=medium'; offerElement.classList.add('cbe-offer'); offerElement.innerHTML = ` - ${offer.offerName} +
+ ${offer.offerName} +
+

${offer.content}

`; return offerElement; diff --git a/blocks/personalization-ed/personalization-ed.css b/blocks/personalization-ed/personalization-ed.css index f4c06740..36a7a43d 100644 --- a/blocks/personalization-ed/personalization-ed.css +++ b/blocks/personalization-ed/personalization-ed.css @@ -7,12 +7,28 @@ > *:first-child { grid-column: span 2; - display: flex; - column-gap: 20px; - align-items: center; - img { - width: calc(50% - 10px); + .img-wrap { + position: relative; + } + + .img-mask { + position: absolute; + top: 0; + left: auto; + width: 100%; + height: 100%; + background-color: #000; + opacity: 0.5; + } + + h2 { + width: 50%; + position: absolute; + top: 50%; + z-index: 2; + left: 20px; + color: #fff; } } @@ -29,8 +45,14 @@ } .ed-offer { + position: relative; + 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 index cc1f5b96..5ec0123c 100644 --- a/blocks/personalization-ed/personalization-ed.js +++ b/blocks/personalization-ed/personalization-ed.js @@ -5,7 +5,10 @@ function createEdOffer(offer) { const imageSrc = offer.imageURL ? getImageURL(offer.imageURL) : '/insights/2023/12/media_1db1f637bcc9a28245d76086f2d141781cbcc080d.png?width=2000&format=webply&optimize=medium'; offerElement.classList.add('ed-offer'); offerElement.innerHTML = ` - ${offer.offerName} +
+ ${offer.offerName} +
+

${offer.content}

`; return offerElement; From 8e591e3daf8a73ed3f3fb38af1e19733b3975490 Mon Sep 17 00:00:00 2001 From: Joan Beltran Date: Fri, 7 Mar 2025 10:44:43 +0100 Subject: [PATCH 14/33] more offer style --- blocks/personalization-ed/personalization-ed.css | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/blocks/personalization-ed/personalization-ed.css b/blocks/personalization-ed/personalization-ed.css index 36a7a43d..18b79c54 100644 --- a/blocks/personalization-ed/personalization-ed.css +++ b/blocks/personalization-ed/personalization-ed.css @@ -19,7 +19,7 @@ width: 100%; height: 100%; background-color: #000; - opacity: 0.5; + opacity: 0.4; } h2 { @@ -29,6 +29,9 @@ z-index: 2; left: 20px; color: #fff; + font-weight: bold; + font-size: 48px; + text-shadow: 0 0 5px rgba(0, 0, 0, 0.5); } } From 40d2ab931055516fb466500af3a8bf07846efd24 Mon Sep 17 00:00:00 2001 From: Joan Beltran Date: Fri, 7 Mar 2025 10:47:17 +0100 Subject: [PATCH 15/33] more offer style --- blocks/personalization-cbe/personalization-cbe.css | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/blocks/personalization-cbe/personalization-cbe.css b/blocks/personalization-cbe/personalization-cbe.css index 00693633..9a3f2822 100644 --- a/blocks/personalization-cbe/personalization-cbe.css +++ b/blocks/personalization-cbe/personalization-cbe.css @@ -19,7 +19,7 @@ width: 100%; height: 100%; background-color: #000; - opacity: 0.5; + opacity: 0.4; } h2 { @@ -29,6 +29,9 @@ z-index: 2; left: 20px; color: #fff; + font-weight: bold; + font-size: 48px; + text-shadow: 0 0 5px rgba(0, 0, 0, 0.5); } } From 29a6ee2c2432df8363e68942a05395f72403336d Mon Sep 17 00:00:00 2001 From: Joan Beltran Date: Mon, 10 Mar 2025 12:07:30 +0100 Subject: [PATCH 16/33] change content to subject --- .../personalization-card/personalization-card.js | 2 +- .../personalization-cbe/personalization-cbe.css | 16 +++++++++++++--- .../personalization-cbe/personalization-cbe.js | 6 +++++- blocks/personalization-ed/personalization-ed.css | 16 +++++++++++++--- blocks/personalization-ed/personalization-ed.js | 6 +++++- 5 files changed, 37 insertions(+), 9 deletions(-) diff --git a/blocks/personalization-card/personalization-card.js b/blocks/personalization-card/personalization-card.js index acd67ffc..09b752ec 100644 --- a/blocks/personalization-card/personalization-card.js +++ b/blocks/personalization-card/personalization-card.js @@ -4,7 +4,7 @@ function createCardOffer(offer) { const offerElement = document.createElement('div'); offerElement.classList.add('card-offer'); offerElement.innerHTML = ` -

${offer.body?.content}

+

${offer.body?.text}

`; return offerElement; } diff --git a/blocks/personalization-cbe/personalization-cbe.css b/blocks/personalization-cbe/personalization-cbe.css index 9a3f2822..642ffd0f 100644 --- a/blocks/personalization-cbe/personalization-cbe.css +++ b/blocks/personalization-cbe/personalization-cbe.css @@ -22,17 +22,27 @@ opacity: 0.4; } - h2 { + .offer-details { width: 50%; position: absolute; - top: 50%; + top: 40%; z-index: 2; left: 20px; + } + + h2, p { color: #fff; font-weight: bold; - font-size: 48px; text-shadow: 0 0 5px rgba(0, 0, 0, 0.5); } + + h2 { + font-size: 48px; + } + + p { + font-size: 24px; + } } > *:not(:first-child) { diff --git a/blocks/personalization-cbe/personalization-cbe.js b/blocks/personalization-cbe/personalization-cbe.js index 6b77ed2a..7accb17b 100644 --- a/blocks/personalization-cbe/personalization-cbe.js +++ b/blocks/personalization-cbe/personalization-cbe.js @@ -3,13 +3,17 @@ import { isValidJSON, getImageURL } from '../../scripts/personalisation-helpers. function createCbeOffer(offer) { 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}

` : ''; offerElement.classList.add('cbe-offer'); offerElement.innerHTML = `
${offer.offerName}
-

${offer.content}

+
+ ${subject} +

${offer.text}

+
`; return offerElement; } diff --git a/blocks/personalization-ed/personalization-ed.css b/blocks/personalization-ed/personalization-ed.css index 18b79c54..b6dd08b7 100644 --- a/blocks/personalization-ed/personalization-ed.css +++ b/blocks/personalization-ed/personalization-ed.css @@ -22,17 +22,27 @@ opacity: 0.4; } - h2 { + .offer-details { width: 50%; position: absolute; - top: 50%; + top: 40%; z-index: 2; left: 20px; + } + + h2, p { color: #fff; font-weight: bold; - font-size: 48px; text-shadow: 0 0 5px rgba(0, 0, 0, 0.5); } + + h2 { + font-size: 48px; + } + + p { + font-size: 24px; + } } > *:not(:first-child) { diff --git a/blocks/personalization-ed/personalization-ed.js b/blocks/personalization-ed/personalization-ed.js index 5ec0123c..4bd33f51 100644 --- a/blocks/personalization-ed/personalization-ed.js +++ b/blocks/personalization-ed/personalization-ed.js @@ -3,13 +3,17 @@ import { isValidJSON, getImageURL } from '../../scripts/personalisation-helpers. function createEdOffer(offer) { 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}

` : ''; offerElement.classList.add('ed-offer'); offerElement.innerHTML = `
${offer.offerName}
-

${offer.content}

+
+ ${subject} +

${offer.text}

+
`; return offerElement; } From 44ec09171085060d3100708442e302dec1b9e2b3 Mon Sep 17 00:00:00 2001 From: Joan Beltran Date: Tue, 11 Mar 2025 12:25:39 +0100 Subject: [PATCH 17/33] CBE offer --- .../personalization-cbe.css | 68 ------------------- .../personalization-cbe.js | 37 +--------- scripts/login.js | 27 +++++--- styles/styles.css | 13 ++++ 4 files changed, 35 insertions(+), 110 deletions(-) diff --git a/blocks/personalization-cbe/personalization-cbe.css b/blocks/personalization-cbe/personalization-cbe.css index 642ffd0f..689f8004 100644 --- a/blocks/personalization-cbe/personalization-cbe.css +++ b/blocks/personalization-cbe/personalization-cbe.css @@ -1,71 +1,3 @@ .personalization-cbe { - display: grid; - grid-template-columns: 1fr; - column-gap: 20px; - row-gap: 40px; - margin-block-end: 80px; - > *:first-child { - grid-column: span 2; - - .img-wrap { - position: relative; - } - - .img-mask { - position: absolute; - top: 0; - left: auto; - width: 100%; - height: 100%; - background-color: #000; - opacity: 0.4; - } - - .offer-details { - width: 50%; - 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); - } - - h2 { - font-size: 48px; - } - - p { - font-size: 24px; - } - } - - > *:not(:first-child) { - grid-column: span 1; - } - - > *:only-child { - grid-column: span 2; - } - - @media (min-width: 600px) { - grid-template-columns: 1fr 1fr; - } - - .cbe-offer { - position: relative; - - h2 { - margin-block: 0; - } - } - - img { - display: block; - } } \ No newline at end of file diff --git a/blocks/personalization-cbe/personalization-cbe.js b/blocks/personalization-cbe/personalization-cbe.js index 7accb17b..56d2717d 100644 --- a/blocks/personalization-cbe/personalization-cbe.js +++ b/blocks/personalization-cbe/personalization-cbe.js @@ -1,27 +1,4 @@ -import { isValidJSON, getImageURL } from '../../scripts/personalisation-helpers.js'; - -function createCbeOffer(offer) { - 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}

` : ''; - offerElement.classList.add('cbe-offer'); - offerElement.innerHTML = ` -
- ${offer.offerName} -
-
-
- ${subject} -

${offer.text}

-
- `; - return offerElement; -} - -function handleOffers(block, offer) { - const cbeOffer = createCbeOffer(offer); - block.append(cbeOffer); -} +import { isValidJSON } from '../../scripts/personalisation-helpers.js'; export default function decorate(block) { const content = block.textContent.trim(); @@ -29,14 +6,6 @@ export default function decorate(block) { if(!isValidJSON(editedContent)) 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); - } - }); - // block.append(content); + window.personalizationData = {...data[0]}; + console.log(data) } \ No newline at end of file diff --git a/scripts/login.js b/scripts/login.js index a2a2ca34..731ca30e 100644 --- a/scripts/login.js +++ b/scripts/login.js @@ -1,4 +1,4 @@ -import { handleHardReload } from './personalisation-helpers.js'; +import { handleHardReload, getImageURL } from './personalisation-helpers.js'; let userLoggedIn = false; @@ -82,34 +82,45 @@ function createDialog() { return dialog; } -function setUpButtonText(button) { - button.textContent = userLoggedIn ? 'Log Out' : 'Log In'; +function setUpButtonTextAndLogo(button, logo) { + const firstName = window.personalizationData.content?.firstName ? `${window.personalizationData.content.firstName},` : ''; + const imageSrc = window.personalizationData.content?.profileImageURL ? window.personalizationData.content.profileImageURL : ''; + button.textContent = userLoggedIn ? `${firstName} Log Out` : 'Log In'; + if (imageSrc) { + setTimeout(() => { + logo.classList.add('personalized'); + logo.innerHTML = ``; + },100); + } } function setUserCookie(data) { document.cookie = `ncUser=${data}`; - document.cookie = 'userchanged=true'; 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'); + const logo = document.querySelector('.icon-netcentric-logo'); + window.personalizationData = window.personalizationData || {}; userLoggedIn = getCookie('ncUser'); - setUpButtonText(button); + setUpButtonTextAndLogo(button, logo); button.href = '#'; button.addEventListener('click', (e) => { e.preventDefault(); if (userLoggedIn) { - removeUserCookie() - setUpButtonText(button); + document.cookie = 'userchanged=true'; + removeUserCookie(); + setUpButtonTextAndLogo(button, logo); handleHardReload(window.location.href); } else { resetForm(document.forms.loginForm); @@ -132,7 +143,7 @@ export default function initLogIn(button) { if (isValid) { setUserCookie(email); - setUpButtonText(button); + setUpButtonTextAndLogo(button, logo); dialog.close(); handleHardReload(window.location.href); } diff --git a/styles/styles.css b/styles/styles.css index 2a98da96..4ef5c8a2 100644 --- a/styles/styles.css +++ b/styles/styles.css @@ -805,4 +805,17 @@ main .section.text-white { 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 From e219551256e3bf45cf2daccab8624faf4a33f1db Mon Sep 17 00:00:00 2001 From: Joan Beltran Date: Tue, 11 Mar 2025 14:26:47 +0100 Subject: [PATCH 18/33] userchanged cookie --- scripts/login.js | 1 + 1 file changed, 1 insertion(+) diff --git a/scripts/login.js b/scripts/login.js index 731ca30e..b3957198 100644 --- a/scripts/login.js +++ b/scripts/login.js @@ -142,6 +142,7 @@ export default function initLogIn(button) { const isValid = validateForm(form); if (isValid) { + document.cookie = 'userchanged=; expires=Thu, 01 Jan 1970 00:00:00 UTC;'; setUserCookie(email); setUpButtonTextAndLogo(button, logo); dialog.close(); From 5754ab1628f3536ffc62dee5d6db6f9750051bef Mon Sep 17 00:00:00 2001 From: Joan Beltran Date: Tue, 11 Mar 2025 16:30:22 +0100 Subject: [PATCH 19/33] remove invalid json info blocks --- blocks/personalization-card/personalization-card.js | 5 ++++- blocks/personalization-cbe/personalization-cbe.js | 5 ++++- blocks/personalization-ed/personalization-ed.js | 6 ++++-- 3 files changed, 12 insertions(+), 4 deletions(-) diff --git a/blocks/personalization-card/personalization-card.js b/blocks/personalization-card/personalization-card.js index 09b752ec..d3e79584 100644 --- a/blocks/personalization-card/personalization-card.js +++ b/blocks/personalization-card/personalization-card.js @@ -17,7 +17,10 @@ function handleOffers(block, offer) { export default function decorate(block) { const content = block.textContent.trim(); const editedContent = content.replace('Personalization Card:', '').trim(); - if(!isValidJSON(editedContent)) return; + if (!isValidJSON(editedContent)) { + block.parentElement.remove(); + return; + } const data = JSON.parse(editedContent); block.children[0].remove(); data.forEach((offer) => { diff --git a/blocks/personalization-cbe/personalization-cbe.js b/blocks/personalization-cbe/personalization-cbe.js index 56d2717d..5d5c4f1a 100644 --- a/blocks/personalization-cbe/personalization-cbe.js +++ b/blocks/personalization-cbe/personalization-cbe.js @@ -3,7 +3,10 @@ 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)) return; + if (!isValidJSON(editedContent)) { + block.parentElement.remove(); + return; + } const data = JSON.parse(editedContent); block.children[0].remove(); window.personalizationData = {...data[0]}; diff --git a/blocks/personalization-ed/personalization-ed.js b/blocks/personalization-ed/personalization-ed.js index 4bd33f51..cde07c82 100644 --- a/blocks/personalization-ed/personalization-ed.js +++ b/blocks/personalization-ed/personalization-ed.js @@ -26,7 +26,10 @@ function handleOffers(block, offer) { export default function decorate(block) { const content = block.textContent.trim(); const editedContent = content.replace('Personalization ED:', '').trim(); - if(!isValidJSON(editedContent)) return; + if (!isValidJSON(editedContent)) { + block.parentElement.remove(); + return; + } const data = JSON.parse(editedContent); block.children[0].remove(); data.forEach((offer) => { @@ -38,5 +41,4 @@ export default function decorate(block) { handleOffers(block, offer.content); } }); - // block.append(content); } \ No newline at end of file From 74af7eeed774ead5875e4891503b50f3d59a96f0 Mon Sep 17 00:00:00 2001 From: Joan Beltran Date: Wed, 12 Mar 2025 16:02:38 +0100 Subject: [PATCH 20/33] cards first content --- .../personalization-card.css | 28 +++---------------- .../personalization-card.js | 10 +++++-- 2 files changed, 12 insertions(+), 26 deletions(-) diff --git a/blocks/personalization-card/personalization-card.css b/blocks/personalization-card/personalization-card.css index ef0cf25c..42a1a6fa 100644 --- a/blocks/personalization-card/personalization-card.css +++ b/blocks/personalization-card/personalization-card.css @@ -1,27 +1,7 @@ .personalization-card { - display: grid; - grid-template-columns: 1fr; - gap: 20px; - margin-block-end: 80px; - - > *:first-child { - grid-column: span 2; - } - - > *:not(:first-child) { - grid-column: span 1; - } - - > *:only-child { - grid-column: span 2; - } - - @media (min-width: 600px) { - grid-template-columns: 1fr 1fr; - } - - .card-offer { - border: 1px solid #e0e0e0; - padding: 20px; + h2, + p, + a { + color: #fff !important; } } \ No newline at end of file diff --git a/blocks/personalization-card/personalization-card.js b/blocks/personalization-card/personalization-card.js index d3e79584..e2be4e0d 100644 --- a/blocks/personalization-card/personalization-card.js +++ b/blocks/personalization-card/personalization-card.js @@ -1,10 +1,15 @@ import { isValidJSON } from '../../scripts/personalisation-helpers.js'; +import { loadCSS } from '../../scripts/lib-franklin.js'; function createCardOffer(offer) { const offerElement = document.createElement('div'); - offerElement.classList.add('card-offer'); + offerElement.classList.add('hero-container'); offerElement.innerHTML = ` -

${offer.body?.text}

+
+

${offer.title?.content}

+

${offer.body?.content}

+ ${offer.buttons?.text?.content} +
`; return offerElement; } @@ -21,6 +26,7 @@ export default function decorate(block) { block.parentElement.remove(); return; } + loadCSS('/blocks/hero/hero.css'); const data = JSON.parse(editedContent); block.children[0].remove(); data.forEach((offer) => { From 56d52c2ea8362ab6aa660a8af0af87f84a6ed0db Mon Sep 17 00:00:00 2001 From: Joan Beltran Date: Wed, 12 Mar 2025 16:27:02 +0100 Subject: [PATCH 21/33] cards - a bit more styling --- blocks/personalization-card/personalization-card.css | 10 ++++++++++ blocks/personalization-card/personalization-card.js | 8 +++----- blocks/personalization-cbe/personalization-cbe.js | 1 - 3 files changed, 13 insertions(+), 6 deletions(-) diff --git a/blocks/personalization-card/personalization-card.css b/blocks/personalization-card/personalization-card.css index 42a1a6fa..f68c10f9 100644 --- a/blocks/personalization-card/personalization-card.css +++ b/blocks/personalization-card/personalization-card.css @@ -1,7 +1,17 @@ .personalization-card { + width: var(--section-width); + margin: 0 auto; + padding: 60px 0; + h2, p, a { color: #fff !important; } +} + +.personalization-card-wrapper { + background-color: var(--c-dark-plum); + margin-inline: 0 !important; + width: 100% !important; } \ No newline at end of file diff --git a/blocks/personalization-card/personalization-card.js b/blocks/personalization-card/personalization-card.js index e2be4e0d..c836887a 100644 --- a/blocks/personalization-card/personalization-card.js +++ b/blocks/personalization-card/personalization-card.js @@ -3,13 +3,11 @@ import { loadCSS } from '../../scripts/lib-franklin.js'; function createCardOffer(offer) { const offerElement = document.createElement('div'); - offerElement.classList.add('hero-container'); + offerElement.classList.add('card-offer'); offerElement.innerHTML = ` -

${offer.title?.content}

${offer.body?.content}

- ${offer.buttons?.text?.content} -
+ ${offer.buttons[0]?.text?.content} `; return offerElement; } @@ -29,6 +27,7 @@ export default function decorate(block) { loadCSS('/blocks/hero/hero.css'); const data = JSON.parse(editedContent); block.children[0].remove(); + console.log(data) data.forEach((offer) => { if (Array.isArray(offer.content)) { offer.content.forEach((subOffer) => { @@ -38,5 +37,4 @@ export default function decorate(block) { handleOffers(block, offer.content); } }); - block.append(content); } \ No newline at end of file diff --git a/blocks/personalization-cbe/personalization-cbe.js b/blocks/personalization-cbe/personalization-cbe.js index 5d5c4f1a..84d44d51 100644 --- a/blocks/personalization-cbe/personalization-cbe.js +++ b/blocks/personalization-cbe/personalization-cbe.js @@ -10,5 +10,4 @@ export default function decorate(block) { const data = JSON.parse(editedContent); block.children[0].remove(); window.personalizationData = {...data[0]}; - console.log(data) } \ No newline at end of file From 1ad96798ac18bf71dec104a1dd9c4bcfcbcc2bd4 Mon Sep 17 00:00:00 2001 From: Joan Beltran Date: Thu, 13 Mar 2025 15:35:44 +0100 Subject: [PATCH 22/33] card offer styles and responsive --- .../personalization-card.css | 29 ++++++++-- .../personalization-card.js | 20 ++++--- .../personalization-ed/personalization-ed.css | 57 ++++++++++--------- .../personalization-ed/personalization-ed.js | 2 + 4 files changed, 69 insertions(+), 39 deletions(-) diff --git a/blocks/personalization-card/personalization-card.css b/blocks/personalization-card/personalization-card.css index f68c10f9..3beb5514 100644 --- a/blocks/personalization-card/personalization-card.css +++ b/blocks/personalization-card/personalization-card.css @@ -1,12 +1,27 @@ .personalization-card { width: var(--section-width); margin: 0 auto; - padding: 60px 0; + padding: 28px 0; + margin-block-end: 30px; - h2, - p, - a { - color: #fff !important; + .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; } } @@ -14,4 +29,8 @@ 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 index c836887a..95aa9c9b 100644 --- a/blocks/personalization-card/personalization-card.js +++ b/blocks/personalization-card/personalization-card.js @@ -1,19 +1,27 @@ import { isValidJSON } from '../../scripts/personalisation-helpers.js'; -import { loadCSS } from '../../scripts/lib-franklin.js'; +import { addChevronToButtons } from '../../scripts/scripts.js'; function createCardOffer(offer) { const offerElement = document.createElement('div'); - offerElement.classList.add('card-offer'); + 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 = ` -

${offer.title?.content}

-

${offer.body?.content}

- ${offer.buttons[0]?.text?.content} + ${image} +
+ ${title} + ${text} + ${button} +
`; return offerElement; } function handleOffers(block, offer) { const cardOffer = createCardOffer(offer); + addChevronToButtons(block); block.append(cardOffer); } @@ -24,10 +32,8 @@ export default function decorate(block) { block.parentElement.remove(); return; } - loadCSS('/blocks/hero/hero.css'); const data = JSON.parse(editedContent); block.children[0].remove(); - console.log(data) data.forEach((offer) => { if (Array.isArray(offer.content)) { offer.content.forEach((subOffer) => { diff --git a/blocks/personalization-ed/personalization-ed.css b/blocks/personalization-ed/personalization-ed.css index b6dd08b7..6407f5fe 100644 --- a/blocks/personalization-ed/personalization-ed.css +++ b/blocks/personalization-ed/personalization-ed.css @@ -6,36 +6,10 @@ margin-block-end: 80px; > *:first-child { - grid-column: span 2; - .img-wrap { position: relative; } - .img-mask { - position: absolute; - top: 0; - left: auto; - width: 100%; - height: 100%; - background-color: #000; - opacity: 0.4; - } - - .offer-details { - width: 50%; - 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); - } - h2 { font-size: 48px; } @@ -43,6 +17,34 @@ p { font-size: 24px; } + + @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 { + width: 50%; + 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); + } + } } > *:not(:first-child) { @@ -53,12 +55,13 @@ grid-column: span 2; } - @media (min-width: 600px) { + @media (min-width: 900px) { grid-template-columns: 1fr 1fr; } .ed-offer { position: relative; + margin-inline: 20px; h2 { margin-block: 0; diff --git a/blocks/personalization-ed/personalization-ed.js b/blocks/personalization-ed/personalization-ed.js index cde07c82..a7fa3f4e 100644 --- a/blocks/personalization-ed/personalization-ed.js +++ b/blocks/personalization-ed/personalization-ed.js @@ -4,6 +4,7 @@ function createEdOffer(offer) { 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}

` : ''; offerElement.classList.add('ed-offer'); offerElement.innerHTML = `
@@ -13,6 +14,7 @@ function createEdOffer(offer) {
${subject}

${offer.text}

+ ${button}
`; return offerElement; From 58e132c1f3187ce6ba5ea1a20a374b1d0e231bf8 Mon Sep 17 00:00:00 2001 From: Joan Beltran Date: Thu, 13 Mar 2025 16:38:27 +0100 Subject: [PATCH 23/33] text sizes --- blocks/personalization-ed/personalization-ed.css | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/blocks/personalization-ed/personalization-ed.css b/blocks/personalization-ed/personalization-ed.css index 6407f5fe..1854a6eb 100644 --- a/blocks/personalization-ed/personalization-ed.css +++ b/blocks/personalization-ed/personalization-ed.css @@ -11,11 +11,11 @@ } h2 { - font-size: 48px; + font-size: 38px; } p { - font-size: 24px; + font-size: 30px; } @media (min-width: 900px) { From 4f750c958a87aa0be7147d7ce2e089cad7f75b5d Mon Sep 17 00:00:00 2001 From: Joan Beltran Date: Thu, 13 Mar 2025 17:28:08 +0100 Subject: [PATCH 24/33] big text space --- blocks/personalization-ed/personalization-ed.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/blocks/personalization-ed/personalization-ed.css b/blocks/personalization-ed/personalization-ed.css index 1854a6eb..6d04d5c9 100644 --- a/blocks/personalization-ed/personalization-ed.css +++ b/blocks/personalization-ed/personalization-ed.css @@ -32,7 +32,7 @@ } .offer-details { - width: 50%; + width: 60%; position: absolute; top: 40%; z-index: 2; From d20a6c5d4f71fc8c9917c78e492ccb5509535747 Mon Sep 17 00:00:00 2001 From: Joan Beltran Date: Thu, 13 Mar 2025 17:48:51 +0100 Subject: [PATCH 25/33] big text space --- blocks/personalization-ed/personalization-ed.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/blocks/personalization-ed/personalization-ed.css b/blocks/personalization-ed/personalization-ed.css index 6d04d5c9..28fdffc3 100644 --- a/blocks/personalization-ed/personalization-ed.css +++ b/blocks/personalization-ed/personalization-ed.css @@ -32,7 +32,7 @@ } .offer-details { - width: 60%; + width: 65%; position: absolute; top: 40%; z-index: 2; From c6bf3afc684e7e33d9fe683525410919cb8f722f Mon Sep 17 00:00:00 2001 From: Joan Beltran Date: Thu, 13 Mar 2025 17:50:34 +0100 Subject: [PATCH 26/33] big text space --- blocks/personalization-ed/personalization-ed.css | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/blocks/personalization-ed/personalization-ed.css b/blocks/personalization-ed/personalization-ed.css index 28fdffc3..b37c879b 100644 --- a/blocks/personalization-ed/personalization-ed.css +++ b/blocks/personalization-ed/personalization-ed.css @@ -32,7 +32,6 @@ } .offer-details { - width: 65%; position: absolute; top: 40%; z-index: 2; @@ -45,6 +44,12 @@ text-shadow: 0 0 5px rgba(0, 0, 0, 0.5); } } + + @media (min-width: 1200px) { + .offer-details { + width: 65%; + } + } } > *:not(:first-child) { From 7e020dbb0fd4c39b22027daee8880ed0ede555ae Mon Sep 17 00:00:00 2001 From: Joan Beltran Date: Fri, 14 Mar 2025 13:13:02 +0100 Subject: [PATCH 27/33] remove custom image flickr --- blocks/header/header.js | 14 +++++++++++++- scripts/login.js | 15 ++++----------- 2 files changed, 17 insertions(+), 12 deletions(-) diff --git a/blocks/header/header.js b/blocks/header/header.js index 60c6fdca..d8a77540 100644 --- a/blocks/header/header.js +++ b/blocks/header/header.js @@ -1,6 +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; @@ -142,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/scripts/login.js b/scripts/login.js index b3957198..831f939f 100644 --- a/scripts/login.js +++ b/scripts/login.js @@ -82,16 +82,9 @@ function createDialog() { return dialog; } -function setUpButtonTextAndLogo(button, logo) { +function setUpButtonText(button) { const firstName = window.personalizationData.content?.firstName ? `${window.personalizationData.content.firstName},` : ''; - const imageSrc = window.personalizationData.content?.profileImageURL ? window.personalizationData.content.profileImageURL : ''; button.textContent = userLoggedIn ? `${firstName} Log Out` : 'Log In'; - if (imageSrc) { - setTimeout(() => { - logo.classList.add('personalized'); - logo.innerHTML = ``; - },100); - } } function setUserCookie(data) { @@ -111,7 +104,7 @@ export default function initLogIn(button) { const logo = document.querySelector('.icon-netcentric-logo'); window.personalizationData = window.personalizationData || {}; userLoggedIn = getCookie('ncUser'); - setUpButtonTextAndLogo(button, logo); + setUpButtonText(button); button.href = '#'; button.addEventListener('click', (e) => { @@ -120,7 +113,7 @@ export default function initLogIn(button) { if (userLoggedIn) { document.cookie = 'userchanged=true'; removeUserCookie(); - setUpButtonTextAndLogo(button, logo); + setUpButtonText(button); handleHardReload(window.location.href); } else { resetForm(document.forms.loginForm); @@ -144,7 +137,7 @@ export default function initLogIn(button) { if (isValid) { document.cookie = 'userchanged=; expires=Thu, 01 Jan 1970 00:00:00 UTC;'; setUserCookie(email); - setUpButtonTextAndLogo(button, logo); + setUpButtonText(button); dialog.close(); handleHardReload(window.location.href); } From 3c1a9397db1e3b91586afcc4bb75ba5f66e7f228 Mon Sep 17 00:00:00 2001 From: Joan Beltran Date: Fri, 14 Mar 2025 14:28:15 +0100 Subject: [PATCH 28/33] fix personalizationdata check --- blocks/header/header.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/blocks/header/header.js b/blocks/header/header.js index d8a77540..c413481b 100644 --- a/blocks/header/header.js +++ b/blocks/header/header.js @@ -148,7 +148,7 @@ export default async function decorate(block) { // decorate nav DOM const nav = document.createElement('nav'); - if (window.personalizationData.content?.profileImageURL) { + 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'; From d69dbecc82cde541fee170a8e84821c98023d644 Mon Sep 17 00:00:00 2001 From: Joan Beltran Date: Mon, 17 Mar 2025 16:36:28 +0100 Subject: [PATCH 29/33] sign in form --- scripts/login.js | 150 +++++++++++++++++++++++++++++++++++++++++++++- styles/styles.css | 4 ++ 2 files changed, 152 insertions(+), 2 deletions(-) diff --git a/scripts/login.js b/scripts/login.js index 831f939f..734a73fc 100644 --- a/scripts/login.js +++ b/scripts/login.js @@ -1,4 +1,4 @@ -import { handleHardReload, getImageURL } from './personalisation-helpers.js'; +import { handleHardReload } from './personalisation-helpers.js'; let userLoggedIn = false; @@ -82,6 +82,152 @@ function createDialog() { 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 = { + "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 In'; + 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'; @@ -101,11 +247,11 @@ function removeUserCookie() { export default function initLogIn(button) { const dialog = createDialog(); const submitButton = dialog.querySelector('button'); - const logo = document.querySelector('.icon-netcentric-logo'); window.personalizationData = window.personalizationData || {}; userLoggedIn = getCookie('ncUser'); setUpButtonText(button); button.href = '#'; + createSignInButton(button) button.addEventListener('click', (e) => { e.preventDefault(); diff --git a/styles/styles.css b/styles/styles.css index 4ef5c8a2..2f3805a2 100644 --- a/styles/styles.css +++ b/styles/styles.css @@ -749,6 +749,10 @@ main .section.text-white { .login-dialog-content { padding: 40px; + + @media (min-width: 900px) { + max-width: 600px; + } } .form-wrapper { From 6add6ae332f6dd445fade249ebbfab7b3a836ec1 Mon Sep 17 00:00:00 2001 From: Joan Beltran Date: Tue, 18 Mar 2025 10:45:11 +0100 Subject: [PATCH 30/33] change payload --- scripts/login.js | 85 ++++++++++++++++++++++++++++-------------------- 1 file changed, 49 insertions(+), 36 deletions(-) diff --git a/scripts/login.js b/scripts/login.js index 734a73fc..cdcb8cc7 100644 --- a/scripts/login.js +++ b/scripts/login.js @@ -110,49 +110,62 @@ async function post(request, callback) { function sentSignInData(form , callback) { const data = { - "xdmMeta": { + "header": { "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" - } - } + "imsOrgId": "FA907D44536A3C2B0A490D4D@AdobeOrg", + "source": { + "name": "postman" }, - "person": { - "name": { - "lastName": form.lastName.value, - "firstName": form.firstName.value + "datasetId": "67b1acd4627d0f2aefaca606" + }, + "body": { + "xdmMeta": { + "schemaRef": { + "id": "https://ns.adobe.com/netcentricgmbh/schemas/709781f368368fceb6e2fb8c62b4def7ad2d6c2e91f98551", + "contentType": "application/vnd.adobe.xed-full+json;version=1" } }, - "homeAddress": { - "label": form.company.value - }, - "personalEmail": { - "address": form.email.value + "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 + } } } }; From ee4787e5fdc8bbbca323406e12971d38e3e0036a Mon Sep 17 00:00:00 2001 From: Joan Beltran Date: Tue, 18 Mar 2025 15:11:15 +0100 Subject: [PATCH 31/33] resposive images and other small changes --- .../personalization-ed/personalization-ed.js | 26 ++++++++++++------- scripts/login.js | 16 +++--------- scripts/personalisation-helpers.js | 15 ++++++++++- styles/styles.css | 2 +- 4 files changed, 34 insertions(+), 25 deletions(-) diff --git a/blocks/personalization-ed/personalization-ed.js b/blocks/personalization-ed/personalization-ed.js index a7fa3f4e..975506c1 100644 --- a/blocks/personalization-ed/personalization-ed.js +++ b/blocks/personalization-ed/personalization-ed.js @@ -1,15 +1,21 @@ -import { isValidJSON, getImageURL } from '../../scripts/personalisation-helpers.js'; +import { isValidJSON, getImageURL, getCookie } from '../../scripts/personalisation-helpers.js'; +import { createOptimizedPicture } from '../../scripts/lib-franklin.js'; -function createEdOffer(offer) { + +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 === 1 ? 'eager' : 'lazy'; + const offerPicture = createOptimizedPicture(imageSrc, offer.offerName, imageLoading, [{ media: '(min-width: 900px)', width: '2000' }, { width: '1200' }]); offerElement.classList.add('ed-offer'); offerElement.innerHTML = `
- ${offer.offerName} -
+ ${offerPicture.outerHTML} + ${imgMask}
${subject} @@ -20,8 +26,8 @@ function createEdOffer(offer) { return offerElement; } -function handleOffers(block, offer) { - const edOffer = createEdOffer(offer); +function handleOffers(block, offer, index) { + const edOffer = createEdOffer(offer, index); block.append(edOffer); } @@ -34,13 +40,13 @@ export default function decorate(block) { } const data = JSON.parse(editedContent); block.children[0].remove(); - data.forEach((offer) => { + data.forEach((offer, index) => { if (Array.isArray(offer.content)) { - offer.content.forEach((subOffer) => { - handleOffers(block, subOffer); + offer.content.forEach((subOffer, subIndex) => { + handleOffers(block, subOffer, subIndex); }); } else { - handleOffers(block, offer.content); + handleOffers(block, offer.content, index); } }); } \ No newline at end of file diff --git a/scripts/login.js b/scripts/login.js index cdcb8cc7..b30eb64a 100644 --- a/scripts/login.js +++ b/scripts/login.js @@ -1,19 +1,7 @@ -import { handleHardReload } from './personalisation-helpers.js'; +import { handleHardReload, getCookie } from './personalisation-helpers.js'; let userLoggedIn = false; -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 ''; -} - function resetForm(form) { const inputs = form.querySelectorAll('input'); inputs.forEach((input) => { @@ -204,6 +192,8 @@ function createSignInButton(button) { + +
diff --git a/scripts/personalisation-helpers.js b/scripts/personalisation-helpers.js index 43df337c..254e9f48 100644 --- a/scripts/personalisation-helpers.js +++ b/scripts/personalisation-helpers.js @@ -20,8 +20,21 @@ function getImageURL(imageUrl) { 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 + getImageURL, + getCookie } \ No newline at end of file diff --git a/styles/styles.css b/styles/styles.css index 2f3805a2..e0c15ba2 100644 --- a/styles/styles.css +++ b/styles/styles.css @@ -772,7 +772,7 @@ main .section.text-white { right: 0; } - input, + input:not([type='checkbox']), button { box-sizing: border-box; font-size: 16px; From ef483b875b5c575f7d2bb038405676ceab6c41c0 Mon Sep 17 00:00:00 2001 From: Joan Beltran Date: Tue, 18 Mar 2025 17:06:21 +0100 Subject: [PATCH 32/33] image loading in ed --- blocks/personalization-ed/personalization-ed.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/blocks/personalization-ed/personalization-ed.js b/blocks/personalization-ed/personalization-ed.js index 975506c1..8714d893 100644 --- a/blocks/personalization-ed/personalization-ed.js +++ b/blocks/personalization-ed/personalization-ed.js @@ -9,8 +9,8 @@ function createEdOffer(offer, index) { const button = offer.buttonText ? `

${offer.buttonText}

` : ''; const isAutenticated = getCookie('ncUser'); const imgMask = isAutenticated ? '
' : ''; - const imageLoading = !isAutenticated && index === 1 ? 'eager' : 'lazy'; - const offerPicture = createOptimizedPicture(imageSrc, offer.offerName, imageLoading, [{ media: '(min-width: 900px)', width: '2000' }, { width: '1200' }]); + 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 = `
From 50f215df76f6f1fa4a066456865784a6f9abe3bd Mon Sep 17 00:00:00 2001 From: Joan Beltran Date: Wed, 19 Mar 2025 15:18:08 +0100 Subject: [PATCH 33/33] little changes --- scripts/login.js | 9 ++++++++- styles/styles.css | 4 ++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/scripts/login.js b/scripts/login.js index b30eb64a..5b3532f3 100644 --- a/scripts/login.js +++ b/scripts/login.js @@ -173,7 +173,7 @@ function createSignInButton(button) { if (userLoggedIn) return; const signInButton = document.createElement('a'); signInButton.href = '#'; - signInButton.textContent = 'Sign In'; + signInButton.textContent = 'Sign Up'; button.parentElement.append(signInButton); const dialog = document.createElement('dialog'); @@ -188,6 +188,13 @@ function createSignInButton(button) { +
+ +
+ + +
+
diff --git a/styles/styles.css b/styles/styles.css index e0c15ba2..d5571502 100644 --- a/styles/styles.css +++ b/styles/styles.css @@ -757,6 +757,10 @@ main .section.text-white { .form-wrapper { position: relative; + + > div { + margin-bottom: 20px; + } } input {