MediaWiki:Common.js: Unterschied zwischen den Versionen

Aus Phoenix-Larp Wiki

Keine Bearbeitungszusammenfassung
Markierung: Zurückgesetzt
Keine Bearbeitungszusammenfassung
Markierung: Manuelle Zurücksetzung
 
(7 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt)
Zeile 32: Zeile 32:
});
});


// MediaWiki:Common.js  (ggf. zusätzlich in MediaWiki:Mobile.js, falls MobileFrontend aktiv ist)
mw.loader.using(['mediawiki.util']).done(function () {
mw.loader.using(['mediawiki.util']).done(function () {
   var bpMobile = '(max-width: 768px)';
   function findSourceBody() {
  var mql = window.matchMedia(bpMobile);
    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
  }


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


  function ensurePortlet() {
     // Portlet mit Standard-Classes => erbt 1:1 den Skin-Stil
     // Linke Spalte (Off-Canvas), darin sitzt bei Anisa die Navigation
     $clone = $(
     var $col = $('#column-navigation');
      '<div id="p-usertools-left" class="mw-portlet" role="navigation" aria-label="' + headingText + '">' +
     if (!$col.length) return null;
        '<h3>' + $('<div>').text(headingText).html() + '</h3>' +
        '<div class="mw-portlet-body"></div>' +
      '</div>'
     );


     // Wenn noch kein Portlet für user-tools existiert: anlegen
     // ANS ENDE der bestehenden Portlets hängen -> "unter die bisherigen Menüpunkte"
    var $portlet = $('#p-usertools');
    $nav.append($clone);
    if (!$portlet.length) {
     return $clone.find('.mw-portlet-body');
      $portlet = $('<div id="p-usertools" class="portal"></div>');
      $portlet.append('<h3>Benutzer</h3><div class="body"></div>');
      // Sinnvoll weit oben einhängen – direkt unter Logo/Navigation
      // Entweder in #mw-navigation oder direkt ans Ende von #column-navigation
      var $mwNav = $('#mw-navigation');
      if ($mwNav.length) { $mwNav.prepend($portlet); }
      else { $col.prepend($portlet); }
    }
     return $portlet.find('.body');
   }
   }


   function moveIntoMenu() {
   function cloneUserStuffIntoLeftMenu() {
    if (moved) return;
     var $srcBody = findSourceBody();
     var $userTools = $('#user-tools');
     if (!$srcBody.length) return;
     if (!$userTools.length) return;


     // Merke ursprünglichen Ort, um bei Desktop zurückzusetzen
     // Ziel-Container: zuerst #mw-navigation (Anisa), sonst #column-navigation als Fallback
     originalParent = $userTools.parent()[0];
     var $nav = $('#mw-navigation');
     placeholder = document.createComment('user-tools-placeholder');
     if (!$nav.length) $nav = $('#column-navigation');
     $userTools.before(placeholder);
     if (!$nav.length) return;


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


     // Verschieben (nicht klonen, damit Zustände/Links konsistent bleiben)
     var $dstBody = ensureClonePortlet($nav, heading);
     $userTools.appendTo($target);
     if (!$dstBody.length) return;
    moved = true;


     // ARIA/Erreichbarkeit
     // Ziel leeren, dann frische KOPIE der direkten Kinder einfügen
     $userTools.attr({
    $dstBody.empty();
       'role': 'navigation',
     $srcBody.children().each(function () {
       'aria-label': 'Benutzerwerkzeuge'
       var $clone = $(this).clone(true, true);
       // doppelte IDs vermeiden
      $clone.find('[id]').addBack('[id]').removeAttr('id');
      $dstBody.append($clone);
     });
     });
  }
  function moveBackToHeader() {
    if (!moved) return;
    var $userTools = $('#user-tools');
    if (!$userTools.length || !placeholder) return;
    // Zurück an die ursprüngliche Position
    $(placeholder).after($userTools);
    $(placeholder).remove();
    placeholder = null;
    moved = false;
   }
   }


   function apply() {
   function apply() {
     if (mql.matches) moveIntoMenu();
     cloneUserStuffIntoLeftMenu();
    else moveBackToHeader();
   }
   }


  // Erster Lauf + bei Breakpoint-Wechsel
   apply();
   apply();
   if (mql.addEventListener) mql.addEventListener('change', apply);
   mw.hook('wikipage.content').add(apply); // bei Soft-Navigation erneut
  else mql.addListener(apply); // ältere Browser
 
  // Failsafe: bei Artikel-/Ajax-Navigation erneut prüfen
  mw.hook('wikipage.content').add(apply);
});
});

Aktuelle Version vom 9. November 2025, 20:35 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();
  });
});



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