From 1f2f35d52344d6449e7896d569790f1fb0e947a1 Mon Sep 17 00:00:00 2001 From: Administrator Date: Tue, 22 Sep 2026 15:39:51 -0500 Subject: [PATCH] Actualizar frontend/src/pages/Ocupabilidad.jsx --- frontend/src/pages/Ocupabilidad.jsx | 86 ++++++++++++++++++++++------- 1 file changed, 67 insertions(+), 19 deletions(-) diff --git a/frontend/src/pages/Ocupabilidad.jsx b/frontend/src/pages/Ocupabilidad.jsx index a9849f9..7d677a0 100644 --- a/frontend/src/pages/Ocupabilidad.jsx +++ b/frontend/src/pages/Ocupabilidad.jsx @@ -8,8 +8,8 @@ import { setVistaActual, onRefrescar } from "../lib/vistaActual"; const MESES = ["ENERO","FEBRERO","MARZO","ABRIL","MAYO","JUNIO","JULIO","AGOSTO","SEPTIEMBRE","OCTUBRE","NOVIEMBRE","DICIEMBRE"]; const ANOS = [2024, 2025, 2026]; -const SEDES = ["TODOS", "LIMA", "AREQUIPA", "PIURA", "TRUJILLO"]; -const PROGRAMAS = ["TODOS", "SEMINARIOS", "OTROS", "TEAC", "TERC"]; +const SEDES = ["LIMA", "AREQUIPA", "PIURA", "TRUJILLO"]; +const PROGRAMAS = ["SEMINARIOS", "OTROS", "TEAC", "TERC"]; const COLS = ["PROGRAMA","FECHA INICIO","DÍAS PARA INICIO","TOTAL INSCRITOS","RETIRADOS","INSCRITOS EN CURSO","META INSCRITOS","AVANCE INSCRITOS","INSCRITOS MES","INSCRITOS P.C","INSCRITOS REFRIPERU","INSCRITOS CONTINUIDAD","OPC."]; @@ -44,8 +44,8 @@ export default function Ocupabilidad() { const [ano, setAno] = useState(hoy.getFullYear()); // meses = array de meses seleccionados (1-12). Permite elegir varios. const [meses, setMeses] = useState([hoy.getMonth() + 1]); - const [sede, setSede] = useState("TODOS"); - const [programa, setPrograma] = useState("TODOS"); + const [sedes, setSedes] = useState([]); // vacío = muestra todo (casillas desmarcadas) + const [programas, setProgramas] = useState([]); // vacío = muestra todo (casillas desmarcadas) const [mostrarRepro, setMostrarRepro] = useState(true); const [datos, setDatos] = useState([]); const [loading, setLoading] = useState(true); @@ -82,16 +82,19 @@ export default function Ocupabilidad() { // Clave estable de meses (ordenados) para las dependencias del effect. const mesesKey = useMemo(() => [...meses].sort((a, b) => a - b).join(","), [meses]); + const sedesKey = useMemo(() => [...sedes].sort().join(","), [sedes]); + const programasKey = useMemo(() => [...programas].sort().join(","), [programas]); useEffect(() => { let activo = true; const lista = mesesKey ? mesesKey.split(",").map(Number) : []; - setVistaActual(`ocupabilidad:${ano}|${mesesKey}|${sede}|${programa}`); + setVistaActual(`ocupabilidad:${ano}|${mesesKey}`); const cargar = () => { setLoading(true); setError(null); if (!lista.length) { setDatos([]); setLoading(false); return; } - // Una llamada por cada mes seleccionado; se juntan todas las filas. - Promise.all(lista.map((m) => api.ocupabilidad(ano, m, sede, programa))) + // Pedimos SIEMPRE "TODOS" (una llamada por mes, ya cacheada = rápido). + // El filtro por Sede/Programa se aplica en el frontend (instantáneo). + Promise.all(lista.map((m) => api.ocupabilidad(ano, m, "TODOS", "TODOS"))) .then((resArr) => { if (!activo) return; const juntos = []; @@ -104,17 +107,20 @@ export default function Ocupabilidad() { cargar(); const off = onRefrescar(cargar); return () => { activo = false; off(); }; - }, [ano, mesesKey, sede, programa]); + }, [ano, mesesKey]); // Toggle "Mostrar Reprogramados": si está apagado, ocultar filas de inicio const datosVisibles = useMemo(() => { let base = mostrarRepro ? datos : datos.filter((d) => String(d.dias_para_inicio).trim().toUpperCase() !== "REPROGRAMADO"); + // Filtro Sede/Programa en el frontend (instantáneo). Vacío = todo. + if (sedes.length) base = base.filter((d) => sedes.includes(String(d.Sede || "").toUpperCase())); + if (programas.length) base = base.filter((d) => programas.includes(String(d.Filtro_Programa || "").toUpperCase())); if (ordCol != null && ordDir) { base = [...base].sort((a, b) => _cmp(_valCol(a, ordCol), _valCol(b, ordCol), ordDir)); } return base; - }, [datos, mostrarRepro, ordCol, ordDir]); + }, [datos, mostrarRepro, sedes, programas, ordCol, ordDir]); const kpis = useMemo(() => { if (!datosVisibles.length) return null; @@ -197,8 +203,8 @@ export default function Ocupabilidad() { setAno(+v)} minWidth={110} /> - - + +