MediaWiki:Gadget-Requests-Wizard-core.js
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> */