MediaWiki:Common.js: Difference between revisions

From SZ
Jump to navigation Jump to search
No edit summary
Tag: Reverted
No edit summary
Tag: Manual revert
Line 6: Line 6:


/* Default open/closed; set true to open by default */
/* Default open/closed; set true to open by default */
var DEFAULT_OPEN = true;
var DEFAULT_OPEN = false;


function initCollapsiblePortlet(name) {
function initCollapsiblePortlet(name) {

Revision as of 14:56, 24 August 2025

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

/* Collapsible sidebar sections for MW 1.44 (Vector & Vector 2022)
   List the exact section keys from MediaWiki:Sidebar here: */
var COLLAPSIBLE_SECTIONS = [ 'book1', 'book2' ];

/* Default open/closed; set true to open by default */
var DEFAULT_OPEN = false;

function initCollapsiblePortlet(name) {
  var portal = document.getElementById('p-' + name);
  if (!portal) return;

  // Choose heading/content across skins
  var heading = portal.querySelector('.vector-menu-heading') || portal.querySelector('h3');
  var content = portal.querySelector('.vector-menu-content') || portal.querySelector('.body');
  if (!heading || !content) return;

  portal.classList.add('mw-custom-collapsible');

  // State from storage
  var storageKey = 'mwSidebar:' + name;
  var stored = null;
  try { stored = localStorage.getItem(storageKey); } catch (e) {}
  var isOpen = stored === null ? DEFAULT_OPEN : stored === '1';

  function setState(open) {
    portal.classList.toggle('is-open', open);
    heading.setAttribute('aria-expanded', open ? 'true' : 'false');
    content.style.display = open ? '' : 'none';
    try { localStorage.setItem(storageKey, open ? '1' : '0'); } catch (e) {}
  }

  // A11y & interactions
  heading.setAttribute('role', 'button');
  heading.setAttribute('tabindex', '0');
  heading.addEventListener('click', function () { setState(!portal.classList.contains('is-open')); });
  heading.addEventListener('keydown', function (e) {
    if (e.key === 'Enter' || e.key === ' ') {
      e.preventDefault();
      setState(!portal.classList.contains('is-open'));
    }
  });

  setState(isOpen);
}

function bootCollapsibleSidebars() {
  COLLAPSIBLE_SECTIONS.forEach(initCollapsiblePortlet);
}

// Run on load and on SPA-like updates
if (document.readyState === 'loading') {
  document.addEventListener('DOMContentLoaded', bootCollapsibleSidebars);
} else {
  bootCollapsibleSidebars();
}
mw.hook('wikipage.content').add(bootCollapsibleSidebars);