MediaWiki:Gadget-Requests-Wizard-core.js

Da Wikipedia, l'enciclopedia libera.
Vai alla navigazione Vai alla ricerca

Questa pagina definisce alcuni parametri di aspetto e comportamento generale di tutte le pagine. Per personalizzarli vedi Aiuto:Stile utente.


Nota: dopo aver salvato è necessario pulire la cache del proprio browser per vedere i cambiamenti (per le pagine globali è comunque necessario attendere qualche minuto). Per Mozilla / Firefox / Safari: fare clic su Ricarica tenendo premuto il tasto delle maiuscole, oppure premere Ctrl-F5 o Ctrl-R (Command-R su Mac); per Chrome: premere Ctrl-Shift-R (Command-Shift-R su un Mac); per Konqueror: premere il pulsante Ricarica o il tasto F5; per Opera può essere necessario svuotare completamente la cache dal menù Strumenti → Preferenze; per Internet Explorer: mantenere premuto il tasto Ctrl mentre si preme il pulsante Aggiorna o premere Ctrl-F5.

/**
 * Accessorio che permette di creare nuove richieste in pagine di servizio
 * mediante una finestra modale, anziché utilizzare editintro e preload.
 * 
 * I pulsanti per l'accessorio dovrebbero essere generati mediante {{Pulsante richieste}}.
 *
 * Per far sì che il dialog si apra al caricamento della pagina, aggiungere il
 * parametro `openrequestswizard=1` all'URL.
 */
/* global mediaWiki, jQuery, OO */
/* <nowiki> */

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

	var api;

	/**
	 * Funzione eseguita quando viene inviato il form
	 *
	 * @param {Object} dialog L'oggetto NewRequestDialog
	 * @param {String} page Pagina da modificare
	 * @param {String} newText Testo da aggiungere alla pagina
	 * @param {String} summary Oggetto della modifica e titolo della sezione
	 * @param {String} successMsg Messaggio da usare se tutto va a buon fine
	 */
	function submitHandler( dialog, page, newText, summary, successMsg ) {
		return addRequest( page, newText, summary ).then(
			function () {
				dialog.close();
				OO.ui.alert( successMsg ).done( function () {
					window.location.href = mw.util.getUrl( page + '#footer' );
				} );
			},
			function ( apiCode, apiData ) {
				var errorStr, recoverable;
				if ( apiCode === 'abusefilter-warning' || apiCode === 'abusefilter-disallowed' ) {
					// Usa un oggetto jQuery, altrimenti la stringa viene interpretata come plaintext
					errorStr = $( $.parseHTML( apiData.errors[0]['*'] ) );
					recoverable = apiCode === 'abusefilter-warning';
				} else {
					errorStr = 'Errore nella modifica della pagina';
					recoverable = true;
				}
				return $.Deferred().reject( new OO.ui.Error( errorStr, { recoverable: recoverable } ) );
			}
		);
	}

	/**
	 * Inserisce la richiesta
	 *
	 * @param {String} page Pagina da modificare
	 * @param {String} newText Testo da aggiungere alla pagina
	 * @param {String} summary Oggetto della modifica e titolo della sezione
	 */
	function addRequest( page, newText, summary ) {
		return api.postWithEditToken( {
				action: 'edit',
				title: page,
				section: 'new',
				text: newText,
				summary: summary,
				// Parametri necessari per poter mostrare correttamente eventuali messaggi
				// di avviso del filtro (e potenzialmente altro).
				errorformat: 'html',
				errorsuselocal: 1
			} )
			.fail( function ( code, data ) {
				console.error( 'Errore in edit API:', code, data );
			} );
	}

	/**
	 * Crea il dialog per inserire una nuova richiesta
	 *
	 * @param {Object} conf Configurazione per la pagina attuale
	 */
	function createDialog( conf ) {
		mw.util.addCSS(
			'.requests-wizard-intro-text { margin-bottom: 2em }' +
			'.requests-wizard-textarea-resize-vertical textarea { resize: vertical; }'
		);
		function NewRequestDialog( config ) {
			NewRequestDialog.parent.call( this, config );
		}
		OO.inheritClass( NewRequestDialog, OO.ui.ProcessDialog );
		NewRequestDialog.static.name = 'newRequestDialog';
		NewRequestDialog.static.title = conf.dialogTitle;
		NewRequestDialog.static.actions = [
			{
				action: 'save',
				label: 'Invia',
				flags: [ 'primary', 'progressive' ]
			},
			{
				label: 'Cancel',
				flags: [ 'safe', 'close' ]
			}
		];
		NewRequestDialog.prototype.formFields = [];
		NewRequestDialog.prototype.setFields = function ( fields ) {
			var self = this;
			this.formFields = fields;
			this.formFields.forEach( function ( field ) {
				field.getField().connect( self, { 'change': 'onFieldChange' } );
			} );
		};
		NewRequestDialog.prototype.onFieldChange = function () {
			this.actions.setAbilities( { save: this.requiredFieldsAreFilled() } );
		};
		NewRequestDialog.prototype.initialize = function () {
			NewRequestDialog.parent.prototype.initialize.call( this );
			this.panel = new OO.ui.PanelLayout( { 
				padded: true, 
				expanded: false 
			} );
			if ( 'getIntroText' in conf ) {
				var $introEl = $( '<div>', { class: 'requests-wizard-intro-text' } );
				this.panel.$element.append( $introEl );
				conf.getIntroText( api )
					.done( function ( text ) {
						$introEl.html( text );
					} )
					.fail( function () {
						console.error( "Errore nell'ottenere introtext" );
					} );
			}
			this.content = new OO.ui.FieldsetLayout();
			conf.buildForm( this );
			this.content.addItems( this.formFields );
			this.panel.$element.append( this.content.$element );
			this.$body.append( this.panel.$element );
		};
		NewRequestDialog.prototype.getSetupProcess = function( data ) {
			return NewRequestDialog.super.prototype.getSetupProcess.call( this, data )
				.next( function () {
					this.onFieldChange();
				}, this );
		};
		NewRequestDialog.prototype.getActionProcess = function ( action ) {
			var self = this;
			return NewRequestDialog.super.prototype.getActionProcess.call( this, action )
				.next( function () {
					if ( action === 'save' ) {
						if ( !self.requiredFieldsAreFilled() ) {
							return $.Deferred().reject(
								new OO.ui.Error( 'Compilare tutti i campi obbligatori', { recoverable: false } )
							);
						}
						var data = conf.getSubmitData( self );
						if ( !( 'text' in data ) || !( 'summary' in data ) ) {
							return $.Deferred().reject( 'Errore nel gadget Requests-Wizard' );
						}
						return submitHandler( self, conf.reqPage, data.text, data.summary, conf.successMsg );
					}
				} );
		};
		NewRequestDialog.prototype.requiredFieldsAreFilled = function () {
			var formFields = this.content.getItems();
			for ( var i in formFields ) {
				var input = formFields[i].getField();
				if ( typeof input.isRequired === 'function' && input.isRequired() && input.getValue() === '' ) {
					return false;
				}
			}
			return true;
		};
		NewRequestDialog.prototype.getBodyHeight = function () {
			return conf.dialogHeight || 500;
		};
		return new NewRequestDialog( {
			size: conf.dialogSize || 'medium'
		} );
	}

	var dialog, windowManager;
	/**
	 * Apre il dialog, inizializzandolo se necessario.
	 * @param {Object} conf Configurazione per la pagina attuale
	 */
	function openDialog( conf ) {
		if ( !dialog ) {
			dialog = createDialog( conf );
			windowManager = new OO.ui.WindowManager();
			$( 'body' ).append( windowManager.$element );
			windowManager.addWindows( [ dialog ] );
		}
		windowManager.openWindow( dialog );
	}

	/**
	 * Inizializza il gadget, aggiungendo un listener al pulsante per la creazione
	 * di nuove richieste.
	 *
	 * @param {Object} conf Configurazione per la pagina attuale
	 */
	function initGadget( conf ) {
		var currentrev;
		api = new mw.Api();
		mw.hook( 'wikipage.content' ).add( function ( $content ) {
			var $btn = $content.find( '#' + conf.buttonID );
			if ( !$btn.length ) {
				console.error( 'Pulsante per creare richieste non trovato!' );
				return;
			}

			$btn.on( 'click', function ( e ) {
				// Il pulsante funziona anche senza JS grazie all'href, quindi qui
				// occorre impedire il reindirizzamento.
				e.preventDefault();
				openDialog( conf );
			} );
		} );
		
		if ( mw.util.getParamValue('openrequestswizard') ) {
			openDialog( conf );
		}
	}

	$( function () {
		var config = require( './Requests-Wizard-Config.js' );
		var curPage = mw.config.get( 'wgPageName' );
		// Nota: alcuni controlli sono gestiti da gadgets-definition e da Requests-Wizard.js.
		if ( curPage in config ) {
			mw.loader.using( [
				'oojs-ui-core', 'oojs-ui-widgets', 'oojs-ui-windows',
				'mediawiki.widgets', 'mediawiki.widgets.UserInputWidget',
				'mediawiki.util', 'mediawiki.Title', 'mediawiki.api'
				] )
				.done( function () {
					initGadget( config[curPage] );
				} )
				.fail( function ( e ) {
					console.error( 'Errore ResourceLoader nel gadget requests-wizard: ' + e );
				} );
		}
	} );
}( mediaWiki, jQuery ) );
/* </nowiki> */