MediaWiki:Common.js: Difference between revisions
Appearance
No edit summary |
No edit summary |
||
| (17 intermediate revisions by 2 users not shown) | |||
| Line 64: | Line 64: | ||
// Removes [[Special:Specialpages|Special:Special pages]] from toolbox | // Removes [[Special:Specialpages|Special:Special pages]] from toolbox | ||
ModifySidebar( 'remove', 'toolbox', 'Special pages', 'https://asist.a2hosted.com/index.php/Special:SpecialPages' ); | ModifySidebar( 'remove', 'toolbox', 'Special pages', 'https://asist.a2hosted.com/index.php/Special:SpecialPages' ); | ||
} | } | ||
jQuery( CustomizeModificationsOfSidebar ); | 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 next to the search box (Vector 2022) === | |||
(function () { | |||
var targetId = 'google_translate_element'; | |||
function placeInHeader() { | |||
// Vector 2022 search container (try p-search first, then the class) | |||
var search = document.getElementById('p-search') || | |||
document.querySelector('.vector-search-box'); | |||
// Fallback: insert before personal tools if search isn't found yet | |||
var userLinks = document.getElementById('p-personal') || | |||
document.getElementById('vector-user-links'); | |||
var container = document.getElementById(targetId); | |||
if (!container) { | |||
container = document.createElement('div'); | |||
container.id = targetId; | |||
container.className = 'gt-header-slot'; | |||
} | |||
if (search && search.parentNode) { | |||
// place immediately after the search box | |||
search.parentNode.insertBefore(container, search.nextElementSibling); | |||
} else if (userLinks && userLinks.parentNode) { | |||
userLinks.parentNode.insertBefore(container, userLinks); | |||
} else { | |||
// last resort | |||
document.body.appendChild(container); | |||
} | |||
} | |||
// Google callback | |||
window.googleTranslateElementInit = function () { | |||
/* global google */ | |||
new google.translate.TranslateElement({ | |||
pageLanguage: (mw.config && mw.config.get('wgContentLanguage')) || 'en', | |||
includedLanguages: 'fr,es,de,it,pt,ru,zh,ja,ko,ar,hi', | |||
layout: google.translate.TranslateElement.InlineLayout.SIMPLE, | |||
autoDisplay: false | |||
}, targetId); | |||
}; | |||
// Run once the MediaWiki loader is ready | |||
mw.loader.using('mediawiki.util').then(function () { | |||
placeInHeader(); | |||
var s = document.createElement('script'); | |||
s.src = 'https://translate.google.com/translate_a/element.js?cb=googleTranslateElementInit'; | |||
document.head.appendChild(s); | |||
}); | |||
// Vector sometimes re-renders parts of the header; re-place if it moves | |||
mw.hook('skin.vector.updated').add(placeInHeader); | |||
})(); | |||
Latest revision as of 15:24, 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 next to the search box (Vector 2022) ===
(function () {
var targetId = 'google_translate_element';
function placeInHeader() {
// Vector 2022 search container (try p-search first, then the class)
var search = document.getElementById('p-search') ||
document.querySelector('.vector-search-box');
// Fallback: insert before personal tools if search isn't found yet
var userLinks = document.getElementById('p-personal') ||
document.getElementById('vector-user-links');
var container = document.getElementById(targetId);
if (!container) {
container = document.createElement('div');
container.id = targetId;
container.className = 'gt-header-slot';
}
if (search && search.parentNode) {
// place immediately after the search box
search.parentNode.insertBefore(container, search.nextElementSibling);
} else if (userLinks && userLinks.parentNode) {
userLinks.parentNode.insertBefore(container, userLinks);
} else {
// last resort
document.body.appendChild(container);
}
}
// Google callback
window.googleTranslateElementInit = function () {
/* global google */
new google.translate.TranslateElement({
pageLanguage: (mw.config && mw.config.get('wgContentLanguage')) || 'en',
includedLanguages: 'fr,es,de,it,pt,ru,zh,ja,ko,ar,hi',
layout: google.translate.TranslateElement.InlineLayout.SIMPLE,
autoDisplay: false
}, targetId);
};
// Run once the MediaWiki loader is ready
mw.loader.using('mediawiki.util').then(function () {
placeInHeader();
var s = document.createElement('script');
s.src = 'https://translate.google.com/translate_a/element.js?cb=googleTranslateElementInit';
document.head.appendChild(s);
});
// Vector sometimes re-renders parts of the header; re-place if it moves
mw.hook('skin.vector.updated').add(placeInHeader);
})();