{"version":3,"sources":["webpack:///./assets/js/Util.js","webpack:///./assets/js/components/CharityProduct.js","webpack:///./assets/js/assortment22.js","webpack:///./assets/js/includes/google-analytics.js","webpack:///./assets/js/components/text_content.js"],"names":["Util","selectToReadOnly","el","$","length","parent","addClass","respondToVisibility","element","callback","once","IntersectionObserver","entries","observer","forEach","entry","intersectionRatio","unobserve","target","root","observe","checkPostcodeAndNumber","postcode","number","numberAddition","country","container","hasClass","ajax","url","method","data","done","result","fail","always","removeClass","checkBECityAndPostcode","city","q","getPostcodeAndCity","limit","success","error","cartesian","args","arg","each","index","array","push","r","max","helper","arr","i","j","l","a","slice","CharityProduct","this","bindEvents","productItems","document","getElementsByClassName","charityProductTileElm","filter","elm","classList","contains","maxHeight","rect","getBoundingClientRect","height","style","calcAndApplyBoxHeight","window","addEventListener","require","APP","assortment","init","banner","leftTop","TextContent","item","impression","dataset","dataLayer","JSON","parse","position","googleAnalytics","productImpression","filterToggle","querySelector","product","toggle","on","e","width","type","productItemClone","find","clone","insertAfter","remove","minAmount","maxAmount","sliderRange","slider","range","min","parseInt","attr","values","slide","event","ui","firstVal","secondVal","val","trigger","filterProducts","filterCheckLabel","hide","checkedInputs","filtered","filters","input","prop","inputVal","filterArray","split","filterCombinations","combination","filteredProduct","key","show","parseFloat","id","prev","replace","html","preventDefault","GoogleAnalytics","productData","productImpressionEvent","ecommerce","impressions","productClick","location","href","addToCart","removeFromCart","checkout","checkoutData","alignWithBottomRow","nodes","isOpen","timeoutId","readMoreText","useImageAsAlignmentTarget","documentElement","bind","getNodes","updateData","onWindowResize","toggleOpen","updateHeight","readMore","open","textOpen","close","textClose","contentHeight","padding","innerContent","targets","targetImages","map","img","images","Array","from","querySelectorAll","requestAnimationFrame","loop","every","image","complete","clearTimeout","setTimeout","visibility","removeProperty","inner","column","readMoreHeight","targetRect","marginBottom","calculatedHeight","shouldHideReadMoreButton","hideReadMoreButton","showReadMoreButton","outer","textContent","removeExistingClone","cloneNode","add","parentElement","appendChild","existingTextBlockCloneElm","removeChild","outerRect","itemRowRects","contentRow","findIndex","top","Math","abs","targetRows","getElementById","categories","products","nodeList","node","clientHeight","lastRow","outerStyles","getComputedStyle","readMoreStyles","outerPaddingTop","getPropertyValue","outerPaddingBottom","readMoreMarginTop","minHeight","getTargetRect","bottom"],"mappings":"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","file":"assortment22.63602c91.js","sourcesContent":["let Util = new function () {\n\n};\n\nUtil.checkPostcodeAndNumber = function (postcode, number, numberAddition, country, container, callback) {\n if (!postcode || !number || !country || !callback) {\n return;\n }\n\n if (!$(container).hasClass('loading')) {\n $(container).addClass('loading')\n\n $.ajax({\n url: '/data/postcode',\n method: 'GET',\n data: {\n postcode: postcode,\n number: number,\n numberAddition: numberAddition,\n country: country\n }\n }).done(function (result) {\n callback(result, container);\n }).fail(function () {\n callback(false, container);\n }).always(function () {\n $(container).removeClass('loading');\n });\n }\n};\n\nUtil.checkBECityAndPostcode = function (city, postcode, container, callback) {\n if (!city || !postcode || !callback) {\n return;\n }\n\n if (!$(container).hasClass('loading')) {\n $(container).addClass('loading')\n\n $.ajax({\n url: '/data/city-and-postcode',\n method: 'GET',\n data: {\n q: postcode,\n }\n }).done(function (result) {\n callback(result, container);\n }).fail(function () {\n callback(false, container);\n }).always(function () {\n $(container).removeClass('loading');\n });\n }\n};\n\nUtil.getPostcodeAndCity = function (q, limit, callback) {\n if (!q) {\n return;\n }\n\n $.ajax({\n url: '/data/city-and-postcode',\n method: 'GET',\n data: {\n q: q,\n limit: limit\n },\n success: function (result) {\n callback(result);\n },\n error: function () {\n callback(false);\n }\n });\n};\n\nUtil.cartesian = function (args) {\n let arg = [];\n $.each(args, function (index, array) {\n arg.push(array);\n });\n\n let r = [], max = arg.length - 1;\n\n function helper(arr, i) {\n for (let j = 0, l = arg[i].length; j < l; j++) {\n let a = arr.slice(0); // clone arr\n a.push(arg[i][j]);\n if (i === max) {\n r.push(a);\n }\n else {\n helper(a, i + 1);\n }\n }\n }\n\n helper([], 0);\n return r;\n};\n\nexport default Util;\n\nexport function selectToReadOnly(el) {\n if ($('option', el).length === 1) {\n el.parent('.form-select-wrapper').addClass('readonly');\n }\n}\n\nexport function respondToVisibility (element, callback, once) {\n const observer = new IntersectionObserver((entries, observer) => {\n entries.forEach(entry => {\n if (!once) {\n return callback(entry.intersectionRatio > 0)\n }\n \n if (entry.intersectionRatio > 0) {\n callback(true)\n observer.unobserve(entry.target)\n }\n })\n }, { root: null })\n\n observer.observe(element)\n}\n","export default class CharityProduct {\n constructor() {\n this.bindEvents()\n }\n\n calcAndApplyBoxHeight() {\n let productItems = document.getElementsByClassName('product-item') || null\n let charityProductTileElm = document.getElementsByClassName('product-item--charity')[0] || null\n\n productItems = [...productItems].filter((elm) => {\n return !elm.classList.contains('product-item--charity')\n })\n\n if (productItems.length === 0 || charityProductTileElm === null) {\n return;\n }\n\n let maxHeight = 0;\n productItems.forEach((elm) => {\n const rect = elm.getBoundingClientRect()\n if (maxHeight < rect.height) {\n maxHeight = rect.height\n }\n })\n\n if (maxHeight > 0) {\n charityProductTileElm.style.height = maxHeight + 'px'\n }\n }\n\n bindEvents() {\n this.calcAndApplyBoxHeight()\n\n window.addEventListener('resize', this.calcAndApplyBoxHeight)\n }\n}\n","import googleAnalytics from './includes/google-analytics'\n\nrequire('jquery-ui/themes/base/slider.css');\nrequire('./../scss/assortment22.scss');\nrequire('./../scss/assortment_filter.scss');\nrequire('jquery-ui/ui/widgets/slider');\n\nimport Util from './Util';\nimport { respondToVisibility } from './Util';\n\nimport TextContent from './components/text_content.js'\nimport CharityProduct from './components/CharityProduct.js'\n\nconst APP = window.APP\n\nlet assortment = new function () {};\n\nassortment.init = function () {\n APP.banner.leftTop();\n new TextContent()\n new CharityProduct()\n assortment.bindEvents();\n};\n\nfunction handleGoogleAnalyticsProductImpressions() {\n const productItems = document.getElementsByClassName('product-item')\n productItems.forEach((item, index) => {\n respondToVisibility(item, (impression) => {\n if (item.dataset.dataLayer) {\n const dataLayer = JSON.parse(item.dataset.dataLayer)\n dataLayer.position = index + 1\n if (impression) {\n googleAnalytics.productImpression(item, dataLayer)\n }\n }\n }, true)\n })\n}\n\nassortment.bindEvents = function () {\n handleGoogleAnalyticsProductImpressions()\n\n const filterToggle = document.querySelector('.filter-toggle');\n const product = $('.producthover');\n\n if (filterToggle !== null) {\n filterToggle.addEventListener('click', function () {\n const filter = document.querySelector('.filter');\n filter.classList.toggle('filter--visible');\n });\n }\n\n product.on('mouseenter mouseleave', function (e) {\n if ($(window).width() < 992) {\n return false;\n }\n\n switch (e.type) {\n case 'mouseenter':\n const productItemClone = $(this).find('.product-item').clone(true);\n\n $(productItemClone).addClass('product-item-clone');\n $(productItemClone).insertAfter($(this).find('.product-item'));\n\n break;\n case 'mouseleave':\n $(this).find('.product-item-clone').remove();\n\n break;\n }\n });\n\n const minAmount = $('#min-amount');\n const maxAmount = $('#max-amount');\n const sliderRange = $('#slider-range');\n\n sliderRange.slider({\n range: true,\n min: parseInt(sliderRange.attr('data-min-price')),\n max: parseInt(sliderRange.attr('data-max-price')) + 1,\n values: [0, 100],\n slide: function (event, ui) {\n let firstVal = parseInt(ui.values[0]);\n let secondVal = parseInt(ui.values[1]);\n minAmount.val(firstVal);\n maxAmount.val(secondVal);\n\n minAmount.trigger('change');\n maxAmount.trigger('change');\n }\n });\n\n let firstVal = sliderRange.slider('values', 0);\n let secondVal = sliderRange.slider('values', 1);\n minAmount.val(firstVal);\n maxAmount.val(secondVal);\n\n minAmount.on('change', function (e) {\n let firstVal = $(this).val();\n sliderRange.slider('values', 0, firstVal);\n\n filterProducts();\n });\n\n maxAmount.on('change', function (e) {\n let secondVal = $(this).val();\n sliderRange.slider('values', 1, secondVal);\n\n filterProducts();\n });\n\n const filterCheckLabel = $('.filter__label');\n\n filterCheckLabel.on('click', function (e) {\n e.preventDefault();\n const input = $(this).prev();\n input.prop('checked', !input.prop('checked'));\n\n filterProducts();\n });\n\n function filterProducts() {\n product.hide().removeClass('filtered');\n const checkedInputs = $('.filter__input:checked');\n let filtered = false;\n\n let filters = {};\n let i = 0;\n\n checkedInputs.each(function () {\n const input = $(this);\n if (input.prop('checked')) {\n filtered = true;\n const inputVal = input.val();\n const filterArray = inputVal.split('-');\n if (typeof filters[filterArray[0]] === typeof undefined) {\n filters[filterArray[0]] = [];\n }\n\n filters[filterArray[0]].push(inputVal);\n i++;\n }\n });\n\n if (!filtered) {\n product.show();\n } else {\n let filterCombinations = Util.cartesian(filters);\n $.each(filterCombinations, function (index, combination) {\n let filteredProduct = '';\n $.each(combination, function (key, filter) {\n filteredProduct += '.filter-' + filter;\n });\n\n $(filteredProduct).addClass('filtered').show();\n });\n }\n\n product.filter(function () {\n return parseFloat($(this).data('product-price')) < parseInt(minAmount.val())\n || parseFloat($(this).data('product-price')) > parseInt(maxAmount.val());\n }).hide();\n\n product.filter(function () {\n if (filtered && !$(this).hasClass('filtered')) {\n return false;\n }\n return parseFloat($(this).data('product-price')) > parseInt(minAmount.val())\n && parseFloat($(this).data('product-price')) < parseInt(maxAmount.val());\n }).show();\n\n\n filterCheckLabel.each(function () {\n const id = $(this).prev().attr('id').replace('check-', '');\n const filteredProduct = $(`.producthover.filter-${id}:visible`);\n\n $(this).find('.filter-count').html(filteredProduct.length);\n });\n }\n};\n\n$(function() {\n assortment.init();\n});\n","function GoogleAnalytics() {}\n\nGoogleAnalytics.productImpression = function (elm, productData) {\n const eventName = 'ProductImpressions'\n const productImpressionEvent = dataLayer.find(item => item.event === eventName)\n if (!productImpressionEvent) {\n dataLayer.push({\n 'event': eventName,\n 'currencyCode': 'EUR',\n 'ecommerce': {\n 'impressions': [\n productData\n ]\n }\n })\n } else {\n productImpressionEvent.ecommerce.impressions.push(productData)\n }\n}\n\nGoogleAnalytics.productClick = function (elm, productData, position) {\n productData.position = position\n dataLayer.push({\n 'event': 'productClick',\n 'currencyCode': 'EUR',\n 'ecommerce': {\n 'click': {\n 'actionField': {'list': 'Assortiment'},\n 'products': [\n productData\n ]\n }\n },\n 'eventCallback': function () {\n document.location = elm.href\n }\n })\n}\n\nGoogleAnalytics.addToCart = function (elm, productData) {\n dataLayer.push({\n 'event': 'addToCart',\n 'currencyCode': 'EUR',\n 'ecommerce': {\n 'add': {\n 'products': [\n productData\n ]\n }\n }\n })\n}\n\nGoogleAnalytics.removeFromCart = function (productData) {\n dataLayer.push({\n 'event': 'removeFromCart',\n 'currencyCode': 'EUR',\n 'ecommerce': {\n 'remove': {\n 'products': [\n productData\n ]\n }\n }\n })\n}\n\nGoogleAnalytics.checkout = function (checkoutData) {\n dataLayer.push(checkoutData)\n}\n\nexport default GoogleAnalytics\n","const CATEGORIES_ID = 'categories'\nconst PRODUCTS_ID = 'producten'\n\nconst CATEGORY_ITEM_SELECTOR = '.category-item'\nconst PRODUCT_ITEM_SELECTOR = '.product-item'\n\nconst MAX_CLOSED_HEIGHT = 440\n\nexport default class TextContent {\n constructor(alignWithBottomRow = false) {\n this.nodes = null\n this.isOpen = false\n this.data = null\n this.timeoutId = null\n this.readMoreText = null\n this.alignWithBottomRow = alignWithBottomRow\n this.useImageAsAlignmentTarget = document.documentElement.classList.contains('theme22')\n\n this.init = this.init.bind(this)\n this.getNodes = this.getNodes.bind(this)\n this.updateData = this.updateData.bind(this)\n this.onWindowResize = this.onWindowResize.bind(this)\n this.toggleOpen = this.toggleOpen.bind(this)\n this.updateHeight = this.updateHeight.bind(this)\n\n this.nodes = this.getNodes()\n\n if (this.nodes) {\n const { readMore } = this.nodes\n this.readMoreText = { open: readMore.dataset.textOpen, close: readMore.dataset.textClose }\n\n this.init()\n }\n }\n\n get shouldHideReadMoreButton() {\n const { contentHeight, height, padding } = this.data\n return !this.isOpen && (contentHeight < (height - padding))\n }\n\n init() {\n const { innerContent, targets, readMore } = this.nodes\n const targetImages = this.useImageAsAlignmentTarget\n ? targets\n : targets.map((target) => target.querySelector('img')).filter((img) => !!img)\n\n const images = [\n ...Array.from(innerContent.querySelectorAll('img')),\n ...targetImages\n ]\n\n const loop = () => {\n if (!images.every((image) => image.complete)) {\n requestAnimationFrame(loop)\n return\n }\n\n this.updateData()\n this.updateHeight()\n\n readMore.addEventListener('click', this.toggleOpen)\n window.addEventListener('resize', this.onWindowResize)\n }\n\n requestAnimationFrame(loop)\n }\n\n onWindowResize() {\n clearTimeout(this.timeoutId)\n this.timeoutId = setTimeout(() => {\n this.updateData()\n this.updateHeight()\n }, 100)\n }\n\n hideReadMoreButton() {\n const { readMore } = this.nodes\n readMore.style.visibility = 'hidden'\n readMore.style.position = 'absolute'\n }\n\n showReadMoreButton() {\n const { readMore } = this.nodes\n readMore.style.removeProperty('visibility')\n readMore.style.removeProperty('position')\n }\n\n updateHeight() {\n const { inner, column } = this.nodes\n const {\n height,\n padding,\n readMoreHeight,\n contentHeight,\n targetRect,\n } = this.data\n\n column.style.marginBottom = targetRect ? '' : '30px'\n\n if (targetRect) {\n const calculatedHeight = this.shouldHideReadMoreButton\n ? (height - padding)\n : (height - padding - readMoreHeight)\n inner.style.height = `${calculatedHeight}px`\n } else {\n inner.style.height = `${contentHeight < height ? contentHeight : height}px`\n }\n\n if (this.shouldHideReadMoreButton) {\n this.hideReadMoreButton()\n } else {\n this.showReadMoreButton()\n }\n }\n\n toggleOpen() {\n this.isOpen = !this.isOpen\n\n const { inner, readMore, outer } = this.nodes\n\n readMore.textContent = this.isOpen ? this.readMoreText.close : this.readMoreText.open\n inner.classList.toggle('open')\n readMore.classList.toggle('open')\n outer.classList.toggle('opened')\n\n this.removeExistingClone();\n\n if (this.isOpen) {\n const clone = outer.cloneNode(true)\n clone.classList.add('text-block__clone')\n outer.parentElement.appendChild(clone);\n clone.querySelector('.text-block-read-more').addEventListener('click', () => {\n this.toggleOpen();\n })\n }\n\n this.updateHeight()\n }\n\n removeExistingClone() {\n const { outer } = this.nodes\n const existingTextBlockCloneElm = document.getElementsByClassName('text-block__clone')[0] || null;\n if (existingTextBlockCloneElm) {\n outer.parentElement.removeChild(existingTextBlockCloneElm)\n }\n }\n\n getTargetRect(data) {\n const {\n outerRect,\n contentHeight,\n itemRowRects,\n padding,\n } = data\n\n if (itemRowRects.length === 0) {\n return null\n }\n\n const contentRow = itemRowRects.findIndex(({ top }) => (\n Math.abs(top - outerRect.top) <= 5\n ))\n if (contentRow === -1) {\n return null\n }\n\n const targetRows = itemRowRects.slice(contentRow)\n if (this.alignWithBottomRow) {\n return targetRows[targetRows.length - 1]\n }\n \n if (\n (targetRows.length === 1) ||\n ((contentHeight + padding) <= targetRows[0].height && !this.alignWithBottomRow)\n ) {\n return targetRows[0]\n }\n \n return targetRows[1]\n }\n\n getNodes() {\n const column = document.getElementById('text-blocks')\n if (!column) {\n return null\n }\n \n const inner = document.querySelector('.text-block-inner')\n if (!inner) {\n return null\n }\n\n const innerContent = document.querySelector('.text-block-inner__content')\n if (!innerContent) {\n return null\n }\n\n const outer = inner.parentElement\n const readMore = document.querySelector('.text-block-read-more')\n if (!readMore) {\n return null\n }\n \n const categories = document.getElementById(CATEGORIES_ID)\n const products = document.getElementById(PRODUCTS_ID)\n if (!(categories || products)) {\n return null\n }\n\n let nodeList = categories\n ? categories.querySelectorAll(CATEGORY_ITEM_SELECTOR)\n : products.querySelectorAll(PRODUCT_ITEM_SELECTOR)\n \n if (nodeList.length === 0) {\n return null\n }\n\n nodeList = Array.from(nodeList).filter((elm) => {\n return !elm.classList.contains('product-item--charity')\n })\n\n return {\n column,\n inner,\n outer,\n innerContent,\n readMore,\n targets: this.useImageAsAlignmentTarget\n ? nodeList.map((node) => node.querySelector('img')).filter((img) => !!img)\n : nodeList\n }\n }\n\n updateData() {\n const { innerContent, outer, readMore, targets } = this.nodes\n\n const contentHeight = innerContent.clientHeight\n\n const itemRowRects = []\n targets.forEach((target) => {\n const rect = target.getBoundingClientRect()\n const lastRow = itemRowRects.length > 0 ? itemRowRects[itemRowRects.length - 1] : null\n if (!lastRow) {\n itemRowRects.push(rect)\n } else if (rect.top > lastRow.top) {\n itemRowRects.push(rect)\n }\n })\n\n const outerRect = outer.getBoundingClientRect()\n\n const outerStyles = window.getComputedStyle(outer)\n const readMoreStyles = window.getComputedStyle(readMore)\n\n const outerPaddingTop = parseInt(outerStyles.getPropertyValue('padding-top'))\n const outerPaddingBottom = parseInt(outerStyles.getPropertyValue('padding-bottom'))\n\n const readMoreMarginTop = parseInt(readMoreStyles.getPropertyValue('margin-top'))\n const readMoreHeight = (readMore.clientHeight + readMoreMarginTop)\n\n const data = {\n height: MAX_CLOSED_HEIGHT,\n minHeight: 0,\n readMoreHeight,\n contentHeight,\n outerRect,\n itemRowRects,\n padding: (outerPaddingTop + outerPaddingBottom),\n }\n\n const targetRect = this.getTargetRect(data)\n\n this.data = !targetRect\n ? data\n : {\n ...data,\n targetRect,\n height: (targetRect.bottom - outerRect.top),\n minHeight: targetRect.height * 2,\n }\n }\n}\n"],"sourceRoot":""}