Jump to content

MediaWiki:Common.js: Difference between revisions

No edit summary
No edit summary
 
(34 intermediate revisions by the same user not shown)
Line 2: Line 2:




// ==========================================================================
// Força o menu lateral a expandir (Vector 2022) se estiver colapsado
     // DROPDOWNS AUTOMÁTICOS PARA TODOS OS SUB-HEADINGS
mw.hook('wikipage.content').add(function () {
     // ==========================================================================
    if (document.documentElement.classList.contains('vector-feature-main-menu-pinned-disabled')) {
     var headingSelectors = 'h2, h3, h4, h5, h6';
        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 () {
 
     // Lista de secções principais com subpáginas.
     // Para adicionares uma nova secção no futuro, basta acrescentar o nome aqui.
    var sidebarSections = ['SENSBLUE MONARCH', 'SENSBLUE ATLAS'];
 
    function setupSidebarDropdowns() {
        // 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;
 
        sidebarSections.forEach(function (sectionName) {
            var slug = sectionName.replace(/ /g, '_');
 
            // 1. Identifica as subpáginas desta secção pelo URL (funciona para qualquer subpágina, incluindo novas)
            $sidebar.find('li').each(function () {
                var $li = $(this);
                var $link = $li.find('a, .mw-selflink').first();
                var href = $link.attr('href') || '';
                var isSubpage = href.indexOf(slug + '/') !== -1;
 
                if (isSubpage) {
                    $li.addClass('wiki-submenu').attr('data-group', slug);
                }
            });
 
            // 2. Procura o item pai (ex: "SENSBLUE MONARCH") na barra lateral
            var $parentLi = $sidebar.find('li').filter(function () {
                var text = $(this).clone().children().remove().end().text().trim() || $(this).text().trim();
                return text === sectionName;
            }).first();
 
            // 3. Injeta a seta nativa se encontrar o link e ainda não a tiver
            if ($parentLi.length && !$parentLi.find('.wiki-toggle-btn').length) {
 
                $parentLi.css({
                    'display': 'flex',
                    'align-items': 'center',
                    'justify-content': 'flex-start'
                });
 
                $parentLi.find('a, .mw-selflink, span').css({
                    'display': 'inline',
                    'width': 'auto'
                });
 
                var $toggleBtn = $('<span class="wiki-toggle-btn"></span>');
                $parentLi.append($toggleBtn);
 
                $toggleBtn.on('click', function (e) {
                    e.preventDefault();
                    e.stopPropagation();
 
                    $sidebar.find('.wiki-submenu[data-group="' + slug + '"]').toggleClass('is-open');
                    $(this).toggleClass('is-active');
                });
            }
        });
    }
 
    // GATILHO COMPATÍVEL COM ANÓNIMOS: Executa em múltiplos estágios do carregamento
    $(document).ready(setupSidebarDropdowns);
     $(window).on('load', setupSidebarDropdowns);
    mw.hook('wikipage.content').add(setupSidebarDropdowns);
});
 
 


    // Adiciona um ponteiro de rato e um indicador visual aos títulos para o utilizador saber que dão para clicar
    $(headingSelectors).filter(function() {
        // Ignora títulos nativos do sistema (como o título da página principal ou menus)
        return !$(this).parents('#mw-navigation, #footer, #custom-atronia-footer').length && this.id !== 'firstHeading';
    }).css('cursor', 'pointer').prepend('<span class="wiki-toggle-indicator">▼</span>');


    // Lógica do Clique para recolher/expandir o conteúdo
// ==========================================================================
     $(headingSelectors).click(function() {
// CONTROLADOR DE DROPDOWN NO ÍNDICE (TOC) - VERSÃO VISUAL FINAL
         var $currentHeading = $(this);
// ==========================================================================
        var currentLevel = parseInt(this.tagName.substring(1)); // Extrai o número do heading (ex: H3 -> 3)
   
        var $indicator = $currentHeading.find('.wiki-toggle-indicator');
     $('.vector-toc-contents .vector-toc-list .vector-toc-list-item').each(function() {
         var $listItem = $(this);
          
          
         // Alterna o estado visual da seta indicadora
         // Proteção total ao cabeçalho global
         $indicator.toggleClass('collapsed');
         if ($listItem.find('.vector-toc-title, #vector-toc-collapsed-button, .vector-toc-header').length > 0 || $listItem.hasClass('vector-toc-title')) {
            return;
        }


         // Percorre todos os elementos seguintes (irmãos) no DOM
        var $subList = $listItem.children('.vector-toc-list, ul');
         $currentHeading.nextAll().each(function() {
       
            var $nextElement = $(this);
         // Só injeta o botão se contiver subcapítulos
         if ($subList.length > 0 && $subList.children('.vector-toc-list-item, li').length > 0) {
              
              
            // Se encontrar um cabeçalho...
             if ($listItem.children('.toc-toggle-arrow').length === 0) {
             if ($nextElement.is(headingSelectors)) {
                // Injeta o container da seta preparado para renderizar o SVG do CSS
                 var nextLevel = parseInt(this.tagName.substring(1));
                 var $arrow = $('<span class="toc-toggle-arrow"><span class="arrow-icon"></span></span>');
                 // Se o nível for igual ou superior (ex: H2 a encontrar outro H2, ou H3 a encontrar um H2), para o loop
                  
                if (nextLevel <= currentLevel) {
                $arrow.click(function(e) {
                     return false; // Quebra o .each()
                    e.preventDefault();
                 }
                     e.stopPropagation();
                    $listItem.toggleClass('toc-expanded');
                 });
               
                $listItem.prepend($arrow);
             }
             }
           
         }
            // Alterna a visibilidade dos elementos de conteúdo pertencentes a esta secção
            $nextElement.toggleClass('wiki-heading-collapsed');
         });
     });
     });