Увага: Після публікування слід очистити кеш браузера, щоб побачити зміни.

  • Firefox / Safari: тримайте Shift, коли натискаєте Оновити, або натисніть Ctrl-F5 чи Ctrl-Shift-R (⌘-R на Apple Mac)
  • Google Chrome: натисніть Ctrl-Shift-R (⌘-Shift-R на Apple Mac)
  • Internet Explorer / Edge: тримайте Ctrl, коли натискаєте Оновити, або натисніть Ctrl-F5
  • Opera: натисніть Ctrl-F5
/*
* @author Andriy.v
* for ukwiki only
*/

if ( typeof(CleanupMessages) === 'undefined' ) {
	window.CleanupMessages = {
		install: function () {
			var cm = this;
			var link = mw.util.addPortletLink('p-tb', '#', 'Додати шаблони впорядкування');
				$( link ).click( function ( e ) {
					e.preventDefault();
					cm.mainDialog();
			});
		},
		mainDialog: function () {
			var cm = this;
			$.getJSON(mw.config.get('wgScriptPath')+'/index.php?action=raw&ctype=application/json&title=MediaWiki:Gadget-CleanupMessages.json', function(data){
				var insertOptions = data.templates;
				var needTalk = ['Переписати','Брак інформації','Упорядкувати','Достовірність',
				'Поза темою','Стиль','Незрозуміло','Плутано','Переписати вступ','Неологізми',
				'Нейтральність','Суперечить','Протиріччя','Сумнівні твердження','Неакадемічно',
				'Узагальнити','Глобалізувати','Зваженість','КОІ','Автобіографія','Платне редагування без розкриття',
				'Недостатньо джерел','Недостатньо виносок','Актуальність','Оновити','Недавнізм','Фахівець'];
				$( '<div id="cm-dialog">' ).html( $('<div>').attr('id', 'CleanupMessagesDialog') )
				.dialog( {
					width: 900,
					modal: true,
					title: "Виберіть потрібні шаблони впорядкування",
					dialogClass: 'wikiEditor-toolbar-dialog',
					close: function () {
						$( this ).dialog( 'destroy' );
						$( this ).remove();
					},
					buttons: {
							'Скасувати': function() {
								$( this ).dialog( 'close' );
							},
							'Зберегти' : function() {
								if (selections.length == 0)
									alert('Будь ласка виберіть шаблон');
								else {
									var needTalk_selected = [];
									for (var k in selections) {
										if (needTalk.includes(selections[k]))
											needTalk_selected.push(selections[k]);
									}
									if (needTalk_selected.length > 0)
										cm.talkPageDialog(selections, insertOptions);
									else
										cm.addTemplate(selections, insertOptions);
							}
						}
					}
				} );
		
				$('#CleanupMessagesDialog').append('<table style="width:850px" id="cm-dialog-table"><tr id="cm-header-row"></tr></table>');
				for (var i in insertOptions) {
					if (insertOptions[i].title == "З\'вязність") {
						$('#cm-group0').append('<th class="cm-header">' + insertOptions[i].title + '</th>');
						$('#cm-group0').append('<tr><td id="cm-group' + i +'"></td></tr>');
					}
					else if (insertOptions[i].title == "Опрацювання") {
						$('#cm-group6').append('<th class="cm-header">' + insertOptions[i].title + '</th>');
						$('#cm-group6').append('<tr><td id="cm-group' + i +'"></td></tr>');
					}
					else {
						$('#cm-dialog-table').append('<td id="cm-group' + i +'"></td>');
						$('#cm-header-row').append('<th class="cm-header">' + insertOptions[i].title + '</th>');
					}
					for (var t in insertOptions[i].parameters)
						$('#cm-group' + i).append('<tr><td><span class="cm-template" style="cursor:pointer; color:#777" title="' + 
						insertOptions[i].parameters[t].message +'">' + insertOptions[i].parameters[t].name + '</span></td></tr>');
				}
				var selections = [];
				var remove_index = 0;
				$('span.cm-template').click(function(){
					if($(this).css("background-color") == 'rgba(0, 0, 0, 0)') {
						$(this).css("background-color", "lightgreen");
						$(this).css("color", "black");
						selections.push($(this).text());
					}
					else {
						$(this).css("background-color", "rgba(0, 0, 0, 0)");
						$(this).css("color", "#777");
						remove_index = selections.indexOf($(this).text());
						selections.splice(remove_index);
						}
				});
			});
		},
		talkPageDialog: function (selections, templates) {
			var cm = this;
			$( '<div>' ).html( $('<div>').attr('id', 'CleanupTalkPageDialog') )
			.dialog( {
				width: 700,
				modal: true,
				title: "Введіть обґрунтування щодо вставки шаблонів",
				dialogClass: 'wikiEditor-toolbar-dialog',
				close: function () {
					$( this ).dialog( 'destroy' );
					$( this ).remove();
				},
				buttons: {
						'Скасувати': function() {
							$( this ).dialog( 'close' );
						},
						'Зберегти' : function() {
							var topic_name = $('#cm-topic-name').val();
							var topic_content = $('#cm-topic-content').val();
							if (topic_name == '' || topic_content == '')
								alert('Будь ласка заповніть усі поля');
							else {
								$( this ).dialog("close");
								cm.addTalkTopic(topic_name, topic_content, selections, templates);
							}
						}
				}
			} );
			$('#CleanupTalkPageDialog').append('<p style="font-text:110%">Назва теми:</p><input id="cm-topic-name" style="width:200px"></input><p>Текст:<textarea id="cm-topic-content" style="height:210px"></textarea></p>');
		},
		addTemplate: function (selections, templates) {
			var cm = this;
			var text = '';
			var page = mw.config.get('wgPageName');
			var except = ['Брак інформації','Актуальність','Майбутня подія','Запланована подія','Поточна подія','Редагую','Перекладаю'];
			var except_selected = [];
			var cleaned_selections = selections;
			this.wait('Вставляються шаблони впорядкування на сторінці');
			for (var i in selections) {
				if (except.includes(selections[i])) {
					except_selected.push(selections[i]);
					cleaned_selections.splice(i);
					i--;
				}
			}
			if (cleaned_selections.length == 1)
				text = '{\{' + cleaned_selections[0] + '|дата={\{subst:CURRENTMONTHNAME}} {\{subst:CURRENTYEAR}}}}\n';
			else if (cleaned_selections.length > 1) {
				for (var n in cleaned_selections)
					text += '\n|' + cleaned_selections[n].toLowerCase() + '={\{subst:CURRENTMONTHNAME}} {\{subst:CURRENTYEAR}}';
				text = '{\{Проблеми' + text + '\n}}\n';
			}
			if (except_selected.length >= 1) {
				for (var k in except_selected)
					text += '{\{' + except_selected[k] + '}}\n';
			}
			new mw.Api().edit(page, function(revision) {
				return {
					text: text + revision.content,
					summary: '[[Mediawiki:Gadget-CleanupMessages.js|Script]]: додавання шаблонів впорядкування',
					assert: 'user'
				};
			}).done( function () {
        cm.checkCategory(selections, templates);
			}).fail( function (error) {
				cm.editErrors(error, page);
			}) ;
		},
		addTalkTopic: function (name, text, selections, templates) {
			var cm = this;
			var talk_page = 'Обговорення:' + mw.config.get('wgPageName');
			this.wait('Додається обґрунтування на сторінці обговорення');
			var topic_text = '\n\n== ' + name + ' ==\n'+ text + '--~~' + '~~';
			new mw.Api().edit(talk_page, function(revision) {
				return {
					text: revision.content + topic_text,
					summary: '[[Mediawiki:Gadget-CleanupMessages.js|Script]]: обґрунтування вставки шаблонів упорядкування',
					assert: 'user'
				};
			}).done( function () {
				cm.addTemplate(selections, templates);
			}).fail( function (err) {
				if (err == 'nocreate-missing') {
					new mw.Api().create(talk_page, {
						summary: '[[Mediawiki:Gadget-CleanupMessages.js|Script]]: обґрунтування вставки шаблонів упорядкування'
					}, topic_text.replace('/^\n\n/g',''))
					.done(function() {
						cm.addTemplate(selections, templates);
					})
					.fail(function(error) {
						cm.editErrors(error, talk_page);
				});
				}
				else
					cm.editErrors(err, talk_page);
			}) ;
		},
		wait: function (mes) {
			$('#cm-dialog').dialog("close");
			$('<div id="cm-dialog">').html('<p style="font-size: 120%; font-weight:bold;">' + mes + '</p>')
			.dialog({
				title: 'Зачекайте, будь ласка...',
				modal: true,
				buttons: false
			});

		},
		checkCategory: function(selections, templates) {
			var cm = this;
			var date = new Date();
			var month = date.getMonth();
			var year = date.getFullYear();
			var uk_month = "";
			switch (month) {
				case 0:
					uk_month = "із січня";
					break;
				case 1: 
					uk_month = "з лютого";
					break;
				case 2:
					uk_month = "з березня";
					break;
				case 3:
					uk_month = "з квітня";
					break;
				case 4: 
					uk_month = "з травня";
					break;
				case 5:
					uk_month = "з червня";
					break;
				case 6:
					uk_month = "з липня";
					break;
				case 7: 
					uk_month = "із серпня";
					break;
				case 8:
					uk_month = "з вересня";
					break;
				case 9:
					uk_month = "з жовтня";
					break;
				case 10: 
					uk_month = "з листопада";
					break;
				case 11:
					uk_month = "з грудня";
					break;
			}
			var category_names = [];
			for (var i in templates) {
				for (var j in templates[i].parameters) {
					if (selections.includes(templates[i].parameters[j].name)) {
						if (templates[i].parameters[j].category != "") {
							category_names.push("Категорія:" + templates[i].parameters[j].category + " " + uk_month + " " + year);
						}
					}
				}
			}
			cm.existCategory(category_names);
		},
		existCategory: function (categories) {
			var cm = this;
			if (categories.length != 0) {
				var category = categories.pop();
				var params = {
					action: 'query',
					titles: category,
					prop: 'pageprops',
					format: 'json'
				};
				var api = new mw.Api();
				api.get( params ).then( function ( data ) {
					if (data.query.pages[-1] != undefined)
						cm.createCategory(category, categories);
					else
						cm.existCategory(categories);
				});
			}
			else
				cm.success();
		},
		createCategory: function (page, categories) {
			var cm = this;
			cm.wait('Створюються категорії');
			var content = "{\{Щомісячна категорія впорядкування}}";
			new mw.Api().create(page, {
				summary: '[[Mediawiki:Gadget-CleanupMessages.js|Script]]: створення категорії впорядкування'
			}, content)
			.done(function() {
				cm.existCategory(categories);
			})
			.fail(function(error) {
				cm.editErrors(error, page);
			});
		},
		success: function () {
			this.wait('Перезавантаження сторінки');
			setTimeout(function(){
				$( '#cm-dialog' ).dialog('close');
					location.reload(); },1000
				);	
		},
		editErrors: function(code, title) {
			switch(code) {
				case 'editconflict':
					alert('Конфлікт редагувань на сторінці ' + title + '. Відкиньте редагування, зроблені цим додатком за останні декілька секунд та спробуйте ще раз');
					break;
				case 'protectedtitle':
					alert('Сторінка ' + title + ' захищена. Зв\'яжіться з адміністраторами на сторінці ВП:Запити до адміністраторів');
					break;
				case 'spamdetected':
					alert('При редагуванні сторінки ' + title + ' автоматичний фільтр визначив ваш текст, як спам');
					break;
				case 'blocked':
					alert('Ви заблоковані у цій вікі. Спробуйте, будь ласка, пізніше');
					break;
				case 'filtered':
				case 'abusefilter-disallowed':
					alert('Автоматичний фільтр заборонив редагування сторінки ' + title);
					break;
				case 'notoken':
					alert('Неможливо отримати токен. Зверніться, будь ласка, у «Кнайпу (адміністрування)»');
					break;
				default:
					alert('Невідома помилка при редагуванні сторінки ' + title + '. Відкиньте редагування, зроблені цим додатком за останні декілька секунд та спробуйте пізніше');
					break;
			}
		}
	};
}
$(document).ready(function () {
	mw.loader.using( 'oojs', function() {
		if (mw.config.get('wgNamespaceNumber') == 0)
			CleanupMessages.install();
	});
});