MediaWiki:Common.js: Difference between revisions

From SZ
Jump to navigation Jump to search
No edit summary
No edit summary
Line 1: Line 1:
/* Any JavaScript here will be loaded for all users on every page load. */
/* Any JavaScript here will be loaded for all users on every page load. */


document.addEventListener("DOMContentLoaded", function() {
/* Collapsible sidebar sections for MW 1.44 (Vector & Vector 2022)
    document.querySelectorAll('.collapsible-header').forEach(header => {
  List the exact section keys from MediaWiki:Sidebar here: */
        header.addEventListener('click', () => {
var COLLAPSIBLE_SECTIONS = [ 'book1', 'book2' ];
            header.parentElement.classList.toggle('active');
 
        });
/* 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);

Revision as of 14:50, 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);