{"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","webpack://silverstripe-base/./node_modules/jump.js/dist/jump.module.js"],"sourcesContent":["import * as validator from \"validate.js\";\nimport { scrollToIfNeeded } 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 ${messages[0]}\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 scrollToIfNeeded(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 \"@components/styled-form.css\";\nimport { 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","// Robert Penner's easeInOutQuad\n\n// find the rest of his easing functions here: http://robertpenner.com/easing/\n// find them exported for ES6 consumption here: https://github.com/jaxgeller/ez.js\n\nvar easeInOutQuad = function easeInOutQuad(t, b, c, d) {\n t /= d / 2;\n if (t < 1) return c / 2 * t * t + b;\n t--;\n return -c / 2 * (t * (t - 2) - 1) + b;\n};\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) {\n return typeof obj;\n} : function (obj) {\n return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n};\n\nvar jumper = function jumper() {\n // private variable cache\n // no variables are created during a jump, preventing memory leaks\n\n var element = void 0; // element to scroll to (node)\n\n var start = void 0; // where scroll starts (px)\n var stop = void 0; // where scroll stops (px)\n\n var offset = void 0; // adjustment from the stop position (px)\n var easing = void 0; // easing function (function)\n var a11y = void 0; // accessibility support flag (boolean)\n\n var distance = void 0; // distance of scroll (px)\n var duration = void 0; // scroll duration (ms)\n\n var timeStart = void 0; // time scroll started (ms)\n var timeElapsed = void 0; // time spent scrolling thus far (ms)\n\n var next = void 0; // next scroll position (px)\n\n var callback = void 0; // to call when done scrolling (function)\n\n // scroll position helper\n\n function location() {\n return window.scrollY || window.pageYOffset;\n }\n\n // element offset helper\n\n function top(element) {\n return element.getBoundingClientRect().top + start;\n }\n\n // rAF loop helper\n\n function loop(timeCurrent) {\n // store time scroll started, if not started already\n if (!timeStart) {\n timeStart = timeCurrent;\n }\n\n // determine time spent scrolling so far\n timeElapsed = timeCurrent - timeStart;\n\n // calculate next scroll position\n next = easing(timeElapsed, start, distance, duration);\n\n // scroll to it\n window.scrollTo(0, next);\n\n // check progress\n timeElapsed < duration ? window.requestAnimationFrame(loop) // continue scroll loop\n : done(); // scrolling is done\n }\n\n // scroll finished helper\n\n function done() {\n // account for rAF time rounding inaccuracies\n window.scrollTo(0, start + distance);\n\n // if scrolling to an element, and accessibility is enabled\n if (element && a11y) {\n // add tabindex indicating programmatic focus\n element.setAttribute('tabindex', '-1');\n\n // focus the element\n element.focus();\n }\n\n // if it exists, fire the callback\n if (typeof callback === 'function') {\n callback();\n }\n\n // reset time for next jump\n timeStart = false;\n }\n\n // API\n\n function jump(target) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n // resolve options, or use defaults\n duration = options.duration || 1000;\n offset = options.offset || 0;\n callback = options.callback; // \"undefined\" is a suitable default, and won't be called\n easing = options.easing || easeInOutQuad;\n a11y = options.a11y || false;\n\n // cache starting position\n start = location();\n\n // resolve target\n switch (typeof target === 'undefined' ? 'undefined' : _typeof(target)) {\n // scroll from current position\n case 'number':\n element = undefined; // no element to scroll to\n a11y = false; // make sure accessibility is off\n stop = start + target;\n break;\n\n // scroll to element (node)\n // bounding rect is relative to the viewport\n case 'object':\n element = target;\n stop = top(element);\n break;\n\n // scroll to element (selector)\n // bounding rect is relative to the viewport\n case 'string':\n element = document.querySelector(target);\n stop = top(element);\n break;\n }\n\n // resolve scroll distance, accounting for offset\n distance = stop - start + offset;\n\n // resolve duration\n switch (_typeof(options.duration)) {\n // number in ms\n case 'number':\n duration = options.duration;\n break;\n\n // function passed the distance of the scroll\n case 'function':\n duration = options.duration(distance);\n break;\n }\n\n // start the loop\n window.requestAnimationFrame(loop);\n }\n\n // expose only the jump method\n return jump;\n};\n\n// export singleton\n\nvar singleton = jumper();\n\nexport default singleton;\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","scrollToIfNeeded","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","setupForm","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","document","createElement","additionalPlaceholder","files","fieldPlaceholder","parentNode","insertBefore","click","maxLength","counter","count","appendChild","setupSpecialFields","documentElement","on","capture","preventDefault","formMessages","autoHideMessage","formData","FormData","ajax","url","action","body","post","json","res","ga","event","trackGoogleAnalytics","reset","formHideOnSubmit","scrollTo","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","rect","getBoundingClientRect","viewportHeight","window","innerHeight","clientHeight","isInViewport","top","bottom","is50PercentFromTop","generateQueryString","data","params","key","dataLayer","push","easeInOutQuad","t","b","c","d","_typeof","Symbol","iterator","obj","constructor","prototype","element","start","stop","easing","a11y","distance","timeStart","timeElapsed","next","loop","timeCurrent","requestAnimationFrame","arguments","scrollY","pageYOffset","jumper"],"sourceRoot":""}