MediaWiki:Gadget-PagesForDeletion.js

From Wikipedia, the free encyclopedia

Note: After saving, you have to bypass your browser's cache to see the changes. Internet Explorer: hold down the Ctrl key and click the Refresh or Reload button. Firefox: hold down the Shift key while clicking Reload (or press Ctrl-Shift-R). Google Chrome and Safari users can just click the Reload button. For details and instructions about other browsers, see Wikipedia:Bypass your cache.

/**
 * Get list of pages for deletion on a given date
 * @author: [[User:Helder.wiki]]
 * @tracking: [[Special:GlobalUsage/User:Helder.wiki/Tools/PagesForDeletion.js]] ([[File:User:Helder.wiki/Tools/PagesForDeletion.js]])
 */
/*jslint browser: true, white: true, plusplus: true */
/*global jQuery, mediaWiki */
( function ( $, mw /* , undefined */ ) {
'use strict';

var pfd;
if( typeof pfd === 'undefined' ) {

pfd = {};
pfd.generateTOC = function( data ){
	var	page, shortTitle, rev, i, l,
		toc = [];
	for(i=0, l=data.query.pageids.length; i< l; i++){
		page = data.query.pages[ data.query.pageids[i] ];
		shortTitle = page.title.substr(32); // 'Wikipédia:Páginas para eliminar/'.length
		rev = page.revisions[0];
		toc.push(
			'<tr><td><a href="#' +
			// Ver http://svn.wikimedia.org/viewvc/mediawiki/trunk/phase3/includes/Sanitizer.php?view=markup#l1056
			// http://svn.wikimedia.org/viewvc/mediawiki/trunk/phase3/resources/mediawiki/mediawiki.util.js?view=markup#l114
			mw.util.wikiUrlencode( shortTitle ).replace( /\//g, '.2F' ).replace(/%/g, '.') + '">' +
			shortTitle + '</a></td><td>' +
			'<a href="' + mw.util.wikiGetlink( rev.user ) + '">' + rev.user + '</a></td><td>' +
			rev.timestamp + '</td></tr>'
		);
	}
	pfd.$toc.html(
		'<table class="wikitable sortable"><caption>Índice</caption><thead><tr>' +
		'<th class="headerSort" title="Ordenar por ordem ascendente">Página</th>' +
		'<th class="headerSort" title="Ordenar por ordem ascendente">Último editor</th>' +
		'<th class="headerSort" title="Ordenar por ordem ascendente">Data/Hora</th>' +
//		'<th class="headerSort" title="Ordenar por ordem ascendente">Tamanho</th>' +
		'</tr></thead><tbody>' +
		toc.join('\n') +
		'</tbody></table>'
	).find('table').tablesorter();
};

pfd.getDataForTOC = function( list ){
	pfd.api.get( {
		action: 'query',
		prop: 'revisions',
		rvprop: 'timestamp|user', //|size
		titles: list.join('|'),
		indexpageids: true
	}, {
		ok: pfd.generateTOC
	} );
};

pfd.show = function( html ){
	var target;
	pfd.$target.append( html );
	$('#toc').remove();

	/* Add popups compatibility */
	target = pfd.$target.get(0);
	if( $.isFunction( window.setupTooltips ) ){
		target.ranSetupTooltipsAlready = false;
		window.setupTooltips( target );
	}
    pfd.addArchiveLink($('.PEferramentas').last());
};
pfd.addArchiveLink = function (element) {
    var page = $(element).children()[0].text, archivePFD = $('<a href="#" class="sysop-show eliminator-show"> Arquivar </a>').click(pfd.nicePrompt('Que tipo de arquivamento deseja fazer?', 'Comentário:', function(comment, archivePage) {
        $.ajax({
            url : mw.util.wikiScript('api'),
            type : 'POST',
            dataType : 'json',
            data : {
                format : 'json',
                action : 'edit',
                minor : false,
                title : 'Wikipédia:Páginas para eliminar/' + archivePage + pfd.selectedDate.substring(4, 6) + ' ' + pfd.selectedDate.substring(0, 4),
                text : '*[[Wikipédia:Páginas para eliminar/' + page + ']] - [['+ page + ']]' + (comment ? ' (' + comment + ')' : '') ,
                section : pfd.selectedDate.substring(6),
                summary : 'arquivando' + '[[' + page + ']]',
                token : mw.user.tokens.get('editToken')
            },
            success : function (data) {
                    if (data && data.edit && data.edit.result && data.edit.result === 'Success') {
                        pfd.useDialog('Sucesso', 'Sucesso em arquivar! (<a href="' +
                            mw.util.wikiGetlink( archivePage ) + '">Abrir</a>) <a href="' +
                            mw.util.wikiGetlink( archivePage ) + '?diff=0">(diff)</a>', 'nprompt-dialog');
                    } else {
                        pfd.useDialog('Erro!!', 'Houve um erro ao requisitar a edição da página. Código: ' + data.error.code + '": ' + data.error.info, 'nprompt-dialog');
                    }
            },
            error : function () {
                    pfd.useDialog('Erro!!', 'Houve um erro ao usar AJAX para editar a página.', 'nprompt-dialog');
                }
        });
    }));
    $($(element).children()[1]).before($(archivePFD));
};
pfd.nicePrompt = function (title, label, callback) {
    $('<div id="nprompt-dialog" class="ui-widget">' + '<label for="nprompt-input">' + label + '</label>' + '<input type="text" id="nprompt-input-text" /><div></div><input type="radio" name="nprompt-input-radio" value="Arquivo de mantidas/" />Mantida<input type="radio" name="nprompt-input-radio" value="Arquivo de eliminadas/" />Eliminada </div>').dialog({
        title: title,
        open: function () {
            $(".ui-dialog-titlebar-close").hide();
        },
        close: function () {
        $('#nprompt-dialog').dialog('destroy');
        $('#nprompt-dialog').remove();
        },
        buttons: {
            "OK": function () {
                callback($('#nprompt-input-text').val(), $('input[name=nprompt-input-radio]:checked').val());
            },
            Cancelar: function() {
                pfd.useDialog('Ah!', 'Você cancelou!', 'nprompt-dialog');
            }
        }         
    });
};
pfd.useDialog = function (title, message, id) {
    $('#' + id).empty();
    $('#' + id).dialog("option", "title", title);
    $('#' + id).append($('<div>' + message + '</div>'));
    $('#' + id).dialog("option", "buttons", { "Fechar": function() {
        $(this).dialog("close");
    } } );
};
    
pfd.parse = function( titles ){
	pfd.$info.html(
		'Consultando a proposta de eliminação da página "' +
			titles[0].substr(32) + // 'Wikipédia:Páginas para eliminar/'.length === 32
			(titles.length === 1
				? '" (não há mais páginas'
				: '" (há ' + (titles.length - 1) +
					(titles.length === 2
						? ' outra página'
						: ' outras páginas'
					)
			) + ' na lista).'
	);
	$.get(
		mw.util.wikiGetlink( titles.shift() ) + '?action=render',
		function( pageHTML ) {
			if( titles.length === 0 ){
				pfd.$calendar
					.datepicker( 'enable' )
					.datepicker( 'refresh' );
				$.removeSpinner('pfd');
				pfd.$info.empty();
			} else {
				pfd.parse( titles );
			}
			pfd.show( pageHTML );
		}
	);
};

pfd.filter = function( date ){
	var	today = $.datepicker.formatDate('yymmdd', new Date() );
	pfd.selectedDate = date || mw.util.getParamValue('data') || today;
	pfd.selectedPages = [];
	/*jslint unparam: true*/
	$.each(pfd.allPages, function(i, page){
		if ( page.sortkeyprefix === pfd.selectedDate ){
			pfd.selectedPages.push( page.title );
		}
	});
	/*jslint unparam: false*/
	pfd.numberOfPagesToShow = pfd.selectedPages.length;
	if( pfd.numberOfPagesToShow === 0 ){
		pfd.$info.html(
			'Nenhuma das votações de páginas propostas para eliminação termina em ' +
				$.datepicker.formatDate(
					'dd/mm/yy',
					$.datepicker.parseDate('yymmdd', pfd.selectedDate)
				)  + '.'
		);
		pfd.$calendar
			.datepicker( 'enable' )
			.datepicker( 'refresh' );
		$.removeSpinner('pfd');
		return;
	}
	pfd.$info.html(
		'Obtendo o conteúdo de ' + pfd.selectedPages.length +
			(pfd.selectedPages.length !== 1? ' propostas' : ' proposta' ) + ' de eliminação...'
	);
	pfd.getDataForTOC( pfd.selectedPages );
	pfd.parse( pfd.selectedPages );
};

pfd.beforeShowDay = function( date ) {
	var pages;
	if ( typeof pfd.total === 'undefined' ) {
		return [ true, '' ];
	}
	pages = pfd.total[ $.datepicker.formatDate('yymmdd', date) ];
	return [
		typeof pages !== 'undefined' && pages !== 0, // Enabled on days with at least one page
		pages === pfd.orderedTotals[0] // Is it the day with most pages?
			? 'top-1'
			: pages === pfd.orderedTotals[1]
				? 'top-2'
				: '',
		pages
			? pages + (pages !== 1? ' votações terminam' : ' votação termina' ) + ' neste dia'
			: 'Nenhuma votação termina neste dia'
	];
};

pfd.analyseAndFilterCategory = function( data ){
	var reDays = /\d+ de (?:(?:jan|fever)eiro|março|abril|maio|ju[nl]ho|agosto|(?:outu|(?:set|nov|dez)em)bro)$/g;
	pfd.total = {};
	pfd.allPages = $.grep( data.query.categorymembers, function(n){
		if( reDays.test( n.title ) ){
			// This is a page from old system, and is not used for voting
			return false;
		}
		if( typeof pfd.total[ n.sortkeyprefix ] === 'undefined' ) {
			pfd.total[ n.sortkeyprefix ] = 1;
		} else {
			pfd.total[ n.sortkeyprefix ]++;
		}
		return true;
	});
	// Get quantities, discarding the dates
	pfd.orderedTotals = $.map( pfd.total, function( quantity /*, date */ ) {
		return quantity;
	}).sort(function (a,b){
		return b - a; // Descending order
	});

	if( mw.config.get('wgPageName') === 'Wikipédia:Páginas_para_eliminar/Lista' ){
		pfd.$calendar
			.datepicker( 'disable' )
			.datepicker( 'refresh' );
		pfd.filter();
	} else {
		pfd.$target.empty();
		pfd.$info.empty();
		pfd.$calendar.datepicker( 'refresh' );
		$.removeSpinner('pfd');
	}
};

pfd.run = function(){
	var	cat = 'Categoria:!Itens propostos para eliminação',
		urlDate = mw.util.getParamValue('data');
	pfd.api = new mw.Api({
		ajax: {
			err: function( code, result ){
				var	msg = 'Houve um erro ao usar a API (code=' + code +
						', exception=' + result.exception +
						', textStatus=' + result.textStatus + '). ',
					date = $.datepicker.parseDate('yymmdd', pfd.selectedDate),
					months = [
						'janeiro', 'fevereiro', 'março',
						'abril', 'maio', 'junho',
						'julho', 'agosto', 'setembro',
						'outubro', 'novembro', 'dezembro'
					],
					cat;
				if (pfd.selectedDate){
					cat = 'Categoria:Itens candidatos à eliminação/' +
						$.datepicker.formatDate( 'dd', date ) + ' de ' +
						months[ parseInt( $.datepicker.formatDate( 'm', date ), 10 ) - 1 ];
					msg += 'Tente novamente ou utilize a <a href="' +
						mw.util.wikiGetlink(cat) + '">' + cat +
						'</a> enquanto o problema persistir.';
				}
				pfd.$info.html( msg );
				pfd.$calendar
					.datepicker( 'enable' )
					.datepicker( 'refresh' );
				$.removeSpinner('pfd');
			}
		}
	});
	pfd.$target = $('#pfd-content');
	if( pfd.$target.length === 0 ){
		pfd.$info = $('<div id="pfd-info"></div>');
		pfd.$toc = $('<div id="custom-toc"></div>');
		pfd.$target = $( '<div id="pfd-content"></div>' ).appendTo(
			mw.util.$content.find('.mw-content-ltr').first()
		).after( pfd.$info ).before( pfd.$toc );
	}
	pfd.$info.injectSpinner('pfd');
	pfd.$info.html( 'Consultando a <a href="' + mw.util.wikiGetlink(cat) + '">' + cat + '</a>...' );
	pfd.api.get( {
		action: 'query',
		list: 'categorymembers',
		cmnamespace: 4,
		cmtitle: cat,
		cmprop: 'title|sortkeyprefix',
		cmlimit: 500,
		cmsort: 'sortkey'
	}, {
		ok: pfd.analyseAndFilterCategory
	} );
	mw.util.addCSS('#calendar .ui-datepicker {margin: 0 auto;} .top-1 { background-color: #f66; } .top-2 { background-color: #ff6; }');
	pfd.$calendar = $('#calendar').empty();
	pfd.$calendar.datepicker({
		onSelect: function(dateText /*, inst */ ) {
			var	date = $.datepicker.parseDate('dd/mm/yy', dateText),
				formattedDate = $.datepicker.formatDate('yymmdd', date );
			if( mw.config.get('wgPageName') === 'Wikipédia:Páginas_para_eliminar/Lista' ){
				pfd.$calendar
					.datepicker( 'disable' )
					.datepicker( 'refresh' );
				pfd.$target.empty();
				pfd.$toc.empty();
				pfd.$info.injectSpinner('pfd');
				pfd.filter( formattedDate );
			} else {
				window.location.href = mw.util.wikiGetlink( 'Wikipédia:Páginas para eliminar/Lista' ) +
					'?data=' + formattedDate;
			}
		},
		beforeShowDay: pfd.beforeShowDay
	});
	if ( urlDate ){
		pfd.$calendar.datepicker('setDate', $.datepicker.parseDate('yymmdd', urlDate) );
	}
};

if( $.inArray( mw.config.get('wgAction'), ['view', 'purge'] ) !== -1 ){
	$(function(){
		if( $('#pe-header').length !== 0 ){
			mw.loader.using([
				'mediawiki.api',
				'jquery.spinner',
				'jquery.ui.datepicker',
				'jquery.tablesorter'
			], pfd.run);
		}
	});
}

} // typeof pfd

}( jQuery, mediaWiki ) );