مدیاویکی:Gadget-twinklebatchprotect-2020.js: تفاوت میان نسخه‌ها

از ویکی حقوق
پرش به ناوبری پرش به جستجو
جز (۱ نسخه واردشده)
جز (۱ نسخه واردشده)
 
(یک نسخهٔ میانی ویرایش شده توسط یک کاربر دیگر نشان داده نشد)
خط ۴۰۷: خط ۴۰۷:
'titles': pageName
'titles': pageName
};
};
var wikipedia_api = new Morebits.wiki.api('بررسی موجود بودن صفحه' + pageName + '', query, // localized
var wikipedia_api = new Morebits.wiki.api('بررسی موجود بودن صفحهٔ ' + pageName, query, // localized
Twinkle.batchprotect.callbacks.main, null, batchOperation.workerFailure);
Twinkle.batchprotect.callbacks.main, null, batchOperation.workerFailure);
wikipedia_api.params = {
wikipedia_api.params = {

نسخهٔ کنونی تا ‏۲۲ ژوئن ۲۰۲۱، ساعت ۲۱:۳۳

// <nowiki>


(function($) {


/*
 ****************************************
 *** twinklebatchprotect.js: Batch protect module (sysops only)
 ****************************************
 * Mode of invocation:     Tab ("P-batch")
 * Active on:              Existing project pages and user pages; existing and
 *                         non-existing categories; Special:PrefixIndex
 */


Twinkle.batchprotect = function twinklebatchprotect() {
	if (Morebits.userIsSysop && ((mw.config.get('wgArticleId') > 0 && (mw.config.get('wgNamespaceNumber') === 2 ||
		mw.config.get('wgNamespaceNumber') === 4)) || mw.config.get('wgNamespaceNumber') === 14 ||
		mw.config.get('wgCanonicalSpecialPageName') === 'Prefixindex')) {
		Twinkle.addPortletLink(Twinkle.batchprotect.callback, 'محافظت دسته‌جمعی', 'tw-pbatch', 'محافظت صفحه‌هایی که از این صفحه پیوند دارند'); // localized
	}
};

Twinkle.batchprotect.unlinkCache = {};
Twinkle.batchprotect.callback = function twinklebatchprotectCallback() {
	var Window = new Morebits.simpleWindow(600, 400);
	Window.setTitle('محافظت دسته‌جمعی'); // localized
	Window.setScriptName('توینکل'); // localized
	Window.addFooterLink('سیاست حفاظت از صفحه‌ها', 'وپ:حفاظت'); // localized
	Window.addFooterLink('راهنمای توینکل', 'en:WP:TW/DOC#protect'); // localized

	var form = new Morebits.quickForm(Twinkle.batchprotect.callback.evaluate);
	form.append({
		type: 'checkbox',
		name: 'editmodify',
		event: Twinkle.protect.formevents.editmodify,
		list: [
			{
				label: 'تغییر حفاظت در برابر ویرایش', // localized
				value: 'editmodify',
				tooltip: 'فقط برای صفحه‌های از پیش موجود.', // localized
				checked: true
			}
		]
	});
	var editlevel = form.append({
		type: 'select',
		name: 'editlevel',
		label: 'حفاظت در برابر ویرایش:', // localized
		event: Twinkle.protect.formevents.editlevel
	});
	editlevel.append({
		type: 'option',
		label: 'همه', // localized
		value: 'all'
	});
	editlevel.append({
		type: 'option',
		label: 'تأییدشدهٔ خودکار', // localized
		value: 'autoconfirmed'
	});
	editlevel.append({
		type: 'option',
		label: 'تأییدشدهٔ پایدار', // localized
		value: 'extendedconfirmed'
	});
	editlevel.append({
		type: 'option',
		label: 'ویرایشگر الگو', // localized
		value: 'templateeditor'
	});
	editlevel.append({
		type: 'option',
		label: 'مدیر', // localized
		value: 'sysop',
		selected: true
	});
	form.append({
		type: 'select',
		name: 'editexpiry',
		label: 'زمان سرآمدن:', // localized
		event: function(e) {
			if (e.target.value === 'custom') {
				Twinkle.protect.doCustomExpiry(e.target);
			}
		},
		list: [
			{ label: '۱ ساعت', value: '1 hour' }, // localized
			{ label: '۲ ساعت', value: '2 hours' }, // localized
			{ label: '۳ ساعت', value: '3 hours' }, // localized
			{ label: '۶ ساعت', value: '6 hours' }, // localized
			{ label: '۱۲ ساعت', value: '12 hours' }, // localized
			{ label: '۱ روز', value: '1 day' }, // localized
			{ label: '۲ روز', selected: true, value: '2 days' }, // localized
			{ label: '۳ روز', value: '3 days' }, // localized
			{ label: '۴ روز', value: '4 days' }, // localized
			{ label: '۱ هفته', value: '1 week' }, // localized
			{ label: '۲ هفته', value: '2 weeks' }, // localized
			{ label: '۱ ماه', value: '1 month' }, // localized
			{ label: '۲ ماه', value: '2 months' }, // localized
			{ label: '۳ ماه', value: '3 months' }, // localized
			{ label: '۱ سال', value: '1 year' }, // localized
			{ label: 'بی‌پایان', value: 'indefinite' }, // localized
			{ label: 'سفارشی...', value: 'custom' } // localized
		]
	});

	form.append({
		type: 'checkbox',
		name: 'movemodify',
		event: Twinkle.protect.formevents.movemodify,
		list: [
			{
				label: 'تغییر حفاظت در برابر انتقال', // localized
				value: 'movemodify',
				tooltip: 'فقط برای صفحه‌های از پیش موجود.', // localized
				checked: true
			}
		]
	});
	var movelevel = form.append({
		type: 'select',
		name: 'movelevel',
		label: 'حفاظت در برابر انتقال:', // localized
		event: Twinkle.protect.formevents.movelevel
	});
	movelevel.append({
		type: 'option',
		label: 'همه', // localized
		value: 'all'
	});
	movelevel.append({
		type: 'option',
		label: 'تأییدشدهٔ پایدار', // localized
		value: 'extendedconfirmed'
	});
	movelevel.append({
		type: 'option',
		label: 'ویرایشگر الگو', // localized
		value: 'templateeditor'
	});
	movelevel.append({
		type: 'option',
		label: 'مدیر', // localized
		value: 'sysop',
		selected: true
	});
	form.append({
		type: 'select',
		name: 'moveexpiry',
		label: 'زمان سرآمدن:', // localized
		event: function(e) {
			if (e.target.value === 'custom') {
				Twinkle.protect.doCustomExpiry(e.target);
			}
		},
		list: [
			{ label: '۱ ساعت', value: '1 hour' }, // localized
			{ label: '۲ ساعت', value: '2 hours' }, // localized
			{ label: '۳ ساعت', value: '3 hours' }, // localized
			{ label: '۶ ساعت', value: '6 hours' }, // localized
			{ label: '۱۲ ساعت', value: '12 hours' }, // localized
			{ label: '۱ روز', value: '1 day' }, // localized
			{ label: '۲ روز', selected: true, value: '2 days' }, // localized
			{ label: '۳ روز', value: '3 days' }, // localized
			{ label: '۴ روز', value: '4 days' }, // localized
			{ label: '۱ هفته', value: '1 week' }, // localized
			{ label: '۲ هفته', value: '2 weeks' }, // localized
			{ label: '۱ ماه', value: '1 month' }, // localized
			{ label: '۲ ماه', value: '2 months' }, // localized
			{ label: '۳ ماه', value: '3 months' }, // localized
			{ label: '۱ سال', value: '1 year' }, // localized
			{ label: 'بی‌پایان', value: 'indefinite' }, // localized
			{ label: 'سفارشی...', value: 'custom' } // localized
		]
	});

	form.append({
		type: 'checkbox',
		name: 'createmodify',
		event: function twinklebatchprotectFormCreatemodifyEvent(e) {
			e.target.form.createlevel.disabled = !e.target.checked;
			e.target.form.createexpiry.disabled = !e.target.checked || (e.target.form.createlevel.value === 'all');
			e.target.form.createlevel.style.color = e.target.form.createexpiry.style.color = e.target.checked ? '' : 'transparent';
		},
		list: [
			{
				label: 'تغییر حفاظت در برابر ایجاد', // localized
				value: 'createmodify',
				tooltip: 'فقط برای صفحه‌هایی که موجود نیستند.', // localized
				checked: true
			}
		]
	});
	var createlevel = form.append({
		type: 'select',
		name: 'createlevel',
		label: 'حفاظت در برابر ایجاد:', // localized
		event: Twinkle.protect.formevents.createlevel
	});
	createlevel.append({
		type: 'option',
		label: 'همه', // localized
		value: 'all'
	});
	createlevel.append({
		type: 'option',
		label: 'تأییدشده خودکار', // localized
		value: 'autoconfirmed'
	});
	createlevel.append({
		type: 'option',
		label: 'تأییدشده پایدار', // localized
		value: 'extendedconfirmed'
	});
	createlevel.append({
		type: 'option',
		label: 'ویرایشگر الگو', // localized
		value: 'templateeditor'
	});
	createlevel.append({
		type: 'option',
		label: 'مدیر', // localized
		value: 'sysop',
		selected: true
	});
	form.append({
		type: 'select',
		name: 'createexpiry',
		label: 'زمان سرآمدن:', // localized
		event: function(e) {
			if (e.target.value === 'custom') {
				Twinkle.protect.doCustomExpiry(e.target);
			}
		},
		list: [
			{ label: '۱ ساعت', value: '1 hour' }, // localized
			{ label: '۲ ساعت', value: '2 hours' }, // localized
			{ label: '۳ ساعت', value: '3 hours' }, // localized
			{ label: '۶ ساعت', value: '6 hours' }, // localized
			{ label: '۱۲ ساعت', value: '12 hours' }, // localized
			{ label: '۱ روز', value: '1 day' }, // localized
			{ label: '۲ روز', value: '2 days' }, // localized
			{ label: '۳ روز', value: '3 days' }, // localized
			{ label: '۴ روز', value: '4 days' }, // localized
			{ label: '۱ هفته', value: '1 week' }, // localized
			{ label: '۲ هفته', value: '2 weeks' }, // localized
			{ label: '۱ ماه', value: '1 month' }, // localized
			{ label: '۲ ماه', value: '2 months' }, // localized
			{ label: '۳ ماه', value: '3 months' }, // localized
			{ label: '۱ سال', value: '1 year' }, // localized
			{ label: 'بی‌پایان', selected: true, value: 'indefinite' }, // localized
			{ label: 'سفارشی...', value: 'custom' } // localized
		]
	});

	form.append({
		type: 'header',
		label: ''  // horizontal rule
	});
	form.append({
		type: 'input',
		name: 'reason',
		label: 'دلیل: ', // localized
		size: 60,
		tooltip: 'برای سیاههٔ حفاظت و تاریخچهٔ صفحه.' // localized
	});

	var query = {
		'action': 'query',
		'prop': 'revisions|info',
		'rvprop': 'size',
		'inprop': 'protection'
	};

	if (mw.config.get('wgNamespaceNumber') === 14) {  // categories
		query.generator = 'categorymembers';
		query.gcmtitle = mw.config.get('wgPageName');
		query.gcmlimit = Twinkle.getPref('batchMax');
	} else if (mw.config.get('wgCanonicalSpecialPageName') === 'Prefixindex') {
		query.generator = 'allpages';
		query.gapnamespace = mw.util.getParamValue('namespace') || $('select[name=namespace]').val();
		query.gapprefix = mw.util.getParamValue('prefix') || $('input[name=prefix]').val();
		query.gaplimit = Twinkle.getPref('batchMax');
	} else {
		query.generator = 'links';
		query.titles = mw.config.get('wgPageName');
		query.gpllimit = Twinkle.getPref('batchMax');
	}

	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 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');
		var list = [];
		$pages.each(function(index, page) {
			var $page = $(page);
			var title = $page.attr('title');
			var isRedir = $page.attr('redirect') === ''; // XXX ??
			var missing = $page.attr('missing') === ''; // XXX ??
			var size = $page.find('rev').attr('size');
			var $editProt;

			var metadata = [];
			if (missing) {
				metadata.push('صفحهٔ ناموجود'); // localized
				$editProt = $page.find('pr[type="create"][level="sysop"]');
			} else {
				if (isRedir) {
					metadata.push('تغییرمسیر'); // localized
				}
				metadata.push(mw.language.convertNumber(size) + ' بایت'); // localized
				$editProt = $page.find('pr[type="edit"][level="sysop"]');
			}
			if ($editProt.length > 0) {
				metadata.push('محافظت کامل' + (missing ? ' در برابر ایجاد' : '') + // localized
				($editProt.attr('expiry') === 'infinity' ? ' بی‌پایان' : '، سرآمدن در ' + new Morebits.date($editProt.attr('expiry')).calendar('utc') + ' (UTC)')); // localized
			}

			list.push({ label: title + (metadata.length ? ' (' + metadata.join('; ') + ')' : ''), value: title, checked: true, style: $editProt.length > 0 ? 'color:red' : '' });
		});
		form.append({ type: 'header', label: 'صفحه‌هایی که محافظت خواهند شد' }); // localized
		form.append({
			type: 'button',
			label: 'انتخاب همه', // localized
			event: function(e) {
				$(Morebits.quickForm.getElements(e.target.form, 'pages')).prop('checked', true);
			}
		});
		form.append({
			type: 'button',
			label: 'انتخاب هیچ‌کدام', // localized
			event: function(e) {
				$(Morebits.quickForm.getElements(e.target.form, 'pages')).prop('checked', false);
			}
		});
		form.append({
			type: 'checkbox',
			name: 'pages',
			list: list
		});
		form.append({ type: 'submit' });

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

		Morebits.checkboxShiftClickSupport(Morebits.quickForm.getElements(result, 'pages'));
	}, statelem);

	wikipedia_api.post();
};

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

	var form = event.target;

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

	var pages = form.getChecked('pages');
	var reason = form.reason.value;
	var editmodify = form.editmodify.checked;
	var editlevel = form.editlevel.value;
	var editexpiry = form.editexpiry.value;
	var movemodify = form.movemodify.checked;
	var movelevel = form.movelevel.value;
	var moveexpiry = form.moveexpiry.value;
	var createmodify = form.createmodify.checked;
	var createlevel = form.createlevel.value;
	var createexpiry = form.createexpiry.value;

	if (!reason) {
		alert("باید دلیلی برای کارتان ارائه کنید!"); // localized
		return;
	}

	Morebits.simpleWindow.setButtonsEnabled(false);
	Morebits.status.init(form);

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

	var batchOperation = new Morebits.batchOperation('اعمال تنظیمات محافظت'); // localized
	batchOperation.setOption('chunkSize', Twinkle.getPref('batchProtectChunks'));
	batchOperation.setOption('preserveIndividualStatusLines', true);
	batchOperation.setPageList(pages);
	batchOperation.run(function(pageName) {
		var query = {
			'action': 'query',
			'titles': pageName
		};
		var wikipedia_api = new Morebits.wiki.api('بررسی موجود بودن صفحهٔ ' + pageName, query, // localized
			Twinkle.batchprotect.callbacks.main, null, batchOperation.workerFailure);
		wikipedia_api.params = {
			page: pageName,
			reason: reason,
			editmodify: editmodify,
			editlevel: editlevel,
			editexpiry: editexpiry,
			movemodify: movemodify,
			movelevel: movelevel,
			moveexpiry: moveexpiry,
			createmodify: createmodify,
			createlevel: createlevel,
			createexpiry: createexpiry,
			batchOperation: batchOperation
		};
		wikipedia_api.post();
	});
};

Twinkle.batchprotect.callbacks = {
	main: function(apiobj) {
		var xml = apiobj.responseXML;
		var normal = $(xml).find('normalized n').attr('to');
		if (normal) {
			apiobj.params.page = normal;
		}

		var exists = $(xml).find('page').attr('missing') !== '';

		var page = new Morebits.wiki.page(apiobj.params.page, 'محافظت ' + apiobj.params.page); // localized
		var takenAction = false;
		if (exists && apiobj.params.editmodify) {
			page.setEditProtection(apiobj.params.editlevel, apiobj.params.editexpiry);
			takenAction = true;
		}
		if (exists && apiobj.params.movemodify) {
			page.setMoveProtection(apiobj.params.movelevel, apiobj.params.moveexpiry);
			takenAction = true;
		}
		if (!exists && apiobj.params.createmodify) {
			page.setCreateProtection(apiobj.params.createlevel, apiobj.params.createexpiry);
			takenAction = true;
		}
		if (!takenAction) {
			Morebits.status.warn('محافظت صفحهٔ ' + apiobj.params.page, 'از پیش وجود ' + (exists ? 'دارد' : 'ندارد') + '؛ چیزی برای انجام دادن باقی نمانده‌است'); // localizing
			apiobj.params.batchOperation.workerFailure(apiobj);
			return;
		}

		page.setEditSummary(apiobj.params.reason);
		page.protect(apiobj.params.batchOperation.workerSuccess, apiobj.params.batchOperation.workerFailure);
	}
};
})(jQuery);


// </nowiki>