{"version":3,"file":"calculator-DX-sAGIV.js","sources":["../../../../../assets/default/js/editor/financial-lease-calculator/frontend.js"],"sourcesContent":["for (const form of document.querySelectorAll('[data-financial-lease-calculator]')) {\n let fetchController;\n const targets = document.querySelectorAll(form.dataset.target);\n\n form.addEventListener('input', (e) => {\n e.preventDefault();\n\n if (fetchController) {\n fetchController.abort('Already running a calculation.');\n }\n\n fetchController = new AbortController();\n\n const input = e.target;\n if (input.hasAttribute('max')) {\n let price = input.value.replaceAll(',', '.');\n price = price.replaceAll(' ', '');\n price = price.replaceAll(/[,.](?!\\d{1,2}$)/gi, '');\n\n if (Number.parseFloat(price) > Number.parseFloat(input.max)) {\n input.value = new Intl.NumberFormat('nl-NL', { maximumFractionDigits: 2, minimumFractionDigits: 2 }).format(input.max);\n }\n }\n\n // Prevent unnecessary calculations\n if (form.querySelector('input[name=grossInvestment]').value === '') {\n return;\n }\n\n for (const formFieldWithError of form.querySelectorAll('.form-field.error')) {\n formFieldWithError.classList.remove('error');\n }\n\n // Remove all previous error messages\n for (const formErrorContainer of form.querySelectorAll('.form-field-error-container')) {\n formErrorContainer.remove();\n }\n\n fetch('/financial-lease/calculate', {\n method: 'POST',\n body: new FormData(form),\n signal: fetchController.signal,\n })\n .then((response) => {\n if (!response.ok) {\n if (response.headers.get('Content-Type').includes('application/json')) {\n return Promise.reject(response);\n }\n\n throw new Error('Failed to calculate due to an invalid response from the server');\n }\n\n return response.json();\n })\n .then((json) => {\n for (const target of targets) {\n if (target.tagName === 'INPUT') {\n target.value = json.monthlyPayment;\n } else {\n target.innerText = json.monthlyPayment;\n }\n }\n })\n .catch(async (exception) => {\n if (typeof exception === 'string' && exception.includes('Aborted')) {\n return;\n }\n\n if (!(exception instanceof Response)) {\n console.error(exception);\n return;\n }\n\n const errors = await exception.json();\n\n if (!Object.hasOwn(errors, 'formErrors')) {\n console.error('Received a response but did not match expectations.', errors);\n }\n\n for (const fieldName in errors['formErrors']) {\n const messages = errors['formErrors'][fieldName];\n const formField = form.querySelector(`[name=\"${fieldName}\"]`);\n formField.classList.add('error');\n\n const formFieldErrorContainer = document.createElement('ul');\n formFieldErrorContainer.classList.add('form-field-error-container', 'col-span-2', 'text-right');\n\n for (const message of messages) {\n const formFieldError = document.createElement('li');\n formFieldError.classList.add('text-sm', 'text-red-600', 'dark:text-red-500');\n formFieldError.innerText = message;\n formFieldErrorContainer.appendChild(formFieldError);\n }\n\n formField.closest('.form-group').append(formFieldErrorContainer);\n }\n });\n });\n\n form.dispatchEvent(new Event('input'));\n\n const submitButton = form.querySelector('[type=submit]');\n if (submitButton !== null) {\n submitButton.hidden = true;\n submitButton.classList.add('hidden');\n submitButton.classList.remove('action-btn');\n }\n}\n"],"names":["form","fetchController","targets","e","input","price","formFieldWithError","formErrorContainer","response","json","target","exception","errors","fieldName","messages","formField","formFieldErrorContainer","message","formFieldError","submitButton"],"mappings":"+XAAA,UAAWA,KAAQ,SAAS,iBAAiB,mCAAmC,EAAG,CAC/E,IAAIC,EACJ,MAAMC,EAAU,SAAS,iBAAiBF,EAAK,QAAQ,MAAM,EAE7DA,EAAK,iBAAiB,QAAUG,GAAM,CAClCA,EAAE,eAAgB,EAEdF,GACAA,EAAgB,MAAM,gCAAgC,EAG1DA,EAAkB,IAAI,gBAEtB,MAAMG,EAAQD,EAAE,OAChB,GAAIC,EAAM,aAAa,KAAK,EAAG,CAC3B,IAAIC,EAAQD,EAAM,MAAM,WAAW,IAAK,GAAG,EAC3CC,EAAQA,EAAM,WAAW,IAAK,EAAE,EAChCA,EAAQA,EAAM,WAAW,qBAAsB,EAAE,EAE7C,OAAO,WAAWA,CAAK,EAAI,OAAO,WAAWD,EAAM,GAAG,IACtDA,EAAM,MAAQ,IAAI,KAAK,aAAa,QAAS,CAAE,sBAAuB,EAAG,sBAAuB,CAAG,CAAA,EAAE,OAAOA,EAAM,GAAG,EAErI,CAGQ,GAAIJ,EAAK,cAAc,6BAA6B,EAAE,QAAU,GAIhE,WAAWM,KAAsBN,EAAK,iBAAiB,mBAAmB,EACtEM,EAAmB,UAAU,OAAO,OAAO,EAI/C,UAAWC,KAAsBP,EAAK,iBAAiB,6BAA6B,EAChFO,EAAmB,OAAQ,EAG/B,MAAM,6BAA8B,CAChC,OAAQ,OACR,KAAM,IAAI,SAASP,CAAI,EACvB,OAAQC,EAAgB,MAC3B,CAAA,EACI,KAAMO,GAAa,CAChB,GAAI,CAACA,EAAS,GAAI,CACd,GAAIA,EAAS,QAAQ,IAAI,cAAc,EAAE,SAAS,kBAAkB,EAChE,OAAO,QAAQ,OAAOA,CAAQ,EAGlC,MAAM,IAAI,MAAM,gEAAgE,CACpG,CAEgB,OAAOA,EAAS,KAAM,CACzB,CAAA,EACA,KAAMC,GAAS,CACZ,UAAWC,KAAUR,EACbQ,EAAO,UAAY,QACnBA,EAAO,MAAQD,EAAK,eAEpBC,EAAO,UAAYD,EAAK,cAGnC,CAAA,EACA,MAAM,MAAOE,GAAc,CACxB,GAAI,OAAOA,GAAc,UAAYA,EAAU,SAAS,SAAS,EAC7D,OAGJ,GAAI,EAAEA,aAAqB,UAAW,CAClC,QAAQ,MAAMA,CAAS,EACvB,MACpB,CAEgB,MAAMC,EAAS,MAAMD,EAAU,KAAM,EAEhC,OAAO,OAAOC,EAAQ,YAAY,GACnC,QAAQ,MAAM,sDAAuDA,CAAM,EAG/E,UAAWC,KAAaD,EAAO,WAAe,CAC1C,MAAME,EAAWF,EAAO,WAAcC,CAAS,EACzCE,EAAYf,EAAK,cAAc,UAAUa,CAAS,IAAI,EAC5DE,EAAU,UAAU,IAAI,OAAO,EAE/B,MAAMC,EAA0B,SAAS,cAAc,IAAI,EAC3DA,EAAwB,UAAU,IAAI,6BAA8B,aAAc,YAAY,EAE9F,UAAWC,KAAWH,EAAU,CAC5B,MAAMI,EAAiB,SAAS,cAAc,IAAI,EAClDA,EAAe,UAAU,IAAI,UAAW,eAAgB,mBAAmB,EAC3EA,EAAe,UAAYD,EAC3BD,EAAwB,YAAYE,CAAc,CAC1E,CAEoBH,EAAU,QAAQ,aAAa,EAAE,OAAOC,CAAuB,CACnF,CACA,CAAa,EACb,CAAK,EAEDhB,EAAK,cAAc,IAAI,MAAM,OAAO,CAAC,EAErC,MAAMmB,EAAenB,EAAK,cAAc,eAAe,EACnDmB,IAAiB,OACjBA,EAAa,OAAS,GACtBA,EAAa,UAAU,IAAI,QAAQ,EACnCA,EAAa,UAAU,OAAO,YAAY,EAElD"}