{"version":3,"sources":["config/routing.js","core/routing.js","components/route.js","components/view.js","components/link.js"],"names":["dmx","config","mapping","settings","routing","router","base","routes","getRoutes","this","filter","route","app","name","getBase","document","querySelector","getAttribute","getUrlInfo","url","URL","window","location","hash","slice","origin","path","pathname","query","search","match","parent","replace","i","length","end","keys","pathToRegexp","join","exec","decodeURI","params","reduce","key","index","path1","path2","evalScripts","node","grecaptcha","querySelectorAll","forEach","render","script","newScript","createElement","type","src","innerHTML","parentNode","replaceChild","e","console","error","Object","assign","Component","initialData","isExact","isMatch","loading","attributes","String","default","exact","Boolean","events","show","Event","hide","unauthorized","forbidden","notfound","init","_locationHandler","bind","_error","_cache","Map","_content","_keys","_re","props","_shown","addEventListener","destroy","removeEventListener","performUpdate","updatedProps","set","_load","_hide","has","_loaded","get","_show","_abortController","AbortController","fetch","credentials","signal","then","reponse","text","content","catch","abort","$node","$parse","dispatchEvent","effects","effect","$destroyChildren","err","debug","event","data","load","__WAPPLER__","_url","includes","headers","response","status","html","_parseQuery","warn","internal","href","_clickHandler","_stateHandler","hasAttribute","setAttribute","_fixUrl","classList","contains","removeAttribute","startsWith","_navigate","title","history","pushState","ctrlKey","button","preventDefault","active","split","toggle","items","remove","add"],"mappings":"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","file":"dmxRouting.js","sourcesContent":["dmx.config.mapping['a'] = 'link';\r\n","(() => {\r\n\r\n const settings = dmx.routing;\r\n\r\n dmx.routing = {\r\n router: \"hybrid\", // hybrid (combined server/client routing), path or hash\r\n\r\n base: \"\", // todo: use when router is path (when page is in a subfolder)\r\n\r\n routes: [],\r\n\r\n getRoutes () {\r\n return this.routes.filter(function (route) {\r\n return !route.app || route.app == dmx.app.name;\r\n });\r\n },\r\n\r\n getBase () {\r\n if (this.base) {\r\n return this.base;\r\n } else {\r\n var base = document.querySelector(\"base[href]\");\r\n if (base) return base.getAttribute(\"href\");\r\n }\r\n\r\n return \"\";\r\n },\r\n\r\n getUrlInfo () {\r\n var url =\r\n this.router == \"hash\"\r\n ? new URL(window.location.hash.slice(2), window.location.origin)\r\n : window.location;\r\n\r\n return {\r\n path: url.pathname || \"/\",\r\n query: url.search.slice(1),\r\n hash: url.hash.slice(1),\r\n };\r\n },\r\n\r\n match (path, routes, parent) {\r\n path = path || this.getUrlInfo().path;\r\n routes = routes || this.getRoutes();\r\n\r\n var base = dmx.routing.getBase();\r\n if (base) {\r\n path = path.replace(base, \"\").replace(/^\\/?/, \"/\");\r\n }\r\n\r\n for (var i = 0; i < routes.length; i++) {\r\n if (routes[i].routes) {\r\n routes[i].end = false;\r\n }\r\n\r\n var keys = [];\r\n var re = dmx.pathToRegexp(\r\n dmx.routing.join(\r\n parent && parent.path ? parent.path : \"/\",\r\n routes[i].path\r\n ),\r\n keys,\r\n routes[i]\r\n );\r\n var match = re.exec(decodeURI(path));\r\n\r\n if (match) {\r\n return {\r\n path: match[0],\r\n params: keys.reduce(function (params, key, index) {\r\n params[key.name] = match[index + 1];\r\n return params;\r\n }, {}),\r\n url: routes[i].url,\r\n routes: routes[i].routes || [],\r\n };\r\n }\r\n }\r\n\r\n return null;\r\n },\r\n\r\n join (path1, path2) {\r\n return path1.replace(/\\/$/, \"\") + \"/\" + path2.replace(/^\\//, \"\");\r\n },\r\n\r\n evalScripts(node) {\r\n if (window.grecaptcha) {\r\n node.querySelectorAll(\".g-recaptcha\").forEach(node => { grecaptcha.render(node) });\r\n }\r\n\r\n try {\r\n node.querySelectorAll('script[type=\"text/javascript\"],script:not([type])').forEach(script => {\r\n try {\r\n const newScript = document.createElement(\"script\");\r\n newScript.type = \"text/javascript\";\r\n if (script.src) newScript.src = script.src;\r\n if (script.innerHTML) newScript.innerHTML = script.innerHTML;\r\n script.parentNode.replaceChild(newScript, script);\r\n } catch (e) {\r\n console.error(\"Error executing script \" + script.src, e);\r\n }\r\n });\r\n } catch (e) {\r\n console.error(\"An error occurred while trying to execute scripts\", e);\r\n }\r\n },\r\n };\r\n\r\n if (settings) {\r\n // merge settings\r\n Object.assign(dmx.routing, settings);\r\n }\r\n\r\n})();","dmx.Component('route', {\r\n\r\n initialData: {\r\n isExact: false,\r\n isMatch: false,\r\n loading: false,\r\n params: {}, // Key/value pairs parsed from the URL corresponding to the dynamic segments of the path\r\n path: '', // The path pattern used to match. Useful for building nested Routes\r\n url: '', // The matched portion of the URL. Useful for building nested Links\r\n },\r\n\r\n attributes: {\r\n path: {\r\n type: String,\r\n default: '*',\r\n },\r\n\r\n exact: {\r\n type: Boolean,\r\n default: false,\r\n },\r\n\r\n url: {\r\n type: String,\r\n default: '',\r\n },\r\n },\r\n\r\n events: {\r\n show: Event,\r\n hide: Event,\r\n error: Event,\r\n unauthorized: Event,\r\n forbidden: Event,\r\n notfound: Event,\r\n },\r\n\r\n render: false,\r\n\r\n init (node) {\r\n this._locationHandler = this._locationHandler.bind(this);\r\n this._error = this._error.bind(this);\r\n\r\n this._cache = new Map();\r\n this._content = node.innerHTML;\r\n this._keys = [];\r\n this._re = dmx.pathToRegexp(this.props.path, this._keys, { end: this.props.exact });\r\n this._shown = false;\r\n \r\n node.innerHTML = '';\r\n\r\n window.addEventListener(\"popstate\", this._locationHandler);\r\n window.addEventListener(\"pushstate\", this._locationHandler);\r\n window.addEventListener(\"replacestate\", this._locationHandler);\r\n window.addEventListener('hashchange', this._locationHandler);\r\n\r\n this._locationHandler();\r\n },\r\n\r\n destroy () {\r\n window.removeEventListener(\"popstate\", this._locationHandler);\r\n window.removeEventListener(\"pushstate\", this._locationHandler);\r\n window.removeEventListener(\"replacestate\", this._locationHandler);\r\n window.removeEventListener('hashchange', this._locationHandler);\r\n },\r\n\r\n performUpdate (updatedProps) {\r\n this.set({\r\n path: this.props.path,\r\n isExact: this.props.exact,\r\n });\r\n },\r\n\r\n _load () {\r\n this._hide();\r\n\r\n const url = this.props.url;\r\n\r\n if (this._cache.has(url)) {\r\n this._loaded = url;\r\n this._content = this._cache.get(url);\r\n this._show();\r\n return;\r\n }\r\n\r\n this.set('loading', true);\r\n\r\n this._abortController = new AbortController();\r\n\r\n fetch(url, {\r\n credentials: 'same-origin',\r\n signal: this._abortController.signal,\r\n }).then(reponse => reponse.text()).then(content => {\r\n this.set('loading', false);\r\n this._loaded = url;\r\n this._content = content;\r\n this._cache.set(url, content);\r\n this._show();\r\n }).catch(this._error);\r\n },\r\n\r\n _show () {\r\n if (this._shown) return;\r\n\r\n if (this._abortController) {\r\n this._abortController.abort();\r\n }\r\n\r\n this.$node.innerHTML = this._content;\r\n this.$parse();\r\n \r\n dmx.routing.evalScripts(this.$node);\r\n\r\n this._shown = true;\r\n this.dispatchEvent('show');\r\n },\r\n\r\n _hide () {\r\n if (!this._shown) return;\r\n\r\n if (this._abortController) {\r\n this._abortController.abort();\r\n }\r\n\r\n if (this.effects) {\r\n this.effects.forEach((effect) => effect());\r\n this.effects = null;\r\n }\r\n this.$destroyChildren();\r\n this.$node.innerHTML = '';\r\n\r\n this._shown = false;\r\n this.dispatchEvent('hide');\r\n },\r\n\r\n _error (err) {\r\n this.set('loading', false);\r\n this.dispatchEvent('error');\r\n if (dmx.debug) console.error(err);\r\n },\r\n\r\n _locationHandler (event) {\r\n let path = dmx.routing.getUrlInfo().path;\r\n\r\n if (dmx.routing.router == 'hybrid') {\r\n let base = document.querySelector('meta[name=\"ac:base\"]');\r\n let route = document.querySelector('meta[name=\"ac:route\"]');\r\n\r\n if (base && base.content) {\r\n path = path.replace(base.content.replace(/\\/$/, ''), '');\r\n }\r\n\r\n if (route && route.content) {\r\n path = path.replace(dmx.pathToRegexp(route.content, [], { end: false }), '').replace(/^(\\/+)?/, '/');\r\n }\r\n }\r\n\r\n const match = this._re.exec(path);\r\n\r\n if (match) {\r\n this.set({\r\n isMatch: true,\r\n url: match[0],\r\n params: this._keys.reduce((params, key, index) => {\r\n params[key.name] = match[index + 1];\r\n return params;\r\n }, {})\r\n });\r\n\r\n if (this.data.loading && this.props.url === this._loaded) {\r\n // Url is loading\r\n return;\r\n }\r\n\r\n if (this.props.url && this.props.url !== this._loaded) {\r\n this._load();\r\n } else {\r\n this._show();\r\n }\r\n } else {\r\n this.set({\r\n isMatch: false,\r\n url: '',\r\n params: {},\r\n });\r\n\r\n this._hide();\r\n }\r\n },\r\n\r\n});\r\n","dmx.Component(\"view\", {\r\n\r\n initialData: {\r\n loading: false,\r\n params: null,\r\n },\r\n\r\n events: {\r\n load: Event,\r\n error: Event,\r\n unauthorized: Event,\r\n forbidden: Event,\r\n notfound: Event,\r\n },\r\n\r\n init (node) {\r\n if (window.__WAPPLER__) return;\r\n\r\n this._locationHandler = this._locationHandler.bind(this);\r\n\r\n window.addEventListener(\"popstate\", this._locationHandler);\r\n window.addEventListener(\"pushstate\", this._locationHandler);\r\n window.addEventListener(\"replacestate\", this._locationHandler);\r\n window.addEventListener('hashchange', this._locationHandler);\r\n\r\n if (dmx.routing.router == \"hybrid\") {\r\n this._url = location.pathname;\r\n } else {\r\n this._locationHandler();\r\n }\r\n },\r\n\r\n destroy () {\r\n window.removeEventListener(\"popstate\", this._locationHandler);\r\n window.removeEventListener(\"pushstate\", this._locationHandler);\r\n window.removeEventListener(\"replacestate\", this._locationHandler);\r\n window.removeEventListener('hashchange', this._locationHandler);\r\n },\r\n\r\n _load (url) {\r\n if (this._url == url && this.data.loading) {\r\n // Url is loading\r\n return;\r\n }\r\n\r\n if (this._url != url) {\r\n this.set(\"loading\", true);\r\n this._url = url;\r\n\r\n if (this._abortController) {\r\n this._abortController.abort();\r\n }\r\n\r\n this._abortController = new AbortController();\r\n\r\n fetch(url + (url.includes(\"?\") ? \"&\" : \"?\") + \"fragment=true\", {\r\n credentials: 'same-origin',\r\n headers: [['Accept', 'text/fragment+html']],\r\n signal: this._abortController.signal,\r\n }).then(response => {\r\n this.set(\"loading\", false);\r\n\r\n if (response.status == 200 || response.status == 0) {\r\n response.text().then(html => {\r\n this._show(html)\r\n this.dispatchEvent(\"load\");\r\n //window.dispatchEvent(new Event('load'));\r\n dmx.app._parseQuery();\r\n }).catch(err => {\r\n console.error(err);\r\n this.dispatchEvent('error')\r\n });\r\n } else {\r\n if (response.status == 222) {\r\n response.text().then(url => {\r\n location.assign(url);\r\n }).catch(err => {\r\n console.error(err);\r\n this.dispatchEvent('error')\r\n });\r\n } else {\r\n const events = { 401: 'unauthorized', 403: 'forbidden', 404: 'notfound' };\r\n this.dispatchEvent(events[response.status] || 'error');\r\n }\r\n }\r\n }).catch(err => {\r\n console.error(err);\r\n this.set(\"loading\", false);\r\n this.dispatchEvent('error');\r\n });\r\n }\r\n },\r\n\r\n _show (html) {\r\n if (this.effects) {\r\n this.effects.forEach((effect) => effect());\r\n this.effects = null;\r\n }\r\n\r\n this.$destroyChildren();\r\n this.$node.innerHTML = html;\r\n this.$parse();\r\n\r\n dmx.routing.evalScripts(this.$node);\r\n },\r\n\r\n _locationHandler (event) {\r\n if (dmx.routing.router == \"hybrid\") {\r\n this._load(location.pathname);\r\n } else {\r\n let path = dmx.routing.getUrlInfo().path;\r\n let routes = dmx.routing.getRoutes();\r\n let parent = this.parent;\r\n\r\n while (parent) {\r\n if (parent.routes) {\r\n routes = parent.routes;\r\n break;\r\n }\r\n\r\n parent = parent.parent;\r\n }\r\n\r\n const route = dmx.routing.match(path, routes, parent);\r\n\r\n if (route) {\r\n this.path = route.path;\r\n this.routes = route.routes;\r\n this.set(\"params\", route.params);\r\n this._load(route.url);\r\n } else {\r\n console.warn(\"Route for \" + path + \" not found\");\r\n }\r\n }\r\n },\r\n\r\n});\r\n","dmx.Component('link', {\r\n\r\n attributes: {\r\n internal: {\r\n type: Boolean,\r\n default: false,\r\n },\r\n\r\n href: {\r\n type: String,\r\n default: null,\r\n },\r\n },\r\n\r\n init (node) {\r\n this._clickHandler = this._clickHandler.bind(this);\r\n this._stateHandler = this._stateHandler.bind(this);\r\n\r\n node.addEventListener('click', this._clickHandler);\r\n\r\n if (this.props.href) {\r\n if (!node.hasAttribute('href')) {\r\n this.$node.setAttribute('href', this.props.href);\r\n }\r\n this._fixUrl(node.getAttribute('href'));\r\n }\r\n\r\n if (node.classList.contains('nav-link')) {\r\n window.addEventListener(\"popstate\", this._stateHandler);\r\n window.addEventListener(\"pushstate\", this._stateHandler);\r\n window.addEventListener(\"replacestate\", this._stateHandler);\r\n window.addEventListener('hashchange', this._stateHandler);\r\n this._stateHandler();\r\n }\r\n },\r\n\r\n performUpdate (updatedProps) {\r\n if (updatedProps.has('href')) {\r\n if (this.props.href) {\r\n this.$node.setAttribute('href', this.props.href);\r\n this._fixUrl(this.props.href);\r\n } else {\r\n this.$node.removeAttribute('href');\r\n }\r\n }\r\n },\r\n\r\n destroy () {\r\n this.$node.removeEventListener('click', this._clickHandler);\r\n window.removeEventListener(\"popstate\", this._stateHandler);\r\n window.removeEventListener(\"pushstate\", this._stateHandler);\r\n window.removeEventListener(\"replacestate\", this._stateHandler);\r\n window.removeEventListener('hashchange', this._stateHandler);\r\n },\r\n\r\n _fixUrl (url) {\r\n if (url.startsWith('./')) {\r\n let parent = this.parent;\r\n\r\n while (parent) {\r\n if (parent.routes && parent.path) {\r\n url = dmx.routing.join('./', url.replace('./', parent.path));\r\n break;\r\n }\r\n\r\n parent = parent.parent;\r\n }\r\n\r\n let route = document.querySelector('meta[name=\"ac:route\"]');\r\n if (route && route.content) {\r\n let path = route.content;\r\n let base = document.querySelector('meta[name=\"ac:base\"]');\r\n if (base && base.content) {\r\n path = base.content.replace(/\\/$/, '') + path;\r\n }\r\n let match = dmx.pathToRegexp(path, [], { end: false }).exec(location.pathname);\r\n if (match) {\r\n this.$node.setAttribute('href', url.replace('./', match[0].replace(/(\\/+)?$/, '/')));\r\n }\r\n } else {\r\n this.$node.setAttribute('href', dmx.routing.join(dmx.routing.getBase(), url));\r\n }\r\n\r\n this.props.internal = true;\r\n }\r\n },\r\n\r\n _navigate () {\r\n let url = this.$node.getAttribute('href') || '';\r\n\r\n if (url.startsWith('#')) {\r\n location.hash = url;\r\n return;\r\n }\r\n \r\n if (dmx.routing.router === 'hash') {\r\n url = '#!' + url;\r\n }\r\n \r\n const title = this.$node.title;\r\n history.pushState({ title: title || document.title }, '', url);\r\n if (title) document.title = title;\r\n window.dispatchEvent(new Event('pushstate'));\r\n },\r\n\r\n _clickHandler (event) {\r\n const url = this.$node.getAttribute('href');\r\n\r\n if (url && (this.props.internal || url.startsWith('#')) && !event.ctrlKey && event.button === 0) {\r\n event.preventDefault();\r\n this._navigate();\r\n }\r\n },\r\n\r\n _stateHandler () {\r\n const node = this.$node;\r\n const url = node.getAttribute('href');\r\n if (url.startsWith('#')) return;\r\n const active = node.href == window.location.href || node.href == window.location.href.split(\"?\")[0].split(\"#\")[0];\r\n\r\n node.classList.toggle('active', active);\r\n\r\n if (node.classList.contains('dropdown-item')) {\r\n const items = node.parentNode.querySelectorAll('.dropdown-item');\r\n node.classList.remove('active');\r\n\r\n for (let i = 0; i < items.length; i++) {\r\n const match = items[i].href == window.location.href || items[i].href == window.location.href.split(\"?\")[0].split(\"#\")[0];\r\n if (match) {\r\n items[i].classList.add('active');\r\n node.classList.add('active');\r\n } else {\r\n items[i].classList.remove('active');\r\n }\r\n }\r\n }\r\n },\r\n\r\n});\r\n"]}