{"version":3,"file":"LoadMore-604ee0ce.js","names":["define","Moduler","create","defaults","url","method","event","data","contentElement","page","insertMode","loadingCssClass","pageSize","removeSelf","visibleClass","lastPageHeader","init","self","this","options","el","matches","getAttribute","window","location","href","document","querySelector","addEventListener","e","loadMore","loadFirstPage","linkHtml","innerHTML","indexOf","shouldDisplayPageRange","updateLinkText","loadPage","classList","add","isLoading","partial","loadingMore","extraData","JSON","parse","Object","assign","replace","opts","toUpperCase","formData","FormData","key","append","body","params","URLSearchParams","keys","forEach","toString","length","delim","fetch","then","response","parentNode","removeChild","remove","status","dispatchEvent","CustomEvent","text","loadModules","headers","get","displaySetting","style","display","detail","from","newLinkText","firstChild","call","preventDefault"],"sources":["LoadMore.js"],"mappings":"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","sourcesContent":["define(['moduler'], function (Moduler) {\r\n 'use strict';\r\n\r\n /*\r\n Example HTML:\r\n\r\n
\r\n Load results {from}-{to}\r\n
\r\n */\r\n\r\n return Moduler.create({\r\n defaults: {\r\n url: null,\r\n method: 'GET',\r\n event: 'click',\r\n data: null, /* extra data to send along the request to server */\r\n contentElement: null, /* selector for element where content should be appended or replaced */\r\n page: 1, /* the page currently on */\r\n insertMode: 'append', /* append|replace|replacefirstpage */\r\n loadingCssClass: 'is-loading',\r\n pageSize: null, // size of each page, used when displaying page range in button. (\"Results from 11-20\")\r\n removeSelf: false,\r\n visibleClass: null,// if a class should be used for button visiblity, set it here, otherwise style.display block/none is used\r\n lastPageHeader: 'X-LastPage' // name of the last page header, set it to something unique if there are more then one loadmore module on a page\r\n },\r\n\r\n init: function () {\r\n var self = this;\r\n\r\n if (!self.options.url) {\r\n if (self.el.matches('a[href]')) {\r\n self.options.url = self.el.getAttribute('href');\r\n } else {\r\n self.options.url = window.location.href;\r\n }\r\n }\r\n\r\n // save a reference to contentElement\r\n self.contentElement = document.querySelector(self.options.contentElement) ?? self.el;\r\n\r\n self.el.addEventListener(self.options.event, function (e) {\r\n e.data = self;\r\n self.loadMore(e);\r\n });\r\n\r\n self.el.addEventListener('loadFirstPage', function (e) { \r\n e.data = self;\r\n self.loadFirstPage(e);\r\n });\r\n\r\n self.el.addEventListener('loadMore', function (e) {\r\n e.data = self;\r\n self.loadMore(e);\r\n });\r\n\r\n var linkHtml = self.el.innerHTML;\r\n var shouldDisplayPageRange = linkHtml.indexOf('{from}') != -1;\r\n\r\n if (shouldDisplayPageRange) {\r\n self.shouldDisplayPageRange = true;\r\n self.linkHtml = linkHtml;\r\n\r\n self.updateLinkText();\r\n }\r\n },\r\n\r\n loadPage: function () {\r\n var self = this;\r\n self.el.classList.add(self.options.loadingCssClass);\r\n self.isLoading = true;\r\n\r\n var data = {\r\n partial: true,\r\n page: self.options.page,\r\n loadingMore: true,\r\n lastPageHeader: self.options.lastPageHeader\r\n };\r\n var extraData = {};\r\n if (self.el.getAttribute('data-extradata')) {\r\n extraData = JSON.parse(self.el.getAttribute('data-extradata'));\r\n }\r\n Object.assign(data, self.options.data, extraData);\r\n\r\n var url = self.options.url.replace('{page}', self.options.page);\r\n\r\n var opts = {\r\n method: self.options.method.toUpperCase()\r\n };\r\n if (opts.method == 'POST') {\r\n var formData = new FormData();\r\n for ( var key in data) {\r\n formData.append(key, data[key]);\r\n }\r\n opts.body = formData;\r\n } else {\r\n var params = new URLSearchParams();\r\n Object.keys(data).forEach(key => params.append(key, data[key]));\r\n if (params.toString().length > 0) {\r\n var delim = url.indexOf('?') > -1 ? '&' : '?';\r\n url += delim + params.toString();\r\n }\r\n }\r\n\r\n return fetch(url, opts)\r\n .then(response => {\r\n self.isLoading = false;\r\n if (self.options.removeSelf) {\r\n self.el.parentNode.removeChild(self.el);\r\n } else {\r\n self.el.classList.remove(self.options.loadingCssClass);\r\n }\r\n\r\n if (response.status != 200) {\r\n self.el.dispatchEvent(new CustomEvent('load-more-error'));\r\n } else {\r\n response.text().then(function (text) {\r\n if (self.options.insertMode == 'replace') {\r\n self.contentElement.innerHTML = text;\r\n } else if (self.options.insertMode == 'append') {\r\n self.contentElement.innerHTML += text;\r\n } else if (self.options.insertMode == 'replacefirstpage') {\r\n if (self.options.page == 1) {\r\n self.contentElement.innerHTML = text;\r\n } else {\r\n self.contentElement.innerHTML += text;\r\n }\r\n }\r\n\r\n Moduler.loadModules(self.contentElement);\r\n\r\n if (response.headers.get(self.options.lastPageHeader)) {\r\n // hide the load more button instead of removing it so that other modules can still trigger events\r\n if (self.options.visibleClass) {\r\n self.el.classList.remove(self.options.visibleClass);\r\n } else {\r\n self.displaySetting = self.el.style.display;\r\n self.el.style.display = 'none';\r\n }\r\n }\r\n\r\n if (self.shouldDisplayPageRange) {\r\n self.updateLinkText();\r\n }\r\n\r\n self.el.dispatchEvent(new CustomEvent('load-more-done', { detail: { response: text } }));\r\n });\r\n }\r\n });\r\n },\r\n\r\n updateLinkText: function () {\r\n var self = this;\r\n var from = (self.options.page * self.options.pageSize);\r\n var newLinkText = self.linkHtml\r\n .replace('{from}', from + 1)\r\n .replace('{to}', from + self.options.pageSize);\r\n\r\n self.el.innerHTML = newLinkText;\r\n },\r\n\r\n //event\r\n loadFirstPage: function (e) {\r\n var self = e.data;\r\n\r\n self.options.page = 1;\r\n\r\n if (self.options.visibleClass) {\r\n self.el.classList.add(self.options.visibleClass);\r\n } else {\r\n self.el.style.display = self.displaySetting ?? 'block';\r\n self.displaySetting = null;\r\n } \r\n if (self.options.insertMode != 'replacefirstpage') {\r\n while(self.contentElement.firstChild) self.contentElement.removeChild(self.contentElement.firstChild);\r\n }\r\n\r\n self.loadPage.call(self);\r\n },\r\n\r\n //event\r\n loadMore: function (e) {\r\n e.preventDefault();\r\n var self = e.data;\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.loadPage.call(self);\r\n }\r\n });\r\n});"]}