(() => {
'use strict';
const globalNamespace = window.UIComponents || {};
function toArray(source) {
if (!source) {
return [];
}
if (typeof source === 'string') {
return Array.from(document.querySelectorAll(source));
}
if (source instanceof HTMLFormElement) {
return [source];
}
return Array.from(source);
}
function buildLoadingMarkup(text) {
const safeText = typeof text === 'string' && text.trim().length > 0 ? text : '处理中...';
return `<span class="loading-content"><span class="loading-spinner" role="presentation"></span><span class="loading-text">${safeText}</span></span>`;
}
function attachSubmitLoading(formOrSelector, options = {}) {
const forms = toArray(formOrSelector);
forms.forEach(form => {
if (!(form instanceof HTMLFormElement)) {
return;
}
if (form.dataset.submitLoadingInit === 'true') {
return;
}
const buttonSelector = options.buttonSelector || form.dataset.submitButton || 'button[type="submit"]';
const submitButton = form.querySelector(buttonSelector);
if (!submitButton) {
return;
}
form.dataset.submitLoadingInit = 'true';
form.addEventListener('submit', event => {
if (form.dataset.submitLoadingActive === 'true') {
event.preventDefault();
return;
}
form.dataset.submitLoadingActive = 'true';
form.classList.add('is-loading');
const loadingText = options.loadingText
|| submitButton.getAttribute('data-loading-text')
|| form.getAttribute('data-loading-text')
|| '处理中...';
if (!submitButton.dataset.originalContent) {
submitButton.dataset.originalContent = submitButton.innerHTML;
}
submitButton.disabled = true;
submitButton.setAttribute('aria-disabled', 'true');
submitButton.classList.add('is-loading');
submitButton.setAttribute('aria-live', 'polite');
submitButton.innerHTML = buildLoadingMarkup(loadingText);
const targetSelector = options.loadingTarget || form.getAttribute('data-loading-target');
const loadingTarget = targetSelector ? form.closest(targetSelector) : form.closest('.container');
if (loadingTarget) {
loadingTarget.classList.add('is-loading');
loadingTarget.setAttribute('aria-busy', 'true');
}
});
});
}
globalNamespace.attachSubmitLoading = attachSubmitLoading;
window.UIComponents = globalNamespace;
document.addEventListener('DOMContentLoaded', () => {
const autoForms = document.querySelectorAll('form[data-submit-loading]');
if (autoForms.length > 0) {
attachSubmitLoading(autoForms);
}
});
})();