全站通知:

BatchRemove.js

阅读

    

2019-08-23更新

    

最新编辑:

阅读:

  

更新日期:2019-08-23

  

最新编辑:

来自汉家江湖WIKI_BWIKI_哔哩哔哩
跳到导航 跳到搜索

//批量删除 //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 = $('

  • '+token.pageName+'
  • ') 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 = $('

  • '+token.pageName+'
  • ') 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();