{"version":3,"file":"site.js","sources":["../src/bling.js","../src/docReady.js","../src/fairgoForms.js","../src/site.js"],"sourcesContent":["// Adds Jquery esq syntax via standard browser tooling\r\nwindow.$ = document.querySelectorAll.bind(document);\r\n\r\nNode.prototype.on = window.on = function (name, fn) {\r\n this.addEventListener(name, fn);\r\n}\r\n\r\nNodeList.prototype.__proto__ = Array.prototype;\r\n\r\nNodeList.prototype.on = NodeList.prototype.addEventListener = function (name, fn) {\r\n this.forEach(function (elem, i) {\r\n elem.on(name, fn);\r\n });\r\n}","const docReady = fn => {\r\n // see if DOM is already available\r\n if (document.readyState === \"complete\" || document.readyState === \"interactive\") {\r\n // call on next available tick\r\n setTimeout(fn, 1);\r\n } else {\r\n document.addEventListener(\"DOMContentLoaded\", fn);\r\n }\r\n};\r\n\r\nwindow.docReady = docReady;","const bootstrapValidation = (formSelector, validationRules = {}, errors) => {\r\n const formGroupClass = \".form-group\";\r\n const formControlClass = \".form-control\";\r\n const validationMessageClass = \".validation-message\";\r\n const formGroups = $(`${formSelector} ${formGroupClass}`);\r\n const visitedClass = \"visited\";\r\n const inputTouchedClass = \"touched\";\r\n const invalidClass = \"invalid\";\r\n const noValueClass = \"no-value\";\r\n const runValidationAttribute = \"data-run-validation\";\r\n\r\n const handleErrorMessage = (inputElement, validationMessages) => {\r\n const event = new CustomEvent('FairgoValidation', {detail: validationMessages});\r\n inputElement.dispatchEvent(event);\r\n \r\n inputElement.setCustomValidity(validationMessages[0] || \"\");\r\n };\r\n\r\n const checkCustomValidity = (inputElement, formGroupElement) => {\r\n const funcThatReturnsEmptyArray = () => ([]);\r\n const otherInputsWithinFormGroupElement = formGroupElement.querySelectorAll(formControlClass);\r\n const formGroupControlClasses = formGroups.map(formGroup => {\r\n return formGroup.querySelectorAll(formControlClass)\r\n });\r\n const validationMessagesGetter = (validationRules[inputElement.name] || funcThatReturnsEmptyArray);\r\n const validationMessages = validationMessagesGetter(inputElement, otherInputsWithinFormGroupElement, formGroupControlClasses);\r\n \r\n handleErrorMessage(inputElement, validationMessages);\r\n };\r\n\r\n const updateInputValidityInDom = (inputElement, formGroupElement) => {\r\n const isInputValid = inputElement.checkValidity();\r\n const validationMessageElementList = formGroupElement.querySelectorAll(validationMessageClass);\r\n \r\n if (isInputValid) {\r\n formGroupElement.classList.remove(invalidClass);\r\n } else {\r\n formGroupElement.classList.add(invalidClass);\r\n }\r\n\r\n validationMessageElementList.forEach((validationMessageElement) => {\r\n validationMessageElement.innerHTML = inputElement.validationMessage\r\n });\r\n };\r\n\r\n const modifyValidationClass = (inputElement, formGroupElement) => {\r\n if (inputElement.hasAttribute(runValidationAttribute)) {\r\n checkCustomValidity(inputElement, formGroupElement);\r\n updateInputValidityInDom(inputElement, formGroupElement);\r\n }\r\n };\r\n\r\n const modifyVisitedClass = (inputElement, formGroupElement) => {\r\n inputElement.classList.add(inputTouchedClass);\r\n const allFormControlsHaveBeenTouched = formGroupElement\r\n .querySelectorAll(formControlClass)\r\n .every(fc => fc.classList.contains(inputTouchedClass));\r\n \r\n if (allFormControlsHaveBeenTouched) {\r\n formGroupElement.classList.add(visitedClass);\r\n }\r\n };\r\n\r\n const modifySelectStateClass = (inputElement) => {\r\n const {nodeName, value} = inputElement;\r\n if (nodeName === \"SELECT\") {\r\n if (value === null || typeof value === undefined || value === \"\") {\r\n inputElement.classList.add(noValueClass)\r\n } else {\r\n inputElement.classList.remove(noValueClass)\r\n }\r\n }\r\n };\r\n\r\n formGroups.on(\"focusout\", ({target: inputElement, currentTarget: formGroupElement}) => {\r\n modifyVisitedClass(inputElement, formGroupElement);\r\n modifyValidationClass(inputElement, formGroupElement);\r\n modifySelectStateClass(inputElement);\r\n });\r\n\r\n formGroups.on(\"input\", ({target: inputElement, currentTarget: formGroupElement}) => {\r\n modifyValidationClass(inputElement, formGroupElement);\r\n });\r\n\r\n const onFormSubmitValid = (formInputElementNodeList, formElement) => {\r\n formInputElementNodeList.forEach((formGroupElement) => {\r\n formGroupElement.classList.remove(visitedClass);\r\n formGroupElement.classList.remove(invalidClass);\r\n });\r\n\r\n if (formElement.hasAttribute(\"data-disable-on-submit\")) {\r\n const submitButton = formElement.querySelector(\"button[type=\\\"submit\\\"]\");\r\n submitButton.setAttribute(\"disabled\", \"true\");\r\n }\r\n };\r\n\r\n const onFormSubmitInValid = (event, formInputElementNodeList) => {\r\n event.preventDefault();\r\n formInputElementNodeList.forEach((formGroupElement) => {\r\n formGroupElement.classList.add(visitedClass);\r\n const [inputElement] = formGroupElement.querySelectorAll(`[${runValidationAttribute}]`);\r\n modifyValidationClass(inputElement, formGroupElement);\r\n });\r\n };\r\n\r\n $(formSelector).on(\"submit\", (event) => {\r\n const { currentTarget: formElement } = event;\r\n const formInputElementNodeList = formElement.querySelectorAll(formGroupClass);\r\n \r\n // update all validation prior to submit\r\n // this is required as some validation can rely on other\r\n // field values which might have changed\r\n formInputElementNodeList.forEach((formInputElement) => {\r\n formInputElement.querySelectorAll(formControlClass).forEach((inputElement) => {\r\n checkCustomValidity(inputElement, formInputElement);\r\n });\r\n });\r\n \r\n if (!formElement.checkValidity()) {\r\n onFormSubmitInValid(event, formInputElementNodeList);\r\n return;\r\n }\r\n onFormSubmitValid(formInputElementNodeList, formElement);\r\n });\r\n\r\n\r\n const bootstrapErrors = () => {\r\n formGroups.forEach((formGroupElement) => {\r\n const inputElements = formGroupElement.querySelectorAll(`[${runValidationAttribute}]`);\r\n\r\n inputElements.forEach((inputElement) => {\r\n if (inputElement.hasAttribute(runValidationAttribute)) {\r\n const inputName = inputElement.name;\r\n const errorsSafe = errors || {};\r\n const errorForInput = (errorsSafe[inputName] || [])[0] || \"\";\r\n\r\n if (errorForInput !== \"\") {\r\n inputElement.setCustomValidity(errorForInput);\r\n formGroupElement.classList.add(visitedClass)\r\n }\r\n\r\n updateInputValidityInDom(inputElement, formGroupElement);\r\n modifySelectStateClass(inputElement);\r\n }\r\n });\r\n });\r\n };\r\n bootstrapErrors();\r\n};\r\n\r\nwindow.bootstrapValidation = bootstrapValidation;","const ancestorAttribute = \"data-ancestor-\"\r\nconst targetForAttribute = \"data-target-for\"\r\n\r\nconst getAttributesStartingWithAncestor = (target) => Object.values(target.attributes)\r\n .filter((attr) => attr.name.startsWith(ancestorAttribute));\r\n\r\nconst getTargetsForTargetedElement = (targetForElement) => {\r\n const targetForValue = targetForElement.getAttribute(targetForAttribute);\r\n const targetForTargets = targetForValue.split(\" \");\r\n return targetForTargets;\r\n};\r\n\r\nconst getClassListUpdater = (attr) => {\r\n const toggleableAction = attr.name.replace(ancestorAttribute, \"\");\r\n\r\n const addAttributePart = \"add-\";\r\n if (toggleableAction.startsWith(addAttributePart)) {\r\n const toggleableClass = toggleableAction.replace(addAttributePart, \"\");\r\n const classListUpdater = (e, className) => e.classList.add(className);\r\n \r\n return {\r\n toggleableClass,\r\n classListUpdater\r\n }\r\n }\r\n const removeAttributePart = \"remove-\";\r\n if (toggleableAction.startsWith(removeAttributePart)) {\r\n const toggleableClass = toggleableAction.replace(removeAttributePart, \"\");\r\n const classListUpdater = (e, className) => e.classList.remove(className);\r\n \r\n return {\r\n toggleableClass,\r\n classListUpdater\r\n }\r\n }\r\n\r\n\r\n return {\r\n toggleableClass: toggleableAction, \r\n classListUpdater: (e, className) => {\r\n e.classList.toggle(className);\r\n }\r\n };\r\n};\r\n\r\nconst bootstrapTogglePassword = () => {\r\n const showPasswordAttribute = \"data-show-password\";\r\n $(`[${showPasswordAttribute}]`).on(\"click\", ({currentTarget}) => {\r\n const toggleTargetSelector = currentTarget.getAttribute(showPasswordAttribute);\r\n const toggleTargetElementNodeList = $(toggleTargetSelector);\r\n\r\n toggleTargetElementNodeList.forEach(toggleTargetElement => {\r\n if (toggleTargetElement.getAttribute(\"type\") === \"password\") {\r\n toggleTargetElement.type = \"text\";\r\n } else {\r\n toggleTargetElement.type = \"password\";\r\n }\r\n });\r\n });\r\n};\r\n\r\nconst bootstrapTargetForAttributes = () => {\r\n $(`[${targetForAttribute}]`).on(\"click\", (event) => {\r\n const {target, currentTarget: targetedElement} = event;\r\n\r\n const attributesStartingWithAncestor = getAttributesStartingWithAncestor(target, ancestorAttribute);\r\n\r\n attributesStartingWithAncestor.forEach((attr) => {\r\n const {toggleableClass, classListUpdater} = getClassListUpdater(attr);\r\n\r\n const targetForTargets = getTargetsForTargetedElement(targetedElement);\r\n\r\n if (targetForTargets.includes(toggleableClass)) {\r\n classListUpdater(targetedElement, toggleableClass)\r\n }\r\n });\r\n });\r\n};\r\n\r\nwindow.docReady(() => {\r\n bootstrapTargetForAttributes();\r\n bootstrapTogglePassword();\r\n});"],"names":["window","$","document","querySelectorAll","bind","Node","prototype","on","name","fn","this","addEventListener","NodeList","__proto__","Array","forEach","elem","i","docReady","readyState","setTimeout","bootstrapValidation","formSelector","checkCustomValidity","inputElement","formGroupElement","otherInputsWithinFormGroupElement","formControlClass","formGroupControlClasses","formGroups","map","formGroup","validationMessages","validationRules","event","CustomEvent","detail","dispatchEvent","setCustomValidity","updateInputValidityInDom","isInputValid","checkValidity","validationMessageElementList","classList","remove","invalidClass","add","validationMessageElement","innerHTML","validationMessage","modifyValidationClass","hasAttribute","runValidationAttribute","modifySelectStateClass","nodeName","value","undefined","_typeof","noValueClass","arguments","length","errors","formGroupClass","concat","visitedClass","inputTouchedClass","_ref","target","currentTarget","every","fc","contains","_ref2","formInputElementNodeList","formElement","formInputElement","preventDefault","_slicedToArray","querySelector","setAttribute","errorForInput","inputName","ancestorAttribute","targetForAttribute","getAttributesStartingWithAncestor","Object","values","attributes","filter","attr","startsWith","getTargetsForTargetedElement","targetForElement","getAttribute","split","getClassListUpdater","toggleableAction","replace","toggleableClass","classListUpdater","e","className","removeAttributePart","toggle","bootstrapTogglePassword","showPasswordAttribute","_ref3","toggleTargetSelector","toggleTargetElement","type","bootstrapTargetForAttributes","targetedElement","_getClassListUpdater","includes"],"mappings":"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"}