Wiki - KEONHACAI COPA

Thành viên:NguoiDungKhongDinhDanh/AfDCloser.js

/** <nowiki>
 * Công cụ hỗ trợ đóng biểu quyết xoá bài.
 * Cài đặt: Thêm dòng dưới đây vào trang common.js của bạn:
 * mw.loader.load('/wiki/User:NguoiDungKhongDinhDanh/AfDCloser.js?action=raw&ctype=text/javascript');
 * 
 * Inspired by [[:en:WP:XFDCLOSER]]
 * 
 * Danh sách người sử dụng: //w.wiki/4rYP
 * Giấy phép: CC BY-SA 3.0
**/
/* jshint esversion: 6, maxerr: 9999, undef: true, unused: true, quotmark: single */
/* globals window, document, $, mw */
 
mw.loader.using(['mediawiki.util'], function() {
	var database = mw.config.get('wgDBname');
	var [pageName, afdPageName, articleName] = (
		mw.config.get('wgPageName').replace(/_/g, ' ').match(
			/^[^\/]+\/((.+?)(?: \(lần \d+\))?)$/
		) || []
	);
	
	if (database !== 'viwiki' || !articleName) {
		return;
	}
	
	var api = new mw.Api();
	var ad = '([[User:NguoiDungKhongDinhDanh/AfDCloser.js|AfDCloser]])';
	var groups = new Set(mw.config.get('wgUserGroups'));
	var isAdmin = groups.has('eliminator') || groups.has('sysop');
	
	var aliasesRegex = [
		'Độ nổi bật', 'Không nổi bật',
		'Chưa xứng đáng', 'Bàn cãi về giá trị',
		'Tiêu chuẩn', 'Tiêu chuẩn đưa vào',
		'Tiêu chuẩn tổ chức', 'Tiêu chuẩn nhân vật',
		'Notability', 'Dnb', 'Knb'
	].map(e => `[${e[0]}${e[0].toLowerCase()}]${e.slice(1).replace(/ /g, '[_ ]+')}`).join('|');
	
	function notify(content, title, type, tag) {
		mw.notify(content, {
			type, title,
			tag: `afdcloser-${tag || 'main'}`,
			autoHide: true,
			autoHideSeconds: 5
		});
	}
	function applyRegex(text, keep) {
		return text.replace(
			/^\{\{[Aa]fd\/dated\|[^{}]+\}\}$/m, ''
		).replace(
			new RegExp(String.raw`\{\{\s*(?:${aliasesRegex})\s*(?:[^{}]+)?\}\}`),
			s => keep ? '' : s
		).trim();
	}
	function onfail(error, response) {
		notify(`Nội dung lỗi: ${response.error.info}`, `Lỗi: ${error}`, 'error', 'error');
		throw Error('Có lỗi.');
	}
	
	function dialog() {
		$(this).remove();
		
		var css = (`
			#afdcloser {
				display: flex;
				flex-direction: column;
				font-size: 1.25em;
			}
			.afdcloser-fieldset {
				display: flex;
				flex-direction: column;
			}
			.afdcloser-fieldset > * {
				margin: 0.75em 0.3em 0;
			}
			.afdcloser-labels {
				display: block;
				font-size: 1.25em;
			}
			#afdcloser-result {
				display: flex;
				justify-content: space-between;
				flex-wrap: wrap;
			}
			#afdcloser-result label {
				display: inline-flex;
				flex: 2 1 calc((100% - 30px) / 3);
				padding: 3px 5px;
			}
			#afdcloser-result input {
				margin: 0;
				align-self: center;
			}
			#afdcloser-result span {
				margin-left: 10px;
				align-self: center;
				font-size: 0.75em;
			}
			#afdcloser-note {
				flex-grow: 2;
				padding: 0.5em;
				-webkit-transition: border-color 100ms, box-shadow 100ms;
				transition: border-color 100ms, box-shadow 100ms;
			}
			#afdcloser-note:focus,
			#afdcloser-note:active {
				outline: 0;
				border-color: #3366CC;
				box-shadow: inset 0 0 0 1px #3366CC;
			}
		`); // :focus/:active copied from OO.UI core.
		try {
			mw.util.addCSS(css);
		} catch (ignore) {
			mw.loader.addStyleTag(css);
		}
		
		$('<div>').attr('id', 'afdcloser').append(
			$('<div>').attr('class', 'afdcloser-fieldset').append(
				$('<label>').attr({
					'for': 'afdcloser-result',
					'class': 'afdcloser-labels'
				}).text('Kết quả:'),
				$('<div>').attr('id', 'afdcloser-result').append(
					$('<label>').attr('class', 'afdcloser-labels').append(
						$('<input>').attr({
							'type': 'radio',
							'name': 'afdcloser-result',
							'value': 1,
							'class': 'afdcloser-result'
						}),
						$('<span>').text('Xoá')
					),
					$('<label>').attr('class', 'afdcloser-labels').append(
						$('<input>').attr({
							'type': 'radio',
							'name': 'afdcloser-result',
							'value': -1,
							'class': 'afdcloser-result'
						}),
						$('<span>').text('Giữ')
					),
					$('<label>').attr('class', 'afdcloser-labels').append(
						$('<input>').attr({
							'type': 'radio',
							'name': 'afdcloser-result',
							'value': 0,
							'class': 'afdcloser-result'
						}).prop('checked', true),
						$('<span>').text('Không đủ phiếu')
					),
					$('<label>').attr('class', 'afdcloser-labels').append(
						$('<input>').attr({
							'type': 'checkbox',
							'id': 'afdcloser-close'
						}).prop({
							'checked': !isAdmin,
							'disabled': !isAdmin
						}),
						$('<span>').text('Đóng thảo luận')
					)
				)
			),
			$('<div>').attr('class', 'afdcloser-fieldset').append(
				$('<label>').attr({
					'for': 'afdcloser-note',
					'class': 'afdcloser-labels'
				}).text('Ghi chú (tuỳ chọn):'),
				$('<input>').attr({
					'type': 'text',
					'autocomplete': 'off',
					'id': 'afdcloser-note'
				})
			)
		).appendTo(document.body);
		
		$('#afdcloser').dialog({
			autoOpen: true,
			width: 500,
			minWidth: 500,
			height: 400,
			minHeight: 400,
			title: 'AfDCloser.js',
			buttons: [
				{
					text: 'Thực hiện',
					click: function() {
						$('#afdcloser').dialog('destroy').css('display', 'none');
						
						var result = +$('.afdcloser-result:checked').val();
						var note = $('#afdcloser-note').val().trim();
						var close = $('#afdcloser-close').prop('checked');
						
						if (close !== false) {
							closeAfd(note);
						}
						
						switch (result) {
							case -1:
								addTag(); // jshint ignore: line
							case 0:
								removeTag(result);
								break;
							case 1:
								(isAdmin ? deletePage : requestDeletion)();
								break;
						}
					}
				}
			]
		});
	}
	
	function closeAfd(note) {
		api.get({
			action: 'query',
			prop: ['revisions'],
			titles: [pageName],
			rvslots: ['main'],
			rvprop: ['content'],
			format: 'json',
			formatversion: 2
		}).done(function(response) {
			var text = response.query.pages[0].revisions[0].slots.main.content.replace(
				/^{{REMOVE THIS TEMPLATE WHEN CLOSING THIS AfD\|[^{}]+}}$/m,
				`{{đầu biểu quyết|KQ = ${note}${note ? '. ' : note.slice(-1) === '.' ? ' ' : ''}~~~~}}`
			) + '\n{{kết biểu quyết}}';
			
			api.postWithToken('csrf', {
				action: 'edit',
				title: pageName,
				text: text,
				summary: `Đóng biểu quyết xoá bài ${ad}`,
				format: 'json',
				formatversion: 2
			}).done(function() {
				notify('Đã đóng biểu quyết xoá bài.', 'Đã đóng biểu quyết!', 'success', 'close');
			}).fail(onfail);
		}).fail(onfail);
	}
	
	function removeTag(keep) {
		api.get({
			action: 'query',
			prop: ['revisions'],
			titles: [articleName],
			rvslots: ['main'],
			rvprop: 'content',
			format: 'json',
			formatversion: 2
		}).done(function(response) {
			var text = applyRegex(response.query.pages[0].revisions[0].slots.main.content, keep);
			
			api.postWithToken('csrf', {
				action: 'edit',
				title: articleName,
				text: text,
				summary: `Gỡ bản mẫu theo kết quả [[${pageName}|biểu quyết]] ${ad}`,
				format: 'json',
				formatversion: 2
			}).done(function() {
				notify('Đã gỡ bản mẫu biểu quyết xoá trang.',  'Đã gỡ bản mẫu!', 'success', 'remove');
			}).fail(onfail);
		});
	}
	function addTag() {
		api.postWithToken('csrf', {
			action: 'edit',
			title: (new mw.Title(articleName)).getTalkPage().toText(),
			prependtext: `{{đã biểu quyết giữ|1=${pageName}}}\n`,
			summary: `Thêm bản mẫu theo kết quả [[${pageName}|biểu quyết]] ${ad}`,
			format: 'json',
			formatversion: 2
		}).done(function() {
			notify('Đã gán nhãn trang thảo luận.',  'Đã gán nhãn!', 'success', 'add');
		}).fail(onfail);
	}
	
	function requestDeletion() {
		api.postWithToken('csrf', {
			action: 'edit',
			title: articleName,
			prependtext: `{{db-xfd|votepage=${afdPageName}}}\n`,
			summary: `Yêu cầu xoá trang theo kết quả [[${pageName}|biểu quyết]] ${ad}`,
			format: 'json',
			formatversion: 2
		}).done(function() {
			notify(`Đã yêu cầu xoá ${articleName}.`,  'Đã yêu cầu xoá!', 'success', 'request');
		}).fail(onfail);
	}
	
	function deletePage() {
		api.postWithToken('csrf', {
			action: 'delete',
			title: articleName,
			reason: `[[WP:BQXB|BQXB]]: Xoá theo kết quả [[${pageName}|biểu quyết xoá bài]] ${ad}`,
			deletetalk: true,
			format: 'json',
			formatversion: 2
		}).done(function() {
			notify(`Đã xoá ${articleName}.`, 'Đã xoá!', 'success', 'delete');
		}).fail(onfail);
	}
	
	$(function() {
		mw.util.addPortletLink(
			'p-tb', 'javascript:void(0)', 'AfDCloser', 'ca-afdcloser',
			'Hỗ trợ đóng biểu quyết xoá bài'
		);
		
		$('#ca-afdcloser').click(dialog);
	});
});

// </nowiki>
Wiki - Keonhacai copa chuyên cung cấp kiến thức thể thao, keonhacai tỷ lệ kèo, bóng đá, khoa học, kiến thức hằng ngày được chúng tôi cập nhật mỗi ngày mà bạn có thể tìm kiếm tại đây có nguồn bài viết: https://vi.wikipedia.org/wiki/Th%C3%A0nh_vi%C3%AAn:NguoiDungKhongDinhDanh/AfDCloser.js