{"version":3,"file":"js/form.js","mappings":"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","sources":["webpack://clienti-baseline-webpack/./src/scripts/partials/form.js","webpack://clienti-baseline-webpack/./src/scripts/form.js"],"sourcesContent":["/*************************************************/\r\n/* FORM */\r\n/*************************************************/\r\n\r\nexport function form(body, bodyLoadingClass) {\r\n const recaptchaResponseSelector = 'input[name=\"g-recaptcha-response\"]';\r\n const recaptchaFieldSelector = '.recaptchav3withscore';\r\n var stringToHTML = function (str) {\r\n var parser = new DOMParser();\r\n var doc = parser.parseFromString(str, 'text/html');\r\n return doc.body;\r\n };\r\n\r\n const insertUrlParam = function (key, value) {\r\n if (history.pushState) {\r\n let searchParams = new URLSearchParams(window.location.search);\r\n searchParams.set(key, value);\r\n let newurl = window.location.protocol + \"//\" + window.location.host + window.location.pathname + '?' + searchParams.toString();\r\n window.history.pushState({ path: newurl }, '', newurl);\r\n }\r\n }\r\n\r\n //There might be some things that seems trange regarding recaptcha, but that is because Umbraco is inconsistent with their implementation of form fields.\r\n //Also, the errors handling library that comes with Umbraco Forms is very closed off, so we have to handle the validation result manually\r\n const handleFormSubmission = function (e, formContainer, formElement) {\r\n e.preventDefault();\r\n\r\n if (formContainer != null) {\r\n const form = formElement;\r\n if (formContainer.classList.contains('form-item--generic')) {\r\n const error = form.querySelector('.field-validation-error');\r\n const hasErrors = error != null;\r\n const isRecaptchaError = error?.closest(recaptchaFieldSelector) != null; //Check if the only error is a recaptcha error\r\n const formsResponse = form.querySelector('.umbraco-forms-response');\r\n if (formsResponse != null) {\r\n formsResponse.remove();\r\n }\r\n\r\n if (!hasErrors || isRecaptchaError) { //Is there is no errors, or the only error is an invalid recaptcha, go ahead\r\n error?.closest(recaptchaFieldSelector).classList.remove('has-error'); //Remove the marked recaptcha error\r\n body.classList.add(bodyLoadingClass);\r\n const recaptchaResponse = form.querySelector(recaptchaResponseSelector)?.value;\r\n fetch(form.getAttribute('action'), {\r\n method: 'POST',\r\n body: new FormData(form),\r\n headers: {\r\n 'g-recaptcha-response': recaptchaResponse //This is sent for validation, and is necessary\r\n },\r\n }).then(response => {\r\n return response.text();\r\n }).then(data => {\r\n const responseBody = stringToHTML(data);\r\n\r\n const message = responseBody.querySelector('.umbraco-forms-submitmessage');\r\n if (message != null) {\r\n form.dispatchEvent(new Event('reset'));\r\n const div = document.createElement('div');\r\n div.classList.add('umbraco-forms-response', 'umbraco-forms-response--success');\r\n if (message != null) {\r\n div.textContent = message.textContent;\r\n }\r\n form.appendChild(div);\r\n window.dataLayer.push({\r\n 'event': 'formSubmission',\r\n 'formType':form.querySelector('input[name=\"FormName\"]').value\r\n });\r\n } else {\r\n const formParent = form.closest('.umbraco-forms-form');\r\n const responseForm = responseBody.querySelector('#' + formParent.id);\r\n\r\n const formErrors = responseForm.querySelectorAll('.field-validation-error')\r\n if (formErrors != null) {\r\n for (const formError of formErrors) {\r\n let isRecaptcha = false;\r\n const inputField = formError.closest('.umbraco-forms-field-wrapper').querySelector('input');\r\n let inputName = inputField.id;\r\n if(inputField.type == 'radio') {\r\n inputName = inputField.id.split('_')[0];\r\n }\r\n const originalInputField = document.querySelector('input[name=\"' + inputName + '\"]');\r\n if (originalInputField == null) {\r\n originalInputField = document.querySelector(recaptchaResponseSelector);\r\n isRecaptcha = true;\r\n }\r\n if (originalInputField != null) {\r\n originalInputField.classList.add('input-validation-error');\r\n\r\n const originalValidationMessage = originalInputField.closest('.umbraco-forms-field-wrapper').querySelector('span[class^=\"field-validation\"]');\r\n originalValidationMessage.classList.replace('field-validation-valid', 'field-validation-error');\r\n\r\n if (isRecaptcha) { //The recaptcha validation message is not stored in a data attribute, so we have to do this\r\n originalInputField.closest('.recaptchav3withscore').classList.add('has-error');\r\n originalValidationMessage.innerHTML = inputField.closest('.umbraco-forms-field-wrapper').querySelector('span[class^=\"field-validation\"]').innerHTML;\r\n\r\n } else {//If not a recaptcha, the error is a \"required\" error, as these are triggered before regex errors. \r\n originalValidationMessage.innerHTML = originalInputField.getAttribute('data-val-required');\r\n\r\n }\r\n if (originalInputField.hasAttribute('data-val-regex')) { //Check if this is a regex error.\r\n originalValidationMessage.innerHTML = originalInputField.getAttribute('data-val-regex');\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n body.classList.remove(bodyLoadingClass);\r\n\r\n\r\n\r\n }).catch(err => {\r\n console.log('Something went wrong in form.js');\r\n console.error(err);\r\n body.classList.remove(bodyLoadingClass);\r\n });\r\n }\r\n }\r\n }\r\n }\r\n\r\n const init = () => {\r\n // Umbraco uses jQuery to add an event listener to Umbraco Forms' submit events. There is not way of removing that event, and it will always fire before any event we add.\r\n const forms = document.querySelectorAll('form');\r\n for (const formEle of forms) {\r\n const formContainer = formEle.closest('.form-item--post-async');\r\n if (formContainer != null) {\r\n var submitButton = formEle.querySelector('input[type=\"submit\"]');\r\n submitButton.addEventListener('click', (e) => {\r\n handleFormSubmission(e, formContainer, formEle);\r\n });\r\n }\r\n\r\n };\r\n }\r\n\r\n init();\r\n}\r\n","/*************************************************/\r\n/* Partials */\r\n/*************************************************/\r\nimport { form } from \"./partials/form.js\";\r\n\r\n/*************************************************/\r\n/* Init */\r\n/*************************************************/\r\n\r\nconst ready = callback => {\r\n if (document.readyState != 'loading') callback();\r\n else document.addEventListener('DOMContentLoaded', callback);\r\n}\r\n\r\nready(() => {\r\n const body = document.querySelector(\"body\"),\r\n bodyLoadingClass = \"is-loading\";\r\n form(body, bodyLoadingClass);\r\n});\r\n"],"names":["form","body","bodyLoadingClass","recaptchaResponseSelector","recaptchaFieldSelector","handleFormSubmission","e","formContainer","formElement","preventDefault","classList","contains","error","querySelector","hasErrors","isRecaptchaError","closest","formsResponse","remove","add","recaptchaResponse","value","fetch","getAttribute","method","FormData","headers","then","response","text","data","str","responseBody","DOMParser","parseFromString","message","dispatchEvent","Event","div","document","createElement","textContent","appendChild","window","dataLayer","push","formParent","formErrors","id","querySelectorAll","formError","isRecaptcha","inputField","inputName","type","split","originalInputField","originalValidationMessage","replace","innerHTML","hasAttribute","err","console","log","formEle","addEventListener","init","callback","readyState"],"sourceRoot":""}