Aller au contenu

MediaWiki:Gadget-RevertDiff.js

Une page de Wikipédia, l'encyclopédie libre.
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.
/**
 * Outils pour annuler des modifications
 *
 * fournit des liens dans les pages de diff pour révoquer facilement une modification et avertir son auteur
 *
 * Auteurs : Lorian (en), Chphe (fr)
 * Dernière révision : 20 septembre 2025
 * {{Catégorisation JS|RevertDiff}}
 */
//<nowiki>

function isDiffPage() {
	return !!mw.config.get( 'wgDiffNewId' );
}

if ( isDiffPage() ) {
	mw.loader.using( [ 'mediawiki.api' ], function () {
		$( function ( $ ) {
			const api = new mw.Api( { userAgent: 'RevertDiff/1.0.0 (https://fr.wikipedia.org/wiki/Discussion_MediaWiki:Gadget-RevertDiff.js)' } );

			const Texts = {
				Annul		: 'Annuler',
				Revert		: 'Révoquer',
				Message		: 'Message',
				Warn		: 'Avertir',
				MessageAlert: 'Quel message faut-il laisser ?',
				AnnulResume	: 'Annulation des modifications de [[Special:Contributions/$2|$2]] (retour à la version précédente de [[Special:Contributions/$1|$1]])',
				RevertResume: 'Révocation des modifications de [[Special:Contributions/$2|$2]] (retour à la version précédente de [[Special:Contributions/$1|$1]])',
			};

			const Warns = [
				{ text: 'Test1',		template: '{{subst:Test 1|$page}} ~~~~' },
				{ text: 'Test2',		template: '{{subst:Test 2}} ~~~~' },
				{ text: 'Test3',		template: '{{subst:Test 3}} ~~~~' },
				{ text: 'Test4',		template: '{{subst:Seul avertissement}} ~~~~' },
				{ text: 'Lien externe',	template: '{{subst:Bienvenue spammeur|$page}} ~~~~' },
				{ text: 'Faut sourcer',	template: '{{subst:Faut sourcer|$page}} ~~~~' },
				{ text: 'Bienvenue',	template: '{{subst:Bienvenue nouveau|sign=~~~~}}' },
				{ text: 'BienvenueCT',	template: '{{subst:Bienvenue compte temporaire|sign=~~~~}}' },
				{ text: 'MerciCT',		template: '{{subst:Bienvenue compte temporaire méritant|{{safesubst:REVISIONUSER}}|sign=~~~~}}' },
			];

			function createLink( label, onClick, title ) {
				const a = document.createElement( 'a' );
				a.href = '#';
				a.textContent = label;
				if ( title ) a.title = title;
				a.addEventListener( 'click', function ( e ) {
					e.preventDefault();
					onClick( e );
				});
				return a;
			}

			// Get username of submitter
			const user1Sel = document.querySelector( 'td.diff-otitle a.mw-userlink bdi' );
			const user2Sel = document.querySelector( 'td.diff-ntitle a.mw-userlink bdi' );
			if ( !user1Sel || !user2Sel ) return;

			const user1 = user1Sel.textContent;
			const user2 = user2Sel.textContent;

			async function processAnnulOrRevert( action, withMessage ) {
				let summary;
				if ( action === 'annul' ) {
					summary = Texts.AnnulResume;
				} else if ( action === 'revert' ) {
					summary = Texts.RevertResume;
				}
				summary = summary.replace( /\$1/g, user1 ).replace( /\$2/g, user2 );
				if ( withMessage ) {
					let message = prompt( Texts.MessageAlert );
					if ( message ) {
						summary += '\xA0: ' + message;
					} else {
						mw.notify( 'Aucun message saisi. La modification n\'a pas été annulée.', { type: 'error' } );
						return;
					}
				}
				api.postWithEditToken({
					title: mw.config.get( 'wgPageName' ),
					action: 'edit',
					undoafter: mw.config.get( 'wgDiffOldId' ),
					undo: action === 'revert' ? mw.config.get( 'wgCurRevisionId' ) : mw.config.get( 'wgDiffNewId' ),
					summary: summary
				}).then( () => mw.notify( 'Modification annulée.', { type: 'success' } ) );
			}

			const linkAnnulDirect = createLink( Texts.Annul, () => processAnnulOrRevert( 'annul', false ) );
			const linkAnnulMessage = createLink( Texts.Message, () => processAnnulOrRevert( 'annul', true ) );
			const linkRevertDirect = createLink( Texts.Revert, () => processAnnulOrRevert( 'revert', false ) );
			const linkRevertMessage = createLink( Texts.Message, () => processAnnulOrRevert( 'revert', true ) );

			const links = document.createElement( 'span' );

			links.append( '(', linkAnnulDirect, ' / ', linkAnnulMessage, ') (', linkRevertDirect, ' / ', linkRevertMessage, ')' );

			links.append( ' (' + Texts.Warn + ' : ' );

			Warns.forEach( ( Warn, index ) => {
				const Template = Warn.template
					.replace( '$page', mw.config.get( 'wgPageName' ).replace( /_/g, ' ' ) )
					.replace( '$user', user2 );

				if ( index !== 0 ) {
					links.append( ' / ' );
				}

				const linkWarn = createLink(
					Warn.text,
					() => api.newSection( 'User_talk:' + user2, '', Template ).then( () => mw.notify( 'Avertissement envoyé.', { type: 'success' } ) ),
					Warn.template 
				);

				links.append( linkWarn );
			});

			links.append( ')' );

			let contentSub = document.getElementById( 'contentSub' );
			if ( !contentSub ) {
				contentSub = document.createElement( 'div' );
				contentSub.id = 'contentSub';
				document.getElementById( 'mw-content-text' ).before( contentSub );
			}
			contentSub.append( links );
		});
	});
}

//</nowiki>