{"version":3,"sources":["init.js"],"names":["window","visitformmncJs","this","_historyStateListeners","_webWorker","_webWorkerPub","_webWorkerSystemMessages","initApp","initLeftPane","getActiveCell","cellStr","URLSearchParams","location","search","get","isNaN","Number","setActiveCell","addUrlQuery","id","s","getSessionStorageItem","sessionStorage","getItem","name","setSessionStorageItem","value","setItem","removeItem","subscribeToHistoryChanges","handler","method","push","getCurrentPath","pathname","substring","getQueryString","forceReloadPage","reload","readValueRaw","document","getElementById","el","changeUrl","from","to","url","history","pushState","forEach","l","invokeMethodAsync","getQueryParams","urlSearchParams","params","Object","fromEntries","entries","set","replaceState","decodeURIComponent","removeUrlQuery","delete","uploadFile","async","baseUrl","elementId","maxSizeMb","onSuccess","onFail","accessToken","JSON","parse","localStorage","file","files","size","formData","FormData","append","encodeURIComponent","await","fetch","headers","Authorization","body","ok","getElementDimensions","height","offsetHeight","width","offsetWidth","markdownToHtml","showdown","Converter","makeHtml","markdown","downloadFile","response","contentDisposition","blob","split","fileLink","p","startsWith","createElement","href","URL","createObjectURL","download","replace","click","console","warn","downloadClientJsonAsFile","filename","contentType","content","File","type","exportUrl","a","appendChild","target","removeChild","revokeObjectURL","offerStoreCredentials","username","password","PasswordCredential","c","navigator","credentials","store","initWebWorker","stopWebWorker","log","Worker","import","meta","onmessage","msg","data","e","terminate","initWebWorkerSystemMessages","stopWebWorkerSystemMessage","_webWorkerSystemMessage","initWebWorkerPub","stopWebWorkerPub","attachEventHandler","eventName","prop","bubbling","useCapture","addEventListener","detail","attachWindowMessageHandler","sendWindowMessage","postMessage","opener","sendMessageToIframe","iframe","contentWindow","getElementAttribute","attrName","setElementAttribute","setAttribute","callMethodOnObject","func","args","callFunc","error","clientJsMethods","RedirectTo","path","release"],"mappings":"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","file":"vfmncm.min.js","sourcesContent":["\r\nwindow.visitformmncJs = new (function () {\r\n this._historyStateListeners = [];\r\n\r\n this._webWorker = null;\r\n this._webWorkerPub = null;\r\n this._webWorkerSystemMessages = null;\r\n\r\n this.initApp = () => {\r\n // console.log(\"initApp\");\r\n // visitformmncJs.initTheming();\r\n this.initLeftPane();\r\n };\r\n\r\n this.getActiveCell = () => {\r\n const urlParams = new URLSearchParams(window.location.search);\r\n const cellStr = urlParams.get(\"cell\");\r\n\r\n if (cellStr !== undefined && cellStr !== null && !isNaN(Number(cellStr))) {\r\n return Number(cellStr);\r\n } else {\r\n return -1;\r\n }\r\n };\r\n\r\n this.setActiveCell = (id) => {\r\n this.addUrlQuery(\"cell\", id);s\r\n };\r\n\r\n this.getSessionStorageItem = (name) => {\r\n return sessionStorage.getItem(name);\r\n };\r\n\r\n this.setSessionStorageItem = (name, value) => {\r\n if (value !== undefined && value !== null) {\r\n sessionStorage.setItem(name, value);\r\n } else {\r\n sessionStorage.removeItem(name);\r\n }\r\n };\r\n \r\n this.subscribeToHistoryChanges = (handler, method) => {\r\n this._historyStateListeners.push({ handler, method });\r\n };\r\n\r\n this.getCurrentPath = () => {\r\n return window.location.pathname.substring(1) + window.location.search;\r\n };\r\n\r\n this.getQueryString = () => {\r\n return window.location.search;\r\n };\r\n\r\n this.forceReloadPage = () => {\r\n return window.location.reload();\r\n };\r\n\r\n this.readValueRaw = (el) => {\r\n return window.document.getElementById(el).value;\r\n };\r\n\r\n this.changeUrl = (url) => {\r\n const from = window.location.pathname.substring(1);\r\n const queryString = window.location.search;\r\n const to = url + queryString;\r\n history.pushState(null, \"\", to);\r\n this._historyStateListeners.forEach((l) => {\r\n l.handler.invokeMethodAsync(l.method, from, to);\r\n });\r\n };\r\n\r\n this.getQueryParams = (handler, method) => {\r\n const urlSearchParams = new URLSearchParams(window.location.search);\r\n const params = Object.fromEntries(urlSearchParams.entries());\r\n handler.invokeMethodAsync(method, params);\r\n };\r\n\r\n this.addUrlQuery = (name, value) => {\r\n const params = new URLSearchParams(window.location.search);\r\n params.set(name, value);\r\n window.history.replaceState({}, \"\", decodeURIComponent(`${window.location.pathname}?${params}`));\r\n };\r\n\r\n this.removeUrlQuery = (name) => {\r\n const params = new URLSearchParams(window.location.search);\r\n params.delete(name);\r\n window.history.replaceState({}, \"\", decodeURIComponent(`${window.location.pathname}?${params}`));\r\n };\r\n\r\n this.uploadFile = async (baseUrl, elementId, maxSizeMb, handler, onSuccess, onFail) => {\r\n const accessToken = JSON.parse(localStorage.getItem(\"accessToken\"));\r\n\r\n if (!accessToken) {\r\n handler.invokeMethodAsync(onFail, \"No valid access token\");\r\n }\r\n\r\n const file = document.getElementById(elementId).files[0];\r\n if (file.size > maxSizeMb * 1024 * 1024) {\r\n handler.invokeMethodAsync(onFail, \"Too large file\");\r\n return;\r\n }\r\n\r\n const formData = new FormData();\r\n formData.append(\"content\", file);\r\n const url = `${baseUrl}/${encodeURIComponent(file.name)}`;\r\n const resp = await fetch(url, { method: \"POST\", headers: { Authorization: \"Bearer \" + accessToken }, body: formData });\r\n\r\n if (resp.ok) {\r\n handler.invokeMethodAsync(onSuccess, file.name);\r\n } else {\r\n handler.invokeMethodAsync(onFail, \"unknown failure\");\r\n }\r\n };\r\n\r\n this.getElementDimensions = (el) => {\r\n return { height: el.offsetHeight, width: el.offsetWidth };\r\n };\r\n\r\n this.markdownToHtml = (markdown) => {\r\n const converter = new showdown.Converter();\r\n return converter.makeHtml(markdown);\r\n };\r\n\r\n this.downloadFile = async (url) => {\r\n const accessToken = JSON.parse(localStorage.getItem(\"accessToken\"));\r\n const response = await fetch(url, {\r\n method: \"GET\",\r\n headers: { Authorization: \"Bearer \" + accessToken },\r\n });\r\n\r\n const contentDisposition = response.headers.get(\"content-disposition\");\r\n if (!contentDisposition) {\r\n console.warn(\"Download: invalid response, filename missing.\");\r\n return;\r\n }\r\n\r\n const blob = await response.blob();\r\n\r\n // Now we have the blob, but not yet the name for it. Below we're doing a small hack to\r\n // download the file with the name provided by the server. First we parse out the name from\r\n // the 'content-disposition' attribute, and then create a temporary link that points\r\n // to a browser in-memory url, which hosts the blob. Then we simulate a click to that link,\r\n // in order to trigger the download. We're doing it so hard way only because we want to\r\n // do this through the generated API code (which internally uses 'fetch' for all requests\r\n // and handles authentication). Without the temporary link, we could download it just\r\n // through 'createObjectURL', but the name would be autogenerated hash, and we want to\r\n // use the actual name.\r\n const parts = contentDisposition.split(\"; \");\r\n parts.forEach((p) => {\r\n if (p.startsWith(\"filename=\")) {\r\n const fileLink = document.createElement(\"a\");\r\n fileLink.href = URL.createObjectURL(blob);\r\n fileLink.download = p.replace(\"filename=\", \"\");\r\n fileLink.click();\r\n }\r\n });\r\n };\r\n\r\n this.downloadClientJsonAsFile = (filename, contentType, content) => {\r\n const file = new File([content], filename, { type: contentType });\r\n const exportUrl = URL.createObjectURL(file);\r\n\r\n // Create the element and click on it\r\n const a = document.createElement(\"a\");\r\n document.body.appendChild(a);\r\n a.href = exportUrl;\r\n a.download = filename;\r\n a.target = \"_self\";\r\n a.click();\r\n document.body.removeChild(a);\r\n\r\n // We don't need to keep the object URL, let's release the memory\r\n // On older versions of Safari, it seems you need to comment this line...\r\n URL.revokeObjectURL(exportUrl);\r\n };\r\n\r\n this.offerStoreCredentials = async (username, password) => {\r\n if (window.PasswordCredential) {\r\n var c = new PasswordCredential({ id: username, name: username, password });\r\n const cred = await navigator.credentials.store(c);\r\n }\r\n };\r\n\r\n this.initWebWorker = (handler, method) => {\r\n this.stopWebWorker();\r\n\r\n console.log(\"Initializing WebWorker.\");\r\n this._webWorker = new Worker(new URL(\"./worker.js\", import.meta.url));\r\n\r\n this._webWorker.onmessage = (msg) => {\r\n\r\n const accessToken = localStorage.getItem(\"accessToken\");\r\n if (accessToken) {\r\n try {\r\n handler.invokeMethodAsync(method, msg.data);\r\n } catch (e) {\r\n console.warn(\"Failed to call WebWorker callback: \" + e);\r\n }\r\n }\r\n };\r\n };\r\n\r\n this.stopWebWorker = () => {\r\n if (this._webWorker) {\r\n console.log(\"Stopping WebWorker.\");\r\n this._webWorker.terminate();\r\n this._webWorker = null;\r\n }\r\n };\r\n\r\n this.initWebWorkerSystemMessages = (handler, method) => {\r\n this.stopWebWorkerSystemMessage();\r\n\r\n console.log(\"Initializing WebWorker SystemMessage.\");\r\n this._webWorkerSystemMessage = new Worker(new URL(\"./workerSystemMessages.js\", import.meta.url));\r\n\r\n this._webWorkerSystemMessage.onmessage = (msg) => {\r\n\r\n handler.invokeMethodAsync(method, msg.data);\r\n \r\n }\r\n };\r\n\r\n\r\n this.stopWebWorkerSystemMessage = () => {\r\n if (this._webWorkerSystemMessage) {\r\n console.log(\"Stopping WebWorker SystemMessage.\");\r\n this._webWorkerSystemMessage.terminate();\r\n this._webWorkerSystemMessage = null;\r\n }\r\n };\r\n this.initWebWorkerPub = (handler, method) => {\r\n this.stopWebWorkerPub();\r\n\r\n console.log(\"Initializing WebWorkerPub.\");\r\n this._webWorkerPub = new Worker(new URL(\"./workerPub.js\", import.meta.url));\r\n\r\n this._webWorkerPub.onmessage = (msg) => {\r\n\r\n handler.invokeMethodAsync(method, msg.data);\r\n }\r\n };\r\n\r\n this.stopWebWorkerPub = () => {\r\n if (this._webWorkerPub) {\r\n console.log(\"Stopping WebWorkerPub.\");\r\n this._webWorkerPub.terminate();\r\n this._webWorkerPub = null;\r\n }\r\n };\r\n})();\r\n\r\n// Main interop touch points:\r\nwindow.attachEventHandler = (el, eventName, handler, method, prop, bubbling = false, useCapture = false) => {\r\n el.addEventListener(\r\n eventName,\r\n (e) => {\r\n if (bubbling || e.target === el) {\r\n if (prop) {\r\n handler.invokeMethodAsync(method, e.detail[prop]);\r\n } else {\r\n handler.invokeMethodAsync(method);\r\n }\r\n }\r\n },\r\n useCapture\r\n );\r\n};\r\n\r\nwindow.attachWindowMessageHandler = (handler, method) => {\r\n window.addEventListener(\"message\", (e) => {\r\n handler.invokeMethodAsync(method, e.data);\r\n });\r\n};\r\n\r\nwindow.sendWindowMessage = (msg) => {\r\n window.postMessage(msg, window.opener);\r\n};\r\n\r\nwindow.sendMessageToIframe = (iframe, msg) => {\r\n if (iframe && iframe.contentWindow) {\r\n iframe.contentWindow.postMessage(msg);\r\n }\r\n};\r\n\r\nwindow.getElementAttribute = (el, attrName, handler, method) => {\r\n handler.invokeMethodAsync(method, el[attrName]);\r\n};\r\n\r\nwindow.setElementAttribute = (el, attrName, value) => {\r\n el.setAttribute(attrName, value);\r\n};\r\n\r\nwindow.callMethodOnObject = (el, func, ...args) => {\r\n el[func](...args);\r\n};\r\n\r\nwindow.callFunc = (func, ...args) => {\r\n if (window.visitformmncJs[func]) {\r\n try {\r\n return window.visitformmncJs[func](...args);\r\n } catch (e) {\r\n console.warn(e);\r\n }\r\n } else {\r\n console.error(\"interop func not defined: \" + func);\r\n }\r\n};\r\n\r\n\r\nwindow.clientJsMethods = {\r\n RedirectTo: function (path) {\r\n if (release) {\r\n path = '/mnc' + path;\r\n }\r\n window.location = path;\r\n }\r\n};"]}