MediaWiki:Gadget-Adiutor-AFD.js

Note : après avoir enregistré la page, vous devrez forcer le rechargement complet du cache de votre navigateur pour voir les changements.

Mozilla / Firefox / Konqueror / Safari : maintenez la touche Majuscule (Shift) en cliquant sur le bouton Actualiser (Reload) ou pressez Maj-Ctrl-R (Cmd-R sur Apple Mac) ;

Firefox (sur GNU/Linux) / Chrome / Internet Explorer / Opera : maintenez la touche Ctrl en cliquant sur le bouton Actualiser ou pressez Ctrl-F5.
/*
 * Adiutor: Adiutor enables versatile editing options and modules to assist a variety of user actions to enhance the Wikipedia editing experience.
 * Author: Vikipolimer
 * Learn more at: https://meta.wikimedia.org/wiki/Adiutor
 * Licensing and Attribution: Licensed under Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0)
 * Module: Article For Deletion
 */
/* <nowiki> */
// Get essential configuration from MediaWiki
var mwConfig = mw.config.get([ "wgPageName", "wgUserName"]);
var api = new mw.Api();
var wikiId = mw.config.get('wgWikiID');
var adiutorUserOptions = JSON.parse(mw.user.options.get('userjs-adiutor-'+wikiId));

function ArticleForDeletionDialog(config) {
	ArticleForDeletionDialog.super.call(this, config);
}
OO.inheritClass(ArticleForDeletionDialog, OO.ui.ProcessDialog);
ArticleForDeletionDialog.static.name = 'ArticleForDeletionDialog';
ArticleForDeletionDialog.static.title = new OO.ui.deferMsg('afd-module-title');
ArticleForDeletionDialog.static.actions = [{
	action: 'save',
	label: new OO.ui.deferMsg('continue'),
	flags: ['primary', 'progressive']
}, {
	label: new OO.ui.deferMsg('cancel'),
	flags: 'safe'
}];
ArticleForDeletionDialog.prototype.initialize = function () {
	ArticleForDeletionDialog.super.prototype.initialize.apply(this, arguments);
	var headerTitle = new OO.ui.MessageWidget({
		type: 'notice',
		inline: true,
		label: new OO.ui.deferMsg('afd-header-title')
	});
	var headerTitleDescription = new OO.ui.LabelWidget({
		label: new OO.ui.deferMsg('afd-header-description')
	});
	headerTitleDescription.$element.css({
		'margin-top': '20px',
		'margin-bottom': '20px'
	});
	AfDOptions = new OO.ui.FieldsetLayout({});
	AfDOptions.addItems([
		rationaleField = new OO.ui.FieldLayout(rationaleInput = new OO.ui.MultilineTextInputWidget({
			placeholder: new OO.ui.deferMsg('afd-rationale-placeholder'),
			indicator: 'required',
			value: '',
		}), {
			label: new OO.ui.deferMsg('rationale'),
			align: 'inline',
		}),
		new OO.ui.FieldLayout(new OO.ui.ToggleSwitchWidget({
			value: adiutorUserOptions.articlesForDeletion.afdSendMessageToCreator,
			data: 'informCreator'
		}), {
			label: new OO.ui.deferMsg('afd-inform-creator'),
			align: 'top',
			help: new OO.ui.deferMsg('afd-inform-creator-help'),
		}),
	]);
	rationaleField.$element.css('font-weight', '900');
	this.content = new OO.ui.PanelLayout({
		padded: true,
		expanded: false,
		isDraggable: true
	});
	this.content.$element.append(headerTitle.$element, headerTitleDescription.$element, AfDOptions.$element);
	this.$body.append(this.content.$element);
};
ArticleForDeletionDialog.prototype.getActionProcess = function (action) {
	var dialog = this;
	if (action) {
		return new OO.ui.Process(function () {
			processStartedDialog = new OO.ui.MessageDialog();
			progressBar = new OO.ui.ProgressBarWidget();
			progressBarWindowManager = new OO.ui.WindowManager();
			$(document.body).append(progressBarWindowManager.$element);
			progressBarWindowManager.addWindows([processStartedDialog]);
			progressBarWindowManager.openWindow(processStartedDialog, {
				title: mw.msg('processing'),
				message: progressBar.$element
			});
			progressBar.setProgress(0);
			var ActionOptions = [];
			AfDOptions.items.forEach(function (Option) {
				if (Option.fieldWidget.selected) {
					ActionOptions.push({
						value: Option.fieldWidget.value,
						selected: Option.fieldWidget.selected
					});
				}
				if (Option.fieldWidget.value === true) {
					ActionOptions.push({
						value: Option.fieldWidget.value,
						data: Option.fieldWidget.data
					});
				}
			});
			ActionOptions.forEach(function (Option) {
				if (Option.data === "informCreator") {
					console.log(Option.data);
					progressBarWindowManager.setData({message: "Avertissement du créateur..."});
					getCreator().then(function (data) {
						var Author = data.query.pages[mw.config.get('wgArticleId')].revisions[0].user;
						if (!mw.util.isIPAddress(Author)) {
							var message = '{{subst:Avertissement débat d\'admissibilité|'+mwConfig.wgPageName.replace(/_/g, " ")+'}}~~~~';
							sendMessageToAuthor(Author, message);
							progressBarWindowManager.setData({message: "Créateur averti."});
						} else {
							progressBarWindowManager.setData({message: "Créateur anonyme non averti."});
						}
						progressBar.setProgress(25);
					});
				}
			});
			putAfDTemplate();
			dialog.close({
				action: action
			});
		});
	}
	return ArticleForDeletionDialog.super.prototype.getActionProcess.call(this, action);
};
var windowManager = new OO.ui.WindowManager();
$(document.body).append(windowManager.$element);
var progressBar, processStartedDialog, progressBarWindowManager;
var dialog = new ArticleForDeletionDialog({
	size: 'large',
	classes: ['afd-helper-window'],
	isDraggable: true
});
windowManager.addWindows([dialog]);
windowManager.openWindow(dialog);

function putAfDTemplate() {
	AFDTemplate = "{{Admissibilité}}\n";
	
	// regex pour supprimer les bandeaux {{Admissibilité à vérifier}} reprise du code de PaStec
	var PaStec_AdmitTemplatePattern = "{{([Aa]dmissibilit(e|é) à vérifier|[Vv]érifiabilité|[Nn]otoriété)[^{}]*}}";
	var PaStec_RemoveAdmitTemplateRegExp = new RegExp("<noinclude>\s*" + PaStec_AdmitTemplatePattern + "\s*<\/noinclude>\n?" + "|" + PaStec_AdmitTemplatePattern + "\n?");

	api.edit(
	    mwConfig.wgPageName,
	    function ( revision ) {
	        return {
	            text: AFDTemplate + revision.content.replace( PaStec_RemoveAdmitTemplateRegExp, '' ).replace(/^\n+/, ''),
				summary: 'Ouverture du débat d\'admissibilité',
				tags: 'Adiutor',
	        };
	    }
	).done(function () {
		progressBarWindowManager.setData({message: "Bandeau d'admissibilité déposé."});
		progressBar.setProgress(50);
		createNominationPage();
		logNomination(adiutorUserOptions);
	});
}

function checkPreviousNominations(title) {
	return api.get({
		action: 'query',
		prop: 'revisions',
		rvlimit: 1,
		rvprop: ['user'],
		rvdir: 'newer',
		titles: title,
	});
}

function createNominationPage() {
	api.postWithToken('csrf', {
		action: 'edit',
		title: 'Discussion:'+mwConfig.wgPageName+'/Admissibilité',
		appendtext: "{{subst:Initialiser Débat d'admissibilité|motif=" + rationaleInput.value + "}}",
		summary: 'Ouverture du débat d\'admissibilité',
		tags: 'Adiutor',
		format: 'json'
	}).done(function () {
		progressBarWindowManager.setData({message: "Page du débat d'admissibilité créée."});
		progressBar.setProgress(75);
		addToDDAList();
	});
}

function addToDDAList() {
	var pattern = new RegExp("(\\n*\\{\\{Boîte déroulante[^\\*]*\\*[^\\*]*)$", "s");
	var replacement = '\n*{{L|' + mwConfig.wgPageName.replace(/_/g, " ") + '}}$1';
	
	api.edit(
	    'Wikipédia:Débat d\'admissibilité',
	    function ( revision ) {
	    	var newText = revision.content.replace(pattern, replacement);
	        return {
	            text: newText,
				summary: 'Ouverture du débat d\'admissibilité pour la page ' + mwConfig.wgPageName.replace(/_/g, " "),
				tags: 'Adiutor',
	        };
	    }
	).done(function () {
		progressBarWindowManager.setData({message: "Débat ajouté à la liste des débats d'admissibilité en cours sur WP:DDA."});
		progressBar.setProgress(100);
		location.reload();
	});
}


function logNomination(adiutorUserOptions) {
	if (adiutorUserOptions.articlesForDeletion.afdLogNominatedPages === true) {
		api.postWithToken('csrf', {
			action: 'edit',
			title: 'Utilisateur:'.concat(mwConfig.wgUserName, '/' + adiutorUserOptions.articlesForDeletion.afdLogPageName + '').split(' ').join('_'),
			appendtext: "\n" + "# Débat d'admissibilité ouvert pour la page ''[[Discussion:"+mwConfig.wgPageName+"/Admissibilité|" + mwConfig.wgPageName.replace(/_/g, " ") + "]]''' le  ~~~~~",
			summary: "Mise à jour du journal des débats d'admissibilité : +[[" + mwConfig.wgPageName.replace(/_/g, " ") + ']].',
			tags: 'Adiutor',
			format: 'json'
		}).done(function () { });
	}
}

function getCreator() {
	return api.get({
		action: 'query',
		prop: 'revisions',
		rvlimit: 1,
		rvprop: ['user'],
		rvdir: 'newer',
		titles: mwConfig.wgPageName.replace(/_/g, " ")
	});
}

function sendMessageToAuthor(Author, message) {
	api.postWithToken('csrf', {
		action: 'edit',
		title: 'Discussion_utilisateur:' + Author,
		appendtext: '\n' + message,
		summary: "L'admissibilité de la page «\xA0[[" + mwConfig.wgPageName.replace(/_/g, " ") + "]]\xA0»" + " est débattue",
		tags: 'Adiutor',
		format: 'json'
	}).done(function () { });
}

/* </nowiki> */