/* global React */
// Compromisos: listado + filtros + acciones (Admin / Súper Admin CGR)
// HU.1.1, HU.1.2, HU.1.3, HU.1.4, HU.5.3 (buscador y filtros)
const { useState: useStateC, useMemo: useMemoC } = React;
// ---------------- KPI tira ----------------
function CompKpi({ icon, label, num, sub, tone }) {
const I = window.Icons;
return (
{React.createElement(I[icon], { size: 15 })}
{num}
{label}
{sub &&
{sub}
}
);
}
// ---------------- Chips de filtros rápidos ----------------
function ChipsRow({ items, value, onChange }) {
return (
{items.map(it => (
))}
);
}
// ---------------- Selector (popup mock) ----------------
function FilterDropdown({ icon, label, value, options, onChange }) {
const I = window.Icons;
const [open, setOpen] = useStateC(false);
return (
{open && (
<>
setOpen(false)}>
{options.map(o => (
))}
>
)}
);
}
// ---------------- Fila de la tabla ----------------
function CompRow({ c, onOpen }) {
const I = window.Icons;
const dCls = c.d < 0 ? 'is-overdue' : c.d <= 3 ? 'is-soon' : c.d <= 7 ? 'is-warnish' : '';
return (
onOpen(c.id)}>
|
{c.id}
{c.idIntl}
|
{c.text}
{c.instituciones.length} inst.
{c.vinc > 0 && {c.vinc} vinc.}
{c.avances} avances
|
{c.mecanismo}
{c.ronda}
|
{c.eje}
{c.tipo} · {c.prioridad}
|
{c.instituciones.slice(0, 2).map(i => {i})}
{c.instituciones.length > 2 && +{c.instituciones.length - 2}}
|
{c.plazo}
{c.d < 0 ? `D+${Math.abs(c.d)} (vencido)` : c.d === 0 ? 'Vence hoy' : `D-${c.d}`}
|
|
e.stopPropagation()}>
|
);
}
// ---------------- Pantalla principal ----------------
function CompromisosScreen({ onOpenDetalle, onOpenNueva }) {
const I = window.Icons;
const all = window.COMPROMISOS_FULL;
const [q, setQ] = useStateC('');
const [mech, setMech] = useStateC('Todos');
const [estado, setEstado] = useStateC('Todos');
const [inst, setInst] = useStateC('Todas las 47');
const [eje, setEje] = useStateC('Todos los ejes');
const [ronda, setRonda] = useStateC('Todas');
const filtered = useMemoC(() => {
return all.filter(c => {
if (q && !(`${c.id} ${c.text} ${c.instituciones.join(' ')}`).toLowerCase().includes(q.toLowerCase())) return false;
if (mech !== 'Todos' && c.mecanismo !== mech) return false;
if (estado === 'Cumplidos' && c.estado !== 'ok') return false;
if (estado === 'Parciales' && c.estado !== 'partial') return false;
if (estado === 'No cumplidos' && c.estado !== 'bad') return false;
if (estado === 'Vencidos sin avance' && c.d >= 0) return false;
if (eje !== 'Todos los ejes' && c.eje !== eje) return false;
return true;
});
}, [all, q, mech, estado, inst, eje, ronda]);
// KPIs derivados (simulando totales del sistema 527)
const total = 527;
const cumplidos = 184;
const parciales = 248;
const noCump = 78;
const vencidos = 17;
return (
{/* Header */}
CGR · Dirección de Análisis de Datos
Compromisos
Inventario consolidado de recomendaciones internacionales. Registra, clasifica, asigna y
vincula compromisos de los tres mecanismos.
{/* KPI strip */}
{/* Search */}
setQ(e.target.value)}
/>
{q && }
⌘ K
{/* Chips: mecanismo */}
{/* Chips: estado */}
{/* Filtros secundarios */}
{}}
options={['Todos', 'Normativa', 'Administrativa', 'Operativa']} />
{/* Resultados / Tabla */}
Resultados · vista detallada
Mostrando {filtered.length} de 527 · ordenados por proximidad de vencimiento
| ID |
Recomendación |
Mecanismo |
Clasificación |
Instituciones |
Vence |
Estado |
|
{filtered.map(c => )}
{filtered.length === 0 && (
Sin resultados con los filtros aplicados
Intenta con otras palabras clave o limpia los filtros.
)}
Página 1 de 44 · 12 por página
…
);
}
Object.assign(window, { CompromisosScreen });