feat(ui): expandir modal de dados e melhorar template PDF
- Expandir RawDataModal com mais funcionalidades de visualização - Ajustar template HTML da ficha do consultor - Adicionar configuração MCP do projeto - Atualizar gitignore para ignorar arquivos locais
This commit is contained in:
@@ -481,15 +481,38 @@
|
||||
min-width: 35px;
|
||||
}
|
||||
|
||||
.atuacao-tipo {
|
||||
.atuacao-main {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 0.15rem;
|
||||
flex: 1;
|
||||
min-width: 0;
|
||||
}
|
||||
|
||||
.atuacao-tipo {
|
||||
font-size: 0.9rem;
|
||||
color: #e2e8f0;
|
||||
font-weight: 500;
|
||||
}
|
||||
|
||||
.atuacao-summary {
|
||||
font-size: 0.75rem;
|
||||
color: #94a3b8;
|
||||
line-height: 1.3;
|
||||
white-space: nowrap;
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
}
|
||||
|
||||
.atuacao-meta {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: flex-end;
|
||||
gap: 0.2rem;
|
||||
}
|
||||
|
||||
.atuacao-periodo {
|
||||
font-size: 0.8rem;
|
||||
font-size: 0.75rem;
|
||||
color: #94a3b8;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
@@ -501,6 +524,16 @@
|
||||
font-weight: 600;
|
||||
}
|
||||
|
||||
.atuacao-meta-line {
|
||||
font-size: 0.72rem;
|
||||
color: #7dd3fc;
|
||||
text-align: right;
|
||||
max-width: 260px;
|
||||
white-space: nowrap;
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
}
|
||||
|
||||
.atuacao-toggle {
|
||||
color: #64748b;
|
||||
font-size: 1.1rem;
|
||||
@@ -611,7 +644,7 @@
|
||||
flex-wrap: wrap;
|
||||
}
|
||||
|
||||
.atuacao-tipo {
|
||||
.atuacao-main {
|
||||
order: 1;
|
||||
flex: 1 1 100%;
|
||||
}
|
||||
@@ -620,9 +653,10 @@
|
||||
order: 2;
|
||||
}
|
||||
|
||||
.atuacao-periodo {
|
||||
.atuacao-meta {
|
||||
order: 3;
|
||||
flex: 1;
|
||||
align-items: flex-start;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.atuacao-toggle {
|
||||
|
||||
@@ -61,6 +61,33 @@ const LABEL_MAP = {
|
||||
colegio: 'Colégio',
|
||||
ies: 'IES',
|
||||
programa: 'Programa',
|
||||
nomeEmpregador: 'Empregador',
|
||||
emprego: 'Vínculo',
|
||||
atividade: 'Atividade',
|
||||
dtAdmissao: 'Admissão',
|
||||
dtDesligamento: 'Desligamento',
|
||||
cnpjEmpregador: 'CNPJ Empregador',
|
||||
profissao: 'Profissão',
|
||||
matricula: 'Matrícula',
|
||||
vinculo: 'Vínculo',
|
||||
historico: 'Histórico',
|
||||
inicioRelacionamento: 'Início Relacionamento',
|
||||
fimRelacionamento: 'Fim Relacionamento',
|
||||
categoria: 'Categoria',
|
||||
tipoVinculo: 'Tipo de Vínculo',
|
||||
vinculoTrabalho: 'Vínculo de Trabalho',
|
||||
regimeTrabalho: 'Regime de Trabalho',
|
||||
cargaHoraria: 'Carga Horária',
|
||||
linhaPesquisa: 'Linha de Pesquisa',
|
||||
areaConcentracao: 'Área de Concentração',
|
||||
areaPesquisa: 'Área de Pesquisa',
|
||||
consultorResponsavel: 'Consultor Responsável',
|
||||
unidadeOrganizacional: 'Unidade Organizacional',
|
||||
localEvento: 'Local do Evento',
|
||||
nrProcesso: 'Número do Processo',
|
||||
idProcesso: 'ID do Processo',
|
||||
anoInicio: 'Ano de Início',
|
||||
tipoTrabalho: 'Tipo de Trabalho',
|
||||
inicioVinculacao: 'Início Vinculação',
|
||||
fimVinculacao: 'Fim Vinculação',
|
||||
inicioSituacao: 'Início Situação',
|
||||
@@ -78,6 +105,11 @@ const LABEL_MAP = {
|
||||
nivel: 'Nível',
|
||||
modalidade: 'Modalidade',
|
||||
camaraTematica: 'Câmara Temática',
|
||||
totalOrientacaoFinalizadaMestrado: 'Orientações Finalizadas (Mestrado)',
|
||||
totalOrientacaoFinalizadaDoutorado: 'Orientações Finalizadas (Doutorado)',
|
||||
totalOrientacaoAndamentoMestrado: 'Orientações em Andamento (Mestrado)',
|
||||
totalOrientacaoAndamentoDoutorado: 'Orientações em Andamento (Doutorado)',
|
||||
totalAcompanhamentoPosDoutorado: 'Acompanhamentos Pós-Doutorado',
|
||||
};
|
||||
|
||||
const formatLabel = (key) => LABEL_MAP[key] || key.replace(/([A-Z])/g, ' $1').replace(/^./, s => s.toUpperCase());
|
||||
@@ -154,6 +186,122 @@ const AtuacaoCard = ({ atuacao, index }) => {
|
||||
const [expanded, setExpanded] = useState(false);
|
||||
const tipo = atuacao.tipo || 'Tipo não informado';
|
||||
|
||||
const getNestedValue = (obj, path) => {
|
||||
if (!obj || !path) return undefined;
|
||||
return path.split('.').reduce((acc, key) => (acc ? acc[key] : undefined), obj);
|
||||
};
|
||||
|
||||
const joinParts = (parts) => parts.filter(Boolean).join(' · ');
|
||||
|
||||
const buildSummary = () => {
|
||||
const tipoLower = tipo.toLowerCase();
|
||||
const dadosDocencia = atuacao.dadosDocencia || {};
|
||||
const dadosEmprego = atuacao.dadosEmprego || {};
|
||||
const dadosEvento = atuacao.dadosEvento || atuacao.dadosParticipacaoEvento || {};
|
||||
const dadosProjeto = atuacao.dadosProjeto || {};
|
||||
const dadosProcesso = atuacao.dadosProcesso || {};
|
||||
const dadosOrientacaoDiscente = atuacao.dadosOrientacaoDiscente || {};
|
||||
|
||||
if (tipoLower.includes('docência') || tipoLower.includes('docencia')) {
|
||||
const ies = dadosDocencia.ies?.sigla
|
||||
? `${dadosDocencia.ies.sigla} — ${dadosDocencia.ies.nome}`
|
||||
: dadosDocencia.ies?.nome;
|
||||
const primary = joinParts([
|
||||
dadosDocencia.programa?.nome || dadosDocencia.areaConhecimento?.nome || atuacao.descricao,
|
||||
ies,
|
||||
dadosDocencia.categoria,
|
||||
]);
|
||||
const secondary = joinParts([
|
||||
dadosDocencia.tipoVinculo,
|
||||
dadosDocencia.regimeTrabalho,
|
||||
dadosDocencia.cargaHoraria ? `${dadosDocencia.cargaHoraria}h` : null,
|
||||
]);
|
||||
return { primary, secondary };
|
||||
}
|
||||
|
||||
if (tipoLower.includes('emprego')) {
|
||||
const primary = joinParts([
|
||||
dadosEmprego.nomeEmpregador || atuacao.descricao,
|
||||
dadosEmprego.emprego || dadosEmprego.vinculo,
|
||||
dadosEmprego.atividade,
|
||||
]);
|
||||
const secondary = joinParts([
|
||||
dadosEmprego.dtAdmissao,
|
||||
dadosEmprego.dtDesligamento ? `até ${dadosEmprego.dtDesligamento}` : null,
|
||||
dadosEmprego.profissao,
|
||||
]);
|
||||
return { primary, secondary };
|
||||
}
|
||||
|
||||
if (tipoLower.includes('evento')) {
|
||||
const primary = joinParts([
|
||||
dadosEvento.nome || atuacao.descricao,
|
||||
dadosEvento.unidadeOrganizacional,
|
||||
dadosEvento.localEvento,
|
||||
]);
|
||||
const secondary = joinParts([
|
||||
dadosEvento.atividade,
|
||||
dadosEvento.tipo,
|
||||
dadosEvento.codigo ? `Código ${dadosEvento.codigo}` : null,
|
||||
]);
|
||||
return { primary, secondary };
|
||||
}
|
||||
|
||||
if (tipoLower.includes('projeto')) {
|
||||
const primary = joinParts([
|
||||
dadosProjeto.nome || atuacao.descricao,
|
||||
dadosProjeto.programa?.nome,
|
||||
dadosProjeto.ies?.sigla || dadosProjeto.ies?.nome,
|
||||
]);
|
||||
const secondary = joinParts([
|
||||
dadosProjeto.situacao,
|
||||
dadosProjeto.linhaPesquisa,
|
||||
dadosProjeto.anoInicio ? `Início ${dadosProjeto.anoInicio}` : null,
|
||||
]);
|
||||
return { primary, secondary };
|
||||
}
|
||||
|
||||
if (tipoLower.includes('orientação de discentes') || tipoLower.includes('orientacao de discentes')) {
|
||||
const mestradoParts = [];
|
||||
if (dadosOrientacaoDiscente.totalOrientacaoFinalizadaMestrado) {
|
||||
mestradoParts.push(`Finalizadas ${dadosOrientacaoDiscente.totalOrientacaoFinalizadaMestrado}`);
|
||||
}
|
||||
if (dadosOrientacaoDiscente.totalOrientacaoAndamentoMestrado) {
|
||||
mestradoParts.push(`Andamento ${dadosOrientacaoDiscente.totalOrientacaoAndamentoMestrado}`);
|
||||
}
|
||||
const doutoradoParts = [];
|
||||
if (dadosOrientacaoDiscente.totalOrientacaoFinalizadaDoutorado) {
|
||||
doutoradoParts.push(`Finalizadas ${dadosOrientacaoDiscente.totalOrientacaoFinalizadaDoutorado}`);
|
||||
}
|
||||
if (dadosOrientacaoDiscente.totalOrientacaoAndamentoDoutorado) {
|
||||
doutoradoParts.push(`Andamento ${dadosOrientacaoDiscente.totalOrientacaoAndamentoDoutorado}`);
|
||||
}
|
||||
const primary = joinParts([
|
||||
mestradoParts.length ? `Mestrado ${mestradoParts.join(' / ')}` : null,
|
||||
doutoradoParts.length ? `Doutorado ${doutoradoParts.join(' / ')}` : null,
|
||||
]);
|
||||
const secondary = dadosOrientacaoDiscente.totalAcompanhamentoPosDoutorado
|
||||
? `Pós-doc ${dadosOrientacaoDiscente.totalAcompanhamentoPosDoutorado}`
|
||||
: null;
|
||||
return { primary, secondary };
|
||||
}
|
||||
|
||||
if (tipoLower.includes('processo')) {
|
||||
const iesLabel = dadosProcesso.ies?.sigla || dadosProcesso.ies?.nome;
|
||||
const primary = joinParts([dadosProcesso.nrProcesso || atuacao.descricao, iesLabel]);
|
||||
const secondary = dadosProcesso.ies?.statusJuridico
|
||||
? `IES ${dadosProcesso.ies.statusJuridico.trim()}`
|
||||
: null;
|
||||
return { primary, secondary };
|
||||
}
|
||||
|
||||
const fallbackPrimary = joinParts([
|
||||
atuacao.descricao,
|
||||
getNestedValue(atuacao, 'procedencia.origem'),
|
||||
]);
|
||||
return { primary: fallbackPrimary, secondary: null };
|
||||
};
|
||||
|
||||
const getAtuacaoColor = (tipo) => {
|
||||
if (tipo.includes('Coordenação')) return 'atuacao-coordenacao';
|
||||
if (tipo.includes('Consultor')) return 'atuacao-consultoria';
|
||||
@@ -177,8 +325,17 @@ const AtuacaoCard = ({ atuacao, index }) => {
|
||||
'dadosParticipacaoInscricaoPremio',
|
||||
'dadosBolsistaCNPq',
|
||||
'dadosOrientacao',
|
||||
'dadosOrientacaoDiscente',
|
||||
'dadosParticipacao',
|
||||
'dadosParticipacaoEvento',
|
||||
'dadosGestaoPrograma',
|
||||
'dadosDocencia',
|
||||
'dadosEmprego',
|
||||
'dadosEvento',
|
||||
'dadosProjeto',
|
||||
'dadosProcesso',
|
||||
'dadosAnaliseProcesso',
|
||||
'dadosPapelPessoa',
|
||||
];
|
||||
|
||||
const dateKeys = ['inicio', 'fim', 'inicioVinculacao', 'fimVinculacao', 'inicioSituacao', 'inativacaoSituacao'];
|
||||
@@ -196,6 +353,13 @@ const AtuacaoCard = ({ atuacao, index }) => {
|
||||
}
|
||||
});
|
||||
|
||||
const baseKeys = ['descricao', 'quantidade', 'id', 'procedencia'];
|
||||
baseKeys.forEach((key) => {
|
||||
if (atuacao[key] !== null && atuacao[key] !== undefined && allData[key] === undefined) {
|
||||
allData[key] = atuacao[key];
|
||||
}
|
||||
});
|
||||
|
||||
if (Object.keys(allData).length === 0) {
|
||||
if (atuacao.inicio) allData.inicio = atuacao.inicio;
|
||||
if (atuacao.fim) allData.fim = atuacao.fim;
|
||||
@@ -207,16 +371,23 @@ const AtuacaoCard = ({ atuacao, index }) => {
|
||||
|
||||
const dados = getAllDados();
|
||||
const hasData = Object.keys(dados).length > 0;
|
||||
const summary = buildSummary();
|
||||
|
||||
return (
|
||||
<div className={`atuacao-card ${getAtuacaoColor(tipo)}`}>
|
||||
<div className="atuacao-header" onClick={() => setExpanded(!expanded)}>
|
||||
<span className="atuacao-index">#{index + 1}</span>
|
||||
<span className="atuacao-tipo">{tipo}</span>
|
||||
<div className="atuacao-periodo">
|
||||
{atuacao.inicio && <span>{formatDate(atuacao.inicio)}</span>}
|
||||
{atuacao.inicio && atuacao.fim && <span> - </span>}
|
||||
{atuacao.fim ? <span>{formatDate(atuacao.fim)}</span> : atuacao.inicio && <span className="ativo">Atual</span>}
|
||||
<div className="atuacao-main">
|
||||
<span className="atuacao-tipo">{tipo}</span>
|
||||
{summary.primary && <span className="atuacao-summary">{summary.primary}</span>}
|
||||
</div>
|
||||
<div className="atuacao-meta">
|
||||
<div className="atuacao-periodo">
|
||||
{atuacao.inicio && <span>{formatDate(atuacao.inicio)}</span>}
|
||||
{atuacao.inicio && atuacao.fim && <span> - </span>}
|
||||
{atuacao.fim ? <span>{formatDate(atuacao.fim)}</span> : atuacao.inicio && <span className="ativo">Atual</span>}
|
||||
</div>
|
||||
{summary.secondary && <div className="atuacao-meta-line">{summary.secondary}</div>}
|
||||
</div>
|
||||
<span className="atuacao-toggle">{expanded ? '−' : '+'}</span>
|
||||
</div>
|
||||
|
||||
Reference in New Issue
Block a user