MediaWiki:Citizen.js: mudanças entre as edições
Página de Interface do MediaWiki
Mais ações
Sem resumo de edição |
Sem resumo de edição |
||
| (7 revisões intermediárias pelo mesmo usuário não estão sendo mostradas) | |||
| Linha 26: | Linha 26: | ||
function addCopyButtons() { | function addCopyButtons() { | ||
const codeBlocks = document.querySelectorAll('pre, .mw-highlight, .mw-code'); | const codeBlocks = document.querySelectorAll('pre, .mw-highlight, .mw-code'); | ||
| Linha 37: | Linha 36: | ||
button.ariaLabel = 'Copiar código'; | button.ariaLabel = 'Copiar código'; | ||
button.innerHTML = '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"></rect><path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"></path></svg>'; | button.innerHTML = '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"></rect><path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"></path></svg>'; | ||
| Linha 45: | Linha 43: | ||
button.classList.add('copied'); | button.classList.add('copied'); | ||
const originalHTML = button.innerHTML; | const originalHTML = button.innerHTML; | ||
button.innerHTML = '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><polyline points="20 6 9 17 4 12"></polyline></svg>'; | button.innerHTML = '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><polyline points="20 6 9 17 4 12"></polyline></svg>'; | ||
| Linha 62: | Linha 59: | ||
} | } | ||
if (document.readyState === 'loading') { | if (document.readyState === 'loading') { | ||
document.addEventListener('DOMContentLoaded', addCopyButtons); | document.addEventListener('DOMContentLoaded', addCopyButtons); | ||
| Linha 85: | Linha 81: | ||
======================================================= */ | ======================================================= */ | ||
$(function() { | $(function() { | ||
var STORAGE_KEY = 'erp_active_submenu'; | var STORAGE_KEY = 'erp_active_submenu'; | ||
// | // Salva o submenu ativo | ||
function saveActiveSubmenu(submenuId) { | function saveActiveSubmenu(submenuId) { | ||
try { | try { | ||
localStorage.setItem(STORAGE_KEY, submenuId); | localStorage.setItem(STORAGE_KEY, submenuId); | ||
} catch(e) { | } catch(e) { | ||
// Silencioso | |||
} | } | ||
} | } | ||
// | // Recupera o submenu salvo | ||
function getActiveSubmenu() { | function getActiveSubmenu() { | ||
try { | try { | ||
| Linha 106: | Linha 101: | ||
} | } | ||
// | // Limpa a memória | ||
function clearActiveSubmenu() { | function clearActiveSubmenu(reason) { | ||
try { | try { | ||
localStorage.removeItem(STORAGE_KEY); | localStorage.removeItem(STORAGE_KEY); | ||
} catch(e) { | } catch(e) { | ||
// Silencioso | |||
} | } | ||
} | } | ||
// | // Abre um submenu específico | ||
function openSubmenu(submenuId) { | function openSubmenu(submenuId) { | ||
$('.erp-submenu-overlay').hide(); | $('.erp-submenu-overlay').hide(); | ||
$('.erp-menu-item').removeClass('active'); | $('.erp-menu-item').removeClass('active'); | ||
var $submenu = $(submenuId); | var $submenu = $(submenuId); | ||
var menuName = submenuId.replace('#submenu-', ''); | var menuName = submenuId.replace('#submenu-', ''); | ||
| Linha 134: | Linha 127: | ||
// Restaura o submenu ao carregar a página | // Restaura o submenu ao carregar a página | ||
function restoreSubmenu() { | function restoreSubmenu() { | ||
var currentPath = window.location.pathname; | |||
// Se NÃO está em página de tutoriais, limpa a memória | |||
if (currentPath.indexOf('/Tutoriais') === -1 && currentPath.indexOf('/tutoriais') === -1) { | |||
clearActiveSubmenu('saiu da área de tutoriais'); | |||
return; | |||
} | |||
var savedSubmenu = getActiveSubmenu(); | var savedSubmenu = getActiveSubmenu(); | ||
if (savedSubmenu) { | if (savedSubmenu) { | ||
setTimeout(function() { | setTimeout(function() { | ||
openSubmenu(savedSubmenu); | openSubmenu(savedSubmenu); | ||
}, | }, 150); | ||
} | } | ||
} | } | ||
| Linha 167: | Linha 167: | ||
if (submenu.is(':visible')) { | if (submenu.is(':visible')) { | ||
submenu.hide(); | submenu.hide(); | ||
botao.removeClass('active'); | botao.removeClass('active'); | ||
} else { | } else { | ||
$('.erp-submenu-overlay').hide(); | $('.erp-submenu-overlay').hide(); | ||
$('.erp-menu-item').removeClass('active'); | $('.erp-menu-item').removeClass('active'); | ||
| Linha 181: | Linha 178: | ||
}); | }); | ||
// Fechar ao clicar fora | // Fechar ao clicar fora (mas NÃO limpar memória se clicar em link) | ||
$('body').on('click', '.erp-content-stage, .erp-bg-logo', function() { | $('body').on('click', '.erp-content-stage, .erp-bg-logo', function(e) { | ||
// Se clicou em um link, NÃO limpa a memória | |||
if ($(e.target).is('a') || $(e.target).closest('a').length) { | |||
return; | |||
} | |||
// Se clicou na área vazia, fecha e limpa | |||
$('.erp-submenu-overlay').hide(); | $('.erp-submenu-overlay').hide(); | ||
$('.erp-menu-item').removeClass('active'); | $('.erp-menu-item').removeClass('active'); | ||
clearActiveSubmenu( | clearActiveSubmenu('clicou fora do menu'); | ||
}); | }); | ||
// Restaura o submenu ao carregar | // Restaura o submenu ao carregar | ||
restoreSubmenu(); | restoreSubmenu(); | ||
// | // Limpa após 30 minutos de inatividade | ||
var inactivityTimer; | var inactivityTimer; | ||
function resetInactivityTimer() { | function resetInactivityTimer() { | ||
clearTimeout(inactivityTimer); | clearTimeout(inactivityTimer); | ||
inactivityTimer = setTimeout(function() { | inactivityTimer = setTimeout(function() { | ||
clearActiveSubmenu(); | clearActiveSubmenu('30 minutos de inatividade'); | ||
}, 30 * 60 * 1000); | }, 30 * 60 * 1000); | ||
} | } | ||
| Linha 214: | Linha 212: | ||
======================================================= */ | ======================================================= */ | ||
$(function() { | $(function() { | ||
$('body').on('click', '.sys-col-item', function(e) { | $('body').on('click', '.sys-col-item', function(e) { | ||
if ($(e.target).is('a') || $(e.target).closest('a').length) { | if ($(e.target).is('a') || $(e.target).closest('a').length) { | ||
return true; | return true; | ||
} | } | ||
var link = $(this).find('a').first(); | var link = $(this).find('a').first(); | ||
if (link.length) { | if (link.length) { | ||
Edição atual tal como às 20h39min de 13 de dezembro de 2025
/* =======================================================
1. GOOGLE ANALYTICS 4 (GA4) - PRIORIDADE MÁXIMA
======================================================= */
(function() {
var gaId = 'G-EMV99DJ8V4';
// Carrega a biblioteca externa do Google
var script = document.createElement('script');
script.async = true;
script.src = 'https://www.googletagmanager.com/gtag/js?id=' + gaId;
document.head.appendChild(script);
// Inicializa o Gtag
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
gtag('js', new Date());
gtag('config', gaId);
})();
/* =======================================================
2. BOTÃO "COPIAR" PARA BLOCOS DE CÓDIGO
======================================================= */
(function () {
'use strict';
function addCopyButtons() {
const codeBlocks = document.querySelectorAll('pre, .mw-highlight, .mw-code');
codeBlocks.forEach(function (block) {
if (block.querySelector('.mw-copy-btn')) return;
const button = document.createElement('button');
button.className = 'mw-copy-btn';
button.type = 'button';
button.ariaLabel = 'Copiar código';
button.innerHTML = '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"></rect><path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"></path></svg>';
button.addEventListener('click', function () {
const code = block.innerText || block.textContent;
navigator.clipboard.writeText(code).then(function () {
button.classList.add('copied');
const originalHTML = button.innerHTML;
button.innerHTML = '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><polyline points="20 6 9 17 4 12"></polyline></svg>';
setTimeout(function () {
button.classList.remove('copied');
button.innerHTML = originalHTML;
}, 2000);
});
});
if (getComputedStyle(block).position === 'static') {
block.style.position = 'relative';
}
block.appendChild(button);
});
}
if (document.readyState === 'loading') {
document.addEventListener('DOMContentLoaded', addCopyButtons);
} else {
addCopyButtons();
}
const observer = new MutationObserver(function (mutations) {
mutations.forEach(function (mutation) {
if (mutation.addedNodes.length) {
addCopyButtons();
}
});
});
observer.observe(document.body, { childList: true, subtree: true });
})();
/* =======================================================
3. MENUS DO SIMULADOR ERP COM MEMÓRIA
======================================================= */
$(function() {
var STORAGE_KEY = 'erp_active_submenu';
// Salva o submenu ativo
function saveActiveSubmenu(submenuId) {
try {
localStorage.setItem(STORAGE_KEY, submenuId);
} catch(e) {
// Silencioso
}
}
// Recupera o submenu salvo
function getActiveSubmenu() {
try {
return localStorage.getItem(STORAGE_KEY);
} catch(e) {
return null;
}
}
// Limpa a memória
function clearActiveSubmenu(reason) {
try {
localStorage.removeItem(STORAGE_KEY);
} catch(e) {
// Silencioso
}
}
// Abre um submenu específico
function openSubmenu(submenuId) {
$('.erp-submenu-overlay').hide();
$('.erp-menu-item').removeClass('active');
var $submenu = $(submenuId);
var menuName = submenuId.replace('#submenu-', '');
var $menuItem = $('.erp-click-' + menuName);
if ($submenu.length && $menuItem.length) {
$submenu.show();
$menuItem.addClass('active');
}
}
// Restaura o submenu ao carregar a página
function restoreSubmenu() {
var currentPath = window.location.pathname;
// Se NÃO está em página de tutoriais, limpa a memória
if (currentPath.indexOf('/Tutoriais') === -1 && currentPath.indexOf('/tutoriais') === -1) {
clearActiveSubmenu('saiu da área de tutoriais');
return;
}
var savedSubmenu = getActiveSubmenu();
if (savedSubmenu) {
setTimeout(function() {
openSubmenu(savedSubmenu);
}, 150);
}
}
// Lógica de abertura dos submenus
$('body').on('click', '[class*="erp-click-"]', function(e) {
e.preventDefault();
e.stopPropagation();
var botao = $(this);
var targetId = '';
if (botao.hasClass('erp-click-principal')) targetId = '#submenu-principal';
else if (botao.hasClass('erp-click-estoque')) targetId = '#submenu-estoque';
else if (botao.hasClass('erp-click-financeiro')) targetId = '#submenu-financeiro';
else if (botao.hasClass('erp-click-vendas')) targetId = '#submenu-vendas';
else if (botao.hasClass('erp-click-compras')) targetId = '#submenu-compras';
else if (botao.hasClass('erp-click-gerencial')) targetId = '#submenu-gerencial';
else if (botao.hasClass('erp-click-pessoal')) targetId = '#submenu-pessoal';
else if (botao.hasClass('erp-click-supermercado')) targetId = '#submenu-supermercado';
else if (botao.hasClass('erp-click-ferramentas')) targetId = '#submenu-ferramentas';
if (!targetId) return;
var submenu = $(targetId);
if (submenu.is(':visible')) {
submenu.hide();
botao.removeClass('active');
} else {
$('.erp-submenu-overlay').hide();
$('.erp-menu-item').removeClass('active');
submenu.show();
botao.addClass('active');
saveActiveSubmenu(targetId);
}
});
// Fechar ao clicar fora (mas NÃO limpar memória se clicar em link)
$('body').on('click', '.erp-content-stage, .erp-bg-logo', function(e) {
// Se clicou em um link, NÃO limpa a memória
if ($(e.target).is('a') || $(e.target).closest('a').length) {
return;
}
// Se clicou na área vazia, fecha e limpa
$('.erp-submenu-overlay').hide();
$('.erp-menu-item').removeClass('active');
clearActiveSubmenu('clicou fora do menu');
});
// Restaura o submenu ao carregar
restoreSubmenu();
// Limpa após 30 minutos de inatividade
var inactivityTimer;
function resetInactivityTimer() {
clearTimeout(inactivityTimer);
inactivityTimer = setTimeout(function() {
clearActiveSubmenu('30 minutos de inatividade');
}, 30 * 60 * 1000);
}
$(document).on('mousemove keypress click', resetInactivityTimer);
resetInactivityTimer();
});
/* =======================================================
4. FIX: CLICK EM QUALQUER ÁREA DO CARD REDIRECIONA
======================================================= */
$(function() {
$('body').on('click', '.sys-col-item', function(e) {
if ($(e.target).is('a') || $(e.target).closest('a').length) {
return true;
}
var link = $(this).find('a').first();
if (link.length) {
e.preventDefault();
e.stopPropagation();
window.location.href = link.attr('href');
}
});
});