From 4f6e788870f26b5cf1f3ea0523b65abe490f8fa1 Mon Sep 17 00:00:00 2001 From: Felix Hamann Date: Sun, 7 Apr 2019 21:40:03 +0200 Subject: [PATCH] refactor form error remover js utility --- static/js/utils/form.js | 70 +++++++++++++++++++++++++++++++---------- 1 file changed, 54 insertions(+), 16 deletions(-) diff --git a/static/js/utils/form.js b/static/js/utils/form.js index 85e2f163b..f04e2ee4d 100644 --- a/static/js/utils/form.js +++ b/static/js/utils/form.js @@ -9,7 +9,7 @@ var AUTOSUBMIT_BUTTON_SELECTOR = '[type="submit"][data-autosubmit]'; var AJAX_SUBMIT_FLAG = 'ajaxSubmit'; - var FORM_GROUP_CLASS = 'form-group'; + var FORM_GROUP_SELECTOR = '.form-group'; var FORM_GROUP_WITH_ERRORS_CLASS = 'form-group--has-error'; window.utils.form = function(form, options) { @@ -152,7 +152,6 @@ if (inputsValid()) { submitButton.removeAttribute('disabled'); } else { - console.log('setting disabled', { submitButton }); submitButton.setAttribute('disabled', 'true'); } } @@ -304,32 +303,71 @@ setup: autoSubmitButtonUtil, }); + /** + * + * Form Error Remover Utility + * Removes errors from inputs when they are focused + * + * Attribute: [none] + * (automatically setup on all form tags) + * + * Example usage: + * (any regular form that can show input errors) + */ - // listens for focus events and removes any errors on an input - window.utils.errorRemover = function(formGroup, options) { + var FORM_ERROR_REMOVER_UTIL_NAME = 'formErrorRemover'; + var FORM_ERROR_REMOVER_UTIL_SELECTOR = 'form'; - var inputElement = formGroup.querySelector('input:not([type="hidden"]), textarea, select'); - if (!inputElement) { - return false; + var FORM_ERROR_REMOVER_INITIALIZED_CLASS = 'form-error-remover--initialized'; + var FORM_ERROR_REMOVER_INPUTS_SELECTOR = 'input:not([type="hidden"]), textarea, select'; + + var formErrorRemoverUtil = function(element) { + var formGroups; + + function init() { + if (!element) { + throw new Error('Form Error Remover utility needs to be passed an element!'); } - inputElement.addEventListener('focus', focusListener); + // find form groups + formGroups = Array.from(element.querySelectorAll(FORM_GROUP_SELECTOR)); - function focusListener() { - var hasError = formGroup.classList.contains(FORM_GROUP_WITH_ERRORS_CLASS); - if (hasError) { - formGroup.classList.remove(FORM_GROUP_WITH_ERRORS_CLASS); + formGroups.forEach(function(formGroup) { + if (!formGroup.classList.contains(FORM_GROUP_WITH_ERRORS_CLASS)) { + return; } + + var inputElements = Array.from(formGroup.querySelectorAll(FORM_ERROR_REMOVER_INPUTS_SELECTOR)); + if (!inputElements) { + return false; } + inputElements.forEach(function(inputElement) { + inputElement.addEventListener('input', function() { + formGroup.classList.remove(FORM_GROUP_WITH_ERRORS_CLASS); + }); + }); + }); + + // mark initialized + element.classList.add(FORM_ERROR_REMOVER_INITIALIZED_CLASS); + return { - scope: formGroup, - destroy: function() { - inputElement.removeEventListener('focus', focusListener); - }, + name: FORM_ERROR_REMOVER_UTIL_NAME, + element: element, + destroy: function() {}, }; + } + + return init(); }; + formUtilities.push({ + name: FORM_ERROR_REMOVER_UTIL_NAME, + selector: FORM_ERROR_REMOVER_UTIL_SELECTOR, + setup: formErrorRemoverUtil, + }); + // register the collected form utilities if (UtilRegistry) { formUtilities.forEach(UtilRegistry.register);