MediaWiki:Common.js/RenameWizard.js

Материал из Wikivoyage

Замечание: Возможно, после публикации вам придётся очистить кэш своего браузера, чтобы увидеть изменения.

  • Firefox / Safari: Удерживая клавишу Shift, нажмите на панели инструментов Обновить либо нажмите Ctrl+F5 или Ctrl+R (⌘+R на Mac)
  • Google Chrome: Нажмите Ctrl+Shift+R (⌘+Shift+R на Mac)
  • Internet Explorer / Edge: Удерживая Ctrl, нажмите Обновить либо нажмите Ctrl+F5
  • Opera: Нажмите Ctrl+F5.
/**
 * Rename Wizard Tools
 */
 
 
var wvRenameWizardPhrases = {
	'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': '"',
	'icon-ok': '<img src="https://upload.wikimedia.org/wikipedia/commons/thumb/a/ac/Approve_icon.svg/30px-Approve_icon.svg.png"></img>',
	'icon-bad': '<img src="https://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="https://upload.wikimedia.org/wikipedia/commons/d/de/Ajax-loader.gif"></img></div>',
}
 
 
function wvRenameWizard() {
 
	this.requestFromName = '';
	this.requestToName = '';
	this.requestWikis = {};
	this.requestText = '';
 
	this.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',
	};
 
	this.setupCurrentInfo = function( divid ) {
		var currentSite = mw.config.get( 'wgSiteName' );
		var currentUser =  mw.config.get( 'wgUserName' );
		if ( currentUser == null ) {
			var infobox = $( "#"+divid );
			infobox.html( '' );
			infobox.append( $('<p></p>').text( wvRenameWizardPhrases['current-info-anonymous'] ) );
		} else {
			this.getGlobalInfo( currentUser, divid, this.fillGlobalInfo );
		}
	}
 
 
	this.fillGlobalInfo = function( divid, username, guid, regDate, homeWiki, attachedWikis, unatachedWikis ) {
 
		var currentSite = mw.config.get( 'wgSiteName' );
		var infobox = $( "#"+divid );
		var attachedMsg = '';
 
		infobox.html( '' );
		infobox.append( $('<h3></h3>').text( wvRenameWizardPhrases['input-username'] + username ) );
 
 
		if ( guid > 0 ) {
			if ( attachedWikis[currentSite] == null ) {
				// Global account exists, but is not attached here so we assume this user cannot use it
				attachedMsg = wvRenameWizardPhrases['merge-status-notavailable'];
			} else {
				// Global account exists, and it's attached here, so we assume it belongs to this user
				attachedMsg = wvRenameWizardPhrases['merge-status-merged'];
			}
 
			var userdata = $('<ul></ul>');
			userdata.append( $('<li></li>').text( wvRenameWizardPhrases['info-status'] + attachedMsg ) );
			userdata.append( $('<li></li>').text( wvRenameWizardPhrases['info-gid'] + guid ) );
			userdata.append( $('<li></li>').text( wvRenameWizardPhrases['info-date'] + regDate ) );
			//userdata.append( $('<li></li>').text( wvRenameWizardPhrases['info-homewiki'] + homeWiki ) );
			infobox.append( userdata );
 
			var currentWikiStatus = {
				'enwikivoyage': wvRenameWizardPhrases['mergestatus-dne'],
				'dewikivoyage':wvRenameWizardPhrases['mergestatus-dne'],
				'itwikivoyage':wvRenameWizardPhrases['mergestatus-dne'],
				'svwikivoyage':wvRenameWizardPhrases['mergestatus-dne'],
				'nlwikivoyage':wvRenameWizardPhrases['mergestatus-dne'],
				'enwiki83':wvRenameWizardPhrases['mergestatus-dne'],
				'dewiki83':wvRenameWizardPhrases['mergestatus-dne']
			};
 
			var allWikis = window.gRW.allWikis;
 
			for ( var ndx = 0; ndx < attachedWikis.length; ++ndx ) {
				currentWikiStatus[ attachedWikis[ndx]['wiki'] ] = wvRenameWizardPhrases['mergestatus-attached'];
			}
 
			for ( var ndx = 0; ndx < unatachedWikis.length; ++ndx ) {
				currentWikiStatus[ unatachedWikis[ndx]['wiki'] ] = wvRenameWizardPhrases['mergestatus-unattached'];
			}
 
			var wikistatus = $('<ul></ul>');
 
			for (var wiki in allWikis) {
				wikistatus.append( $('<li></li>').text( allWikis[wiki] + ": " + currentWikiStatus[wiki] ) );
			}
			infobox.append( $('<p></p>').text('Wikis') );
			infobox.append( wikistatus );
		} else {
			infobox.append( $('<p></p>').text( wvRenameWizardPhrases['result-username-nonexist'] ) );
		}
 
	}
 
	this.showSearchResult = function( divid, username, guid, regDate, homeWiki, attachedWikis, unatachedWikis ) {
 
		var searchbox = $( "#"+divid );
		searchbox.html( '' );
		searchbox.append( $('<h3></h3>').text( wvRenameWizardPhrases['result-label-username'] + username ) );
 
		if ( guid == 0 ) {
			searchbox.append( $( wvRenameWizardPhrases['icon-ok'] ) );
			searchbox.append( $( '<p></p>' ).text( wvRenameWizardPhrases['result-username-available'] ) );
 
			var createLink = $( '<a></a>' );
			createLink.attr( 'href', "index.php?title=Special:UserLogin&type=signup&wpName=" + username );
			createLink.text( wvRenameWizardPhrases['action-link-createaccount'] );
			searchbox.append( createLink );
 
		} else {
			searchbox.append( $( wvRenameWizardPhrases['icon-bad'] ) );
			searchbox.append( $( '<p></p>' ).text( wvRenameWizardPhrases['result-username-unavailable'] ) );
		}
 
	}
 
	this.fillRequest = function( divid, username, guid, regDate, homeWiki, attachedWikis, unatachedWikis ) {
 
		window.gRW.requestFromName = username;
		window.gRW.requestWikis = unatachedWikis;
		window.gRW.requestText = window.gRW.createRequestText( username, window.gRW.requestToName, unatachedWikis );
 
		var reqbox = $( "#"+divid );
		reqbox.html( '' );
 
		reqbox.append( $('<p></p>').text( wvRenameWizardPhrases['result-label-confirmpost'] ) );
 
		var requestLines = window.gRW.requestText.split("\n");
 
		for ( var ndx = 0; ndx < requestLines.length; ++ndx ) {
			reqbox.append( $('<p></p>').text( requestLines[ndx] ) );
		}
 
		var confLink = $( '<a></a>' );
		confLink.attr('href', 'javascript:postRenameRequest( "renameWizardMergeConfirm" )' );
		confLink.text( wvRenameWizardPhrases['action-link-confirm'] );
 
		reqbox.append( confLink );
	}
 
	this.createRequestText = function (  fromname, toname, wikis ) {
		var currUser = mw.user.getName();
		var ret = "== " + wvRenameWizardPhrases['req-text-title'] + " '"+fromname+"' > '"+toname+"' ==\n";
		ret += wvRenameWizardPhrases['req-text-user'] + currUser + wvRenameWizardPhrases['req-text-action1'] + fromname + wvRenameWizardPhrases['req-text-action2'] + toname;
 
		ret += wvRenameWizardPhrases['req-text-wikilist'] + "\n";
		/* for ( ndx = 0; ndx < wikis.length; ++ndx ) {
			ret += '* ' + wikis[ndx]['wiki'] + "\n";
		} */
 
		return ret;
	}
 
 
	/**
	 * Get data about the CentralAuth (global) user
	 */
	this.getGlobalInfo = function ( username, divid, callback ) {
 
	    //api.php?action=query&meta=globaluserinfo&guiuser=User1&guiprop=groups|merged|unattached&format=json
 
	    $.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 == null ) {
				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 (
				divid,
				username,
				guid,
				regdate,
				homewiki,
				merged,
				unattached
			);
		    } else {
		        alert( 'Error: Unknown result from API.' );
		    }
		},
		error: function( xhr ) {
		    alert( 'Error: Request failed.' );
		}
	    });
 
	}
 
 
	/**
	 * Taken almost verbatim from http://www.mediawiki.org/wiki/API:Edit
	 */
	this.addNewSection = function( divid, 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( divid, wvRenameWizardPhrases['result-label-status-ok'] );
		    } else if ( data && data.error ) {
		        alert( 'Error: API returned error code "' + data.error.code + '": ' + data.error.info );
			showStatus( divid, wvRenameWizardPhrases['result-label-status-error'] );
		    } else {
		        alert( 'Error: Unknown result from API.' );
			showStatus( divid, 'error2' );
		    }
		},
		error: function( xhr ) {
		    alert( 'Error: Request failed.' );
		}
	    });
	}
 
}
 
 
 
function doSearch( divid ) {
	var searchbox = $( "#"+divid );
	searchbox.html( wvRenameWizardPhrases['icon-loading'] );
	window.gRW.getGlobalInfo( $('#searchName').attr('value'), divid, window.gRW.showSearchResult )
}
 
function showUserInfo( divid ) {
	var userbox = $( "#"+divid );
	userbox.html( wvRenameWizardPhrases['icon-loading'] );
	window.gRW.getGlobalInfo( $('#altName').attr('value'), divid, window.gRW.fillGlobalInfo )
}
 
function makeRenameRequest( divid ) {
	var reqbox = $( "#"+divid );
	reqbox.html( wvRenameWizardPhrases['icon-loading'] );
	window.gRW.requestToName = $('#toname').attr('value');
	window.gRW.getGlobalInfo( $('#fromname').attr('value'), divid, window.gRW.fillRequest );
}
 
function postRenameRequest( divid ) {
	var reqbox = $( "#"+divid );
	reqbox.html( wvRenameWizardPhrases['icon-loading'] );
 
	var reqLines = window.gRW.requestText.split("\n");
	window.gRW.addNewSection( divid, 'Обсуждение_Wikivoyage:User_account_migration', reqLines[0], reqLines.slice(1).join("\n"),  mw.user.tokens.get( 'csrfToken' ) );
}
 
function showStatus( divid, message ) {
	var reqbox = $( "#"+divid );
	reqbox.html( $('<h3></h3>').text( message ) );
}
 
 
 
 
 
/**
 * Initialization function. Test if we should place the DRW on the current page.
 * Looks for a <div id="myDRW"></div> on the page.
 */
 
function runRenameWizard() {
 
 
	if ( $('#renameWizardCurrentInfo').length
		|| $('#renameWizardSearchGlobal').length
		|| $('#renameWizardSearchGlobal').length
	) {
 
		window.gRW = new wvRenameWizard();
 
		//importStylesheet('User:Steven Zhang/DRW.css'); //shared css
 
		if ( $('#renameWizardCurrentInfo').length ){
 
		        $("#renameWizardCurrentInfo").html('');
			$("#renameWizardCurrentInfo").css( 'width', '300px' );
			$("#renameWizardCurrentInfo").css( 'border', '1px black solid' );
			$("#renameWizardCurrentInfo").css( 'padding', '10px' );
			$("#renameWizardCurrentInfo").css( 'margin', '10px' );
 
			$("#renameWizardCurrentInfo").append( $('<div id="renameWizardCurrentInfoBox"></div>') );
 
			var searchBox = $('<div id=""></div>');
			searchBox.append( $('<hr width="60%"></hr>') );
			searchBox.append( $('<p>Or search for Username</p>') );
 
			var searchname = $( document.createElement('input') );
			searchname.attr({
				type: 'text',
				size: 25,
				name: 'altName',
				id: 'altName'
			});
 
			searchBox.append( searchname );
			searchBox.append( $('<a href="javascript:showUserInfo(\'renameWizardCurrentInfoBox\')"></a>').text('Search') );
			$("#renameWizardCurrentInfo").append( searchBox );
 
			window.gRW.setupCurrentInfo( "renameWizardCurrentInfoBox" );
 
		}
 
		if ( $('#renameWizardSearchGlobal').length ){
 
		        $("#renameWizardSearchGlobal").html('');
			$("#renameWizardSearchGlobal").css( 'width', '300px' );
			$("#renameWizardSearchGlobal").css( 'border', '1px black solid' );
			$("#renameWizardSearchGlobal").css( 'padding', '10px' );
			$("#renameWizardSearchGlobal").css( 'margin', '10px' );
 
			$("#renameWizardSearchGlobal").append( $('<h3>Search</h3>') );
 
			var searchname = $( document.createElement('input') );
			searchname.attr({
				type: 'text',
				size: 25,
				name: 'searchName',
				id: 'searchName'
			});
 
			$("#renameWizardSearchGlobal").append( searchname );
			$("#renameWizardSearchGlobal").append( $('<a href="javascript:doSearch(\'renameWizardSearchResult\')"></a>').text('Search') );
			$("#renameWizardSearchGlobal").append( $('<div id="renameWizardSearchResult"></div>') );
		}
 
		if ( $('#renameWizardRequestMerge').length ){
 
		        $("#renameWizardRequestMerge").html('');
			$("#renameWizardRequestMerge").css( 'width', '600px' );
			$("#renameWizardRequestMerge").css( 'border', '1px black solid' );
			$("#renameWizardRequestMerge").css( 'padding', '10px' );
			$("#renameWizardRequestMerge").css( 'margin', '10px' );
 
			var requestForm = $('<div id="renameWizardMergeForm"></div>');
 
			var fromname = $( document.createElement('input') );
			fromname.attr({
				type: 'text',
				size: 25,
				name: 'fromname',
				id: 'fromname'
			});
 
			var toname = $( document.createElement('input') );
			toname.attr({
				type: 'text',
				size: 25,
				name: 'toname',
				id: 'toname'
			});
 
			$("#renameWizardRequestMerge").append( $('<p></p>').text( wvRenameWizardPhrases['input-username-from'] ) );
			$("#renameWizardRequestMerge").append( fromname );
 
			$("#renameWizardRequestMerge").append( $('<p></p>').text( wvRenameWizardPhrases['input-username-to'] ) );
			$("#renameWizardRequestMerge").append( toname );
 
			$("#renameWizardRequestMerge").append( $('<a href="javascript:makeRenameRequest(\'renameWizardMergeConfirm\')"></a>').text( wvRenameWizardPhrases['action-link-request'] ) );
			$("#renameWizardRequestMerge").append( $('<div id="renameWizardMergeConfirm"></div>') );
 
		}
	}
};
 
 
 
$( document ).ready( runRenameWizard() );
// JavaScript Document