Usuario:Peter Bowman/insert-delete-template.js

Nota: Después de publicar, quizás necesite actualizar la caché de su navegador para ver los cambios.

  • Firefox/Safari: Mantenga presionada la tecla Shift mientras pulsa el botón Actualizar, o presiona Ctrl+F5 o Ctrl+R (⌘+R en Mac)
  • Google Chrome: presione Ctrl+Shift+R (⌘+Shift+R en Mac)
  • Edge: mantenga presionada Ctrl mientras pulsa Actualizar, o presione Ctrl+F5
// Author: Peter Bowman @ plwikt

( function ( mw, $ ) {
	var gadget = window.insert_delete_tmpl = {
		version: 4.2
	};
	
	var api, gui, isNotifiable;
	var r_del_reason = /, ?/g;
	
	var source = [
		{
			value: 'G1',
			label: 'G1: Vandalismo',
			desc:  'Páginas como ejemplo de vandalismo, son casos evidentes de falsedad, carecen de sentido común o contienen insultos de una manera deliberada'
		},
		{
			value: 'G2',
			label: 'G2: Etiqueta',
			desc:  'Páginas que contengan insultos, o ataques a cualquier persona, sea de Wikcionario o no.'
		},
		{
			value: 'G3',
			label: 'G3: Páginas promocionales',
			desc:  'Páginas que contengan spam o textos de autopromoción, propaganda, publicidad.'
		},
		{
			value: 'G4',
			label: 'G4: Páginas de pruebas de edición',
			desc:  'Páginas que no tienen contexto claro, ni un formato enciclopédico legible.'
		},
		{
			value: 'G5',
			label: 'G5: Wikcionario no es una colección de palabras inventadas ni un directorio de nombres',
			desc:  'Cuando una entrada es un intento por engañar una audiencia haciéndola creer que algo falso es real.'
		},
		{
			value: 'G6',
			label: 'G6: Violaciones de derechos de autor',
			desc:  'La entrada consiste en la copia literal del contenido de otras páginas web o de otros medios que están protegidos por derechos de autor.'
		},
		{
			value: 'G7',
			label: 'G7: Recreación de material borrado',
			desc:  'Páginas borradas anteriormente, mediante el borrado rápido o por una consulta de borrado, y recreadas sin solucionar los criterios que llevaron a su eliminación.'
		},
		{
			value: 'G8',
			label: 'G8: A petición del único autor',
			desc:  'Siempre que no haya más ediciones en el historial si este desea fusionar el texto en otro artículo o publicarlo de otra forma.'
		},
		{
			value: 'G9',
			label: 'G9: Error ortográfico o archivo duplicado',
			desc:  'Páginas que poseen error en su escritura o ya existe bajo el lema correcto.'
		},
		{
			value: 'A1',
			label: 'A1: Lo que Wikcionario no es.',
			desc:  'Artículos de personas, empresas, grupos musicales, sitios web, entre otros, que sean claramente no de diccionario.'
		},
		{
			value: 'U3',
			label: 'U3: Si viola la política sobre páginas de usuario',
			desc:  'Ver <span style="color:#0645AD;"><a href="//es.wikipedia.org/wiki/WP:PU">política sobre páginas de usuario</a></span>.'
		},
		{
			value: 'vacío',
			label: 'Vacío: Entrada sin contenido',
			desc:  'La entrada no contiene información, está vacía o solo contiene imágenes o plantillas.'
		}
	];
	
	mw.messages.set( {
		'idt-template-name':   'destruir',
		'idt-header':          'Introduce el parámetro de la plantilla «$1»:',
		'idt-preview':         'Ver vista previa.',
		'idt-dialog-title':    'Destruir página',
		'idt-preview-button':  'Vista previa',
		'idt-delete-button':   'Destruir',
		'idt-cancel-button':   'Cancelar',
		'idt-watch-page-cbx':  'Añadir página a mi lista de seguimiento',
		'idt-notify-user-cbx': 'Notificar al usuario en su PD',
		'idt-notify-user-cpt': 'solo es posible si es el único autor de la página',
		'idt-portlet-label':   'Destruir',
		'idt-portlet-title':   'Colocar la plantilla de borrado',
		'idt-processing-call': 'Procesando llamada a API...',
		'idt-processing-tmpl': 'Procesando plantilla...',
		'idt-notifying-user':  'Notificando al usuario...',
		'idt-delete-summary':  '(script) destruir',
		'idt-notify-summary':  '(script) aviso de borrado de «[' + '[$1]]»',
		'idt-delete-reason':   'motivo: $1',
		'idt-success':         'Editado. Recargando página...',
		'idt-error':           'Error en llamada a API.'
	} );
	
	function resetInputs() {
		gui.input.val( '' );
		gui.input_val.val( '' );
		gui.input_desc.html( '' );
		gui.preview.text( mw.msg( 'idt-preview' ) );
	}
	
	function refreshState() {
		gadget.reason = gui.input_val.val() || gui.input.val();
		gadget.tmpl   = '{' + '{' + mw.msg( 'idt-template-name' ) + ( gadget.reason
			? '|' + gadget.reason.replace( r_del_reason, '|' ) + '}}'
			: '}}' );
	}
		
	function previewButtonHandler() {
		refreshState();
		gui.preview.text( mw.msg( 'idt-processing-tmpl' ) );
		api
			.parse( gadget.tmpl )
			.done( function ( data ) {
				var parsed = $.trim( data.slice( 0, data.indexOf( '<!--' ) ) );
				gui.preview.html( $( parsed ).find( 'ul' ) );
			} );
	}
	
	function deleteButtonHandler() {
		refreshState();
		
		gui.label.text( mw.msg( 'idt-processing-call' ) );
		gui.input.prop( 'disabled', true );
		
		api.postWithEditToken( {
			action:         'edit',
			title:          mw.config.get( 'wgPageName' ),
			watchlist:      gui.checkbox_watch.prop( 'checked' )
				? 'watch'
				: 'unwatch',
			prependtext:    gadget.tmpl,
			summary:        mw.format(
					gadget.reason ? '$1, $2' : '$1',
					mw.msg( 'idt-delete-summary' ),
					mw.msg( 'idt-delete-reason', gadget.reason )
				),
			nocreate:       true,
			basetimestamp:  gadget.page.revisions[ 0 ].timestamp,
			starttimestamp: gadget.curtimestamp
		} )
		.then( function ( data ) {
			if ( isNotifiable && gui.checkbox_notify.prop( 'checked' ) ) {
				notifyUser( function ( data ) {
					gui.label.text( mw.msg( 'idt-success' ) );
					window.location.reload();
				}, function ( data ) {
					if ( data && data.error ) {
						printErrorMsg( 'notify user', data.error.info );
					} else {
						gui.label.text( mw.msg( 'idt-error' ) );
					}
				} );
			} else {
				gui.label.text( mw.msg( 'idt-success' ) );
				window.location.reload();
			}
		}, function ( data ) {
			if ( data && data.error ) {
				printErrorMsg( 'delete page', data.error.info );
			} else {
				gui.label.text( mw.msg( 'idt-error' ) );
			}
		} );
	}
	
	function notifyUser( done_callback, fail_callback ) {
		gui.label.text( mw.msg( 'idt-notifying-user' ) );
		var title = gadget.page.title;
		
		api.postWithEditToken( {
			action:     'edit',
			title:      'User talk:' + gadget.page.revisions[ 0 ].user,
			appendtext: '\n{{subst:Aviso BR|' + title + '|'
				+ gadget.reason.replace( r_del_reason, '|' ) + '}} ~~' + '~~',
			summary:    mw.msg( 'idt-notify-summary', title )
		} )
		.then( done_callback, fail_callback );
	}
	
	function printErrorMsg( type, info ) {
		gui.label.html( 'Error (' + type + '): <span style="color:red;">' +
			info +
			'</span>' );
	}
	
	gadget.openDialog = function ( evt ) {
		gadget.$dialog.dialog( 'open' );
	};
	
	gadget.init = function () {
		api.get( {
			prop:    'revisions',
			rvprop:  [ 'timestamp', 'user' ],
			titles:   mw.config.get( 'wgPageName' ),
			rvlimit:  50,
			indexpageids: true,
			curtimestamp: true,
			rawcontinue: true
		} )
		.done( function ( data ) {
			var id;
			
			if ( data && data.error ) {
				return false;
			}
			
			id = data.query.pageids[ 0 ];
			gadget.page = data.query.pages[ id ];
			gadget.curtimestamp = data.timestamp;
			
			isNotifiable = true;
			
			if ( !data[ 'query-continue' ] ) {
				var rev_array = gadget.page.revisions;
				var user_name = rev_array[ 0 ].user;
				
				for ( var i = 1; i < rev_array.length; i++ ) {
					if ( user_name !== rev_array[ i ].user ) {
						isNotifiable = false;
						break;
					}
				}
			} else {
				isNotifiable = false;
			}
			
			gui.label = $( '<label>' )
				.attr( 'for', 'ac-input' )
				.text( mw.msg( 'idt-header', mw.msg( 'idt-template-name' ) ) );
			
			gui.input_val = $( '<input>' )
				.attr( {
					id:   'ac-input-value',
					type: 'hidden'
				} );
					
			gui.input_desc = $( '<p>' )
				.attr( 'id', 'ac-input-description' );
			
			gui.input = $( '<input>' )
				.attr( {
					id:   'ac-input',
					type: 'text',
					size: 34
				} )
				.on( 'focus', resetInputs )
				.autocomplete( {
					minLength: 0,
					source:    source,
					focus:     function ( event, ui ) {
						gui.input.val( ui.item.label );
						return false;
					},
					select:   function ( event, ui ) {
						gui.input
							.val( ui.item.label )
							.trigger( 'blur' );
						gui.input_val.val( ui.item.value );
						gui.input_desc.html( ui.item.desc );
						return false;
					}
				} );
			
			gui.preview = $( '<div>' )
				.attr( 'id', 'ac-input-preview' )
				.css( 'margin-top', '6px' )
				.text( mw.msg( 'idt-preview' ) );
			
			gui.checkbox_watch = $( '<input>' )
				.attr( {
					id:   'idt-watch-page',
					type: 'checkbox'
				} );
			
			gui.checkbox_notify = $( '<input>' )
				.attr( {
					id:   'idt-notify-user',
					type: 'checkbox'
				} )
				.prop( 'disabled', !isNotifiable );
			
			gadget.$dialog = $( '<div>' )
				.append( [
					gui.label,
					gui.input,
					$( '<hr>' ),
					gui.preview
				] )
				.dialog( {
					title:    mw.msg( 'idt-dialog-title' ),
					autoOpen: false,
					buttons:  [
						{
							text:  mw.msg( 'idt-preview-button' ),
							click: previewButtonHandler
						},
						{
							text:  mw.msg( 'idt-delete-button' ),
							click: deleteButtonHandler
						},
						{
							text:  mw.msg( 'idt-cancel-button' ),
							click: function () {
								gadget.$dialog.dialog( 'close' );
							}
						}
					],
					open:     function ( event, ui ) {
						gui.input.focus();
					},
					close:    function ( event, ui ) {
						resetInputs();
						refreshState();
						gui.input.autocomplete( 'close' );
					}
				} );
			
			gui.input
				.after(
					gui.input_val,
					gui.input_desc
				);
			
			gadget.$dialog
				.parent()
				.find( '.ui-dialog-buttonpane' )
				.prepend( gui.checkbox_watch, gui.checkbox_notify );
			
			gui.checkbox_watch
				.after( $( '<label>' )
					.attr( 'for', 'idt-watch-page' )
					.text( mw.msg( 'idt-watch-page-cbx' ) )
					.css( {
						'margin-left': '5px',
						'cursor':      'pointer'
					} )
				);
			
			gui.checkbox_notify
				.after( $( '<label>' )
					.attr( {
						'for':   'idt-notify-user',
						'title': mw.msg( 'idt-notify-user-cpt' )
					} )
					.text( mw.msg( 'idt-notify-user-cbx' ) )
					.css( {
						'margin-left': '5px',
						'opacity':     isNotifiable ? '1.0' : '0.5',
						'cursor':      'pointer'
					} )
				);
						
			$( mw.util.addPortletLink(
				'p-cactions',
				'#',
				mw.msg( 'idt-portlet-label' ),
				'ca-delete',
				mw.msg( 'idt-portlet-title' ),
				'D',
				'#ca-history'
			) )
			.on( 'click', gadget.openDialog );
		} );
	};
	
	if (
		mw.config.get( 'wgNamespaceNumber' ) > -1 &&
		mw.config.get( 'wgAction' ) === 'view'
	) {
		$( function () {
			mw.loader.using( [
				'mediawiki.api',
				'mediawiki.util',
				'jquery.ui'
			] )
			.done( function () {
				api = new mw.Api();
				gui = {};
				gadget.init();
			} );
		} );
	}
	
}( mediaWiki, jQuery ) );