MediaWiki:Common.js: Difference between revisions

From SZ
Jump to navigation Jump to search
No edit summary
Tag: Reverted
No edit summary
 
(11 intermediate revisions by the same user not shown)
Line 1: Line 1:
mw.loader.using(['mediawiki.util']).then(function () {
/**
  $(function () {
* Collapsible Sidebar (Debug Build) - Patched for Vector & Vector 2022
    var STORAGE_KEY = 'sidebar-collapse-state:v2';
* Logs everything to console for verification
    var defaultExpanded = ['navigation', 'book1'];
*/
    var defaultCollapsed = [];


    function readState() {
/*
      try { return JSON.parse(localStorage.getItem(STORAGE_KEY)) || {}; }
$(function () {
      catch(e) { return {}; }
    // Add toggle link
     }
    var $sidebar = $('#mw-panel');
    function writeState(s) { try { localStorage.setItem(STORAGE_KEY, JSON.stringify(s)); } catch(e) {} }
    var $toggleLink = $('<a href="#" id="collapse-sidebar">Toggle Sidebar</a>')
        .css({ display: 'block', margin: '5px', cursor: 'pointer' });
 
    $('#p-logo').after($toggleLink);
 
    $toggleLink.click(function (e) {
        e.preventDefault();
        $sidebar.toggleClass('collapsed');
    });
});
*/
 
/*
 
(function () {
  window.MWSidebarDebug = true;
 
  function log() {
    if (window.MWSidebarDebug) console.log('[SidebarCollapsible]', ...arguments);
  }
  function warn() {
     if (window.MWSidebarDebug) console.warn('[SidebarCollapsible]', ...arguments);
  }
 
  var skin = mw.config.get('skin');
  log('Init start. Detected skin =', skin);
 
  function findPanels($root) {
    // Match both Vector and Vector 2022 classes
    var $panels = $root.find('#mw-panel .vector-menu-portal, #mw-panel .vector-menu.mw-portlet');
    log('Panels found:', $panels.length);
    return $panels;
  }
 
  function initOnce($root) {
    var $panels = findPanels($root);


     function portalIdFor(node) {
     if (!$panels.length) {
      if (node.id?.startsWith('p-')) return node.id.slice(2).toLowerCase();
       warn('No sidebar panels found using selectors for Vector/Vector-2022');
       var dn = node.getAttribute('data-name');
       return;
       if (dn) return dn.toLowerCase();
      var h = node.querySelector('h3, .vector-menu-heading');
      return h ? h.textContent.trim().toLowerCase().replace(/\s+/g,'-') : 'portal-'+Math.random();
     }
     }


     function setExpanded(node, exp) {
     $panels.each(function (idx, el) {
       node.classList.toggle('vector-collapsible--expanded', exp);
       var $panel = $(el);
       node.classList.toggle('vector-collapsible--collapsed', !exp);
       var id = $panel.attr('id') || ('panel#' + idx);
       var heading = node.querySelector('h3, .vector-menu-heading');
       var $list = $panel.find('> .vector-menu-content > .vector-menu-content-list, > .body > ul').first();
      if (heading) heading.setAttribute('aria-expanded', exp);
    }


    function toggleNode(node, persist) {
      if (!$list.length) {
      var ns = !node.classList.contains('vector-collapsible--expanded');
        warn('No list in panel:', id);
      setExpanded(node, ns);
         return;
      if (persist) {
         var s = readState(); s[portalIdFor(node)] = ns ? 1 : 0; writeState(s);
       }
       }
    }


    function attachToggle(node) {
       var $items = $list.children('li');
       var heading = node.querySelector('h3, .vector-menu-heading');
       log('Panel', id, ':', $items.length, 'top-level item(s)');
       if (!heading) return;
 
       // inject span.icon if missing
       $items.each(function (i, li) {
      if (!heading.querySelector('.vector-collapse-icon')) {
         var $li = $(li);
         var span = document.createElement('span');
         var $sub = $li.children('ul');
         span.className = 'vector-collapse-icon';
         if (!$sub.length) return;
         span.innerHTML = '&#9660;'; // ▼ symbol
 
         heading.style.position = 'relative';
         $li.addClass('collapsible-header');
         heading.style.paddingLeft = '1.5em';
         if (!$li.children('.mw-collapsible-arrow').length) {
         heading.insertBefore(span, heading.firstChild);
          $li.prepend($('<span class="mw-collapsible-arrow" aria-hidden="true">▶</span>'));
      }
         }
      heading.addEventListener('click', function(e){ e.preventDefault(); toggleNode(node,true); });
        $sub.hide();
      heading.addEventListener('keydown', function(e){ if (e.key==='Enter'||e.key===' '){ e.preventDefault(); toggleNode(node,true);} });
 
    }
        var headerText = ($li.find('> a').first().text() || '').trim();
        log('Registered collapsible item', i, 'in', id, 'header=', headerText);


    var portals = document.body.classList.contains('skin-vector-2022')
        $li.off('.mwCollapsibleSidebar')
      ? Array.from(document.querySelectorAll('nav.vector-menu-portal')).filter(e=>!e.closest('#vector-main-menu'))
          .on('click.mwCollapsibleSidebar', function (e) {
      : Array.from(document.querySelectorAll('#mw-panel .portal'));
            if ($(e.target).closest('a').length) return;
            e.preventDefault();
            $li.toggleClass('open');
            $sub.stop(true, true).slideToggle(200);
            log('Toggled', $li.hasClass('open') ? 'open' : 'closed', ':', headerText);
          });
      });
    });
  }


    var saved = readState();
  mw.loader.using('mediawiki.util').then(function () {
     portals.forEach(function(p){
     $(function () {
       var id = portalIdFor(p);
       console.group && console.group('[SidebarCollapsible] bootstrap');
       var initial = saved.hasOwnProperty(id) ? !!saved[id] :
      initOnce($(document));
                    defaultExpanded.includes(id) ? true :
       console.groupEnd && console.groupEnd();
                    defaultCollapsed.includes(id) ? false : true;
    });
       setExpanded(p, initial);
    mw.hook('wikipage.content').add(function ($c) {
       attachToggle(p);
       log('wikipage.content hook fired (re-init on dynamic content).');
       initOnce($c);
     });
     });
   });
   });
});
 
 
})();
 
*/

Latest revision as of 15:29, 26 August 2025

/**
 * Collapsible Sidebar (Debug Build) - Patched for Vector & Vector 2022
 * Logs everything to console for verification
 */

/*
$(function () {
    // Add toggle link
    var $sidebar = $('#mw-panel');
    var $toggleLink = $('<a href="#" id="collapse-sidebar">Toggle Sidebar</a>')
        .css({ display: 'block', margin: '5px', cursor: 'pointer' });

    $('#p-logo').after($toggleLink);

    $toggleLink.click(function (e) {
        e.preventDefault();
        $sidebar.toggleClass('collapsed');
    });
});
*/

/*

(function () {
  window.MWSidebarDebug = true;

  function log() {
    if (window.MWSidebarDebug) console.log('[SidebarCollapsible]', ...arguments);
  }
  function warn() {
    if (window.MWSidebarDebug) console.warn('[SidebarCollapsible]', ...arguments);
  }

  var skin = mw.config.get('skin');
  log('Init start. Detected skin =', skin);

  function findPanels($root) {
    // Match both Vector and Vector 2022 classes
    var $panels = $root.find('#mw-panel .vector-menu-portal, #mw-panel .vector-menu.mw-portlet');
    log('Panels found:', $panels.length);
    return $panels;
  }

  function initOnce($root) {
    var $panels = findPanels($root);

    if (!$panels.length) {
      warn('No sidebar panels found using selectors for Vector/Vector-2022');
      return;
    }

    $panels.each(function (idx, el) {
      var $panel = $(el);
      var id = $panel.attr('id') || ('panel#' + idx);
      var $list = $panel.find('> .vector-menu-content > .vector-menu-content-list, > .body > ul').first();

      if (!$list.length) {
        warn('No list in panel:', id);
        return;
      }

      var $items = $list.children('li');
      log('Panel', id, ':', $items.length, 'top-level item(s)');

      $items.each(function (i, li) {
        var $li = $(li);
        var $sub = $li.children('ul');
        if (!$sub.length) return;

        $li.addClass('collapsible-header');
        if (!$li.children('.mw-collapsible-arrow').length) {
          $li.prepend($('<span class="mw-collapsible-arrow" aria-hidden="true">▶</span>'));
        }
        $sub.hide();

        var headerText = ($li.find('> a').first().text() || '').trim();
        log('Registered collapsible item', i, 'in', id, 'header=', headerText);

        $li.off('.mwCollapsibleSidebar')
          .on('click.mwCollapsibleSidebar', function (e) {
            if ($(e.target).closest('a').length) return;
            e.preventDefault();
            $li.toggleClass('open');
            $sub.stop(true, true).slideToggle(200);
            log('Toggled', $li.hasClass('open') ? 'open' : 'closed', ':', headerText);
          });
      });
    });
  }

  mw.loader.using('mediawiki.util').then(function () {
    $(function () {
      console.group && console.group('[SidebarCollapsible] bootstrap');
      initOnce($(document));
      console.groupEnd && console.groupEnd();
    });
    mw.hook('wikipage.content').add(function ($c) {
      log('wikipage.content hook fired (re-init on dynamic content).');
      initOnce($c);
    });
  });


})();

*/