|
|
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);
| |
| });
| |
| });
| |
| }); | | }); |