مدیاویکی:Gadget-rollback.js

از اسلامیکال
نسخهٔ تاریخ ‏۱۳ ژانویهٔ ۲۰۲۳، ساعت ۰۳:۲۳ توسط Aboammar (بحث | مشارکت‌ها) (صفحه‌ای تازه حاوی «// From: https://hu.wikipedia.org/w/index.php?title=MediaWiki:Gadget-rollback.js&oldid=18322106 ( function ( $, mw ) { var rollbackDelay = 1000; // ms /** * Displays success or failure with an icon at the end of each link. * @param {jQuery} $link * @param {String} status One of 'working', 'success', 'error' * @param {String} [errorCode] Error code, if status is 'error' * @param {String} [errorMessage] Error message, if st...» ایجاد کرد)
(تفاوت) → نسخهٔ قدیمی‌تر | نمایش نسخهٔ فعلی (تفاوت) | نسخهٔ جدیدتر ← (تفاوت)
پرش به ناوبری پرش به جستجو

نکته: پس از انتشار ممکن است برای دیدن تغییرات نیاز باشد که حافظهٔ نهانی مرورگر خود را پاک کنید.

  • فایرفاکس / سافاری: کلید Shift را نگه دارید و روی دکمهٔ Reload کلیک کنید، یا کلید‌های Ctrl-F5 یا Ctrl-R را با هم فشار دهید (در رایانه‌های اپل مکینتاش کلید‌های ⌘-R)
  • گوگل کروم: کلیدهای Ctrl+Shift+R را با هم فشار دهید (در رایانه‌های اپل مکینتاش کلید‌های ⌘-Shift-R)
  • اینترنت اکسپلورر/ Edge: کلید Ctrl را نگه‌دارید و روی دکمهٔ Refresh کلیک کنید، یا کلید‌های Ctrl-F5 را با هم فشار دهید
  • اپرا: Ctrl-F5 را بفشارید.
// From: https://hu.wikipedia.org/w/index.php?title=MediaWiki:Gadget-rollback.js&oldid=18322106
( function ( $, mw ) {
	var rollbackDelay = 1000; // ms
	
	/**
	 * Displays success or failure with an icon at the end of each link.
	 * @param {jQuery} $link
	 * @param {String} status One of 'working', 'success', 'error'
	 * @param {String} [errorCode] Error code, if status is 'error'
	 * @param {String} [errorMessage] Error message, if status is 'error'
	 */
	function updateLinkStatus( $link, status, errorCode, errorMessage ) {
		$link.removeClass( 'api-working api-success api-error' );
		if ( status in { working: 1, success: 1, error: 1 } ) {
			$link.addClass( 'api-' + status );
			if ( status === 'error' ) {
				mw.log( 'gadget-rollback: ' + errorCode );
				errorMessage = $.parseHTML( errorMessage );
				errorMessage = $( '<span>' ).append( errorMessage );
				errorText = errorMessage.text();
				errorMessage.prepend( 'خطا: ' );
				mw.notify( errorMessage );
				$link.attr( 'title', errorText );
			}
		} else {
			mw.log( 'gadget-rollback: invalid link status' );
		}
	}
	
	/**
	 * Given some rollback links, sends an API request which does the same thing
	 * the links would have done. Displays success or failure with an icon
	 * at the end of each link.
	 * @param {jQuery} $links
	 */
	function submitRollbackLink( $links ) {
		var deferreds = [];
		
		$links.each( function ( i, el ) {
			var errorMessage,
				api = new mw.Api(),
				deferred = new $.Deferred(),
				uri = new mw.Uri( el.href ),
				$el = $( el ),
				title = uri.query.title,
				user = uri.query.from,
				bot = uri.query.bot;

			deferreds.push( deferred );
			
			if ( !title || ! user ) { // Rollback info not found in link
				errorMessage = 'Belső hiba: nem sikerült értelmezni a linket';
				updateLinkStatus( $el, 'error', 'rollback-info-not-found-in-link', errorMessage );
				deferred.reject( errorMessage );
				return;
			}
			
			updateLinkStatus( $el, 'working' );

			api.postWithToken( 'rollback', {
				action: 'rollback',
				title: title,
				user: user,
				markbot: bot,
				formatversion: 2,
				errorformat: 'html',
				errorsuselocal: true,
				uselang: mw.config.get( 'wgUserLanguage' )
			} ).done( function ( result, jqXHR ) {
				updateLinkStatus( $el, 'success' );
				deferred.resolve();
			} ).fail( function ( code, result ) {
				if ( result.errors && result.errors[0] ) {
					errorMessage = result.errors[0].html;
				} else {
					errorMessage = 'خطای API: ' +  code;
				}
				updateLinkStatus( $el, 'error', code, errorMessage );
				deferred.reject( errorMessage );
			} );
		} );
		
		return $.when.apply( $, deferreds );
	}

	function rollbackAll() {
		var $links = $( '.mw-rollback-link a.rollback' ),
			$button = $( '#rollback-all' ),
			oldButtonText = $button.text();

		if ( !confirm( 'آیا می‌خواهید همه را واگردانی کنید؟' ) ) {
			return false;
		}
		
		// Preload the notification module for mw.notify
		mw.loader.load( 'mediawiki.notification' );

		$button
			.attr( 'disabled', true )
			.text( 'در حال واگردانی' );
		submitRollbackLink( $links ).always( function () {
			$button
				.attr( 'disabled', false )
				.text( oldButtonText );
		} );
	}
	
	/**
	 * Remove NavPopups from a link
	 * Copied from en:MediaWiki:Gadget-popups.js
	 * @param {jQuery} $link
	 */
	function removeTooltip( $link ) {
		var a = $link.get( 0 );
		if ( !a ) {
			return;
		}
		a.onmouseover = null;
		a.onmouseout = null;
		if ( a.originalTitle ) {
			a.title = a.originalTitle;
		}
		a.hasPopup = false;
	}
	
	/**
	 * Sets up individual rollback links
	 */
	function installLinks() {
		var $botLink,
			isAdmin = ( $.inArray( 'sysop', mw.config.get( 'wgUserGroups' ) ) !== -1 ),
			$rollbackSpans = $( '.mw-rollback-link' ),
			clickHandler = function( e ) {
				// Preload the notification module for mw.notify
				mw.loader.load( 'mediawiki.notification' );
				submitRollbackLink( $( this ) );
				e.preventDefault();
			};
		
		$rollbackSpans.each( function ( i, el ) {
			var $span = $( el ),
				$link = $span.find( 'a:eq(0)' );
				
			$span.off( 'click', 'a[data-mw="interface"]' ); // stop MediaWiki's own rollback.js from interfering @TODO when that script becomes more intelligent, a lot of this code will be unnecessary

			$link
				.addClass( 'rollback' )
				.attr( 'nopopup', 1 ) // stop NavPopups from interfering
				.attr( 'data-mw', false ) // stop MW rollback.js even if it's loaded late
				.click( clickHandler );
				
			// if NavPopups was loaded first, the link is already processed and nopopup is ignored, we need to unprocess it
			removeTooltip( $link );
			
			if ( isAdmin ) {
				$botLink = $( '<a>' ).attr( {
					title: 'واگردانی با پرچم ربات',
					href: $link.attr( 'href' ).replace( '&action=rollback', '&action=rollback&bot=1' ),
					class: 'bot-rollback',
					nopopup: 1
				} );
				
				$botLink
					.text( 'ربات' )
					.click( clickHandler );
				$link
					.after( $botLink )
					.after( ' | ' );
			}
		} );
	}
		
	/**
	 * Sets up a "rollback all" button
	 */
	function installButton() {
		var $rollbackAllDiv = $( '<div>' ).css( 'float', 'right' );

		$rollbackAllDiv.appendTo( '.firstHeading' ).append(
			$( '<button>' )
				.attr( 'id', 'rollback-all' )
				.text( 'واگردانی همه ویرایش‌ها' )
				.click( rollbackAll )
		);
	}
	
	/**
	 * Main setup function
	 */
	function install() {
		if ( mw.config.get( 'wgAction' ) === 'history' || mw.config.get( 'wgCanonicalNamespace' ) === 'Special' ) {
			installLinks();
			if ( mw.config.get( 'wgCanonicalSpecialPageName' ) === 'Contributions' ) {
				installButton();
			}
		}
	}
	
	$( install );
} ) ( jQuery, mediaWiki );