{"version":3,"file":"components-styled-form.js","mappings":"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","sources":["webpack://silverstripe-base/./themes/app/src/scripts/common/validation.js","webpack://silverstripe-base/./themes/app/src/components/styled-form.js","webpack://silverstripe-base/./themes/app/src/scripts/common/ajax.js","webpack://silverstripe-base/./themes/app/src/scripts/common/scroll-to.js","webpack://silverstripe-base/./themes/app/src/scripts/common/util.js"],"sourcesContent":["import * as validator from \"validate.js\";\nimport scrollTo from \"@common/scroll-to\";\n\nvalidator.validators.checkboxGroup = function (_, group) {\n if (group) {\n const checked = group.querySelectorAll(\"input[type=checkbox]:checked\");\n\n if (checked.length) {\n return null;\n }\n }\n\n return \"^Please select one\";\n};\n\nconst findFieldWrapper = (el) => {\n if (el) {\n if (el.closest(\".form-field-wrapper\")) {\n return el.closest(\".form-field-wrapper\");\n }\n\n if (el.closest(\".form-field\")) {\n return el.closest(\".form-field\");\n }\n\n if (el.closest(\".middleColumn\")) {\n return el.closest(\".middleColumn\");\n }\n\n if (el.closest(\".field\")) {\n return el.closest(\".field\");\n }\n }\n};\n\nexport const handleBlur = (e) => {\n const fieldWrapper = findFieldWrapper(e.target);\n\n if (fieldWrapper) {\n fieldWrapper.classList.remove(\"has-error\");\n\n const existingErrorMessage = fieldWrapper.querySelector(\".form-field-message\");\n\n if (existingErrorMessage) {\n existingErrorMessage.remove();\n }\n }\n\n if (e.target.classList.contains(\"has-error\")) {\n e.target.classList.remove(\"has-error\");\n }\n};\n\nexport const buildRules = (form) => {\n const rules = {};\n\n form\n .querySelectorAll(\"[required], input.required-if, .js-dropdown.required-if select, .optionset.required-if input\")\n .forEach((field) => {\n // Ignore hidden fields\n if ((findFieldWrapper(field) && findFieldWrapper(field).offsetHeight === 0) || field.getAttribute(\"readonly\")) {\n return;\n }\n\n const fieldName = field.dataset.name ? field.dataset.name : field.name;\n\n rules[fieldName] = {\n presence: {\n allowEmpty: false,\n message: \"^Required\",\n },\n };\n\n if (field.type === \"email\") {\n rules[field.name].email = true;\n }\n });\n\n form.querySelectorAll(\"[pattern]\").forEach((field) => {\n // Ignore hidden fields\n if (findFieldWrapper(field).offsetHeight === 0 || field.readonly) {\n return;\n }\n\n rules[field.name] = {\n format: {\n pattern: field.getAttribute(\"pattern\"),\n message: \"^Required\",\n },\n };\n });\n\n form.querySelectorAll(\"[min]\").forEach((field) => {\n // Ignore hidden fields\n if (findFieldWrapper(field).offsetHeight === 0 || field.readonly) {\n return;\n }\n\n rules[field.name] = {\n length: {\n minimum: parseInt(field.min),\n },\n };\n });\n\n form.querySelectorAll(\"[data-equals]\").forEach((field) => {\n // Ignore hidden fields\n if (findFieldWrapper(field).offsetHeight === 0 || field.readonly) {\n return;\n }\n\n rules[field.name] = {\n equality: field.dataset.equals,\n };\n });\n\n form.querySelectorAll(\"[aria-required], [data-required]\").forEach((field) => {\n // Ignore hidden fields\n if ((findFieldWrapper(field) && findFieldWrapper(field).offsetHeight === 0) || field.readonly) {\n return;\n }\n\n if (field.classList.contains(\"optionset\")) {\n const radio = field.querySelector(\"input[type=radio]\");\n const checkbox = field.querySelector(\"input[type=checkbox]\");\n\n if (radio) {\n rules[radio.name] = {\n presence: {\n message: \"^Required\",\n },\n };\n }\n\n if (checkbox) {\n rules[checkbox.name] = {\n checkboxGroup: checkbox.closest(\".optionset\"),\n };\n }\n }\n });\n\n form.querySelectorAll(\".requiredcheckboxset\").forEach((field) => {\n // Ignore hidden fields\n if ((findFieldWrapper(field) && findFieldWrapper(field).offsetHeight === 0) || field.readonly) {\n return;\n }\n\n const checkbox = field.querySelector(\"input[type=checkbox]\");\n\n if (checkbox) {\n rules[checkbox.name] = {\n checkboxGroup: checkbox.closest(\".requiredcheckboxset\"),\n };\n }\n });\n\n return rules;\n};\n\nexport const handleValidation = (form) => {\n const rules = buildRules(form);\n const result = validate(form, rules);\n\n if (result !== undefined) {\n for (const [name, messages] of Object.entries(result)) {\n const field = form.querySelector(`[name=\"${name}\"]`);\n const fieldWrapper = findFieldWrapper(field);\n\n // Place error message\n if (fieldWrapper) {\n const existingErrorMessage = fieldWrapper.querySelector(\".form-field-message\");\n\n if (existingErrorMessage) {\n existingErrorMessage.remove();\n }\n\n const message = `\n
\n `;\n fieldWrapper.insertAdjacentHTML(\"beforeend\", message);\n fieldWrapper.classList.add(\"has-error\");\n }\n\n field.classList.add(\"has-error\");\n }\n\n const shouldScroll = form.dataset.formScroll !== undefined;\n\n const firstError = form.querySelector(\".has-error\");\n\n if (shouldScroll && firstError) {\n scrollTo(firstError, 150, () => {\n setTimeout(() => {\n firstError.querySelector(\"input\") && firstError.querySelector(\"input\").focus();\n }, 0);\n });\n }\n\n return false;\n }\n\n return true;\n};\n\nexport const validate = validator;\n","import { on, fire } from \"delegated-events\";\nimport { handleValidation, handleBlur } from \"@common/validation\";\nimport ajax from \"@common/ajax\";\nimport scrollTo from \"@common/scroll-to\";\nimport { trackGoogleAnalytics } from \"@common/util\";\n\nconst setupDropdowns = async (form) => {\n const dropdowns = form.querySelectorAll(\".js-dropdown, .userform .field.dropdown\");\n\n if (!dropdowns.length) {\n return;\n }\n\n const { default: easydropdown } = await import(\"easydropdown-a11y\");\n import(\"@styles/components/dropdown.css\");\n\n dropdowns.forEach((el) => {\n const select = el.querySelector(\"select\");\n\n if (!select) {\n return;\n }\n\n const placeholder = el.querySelector('option[value=\"\"]');\n\n if (placeholder && !placeholder.hasAttribute(\"data-placeholder\")) {\n placeholder.setAttribute(\"data-placeholder\", true);\n\n if (!placeholder.textContent) {\n placeholder.textContent = \"Select One\";\n }\n }\n\n const opts = {\n behavior: {\n openOnFocus: true,\n maxVisibleItems: 8,\n liveUpdates: true,\n useNativeUiOnMobile: false,\n },\n };\n\n easydropdown(select, opts);\n });\n};\n\nconst setupMasks = async (form) => {\n const fields = form.querySelectorAll('input[type=\"tel\"], input[data-currency]');\n\n if (!fields.length) {\n return;\n }\n\n const { default: IMask } = await import(\"imask/esm/imask\");\n await import(\"imask/esm/masked/number\");\n await import(\"imask/esm/masked/pattern\");\n\n fields.forEach((field) => {\n if (field.type === \"tel\") {\n IMask(field, {\n mask: \"(000) 000-0000\",\n });\n }\n\n if (field.dataset.currency !== undefined) {\n const mask = IMask(field, {\n mask: Number,\n scale: 0,\n thousandsSeparator: \",\",\n min: 1,\n });\n\n field.addEventListener(\"updateValue\", (e) => {\n field.value = e.detail;\n mask.updateValue();\n field.dispatchEvent(new Event(\"blur\"));\n });\n }\n });\n};\n\nconst setupSpecialFields = (form) => {\n // Setup file inputs\n form.querySelectorAll(\"input[type=file]\").forEach((input) => {\n const placeholder = document.createElement(\"div\");\n placeholder.classList.add(\"file-input-placeholder\");\n\n const additionalPlaceholder = input.dataset.additionalPlaceholder;\n\n if (input.value) {\n placeholder.textContent = input.files[0].name;\n } else {\n let fieldPlaceholder = input.placeholder;\n\n if (!fieldPlaceholder) {\n fieldPlaceholder = \"Select File\";\n }\n\n placeholder.innerHTML = `${fieldPlaceholder}`;\n\n if (additionalPlaceholder !== undefined) {\n placeholder.innerHTML += additionalPlaceholder;\n }\n }\n\n input.parentNode.insertBefore(placeholder, input);\n\n placeholder.addEventListener(\"click\", () => input.click());\n\n input.addEventListener(\"change\", (e) => {\n if (e.target.files[0]) {\n placeholder.textContent = e.target.files[0].name;\n }\n });\n });\n\n form.querySelectorAll(\".form-field-wrapper.has-length-limit\").forEach((field) => {\n const input = field.querySelector(\".has-length-limit\");\n\n if (input && input.maxLength) {\n const counter = document.createElement(\"div\");\n counter.classList.add(\"length-limit-counter\");\n\n const count = document.createElement(\"span\");\n count.textContent = `(${input.value.length}/${input.maxLength})`;\n\n counter.appendChild(count);\n\n field.querySelector(\".form-field\").appendChild(counter);\n }\n });\n};\n\nconst handleLengthLimit = (e) => {\n const $input = e.target.closest(\".has-length-limit\");\n const $field = $input.closest(\".field.has-length-limit\");\n\n if ($input && $field) {\n const $count = $field.querySelector(\".length-limit-counter span\");\n $count.textContent = `(${$input.value.length}/${$input.maxLength})`;\n }\n};\n\nconst handleToggle = (e) => {\n const form = e.target.closest(\"form\");\n const field = e.target;\n const name = e.target.name;\n const selectedValue = e.target.value;\n\n form.querySelectorAll(`[data-toggle-if^=\"${name}|\"]`).forEach((input) => {\n const toggleGroup = input.closest(\".toggle-group\");\n let shouldShow = false;\n\n if (!toggleGroup) {\n return;\n }\n\n if (field.type === \"radio\") {\n const targetValues = input.dataset.toggleIf.split(\"|\");\n targetValues.shift();\n shouldShow = targetValues.indexOf(selectedValue) !== -1;\n }\n\n if (field.type === \"checkbox\") {\n shouldShow = field.checked;\n }\n\n if (shouldShow) {\n toggleGroup.classList.remove(\"hidden\");\n } else {\n toggleGroup.classList.add(\"hidden\");\n\n toggleGroup.querySelectorAll(\"input:not([type=checkbox]):not([type=radio])\").forEach((x) => (x.value = null));\n\n toggleGroup.querySelectorAll(\"input:checked\").forEach((x) => {\n if (!toggleGroup.classList.contains(\"ignore-clear\")) {\n x.checked = false;\n }\n\n form.querySelectorAll(`[data-toggle-if^=\"${x.name}|\"]`).forEach((input) => {\n const toggleGroup = input.closest(\".toggle-group\");\n toggleGroup.classList.add(\"hidden\");\n\n toggleGroup.querySelectorAll(\"input:not([type=checkbox]):not([type=radio])\").forEach((x) => (x.value = null));\n });\n });\n }\n });\n};\n\nconst toggleSubmit = (submitButton) => {\n submitButton.disabled = !submitButton.disabled;\n submitButton.classList.toggle(\"btn-loading\");\n};\n\nconst showFormMessages = (holder, message, success, autoHide) => {\n holder.style.display = \"block\";\n holder.innerHTML = message;\n\n if (success) {\n holder.classList.remove(\"form-message-error\");\n } else {\n holder.classList.add(\"form-message-error\");\n }\n\n if (autoHide) {\n setTimeout(() => {\n holder.style.display = \"none\";\n }, 5000);\n }\n};\n\nconst handleAjaxSubmit = (e) => {\n e.preventDefault();\n\n const form = e.target;\n const isValid = handleValidation(form);\n\n if (isValid) {\n const formMessages = form.querySelector(\".form-messages\");\n const submitButton = form.querySelector(\"[type=submit]\");\n let autoHideMessage = form.dataset.autoHideMessage ? form.dataset.autoHideMessage === \"true\" : true;\n toggleSubmit(submitButton);\n\n const formData = new FormData(form);\n\n ajax\n .url(form.action)\n .body(formData)\n .post()\n .json((res) => {\n if (res.success) {\n if (res.ga) {\n res.ga.forEach((event) => trackGoogleAnalytics(event));\n }\n\n form.reset();\n form.querySelectorAll(\"select\").forEach((x) => (x.value = null));\n form.querySelectorAll(\".toggle-fields\").forEach((x) => x.classList.add(\"hidden\"));\n form.querySelectorAll(\".toggle-group\").forEach((x) => x.classList.add(\"hidden\"));\n\n if (form.dataset.formHideOnSubmit) {\n form.querySelectorAll(\".form-content\").forEach((x) => x.classList.add(\"hidden\"));\n document.querySelectorAll(\".hide-on-form-submit\").forEach((x) => x.classList.add(\"hidden\"));\n autoHideMessage = false;\n\n const shouldScroll = form.dataset.formScroll !== undefined;\n\n if (shouldScroll) {\n scrollTo(document.body, 32);\n }\n }\n\n // Allow other scripts to hook into this submit\n fire(document.documentElement, \"ajaxform:submit\", {\n form: form,\n type: \"post\",\n url: new URL(form.action),\n queryParameters: new URLSearchParams(formData).toString(),\n });\n }\n\n if (res.message) {\n showFormMessages(formMessages, res.message, res.success, autoHideMessage);\n }\n })\n .catch(() => {\n showFormMessages(formMessages, \"Sorry, there was a problem with your submission\");\n })\n .finally(() => {\n toggleSubmit(submitButton);\n });\n }\n};\n\nconst handleSubmit = (e) => {\n const form = e.target;\n const isValid = handleValidation(form);\n const submitButton = form.querySelector(\"[type=submit]\");\n toggleSubmit(submitButton);\n\n if (!isValid) {\n e.preventDefault();\n toggleSubmit(submitButton);\n }\n};\n\nconst setupForm = (form) => {\n if (form) {\n setupDropdowns(form);\n setupMasks(form);\n setupSpecialFields(form);\n }\n};\n\nconst init = () => {\n if (!document.documentElement.classList.contains(\"did-form-init\")) {\n document.querySelectorAll(\".styled-form\").forEach((form) => {\n setupForm(form);\n });\n\n on(\"blur\", \".has-error\", handleBlur, { capture: true });\n on(\"change\", \".has-error\", handleBlur, { capture: true });\n on(\"change\", \".has-error blur\", handleBlur, {\n capture: true,\n });\n on(\"submit\", \".styled-form[data-form-ajax]\", handleAjaxSubmit);\n on(\"submit\", \".styled-form:not([data-form-ajax]):not(.userform)\", handleSubmit);\n on(\"change\", \"input[type=radio]\", handleToggle);\n on(\"change\", \"input[type=checkbox]\", handleToggle);\n on(\"keyup\", \"textarea.has-length-limit\", handleLengthLimit, {\n capture: true,\n });\n\n document.documentElement.classList.add(\"did-form-init\");\n }\n};\n\ninit();\n\nexport { setupForm };\n","import wretch from 'wretch'\nimport QueryStringAddon from 'wretch/addons/queryString'\n\nwretch.options({\n headers: { 'X-Requested-With': 'XMLHttpRequest' },\n})\n\nexport default wretch().addon(QueryStringAddon)\n","import jump from \"jump.js\";\n\nconst getPageOffset = () => {\n let offset = 0;\n\n const siteHeader = document.querySelector(\".site-header\");\n\n if (siteHeader) {\n const siteHeaderHeight = getComputedStyle(document.documentElement).getPropertyValue(\"--site-header-height\");\n\n offset += parseInt(siteHeaderHeight);\n }\n\n return offset;\n};\n\nconst scrollTo = (target, additionalOffset = 0) => {\n const pageOffset = getPageOffset() * -1;\n\n if (target.dataset.scrollOffset) {\n additionalOffset = parseInt(target.dataset.scrollOffset);\n }\n\n let offset = pageOffset - additionalOffset;\n\n return new Promise((resolve) => {\n jump(target, {\n duration: 600,\n offset,\n callback: () => {\n resolve();\n },\n });\n });\n};\n\nexport const scrollToIfNeeded = (target, additionalOffset = 0) => {\n const rect = target.getBoundingClientRect();\n const viewportHeight = window.innerHeight || document.documentElement.clientHeight;\n const isInViewport = rect.top >= 0 && rect.bottom <= viewportHeight;\n const is50PercentFromTop = rect.top <= viewportHeight / 2;\n\n if (!isInViewport || !is50PercentFromTop) {\n return scrollTo(target, additionalOffset);\n }\n};\n\nexport default scrollTo;\n","export const isTouchDevice = \"ontouchstart\" in document.documentElement;\n\nexport const generateQueryString = (data = {}) => {\n let params = data;\n\n if (data instanceof FormData === true) {\n params = {};\n\n data.forEach((value, key) => (params[key] = value));\n }\n\n for (const key in params) {\n if (params[key] === \"\") {\n delete params[key];\n }\n }\n\n return new URLSearchParams(params);\n};\n\nexport const trackGoogleAnalytics = (event) => {\n if (window.dataLayer) {\n window.dataLayer.push(event);\n }\n};\n"],"names":["validator","checkboxGroup","_","group","querySelectorAll","length","findFieldWrapper","el","closest","handleBlur","e","fieldWrapper","target","classList","remove","existingErrorMessage","querySelector","contains","handleValidation","form","rules","forEach","field","offsetHeight","getAttribute","fieldName","dataset","name","presence","allowEmpty","message","type","email","readonly","format","pattern","minimum","parseInt","min","equality","equals","radio","checkbox","buildRules","result","validate","undefined","messages","Object","entries","insertAdjacentHTML","add","shouldScroll","formScroll","firstError","scrollTo","setTimeout","focus","handleToggle","selectedValue","value","input","toggleGroup","shouldShow","targetValues","toggleIf","split","shift","indexOf","checked","x","toggleSubmit","submitButton","disabled","toggle","showFormMessages","holder","success","autoHide","style","display","innerHTML","document","documentElement","async","dropdowns","default","easydropdown","select","placeholder","hasAttribute","setAttribute","textContent","behavior","openOnFocus","maxVisibleItems","liveUpdates","useNativeUiOnMobile","setupDropdowns","fields","IMask","mask","currency","Number","scale","thousandsSeparator","addEventListener","detail","updateValue","dispatchEvent","Event","setupMasks","createElement","additionalPlaceholder","files","fieldPlaceholder","parentNode","insertBefore","click","maxLength","counter","count","appendChild","setupSpecialFields","setupForm","on","capture","preventDefault","formMessages","autoHideMessage","formData","FormData","ajax","url","action","body","post","json","res","ga","event","trackGoogleAnalytics","reset","formHideOnSubmit","fire","URL","queryParameters","URLSearchParams","toString","catch","finally","isValid","$input","$field","wretch","options","headers","addon","QueryStringAddon","additionalOffset","pageOffset","getPageOffset","offset","siteHeaderHeight","getComputedStyle","getPropertyValue","scrollOffset","Promise","resolve","jump","duration","callback","scrollToIfNeeded","rect","getBoundingClientRect","viewportHeight","window","innerHeight","clientHeight","isInViewport","top","bottom","is50PercentFromTop","isTouchDevice","generateQueryString","data","params","key","dataLayer","push"],"sourceRoot":""}