MediaWiki:Common.js

Aus Phoenix-Larp Wiki

Version vom 8. September 2026, 07:42 Uhr von Becko (Diskussion | Beiträge) (Ansichten (Lesen/Bearbeiten/Quelltext bearbeiten/Versionsgeschichte) werden per JS in das Aktionen-Popup verschoben (Fallback: sichtbar, wenn kein Aktionen-Menue existiert))

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



// MediaWiki:Common.js  (ggf. zusätzlich in MediaWiki:Mobile.js, falls MobileFrontend aktiv ist)
mw.loader.using(['mediawiki.util']).done(function () {
  function findSourceBody() {
    var sel = [
      '#p-usertools .mw-portlet-body',
      '#p-user-tools .mw-portlet-body',
      '#p-personal .mw-portlet-body'   // Fallback – hier sitzen "Anmelden", "Benutzerkonto…"
    ];
    for (var i = 0; i < sel.length; i++) {
      var $el = $(sel[i]);
      if ($el.length) return $el;
    }
    return $(); // leer
  }

  function ensureClonePortlet($nav, headingText) {
    var $clone = $('#p-usertools-left');
    if ($clone.length) return $clone.find('.mw-portlet-body');

    // Portlet mit Standard-Classes => erbt 1:1 den Skin-Stil
    $clone = $(
      '<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>'
    );

    // ANS ENDE der bestehenden Portlets hängen -> "unter die bisherigen Menüpunkte"
    $nav.append($clone);
    return $clone.find('.mw-portlet-body');
  }

  function cloneUserStuffIntoLeftMenu() {
    var $srcBody = findSourceBody();
    if (!$srcBody.length) return;

    // Ziel-Container: zuerst #mw-navigation (Anisa), sonst #column-navigation als Fallback
    var $nav = $('#mw-navigation');
    if (!$nav.length) $nav = $('#column-navigation');
    if (!$nav.length) return;

    // Überschrift übernehmen (z.B. "Benutzer" oder "Persönliche Werkzeuge")
    var heading = ($srcBody.closest('.mw-portlet').children('h3').first().text() || 'Benutzer').trim();

    var $dstBody = ensureClonePortlet($nav, heading);
    if (!$dstBody.length) return;

    // Ziel leeren, dann frische KOPIE der direkten Kinder einfügen
    $dstBody.empty();
    $srcBody.children().each(function () {
      var $clone = $(this).clone(true, true);
      // doppelte IDs vermeiden
      $clone.find('[id]').addBack('[id]').removeAttr('id');
      $dstBody.append($clone);
    });
  }

  function apply() {
    cloneUserStuffIntoLeftMenu();
  }

  apply();
  mw.hook('wikipage.content').add(apply); // bei Soft-Navigation erneut
});


// Admin-Link zu den Spezialseiten im persönlichen Menü
mw.loader.using(['mediawiki.util']).done(function () {
  var groups = mw.config.get('wgUserGroups') || [];
  if (groups.indexOf('sysop') === -1) return;
  if (document.getElementById('pt-specialpages')) return;

  var $list = $('#p-personal .mw-portlet-body ul').first();
  if (!$list.length) return;

  var $li = $('<li id="pt-specialpages" class="mw-list-item"></li>');
  var $a = $('<a></a>').attr('href', mw.util.getUrl('Special:Spezialseiten')).text('Spezialseiten');
  $li.append($a);

  var $logout = $('#pt-logout');
  if ($logout.length) {
    $logout.before($li);
  } else {
    $list.append($li);
  }
});


// Lesen/Bearbeiten/Quelltext bearbeiten/Versionsgeschichte (p-views) in das
// Aktionen-Popup (p-actions) verschieben, falls es existiert (nur bei
// angemeldeten Benutzern vorhanden). Fuer anonyme Besucher ohne p-actions
// bleibt die bisherige Ansichten-Leiste sichtbar (Fallback).
mw.loader.using(['mediawiki.util']).done(function () {
  var $views = $('#p-views');
  var $actions = $('#p-actions');
  if (!$views.length || !$actions.length) return;

  var $viewsUl = $views.find('.mw-portlet-body > ul').first();
  var $actionsUl = $actions.find('.mw-portlet-body > ul').first();
  if (!$viewsUl.length || !$actionsUl.length) return;

  var $firstAction = $actionsUl.children().first();
  if ($firstAction.length) {
    $firstAction.addClass('ca-views-sep');
  }

  $viewsUl.children().each(function () {
    if ($firstAction.length) {
      $(this).insertBefore($firstAction);
    } else {
      $actionsUl.append($(this));
    }
  });

  $views.hide();
});