MediaWiki:Common.js: Unterschied zwischen den Versionen

Keine Bearbeitungszusammenfassung
Keine Bearbeitungszusammenfassung
Zeile 220: Zeile 220:




/* ADOS Whisky-Ratings – RatePage Frontend (ES5-kompatibel, Widgets + Stats + Summary) */
/* ADOS Whisky-Ratings – RatePage Frontend (ES5, Widgets + Stats + Summary, Doppel-Init-Schutz) */
mw.loader.using(['mediawiki.api', 'mediawiki.user']).then(function () {
mw.loader.using(['mediawiki.api', 'mediawiki.user']).then(function () {


   // -------- Hilfsfunktion ohne modernen Syntax --------
   // ---------- kleine Hilfsfunktion (ohne moderne Syntax) ----------
   function get(obj, path) {
   function get(obj, path) {
     var cur = obj, i;
     var cur = obj, i;
Zeile 233: Zeile 233:
   }
   }


   // -------- Bootstrapping --------
   // ---------- Bootstrapping ----------
   function boot(root) {
   function boot(root) {
     var scope = root || document;
     var scope = root || document;
Zeile 242: Zeile 242:
     for (i = 0; i < nodes.length; i++) setupWidget(nodes[i]);
     for (i = 0; i < nodes.length; i++) setupWidget(nodes[i]);


     // Meta-only Anzeige(n)
     // Meta-only
     initMetaOnly(scope);
     initMetaOnly(scope);


Zeile 256: Zeile 256:
   }
   }


   // Falls Inhalte später nachgeladen werden (z. B. VisualEditor)
   // Nachträglich geladene Inhalte (z. B. VE)
   mw.hook('wikipage.content').add(function($content){
   mw.hook('wikipage.content').add(function($content){
     if ($content && $content[0]) boot($content[0]);
     if ($content && $content[0]) boot($content[0]);
   });
   });


   // -------- Interaktives Widget (Whiskygläser) --------
   // ---------- Interaktives Widget (Whiskygläser) ----------
   function setupWidget(box) {
   function setupWidget(box) {
    // Doppel-Init verhindern
    if (box.getAttribute('data-rating-init') === '1') return;
    box.setAttribute('data-rating-init', '1');
     var pageId  = mw.config.get('wgArticleId');
     var pageId  = mw.config.get('wgArticleId');
     var contest = box.dataset.ratepageContest || undefined;  // "NASE" | "GESCHMACK" | "ABGANG"
     var contest = box.dataset.ratepageContest || undefined;  // "NASE" | "GESCHMACK" | "ABGANG"
Zeile 269: Zeile 273:
     var widget  = box.querySelector('.whisky-rating__widget');
     var widget  = box.querySelector('.whisky-rating__widget');
     var meta    = box.querySelector('.whisky-rating__meta');
     var meta    = box.querySelector('.whisky-rating__meta');
    // vorhandene Buttons (falls vorhanden) entfernen
    while (widget.firstChild) widget.removeChild(widget.firstChild);


     var isAnon  = mw.user.isAnon();
     var isAnon  = mw.user.isAnon();
Zeile 422: Zeile 429:
   }
   }


   // -------- Meta-only Ø-Ausgaben irgendwo im Text --------
   // ---------- Meta-only Ø-Ausgaben irgendwo im Text ----------
   function initMetaOnly(scope) {
   function initMetaOnly(scope) {
     var root = scope || document;
     var root = scope || document;
Zeile 428: Zeile 435:
     var i;
     var i;
     for (i = 0; i < nodes.length; i++) (function(box){
     for (i = 0; i < nodes.length; i++) (function(box){
      // Doppel-Init verhindern
      if (box.getAttribute('data-meta-init') === '1') return;
      box.setAttribute('data-meta-init', '1');
       var pageId = parseInt(box.dataset.ratepagePageid || mw.config.get('wgArticleId'), 10);
       var pageId = parseInt(box.dataset.ratepagePageid || mw.config.get('wgArticleId'), 10);
       var contest = box.dataset.ratepageContest || undefined;
       var contest = box.dataset.ratepageContest || undefined;
       new mw.Api().get({
       new mw.Api().get({
         action: 'query',
         action: 'query',
Zeile 457: Zeile 469:
   }
   }


   // -------- Kompakte Übersichtstabelle inkl. "Gesamt" --------
   // ---------- Kompakte Übersichtstabelle inkl. "Gesamt" ----------
   function renderSummary(container) {
   function renderSummary(container) {
    // Doppel-Init verhindern
    if (container.getAttribute('data-summary-init') === '1') return;
    container.setAttribute('data-summary-init', '1');
     var pageId  = mw.config.get('wgArticleId');
     var pageId  = mw.config.get('wgArticleId');
     var raw      = container.dataset.ratepageContests || 'NASE,GESCHMACK,ABGANG';
     var raw      = container.dataset.ratepageContests || 'NASE,GESCHMACK,ABGANG';
Zeile 512: Zeile 528:
         return { contest: contest, label: (labels[contest] || contest), avg: avg, total: total };
         return { contest: contest, label: (labels[contest] || contest), avg: avg, total: total };
       }, function () {
       }, function () {
         // Einzelner Contest fehlgeschlagen -> nicht blockieren
         // Ein Contest fehlgeschlagen -> nicht blockieren
         return { contest: contest, label: (labels[contest] || contest), avg: null, total: 0, _error: true };
         return { contest: contest, label: (labels[contest] || contest), avg: null, total: 0, _error: true };
       });
       });
Zeile 554: Zeile 570:
       }
       }
       var overall = (present > 0) ? Math.round((sumAvg / present) * 10) / 10 : null;
       var overall = (present > 0) ? Math.round((sumAvg / present) * 10) / 10 : null;
      var trG = document.createElement('tr');
       var overallText = (overall !== null)
       var overallText = (overall !== null)
         ? (overall.toFixed ? overall.toFixed(1) : (Math.round(overall*10)/10))
         ? (overall.toFixed ? overall.toFixed(1) : (Math.round(overall*10)/10))
         : '–';
         : '–';
      var trG = document.createElement('tr');
       trG.innerHTML = '<td><strong>Gesamt</strong></td><td><strong>' + overallText + '</strong></td><td>–</td>';
       trG.innerHTML = '<td><strong>Gesamt</strong></td><td><strong>' + overallText + '</strong></td><td>–</td>';
       tbody.appendChild(trG);
       tbody.appendChild(trG);
Zeile 564: Zeile 580:
       table.appendChild(tbody);
       table.appendChild(tbody);


      // Inhalt ersetzen
       while (container.firstChild) container.removeChild(container.firstChild);
       while (container.firstChild) container.removeChild(container.firstChild);
       container.appendChild(table);
       container.appendChild(table);