MediaWiki:Gadget-toggle.js
CSS and Javascript changes must comply with the wiki design rules.
Note: After saving, you may have to bypass your browser's cache to see the changes.
- Firefox / Safari: Hold Shift while clicking Reload, or press either Ctrl-F5 or Ctrl-R (⌘-R on a Mac)
- Google Chrome: Press Ctrl-Shift-R (⌘-Shift-R on a Mac)
- Internet Explorer: Hold Ctrl while clicking Refresh, or press Ctrl-F5
- Opera: Go to Menu → Settings (Opera → Preferences on a Mac) and then to Privacy & security → Clear browsing data → Cached images and files.
//<nowiki>
/**
* This script is loaded on both desktop and mobile views.
*
* Desktop-only scripts should go in [[MediaWiki:Common.js]]
* Mobile-only scripts should go in [[MediaWiki:Mobile.js]].
*
* adapted from https://minecraft.gamepedia.com/MediaWiki:Gadget-site.js
*/
(function() {
'use strict';
/* Fired whenever wiki content is added. (#mw-content-text, live preview, load page, etc.) */
mw.hook('wikipage.content').add(function($wikipageContent) {
/**
* Collapsible elements
*
* Add the "collapsible" class to an element and the child element with class "collapsible-content"
* (or everything but the header row if a table) will be hidden when the element is collapsed.
*
* * Add the class "collapsed" to the element to make it start out collapsed.
* * Add either "collapsetoggle-left" or "collapsetoggle-inline" to the element to choose the collapse
* toggle alignment (defaults to right).
* * Add an ID in the format of "collapsible-<x>" to the element to make any element with the class
* "collapsetoggle-custom" and a matching class in the format of "collapsible-<x>-toggle" control
* the collapsing instead of the standard button.
* If the custom toggle contains an element with the "jslink" class, only that will be clickable.
*/
(function() {
var $collapsibles = $wikipageContent.find('.collapsible');
if (!$collapsibles.length) {
return;
}
var $toggleTemplate = $('<span>').addClass('collapsetoggle').append(
'[', $('<span>').addClass('jslink'), ']'
);
$collapsibles.each(function() {
var $collapsible = $(this);
if ($collapsible.data('made-collapsible')) {
return true;
}
var $children = $collapsible.children();
var showText = $collapsible.data('expandtext') || "show";
var hideText = $collapsible.data('collapsetext') || "hide";
// If there is no content area, add it
if (!$collapsible.is('table') && !$children.filter('.collapsible-content').length) {
if ($collapsible.is('tr')) {
$children.addClass('collapsible-content');
} else {
$collapsible.wrapInner('<div class="collapsible-content">');
$children = $collapsible.children();
}
}
var $toggle;
var id = $collapsible.attr('id');
if (id && id.match(/^collapsible-./)) {
$toggle = $($wikipageContent[0].getElementsByClassName(id + '-toggle'))
.filter('.collapsetoggle-custom').css('visibility', 'visible');
}
// Create and insert the toggle button if there is no custom one
if (!$toggle || !$toggle.length) {
var $toggleContainer;
if ($collapsible.is('table')) {
var $rows = $children.filter('thead').children();
if (!$rows.length) {
$rows = $children.filter('tbody').first().children();
if (!$rows.length) {
$rows = $children.filter('tr');
}
}
$toggleContainer = $rows.first().children().last();
} else {
$toggleContainer = $children.first();
if ($toggleContainer.hasClass('collapsible-content')) {
$toggleContainer = $collapsible;
}
}
$toggle = $toggleTemplate.clone();
if (
$toggleContainer !== $collapsible && (
$collapsible.hasClass('collapsetoggle-inline') ||
$collapsible.hasClass('collapse-button-none')
)) {
$toggleContainer.append($toggle);
} else {
$toggleContainer.prepend($toggle);
}
}
var $toggleLink = $toggle.find('.jslink');
if (!$toggleLink.length) {
$toggleLink = $toggle;
}
$toggleLink.attr('tabindex', 0).text(hideText);
// Find max toggle size, and set its min-width to it
var hideWidth = $toggle.width();
$toggleLink.text(showText);
var showWidth = $toggle.width();
if (hideWidth !== showWidth) {
$toggle.css('min-width', hideWidth > showWidth ? hideWidth : showWidth);
}
// Set the text back to hide if it's not collapsed to begin with
if (!$collapsible.hasClass('collapsed')) {
$toggleLink.text(hideText);
}
$toggleLink.on('click keydown', function(e) {
// Only trigger on enter press
if (e.keyCode && e.keyCode !== 13) {
return;
}
// Don't toggle when clicking buttons or links inside the toggle
var $target = $(e.target);
if ($target.is('button') || $target.is('a')) {
return;
}
$collapsible.toggleClass('collapsed');
if ($collapsible.hasClass('collapsed')) {
$toggleLink.text(showText);
} else {
$toggleLink.text(hideText);
}
// Stop table sorting activating when clicking the link
e.stopPropagation();
});
$collapsible.data('made-collapsible', true);
});
}());
});
/* End wiki content hook */
}());
//</nowiki>