MediaWiki:Common.js: mudanças entre as edições
Aparência
Sem resumo de edição |
Sem resumo de edição |
||
| Linha 39: | Linha 39: | ||
/* | /* ========================================================================== | ||
SISTEMA ORBITAL DE ANEXOS - ENGINE COMPLETA (nr.wiki.br) | |||
========================================================================== */ | |||
function processarSistemaOrbital($containerOrbital) { | |||
if (!$containerOrbital.length) return; | |||
var $listaPlanetas = $containerOrbital.find('.planeta-satelite'); | var $listaPlanetas = $containerOrbital.find('.planeta-satelite'); | ||
var totalPlanetas = $listaPlanetas.length; | var totalPlanetas = $listaPlanetas.length; | ||
| Linha 59: | Linha 60: | ||
if (urlAtual.indexOf('_AN_') !== -1 || urlAtual.indexOf(' AN ') !== -1) { | if (urlAtual.indexOf('_AN_') !== -1 || urlAtual.indexOf(' AN ') !== -1) { | ||
var partes = urlAtual.split(/_AN_| AN /i); | var partes = urlAtual.split(/_AN_| AN /i); | ||
if (partes.length > 1) { | if (partes.length > 1) { | ||
| Linha 65: | Linha 65: | ||
} | } | ||
} else { | } else { | ||
idAnexoAtivo = "0"; | idAnexoAtivo = "0"; | ||
} | } | ||
| Linha 71: | Linha 70: | ||
// 2. DESABILITA O RE-CLIQUE COM PRECISÃO DO NAVEGADOR | // 2. DESABILITA O RE-CLIQUE COM PRECISÃO DO NAVEGADOR | ||
if (idAnexoAtivo === "0") { | if (idAnexoAtivo === "0") { | ||
var $sol = $containerOrbital.find('.bolha-centro'); | var $sol = $containerOrbital.find('.bolha-centro'); | ||
var $spanSol = $sol.find('.nome-norma-centro').detach(); | var $spanSol = $sol.find('.nome-norma-centro').detach(); | ||
| Linha 77: | Linha 75: | ||
} | } | ||
// Mapeamento manual de nomes especiais | // Mapeamento manual de nomes especiais (Seu original) | ||
var mapeamentoNomes = { | var mapeamentoNomes = { | ||
"30": "13-A", | "30": "13-A", | ||
| Linha 92: | Linha 90: | ||
var idOrigem = $item.data('anexo').toString().trim(); | var idOrigem = $item.data('anexo').toString().trim(); | ||
if (idOrigem === idAnexoAtivo) { | if (idOrigem === idAnexoAtivo) { | ||
$item.addClass('pagina-ativa'); | $item.addClass('pagina-ativa'); | ||
| Linha 105: | Linha 102: | ||
$item.find('span').html("Anexo<br>" + textoSimples); | $item.find('span').html("Anexo<br>" + textoSimples); | ||
} | } | ||
var $spanLimpo = $item.find('span').detach(); | var $spanLimpo = $item.find('span').detach(); | ||
$item.empty().append($spanLimpo); | $item.empty().append($spanLimpo); | ||
} else { | } else { | ||
if (mapeamentoNomes[idOrigem]) { | if (mapeamentoNomes[idOrigem]) { | ||
if (mapeamentoNomes[idOrigem] === "Glossário" || mapeamentoNomes[idOrigem] === "(*)") { | if (mapeamentoNomes[idOrigem] === "Glossário" || mapeamentoNomes[idOrigem] === "(*)") { | ||
| Linha 121: | Linha 116: | ||
} | } | ||
// CÁLCULO TRIGONOMÉTRICO ORIGINAL - EVITA EMPILHAMENTO | |||
var angulo = (index * (2 * Math.PI) / totalPlanetas) - (Math.PI / 2); | var angulo = (index * (2 * Math.PI) / totalPlanetas) - (Math.PI / 2); | ||
var x = centroX + raio * Math.cos(angulo) - 22; | var x = centroX + raio * Math.cos(angulo) - 22; | ||
| Linha 131: | Linha 127: | ||
'height': '44px' | 'height': '44px' | ||
}); | }); | ||
}); | |||
} | |||
/* ========================================================================== | |||
INICIALIZAÇÃO DO SISTEMA E CARREGADOR DA MÁQUINA DO TEMPO | |||
========================================================================== */ | |||
mw.loader.using(['mediawiki.util', 'mediawiki.api']).then(function() { | |||
$(document).ready(function() { | |||
// Executa o sistema orbital imediatamente nas páginas comuns atuais | |||
processarSistemaOrbital($('#sistema-orbital')); | |||
// ================================================================== | |||
// ROTINA DA PÁGINA DE ESTUDO TRANSVERSAL (AJAX) | |||
// ================================================================== | |||
var rootContainer = $('#estudo-transversal-root'); | |||
if (rootContainer.length) { | |||
var getUrlParameter = function(sParam) { | |||
var sPageURL = window.location.search.substring(1), | |||
sURLVariables = sPageURL.split('&'), | |||
sParameterName, i; | |||
for (i = 0; i < sURLVariables.length; i++) { | |||
sParameterName = sURLVariables[i].split('='); | |||
if (sParameterName === sParam) { | |||
return sParameterName === undefined ? true : decodeURIComponent(sParameterName); | |||
} | |||
} | |||
return false; | |||
}; | |||
var norma = getUrlParameter('normaq') || '1'; | |||
var data = getUrlParameter('date'); | |||
if (!data) { | |||
rootContainer.html('<div style="text-align:center; padding:30px; color:red; font-weight:bold;">❌ ERRO: Nenhuma coordenada temporal fornecida.</div>'); | |||
return; | |||
} | |||
var wikitextToRender = '{{ExibirPaginaNormaDatada|norma=' + norma + '|data=' + data + '}}'; | |||
new mw.Api().post({ | |||
action: 'parse', | |||
text: wikitextToRender, | |||
contentmodel: 'wikitext', | |||
format: 'json', | |||
disablelimitreport: true | |||
}).done(function(dataResult) { | |||
if (dataResult && dataResult.parse && dataResult.parse.text) { | |||
// 1. Injeta o HTML histórico retornado pelo Cargo | |||
rootContainer.html(dataResult.parse.text['*']); | |||
// 2. Materializa o painel do DeLorean de saltos contínuos | |||
var inputDock = $('#delorean-input-dock'); | |||
var buttonDock = $('#delorean-button-dock'); | |||
if (inputDock.length && buttonDock.length) { | |||
var minDate = inputDock.data('min'); | |||
var maxDate = inputDock.data('max'); | |||
var normaNum = inputDock.data('norma'); | |||
inputDock.html('<input type="text" id="delorean-target-input" class="led-input-field" placeholder="DD/MM/AAAA" maxlength="10" data-min="' + minDate + '" data-max="' + maxDate + '" data-norma="' + normaNum + '">'); | |||
buttonDock.html('<button id="delorean-activation-lever" class="delorean-lever-btn">ATIVAR CIRCUITO DO TEMPO</button>'); | |||
} | |||
// 3. RODA O SEU SISTEMA ORBITAL HISTÓRICO COM RE-CÁLCULO TRIGONOMÉTRICO | |||
processarSistemaOrbital($('#sistema-orbital-historico')); | |||
} else { | |||
rootContainer.html('<div style="text-align:center; padding:30px; color:red;">❌ Falha ao processar os registros históricos.</div>'); | |||
} | |||
}).fail(function() { | |||
rootContainer.html('<div style="text-align:center; padding:30px; color:red;">❌ Erro crítico de conexão com os circuitos da Wiki.</div>'); | |||
}); | |||
} | |||
}); | }); | ||
}); | }); | ||
Edição das 13h09min de 4 de agosto de 2026
/* Página Normas - Texto Principal Lógica para Ativação de Notas Explicativas no texto de Norma/Anexo */
$(document).ready(function() {
// Varre todas as notas sobrescritas que possuem conteúdo vindo do banco
$('.item-nr .nota-sup').each(function() {
var textoNota = $(this).text().trim();
// Se a nota contiver texto (ex: [1]), transforma esse texto no Tooltip oficial
if (textoNota && textoNota !== "[]") {
$(this).attr('title', 'Nota Explicativa ' + textoNota);
}
});
});
/* Tabela NR 04 Anexo 1 */
$(function() {
// Função genérica para alternar visibilidade e limpar descendentes
$('.linha-nivel-1, .linha-nivel-2, .linha-nivel-3').on('click', function(e) {
e.stopPropagation();
var nivelAtual = parseInt($(this).attr('class').match(/linha-nivel-(\d)/)[1]);
var proximoNivel = nivelAtual + 1;
// Se a linha já estiver aberta, estamos fechando (recolhendo)
if ($(this).hasClass('aberto')) {
// Remove a classe 'aberto' desta linha
$(this).removeClass('aberto');
// Fecha todos os descendentes (recursivo)
$(this).nextUntil('.linha-nivel-' + nivelAtual).removeClass('show aberto');
} else {
// Se estamos abrindo:
$(this).addClass('aberto');
// Mostra apenas os filhos imediatos (do próximo nível)
$(this).nextUntil('.linha-nivel-' + nivelAtual).filter('.linha-nivel-' + proximoNivel).addClass('show');
}
});
});
/* ==========================================================================
SISTEMA ORBITAL DE ANEXOS - ENGINE COMPLETA (nr.wiki.br)
========================================================================== */
function processarSistemaOrbital($containerOrbital) {
if (!$containerOrbital.length) return;
var $listaPlanetas = $containerOrbital.find('.planeta-satelite');
var totalPlanetas = $listaPlanetas.length;
if (totalPlanetas === 0) {
$containerOrbital.closest('.caixa-orbital-container').hide();
return;
} else {
$containerOrbital.closest('.caixa-orbital-container').show();
}
// 1. IDENTIFICA A PÁGINA ATUAL PELA URL DO NAVEGADOR
var urlAtual = window.location.pathname;
var idAnexoAtivo = null;
if (urlAtual.indexOf('_AN_') !== -1 || urlAtual.indexOf(' AN ') !== -1) {
var partes = urlAtual.split(/_AN_| AN /i);
if (partes.length > 1) {
idAnexoAtivo = partes[1].trim();
}
} else {
idAnexoAtivo = "0";
}
// 2. DESABILITA O RE-CLIQUE COM PRECISÃO DO NAVEGADOR
if (idAnexoAtivo === "0") {
var $sol = $containerOrbital.find('.bolha-centro');
var $spanSol = $sol.find('.nome-norma-centro').detach();
$sol.empty().append($spanSol);
}
// Mapeamento manual de nomes especiais (Seu original)
var mapeamentoNomes = {
"30": "13-A",
"50": "Glossário",
"60": "(*)"
};
var raio = 96;
var centroX = 120;
var centroY = 120;
$listaPlanetas.each(function(index) {
var $item = $(this);
var idOrigem = $item.data('anexo').toString().trim();
if (idOrigem === idAnexoAtivo) {
$item.addClass('pagina-ativa');
var textoSimples = idOrigem;
if (mapeamentoNomes[idOrigem]) {
textoSimples = mapeamentoNomes[idOrigem];
}
if (textoSimples === "Glossário" || textoSimples === "(*)") {
$item.find('span').html(textoSimples);
} else {
$item.find('span').html("Anexo<br>" + textoSimples);
}
var $spanLimpo = $item.find('span').detach();
$item.empty().append($spanLimpo);
} else {
if (mapeamentoNomes[idOrigem]) {
if (mapeamentoNomes[idOrigem] === "Glossário" || mapeamentoNomes[idOrigem] === "(*)") {
$item.find('span').html(mapeamentoNomes[idOrigem]);
} else {
$item.find('span').html("Anexo<br>" + mapeamentoNomes[idOrigem]);
}
} else {
$item.find('span').html("Anexo<br>" + idOrigem);
}
}
// CÁLCULO TRIGONOMÉTRICO ORIGINAL - EVITA EMPILHAMENTO
var angulo = (index * (2 * Math.PI) / totalPlanetas) - (Math.PI / 2);
var x = centroX + raio * Math.cos(angulo) - 22;
var y = centroY + raio * Math.sin(angulo) - 22;
$item.css({
'left': x + 'px',
'top': y + 'px',
'width': '44px',
'height': '44px'
});
});
}
/* ==========================================================================
INICIALIZAÇÃO DO SISTEMA E CARREGADOR DA MÁQUINA DO TEMPO
========================================================================== */
mw.loader.using(['mediawiki.util', 'mediawiki.api']).then(function() {
$(document).ready(function() {
// Executa o sistema orbital imediatamente nas páginas comuns atuais
processarSistemaOrbital($('#sistema-orbital'));
// ==================================================================
// ROTINA DA PÁGINA DE ESTUDO TRANSVERSAL (AJAX)
// ==================================================================
var rootContainer = $('#estudo-transversal-root');
if (rootContainer.length) {
var getUrlParameter = function(sParam) {
var sPageURL = window.location.search.substring(1),
sURLVariables = sPageURL.split('&'),
sParameterName, i;
for (i = 0; i < sURLVariables.length; i++) {
sParameterName = sURLVariables[i].split('=');
if (sParameterName === sParam) {
return sParameterName === undefined ? true : decodeURIComponent(sParameterName);
}
}
return false;
};
var norma = getUrlParameter('normaq') || '1';
var data = getUrlParameter('date');
if (!data) {
rootContainer.html('<div style="text-align:center; padding:30px; color:red; font-weight:bold;">❌ ERRO: Nenhuma coordenada temporal fornecida.</div>');
return;
}
var wikitextToRender = '{{ExibirPaginaNormaDatada|norma=' + norma + '|data=' + data + '}}';
new mw.Api().post({
action: 'parse',
text: wikitextToRender,
contentmodel: 'wikitext',
format: 'json',
disablelimitreport: true
}).done(function(dataResult) {
if (dataResult && dataResult.parse && dataResult.parse.text) {
// 1. Injeta o HTML histórico retornado pelo Cargo
rootContainer.html(dataResult.parse.text['*']);
// 2. Materializa o painel do DeLorean de saltos contínuos
var inputDock = $('#delorean-input-dock');
var buttonDock = $('#delorean-button-dock');
if (inputDock.length && buttonDock.length) {
var minDate = inputDock.data('min');
var maxDate = inputDock.data('max');
var normaNum = inputDock.data('norma');
inputDock.html('<input type="text" id="delorean-target-input" class="led-input-field" placeholder="DD/MM/AAAA" maxlength="10" data-min="' + minDate + '" data-max="' + maxDate + '" data-norma="' + normaNum + '">');
buttonDock.html('<button id="delorean-activation-lever" class="delorean-lever-btn">ATIVAR CIRCUITO DO TEMPO</button>');
}
// 3. RODA O SEU SISTEMA ORBITAL HISTÓRICO COM RE-CÁLCULO TRIGONOMÉTRICO
processarSistemaOrbital($('#sistema-orbital-historico'));
} else {
rootContainer.html('<div style="text-align:center; padding:30px; color:red;">❌ Falha ao processar os registros históricos.</div>');
}
}).fail(function() {
rootContainer.html('<div style="text-align:center; padding:30px; color:red;">❌ Erro crítico de conexão com os circuitos da Wiki.</div>');
});
}
});
});
/* Lógica de Agrupamento em Blocos Sólidos para o Infográfico Histórico */
$(document).ready(function() {
var $container = $('#infografico-vigencia');
if ($container.length === 0) return;
// Aguarda um instante para garantir que o Cargo renderizou todas as linhas na tela
setTimeout(function() {
var $itens = $container.find('.timeline-item');
if ($itens.length === 0) return;
var numeroBloco = 1;
var grupoValido = [];
var itensArray = $itens.toArray();
$container.empty();
for (var i = 0; i < itensArray.length; i++) {
var $item = $(itensArray[i]);
var verbo = $item.data('verbo');
grupoValido.push($item);
// A cada portaria de Redação 'R' ou no final da fila, fecha o bloco sólido
if (verbo === 'R' || i === itensArray.length - 1) {
var $wrapper = $('<div class="bloco-grupo bloco-' + numeroBloco + '"></div>');
for (var j = 0; j < grupoValido.length; j++) {
$wrapper.append(grupoValido[j]);
}
// Injeta o rótulo "Vigências" acima do Bloco 1 (Verde)
if (numeroBloco === 1) {
var $tituloVigencias = $('<div class="titulo-bloco-vigencias">Vigências</div>');
$container.append($tituloVigencias);
}
$container.append($wrapper);
grupoValido = [];
numeroBloco++;
}
}
// --- NOVA LÓGICA DE DEGRADÊ DINÂMICO ---
var $todosOsBlocos = $container.find('.bloco-grupo');
var totalBlocos = $todosOsBlocos.length;
$todosOsBlocos.each(function(index) {
var $bloco = $(this);
var bNumero = index + 1; // Bloco 1, Bloco 2, etc.
// CASO 1: É o Primeiro Bloco -> Sempre VERDE
if (bNumero === 1) {
$bloco.css({
'background-color': '#27ae60',
'color': '#ffffff'
});
}
// CASO 2: É o Último Bloco (e existe mais de um bloco) -> Sempre PRETO
else if (bNumero === totalBlocos && totalBlocos > 1) {
$bloco.css({
'background-color': '#0D0D0D',
'color': '#ffffff'
});
}
// CASO 3: Blocos Intermediários -> Degradê calculado do cinza claro ao escuro
else {
// Fórmulas matemáticas para gerar tons de cinza azulados/esverdeados harmônicos
// Quanto maior o index, mais escuro fica o bloco intermediário
var passos = totalBlocos - 2; // Desconta o primeiro e o último
var posicaoIntermediaria = index - 1; // Posição dele entre os do meio (0 a passos-1)
// Calcula o percentual de evolução do meio (0% para o primeiro do meio, 100% para o último do meio)
var percentual = passos > 1 ? (posicaoIntermediaria / (passos - 1)) : 0;
// Transição suave de cores (RGB inicial #bcf4d4 até RGB final #539091)
var r = Math.round(188 + (percentual * (83 - 188)));
var g = Math.round(244 + (percentual * (144 - 244)));
var b = Math.round(212 + (percentual * (145 - 212)));
// Texto escuro para contrastar bem com os blocos intermediários que são claros
var textoCor = '#2c3e50';
// Se o tom calculado ficar muito escuro nas etapas finais, muda o texto para branco automaticamente
if (percentual > 0.7) {
textoCor = '#ffffff';
}
$bloco.css({
'background-color': 'rgb(' + r + ',' + g + ',' + b + ')',
'color': textoCor
});
}
});
// ---------------------------------------
}, 200); // Aumentado para 200ms para garantir a leitura de NRs longas
});
/* ==========================================================================
CIRCUITO DO TEMPO DELOREAN - INJEÇÃO DINÂMICA (nr.wiki.br)
========================================================================== */
$(document).ready(function() {
var inputDock = $('#delorean-input-dock');
var buttonDock = $('#delorean-button-dock');
// Se os containers existirem na página, materializa os elementos visuais
if (inputDock.length && buttonDock.length) {
var minDate = inputDock.data('min');
var maxDate = inputDock.data('max');
var normaNum = inputDock.data('norma');
// Constrói o HTML puro direto no navegador (fibra óptica)
inputDock.html('<input type="text" id="delorean-target-input" class="led-input-field" placeholder="DD/MM/AAAA" maxlength="10" data-min="' + minDate + '" data-max="' + maxDate + '" data-norma="' + normaNum + '">');
buttonDock.html('<button id="delorean-activation-lever" class="delorean-lever-btn">ATIVAR CIRCUITO DO TEMPO</button>');
}
// Máscara automática DD/MM/AAAA para digitação limpa no input injetado
$(document).on('input', '#delorean-target-input', function() {
var v = this.value.replace(/\D/g, '');
if (v.length > 2) v = v.substring(0,2) + '/' + v.substring(2);
if (v.length > 5) v = v.substring(0,5) + '/' + v.substring(5,9);
this.value = v;
});
// Disparo da Alavanca do Tempo (Botão de Ativação)
$(document).on('click', '#delorean-activation-lever', function() {
var input = $('#delorean-target-input');
var dataDigitada = input.val();
if (!dataDigitada || dataDigitada.length < 10) {
alert('Por favor, insira a data completa no formato DD/MM/AAAA.');
return;
}
var partes = dataDigitada.split('/');
var dia = parseInt(partes[0], 10);
var mes = parseInt(partes[1], 10) - 1;
var ano = parseInt(partes[2], 10);
var dataDestino = new Date(ano, mes, dia);
var dataMin = new Date(input.data('min') + 'T00:00:00');
var dataMax = new Date(input.data('max') + 'T00:00:00');
var norma = input.data('norma');
if (dataDestino < dataMin || dataDestino > dataMax || isNaN(dataDestino.getTime())) {
alert('❌ ERRO NOS CIRCUITOS DO TEMPO!\nA data escolhida está fora dos limites históricos permitidos para esta norma.');
return;
}
var anoF = dataDestino.getFullYear();
var mesF = String(dataDestino.getMonth() + 1).padStart(2, '0');
var diaF = String(dataDestino.getDate()).padStart(2, '0');
var dataFinalUrl = anoF + '-' + mesF + '-' + diaF;
window.location.href = mw.util.getUrl('Estudo_Transversal', { normaq: norma, date: dataFinalUrl });
});
});
/* ==========================================================================
CARREGADOR DE CONTEÚDO HISTÓRICO - VERSÃO TIMEOUT (nr.wiki.br)
========================================================================== */
// Usamos o gancho nativo do MediaWiki para garantir que a API e os utilitários existam
mw.loader.using(['mediawiki.util', 'mediawiki.api']).then(function() {
$(document).ready(function() {
var rootContainer = $('#estudo-transversal-root');
if (rootContainer.length) {
// Função auxiliar para capturar parâmetros da URL
var getUrlParameter = function(sParam) {
var sPageURL = window.location.search.substring(1),
sURLVariables = sPageURL.split('&'),
sParameterName,
i;
for (i = 0; i < sURLVariables.length; i++) {
sParameterName = sURLVariables[i].split('=');
if (sParameterName[0] === sParam) {
return sParameterName[1] === undefined ? true : decodeURIComponent(sParameterName[1]);
}
}
return false;
};
var norma = getUrlParameter('normaq') || '1';
var data = getUrlParameter('date');
if (!data) {
rootContainer.html('<div style="text-align:center; padding:30px; color:red; font-weight:bold;">❌ ERRO: Nenhuma coordenada temporal (data) foi fornecida para a viagem.</div>');
return;
}
// Monta a chamada exata da predefinição datada
var wikitextToRender = '{{ExibirPaginaNormaDatada|norma=' + norma + '|data=' + data + '}}';
// Dispara via API nativa do MediaWiki (Garante compatibilidade total)
new mw.Api().post({
action: 'parse',
text: wikitextToRender,
contentmodel: 'wikitext',
format: 'json',
disablelimitreport: true
}).done(function(data) {
if (data && data.parse && data.parse.text) {
// Substitui a mensagem pelo HTML completo do Cargo!
rootContainer.html(data.parse.text['*']);
} else {
rootContainer.html('<div style="text-align:center; padding:30px; color:red;">❌ Falha ao processar os registros históricos no banco de dados Cargo.</div>');
}
}).fail(function() {
rootContainer.html('<div style="text-align:center; padding:30px; color:red;">❌ Erro crítico de conexão com os circuitos do tempo da Wiki.</div>');
});
}
});
});