MediaWiki:Common.js
Aus Phoenix-Larp Wiki
Hinweis: Leere nach dem Veröffentlichen den Browser-Cache, um die Änderungen sehen zu können.
- Firefox/Safari: Umschalttaste drücken und gleichzeitig Aktualisieren anklicken oder entweder Strg+F5 oder Strg+R (⌘+R auf dem Mac) drücken
- Google Chrome: Umschalttaste+Strg+R (⌘+Umschalttaste+R auf dem Mac) drücken
- Edge: Strg+F5 drücken oder Strg drücken und gleichzeitig Aktualisieren anklicken
/* 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', 'mediawiki.api']).done(function () {
var $mwNav = $('#mw-navigation');
var $colNav = $('#column-navigation');
var $leftContainer = $mwNav.length ? $mwNav : $colNav; // Fallback
if (!$leftContainer.length) return;
// 1) Userkarte bauen (Name + Schnelllinks)
function buildUserCard() {
// Nicht doppelt bauen
if ($('#left-usercard').length) return;
var isAnon = mw.user.isAnon();
var name = isAnon ? 'Gast' : mw.user.getName();
var first = (name || '?').trim().charAt(0).toUpperCase();
var userPage = isAnon ? mw.util.getUrl('Special:UserLogin') : mw.util.getUrl('User:' + name);
var prefsPage = mw.util.getUrl('Special:Preferences');
var contribs = isAnon ? mw.util.getUrl('Special:Contributions') : mw.util.getUrl('Special:Contributions/' + name);
var loginUrl = mw.util.getUrl('Special:UserLogin');
var logoutUrl = mw.util.getUrl('Special:UserLogout');
var $card = $(
'<div id="left-usercard" role="region" aria-label="Nutzerdaten">' +
'<div class="avatar" aria-hidden="true">' + first + '</div>' +
'<div class="meta">' +
'<div class="name"></div>' +
'<div class="links"></div>' +
'</div>' +
'</div>'
);
$card.find('.name').text(isAnon ? 'Nicht angemeldet' : name);
var $links = $card.find('.links');
if (isAnon) {
$links.append($('<a>').attr('href', loginUrl).text('Anmelden'));
$links.append($('<a>').attr('href', mw.util.getUrl('Special:CreateAccount')).text('Konto erstellen'));
} else {
$links.append($('<a>').attr('href', userPage).text('Benutzerseite'));
$links.append($('<a>').attr('href', contribs).text('Beiträge'));
$links.append($('<a>').attr('href', prefsPage).text('Einstellungen'));
$links.append($('<a>').attr('href', logoutUrl).text('Abmelden'));
}
// Karte ganz oben im linken Bereich einfügen (unterhalb von evtl. Logo)
$leftContainer.prepend($card);
}
// 2) Portlet für die kopierten User-Tools anlegen (linkes Menü)
function ensureLeftPortlet() {
var $p = $('#p-usertools-left');
if ($p.length) return $p.find('.mw-portlet-body');
$p = $(
'<div id="p-usertools-left" class="mw-portlet" role="navigation" aria-label="Benutzerwerkzeuge">' +
'<h3>Benutzer</h3>' +
'<div class="mw-portlet-body"></div>' +
'</div>'
);
// Sinnvoll relativ weit oben
$('#left-usercard').length ? $p.insertAfter('#left-usercard') : $leftContainer.prepend($p);
return $p.find('.mw-portlet-body');
}
// 3) Inhalt aus #p-usertools .mw-portlet-body KOPIEREN (nicht verschieben)
function cloneUserTools() {
var $srcBody = $('#p-usertools .mw-portlet-body');
if (!$srcBody.length) return;
var $dstBody = ensureLeftPortlet();
if (!$dstBody.length) return;
// Vorherige Kopie leeren, damit es keine Duplikate gibt
$dstBody.empty();
// Kinder klonen, IDs entfernen, damit es keine doppelten IDs gibt
$srcBody.children().each(function () {
var $clone = $(this).clone(true, true);
// Alle id-Attribute im Klon entfernen
$clone.find('[id]').addBack('[id]').removeAttr('id');
$dstBody.append($clone);
});
}
function apply() {
buildUserCard();
cloneUserTools();
}
apply();
// Bei PJAX/Soft-Reloads oder wenn der Skin nachlädt
mw.hook('wikipage.content').add(apply);
// Falls sich p-usertools dynamisch ändert (selten), noch ein kleiner Beobachter
var src = document.querySelector('#p-usertools .mw-portlet-body');
if (src && 'MutationObserver' in window) {
var mo = new MutationObserver(function () { cloneUserTools(); });
mo.observe(src, { childList: true, subtree: true });
}
});