# MediaWiki:Gadget-twinklebatchundelete-2020.js

From faraghaib
Jump to navigation Jump to search

Note: After publishing, you may have to bypass your browser's cache to see the changes.

- Firefox / Safari: Hold Shift while clicking Reload, or press either Ctrl-F5 or Ctrl-R (⌘-R on a Mac)
- Google Chrome: Press Ctrl-Shift-R (⌘-Shift-R on a Mac)
- Edge: Hold Ctrl while clicking Refresh, or press Ctrl-F5.

    // <nowiki>

    (function($) {

    /*
     ****************************************
     *** twinklebatchundelete.js: Batch undelete module
     ****************************************
     * Mode of invocation:     Tab ("Und-batch")
     * Active on:              Existing user and project pages
     */

    Twinkle.batchundelete = function twinklebatchundelete() {
    	if (!Morebits.userIsSysop || !mw.config.get('wgArticleId') || (
    		mw.config.get('wgNamespaceNumber') !== mw.config.get('wgNamespaceIds').user &&
    		mw.config.get('wgNamespaceNumber') !== mw.config.get('wgNamespaceIds').project)) {
    		return;
    	}
    	Twinkle.addPortletLink(Twinkle.batchundelete.callback, 'احیای دسته‌جمعی', 'tw-batch-undel', "احیای چندین صفحه به طور همزمان"); // localized
    };

    Twinkle.batchundelete.callback = function twinklebatchundeleteCallback() {
    	var Window = new Morebits.simpleWindow(600, 400);
    	Window.setScriptName('توینکل'); // localized
    	Window.setTitle('احیای دسته‌جمعی'); // localizde
    	Window.addFooterLink('راهنمای توینکل', 'en:WP:TW/DOC#batchundelete'); // localized

    	var form = new Morebits.quickForm(Twinkle.batchundelete.callback.evaluate);
    	form.append({
    		type: 'checkbox',
    		list: [
    			{
    				label: 'صفحه‌های بحث مرتبط با صفحه‌های احیا شده را در صورتی که وجود داشته‌اند، احیا کن', // localized
    				name: 'undel_talk',
    				value: 'undel_talk',
    				checked: true
    			}
    		]
    	});
    	form.append({
    		type: 'input',
    		name: 'reason',
    		label: 'دلیل: ', // localized
    		size: 60
    	});

    	var statusdiv = document.createElement('div');
    	statusdiv.style.padding = '15px';  // just so it doesn't look broken
    	Window.setContent(statusdiv);
    	Morebits.status.init(statusdiv);
    	Window.display();

    	var query = {
    		'action': 'query',
    		'generator': 'links',
    		'prop': 'info',
    		'inprop': 'protection',
    		'titles': mw.config.get('wgPageName'),
    		'gpllimit': Twinkle.getPref('batchMax')
    	};
    	var statelem = new Morebits.status('تهیهٔ فهرست صفحه‌ها'); // localized
    	var wikipedia_api = new Morebits.wiki.api('در حال بارگیری...', query, function(apiobj) { // localized
    		var xml = apiobj.responseXML;
    		var $pages = $(xml).find('page[missing]');
    		var list = [];
    		$pages.each(function(index, page) {
    			var $page = $(page);
    			var title = $page.attr('title');
    			var $editprot = $page.find('pr[type="create"][level="sysop"]');
    			var isProtected = $editprot.length > 0;

    			list.push({
    				label: title + (isProtected ? ' (محافظت‌شده در برابر ایجاد' +
    					($editprot.attr('expiry') === 'infinity' ? ' به صورت بی‌پایان' : '، انقضا در ' + new Morebits.date($editprot.attr('expiry')).calendar('utc') + ' (UTC)') + ')' : ''), // localized
    				value: title,
    				checked: true,
    				style: isProtected ? 'color:red' : ''
    			});
    		});
    		apiobj.params.form.append({ type: 'header', label: 'صفحه‌ها برای احیا' }); // localized
    		apiobj.params.form.append({
    			type: 'button',
    			label: 'انتخاب همه', // localized
    			event: function(e) {
    				$(Morebits.quickForm.getElements(e.target.form, 'pages')).prop('checked', true);
    			}
    		});
    		apiobj.params.form.append({
    			type: 'button',
    			label: 'انتخاب هیچ‌کدام', // localized
    			event: function(e) {
    				$(Morebits.quickForm.getElements(e.target.form, 'pages')).prop('checked', false);
    			}
    		});
    		apiobj.params.form.append({
    			type: 'checkbox',
    			name: 'pages',
    			list: list
    		});
    		apiobj.params.form.append({ type: 'submit' });

    		var result = apiobj.params.form.render();
    		apiobj.params.Window.setContent(result);

    		Morebits.checkboxShiftClickSupport(Morebits.quickForm.getElements(result, 'pages'));
    	}, statelem);
    	wikipedia_api.params = { form: form, Window: Window };
    	wikipedia_api.post();
    };

    Twinkle.batchundelete.callback.evaluate = function(event) {
    	Morebits.wiki.actionCompleted.notice = 'احیای دسته‌جمعی کامل شد'; // localized

    	var numProtected = $(Morebits.quickForm.getElements(event.target, 'pages')).filter(function(index, element) {
    		return element.checked && element.nextElementSibling.style.color === 'red';
    	}).length;
    	if (numProtected > 0 && !confirm('شما در حال احیای ' + numProtected + ' صفحه هستید که در برابر ایجاد محافظت شده‌اند. آیا مطمئن هستید؟')) { // localized
    		return;
    	}

    	var pages = event.target.getChecked('pages');
    	var reason = event.target.reason.value;
    	var undel_talk = event.target.reason.value;
    	if (!reason) {
    		alert('باید دلیلی ارائه کنید!'); // localized
    		return;
    	}
    	Morebits.simpleWindow.setButtonsEnabled(false);
    	Morebits.status.init(event.target);

    	if (!pages) {
    		Morebits.status.error('Error', 'چیزی برای احیا موجود نیست، احیا متوقف شد'); // localized
    		return;
    	}

    	var pageUndeleter = new Morebits.batchOperation('Undeleting pages');
    	pageUndeleter.setOption('chunkSize', Twinkle.getPref('batchUndeleteChunks'));
    	pageUndeleter.setOption('preserveIndividualStatusLines', true);
    	pageUndeleter.setPageList(pages);
    	pageUndeleter.run(function(pageName) {
    		var params = {
    			page: pageName,
    			undel_talk: undel_talk,
    			reason: reason,
    			pageUndeleter: pageUndeleter
    		};

    		var wikipedia_page = new Morebits.wiki.page(pageName, 'احیای صفحهٔ ' + pageName); // localized
    		wikipedia_page.setCallbackParameters(params);
    		wikipedia_page.setEditSummary(reason + Twinkle.getPref('deletionSummaryAd'));
    		wikipedia_page.suppressProtectWarning();
    		wikipedia_page.setMaxRetries(3); // temporary increase from 2 to make batchundelete more likely to succeed [[phab:T222402]] #613
    		wikipedia_page.undeletePage(Twinkle.batchundelete.callbacks.doExtras, pageUndeleter.workerFailure);
    	});
    };

    Twinkle.batchundelete.callbacks = {
    	// this stupid parameter name is a temporary thing until I implement an overhaul
    	// of Morebits.wiki.* callback parameters
    	doExtras: function(thingWithParameters) {
    		var params = thingWithParameters.parent ? thingWithParameters.parent.getCallbackParameters() :
    			thingWithParameters.getCallbackParameters();
    		// the initial batch operation's job is to delete the page, and that has
    		// succeeded by now
    		params.pageUndeleter.workerSuccess(thingWithParameters);

    		var query, wikipedia_api;

    		if (params.undel_talk) {
    			var talkpagename = new mw.Title(params.page).getTalkPage().getPrefixedText();
    			if (talkpagename !== params.page) {
    				query = {
    					'action': 'query',
    					'prop': 'deletedrevisions',
    					'drvprop': 'ids',
    					'drvlimit': 1,
    					'titles': talkpagename
    				};
    				wikipedia_api = new Morebits.wiki.api('بررسی صفحهٔ بحث برای نسخه‌های حذف‌شده', query, Twinkle.batchundelete.callbacks.undeleteTalk); // localized
    				wikipedia_api.params = params;
    				wikipedia_api.params.talkPage = talkpagename;
    				wikipedia_api.post();
    			}
    		}
    	},
    	undeleteTalk: function(apiobj) {
    		var xml = apiobj.responseXML;
    		var exists = $(xml).find('page:not([missing])').length > 0;
    		var delrevs = $(xml).find('rev').attr('revid');

    		if (exists || !delrevs) {
    			// page exists or has no deleted revisions; forget about it
    			return;
    		}

    		var page = new Morebits.wiki.page(apiobj.params.talkPage, 'احیای صفحهٔ بحث ' + apiobj.params.page); // localized
    		page.setEditSummary('احیای [[راهنما:صفحه بحث|صفحهٔ بحث]] "' + apiobj.params.page + '"' + Twinkle.getPref('deletionSummaryAd')); // localized
    		page.undeletePage();
    	}
    };

    })(jQuery);

    // </nowiki>

Retrieved from "https://en.faraghaib.ir/w/index.php?title=MediaWiki:Gadget-twinklebatchundelete-2020.js&oldid=442"