/////////////////////////////////////////////////////////// // dodatek po stronie panelu /////////////////////////////////////////////////////////// const tytul = "TYTUL"; const tekst = "TEKST"; const produkty = [173632, 75469, 85452, 25065, 4147]; window.idmInteractiveBannerObj = { idmInteractiveBannerIds: typeof produkty !== "undefined" ? produkty : null, idmInteractiveBannerTitle: typeof tytul !== "undefined" ? tytul : "", idmInteractiveBannerText: typeof tekst !== "undefined" ? tekst : "", }; /////////////////////////////////////////////////////////// // pobranie zmiennych, obiekty mapujące /////////////////////////////////////////////////////////// const idmInteractiveBannerIds = window.idmInteractiveBannerObj?.idmInteractiveBannerIds || null; const idmInteractiveBannerTitle = window.idmInteractiveBannerObj?.idmInteractiveBannerTitle || ""; const idmInteractiveBannerText = window.idmInteractiveBannerObj?.idmInteractiveBannerText || ""; const IDM_ZONE_TEXT_MAP = { promotion: `${}`, discount: `${}`, bestseller: `${}`, new: `${}`, }; const IDM_ZONE_CLASS_MAP = { promotion: "idm-products-banner__label--promo", discount: "idm-products-banner__label--promo", bestseller: "idm-products-banner__label--bestseller", new: "idm-products-banner__label--new", }; /////////////////////////////////////////////////////////// // ustawienie elementów headera /////////////////////////////////////////////////////////// function idmSetBannerTitle(titleElement) { if (idmInteractiveBannerTitle) { titleElement.textContent = idmInteractiveBannerTitle; } } function idmSetBannerText(textElement) { if (idmInteractiveBannerText) { textElement.textContent = idmInteractiveBannerText; } } /////////////////////////////////////////////////////////// // ulubione /////////////////////////////////////////////////////////// // uwaga, trzeba odkryć komponent w układzie Lista zakupowa - Javascript + CSS + XSLT function idmAttachFavoritesEvents() { document.querySelectorAll(".idm-products-banner__favorites-icon").forEach(el => { el.addEventListener("click", (e) => { e.preventDefault(); e.stopPropagation(); const icon = e.target.closest(".idm-products-banner__favorites-icon"); app_shop.fn.shoppingList.addProductToList([ [icon.getAttribute("data-id"), icon.getAttribute("data-size")] ]); }); }); } /////////////////////////////////////////////////////////// // dodanie do porównania /////////////////////////////////////////////////////////// function idmHandleAddToCompare(e) { const compareBtnEl = e.target.closest(".idm-products-banner__compare-btn"); if (!compareBtnEl || !compareBtnEl?.dataset?.compareId) return; e.preventDefault(); idmAddToCompare(compareBtnEl, compareBtnEl.dataset.compareId); } async function idmAddToCompare(btnEl, compareId) { try { btnEl.classList.add("--loading"); const compareUrl = `/${app_shop?.vars?.language?.symbol || "de"}/settings.html?comparers=add&product=${compareId}`; const res = await fetch(compareUrl); console.log(res); if (!res.ok) throw new Error(`${}`); btnEl.classList.add("--success"); const compareContainerQuery = "#menu_compare_product"; if (document.querySelector(compareContainerQuery)) { app_shop.fn.load( window.location.pathname, [[compareContainerQuery, compareContainerQuery]], function () {}, "?set_render=content" ); } setTimeout(() => { btnEl.classList.remove("--success"); }, 2000); } catch (err) { console.error(err); Alertek.Error(`${}`); } finally { btnEl.classList.remove("--loading"); } } /////////////////////////////////////////////////////////// // produkty /////////////////////////////////////////////////////////// function idmGetGraphQLQuery(ids) { return JSON.stringify({ query: `{ products(searchInput: {productsId: ${JSON.stringify(ids)}}, settingsInput: {limit: 50}) { products { id type name zones icon link sizes { id amount } awardedParameters { name values { name } } price { rebateCodeActive price { gross { value formatted } } omnibusPrice { gross { value formatted } } max { gross { value formatted } } beforeRebate { gross { value formatted } } } unit { id name sellBy } opinion { rating count } } } }` }); } // helpery const escapeHtml = (v = "") => String(v) .replace(/&/g, "&").replace(//g, ">").replace(/"/g, """) .replace(/'/g, "'"); const slot = (cond, html) => (cond ? html : ""); // label function idmMarkupZoneLabel(zone) { if (!zone) return ""; return ` ${IDM_ZONE_TEXT_MAP[zone] || ""} `; } // porównanie function idmMarkupCompareBtn(productId, options) { if (!options?.compare) return ""; return `
`; } // ulubione function idmMarkupFavoritesIcon(productId, sizeId, options) { if (!options?.favorites) return ""; return `
`; } // ikona function idmMarkupImage(link, icon) { return ` `; } // nazwa function idmMarkupName(name, link) { return ` `; } // ceny function idmMarkupPrices(priceObj) { const current = priceObj?.price?.gross?.formatted || ""; const max = priceObj?.max?.gross?.formatted || ""; const hasOmnibus = priceObj?.omnibusPrice?.gross?.formatted; let mainPrice = ""; if (current && max && max !== current) { mainPrice = `${escapeHtml(current)} ${escapeHtml(max)}`; } else if (current) { mainPrice = escapeHtml(current); } else if (max) { mainPrice = `${escapeHtml(max)}`; } const oldPrice = hasOmnibus ? `${} ${escapeHtml(current || max)}` : ""; return `
${mainPrice}

${oldPrice}

`; } // dodawanie do koszyka function idmMarkupAddToBasket(product, size, options) { if (!options?.addToBasket) return ""; const can = product?.type === "product" && product?.sizes?.length === 1 && size; if (!can) return ""; const sellBy = size?.unitSellby || 1; const precision = size?.unitPrecision || 0; const max = (typeof size?.amount === "number" && size.amount > 0) ? size.amount : ""; return `
`; } // link więcej opcji function idmMarkupMoreOptions(link) { return ` `; } // assembler produktu function idmRenderProductCard(product, options = {}) { const zone = product?.zones?.[0]; const size = product?.sizes?.[0]; const headIcons = ` ${idmMarkupCompareBtn(product.id, options)} ${idmMarkupFavoritesIcon(product.id, size?.id, options)} ${idmMarkupZoneLabel(zone)} `; const addSection = (options?.addToBasket && product?.type === "product" && product?.sizes?.length === 1 && size) ? idmMarkupAddToBasket(product, size, options) : idmMarkupMoreOptions(product.link); return `
${headIcons} ${idmMarkupImage(product.link, product.icon)}
${idmMarkupName(product.name, product.link)} ${idmMarkupPrices(product.price)} ${addSection}
`; } // tworzenie, ustawienie opcji function idmCreateProductMarkup(products, options = { compare: true, favorites: true, addToBasket: true }) { return products.map(p => idmRenderProductCard(p, options)).join(""); } async function idmRenderBannerProducts(container) { const skeletons = document.querySelector(".idm-products-banner__skeletons"); if (!idmInteractiveBannerIds) return; try { container.innerHTML = ""; const response = await fetch("/graphql/v1/", { method: "POST", headers: { "Content-Type": "application/json" }, body: idmGetGraphQLQuery(idmInteractiveBannerIds), }); const json = await response.json(); const productsData = json?.data?.products?.products; console.log(productsData); if (!productsData) return; const sorted = idmInteractiveBannerIds .map(id => productsData.find(p => p.id === id)) .filter(Boolean); container.innerHTML = idmCreateProductMarkup(sorted); idmInitSlickSlider(container); idmAttachFavoritesEvents(); // +/- i walidacja inputów ilości document.addEventListener("click", (e) => { const wrapper = e.target.closest(".idm-products-banner__qty"); if (!wrapper) return; const input = wrapper.querySelector(".idm-products-banner__qty-input"); const step = parseFloat(wrapper.dataset.sellBy || "1"); const precision = parseInt(wrapper.dataset.precision || "0"); const max = parseFloat(wrapper.dataset.max || "999999"); let current = parseFloat(input.value) || 0; if (e.target.classList.contains("idm-products-banner__qty-increase")) { current += step; if (current > max) current = max; } else if (e.target.classList.contains("idm-products-banner__qty-decrease")) { current -= step; if (current < step) current = step; } input.value = current.toFixed(precision); }); document.addEventListener("blur", (e) => { if (!e.target.classList.contains("idm-products-banner__qty-input")) return; const input = e.target; const wrapper = input.closest(".idm-products-banner__qty"); const step = parseFloat(wrapper.dataset.sellBy || "1"); const precision = parseInt(wrapper.dataset.precision || "0"); const max = parseFloat(wrapper.dataset.max || "999999"); let val = parseFloat(input.value); if (isNaN(val) || val < step) { val = step; } else if (val > max) { val = max; } else { val = Math.round(val / step) * step; } input.value = val.toFixed(precision); }, true); // ukrycie skeletona skeletons?.classList.add("idm_hidden"); container.classList.remove("idm_hidden"); // event porównania (delegacja) document.addEventListener("click", idmHandleAddToCompare); } catch (err) { console.error("Błąd pobierania produktów:", err); } } /////////////////////////////////////////////////////////// // slider i wyrównanie wysokości /////////////////////////////////////////////////////////// function idmInitSlickSlider(container) { $(container).on("init", function () { app_shop.fn.setHeight({ selectors: [ ".idm-products-banner .idm-products-banner__product-img-container", ".idm-products-banner .idm-products-banner__product-name", ".idm-products-banner .idm-products-banner__price", ".idm-products-banner .idm-products-banner__price-omnibus", ".idm-products-banner .idm-products-banner__add-to-basket", ".idm-products-banner .product" ], container: ".idm-products-banner__products .slick-track" }); }); $(container).slick({ slidesToShow: 2, slidesToScroll: 1, autoplay: false, dots: false, arrows: true, prevArrow: '', nextArrow: '', responsive: [ { breakpoint: 979, settings: { slidesToShow: 2 } }, { breakpoint: 757, settings: { slidesToShow: 2 } }, ], }); } /////////////////////////////////////////////////////////// // start działania /////////////////////////////////////////////////////////// function idmWaitForBannerElements() { let attempts = 0; const interval = setInterval(() => { let initialized = 0; const bannerTitle = document.querySelector(".idm-products-banner__title"); if (bannerTitle) { idmSetBannerTitle(bannerTitle); initialized++; } const bannerText = document.querySelector(".idm-products-banner__text"); if (bannerText) { idmSetBannerText(bannerText); initialized++; } const bannerContainer = document.querySelector(".idm-products-banner__products"); if (bannerContainer) { idmRenderBannerProducts(bannerContainer); initialized++; } const bannerHeader = document.querySelector(".idm-products-banner__header"); if (bannerHeader) { initialized++; } if (initialized >= 4) { clearInterval(interval); } else if (++attempts >= 10) { clearInterval(interval); console.warn("Niektóre wymagane elementy DOM nie zostały znalezione"); } }, 500); } document.addEventListener("DOMContentLoaded", function () { idmWaitForBannerElements(); });