From e01121a64d8a0a0770ed31b086bbf17aad378e7e Mon Sep 17 00:00:00 2001 From: Administrator Date: Thu, 10 Sep 2026 11:26:19 -0500 Subject: [PATCH] Actualizar frontend/src/pages/Programa.jsx --- frontend/src/pages/Programa.jsx | 62 +++++++++++++++++++++++++++++---- 1 file changed, 55 insertions(+), 7 deletions(-) diff --git a/frontend/src/pages/Programa.jsx b/frontend/src/pages/Programa.jsx index eabff7c..0916e3b 100644 --- a/frontend/src/pages/Programa.jsx +++ b/frontend/src/pages/Programa.jsx @@ -1,4 +1,4 @@ -import { useState, useEffect, useMemo } from "react"; +import { useState, useEffect, useMemo, Fragment } from "react"; import { api } from "../lib/api"; import { Loader, ErrorBox, Filters, Select } from "../components/UI"; import { @@ -22,6 +22,9 @@ export default function Programa({ inicial = null, onConsumirInicial } = {}) { const [reload, setReload] = useState(0); // Programa que se debe seleccionar automaticamente al llegar por enlace (Leads). const [progPendiente, setProgPendiente] = useState(inicial?.programa || null); + // Expansion de la tabla Estado/Objecion (mismo patron que el apartado Leads) + const [expEstado, setExpEstado] = useState({}); // estado -> abierto + const [expEstAse, setExpEstAse] = useState({}); // "estado|asesor" -> abierto useEffect(() => { api.leadsFiltros().then(setFiltros).catch(() => {}); }, []); useEffect(() => { @@ -199,12 +202,57 @@ export default function Programa({ inicial = null, onConsumirInicial } = {}) { {(data.matriz_etiq || []).length === 0 ? ( Sin datos - ) : (data.matriz_etiq || []).map((e) => ( - - {e.estado} - {num(e.cantidad)} - - ))} + ) : (data.matriz_etiq || []).map((e) => { + const abierto = !!expEstado[e.estado]; + const tieneAsesores = (e.asesores || []).length > 0; + return ( + + + + {tieneAsesores && ( + + )} + {e.estado} + + {num(e.cantidad)} + + {abierto && (e.asesores || []).map((a) => { + const keyA = e.estado + "|" + a.asesor; + const abiertoA = !!expEstAse[keyA]; + const tieneTel = (a.telefonos || []).length > 0; + return ( + + + + {tieneTel && ( + + )} + {a.asesor} + + {num(a.cantidad)} + + {abiertoA && (a.telefonos || []).map((t, i) => ( + + 📞 {t} + + + ))} + + ); + })} + + ); + })} {(data.matriz_etiq || []).length > 0 && ( Total