您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
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); });