access-nyc-patterns
Version:
User Interface Patterns for Benefits Access
60 lines (48 loc) • 2.04 kB
JavaScript
/**
* A simple form validation function that uses native form validation. It will
* add appropriate form feedback for each input that is invalid and native
* localized browser messaging.
*
* See https://developer.mozilla.org/en-US/docs/Learn/HTML/Forms/Form_validation
* See https://caniuse.com/#feat=form-validation for support
*
* @param {Event} event The form submission event.
* @param {Array} STRINGS set of strings
* @return {Event/Boolean} The original event or false if invalid.
*/
export default function(event, STRINGS) {
event.preventDefault();
if (process.env.NODE_ENV !== 'production')
// eslint-disable-next-line no-console
console.dir({init: 'Validation', event: event});
let validity = event.target.checkValidity();
let elements = event.target.querySelectorAll('input[required="true"]');
for (let i = 0; i < elements.length; i++) {
// Remove old messaging if it exists
let el = elements[i];
let container = el.parentNode;
let message = container.querySelector('.error-message');
container.classList.remove('error');
if (message) message.remove();
// If this input valid, skip messaging
if (el.validity.valid) continue;
// Create the new error message.
message = document.createElement('div');
// Get the error message from localized strings.
if (el.validity.valueMissing)
message.innerHTML = STRINGS.VALID_REQUIRED;
else if (!el.validity.valid)
message.innerHTML = STRINGS[`VALID_${el.type.toUpperCase()}_INVALID`];
else
message.innerHTML = el.validationMessage;
message.setAttribute('aria-live', 'polite');
message.classList.add('error-message');
// Add the error class and error message.
container.classList.add('error');
container.insertBefore(message, container.childNodes[0]);
}
if (process.env.NODE_ENV !== 'production')
// eslint-disable-next-line no-console
console.dir({complete: 'Validation', valid: validity, event: event});
return (validity) ? event : validity;
};