import Vue from "vue"; import Form from "../../plugins/forms/Form"; function checkForErrors(formElement, form: Form) { let errors = form.errors(); formElement.querySelectorAll("*[validate]").forEach((el) => { if (el.hasAttribute("touched") && errors[el.name]) { return attachError(el, errors[el.name]); } removeErrors(el); }); } function attachError(el: HTMLInputElement, error) { let validationElement = getValidationErrorElement(el); if (!validationElement) { el.insertAdjacentHTML( "afterend", `
${error}
`, ); } else { // @ts-ignore validationElement.innerHTML = error; } } function removeErrors(el: HTMLInputElement) { let validationElement = getValidationErrorElement(el); if (validationElement) { // @ts-ignore validationElement.remove(); } } function getValidationErrorElement( el: HTMLInputElement, ): HTMLInputElement | boolean { let sibling = el.nextSibling; // @ts-ignore if (sibling && sibling.classList) { // @ts-ignore return sibling.classList.contains("validation-error") && sibling; } return false; } // @ts-ignore Vue.directive("form", { inserted(formElement: HTMLInputElement, vNode) { // @ts-ignore formElement .querySelectorAll("*[validate]") // @ts-ignore .forEach((el: HTMLInputElement) => { switch (el.type) { case "radio": case "checkbox": el.onchange = () => { el.setAttribute("touched", "true"); checkForErrors(formElement, vNode.value); }; break; default: el.oninput = () => { checkForErrors(formElement, vNode.value); el.onblur = () => { el.setAttribute("touched", "true"); checkForErrors(formElement, vNode.value); }; }; break; } }); }, });