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 |
||
| Linha 85: | Linha 85: | ||
})(); | })(); | ||
/* --- CELTA SISTEMA: Lógica de Menus --- */ | /* --- CELTA SISTEMA: Lógica de Menus (GENÉRICO) --- */ | ||
$(function() { | $(function() { | ||
// | // Detecta clique em QUALQUER item que tenha classe começando com 'erp-click-' | ||
// | // Isso faz funcionar para Principal, Compras, Estoque, etc. automaticamente. | ||
$('body').on('click', ' | $('body').on('click', '[class*="erp-click-"]', function(e) { | ||
e.preventDefault(); | e.preventDefault(); | ||
e.stopPropagation(); | e.stopPropagation(); | ||
var botao = $(this); | var botao = $(this); | ||
var targetId = ''; | |||
// Mapeamento: Qual botão abre qual submenu? | |||
if (botao.hasClass('erp-click-principal')) { | |||
targetId = '#submenu-principal'; | |||
} else if (botao.hasClass('erp-click-compras')) { | |||
targetId = '#submenu-compras'; | |||
} | |||
// Adicione novos 'else if' aqui quando criar novos menus | |||
if (!targetId) return; // Se não tem submenu configurado, não faz nada | |||
var submenu = $(targetId); | |||
// Se o submenu clicado já está aberto, fecha ele | |||
if (submenu.is(':visible')) { | if (submenu.is(':visible')) { | ||
submenu.hide(); | submenu.hide(); | ||
botao.removeClass('active'); | botao.removeClass('active'); | ||
} else { | } else { | ||
// Fecha | // Fecha TODOS os submenus abertos e limpa ativos | ||
$('.erp-submenu-overlay').hide(); | $('.erp-submenu-overlay').hide(); | ||
$('.erp-menu-item').removeClass('active'); | $('.erp-menu-item').removeClass('active'); | ||
// Abre o | // Abre o novo submenu e ativa o botão clicado | ||
submenu.show(); | submenu.show(); | ||
botao.addClass('active'); | botao.addClass('active'); | ||
| Linha 110: | Linha 123: | ||
}); | }); | ||
// | // Fechar ao clicar fora (no conteúdo ou logo) | ||
$('body').on('click', '.erp-content-stage, .erp-bg-logo', function() { | $('body').on('click', '.erp-content-stage, .erp-bg-logo', function() { | ||
$('.erp-submenu-overlay').hide(); | |||
$('.erp | $('.erp-menu-item').removeClass('active'); | ||
}); | }); | ||
}); | }); | ||
Edição das 02h55min de 7 de dezembro de 2025
/**
* MediaWikiCitizen.js
* Adds a functional "Copy" button to code blocks (pre, .mw-highlight, .mw-code).
*/
(function () {
'use strict';
function addCopyButtons() {
// Select all code block containers
const codeBlocks = document.querySelectorAll('pre, .mw-highlight, .mw-code');
codeBlocks.forEach(function (block) {
// Check if button already exists to prevent duplicates
if (block.querySelector('.mw-copy-btn')) return;
// Create the button
const button = document.createElement('button');
button.className = 'mw-copy-btn';
button.type = 'button';
button.ariaLabel = 'Copiar código';
// Icon (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>
`;
// Add click event
button.addEventListener('click', function () {
// Get text content
const code = block.innerText || block.textContent;
// Copy to clipboard
navigator.clipboard.writeText(code).then(function () {
// Success feedback
button.classList.add('copied');
const originalHTML = button.innerHTML;
// Change icon to checkmark temporarily
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);
}).catch(function (err) {
console.error('Failed to copy: ', err);
});
});
// Append button to the block
// Ensure relative positioning on block so button positions correctly
if (getComputedStyle(block).position === 'static') {
block.style.position = 'relative';
}
block.appendChild(button);
});
}
// Run on load
if (document.readyState === 'loading') {
document.addEventListener('DOMContentLoaded', addCopyButtons);
} else {
addCopyButtons();
}
// Optional: Observer for dynamic content (if MediaWiki loads content via AJAX)
const observer = new MutationObserver(function (mutations) {
mutations.forEach(function (mutation) {
if (mutation.addedNodes.length) {
addCopyButtons();
}
});
});
observer.observe(document.body, { childList: true, subtree: true });
})();
/* --- CELTA SISTEMA: Lógica de Menus (GENÉRICO) --- */
$(function() {
// Detecta clique em QUALQUER item que tenha classe começando com 'erp-click-'
// Isso faz funcionar para Principal, Compras, Estoque, etc. automaticamente.
$('body').on('click', '[class*="erp-click-"]', function(e) {
e.preventDefault();
e.stopPropagation();
var botao = $(this);
var targetId = '';
// Mapeamento: Qual botão abre qual submenu?
if (botao.hasClass('erp-click-principal')) {
targetId = '#submenu-principal';
} else if (botao.hasClass('erp-click-compras')) {
targetId = '#submenu-compras';
}
// Adicione novos 'else if' aqui quando criar novos menus
if (!targetId) return; // Se não tem submenu configurado, não faz nada
var submenu = $(targetId);
// Se o submenu clicado já está aberto, fecha ele
if (submenu.is(':visible')) {
submenu.hide();
botao.removeClass('active');
} else {
// Fecha TODOS os submenus abertos e limpa ativos
$('.erp-submenu-overlay').hide();
$('.erp-menu-item').removeClass('active');
// Abre o novo submenu e ativa o botão clicado
submenu.show();
botao.addClass('active');
}
});
// Fechar ao clicar fora (no conteúdo ou logo)
$('body').on('click', '.erp-content-stage, .erp-bg-logo', function() {
$('.erp-submenu-overlay').hide();
$('.erp-menu-item').removeClass('active');
});
});