Ativa o menu
Alternar menu de preferências
Alternar menu pessoal
Não autenticado(a)
Your IP address will be publicly visible if you make any edits.

MediaWiki:Citizen.js: mudanças entre as edições

Página de Interface do MediaWiki
Sem resumo de edição
Sem resumo de edição
Linha 105: Linha 105:
      
      
     // Limpa a memória
     // Limpa a memória
     function clearActiveSubmenu() {
     function clearActiveSubmenu(reason) {
         try {
         try {
            var oldValue = localStorage.getItem(STORAGE_KEY);
             localStorage.removeItem(STORAGE_KEY);
             localStorage.removeItem(STORAGE_KEY);
             console.log('🗑️ Limpou memória do submenu');
             console.log('🗑️ Limpou memória:', oldValue, '| Motivo:', reason || 'não especificado');
            console.trace(); // Mostra de onde veio a chamada
         } catch(e) {
         } catch(e) {
             console.log('❌ Erro ao limpar localStorage');
             console.log('❌ Erro ao limpar localStorage');
Linha 201: Linha 203:
         $('.erp-submenu-overlay').hide();
         $('.erp-submenu-overlay').hide();
         $('.erp-menu-item').removeClass('active');
         $('.erp-menu-item').removeClass('active');
         clearActiveSubmenu();
         clearActiveSubmenu('clicou fora do menu');
         console.log('👆 Clicou fora, fecha e limpa');
         console.log('👆 Clicou fora, fecha e limpa');
     });
     });
Linha 213: Linha 215:
         clearTimeout(inactivityTimer);
         clearTimeout(inactivityTimer);
         inactivityTimer = setTimeout(function() {
         inactivityTimer = setTimeout(function() {
             clearActiveSubmenu();
             clearActiveSubmenu('30 minutos de inatividade');
         }, 30 * 60 * 1000);
         }, 30 * 60 * 1000);
     }
     }
Linha 219: Linha 221:
     $(document).on('mousemove keypress click', resetInactivityTimer);
     $(document).on('mousemove keypress click', resetInactivityTimer);
     resetInactivityTimer();
     resetInactivityTimer();
   
    // DEBUG: Função global para testar localStorage
    window.testERPMemory = function() {
        console.log('=== TESTE DE MEMÓRIA ERP ===');
        console.log('Valor salvo:', localStorage.getItem('erp_active_submenu'));
        console.log('Página atual:', window.location.pathname);
        console.log('========================');
    };
   
    console.log('💡 Para testar memória, digite: testERPMemory()');
});
});



Edição das 20h33min 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);
            console.log('✅ Salvou submenu:', submenuId);
        } catch(e) {
            console.log('❌ LocalStorage não disponível');
        }
    }
    
    // Recupera o submenu salvo
    function getActiveSubmenu() {
        try {
            var submenu = localStorage.getItem(STORAGE_KEY);
            console.log('📖 Tentando recuperar:', submenu);
            return submenu;
        } catch(e) {
            return null;
        }
    }
    
    // Limpa a memória
    function clearActiveSubmenu(reason) {
        try {
            var oldValue = localStorage.getItem(STORAGE_KEY);
            localStorage.removeItem(STORAGE_KEY);
            console.log('🗑️ Limpou memória:', oldValue, '| Motivo:', reason || 'não especificado');
            console.trace(); // Mostra de onde veio a chamada
        } catch(e) {
            console.log('❌ Erro ao limpar localStorage');
        }
    }
    
    // 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');
            console.log('✅ Abriu submenu:', submenuId);
        } else {
            console.log('❌ Não encontrou submenu:', submenuId);
        }
    }
    
    // Restaura o submenu ao carregar a página
    function restoreSubmenu() {
        // Só restaura se estiver na página Tutoriais
        var currentPath = window.location.pathname;
        
        if (currentPath.indexOf('/Tutoriais') === -1 && currentPath.indexOf('/tutoriais') === -1) {
            console.log('ℹ️ Não está na página Tutoriais, não vai restaurar');
            return;
        }
        
        var savedSubmenu = getActiveSubmenu();
        
        if (savedSubmenu) {
            setTimeout(function() {
                openSubmenu(savedSubmenu);
                console.log('✅ Restaurou submenu:', savedSubmenu);
            }, 150);
        } else {
            console.log('ℹ️ Nenhum submenu salvo para restaurar');
        }
    }
    
    // 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');
            // NÃO limpa memória ao fechar, só fecha visualmente
            console.log('📁 Fechou submenu mas mantém memória');
        } 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) {
            console.log('🔗 Clicou em link, mantém memória');
            return;
        }
        
        // Se clicou na área vazia, fecha e limpa
        $('.erp-submenu-overlay').hide();
        $('.erp-menu-item').removeClass('active');
        clearActiveSubmenu('clicou fora do menu');
        console.log('👆 Clicou fora, fecha e limpa');
    });
    
    // 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();
    
    // DEBUG: Função global para testar localStorage
    window.testERPMemory = function() {
        console.log('=== TESTE DE MEMÓRIA ERP ===');
        console.log('Valor salvo:', localStorage.getItem('erp_active_submenu'));
        console.log('Página atual:', window.location.pathname);
        console.log('========================');
    };
    
    console.log('💡 Para testar memória, digite: testERPMemory()');
});


/* =======================================================
   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');
        }
    });
});