Jump to content

MediaWiki:Common.js: Difference between revisions

From ATRONIA Wiki
No edit summary
No edit summary
 
(11 intermediate revisions by the same user not shown)
Line 2: Line 2:




$(document).ready(function() {
// Força o menu lateral a expandir (Vector 2022) se estiver colapsado
     // 1. Procura todas as subpáginas do Atlas no menu lateral e esconde-as
mw.hook('wikipage.content').add(function () {
    $('.mw-table-of-contents-container, .vector-main-menu')
     if (document.documentElement.classList.contains('vector-feature-main-menu-pinned-disabled')) {
         .find('a[href*="SENSBLUE_ATLAS/"]')
        var pinButton = document.getElementById('vector-main-menu-dropdown-checkbox');
        .closest('li')
         if (pinButton) {
        .addClass('atlas-submenu');
            // Remove a classe de desativado e força o estado expandido
            document.documentElement.classList.remove('vector-feature-main-menu-pinned-disabled');
            document.documentElement.classList.add('vector-feature-main-menu-pinned-enabled');
        }
    }
});


    // 2. Encontra o item de lista (li) que contém o link principal do Atlas
    var $mainAtlasLi = $('.mw-table-of-contents-container, .vector-main-menu')
        .find('a[href$="SENSBLUE_ATLAS"]')
        .closest('li');


     if ($mainAtlasLi.length) {
// Força o MediaWiki a carregar os módulos básicos em qualquer tipo de sessão (anónima ou registada)
         // Alinha o conteúdo original para podermos meter a seta ao lado
mw.loader.using(['mediawiki.util', 'jquery'], function () {
         $mainAtlasLi.css('display', 'flex').css('align-items', 'center');
      
    function setupAtlasDropdown() {
         // Alvo exclusivo: Apenas o menu de navegação da skin, ignorando o índice de conteúdos (Contents) da página
         var $sidebar = $('.vector-main-menu, #mw-panel');
        if (!$sidebar.length) return;


         // 3. Injeta a seta ao lado do link principal
         // 1. Identifica e esconde as subpáginas apenas no menu lateral
         var $toggleBtn = $('<span class="atlas-toggle-btn">▶</span>');
         $sidebar.find('li').each(function() {
        $mainAtlasLi.append($toggleBtn);
             var $li = $(this);
 
             var text = $li.text().trim();
        // 4. Lógica de clique para abrir/fechar
        $toggleBtn.on('click', function(e) {
             e.preventDefault();
             e.stopPropagation();
              
              
             // Abre ou fecha o submenu
             // Verifica se apanha as subpáginas pelo URL ou pelo texto exato
             $('.atlas-submenu').toggleClass('is-open');
             var hasSubpage = $li.find('a[href*="SENSBLUE_ATLAS/"], .mw-selflink[href*="SENSBLUE_ATLAS/"]').length > 0
                            || text === 'Datasheet'
                            || text === 'Release Notes';
              
              
            // Alterna o símbolo da seta
             if (hasSubpage && !text.includes('SENSBLUE ATLAS')) {
             if ($(this).text() === '') {
                 $li.addClass('atlas-submenu');
                $(this).text('▼');
            } else {
                 $(this).text('');
             }
             }
         });
         });
        // 2. Procura o item pai (SENSBLUE ATLAS) na barra lateral
        var $mainAtlasLi = $sidebar.find('li').filter(function() {
            var text = $(this).clone().children().remove().end().text().trim() || $(this).text().trim();
            return text === 'SENSBLUE ATLAS';
        }).first();
        // 3. Injeta a seta nativa se encontrar o link
        if ($mainAtlasLi.length && !$mainAtlasLi.find('.atlas-toggle-btn').length) {
           
            $mainAtlasLi.css({
                'display': 'flex',
                'align-items': 'center',
                'justify-content': 'flex-start'
            });
            $mainAtlasLi.find('a, .mw-selflink, span').css({
                'display': 'inline',
                'width': 'auto'
            });
            var $toggleBtn = $('<span class="atlas-toggle-btn"></span>');
            $mainAtlasLi.append($toggleBtn);
            $toggleBtn.on('click', function(e) {
                e.preventDefault();
                e.stopPropagation();
               
                $('.atlas-submenu').toggleClass('is-open');
                $(this).toggleClass('is-active');
            });
        }
     }
     }
    // GATILHO COMPATÍVEL COM ANÓNIMOS: Executa em múltiplos estágios do carregamento
    $(document).ready(setupAtlasDropdown);
    $(window).on('load', setupAtlasDropdown);
    mw.hook('wikipage.content').add(setupAtlasDropdown);
});
});



Latest revision as of 09:28, 30 June 2026

/* Any JavaScript here will be loaded for all users on every page load. */


// Força o menu lateral a expandir (Vector 2022) se estiver colapsado
mw.hook('wikipage.content').add(function () {
    if (document.documentElement.classList.contains('vector-feature-main-menu-pinned-disabled')) {
        var pinButton = document.getElementById('vector-main-menu-dropdown-checkbox');
        if (pinButton) {
            // Remove a classe de desativado e força o estado expandido
            document.documentElement.classList.remove('vector-feature-main-menu-pinned-disabled');
            document.documentElement.classList.add('vector-feature-main-menu-pinned-enabled');
        }
    }
});


// Força o MediaWiki a carregar os módulos básicos em qualquer tipo de sessão (anónima ou registada)
mw.loader.using(['mediawiki.util', 'jquery'], function () {
    
    function setupAtlasDropdown() {
        // Alvo exclusivo: Apenas o menu de navegação da skin, ignorando o índice de conteúdos (Contents) da página
        var $sidebar = $('.vector-main-menu, #mw-panel');
        if (!$sidebar.length) return;

        // 1. Identifica e esconde as subpáginas apenas no menu lateral
        $sidebar.find('li').each(function() {
            var $li = $(this);
            var text = $li.text().trim();
            
            // Verifica se apanha as subpáginas pelo URL ou pelo texto exato
            var hasSubpage = $li.find('a[href*="SENSBLUE_ATLAS/"], .mw-selflink[href*="SENSBLUE_ATLAS/"]').length > 0 
                             || text === 'Datasheet' 
                             || text === 'Release Notes';
            
            if (hasSubpage && !text.includes('SENSBLUE ATLAS')) {
                $li.addClass('atlas-submenu');
            }
        });

        // 2. Procura o item pai (SENSBLUE ATLAS) na barra lateral
        var $mainAtlasLi = $sidebar.find('li').filter(function() {
            var text = $(this).clone().children().remove().end().text().trim() || $(this).text().trim();
            return text === 'SENSBLUE ATLAS';
        }).first();

        // 3. Injeta a seta nativa se encontrar o link
        if ($mainAtlasLi.length && !$mainAtlasLi.find('.atlas-toggle-btn').length) {
            
            $mainAtlasLi.css({
                'display': 'flex',
                'align-items': 'center',
                'justify-content': 'flex-start'
            });

            $mainAtlasLi.find('a, .mw-selflink, span').css({
                'display': 'inline',
                'width': 'auto'
            });

            var $toggleBtn = $('<span class="atlas-toggle-btn"></span>');
            $mainAtlasLi.append($toggleBtn); 

            $toggleBtn.on('click', function(e) {
                e.preventDefault();
                e.stopPropagation();
                
                $('.atlas-submenu').toggleClass('is-open');
                $(this).toggleClass('is-active');
            });
        }
    }

    // GATILHO COMPATÍVEL COM ANÓNIMOS: Executa em múltiplos estágios do carregamento
    $(document).ready(setupAtlasDropdown);
    $(window).on('load', setupAtlasDropdown);
    mw.hook('wikipage.content').add(setupAtlasDropdown);
});




// ==========================================================================
// CONTROLADOR DE DROPDOWN NO ÍNDICE (TOC) - VERSÃO VISUAL FINAL
// ==========================================================================
    
    $('.vector-toc-contents .vector-toc-list .vector-toc-list-item').each(function() {
        var $listItem = $(this);
        
        // Proteção total ao cabeçalho global
        if ($listItem.find('.vector-toc-title, #vector-toc-collapsed-button, .vector-toc-header').length > 0 || $listItem.hasClass('vector-toc-title')) {
            return;
        }

        var $subList = $listItem.children('.vector-toc-list, ul');
        
        // Só injeta o botão se contiver subcapítulos
        if ($subList.length > 0 && $subList.children('.vector-toc-list-item, li').length > 0) {
            
            if ($listItem.children('.toc-toggle-arrow').length === 0) {
                // Injeta o container da seta preparado para renderizar o SVG do CSS
                var $arrow = $('<span class="toc-toggle-arrow"><span class="arrow-icon"></span></span>');
                
                $arrow.click(function(e) {
                    e.preventDefault();
                    e.stopPropagation();
                    $listItem.toggleClass('toc-expanded');
                });
                
                $listItem.prepend($arrow);
            }
        }
    });




// 2. LÓGICA DA SETA (ALL MODELS)
    // Deteta o clique no contentor nativo do MediaWiki que criaste
    $('.variations-toggle').css('cursor', 'pointer').click(function() {
        // Encontra a seta com a classe .arrow-icon dentro do bloco clicado
        var $arrow = $(this).find('.arrow-icon');
        
        // Alterna a classe de rotação configurada no CSS
        $arrow.toggleClass('rotated');
    });




$(function() {
    // Procura apenas por blocos de código técnicos e ignora a área de produtos
    $('.mw-highlight pre, .syntaxhighlight pre, pre.mw-code-example').each(function() {
        var $this = $(this);
        
        // Verifica se o elemento já tem um botão para não duplicar
        if ($this.parent().find('.copy-code-button').length > 0) return;

        var $button = $('<button>')
            .text('Copy')
            .addClass('copy-code-button')
            .click(function() {
                var text = $this.text();
                navigator.clipboard.writeText(text).then(function() {
                    $button.text('Copied!');
                    setTimeout(function() { $button.text('Copy'); }, 2000);
                });
            });

        // Insere o botão antes do bloco de código
        $this.before($button);
    });
});


/*FOOTER*/

$(function() {
    var imgBase = "https://wiki.atronia.eu/images/";
    var img = {
        fb: imgBase + "5/55/Facebook.png",
        ln: imgBase + "9/99/Linkdin.png",
        ig: imgBase + "b/b7/Instagram.png",
        igus: imgBase + "2/2b/Igus.svg",
        selo: imgBase + "2/23/Selo_ID_reconhecimento_idoneidade_branco_.png",
        cp: imgBase + "9/92/Compete.png",
        ce: imgBase + "c/ce/Centro.png",
        ps: imgBase + "2/20/Pessoas.png",
        pr: imgBase + "4/42/Prr.png"
    };

    var linkStyle = 'style="color: #ffffff !important; display: block; margin-bottom: 10px; font-size: 14px; text-decoration: none; font-family:\'Rubik\', sans-serif;"';
    var titleStyle = 'style="color: #ffffff !important; font-weight: bold; margin-bottom: 20px; font-size: 16px; border: none; text-transform: none; font-family:\'Rubik\', sans-serif;"';

    var html = 
    '<div id="custom-atronia-footer" style="background-color: #111; font-family:\'Rubik\', sans-serif;">' +
        // 1. SCROLLING TEXT
        '<div class="atronia-scrolling-container">' +
            '<div class="atronia-scrolling-content">' +
                '<span>TECH THAT MAKES SENSE. • TECH THAT MAKES SENSE. • </span>' +
                '<span>TECH THAT MAKES SENSE. • TECH THAT MAKES SENSE. • </span>' +
                '<span>TECH THAT MAKES SENSE. • TECH THAT MAKES SENSE. • </span>' +
                '<span>TECH THAT MAKES SENSE. • TECH THAT MAKES SENSE. • </span>' +
            '</div>' +
        '</div>' +

        // 2. CONTEÚDO PRINCIPAL (CONTACTOS E MENUS)
        '<div style="display: flex; flex-wrap: wrap; justify-content: space-between; max-width: 1300px; margin: 0 auto; padding: 60px 20px; color: #ffffff; gap: 40px;">' +
            // Contactos
            '<div style="flex: 1.5; min-width: 280px;">' +
                '<h4 '+titleStyle+'>Visit but keep in mind we\'re busy</h4>' +
                '<p style="color: #ffffff !important;">Rua do Norte 9,<br>Ílhavo, 3830-167, Portugal</p>' +
                '<h4 '+titleStyle+' style="margin-top:30px">Contact Us</h4>' +
                '<p style="color: #ffffff !important; margin-bottom: 5px;">+351 934 886 253</p>' +
                '<p style="color: #ffffff !important; margin-bottom: 15px;">(Custo de chamada para rede móvel nacional)</p>' +
                '<p style="color: #ffffff !important;">info@atronia.eu</p>' +
                '<div style="display:flex; gap:15px; margin-top:20px">' +
                    '<a href="https://www.facebook.com/atronia.eu/" target="_blank"><img src="'+img.fb+'" width="25" style="filter: brightness(0) invert(1) !important;"></a>' +
                    '<a href="https://www.linkedin.com/company/atroniaeu/?originalSubdomain=pt" target="_blank"><img src="'+img.ln+'" width="25" style="filter: brightness(0) invert(1) !important;"></a>' +
                    '<a href="https://www.instagram.com/atronia.eu/" target="_blank"><img src="'+img.ig+'" width="25" style="filter: brightness(0) invert(1) !important;"></a>' +
                '</div>' +
            '</div>' +
            // Menus
            '<div style="flex: 3; display: flex; justify-content: space-between; flex-wrap: wrap; gap: 20px;">' +
                '<div><h4 '+titleStyle+'>Menu</h4>' +
                    '<a '+linkStyle+' href="https://atronia.eu/" target="_blank">Home</a>' +
                    '<a '+linkStyle+' href="https://atronia.eu/about-us/" target="_blank">About us</a>' +
                    '<a '+linkStyle+' href="https://atronia.eu/hardware/" target="_blank">Hardware</a>' +
                    '<a '+linkStyle+' href="https://atronia.eu/solutions/" target="_blank">Solutions</a>' +
                '</div>' +
                '<div><h4 '+titleStyle+'>Hardware</h4>' +
                    '<a '+linkStyle+' href="https://atronia.eu/hardware/monarch/" target="_blank">Monarch</a>' +                    
                    '<a '+linkStyle+' href="https://atronia.eu/hardware/atlas/" target="_blank">Atlas</a>' +
                    '<a '+linkStyle+'  target="_blank">Probes</a>' +
                    '<a '+linkStyle+'  target="_blank">Accessories</a>' +
                '</div>' +
                '<div><h4 '+titleStyle+'>Solutions</h4>' +
                    '<a '+linkStyle+' href="https://atronia.eu/aquaguard/" target="_blank">Aquaguard</a>' +
                    '<a '+linkStyle+' href="https://atronia.eu/solutions/firefly/" target="_blank">Firefly</a>' +
                    '<a '+linkStyle+' href="https://atronia.eu/solutions/melisafe/" target="_blank">Melisafe</a>' +
                    '<a '+linkStyle+' href="https://atronia.eu/solutions/prevent/" target="_blank">Prevent</a>' +
                '</div>' +
                '<div><h4 '+titleStyle+'>Knowledge</h4>' +
                    '<a '+linkStyle+' href="https://wiki.atronia.eu">Wiki</a>' +
                '</div>' +
            '</div>' +
        '</div>' +

        '<div class="atronia-full-width-line"></div>' +

        // 4. SECÇÃO FINAL (LOGOS COM ESPAÇAMENTO REDUZIDO)
        '<div style="padding: 40px 20px; max-width: 1300px; margin: 0 auto; display: flex; flex-wrap: wrap; align-items: flex-start; justify-content: flex-start; gap: 60px;">' +
            
            // 1. Approved by
            '<div style="flex: 0 1 auto; min-width: 120px;">' +
                '<p style="font-size:11px; opacity:0.6; color:#ffffff !important; margin-bottom:15px; font-weight:bold; text-transform: uppercase;">Approved by:</p>' +
                '<img src="'+img.selo+'" style="height: auto; width: 90px; display: block; border:none;">' +
            '</div>' +

            // 2. Powered by
            '<div style="flex: 0 1 auto; min-width: 150px;">' +
                '<p style="font-size:11px; opacity:0.6; color:#ffffff !important; margin-bottom:15px; font-weight:bold; text-transform: uppercase;">Powered by:</p>' +
                '<a href="https://www.igus.pt/" target="_blank"><img src="'+img.igus+'" style="height: auto; width: 130px; display: block; border:none;"></a>' +
            '</div>' +

            // 3. Co-sponsored by
            '<div style="flex: 0 1 auto; min-width: 300px;">' +
                '<p style="font-size:11px; opacity:0.6; color:#ffffff !important; margin-bottom:15px; font-weight:bold; text-transform: uppercase;">Co-sponsored by:</p>' +
                '<div style="display: grid; grid-template-columns: repeat(2, auto); gap: 15px 30px; justify-content: start; align-items: center;">' +
                    '<a href="https://atronia.eu/wp-content/uploads/2025/12/Ficha-do-projeto-ATRONIA-LDA.pdf" target="_blank"><img src="'+img.cp+'" style="height: 40px; max-width: 250px; width: auto; object-fit: contain; border:none;"></a>' +
                    '<a href="https://atronia.eu/wp-content/uploads/2025/09/Ficha-de-Operacao_Tilt-Wind.pdf" target="_blank"><img src="'+img.ce+'" style="height: 40px; max-width: 250px; width: auto; object-fit: contain; border:none;"></a>' +
                    '<a href="https://atronia.eu/wp-content/uploads/2025/01/Pessoas2030.jpg" target="_blank"><img src="'+img.ps+'" style="height: 40px; max-width: 250px; width: auto; object-fit: contain; border:none;"></a>' +
                    '<a href="https://atronia.eu/wp-content/uploads/2025/02/Ficha-de-Projeto.pdf" target="_blank"><img src="'+img.pr+'" style="height: 40px; max-width: 250px; width: auto; object-fit: contain; border:none;"></a>' +
                '</div>' +
            '</div>' +

        '</div>' +

        // Links Legais (alinhados abaixo dos logos)
        '<div style="padding: 0 20px 40px 20px; max-width: 1300px; margin: 0 auto;">' +
            '<p style="font-size: 13px; color: #ffffff !important;">' +
                '<strong><a href="https://www.livroreclamacoes.pt/" target="_blank" style="color: #ffffff !important; text-decoration: underline;">Livro de Reclamações</a> | <a href="https://atronia.eu/privacy-policy/" target="_blank" style="color: #ffffff !important; text-decoration: underline;">Privacy Policy</a></strong>' +
            '</p>' +
        '</div>' +

    '</div>';

    $('#custom-atronia-footer').remove();
    $('body').append(html);

    /* BOTÕES FLUTUANTES */
    var floatingNav = $('<div id="atronia-floating-nav" style="display:none; position:fixed; bottom:40px; right:40px; display:flex; gap:12px; z-index:9999; align-items:center;"></div>');
    var backToTop = $('<div id="back-to-top" style="width:50px; height:50px; background-color:#BFFF00; color:#000000; border-radius:50%; text-align:center; line-height:50px; font-size:24px; cursor:pointer; box-shadow:0 4px 12px rgba(0,0,0,0.3); transition:all 0.3s ease;">↑</div>');
    var siteBtn = $('<a href="https://atronia.eu/" target="_blank" style="text-decoration:none;"><div style="height:50px; padding:0 25px; background-color:#BFFF00; color:#000000; border-radius:25px; line-height:50px; font-weight:bold; font-size:14px; box-shadow:0 4px 12px rgba(0,0,0,0.3); cursor:pointer; transition:all 0.3s ease; font-family:\'Rubik\', sans-serif;">atronia.eu</div></a>');

    floatingNav.append(backToTop).append(siteBtn);
    $('body').append(floatingNav);

    $(window).scroll(function() {
        if ($(window).scrollTop() > 300) { floatingNav.fadeIn().css('display', 'flex'); } else { floatingNav.fadeOut(); }
    });

    backToTop.click(function() { $('html, body').animate({scrollTop: 0}, 600); });
    $('#atronia-floating-nav > a > div, #back-to-top').hover(
        function() { $(this).css({ 'transform': 'scale(1.1)', 'background-color': '#A0D500' }); },
        function() { $(this).css({ 'transform': 'scale(1.0)', 'background-color': '#BFFF00' }); }
    );
});

/*FIM DO FOOTER*/




/* Botões Flutuantes: Voltar ao Topo (Esquerda) + Website (Direita) */
var floatingNav = $('<div id="atronia-floating-nav" style="display:none; position:fixed; bottom:40px; right:40px; display:flex; gap:12px; z-index:9999; align-items:center;"></div>');

// 1. Botão de Topo (Agora configurado para aparecer primeiro na fila)
var backToTop = $('<div id="back-to-top" style="width:50px; height:50px; background-color:#BFFF00; color:#000000; border-radius:50%; text-align:center; line-height:50px; font-size:24px; cursor:pointer; box-shadow:0 4px 12px rgba(0,0,0,0.3); transition:all 0.3s ease;">↑</div>');

// 2. Botão do Website
var siteBtn = $('<a href="https://atronia.eu/" target="_blank" style="text-decoration:none;">' +
    '<div style="height:50px; padding:0 25px; background-color:#BFFF00; color:#000000; border-radius:25px; line-height:50px; font-weight:bold; font-size:14px; box-shadow:0 4px 12px rgba(0,0,0,0.3); cursor:pointer; transition:all 0.3s ease; font-family:\'Rubik\', sans-serif;">' +
        'atronia.eu' +
    '</div>' +
'</a>');

// Montagem: Primeiro o backToTop, depois o siteBtn
floatingNav.append(backToTop).append(siteBtn);
$('body').append(floatingNav);

// Lógica de Scroll
$(window).scroll(function() {
    if ($(window).scrollTop() > 300) {
        floatingNav.fadeIn().css('display', 'flex');
    } else {
        floatingNav.fadeOut();
    }
});

// Ação de Clique
backToTop.click(function() {
    $('html, body').animate({scrollTop: 0}, 600);
});

// Efeito de Hover
$('#atronia-floating-nav > a > div, #back-to-top').hover(
    function() { 
        $(this).css({ 'transform': 'scale(1.1)', 'background-color': '#A0D500' }); 
    },
    function() { 
        $(this).css({ 'transform': 'scale(1.0)', 'background-color': '#BFFF00' }); 
    }
);


// 4. GOOGLE ANALYTICS (Fora do $(function) para carregar logo)
var gaScript = document.createElement('script');
gaScript.src = "https://www.googletagmanager.com/gtag/js?id=G-MX174P23PW";
gaScript.async = true;
document.head.appendChild(gaScript);
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
gtag('js', new Date());
gtag('config', 'G-MX174P23PW');