{"version":3,"file":"js/ajax-error-toast-2a5922698987f272cf4d.chunk.js","mappings":"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","sources":["webpack://agra/./app/javascript/helpers/url-params.js","webpack://agra/./app/javascript/components/toast.vue","webpack://agra/./app/javascript/components/toast.vue?dead","webpack://agra/./app/javascript/helpers/transform-object-keys.js","webpack://agra/./app/javascript/components/ajax-error-toast.vue","webpack://agra/./app/javascript/components/ajax-error-toast.vue?40c4","webpack://agra/./node_modules/vue-loader/dist/exportHelper.js","webpack://agra/./app/javascript/helpers/ajax.js"],"sourcesContent":["function urlWithParams(baseUrl, searchParamsMap) {\n const urlObj = new URL(baseUrl, window.location.origin)\n const urlSearchParams = urlObj.searchParams\n Object.entries(searchParamsMap).forEach(([k, v]) => {\n const stringValue = typeof v === 'string' ? v : JSON.stringify(v)\n urlSearchParams.append(k, stringValue)\n })\n\n // Deterministic ordering of url params. This is useful for when we check\n // the url with params in tests.\n urlSearchParams.sort()\n return urlObj.toString()\n}\n\nfunction urlParamsWithNamespace(paramsMap, namespace) {\n const newParamsMap = {}\n Object.entries(paramsMap).forEach(([k, v]) => {\n newParamsMap[`${namespace}[${k}]`] = v\n })\n return newParamsMap\n}\n\nexport {\n urlParamsWithNamespace,\n urlWithParams\n}\n","\n\n\n\n\n","import { render } from \"./toast.vue?vue&type=template&id=b2f9da20&scoped=true\"\nimport script from \"./toast.vue?vue&type=script&lang=js\"\nexport * from \"./toast.vue?vue&type=script&lang=js\"\n\nimport \"./toast.vue?vue&type=style&index=0&id=b2f9da20&lang=scss&scoped=true\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-b2f9da20\"]])\n\nexport default __exports__","import forEach from 'lodash/forEach' // this works on JS objects in addition to arrays\nimport isPlainObject from 'lodash/isPlainObject'\nimport camelCase from 'lodash/camelCase'\nimport snakeCase from 'lodash/snakeCase'\n\n// Warning: Only for serializable javascript objects without recursive references\n// otherwise will have infinite recursion + stack overflow.\n\nfunction makeObjectTransformer(transformWithFunction) {\n return function transformObjectKeys(sourceObject) {\n let transformedObject = {}\n if (Array.isArray(sourceObject)) {\n transformedObject = []\n }\n\n forEach(\n sourceObject,\n function(value, key) {\n if (isPlainObject(value) || Array.isArray(value)) { // checks that a value is a plain object or an array - for recursive key conversion\n value = transformObjectKeys(value) // recursively update keys of any values that are also objects\n }\n transformedObject[transformWithFunction(key)] = value\n }\n )\n return transformedObject\n }\n}\n\nconst objectKeysToCamelCase = makeObjectTransformer(camelCase)\nconst objectKeysToSnakeCase = makeObjectTransformer(snakeCase)\n\nexport {\n // For a plain JS object or array with snake_case keys,\n // recursively transform the keys to be camelCase instead.\n // Returns the transformed version.\n objectKeysToCamelCase,\n\n // For a plain JS object or array with camelCase keys,\n // recursively transform the keys to be snake_case instead.\n // Returns the transformed version.\n objectKeysToSnakeCase\n}\n","\n\n\n","import { render } from \"./ajax-error-toast.vue?vue&type=template&id=1f60e4a5\"\nimport script from \"./ajax-error-toast.vue?vue&type=script&lang=js\"\nexport * from \"./ajax-error-toast.vue?vue&type=script&lang=js\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n// runtime helper for setting properties on components\n// in a tree-shakable way\nexports.default = (sfc, props) => {\n const target = sfc.__vccOpts || sfc;\n for (const [key, val] of props) {\n target[key] = val;\n }\n return target;\n};\n","import { objectKeysToCamelCase } from './transform-object-keys'\nimport { urlWithParams } from './url-params'\n\nconst STATUS_ERROR = 'error'\nconst GET_VERB = 'GET'\nconst POST_VERB = 'POST'\nconst PATCH_VERB = 'PATCH'\nconst PUT_VERB = 'PUT'\nconst DELETE_VERB = 'DELETE'\nconst PARAMS_IN_BODY_METHODS = [POST_VERB, PATCH_VERB, PUT_VERB, DELETE_VERB]\n\nfunction get(options) {\n return ajaxBase({...options, method: GET_VERB})\n}\n\nfunction post(options) {\n return ajaxBase({...options, method: POST_VERB})\n}\n\nfunction patch(options) {\n return ajaxBase({...options, method: PATCH_VERB})\n}\n\nfunction put(options) {\n return ajaxBase({...options, method: PUT_VERB})\n}\n\nconst errorTypes = {\n FETCH_FAILED: 'fetchFailed',\n NOT_OK_HTTP_STATUS: 'nonOkHttpStatus'\n}\n\nasync function ajaxBase({url, params, method, headers, data: requestData, acceptContentType='application/json',\n successHandler, errorHandler = null, throwOnFailure = false, camelCaseResponse = true}) {\n // If we're doing a GET, encode the params in the URL. Otherwise, we'll encode into the request body\n const parameterizedUrl = (method === GET_VERB) ? urlWithParams(url, params || {}) : url\n\n // By default, do not set the `body` parameter. For GET and other methods that do not accept a body,\n // even setting `body: null` can cause errors in some browsers.\n const maybeBody = {}\n\n // by default, communicate with the server via json\n let contentType = 'application/json;charset=UTF-8'\n\n if (PARAMS_IN_BODY_METHODS.includes(method)) {\n if (requestData === undefined) {\n // We need to do send as URL encoded data, since we accept arbitrary params.\n maybeBody.body = new URLSearchParams(params).toString()\n contentType = 'application/x-www-form-urlencoded'\n } else {\n // Need to JSON.stringify the bodyData here or it will be serialized\n // as [object Object] by default\n maybeBody.body = JSON.stringify(requestData)\n }\n }\n\n let response = null\n try {\n response = await fetch(parameterizedUrl, {\n method,\n headers: {\n ...headers,\n ...maybeCsrfToken(),\n 'Accept': acceptContentType,\n 'Content-Type': contentType,\n credentials: 'same-origin'\n },\n ...maybeBody\n })\n } catch (e) {\n if (throwOnFailure) {\n throw e\n } else {\n document.dispatchEvent(new CustomEvent('agra:ajax-error', {detail: {errorType: errorTypes.FETCH_FAILED}}))\n return\n }\n }\n\n // Check that HTTP status is OK\n if (!response.ok) {\n let errorBody\n try {\n errorBody = await response.json()\n } catch {\n // couldn't parse JSON\n errorBody = {error: `Response status was ${response.status}`}\n }\n\n if (throwOnFailure) {\n throw errorBody\n } else {\n document.dispatchEvent(new CustomEvent('agra:ajax-error', {\n detail: {\n errorType: errorTypes.NOT_OK_HTTP_STATUS,\n httpStatusCode: response.status,\n message: errorBody.message\n }\n }))\n return\n }\n }\n\n // Parse the response body\n if (response.status === 204) {\n // No response body to parse. Call the provided success handler function and we're done.\n if (successHandler) {\n successHandler(null)\n }\n return\n }\n\n // Parse body as JSON if that's the expected response\n const jsonRegexContentType = /json/i\n if (jsonRegexContentType.test(acceptContentType)) {\n const jsonResponse = await response.json()\n\n const transformedResponse = camelCaseResponse ? objectKeysToCamelCase(jsonResponse) : jsonResponse\n\n if (Array.isArray(jsonResponse)) {\n // Send the array data to the provided success handler function\n if (successHandler) {\n successHandler(transformedResponse)\n }\n return\n }\n\n // If we get here, we can assume that the JSON data is a hash. Extract common fields from it.\n const { status, message, data, ...rest } = transformedResponse\n\n // If the response has \"status\": \"error\", that's a 'business logic' error that the caller should handle.\n // Send it to the provided error handler function. If we were not provided an error handler function,\n // throw an exception.\n if (status === STATUS_ERROR) {\n if (errorHandler) {\n errorHandler({ message, info: rest })\n return\n } else {\n let error = new Error(message)\n error.info = rest\n throw error\n }\n }\n\n // Send the body, minus the 'status', to the provided success handler function\n if (successHandler) {\n successHandler({ message, data, ...rest })\n }\n } else {\n // Send the body as unparsed text to the provided success handler function\n const bodyText = await response.text()\n if (successHandler) {\n successHandler(bodyText)\n }\n }\n}\n\nfunction maybeCsrfToken() {\n const tokenElement = document.querySelector('meta[name=\"csrf-token\"]')\n if (tokenElement) {\n return {\n 'X-CSRF-Token': tokenElement.getAttribute('content')\n }\n }\n else {\n return {}\n }\n}\n\nexport default {\n get,\n post,\n // We inline the delete method here because `delete` is a JS keyword\n delete: options => {\n return ajaxBase({...options, method: DELETE_VERB})\n },\n put,\n patch,\n\n errorTypes\n}\n"],"names":["urlWithParams","baseUrl","searchParamsMap","urlObj","URL","window","location","origin","urlSearchParams","searchParams","Object","entries","forEach","k","v","stringValue","JSON","stringify","append","sort","toString","urlParamsWithNamespace","paramsMap","namespace","newParamsMap","props","kind","type","String","required","default","showFixedTopRight","Boolean","showOnMount","data","show","mounted","this","showToast","methods","removeToast","setTimeout","_createBlock","_Transition","name","appear","_withCtx","$data","_createElementBlock","key","class","_normalizeClass","$props","_createElementVNode","_renderSlot","_ctx","$slots","undefined","_createCommentVNode","_","makeObjectTransformer","transformWithFunction","transformObjectKeys","sourceObject","transformedObject","Array","isArray","value","isPlainObject","objectKeysToCamelCase","camelCase","objectKeysToSnakeCase","snakeCase","components","Toast","messageForNonOkHttpStatus","inject","t","active","errorDetail","errorType","computed","errorMessage","ajax","errorTypes","FETCH_FAILED","i18n","NOT_OK_HTTP_STATUS","httpStatusCode","message","document","addEventListener","evt","detail","_component_toast","_createTextVNode","_toDisplayString","$options","exports","sfc","target","__vccOpts","val","POST_VERB","PATCH_VERB","DELETE_VERB","PARAMS_IN_BODY_METHODS","async","ajaxBase","url","params","method","headers","requestData","acceptContentType","successHandler","errorHandler","throwOnFailure","camelCaseResponse","parameterizedUrl","maybeBody","contentType","includes","body","URLSearchParams","response","fetch","maybeCsrfToken","credentials","e","dispatchEvent","CustomEvent","ok","errorBody","json","error","status","test","jsonResponse","transformedResponse","rest","info","Error","bodyText","text","tokenElement","querySelector","getAttribute","get","options","post","delete","put","patch"],"sourceRoot":""}