Wybor zestawow - poczatek prac
This commit is contained in:
86
klasa.js
86
klasa.js
@@ -496,6 +496,7 @@ class IdmHotspot{
|
||||
this.handleAddToFav = this.handleAddToFav.bind(this);
|
||||
this.handleShowSecondImage = this.handleShowSecondImage.bind(this);
|
||||
this.handleHideSecondImage = this.handleHideSecondImage.bind(this);
|
||||
this.handleSelectVersion = this.handleSelectVersion.bind(this);
|
||||
|
||||
this.init();
|
||||
}
|
||||
@@ -595,14 +596,20 @@ class IdmHotspot{
|
||||
* Tworzy markup dla pojedynczego produktu.
|
||||
*/
|
||||
markupProduct(prod){
|
||||
// IDM DO POPRAWKI
|
||||
const prodExchangedData = app_shop?.fn?.getOmnibusDetails?.({productData: prod}) || app_shop.fn?.idmGetOmnibusDetails({productData: prod});
|
||||
|
||||
// markup pojedynczego produktu
|
||||
let singleMarkup = "";
|
||||
singleMarkup += `
|
||||
<div class="product hotspot__product swiper-slide d-flex flex-column ${prod.price.price[this.priceType].value === 0 ? "--phone" : ""}" data-id="${prod.id}">
|
||||
<div class="product__yousave --hidden">
|
||||
${this.markupProductInnerHTML(prod)}
|
||||
</div>`;
|
||||
|
||||
return singleMarkup;
|
||||
}
|
||||
markupProductInnerHTML(prod){
|
||||
// IDM DO POPRAWKI
|
||||
const prodExchangedData = app_shop?.fn?.getOmnibusDetails?.({productData: prod}) || app_shop.fn?.idmGetOmnibusDetails({productData: prod});
|
||||
|
||||
return `<div class="product__yousave --hidden">
|
||||
<span class="product__yousave --label"></span>
|
||||
<span class="product__yousave --value"></span>
|
||||
</div>
|
||||
@@ -623,10 +630,7 @@ class IdmHotspot{
|
||||
${this.markupPrice(prod, prodExchangedData)}
|
||||
</div>
|
||||
${this.markupAddToBasket(prod)}
|
||||
</div>
|
||||
</div>`;
|
||||
|
||||
return singleMarkup;
|
||||
</div>`;
|
||||
}
|
||||
|
||||
markupAdditional(prod){
|
||||
@@ -659,7 +663,7 @@ class IdmHotspot{
|
||||
|
||||
return `<div class="product__versions">
|
||||
${prod.group.versions.reduce((acc, val)=>{
|
||||
return acc + `<a class="product__version_single" href="${val.link}"><img class="product__version_img" src="${val.icon}" alt="${val.name}"/></a>`;
|
||||
return acc + `<a class="product__version_single ${prod.id === val.id ? "--active" : ""}" href="${val.link}" data-product-id="${val.id}"><img class="product__version_img" src="${val.icon}" alt="${val.name}"/></a>`;
|
||||
},"")}
|
||||
</div>`
|
||||
}
|
||||
@@ -1051,6 +1055,17 @@ class IdmHotspot{
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
handleSelectVersion(e){
|
||||
e.preventDefault();
|
||||
const closestVersion = e.target.closest(".product__version_single:not(.--active)");
|
||||
const prodEl = e.target.closest(".product");
|
||||
|
||||
if(!closestVersion || !prodEl) return;
|
||||
|
||||
this.reloadProduct(prodEl, closestVersion.dataset.productId);
|
||||
}
|
||||
|
||||
/**
|
||||
* Lazy-load hotspotu – wczytuje dane dopiero, gdy element pojawi się w viewportcie.
|
||||
*/
|
||||
@@ -1089,6 +1104,7 @@ class IdmHotspot{
|
||||
/**
|
||||
* Ustawia jednakową wysokość elementów (np. nazw lub cen).
|
||||
*/
|
||||
|
||||
setHeight(options){
|
||||
const { selector, selectors, container } = options || {}
|
||||
if ((!selector && !selectors) || !container) return
|
||||
@@ -1110,6 +1126,48 @@ class IdmHotspot{
|
||||
if (selector) adjustAllHeights(selector)
|
||||
if (selectors?.length) selectors.forEach(adjustAllHeights)
|
||||
}
|
||||
|
||||
/**
|
||||
* Przeładowanie pojedynczego produktu
|
||||
*/
|
||||
async reloadProduct(prodEl, newProdId){
|
||||
try{
|
||||
prodEl.classList.add("--loading");
|
||||
const res = await fetch(`/graphql/v1/`, {
|
||||
method: "POST",
|
||||
headers: {
|
||||
"Content-Type": "application/json",
|
||||
},
|
||||
body: IDM_PRODUCT_GQL(`productId: ${newProdId}`),
|
||||
});
|
||||
const data = await res.json();
|
||||
|
||||
const productData = data?.data?.product?.product;
|
||||
if(!productData) throw new Error("Nie udało się pobrać danych o produkcie");
|
||||
|
||||
|
||||
const prodHTML = this.markupProductInnerHTML(productData);
|
||||
|
||||
prodEl.dataset.id = newProdId;
|
||||
prodEl.innerHTML = prodHTML;
|
||||
if(productData.price.price[this.priceType].value === 0) prodEl.classList.add("--phone");
|
||||
else prodEl.classList.remove("--phone");
|
||||
|
||||
this.initSingleEvent(prodEl);
|
||||
this.setHeight({
|
||||
selectors: [
|
||||
`#${this.id} .product__prices`,
|
||||
`#${this.id} .product__name`,
|
||||
],
|
||||
container: `#${this.id} .products__wrapper`,
|
||||
});
|
||||
}catch(err){
|
||||
Alertek?.Error(idmHotspotTextObject["Błąd przy pobieraniu danych"]);
|
||||
console.error(err);
|
||||
}finally{
|
||||
prodEl.classList.remove("--loading");
|
||||
}
|
||||
}
|
||||
// ========================================================
|
||||
// INICJALIZACJA
|
||||
// ========================================================
|
||||
@@ -1237,12 +1295,13 @@ class IdmHotspot{
|
||||
addToBasketEl?.querySelector(".idm-products-banner__qty-input")?.addEventListener("input",this.handleQuantityInputChange);
|
||||
}
|
||||
}
|
||||
// Add to Favorites
|
||||
// Dodaj do ulubionych
|
||||
if(this.options?.addToFavorites && typeof this.addToFavFn === "function") prodEl.querySelector(".product__favorite")?.addEventListener("click", this.handleAddToFav);
|
||||
// Compare
|
||||
|
||||
// Porównanie
|
||||
if(this.options?.addToCompare) prodEl.querySelector(".idm-products-banner__compare-btn")?.addEventListener("click", this.handleAddToCompare);
|
||||
|
||||
// Second image on hover
|
||||
// Hover drugie zdjęcie
|
||||
if(this.options?.showSecondImage){
|
||||
const prodIconEl = prodEl.querySelector(".product__icon");
|
||||
if(prodIconEl.querySelector(".product__image.--second")){
|
||||
@@ -1250,6 +1309,9 @@ class IdmHotspot{
|
||||
prodIconEl?.addEventListener("mouseleave", this.handleHideSecondImage);
|
||||
}
|
||||
}
|
||||
|
||||
// Wybór wersji
|
||||
if(this.options?.selectVersion) prodEl.querySelector(".product__versions")?.addEventListener("click", this.handleSelectVersion);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
Reference in New Issue
Block a user