Jump to content

User:Novem Linguae/Scripts/ReviewStatus.js

From Wikipedia, the free encyclopedia
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.
Note: After saving, you have to bypass your browser's cache to see the changes. Google Chrome, Firefox, Microsoft Edge and Safari: Hold down the ⇧ Shift key and click the Reload toolbar button. For details and instructions about other browsers, see Wikipedia:Bypass your cache.
// <nowiki>

/*
- Displays whether or not a mainspace page is marked as reviewed. This info is placed on the right of the page title using a small icon.
- Without a script like this, you need to be a new page reviewer or admin and look at the Page Curation toolbar. Or you need to use Special:Log -> Page Curation Log. And there is also some complex logic. For example, the absence of a log entry means the page is marked as reviewed.
*/

// TODO: display whether the page is indexed or not. can do this by using JS to look for "noindex", or can do this by checking the first revision date.
// TODO: display in all namespaces
// TODO: do I need to use different code to check if marked as patrolled? I think that uses recentchanges table... maybe?

class ReviewStatus {
	async execute() {
		if ( !this.shouldRunOnThisPage() ) {
			return;
		}

		const pageID = mw.config.get( 'wgArticleId' );
		const boolIsReviewed = await this.isReviewed( pageID );
		let htmlToInsert = '';

		// modules/ext.pageTriage.views.toolbar/images/icons/

		if ( boolIsReviewed ) {
			htmlToInsert = ' <img src="https://en.wikipedia.org/w/extensions/PageTriage/modules/ext.pageTriage.toolbar/images/pageInfo/icon_reviewed.png" title="Reviewed" />';
		} else {
			htmlToInsert = ' <img src="https://en.wikipedia.org/w/extensions/PageTriage/modules/ext.pageTriage.toolbar/images/pageInfo/icon_not_reviewed.png" title="Not reviewed" />';
		}

		if ( this.pageHasSections() ) {
			$( '#firstHeading .mw-editsection' ).before( htmlToInsert );
		} else {
			$( '#firstHeading' ).append( htmlToInsert );
		}
	}

	/**
	 * @param {number} pageID The page ID number. A positive number with no commas.
	 */
	async isReviewed( pageID ) {
		const api = new mw.Api();
		const response = await api.get( {
			action: 'query',
			format: 'json',
			formatversion: '2',
			prop: 'isreviewed',
			pageids: pageID
		} );
		return response.query.pages[ 0 ].isreviewed;
	}

	shouldRunOnThisPage() {
		// don't run when not viewing articles
		const action = mw.config.get( 'wgAction' );
		if ( action !== 'view' ) {
			return false;
		}

		// don't run when viewing diffs
		const isDiff = mw.config.get( 'wgDiffNewId' );
		if ( isDiff ) {
			return false;
		}

		const isDeletedPage = ( !mw.config.get( 'wgCurRevisionId' ) );
		if ( isDeletedPage ) {
			return false;
		}

		// Only run in mainspace
		const namespace = mw.config.get( 'wgNamespaceNumber' );
		const isMainspaceOrDraftspace = ( [ 0 ].includes( namespace ) );
		if ( !isMainspaceOrDraftspace ) {
			return false;
		}

		return true;
	}

	pageHasSections() {
		return $( '#firstHeading .mw-editsection' ).length;
	}
}

$( async function () {
	await mw.loader.using( [ 'mediawiki.api' ], async function () {
		await ( new ReviewStatus() ).execute();
	} );
} );

// </nowiki>