{"version":3,"file":"./modules/FilterSort.xxxxxxxx.js","mappings":"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","sources":["webpack:///./store/modules/Filter/actions.ts","webpack:///./modules/FilterAction.ts","webpack:///./modules/Sort.ts","webpack:///./modules/FilterSort.ts","webpack:///./modules/NivTFilterNavigation.ts","webpack:///./modules/NivTSort.ts","webpack:///./modules/FilterUtils.ts"],"sourcesContent":["import { \r\n FILTER_STATE,\r\n FilterStateTypes\r\n} from './types';\r\n\r\nexport const filterState = (filter: FilterParams): FilterStateTypes => ({ type: FILTER_STATE, filter });\r\n","import { getOptions, loadParamsFromURL } from '../helpers/helperFunctions';\r\nimport { getSibling, createElementFromString, toggleClass, getClosest, addSpinnerToTeaserGrid, removeSpinnerFromTeaserGrid } from '../helpers/DOMHelpers';\r\nimport store from '../store';\r\nimport { filterState } from '../store/actions';\r\nimport { encodeParams, onFilterTeaserGridChange } from './FilterUtils';\r\n\r\nexport default class FilterAction {\r\n private filterTag: HTMLElement;\r\n private tagsMap: TagMap;\r\n private filters: FilterItem[];\r\n private applyBtn: HTMLButtonElement;\r\n private applyBtnCounter: HTMLElement;\r\n\r\n constructor(public element: HTMLElement, private options: FilterActionOptions = {}) {\r\n this.options = getOptions(this.element, Object.assign(this.getDefaultOptions(), this.options));\r\n this.filterTag = this.element.querySelector(this.options.filterTagSelector)\r\n this.applyBtn = this.element.querySelector(this.options.applyBtnSelector);\r\n this.applyBtnCounter = this.applyBtn.firstElementChild;\r\n\r\n this.tagsMap = {\r\n tagsStr: window.atob(this.filterTag.getAttribute(this.options.tagsMapAttrs.tagsStrAttr)),\r\n tagCount: parseInt(this.filterTag.getAttribute(this.options.tagsMapAttrs.tagCountAttr)),\r\n productsCount: parseInt(this.filterTag.getAttribute(this.options.tagsMapAttrs.productsCountAttr))\r\n };\r\n\r\n this.initURLNavigation()\r\n .init();\r\n }\r\n\r\n private init(): FilterAction {\r\n this.recoverState()\r\n return this;\r\n }\r\n\r\n private initURLNavigation() {\r\n window.addEventListener(\"popstate\", () => {\r\n this.getUrlParameters()\r\n .resetState()\r\n .update();\r\n });\r\n\r\n this.getUrlParameters();\r\n\r\n return this;\r\n }\r\n\r\n private getUrlParameters() {\r\n this.options.state = loadParamsFromURL();\r\n return this;\r\n }\r\n\r\n private getFilters(): FilterItem[] {\r\n const filters = [];\r\n const hierarchicalFilterNodes = Array.from(document.querySelectorAll(this.options.hierarchicalFilterSelector));\r\n\r\n hierarchicalFilterNodes.forEach((filterNode: HTMLElement) => {\r\n const values = [];\r\n const valueNodes = Array.from(filterNode.querySelectorAll(this.options.hierarchicalFilterValueSelector));\r\n\r\n valueNodes.forEach((valueNode: HTMLInputElement) => {\r\n const key = valueNode.dataset.key;\r\n if (!key)\r\n return;\r\n values.push({\r\n node: valueNode,\r\n key: key,\r\n checked: valueNode.classList.contains(this.options.hierarchicalFilterValueActiveClass),\r\n hierarchical: true,\r\n index: parseInt(valueNode.dataset.index),\r\n parentsIndex: valueNode.dataset.parents,\r\n });\r\n });\r\n\r\n const filter = {\r\n node: filterNode,\r\n key: filterNode.dataset.key,\r\n values: values,\r\n isAnd: false,\r\n hierarchical: true,\r\n cache: []\r\n };\r\n\r\n filters.push(filter);\r\n });\r\n\r\n const filterNodes = Array.from(this.element.querySelectorAll(this.options.filterItemSelector));\r\n\r\n filterNodes.forEach((filterNode: HTMLElement) => {\r\n const filterKey = filterNode.dataset.key,\r\n isAnd = filterNode.dataset.isAnd === 'True',\r\n valueNodes = Array.from(filterNode.querySelectorAll(this.options.checkboxSelector)),\r\n values = [];\r\n\r\n valueNodes.forEach((valueNode: HTMLInputElement) => {\r\n values.push({\r\n node: valueNode,\r\n key: valueNode.name,\r\n checked: valueNode.checked,\r\n hierarchical: false,\r\n index: parseInt(valueNode.dataset.index)\r\n });\r\n });\r\n\r\n const filter = {\r\n node: filterNode,\r\n key: filterKey,\r\n values: values,\r\n isAnd: isAnd,\r\n hierarchical: false,\r\n cache: [],\r\n };\r\n\r\n filters.push(filter);\r\n });\r\n\r\n return filters;\r\n }\r\n\r\n private isProductTagged(productIdx: number, tagIdx: number): boolean {\r\n const i = productIdx * this.tagsMap.tagCount + tagIdx;\r\n const isTagged = (this.tagsMap.tagsStr.charCodeAt(Math.floor(i / 8)) & (1 << (i % 8))) !== 0;\r\n \r\n return isTagged;\r\n }\r\n\r\n private isProductIncludedInFilter(p, filter): boolean {\r\n let values = filter.values,\r\n isAndFilter = filter.isAnd,\r\n anyValueChecked = false;\r\n\r\n for (let v = 0; v < values.length; v++) {\r\n const value = values[v];\r\n\r\n if (value.checked) {\r\n anyValueChecked = true;\r\n if (this.isProductTagged(p, value.index)) {\r\n if (!isAndFilter)\r\n return true;\r\n } else {\r\n if (isAndFilter)\r\n return false;\r\n }\r\n }\r\n }\r\n\r\n if (isAndFilter)\r\n return true;\r\n if (!anyValueChecked)\r\n return true;\r\n\r\n return false;\r\n }\r\n\r\n private isProductVisible(p): boolean {\r\n for (let f = 0; f < this.filters.length; f++) {\r\n const filter = this.filters[f],\r\n cacheEntry = filter.cache[p];\r\n\r\n if (cacheEntry === true)\r\n continue;\r\n\r\n if (cacheEntry === false)\r\n return false;\r\n\r\n var isIncluded = this.isProductIncludedInFilter(p, filter);\r\n filter.cache[p] = isIncluded;\r\n\r\n if (!isIncluded) {\r\n return false;\r\n }\r\n }\r\n return true;\r\n }\r\n\r\n private countResults(): number {\r\n let count = 0;\r\n\r\n for (var p = 0; p < this.tagsMap.productsCount; p++) {\r\n if (this.isProductVisible(p))\r\n count++;\r\n }\r\n\r\n return count;\r\n }\r\n\r\n private countSimulateChecked(f, v, checkedValue): number {\r\n const filter = this.filters[f];\r\n const oldCache = filter.cache;\r\n filter.cache = [];\r\n const value = filter.values[v];\r\n const oldChecked = value.checked;\r\n value.checked = checkedValue;\r\n const count = this.countResults();\r\n value.checked = oldChecked;\r\n filter.cache = oldCache;\r\n\r\n return count;\r\n }\r\n\r\n private countHierarchicalSimulateOnlyThisChecked(f, v): number {\r\n const oldFilters = this.filters;\r\n this.filters = [];\r\n for (var i = 0; i < oldFilters.length; i++) {\r\n var filter = oldFilters[i];\r\n if (filter.hierarchical) {\r\n this.filters.push(filter);\r\n }\r\n }\r\n const count = this.countSimulateOnlyThisChecked(f, v);\r\n this.filters = oldFilters;\r\n return count;\r\n }\r\n\r\n private countSimulateOnlyThisChecked(f, v): number {\r\n const oldFilter = this.filters[f];\r\n\r\n this.filters[f] = {\r\n cache: [],\r\n values: [\r\n {\r\n index: oldFilter.values[v].index,\r\n checked: true\r\n }\r\n ]\r\n };\r\n\r\n const count = this.countResults();\r\n this.filters[f] = oldFilter;\r\n\r\n return count;\r\n }\r\n\r\n private checkHierarchicalParendIdx(value) {\r\n let parentsIdx = value.parentsIndex;\r\n let parentsIdxArray = value.parentsIndex.split(\", \");\r\n\r\n return (!parentsIdx || parentsIdxArray.includes(this.options.hierarchicalParentIndex) || this.options.hierarchicalParentIndex === false) ? true : false;\r\n }\r\n\r\n private setHierarchicalParendIdx() {\r\n const mainNavList = Array.from(document.querySelectorAll(`${this.options.hierarchicalFilterValueSelector}.${this.options.hierarchicalFilterValueActiveClass}`));\r\n\r\n if (mainNavList.length != 0) {\r\n const parentItem = mainNavList[mainNavList.length - 1];\r\n this.options.hierarchicalParentIndex = parentItem.getAttribute('data-index');\r\n } else {\r\n this.options.hierarchicalParentIndex = false;\r\n }\r\n }\r\n\r\n private setVisibility(value, isVisible) {\r\n value.node.hidden = !isVisible;\r\n }\r\n\r\n private setCount(value: FilterValue, count: string, isDisabled: boolean): FilterAction {\r\n let countNode;\r\n let parent;\r\n\r\n if (value.hierarchical) {\r\n countNode = value.node.querySelector('.nx-filter-navigation__count');\r\n\r\n } else {\r\n countNode = getSibling(value.node, this.options.countNodeSelector) || value.node.nextSibling.nextSibling;\r\n\r\n parent = getClosest(value.node, \".nx-cat-item\");\r\n value.node.disabled = isDisabled;\r\n parent.hidden = isDisabled;\r\n }\r\n if (!countNode) return;\r\n\r\n countNode.innerText = count;\r\n return;\r\n }\r\n\r\n private anyValueChecked(filter): boolean {\r\n const values = filter.values;\r\n\r\n for (let v = 0; v < values.length; v++) {\r\n if (values[v].checked)\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n private setGlobalCount(count): FilterAction {\r\n this.applyBtnCounter.innerText = `(${count})`;\r\n this.applyBtn.disabled = count === 0;\r\n\r\n return this;\r\n }\r\n\r\n private getReloadUrl(gridNode): string {\r\n const paramsStr = encodeParams(this.saveCurrentState().getState()),\r\n ajaxUrl = gridNode.dataset.ajaxUrl + '&' + paramsStr;\r\n\r\n return ajaxUrl;\r\n }\r\n\r\n private getReloadUrlFromHistory(gridNode, history): string {\r\n const ajaxUrl = gridNode.dataset.ajaxUrl + '&' + history;\r\n\r\n return ajaxUrl;\r\n }\r\n\r\n private getFilterParams(gridNode): string {\r\n const paramsStr = encodeParams(this.saveCurrentState().getState());\r\n\r\n return paramsStr;\r\n }\r\n\r\n private getParams(): FilterParams {\r\n const filters = this.getFilters(),\r\n params = {},\r\n selector = document.getElementById('sort'),\r\n sortMethod = selector && selector.value;\r\n\r\n filters.forEach(filter => {\r\n const keys = [];\r\n\r\n filter.values.forEach(value => {\r\n if (value.checked) {\r\n keys.push(value.key);\r\n }\r\n });\r\n\r\n if (keys.length > 0) {\r\n params[filter.key] = keys;\r\n }\r\n });\r\n\r\n params['sort'] = [sortMethod];\r\n return params;\r\n }\r\n\r\n update(): FilterAction {\r\n this.setHierarchicalParendIdx();\r\n this.filters = this.getFilters();\r\n const currentCount = this.countResults();\r\n this.setGlobalCount(currentCount);\r\n\r\n this.filters.forEach((filter, fIdx) => {\r\n if (filter.hierarchical) {\r\n filter.values.forEach((value, vIdx) => {\r\n if (!value.checked) {\r\n this.countHierarchicalSimulateOnlyThisChecked(fIdx, vIdx);\r\n const count = this.countHierarchicalSimulateOnlyThisChecked(fIdx, vIdx);\r\n const hasHierarchicalParendIdx = this.checkHierarchicalParendIdx(value);\r\n this.setVisibility(value, (count !== 0 && hasHierarchicalParendIdx));\r\n }\r\n });\r\n }\r\n\r\n filter.values.forEach((value, vIdx) => {\r\n let countStr;\r\n if (!value.checked) {\r\n const count = this.countSimulateChecked(fIdx, vIdx, true);\r\n if (filter.isAnd || !this.anyValueChecked(filter)) {\r\n countStr = count.toString();\r\n } else {\r\n if (this.countSimulateOnlyThisChecked(fIdx, vIdx) === 0) {\r\n countStr = \"0\";\r\n } else {\r\n let difference = count - currentCount;\r\n if (difference === 0) {\r\n countStr = '-';\r\n } else {\r\n countStr = '+' + difference;\r\n }\r\n }\r\n }\r\n } else {\r\n countStr = \"\";\r\n }\r\n\r\n let isDisabled = countStr === \"0\";\r\n this.setCount(value, countStr, isDisabled);\r\n });\r\n\r\n let allValuesDisabled = Array.from(filter.values).every(({ node: { disabled } }) => disabled);\r\n toggleClass(filter.node, 'nx-filter-tag--disabled', allValuesDisabled);\r\n });\r\n\r\n this.setAllCount(currentCount);\r\n document.dispatchEvent(new CustomEvent('ScrollSlider:reset'));\r\n\r\n return this;\r\n }\r\n\r\n updateV2(): FilterAction {\r\n this.setHierarchicalParendIdx();\r\n this.filters = this.getFilters();\r\n const currentCount = this.countResults();\r\n this.setGlobalCount(currentCount);\r\n\r\n this.filters.forEach((filter, fIdx) => {\r\n if (filter.hierarchical) {\r\n filter.values.forEach((value, vIdx) => {\r\n if (!value.checked) {\r\n this.countHierarchicalSimulateOnlyThisChecked(fIdx, vIdx);\r\n // const count = this.countHierarchicalSimulateOnlyThisChecked(fIdx, vIdx);\r\n // const hasHierarchicalParendIdx = this.checkHierarchicalParendIdx(value);\r\n // this.setVisibility(value, (count !== 0 && hasHierarchicalParendIdx));\r\n }\r\n });\r\n }\r\n\r\n filter.values.forEach((value, vIdx) => {\r\n let countStr;\r\n if (!value.checked) {\r\n const count = this.countSimulateChecked(fIdx, vIdx, true);\r\n if (filter.isAnd || !this.anyValueChecked(filter)) {\r\n countStr = count.toString();\r\n } else {\r\n if (this.countSimulateOnlyThisChecked(fIdx, vIdx) === 0) {\r\n countStr = \"0\";\r\n } else {\r\n let difference = count - currentCount;\r\n if (difference === 0) {\r\n countStr = '-';\r\n } else {\r\n countStr = '+' + difference;\r\n }\r\n }\r\n }\r\n } else {\r\n countStr = \"\";\r\n }\r\n\r\n let isDisabled = countStr === \"0\";\r\n this.setCount(value, countStr, isDisabled);\r\n });\r\n\r\n let allValuesDisabled = Array.from(filter.values).every(({ node: { disabled } }) => disabled);\r\n toggleClass(filter.node, 'nx-filter-tag--disabled', allValuesDisabled);\r\n });\r\n\r\n this.setAllCount(currentCount);\r\n document.dispatchEvent(new CustomEvent('ScrollSlider:reset'));\r\n\r\n return this;\r\n }\r\n\r\n getActiveHierarchicalLevel() {\r\n let currentFilter;\r\n let currentId;\r\n let getActiveFilterNav = document.querySelectorAll('.nx-filter-navigation__item.nx-active');\r\n if (getActiveFilterNav.length > 0) {\r\n currentId = getActiveFilterNav[getActiveFilterNav.length - 1].getAttribute(\"data-id\");\r\n currentFilter = document.querySelector(`.nx-filter-navigation__level[id=\"${currentId}\"]`);\r\n } else {\r\n currentFilter = document.querySelector('.nx-filter-navigation__level');\r\n }\r\n\r\n return currentFilter;\r\n }\r\n\r\n reload(history = undefined): FilterAction {\r\n // Change or remove static selector\r\n const container = document.querySelector(this.options.gridNodeSelector),\r\n xhr = new XMLHttpRequest();\r\n\r\n addSpinnerToTeaserGrid(container);\r\n\r\n let ajaxUrl;\r\n let newUrl;\r\n\r\n if (history === undefined) {\r\n ajaxUrl = this.getReloadUrl(container);\r\n newUrl = this.updateUrl(container);\r\n \r\n window.history.pushState(newUrl, '', newUrl);\r\n } else {\r\n ajaxUrl = this.getReloadUrlFromHistory(container, history);\r\n }\r\n\r\n xhr.onload = () => {\r\n if (xhr.status >= 200 && xhr.status < 300) {\r\n const responseElement = createElementFromString(xhr.responseText),\r\n gridNode = responseElement.querySelector(this.options.gridNodeSelector) || responseElement;\r\n\r\n onFilterTeaserGridChange(container);\r\n\r\n container.innerHTML = gridNode.innerHTML;\r\n\r\n NiveaX.loadShopPrices();\r\n NiveaX.initModules();\r\n } else {\r\n console.error('The request failed!');\r\n }\r\n removeSpinnerFromTeaserGrid(container);\r\n };\r\n\r\n xhr.open('GET', ajaxUrl);\r\n xhr.send();\r\n\r\n store.dispatch(filterState(this.getState()));\r\n\r\n return this;\r\n }\r\n\r\n updateUrl(container) {\r\n const urlParams = new URLSearchParams(window.location.search);\r\n const searchParName = 'q';\r\n const searchPar = urlParams.get(searchParName);\r\n\r\n return `?${searchPar ? `${searchParName}=${searchPar}&` : ''}${this.getFilterParams(container)}`;\r\n }\r\n\r\n recoverState(): FilterAction {\r\n for (let filterCategory in this.options.state) {\r\n const inputs = Array.from(this.filterTag.querySelectorAll(`[data-key=\"${filterCategory}\"] input[type=\"checkbox\"]`)),\r\n aciveFilterNames = this.options.state[filterCategory];\r\n\r\n inputs.filter((inp: HTMLInputElement) => aciveFilterNames.includes(inp.name))\r\n .forEach((inp: HTMLInputElement) => inp.checked = true);\r\n }\r\n\r\n store.dispatch(filterState(this.getState()));\r\n\r\n return this;\r\n }\r\n\r\n resetState(): FilterAction {\r\n Array.from(>this.filterTag.querySelectorAll(this.options.checkboxSelector + ':checked')).forEach(value => value.checked = false);\r\n this.recoverState()\r\n return this;\r\n }\r\n\r\n getState(): FilterParams {\r\n return this.options.state;\r\n }\r\n\r\n saveCurrentState(): FilterAction {\r\n this.saveState(this.getParams());\r\n return this;\r\n }\r\n\r\n private saveState(state: FilterParams): FilterAction {\r\n this.options.state = state;\r\n return this;\r\n }\r\n\r\n private setAllCount(count: number) {\r\n let currentFilter = this.getActiveHierarchicalLevel();\r\n if (!currentFilter) return;\r\n\r\n const countElement = currentFilter.querySelector('.nx-filter-navigation__item--all .nx-filter-navigation__count');\r\n if (!countElement) return;\r\n \r\n countElement.innerText = count;\r\n }\r\n\r\n private getDefaultOptions(): FilterActionOptions {\r\n return {\r\n tagsMapAttrs: {\r\n tagsStrAttr: 'data-atob',\r\n tagCountAttr: 'data-tab-count',\r\n productsCountAttr: 'data-teaser-count'\r\n },\r\n hierarchicalFilterSelector: \".nx-filter-navigation__level\",\r\n hierarchicalFilterValueSelector: \".nx-filter-navigation__item\",\r\n hierarchicalFilterValueActiveClass: \"nx-active\",\r\n filterTagSelector: '.nx-tag-filter',\r\n filterBtnSelector: '.nx-filter-button',\r\n filterItemSelector: '.nx-tag-filter__item',\r\n checkboxSelector: '.nx-cat-item__tag-value',\r\n applyBtnSelector: '.nx-sort-filters__apply-btn',\r\n countNodeSelector: '.nx-cat-item__count',\r\n gridNodeSelector: '.nx-teaser-grid',\r\n state: {}\r\n };\r\n }\r\n}\r\n","import { fromEvent } from 'rxjs';\r\nimport { map, filter } from 'rxjs/operators';\r\nimport { partial } from '../helpers/functional';\r\nimport LayerPage from './LayerPage';\r\nimport { getOptions } from '../helpers/helperFunctions';\r\nimport { addClass, hasClass, removeClassFromList, createElementFromString } from '../helpers/DOMHelpers';\r\nimport { Optional } from '../typings/mapped-types';\r\nimport NivTSort from './NivTSort';\r\n\r\nconst moduleSelector = '[data-module=\"Sort\"]';\r\n\r\nexport default class Sort {\r\n protected layer: LayerPage;\r\n protected sortOpenBtn: HTMLElement;\r\n protected sortTmplNode: HTMLElement;\r\n protected sortSelect: HTMLSelectElement;\r\n protected sortList: HTMLElement;\r\n protected sortMethod: string = null;\r\n protected lastSelectedOption: HTMLElement;\r\n\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 Sort(element);\r\n element.dataset.moduleInitialized = 'true';\r\n });\r\n }\r\n\r\n constructor(public element: HTMLElement, protected options: Optional = {}) {\r\n this.options = getOptions(this.element, Object.assign(this.getDefaultOptions(), this.options));\r\n this.sortOpenBtn = this.element.querySelector(this.options.sortOpenBtnSelector);\r\n this.sortTmplNode = this.element.querySelector(this.options.sortTmplSelector);\r\n this.sortSelect = this.element.querySelector(this.options.sortSelectSelector);\r\n this.layer = this.getSortLayer();\r\n this.sortList = this.layer.getLayerNode().querySelector(this.options.sortListSelector);\r\n\r\n this.init();\r\n }\r\n\r\n protected init(): Sort {\r\n this.addHandlerOnSortOpenBtnClick()\r\n .addHandlerOnSortLayerClick();\r\n\r\n return this;\r\n }\r\n\r\n\r\n // Start: SortLayer\r\n private getSortLayer(): LayerPage {\r\n const layer = new LayerPage(this.element,\r\n {\r\n afterOpen: async () => { document.dispatchEvent(new CustomEvent('NiveaBasicTracking:reInitHandlers'))},\r\n beforeClose: async () => this.removeOptionSelection().recoverLastSelectedOption(),\r\n })\r\n\r\n layer.insertContent(createElementFromString(this.sortTmplNode.innerHTML));\r\n\r\n return layer;\r\n }\r\n\r\n\r\n protected openSortLayer(hide?: boolean): Sort {\r\n this.layer.open();\r\n return this;\r\n }\r\n\r\n protected closeSortLayer(): Sort {\r\n this.layer.close();\r\n return this;\r\n }\r\n // End: SortLayer\r\n\r\n // Start: Event handlers\r\n protected addHandlerOnSortOpenBtnClick(): Sort {\r\n this.sortOpenBtn.addEventListener('click', () => this.openSortLayer());\r\n return this;\r\n }\r\n\r\n protected addHandlerOnSortLayerClick(): Sort {\r\n const layerNode = this.layer.getLayerNode(),\r\n layerNodeClick = fromEvent(layerNode, 'click').pipe(map(({ target }) => target)),\r\n optionClick = layerNodeClick.pipe(filter(this.isListOption())),\r\n sortBtnClick = layerNodeClick.pipe(filter(this.isSortButton()));\r\n\r\n optionClick.subscribe(option => this.toggleOption(option));\r\n sortBtnClick.subscribe(() => this.applySort());\r\n\r\n return this;\r\n }\r\n\r\n protected applySort(): Sort {\r\n this.setSortMethod(this.sortMethod)\r\n .saveSelectedOption()\r\n .reloadFilterAction()\r\n .closeSortLayer()\r\n .trackSort();\r\n\r\n return this;\r\n }\r\n\r\n protected trackSort() {\r\n new NivTSort(this.lastSelectedOption);\r\n return this;\r\n }\r\n\r\n protected toggleOption(element: HTMLElement): void {\r\n const selectedClass = `${this.options.sortListOptionSelector}--selected`;\r\n\r\n this.removeOptionSelection();\r\n addClass(element, selectedClass);\r\n\r\n this.sortMethod = element.dataset.optionValue;\r\n }\r\n\r\n // Check functions\r\n protected isListOption(): (element: EventTarget) => boolean {\r\n return partial(hasClass, partial, this.options.sortListOptionSelector);\r\n }\r\n\r\n protected isSortButton(): (element: EventTarget) => boolean {\r\n return partial(hasClass, partial, this.options.sortBtnSelector);\r\n }\r\n\r\n protected isLayerCloseBtn(): (element: EventTarget) => boolean {\r\n return partial((className: string, target: HTMLElement) => !!target.closest(className), `.${this.options.sortLayerCloseBtnSelector}`);\r\n }\r\n\r\n // Start: FilterAction callbacks\r\n protected reloadFilterAction(): Sort {\r\n this.options.callbacks.reload();\r\n\r\n return this;\r\n }\r\n // End: FilterAction callbacks\r\n\r\n protected setSortMethod(method: string): Sort {\r\n this.sortSelect.value = method || this.sortSelect.value;\r\n return this;\r\n }\r\n\r\n protected saveSelectedOption(): Sort {\r\n this.lastSelectedOption = this.sortList.querySelector(`.${this.options.sortListOptionSelector}--selected`);\r\n return this;\r\n }\r\n\r\n protected removeOptionSelection(): Sort {\r\n removeClassFromList(Array.from(this.sortList.children), `${this.options.sortListOptionSelector}--selected`);\r\n return this;\r\n }\r\n\r\n protected recoverLastSelectedOption(): Sort {\r\n this.lastSelectedOption && addClass(this.lastSelectedOption, `${this.options.sortListOptionSelector}--selected`);\r\n return this;\r\n }\r\n\r\n protected getDefaultOptions(): Optional {\r\n return {\r\n sortOpenBtnSelector: '.nx-sort-button__wrapper',\r\n sortTmplSelector: '.nx-sort__tmpl',\r\n sortBtnSelector: 'nx-sort-filters__sort-btn',\r\n sortListOptionSelector: 'nx-sort-list__option',\r\n sortListSelector: '.nx-sort-list',\r\n sortSelectSelector: '#sort',\r\n sortLayerCloseBtnSelector: 'nx-layer__close',\r\n callbacks: {\r\n update: () => { },\r\n reload: () => { },\r\n saveState: () => { },\r\n resetState: () => { }\r\n }\r\n };\r\n }\r\n}\r\n\r\n// Hot Module Replacement\r\nif (module.hot) {\r\n let nodesCache: HMRNodes[] = Array.from(document.querySelectorAll(moduleSelector)).map((element: Node) => ({ nodeToReplace: element, nodeOrigin: element.cloneNode(true) }));\r\n\r\n Sort.setup(moduleSelector);\r\n\r\n module.hot.accept(() => {\r\n Sort.setup(moduleSelector);\r\n });\r\n module.hot.dispose(() => {\r\n nodesCache.forEach(({ nodeToReplace, nodeOrigin }) => { nodeToReplace = nodeToReplace.parentElement.replaceChild(nodeOrigin.cloneNode(true), nodeToReplace) });\r\n });\r\n} else {\r\n Sort.setup(moduleSelector);\r\n}","import FilterAction from './FilterAction';\r\nimport Filter from './Filter';\r\nimport Sort from './Sort';\r\nimport NivTFilterNavigation from './NivTFilterNavigation';\r\n\r\nconst moduleSelector = '[data-module=\"FilterSort\"]';\r\n\r\nexport default class FilterSort {\r\n private filterAction: FilterAction;\r\n private filter: Filter;\r\n protected sort: Sort;\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 FilterSort(element);\r\n element.dataset.moduleInitialized = 'true';\r\n });\r\n }\r\n\r\n constructor(public element: HTMLElement) {\r\n const callbacks = {\r\n updateV2: () => this.filterAction.updateV2(),\r\n update: () => this.filterAction.update(),\r\n reload: () => this.filterAction.reload(),\r\n saveState: () => this.filterAction.saveCurrentState(),\r\n resetState: () => this.filterAction.resetState()\r\n };\r\n\r\n this.filter = new Filter(this.element, { callbacks });\r\n this.sort = new Sort(this.element, { callbacks });\r\n\r\n this.init();\r\n }\r\n\r\n private init(): FilterSort {\r\n this.initFilterAction(this.filter.getFilterLayerNode())\r\n .initFilter()\r\n .initFilterNavigationTracking();\r\n\r\n return this;\r\n }\r\n\r\n private initFilterAction(element: HTMLElement): FilterSort {\r\n this.filterAction = this.filterAction || new FilterAction(element);\r\n\r\n return this;\r\n }\r\n\r\n private initFilter(): FilterSort {\r\n this.filter.init();\r\n return this;\r\n }\r\n\r\n private initFilterNavigationTracking() {\r\n new NivTFilterNavigation();\r\n return this;\r\n }\r\n}\r\n\r\n// Hot Module Replacement\r\nif (module.hot) {\r\n let nodesCache: HMRNodes[] = Array.from(document.querySelectorAll(moduleSelector)).map((element: Node) => ({ nodeToReplace: element, nodeOrigin: element.cloneNode(true) }));\r\n\r\n FilterSort.setup(moduleSelector);\r\n\r\n module.hot.accept(() => {\r\n FilterSort.setup(moduleSelector);\r\n });\r\n module.hot.dispose(() => {\r\n nodesCache.forEach(({ nodeToReplace, nodeOrigin }) => { nodeToReplace = nodeToReplace.parentElement.replaceChild(nodeOrigin.cloneNode(true), nodeToReplace) });\r\n });\r\n} else {\r\n FilterSort.setup(moduleSelector);\r\n}","/// \r\nimport { addLayer } from '../ClassWithTracking/helpers';\r\nexport default class NivTFilterNavigation {\r\n constructor() {\r\n this.init();\r\n }\r\n\r\n init() {\r\n let filterNavigation: HTMLElement = document.querySelector('.nx-filter-navigation');\r\n\r\n if (!!filterNavigation) {\r\n filterNavigation.addEventListener('click', (e) => {\r\n let clickedElement: HTMLElement = e.target;\r\n if (clickedElement.classList.contains('nx-filter-navigation__item')) {\r\n this.trackNavigationClick(clickedElement.dataset.name);\r\n }\r\n });\r\n }\r\n }\r\n\r\n trackNavigationClick(eventLabel: string) {\r\n if (window.NiveaX.IsUAEnabled) {\r\n addLayer({\r\n event: 'ga_event',\r\n eventCategory: 'Filter Navigation',\r\n eventAction: 'Item Click',\r\n eventLabel: eventLabel,\r\n eventNonInteraction: false\r\n });\r\n }\r\n\r\n if (window.NiveaX.IsGA4Enabled) {\r\n addLayer({\r\n event: 'ga4_event',\r\n event_name: 'filter_navigation',\r\n filter_navigation_title: eventLabel,\r\n _clear: true,\r\n });\r\n }\r\n }\r\n}","/// \r\nimport { addLayer } from '../ClassWithTracking/helpers';\r\nexport default class NivTSort {\r\n\r\n constructor(public element: HTMLElement) {\r\n this.init();\r\n }\r\n\r\n init() {\r\n this.trackSortOption(this.element.innerText);\r\n }\r\n\r\n trackSortOption(eventLabel: string) {\r\n if (window.NiveaX.IsUAEnabled) {\r\n addLayer({\r\n event: 'ga_event',\r\n eventCategory: 'Sort',\r\n eventAction: 'Sort',\r\n eventLabel: eventLabel,\r\n eventNonInteraction: false\r\n });\r\n }\r\n \r\n // if (window.NiveaX.IsGA4Enabled) { // this has moved into tracking framework now\r\n // addLayer({\r\n // event: 'ga4_event',\r\n // event_name: 'sort',\r\n // sort_title: eventLabel,\r\n // _clear: true\r\n // });\r\n // }\r\n\r\n }\r\n}","export function encodeParams(params: FilterParams): string {\r\n return Object.entries(params).map(([key, value]) => `${encodeURIComponent(key)}=${value.map(v => encodeURIComponent(v)).join(',')}`).join('&');\r\n}\r\n\r\nexport function onFilterTeaserGridChange(container: HTMLElement): void {\r\n const observer = new MutationObserver(() => {\r\n observer.disconnect();\r\n document.dispatchEvent(new Event('NiveaXLoadMoreLoaded'));\r\n });\r\n\r\n observer.observe(container, { childList: true });\r\n}"],"names":["filterState","filter","type","FilterAction","constructor","element","options","this","Object","assign","getDefaultOptions","filterTag","querySelector","filterTagSelector","applyBtn","applyBtnSelector","applyBtnCounter","firstElementChild","tagsMap","tagsStr","window","atob","getAttribute","tagsMapAttrs","tagsStrAttr","tagCount","parseInt","tagCountAttr","productsCount","productsCountAttr","initURLNavigation","init","recoverState","addEventListener","getUrlParameters","resetState","update","state","getFilters","filters","Array","from","document","querySelectorAll","hierarchicalFilterSelector","forEach","filterNode","values","hierarchicalFilterValueSelector","valueNode","key","dataset","push","node","checked","classList","contains","hierarchicalFilterValueActiveClass","hierarchical","index","parentsIndex","parents","isAnd","cache","filterItemSelector","filterKey","valueNodes","checkboxSelector","name","isProductTagged","productIdx","tagIdx","i","charCodeAt","Math","floor","isProductIncludedInFilter","p","isAndFilter","anyValueChecked","v","length","value","isProductVisible","f","cacheEntry","isIncluded","countResults","count","countSimulateChecked","checkedValue","oldCache","oldChecked","countHierarchicalSimulateOnlyThisChecked","oldFilters","countSimulateOnlyThisChecked","oldFilter","checkHierarchicalParendIdx","parentsIdx","parentsIdxArray","split","includes","hierarchicalParentIndex","setHierarchicalParendIdx","mainNavList","parentItem","setVisibility","isVisible","hidden","setCount","isDisabled","countNode","parent","countNodeSelector","nextSibling","disabled","innerText","setGlobalCount","getReloadUrl","gridNode","paramsStr","encodeParams","saveCurrentState","getState","ajaxUrl","getReloadUrlFromHistory","history","getFilterParams","getParams","params","selector","getElementById","sortMethod","keys","currentCount","fIdx","vIdx","hasHierarchicalParendIdx","countStr","toString","difference","allValuesDisabled","every","setAllCount","dispatchEvent","CustomEvent","updateV2","getActiveHierarchicalLevel","currentFilter","currentId","getActiveFilterNav","reload","undefined","container","gridNodeSelector","xhr","XMLHttpRequest","newUrl","updateUrl","pushState","onload","status","responseElement","responseText","onFilterTeaserGridChange","innerHTML","NiveaX","loadShopPrices","initModules","console","error","open","send","searchPar","URLSearchParams","location","search","get","filterCategory","inputs","aciveFilterNames","inp","saveState","countElement","filterBtnSelector","moduleSelector","Sort","setup","moduleInitialized","sortOpenBtn","sortOpenBtnSelector","sortTmplNode","sortTmplSelector","sortSelect","sortSelectSelector","layer","getSortLayer","sortList","getLayerNode","sortListSelector","addHandlerOnSortOpenBtnClick","addHandlerOnSortLayerClick","afterOpen","async","beforeClose","removeOptionSelection","recoverLastSelectedOption","insertContent","openSortLayer","hide","closeSortLayer","close","layerNode","layerNodeClick","pipe","target","optionClick","isListOption","sortBtnClick","isSortButton","subscribe","option","toggleOption","applySort","setSortMethod","saveSelectedOption","reloadFilterAction","trackSort","lastSelectedOption","selectedClass","sortListOptionSelector","optionValue","sortBtnSelector","isLayerCloseBtn","className","closest","sortLayerCloseBtnSelector","callbacks","method","children","FilterSort","filterAction","sort","initFilterAction","getFilterLayerNode","initFilter","initFilterNavigationTracking","NivTFilterNavigation","filterNavigation","e","clickedElement","trackNavigationClick","eventLabel","IsUAEnabled","event","eventCategory","eventAction","eventNonInteraction","IsGA4Enabled","event_name","filter_navigation_title","_clear","NivTSort","trackSortOption","entries","map","encodeURIComponent","join","observer","MutationObserver","disconnect","Event","observe","childList"],"sourceRoot":""}