Zuletzt bearbeitet vor 2 Wochen
von Mark Wagner

MediaWiki:Common.js: Unterschied zwischen den Versionen

Keine Kategorien vergebenBearbeiten
Keine Bearbeitungszusammenfassung
Markierung: Zurückgesetzt
Keine Bearbeitungszusammenfassung
Markierung: Zurückgesetzt
Zeile 26: Zeile 26:
     });
     });
});
});
// ===== robuster Namespace-Header mit optionalem _intern-Zusatzlink =====
(function (mw, $) {
  'use strict';


// Namespace-Link für Unterseiten-Panel
  // Hilfsfunktion: Header-Element zuverlässig finden (versch. Selektoren)
function updateSubpageHeader() {
  function findSubpageHeaderRoot(scope) {
    // Das Header-Element finden
     const root = scope || document;
     const header = document.getElementById('subpage-tree-pnl-head');
    return (
   
      root.getElementById('subpage-tree-pnl-head') ||
    if (header) {
      root.querySelector('#subpage-tree-pnl .card-header, #subpage-tree-pnl-head, .subpage-tree-pnl .card-header')
        // Aktuellen Namespace ermitteln
    );
        const namespace = mw.config.get('wgCanonicalNamespace');
  }
        const namespaceName = namespace || 'Hauptseite';
       
        // Link zur Namespace-Hauptseite erstellen
        let namespaceLink;
        if (namespace) {
            // Für Namespaces wie "Verein:" zur Hauptseite des Namespace
            namespaceLink = `/${namespace}:Hauptseite`;
        } else {
            // Für Hauptnamespace zur allgemeinen Hauptseite
            namespaceLink = '/Hauptseite';
        }


        // Header mit klickbarem Link ersetzen
  // Baut Header + (optional) Zusatzlink
        header.innerHTML = `<a href="/wiki${namespaceLink}" style="color: inherit; text-decoration: none;">${namespaceName}</a>`;
  function buildHeaderContent($header) {
    const header = $header[0];
    if (!header) return;


        // --- NEU: Zusatzlink, falls Namespace mit "_intern" endet ---
    const namespace = mw.config.get('wgCanonicalNamespace'); // z.B. "Verein_intern" oder "" im Haupt-Namensraum
        // Vorher evtl. alten Zusatzlink entfernen (idempotent)
    const nsName = namespace || 'Hauptseite';
        const oldAlt = document.getElementById('subpage-tree-pnl-head-altlink');
        if (oldAlt) oldAlt.remove();


        if (namespace && /_intern$/.test(namespace)) {
    // Hauptlink zur Namespace-Hauptseite
            const baseNamespace = namespace.replace(/_intern$/, '');
    const mainHref = namespace ? `/wiki/${namespace}:Hauptseite` : `/wiki/Hauptseite`;
            const baseNamespaceLink = `/${baseNamespace}:Hauptseite`;


            // kleinen Container unterhalb des Headers erzeugen
    // Setze Hauptlink (einmalig)
            const altLink = document.createElement('div');
    // Wir nutzen einen Wrapper, damit spätere Re-Renders einfacher erkennbar sind.
            altLink.id = 'subpage-tree-pnl-head-altlink';
    if (!header.querySelector('.ns-head-mainlink')) {
            altLink.style.marginTop = '4px';
      header.innerHTML = `
            altLink.style.fontSize = '90%';
        <div class="ns-head-mainlink">
          <a href="${mainHref}" style="color:inherit;text-decoration:none;">${nsName}</a>
        </div>
      `;
    } else {
      // Falls BlueSpice den Inhalt überschrieben hat, aktualisieren wir nur den Link/Label
      const mainA = header.querySelector('.ns-head-mainlink a');
      if (mainA) {
        mainA.href = mainHref;
        mainA.textContent = nsName;
      }
    }


            altLink.innerHTML = `
    // Hover-Effekt für Hauptlink
                <a href="/wiki${baseNamespaceLink}"
    const mainA = header.querySelector('.ns-head-mainlink a');
                  title="Zur Hauptseite des Namensraums ohne „_intern“"
    if (mainA && !mainA.__hoverBound) {
                  style="color: inherit; text-decoration: none;">
      mainA.addEventListener('mouseenter', function(){ this.style.textDecoration = 'underline'; });
                  ${baseNamespace}
      mainA.addEventListener('mouseleave', function(){ this.style.textDecoration = 'none'; });
                </a>
      mainA.__hoverBound = true;
            `;
    }


            // Nach dem Haupt-Link einfügen
    // Zusatzlink nur bei *_intern
            header.appendChild(altLink);
    const hasIntern = !!(namespace && /_intern$/.test(namespace));
    const existingAlt = header.querySelector('#subpage-tree-pnl-head-altlink');


            // Hover-Effekt nur für den Zusatzlink hinzufügen
    if (!hasIntern) {
            const altA = altLink.querySelector('a');
      // Falls kein _intern → ggf. alten Zusatzlink entfernen
            if (altA) {
      if (existingAlt) existingAlt.remove();
                altA.addEventListener('mouseenter', function () {
      return;
                    this.style.textDecoration = 'underline';
                });
                altA.addEventListener('mouseleave', function () {
                    this.style.textDecoration = 'none';
                });
            }
        }
        // --- ENDE NEU ---
 
        // Hover-Effekt für den Haupt-Link
        const link = header.querySelector('a');
        if (link) {
            link.addEventListener('mouseenter', function() {
                this.style.textDecoration = 'underline';
            });
            link.addEventListener('mouseleave', function() {
                this.style.textDecoration = 'none';
            });
        }
     }
     }
}
// Nach dem Laden der Seite ausführen
$(document).ready(function() {
    // Kurze Verzögerung, da der Unterseiten-Baum dynamisch geladen wird
    setTimeout(updateSubpageHeader, 100);
});
// Auch nach AJAX-Updates ausführen
$(document).ajaxComplete(function() {
    setTimeout(updateSubpageHeader, 100);
});
// Entferne "Hauptseite/" aus Linktexten
function cleanPageLinks() {
    // Alle Links finden, die "Hauptseite/" im Text haben
    const links = document.querySelectorAll('a[href*="Hauptseite/"]');
   
    links.forEach(function(link) {
        // Nur den sichtbaren Text ändern, nicht den href
        if (link.textContent.includes('Hauptseite/')) {
            link.textContent = link.textContent.replace('Hauptseite/', '');
        }
    });
}


// JavaScript nach dem Laden der Seite ausführen
    // Basis-Namespace ohne _intern
$(document).ready(function() {
    const baseNs = namespace.replace(/_intern$/, '');
     cleanPageLinks();
     const baseHref = `/wiki/${baseNs}:Hauptseite`;
});


// Auch nach AJAX-Updates ausführen (für dynamische Inhalte)
    // Zusatzlink erstellen/aktualisieren
$(document).ajaxComplete(function() {
    if (!existingAlt) {
    cleanPageLinks();
      const alt = document.createElement('div');
});
      alt.id = 'subpage-tree-pnl-head-altlink';
      alt.style.marginTop = '4px';
      alt.style.fontSize = '90%';
      alt.innerHTML = `
        <a href="${baseHref}"
          title="Zur Hauptseite des Namensraums ohne „_intern“"
          style="color:inherit;text-decoration:none;">
          ${baseNs}
        </a>
      `;
      header.appendChild(alt);


$(function(){
      const altA = alt.querySelector('a');
  // In allen Category-Ausgaben: jede LI, die einen <a class="new"> enthält, entfernen
      if (altA) {
  $('.smw-columnlist-container a.new').each(function(){
        altA.addEventListener('mouseenter', function(){ this.style.textDecoration = 'underline'; });
    $(this).closest('li').remove();
        altA.addEventListener('mouseleave', function(){ this.style.textDecoration = 'none'; });
  });
      }
});
    } else {
$(function(){
      const altA = existingAlt.querySelector('a');
  // 1. Rote Links raus (wie gehabt)
      if (altA) {
  $('.smw-columnlist-container a.new').each(function(){
        altA.href = baseHref;
    $(this).closest('li').remove();
        altA.textContent = baseNs;
  });
       }
 
  // 2. Jetzt jede Buchstaben-Überschrift entfernen, deren Liste leer ist
  $('.smw-column-header').each(function(){
    var $header = $(this),
        $ul    = $header.next('ul');
    if ($ul.length && $ul.children('li').length === 0) {
      $ul.remove();
       $header.remove();
     }
     }
  });
});
// attachments immer in neuem Tab öffnen
(function () {
  // Hilfs-Funktion, die alle neuen Attachment-Links anpasst
  function updateAttachmentLinks() {
    // Alle Download-Links in der Datei-Liste
    $('.attachments-filelist a.oojsplus-data-gridWidget-url-button')
      .attr('target','_blank')
      .attr('rel','noopener noreferrer');
   }
   }


   // beim Seiten-Load einmal ausführen
   // Kernfunktion: versucht wiederholt, den Header zu setzen
   $(updateAttachmentLinks);
   function updateSubpageHeaderRobust(scope) {
 
    const headerEl = findSubpageHeaderRoot(scope);
  // und mit MutationObserver auf nachträglich geladene Links achten
    if (!headerEl) return false;
  var container = document.querySelector('.attachments-filelist');
     buildHeaderContent($(headerEl));
  if (container) {
     return true;
     new MutationObserver(function () {
      updateAttachmentLinks();
     }).observe(container, { childList: true, subtree: true });
   }
   }
})();


/* Startseiten-Menü: ohne Expander, #subpage-tree-pnl ausblenden, kein Einrücken unten */
  // Retry-Loop nach Page-Load (falls Panel asynchron kommt)
(function (mw, $) {
  $(function () {
   'use strict';
    let tries = 0, max = 20;
    const iv = setInterval(function () {
      if (updateSubpageHeaderRobust(document) || ++tries >= max) {
        clearInterval(iv);
      }
    }, 250);
   });


  function isMainView() {
   // Bei Ajax-Updates erneut versuchen
    return mw.config.get('wgIsMainPage') && mw.config.get('wgAction') === 'view';
   $(document).ajaxComplete(function () {
  }
     // kleiner Delay, falls DOM gerade ersetzt wurde
 
     setTimeout(function(){ updateSubpageHeaderRobust(document); }, 120);
   // NEUE Funktion: Prüft ob Benutzer angemeldet ist
   function isLoggedIn() {
    return !mw.user.isAnon();
  }
 
  function hideSubpageTreePanel($scope) {
     // Nur ausführen wenn auf Hauptseite UND angemeldet
    if (!isMainView() || !isLoggedIn()) return;
    // global (nur auf Startseite, weil Funktion nur hier läuft)
     mw.util.addCSS('#subpage-tree-pnl{display:none!important;}');
    // sofort im aktuellen/neu geladenen Bereich
    ($scope || $(document)).find('#subpage-tree-pnl').hide().attr('aria-hidden', 'true');
  }
 
  function injectHomeMenu($root) {
    // Nur ausführen wenn auf Hauptseite UND angemeldet
    if (!isMainView() || !isLoggedIn()) return;
    if (document.getElementById('home-static-menu')) return; // Duplikate vermeiden
 
    var $container = ($root || $(document)).find('#sb-pri-cnt:visible').last();
    if (!$container.length) return;
 
    const menuHtml = `
<div id="home-static-menu" class="home-static-menu">
  <div class="enhanced-sidebar-cnt">
    <div id="9a659-pnl" class="card w-100 bg-transp tree-component test">
      <div id="9a659-head" class="card-header menu-title">Themen</div>
      <ul id="9a659-menu" class="mws-tree root w-100 bg-transp" role="tree" aria-labelledby="9a659-head" tabindex="0">
        <li id="43568" class="mws-tree-item internal" role="treeitem">
          <div><a id="43568-label" class="mws-tree-item-label" href="/wiki/Verein:Hauptseite">Verein</a></div>
        </li>
        <li id="12180" class="mws-tree-item internal" role="treeitem">
          <div><a id="12180-label" class="mws-tree-item-label" href="/wiki/Arbeitsorganisation:Hauptseite">Arbeitsorganisation</a></div>
        </li>
        <li id="94668" class="mws-tree-item internal" role="treeitem">
          <div><a id="94668-label" class="mws-tree-item-label" href="/wiki/Angebote:Hauptseite">Angebote</a></div>
        </li>
        <li id="16759" class="mws-tree-item internal" role="treeitem">
          <div><a id="16759-label" class="mws-tree-item-label" href="/wiki/Gruppenarbeit:Hauptseite">Gruppenarbeit</a></div>
        </li>
        <li id="20ee3" class="mws-tree-item internal" role="treeitem">
          <div><a id="20ee3-label" class="mws-tree-item-label" href="/wiki/Mitarbeit:Hauptseite">Mitarbeit</a></div>
        </li>
        <li id="d5272" class="mws-tree-item internal" role="treeitem">
          <div><a id="d5272-label" class="mws-tree-item-label" href="/wiki/Kommunikation:Hauptseite">Kommunikation</a></div>
        </li>
        <li id="48945" class="mws-tree-item internal" role="treeitem">
          <div><a id="48945-label" class="mws-tree-item-label" href="/wiki/QM:Hauptseite">QM</a></div>
        </li>
        <li id="27eea" class="mws-tree-item internal" role="treeitem">
          <div><a id="27eea-label" class="mws-tree-item-label" href="/wiki/Mitglieder:Hauptseite">Mitglieder</a></div>
        </li>
        <li id="3f70b" class="mws-tree-item internal" role="treeitem">
          <div><a id="3f70b-label" class="mws-tree-item-label" href="/wiki/wikiHilfe:Anleitung">wikiHilfe</a></div>
        </li>
      </ul>
    </div>
  </div>
</div>`;
 
    $container.append(menuHtml);
 
    // Safety: Falls andere Skripte Expander nachträglich hinzufügen
    $('#home-static-menu .mws-tree-expander').remove();
 
    // Einrückung Top-Level neutralisieren (nur in unserem Menü)
    mw.util.addCSS(`
      #home-static-menu #9a659-menu { padding-left: 0 !important; margin-left: 0 !important; }
      #home-static-menu #9a659-menu > li { margin-left: 0 !important; }
      #home-static-menu #9a659-menu > li > div { padding-left: 0 !important; margin-left: 0 !important; }
      #home-static-menu #9a659-menu > li .mws-tree-item-label { padding-left: 0 !important; margin-left: 0 !important; }
    `);
  }
 
  // DOM ready
  $(function () {
    injectHomeMenu();
    hideSubpageTreePanel();
   });
   });


   // Dynamisch nachgeladene Inhalte (Discovery, Ajax, Tabs)
   // Hook für nachgeladenen Inhalt
   mw.hook('wikipage.content').add(function ($content) {
   mw.hook('wikipage.content').add(function ($c) {
     injectHomeMenu($content);
     setTimeout(function(){ updateSubpageHeaderRobust($c[0]); }, 120);
    hideSubpageTreePanel($content);
   });
   });


   // Fallback, falls #sb-pri-cnt später kommt
   // MutationObserver: wenn BlueSpice den Header-Inhalt ersetzt, setzen wir ihn wieder
  var tries = 0, max = 10;
   (function observePanel() {
   var iv = setInterval(function () {
     const panel = document.getElementById('subpage-tree-pnl') || document.querySelector('#subpage-tree-pnl, .subpage-tree-pnl');
     if (document.getElementById('sb-pri-cnt') || ++tries >= max) {
    if (!panel) return;
      clearInterval(iv);
    const mo = new MutationObserver(function () {
       injectHomeMenu();
       updateSubpageHeaderRobust(panel);
      hideSubpageTreePanel();
    });
     }
     mo.observe(panel, { childList: true, subtree: true });
   }, 300);
   })();


})(mediaWiki, jQuery);
})(mediaWiki, jQuery);

Version vom 9. Oktober 2025, 09:57 Uhr

mw.loader.using(['jquery'], function () {
    $(document).ready(function () {
        /*$('.smw-column-header').each(function () {
            // aktuellen HTML-Inhalt holen
            var html = $(this).html();
            // "Fortsetzung" entfernen, Leerzeichen ggf. bereinigen
            var newHtml = html.replace(/Fortsetzung/g, '').trim();
            // falls nach dem Entfernen gar kein Text übrig ist, komplette Header-Box ausblenden:
            if (newHtml === '') {
                $(this).hide();
            } else {
                // ansonsten nur den Text überschreiben, sodass z. B. "B Fortsetzung" → "B" wird
                $(this).html(newHtml);
            }
        });*/
        $(function () {
            $('<style>')
              .prop('type', 'text/css')
              .html(
                '.breadcrumb-item { font-size: 17px !important; }' +
                '.breadcrumb-nav  { border-bottom: 2px solid #85bc20!important; margin-bottom: 20px !important; }'
              )
              .appendTo('head');
        });
        
    });
});
// ===== robuster Namespace-Header mit optionalem _intern-Zusatzlink =====
(function (mw, $) {
  'use strict';

  // Hilfsfunktion: Header-Element zuverlässig finden (versch. Selektoren)
  function findSubpageHeaderRoot(scope) {
    const root = scope || document;
    return (
      root.getElementById('subpage-tree-pnl-head') ||
      root.querySelector('#subpage-tree-pnl .card-header, #subpage-tree-pnl-head, .subpage-tree-pnl .card-header')
    );
  }

  // Baut Header + (optional) Zusatzlink
  function buildHeaderContent($header) {
    const header = $header[0];
    if (!header) return;

    const namespace = mw.config.get('wgCanonicalNamespace'); // z.B. "Verein_intern" oder "" im Haupt-Namensraum
    const nsName = namespace || 'Hauptseite';

    // Hauptlink zur Namespace-Hauptseite
    const mainHref = namespace ? `/wiki/${namespace}:Hauptseite` : `/wiki/Hauptseite`;

    // Setze Hauptlink (einmalig)
    // Wir nutzen einen Wrapper, damit spätere Re-Renders einfacher erkennbar sind.
    if (!header.querySelector('.ns-head-mainlink')) {
      header.innerHTML = `
        <div class="ns-head-mainlink">
          <a href="${mainHref}" style="color:inherit;text-decoration:none;">${nsName}</a>
        </div>
      `;
    } else {
      // Falls BlueSpice den Inhalt überschrieben hat, aktualisieren wir nur den Link/Label
      const mainA = header.querySelector('.ns-head-mainlink a');
      if (mainA) {
        mainA.href = mainHref;
        mainA.textContent = nsName;
      }
    }

    // Hover-Effekt für Hauptlink
    const mainA = header.querySelector('.ns-head-mainlink a');
    if (mainA && !mainA.__hoverBound) {
      mainA.addEventListener('mouseenter', function(){ this.style.textDecoration = 'underline'; });
      mainA.addEventListener('mouseleave', function(){ this.style.textDecoration = 'none'; });
      mainA.__hoverBound = true;
    }

    // Zusatzlink nur bei *_intern
    const hasIntern = !!(namespace && /_intern$/.test(namespace));
    const existingAlt = header.querySelector('#subpage-tree-pnl-head-altlink');

    if (!hasIntern) {
      // Falls kein _intern → ggf. alten Zusatzlink entfernen
      if (existingAlt) existingAlt.remove();
      return;
    }

    // Basis-Namespace ohne _intern
    const baseNs = namespace.replace(/_intern$/, '');
    const baseHref = `/wiki/${baseNs}:Hauptseite`;

    // Zusatzlink erstellen/aktualisieren
    if (!existingAlt) {
      const alt = document.createElement('div');
      alt.id = 'subpage-tree-pnl-head-altlink';
      alt.style.marginTop = '4px';
      alt.style.fontSize = '90%';
      alt.innerHTML = `
        <a href="${baseHref}" 
           title="Zur Hauptseite des Namensraums ohne „_intern“"
           style="color:inherit;text-decoration:none;">
           ${baseNs}
        </a>
      `;
      header.appendChild(alt);

      const altA = alt.querySelector('a');
      if (altA) {
        altA.addEventListener('mouseenter', function(){ this.style.textDecoration = 'underline'; });
        altA.addEventListener('mouseleave', function(){ this.style.textDecoration = 'none'; });
      }
    } else {
      const altA = existingAlt.querySelector('a');
      if (altA) {
        altA.href = baseHref;
        altA.textContent = baseNs;
      }
    }
  }

  // Kernfunktion: versucht wiederholt, den Header zu setzen
  function updateSubpageHeaderRobust(scope) {
    const headerEl = findSubpageHeaderRoot(scope);
    if (!headerEl) return false;
    buildHeaderContent($(headerEl));
    return true;
  }

  // Retry-Loop nach Page-Load (falls Panel asynchron kommt)
  $(function () {
    let tries = 0, max = 20;
    const iv = setInterval(function () {
      if (updateSubpageHeaderRobust(document) || ++tries >= max) {
        clearInterval(iv);
      }
    }, 250);
  });

  // Bei Ajax-Updates erneut versuchen
  $(document).ajaxComplete(function () {
    // kleiner Delay, falls DOM gerade ersetzt wurde
    setTimeout(function(){ updateSubpageHeaderRobust(document); }, 120);
  });

  // Hook für nachgeladenen Inhalt
  mw.hook('wikipage.content').add(function ($c) {
    setTimeout(function(){ updateSubpageHeaderRobust($c[0]); }, 120);
  });

  // MutationObserver: wenn BlueSpice den Header-Inhalt ersetzt, setzen wir ihn wieder
  (function observePanel() {
    const panel = document.getElementById('subpage-tree-pnl') || document.querySelector('#subpage-tree-pnl, .subpage-tree-pnl');
    if (!panel) return;
    const mo = new MutationObserver(function () {
      updateSubpageHeaderRobust(panel);
    });
    mo.observe(panel, { childList: true, subtree: true });
  })();

})(mediaWiki, jQuery);