MediaWiki:Common.js: Unterschied zwischen den Versionen
Aus Phoenix-Larp Wiki
Becko (Diskussion | Beiträge) Keine Bearbeitungszusammenfassung |
Becko (Diskussion | Beiträge) Keine Bearbeitungszusammenfassung |
||
| Zeile 33: | Zeile 33: | ||
mw.loader.using(['mediawiki.util']).done(function () { | |||
var | function ensureUserToolsClonePortlet() { | ||
var | var $srcPortlet = $('#p-usertools'); | ||
var $srcBody = $srcPortlet.find('.mw-portlet-body'); | |||
if (!$srcBody.length) return null; | |||
// Ziel: der linke Menü-Container (Anisa: #mw-navigation in #column-navigation) | |||
var $nav = $('#mw-navigation'); | |||
var | if (!$nav.length) $nav = $('#column-navigation'); // Fallback | ||
var $ | // Wenn unser Klon-Portlet schon existiert: referenzieren | ||
var $clonePortlet = $('#p-usertools-left'); | |||
if (!$clonePortlet.length) { | |||
// Überschrift vom Original übernehmen (fällt z.B. "Werkzeuge", "Benutzer" etc.) | |||
var headingText = $.trim($srcPortlet.children('h3').first().text()) || 'Benutzer'; | |||
// Neues Portlet am ENDE der vorhandenen Portlets anhängen -> „unter die bisherigen Menüpunkte“ | |||
$clonePortlet = $( | |||
'<div id="p-usertools-left" class="mw-portlet" role="navigation" aria-label="' + headingText + '">' + | |||
'<h3>' + $('<div>').text(headingText).html() + '</h3>' + | |||
'<div class="mw-portlet-body"></div>' + | |||
'</div>' | |||
); | |||
// exakt ans Ende der bestehenden Portlets setzen | |||
// (falls Anisa weitere Wrapper hat, hängt .append() automatisch nach den letzten Menüpunkten) | |||
$nav.append($clonePortlet); | |||
$ | |||
} | } | ||
return $clonePortlet.find('.mw-portlet-body'); | |||
$ | |||
} | } | ||
function cloneUserToolsIntoLeftMenu() { | |||
function | |||
var $srcBody = $('#p-usertools .mw-portlet-body'); | var $srcBody = $('#p-usertools .mw-portlet-body'); | ||
if (!$srcBody.length) return; | if (!$srcBody.length) return; | ||
var $dstBody = | var $dstBody = ensureUserToolsClonePortlet(); | ||
if (!$dstBody.length) return; | if (!$dstBody || !$dstBody.length) return; | ||
// | // Ziel leeren, dann frische Kopie erzeugen | ||
$dstBody.empty(); | $dstBody.empty(); | ||
// Kinder klonen, IDs entfernen, damit es keine | // Nur die direkten Kinder klonen, IDs entfernen, damit es keine Duplikate gibt | ||
$srcBody.children().each(function () { | $srcBody.children().each(function () { | ||
var $clone = $(this).clone(true, true); | var $clone = $(this).clone(true, true); | ||
$clone.find('[id]').addBack('[id]').removeAttr('id'); | $clone.find('[id]').addBack('[id]').removeAttr('id'); | ||
$dstBody.append($clone); | $dstBody.append($clone); | ||
| Zeile 119: | Zeile 86: | ||
function apply() { | function apply() { | ||
cloneUserToolsIntoLeftMenu(); | |||
} | } | ||
// initial + bei Soft-Navigation/Ajax | |||
apply(); | apply(); | ||
mw.hook('wikipage.content').add(apply); | mw.hook('wikipage.content').add(apply); | ||
// | // Aktualisieren, wenn sich das Original-Portlet dynamisch ändert | ||
var | var srcNode = document.querySelector('#p-usertools .mw-portlet-body'); | ||
if ( | if (srcNode && 'MutationObserver' in window) { | ||
new MutationObserver(function () { cloneUserToolsIntoLeftMenu(); }) | |||
.observe(srcNode, { childList: true, subtree: true }); | |||
} | } | ||
}); | }); | ||
Version vom 9. Oktober 2025, 08:58 Uhr
/* Das folgende JavaScript wird für alle Benutzer geladen. */
mw.loader.using(['mediawiki.util']).done(function () {
// Nur auf schmalen Screens aktiv
if (!window.matchMedia('(max-width: 768px)').matches) return;
// Burger-Button einfügen (mit ARIA)
var $btn = $('<button class="mw-burger" aria-label="Menü" aria-controls="column-navigation" aria-expanded="false"><span></span></button>');
$('body').append($btn);
// Overlay zum Schließen
var $overlay = $('<div class="nav-overlay" tabindex="-1" aria-hidden="true"></div>');
$('body').append($overlay);
function closeMenu() {
$('body').removeClass('nav-open');
$btn.attr('aria-expanded', 'false');
}
function toggleMenu() {
var open = !$('body').hasClass('nav-open');
$('body').toggleClass('nav-open', open);
$btn.attr('aria-expanded', String(open));
}
$btn.on('click', toggleMenu);
$overlay.on('click', closeMenu);
$(document).on('keydown', function (e) { if (e.key === 'Escape') closeMenu(); });
// Schließt das Menü, wenn Viewport wieder breit wird
window.matchMedia('(min-width: 769px)').addEventListener('change', function (mql) {
if (mql.matches) closeMenu();
});
});
mw.loader.using(['mediawiki.util']).done(function () {
function ensureUserToolsClonePortlet() {
var $srcPortlet = $('#p-usertools');
var $srcBody = $srcPortlet.find('.mw-portlet-body');
if (!$srcBody.length) return null;
// Ziel: der linke Menü-Container (Anisa: #mw-navigation in #column-navigation)
var $nav = $('#mw-navigation');
if (!$nav.length) $nav = $('#column-navigation'); // Fallback
// Wenn unser Klon-Portlet schon existiert: referenzieren
var $clonePortlet = $('#p-usertools-left');
if (!$clonePortlet.length) {
// Überschrift vom Original übernehmen (fällt z.B. "Werkzeuge", "Benutzer" etc.)
var headingText = $.trim($srcPortlet.children('h3').first().text()) || 'Benutzer';
// Neues Portlet am ENDE der vorhandenen Portlets anhängen -> „unter die bisherigen Menüpunkte“
$clonePortlet = $(
'<div id="p-usertools-left" class="mw-portlet" role="navigation" aria-label="' + headingText + '">' +
'<h3>' + $('<div>').text(headingText).html() + '</h3>' +
'<div class="mw-portlet-body"></div>' +
'</div>'
);
// exakt ans Ende der bestehenden Portlets setzen
// (falls Anisa weitere Wrapper hat, hängt .append() automatisch nach den letzten Menüpunkten)
$nav.append($clonePortlet);
}
return $clonePortlet.find('.mw-portlet-body');
}
function cloneUserToolsIntoLeftMenu() {
var $srcBody = $('#p-usertools .mw-portlet-body');
if (!$srcBody.length) return;
var $dstBody = ensureUserToolsClonePortlet();
if (!$dstBody || !$dstBody.length) return;
// Ziel leeren, dann frische Kopie erzeugen
$dstBody.empty();
// Nur die direkten Kinder klonen, IDs entfernen, damit es keine Duplikate gibt
$srcBody.children().each(function () {
var $clone = $(this).clone(true, true);
$clone.find('[id]').addBack('[id]').removeAttr('id');
$dstBody.append($clone);
});
}
function apply() {
cloneUserToolsIntoLeftMenu();
}
// initial + bei Soft-Navigation/Ajax
apply();
mw.hook('wikipage.content').add(apply);
// Aktualisieren, wenn sich das Original-Portlet dynamisch ändert
var srcNode = document.querySelector('#p-usertools .mw-portlet-body');
if (srcNode && 'MutationObserver' in window) {
new MutationObserver(function () { cloneUserToolsIntoLeftMenu(); })
.observe(srcNode, { childList: true, subtree: true });
}
});