MediaWiki:Gadget-twinklebatchundelete.js

// <nowiki>


(function($) {


/*
 ****************************************
 *** twinklebatchundelete.js: Batch undelete module
 ****************************************
 * Mode of invocation:     Tab ("Phục hồi hàng loạt")
 * Active on:              Existing user and project pages (các trang dự án và người dùng đang tồn tại)
 */


Twinkle.batchundelete = function twinklebatchundelete() {
	if ((!Morebits.userIsSysop && !Morebits.userIsInGroup('eliminator')) || !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, 'Phục hồi hàng loạt', 'tw-batch-undel', 'Phục hồi hàng loạt các trang');
};

Twinkle.batchundelete.callback = function twinklebatchundeleteCallback() {
	var Window = new Morebits.simpleWindow(600, 400);
	Window.setScriptName('Twinkle');
	Window.setTitle('Phục hồi hàng loạt');
	Window.addFooterLink('Trợ giúp Twinkle', 'WP:TW/DOC#phục_hồi_hàng_loạt');

	var form = new Morebits.quickForm(Twinkle.batchundelete.callback.evaluate);
	form.append({
		type: 'checkbox',
		list: [
			{
				label: 'Khôi phục các trang thảo luận của các trang chưa bị xóa nếu chúng tồn tại',
				name: 'undel_talk',
				value: 'undel_talk',
				checked: true
			}
		]
	});
	form.append({
		type: 'input',
		name: 'reason',
		label: 'Reason: ',
		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('Đang lấy danh sách trang');
	var wikipedia_api = new Morebits.wiki.api('đang tải...', query, function(apiobj) {
		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 ? ' (khóa tạo trang hoàn toàn' +
					($editprot.attr('expiry') === 'infinity' ? ' indefinitely' : ', hết hạn ' + new Morebits.date($editprot.attr('expiry')).calendar('utc') + ' (UTC)') + ')' : ''),
				value: title,
				checked: true,
				style: isProtected ? 'color:red' : ''
			});
		});
		apiobj.params.form.append({ type: 'header', label: 'Các trang cần phục hồi' });
		apiobj.params.form.append({
			type: 'button',
			label: 'Chọn tất cả',
			event: function(e) {
				$(Morebits.quickForm.getElements(e.target.form, 'pages')).prop('checked', true);
			}
		});
		apiobj.params.form.append({
			type: 'button',
			label: 'Bỏ chọn tất cả',
			event: function(e) {
				$(Morebits.quickForm.getElements(e.target.form, 'pages')).prop('checked', false);
			}
		});
		apiobj.params.form.append({
			type: 'checkbox',
			name: 'pages',
			shiftClickSupport: true,
			list: list
		});
		apiobj.params.form.append({ type: 'submit' });

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

	}, statelem);
	wikipedia_api.params = { form: form, Window: Window };
	wikipedia_api.post();
};

Twinkle.batchundelete.callback.evaluate = function(event) {
	Morebits.wiki.actionCompleted.notice = 'Phục hồi hàng loạt hiện đã hoàn tất';

	var numProtected = Morebits.quickForm.getElements(event.target, 'pages').filter(function(element) {
		return element.checked && element.nextElementSibling.style.color === 'red';
	}).length;
	if (numProtected > 0 && !confirm('Bạn sắp phục hồi ' + numProtected + ' (các) trang hoàn toàn được bảo vệ. Bạn có chắc không?')) {
		return;
	}

	var input = Morebits.quickForm.getInputData(event.target);

	if (!input.reason) {
		alert('Bạn cần phải đưa ra một lý do!');
		return;
	}
	Morebits.simpleWindow.setButtonsEnabled(false);
	Morebits.status.init(event.target);

	if (!input.pages || !input.pages.length) {
		Morebits.status.error('Lỗi', 'không có gì để xóa, đang dừng thực hiện');
		return;
	}

	var pageUndeleter = new Morebits.batchOperation('Các trang cần phục hồi');
	pageUndeleter.setOption('chunkSize', Twinkle.getPref('batchChunks'));
	pageUndeleter.setOption('preserveIndividualStatusLines', true);
	pageUndeleter.setPageList(input.pages);
	pageUndeleter.run(function(pageName) {
		var params = {
			page: pageName,
			undel_talk: input.undel_talk,
			reason: input.reason,
			pageUndeleter: pageUndeleter
		};

		var wikipedia_page = new Morebits.wiki.page(pageName, 'Phục hồi trang ' + pageName);
		wikipedia_page.setCallbackParameters(params);
		wikipedia_page.setEditSummary(input.reason);
		wikipedia_page.setChangeTags(Twinkle.changeTags);
		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('Đang kiểm tra trang thảo luận để tìm các phiên bản sửa đổi bị xóa', query, Twinkle.batchundelete.callbacks.undeleteTalk);
				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, 'Đang phục hồi trang thảo luận của ' + apiobj.params.page);
		page.setEditSummary('Đang phục hồi [[Help:Talk page|trang thảo luận]] của "' + apiobj.params.page + '"');
		page.setChangeTags(Twinkle.changeTags);
		page.undeletePage();
	}
};

Twinkle.addInitCallback(Twinkle.batchundelete, 'batchundelete');
})(jQuery);


// </nowiki>
Chúng tôi bán
Bài viết liên quan
Tại vì sao lyrics nhạc MCK suy nhưng vẫn hay đến như vậy?
Tại vì sao lyrics nhạc MCK suy nhưng vẫn hay đến như vậy?
Nger vốn gắn liền với những bản tình ca, nổi nhất với lũ GenZ đời đầu chúng tôi khi đó là “Tình đắng như ly cafe” ft cùng Nân
Doctor Who và Giáng sinh
Doctor Who và Giáng sinh
Tồn tại giữa thăng trầm trong hơn 50 năm qua, nhưng mãi đến đợt hồi sinh mười năm trở lại đây
Seeker: lực lượng chiến đấu tinh nhuệ bậc nhất của phe Decepticon Transformers
Seeker: lực lượng chiến đấu tinh nhuệ bậc nhất của phe Decepticon Transformers
Seeker (Kẻ dò tìm) là thuật ngữ dùng để chỉ một nhóm các người lính phản lực của Decepticon trong The Transformers
Cái nhìn tổng quát về Kokomi - Genshin Impact
Cái nhìn tổng quát về Kokomi - Genshin Impact
Dựa vào một số thay đổi, hiện giờ nguồn sát thương chính của Kokomi sẽ không dựa vào Bake Kurage (kỹ năng nguyên tố/E) mà sẽ từ những đòn đánh thường