diff --git a/frontend/src/components/RawDataModal.css b/frontend/src/components/RawDataModal.css index fd73a9d..557aacf 100644 --- a/frontend/src/components/RawDataModal.css +++ b/frontend/src/components/RawDataModal.css @@ -310,10 +310,14 @@ .dados-pessoais-grid { display: grid; - grid-template-columns: repeat(auto-fill, minmax(220px, 1fr)); + grid-template-columns: repeat(auto-fill, minmax(150px, 1fr)); gap: 1rem; } +.dados-pessoais-grid .data-field.destaque { + grid-column: span 2; +} + .data-field { display: flex; flex-direction: column; diff --git a/frontend/src/components/RawDataModal.jsx b/frontend/src/components/RawDataModal.jsx index 764b404..808d8aa 100644 --- a/frontend/src/components/RawDataModal.jsx +++ b/frontend/src/components/RawDataModal.jsx @@ -114,6 +114,67 @@ const LABEL_MAP = { const formatLabel = (key) => LABEL_MAP[key] || key.replace(/([A-Z])/g, ' $1').replace(/^./, s => s.toUpperCase()); +const parseDate = (dateStr) => { + if (!dateStr) return null; + try { + if (dateStr.includes('/')) { + const parts = dateStr.split('/'); + if (parts.length === 3) { + const [day, month, year] = parts; + return new Date(year, month - 1, day); + } + } + const date = new Date(dateStr); + return isNaN(date.getTime()) ? null : date; + } catch { + return null; + } +}; + +const getAtuacaoDate = (atuacao) => { + const candidateDates = [ + atuacao.inicio, + atuacao.fim, + atuacao.dadosEmprego?.dtAdmissao, + atuacao.dadosEmprego?.dtDesligamento, + atuacao.dadosDocencia?.inicioVinculacao, + atuacao.dadosDocencia?.fimVinculacao, + atuacao.dadosCoordenacaoArea?.inicioVinculacao, + atuacao.dadosCoordenacaoArea?.fimVinculacao, + atuacao.dadosHistoricoCoordenacaoArea?.inicioVinculacao, + atuacao.dadosHistoricoCoordenacaoArea?.fimVinculacao, + atuacao.dadosConsultoria?.inicioVinculacao, + atuacao.dadosConsultoria?.fimVinculacao, + atuacao.dadosConsultoria?.inicioSituacao, + atuacao.dadosConsultoria?.inativacaoSituacao, + atuacao.dadosEvento?.inicio, + atuacao.dadosEvento?.fim, + atuacao.dadosParticipacaoEvento?.inicio, + atuacao.dadosParticipacaoEvento?.fim, + atuacao.dadosPremiacaoPremio?.ano ? `01/01/${atuacao.dadosPremiacaoPremio.ano}` : null, + atuacao.dadosParticipacaoPremio?.ano ? `01/01/${atuacao.dadosParticipacaoPremio.ano}` : null, + atuacao.dadosParticipacaoInscricaoPremio?.ano ? `01/01/${atuacao.dadosParticipacaoInscricaoPremio.ano}` : null, + atuacao.dadosProjeto?.anoInicio ? `01/01/${atuacao.dadosProjeto.anoInicio}` : null, + ]; + + for (const dateStr of candidateDates) { + const date = parseDate(dateStr); + if (date) return date; + } + return null; +}; + +const sortAtuacoesByDate = (atuacoes) => { + return [...atuacoes].sort((a, b) => { + const dateA = getAtuacaoDate(a); + const dateB = getAtuacaoDate(b); + if (!dateA && !dateB) return 0; + if (!dateA) return 1; + if (!dateB) return -1; + return dateB.getTime() - dateA.getTime(); + }); +}; + const DataField = ({ label, value, className = '' }) => { const formattedValue = formatValue(value); if (formattedValue === null) return null; @@ -470,9 +531,11 @@ const RawDataModal = ({ idPessoa, nome, onClose }) => { const atuacoes = source.atuacoes || []; const tiposAtuacao = [...new Set(atuacoes.map(a => a.tipo))].sort(); - const atuacoesFiltradas = filterType === 'all' - ? atuacoes - : atuacoes.filter(a => a.tipo === filterType); + const atuacoesFiltradas = sortAtuacoesByDate( + filterType === 'all' + ? atuacoes + : atuacoes.filter(a => a.tipo === filterType) + ); const atuacoesPorTipo = tiposAtuacao.reduce((acc, tipo) => { acc[tipo] = atuacoes.filter(a => a.tipo === tipo).length;