; (function (root, factory) { // Browser globals root.FormUtils = factory(); }(typeof self !== 'undefined' ? self : this, function () { function LoadingIndicator(form) { let submitButton = form.querySelector('button[type="submit"]'); let spinner = document.createElement('span'); spinner.className = 'spinner-border spinner-border-sm'; if (!submitButton.innerText.startsWith(' ')) { spinner.classList.add('me-1'); } spinner.setAttribute('role', 'status'); spinner.setAttribute('aria-hidden', 'true'); this.spinner = spinner; this.submitButton = submitButton; this.onBefore = function () { let spinner = this.spinner; let submitButton = this.submitButton; if (submitButton) { submitButton.disabled = true; submitButton.prepend(spinner); } } this.onComplete = function () { let spinner = this.spinner; let submitButton = this.submitButton; if (submitButton) { submitButton.disabled = false; spinner.remove(); } } } function initRevealPassword(id, options) { if (typeof options === 'undefined') { options = {}; } let button = document.getElementById(id); let form = button.closest('form'); let passwordInputs = form.querySelectorAll('input[type="password"]'); let texts = [ typeof options.textReveal === 'undefined' ? 'Reveal password' : options.textReveal, typeof options.textHide === 'undefined' ? 'Hide password' : options.textHide, ]; let exceptNames = typeof options.exceptNames === 'undefined' ? [] : options.exceptNames; let isReveal = false; button.addEventListener('click', function (e) { e.preventDefault(); button.innerText = texts[isReveal ? 0 : 1]; isReveal = !isReveal; passwordInputs.forEach(function (el) { if (!exceptNames.includes(el.name)) { el.type = isReveal ? 'text' : 'password'; } }); }); } return { initRevealPassword: initRevealPassword, LoadingIndicator: LoadingIndicator }; }));