/**
* Utility functions for UI state management and formatting.
* @module modules/utils
*/
/**
* Toggles the loading state of a button (disables/enables and updates text).
* @param {HTMLButtonElement} button - The button element to update
* @param {boolean} isLoading - Whether the button should be in loading state
*/
export function setLoadingState(button, isLoading) {
if (!button) return;
button.disabled = isLoading;
button.innerHTML = isLoading ? 'Cargando...' : button.dataset.originalText || button.innerHTML;
}
/**
* Displays an error message and hides the success message.
* @param {string} message - The error message to display
* @param {HTMLElement} errorElement - The error message container element
* @param {HTMLElement} successElement - The success message container element
*/
export function displayError(message, errorElement, successElement) {
if (errorElement) {
const messageSpan = errorElement.querySelector('span');
if (messageSpan) {
messageSpan.textContent = message;
} else {
errorElement.textContent = message;
}
errorElement.classList.remove('hidden');
}
if (successElement) {
successElement.classList.add('hidden');
}
}
/**
* Displays a success message and hides the error message.
* @param {string} message - The success message to display
* @param {HTMLElement} successElement - The success message container element
* @param {HTMLElement} errorElement - The error message container element
*/
export function displaySuccess(message, successElement, errorElement) {
if (successElement) {
const messageSpan = successElement.querySelector('span');
if (messageSpan) {
messageSpan.textContent = message;
} else {
successElement.textContent = message;
}
successElement.classList.remove('hidden');
}
if (errorElement) {
errorElement.classList.add('hidden');
}
}
/**
* Hides both error and success messages.
* @param {HTMLElement} errorElement - The error message container element
* @param {HTMLElement} successElement - The success message container element
*/
export function clearMessages(errorElement, successElement) {
if (errorElement) {
errorElement.classList.add('hidden');
const messageSpan = errorElement.querySelector('span');
if (messageSpan) {
messageSpan.textContent = '';
}
}
if (successElement) {
successElement.classList.add('hidden');
const messageSpan = successElement.querySelector('span');
if (messageSpan) {
messageSpan.textContent = '';
}
}
}
/**
* Formats a date string to a locale string.
* @param {string} dateString - The date string to format
* @returns {string} The formatted date string or 'N/A' if invalid
*/
export function formatDate(dateString) {
if (!dateString) return 'N/A';
const date = new Date(dateString);
// If date is invalid, try to parse manually (handles some non-standard formats)
if (isNaN(date.getTime())) {
const parts = dateString.split(/[- :]/);
if (parts.length >= 6) {
const year = parseInt(parts[0]);
const month = parseInt(parts[1]) - 1; // Month is 0-indexed
const day = parseInt(parts[2]);
const hours = parseInt(parts[3]);
const minutes = parseInt(parts[4]);
const seconds = parseInt(parts[5]);
const validDate = new Date(year, month, day, hours, minutes, seconds);
if (!isNaN(validDate.getTime())) {
return validDate.toLocaleString();
}
}
// Fallback: return original string if parsing fails
return dateString;
}
return date.toLocaleString();
}