first commit

This commit is contained in:
2025-03-07 00:29:07 -06:00
commit b21a11c2ee
564 changed files with 94041 additions and 0 deletions

View File

@ -0,0 +1,220 @@
export default class SenderResponseForm {
constructor(config = {}) {
const defaultConfig = {
formSenderResponseId: 'mail-sender-response-settings-card',
replyToMethodId: 'reply_to_method',
saveSenderResponseButtonId: 'save_sender_response_button',
cancelButtonId: 'cancel_sender_response_button'
};
this.config = { ...defaultConfig, ...config };
this.formSenderResponse = null;
this.smtpReplyToMethod = null;
this.saveButton = null;
this.cancelButton = null;
this.init(); // Inicializa el formulario
}
// Método para inicializar el formulario
init() {
try {
// Obtener elementos esenciales
this.formSenderResponse = document.getElementById(this.config.formSenderResponseId);
this.smtpReplyToMethod = document.getElementById(this.config.replyToMethodId);
this.saveButton = document.getElementById(this.config.saveSenderResponseButtonId);
this.cancelButton = document.getElementById(this.config.cancelButtonId);
// Asignar eventos
this.formSenderResponse.addEventListener('input', event => this.handleInput(event));
this.smtpReplyToMethod.addEventListener('change', () => this.handleToggleReplyToMethod());
this.cancelButton.addEventListener('click', () => this.handleCancel());
// Inicializar validación del formulario
this.initializeFormValidation(this.formSenderResponse, this.senderResponsValidateConfig, () => {
this.handleFormValid();
});
// Disparar el evento 'change' en el método de respuesta
setTimeout(() => this.smtpReplyToMethod.dispatchEvent(new Event('change')), 0);
} catch (error) {
console.error('Error al inicializar el formulario de respuesta:', error);
}
}
/**
* Método de recarga parcial
* Este método restablece la validación y los eventos sin destruir la instancia.
*/
reload() {
try {
// Vuelve a inicializar la validación del formulario
this.initializeFormValidation(this.formSenderResponse, this.senderResponsValidateConfig, () => {
this.handleFormValid();
});
// Vuelve a agregar los eventos (si es necesario, depende de tu lógica)
this.smtpReplyToMethod.dispatchEvent(new Event('change'));
} catch (error) {
console.error('Error al recargar el formulario:', error);
}
}
/**
* Maneja el evento de entrada en el formulario.
* @param {Event} event - Evento de entrada.
*/
handleInput(event) {
const target = event.target;
if (['INPUT', 'SELECT', 'TEXTAREA'].includes(target.tagName)) {
this.toggleButtonsState(this.formSenderResponse, true); // Habilitar botones
}
}
/**
* Muestra u oculta el campo de correo personalizado según el método de respuesta seleccionado.
* @param {HTMLElement} smtpReplyToMethod - Elemento select del método de respuesta.
*/
handleToggleReplyToMethod() {
const emailCustomDiv = document.querySelector('.email-custom-div');
if (emailCustomDiv) {
emailCustomDiv.style.display = Number(this.smtpReplyToMethod.value) === 3 ? 'block' : 'none';
}
}
/**
* Cancels the sender response form submission.
* This method disables the form buttons, disables all form fields,
* and sets the cancel button to a loading state.
*
* @returns {void}
*/
handleCancel() {
this.disableFormFields(this.formSenderResponse);
this.toggleButtonsState(this.formSenderResponse, false);
this.setButtonLoadingState(this.cancelButton, true);
}
/**
* Inicializa la validación del formulario.
* @param {HTMLElement} form - El formulario.
* @param {Object} config - Configuración de validación.
* @param {Function} onValidCallback - Callback cuando el formulario es válido.
*/
initializeFormValidation(form, config, onValidCallback) {
return FormValidation.formValidation(form, config).on('core.form.valid', onValidCallback);
}
/**
* Maneja la acción cuando el formulario es válido.
*/
handleFormValid() {
this.disableFormFields(this.formSenderResponse);
this.toggleButtonsState(this.formSenderResponse, false);
this.setButtonLoadingState(this.saveButton, true);
Livewire.dispatch('saveMailSenderResponseSettings');
}
/**
* Deshabilita todos los campos del formulario.
* @param {HTMLElement} form - El formulario.
*/
disableFormFields(form) {
form.querySelectorAll('input, select, textarea').forEach(field => {
field.disabled = true;
});
}
/**
* Habilita o deshabilita los botones dentro del formulario.
* @param {HTMLElement} form - El formulario.
* @param {boolean} state - Estado de habilitación.
*/
toggleButtonsState(form, state) {
form.querySelectorAll('button').forEach(button => {
button.disabled = !state;
});
}
/**
* Configura el estado de carga de un botón.
* @param {HTMLElement} button - El botón.
* @param {boolean} isLoading - Si el botón está en estado de carga.
*/
setButtonLoadingState(button, isLoading) {
const loadingText = button.getAttribute('data-loading-text');
if (loadingText && isLoading) {
button.innerHTML = loadingText;
} else {
button.innerHTML = button.getAttribute('data-original-text') || button.innerHTML;
}
}
senderResponsValidateConfig = {
fields: {
from_address: {
validators: {
notEmpty: {
message: 'El correo electrónico de salida es obligatorio.'
},
emailAddress: {
message: 'Por favor, introduce un correo electrónico válido.'
}
}
},
from_name: {
validators: {
notEmpty: {
message: 'El nombre del remitente es obligatorio.'
}
}
},
reply_to_method: {
validators: {
notEmpty: {
message: 'El método de respuesta es obligatorio.'
}
}
},
reply_to_email: {
validators: {
callback: {
message: 'El correo electrónico de respuesta es obligatorio.',
callback: function (input) {
if (Number(document.getElementById('reply_to_method').value) === 3) {
return input.value.trim() !== '' && /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(input.value);
}
return true;
}
}
}
},
reply_to_name: {
validators: {
callback: {
message: 'El nombre de respuesta es obligatorio.',
callback: function (input) {
if (Number(document.getElementById('reply_to_method').value) === 3) {
return input.value.trim() !== '';
}
return true;
}
}
}
}
},
plugins: {
trigger: new FormValidation.plugins.Trigger(),
bootstrap5: new FormValidation.plugins.Bootstrap5({
eleValidClass: '',
rowSelector: '.fv-row'
}),
submitButton: new FormValidation.plugins.SubmitButton(),
autoFocus: new FormValidation.plugins.AutoFocus()
}
};
}

View File

@ -0,0 +1,239 @@
export default class SmtpSettingsForm {
constructor(config = {}) {
const defaultConfig = {
formSmtpSettingsSelector: '#mail-smtp-settings-card',
changeSmtpSettingsId: 'change_smtp_settings',
testSmtpConnectionButtonId: 'test_smtp_connection_button',
saveSmtpConnectionButtonId: 'save_smtp_connection_button',
cancelSmtpConnectionButtonId: 'cancel_smtp_connection_button'
};
this.config = { ...defaultConfig, ...config };
this.formSmtpSettings = null;
this.changeSmtpSettingsCheckbox = null;
this.testButton = null;
this.saveButton = null;
this.cancelButton = null;
this.validator = null;
this.init();
}
/**
* Inicializa el formulario de configuración SMTP.
*/
init() {
try {
// Obtener elementos esenciales
this.formSmtpSettings = document.querySelector(this.config.formSmtpSettingsSelector);
this.notificationArea = this.formSmtpSettings.querySelector(this.config.notificationAreaSelector);
this.changeSmtpSettingsCheckbox = document.getElementById(this.config.changeSmtpSettingsId);
this.testButton = document.getElementById(this.config.testSmtpConnectionButtonId);
this.saveButton = document.getElementById(this.config.saveSmtpConnectionButtonId);
this.cancelButton = document.getElementById(this.config.cancelSmtpConnectionButtonId);
// Asignar eventos
this.changeSmtpSettingsCheckbox.addEventListener('change', event => this.handleCheckboxChange(event));
this.testButton.addEventListener('click', event => this.handleTestConnection(event));
this.cancelButton.addEventListener('click', () => this.handleCancel());
// Inicializar validación del formulario
this.validator = FormValidation.formValidation(this.formSmtpSettings, this.smtpSettingsFormValidateConfig);
} catch (error) {
console.error('Error al inicializar el formulario SMTP:', error);
}
}
/**
* Método de recarga parcial
* Este método restablece la validación y los eventos sin destruir la instancia.
*/
reload() {
try {
// Inicializar validación del formulario
this.validator = FormValidation.formValidation(this.formSmtpSettings, this.smtpSettingsFormValidateConfig);
} catch (error) {
console.error('Error al recargar el formulario:', error);
}
}
/**
* Maneja el cambio en la casilla "Cambiar configuración SMTP".
* @param {Event} event - Evento de cambio.
*/
handleCheckboxChange(event) {
const isEnabled = event.target.checked;
this.toggleFieldsState(['host', 'port', 'encryption', 'username', 'password'], isEnabled);
this.testButton.disabled = false;
this.saveButton.disabled = true;
this.cancelButton.disabled = false;
if (!isEnabled) {
Livewire.dispatch('loadSettings');
}
}
/**
* Maneja el clic en el botón "Probar conexión".
* @param {Event} event - Evento de clic.
*/
handleTestConnection(event) {
event.preventDefault();
this.validator.resetForm();
this.validator.validate().then(status => {
if (status === 'Valid') {
this.disableFormFields(this.formSmtpSettings);
this.toggleButtonsState(this.formSmtpSettings, false);
this.setButtonLoadingState(this.testButton, true);
Livewire.dispatch('testSmtpConnection');
}
});
}
/**
* Maneja la cancelación de cambios en la configuración SMTP.
*/
handleCancel() {
this.disableFormFields(this.formSmtpSettings);
this.toggleButtonsState(this.formSmtpSettings, false);
this.setButtonLoadingState(this.cancelButton, true);
Livewire.dispatch('loadSettings');
}
/**
* Habilita o deshabilita los campos del formulario.
* @param {Array} fields - IDs de los campos a actualizar.
* @param {boolean} isEnabled - Estado de habilitación.
*/
toggleFieldsState(fields, isEnabled) {
fields.forEach(id => {
const field = document.getElementById(id);
if (field) field.disabled = !isEnabled;
});
}
/**
* Deshabilita todos los campos del formulario.
* @param {HTMLElement} form - El formulario.
*/
disableFormFields(form) {
form.querySelectorAll('input, select, textarea').forEach(field => {
field.disabled = true;
});
}
/**
* Habilita o deshabilita los botones dentro del formulario.
* @param {HTMLElement} form - El formulario.
* @param {boolean} state - Estado de habilitación.
*/
toggleButtonsState(form, state) {
form.querySelectorAll('button').forEach(button => {
button.disabled = !state;
});
}
/**
* Configura el estado de carga de un botón.
* @param {HTMLElement} button - El botón.
* @param {boolean} isLoading - Si el botón está en estado de carga.
*/
setButtonLoadingState(button, isLoading) {
const loadingText = button.getAttribute('data-loading-text');
if (loadingText && isLoading) {
button.innerHTML = loadingText;
} else {
button.innerHTML = button.getAttribute('data-original-text') || button.innerHTML;
}
}
smtpSettingsFormValidateConfig = {
fields: {
host: {
validators: {
callback: {
message: 'El servidor SMTP es obligatorio.',
callback: function (input) {
// Ejecutar la validación solo si 'change_smtp_settings' está marcado
if (document.getElementById('change_smtp_settings').checked) {
return input.value.trim() !== '';
}
return true; // No validar si no está marcado
}
}
}
},
port: {
validators: {
callback: {
message: 'El puerto SMTP es obligatorio.',
callback: function (input) {
if (document.getElementById('change_smtp_settings').checked) {
return (
input.value.trim() !== '' &&
/^\d+$/.test(input.value) &&
input.value >= 1 &&
input.value <= 65535
);
}
return true;
}
}
}
},
encryption: {
validators: {
callback: {
message: 'La encriptación es obligatoria.',
callback: function (input) {
if (document.getElementById('change_smtp_settings').checked) {
return input.value.trim() !== '';
}
return true;
}
}
}
},
username: {
validators: {
callback: {
message: 'El usuario SMTP es obligatorio.',
callback: function (input) {
if (document.getElementById('change_smtp_settings').checked) {
return input.value.trim().length >= 6;
}
return true;
}
}
}
},
password: {
validators: {
callback: {
message: 'Por favor, introduzca su contraseña.',
callback: function (input) {
if (document.getElementById('change_smtp_settings').checked) {
return input.value.trim().length >= 5;
}
return true;
}
}
}
}
},
plugins: {
trigger: new FormValidation.plugins.Trigger(),
bootstrap5: new FormValidation.plugins.Bootstrap5({ rowSelector: '.fv-row' }),
submitButton: new FormValidation.plugins.SubmitButton(),
autoFocus: new FormValidation.plugins.AutoFocus()
}
};
}