Jump to content

User:SD0001/GAR-helper.js

From Wikipedia, the free encyclopedia
This is an old revision of this page, as edited by SD0001 (talk | contribs) at 20:30, 11 July 2020 (create new script for GAR per request by Eddie891). The present address (URL) is a permanent link to this revision, which may differ significantly from the current revision.
(diff) ← Previous revision | Latest revision (diff) | Newer revision → (diff)
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.
/**
 * Script to easily make Good Article Reassessment (GAR)
 * nominations.
 */

/* <nowiki> */
/* jshint maxerr: 999 */

var gar = {};
window.gar = gar;

$.when(
	mw.loader.using('ext.gadget.morebits'),
	$.ready
).then(function() {
	if ([0, 1].indexOf(mw.config.get('wgNamespaceNumber')) !== -1) {
		mw.util.addPortletLink('p-cactions', '#', 'GAR', 'gar-portlet', 'Nominate for GAR');
		$('#gar-portlet').click(gar.callback);
	}
});

gar.advert = ' ([[User:SD0001/GAR-helper|GAR-helper]])';

gar.callback = function garCallback(e) {
	if (e) {
		e.preventDefault();
	}

	var Window = new Morebits.simpleWindow(600, 450);
	Window.setTitle( "Nominate article for GAR" );
	Window.setScriptName('GAR-helper');
	Window.addFooterLink('GAR instructions', 'WP:GAR');

	var form = new Morebits.quickForm(gar.evaluate);

	var typefield = form.append({
		type: 'field',
		label: 'GAR type',
		id: 'gartype_fieldset'
	});

	typefield.append({
		type: 'radio',
		name: 'gartype',
		event: gar.typechanged,
		list: [
			{
				label: 'Community reassessment',
				value: 'garc',
				checked: true
			},
			{
				label: 'Individual reassessment',
				value: 'gari'
			}
		]
	});

	var field = form.append({
		type: 'field',
		label: 'Details',
		name: 'details'
	});

	field.append({
		type: 'checkbox',
		list: [
			{
				label: 'Notify article creator',
				value: 'notify',
				name: 'notify',
				tooltip: "A notification template will be placed on the creator's talk page if this is checked.",
				checked: true
			}
		]
	});

	field.append({
		type: 'textarea',
		name: 'reason',
		label: 'Rationale:',
		style: 'height: 130px',
		tooltip: 'You can expand the rationale after the page has been saved as well.'
	});

	form.append({ type: 'submit', label: 'Submit' });

	var result = form.render();
	Window.setContent(result);
	Window.display();

};

gar.evaluate = function(e) {
	var form = e.target;
	gar.params = {
		type: form.gartype.value,
		notify: form.notify.checked,
		reason: form.reason.value
	};
	gar.garc = gar.params.type === 'garc';
	gar.gari = gar.params.type === 'gari';

	Morebits.simpleWindow.setButtonsEnabled(false);
	Morebits.status.init(form);

	var title_obj = new mw.Title.newFromText(Morebits.pageNameNorm);
	gar.title = title_obj.getSubjectPage().toText();
	gar.talktitle = title_obj.getTalkPage().toText();

	gar.tasks.getNumber().then(function() {
		return gar.tasks.createNomPage();
	}).then(function() {
		return gar.tasks.editTalkPage();
	}).then(function() {
		return gar.tasks.getCreator();
	}).then(function() {
		return gar.tasks.notifyAuthor();
	}).then(function() {
		Morebits.status.actionCompleted('Nomination completed. Redirecting to nomination page in 3 seconds...');
		setTimeout(function() {
			location.href = mw.util.getUrl(gar.garpage);
		}, 3000000);
	});

};

gar.tasks = {

	getNumber: function() {
		var def = $.Deferred();
		var query = {
			action: 'query',
			format: 'json',
			formatversion: '2',
			list: 'allpages',
		};
		if (gar.garc) {
			query.apnamespace = '4', // WP
			query.apprefix = 'Good article reassessment/' + gar.title + '/';
		} else {
			query.apnamespace = '1', // Talk
			query.apprefix = gar.title + '/GA'; // name without namespace
		}
		var api = new Morebits.wiki.api('Getting numbering', query);
		api.post().then(function(apiobj) {
			var pages = apiobj.response.query.allpages;
			gar.num = pages.length + 1; // HACK
			def.resolve();
		}, def.reject);
		return def;
	},

	createNomPage: function() {
		var def = $.Deferred();
		var appendtext;
		if (gar.garc) {
			gar.garpage = 'Wikipedia:Good article reassessment/' + gar.title + '/' + gar.num;
			appendtext =
				'{{subst:GAR/header}}\n' +
				gar.params.reason;
		} else {
			gar.garpage = gar.talktitle + '/GA' + gar.num;
			appendtext =
				'==GA Reassessment==\n' +
				'{{subst:GAR/subst|{{subst:PAGENAME}}}}\n' +
				gar.params.reason;
		}
		var pageobj = new Morebits.wiki.page(gar.garpage, 'Creating nomination page');
		pageobj.setAppendText(appendtext);
		pageobj.setCreateOption('createonly');
		pageobj.setWatchlist(true);
		pageobj.setEditSummary('Creating GAR nomination page' + gar.advert);
		pageobj.append(def.resolve, def.reject);
		return def;
	},

	editTalkPage: function() {
		var def = $.Deferred();
		var talkpage = new Morebits.wiki.page(gar.talktitle, 'Editing talk page');
		talkpage.load(function(talkpage) {
			var text = talkpage.getPageText();
			// prepend tag:
			text = '{{subst:GAR}}\n' + text;
			// append transclusion:
			if (gar.garc) {
				text += '\n\n==GA Reassessment==\n' +
					'{{' + gar.garpage + '}}';
			} else {
				text += '\n\n{{' + gar.garpage + '}}';
			}
			talkpage.setPageText(text);
			talkpage.setEditSummary('Nominating for Good Article Reassessment (GAR)' + gar.advert);
			talkpage.save(def.resolve, def.reject);
		});
		return def;
	},

	getCreator: function() {
		var def = $.Deferred();
		var page = new Morebits.wiki.page(gar.title, 'Fetching article creator');
		page.setLookupNonRedirectCreator(true);
		page.lookupCreation(function() {
			gar.pageauthor = page.getCreator();
			page.getStatusElement().info('Got ' + gar.pageauthor);
			def.resolve();
		}, def.reject);
		return def;
	},

	notifyAuthor: function() {
		var def = $.Deferred();
		var usertalk = new Morebits.wiki.page('User talk:' + gar.pageauthor, 'Notifying article creator');
		usertalk.setAppendText(
			'\n\n' +
			(gar.garc ?
			'{{subst:GARMessage|' + gar.title + '|GARpage=' + gar.num + '}} ~~~~' :
			'{{subst:GARMessage|' + gar.title + '|page=' + gar.num + '}} ~~~~')
		);
		usertalk.setEditSummary('[[' + gar.title + ']] listed for Good article reassessment' + gar.advert);
		usertalk.append(def.resolve, def.reject);
		return def;
	}

};

/* </nowiki> */