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

از ویکی‌سفر، راهنمای آزاد سفر

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

  • فایرفاکس / سافاری: کلید Shift را نگه دارید و روی دکمهٔ Reload کلیک کنید، یا کلید‌های Ctrl-F5 یا Ctrl-R را با هم فشار دهید (در رایانه‌های اپل مکینتاش کلید‌های ⌘-R)
  • گوگل کروم: کلیدهای Ctrl+Shift+R را با هم فشار دهید (در رایانه‌های اپل مکینتاش کلید‌های ⌘-Shift-R)
  • اینترنت اکسپلورر/ Edge: کلید Ctrl را نگه‌دارید و روی دکمهٔ Refresh کلیک کنید، یا کلید‌های Ctrl-F5 را با هم فشار دهید
  • اپرا: Ctrl-F5 را بفشارید.
// <nowiki>
/**
 * Rename Wizard Tools
 * @author CSteipp, 2013
 */
/*jshint undef:true, unused:true, quotmark:"single", trailing:true, browser:true */
/*global mediaWiki, jQuery, alert */
(function (mw, $) {

var phrases = {
	'current-info-anonymous': 'Login to view, or enter a name below',
	'input-username': 'Username: ',
	'input-username-from': 'Merge from (old username): ',
	'input-username-to': 'Merge to (new username): ',
	'input-wikilist': 'On Wikis: ',
	'merge-status-notavailable': 'Global Name is Taken',
	'merge-status-merged': 'Your Account is Merged',
	'info-status': 'Status: ',
	'info-gid': 'Global Id: ',
	'info-date': 'Merge Date: ',
	'info-homewiki': 'Home Wiki: ',
	'mergestatus-dne': 'User does not exist',
	'mergestatus-attached': 'Attached',
	'mergestatus-unattached': 'Unattached',
	'result-label-username': 'Result for Username: ',
	'result-label-confirmpost': 'Your request will be submitted as follows',
	'result-label-status-ok': 'Request Submitted',
	'result-label-status-error': 'There was an error submitting your request',
	'result-username-available': 'This name is available!',
	'result-username-unavailable': 'Sorry, this name is already taken.',
	'result-username-nonexist': '(no matching global name)',
	'action-link-createaccount': 'Create Account Now',
	'action-link-confirm': 'Confirm',
	'action-link-request': 'Make Request',
	'label-section-rename': 'Request Rename',
	'req-text-title': 'Request for Rename',
	'req-text-user': 'User "',
	'req-text-action1': '" is requesting that username "',
	'req-text-action2': '" is renamed and merged with the username "',
	'req-text-wikilist': '"'
};
var templates = {
	'icon-ok': '<img src="//upload.wikimedia.org/wikipedia/commons/thumb/a/ac/Approve_icon.svg/30px-Approve_icon.svg.png"></img>',
	'icon-bad': '<img src="//upload.wikimedia.org/wikipedia/commons/thumb/4/42/Stop_x_nuvola.svg/30px-Stop_x_nuvola.svg.png"></img>',
	'icon-loading': '<div style="text-align: center"><img alt="saving report" src="//upload.wikimedia.org/wikipedia/commons/d/de/Ajax-loader.gif"></img></div>'
};

function showStatus( $div, message ) {
	$div.empty().append( $('<h3>').text( message ) );
}

var gRW = {
	requestFromName: '',
	requestToName: '',
	requestWikis: {},
	requestText: '',

	allWikis: {
		'enwikivoyage': 'en.wikivoyage.org',
		'dewikivoyage': 'de.wikivoyage.org',
		'itwikivoyage': 'it.wikivoyage.org',
		'frwikivoyage': 'fr.wikivoyage.org',
		'svwikivoyage': 'sv.wikivoyage.org',
		'nlwikivoyage': 'nl.wikivoyage.org',
		'ruwikivoyage': 'ru.wikivoyage.org'
	},

	setupCurrentInfo: function ( $infobox ) {
		if ( mw.user.isAnon() ) {
			$infobox
				.empty()
				.append( $('<p>').text( phrases['current-info-anonymous'] ) );
		} else {
			this.getGlobalInfo( mw.user.getName(), $infobox, this.fillGlobalInfo );
		}
	},


	fillGlobalInfo: function ( $infobox, username, guid, regDate, homeWiki, attachedWikis, unatachedWikis ) {
		var currentSite = mw.config.get( 'wgSiteName' );
		var attachedMsg = '';

		$infobox.empty().append( $('<h3>').text( phrases['input-username'] + username ) );


		if ( guid !== 0 ) {
			if ( attachedWikis[currentSite] === undefined ) {
				// Global account exists, but is not attached here so we assume this user cannot use it
				attachedMsg = phrases['merge-status-notavailable'];
			} else {
				// Global account exists, and it's attached here, so we assume it belongs to this user
				attachedMsg = phrases['merge-status-merged'];
			}

			var $userdata = $('<ul>')
				.append( $('<li>').text( phrases['info-status'] + attachedMsg ) )
				.append( $('<li>').text( phrases['info-gid'] + guid ) )
				.append( $('<li>').text( phrases['info-date'] + regDate ) )
				//.append( $('<li>').text( phrases['info-homewiki'] + homeWiki ) )
				;
			$infobox.append( $userdata );

			var currentWikiStatus = {
				'enwikivoyage': phrases['mergestatus-dne'],
				'dewikivoyage': phrases['mergestatus-dne'],
				'itwikivoyage': phrases['mergestatus-dne'],
				'svwikivoyage': phrases['mergestatus-dne'],
				'nlwikivoyage': phrases['mergestatus-dne'],
				'enwiki83': phrases['mergestatus-dne'],
				'dewiki83': phrases['mergestatus-dne']
			};

			var allWikis = gRW.allWikis;
			var ndx;

			for ( ndx = 0; ndx < attachedWikis.length; ++ndx ) {
				currentWikiStatus[ attachedWikis[ndx].wiki ] = phrases['mergestatus-attached'];
			}

			for ( ndx = 0; ndx < unatachedWikis.length; ++ndx ) {
				currentWikiStatus[ unatachedWikis[ndx].wiki ] = phrases['mergestatus-unattached'];
			}

			var wikistatus = $('<ul>');

			for (var wiki in allWikis) {
				wikistatus.append( $('<li>').text( allWikis[wiki] + ': ' + currentWikiStatus[wiki] ) );
			}
			$infobox.append( $('<p>').text('Wikis') );
			$infobox.append( wikistatus );
		} else {
			$infobox.append( $('<p>').text( phrases['result-username-nonexist'] ) );
		}

	},

	showSearchResult: function ( $searchbox, username, guid ) {
		$searchbox.empty().append( $('<h3>').text( phrases['result-label-username'] + username ) );

		if ( guid === 0 ) {

			var createLink = $( '<a>' )
			.attr( 'href', mw.config.get('wgScriptPath') + '/index.php?title=Special:UserLogin&type=signup&wpName=' + encodeURIComponent( username ) )
			.text( phrases['action-link-createaccount'] );

			$searchbox
			.append( $( templates['icon-ok'] ) )
			.append( $( '<p>' ).text( phrases['result-username-available'] ) )
			.append( createLink );

		} else {
			$searchbox.append( $( templates['icon-bad'] ) );
			$searchbox.append( $( '<p>' ).text( phrases['result-username-unavailable'] ) );
		}
	},

	fillRequest: function ( $reqbox, username, guid, regDate, homeWiki, attachedWikis, unatachedWikis ) {
		gRW.requestFromName = username;
		gRW.requestWikis = unatachedWikis;
		gRW.requestText = gRW.createRequestText( username, gRW.requestToName, unatachedWikis );

		$reqbox.empty().append( $('<p>').text( phrases['result-label-confirmpost'] ) );

		var requestLines = gRW.requestText.split('\n');

		for ( var ndx = 0; ndx < requestLines.length; ++ndx ) {
			$reqbox.append( $('<p>').text( requestLines[ndx] ) );
		}

		var $confLink = $( '<a>' )
		.on('click', function () {
			$reqbox.html( templates['icon-loading'] );

			var reqLines = gRW.requestText.split('\n');
			gRW.addNewSection( $reqbox, 'Wikivoyage_talk:User_account_migration', reqLines[0], reqLines.slice(1).join('\n'), mw.user.tokens.get( 'csrfToken' ) );
		} )
		.text( phrases['action-link-confirm'] );

		$reqbox.append( $confLink );
	},

	createRequestText: function ( fromname, toname ) {
		var currUser = mw.user.getName();
		return '== ' + phrases['req-text-title'] + ' "' + fromname + '" > "' + toname + '" ==\n' +
			phrases['req-text-user'] + currUser +
			phrases['req-text-action1'] + fromname +
			phrases['req-text-action2'] + toname +
			phrases['req-text-wikilist'] + ' [[کاربر:Krinkle|Krinkle]] ([[بحث کاربر:Krinkle|بحث]]) ‏۲۴ سپتامبر ۲۰۱۹، ساعت ۲۲:۲۰ (UTC)' +
			'\n';
	},

	/**
	 * Get data about the CentralAuth (global) user
	 */
	getGlobalInfo: function ( username, $div, callback ) {
		$.ajax({
			url: mw.util.wikiScript( 'api' ),
			data: {
				format: 'json',
				action: 'query',
				meta: 'globaluserinfo',
				guiuser: username,
				guiprop: 'merged|unattached'
			},
			dataType: 'json',
			type: 'GET',
			success: function ( data ) {
				if ( data && data.query && data.query.globaluserinfo ) {
					var guid = 0;
					var regdate = '';
					var homewiki = '';
					var merged = false;
					var unattached = false;

					if ( data.query.globaluserinfo.missing === undefined ) {
						guid = data.query.globaluserinfo.id;
						regdate = data.query.globaluserinfo.registration;
						homewiki = data.query.globaluserinfo.home;
						merged = data.query.globaluserinfo.merged;
						unattached = data.query.globaluserinfo.unattached;
					}

					callback(
						$div,
						username,
						guid,
						regdate,
						homewiki,
						merged,
						unattached
					);
				} else {
					alert( 'Error: Unknown result from API.' );
				}
			},
			error: function () {
				alert( 'Error: Request failed.' );
			}
		});
	},

	/**
	 * Taken almost verbatim from http://www.mediawiki.org/wiki/API:Edit
	 */
	addNewSection: function ( $div, pagetitle, summary, content, editToken ) {
		$.ajax({
			url: mw.util.wikiScript( 'api' ),
			data: {
				format: 'json',
				action: 'edit',
				title: pagetitle,
				section: 'new',
				summary: summary,
				text: content,
				token: editToken
			},
			dataType: 'json',
			type: 'POST',
			success: function ( data ) {
				if ( data && data.edit && data.edit.result == 'Success' ) {
					showStatus( $div, phrases['result-label-status-ok'] );
				} else if ( data && data.error ) {
					alert( 'Error: API returned error code "' + data.error.code + '": ' + data.error.info );
					showStatus( $div, phrases['result-label-status-error'] );
				} else {
					alert( 'Error: Unknown result from API.' );
					showStatus( $div, 'error2' );
				}
			},
			error: function () {
				alert( 'Error: Request failed.' );
			}
		});
	}
};


/**
 * Initialization function. Test if we should place the DRW on the current page.
 */
function runRenameWizard() {
	var $nameInput, $nameResult,
		$nameContainer = $('#renameWizardCurrentInfo'),
		$searchInput, $searchResult,
		$searchContainer = $('#renameWizardSearchGlobal'),
		$mergeResult, $mergeFromInput, $mergeToInput,
		$mergeContainer = $('#renameWizardRequestMerge');

	if ( !$nameContainer.length && !$searchContainer.length && !$mergeContainer.length ) {
		return;
	}

	if ( $nameContainer.length ) {

			$nameInput = $('<input>').attr('size', 25);
			$nameResult = $('<div id="renameWizardCurrentInfoBox"></div>');

			$nameContainer
				.empty()
				.css({
					width: '300px',
					border: '1px black solid',
					padding: '10px',
					margin: '10px'
				})
				.append( $nameResult )
				.append(
					$('<div>')
						.append(
							$('<hr width="60%"></hr>'),
							$('<p>Or search for Username</p>'),
							$nameInput,
							$('<a>').text('Search').on('click', function () {
								$nameResult.html( templates['icon-loading'] );
								gRW.getGlobalInfo( $nameInput.val(), $nameResult, gRW.fillGlobalInfo );
							})
						)
				);

			// Asynchronously start fetching the info for the current user (if logged-in)
			gRW.setupCurrentInfo( $nameResult );
	}

	if ( $searchContainer.length ) {

			$searchInput = $('<input>').attr('size', 25);
			$searchResult = $('<div id="renameWizardSearchResult"></div>');

			$searchContainer
				.empty()
				.css({
					width: '300px',
					border: '1px black solid',
					padding: '10px',
					margin: '10px'
				})
				.append(
					$('<h3>Search</h3>'),
					$searchInput,
					$('<a>').text('Search').on('click', function () {
						$searchResult.html( templates['icon-loading'] );
						gRW.getGlobalInfo( $searchInput.val(), $searchResult, gRW.showSearchResult );
					}),
					$searchResult
				);
	}

	if ( $mergeContainer.length ) {

			$mergeFromInput = $('<input>').attr('size', 25);
			$mergeToInput = $('<input>').attr('size', 25);
			$mergeResult = $('<div id="renameWizardMergeConfirm"></div>');

			$mergeContainer
				.empty()
				.css({
					width: '600px',
					border: '1px black solid',
					padding: '10px',
					margin: '10px'
				})
				.append( $('<p>').text( phrases['input-username-from'] ) )
				.append( $mergeFromInput )
				.append( $('<p>').text( phrases['input-username-to'] ) )
				.append( $mergeToInput )
				.append( $('<a>')
					.text( phrases['action-link-request'] )
					.on('click', function () {
						$mergeResult.html( templates['icon-loading'] );
						gRW.requestToName = $mergeToInput.val();
						gRW.getGlobalInfo( $mergeFromInput.val(), $mergeResult, gRW.fillRequest );
					})
				)
				.append( $mergeResult );
	}
}

// Expose as global variable (TODO: Why? Is this used elsewhere?)
window.gRW = gRW;

$( document ).ready( runRenameWizard );

}(mediaWiki, jQuery));