{"version":3,"file":"fetchers-CbDzPDm8.js","sources":["../src/lib/fetchers.js"],"sourcesContent":["import BootstrapModal from \"bootstrap/js/dist/modal\";\r\n\r\n// Common data loading tools and format conversions\r\n\r\nconst asyncLoadingTemplate = `\r\n
\r\n
\r\n \"Loading...\"\r\n
\r\n

   Loading...

\r\n
\r\n`;\r\nconst asyncErrorTemplate = `\r\n
\r\n
\r\n \r\n \r\n \r\n \r\n \r\n Sorry, there was a problem connecting to the server. Please try again later.\r\n
\r\n
\r\n`;\r\n\r\n/**\r\n * Calls fetch, but throws an error if unsuccessful\r\n * @returns {Response}\r\n */\r\nexport async function FetchWithErrors() {\r\n const response = await fetch.apply(null, arguments);\r\n if (!response.ok) {\r\n const err = new Error(\"HTTP request failed: \" + response.status);\r\n err.response = response;\r\n err.status = response.status;\r\n // If we got a JSON message prop back, use that as the error message\r\n try {\r\n const json = await response.json();\r\n if (json) {\r\n if (json.message) err.message = json.message;\r\n }\r\n } catch {\r\n // OK to ignore, we're going to throw anyway\r\n }\r\n throw err;\r\n }\r\n return response;\r\n}\r\n\r\n/**\r\n * Wrapper to de-jsonify and because MVC wants JSON requests to be posts\r\n */\r\nexport async function PostJSON(route, data, headers) {\r\n const response = await FetchWithErrors(route ?? window.location.href, {\r\n method: \"POST\",\r\n headers: headers ?? {\r\n \"Accept\": \"application/json\",\r\n \"Content-Type\": \"application/json\",\r\n \"X-Requested-With\": \"XMLHttpRequest\",\r\n },\r\n body: JSON.stringify(data),\r\n });\r\n return await response.json();\r\n}\r\n\r\n/**\r\n * Converts a Data URL to a File object\r\n * @param {string} dataurl DataURL, with content-type included\r\n * @param {string} fileName File's filename\r\n */\r\nasync function DataUrlToFile(dataurl, fileName) {\r\n const response = await fetch(dataurl);\r\n const buffer = await response.arrayBuffer();\r\n const file = new File([buffer], fileName, { type: response.headers.get(\"content-type\") });\r\n return file;\r\n}\r\n\r\n/**\r\n * @callback ProgressCallback\r\n * @param {Number} complete The fraction of work completed, 0-1\r\n */\r\n\r\n/**\r\n * Post a file to an endpoint as multipart form data\r\n * @param {String} route Endpoint to post to\r\n * @param {String} dataurl File contents in dataurl format\r\n * @param {String} fileName Filename to send as\r\n * @param {ProgressCallback} progressCallback Called when there is a progress update, with the percentage complete\r\n * @returns {String} Full response \r\n */\r\nexport async function PostMultipartFile(route, dataurl, fileName, progressCallback) {\r\n const file = await DataUrlToFile(dataurl, fileName);\r\n const formData = new FormData();\r\n formData.append(\"file\", file);\r\n // Need to use XMLHttpRequest because fetch doesn't support upload progress\r\n const request = new XMLHttpRequest();\r\n return new Promise((resolve, reject) => {\r\n request.upload.addEventListener(\"progress\", e => {\r\n progressCallback(e.loaded / e.total);\r\n });\r\n request.upload.addEventListener(\"error\", reject);\r\n request.upload.addEventListener(\"abort\", reject);\r\n request.upload.addEventListener(\"timeout\", reject);\r\n request.addEventListener(\"load\", () => {\r\n if (request.status >= 200 && request.status < 300) {\r\n resolve(request.response);\r\n } else {\r\n let message = \"Unable to upload the file\";\r\n try {\r\n const json = JSON.parse(request.response);\r\n if (json && json.message) message = json.message;\r\n } catch {\r\n // Didn't have a JSON response\r\n }\r\n reject(new Error(message));\r\n }\r\n\r\n });\r\n request.open(\"POST\", route);\r\n request.setRequestHeader(\"X-Requested-With\", \"XMLHttpRequest\");\r\n request.send(formData);\r\n });\r\n}\r\n\r\n/**\r\n * Loads a remote-generated modal, with loading and error display\r\n * @param {string} elementId ID of the modal element to replace contents of\r\n * @param {string} route Route to fetch the modal contents from\r\n * @param {boolean} isModal If true, will tell bootstrap to show and update the modal\r\n */\r\nexport async function LoadElementAsync(elementId, route, isModal = false) {\r\n // set the \"loading\" display\r\n const element = document.getElementById(elementId).querySelector(\"[data-replacement-target]\");\r\n element.innerHTML = asyncLoadingTemplate;\r\n\r\n let modal;\r\n if (isModal) {\r\n // tell bootstrap to display the modal\r\n modal = new BootstrapModal(\"#\" + elementId);\r\n modal.show();\r\n }\r\n\r\n try {\r\n // fetch and replace the modal html\r\n const response = await FetchWithErrors(route);\r\n const html = await response.text();\r\n element.innerHTML = html;\r\n } catch (err) {\r\n // set the \"error\" display\r\n element.innerHTML = asyncErrorTemplate;\r\n console.error(err);\r\n }\r\n if (isModal) {\r\n modal.handleUpdate();\r\n }\r\n}\r\n\r\n/**\r\n * Gets JSON, but also populates a loader element and, if necessary, an error response\r\n * @param {HTMLElement} statusElement An element to hold the loader/error. Cleared on success.\r\n * @param {string} route JSON route to fetch\r\n * @param {number | boolean} loadingHeight Explicitly set the loading div's height to the same height of the previous content. Set to true to use statusElement's height, or a number for explicit px.\r\n * @returns The data from the JSON route\r\n */\r\nexport async function PostJSONWithLoadError(statusElement, route, data, loadingHeight = false) {\r\n if (loadingHeight) {\r\n if (loadingHeight === true) loadingHeight = statusElement.offsetHeight;\r\n if (loadingHeight > 200) {\r\n statusElement.style.height = loadingHeight + \"px\";\r\n }\r\n }\r\n statusElement.innerHTML = asyncLoadingTemplate;\r\n try {\r\n const result = await PostJSON(route, data);\r\n statusElement.innerHTML = \"\";\r\n return result;\r\n } catch (err) {\r\n statusElement.innerHTML = asyncErrorTemplate;\r\n throw err;\r\n } finally {\r\n if (loadingHeight && loadingHeight > 200) {\r\n statusElement.style.height = null;\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Same as PostJSONWithLoadError, but for multiple loaders.\r\n * Weird case, shouldn't be used in general.\r\n * @param {Array} statusElements An array of elements to hold the loader/error. Cleared on success.\r\n * @param {string} route JSON route to fetch\r\n * @returns The data from the JSON route\r\n */\r\nexport async function PostJSONMultiLoader(statusElements, route) {\r\n statusElements.forEach(e => e.innerHTML = asyncLoadingTemplate);\r\n try {\r\n const result = await PostJSON(route);\r\n statusElements.forEach(e => e.innerHTML = \"\");\r\n return result;\r\n } catch (err) {\r\n statusElements.forEach(e => e.innerHTML = asyncErrorTemplate);\r\n throw err;\r\n }\r\n}\r\n"],"names":["asyncLoadingTemplate","asyncErrorTemplate","FetchWithErrors","_FetchWithErrors","apply","this","arguments","_asyncToGenerator","_regeneratorRuntime","mark","_callee","response","err","json","_args","wrap","_context","prev","next","fetch","sent","ok","Error","status","message","t0","abrupt","stop","PostJSON","_x","_x2","_x3","_PostJSON","_callee2","route","data","headers","_context2","window","location","href","method","Accept","body","JSON","stringify","DataUrlToFile","_x4","_x5","_DataUrlToFile","_callee3","dataurl","fileName","buffer","file","_context3","arrayBuffer","File","type","get","PostMultipartFile","_x6","_x7","_x8","_x9","_PostMultipartFile","_callee4","progressCallback","formData","request","_context4","FormData","append","XMLHttpRequest","Promise","resolve","reject","upload","addEventListener","e","loaded","total","parse","_unused2","open","setRequestHeader","send","LoadElementAsync","_x10","_x11","_LoadElementAsync","_callee5","elementId","isModal","element","modal","html","_args5","_context5","length","undefined","document","getElementById","querySelector","innerHTML","BootstrapModal","show","text","console","error","handleUpdate","PostJSONWithLoadError","_x12","_x13","_x14","_PostJSONWithLoadError","_callee6","statusElement","loadingHeight","result","_args6","_context6","offsetHeight","style","height","finish","PostJSONMultiLoader","_x15","_x16","_PostJSONMultiLoader","_callee7","statusElements","_context7","forEach"],"mappings":"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"}