diff --git a/2funkcje.js b/2funkcje.js
new file mode 100644
index 0000000..a75c734
--- /dev/null
+++ b/2funkcje.js
@@ -0,0 +1,321 @@
+//////////////////////////////////////////////////////////////////////////\\\\\\\\\\\\
+// IDOSELL omnibus details
+
+// omnibusDetailsTxt - nadpisać na własny obiekt
+
+app_shop.fn.idmGetOmnibusDetails = (options) => {
+ const {
+ productData, sizeId, priceType = app_shop.vars.priceType,
+ } = options || {};
+ if (!productData) return false;
+ const sizeData = productData.sizes.find((size) => size.id === sizeId) || productData;
+ if (!sizeData?.price) return false;
+ const classes = {
+ add: [],
+ remove: ['--omnibus', '--omnibus-short', '--omnibus-code', '--omnibus-code-short', '--omnibus-new-price', '--omnibus-higher'],
+ };
+ const activeLabel = {};
+
+ const omnibusPrice = sizeData.price?.omnibusPriceDetails?.unit?.[priceType]?.formatted || sizeData.price.omnibusPrice[priceType]?.formatted;
+ if (!omnibusPrice) {
+ return {
+ classes,
+ };
+ }
+ // Omnibus
+ classes.add.push('--omnibus');
+ classes.remove = classes.remove.filter((item) => item !== '--omnibus');
+
+ const sellBy = productData?.unit?.sellBy;
+
+ const unitMaxPrice = sizeData?.price?.unit?.[priceType]?.formatted && sizeData.price.max?.[priceType]?.value ? format_price(parseFloat(sizeData.price.max?.[priceType]?.value) * parseFloat(sellBy), {
+ mask: app_shop.vars.currency_format,
+ currency: app_shop.vars?.currency?.symbol,
+ currency_space: app_shop.vars.currency_space,
+ currency_before_price: app_shop.vars.currency_before_value,
+ }) : false;
+
+ const maxPrice = unitMaxPrice || sizeData.price.max?.[priceType]?.formatted;
+ // Skrócona wersja omnibusa
+ if (!maxPrice || maxPrice === omnibusPrice) {
+ classes.add.push('--omnibus-short');
+ classes.remove = classes.remove.filter((item) => item !== '--omnibus-short');
+ }
+ // Aktywny kod rabatowy
+ if (app_shop.vars.omnibus?.rebateCodeActivate && sizeData.price?.rebateCodeActive) {
+ classes.add.push('--omnibus-code');
+ activeLabel.rebateCodeActive = `${idmHotspotTextObject["Kod rabatowy"]}`;
+ classes.remove = classes.remove.filter((item) => item !== '--omnibus-code');
+ }
+ // Skrócona wersja omnibusa, gdy aktywny kod rabatowy
+ const beforeRebatePrice = sizeData.price.beforeRebateDetails?.unit?.[priceType]?.formatted || sizeData.price.beforeRebate[priceType]?.formatted;
+ if (app_shop.vars.omnibus?.rebateCodeActivate && beforeRebatePrice === omnibusPrice && sizeData.price?.rebateCodeActive) {
+ classes.add.push('--omnibus-code-short');
+ classes.remove = classes.remove.filter((item) => item !== '--omnibus-code-short');
+ }
+ // Nadchodząca cena
+ const newDate = sizeData.price.omnibusPriceDetails?.newPriceEffectiveUntil?.formatted;
+ if (newDate && maxPrice) {
+ classes.add.push('--omnibus-new-price');
+ classes.remove = classes.remove.filter((item) => item !== '--omnibus-new-price');
+ }
+ // Cena omnibusa wyższa niż cena sprzedaży
+ const higher = sizeData.price.omnibusPriceDetails?.omnibusPriceIsHigherThanSellingPrice;
+ if (higher) {
+ classes.add.push('--omnibus-higher');
+ classes.remove = classes.remove.filter((item) => item !== '--omnibus-higher');
+ }
+ // label okazja
+ if ((!higher || newDate) && !activeLabel?.rebateCodeActive) {
+ activeLabel.bargain = `${idmHotspotTextObject["Okazja"]}`;
+ }
+ // label promocja
+ if (Object.keys(activeLabel)?.length === 0) {
+ activeLabel.bargain = `${idmHotspotTextObject["Promocja"]}`;
+ }
+
+ // labele zones
+ if(productData.zones.find(zone => zone ==="bestseller")) activeLabel.bestseller = `${idmHotspotTextObject["Bestseller"]}`;
+ if(productData.zones.find(zone => zone ==="news")) activeLabel.news = `${idmHotspotTextObject["Nowość"]}`;
+
+
+
+ let omnibusPercentSign = '';
+ if (higher) {
+ omnibusPercentSign = '-';
+ } else if (sizeData.price.omnibusPriceDetails?.youSavePercent !== 0) {
+ omnibusPercentSign = '+';
+ }
+ const omnibusPercent = `${omnibusPercentSign}${sizeData.price.omnibusPriceDetails?.youSavePercent}%`;
+ const omnibus = {
+ price: omnibusPrice,
+ visible: true,
+ percent: omnibusPercent,
+ html: `${idmHotspotTextObject['Najniższa cena produktu w okresie 30 dni przed wprowadzeniem obniżki']}: ${omnibusPrice}${omnibusPercent}`,
+ };
+
+ const max = (maxPrice) ? {
+ max: {
+ price: maxPrice,
+ visible: true,
+ percent: `-${sizeData.price.youSavePercent}%`,
+ html: `${idmHotspotTextObject['Cena regularna']}:
+ ${maxPrice}-${sizeData.price.youSavePercent}%`,
+ },
+ } : {};
+
+ const beforeRebate = (beforeRebatePrice) ? {
+ beforeRebate: {
+ price: beforeRebatePrice,
+ visible: !!classes.add.includes('--omnibus-code'),
+ percent: `-${sizeData.price.beforeRebateDetails?.youSavePercent}%`,
+ html: `${idmHotspotTextObject['Cena bez kodu']}:
+ ${beforeRebatePrice}
+ -${sizeData.price.beforeRebateDetails?.youSavePercent}%`,
+ },
+ } : {};
+
+ const newPriceEffectiveUntil = (newDate) ? {
+ newPriceEffectiveUntil: {
+ date: newDate,
+ price: maxPrice,
+ visible: !!classes.add.includes('--omnibus-new-price'),
+ html: `${idmHotspotTextObject['Cena nadchodząca od']}
+ ${newDate}:
+ ${maxPrice}`,
+ },
+ } : {};
+
+
+ return {
+ classes,
+ omnibus,
+ ...max,
+ ...beforeRebate,
+ ...newPriceEffectiveUntil,
+ activeLabel,
+ };
+};
+
+//////////////////////////////////////////////////////////////////////////
+// EVENTY
+// dodawanie do koszyka
+async function idmHandleAddToBasket(e){
+ const formEl = e.target.closest("form.add_to_basket");
+ if(!formEl) return;
+ try{
+ // pobieranie danych i elementów
+ formEl.classList.add("--loading")
+ const buttonEl = formEl.querySelector(".add_to_basket__button");
+ e.preventDefault();
+
+ const id = formEl.querySelector("input[name='product']")?.value;
+ const size = formEl.querySelector("input[type='hidden'][name='size']")?.value;
+ const number = formEl.querySelector("input[name='number']")?.value;
+
+ // dodanie do koszyka
+ const res = await fetch(`/graphql/v1/`, {
+ method: "POST",
+ headers: {
+ "Content-Type": "application/json",
+ },
+ body: IDM_HOTSPOT_ADD_TO_BASKET(id, size, number)
+ });
+ const data = await res.json();
+
+ // Błąd
+ if(data?.data?.addProductsToBasket?.status !== "success") throw new Error(data);
+ else{
+ // Obsługiwanie sukcesu
+ app_shop.graphql.trackingEvents(res);
+ buttonEl.classList.add("--success");
+
+ // Dodawanie do koszyka na stronie basketedit.php będzie wymagał innego indywidualnego kodu!!!!!
+ buttonEl.innerHTML = `${buttonEl.dataset.success}`;
+ setTimeout(()=>{
+ buttonEl.innerHTML = `${buttonEl.dataset.text}`;
+ app_shop.fn?.menu_basket_cache?.();
+ buttonEl.classList.remove("--success");
+ }, 3000);
+ }
+ }catch(err){
+ console.error(err);
+ Alertek.Error(idmHotspotTextObject["Coś poszło nie tak podczas dodawania do koszyka. Spróbuj ponownie lub odśwież stronę"]);
+ buttonEl.innerHTML = `${buttonEl.dataset.error}`;
+ buttonEl.classList.add("--error")
+ setTimeout(()=>{
+ buttonEl.classList.remove("--error")
+ buttonEl.innerHTML = `${buttonEl.dataset.text}`;
+ }, 3000);
+ }finally{
+ formEl.classList.remove("--loading")
+ }
+}
+
+///qty
+const idmRangeMaxAlert = (max)=> Alertek.Error(`${idmHotspotTextObject["Maksymalna liczba sztuk tego towaru które możesz dodać do koszyka to:"]} ${max}`)
+const idmRangeMinAlert = (min)=> Alertek.Error(`${idmHotspotTextObject["Minimalna liczba sztuk tego towaru które możesz dodać do koszyka to:"]} ${min}`)
+
+function idmQuantityButtonClick(e){
+ if(e.target.classList.contains("idm-products-banner__qty-input")) return e.target.select();
+ const wrapper = e.target.closest(".idm-products-banner__qty");
+
+ 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;
+ idmRangeMaxAlert(max)
+ }
+ } else if (e.target.classList.contains("idm-products-banner__qty-decrease")) {
+ current -= step;
+ if (current < step){
+ current = step;
+ idmRangeMinAlert(step)
+ }
+ }
+ input.value = current.toFixed(precision);
+}
+function idmQuantityInputChange(e){
+ if(e.target.value > +e.target.max){
+ idmRangeMaxAlert(e.target.max)
+ e.target.value = +e.target.max
+ }
+ if(e.target.value < +e.target.min){
+ idmRangeMinAlert(e.target.min)
+ e.target.value = +e.target.min;
+ }
+}
+
+//////////////////////////////////////////////
+// DANE
+// dwie funkcje zamiast jednej
+async function idmGetHotspotData(query, graphFn){
+ try{
+ const res = await fetch(`/graphql/v1/`, {
+ method: "POST",
+ headers: {
+ "Content-Type": "application/json",
+ },
+ body: graphFn ? graphFn(query) : IDM_PRODUCTS_GQL(query)
+ });
+ const data = await res.json();
+ const products = graphFn === IDM_HOTSPOTS_GQL ? data?.hotspots?.products : data?.data?.products?.products;
+ if(!products) throw new Error(idmHotspotTextObject["Nie znaleziono produktów"]);
+
+ console.log(data);
+ return products;
+ }catch(err){
+ console.error(idmHotspotTextObject["Błąd przy pobieraniu danych"], err);
+ return null;
+ }
+}
+
+
+function idmGetQueryData({
+ productsID,
+ productsMenu,
+ hotspotsType
+}){
+ let graphFn, query;
+
+ if(productsID){
+ graphFn = IDM_PRODUCTS_GQL;
+ query = `searchInput: {productsId: [${productsID}]}`;
+ }else if(productsMenu){
+ graphFn = IDM_PRODUCTS_GQL;
+ query = `searchInput: {navigation: ${productsMenu}}`;
+ }else if(hotspotsType){
+ graphFn = IDM_HOTSPOTS_GQL;
+ query = `searchInput: {hotspot: ${hotspotsType}, limit: 16}`;
+ }
+
+ return {graphFn, query}
+}
+
+//////////////////////////////////////////////
+// LAZY LOADING
+function idmObserveOnce(element, callback, options = { root: null, rootMargin: "0px", threshold: 0.1 }) {
+ if (!element) return;
+
+ const observer = new IntersectionObserver((entries, obs) => {
+ entries.forEach(entry => {
+ if (entry.isIntersecting) {
+ callback(entry); // run your callback
+ obs.disconnect(); // stop observing after first trigger
+ }
+ });
+ }, options);
+
+ observer.observe(element);
+}
+
+
+////////////////////////////////////////////////
+// IDM SET HEIGHT
+app_shop.fn.idmSetHeight = options => {
+ const { selector, selectors, container } = options || {}
+ if ((!selector && !selectors) || !container) return
+
+ const containerElement = document.querySelector(container)
+ if (!containerElement) return
+
+ const adjustAllHeights = itemSelector => {
+ const targets = containerElement.querySelectorAll(itemSelector)
+ if (!targets.length) return
+
+ targets.forEach(el => (el.style.minHeight = ''))
+
+ const max = Math.max(...[...targets].map(el => el.offsetHeight || 0))
+
+ targets.forEach(el => (el.style.minHeight = `${max}px`))
+ }
+
+ if (selector) adjustAllHeights(selector)
+ if (selectors?.length) selectors.forEach(adjustAllHeights)
+}
\ No newline at end of file
diff --git a/bundle.js b/bundle.js
index 46e75ac..5a55bce 100644
--- a/bundle.js
+++ b/bundle.js
@@ -452,7 +452,7 @@ async function idmGetHotspotData(query, graphFn){
body: graphFn ? graphFn(query) : IDM_PRODUCTS_GQL(query)
});
const data = await res.json();
- const products = data[graphFn === IDM_HOTSPOTS_GQL ? "hotspots" : "data"]?.products?.products;
+ const products = graphFn === IDM_HOTSPOTS_GQL ? data?.hotspots?.products : data?.data?.products?.products;
if(!products) throw new Error(idmHotspotTextObject["Nie znaleziono produktów"]);
console.log(data);