Dev:AjaxBatchDelete.js

/\*\*

```
* Ajax Batch Delete
* @description Delete listed multiple pages
* Does not need to go to Special:BlankPage to use
* Includes the option to protect after deleting
* Includes the option to grab a whole category's contents
* @author Ozank Cx
*/

```

mw.loader.using('mediawiki.api', function() {

```
   'use strict';

   if (
   ) {
       return;
   }
   window.AjaxBatchDeleteLoaded = true;

   var api = new mw.Api(),
       i18n,
       placement,
       preloads = 3,
       deleteModal,
       paused = true,
       isUCP = mw.config.get('wgVersion') !== '1.19.24';

```

```
   function preload() {
       if (--preloads === 0) {
           placement = window.dev.placement.loader;
           window.dev.i18n.loadMessages('AjaxBatchDelete').then(init);
       }
   }

   function init(i18nData) {
       i18n = i18nData;
       placement.script('AjaxBatchDelete');
       $(placement.element('tools'))[placement.type('prepend')](

```

 $('

- ').append(
 $('<a>', {
 id: 't-bd',
 text: i18n.msg('toolsTitle').plain(),
 click: click
 })
 )
 );
 }

 function click() {
 if (deleteModal) {
 deleteModal.show();
 return;
 }
 deleteModal = new window.dev.modal.Modal({
 content: formHtml(),
 id: 'form-batch-delete',
 size: isUCP ? 'large' : 'medium',
 title: i18n.msg('modalTitle').escape(),
 buttons: [
 {
 id: 'abd-start',
 text: i18n.msg('initiate').escape(),
 primary: true,
 event: 'start'
 },
 {
 id: 'abd-pause',
 text: i18n.msg('pause').escape(),
 primary: true,
 event: 'pause',
 disabled: true
 },
 {
 text: i18n.msg('addCategoryContents').escape(),
 primary: true,
 event: 'addCategoryContents'
 },
 {
 text: i18n.msg('close').escape(),
 event: 'close'
 }
 ],
 events: {
 addCategoryContents: addCategoryContents,
 pause: pause,
 start: start
 }
 });
 deleteModal.create();
 deleteModal.show();
 }

 function formHtml() {
 return $('<form>', {
 'class': 'WikiaForm'
 }).append(
 $('<fieldset>').append(
 $('').append(
 $('<label>', {
 'for': 'ajax-delete-reason',
 text: i18n.msg('inputReason').plain()
 }),
 $('<input>', {
 type: 'text',
 name: 'ajax-delete-reason',
 id: 'ajax-delete-reason'
 }),
 $('
'),
 $('<label>', {
 'for': 'protect-check',
 text: i18n.msg('inputProtect').plain()
 }),
 $('<input>', {
 type: 'checkbox',
 id: 'protect-check',
 name: 'protect-check'
 })
 ),
 $('

', {
 text: i18n.msg('inputPages').plain() + ':'
 }),
 $('<textarea>', {
 id: 'text-mass-delete'
 }),
 $('

', {
 text: i18n.msg('errorsForm').plain() + ':'
 }),
 $('

', {

```
                   id: 'text-error-output'
               })
           )
       ).prop('outerHTML');
   }

   function pause() {
       paused = true;
       document.getElementById('abd-pause').setAttribute('disabled', *);*
       document.getElementById('abd-start').removeAttribute('disabled');
   }

   function start() {
       if (!document.getElementById('ajax-delete-reason').value) {
           alert(i18n.msg('stateReason').plain());
           return;
       }
       paused = false;
       document.getElementById('abd-start').setAttribute('disabled', *);*
       document.getElementById('abd-pause').removeAttribute('disabled');
       process();
   }

   function process() {
       if (paused) {
           return;
       }
       var txt = document.getElementById('text-mass-delete'),
           pages = txt.value.split('\n'),
           currentPage = pages[0];
       if (!currentPage) {
           $('#text-error-output').append(
               i18n.msg('endTitle').escape() + ' ' + i18n.msg('endMsg').escape() + '
'
           );
           pause();
       } else {
           performAction(currentPage, document.getElementById('ajax-delete-reason').value);
       }
       pages = pages.slice(1,pages.length);
       txt.value = pages.join('\n');
   }

   function addCategoryContents() {
       var category = prompt(i18n.msg('enterCategory').plain() + ':');
       if (!category) {
           return;
       }
       api.get({
           action: 'query',
           list: 'categorymembers',
           cmtitle: 'Category:' + category,
           cmlimit: 5000
       }).done(function(d) {
           if (!d.error) {
               var data = d.query;
               for (var i in data.categorymembers) {
                   if (isUCP) {
                       $('#text-mass-delete').val(
                           $('#text-mass-delete').val() +
                           data.categorymembers[i].title +
                           '\n'
                       );
                   } else {
                       $('#text-mass-delete').append(data.categorymembers[i].title + '\n');
                   }
               }
           } else {
               outputError('GetContents', category, d.error.code);
           }
       }).fail(function(code) {
           // Handle AJAX errors on UCP
           if (isUCP) {
               outputError('GetContents', category, code);
           } else {
               outputError('GetContents', category, i18n.msg('ajaxError').plain());
           }
       });
   }

   function outputError(error, param1, param2) {
       $('#text-error-output').append(i18n.msg('error' + error, param1, param2).escape(), '
');
   }

   function performAction(page,reason) {
       var token = mw.user.tokens.get('editToken');
       api.post({
           action: 'delete',
           watchlist: 'preferences',
           title: page,
           reason: reason,
           token: token,
           bot: true
       }).done(function(d) {
           if (!d.error) {
               console.log(i18n.msg('deleteSuccess', page).plain());
               if (document.getElementById('protect-check').checked) {
                   api.post({
                       action: 'protect',
                       expiry: 'infinite',
                       protections: 'create=sysop',
                       watchlist: 'preferences',
                       title: page,
                       reason: reason,
                       token: token
                   }).done(function(d) {
                       if (!d.error) {
                           console.log(i18n.msg('protectSuccess', page).plain());
                       } else {
                           console.log(i18n.msg('errorProtect', page, d.error.code).plain());
                           outputError('Protect', page, d.error.code);
                       }
                   }).fail(function() {
                       console.log(i18n.msg('errorProtect', page, i18n.ajaxError).plain());
                       outputError('Protect', page, i18n.msg('ajaxError').plain());
                   });
               }
           } else {
               console.log(i18n.msg('errorDelete', page, d.error.code).plain());
               outputError('Delete', page, d.error.code);
           }
       }).fail(function(code) {
           if (isUCP) {
               // TODO: Handle AJAX error on UCP.
               console.log(i18n.msg('errorDelete', page, code).plain());
               outputError('Delete', page, code);
           } else {
               console.log(i18n.msg('errorDelete', page, i18n.msg('ajaxError').plain()).plain());
               outputError('Delete', page, i18n.msg('ajaxError').plain());
           }
       });
       setTimeout(process, window.batchDeleteDelay || 1000);
   }

   mw.hook('dev.i18n').add(preload);
   mw.hook('dev.modal').add(preload);
   mw.hook('dev.placement').add(preload);

   importArticles({
       type: 'script',
       articles: [
           'u:dev:MediaWiki:I18n-js/code.js',
           'u:dev:MediaWiki:Modal.js',
           'u:dev:MediaWiki:Placement.js'
       ]
   });
   importArticle({
       type: 'style',
       article: 'u:dev:MediaWiki:AjaxBatchDelete.css'
   });

```

});