MediaWiki:Common.js: Difference between revisions

No edit summary
No edit summary
Line 39: Line 39:
   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(el=>el.style.display='none');
});
/* Random Page Teaser on Main Page
* Fetches a random page (namespace 0), shows title, extract and thumbnail.
*/
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');
  if (!isMain || !box) return;
  var api = new mw.Api();
  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;
    }
    var title = page.title;
    var url = mw.util.getUrl(title);
    var extract = (page.extract || '').replace(/\n+/g, ' ').trim();
    if (extract.length > 420) extract = extract.slice(0, 420).replace(/\s+\S*$/, '') + '…';
    var img = (page.thumbnail && page.thumbnail.source) ? page.thumbnail.source : null;
    box.innerHTML =
      '<div class="thumb">' +
        (img ? '<img src="' + img + '" alt="">' : '<span>🡲</span>') +
      '</div>' +
      '<div class="content">' +
        '<h3><a href="' + url + '">' + mw.html.escape(title) + '</a></h3>' +
        '<p>' + (extract || 'No description available.') + '</p>' +
        '<div class="actions">' +
          '<a class="btn" href="' + url + '">Open</a>' +
          '<button type="button" class="btn" id="rand-refresh">Another</button>' +
          '<a class="btn" href="' + mw.util.getUrl('Special:Random') + '">Special:Random</a>' +
        '</div>' +
      '</div>';
    box.classList.remove('loading');
    var refreshBtn = document.getElementById('rand-refresh');
    if (refreshBtn) refreshBtn.addEventListener('click', function () {
      box.classList.add('loading');
      loadRandom();
    });
  }
  function loadRandom() {
    api.get({
      action: 'query',
      formatversion: 2,
      generator: 'random',
      grnnamespace: 0,        // only main/article namespace
      grnlimit: 1,
      prop: 'extracts|pageimages',
      exintro: 1,
      explaintext: 1,        // plain text extract
      exchars: 600,          // server-side clamp
      pithumbsize: 280,      // thumbnail width
      pilicense: 'any'
    }).then(renderCard).catch(function () {
      renderCard(null);
    });
  }
  loadRandom();
});
});