MediaWiki:Gadget-nav-requisiti.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.

/**
 * Gadget-nav-requisiti.js
 * Aggiunge nella barra laterale un link "Verifica requisiti di voto" per visualizzare
 * le informazioni su data di registrazione, primo, 50esimo e 500esimo edit di un utente.
 * 
 * Questa è una riscrittura da zero di:
 * http://it.wikipedia.org/w/index.php?title=Wikipedia:Monobook.js/Requisiti.js&oldid=38597188
 *
 * @author https://it.wikipedia.org/wiki/Utente:Rotpunkt
 */
/* global mediaWiki, jQuery, OO */

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

	// la finestra di dialogo per la ricerca delle informazioni utente
	var searchDialog;
	var searchDialog2;

	/**
	 * Ricerca ID e data di registrazione di un utente.
	 *
	 * @param {string} user - Il nome dell'utente
	 * @param {function} infoHandler - La funzione da richiamare con i risultati
	 */
	function getUserInfo( user, infoHandler ) {
		new mw.Api().get( {
				action: 'query',
				list: 'users',
				ususers: user,
				usprop: 'registration',
				format: 'json'
		} ).done( function ( data ) {
			infoHandler( data.query.users[0] );
		} );
	}

	/**
	 * Ricerca i 500 contributi utente successivi alla data "start".
	 *
	 * @param {string} user - Il nome dell'utente
	 * @param {string} start - La data di inizio
	 * @param {function} contribsHandler - La funzione da richiamare con i risultati
	 */
	function getUserContribs( user, start, contribsHandler ) {
		new mw.Api().get( {
			action: 'query',
			list: 'usercontribs',
			ucuser: user,
			ucprop: 'timestamp',
			ucstart: start,
			ucdir: 'newer',
			uclimit: '500',
			format: 'json'
		} ).done( function ( data ) {
			contribsHandler( data.query.usercontribs );
		} );
	}

	function getUserContribs2( user, endDateObject, contribsHandler ) {
		var contribs = {};
		var thirtyDays = 30 * 24 * 60 * 60 * 1000, sixtyDays = 60 * 24 * 60 * 60 * 1000;
		var basePath = 'https://xtools.wmcloud.org/api/user/simple_editcount/it.wikipedia/' + user + '/all//';
		$.when(
			$.get( basePath + endDateObject.toISOString().slice( 0, 10 ) ),
			$.get( basePath + new Date( endDateObject.getTime() - sixtyDays ).toISOString().slice( 0, 10 ) )
		).then( function ( data1, data2 ) {
			contribs.d1 = data1[0].live_edit_count + data1[0].deleted_edit_count;
			contribs.d2 = data2[0].live_edit_count + data2[0].deleted_edit_count;
			if ( contribs.d2 > 0 ) {
				return $.Deferred().resolve();
			} else {
				return $.get(
					basePath + new Date( endDateObject.getTime() - thirtyDays ).toISOString().slice( 0, 10 )
				);
			}
		} ).then( function ( data3 ) {
			if ( data3 ) {
				contribs.d3 = data3.live_edit_count + data3.deleted_edit_count;
			}
			contribsHandler( contribs );
		} );
	}

	/**
	 * Parsifica un timestamp in date (1 gen 2001) e time (01:23).
	 *
	 * @param {string} timestamp - Il timestamp da parsificare
	 * @return {string} La data nel formato '1 gen 2001 alle 01:23'
	 */
	function parseTimestamp( timestamp ) {
		var date, hours, minutes, months;

		date = new Date( timestamp );
		hours = date.getHours();
		minutes = date.getMinutes();
		months = [
			'gen', 'feb', 'mar', 'apr', 'mag', 'giu',
			'lug', 'ago', 'set', 'ott', 'nov', 'dic'
		];

		return date.getDate() + ' ' + months[date.getMonth()] + ' ' +
			   date.getFullYear() + ' alle ' +
			   ( hours < 10 ? '0' + hours : hours ) + ':' +
			   ( minutes < 10 ? '0' + minutes : minutes );
	}

	/**
	 * Formatta le informazioni su data di registrazione, primo, 50esimo e 500esimo edit di un utente.
	 *
	 * @param {string} registration - La data di registrazione
	 * @param {string} contribs - I primi 500 contributi
	 * @return {string} Le informazioni formattate
	 */
	function formatResult( registration, contribs ) {
		var info = '', totcontribs = 'ha fatto solo ' + contribs.length + ' modifiche';
		info += 'Registrazione: ' + (registration ? parseTimestamp( registration ) : 'pre 2006') + '<br/>';
		info += 'Prima modifica: ' + ( contribs.length > 0 ? parseTimestamp( contribs[0].timestamp ) : totcontribs ) + '<br/>';
		info += '50esima modifica: ' + ( contribs.length >= 50 ? parseTimestamp( contribs[49].timestamp ) : totcontribs ) + '<br/>';
		info += '500esima modifica: ' + ( contribs.length >= 500 ? parseTimestamp( contribs[499].timestamp ) : totcontribs );
		return info;
	}

	function formatResult2( registration, contribs ) {
		var info = '';
		info += 'Registrazione: ' + (registration ? parseTimestamp( registration ) : 'pre 2006') + '<br/>';
		info += 'Almeno una modifica 30 giorni prima: ' + ( contribs.d2 > 0 || contribs.d3 > 0 ? '✓' : '✗' ) + '<br/>';
		info += 'Almeno una modifica 60 giorni prima: ' + ( contribs.d2 > 0 ? '✓' : '✗' ) + '<br/>';
		info += '50esima modifica: ' + ( contribs.d1 >= 50 ? '✓' : '✗' ) + '<br/>';
		info += '500esima modifica: ' + ( contribs.d1 >= 500 ? '✓' : '✗' );
		return info;
	}

	/**
	 * Gestore del click sul pulsante "Cerca".
	 */
	function searchHandler() {
		var user = $.trim( searchDialog.textInput.getValue() );
		if ( !user ) {
			searchDialog.resultLabel.setLabel( $( '<p>Il nome utente &egrave; obbligatorio.</p>' ) );
		} else {
			searchDialog.resultLabel.setLabel( 'Ricerca in corso...' );
			getUserInfo( user, function ( userInfo ) {
				if ( userInfo.userid ) {
					getUserContribs( user, userInfo.registration || '2001', function ( contribs ) {
						searchDialog.resultLabel.setLabel( $( '<p>' + formatResult( userInfo.registration, contribs ) + '</p>' ) );
					} );
				} else {
					searchDialog.resultLabel.setLabel( $( '<p>L\'utente ' + user + ' non &egrave; registrato.</p>' ) );
				}
			} );
		}
	}

	function searchHandler2() {
		var user = $.trim( searchDialog2.textInput.getValue() );
		var date = $.trim( searchDialog2.dateInput.getValue() );
		var dateObject = new Date( date );
		if ( !user ) {
			searchDialog2.resultLabel.setLabel( $( '<p>Il nome utente &egrave; obbligatorio.</p>' ) );
		} else if ( !date || !/^\d{4}\-\d\d\-\d\d$/.test( date ) || isNaN( dateObject ) ) {
			searchDialog2.resultLabel.setLabel( $( '<p>Inserire una data valida.</p>' ) );
		} else {
			searchDialog2.resultLabel.setLabel( 'Ricerca in corso...' );
			getUserInfo( user, function ( userInfo ) {
				if ( userInfo.userid ) {
					getUserContribs2( user, dateObject, function ( contribs ) {
						searchDialog2.resultLabel.setLabel( $( '<p>' + formatResult2( userInfo.registration, contribs ) + '</p>' ) );
					} );
				} else {
					searchDialog2.resultLabel.setLabel( $( '<p>L\'utente ' + user + ' non &egrave; registrato.</p>' ) );
				}
			} );
		}
	}

	/**
	 * Crea la finestra di dialogo per la ricerca delle informazioni utente.
	 * 
	 * @return {Object} L'oggetto derivato da OO.ui.Dialog che rappresenta la finestra
	 */
	function buildSearchDialog() {
		var style = '.grv-container { height: 80px }' + 
					'.grv-container-button { width: 100%; text-align: center }';
		mw.util.addCSS( style );
		function SearchDialog( config ) {
			SearchDialog.parent.call( this, config );
		}
		OO.inheritClass( SearchDialog, OO.ui.Dialog );
		SearchDialog.static.name = 'searchDialog';
		SearchDialog.prototype.initialize = function () {
			SearchDialog.parent.prototype.initialize.call( this );
			var resultLabel = new OO.ui.LabelWidget( {
				classes: [ 'grv-container' ],
				label: ' '
			} );
			var textInput = new mw.widgets.UserInputWidget();
			textInput.on( 'enter', searchHandler );
			var textInputLayout = new OO.ui.FieldLayout( textInput, {
				label: 'Nome utente:',
				align: 'top' 
			} );
			var searchButton = new OO.ui.ButtonWidget( {
				label: 'Cerca',
			} ).on( 'click', searchHandler );
			var cancelButton = new OO.ui.ButtonWidget( {
				label: 'Annulla'
			} ).on( 'click', function () {
				searchDialog.close();
			} );
			var buttons = new OO.ui.HorizontalLayout( {
				items: [ searchButton, cancelButton ],
				classes: [ 'grv-container-button' ]
			} );
			this.textInput = textInput;
			this.resultLabel = resultLabel;
			this.panelLayout = new OO.ui.PanelLayout( { padded: true, expanded: false } );
			this.panelLayout.$element.append( textInputLayout.$element, resultLabel.$element, buttons.$element );
			this.$body.append( this.panelLayout.$element );
		};
		SearchDialog.prototype.getBodyHeight = function () {
			return this.panelLayout.$element.outerHeight( true );
		};
		return new SearchDialog( {
			size: 'small'
		} );
	}

	function buildSearchDialog2() {
		var style = '.grv-container { height: 100px; margin: .4em 0 .6em }' + 
					'.grv-container-button { width: 100%; text-align: center }';
		mw.util.addCSS( style );
		function SearchDialog( config ) {
			SearchDialog.parent.call( this, config );
		}
		OO.inheritClass( SearchDialog, OO.ui.Dialog );
		SearchDialog.static.name = 'searchDialog';
		SearchDialog.prototype.initialize = function () {
			SearchDialog.parent.prototype.initialize.call( this );
			var resultLabel = new OO.ui.LabelWidget( {
				classes: [ 'grv-container' ],
				label: ' '
			} );
			var textInput = new mw.widgets.UserInputWidget( {
				required: true
			} );
			textInput.on( 'enter', searchHandler );
			var textInputLayout = new OO.ui.FieldLayout( textInput, {
				label: 'Nome utente:',
				align: 'top' 
			} );
			var $dateOverlay = $( '<div>' ).appendTo( this.$element );
			var dateInput = new mw.widgets.DateInputWidget( {
				required: true,
				$overlay: $dateOverlay
			} );
			var dateInputLayout = new OO.ui.FieldLayout( dateInput, {
				label: 'Data inizio procedura:',
				align: 'top' 
			} );
			var searchButton = new OO.ui.ButtonWidget( {
				label: 'Cerca',
			} ).on( 'click', searchHandler2 );
			var cancelButton = new OO.ui.ButtonWidget( {
				label: 'Annulla'
			} ).on( 'click', function () {
				searchDialog2.close();
			} );
			var buttons = new OO.ui.HorizontalLayout( {
				items: [ searchButton, cancelButton ],
				classes: [ 'grv-container-button' ],
				align: 'top'
			} );
			this.textInput = textInput;
			this.dateInput = dateInput;
			this.resultLabel = resultLabel;
			this.panelLayout = new OO.ui.PanelLayout( { padded: true, expanded: false } );
			this.panelLayout.$element.append( textInputLayout.$element, dateInputLayout.$element, resultLabel.$element, buttons.$element );
			this.$body.append( this.panelLayout.$element );
		};
		SearchDialog.prototype.getBodyHeight = function () {
			return this.panelLayout.$element.outerHeight( true );
		};
		return new SearchDialog( {
			size: 'small'
		} );
	}

	$( function () {
		var windowManager;
		var windowManager2;
		var portletLink = mw.util.addPortletLink( 'p-navigation', '#', 'Verifica requisiti di voto' );
		var portletLink2 = mw.util.addPortletLink( 'p-navigation', '#', 'Verifica requisiti di voto v2' );
		$( portletLink ).click( function ( event ) {
			event.preventDefault();
			mw.loader.using( [ 'mediawiki.api', 'oojs-ui-core', 'oojs-ui-widgets',
				'oojs-ui-windows', 'mediawiki.widgets.UserInputWidget' ] )
					.done( function () {
						if ( !searchDialog ) {
							searchDialog = buildSearchDialog();
							windowManager = new OO.ui.WindowManager();
							$( 'body' ).append( windowManager.$element );
							windowManager.addWindows( [ searchDialog ] );
						}
						windowManager.openWindow( searchDialog );
					} )
					.fail( function () {
						console.error( 'Impossibile avviare l\'accessorio "requisiti".' );
					} );
		} );
		$( portletLink2 ).click( function ( event ) {
			event.preventDefault();
			mw.loader.using( [ 'mediawiki.api', 'oojs-ui-core', 'oojs-ui-widgets',
				'oojs-ui-windows', 'mediawiki.widgets.UserInputWidget',
				'mediawiki.widgets.DateInputWidget' ] )
					.done( function () {
						if ( !searchDialog2 ) {
							searchDialog2 = buildSearchDialog2();
							windowManager2 = new OO.ui.WindowManager();
							$( 'body' ).append( windowManager2.$element );
							windowManager2.addWindows( [ searchDialog2 ] );
						}
						windowManager2.openWindow( searchDialog2 );
					} );
		} );
	} );
}( mediaWiki, jQuery ) );