Skip to content

Commit

Permalink
Mwpw 142003: Mini Compare Chart card fixes (adobecom#2093)
Browse files Browse the repository at this point in the history
Fixes multiple Mini Compare Chart card alignment and spacing issues.

Resolves: MWPW-142003

Note: Alignment across cards will show broken in test URL because prices are not resolved due to CORS policy. To properly test alignment, please use this URL: https://main--cc--adobecom.hlx.page/drafts/axel/mini-compare-chart-edgecase?milolibs=MWPW-142003--milo--axelcureno

Test URLs:

Before: https://main--milo--axelcureno.hlx.page/drafts/axel/mini-compare-chart?martech=off
After: https://mwpw-142003--milo--axelcureno.hlx.page/drafts/axel/mini-compare-chart?martech=off

Co-authored-by: ilyas Stéphane Türkben <isturkben@gmail.com>
  • Loading branch information
Axelcureno and yesil authored Apr 22, 2024
1 parent 513fba6 commit 443d511
Show file tree
Hide file tree
Showing 6 changed files with 414 additions and 126 deletions.
37 changes: 19 additions & 18 deletions libs/blocks/merch-card/merch-card.js
Original file line number Diff line number Diff line change
Expand Up @@ -29,10 +29,9 @@ const MULTI_OFFER_CARDS = ['plans', 'product', MINI_COMPARE_CHART];
// Force cards to refresh once they become visible so that the footer rows are properly aligned.
const intersectionObserver = new IntersectionObserver((entries) => {
entries.forEach((entry) => {
const container = entry.target.closest('main > div');
if (!container) return;
[...container.querySelectorAll('merch-card')].forEach((card) => card.requestUpdate());
if (entry.target.clientHeight === 0) return;
intersectionObserver.unobserve(entry.target);
entry.target.requestUpdate();
});
});

Expand All @@ -42,16 +41,13 @@ const isHeadingTag = (tagName) => /^H[2-5]$/.test(tagName);
const isParagraphTag = (tagName) => tagName === 'P';

const appendSlot = (slotEls, slotName, merchCard) => {
if (slotEls.length === 0) return;
if (slotEls.length === 0 && merchCard.variant !== MINI_COMPARE_CHART) return;
const newEl = createTag(
'p',
{ slot: slotName, class: slotName },
);
slotEls.forEach((e, index) => {
slotEls.forEach((e) => {
newEl.innerHTML += e.innerHTML;
if (index < slotEls.length - 1) {
newEl.innerHTML += '<br>';
}
});
merchCard.append(newEl);
};
Expand Down Expand Up @@ -201,7 +197,7 @@ const simplifyHrs = (el) => {
});
};

function extractQuantitySelect(el) {
async function extractQuantitySelect(el) {
const quantitySelectConfig = el.querySelector('ul');
if (!quantitySelectConfig) return null;
const configMarkup = quantitySelectConfig.querySelector('li');
Expand All @@ -215,7 +211,7 @@ function extractQuantitySelect(el) {
.filter((value) => /^\d*$/.test(value))
.map((value) => (value === '' ? undefined : Number(value)));
if (![3, 4, 5].includes(values.length)) return null;
import('../../deps/merch-quantity-select.js');
await import('../../deps/merch-quantity-select.js');
[attributes.min, attributes.max, attributes.step, attributes['default-value'], attributes['max-input']] = values;
const quantitySelect = createTag('merch-quantity-select', attributes);
quantitySelectConfig.remove();
Expand All @@ -238,7 +234,7 @@ const decorateFooterRows = (merchCard, footerRows) => {
footerRows.forEach((row) => {
const rowIcon = row.firstElementChild.querySelector('picture');
const rowText = row.querySelector('div > div:nth-child(2)').innerHTML;
const rowTextParagraph = createTag('p', { class: 'footer-row-cell-description' }, rowText);
const rowTextParagraph = createTag('div', { class: 'footer-row-cell-description' }, rowText);
const footerRowCell = createTag('div', { class: 'footer-row-cell' });
if (rowIcon) {
rowIcon.classList.add('footer-row-icon');
Expand All @@ -253,8 +249,12 @@ const decorateFooterRows = (merchCard, footerRows) => {

const setMiniCompareOfferSlot = (merchCard, offers) => {
if (merchCard.variant !== MINI_COMPARE_CHART) return;
const miniCompareOffers = createTag('div', { slot: 'offers' }, offers);
if (offers === undefined) { miniCompareOffers.appendChild(createTag('p')); }
const miniCompareOffers = merchCard.querySelector('div[slot="offers"]');
if (offers) {
miniCompareOffers.append(offers);
} else {
miniCompareOffers.appendChild(createTag('p'));
}
merchCard.appendChild(miniCompareOffers);
};

Expand Down Expand Up @@ -319,10 +319,7 @@ const init = async (el) => {
}
let footerRows;
if (cardType === MINI_COMPARE_CHART) {
const container = el.closest('[data-status="decorated"]');
if (container) {
intersectionObserver.observe(container);
}
intersectionObserver.observe(merchCard);
footerRows = getMiniCompareChartFooterRows(el);
}
const images = el.querySelectorAll('picture');
Expand Down Expand Up @@ -399,7 +396,11 @@ const init = async (el) => {
merchCard.appendChild(footer);

if (MULTI_OFFER_CARDS.includes(cardType)) {
const quantitySelect = extractQuantitySelect(el);
if (merchCard.variant === MINI_COMPARE_CHART) {
const miniCompareOffers = createTag('div', { slot: 'offers' });
merchCard.append(miniCompareOffers);
}
const quantitySelect = await extractQuantitySelect(el, cardType);
const offerSelection = el.querySelector('ul');
if (offerSelection) {
const { initOfferSelection } = await import('./merch-offer-select.js');
Expand Down
2 changes: 1 addition & 1 deletion libs/blocks/merch-card/merch-offer-select.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ const MINI_COMPARE_CHART = 'mini-compare-chart';
function createDynamicSlots(el, bodySlot) {
const pricePlaceholder = el.querySelector("span[is='inline-price']");
if (pricePlaceholder) {
pricePlaceholder.parentNode.replaceChild(createTag('span', { slot: 'price', is: 'inline-price' }), pricePlaceholder);
pricePlaceholder.setAttribute('slot', 'price');
} else {
const priceSlot = createTag('h5', { class: 'merch-card-price' });
createTag('span', { slot: 'price', is: 'inline-price' }, null, { parent: priceSlot });
Expand Down
Loading

0 comments on commit 443d511

Please sign in to comment.