From a7544c98be2dce44a2378136a31f19fe3c7bfaad Mon Sep 17 00:00:00 2001 From: marsalva Date: Sun, 22 Feb 2026 21:25:07 +0000 Subject: [PATCH] Actualizar configuracion.html --- configuracion.html | 158 ++++++++++++++++++++------------------------- 1 file changed, 71 insertions(+), 87 deletions(-) diff --git a/configuracion.html b/configuracion.html index 9f7a825..1f2ffaf 100644 --- a/configuracion.html +++ b/configuracion.html @@ -8,6 +8,11 @@ @@ -318,7 +325,7 @@
- +

Portal del Cliente

@@ -394,7 +401,7 @@
-
@@ -442,7 +449,7 @@

Vista Previa en Vivo

-
+
@@ -513,78 +520,78 @@ let cachedTemplates = {}; let currentTemplateType = null; let localGuilds = []; - let globalConfig = null; // Para guardar la configuración de la base de datos + let globalConfigStore = null; // Almacenamiento seguro global document.addEventListener("DOMContentLoaded", () => { if (!localStorage.getItem("token")) window.location.href = "index.html"; showTab('templates'); loadTemplates(); loadWaSettings(); - loadGlobalConfig(); // Cargar portal y app al iniciar + loadGlobalConfig(); }); // ========================================== - // Carga y Guardado Unificado (Evita Error 500) + // CARGA Y GUARDADO GLOBAL ANTI-ERROR 500 // ========================================== async function loadGlobalConfig() { try { const res = await fetch(`${API_URL}/config/company`, { headers: { "Authorization": `Bearer ${localStorage.getItem("token")}` } }); const data = await res.json(); - if (data.ok && data.config) { - globalConfig = data.config; + globalConfigStore = data.config; - // Rellenar Portal - document.getElementById('confCompanyName').value = globalConfig.full_name || ""; - if (globalConfig.company_logo) { - document.getElementById('confLogoBase64').value = globalConfig.company_logo; - document.getElementById('logoPreview').innerHTML = ``; + // Portal + document.getElementById('confCompanyName').value = globalConfigStore.full_name || ""; + if (globalConfigStore.company_logo) { + document.getElementById('confLogoBase64').value = globalConfigStore.company_logo; + document.getElementById('logoPreview').innerHTML = ``; } - if (globalConfig.portal_settings) { - const s = globalConfig.portal_settings; + if (globalConfigStore.portal_settings) { + const s = globalConfigStore.portal_settings; if(s.m_start) document.getElementById('mStart').value = s.m_start; if(s.m_end) document.getElementById('mEnd').value = s.m_end; if(s.a_start) document.getElementById('aStart').value = s.a_start; if(s.a_end) document.getElementById('aEnd').value = s.a_end; - } - - // Rellenar App Operario (si existe en la BD) - if (globalConfig.app_settings) { - const apps = globalConfig.app_settings; - document.getElementById('color-primary').value = apps.primary || "#2563EB"; - document.getElementById('color-primary-hex').value = apps.primary || "#2563EB"; - document.getElementById('color-secondary').value = apps.secondary || "#F59E0B"; - document.getElementById('color-secondary-hex').value = apps.secondary || "#F59E0B"; - document.getElementById('color-bg').value = apps.bg || "#F4F7F9"; - document.getElementById('color-bg-hex').value = apps.bg || "#F4F7F9"; - updateAppPreview(); + + // App Colores (Guardados DENTRO de portal_settings para no romper la BD) + if (s.app_settings) { + document.getElementById('color-primary').value = s.app_settings.primary || "#2563EB"; + document.getElementById('color-primary-hex').value = s.app_settings.primary || "#2563EB"; + document.getElementById('color-secondary').value = s.app_settings.secondary || "#F59E0B"; + document.getElementById('color-secondary-hex').value = s.app_settings.secondary || "#F59E0B"; + document.getElementById('color-bg').value = s.app_settings.bg || "#F4F7F9"; + document.getElementById('color-bg-hex').value = s.app_settings.bg || "#F4F7F9"; + updateAppPreview(); + } } } - } catch (e) { console.error("Error cargando configuración global"); } + } catch (e) { console.error("Error cargando configuración", e); } } - async function saveConfigUnified(isPortal) { - let btnId = isPortal ? 'btnSavePortal' : 'btnSaveApp'; - const btn = document.getElementById(btnId); + async function saveConfigUnified(isApp) { + if(!globalConfigStore) return showToast("Espera a que cargue la configuración", true); + + const btn = document.getElementById(isApp ? 'btnSaveApp' : 'btnSavePortal'); const original = btn.innerHTML; btn.innerHTML = ' Guardando...'; lucide.createIcons(); - // Construir el objeto con TODO lo que espera el servidor + // Construir el paquete completo siempre + const portalSettings = globalConfigStore.portal_settings || {}; + portalSettings.m_start = document.getElementById('mStart').value || "09:00"; + portalSettings.m_end = document.getElementById('mEnd').value || "14:00"; + portalSettings.a_start = document.getElementById('aStart').value || "16:00"; + portalSettings.a_end = document.getElementById('aEnd').value || "19:00"; + portalSettings.app_settings = { + primary: document.getElementById('color-primary').value || "#2563EB", + secondary: document.getElementById('color-secondary').value || "#F59E0B", + bg: document.getElementById('color-bg').value || "#F4F7F9" + }; + const payload = { - company_name: document.getElementById('confCompanyName').value || globalConfig?.full_name || "Mi Empresa", - company_logo: document.getElementById('confLogoBase64').value || globalConfig?.company_logo || "", - portal_settings: { - m_start: document.getElementById('mStart').value || "09:00", - m_end: document.getElementById('mEnd').value || "14:00", - a_start: document.getElementById('aStart').value || "16:00", - a_end: document.getElementById('aEnd').value || "19:00" - }, - app_settings: { - primary: document.getElementById('color-primary').value || "#2563EB", - secondary: document.getElementById('color-secondary').value || "#F59E0B", - bg: document.getElementById('color-bg').value || "#F4F7F9" - } + company_name: document.getElementById('confCompanyName').value || globalConfigStore.full_name || "Empresa", + company_logo: document.getElementById('confLogoBase64').value || globalConfigStore.company_logo || "", + portal_settings: portalSettings }; try { @@ -593,21 +600,19 @@ headers: { "Content-Type": "application/json", "Authorization": `Bearer ${localStorage.getItem("token")}` }, body: JSON.stringify(payload) }); - const data = await res.json(); - if (data.ok) { - showToast(isPortal ? "✅ Portal Guardado" : "✅ Colores de la App Actualizados"); - if(document.getElementById("headerUserName")) document.getElementById("headerUserName").innerText = payload.company_name; - localStorage.setItem('app_theme', JSON.stringify(payload.app_settings)); // Guardar en caché para la app móvil + if (res.ok) { + showToast(isApp ? "✅ Colores de la App Actualizados" : "✅ Portal Guardado"); + localStorage.setItem('app_theme', JSON.stringify(portalSettings.app_settings)); // Para la app móvil } else { - showToast("❌ Error del servidor", true); + showToast("❌ Error al guardar en el servidor", true); } - } catch (e) { showToast("Error de conexión", true); } + } catch (e) { showToast("❌ Error de conexión", true); } finally { btn.innerHTML = original; lucide.createIcons(); } } - function savePortalConfig() { saveConfigUnified(true); } - function saveAppConfig() { saveConfigUnified(false); } + function savePortalConfig() { saveConfigUnified(false); } + function saveAppConfig() { saveConfigUnified(true); } function showTab(tabId) { document.querySelectorAll('.tab-content').forEach(el => el.classList.add('hidden')); @@ -699,11 +704,11 @@ try { const res = await fetch(`${API_URL}/whatsapp/status`, { headers: { "Authorization": `Bearer ${localStorage.getItem("token")}` } }); const data = await res.json(); - if (data.state === "open") container.innerHTML = `
Conectado
`; + if (data.state === "open") container.innerHTML = `
Conectado
`; else if (data.qr) container.innerHTML = ``; - else container.innerHTML = `

Iniciando...

`; + else container.innerHTML = `

Iniciando...

`; lucide.createIcons(); - } catch(e) { container.innerHTML = `

Error servidor

`; } + } catch(e) { container.innerHTML = `

Error servidor

`; } } // ========================================== @@ -713,44 +718,26 @@ const list = document.getElementById('iaRulesList'); list.innerHTML = '

Cargando...

'; lucide.createIcons(); - try { const resGuilds = await fetch(`${API_URL}/guilds`, { headers: { "Authorization": `Bearer ${localStorage.getItem("token")}` } }); const dataGuilds = await resGuilds.json(); - - if (!dataGuilds.ok || dataGuilds.guilds.length === 0) { - list.innerHTML = '

No tienes gremios creados. Crea gremios en "Otras Configuraciones" primero.

'; - return; - } - + if (!dataGuilds.ok || dataGuilds.guilds.length === 0) { list.innerHTML = '

Crea gremios primero.

'; return; } localGuilds = dataGuilds.guilds; list.innerHTML = ''; - localGuilds.forEach(g => { const keywords = Array.isArray(g.ia_keywords) ? g.ia_keywords : []; - const tagsHtml = keywords.length > 0 - ? keywords.map(kw => `${kw}`).join('') - : 'Sin reglas asignadas.'; - + const tagsHtml = keywords.length > 0 ? keywords.map(kw => `${kw}`).join('') : 'Sin reglas asignadas.'; const row = document.createElement('div'); row.className = "p-4 hover:bg-purple-50/30 transition-colors grid grid-cols-12 gap-4 items-center group"; row.innerHTML = ` -
- ${g.name} -
+
${g.name}
${tagsHtml}
-
- -
+
`; list.appendChild(row); }); lucide.createIcons(); - } catch (e) { - list.innerHTML = '

Error al cargar las reglas de IA.

'; - } + } catch (e) { list.innerHTML = '

Error cargar reglas.

'; } } function openIaModal(guildId, guildName) { @@ -773,12 +760,9 @@ method: 'PUT', headers: { "Content-Type": "application/json", "Authorization": `Bearer ${localStorage.getItem("token")}` }, body: JSON.stringify({ keywords: keywordsArray }) }); - if (res.ok) { - showToast("✅ Reglas de IA guardadas."); - closeIaModal(); - loadIaRules(); - } else { showToast("❌ Error al guardar reglas.", true); } - } catch (e) { showToast("❌ Error de conexión.", true); } + if (res.ok) { showToast("✅ Reglas IA guardadas"); closeIaModal(); loadIaRules(); } + else { showToast("❌ Error al guardar", true); } + } catch (e) { showToast("❌ Error de conexión", true); } } // ==========================================