// <nowiki>
/*
- Add a "Show only blocked users" link to the More menu on the Special:History page
- When pressed, hides all diffs by non-blocked users, leaving diffs by blocked users
*/
class BlockedUserHistory {
constructor( mw, $, window ) {
this.mw = mw;
// eslint-disable-next-line no-jquery/variable-pattern
this.$ = $;
this.window = window;
}
async execute() {
if ( !this.shouldRunOnThisPage() ) {
return;
}
// TODO: switch to MutationObserver
// check for markblocked HTML classes every second for 20 seconds. when found, execute our user script
let i = 0;
const interval = setInterval( () => {
const $markBlockedFinishedLoading = $( 'li[data-mw-revid]' ).has( '.history-user > a.user-blocked-indef, .history-user > a.user-blocked-partial, .history-user > a.user-blocked-temp' );
if ( $markBlockedFinishedLoading || i >= 20 ) {
this.addLinkOrHideBlocked();
clearInterval( interval );
}
i++;
}, 1000 );
}
addLinkOrHideBlocked() {
const urlContainsOnlyShowBlocked = this.getUriParameter( 'onlyShowBlocked' ) === '1';
if ( urlContainsOnlyShowBlocked ) {
this.hideNotBlocked();
} else {
// Note that the pager links at the bottom of the page will automatically include &onlyShowBlocked=1 once you visit this URL. Good job MediaWiki :)
// Some people are using a per page default as low as 50. Increase this to 1000 so we can see more blocked revisions on a single page.
// TODO: Nardog suggestion: maybe use sessionStorage or history.pushState() instead of adding &onlyShowBlocked=1 to the URL
const url = this.setUriParameters( this.window.location.href, {
onlyShowBlocked: 1,
limit: 1000
} );
this.mw.util.addPortletLink( 'p-cactions', url, 'Show only blocked users', 'blocked-user-history' );
}
}
/**
* @copyright nickf, CC BY-SA 2.5, https://stackoverflow.com/a/1586333/3480193
*/
getUriParameter( uriParameter ) {
const parts = this.window.location.search.substr( 1 ).split( '&' );
const $_GET = {};
for ( let i = 0; i < parts.length; i++ ) {
const temp = parts[ i ].split( '=' );
$_GET[ decodeURIComponent( temp[ 0 ] ) ] = decodeURIComponent( temp[ 1 ] );
}
return $_GET[ uriParameter ];
}
/**
* @param {string} url An entire URL, including protocol, domain, anchors, etc. Example: `https://www.test.com/testPage?param1=hello¶m2=lol#This_is_my_anchor`
* @param {Object} paramsToChange An associative array, with the key names being the params to change, and the values being the value to change them to. Example: `{ param1: 'newValue', param2: 'anotherNewValue' }`
* @return {string} updatedUrl. Example: `https://www.test.com/testPage?param1=newValue¶m2=anotherNewValue#This_is_my_anchor`
*/
setUriParameters( url, paramsToChange ) {
const urlObj = new URL( url );
for ( const key in paramsToChange ) {
urlObj.searchParams.set( key, paramsToChange[ key ] );
}
return urlObj.toString();
}
/**
* @copyright Ponor, CC BY-SA 4.0, https://en.wikipedia.org/w/index.php?title=Wikipedia:User_scripts/Requests&diff=prev&oldid=1231068452
*/
hideNotBlocked() {
$( 'li[data-mw-revid]' ).hide().has( '.history-user > a.user-blocked-indef, .history-user > a.user-blocked-partial, .history-user > a.user-blocked-temp' ).show();
}
shouldRunOnThisPage() {
const action = this.mw.config.get( 'wgAction' );
if ( action !== 'history' ) {
return false;
}
return true;
}
}
$( async () => {
await mw.loader.using( [ 'mediawiki.util' ], async () => {
await ( new BlockedUserHistory( mw, $, window ) ).execute();
} );
} );
// </nowiki>