Select multiple failed jobs at once in resque web
// ==UserScript==
// @name Resque multiselect
// @namespace resque
// @homepage https://github.com/timo-p/userscripts/tree/master/resque-multiselect
// @version 0.3
// @description Select multiple failed jobs at once in resque web
// @author timo-p
// @match */resque/failed*
// @grant none
// ==/UserScript==
var $selectAll = $('<input type="submit" onclick="return false;" value="Select all"></input>');
var $selectByClass = $('<input type="submit" onclick="return false;" value="Select all by class"></input>');
var $retrySelected = $('<input type="submit" onclick="return false;" value="Retry selected"></input>');
var $removeSelected = $('<input type="submit" onclick="return false;" value="Remove selected"></input>');
var $retryAndRemoveSelected = $('<input type="submit" onclick="return false;" value="Retry and remove selected"></input>');
var $progress = $('<span style="display: none;"></span>');
var processSelected = function(type){
var $elems = $('input.multiselect:checked');
if (type == 'retry')
{
$elems = $elems.filter(function(){
var $elem = $(this);
return $elem.data('retry') ? true : false;
});
}
if ($elems.length > 0)
{
$retrySelected.attr('disabled', true);
$removeSelected.attr('disabled', true);
$retryAndRemoveSelected.attr('disabled', true);
$elems.sort(function(a, b){
var $a = $(a);
var $b = $(b);
if ($a.data('id') == $b.data('id'))
return 0;
return $a.data('id') < $b.data('id') ? 1 : -1;
});
var pickType = type == 'retry_and_remove' ? 'retry' : type;
var urls = [];
$elems.each(function(i, elem){
$elem = $(elem);
if ($elem.data(pickType))
urls.push($elem.data(pickType));
});
if (type == 'retry_and_remove')
{
$elems.each(function(i, elem){
$elem = $(elem);
urls.push($elem.data('remove'));
});
}
var counter = 0,
count = urls.length;
$progress.show();
var doRequest = function(url){
counter++;
$progress.html('Request '+counter+' of '+count);
$.get(url, function(){
if (urls.length > 0)
doRequest(urls.shift());
else
window.location.reload();
});
};
doRequest(urls.shift());
}
};
$selectAll.click(function(){
var $elem = $(this);
var checked = $elem.data('select-all') ? ':checked' : ':not(:checked)';
$elem.data('select-all', $elem.data('select-all') ? false : true);
$('input.multiselect'+checked).click();
});
$selectByClass.click(function(){
var klass = prompt("Class to select");
$('input.multiselect:checked').click();
if (klass === null || klass.length == 0)
return;
klass = klass.replace(/\\/g, '\\');
$('[href*=/resque/failed/?class='+klass+']').each(function(i, elem){
$(elem).closest('li').find('input.multiselect:not(:checked)').click();
});
});
$removeSelected.click(function(event){
processSelected('remove');
});
$retrySelected.click(function(event){
processSelected('retry');
});
$retryAndRemoveSelected.click(function(event){
processSelected('retry_and_remove');
});
var $form = $('<form></form>');
$form.append($selectAll).append($selectByClass).append($retrySelected).append($removeSelected).append($retryAndRemoveSelected).append('<br/>').append($progress);
$('#main > h1').after($form);
$('div.controls,div.retried').each(function(){
var $e = $(this);
var $checkbox = $('<input type="checkbox" class="multiselect" style="float: right;margin-left:10px;"></input>');
var $retry = $e.find('a[rel=retry]');
var $remove = $e.find('a[rel=remove]');
var domain = window.location.protocol+'//'+window.location.host;
var id = parseInt($remove.attr('href').match(/\d+$/)[0], 10);
$checkbox.data('remove', domain+$remove.attr('href')).data('id', id);
if ($retry.length > 0)
$checkbox.data('retry', domain+$retry.attr('href'));
$e.before($checkbox);
});