MediaWiki:Common.js: Difference between revisions
Jump to navigation
Jump to search
Added collapsible sidebar functionality for all pages Tag: Reverted |
No edit summary |
||
(42 intermediate revisions by the same user not shown) | |||
Line 1: | Line 1: | ||
/* | /** | ||
* 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; | |||
.mw-collapsible- | $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); | |||
}); | }); | ||
}); | }); | ||
})(); | |||
*/ | |||
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); }); }); })(); */