From 1e15ab64caa2832755c8aba0bfafeed7f5970110 Mon Sep 17 00:00:00 2001 From: Frederico Castro Date: Fri, 26 Dec 2025 23:59:01 -0300 Subject: [PATCH] fix(frontend): ajustes finais na secao Lattes --- frontend/src/components/ConsultorCard.css | 48 +++++ frontend/src/components/ConsultorCard.jsx | 210 +++++++++++++++++++--- 2 files changed, 231 insertions(+), 27 deletions(-) diff --git a/frontend/src/components/ConsultorCard.css b/frontend/src/components/ConsultorCard.css index 5be68aa..aea0ef6 100644 --- a/frontend/src/components/ConsultorCard.css +++ b/frontend/src/components/ConsultorCard.css @@ -1559,3 +1559,51 @@ color: var(--muted); font-size: 0.75rem; } + +.tipo-modal-voltar { + background: rgba(99, 102, 241, 0.15); + border: 1px solid rgba(99, 102, 241, 0.3); + border-radius: 6px; + color: #a5b4fc; + font-size: 0.8rem; + font-weight: 500; + padding: 0.35rem 0.65rem; + cursor: pointer; + transition: all 200ms ease; + margin-right: 0.75rem; +} + +.tipo-modal-voltar:hover { + background: rgba(99, 102, 241, 0.25); + border-color: rgba(99, 102, 241, 0.5); + color: #c7d2fe; +} + +.modal-item-clicavel { + cursor: pointer; + position: relative; + transition: all 150ms ease; + padding-right: 2rem; +} + +.modal-item-clicavel:hover { + background: rgba(79, 70, 229, 0.12); + border-color: rgba(79, 70, 229, 0.4); + transform: translateX(3px); +} + +.modal-item-arrow { + position: absolute; + right: 0.75rem; + top: 50%; + transform: translateY(-50%); + color: var(--accent); + font-size: 0.9rem; + opacity: 0.5; + transition: all 150ms ease; +} + +.modal-item-clicavel:hover .modal-item-arrow { + opacity: 1; + transform: translateY(-50%) translateX(3px); +} diff --git a/frontend/src/components/ConsultorCard.jsx b/frontend/src/components/ConsultorCard.jsx index 0503be9..a2f086b 100644 --- a/frontend/src/components/ConsultorCard.jsx +++ b/frontend/src/components/ConsultorCard.jsx @@ -688,30 +688,43 @@ const SeloModal = ({ selo, consultor, onClose }) => { }; const ItemDetalheModal = ({ item, tipo, onClose }) => { + const [subDetalhe, setSubDetalhe] = useState(null); + if (!item || !tipo) return null; const formatDate = (dateStr) => { if (!dateStr) return 'N/A'; + if (dateStr.includes('/')) { + const parts = dateStr.split(' ')[0].split('/'); + if (parts.length === 3) { + return `${parts[0]}/${parts[1]}/${parts[2]}`; + } + } return new Date(dateStr).toLocaleDateString('pt-BR'); }; + const currentItem = subDetalhe?.item || item; + const currentTipo = subDetalhe?.tipo || tipo; + const getTitulo = () => { - switch (tipo) { + switch (currentTipo) { case 'titulacao': return 'Titulação'; - case 'producoes_lattes': return 'Produções Lattes'; + case 'producoes_lattes': return 'Currículo Lattes'; case 'vinculo': return 'Vínculo de Consultoria'; case 'coordenacao': return 'Coordenação CAPES'; case 'premiacao': return 'Premiação'; case 'avaliacao': return 'Avaliação de Comissão'; case 'inscricao': return 'Inscrição em Prêmio'; - case 'participacao': return item.codigo === 'PROJ' ? 'Projeto' : 'Evento'; + case 'participacao': return currentItem.codigo === 'PROJ' ? 'Projeto' : 'Evento'; case 'orientacao': return 'Orientação'; + case 'orientacao_lattes': return 'Orientação Concluída'; + case 'idioma': return 'Idioma'; default: return 'Detalhes'; } }; const getIcone = () => { - switch (tipo) { + switch (currentTipo) { case 'titulacao': return '🎓'; case 'producoes_lattes': return '📚'; case 'vinculo': return '💼'; @@ -719,45 +732,168 @@ const ItemDetalheModal = ({ item, tipo, onClose }) => { case 'premiacao': return '🏆'; case 'avaliacao': return '📋'; case 'inscricao': return '📝'; - case 'participacao': return item.codigo === 'PROJ' ? '📊' : '📅'; + case 'participacao': return currentItem.codigo === 'PROJ' ? '📊' : '📅'; case 'orientacao': return '🎓'; + case 'orientacao_lattes': return '👨‍🏫'; + case 'idioma': return '🌐'; default: return '📄'; } }; + const handleVoltar = () => { + setSubDetalhe(null); + }; + const renderContent = () => { - switch (tipo) { + switch (currentTipo) { case 'titulacao': { + const it = currentItem; return (
- Grau - {item.grau || 'N/A'} + Grau Acadêmico + {it.grau || 'N/A'}
- {item.area && ( + {it.area && (
- Área - {item.area} + Área de Conhecimento + {it.area}
)} - {(item.ies_sigla || item.ies_nome) && ( + {it.area_avaliacao && it.area_avaliacao !== it.area && ( +
+ Área de Avaliação + {it.area_avaliacao} +
+ )} + {(it.ies_sigla || it.ies_nome) && (
Instituição - {item.ies_sigla && item.ies_nome ? `${item.ies_sigla} - ${item.ies_nome}` : (item.ies_sigla || item.ies_nome)} + {it.ies_sigla && it.ies_nome ? `${it.ies_sigla} - ${it.ies_nome}` : (it.ies_sigla || it.ies_nome)}
)} - {item.pais && ( + {it.ies_status && (
- País - {item.pais} + Natureza Jurídica + {it.ies_status}
)} - {item.ano && ( + {it.programa && ( +
+ Programa + {it.programa} +
+ )} + {it.codigo_programa && ( +
+ Código do Programa + {it.codigo_programa} +
+ )} + {it.pais && ( +
+ País + {it.pais} +
+ )} + {it.ano && ( +
+ Ano de Conclusão + {it.ano} +
+ )} + {it.inicio && ( +
+ Início + {formatDate(it.inicio)} +
+ )} + {it.fim && ( +
+ Término + {formatDate(it.fim)} +
+ )} +
+ ); + } + + case 'orientacao_lattes': { + const o = currentItem; + return ( +
+ {o.orientando && ( +
+ Orientando + {o.orientando} +
+ )} + {o.tipo && ( +
+ Tipo + {o.tipo} +
+ )} + {o.titulo && ( +
+ Título + {o.titulo} +
+ )} + {o.ano && (
Ano - {item.ano} + {o.ano} +
+ )} + {o.programa && ( +
+ Programa + {o.programa} +
+ )} + {o.ies && ( +
+ Instituição + {o.ies} +
+ )} +
+ ); + } + + case 'idioma': { + const i = currentItem; + return ( +
+
+ Idioma + {i.idioma || 'N/A'} +
+ {i.proficiencia_leitura && ( +
+ Leitura + {i.proficiencia_leitura} +
+ )} + {i.proficiencia_escrita && ( +
+ Escrita + {i.proficiencia_escrita} +
+ )} + {i.proficiencia_fala && ( +
+ Fala + {i.proficiencia_fala} +
+ )} + {i.proficiencia_compreensao && ( +
+ Compreensão + {i.proficiencia_compreensao}
)}
@@ -791,10 +927,14 @@ const ItemDetalheModal = ({ item, tipo, onClose }) => { {titulacoes.length > 0 && ( <> -
Formação Acadêmica
+
Formação Acadêmica ({titulacoes.length})
@@ -814,10 +955,14 @@ const ItemDetalheModal = ({ item, tipo, onClose }) => { {idiomas.length > 0 && ( <> -
Idiomas
+
Idiomas ({idiomas.length})
@@ -838,8 +984,12 @@ const ItemDetalheModal = ({ item, tipo, onClose }) => { Orientações Concluídas ({item.total_orientacoes}) @@ -1138,6 +1289,11 @@ const ItemDetalheModal = ({ item, tipo, onClose }) => {
e.stopPropagation()}>
+ {subDetalhe && ( + + )} {getIcone()} {getTitulo()}