MediaWiki:Common.js: Difference between revisions

No edit summary
Tag: Reverted
No edit summary
Tag: Manual revert
 
Line 1: Line 1:
/* Any JavaScript here will be loaded for all users on every page load. */
/* Any JavaScript here will be loaded for all users on every page load. */


/* -----------------------------------------
/****************************************/
  jQuery UI tabs (safe) – won't break page
/* sliders using jquery by User:Tierrie */
------------------------------------------*/
/****************************************/
mw.loader.using(['jquery.ui']).then(function () {
mw.loader.using( ['jquery.cookie']);
   try {
    if ($("[class^=portal_vtab]").length) {
/****************************************/
      $("[class^=portal_vtab]").tabs().addClass("ui-tabs-vertical ui-helper-clearfix");
/* sliders using jquery by User:Tierrie */
      $("[class^=portal_vtab] li").removeClass("ui-corner-top").addClass("ui-corner-left");
/****************************************/
    }
mw.loader.using( ['jquery.ui'], function() {
 
   $( "[class^=portal_vtab]" ).tabs().addClass( "ui-tabs-vertical ui-helper-clearfix" );
    var $tabs = $("#portal_slider");
  $( "[class^=portal_vtab] li" ).removeClass( "ui-corner-top" ).addClass( "ui-corner-left" );
    if ($tabs.length) {
      $tabs.tabs({ fx: { opacity: 'toggle', duration: 100 } });
  var $tabs = $("#portal_slider").tabs({ fx: {opacity:'toggle', duration:100} } );
 
  $("[class*=portal_sliderlink]").click(function() { // bind click event to link
      function selectTab(idx) {
    $tabs.tabs('select', this.className.match(/portal_sliderlink-(\d+)/)[1]);
        idx = parseInt(idx, 10) || 0;
    console.log("Sliding to " + this.className.match(/portal_sliderlink-(\d+)/)[1]);
        $tabs.tabs("option", "active", idx);
    return false;
      }
  });
 
  $('#portal_next').click(function() {
      $("[class*=portal_sliderlink]").on('click', function (e) {
    $tabs.tabs('select', ($tabs.tabs('option', 'selected') == ($tabs.tabs('length'))-1) ? 0 : $tabs.tabs('option', 'selected') + 1 ); // switch to next tab
        e.preventDefault();
    return false;
        var m = this.className.match(/portal_sliderlink-(\d+)/);
  });
        if (m) selectTab(m[1]);
  $('#portal_prev').click(function() { // bind click event to link
      });
    $tabs.tabs('select', ($tabs.tabs('option', 'selected') == 0) ? ($tabs.tabs('length')-1) : $tabs.tabs('option', 'selected') - 1 ); // switch to previous tab
 
    return false;
      $('#portal_next').on('click', function (e) {
   });
        e.preventDefault();
        var active = $tabs.tabs("option", "active");
        var total  = $tabs.find("> ul > li").length || 1;
        selectTab((active + 1) % total);
      });
 
      $('#portal_prev').on('click', function (e) {
        e.preventDefault();
        var active = $tabs.tabs("option", "active");
        var total  = $tabs.find("> ul > li").length || 1;
        selectTab((active - 1 + total) % total);
      });
    }
   } catch (err) {
    console.warn('[tabs] disabled due to error:', err);
  }
});
});


/* -----------------------------------------
/* lockdown for reference popup configuration */
  ReferencePopups lockdown + upload tweak
------------------------------------------*/
((window.dev = window.dev || {}).ReferencePopups = dev.ReferencePopups || {}).lockdown = true;
((window.dev = window.dev || {}).ReferencePopups = dev.ReferencePopups || {}).lockdown = true;
/* Disable license check for multi upload */
mw.config.set('UMFBypassLicenseCheck', true);
mw.config.set('UMFBypassLicenseCheck', true);


/* -----------------------------------------
  Hide Admin toolbox for non-admins
------------------------------------------*/
mw.loader.using('mediawiki.util').then(function () {
mw.loader.using('mediawiki.util').then(function () {
   try {
   var g = mw.config.get('wgUserGroups')||[];
    var g = mw.config.get('wgUserGroups') || [];
  var isAdmin = g.indexOf('sysop')!==-1 || g.indexOf('interface-admin')!==-1;
    var isAdmin = g.indexOf('sysop') !== -1 || g.indexOf('interface-admin') !== -1;
  if (!isAdmin) document.querySelectorAll('.only-sysop').forEach(el=>el.style.display='none');
    if (!isAdmin) {
      document.querySelectorAll('.only-sysop').forEach(function (el) { el.style.display = 'none'; });
    }
  } catch (e) {
    console.warn('[only-sysop] hide failed:', e);
  }
});
});


/* ==========================================================
/* Random Page Teaser on Main Page
  RANDOM PAGE TEASER – robust, pageid-based, no extensions
* Fetches a random page (namespace 0), shows title, extract and thumbnail.
  Renders into <div id="random-teaser" class="random-card">
*/
========================================================== */
mw.loader.using(['mediawiki.api', 'mediawiki.util']).then(function () {
mw.loader.using(['mediawiki.api', 'mediawiki.util']).then(function () {
  // Run only on main page (adjust if your main page title differs)
  var isMain = mw.config.get('wgIsMainPage') || mw.config.get('wgPageName') === 'Main_Page';
   var box = document.getElementById('random-teaser');
   var box = document.getElementById('random-teaser');
   if (!box) return; // run only if the container exists
   if (!isMain || !box) return;


   var api = new mw.Api();
   var api = new mw.Api();
  var THUMB_W = 280;


   function esc(s){ return mw.html.escape(String(s || '')); }
   function renderCard(data) {
    var page = (data && data.query && data.query.pages && data.query.pages[0]) || null;
    if (!page) {
      box.innerHTML = '<div class="content"><h3>Random page</h3><p>Could not load a page.</p></div>';
      box.classList.remove('loading');
      return;
    }


  function excerptFromHTML(html, maxChars) {
     var title = page.title;
     var d = document.createElement('div');
     var url = mw.util.getUrl(title);
    d.innerHTML = html;
     var extract = (page.extract || '').replace(/\n+/g, ' ').trim();
    // pick first meaningful paragraph
     if (extract.length > 420) extract = extract.slice(0, 420).replace(/\s+\S*$/, '') + '…';
     var p = d.querySelector('p');
     var t = (p ? p.innerText : d.innerText || '').replace(/\s+/g, ' ').trim();
     if (t.length > maxChars) t = t.slice(0, maxChars).replace(/\s+\S*$/, '') + '…';
    return t || 'No description available.';
  }
 
  function firstRaster(list) {
    if (!Array.isArray(list) || !list.length) return null;
    // Prefer raster formats
    var pick = list.find(function (t) { return /\.(jpe?g|png|gif|webp)$/i.test(t || ''); });
    return pick || list[0] || null;
  }


  function getThumbUrl(fileTitle) {
     var img = (page.thumbnail && page.thumbnail.source) ? page.thumbnail.source : null;
    if (!fileTitle) return Promise.resolve(null);
    return api.get({
      action: 'query',
      formatversion: 2,
      titles: fileTitle,
      prop: 'imageinfo',
      iiprop: 'url',
      iiurlwidth: THUMB_W
     }).then(function (r) {
      var p = r.query && r.query.pages && r.query.pages[0];
      var ii = p && p.imageinfo && p.imageinfo[0];
      return (ii && (ii.thumburl || ii.url)) || null;
    }).catch(function (e) {
      console.warn('[teaser] imageinfo failed:', e);
      return null;
    });
  }


  function render(title, text, imgUrl) {
    var url = mw.util.getUrl(title);
     box.innerHTML =
     box.innerHTML =
       '<div class="thumb">' +
       '<div class="thumb">' +
         (imgUrl ? '<img src="' + esc(imgUrl) + '" alt="">' : '<span>🡲</span>') +
         (img ? '<img src="' + img + '" alt="">' : '<span>🡲</span>') +
       '</div>' +
       '</div>' +
       '<div class="content">' +
       '<div class="content">' +
         '<h3><a href="' + url + '">' + esc(title) + '</a></h3>' +
         '<h3><a href="' + url + '">' + mw.html.escape(title) + '</a></h3>' +
         '<p>' + esc(text) + '</p>' +
         '<p>' + (extract || 'No description available.') + '</p>' +
         '<div class="actions">' +
         '<div class="actions">' +
           '<a class="btn" href="' + url + '">Open</a>' +
           '<a class="btn" href="' + url + '">Open</a>' +
Line 133: Line 83:
     box.classList.remove('loading');
     box.classList.remove('loading');


     var btn = document.getElementById('rand-refresh');
     var refreshBtn = document.getElementById('rand-refresh');
     if (btn) btn.addEventListener('click', function () {
     if (refreshBtn) refreshBtn.addEventListener('click', function () {
       box.classList.add('loading');
       box.classList.add('loading');
       load();
       loadRandom();
     });
     });
   }
   }


   function load() {
   function loadRandom() {
    // 1) Random page with pageid (stable)
     api.get({
     api.get({
       action: 'query',
       action: 'query',
       formatversion: 2,
       formatversion: 2,
       generator: 'random',
       generator: 'random',
       grnnamespace: 0,
       grnnamespace: 0,       // only main/article namespace
       grnlimit: 1,
       grnlimit: 1,
       prop: 'info'
       prop: 'extracts|pageimages',
    }).then(function (q) {
       exintro: 1,
       var pg = q.query && q.query.pages && q.query.pages[0];
       explaintext: 1,        // plain text extract
      if (!pg) throw new Error('No random page');
       exchars: 600,           // server-side clamp
      var pageid = pg.pageid;
      pithumbsize: 280,       // thumbnail width
      var title  = pg.title;
      pilicense: 'any'
 
    }).then(renderCard).catch(function () {
       // 2) Parse via pageid → HTML + images (avoids missingtitle)
       renderCard(null);
       return api.get({
        action: 'parse',
        pageid: pageid,
        prop: 'text|images',
        redirects: 1
      }).then(function (p) {
        var html  = p.parse && p.parse.text && p.parse.text['*'] || '';
        var images = p.parse && p.parse.images || [];
        var text  = excerptFromHTML(html, 420);
        var file  = firstRaster(images);
 
        // 3) Resolve thumbnail (if any)
        return getThumbUrl(file).then(function (thumb) {
          render(title, text, thumb);
        });
      });
    }).catch(function (e) {
       console.error('[teaser] failed:', e);
      box.classList.remove('loading');
      box.innerHTML = '<div class="content"><h3>Random page</h3><p>Could not load a preview.</p></div>';
     });
     });
   }
   }


   // Initial load
   loadRandom();
  load();
});
});