MediaWiki:Common.js

Aus Lost Dreams Of Tomorrow Wiki

Hinweis: Leere nach dem Veröffentlichen den Browser-Cache, um die Änderungen sehen zu können.

  • Firefox/Safari: Umschalttaste drücken und gleichzeitig Aktualisieren anklicken oder entweder Strg+F5 oder Strg+R (⌘+R auf dem Mac) drücken
  • Google Chrome: Umschalttaste+Strg+R (⌘+Umschalttaste+R auf dem Mac) drücken
  • Edge: Strg+F5 drücken oder Strg drücken und gleichzeitig Aktualisieren anklicken
// MediaWiki Sidebar Toggle Script - FINALE VERSION
/*------------------------Sidebar Toggle Script ------------------------------------------*/

(function() {
    'use strict';
    
    var processing = false; // Debounce
    
    function initSidebar() {
        var portlets = document.querySelectorAll('#p-Players, #p-World, #p-Items_and_Gear, #p-Guides, #p-Community');
        
        console.log('Gefundene Portlets:', portlets.length);
        
        portlets.forEach(function(portlet) {
            var header = portlet.querySelector('h3');
            var portletBody = portlet.querySelector('.mw-portlet-body');
            
            if (!header || !portletBody) {
                return;
            }
            
            // Bereits initialisiert? Skip!
            if (header.hasAttribute('data-toggle-ready')) {
                return;
            }
            
            console.log('Initialisiere:', header.textContent);
            header.setAttribute('data-toggle-ready', 'true');
            
            // Icon hinzufügen
            if (!header.querySelector('.toggle-icon')) {
                var icon = document.createElement('span');
                icon.className = 'toggle-icon';
                icon.innerHTML = '<svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><polyline points="6 9 12 15 18 9"></polyline></svg>';
                icon.style.marginLeft = '8px';
                icon.style.display = 'inline-block';
                icon.style.transition = 'transform 0.2s ease';
                icon.style.verticalAlign = 'middle';
                header.appendChild(icon);
            }
            
            header.style.cursor = 'pointer';
            header.style.userSelect = 'none';
            
            // Initial Status
            var isOpen = !header.classList.contains('closed');
            if (!isOpen) {
                portletBody.style.display = 'none';
                var icon = header.querySelector('.toggle-icon');
                icon.style.transform = 'rotate(-90deg)';
            }
            
            // Toggle Funktion mit Debounce
            var toggleMenu = function(e) {
                e.preventDefault();
                e.stopPropagation();
                e.stopImmediatePropagation(); // WICHTIG!
                
                // Debounce - verhindert Doppel-Klicks
                if (processing) {
                    return;
                }
                processing = true;
                
                setTimeout(function() {
                    processing = false;
                }, 300);
                
                var icon = header.querySelector('.toggle-icon');
                var body = portlet.querySelector('.mw-portlet-body');
                
                if (body.style.display === 'none') {
                    body.style.display = 'block';
                    icon.style.transform = 'rotate(0deg)';
                    header.classList.add('open');
                    header.classList.remove('closed');
                    console.log('Geöffnet');
                } else {
                    body.style.display = 'none';
                    icon.style.transform = 'rotate(-90deg)';
                    header.classList.add('closed');
                    header.classList.remove('open');
                    console.log('Geschlossen');
                }
            };
            
            // NUR Click-Event (funktioniert auch auf Mobile)
            header.addEventListener('click', toggleMenu, true);
        });
    }
    
    if (document.readyState === 'loading') {
        document.addEventListener('DOMContentLoaded', initSidebar);
    } else {
        initSidebar();
    }
})();


/*------------------------Landing Features------------------------------------------*/

(function() {
    'use strict';
    
    function initLandingTabs() {
        const tabs = document.querySelectorAll('.tab-button');
        const grids = document.querySelectorAll('.landing-grid');
        
        if (tabs.length === 0 || grids.length === 0) {
            return;
        }
        
        tabs.forEach(tab => {
            if (tab.hasAttribute('data-tab-ready')) {
                return;
            }
            tab.setAttribute('data-tab-ready', 'true');
            
            tab.addEventListener('click', function() {
                tabs.forEach(t => t.classList.remove('active'));
                this.classList.add('active');
                
                grids.forEach(g => g.classList.remove('active'));
                
                const targetGrid = document.getElementById(this.dataset.tab);
                if (targetGrid) {
                    targetGrid.classList.add('active');
                }
            });
        });
    }
    
    if (document.readyState === 'loading') {
        document.addEventListener('DOMContentLoaded', initLandingTabs);
    } else {
        initLandingTabs();
    }
    
    setTimeout(initLandingTabs, 500);
})();

// jQuery ONLY für ANDERE sidebar-collapsible (NICHT deine Portlets!)
if (typeof jQuery !== 'undefined') {
    $(document).ready(function() {
        // NUR für Elemente die NICHT #p-Players, #p-World, etc. sind
        $('.sidebar-collapsible').not('#p-Players h3, #p-World h3, #p-Items_and_Gear h3, #p-Guides h3, #p-Community h3').click(function(e) {
            e.preventDefault();
            $(this).toggleClass('closed');
            $(this).next('.mw-portlet-body, ul').slideToggle(200);
        });
        
        if (window.innerWidth <= 850) {
            $('#mw-sidebar-checkbox:checked ~ .mw-sidebar').on('click', function(e) {
                if (e.target === this) {
                    $('#mw-sidebar-checkbox').prop('checked', false);
                }
            });
        }
    });
}