diff --git a/admin-panel/admin/assets/js/admin-app.js b/admin-panel/admin/assets/js/admin-app.js index f3ca3f8f..48801450 100644 --- a/admin-panel/admin/assets/js/admin-app.js +++ b/admin-panel/admin/assets/js/admin-app.js @@ -35,11 +35,16 @@ const AdminPanel = { }); // Detectar cambios en formularios + const enableSaveButton = () => { + this.STATE.hasChanges = true; + document.getElementById('saveSettings').disabled = false; + }; + document.querySelectorAll('input, select, textarea').forEach(input => { - input.addEventListener('change', () => { - this.STATE.hasChanges = true; - document.getElementById('saveSettings').disabled = false; - }); + // Evento 'input' se dispara mientras se escribe (tiempo real) + input.addEventListener('input', enableSaveButton); + // Evento 'change' se dispara cuando pierde foco (para select y checkboxes) + input.addEventListener('change', enableSaveButton); }); // Tabs @@ -50,6 +55,40 @@ const AdminPanel = { this.switchTab(tab); }); }); + + // Contador de caracteres + this.setupCharacterCounter(); + }, + + /** + * Configurar contador de caracteres para textarea + */ + setupCharacterCounter() { + const messageTextarea = document.getElementById('topBarMessageText'); + if (!messageTextarea) return; + + messageTextarea.addEventListener('input', () => { + const count = messageTextarea.value.length; + const counter = document.getElementById('topBarMessageTextCount'); + + if (counter) { + counter.textContent = count; + + // Cambiar color según proximidad al límite + counter.classList.remove('text-danger', 'text-warning', 'text-muted'); + + if (count > 230) { + counter.classList.add('text-danger'); + } else if (count > 200) { + counter.classList.add('text-warning'); + } else { + counter.classList.add('text-muted'); + } + } + }); + + // Trigger inicial para mostrar count actual + messageTextarea.dispatchEvent(new Event('input')); }, /** @@ -232,6 +271,12 @@ const AdminPanel = { } document.getElementById('topBarFontSize').value = topBar.custom_styles.font_size || 'normal'; } + + // Trigger contador de caracteres + const messageTextarea = document.getElementById('topBarMessageText'); + if (messageTextarea) { + messageTextarea.dispatchEvent(new Event('input')); + } }, /**