{"version":3,"file":"contentfilter-e218d920.js","names":["define","Moduler","create","defaults","event","url","contentElement","triggerElement","loadOnInit","insertMode","loadingCssClass","filterType","loadMoreElement","loadMoreEvent","page","clearFiltersElement","clearFiltersEvent","uniqueId","queryPrefix","hashPrefix","customTriggerElement","customTriggerEvent","searchFieldElement","init","self","this","options","document","querySelector","el","querySelectorAll","forEach","trigger","addEventListener","utils","bind","filter","e","target","closest","cat","getAttribute","enableFilter","setHistoryState","sendRequest","call","preventDefault","getElementById","scrollIntoView","clearElements","clearTrigger","clearAll","searchField","key","loadMore","categories","categoryQueryKey","getQueryKey","filtered","URL","window","location","searchParams","v","p","indexOf","push","clear","element","_getMainFilters","i","disableFilter","value","type","checked","_getFilter","queryParams","delete","c","append","query","toString","startsWith","history","pushState","pathname","length","category","_toggleState","state","classList","add","remove","check","index","splice","_setClearElementsState","ce","subFilterGroup","subFilter","mainFilter","contains","sibling","isLoading","formData","FormData","nodeName","fetch","method","body","then","response","dispatchEvent","CustomEvent","status","text","headers","get","innerHTML","loadModules","style","display"],"sources":["contentfilter.js"],"mappings":"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","sourcesContent":["define(['moduler'], function (Moduler) {\r\n 'use strict';\r\n /*\r\n * filter functionality with checkboxes that is used to load content from server\r\n * has support for a load more button\r\n * \r\n * the filter can be additive (multiple), single select or multilevel\r\n * additive mean the content need to contain all filters to be included\r\n * single select will unselect other filters when a filter is clicked, behaving like a radiobutton list,\r\n * multilevel have two levels of filters\r\n * \r\n * data for the ajax request is compiled from the form contents of the form element the module is loaded for \r\n */\r\n return Moduler.create({\r\n defaults: {\r\n event: 'change',\r\n url: null,\r\n contentElement: null,\r\n triggerElement: 'input[type=\"checkbox\"], .js-triggerForm',\r\n loadOnInit: false,\r\n insertMode: 'append', // modes: [null|replace|append]. \r\n loadingCssClass: 'is-loading',\r\n filterType: 'multiple', // 'single' for single filters, meaning selecting one unselects the others, multiple can select multiple, and multilevel is special sauce\r\n loadMoreElement: null,\r\n loadMoreEvent: 'click',\r\n page: 1,\r\n clearFiltersElement: null,\r\n clearFiltersEvent: 'click',\r\n uniqueId: null,\r\n queryPrefix: 'cat',\r\n hashPrefix: 'block-',\r\n customTriggerElement: null, // add a data-category to these elements with the category that should be toggled on click, remember to make them unique to the block\r\n customTriggerEvent: 'click',\r\n searchFieldElement: null\r\n },\r\n\r\n init: function () {\r\n var self = this;\r\n\r\n self.options.page = 1;\r\n\r\n self.contentElement = document.querySelector(self.options.contentElement) ?? self.el;\r\n\r\n if (self.options.triggerElement) {\r\n self.el.querySelectorAll(self.options.triggerElement).forEach(trigger => {\r\n trigger.addEventListener(self.options.event, Moduler.utils.bind(self.filter, self));\r\n });\r\n } else {\r\n self.el.addEventListener(self.options.event, Moduler.utils.bind(self.filter, self));\r\n }\r\n\r\n if (self.options.customTriggerElement) {\r\n document.addEventListener(self.options.customTriggerEvent, function (e) {\r\n var trigger = e.target.closest(self.options.customTriggerElement);\r\n if (trigger) {\r\n var cat = trigger.getAttribute('data-category');\r\n\r\n self.enableFilter(cat);\r\n self.setHistoryState();\r\n self.sendRequest.call(self, 'replace');\r\n\r\n e.preventDefault();\r\n document.getElementById(self.options.hashPrefix + self.options.uniqueId).scrollIntoView();\r\n }\r\n });\r\n }\r\n\r\n self.clearElements = [];\r\n if (self.options.clearFiltersElement) {\r\n self.clearElements = self.el.querySelectorAll(self.options.clearFiltersElement);\r\n self.clearElements.forEach(clearTrigger => {\r\n clearTrigger.addEventListener(self.options.clearFiltersEvent, Moduler.utils.bind(self.clearAll, self));\r\n });\r\n }\r\n\r\n self.searchField = self.el.querySelector(self.options.searchFieldElement);\r\n\r\n if (self.searchField) {\r\n self.searchField.addEventListener('keyup', function (e) {\r\n self.filter.call(self, e);\r\n });\r\n self.searchField.addEventListener('blur', function (e) {\r\n e.preventDefault();\r\n self.filter.call(self, e);\r\n });\r\n self.searchField.addEventListener('keypress', function (e) {\r\n if (e.key == 'Enter') {\r\n e.preventDefault();\r\n self.filter.call(self, e);\r\n }\r\n });\r\n }\r\n\r\n if (self.options.loadMoreElement) {\r\n self.loadMoreElement = document.querySelector(self.options.loadMoreElement);\r\n if (self.loadMoreElement) {\r\n self.loadMoreElement.addEventListener(self.options.loadMoreEvent, Moduler.utils.bind(self.loadMore, self));\r\n }\r\n }\r\n\r\n // init categories from url\r\n self.categories = [];\r\n var categoryQueryKey = self.getQueryKey(self);\r\n var filtered = false;\r\n new URL(window.location).searchParams.forEach((v, p) => {\r\n if (p == categoryQueryKey && self.categories.indexOf(v) == -1) {\r\n self.categories.push(v);\r\n self.enableFilter(v);\r\n filtered = true;\r\n }\r\n });\r\n\r\n if (filtered) {\r\n self.sendRequest.call(self, 'replace');\r\n }\r\n },\r\n\r\n clearAll: function (e) {\r\n var self = this;\r\n e.preventDefault();\r\n self.filter.call(self, e, true);\r\n },\r\n\r\n filter: function (e, clear) {\r\n var self = this;\r\n self.options.page = 1;\r\n\r\n var element = e.target;\r\n\r\n if (clear) {\r\n self._getMainFilters().forEach((filter, i) => {\r\n self.disableFilter(filter);\r\n });\r\n if (self.searchField) {\r\n self.searchField.value = '';\r\n }\r\n } else {\r\n if (element.type === 'checkbox' || element.type === 'radio') {\r\n if (element.checked) {\r\n self.enableFilter(element.value);\r\n } else {\r\n self.disableFilter(self._getFilter(element.value));\r\n }\r\n }\r\n if (self.searchField && element === self.searchField) {\r\n // set some query param\r\n }\r\n }\r\n\r\n self.setHistoryState();\r\n\r\n self.sendRequest.call(self, 'replace');\r\n },\r\n\r\n setHistoryState: function () {\r\n var self = this;\r\n var key = self.getQueryKey(self);\r\n\r\n var queryParams = new URL(window.location).searchParams;\r\n queryParams.delete(key);\r\n self.categories.forEach(c => {\r\n queryParams.append(key, c);\r\n });\r\n\r\n var query = '?' + queryParams.toString();\r\n\r\n if (self.options.uniqueId) {\r\n query += '#' + self.options.hashPrefix + self.options.uniqueId;\r\n }\r\n if (query.startsWith('#')) {\r\n window.history.pushState(null, null, location.pathname + query);\r\n } else if (query.length == 0) {\r\n window.history.pushState(null, null, location.pathname);\r\n } else {\r\n window.history.pushState(null, null, query);\r\n }\r\n },\r\n\r\n _getFilter: function (category) {\r\n var self = this;\r\n var check = self.el.querySelector('.js-fpc > input[type=\"checkbox\"][value=\"' + category + '\"], .js-fsc > input[type=\"checkbox\"][value=\"' + category + '\"]');\r\n return check.closest('.js-fpc, .js-fsc');\r\n },\r\n\r\n _getMainFilters: function () {\r\n var self = this;\r\n return self.el.querySelectorAll('.js-fpc');\r\n },\r\n\r\n _toggleState: function (filter, state) {\r\n var self = this;\r\n if (!filter) {\r\n return;\r\n }\r\n state ? filter.classList.add('is-active') : filter.classList.remove('is-active');\r\n\r\n var check = filter.querySelector('input[type=\"checkbox\"]');\r\n if (check) {\r\n if (check.checked != state) {\r\n check.checked = state;\r\n }\r\n if (check.value.length > 0) {\r\n var index = self.categories.indexOf(check.value);\r\n if (state && index == -1) {\r\n self.categories.push(check.value);\r\n } else if (!state && index > -1) {\r\n self.categories.splice(index, 1);\r\n }\r\n }\r\n }\r\n },\r\n\r\n _setClearElementsState: function () {\r\n var self = this;\r\n self.clearElements.forEach(ce => {\r\n self._toggleState(ce, self.categories.length == 0);\r\n });\r\n },\r\n\r\n disableFilter: function (filter) {\r\n var self = this;\r\n self._toggleState(filter, false);\r\n\r\n if (self.options.filterType === 'multilevel') {// disable children\r\n var subFilterGroup = self.el.querySelector('.js-subFilters[data-parentid=\"' + filter.querySelector('input[type=\"checkbox\"]').value + '\"]');\r\n if (subFilterGroup) {\r\n subFilterGroup.classList.remove('is-active');\r\n subFilterGroup.querySelectorAll('.js-fsc').forEach(subFilter => {\r\n self._toggleState(subFilter, false);\r\n });\r\n }\r\n }\r\n\r\n self._setClearElementsState();\r\n },\r\n\r\n enableFilter: function (category) {\r\n var self = this;\r\n var filter = self._getFilter(category);\r\n var mainFilter = filter.classList.contains('js-fpc') ? filter : null;\r\n if (self.options.filterType === 'single' || self.options.filterType === 'multilevel' && mainFilter) {\r\n self._getMainFilters().forEach(function (sibling, i) {\r\n if (sibling != mainFilter) {\r\n self.disableFilter(sibling);\r\n }\r\n });\r\n if (self.options.filterType === 'multilevel') {\r\n var subFilterGroup = self.el.querySelector('.js-subFilters[data-parentid=\"' + category + '\"]');\r\n if (subFilterGroup) {\r\n subFilterGroup.classList.add('is-active');\r\n }\r\n }\r\n }\r\n self._toggleState(filter, true);\r\n\r\n self._setClearElementsState();\r\n },\r\n\r\n sendRequest: function (insertMode) {\r\n var self = this;\r\n\r\n self.isLoading = true;\r\n\r\n self.el.classList.add(self.options.loadingCssClass);\r\n\r\n // this will only work with post requests\r\n var formData = new FormData(self.el.nodeName == 'FORM' ? self.el : self.el.querySelector('form'));\r\n formData.append('page', self.options.page);\r\n\r\n return fetch(self.options.url, {\r\n method: 'POST',\r\n body: formData\r\n }).then(response => {\r\n self.isLoading = false;\r\n self.el.classList.remove(self.options.loadingCssClass);\r\n self.el.dispatchEvent(new CustomEvent('ajax-always'));\r\n if (response.status != 200) {\r\n self.el.dispatchEvent(new CustomEvent('ajax-error'));\r\n } else {\r\n response.text().then(function (text) {\r\n if (response.headers.get('content-type').indexOf('text/html') !== -1) {\r\n if (insertMode === 'replace') {\r\n self.contentElement.innerHTML = text;\r\n } else if (insertMode === 'append') {\r\n self.contentElement.innerHTML += text;\r\n }\r\n Moduler.loadModules(self.contentElement);\r\n }\r\n if (self.loadMoreElement) {\r\n self.loadMoreElement.style.display = response.headers.get('X-LastPage') ? 'none' : '';\r\n }\r\n self.el.dispatchEvent(new CustomEvent('ajax-done', { response: text }));\r\n });\r\n }\r\n });\r\n },\r\n\r\n loadMore: function (e) {\r\n var self = this;\r\n if (e) {\r\n e.preventDefault();\r\n }\r\n\r\n // prevent additional requests when user spam-clicks\r\n if (self.isLoading) {\r\n return;\r\n }\r\n\r\n // increase page by one\r\n self.options.page += 1;\r\n self.sendRequest.call(self, 'append');\r\n },\r\n\r\n getQueryKey: function (self) {\r\n var key = self.options.queryPrefix;\r\n if (self.options.uniqueId) {\r\n key += self.options.uniqueId;\r\n }\r\n return key;\r\n }\r\n });\r\n});"]}