MediaWiki:ProcessFileList.js

From Wikimedia Commons, the free media repository
Jump to navigation Jump to search
Note: After saving, you have to bypass your browser's cache to see the changes. Internet Explorer: press Ctrl-F5, Mozilla: hold down Shift while clicking Reload (or press Ctrl-Shift-R), Opera/Konqueror: press F5, Safari: hold down Shift + Alt while clicking Reload, Chrome: hold down Shift while clicking Reload.
// <nowiki>
// (c) 2012 by Rainer Rillke
/* global $, mw */
$.when(mw.loader.using('mediawiki.util'), $.ready).then(function () {
'use strict';
if (mw.config.get('wgPageName') !== 'User:Filbot/Report') return;

$('div#mw-content-text.mw-content-ltr ul:last').find('li').each(function (i, e) {
	try {
		var $e = $(e);
		var file = decodeURIComponent($e.find('a').attr('href').match(/(?:\/|title\=)(File:.+?)(?:\&action\=edit.+)?$/i)[1].replace(/_/g, ' '));
		$e.data('reFile', file).prepend($('<a>', { href: '#', text: '[rm from list]', title: 'Mark this as done. Requests are queued. Empty the queue before leaving the page.' }).click(
			function (e) {
				e.preventDefault();
				$(this).fadeOut();
				addToDoneQueue(file, $e);
			}
		), ' ');
	} catch (ex) {
	}
});

var doneQueue = [];
var DOMQueue = [];
var lastListPageContent = '';
var queueSize = 25;

var markRedlinks = function () {
	queueSize = 200;
	$('div#mw-content-text.mw-content-ltr ul:last').find('li a.new').siblings('a').click();
	queueSize = 25;
};

var addToDoneQueue = function (file, domE) {
	if (sendingRequest) {
		setTimeout(function () {
			addToDoneQueue(file, domE);
		}, 1000);
		return;
	}
	doneQueue.push(file);
	DOMQueue.push(domE);
	reQueueNode.find('#queueCounter').text(doneQueue.length);
	if (doneQueue.length > 25) processDoneQueue();
};

var processing = false;
var sendingRequest = false;
var processDoneQueue = function () {
	if (processing) return;
	processing = true;
	var doRemove = function (pageText) {
		var l = doneQueue.length;
		sendingRequest = true; // Prevent adding further files to the list

		reQueueNode.find('#queueCounter').text('Processing..');

		if (lastListPageContent && lastListPageContent !== pageText)
			reQueueNode.append('<br>Warning! Someone else is working on the list.');

		for (var i = 0; i < l; i++) {
			var file = doneQueue[i];
			var reFile = new RegExp('\\n\\*\\[\\[\\:' + mw.RegExp.escape(file) + '\\]\\].+');
			pageText = pageText.replace(reFile, '');
		}
		var params = {
			action: 'edit',
			title: mw.config.get('wgPageName'),
			nocreate: 1,
			// redirect: 1,
			summary: 'Removing ' + doneQueue.length + ' files done from this list.',
			text: pageText,
			token: (window['wikilove-edittoken'] || mw.user.tokens.get('csrfToken')),
			format: 'json'
		};

		var removalDone = function (result) {
			processing = false;
			sendingRequest = false;
			lastListPageContent = pageText;
			if (!result) return;
			if (result.error) {
				alert('Unable to remove done files from list. Maybe reloading the page helps.\n' + result.error.code + '\n' + result.error.info);
			} else {
				doneQueue = [];
				var l = DOMQueue.length;
				for (var i = 0; i < l; i++)
					DOMQueue[i].fadeOut();

				DOMQueue = [];
			}
			reQueueNode.find('#queueCounter').text(doneQueue.length);
		};
		$.post(mw.util.wikiScript('api'), params, removalDone);
		reQueueNode.find('#queueCounter').text('Processing...');
	};
	$.get(mw.config.get('wgScript'), { action: 'raw', title: mw.config.get('wgPageName'), dummy: Math.round(Math.random() * 4294967296), maxage: 0 }, doRemove);
	reQueueNode.find('#queueCounter').text('Processing.');
};

var reQueueNode = $('<div>', { style: 'position:fixed; background: #efe; top: 30px; left: 30px; border:solid 2px #000; z-index:1005;' }).append(
	$('<span>', { id: 'queueCounter', text: '0' }), ' items in removal queue. ', $('<a>', { href: '#', text: 'remove from list now' }).click(function (e) {
		e.preventDefault();
		processDoneQueue();
	}), '<br>',
	$('<a>', { href: '#', text: 'mark all redlinks as done' }).click(function (e) {
		e.preventDefault();
		markRedlinks();
	})
);

$('body').prepend(reQueueNode);

});
// </nowiki>