MediaWiki:Common.js: Difference between revisions

From SZ
Jump to navigation Jump to search
No edit summary
Tag: Reverted
No edit summary
Tag: Reverted
Line 1: Line 1:
mw.loader.using(['mediawiki.util']).then(function () {
/* Any JavaScript here will be loaded for all users on every page load. */
  $(function () {
    var STORAGE_KEY = 'sidebar-collapse-state:v2';
    var defaultExpanded = ['navigation', 'book1'];
    var defaultCollapsed = [];


    function readState() {
mw.loader.using('jquery.makeCollapsible').done(function () {
      try { return JSON.parse(localStorage.getItem(STORAGE_KEY)) || {}; }
  // Target sidebar portlets (each "box" in the sidebar)
      catch(e) { return {}; }
  $('#p-navigation, #p-tb, #p-wiki-navigation, #p-coll-print_export').addClass('mw-collapsible mw-collapsed');
    }
    function writeState(s) { try { localStorage.setItem(STORAGE_KEY, JSON.stringify(s)); } catch(e) {} }


    function portalIdFor(node) {
  // Auto-apply collapsible behavior
      if (node.id?.startsWith('p-')) return node.id.slice(2).toLowerCase();
  $('.mw-collapsible').makeCollapsible();
      var dn = node.getAttribute('data-name');
      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) {
      node.classList.toggle('vector-collapsible--expanded', exp);
      node.classList.toggle('vector-collapsible--collapsed', !exp);
      var heading = node.querySelector('h3, .vector-menu-heading');
      if (heading) heading.setAttribute('aria-expanded', exp);
    }
 
    function toggleNode(node, persist) {
      var ns = !node.classList.contains('vector-collapsible--expanded');
      setExpanded(node, ns);
      if (persist) {
        var s = readState(); s[portalIdFor(node)] = ns ? 1 : 0; writeState(s);
      }
    }
 
    function attachToggle(node) {
      var heading = node.querySelector('h3, .vector-menu-heading');
      if (!heading) return;
      // inject span.icon if missing
      if (!heading.querySelector('.vector-collapse-icon')) {
        var span = document.createElement('span');
        span.className = 'vector-collapse-icon';
        span.innerHTML = '▼'; // ▼ symbol
        heading.style.position = 'relative';
        heading.style.paddingLeft = '1.5em';
        heading.insertBefore(span, heading.firstChild);
      }
      heading.addEventListener('click', function(e){ e.preventDefault(); toggleNode(node,true); });
      heading.addEventListener('keydown', function(e){ if (e.key==='Enter'||e.key===' '){ e.preventDefault(); toggleNode(node,true);} });
    }
 
    var portals = document.body.classList.contains('skin-vector-2022')
      ? Array.from(document.querySelectorAll('nav.vector-menu-portal')).filter(e=>!e.closest('#vector-main-menu'))
      : Array.from(document.querySelectorAll('#mw-panel .portal'));
 
    var saved = readState();
    portals.forEach(function(p){
      var id = portalIdFor(p);
      var initial = saved.hasOwnProperty(id) ? !!saved[id] :
                    defaultExpanded.includes(id) ? true :
                    defaultCollapsed.includes(id) ? false : true;
      setExpanded(p, initial);
      attachToggle(p);
    });
  });
});
});

Revision as of 16:06, 25 August 2025

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

mw.loader.using('jquery.makeCollapsible').done(function () {
  // Target sidebar portlets (each "box" in the sidebar)
  $('#p-navigation, #p-tb, #p-wiki-navigation, #p-coll-print_export').addClass('mw-collapsible mw-collapsed');

  // Auto-apply collapsible behavior
  $('.mw-collapsible').makeCollapsible();
});