مدیاویکی:Gadget-twinkledeletechange-2022.js

از ویکی‌پدیا، دانشنامهٔ آزاد

نکته: برای دیدن تغییرات، ممکن است نیاز باشد که حافظهٔ نهانی مرورگر خود را پس از انتشار پاک‌سازی کنید. گوگل کروم، فایرفاکس، مایکروسافت اج و سافاری: کلید Shift را نگه دارید و روی دکمهٔ Reload در نوار ابزار مرورگر کلیک کنید. برای آگاهی از جزئیات و نحوهٔ پاک‌سازی حافظهٔ نهانی سایر مرورگرها، صفحهٔ ویکی‌پدیا:میانگیر مرورگرتان را خالی کنید را ببینید.

(function($) {

var hasCSD = Twinkle.speedy.hasCSD || !!$('#delete-reason').length;
var deleteCriterion = $('#delete-criterion').text() || '';
var boldtext = document.createElement('b');
    
Twinkle.deletechange = function deletechange() {
	if (!hasCSD) {
		return;
	} else if (deleteCriterion === 'نبح') {
		return;
	}

	Twinkle.addPortletLink(Twinkle.deletechange.callback, 'تغییر حذف', 'tw-change', 'تغییر فرایند حذف');
};

// unifyCriterion unifies all ratinale which fall under certain csd criterion.
// For example, "person", "band" and other rationale like them fall under g7.
// Therefore if the current db tag on the page is based on any of g7 rationale
// (like band for musical groups), the first option for a g7 rationale in the
// csd list (person) will be pre-selected.
// To get a better understanding of what this function is intended for, see its
// usage in "Twinkle.deletechange.callback.changetypechanged"
// (after "render()") below
var unifyCriterion = function(crit) {
	switch (crit) {
		case 'preson':
		case 'band':
		case 'club':
		case 'corp':
		case 'web':
		case 'animal':
		case 'event':
			crit = 'person';
			break;
		case 'vandalism':
		case 'hoax':
			crit = 'vandalism';
			break;
		case 'move':
		case 'xfd':
		case 'copypaste':
		case 'g6':
			crit = 'g6';
			break;
		case 'attack':
		case 'negublp':
			crit = 'attack';
			break;
	}
	return crit;
};

Twinkle.deletechange.callback = function twinkledeletechangeCallBack() {
	
	var mode;
	var modeList;
    
    if ($(boldtext)[0].firstChild) {
        $(boldtext)[0].firstChild.remove(); // Empty up the element to place new text
    }
    
	if (deleteCriterion === 'حذف زمان‌دار') {
        mode = 'prod';
        modeList = [
    			{
    				label: 'تغییر به حذف سریع',
    				value: 'changetocsd',
    				tooltip: 'برداشتن برچسب حذف زمان‌دار، ذکر پیشینه در صفحهٔ بحث و تغییر به برچسب حذف سریع',
    				subgroup: {
			            type: 'input',
			            name: 'changetocsd-reason',
			            label: 'دلیل تغییر به حذف سریع',
                        size: 60,
			            required: true
			        }
    			},
                {
    				label: 'ارسال به نظرخواهی برای حذف',
    				value: 'changetoafd',
    				tooltip: 'برداشتن برچسب حذفزمان‌دار و ارسال مقاله به [[وپ:نبح]]',
    				subgroup: {
			            type: 'input',
			            name: 'changetoafd-reason',
			            label: 'دلیل تغییر به نظرخواهی برای حذف',
                        size: 60,
			            required: true
			        }
    			}
    		];
	} else {
    	mode = 'csd';
    	modeList = [
    			{
    				label: 'تغییر معیار حذف سریع',
    				value: 'changecsdcrit',
    				tooltip: 'نگه داشتن برچسب حذف سریع و تغییر معیار',
    				subgroup: {
			            type: 'input',
			            name: 'changecsdcrit-reason',
			            label: 'دلیل تغییر معیار حذف سریع',
                        size: 60,
			            required: true
			        }
    			},
    			{
    				label: 'تغییر به حذف زمان‌دار',
    				value: 'changetoprod',
    				tooltip: 'برداشتن برچسب حذف سریع و تبدیل آن به برچسب حذف زمان‌دار مطابق [[وپ:حز]]',
    				subgroup: {
			            type: 'input',
			            name: 'changetoprod-reason',
			            label: 'دلیل تغییر به حذف زمان‌دار',
                        size: 60,
			            required: true
			        }
    			},
                {
    				label: 'ارسال به نظرخواهی برای حذف',
    				value: 'changetoafd',
    				tooltip: 'برداشتن برچسب حذف سریع و ارسال مقاله به [[وپ:نبح]]',
    				subgroup: {
			            type: 'input',
			            name: 'changetoafd-reason',
			            label: 'دلیل تغییر به نظرخواهی برای حذف',
                        size: 60,
			            required: true
			        }
    			}
    		];
	}
	modeList.push(
		{
			label: 'برداشتن برچسب حذف',
			value: 'removetag',
			tooltip: 'برداشتن کلی برچسب حذف در صورتی که مقاله مشمول هیچ‌یک از معیارهای حذف نمی‌شود و شایستهٔ ماندن است.',
			subgroup: {
	            type: 'input',
	            name: 'removetag-reason',
	            label: 'دلیل برداشتن برچسب',
                size: 60,
	            required: true
	        }
		}
	);

    var Window = new Morebits.simpleWindow(750, 400);
    Window.setScriptName('توینکل');
    
    var form = new Morebits.quickForm(Twinkle.deletechange.callback.evaluate);
    var field = form.append({
        type: 'field',
        label: 'نوع تغییر',
        id: 'changetype_fieldset'
    });
    
    field.append({
		type: 'radio',
		name: 'changetype',
		event: Twinkle.deletechange.callback.changetypechanged,
		list: modeList
	});
    
	if (mode == 'csd') {
        Window.setTitle('تغییر حذف سریع');
		//Twinkle.speedy.initDialog(Twinkle.speedy.callback.evaluateUser, true);
	} else if (mode === 'prod') {
        Window.setTitle('تغییر حذف زمان‌دار');
		//Twinkle.prod.callback();
	}
    
	var paramsField = form.append({
		type: 'field',
        label: 'پارامترها',
		name: 'parameters'
	});
    
    boldtext.appendChild(document.createTextNode('ابتدا نوع تغییر را انتخاب کنید تا تنظیمات مربوط به نوع منتخب در این بخش نمایش داده شود.'));
    
    paramsField.append({
		type: 'div',
		label: boldtext
	});
    
	form.append({ type: 'submit', label: 'اعمال تغییر' });
    
	var result = form.render();
	Window.setContent(result);
	Window.display();
};

Twinkle.deletechange.callback.changetypechanged = function(event) {

    // prepare frame for type dependant controls
	var field = new Morebits.quickForm.element({
		type: 'field',
		label: 'پارامترها',
		name: 'parameters'
	});
	var namespace = mw.config.get('wgNamespaceNumber');
	
	if (event.target.values !== 'removetag') {
        if ($(boldtext)[0].firstChild) {
            $(boldtext)[0].firstChild.remove(); // Empty up the element to place new text
        }
    	field.append({
    		type: 'div',
    		label: boldtext
    	});
    	if (field.previewer) {
    		field.previewer.closePreview();
    	}
    }
	// create type dependant controls
	switch (event.target.values) {
		case 'changetocsd':
		case 'changecsdcrit':
            $('fieldset[name="parameters"]').show();
            
            var tagOptions = field.append({
				type: 'div',
				name: 'csd_options'
			});
	
			tagOptions.append({
				type: 'header',
				label: 'گزینه‌های مرتبط با برچسب زدن'
			});
			tagOptions.append({
				type: 'checkbox',
				list: [
					{
						label: 'آگاه کردن سازندهٔ صفحه در صورت امکان',
						value: 'notify',
						name: 'notify',
						tooltip: 'یک الگوی آگاه‌سازی روی صفحهٔ بحث کاربری که صفحه را ایجاد کرده قرار می‌گیرد، به شرط آن که در ترجیحات توینکل، آگاه‌سازی را برای این معیار فعال کرده باشید ' +
								'و این گزینه را هم تیک بزنید. ممکن است برای سازندهٔ صفحه پیام خوشامدی هم فرستاده شود.',
						checked: !Morebits.userIsSysop || !Morebits.userIsEliminator || !(Twinkle.speedy.hasCSD || Twinkle.getPref('deleteSysopDefaultToDelete')),
						event: function(event) {
							event.stopPropagation();
						}
					},
					{
						label: 'برای محافظت در برابر ایجاد (نمک) نیز برچسب بزن',
						value: 'salting',
						name: 'salting',
						tooltip: 'اگر این گزینه را انتخاب کنید، کنار برچسب حذف سریع یک برچسب {{نمک}} هم قرار داده می‌شود تا از مدیران درخواست شود که صفحه پس از حذف، در برابر ایجاد هم محافظت شود. فقط در صورتی این گزینه را استفاده کنید که صفحه بارها ایجاد شده باشد.',
						event: function(event) {
							event.stopPropagation();
						}
					}
				]
			});
			
			field.append({
				type: 'div',
				id: 'prior-deletion-count',
				style: 'font-style: italic'
			});
			
			var work_area = field.append(
				new Morebits.quickForm.element({
					type: 'div',
					name: 'work_area'
				})
			);
			
			var appendList = function(headerLabel, csdList) {
				work_area.append({ type: 'header', label: headerLabel });
				work_area.append({ type: 'radio', name: 'csd', list: Twinkle.speedy.generateCsdList(csdList, 'evaluateUser') });
			};
			if (namespace % 2 === 1 && namespace !== 3) {
				// show db-talk on talk pages, but not user talk pages
				appendList('صفحه‌های بحث', Twinkle.speedy.talkList);
			}
			if (!Morebits.isPageRedirect()) {
				switch (namespace) {
					case 0:  // article
					case 1:  // talk
						appendList('مقاله‌ها', Twinkle.speedy.articleList);
						break;
		
					case 2:  // user
					case 3:  // user talk
						appendList('صفحه‌های کاربری', Twinkle.speedy.userList);
						break;
		
					case 6:  // file
					case 7:  // file talk
						appendList('پرونده‌ها', Twinkle.speedy.fileList);
						break;
						
					case 10:  // template
					case 11:  // template talk
						appendList('الگوها', Twinkle.speedy.templateList);
						break;
						
					case 14:  // category
					case 15:  // category talk
						appendList('رده‌ها', Twinkle.speedy.categoryList);
						break;
		
					case 100:  // portal
					case 101:  // portal talk
						appendList('درگاه‌ها', Twinkle.speedy.portalList);
						break;
		
					default:
						break;
				}
			} else {
				if (namespace === 2 || namespace === 3) {
					appendList('صفحه‌های کاربری', Twinkle.speedy.userList);
				}
				appendList('تغییرمسیرها', Twinkle.speedy.redirectList);
			}
			
			appendList('معیارهای عمومی', Twinkle.speedy.generalList);
			
			Twinkle.speedy.callback.priorDeletionCount();						// Show previous deletions
			
			break;
		case 'changetoprod':
            $('fieldset[name="parameters"]').show();
			field.append(
                new Morebits.quickForm.element({
    				type: 'checkbox',
    				list: [
    					{
    						label: 'آگاه‌سازی ایجادکنندهٔ صفحه در صورت امکان',
    						value: 'notify',
    						name: 'notify',
    						tooltip: 'در صورت فعال بودن این گزینه، یک الگوی آگاه‌سازی در صفحهٔ بحث کاربر ایجادکننده قرار داده خواهد شد.',
    						checked: true
    					}
    				]
    			})
            );
			field.append(
                new Morebits.quickForm.element({
    				type: 'textarea',
    				name: 'reason',
    				label: 'دلیل پیشنهاد حذف زمان‌دار:',
    				value: Twinkle.prod.defaultReason
    			})
            );
            
			break;
		case 'changetoafd':
            $('fieldset[name="parameters"]').show();
			var templateOrModule = mw.config.get('wgPageContentModel') === 'Scribunto' ? 'module' : 'template';
			
			field.append({
				type: 'div',
				label: '', // Added later by Twinkle.makeFindSourcesDiv()
				id: 'twinkle-xfd-findsources',
				style: 'margin-bottom: 5px; margin-top: -5px;'
			});
			
			field.append({
				type: 'checkbox',
				list: [
					{
						label: 'قرار دادن برچسب نظرخواهی حذف داخل <noinclude>',
						value: 'noinclude',
						name: 'noinclude',
						tooltip: 'برچسب نظرخواهی حذف را داخل یک برچسب <noinclude> می‌گذارد تا در صفحه‌هایی که آن را تراگنجانش کرده‌اند نمایش نیابد' + 
							(mw.config.get('wgNamespaceNumber') === 10) ? '.' : 'این گزینه معمولاً لازم نیست.',
						disabled: templateOrModule === 'module',
						checked: !!$('.box-Subst_only').length ||				// Default to checked if page carries {{subst only}}
								 mw.config.get('wgNamespaceNumber') === 10		// or is in template namespace
					}
				]
			});
			
			field.append({
				type: 'select',
				name: 'xfdcat',
				label: 'طبقه‌بندی نظرخواهی حذف:',
				list: [
					{ type: 'option', label: 'طبقه‌بندی نشده (لطفاً یک گزینهٔ دیگر را انتخاب کنید)', value: '?', selected: true },
					{ type: 'option', label: 'موسیقی و رسانه', value: 'M' },
					{ type: 'option', label: 'سازمان، شرکت یا محصول', value: 'O' },
					{ type: 'option', label: 'زندگی‌نامه', value: 'B' },
					{ type: 'option', label: 'موضوع‌های اجتماعی', value: 'S' },
					{ type: 'option', label: 'وب یا اینترنت', value: 'W' },
					{ type: 'option', label: 'بازی‌ها یا ورزش', value: 'G' },
					{ type: 'option', label: 'علم و فناوری', value: 'T' },
					{ type: 'option', label: 'داستان و هنر (فیلم، سریال، نمایش، کتاب، ...)', value: 'F' },
					{ type: 'option', label: 'مکان‌ها و ترابری', value: 'P' },
					{ type: 'option', label: 'غیر قابل طبقه‌بندی', value: 'I' },
					{ type: 'option', label: 'طبقه‌بندی نشده', value: 'U' }
				]
			});
			
			field.append({
				type: 'textarea',
				name: 'reason',
				label: 'دلیل:',
				tooltip: 'در متن دلیل می‌توانید از دستورات ویکی‌متن استفاده کنید. توینکل خودش امضای شما را درج می‌کند.'
			});
            field.append({
                type: 'hidden',
                name: 'venue',
                value: 'afd'
            });
			
			var previewlink = document.createElement('a');
			$(previewlink).click(function() {
				Twinkle.xfd.callbacks.preview(result);  // |result| is defined below
			});
			previewlink.style.cursor = 'pointer';
			previewlink.textContent = 'پیش‌نمایش';
			field.append({ type: 'div', id: 'afdpreview', label: [ previewlink ] });
			field.append({ type: 'div', id: 'twinkledeletechange-previewbox', style: 'display: none' });
			
			break;
		case 'removetag':
			$('fieldset[name="parameters"]').hide();
            
			break;
	}

    if (event.target.values !== 'removetag') {
        field.append({
    		type: 'div',
    		label: boldtext
    	});
        var result = field.render();
        if (event.target.values === 'changetoafd') {
        	result.previewer = new Morebits.wiki.preview($(result).find('div#twinkledeletechange-previewbox').last()[0]);
        }
        event.target.form.replaceChild(result, $(event.target.form).find('fieldset[name="parameters"]')[0]);
        if (event.target.values === 'changecsdcrit') {
			// Pre-select current tag's critrerion only if we are 'changing' the criterion
			var inputs = $("input[name=csd]");
			for (var i = 0; i < inputs.length; i++) {
			    if (Twinkle.speedy.normalizeHash[inputs[i].value] === $('#delete-criterion').text()) {
			        $("input[name=csd][value=" + unifyCriterion(inputs[i].value) + "]").prop('checked', true);
			    }
			}
        }
    }
};

Twinkle.deletechange.callback.evaluate = function twinkleDeletechangeCallbackEvaluate(e) {
	var form = e.target;
	var input = Morebits.quickForm.getInputData(form);
    var params = {
        ctype: input.changetype,
        creason: input[input.changetype + '-reason']
    };
};

Twinkle.addInitCallback(Twinkle.deletechange, 'change');
})(jQuery);