feat(modal): ordenar atuações por data e ajustar layout do nome

- Adicionar ordenação das atuações por data (mais recente primeiro)
- Ajustar grid de dados pessoais para campo nome ocupar 2 colunas
- Reduzir minmax do grid de 220px para 150px para melhor distribuição
This commit is contained in:
Frederico Castro
2025-12-20 07:20:57 -03:00
parent 26492c880c
commit f7557831eb
2 changed files with 71 additions and 4 deletions

View File

@@ -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;