import { SearchableSelect } from '../../components/SearchableSelect'; import { useEffect, useState } from 'react'; import { Link } from 'react-router'; import { Alert, EmptyState, LoadingBlock, errorMessage } from '../../components/Feedback'; import { Icon } from '../../components/Icon'; import { listFindingCatalogProposals, reviewFindingCatalogProposal } from '../../lib/api'; import type { FindingAdminCatalog, FindingCatalogProposal } from '../../lib/api'; export function FindingCatalogProposalsPanel({ catalog }: { catalog: FindingAdminCatalog }) { const [items, setItems] = useState([]); const [matches, setMatches] = useState>({}); const [loading, setLoading] = useState(true); const [busyId, setBusyId] = useState(''); const [error, setError] = useState(''); const [success, setSuccess] = useState(''); const load = () => listFindingCatalogProposals({ status: 'PENDING' }).then(setItems); useEffect(() => { load().catch((requestError) => setError(errorMessage(requestError))).finally(() => setLoading(false)); }, []); const review = async (proposal: FindingCatalogProposal, decision: 'MATCH' | 'REJECT') => { setBusyId(proposal.id); setError(''); setSuccess(''); try { if (decision === 'MATCH' && !matches[proposal.id]) { setError('Seleccioná primero el tipo de hallazgo del catálogo que corresponde.'); return; } await reviewFindingCatalogProposal(proposal.id, { decision, catalogItemId: decision === 'MATCH' ? matches[proposal.id] : undefined, notes: decision === 'REJECT' ? 'Propuesta descartada desde administración de catálogo.' : 'Propuesta vinculada a un tipo existente del catálogo.', }); await load(); setSuccess(decision === 'MATCH' ? 'Propuesta incorporada al criterio de catálogo futuro.' : 'Propuesta descartada sin modificar el hallazgo histórico.'); } catch (requestError) { setError(errorMessage(requestError)); } finally { setBusyId(''); } }; if (loading) return
; return
PROPUESTAS DESDE CAMPO

Hallazgos cargados como OTROS

El hallazgo original queda intacto. Esta bandeja sirve para decidir si conviene sumar esa opción al catálogo para inspecciones futuras.

{items.length} pendientes
{error && {error}}{success && {success}} {items.length === 0 ? :
{items.map((proposal) =>
{proposal.assetTypeName} · {proposal.assetCode}

{proposal.proposedTitle}

{proposal.description}

{proposal.findingCode} · {proposal.assetName}{proposal.proposedSeverity ? ` · gravedad ${proposal.proposedSeverity}/10` : ''}
Si todavía no existe una opción adecuada, creala en el catálogo y luego vinculá esta propuesta.
)}
}
; }