MediaWiki:Common.js: Unterschied zwischen den Versionen

Aus Phoenix-Larp Wiki

Keine Bearbeitungszusammenfassung
Markierung: Manuelle Zurücksetzung
Keine Bearbeitungszusammenfassung
Zeile 30: Zeile 30:
     if (mql.matches) closeMenu();
     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 });
  }
});
});

Version vom 9. Oktober 2025, 08:55 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', '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 });
  }
});