MediaWiki:Gadget-RequestDeletion.js

/*************************************************** * Adopted from WIKIDATA * Adds a small link to the top of the page of    * * each item with a link for quickly requesting a * * deletion on Gratisdata:Requests for deletion. *                     * ***************************************************/

// ( function ( mw, $ ) {	var i18nData = {		'en': {			'title': 'Request deletion',			'description': 'Request deletion for this item.',			'reason': 'Please give the reason for deletion:',			'error-reason': 'You must give a reason!',			'error-requested': 'Deletion already requested',			'error-api': 'An error occurred while requesting the deletion: $1',			'success': 'Request successful',			'close': 'Close',			'notice': 'Attention: Duplicate items need to be merged, not deleted. See Help:Merge.'		},		'ar': {			'title': 'طلب حذف',			'description': 'اطلب حذف العنصر.',			'reason': 'يُرجى توضيح سبب الحذف:',			'error-reason': 'يجب أن تذكر سببًا!',			'error-requested': 'الحذف جرى طلبه بالفعل',			'error-api': 'حدث خطأ أثناء طلب الحذف: $1',			'success': 'طلب ناجح',			'close': 'إغلاق',			'notice': 'تنبيه:العناصر المكررة يجدُر دمجها الآن، فضلَا طالع Help:Merge.'		},		'bn': {			'title': 'অপসারণের অনুরোধ', 'description': 'এই উপাদানটির জন্য অপসারণের অনুরোধ', 'reason': 'অপসারণের কারণ:', 'error-reason': 'কারণ নির্দেশ করতে হবে!', 'error-requested': 'অপসারণের অনুরোধ ইতিমধ্যে করা হয়েছে', 'success': 'অনুরোধ সফলভাবে সম্পন্ন', 'close': 'বন্ধ' },		'cs': { 'title': 'Požádat o smazání', 'description': 'Požádat o smazání této položky.', 'reason': 'Prosíme, zadejte důvod smazání:', 'error-reason': 'Musíte zadat důvod!', 'error-requested': 'O smazání bylo již zažádáno', 'error-api': 'Při žádání o smazání nastala chyba: $1', 'success': 'Žádost úspěšně uložena', 'close': 'Zavřít', 'notice': 'Upozornění: Duplicitní položky je nutné sloučit, ne smazat. Viz Help:Merge.' },		'de': { 'title': 'Löschantrag', 'description': 'Stelle einen Löschantrag für diese Seite.', 'reason': 'Gib bitte den Grund für den Antrag an:', 'error-reason': 'Du musst einen Grund angeben!', 'error-requested': 'Löschantrag wurde schon gestellt', 'error-api': 'Ein Fehler ist beim stellen des Löschantrags aufgetreten: $1', 'success': 'Löschantrag wurde erfolgreich gestellt.', 'close': 'Schließen' },		'el': { 'title': 'Αίτηση διαγραφής', 'description': 'Αίτηση διαγραφής αυτού του αντικειμένου', 'reason': 'Παρακαλώ δώστε μια αιτιολογία για την διαγραφή:', 'error-reason': 'Πρέπει να δώσετε αιτιολογία!', 'error-requested': 'Έχει ήδη γίνει αίτηση διαγραφής', 'error-api': 'Παρουσιάσθηκε σφάλμα κατά την διαδικασία αίτησης διαγραφής: $1', 'success': 'Επιτυχής αίτηση', 'close': 'Κλείσιμο' },		'eo': { 'title': 'Forigpeto', 'description': 'Peti forigon de ĉi tiu ero.', 'reason': 'Forigkialo:', 'error-reason': 'Vi devas mencii iun forigkialon !', 'error-requested': 'Forigo jam estis petita.', 'success': 'Sukcesa forigpeto.' },		'es': { 'title': 'Solicitar el borrado', 'description': 'Solicitar el borrado de este elemento.', 'reason': 'Motivo de borrado:', 'error-reason': '¡Debe especificar un motivo!', 'error-requested': 'Este elemento ya ha sido propuesto para borrado', 'success': 'Petición realizada', 'close': 'Cerrar' },		'fa': { 'title': 'درخواست حذف', 'description': 'درخواست حذف برای این مورد.', 'reason': 'لطفا علت درخواست را بیان نمائید:', 'error-reason': 'شما باید علت درخواست را بیان نمائید!', 'error-requested': 'درخواست حذف انجام شد', 'error-api': 'هنگام درخواست حذف یک خطا رخ داد: $1', 'success': 'درخواست با موفقیت انجام شد', 'close': 'بستن' },		'fi': { 'title': 'Ehdota poistamista', 'description': 'Ehdota tämän kohteen poistamista.', 'reason': 'Anna perustelu poistolle:', 'error-reason': 'Sinun täytyy perustella poistopyyntö!', 'error-requested': 'Poistoa on jo pyydetty', 'success': 'Pyyntö tehty', 'close': 'Sulje', 'notice': 'Huomio: jos sivu on kaksoiskappale toisen sivun kanssa, se tulee yhdistää, katso Help:Merge.' },		'fr': { 'title': 'Demande de suppression', 'description': 'Demander la suppression de cet élément.', 'reason': 'Motif de suppression:', 'error-reason': 'Vous devez indiquer un motif de suppression !', 'error-requested': 'Une demande de suppression a déjà été effectuée.', 'success': 'Demande effectuée avec succès.', 'close': 'Fermer' },		'gl': { 'title': 'Solicitar o borrado', 'description': 'Solicitar o borrado deste elemento.', 'reason': 'Motivo do borrado:', 'error-reason': 'Debes especificar un motivo!', 'error-requested': 'Este elemento xa foi proposto para ser borrado', 'success': 'Petición realizada', 'close': 'Pechar' },		'he': { 'title': 'בקשת מחיקה', 'description': 'בקשת מחיקה עבור פריט זה', 'reason': 'אנא הזן סיבה עבור המחיקה:', 'error-reason': 'אתה מוכרח להזין סיבה！', 'error-requested': 'המחיקה כבר נתבקשה', 'success': 'בקשתך התקבלה' },		'hr': { 'title': 'Zahtjev za brisanjem', 'description': 'Zahtjev za brisanjem ove stavke.', 'reason': 'Molimo navedite razlog brisanja:', 'error-reason': 'Morate navesti razlog!', 'error-requested': 'Zahtjev za brisanjem već postoji', 'error-api': 'Pogrješka prilikom zahtjeva za brisanjem: $1', 'success': 'Zahtjev uspješan', 'close': 'Zatvori', 'notice': 'Pažnja: duple stavke trebaju biti spojene, molimo pogledajte Help:Merge.' },		'hu': { 'title': 'Törlési kérés', 'description': 'Törlésre jelöli ezt a lapot.', 'reason': 'Kérlek, add meg a törlés okát:', 'error-reason': 'Meg kell adnod egy okot!', 'error-requested': 'A lapot már jelölték törlésre.', 'success': 'A kérés sikerült.' },		'id': { 'title': 'Permintaan penghapusan', 'description': 'Permintaan penghapusan untuk item ini.', 'reason': 'Berikan alasan penghapusan:', 'error-reason': 'Anda harus memberikan alasan!', 'error-requested': 'Penghapusan sudah diminta', 'error-api': 'Kesalahan terjadi saat meminta penghapusan: $1', 'success': 'Permintaan berhasil', 'close': 'Tutup' },		'it': { 'title': 'Richiesta di cancellazione', 'description': 'Richiesta di cancellazione per questo elemento', 'reason': 'Motivo della cancellazione:', 'error-reason': 'Devi indicare il motivo!', 'error-requested': 'Cancellazione già richiesta', 'error-api': 'Si è verificato un errore durante la richiesta di cancellazione: $1', 'requested': 'Cancellazione già richiesta', 'success': 'Richiesta effettuata con successo', 'close': 'Chiudi', 'notice': 'Attenzione: gli elementi duplicati ora devono essere uniti, vedi Help:Merge.' },		'ja': { 'title': '削除依頼', 'description': 'この項目を削除依頼に出す. ',			'reason': '削除の理由を記入してください:', 'error-reason': '削除理由が必要です！', 'error-requested': '既に削除依頼済み', 'success': '削除依頼完了', 'close': '中止' },		'kk': { 'title': 'Жоюға сұраныс', 'description': 'Таңдалған нысанды жоюға сұраныс.', 'reason': 'Жою себебін көрсетіңіз:', 'error-reason': 'Себебеін көрсетуіңіз керек!', 'requested': 'Жоюға сұраныс бұрыннан бар', 'success': 'Сұраныс сақталды', 'close': 'Жабу' },		'ko': { 'title': '삭제 요청', 'description': '이 항목을 삭제 신청합니다.', 'reason': '이유를 제시해 주세요:', 'error-reason': '반드시 이유를 제시해 주셔야 합니다!', 'error-requested': '이미 요청이 올라와 있습니다.', 'success': '요청이 성공적으로 등록되었습니다', 'close': '중지' },		'lv': { 'title': 'Pieprasīt dzēšanu', 'description': 'Pieprasīt šī ieraksta dzēšanu.', 'reason': 'Dzēšanas iemesls:', 'error-reason': 'Tev ir jāsniedz dzēšanas iemesls!', 'error-requested': 'Dzēšana jau ir tikusi pieprasīta', 'success': 'Pieprasījums ir veiksmīgs', 'close': 'Aizvērt' },		'min': { 'title': 'Mintak dihapuih', 'description': 'Tolong hapuih item ko.', 'reason': 'Agiah alasan pangapuihan:', 'error-reason': 'Harus ado alasan!', 'error-requested': 'Alah dimintak', 'error-api': 'Kasalahan tajadi sangkek mamintak pangapuihan: $1', 'success': 'Sukses', 'close': 'Tutuik' },		'mk': { 'title': 'Побарај бришење', 'description': 'Поднесува барање за бришење на овој предмет.', 'reason': 'Наведете причина за бришење:', 'error-reason': 'Мора да наведете причина!', 'error-requested': 'Бришењето е веќе побарано', 'error-api': 'Се појави грешка при поднесувањето на барањето: $1', 'success': 'Барањето е успешно поднесено', 'close': 'Затвори', 'notice': 'Внимание: дуплираните предмети отсега мора да се спојуваат, погл. Help:Merge.' },		'ml': { 'title': 'നീക്കംചെയ്യാൻ ആവശ്യപ്പെടുക', 'description': 'ഈ ഇനം നീക്കംചെയ്യാൻ നാമനിർദ്ദേശം ചെയ്യുക', 'reason': 'ഇല്ലാതാക്കുന്നതിനുള്ള കാരണം നൽകുക.', 'error-reason': 'കാരണം നൽകേണ്ടതാണ്.', 'error-requested': 'നീക്കം ചെയ്യാനുള്ള അഭ്യർഥന ഇതിനകം നിലവിലുണ്ട്', 'success': 'അഭ്യർത്ഥന വിജയകരമായി സമർപ്പിച്ചു.', },		'nb': { 'title': 'Be om sletting', 'description': 'Be om sletting for dette elementet.', 'reason': 'Oppgi hvorfor elementet bes slettet:', 'error-reason': 'Du må oppgi en grunn!', 'error-requested': 'Sletting er allerede forespurt', 'success': 'Forespørsel var vellykket', 'close': 'Lukk' },		'nl': { 'title': 'Nomineren voor verwijdering', 'description': 'Verzoek een verwijdering voor dit item.', 'reason': 'Geef de reden voor verwijdering:', 'error-reason': 'Je moet een reden geven!', 'error-requested': 'Verzoek ter verwijdering is al ingediend', 'success': 'Verzoek succesvol ingediend', 'close': 'Sluiten', 'notice': 'Let op: dubbele items dienen nu samengevoegd te worden, zie Help:Merge.' },		'pl': { 'title': 'Zgłoszenie do usunięcia', 'description': 'Zgłoś ten element do usunięcia.', 'reason': 'Podaj powód usunięcia:', 'error-reason': 'Musisz podać powód!', 'error-requested': 'Inny użytkownik zgłosił już ten element do usunięcia.', 'error-api': 'Wystąpił błąd podczas realizacji zgłoszenia: $1', 'success': 'Zgłoszenie przyjęte.', 'close': 'Zamknij', 'notice': 'Uwaga: w celu połączenia duplikatów zobacz Help:Merge.' },		'pt': { 'title': 'Pedir eliminação', 'description': 'Pedir eliminação para este item.', 'reason': 'Por favor, dê o motivo para a eliminação:', 'error-reason': 'Você deve especificar um motivo!', 'error-requested': 'Este item já foi proposto para eliminação', 'success': 'Pedido realizado com sucesso', 'close': 'Fechar' },		'ru': { 'title': 'Запрос на удаление', 'description': 'Запрос на удаление выбранного объекта.', 'reason': 'Пожалуйста, укажите причину удаления:', 'error-reason': 'Вы должны указать причину!', 'error-requested': 'Запрос на удаление уже существует', 'success': 'Запрос сохранён', 'close': 'Выход' },		'sr': { 'title': 'Захтев за брисање', 'description': 'Захтев за брисање ове ставке.', 'reason': 'Молимо Вас да наведете разлог брисања:', 'error-reason': 'Морате да наведете разлог!', 'error-requested': 'Већ је поднешен захтев за брисање', 'error-api': 'Дошло је до грешке приликом подношења захтева: $1', 'success': 'Захтевање је успело', 'close': 'Затвори', 'notice': 'Пажња: дупле ставке морају да се спајају, молимо да видите Help:Merge.' },		'sv': { 'title': 'Begär radering', 'description': 'Begär att det här objektet raderas.', 'reason': 'Ange orsak till radering:', 'error-reason': 'Du måste ange en orsak!', 'error-requested': 'Objektet har redan begärts för radering', 'error-api': 'Ett fel uppstod när begäran skulle skickas in: $1', 'success': 'Begäran slutförd', 'close': 'Stäng', 'notice': 'Obs: Dubbletter behöver sammanfogas, inte raderas. Läs Help:Merge/sv.' },		'tr': { 'title': 'Silme talebi', 'description': 'Bu öğe için silme talep edin.', 'reason': 'Lütfen silme gerekçesini belirtin:', 'error-reason': 'Bir gerekçe göstermelisiniz!', 'error-requested': 'Silme zaten talep edilmiş.', 'error-api': 'Silme talebi sırasında hata oluştu: $1', 'success': 'Talep başarılı', 'close': 'Kapat', 'notice': 'Dikkat: çift öğeler artık birleştirilmektedir, lütfen Help:Merge kısmına bakın.' },		'uk': { 'title': 'Запит на вилучення', 'description': 'Подати запит на вилучення цього елемента.', 'reason': 'Будь ласка, вкажіть причину вилучення:', 'error-reason': 'Ви повинні вказати причину!', 'error-requested': 'Запит на вилучення вже подано', 'error-api': 'Сталася помилка при створенні запиту на вилучення: $1', 'success': 'Запит успішно подано', 'close': 'Закрити', 'notice': 'Увага: елементи-дублікати тепер необхідно об\'єднати; будь ласка, ознайомтесь із Help:Merge/uk.' },		'vi': { 'title': 'Đề nghị xóa', 'description': 'Đề nghị xóa mục này.', 'reason': 'Xin đưa ra lý do để xóa:', 'error-reason': 'Bạn cần phải đưa ra lý do!', 'error-requested': 'Xóa theo đề nghị', 'error-api': 'Đã xảy ra lỗi trong khi đề nghị xóa: $1', 'success': 'Đề nghị thành công', 'close': 'Đóng' },		'zh': { 'title': '请求删除', 'description': '请求删除该项目. ',			'reason': '请提供删除的理由：', 'error-reason': '您必须提供理由！', 'error-requested': '已有请求删除', 'error-api': '请求删除时出错：$1', 'success': '请求成功', 'close': '关闭', 'notice': '注意：重复的项目应该合并而不是删除，参阅Help:Merge. '		},	};	i18nData['pt-br'] = i18nData.br; i18nData.no = i18nData.nb;

// set Language var lang = mw.user.options.get( 'language' ); if ( !( lang in i18nData ) ) { lang = 'en'; }

// set Entity-Id var entityId = mw.config.get( 'wbEntityId' ); if ( !entityId ) { return; }	var entityNamespace = '', title = 'Gratisdata:Requests for deletions'; if ( entityId.substr( 0, 1 ) === 'P' ) { entityNamespace = 'Property:'; title = 'Gratisdata:Properties for deletion'; } else if ( entityId.substr( 0, 1 ) === 'L' ) { entityNamespace = 'Lexeme:'; }

// if already requested var requested = false;

/**	 * Return the localized version of a message. */	function i18n( key ) { if ( i18nData[ lang ][ key ] ) { return i18nData[ lang ][ key ]; }		return i18nData.en[ key ]; }

/**	 * Checks whether the item is requested for deletion yet. */	function check { var api = new mw.Api; api.get( {			action: 'query',			prop: 'revisions',			formatversion: 2,			rvprop: 'content',			rvslots: '*',			rvlimit: 1,			titles: title,		} ) .then( function ( data ) {			if ( data.error ) {				return;			}			var regex = '==\\s*\\[\\[([Ll]exeme:|[Pp]roperty:)?[LlPpQq]' + entityId.substr( 1 ) + '\\]\\]\\s*==';			regex += '|==\\s*\\s*==';			regex += '|';			if ( data.query.pages[ 0 ].revisions[ 0 ].slots.main.content.match( new RegExp( regex, 'g' ) ) !== null ) {				mw.notify( i18n( 'requested' ), {						autoHide: false, title: 'deletionRequest.js', tag: 'deletionRequest-exist' }				);				$( '#content' ).prepend( $( ' ' )					.css( {						float: 'right',						'z-index': 10001,						position: 'relative',						top: '4px',						right: '6px'					} ) .attr( 'id', 'requestdeletion-requested' ) .append(						$( '' )						.attr( 'href', mw.util.getUrl( title ) + '#' + entityNamespace + '' + entityId )						.append( $( ' ' )							.attr( {								src: '//upload.wikimedia.org/wikipedia/commons/thumb/1/17/Warning.svg/25px-Warning.svg.png',								title: i18n( 'requested' )							} ) )					)				);				requested = true;			}		} ); }

/**	 * Add link to top of page. */	function init { mw.loader.using( [ 'mediawiki.api', 'mediawiki.util', 'jquery.ui' ] ) .then( function {			check;			$( ' ' )			.attr( 'id', 'requestdeletion' )			.append( $( ' ' )				.attr( 'id', 'requestdeletion-form' ) .submit( requestDeletion ) .append(					$( ' ' )					.text( i18n( 'notice' ) )				) // .append(					$( ' ' )					.append( $( ' ' )						.text( i18n( 'description' ) ) ) // 					.append( $( ' ' )						.append(							$( ' ' )							.attr( 'for', 'requestdeletion-reason' )							.text( i18n( 'reason' ) )						) // .append(							$( ' ' )							.attr( { 'type': 'text', 'id': 'requestdeletion-reason' } )						) // 					) // 				)			) // 			.append( $( ' ' )				.attr( 'id', 'requestdeletion-result' ) ) // 			.appendTo( '#content' )			.dialog( { title: i18n( 'title' ), autoOpen: false, modal: true, width: 500, buttons: [ { id: 'requestdeletion-button-request', text: i18n( 'title' ), click: requestDeletion }, {					id: 'requestdeletion-button-close', text: i18n( 'close' ), click: function { $( '#requestdeletion' ).dialog( 'close' ); }				} ]			} );			var portletLink = mw.util.addPortletLink( 'p-cactions', '#',				i18n( 'title' ), 'ca-requestdeletion', i18n( 'description' ), null, '#ca-requestdeletion' );			$( portletLink ).click( function ( e ) { e.preventDefault; $( '#requestdeletion-result' ).html( '' ); $( '#requestdeletion' ).dialog( 'open' ); } );		} );	}

function requestDeletion( event ) { var reason = $( '#requestdeletion-reason' ).val; if ( requested ) { showError( 'requested' ); requested = false; // can retry }		else if ( reason === '' ) { showError( 'reason' ); }		else { addRequest(				mw.util.wikiUrlencode( entityId ),				function {					$( '#requestdeletion' ).dialog( 'close' );					mw.notify( i18n( 'success' ) );				},				reason			); }		event.preventDefault; }

function showSpinner { $( '#requestdeletion-result' ).html( ' ' ); $.createSpinner( {			size: 'large',			type: 'block',			id: 'requestdeletion-spinner'		} ).replaceAll( '#requestdeletion-spinner' ); }

function showError( err, p1 ) { $( '#requestdeletion-result' ).html(			$( ' ' )			.attr( 'class', 'error' )			.text( i18n( 'error-' + err ).replace( '$1', p1 ) )		); }

/**	 * Add new error request. * @param item item to delete * @param success function called on success * @param reason reason for deletion */	function addRequest( entity, success, reason ) { showSpinner; // Regex to change "Q####" into "Q" reason = ' ' + reason; reason = reason.replace( /[ ]([Qq][0-9]+)/g, ' $1' ); reason = reason.replace( /[ ]([Ll]exeme:[Ll][0-9]+|[Pp]roperty:[Pp][0-9]+)/g, ' $1' ); reason = reason.replace( /[ ]([Ll][0-9]+)/g, ' Lexeme:$1' ); reason = reason.replace( /[ ]([Pp][0-9]+)/g, ' Property:$1' ); // removing too too much spaces if ( reason.charAt( 0 ) === ' ' ) { reason = reason.substr( 1 ); }		var entityId = entityNamespace + '' + entity, api = new mw.Api;

api.get( {			action: 'query',			prop: 'revisions',			titles: entityId,			formatversion: 2,			rvprop: [ 'user', 'userid' ],			rvlimit: 1,			rvdir: 'newer',		} ) .then( function ( data ) {			var pg = data.query.pages[0];			if ( pg.revisions && pg.revisions[0].userid !== 0 ) {				return pg.revisions[0].user;			} else {				return null;			}		} ) .then( function ( username ) {			var summary = '/* ' + entityId + ' */ requested deletion';			if ( username && username !== mw.config.get( 'wgUserName' ) ) {				summary += ', created by User:' + username + '';			}			summary += ' (RD)';			return api.postWithEditToken( { action: 'edit', title: title, watchlist: 'nochange', section: 'new', summary: summary, sectiontitle:  + entityId + , text:  + ( reason.indexOf( '~' ) === -1 ? ' ~' :  ) + '\n', } );		} )		.then( function ( data ) {			if ( data.error && data.error.info ) {				showError( 'api', data.error.info );			} else {				success;			}		}, function ( jqXHR, textStatus, errorThrown ) {			showError( 'api', textStatus );		} ); }

$( init ); }( mediaWiki, jQuery ) ); //