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( ' · (Blocked)' ); + } else if ( $.inArray( groupCreator, usersFailedToBlock ) !== -1 ) { + // TODO i18n + $creatorCell.append( ' · (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( ' · ' ); + $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( ' · ' ); + $( '<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( '<< ' + 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' ) + ' >>' ) - .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