/* global React */ // Nueva Recomendación — pantalla interna, formulario único validado. // HU.1.1 / HU.1.2 / HU.1.4 — mismo patrón de diseño que "Nueva institución". const { useState: useStateN, useMemo: useMemoN } = React; const MECS = [ { id: 'MESICIC', org: 'OEA', desc: 'Mecanismo de Seguimiento de la Convención Interamericana contra la Corrupción' }, { id: 'UNCAC', org: 'ONU', desc: 'Convención de las Naciones Unidas contra la Corrupción' }, { id: 'OCDE', org: 'OCDE', desc: 'Grupo de Trabajo sobre Cohecho en Transacciones Comerciales' }, ]; const TITULO_MAX = 120; function validateRec(form) { const e = {}; const ronda = (form.ronda || '').trim(); if (!ronda) e.ronda = 'Indica la ronda o capítulo.'; const titulo = (form.titulo || '').trim(); if (!titulo) e.titulo = 'Ingresa un título corto interno.'; else if (titulo.length < 5) e.titulo = 'Mínimo 5 caracteres.'; else if (titulo.length > TITULO_MAX) e.titulo = `Máximo ${TITULO_MAX} caracteres.`; const texto = (form.texto || '').trim(); if (!texto) e.texto = 'Transcribe el texto de la recomendación.'; else if (texto.length < 20) e.texto = 'El texto es demasiado corto (mínimo 20 caracteres).'; if (!form.eje) e.eje = 'Selecciona el eje temático.'; if (!(form.instituciones || []).some(r => r.institucionId)) { e.instituciones = 'Asigna al menos una institución responsable.'; } return e; } function NuevaRecomendacionForm({ onCancel, onSave }) { const I = window.Icons; const [form, setForm] = useStateN({ mecanismo: (((window.cgrData && window.cgrData.mecanismos()) || [])[0] || { id: 'MESICIC' }).id, ronda: '', anio: '', idIntl: '', titulo: '', texto: '', eje: '', tipo: (function () { var ts = (window.cgrData ? window.cgrData.tiposMedida() : window.TIPOS_MEDIDA) || []; return ts[0] ? ts[0].label : 'Normativa'; })(), prioridad: ((window.cgrData && window.cgrData.prioridades()) || ['Alta'])[0] || 'Alta', capArt: '', instituciones: [{ institucionId: '', rol: 'Líder', plazo: '' }], archivos: [], }); const [touched, setTouched] = useStateN({}); const [submitAttempted, setSubmitAttempted] = useStateN(false); const errors = useMemoN(() => validateRec(form), [form]); const isValid = Object.keys(errors).length === 0; const update = (k, v) => setForm(f => ({ ...f, [k]: v })); const blur = (k) => setTouched(t => ({ ...t, [k]: true })); const showErr = (k) => (touched[k] || submitAttempted) && errors[k]; // Repetidor de instituciones responsables const setRow = (i, k, v) => setForm(f => ({ ...f, instituciones: f.instituciones.map((r, idx) => idx === i ? { ...r, [k]: v } : r) })); const addRow = () => setForm(f => ({ ...f, instituciones: [...f.instituciones, { institucionId: '', rol: 'Apoyo', plazo: '' }] })); const removeRow = (i) => setForm(f => ({ ...f, instituciones: f.instituciones.filter((_, idx) => idx !== i) })); const idInterno = `${form.mecanismo.slice(0, 3).toUpperCase()}-${(form.ronda || '').replace(/\s+/g, '') || '•••'}-•••`; const handleSubmit = () => { if (!isValid) { setSubmitAttempted(true); return; } onSave && onSave({ ...form, titulo: form.titulo.trim(), texto: form.texto.trim() }); }; return (
Registra una recomendación internacional indicando su mecanismo, texto oficial y clasificación. Al guardar se genera un ID interno y queda en estado inicial "Pendiente".
{sub}
}