/* global React */
// Catálogos del sistema (HU súper admin) — gestión de listas maestras:
// categorías (ejes temáticos), tipos de medida y niveles de prioridad.
// Solo visible para el rol 'superadmin' (ver modules-config.jsx).
// Persisten en localStorage (cat_ejes / cat_tipos / cat_prioridades) y se leen
// en vivo desde window.cgrData.* en los formularios de la plataforma.
const { useState: useStateCat, useEffect: useEffectCat } = React;
function prioTone(p) {
const s = (p || '').toLowerCase();
if (s.indexOf('alta') !== -1 || s.indexOf('crít') !== -1 || s.indexOf('crit') !== -1) return 'high';
if (s.indexOf('media') !== -1) return 'mid';
if (s.indexOf('baja') !== -1) return 'low';
return 'none';
}
// Chevron para los botones subir/bajar.
function CatChev({ dir }) {
return (
);
}
// Intercambia dos elementos del arreglo y devuelve una copia nueva.
function moveItem(list, i, dir) {
const j = i + dir;
if (j < 0 || j >= list.length) return list;
const c = list.slice();
const t = c[i]; c[i] = c[j]; c[j] = t;
return c;
}
// Control compacto de reordenar (subir/bajar).
function ReorderCtl({ i, total, onMove }) {
return (
);
}
// ---------- Catálogo de cadenas (ejes, prioridades) ----------
function StringCatalog({ titulo, sub, icon, items, setItems, placeholder, toneOf }) {
const I = window.Icons;
const Icon = I[icon] || I.ListChecks;
const [nuevo, setNuevo] = useStateCat('');
const [editIdx, setEditIdx] = useStateCat(-1);
const [editVal, setEditVal] = useStateCat('');
const dupe = (v, skip) => items.some((x, i) => i !== skip && x.toLowerCase() === v.toLowerCase());
const add = () => {
const v = nuevo.trim();
if (!v || dupe(v, -1)) return;
setItems(list => [...list, v]);
setNuevo('');
};
const startEdit = (i) => { setEditIdx(i); setEditVal(items[i]); };
const saveEdit = () => {
const v = editVal.trim();
if (!v || dupe(v, editIdx)) { setEditIdx(-1); return; }
setItems(list => list.map((x, idx) => idx === editIdx ? v : x));
setEditIdx(-1); setEditVal('');
};
const del = (i) => setItems(list => list.filter((_, idx) => idx !== i));
const move = (i, dir) => setItems(list => moveItem(list, i, dir));
const sortAZ = () => setItems(list => list.slice().sort((a, b) => String(a).localeCompare(String(b), 'es', { sensitivity: 'base' })));
return (
{sub} Naturaleza de la acción que exige una recomendación. Organismos y convenciones que emiten recomendaciones. El color elegido se usa en la “burbuja” del mecanismo en todo el sistema.{titulo}
{items.length}
{items.map((it, i) => (
Tipos de medida
{items.length}
{items.map((it, i) => (
Mecanismos de origen
{items.length}
{items.map((m, i) => (
Administra las listas maestras que alimentan los formularios de la plataforma. Los cambios se reflejan al instante al registrar o clasificar recomendaciones.