{"version":3,"file":"products.2989af.js","mappings":"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","sources":["webpack://clorox-intl/./js/src/pages/products.js"],"sourcesContent":["/*\npage-products.js\n product archive support\n filtering controls - handles both category filters & product finder filters\n */\n\n/* eslint-disable no-use-before-define */\n\n(($) => {\n // make mobile filters sticky\n const $stickyFilter = $('.products-filter').sticky({ topSpacing: 70 });\n // update sticky filter when open/closing filter submenus\n // fixes issue with sizing of products-filter before scroll\n $('#filter-collapse').on('shown.bs.collapse hidden.bs.collapse', () => {\n $stickyFilter.sticky('update');\n });\n\n const $body = $('body');\n const $win = $(window);\n\n const $cats = $('.js-product-category');\n\n const $productStorage = $('.products-storage .js-product');\n const $productDisplay = $('.products-list');\n // add schema.org attributes after load, to avoid error on empty list\n $productDisplay.attr('itemscope', '');\n $productDisplay.attr('itemtype', 'http://schema.org/ItemList');\n\n const { termData } = CLOROX_GLOBAL;\n const $title = $('.js-title');\n const $description = $('.js-description');\n const defaultTitle = $title.data('default');\n const titleTemplate = $title.data('title-template');\n const defaultDescription = $description.data('default');\n const pageTitlePostfix = document.title.substr(document.title.indexOf(' | '));\n\n // shared clear control\n $('.js-clear-filter').on('click', () => {\n $body.trigger('clear-filter');\n });\n\n // handle clearing of one filter set when starting the other\n let reloading = null; // set to cat or finder when reloading\n $body.on('reloading', (e, type) => {\n reloading = type;\n $body.trigger('clear-filter');\n reloading = null;\n });\n\n // filtering by category\n $(() => {\n // main function for showing correct products in grid & updating counts\n function reload() {\n if (!reloading) {\n $body.trigger('reloading', 'cat');\n }\n\n // get previous lazy loader object & destroy\n // prevents old obj from loading imgs that are no longer displayed\n const lazyLoader = $('.lazy-product-tile', $productDisplay).data('plugin_lazy');\n if (lazyLoader) {\n lazyLoader.destroy();\n }\n\n // remove current set of products from display\n $productDisplay.children().remove();\n\n // build filter for new set of products\n let filter = '*';\n const catArray = [];\n $cats.each((i, el) => {\n const $this = $(el);\n if ($this.hasClass('active')) {\n const cat = $this.data('catid');\n filter = `${filter}.js-cat-${cat}`;\n catArray.push(cat);\n }\n });\n $body.trigger('updateurl', [catArray]);\n updateHeader(catArray);\n\n // show the selected items\n let $clones = $productStorage.filter(filter).clone();\n $clones = sortProductTiles($clones, catArray);\n handleSingleScent($clones, catArray); // change img & link if single scent selected\n $productDisplay.append($clones);\n $('.lazy-product-tile', $productDisplay).Lazy();\n\n // product & filter counts\n $('.js-product-count').text($clones.length);\n const filterCount = $cats.filter('.active').length;\n if (filterCount) {\n $('.js-filter-count').text(filterCount);\n // don't use show to avoid showing on non-mobile\n $('.js-show-when-filtering').css('display', '');\n } else {\n $('.js-show-when-filtering').css('display', 'none');\n }\n // handle cat parent counts (mobile display only)\n $('.js-filter-header').each((i, el) => {\n const $this = $(el);\n const count = $this.closest('.js-cat-panel').find('.js-product-category.active').length;\n $('.js-cat-filter-count', $this).text(count ? `(${count})` : '');\n });\n\n // update category counts & disable filters as necessary\n $cats.each((i, el) => {\n const $this = $(el);\n const cat = $this.data('catid');\n const count = $clones.filter(`.js-cat-${cat}`).length;\n $('.js-cat-count', $this).text(count);\n if (!count) {\n $this.addClass('disabled').attr('aria-disabled', 'true').find('input').attr('tabindex', '-1');\n } else {\n $this.removeClass('disabled').attr('aria-disabled', 'false').find('input').attr('tabindex', '0');\n }\n });\n }\n\n function updateHeader(cats) {\n if (!cats.length) {\n // no cats\n document.title = defaultTitle + pageTitlePostfix;\n $title.html(defaultTitle);\n $description.html(defaultDescription);\n } else if (cats.length === 1) {\n // single cat\n document.title = termData[cats[0]].pageTitle + pageTitlePostfix;\n // use title template to specify title unless there is an override\n // for this cat\n if (termData[cats[0]].headingOverride) {\n $title.html(termData[cats[0]].headingOverride);\n } else {\n const newTitle = titleTemplate.replace('%', termData[cats[0]].name);\n $title.html(newTitle);\n }\n // $title.html(termData[cats[0]].name + ' ' + defaultTitle);\n const desc = termData[cats[0]].description;\n $description.html(desc || defaultDescription);\n } else {\n // multiple cats\n document.title = defaultTitle + pageTitlePostfix;\n $title.html(defaultTitle);\n $description.html(defaultDescription);\n }\n }\n\n // sort product tiles based on product sort order lists\n // there is one for the page & can be overridden by categories\n function sortProductTiles($products, catArray) {\n // get sort list to use\n let sortOrder;\n if (catArray.length === 1 && CLOROX_GLOBAL.termData[catArray[0]].sort_order) {\n sortOrder = CLOROX_GLOBAL.termData[catArray[0]].sort_order;\n } else {\n sortOrder = CLOROX_GLOBAL.product_sort_order;\n if (!sortOrder) {\n sortOrder = [];\n }\n }\n sortOrder = sortOrder.map((x) => +x);\n\n // return sorted list\n // based of sortorder array and followed by non-list items alpha\n return $products.sort((a, b) => {\n const $a = $(a);\n const $b = $(b);\n const i = sortOrder.indexOf($a.data('id'));\n const j = sortOrder.indexOf($b.data('id'));\n if (i === -1 && j === -1) {\n const nameA = $('.product-name', $a).text();\n const nameB = $('.product-name', $b).text();\n return nameA < nameB ? -1 : 1;\n }\n if (i === -1) {\n return 1;\n }\n if (j === -1) {\n return -1;\n }\n\n return i < j ? -1 : 1;\n });\n }\n\n // when single scent cat is selected\n // update images & links for that scent\n function handleSingleScent($tiles, catArray) {\n let scent;\n const scentCount = catArray.reduce((acc, cat) => {\n if (CLOROX_GLOBAL.termData[cat].scent) {\n scent = cat;\n return acc + 1;\n }\n return acc;\n }, 0);\n if (scentCount === 1) {\n $tiles.each((i, el) => {\n // update image\n const $img = $('img', $(el));\n $img.attr('src', $img.data(`scentimg-${scent}`));\n $img.attr('data-src', $img.data(`scentimg-${scent}`));\n\n // update link\n const $a = $img.closest('a');\n $a.attr('href', `${$a.attr('href') + scent}/`);\n });\n }\n }\n\n // filtering handling\n $cats.on('click', function onclick() {\n const $this = $(this);\n if ($this.hasClass('disabled')) {\n return;\n }\n $this.toggleClass('active');\n reload();\n });\n $cats.on('keypress', function onClick(e) {\n if (e.which === 13) {\n $(this).click();\n }\n });\n\n // set filters based on url\n $body.on('setfilters', (e, catsArray) => {\n $cats.removeClass('active');\n $.each(catsArray, (i, cat) => {\n if (cat) {\n $cats.filter(`[data-catid=\"${cat}\"]`).addClass('active');\n }\n });\n reload();\n });\n\n // handle clear button press\n $body.on('clear-filter', () => {\n if (reloading !== 'cat') {\n $cats.removeClass('active');\n reload();\n }\n });\n\n // open correct filter parent based on current filters\n // used when restoring from url\n $body.on('restore-filter-collapse', () => {\n // move to separate restore - used at startup & popstate\n // make sure parent cat is open for an active cat\n const $activeFilters = $('.js-product-category.active');\n if ($activeFilters.length && !$('#filter-collapse .collapse.in').find($activeFilters).length) {\n $activeFilters.first().closest('.collapse').parent().find('.js-filter-header').click();\n }\n });\n\n // mobile UI handling\n // open & close popup styled filter list\n $('.js-mobile-filter-open').on('click', () => {\n $('div.products-filter').addClass('open');\n });\n $('.js-mobile-filter-close').on('click', () => {\n $('#filter-collapse').collapse('hide');\n $('div.products-filter').removeClass('open');\n });\n });\n\n // url, history, state handling\n $(() => {\n // handle initial load\n const parts = window.location.pathname.split('/');\n // console.log(parts);\n if (parts[3]) {\n const cats = parts.slice(3);\n $body.trigger('setfilters', [cats]);\n window.history.replaceState(\n {\n cats,\n },\n null\n );\n } else {\n // init full load of products\n $body.trigger('reloading', 'init');\n }\n $body.trigger('restore-filter-collapse');\n\n // flag to prevent setting history state on restore from history\n let disableUpdateUrl = false;\n\n // update history event\n $body.on('updateurl', (e, cats) => {\n if (disableUpdateUrl) return;\n\n const urlBase = translatedStrings.urls['/products/'];\n\n if (!Array.isArray(cats) || !cats.length) {\n // no cats\n window.history.pushState(\n {\n cats,\n },\n null,\n urlBase\n );\n } else if (cats.length === 1) {\n // single cat\n window.history.pushState(\n {\n cats,\n },\n null,\n `${urlBase + translatedStrings.product_category}/${cats[0]}/`\n );\n } else {\n // multiple cats\n // sort & join into path\n window.history.pushState(\n {\n cats,\n },\n null,\n `${urlBase + translatedStrings.product_category}/${cats.sort().join('/')}/`\n );\n }\n });\n\n // restore from history event\n $win.on('popstate', () => {\n disableUpdateUrl = true;\n const { state } = window.history;\n if (state && state.cats) {\n $body.trigger('setfilters', [state.cats]);\n $body.trigger('restore-filter-collapse');\n } else {\n $body.trigger('clear-filter');\n }\n disableUpdateUrl = false;\n });\n });\n\n // hide filters that don't apply to current product list\n // happens with prods hidden for certain countries\n $(() => {\n $cats.each((i, el) => {\n const $filter = $(el);\n const catid = $filter.data('catid');\n if (!$productStorage.filter(`.js-cat-${catid}`).length) {\n $filter.hide();\n }\n });\n });\n})(jQuery);\n"],"names":["$","$stickyFilter","sticky","topSpacing","on","$body","$win","window","$cats","$productStorage","$productDisplay","attr","termData","CLOROX_GLOBAL","$title","$description","defaultTitle","data","titleTemplate","defaultDescription","pageTitlePostfix","document","title","substr","indexOf","trigger","reloading","e","type","reload","lazyLoader","destroy","children","remove","filter","catArray","each","i","el","$this","hasClass","cat","concat","push","cats","length","pageTitle","headingOverride","html","newTitle","replace","name","desc","description","updateHeader","$clones","clone","$products","sortOrder","sort_order","product_sort_order","map","x","sort","a","b","$a","$b","j","text","sortProductTiles","$tiles","scent","reduce","acc","$img","closest","handleSingleScent","append","Lazy","filterCount","css","count","find","removeClass","addClass","this","toggleClass","which","click","catsArray","$activeFilters","first","parent","collapse","parts","location","pathname","split","slice","history","replaceState","disableUpdateUrl","urlBase","translatedStrings","urls","Array","isArray","pushState","product_category","join","state","$filter","catid","hide","jQuery"],"sourceRoot":""}