BatchRemove.js
阅读
2019-08-23更新
最新编辑:
阅读:
更新日期:2019-08-23
最新编辑:
//批量删除 //BatchRemove.js
var DEBUG = false;
//选项卡
var Token = (function() { var self = []; var prevToken;
self.New = function(page) { var token = $( '<input type="checkbox" class="deleteCheckbox" value="1" title="勾选以删除'+page+'(按Shift连续选择)">'); token.pageName = page; token.complete = function() { token[0].checked = false; token[0].disabled = true; token.isDone = true; token.parent().removeClass('bg-warning'); token.parent().addClass('bg-success'); }; token.change(function() { if (token[0].checked) { token.parent().addClass('bg-warning'); } else { token.parent().removeClass('bg-warning'); } }); token.click(function(e){ onclick(token, e); }) token.isDone = false; self.push(token); return token; }
self.UncheckAll = function() { for (var i = 0; i < self.length; i++) { if (self[i][0].checked) { self[i][0].checked = false; self[i].change(); } } }
function onclick(token, e) { if (prevToken && e.shiftKey) { self.slice( Math.min(self.indexOf(token), self.indexOf(prevToken)), Math.max(self.indexOf(token), self.indexOf(prevToken)) + 1 ).forEach( function($x,i) { if (!$x.isDone && !$x[0].disabled) { $x[0].checked = !!e.target.checked; $x.change(); } }); } prevToken = token; }
return self; })();
//删除文件模态框
DeletionModal = function() {
var modal = $('
');
var $listBox = modal.find('#DeletionModalFileList'); var $btnExecute = modal.find('#DeletionModalExecute'); var $btnRefresh = modal.find('#DeletionModalRefresh'); var itemList = []; var state = 'standby'; //standby, pending, alldone
//生成调试用的Item列表
function debugList() {
return $.map(['undefined1','undefined2', 'undefined33'],
function(x, i) {
var token = Token.New(x);
var item = $('
') item.pageName = token.pageName; item.token = token; item.status = 'standby'; return item; }); } /* 绘制与初始化 */ //当Modal被显示的时候执行 modal.OnShow = function() { if (state === 'pending') { //之前任务尚未处理完毕 return; } //重置modal状态 modal.Reset(); //重新绘制Modal modal.Redraw(); } //将已经使用过的modal复位 modal.Reset = function() { state = 'standby'; finishCount = 0; requestList.splice(0); itemList.splice(0); //从tokenList生成要删除的文件列表 for (var i = 0; i < Token.length; i++) { var token = Token[i]; if (token[0].checked && !token.isDone) { var item = $('
') item.pageName = token.pageName; item.token = token; item.status = 'standby'; itemList.push(item); } } //DEBUG if (DEBUG) itemList = debugList(); $listBox.empty().append(itemList); } //重新绘制Modal框 modal.Redraw = function() { if (state === 'standby') { if (itemList.length > 0) { $btnExecute.removeClass('disabled'); $btnExecute.show(); $btnRefresh.hide(); } else { $btnExecute.addClass('disabled'); $btnExecute.show(); $btnRefresh.hide(); } } else if (state === 'pending') { $btnExecute.addClass('disabled'); $btnExecute.show(); $btnRefresh.hide(); } else if (state === 'alldone') { $btnExecute.hide(); $btnRefresh.show(); } } //设置Item的状态 (通过foo.call(item, ...)调用 function setStatus(status, error){ if (status === 'ok') { this.status = 'ok'; this.addClass('list-group-item-success'); this.token.complete(); } else if (status === 'fail') { this.status = 'fail'; this.addClass('list-group-item-danger'); this.append( ' '+error.code+''); } } /* 发送请求 */ //发送删除页面请求 var api; var requestList = []; var finishCount = 0; modal.Execute = function() { var list = $.map(itemList, function(x, i) { return x.status === 'standby' ? x : null; }); if (list.length < 1) { state = 'alldone'; modal.Redraw(); } //删除原因 var reason = $('#DeletionModalReason').val(); reason = reason ? '批量删除,' + reason : reason; requestList.splice(0); finishCount = 0; state = 'pending'; //发送请求 api = api || new mw.Api(); for (var i = 0; i < itemList.length; i++) { var item = itemList[i]; if (item.status !== 'standby') continue; requestList.push(api.postWithToken( 'csrf', { action: 'delete', title: item.pageName, reason: reason }).done( doneDelegate(item) ) .fail( failDelegate(item) ) .always( checkComplete ) ); }; modal.Redraw(); } /* ajax后处理 */ //检查是否完成了所有请求 function checkComplete() { finishCount ++; //等待ajax state = finishCount >= requestList.length ? 'alldone' : 'pending'; if (state === 'alldone') { modal.Redraw(); } } //ajax委托 function doneDelegate(item) { return function(data) { setStatus.call(item, 'ok'); } } function failDelegate(item) { return function(code, data) { parseError(data.error); setStatus.call(item, 'fail', data.error); } } //解释错误代码 function parseError(error) { if (error.code === 'missingtitle') { error.code = '无效标题'; error.info = '指定的页面不存在。'; } return error } /* 实例化 */ modal.Show = function() { modal.modal('show'); } //modal.modal({show:false}); modal.on('show.bs.modal', modal.OnShow); $btnExecute.click(modal.Execute); $btnRefresh.click(function(){window.location.reload(true);}) $btnRefresh.hide(); $('body').append(modal); return modal; } //悬浮在右侧的面板 function FloatPanel() { var panel = $('
');
panel.find('.btn.btn-default').click(Token.UncheckAll); return panel; }
//在特殊:未使用模板上初始化
function Initialize_UnusedTemplate() {
var ol = $('#mw-content-text > .mw-spcontent > ol.special');
ol.children('li').each( function(i,x) {
var $x = $(x);
var a = $x.children('a')[0];
var token = Token.New(a ? a.innerText : );
$x.prepend(token, ' ');
});
$('#mw-content-text .mw-spcontent').prepend(FloatPanel());
}
//在特殊:未使用文件上初始化
function Initialize_UnusedFile() {
$('#mw-content-text > .mw-spcontent > ul.gallery > li.gallerybox > div')
.each( function(i,x) {
var $x = $(x);
var fn = 'File:' + $x.find('img').data('file-name');
var token = Token.New(fn);
token.css({
position: 'absolute',
right: '10px',
top: '5px'
});
$x.css('position', 'relative');
$x.append(token); });
$('#bodyContent').prepend( FloatPanel().css('margin-top', '-60px') .css('margin-bottom', 0) );
}
//在特殊:文件列表上初始化
function Initialize_FileList() {
var table = $('#mw-content-text > table.mw-datatable.listfiles');
table.find('thead > tr').append('批量');
table.find('tbody > tr').each( function(i, x) { var $x = $(x); var fn = 'File:' + $x.find('.TablePager_col_thumb img').data('file-name'); var token = Token.New(fn);
$x.append($('').append(token));
}); $('#mw-content-text').prepend(FloatPanel()); }
function Initialize() {
var pageName = mw.config.get('wgPageName');
if (pageName === "特殊:未使用模板") {
Initialize_UnusedTemplate();
} else if (pageName === "特殊:未使用文件") {
Initialize_UnusedFile();
} else if (pageName === "特殊:文件列表") {
Initialize_FileList();
} else if (pageName === "特殊:最老页面") {
Initialize_UnusedTemplate();
} else if (pageName === "特殊:孤立页面") {
Initialize_UnusedTemplate();
} else {
return;
}
var modal = DeletionModal();
}
Initialize();