{"version":3,"file":"core.js","sources":["../../node_modules/whatwg-fetch/fetch.js","../../client/utils/fetch.js","../../client/utils/dom.js","../../client/utils/offcanvas.js","../../client/utils/toast.js","../../client/core.js"],"sourcesContent":["var support = {\n searchParams: 'URLSearchParams' in self,\n iterable: 'Symbol' in self && 'iterator' in Symbol,\n blob:\n 'FileReader' in self &&\n 'Blob' in self &&\n (function() {\n try {\n new Blob()\n return true\n } catch (e) {\n return false\n }\n })(),\n formData: 'FormData' in self,\n arrayBuffer: 'ArrayBuffer' in self\n}\n\nfunction isDataView(obj) {\n return obj && DataView.prototype.isPrototypeOf(obj)\n}\n\nif (support.arrayBuffer) {\n var viewClasses = [\n '[object Int8Array]',\n '[object Uint8Array]',\n '[object Uint8ClampedArray]',\n '[object Int16Array]',\n '[object Uint16Array]',\n '[object Int32Array]',\n '[object Uint32Array]',\n '[object Float32Array]',\n '[object Float64Array]'\n ]\n\n var isArrayBufferView =\n ArrayBuffer.isView ||\n function(obj) {\n return obj && viewClasses.indexOf(Object.prototype.toString.call(obj)) > -1\n }\n}\n\nfunction normalizeName(name) {\n if (typeof name !== 'string') {\n name = String(name)\n }\n if (/[^a-z0-9\\-#$%&'*+.^_`|~]/i.test(name)) {\n throw new TypeError('Invalid character in header field name')\n }\n return name.toLowerCase()\n}\n\nfunction normalizeValue(value) {\n if (typeof value !== 'string') {\n value = String(value)\n }\n return value\n}\n\n// Build a destructive iterator for the value list\nfunction iteratorFor(items) {\n var iterator = {\n next: function() {\n var value = items.shift()\n return {done: value === undefined, value: value}\n }\n }\n\n if (support.iterable) {\n iterator[Symbol.iterator] = function() {\n return iterator\n }\n }\n\n return iterator\n}\n\nexport function Headers(headers) {\n this.map = {}\n\n if (headers instanceof Headers) {\n headers.forEach(function(value, name) {\n this.append(name, value)\n }, this)\n } else if (Array.isArray(headers)) {\n headers.forEach(function(header) {\n this.append(header[0], header[1])\n }, this)\n } else if (headers) {\n Object.getOwnPropertyNames(headers).forEach(function(name) {\n this.append(name, headers[name])\n }, this)\n }\n}\n\nHeaders.prototype.append = function(name, value) {\n name = normalizeName(name)\n value = normalizeValue(value)\n var oldValue = this.map[name]\n this.map[name] = oldValue ? oldValue + ', ' + value : value\n}\n\nHeaders.prototype['delete'] = function(name) {\n delete this.map[normalizeName(name)]\n}\n\nHeaders.prototype.get = function(name) {\n name = normalizeName(name)\n return this.has(name) ? this.map[name] : null\n}\n\nHeaders.prototype.has = function(name) {\n return this.map.hasOwnProperty(normalizeName(name))\n}\n\nHeaders.prototype.set = function(name, value) {\n this.map[normalizeName(name)] = normalizeValue(value)\n}\n\nHeaders.prototype.forEach = function(callback, thisArg) {\n for (var name in this.map) {\n if (this.map.hasOwnProperty(name)) {\n callback.call(thisArg, this.map[name], name, this)\n }\n }\n}\n\nHeaders.prototype.keys = function() {\n var items = []\n this.forEach(function(value, name) {\n items.push(name)\n })\n return iteratorFor(items)\n}\n\nHeaders.prototype.values = function() {\n var items = []\n this.forEach(function(value) {\n items.push(value)\n })\n return iteratorFor(items)\n}\n\nHeaders.prototype.entries = function() {\n var items = []\n this.forEach(function(value, name) {\n items.push([name, value])\n })\n return iteratorFor(items)\n}\n\nif (support.iterable) {\n Headers.prototype[Symbol.iterator] = Headers.prototype.entries\n}\n\nfunction consumed(body) {\n if (body.bodyUsed) {\n return Promise.reject(new TypeError('Already read'))\n }\n body.bodyUsed = true\n}\n\nfunction fileReaderReady(reader) {\n return new Promise(function(resolve, reject) {\n reader.onload = function() {\n resolve(reader.result)\n }\n reader.onerror = function() {\n reject(reader.error)\n }\n })\n}\n\nfunction readBlobAsArrayBuffer(blob) {\n var reader = new FileReader()\n var promise = fileReaderReady(reader)\n reader.readAsArrayBuffer(blob)\n return promise\n}\n\nfunction readBlobAsText(blob) {\n var reader = new FileReader()\n var promise = fileReaderReady(reader)\n reader.readAsText(blob)\n return promise\n}\n\nfunction readArrayBufferAsText(buf) {\n var view = new Uint8Array(buf)\n var chars = new Array(view.length)\n\n for (var i = 0; i < view.length; i++) {\n chars[i] = String.fromCharCode(view[i])\n }\n return chars.join('')\n}\n\nfunction bufferClone(buf) {\n if (buf.slice) {\n return buf.slice(0)\n } else {\n var view = new Uint8Array(buf.byteLength)\n view.set(new Uint8Array(buf))\n return view.buffer\n }\n}\n\nfunction Body() {\n this.bodyUsed = false\n\n this._initBody = function(body) {\n this._bodyInit = body\n if (!body) {\n this._bodyText = ''\n } else if (typeof body === 'string') {\n this._bodyText = body\n } else if (support.blob && Blob.prototype.isPrototypeOf(body)) {\n this._bodyBlob = body\n } else if (support.formData && FormData.prototype.isPrototypeOf(body)) {\n this._bodyFormData = body\n } else if (support.searchParams && URLSearchParams.prototype.isPrototypeOf(body)) {\n this._bodyText = body.toString()\n } else if (support.arrayBuffer && support.blob && isDataView(body)) {\n this._bodyArrayBuffer = bufferClone(body.buffer)\n // IE 10-11 can't handle a DataView body.\n this._bodyInit = new Blob([this._bodyArrayBuffer])\n } else if (support.arrayBuffer && (ArrayBuffer.prototype.isPrototypeOf(body) || isArrayBufferView(body))) {\n this._bodyArrayBuffer = bufferClone(body)\n } else {\n this._bodyText = body = Object.prototype.toString.call(body)\n }\n\n if (!this.headers.get('content-type')) {\n if (typeof body === 'string') {\n this.headers.set('content-type', 'text/plain;charset=UTF-8')\n } else if (this._bodyBlob && this._bodyBlob.type) {\n this.headers.set('content-type', this._bodyBlob.type)\n } else if (support.searchParams && URLSearchParams.prototype.isPrototypeOf(body)) {\n this.headers.set('content-type', 'application/x-www-form-urlencoded;charset=UTF-8')\n }\n }\n }\n\n if (support.blob) {\n this.blob = function() {\n var rejected = consumed(this)\n if (rejected) {\n return rejected\n }\n\n if (this._bodyBlob) {\n return Promise.resolve(this._bodyBlob)\n } else if (this._bodyArrayBuffer) {\n return Promise.resolve(new Blob([this._bodyArrayBuffer]))\n } else if (this._bodyFormData) {\n throw new Error('could not read FormData body as blob')\n } else {\n return Promise.resolve(new Blob([this._bodyText]))\n }\n }\n\n this.arrayBuffer = function() {\n if (this._bodyArrayBuffer) {\n return consumed(this) || Promise.resolve(this._bodyArrayBuffer)\n } else {\n return this.blob().then(readBlobAsArrayBuffer)\n }\n }\n }\n\n this.text = function() {\n var rejected = consumed(this)\n if (rejected) {\n return rejected\n }\n\n if (this._bodyBlob) {\n return readBlobAsText(this._bodyBlob)\n } else if (this._bodyArrayBuffer) {\n return Promise.resolve(readArrayBufferAsText(this._bodyArrayBuffer))\n } else if (this._bodyFormData) {\n throw new Error('could not read FormData body as text')\n } else {\n return Promise.resolve(this._bodyText)\n }\n }\n\n if (support.formData) {\n this.formData = function() {\n return this.text().then(decode)\n }\n }\n\n this.json = function() {\n return this.text().then(JSON.parse)\n }\n\n return this\n}\n\n// HTTP methods whose capitalization should be normalized\nvar methods = ['DELETE', 'GET', 'HEAD', 'OPTIONS', 'POST', 'PUT']\n\nfunction normalizeMethod(method) {\n var upcased = method.toUpperCase()\n return methods.indexOf(upcased) > -1 ? upcased : method\n}\n\nexport function Request(input, options) {\n options = options || {}\n var body = options.body\n\n if (input instanceof Request) {\n if (input.bodyUsed) {\n throw new TypeError('Already read')\n }\n this.url = input.url\n this.credentials = input.credentials\n if (!options.headers) {\n this.headers = new Headers(input.headers)\n }\n this.method = input.method\n this.mode = input.mode\n this.signal = input.signal\n if (!body && input._bodyInit != null) {\n body = input._bodyInit\n input.bodyUsed = true\n }\n } else {\n this.url = String(input)\n }\n\n this.credentials = options.credentials || this.credentials || 'same-origin'\n if (options.headers || !this.headers) {\n this.headers = new Headers(options.headers)\n }\n this.method = normalizeMethod(options.method || this.method || 'GET')\n this.mode = options.mode || this.mode || null\n this.signal = options.signal || this.signal\n this.referrer = null\n\n if ((this.method === 'GET' || this.method === 'HEAD') && body) {\n throw new TypeError('Body not allowed for GET or HEAD requests')\n }\n this._initBody(body)\n}\n\nRequest.prototype.clone = function() {\n return new Request(this, {body: this._bodyInit})\n}\n\nfunction decode(body) {\n var form = new FormData()\n body\n .trim()\n .split('&')\n .forEach(function(bytes) {\n if (bytes) {\n var split = bytes.split('=')\n var name = split.shift().replace(/\\+/g, ' ')\n var value = split.join('=').replace(/\\+/g, ' ')\n form.append(decodeURIComponent(name), decodeURIComponent(value))\n }\n })\n return form\n}\n\nfunction parseHeaders(rawHeaders) {\n var headers = new Headers()\n // Replace instances of \\r\\n and \\n followed by at least one space or horizontal tab with a space\n // https://tools.ietf.org/html/rfc7230#section-3.2\n var preProcessedHeaders = rawHeaders.replace(/\\r?\\n[\\t ]+/g, ' ')\n preProcessedHeaders.split(/\\r?\\n/).forEach(function(line) {\n var parts = line.split(':')\n var key = parts.shift().trim()\n if (key) {\n var value = parts.join(':').trim()\n headers.append(key, value)\n }\n })\n return headers\n}\n\nBody.call(Request.prototype)\n\nexport function Response(bodyInit, options) {\n if (!options) {\n options = {}\n }\n\n this.type = 'default'\n this.status = options.status === undefined ? 200 : options.status\n this.ok = this.status >= 200 && this.status < 300\n this.statusText = 'statusText' in options ? options.statusText : 'OK'\n this.headers = new Headers(options.headers)\n this.url = options.url || ''\n this._initBody(bodyInit)\n}\n\nBody.call(Response.prototype)\n\nResponse.prototype.clone = function() {\n return new Response(this._bodyInit, {\n status: this.status,\n statusText: this.statusText,\n headers: new Headers(this.headers),\n url: this.url\n })\n}\n\nResponse.error = function() {\n var response = new Response(null, {status: 0, statusText: ''})\n response.type = 'error'\n return response\n}\n\nvar redirectStatuses = [301, 302, 303, 307, 308]\n\nResponse.redirect = function(url, status) {\n if (redirectStatuses.indexOf(status) === -1) {\n throw new RangeError('Invalid status code')\n }\n\n return new Response(null, {status: status, headers: {location: url}})\n}\n\nexport var DOMException = self.DOMException\ntry {\n new DOMException()\n} catch (err) {\n DOMException = function(message, name) {\n this.message = message\n this.name = name\n var error = Error(message)\n this.stack = error.stack\n }\n DOMException.prototype = Object.create(Error.prototype)\n DOMException.prototype.constructor = DOMException\n}\n\nexport function fetch(input, init) {\n return new Promise(function(resolve, reject) {\n var request = new Request(input, init)\n\n if (request.signal && request.signal.aborted) {\n return reject(new DOMException('Aborted', 'AbortError'))\n }\n\n var xhr = new XMLHttpRequest()\n\n function abortXhr() {\n xhr.abort()\n }\n\n xhr.onload = function() {\n var options = {\n status: xhr.status,\n statusText: xhr.statusText,\n headers: parseHeaders(xhr.getAllResponseHeaders() || '')\n }\n options.url = 'responseURL' in xhr ? xhr.responseURL : options.headers.get('X-Request-URL')\n var body = 'response' in xhr ? xhr.response : xhr.responseText\n resolve(new Response(body, options))\n }\n\n xhr.onerror = function() {\n reject(new TypeError('Network request failed'))\n }\n\n xhr.ontimeout = function() {\n reject(new TypeError('Network request failed'))\n }\n\n xhr.onabort = function() {\n reject(new DOMException('Aborted', 'AbortError'))\n }\n\n xhr.open(request.method, request.url, true)\n\n if (request.credentials === 'include') {\n xhr.withCredentials = true\n } else if (request.credentials === 'omit') {\n xhr.withCredentials = false\n }\n\n if ('responseType' in xhr && support.blob) {\n xhr.responseType = 'blob'\n }\n\n request.headers.forEach(function(value, name) {\n xhr.setRequestHeader(name, value)\n })\n\n if (request.signal) {\n request.signal.addEventListener('abort', abortXhr)\n\n xhr.onreadystatechange = function() {\n // DONE (success or failure)\n if (xhr.readyState === 4) {\n request.signal.removeEventListener('abort', abortXhr)\n }\n }\n }\n\n xhr.send(typeof request._bodyInit === 'undefined' ? null : request._bodyInit)\n })\n}\n\nfetch.polyfill = true\n\nif (!self.fetch) {\n self.fetch = fetch\n self.Headers = Headers\n self.Request = Request\n self.Response = Response\n}\n","import 'whatwg-fetch';\r\n\r\nfunction handleResponse(resp) {\r\n if (!resp.ok) {\r\n if (resp.status === 401) {\r\n window.location.reload(true);\r\n }\r\n return Promise.reject({\r\n status: resp.status,\r\n message: resp.statusText,\r\n });\r\n }\r\n\r\n const contentType = resp.headers.get('Content-Type');\r\n if (!contentType) {\r\n return;\r\n }\r\n\r\n if (contentType.includes('application/json')) {\r\n return resp.json();\r\n }\r\n\r\n if (contentType.includes('text/html')) {\r\n return resp.text();\r\n }\r\n\r\n throw new Error(`Sorry, Content-Type ${contentType} not supported`);\r\n}\r\n\r\nexport const GET = async (url) => {\r\n try {\r\n const resp = await fetch(url);\r\n return handleResponse(resp);\r\n } catch (e) {\r\n console.log(e);\r\n }\r\n};\r\n\r\nexport const POST = async (url, data, headers = {}) => {\r\n const body = typeof data === 'string' ? data : JSON.stringify(data);\r\n\r\n try {\r\n const resp = await fetch(url, {\r\n method: 'POST',\r\n headers: {\r\n Accept: 'application/json',\r\n 'Content-Type': 'application/json',\r\n ...headers,\r\n },\r\n body,\r\n });\r\n\r\n return handleResponse(resp);\r\n } catch (e) {\r\n console.log(e);\r\n }\r\n};\r\n\r\nexport const SUBMITFORM = async (url, data) => {\r\n try {\r\n return $.ajax({\r\n url: url,\r\n method: 'POST',\r\n contentType: 'application/x-www-form-urlencoded; charset=UTF-8',\r\n data: data,\r\n })\r\n .done(function (result) {\r\n return result;\r\n })\r\n .fail(function (result) {\r\n console.warn(result.resultText);\r\n });\r\n\r\n // return handleResponse(resp);\r\n } catch (e) {\r\n console.log(e);\r\n }\r\n};\r\n\r\nexport const stringify = (data) => {\r\n return Object.keys(data)\r\n .map((key) => encodeURIComponent(key) + '=' + encodeURIComponent(data[key]))\r\n .join('&');\r\n};\r\n","export function hasClass(el, className) {\r\n return el.classList\r\n ? el.classList.contains(className)\r\n : new RegExp(\"\\\\b\" + className + \"\\\\b\").test(el.className);\r\n}\r\n\r\nexport function addClass(el, className) {\r\n const classNames = className.split(\" \");\r\n\r\n if (el.classList) {\r\n for (let i = 0; i < classNames.length; i++) {\r\n if (classNames[i] && classNames[i].length > 0) {\r\n el.classList.add(classNames[i].trim());\r\n }\r\n }\r\n } else if (!hasClass(el, className)) {\r\n for (let i = 0; i < classNames.length; i++) {\r\n el.className += \" \" + classNames[i].trim();\r\n }\r\n }\r\n}\r\n\r\nexport function removeClass(el, className) {\r\n if (!el || typeof className === \"undefined\") {\r\n return;\r\n }\r\n\r\n const classNames = className.split(\" \");\r\n\r\n if (el.classList) {\r\n for (let i = 0; i < classNames.length; i++) {\r\n el.classList.remove(classNames[i].trim());\r\n }\r\n } else if (hasClass(el, className)) {\r\n for (let i = 0; i < classNames.length; i++) {\r\n el.className = el.className.replace(\r\n new RegExp(\"\\\\b\" + classNames[i].trim() + \"\\\\b\", \"g\"),\r\n \"\"\r\n );\r\n }\r\n }\r\n}\r\n\r\nexport function toggleClass(el, className) {\r\n if (hasClass(el, className)) {\r\n removeClass(el, className);\r\n } else {\r\n addClass(el, className);\r\n }\r\n}\r\n\r\n/**\r\n * Inserts an element after the given reference node.\r\n *\r\n * @param {Element} el The element to insert after\r\n * @param {Element} referenceNode The reference node\r\n * @returns {Element}\r\n */\r\nexport function insertAfter(el, referenceNode) {\r\n return referenceNode.parentNode.insertBefore(el, referenceNode.nextSibling);\r\n}\r\n\r\n/**\r\n * Finds an element\r\n *\r\n * @param query The query value\r\n * @returns {HTMLElement|Document|Element|null}\r\n */\r\nexport function getElement(query) {\r\n let el;\r\n\r\n if (query === document) {\r\n return document;\r\n }\r\n\r\n if (!!(query && query.nodeType === 1)) {\r\n return query;\r\n }\r\n\r\n if ((el = document.getElementById(query))) {\r\n return el;\r\n }\r\n\r\n if (((el = document.getElementsByTagName(query)), el.length > 0)) {\r\n return el[0];\r\n }\r\n\r\n if (((el = document.getElementsByClassName(query)), el.length > 0)) {\r\n return el[0];\r\n }\r\n\r\n return null;\r\n}\r\n\r\n/**\r\n * Removes the given element\r\n * @param {Element} el The element to be removed\r\n */\r\nexport function removeElement(el) {\r\n if (el && el.parentNode) {\r\n el.parentNode.removeChild(el);\r\n }\r\n}\r\n\r\n/**\r\n * Get bounding client rect for the given element\r\n * \r\n * @param {Element} el The element to measure.\r\n */\r\nexport function getElementRect(el) {\r\n const element = el.cloneNode(true);\r\n element.style.visibility = \"hidden\";\r\n element.style.position = \"absolute\";\r\n \r\n document.body.appendChild(element);\r\n\r\n const result = element.getBoundingClientRect();\r\n element.remove();\r\n \r\n return result;\r\n}\r\n","import {\r\n addClass,\r\n removeClass,\r\n getElement,\r\n insertAfter,\r\n removeElement,\r\n hasClass,\r\n} from './dom';\r\n\r\nfunction createCloseButton() {\r\n const closeBtn = document.createElement('DIV');\r\n addClass(\r\n closeBtn,\r\n 'absolute mt-2 mr-2 z-50 cursor-pointer right-0 top-0 md:mr-0 md:right-auto md:left-0 md:-ml-10'\r\n );\r\n\r\n closeBtn.innerHTML = `\r\n \r\n `;\r\n\r\n return closeBtn;\r\n}\r\n\r\nfunction createBackButton() {\r\n const backBtn = document.createElement('DIV');\r\n addClass(\r\n backBtn,\r\n 'absolute ml-2 mt-2 z-50 cursor-pointer left-0 top-0 md:-z-1 md:ml-0 md:right-auto md:mt-13 md:left-0 md:-ml-10 transition duration-150 ease-in transform -translate-x-12 md:translate-x-12 opacity-0'\r\n );\r\n\r\n backBtn.innerHTML = `\r\n \r\n `;\r\n\r\n return backBtn;\r\n}\r\n\r\nclass OffCanvas {\r\n constructor() {\r\n this.body = getElement('body');\r\n\r\n this.offcanvas = document.createElement('DIV');\r\n addClass(\r\n this.offcanvas,\r\n 'sc-offcanvas bg-primary w-full md:w-3/4 lg:w-4/6 xl:w-1/2 2xl:w-3/7 3xl:w-2/6'\r\n );\r\n document.body.appendChild(this.offcanvas);\r\n\r\n this.closeBtn = createCloseButton(this.hide);\r\n this.closeBtn.addEventListener('click', (event) => {\r\n event.stopPropagation();\r\n event.preventDefault();\r\n this.hide();\r\n });\r\n\r\n this.backBtn = createBackButton();\r\n this.backBtn.addEventListener('click', (event) => {\r\n event.stopPropagation();\r\n event.preventDefault();\r\n this.popView();\r\n });\r\n\r\n this.offcanvas.appendChild(this.closeBtn);\r\n this.offcanvas.appendChild(this.backBtn);\r\n\r\n this.content = insertAfter(document.createElement('DIV'), this.closeBtn);\r\n addClass(\r\n this.content,\r\n 'bg-primary h-full overflow-y-auto overflow-x-hidden transform transition-transform duration-150 ease-in'\r\n );\r\n\r\n this.state = 'hidden';\r\n this.events = [];\r\n this.overlay = null;\r\n this.viewStack = [];\r\n }\r\n\r\n setContent(content) {\r\n if (typeof content === 'string') {\r\n this.content.innerHTML = content;\r\n } else {\r\n while (this.content.firstChild) {\r\n this.content.removeChild(this.content.firstChild);\r\n }\r\n this.content.appendChild(content);\r\n }\r\n }\r\n\r\n renderView(content) {\r\n if (this.viewStack.length > 1) {\r\n addClass(this.content, 'opacity-0');\r\n this.setContent(content);\r\n addClass(this.content, 'translate-x-full');\r\n\r\n setTimeout(\r\n () => removeClass(this.content, 'translate-x-full opacity-0'),\r\n 120\r\n );\r\n\r\n if (hasClass(this.backBtn, '-translate-x-12')) {\r\n removeClass(\r\n this.backBtn,\r\n '-translate-x-12 md:translate-x-12 opacity-0'\r\n );\r\n }\r\n } else {\r\n this.setContent(content);\r\n }\r\n }\r\n\r\n popView() {\r\n if (this.viewStack.length === 1) {\r\n return;\r\n }\r\n\r\n this.viewStack.pop();\r\n if (this.viewStack.length === 1) {\r\n addClass(this.backBtn, '-translate-x-12 md:translate-x-12 opacity-0');\r\n }\r\n\r\n this.content.innerHTML = this.viewStack[this.viewStack.length - 1];\r\n }\r\n\r\n renderContent(content, stackView, resetStackView, wide) {\r\n if (resetStackView && this.viewStack.length > 1) {\r\n this.viewStack = [];\r\n }\r\n\r\n stackView ? this.viewStack.push(content) : (this.viewStack[0] = content);\r\n this.renderView(content);\r\n\r\n if (this.state === 'shown') {\r\n return;\r\n }\r\n\r\n if (wide) {\r\n removeClass(\r\n this.offcanvas,\r\n 'md:w-3/4 lg:w-4/6 xl:w-1/2 2xl:w-3/7 3xl:w-2/6'\r\n );\r\n addClass(this.offcanvas, 'sm:w-1/2');\r\n }\r\n\r\n addClass(this.body, 'sc-offcanvas--on');\r\n addClass(this.offcanvas, 'sc-offcanvas--on');\r\n\r\n this.state = 'shown';\r\n\r\n this.overlay = insertAfter(document.createElement('DIV'), this.offcanvas);\r\n\r\n addClass(this.overlay, 'sc-offcanvas-overlay');\r\n\r\n this.overlay.addEventListener('click', (event) => {\r\n event.stopPropagation();\r\n event.preventDefault();\r\n this.hide();\r\n });\r\n\r\n this.eventTrigger('afterShow');\r\n }\r\n\r\n show(\r\n url,\r\n { stackView = false, resetStackView = false, wide = false } = options\r\n ) {\r\n if (!url || !url.trim().length) {\r\n return;\r\n }\r\n\r\n this.eventTrigger('beforeShow');\r\n\r\n window.SCUtil.GET(url)\r\n .then((content) => {\r\n this.renderContent(content, stackView, resetStackView, wide);\r\n })\r\n .catch((error) => console.log(error));\r\n }\r\n\r\n hide() {\r\n if (this.state === 'hidden') {\r\n return;\r\n }\r\n\r\n this.eventTrigger('beforeHide');\r\n\r\n removeClass(this.body, 'sc-offcanvas--on');\r\n removeClass(this.offcanvas, 'sc-offcanvas--on');\r\n\r\n this.state = 'hidden';\r\n\r\n if (this.overlay) {\r\n removeElement(this.overlay);\r\n }\r\n\r\n if (this.content) {\r\n this.content.innerHTML = null;\r\n }\r\n\r\n if (this.viewStack.length !== 0) {\r\n this.viewStack.length > 1 &&\r\n addClass(this.backBtn, '-translate-x-12 md:translate-x-12 opacity-0');\r\n\r\n this.viewStack = [];\r\n }\r\n\r\n this.eventTrigger('afterHide');\r\n }\r\n\r\n addEvent(name, handler, one = true) {\r\n this.events.push({\r\n name,\r\n handler,\r\n one,\r\n fired: false,\r\n });\r\n }\r\n\r\n eventTrigger(name) {\r\n for (let i = 0; i < this.events.length; i++) {\r\n const event = this.events[i];\r\n if (event.name === name) {\r\n if (event.one === true) {\r\n if (event.fired === false) {\r\n this.events[i].fired = true;\r\n return event.handler();\r\n }\r\n } else {\r\n return event.handler();\r\n }\r\n }\r\n }\r\n }\r\n}\r\n\r\nexport default new OffCanvas();\r\n","import { addClass } from \"./dom\";\r\n\r\nfunction createContainer() {\r\n const container = document.createElement(\"DIV\");\r\n addClass(container, \"sc-toast-container\");\r\n container.setAttribute(\"role\", \"alert\");\r\n container.setAttribute(\"aria-live\", \"assertive\");\r\n document.body.appendChild(container);\r\n\r\n return container;\r\n}\r\n\r\nfunction getContainer() {\r\n const container = document.getElementsByClassName(\"sc-toast-container\")[0];\r\n if (!container) {\r\n return createContainer();\r\n }\r\n\r\n return container;\r\n}\r\n\r\n/**\r\n *\r\n * @param {Element} toastElement\r\n */\r\nfunction removeToast(toastElement) {\r\n const container = getContainer();\r\n\r\n toastElement.remove();\r\n toastElement = null;\r\n if (container.children.length === 0) {\r\n container.remove();\r\n }\r\n}\r\n\r\nexport function toast(options) {\r\n let intervalId;\r\n\r\n const { title, message, icon } = options;\r\n const container = getContainer();\r\n const toastElem = document.createElement(\"DIV\");\r\n addClass(toastElem, \"sc-toast\");\r\n toastElem.setAttribute(\"role\", \"alert\");\r\n toastElem.setAttribute(\"aria-live\", \"assertive\");\r\n\r\n if (icon) {\r\n const iconElem = document.createElement(\"DIV\");\r\n addClass(iconElem, `flex-shrink-0 ${icon}`); // TODO: Test this with fontawesome icons\r\n }\r\n\r\n if (title) {\r\n const titleElem = document.createElement(\"DIV\");\r\n addClass(titleElem, \"sc-toast-title\");\r\n titleElem.innerHTML = title;\r\n toastElem.appendChild(titleElem);\r\n }\r\n\r\n if (message) {\r\n const messageElem = document.createElement(\"DIV\");\r\n addClass(messageElem, \"sc-toast-message\");\r\n messageElem.innerHTML = message;\r\n toastElem.appendChild(messageElem);\r\n }\r\n\r\n container.appendChild(toastElem);\r\n addClass(toastElem, \"show\");\r\n\r\n // TODO: If User mouseover this toast reset the timeout and set it again after mouseout\r\n intervalId = setTimeout(() => removeToast(toastElem), 5000);\r\n}\r\n","import { GET, POST, SUBMITFORM, stringify } from './utils/fetch';\r\nimport OffCanvas from './utils/offcanvas';\r\nimport { toast } from './utils/toast';\r\nimport { addClass, removeClass } from './utils/dom';\r\n\r\nlet context = {\r\n isAuthenticated: false,\r\n isAdmin: false,\r\n baseUrl: '', // Full URL of the site including the protocol\r\n portalId: null,\r\n currentPageId: null,\r\n homePageId: null,\r\n loginPageId: null,\r\n registerPageId: null,\r\n searchPageId: null,\r\n userId: null,\r\n};\r\n\r\n/**\r\n * Evaluates and executes the given javascript string value.\r\n *\r\n * @param {string} jsValue The javascript string value\r\n */\r\nfunction execute(jsValue) {\r\n const txt = document.createElement('textarea');\r\n txt.innerHTML = jsValue;\r\n eval(txt.value);\r\n}\r\n\r\n/**\r\n * Loads a page with the given pageId.\r\n * If the contentId is passed, it loads the page within the context of the given contentId.\r\n *\r\n * @param {number} pageId The page id. It's required.\r\n * @param {number|undefined} contentId.\r\n */\r\nfunction loadPage(pageId, contentId) {\r\n if (!pageId) {\r\n throw new Error('The pageId parameter is required');\r\n }\r\n\r\n let url = `/page/${pageId}`;\r\n if (contentId) {\r\n url = `${url}?contentId=${contentId}`;\r\n }\r\n\r\n loadUrl(url);\r\n}\r\n\r\n/**\r\n * Loads a viewer into the overlay UI\r\n *\r\n * @param {number} contentID The content ID. It's required.\r\n * @param {string|null|undefined} viewerKey The viewer key.\r\n * @param {string|null|undefined} control The control query parameter.\r\n * @param {string|null|undefined} queryString The query string value for the request.\r\n * @param overlayOptions\r\n */\r\nfunction loadViewer(\r\n contentID,\r\n viewerKey,\r\n control,\r\n queryString,\r\n overlayOptions = {}\r\n) {\r\n if (!contentID && !viewerKey) {\r\n throw new Error('The contentID or viewerKey parameter is required');\r\n }\r\n\r\n let url;\r\n\r\n if (contentID && viewerKey) {\r\n url = `/viewer/${viewerKey}/${contentID}`;\r\n } else {\r\n const param = viewerKey ? viewerKey : contentID;\r\n url = `/viewer/${param}`;\r\n }\r\n\r\n if (control) {\r\n url = `${url}?control=${control}`;\r\n }\r\n\r\n if (queryString) {\r\n if (control) {\r\n url = `${url}&${queryString}`;\r\n } else {\r\n url = `${url}?${queryString}`;\r\n }\r\n }\r\n\r\n window.SCOverlay.show(url, overlayOptions);\r\n}\r\n\r\n/**\r\n * Loads the given url.\r\n *\r\n * @param {string} url The url value. It's required.\r\n * @param {boolean} openInBlank A flag that indicates whether to open the given url in the same or a new browser tab.\r\n * Default is in the same tab.\r\n */\r\nfunction loadUrl(url, openInBlank = false) {\r\n console.log(url, openInBlank);\r\n if (!url) {\r\n throw new Error('The url parameter is required');\r\n }\r\n\r\n if (openInBlank) {\r\n window.open(url, '_blank');\r\n return;\r\n }\r\n\r\n window.location.href = url;\r\n}\r\n\r\n/**\r\n *\r\n * @param {number} contentID\r\n * @returns {Promise