jenkins-bot has submitted this change and it was merged.

Change subject: Modify implementation and refactor JS of special page
......................................................................


Modify implementation and refactor JS of special page

- Re-index pages on deletion
- No longer any concept of displaying "Page N" of results, only results
  "1 - 250"
- Blocking is now through a checkbox
- Only a single button to start process. First blocks users, then
  deletes pages.
- Success box displayed on top with list of blocked users and deleted
  pages, refreshes on changing page
- Similar to success box, error box displayed for errors
- Some features are now missing but will be added in a later commit

Change-Id: Idb3d0b5820e11f9d561262e262ea0230afe56c68
---
M SmiteSpam.php
A static/js/ext.smitespam.js
D static/js/ext.smitespam.retriever.js
3 files changed, 400 insertions(+), 315 deletions(-)

Approvals:
  jan: Looks good to me, but someone else must approve
  Polybuildr: Looks good to me, approved
  Yaron Koren: Looks good to me, but someone else must approve
  jenkins-bot: Verified



diff --git a/SmiteSpam.php b/SmiteSpam.php
index 289ff15..8b5841d 100644
--- a/SmiteSpam.php
+++ b/SmiteSpam.php
@@ -27,7 +27,7 @@
 $wgAPIModules['smitespamanalyze'] = 'SmiteSpamApiQuery';
 
 $wgResourceModules['ext.SmiteSpam.retriever'] = array(
-       'scripts' => 'js/ext.smitespam.retriever.js',
+       'scripts' => 'js/ext.smitespam.js',
        'localBasePath' => "$ssRoot/static",
        'remoteExtPath' => 'SmiteSpam/static',
        'dependencies' => array(
diff --git a/static/js/ext.smitespam.js b/static/js/ext.smitespam.js
new file mode 100644
index 0000000..d21b0fc
--- /dev/null
+++ b/static/js/ext.smitespam.js
@@ -0,0 +1,399 @@
+( function ( $ ) {
+       // config options
+       var numPages = mw.config.get( 'numPages' );
+       var querySize = mw.config.get( 'queryPageSize' );
+       var displaySize = mw.config.get( 'displayPageSize' );
+
+       // Data
+       var results = []; // pages
+       var displayOffset = 0;
+
+       var pagesToDelete = [];
+       var pagesToDeleteIndex = 0;
+       var pagesToDeleteTitleTexts = [];
+       var pagesFailedToDelete = [];
+
+       var usersToBlock = [];
+       var usersToBlockIndex = 0;
+       var usersFailedToBlock = [];
+
+       /*
+       key value pairs of type:
+       username: {
+               blocked: false,
+               link: ''
+       }
+       */
+       var users = {};
+
+       var ajaxQueries = {}; // namespace for AJAX queries
+       ajaxQueries.baseUrl = mw.config.get( 'wgScriptPath' );
+       ajaxQueries.editToken = '';
+
+       ajaxQueries.pages = {
+               numSent: 0,
+               send: function () {
+                       var url = ajaxQueries.baseUrl + 
'/api.php?action=smitespamanalyze&format=json';
+                       $.getJSON( url +
+                               '&offset=' + ajaxQueries.pages.numSent * 
querySize +
+                               '&limit=' + querySize,
+                               ajaxQueries.pages.processResponse );
+                       ajaxQueries.pages.numSent++;
+               },
+               processResponse: function ( data ) {
+                       var receivedPages = data.smitespamanalyze.pages;
+                       $.extend( users, data.smitespamanalyze.users );
+                       $.merge( results, receivedPages );
+                       displayResults();
+               }
+       };
+
+       ajaxQueries.deletePage = {
+               send: function () {
+                       if ( pagesToDeleteIndex >= pagesToDelete.length ) {
+                               return;
+                       }
+                       $.post( ajaxQueries.baseUrl + 
'/api.php?action=delete&format=json',
+                               {
+                                       token: ajaxQueries.editToken,
+                                       pageid: 
pagesToDelete[pagesToDeleteIndex],
+                                       reason: mw.msg( 
'smitespam-deleted-reason' )
+                               },
+                               'json'
+                       ).done( ajaxQueries.deletePage.processResponse );
+               },
+               processResponse: function ( data ) {
+                       var pageID = pagesToDelete[pagesToDeleteIndex];
+                       var pageTitleText = 
pagesToDeleteTitleTexts[pagesToDeleteIndex];
+                       var row = $( '#result-row-page-' + pageID );
+                       if ( 'delete' in data ) {
+                               for ( var i = 0; i < results.length; i++ ) {
+                                       // force both to string
+                                       if ( results[i].id.toString() === 
pageID.toString() ) {
+                                               results.splice( i, 1 );
+                                               break;
+                                       }
+                               }
+                               if ( row.length ) {
+                                       row.remove();
+                               }
+                               refreshRangeDisplayer();
+                               if ( $( '#ajax-successbox' ).length === 0 ) {
+                                       var $successbox = $( '<div>', { id: 
'ajax-successbox' } )
+                                               .addClass( 'successbox' );
+                                       $( '#pagination' ).append( $successbox 
);
+                                       $( '#pagination' ).append( '<br>' );
+                               }
+                               // TODO i18n
+                               $( '#ajax-successbox' ).append( '<p>Page "' + 
pageTitleText + '" deleted.</p>' );
+                       } else if ( 'error' in data ) {
+                               pagesFailedToDelete.push( pageID );
+                               if ( row.length ) {
+                                       row.find( 'td' ).eq( 3 ).text( mw.msg( 
'smitespam-delete-page-failure-msg' ) );
+                               }
+                               if ( $( '#ajax-errorbox' ).length === 0 ) {
+                                       var $errorbox = $( '<div>', { id: 
'ajax-errorbox' } )
+                                               .addClass( 'errorbox' );
+                                       $( '#pagination' ).append( $errorbox );
+                                       $( '#pagination' ).append( '<br>' );
+                               }
+                               // TODO i18n
+                               $( '#ajax-errorbox' ).append( '<p>Failed to 
delete page "' + pageTitleText + '".</p>' );
+                       }
+                       pagesToDeleteIndex++;
+                       if ( pagesToDeleteIndex < pagesToDelete.length ) {
+                               ajaxQueries.deletePage.send();
+                       }
+               }
+       };
+
+       ajaxQueries.blockUser = {
+               send: function () {
+                       if ( usersToBlockIndex >= usersToBlock.length ) {
+                               ajaxQueries.deletePage.send();
+                               return;
+                       }
+                       $.post( ajaxQueries.baseUrl + 
'/api.php?action=block&format=json',
+                               {
+                                       user: usersToBlock[usersToBlockIndex],
+                                       token: ajaxQueries.editToken,
+                                       nocreate: '',
+                                       noemail: '',
+                                       autoblock: '',
+                                       // TODO i18n
+                                       reason: 'Spamming'
+                               },
+                               'json'
+                       ).done( ajaxQueries.blockUser.processResponse );
+               },
+               processResponse: function ( data ) {
+                       var username = usersToBlock[usersToBlockIndex];
+                       if ( 'block' in data ) {
+                               users[username].blocked = true;
+                               $( '#smitespam-page-list th 
.block-checkbox-container' ).each( function () {
+                                       var $this = $( this );
+                                       if ( $this.parent().data( 'username' )  
=== username ) {
+                                               // TODO i18n
+                                               $this.parent().append( ' 
(Blocked)' );
+                                               $this.remove();
+                                               return false;
+                                       }
+                               } );
+                               if ( $( '#ajax-successbox' ).length === 0 ) {
+                                       var $successbox = $( '<div>', { id: 
'ajax-successbox' } )
+                                               .addClass( 'successbox' );
+                                       $( '#pagination' ).append( $successbox 
);
+                                       $( '#pagination' ).append( '<br>' );
+                               }
+                               // TODO i18n
+                               $( '#ajax-successbox' ).append( '<p>User "' + 
username + '" blocked.</p>' );
+                       } else if ( 'error' in data ) {
+                               usersFailedToBlock.push( username );
+                               $( '#smitespam-page-list 
.block-checkbox-container' ).each( function () {
+                                       var $this = $( this );
+                                       if ( $this.parent().data( 'username' )  
=== username ) {
+                                               // TODO i18n
+                                               $this.parent().append( ' 
(Failed to block)' );
+                                               $this.remove();
+                                               return false;
+                                       }
+                               } );
+                               if ( $( '#ajax-errorbox' ).length === 0 ) {
+                                       var $errorbox = $( '<div>', { id: 
'ajax-errorbox' } )
+                                               .addClass( 'errorbox' );
+                                       $( '#pagination' ).append( $errorbox );
+                                       $( '#pagination' ).append( '<br>' );
+                               }
+                               // TODO i18n
+                               $( '#ajax-errorbox' ).append( '<p>Failed to 
block user "' + username + '".</p>' );
+                       }
+                       usersToBlockIndex++;
+                       if ( usersToBlockIndex < usersToBlock.length ) {
+                               ajaxQueries.blockUser.send();
+                       } else {
+                               ajaxQueries.deletePage.send();
+                       }
+               }
+       };
+
+       function groupPagesByCreator( pages ) {
+               var creators = {};
+               for ( var i = 0; i < pages.length; ++i ) {
+                       var page = pages[i];
+                       if ( !( page.creator in creators ) ) {
+                               creators[page.creator] = {};
+                               creators[page.creator].pages = [];
+                               creators[page.creator].totalSpamValue = 0;
+                       }
+                       creators[page.creator].pages.push( page );
+                       creators[page.creator].totalSpamValue += 
page['spam-probability-value'];
+               }
+               var groupedPages = [];
+               $.each( creators, function ( key, value ) {
+                       value.creator = key;
+                       value.pages.sort( function ( a, b ) {
+                               return b['spam-probability-value'] - 
a['spam-probability-value'];
+                       } );
+                       groupedPages.push( value );
+               } );
+               return groupedPages;
+       }
+
+       function displayResults() {
+               if ( displayOffset + displaySize > results.length &&
+                       ajaxQueries.pages.numSent * querySize < numPages ) {
+                       $( '#smitespam-loading' ).show();
+                       ajaxQueries.pages.send();
+                       return;
+               }
+               $( '#smitespam-loading' ).hide();
+
+               var resultsToDisplay = results.slice( displayOffset, 
displayOffset + displaySize );
+
+               var i;
+               var page;
+
+               var groupedPages = groupPagesByCreator( resultsToDisplay );
+
+               groupedPages.sort( function ( a, b ) {
+                       return b.totalSpamValue - a.totalSpamValue;
+               } );
+
+               function onPageCheckboxChange() {
+                       var id = $( this ).val();
+                       if ( this.checked ) {
+                               pagesToDelete.push( id );
+                               var titleText = $( this )
+                                       .parent() // td
+                                       .parent() // tr
+                                       .find( 'td' )
+                                       .eq( 0 ) // first cell
+                                       .find( 'a' )
+                                       .text();
+                               pagesToDeleteTitleTexts.push( titleText );
+                       } else {
+                               var index = $.inArray( id, pagesToDelete );
+                               pagesToDelete.splice( index, 1 );
+                               pagesToDeleteTitleTexts.splice( index, 1 );
+                       }
+               }
+
+               function onBlockCheckboxChange() {
+                       var username = $( this ).val();
+                       if ( this.checked ) {
+                               usersToBlock.push( username );
+                       } else {
+                               var index = $.inArray( username, usersToBlock );
+                               usersToBlock.splice( index, 1 );
+                       }
+               }
+
+               $( '#smitespam-page-list' ).empty();
+               for ( i = 0; i < groupedPages.length; i++ ) {
+                       var group = groupedPages[i].pages;
+                       var groupCreator = groupedPages[i].creator;
+                       var $creatorCell = $( '<th>' ).attr( 'colspan', 5 )
+                               .html( mw.msg( 'smitespam-created-by' ) + ' ' +
+                                       ( users[groupCreator] ? 
users[groupCreator].link : groupCreator ) )
+                               .data( 'username', groupCreator );
+                       if ( users[groupCreator] ) {
+                               if ( users[groupCreator].blocked ) {
+                                       // TODO i18n
+                                       $creatorCell.append( ' &middot; 
(Blocked)' );
+                               } else if ( $.inArray( groupCreator, 
usersFailedToBlock ) !== -1 ) {
+                                       // TODO i18n
+                                       $creatorCell.append( ' &middot; (Failed 
to block)' );
+                               } else {
+                                       var $blockCheckboxContainer = $( 
'<span>' ).addClass( 'block-checkbox-container' );
+                                       var $blockCheckbox = $( '<input>', {
+                                               type: 'checkbox',
+                                               value: groupCreator
+                                       } )
+                                               .on( 'change', 
onBlockCheckboxChange );
+                                       if ( $.inArray( $blockCheckbox.val(), 
usersToBlock ) !== -1 ) {
+                                               $blockCheckbox.attr( 'checked', 
'checked' );
+                                       }
+                                       $blockCheckboxContainer.append( 
$blockCheckbox );
+                                       // TODO i18n
+                                       $blockCheckboxContainer.append( 'Block' 
);
+                                       $creatorCell.append( ' &middot; ' );
+                                       $creatorCell.append( 
$blockCheckboxContainer );
+                               }
+                       }
+                       var $creatorRow = $( '<tr>' ).append( $creatorCell );
+                       $( '#smitespam-page-list' ).append( $creatorRow );
+                       $( '#smitespam-page-list' ).append( '<tr>' +
+                               '<th>' + mw.msg( 'smitespam-page' ) + '</th>' +
+                               '<th>' + mw.msg( 'smitespam-probability' ) + 
'</th>' +
+                               '<th>' + mw.msg( 'smitespam-preview-text' ) + 
'</th>' +
+                               '<th>' + mw.msg( 'smitespam-delete' ) + '</th>' 
+
+                               '</tr>' );
+                       for ( var j = 0; j < group.length; j++ ) {
+                               page = group[j];
+                               var $row = $( '<tr>' ).attr( 'id', 
'result-row-page-' + page.id );
+                               $row.addClass( 'result-row' );
+                               $( '<td></td>' ).html( page.link ).appendTo( 
$row );
+                               $( '<td></td>' ).text( 
page['spam-probability-text'] ).appendTo( $row );
+                               $( '<td></td>' ).text( page.preview ).appendTo( 
$row );
+                               if ( $.inArray( page.id.toString(), 
pagesFailedToDelete ) !== -1 ) {
+                                       $( '<td></td>' ).text( mw.msg( 
'smitespam-delete-page-failure-msg' ) ).appendTo( $row );
+                               } else {
+                                       var $checkbox = $( '<input>', {
+                                               type: 'checkbox',
+                                               value: page.id
+                                       } )
+                                               .on( 'change', 
onPageCheckboxChange );
+                                       if ( $.inArray( $checkbox.val(), 
pagesToDelete ) !== -1 ) {
+                                               $checkbox.attr( 'checked', 
'checked' );
+                                       }
+                                       $( '<td></td>' ).append( $checkbox 
).appendTo( $row );
+                               }
+                               $( '#smitespam-page-list' ).append( $row );
+                       }
+               }
+               refreshRangeDisplayer();
+               refreshPager();
+       }
+
+       function refreshPager() {
+               $( '#ajax-successbox' ).remove();
+               $( '#ajax-errorbox' ).remove();
+               $( '#smitespam-pager-prev-container' ).empty();
+               if ( displayOffset === 0 ) {
+                       $( '<span>' )
+                               .text( mw.msg( 'table_pager_prev' ) )
+                               .appendTo( $( '#smitespam-pager-prev-container' 
) );
+               } else {
+                       $( '<a>', { href: '#', id: 'smitespam-pager-prev' } )
+                               .text( mw.msg( 'table_pager_prev' ) )
+                               .on( 'click', function () {
+                                       displayOffset -= displaySize;
+                                       if ( displayOffset < 0 ) {
+                                               displayOffset = 0;
+                                       }
+                                       displayResults();
+                               } )
+                               .appendTo( $( '#smitespam-pager-prev-container' 
) );
+               }
+               $( '#smitespam-pager-next-container' ).empty();
+               // disable "next" if all queries sent and last page
+               if ( ajaxQueries.pages.numSent * querySize >= numPages &&
+                       displayOffset + displaySize > results.length ) {
+                       $( '<span>' )
+                               .text( mw.msg( 'table_pager_next' ) )
+                               .appendTo( $( '#smitespam-pager-next-container' 
) );
+               } else {
+                       // Next page pager link
+                       $( '<a>', { href: '#', id: 'smitespam-pager-next' } )
+                               .text( mw.msg( 'table_pager_next' ) )
+                               .on( 'click', function () {
+                                       var jump = $( '#smitespam-page-list 
.result-row' ).length;
+                                       displayOffset += jump;
+                                       displayResults();
+                               } )
+                               .appendTo( $( '#smitespam-pager-next-container' 
) );
+               }
+       }
+
+       function refreshRangeDisplayer() {
+               var fromPageIndex = displayOffset + 1;
+               $( '#smitespam-displayed-range-from' ).text( fromPageIndex );
+               var numDisplayed = $( '.result-row' ).length;
+               $( '#smitespam-displayed-range-to' ).text( fromPageIndex + 
numDisplayed - 1 );
+               $( '#smitespam-displayed-range' ).show();
+       }
+
+       function init() {
+               var $pagination = $( '#pagination' );
+               // TODO i18n
+               $( '<input>', { type: 'submit', value: 'Smite Spam!' } 
).prependTo( '#smitespam-delete-pages' );
+               $( '#smitespam-delete-pages' ).on( 'submit', function () {
+                       ajaxQueries.blockUser.send();
+                       return false;
+               } );
+               // Display from (page) - to (page)
+               var $rangeDisplayer = $( '<span>', { id: 
'smitespam-displayed-range' } ).hide();
+               $( '<span>', { id: 'smitespam-displayed-range-from' } 
).appendTo( $rangeDisplayer );
+               $rangeDisplayer.append( ' - ' );
+               $( '<span>', { id: 'smitespam-displayed-range-to' } ).appendTo( 
$rangeDisplayer );
+               $pagination.append( $rangeDisplayer );
+
+               // TODO i18n
+               $( '<span>', { id: 'smitespam-loading' } ).text( ' (Loading 
more pages...)' ).appendTo( $pagination );
+
+               var $pager = $( '<p>' ).addClass( 'pager' );
+               $( '<span>', { id: 'smitespam-pager-prev-container' } 
).appendTo( $pager );
+               $pager.append( ' &middot; ' );
+               $( '<span>', { id: 'smitespam-pager-next-container' } 
).appendTo( $pager );
+               $pagination.append( $pager );
+               refreshPager();
+
+               $.getJSON( mw.config.get( 'wgScriptPath' ) + 
'/api.php?action=query&meta=tokens&format=json',
+                       function ( data ) {
+                               ajaxQueries.editToken = 
data.query.tokens.csrftoken;
+                               ajaxQueries.pages.send();
+                       }
+               );
+       }
+       init();
+} )( jQuery );
diff --git a/static/js/ext.smitespam.retriever.js 
b/static/js/ext.smitespam.retriever.js
deleted file mode 100644
index 9aa246d..0000000
--- a/static/js/ext.smitespam.retriever.js
+++ /dev/null
@@ -1,314 +0,0 @@
-( function ( $ ) {
-       var Counter = function () {
-               var value = 0;
-               this.update = function ( newValue ) {
-                       value = newValue;
-                       if ( typeof this.onUpdate === 'function' ) {
-                               this.onUpdate();
-                       }
-               };
-
-               this.getValue = function () {
-                       return value;
-               };
-
-               this.increment = function ( by ) {
-                       if ( by ) {
-                               this.update( value + by );
-                       } else {
-                               this.update( value + 1 );
-                       }
-               };
-
-               this.decrement = function ( by ) {
-                       if ( by ) {
-                               this.update( value - by );
-                       } else {
-                               this.update( value - 1 );
-                       }
-               };
-       };
-
-       var queriesSent = new Counter();
-
-       var numPages = mw.config.get( 'numPages' );
-       var queryPageSize = mw.config.get( 'queryPageSize' );
-       var displayPageSize = mw.config.get( 'displayPageSize' );
-       var results = [];
-       var users = {};
-       results.push( [] );
-       var editToken, deleteIndex = 0;
-
-       var resultPageToDisplay = new Counter();
-       resultPageToDisplay.notify = function () {
-               if ( queriesSent.getValue() * queryPageSize >= numPages ||
-                       results[this.getValue()].length >= displayPageSize ) {
-                       $( '#results-loading' ).hide();
-                       pagination.refresh();
-               } else {
-                       $( '#results-loading' ).show();
-                       sendNextQuery();
-               }
-       };
-       resultPageToDisplay.onUpdate = resultPageToDisplay.notify;
-
-       function sendNextQuery() {
-               var url = mw.config.get( 'wgScriptPath' ) + 
'/api.php?action=smitespamanalyze&format=json';
-               $.getJSON( url +
-                       '&offset=' + queriesSent.getValue() * queryPageSize +
-                       '&limit=' + queryPageSize,
-                       processResponse );
-               queriesSent.increment();
-       }
-
-       function processResponse( data ) {
-               var receivedPages = data.smitespamanalyze.pages;
-               $.extend( users, data.smitespamanalyze.users );
-               while ( receivedPages.length ) {
-                       var remaining = displayPageSize - 
results[results.length - 1].length;
-                       var toAppend = receivedPages.slice( 0, remaining );
-                       for ( var i = 0; i < toAppend.length; i++ ) {
-                               results[results.length - 1].push( toAppend[i] );
-                       }
-                       receivedPages = receivedPages.splice( remaining );
-                       if ( results[results.length - 1].length === 
displayPageSize ) {
-                               results[results.length - 1].sort( function ( a, 
b ) {
-                                       return b['spam-probability-value'] - 
a['spam-probability-value'];
-                               } );
-                               results.push( [] );
-                       }
-               }
-               resultPageToDisplay.notify();
-       }
-
-       var pagination = {
-               data: {
-                       pagesToDelete: [],
-                       pagesDeleted: [],
-                       failedToDeletePages: []
-               },
-               handlersAttached: false,
-               attachHandlers: function () {
-                       if ( pagination.handlersAttached ) {
-                               return;
-                       }
-                       $( '<p>' + mw.msg( 'smitespam-page' ) + ' <span 
id="displayed-page-number">0</span></p>' )
-                               .appendTo( '#pagination' );
-                       $( '<button>', { id: 'smitespam-pagination-prev' } )
-                               .html( '&lt;&lt; ' + mw.msg( 'table_pager_prev' 
) )
-                               .appendTo( '#pagination' );
-                       $( '#smitespam-pagination-prev' ).on( 'click', function 
() {
-                               resultPageToDisplay.decrement();
-                       } );
-
-                       $( '<button>', { id: 'smitespam-pagination-next' } )
-                               .html( mw.msg( 'table_pager_next' ) + ' 
&gt;&gt;' )
-                               .appendTo( '#pagination' );
-                       $( '#smitespam-pagination-next' ).on( 'click', function 
() {
-                               resultPageToDisplay.increment();
-                       } );
-                       pagination.handlersAttached = true;
-               },
-               refresh: function () {
-                       pagination.attachHandlers();
-                       if ( resultPageToDisplay.getValue() === 0 ) {
-                               $( '#smitespam-pagination-prev' ).attr( 
'disabled', 'disabled' );
-                       } else {
-                               $( '#smitespam-pagination-prev' ).removeAttr( 
'disabled' );
-                       }
-
-                       if ( queriesSent.getValue() * queryPageSize >= numPages 
&&
-                               resultPageToDisplay.getValue() === 
results.length - 1 ) {
-                               $( '#pagination #smitespam-pagination-next' 
).attr( 'disabled', 'disabled' );
-                       } else {
-                               $( '#pagination #smitespam-pagination-next' 
).removeAttr( 'disabled' );
-                       }
-                       pagination.displayResults();
-                       $( '#displayed-page-number' ).text( 
resultPageToDisplay.getValue() + 1 );
-               },
-               displayResults: function () {
-                       $( '#smitespam-delete-pages input[type="submit"]' 
).show();
-                       var $selectAll = $( '<a>' )
-                               .attr( 'href', '#' )
-                               .text( mw.msg( 'powersearch-toggleall' ) )
-                               .on( 'click', function () {
-                                       $( '#smitespam-page-list 
input[type="checkbox"]' ).each( function () {
-                                               $( this ).prop( 'checked', true 
).triggerHandler( 'change' );
-                                       } );
-                               } );
-                       var $selectNone = $( '<a>' )
-                               .attr( 'href', '#' )
-                               .text( mw.msg( 'powersearch-togglenone' ) )
-                               .on( 'click', function () {
-                                       $( '#smitespam-page-list 
input[type="checkbox"]' ).each( function () {
-                                               $( this ).prop( 'checked', 
false ).triggerHandler( 'change' );
-                                       } );
-                               } );
-                       $( '#smitespam-select-options' ).empty();
-                       $( '#smitespam-select-options' ).append( mw.msg( 
'smitespam-select' ) );
-                       $( '#smitespam-select-options' ).append( $selectAll );
-                       $( '#smitespam-select-options' ).append( ', ' );
-                       $( '#smitespam-select-options' ).append( $selectNone );
-                       $( '#smitespam-page-list' ).empty();
-                       function checkboxChanged() {
-                               var id = $( this ).val();
-                               if ( this.checked ) {
-                                       pagination.data.pagesToDelete.push( id 
);
-                               } else {
-                                       var index = $.inArray( id, 
pagination.data.pagesToDelete );
-                                       pagination.data.pagesToDelete.splice( 
index, 1 );
-                               }
-                       }
-                       var creators = {};
-                       var i, page;
-                       var resultsToDisplay = 
results[resultPageToDisplay.getValue()];
-                       for ( i = 0; i < resultsToDisplay.length; ++i ) {
-                               page = resultsToDisplay[i];
-                               if ( !( page.creator in creators ) ) {
-                                       creators[page.creator] = {};
-                                       creators[page.creator].pages = [];
-                                       creators[page.creator].totalSpamValue = 
0;
-                               }
-                               creators[page.creator].pages.push( page );
-                               creators[page.creator].totalSpamValue += 
page['spam-probability-value'];
-                       }
-                       var groupedPages = [];
-                       $.each( creators, function ( key, value ) {
-                               value.creator = key;
-                               groupedPages.push( value );
-                       } );
-                       groupedPages.sort( function ( a, b ) {
-                               return b.totalSpamValue - a.totalSpamValue;
-                       } );
-                       function onBlockButton() {
-                               var $this = $( this );
-                               var username = $this.parent().data( 'username' 
);
-                               $this.prop( 'disabled', true );
-                               $.post( mw.config.get( 'wgScriptPath' ) + 
'/api.php?action=block&format=json',
-                                       {
-                                               user: username,
-                                               token: editToken,
-                                               nocreate: '',
-                                               noemail: '',
-                                               autoblock: '',
-                                               reason: 'Spamming'
-                                       },
-                                       'json'
-                               ).done( function ( data ) {
-                                       if ( 'block' in data ) {
-                                               $( '#smitespam-page-list th 
button' ).each( function () {
-                                                       var $this = $( this );
-                                                       if ( 
$this.parent().data( 'username' )  === username ) {
-                                                               
$this.parent().append( ' (Blocked)' );
-                                                               $this.remove();
-                                                               return false;
-                                                       }
-                                               } );
-                                       } else if ( 'error' in data ) {
-                                               $( '#smitespam-page-list th 
button' ).each( function () {
-                                                       var $this = $( this );
-                                                       if ( 
$this.parent().data( 'username' )  === username ) {
-                                                               
$this.parent().append( ' (Failed to block)' );
-                                                               $this.remove();
-                                                               return false;
-                                                       }
-                                               } );
-                                       }
-                               } );
-                       }
-                       for ( i = 0; i < groupedPages.length; i++ ) {
-                               var group = groupedPages[i].pages;
-                               var groupCreator = groupedPages[i].creator;
-                               var $creatorCell = $( '<th>' ).attr( 'colspan', 
5 )
-                                       .html( mw.msg( 'smitespam-created-by' ) 
+ ' ' +
-                                               ( users[groupCreator] ? 
users[groupCreator].link : groupCreator ) )
-                                       .data( 'username', groupCreator );
-                               if ( users[groupCreator] ) {
-                                       if ( users[groupCreator].blocked ) {
-                                               $creatorCell.append( ' 
(Blocked)' );
-                                       } else {
-                                               var $blockButton = $( 
'<button>' ).text( 'Block' ).on( 'click', onBlockButton );
-                                               $creatorCell.append( ' ' );
-                                               $creatorCell.append( 
$blockButton );
-                                       }
-                               }
-                               var $creatorRow = $( '<tr>' ).append( 
$creatorCell );
-                               $( '#smitespam-page-list' ).append( $creatorRow 
);
-                               $( '#smitespam-page-list' ).append( '<tr>' +
-                                       '<th>' + mw.msg( 'smitespam-page' ) + 
'</th>' +
-                                       '<th>' + mw.msg( 
'smitespam-probability' ) + '</th>' +
-                                       '<th>' + mw.msg( 
'smitespam-preview-text' ) + '</th>' +
-                                       '<th>' + mw.msg( 'smitespam-delete' ) + 
'</th>' +
-                                       '</tr>' );
-                               for ( var j = 0; j < group.length; j++ ) {
-                                       page = group[j];
-                                       var $row = $( '<tr>' ).attr( 'id', 
'result-row-page-' + page.id );
-                                       $( '<td></td>' ).html( page.link 
).appendTo( $row );
-                                       $( '<td></td>' ).text( 
page['spam-probability-text'] ).appendTo( $row );
-                                       $( '<td></td>' ).text( page.preview 
).appendTo( $row );
-                                       if ( $.inArray( page.id.toString(), 
pagination.data.pagesDeleted ) !== -1 ) {
-                                               $( '<td></td>' ).text( mw.msg( 
'smitespam-delete-page-success-msg' ) ).appendTo( $row );
-                                       } else if ( $.inArray( 
page.id.toString(), pagination.data.failedToDeletePages ) !== -1 ) {
-                                               $( '<td></td>' ).text( mw.msg( 
'smitespam-delete-page-failure-msg' ) ).appendTo( $row );
-                                       } else {
-                                               var $checkbox = $( '<input>', {
-                                                       type: 'checkbox',
-                                                       value: page.id
-                                               } )
-                                                       .on( 'change', 
checkboxChanged );
-                                               if ( $.inArray( 
$checkbox.val(), pagination.data.pagesToDelete ) !== -1 ) {
-                                                       $checkbox.attr( 
'checked', 'checked' );
-                                               }
-                                               $( '<td></td>' ).append( 
$checkbox ).appendTo( $row );
-                                       }
-                                       $( '#smitespam-page-list' ).append( 
$row );
-                               }
-                       }
-               }
-       };
-
-       $( '#smitespam-delete-pages' ).on( 'submit', function () {
-               deletePage();
-               return false;
-       } );
-
-       $.getJSON( mw.config.get( 'wgScriptPath' ) + 
'/api.php?action=query&meta=tokens&format=json',
-               function ( data ) {
-                       editToken = data.query.tokens.csrftoken;
-                       $( '<p id="results-loading"></p>' ).text( 'Loading...' )
-                               .appendTo( '#pagination' );
-                       resultPageToDisplay.notify();
-               }
-       );
-
-       function processDeletedPage( data ) {
-               var pageID = pagination.data.pagesToDelete[deleteIndex];
-               var row = $( '#result-row-page-' + pageID );
-               if ( 'delete' in data ) {
-                       pagination.data.pagesDeleted.push( pageID );
-                       if ( row.length ) {
-                               row.find( 'td' ).eq( 3 ).text( mw.msg( 
'smitespam-delete-page-success-msg' ) );
-                       }
-               } else if ( 'error' in data ) {
-                       pagination.data.failedToDeletePages.push( pageID );
-                       if ( row.length ) {
-                               row.find( 'td' ).eq( 3 ).text( mw.msg( 
'smitespam-delete-page-failure-msg' ) );
-                       }
-               }
-               deleteIndex++;
-               if ( deleteIndex < pagination.data.pagesToDelete.length ) {
-                       deletePage();
-               }
-       }
-
-       function deletePage() {
-               $.post( mw.config.get( 'wgScriptPath' ) + 
'/api.php?action=delete&format=json',
-                       {
-                               token: editToken,
-                               pageid: 
pagination.data.pagesToDelete[deleteIndex],
-                               reason: mw.msg( 'smitespam-deleted-reason' )
-                       },
-                       'json'
-               ).done( processDeletedPage );
-       }
-} )( jQuery );

-- 
To view, visit https://gerrit.wikimedia.org/r/223750
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings

Gerrit-MessageType: merged
Gerrit-Change-Id: Idb3d0b5820e11f9d561262e262ea0230afe56c68
Gerrit-PatchSet: 6
Gerrit-Project: mediawiki/extensions/SmiteSpam
Gerrit-Branch: master
Gerrit-Owner: Polybuildr <v.a.ghai...@gmail.com>
Gerrit-Reviewer: Polybuildr <v.a.ghai...@gmail.com>
Gerrit-Reviewer: Yaron Koren <yaro...@gmail.com>
Gerrit-Reviewer: jan <j...@jans-seite.de>
Gerrit-Reviewer: jenkins-bot <>

_______________________________________________
MediaWiki-commits mailing list
MediaWiki-commits@lists.wikimedia.org
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to