Jump to content

MediaWiki:Common.js: Difference between revisions

No edit summary
No edit summary
Line 159: Line 159:
   applyFilter();
   applyFilter();
});
});
// === Google Website Translator: mount in the sidebar Tools portlet (Vector 2022) ===
 
 
// === Google Website Translator: mount in Vector 2022 sidebar ===
(function () {
(function () {
   var targetId = 'google_translate_element';
   var targetId = 'google_translate_element';


   function insertIntoToolsPortlet() {
   function insertIntoSidebar() {
     // Add a placeholder item to the Tools portlet
     // Prefer the sidebar portlet id used by Vector 2022; fall back to 'p-tb'
    var sidebarId = document.getElementById('vector-sidebar') ? 'vector-page-tools' : 'p-tb';
     var li = mw.util.addPortletLink(
     var li = mw.util.addPortletLink(
       'p-tb',                     // Tools portlet
       sidebarId, '#', 'Translate', 'pt-google-translate', 'Translate this page'
      '#',                       // dummy href; we'll replace with a DIV
      'Translate',               // label visible in the sidebar
      'pt-google-translate',     // id of the list item
      'Translate this page'       // tooltip
     );
     );
    // Replace the <a> with our container DIV
     var container = document.createElement('div');
     var container = document.createElement('div');
     container.id = targetId;
     container.id = targetId;
    // Vector expects a block-level element inside li
     li.textContent = '';
     li.textContent = '';         // remove the <a> text
     li.appendChild(container);
     li.appendChild(container);
   }
   }


  // Callback Google calls after its script loads
   window.googleTranslateElementInit = function () {
   window.googleTranslateElementInit = function () {
     /* global google */
     /* global google */
     new google.translate.TranslateElement({
     new google.translate.TranslateElement({
       pageLanguage: (mw.config && mw.config.get('wgContentLanguage')) || 'en',
       pageLanguage: (mw.config && mw.config.get('wgContentLanguage')) || 'en',
       includedLanguages: 'fr,es,de,ru,zh',           // adjust as you like
       includedLanguages: 'fr,es,de,ru,zh',
       layout: google.translate.TranslateElement.InlineLayout.SIMPLE
       layout: google.translate.TranslateElement.InlineLayout.SIMPLE
     }, targetId);
     }, targetId);
Line 191: Line 187:


   mw.loader.using('mediawiki.util').then(function () {
   mw.loader.using('mediawiki.util').then(function () {
     insertIntoToolsPortlet();
     insertIntoSidebar();
    // Load Google's script
     var s = document.createElement('script');
     var s = document.createElement('script');
     s.src = 'https://translate.google.com/translate_a/element.js?cb=googleTranslateElementInit';
     s.src = 'https://translate.google.com/translate_a/element.js?cb=googleTranslateElementInit';

Revision as of 15:12, 17 October 2025

/* Any JavaScript here will be loaded for all users on every page load. */
function ModifySidebar( action, section, name, link ) {
	try {
		switch ( section ) {
			case 'languages':
				var target = 'p-lang';
				break;
			case 'toolbox':
				var target = 'p-tb';
				break;
			case 'navigation':
				var target = 'p-navigation';
				break;
			default:
				var target = 'p-' + section;
				break;
		}

		if ( action == 'add' ) {
			var node = document.getElementById( target )
							   .getElementsByTagName( 'div' )[0]
							   .getElementsByTagName( 'ul' )[0];

			var aNode = document.createElement( 'a' );
			var liNode = document.createElement( 'li' );

			aNode.appendChild( document.createTextNode( name ) );
			aNode.setAttribute( 'href', link );
			liNode.appendChild( aNode );
			liNode.className = 'plainlinks';
			node.appendChild( liNode );
		}

		if ( action == 'remove' ) {
			var list = document.getElementById( target )
							   .getElementsByTagName( 'div' )[0]
							   .getElementsByTagName( 'ul' )[0];

			var listelements = list.getElementsByTagName( 'li' );

			for ( var i = 0; i < listelements.length; i++ ) {
				if (
					listelements[i].getElementsByTagName( 'a' )[0].innerHTML == name ||
					listelements[i].getElementsByTagName( 'a' )[0].href == link
				)
				{
					list.removeChild( listelements[i] );
				}
			}
		}


	} catch( e ) {
		// let's just ignore what's happened
		return;
	}
}

function CustomizeModificationsOfSidebar() {
	// Adds [[Special:CategoryTree|Special:CategoryTree]] to toolbox
	// ModifySidebar( 'add', 'toolbox', 'CategoryTree', 'https://asist.a2hosted.com/index.php/Special:CategoryTree' );
	// Removes [[Special:Upload|Special:Upload]] from toolbox
	   ModifySidebar( 'remove', 'toolbox', 'Upload file', 'https://asist.a2hosted.com/index.php/Special:Upload' );
    // Removes [[Special:Specialpages|Special:Special pages]] from toolbox
	   ModifySidebar( 'remove', 'toolbox', 'Special pages', 'https://asist.a2hosted.com/index.php/Special:SpecialPages' );
    
}

jQuery( CustomizeModificationsOfSidebar );




/* People directory filtering */
mw.hook('wikipage.content').add(function($content) {
  var $container = $('#people-cards');
  if (!$container.length) return; // not this page

  var $cards = $container.find('.person-card');
  var $q = $('#people-filter-input');
  var $letter = $('#people-filter-letter');
  var $clear = $('#people-filter-clear');
  var $count = $('#people-filter-count');
  var $nores = $('#people-no-results');
  var $more = $('#people-show-more');

  var SAMPLE_SIZE = 8;  // how many to show by default on initial load
  var PAGE_SIZE   = 24; // "Show more" chunk size

  function norm(s){ return (s||'').toString().toLowerCase().normalize('NFKD')
    .replace(/[\u0300-\u036f]/g,''); }

  var idx = $cards.map(function(){
    var $c = $(this);
    return {
      el:  this,
      first: norm($c.data('first')),
      last:  norm($c.data('last')),
      bio:   norm($c.data('bio')),
    };
  }).get();

  idx.sort(function(){ return Math.random() - 0.5; });

  var shownCount = 0;

  function currentFiltered() {
    var q = norm($q.val());
    var letter = ($letter.val() || '').toLowerCase();
    return idx.filter(function(r){
      var matchesQ = !q || (r.first.includes(q) || r.last.includes(q) || r.bio.includes(q));
      var matchesLetter = !letter || (r.last.startsWith(letter) || r.first.startsWith(letter));
      return matchesQ && matchesLetter;
    });
  }

  function hideAll(){ idx.forEach(function(r){ r.el.style.display = 'none'; }); }

  function applyFilter() {
    var filtered = currentFiltered();
    hideAll();

    var qActive = !!$q.val();
    var lActive = !!$letter.val();
    var limit = (qActive || lActive) ? filtered.length : Math.min(SAMPLE_SIZE, filtered.length);

    filtered.slice(0, limit).forEach(function(r){ r.el.style.display = ''; });
    shownCount = limit;

    $count.text(filtered.length ? (qActive || lActive ? filtered.length + ' match' + (filtered.length===1?'':'es') : 'Showing ' + limit + ' of ' + filtered.length) : '');
    $nores.toggle(filtered.length === 0);
    $more.toggle((qActive || lActive) && shownCount < filtered.length);
  }

  function showMore() {
    var filtered = currentFiltered();
    var next = filtered.slice(shownCount, shownCount + PAGE_SIZE);
    next.forEach(function(r){ r.el.style.display = ''; });
    shownCount += next.length;
    $more.toggle(shownCount < filtered.length);
  }

  var timer = null;
  function debouncedFilter(){
    clearTimeout(timer);
    timer = setTimeout(applyFilter, 120);
  }

  $q.on('input', debouncedFilter);
  $letter.on('change', applyFilter);
  $clear.on('click', function(){
    $q.val('');
    $letter.val('');
    applyFilter();
    $q.trigger('focus');
  });
  $more.on('click', showMore);

  applyFilter();
});


// === Google Website Translator: mount in Vector 2022 sidebar ===
(function () {
  var targetId = 'google_translate_element';

  function insertIntoSidebar() {
    // Prefer the sidebar portlet id used by Vector 2022; fall back to 'p-tb'
    var sidebarId = document.getElementById('vector-sidebar') ? 'vector-page-tools' : 'p-tb';
    var li = mw.util.addPortletLink(
      sidebarId, '#', 'Translate', 'pt-google-translate', 'Translate this page'
    );
    var container = document.createElement('div');
    container.id = targetId;
    li.textContent = '';
    li.appendChild(container);
  }

  window.googleTranslateElementInit = function () {
    /* global google */
    new google.translate.TranslateElement({
      pageLanguage: (mw.config && mw.config.get('wgContentLanguage')) || 'en',
      includedLanguages: 'fr,es,de,ru,zh',
      layout: google.translate.TranslateElement.InlineLayout.SIMPLE
    }, targetId);
  };

  mw.loader.using('mediawiki.util').then(function () {
    insertIntoSidebar();
    var s = document.createElement('script');
    s.src = 'https://translate.google.com/translate_a/element.js?cb=googleTranslateElementInit';
    document.head.appendChild(s);
  });
})();