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:
@@ -310,10 +310,14 @@
|
|||||||
|
|
||||||
.dados-pessoais-grid {
|
.dados-pessoais-grid {
|
||||||
display: grid;
|
display: grid;
|
||||||
grid-template-columns: repeat(auto-fill, minmax(220px, 1fr));
|
grid-template-columns: repeat(auto-fill, minmax(150px, 1fr));
|
||||||
gap: 1rem;
|
gap: 1rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.dados-pessoais-grid .data-field.destaque {
|
||||||
|
grid-column: span 2;
|
||||||
|
}
|
||||||
|
|
||||||
.data-field {
|
.data-field {
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
|
|||||||
@@ -114,6 +114,67 @@ const LABEL_MAP = {
|
|||||||
|
|
||||||
const formatLabel = (key) => LABEL_MAP[key] || key.replace(/([A-Z])/g, ' $1').replace(/^./, s => s.toUpperCase());
|
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 DataField = ({ label, value, className = '' }) => {
|
||||||
const formattedValue = formatValue(value);
|
const formattedValue = formatValue(value);
|
||||||
if (formattedValue === null) return null;
|
if (formattedValue === null) return null;
|
||||||
@@ -470,9 +531,11 @@ const RawDataModal = ({ idPessoa, nome, onClose }) => {
|
|||||||
const atuacoes = source.atuacoes || [];
|
const atuacoes = source.atuacoes || [];
|
||||||
|
|
||||||
const tiposAtuacao = [...new Set(atuacoes.map(a => a.tipo))].sort();
|
const tiposAtuacao = [...new Set(atuacoes.map(a => a.tipo))].sort();
|
||||||
const atuacoesFiltradas = filterType === 'all'
|
const atuacoesFiltradas = sortAtuacoesByDate(
|
||||||
? atuacoes
|
filterType === 'all'
|
||||||
: atuacoes.filter(a => a.tipo === filterType);
|
? atuacoes
|
||||||
|
: atuacoes.filter(a => a.tipo === filterType)
|
||||||
|
);
|
||||||
|
|
||||||
const atuacoesPorTipo = tiposAtuacao.reduce((acc, tipo) => {
|
const atuacoesPorTipo = tiposAtuacao.reduce((acc, tipo) => {
|
||||||
acc[tipo] = atuacoes.filter(a => a.tipo === tipo).length;
|
acc[tipo] = atuacoes.filter(a => a.tipo === tipo).length;
|
||||||
|
|||||||
Reference in New Issue
Block a user