MediaWiki:Gadget-Form-valutazione-enc.js

Da Semi del Verbo, l'enciclopedia dell'influenza del Vangelo sulla cultura

Nota: dopo aver pubblicato, potrebbe essere necessario pulire la cache del proprio browser per vedere i cambiamenti.

  • Firefox / Safari: tieni premuto il tasto delle maiuscole Shift e fai clic su Ricarica, oppure premi Ctrl-F5 o Ctrl-R (⌘-R su Mac)
  • Google Chrome: premi Ctrl-Shift-R (⌘-Shift-R su un Mac)
  • Internet Explorer / Edge: tieni premuto il tasto Ctrl e fai clic su Aggiorna, oppure premi Ctrl-F5
  • Opera: premi Ctrl-F5.
/**
 * Eseguito come script personale o come accessorio, aggiunge alla pagina
 * configurata in formPage alcuni elementi HTML non consentiti da Mediawiki
 * come textbox, checkbox, textarea e pulsanti, per la creazione di un form.
 * 
 * Una volta poi cliccato su "Crea la richiesta" effettua la validazione del form
 * e in caso di esito positivo crea una nuova sezione nella pagina configurata
 * in encPage, con i dati letti dal form.
 * 
 * @author [[Utente:Rotpunkt]]
 */
/* global mediaWiki, jQuery */

( function ( mw, $ ) {
	'use strict';

	// la pagina che contiene il form
	var formPage = 'Progetto:Musica/Classica/Form_valutazione_enciclopedicità';

	// la pagina dove vengono create le nuove discussioni di valutazione enciclopedicità
	var encPage = 'Progetto:Musica/Classica/Valutazione_enciclopedicità';

	// il numero di criteri, ciascuno con un checkbox gmc-mN e una textarea gmc-mN-text
	var numCriteri = 7;

	// configurazione elementi del form (gmc: gadget-musica-classica)
	var elements = {
		'gmc-musicista': { 
			tipo: 'textbox',
			placeholder: 'Nome musicista',
			msg: 'nome musicista vuoto.'
		},
		'gmc-sandbox': {
			tipo: 'textbox',
			autocomplete: true
		},
		'gmc-m1': {
			tipo: 'checkbox'
		},
		'gmc-m1-text': {
			tipo: 'textarea',
			msg: 'è selezionato il criterio M1 ma non è stato inserito in quale enciclopedia compare.'
		},
		'gmc-m2': {
			tipo: 'checkbox'
		},
		'gmc-m2-text': {
			tipo: 'textarea',
			msg: 'è selezionato il criterio M2 ma non sono stati inseriti i riferimenti bibliografici.'
		},
		'gmc-m3': { 
			tipo: 'checkbox'
		},
		'gmc-m3-text': {
			tipo: 'textarea',
			msg: 'è selezionato il criterio M3 ma non sono stati inseriti i link alle informazioni sugli album.'
		},
		'gmc-m4': { 
			tipo: 'checkbox'
		},
		'gmc-m4-text': {
			tipo: 'textarea',
			msg: 'è selezionato il criterio M4 ma non sono stati inseriti gli esempi rilevanti di concerti e/o produzioni.'
		},
		'gmc-m5': { 
			tipo: 'checkbox'
		},
		'gmc-m5-text': {
			tipo: 'textarea',
			msg: 'è selezionato il criterio M5 ma non sono stati inseriti i link alle informazioni sugli album.'
		},
		'gmc-m6': { 
			tipo: 'checkbox'
		},
		'gmc-m6-text': {
			tipo: 'textarea',
			msg: 'è selezionato il criterio M6 ma non sono stati inseriti i link alle informazioni sui concerti.'
		},
		'gmc-m7': { 
			tipo: 'checkbox'
		},
		'gmc-m7-text': {
			tipo: 'textarea',
			msg: 'è selezionato il criterio M7 ma non sono stati inseriti i riferimenti completi.'
		},
		'gmc-crea': {
			tipo: 'button',
			text: 'Crea la richiesta'
		}
	};

	/**
	 * Visualizza un messaggio.
	 * @param {string} msg - Il messaggio da visualizzare. 
	 * @param {boolean} spinner - Se impostato a true visualizza lo spinner.
	 * @param {string} url - Se impostato, redirige a quell'URL dopo aver premuto Ok.
	 */
	function showMessage( msg, spinner, url ) {
		var $dialog = $( '#gmc-dialog' );
		$dialog.empty().append( msg );
		if ( spinner ) {
			$dialog.append( '<br /><br />', $.createSpinner( { size: 'large', type: 'block' } ), '<br />' );
		}
		$dialog.dialog( {
			title: 'Richiesta parere enciclopedicità',
			width: 340,
			modal: true,
			buttons: {
				Ok: function () {
					$( this ).dialog( 'close' );
					if ( url ) {
						window.location.href = url;
					}
				}
			}
		} );
	}

	/**
	 * Visualizza l'eventuale CAPTCHA.
	 * @param {string} captchaUrl - Url dell'immagine. 
	 * @param {function} inputHandler - Gestore dell'input dell'utente.
	 */
	function showCaptcha( captchaUrl, inputHandler ) {
		var $dialog = $( '#gmc-dialog' ).empty();
		var $div = $( '<div>' ).css( 'text-align', 'center' );
		var $img = $( '<img/>' ).attr( 'src', captchaUrl );
		var $captchaWord = $( '<input/>' ).attr( 'type', 'text' ).attr( 'size', 40 );
		$div.append( $img, '<br /><br />', $captchaWord ).appendTo( $dialog );
		$dialog.dialog( {
			title: 'Scrivi i caratteri che vedi nell\'immagine',
			modal: true,
			buttons: {
				Ok: function () {
					$( this ).dialog( 'close' );
					inputHandler( $captchaWord.val() );
				},
				Annulla: function () {
					$( this ).dialog( 'close' );
				}
			}
		} );
	}

	/**
	 * Crea la nuova richiesta per la valutazione di enciclopedicità.
	 * @param {string} musicista - il nome del musicista. 
	 * @param {string} sandbox - la pagina di prova. 
	 * @param {string[]} criteri - array di criteri.
	 * @param {object} params - parametri addizionali per mw.Api.newSection
	 */
	function createRequest( musicista, sandbox, criteri, params ) {
		var text = '{{RichiestaParereEnc\n';
		text += '|nome = ' + musicista + '\n';
		text += sandbox ? '|sandbox = ' + sandbox + '\n' : '';
		$.each( criteri, function ( idx, value ) {
  			if ( value ) {
  				text += '|m' + ( idx + 1 ) + ' = ' + value + '\n';
  			}
		} );
		text += '|utente = \{\{subst:REVISIONUSER}}\n';
		text += '|data = \{\{subst:#timel: j F Y}}\n';
		text += '|firma = --\~\~\~\~\n';
		text += '}}';
		text += "\n\n'''Discussione:'''";

		showMessage( 'Creazione richiesta in corso...', true );
		new mw.Api().newSection( encPage, musicista, text, params )
			.done( function ( data ) {
				if ( data && data.edit && data.edit.captcha && data.edit.captcha.id && data.edit.captcha.url ) {
					showCaptcha( data.edit.captcha.url, function ( text ) {
						createRequest( musicista, sandbox, criteri, {
							captchaid: data.edit.captcha.id,
							captchaword: text
						} );
					} );
				} else {
					var url = mw.config.get( 'wgArticlePath' ).replace( '$1', encPage + '#footer' );
					var msg = 'Richiesta creata alla pagina:<br />';
					msg += '<a href="' + url + '">' + encPage + '</a><br /><br />';
					msg += 'Premi OK per essere rediretto alla pagina.';
					showMessage( msg, null, url );
				}
			} )
			.fail ( function ( code, data ) {
				showMessage( 'Errore nel creare la sezione: ' + data.error.info );
		} );
	}

	/**
	 * Gestore del click sul pulsante "Crea la richiesta".
	 */
	function submitHandler() {
		var musicista, sandbox, checked = false, criteri = [], error;

		musicista = $.trim( $( '#gmc-musicista' ).val() );
		sandbox = $.trim( $( '#gmc-sandbox' ).val() );

		// valida il form
		for ( var i = 1; i <= numCriteri; i++ ) {
			if ( $( '#gmc-m' + i ).prop( 'checked' ) ) {
				checked = true;
				var id = 'gmc-m' + i + '-text';
				var val = $.trim( $( '#' + id  ).val() );
				if ( val ) {
					criteri[ i - 1 ] = val;
				} else {
					$( '#' + id ).focus();
					error = elements[ id ].msg;
					break;
				}
			}
		}

		if ( !musicista ) {
			$( '#gmc-musicista' ).focus();
			error = elements[ 'gmc-musicista' ].msg;
		} else if ( !checked ) {
			error = 'nessun criterio selezionato.';
		}

		if ( error ) {
			showMessage( 'Errore: ' + error );
		} else {
			createRequest( musicista, sandbox, criteri );
		}
	}

	/**
	 * Aggiunge a un textbox l'autocompletamento per i titoli delle pagine.
	 * @param {object} el - Il textbox a cui aggiungere l'autocompletamento.
	 */
	function addAutocomplete( $el ) {
		var api = new mw.Api();
		$el.autocomplete( {
			source: function( request, response ) {
				api.get( {
					action: 'query',
					prop: 'info|pageprops',
					generator: 'prefixsearch',
					gpssearch: request.term,
					gpslimit: 10,
					redirects: true,
					ppprop: 'disambiguation',
				} ).done( function ( data ) {
					var pages = [];
					if ( data.query && data.query.pages ) {
						$.each( data.query.pages, function( i, page ) {
							pages.push( page.title );
						} );
					}
					response( pages );
				} );
			}
		} ); 
	}

	function buildForm() {
		// verifica che nella pagina esistano tutti gli elementi segnaposto necessari
		for ( var id in elements ) {
			if ( elements.hasOwnProperty( id ) ) {
				if ( !$( '#' + id ).length ) {
					console.log( '[Form-valutazione-enc.js]: ' + id + ' non trovato.' );
					return;
				}
      		}
		}

		// div per i messaggi
		$( '<div>' ).attr( 'id', 'gmc-dialog' ).appendTo( 'body' );

		// crea i nuovi elementi HTML e li sostituisce a quelli segnaposto
		$.each( elements, function( id, el ) {
			var $el;
			switch ( el.tipo ) {
				case 'checkbox':
					$el = $( '<input/>' ).attr( 'type', 'checkbox' );
					break;
				case 'textbox':
					$el = $( '<input/>' ).attr( 'type', 'text' ).attr( 'size', 80 );
					if ( el.autocomplete ) {
						addAutocomplete( $el );
					}
					break;
				case 'textarea':
					$el = $( '<textarea>' ).css( { width: '100%', height: '100%' } );
					break;
				case 'button':
					$el = $( '<button/>' ).text( el.text ).addClass( 'mw-ui-button mw-ui-progressive' ).click ( submitHandler );
					break;
			}

			// eventuale attributo placeholder
			if ( el.placeholder ) {
				$el.attr( 'placeholder', el.placeholder );
			}
			if ( id === 'gmc-sandbox' && mw.config.get( 'wgUserName' ) ) {
				$el.attr( 'placeholder', 'Utente:' + mw.config.get( 'wgUserName' ) + '/Sandbox' );
			}
			$el.attr( 'id', id );
			$( '#' + id ).replaceWith( $el );
		} );
	}

	$( function () {
		if ( mw.config.get( 'wgPageName' ) === formPage || mw.config.get( 'wgPageName' ) === formPage + '/Sandbox' ) {
			mw.loader.using( [ 'jquery.ui', 'jquery.spinner', 'mediawiki.api' ] )
				.done( buildForm )
				.fail( function () {
					console.error( 'Impossibile avviare l\'accessorio "Valutazione enc".' );
				} );
		}
	} );
}( mediaWiki, jQuery ) );