MediaWiki:Gadget-Form-valutazione-enc.js
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 ) );