{"version":3,"sources":["webpack:///./modules/ProductTeaserInformationLazyLoading.ts"],"names":["__webpack_require__","r","__webpack_exports__","_helpers_helperFunctions__WEBPACK_IMPORTED_MODULE_0__","_helpers_DOMHelpers__WEBPACK_IMPORTED_MODULE_1__","_Tracking__WEBPACK_IMPORTED_MODULE_2__","ProductTeaserInformationLazyLoading","element","reinit","_this","this","teasers","getAllTeasers","lists","setListsId","productTeasersUrl","getAttribute","initPrices","onScroll","document","addEventListener","setup","selector","Array","from","querySelectorAll","filter","node","dataset","moduleInitialized","forEach","prototype","loadInViewport","id","ids","updateTeasers","t","inViewport","hasToBeLoaded","getTeaserId","push","loadPricesBasedOnIds","trackViewportTeasersOnScroll","debounceLoadChank","Object","length","window","removeEventListener","listEl","index","indexVal","setAttribute","updateLists","viewportTeasers","productsArray","productArrayGA4","productTrackedPosition","querySelector","product","classList","contains","closest","productTrackingInformation","filteredProductArrayGA4","item_list_name","item_list_id","listsGA4DataLayerEvent","impressionsDataLayerEvent","productData","productDataG4","name","list","brand","category","variant","position","productPriceElement","productOldPrice","price","parseFloat","add","item_id","item_name","affiliation","coupon","productGA4DiscountElement","discountGA4","discount","item_brand","item_category","item_category2","item_category3","item_category4","item_category5","item_variant","quantity","loadPrices","teaser","rect","getBoundingClientRect","bottom","height","top","outerHeight","dataLayer","event","ecommerce","items","_clear","currencyCode","impressions","formData","FormData","append","join","xhr","XMLHttpRequest","onload","status","addPrices","response","Eucerin","initModules","console","error","open","responseType","send","data","ProductTeaserInformation","i","productTeaserInfo","Ident","propertyName","key","value","MarkupToSet","parentTeaserBtn","replaceWith","indexOf","positionLowestPrice","container","legalTextHeight","clientHeight","style","paddingBottom"],"mappings":"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","file":"./modules/ProductTeaserInformationLazyLoading.2a9bcbfe.js","sourcesContent":["/// \r\nimport { debounce } from '../helpers/helperFunctions';\r\nimport { createElementFromString } from '../helpers/DOMHelpers';\r\nimport { productImpression } from '../Tracking';\r\n\r\nconst moduleSelector = '[data-module=\"ProductTeaserInformationLazyLoading\"]';\r\n\r\n\r\nexport default class ProductTeaserInformationLazyLoading {\r\n teasers;\r\n lists;\r\n productTeasersUrl: string;\r\n\r\n static setup(selector: string = moduleSelector): void {\r\n Array.from(document.querySelectorAll(selector)).filter((node: HTMLElement) => !node.dataset.moduleInitialized).forEach((element: HTMLElement) => {\r\n new ProductTeaserInformationLazyLoading(element);\r\n element.dataset.moduleInitialized = 'true';\r\n });\r\n }\r\n\r\n constructor(public element: HTMLElement, reinit: boolean = false) {\r\n this.teasers = this.getAllTeasers();\r\n this.lists = this.setListsId();\r\n this.productTeasersUrl = this.element.getAttribute('data-product-teasers-information-ajax-url');\r\n\r\n this.initPrices(true);\r\n this.onScroll();\r\n\r\n document.addEventListener('FaceLiftLoadMore', () => {\r\n this.teasers = this.getAllTeasers();\r\n this.lists = this.setListsId();\r\n this.initPrices(true)\r\n\r\n });\r\n }\r\n\r\n initPrices(loadInViewport?: boolean) {\r\n var id: string,\r\n ids: string[] = [];\r\n let teasers;\r\n\r\n this.updateTeasers();\r\n if(loadInViewport){\r\n teasers = this.teasers.filter(t => this.inViewport(t) && this.hasToBeLoaded(t))\r\n }else {\r\n teasers = this.teasers.filter(t => this.hasToBeLoaded(t))\r\n }\r\n\r\n\r\n teasers.forEach(t => {\r\n id = this.getTeaserId(t);\r\n\r\n if (id) {\r\n ids.push(id);\r\n }\r\n })\r\n\r\n this.loadPricesBasedOnIds(ids)\r\n !loadInViewport ? this.trackViewportTeasersOnScroll(teasers):\"\";\r\n\r\n }\r\n\r\n onScroll() {\r\n this.getAllTeasers();\r\n const debounceLoadChank = debounce(() => {\r\n\r\n if (!this.teasers.length) {\r\n window.removeEventListener('scroll', debounceLoadChank);\r\n return;\r\n }\r\n\r\n this.initPrices(false)\r\n\r\n }, 500);\r\n\r\n window.addEventListener('scroll', debounceLoadChank);\r\n }\r\n\r\n getAllTeasers() {\r\n return Array.from(this.element.querySelectorAll('[data-product-ident]'))\r\n }\r\n\r\n updateTeasers() {\r\n this.teasers = this.getAllTeasers();\r\n }\r\n\r\n setListsId() {\r\n this.element.querySelectorAll('[product-list]').forEach((listEl, index) => {\r\n const indexVal = index + 1;\r\n listEl.setAttribute(\"data-id\", `${indexVal}`)\r\n })\r\n }\r\n\r\n updateLists() {\r\n this.lists = this.setListsId();\r\n }\r\n\r\n trackViewportTeasersOnScroll(viewportTeasers) {\r\n let productsArray = [];\r\n let productArrayGA4 = [];\r\n let productTrackedPosition = 1\r\n\r\n viewportTeasers = this.teasers.filter(t => this.inViewport(t));\r\n !this.element.querySelector(\".price.loading\") && viewportTeasers.forEach(product => {\r\n if (!product.classList.contains(\"product-show\")) {\r\n if (!product.closest('.product-slider') && (!product.closest('.search-wrapper .overlay-content')) || (product.closest('.product-slider') && product.classList.contains('tns-slide-active'))) {\r\n this.productTrackingInformation(product, productsArray, productTrackedPosition++, productArrayGA4)\r\n }\r\n }\r\n })\r\n\r\n this.element.querySelectorAll('[product-list]').forEach((listEl) => {\r\n const filteredProductArrayGA4 = productArrayGA4.filter(product => product.item_list_name == listEl.getAttribute(\"product-list\") && product.item_list_id == listEl.getAttribute(\"data-id\"));\r\n this.listsGA4DataLayerEvent(filteredProductArrayGA4, listEl);\r\n })\r\n\r\n this.impressionsDataLayerEvent(productsArray);\r\n }\r\n\r\n productTrackingInformation(product, productsArray, productTrackedPosition, productArrayGA4) {\r\n let productData: any = {}\r\n let productDataG4: any = {};\r\n productData.id = product.getAttribute('product-sku') ? product.getAttribute('product-sku') : product.getAttribute('data-product-item-id');\r\n productData.name = product.getAttribute(\"product-name\") ? product.getAttribute(\"product-name\") : null;\r\n productData.list = product.closest('[product-list]') ? product.closest('[product-list]').getAttribute('product-list') : null;\r\n productData.brand = 'Eucerin';\r\n productData.category = product.getAttribute(\"product-category\") ? product.getAttribute(\"product-category\") : null;\r\n productData.variant = product.getAttribute('product-variant') ? product.getAttribute('product-variant') : null;\r\n productData.position = productTrackedPosition;\r\n const productPriceElement = product.querySelector('[product-price]');\r\n const productOldPrice = product.querySelector('[product-old-price]');\r\n const price = productOldPrice ? parseFloat(productOldPrice && productOldPrice.getAttribute('product-old-price')) : parseFloat(productPriceElement && productPriceElement.getAttribute('product-price'));\r\n productData.price = price;\r\n product.classList.add('product-show');\r\n productsArray.push(productData);\r\n productTrackedPosition++;\r\n\r\n //GA4 Data collection\r\n productDataG4.item_id = productData.id;\r\n productDataG4.item_name = productData.name\r\n productDataG4.affiliation = product.getAttribute(\"product-affiliation\") ? product.getAttribute(\"product-affiliation\") : null;\r\n productDataG4.coupon = product.querySelector(\"[product-coupon]\") ? product.querySelector(\"[product-coupon]\").getAttribute(\"product-coupon\") : null;\r\n const productGA4DiscountElement = product.querySelector('[product-discount]');\r\n const discountGA4 = parseFloat(productGA4DiscountElement && productGA4DiscountElement.getAttribute('product-discount'))\r\n productDataG4.discount = discountGA4\r\n productDataG4.index = product.closest(\"[data-id]\") ? product.closest(\"[data-id]\").querySelectorAll(\".product-show\").length : null,\r\n productDataG4.item_brand = 'Eucerin';\r\n productDataG4.item_category = productData.category;\r\n productDataG4.item_category2 = product.getAttribute(\"product-category-2\") ? product.getAttribute(\"product-category-2\") : null;\r\n productDataG4.item_category3 = product.getAttribute(\"product-category-3\") ? product.getAttribute(\"product-category-3\") : null;\r\n productDataG4.item_category4 = product.getAttribute(\"product-category-4\") ? product.getAttribute(\"product-category-4\") : null;\r\n productDataG4.item_category5 = product.getAttribute(\"product-category-5\") ? product.getAttribute(\"product-category-5\") : null;\r\n productDataG4.item_list_id = product.closest(\"[data-id]\") ? product.closest(\"[data-id]\").getAttribute(\"data-id\") : null;\r\n productDataG4.item_list_name = product.closest('[product-list]') ? product.closest('[product-list]').getAttribute('product-list') : null;\r\n productDataG4.item_variant = product.getAttribute('product-variant') ? product.getAttribute('product-variant') : null;\r\n\r\n productDataG4.price = price;\r\n productDataG4.quantity = 1;\r\n\r\n productArrayGA4.push(productDataG4);\r\n }\r\n\r\n loadPricesBasedOnIds(ids) {\r\n if (ids.length) {\r\n this.loadPrices(ids);\r\n }\r\n }\r\n inViewport(teaser: HTMLElement) {\r\n const rect = teaser.getBoundingClientRect();\r\n return rect.bottom >= -rect.height && rect.top <= window.outerHeight + rect.height;\r\n }\r\n\r\n hasToBeLoaded(teaser) {\r\n return (teaser.querySelector('.price.loading')) ? true : false;\r\n }\r\n\r\n\r\n getTeaserId(teaser: HTMLElement) {\r\n return teaser.getAttribute('data-product-ident');\r\n }\r\n\r\n listsGA4DataLayerEvent(filteredProductArrayGA4, listEl) {\r\n if (!filteredProductArrayGA4.length) return;\r\n window.dataLayer.push({\r\n event: \"view_item_list\",\r\n ecommerce: {\r\n item_list_id: listEl.getAttribute(\"data-id\"),\r\n item_list_name: listEl.getAttribute(\"product-list\"),\r\n items: filteredProductArrayGA4\r\n },\r\n _clear: true\r\n })\r\n }\r\n\r\n impressionsDataLayerEvent(productsArray) {\r\n if (!productsArray.length) return;\r\n window.dataLayer.push({\r\n event: 'impressions',\r\n ecommerce: {\r\n currencyCode: 'EUR', //TODO document.querySelector('body').getAttribute(\"products-currency\") ? document.querySelector('body').getAttribute(\"products-currency\") : 'null',\r\n impressions: productsArray\r\n }\r\n });\r\n }\r\n\r\n loadPrices(ids: string[]) {\r\n let formData = new FormData();\r\n formData.append('productIdents', `${ids.join(',')}`);\r\n\r\n const xhr = new XMLHttpRequest();\r\n xhr.onload = () => {\r\n if (xhr.status >= 200 && xhr.status < 300) {\r\n this.addPrices(xhr.response);\r\n window.Eucerin.initModules();\r\n\r\n if (Array.from(document.querySelectorAll('.teaser[data-product-item-id]')).length > 0) {\r\n productImpression();\r\n }\r\n } else {\r\n console.error('The request failed!');\r\n }\r\n };\r\n\r\n xhr.open('POST', this.productTeasersUrl);\r\n xhr.responseType = 'json';\r\n xhr.send(formData);\r\n }\r\n\r\n addPrices(data) {\r\n if (typeof data === 'undefined' || !data || !data.ProductTeaserInformation || !data.ProductTeaserInformation.length) {\r\n return;\r\n }\r\n \r\n let productsArray = [];\r\n let productTrackedPosition = 1\r\n\r\n // GA4 List Product Tracking\r\n let productArrayGA4 = [];\r\n\r\n\r\n for (let i = 0; i < data.ProductTeaserInformation.length; i++) {\r\n const productTeaserInfo = data.ProductTeaserInformation[i];\r\n const product = document.querySelector(`[data-product-ident='${productTeaserInfo.Ident}']`)\r\n if (product) {\r\n for (const propertyName in productTeaserInfo.MarkupToSet) {\r\n const key = propertyName;\r\n const value = productTeaserInfo.MarkupToSet[propertyName];\r\n\r\n if (key.length) {\r\n Array.from(document.querySelectorAll(`.${key}`)).forEach((element: HTMLElement) => {\r\n const parentTeaserBtn = element.closest(\".teaser\");\r\n element.replaceWith(value ? createElementFromString(value) : '');\r\n parentTeaserBtn && parentTeaserBtn.querySelector(\".disabled\") ? parentTeaserBtn.classList.add(\"disabled\") : \"\";\r\n });\r\n if (key.indexOf(\"buy-button-\") >= 0 && document.querySelector('[data-product-ident=\"' + productTeaserInfo.Ident + '\"] [data-module=\"BuyNowButton\"]')) {\r\n window.Eucerin.initModules();\r\n }\r\n }\r\n }\r\n \r\n if(this.inViewport(product as HTMLElement) && !product.classList.contains(\"product-show\")){\r\n if (!product.closest('.product-slider') && (!product.closest('.search-wrapper .overlay-content')) || (product.closest('.product-slider') && product.classList.contains('tns-slide-active'))) {\r\n this.productTrackingInformation(product, productsArray, productTrackedPosition++, productArrayGA4)\r\n }\r\n }\r\n\r\n product.querySelector(\".promo-info-legal-text\") ? this.positionLowestPrice(product) : \"\";\r\n\r\n }\r\n }\r\n\r\n this.element.querySelectorAll('[product-list]').forEach((listEl) => {\r\n const filteredProductArrayGA4 = productArrayGA4.filter(product => product.item_list_name == listEl.getAttribute(\"product-list\") && product.item_list_id == listEl.getAttribute(\"data-id\"));\r\n this.listsGA4DataLayerEvent(filteredProductArrayGA4, listEl);\r\n })\r\n\r\n this.impressionsDataLayerEvent(productsArray);\r\n }\r\n\r\n positionLowestPrice(teaser) {\r\n const container = teaser.querySelector(\".commerce-container\");\r\n container && container.classList.add(\"lowest-price-rendered\");\r\n const legalTextHeight = teaser.querySelector(\".promo-info-legal-text\") && teaser.querySelector(\".promo-info-legal-text\").clientHeight;\r\n container ? container.style.paddingBottom = ((legalTextHeight + 8) + 'px') : \"\";\r\n }\r\n}\r\n\r\nnew ProductTeaserInformationLazyLoading.setup();"],"sourceRoot":""}