X-Git-Url: https://scripts.mit.edu/gitweb/autoinstallsdev/mediawiki.git/blobdiff_plain/19e297c21b10b1b8a3acad5e73fc71dcb35db44a..6932310fd58ebef145fa01eb76edf7150284d8ea:/resources/src/mediawiki/page/rollback.js diff --git a/resources/src/mediawiki/page/rollback.js b/resources/src/mediawiki/page/rollback.js new file mode 100644 index 00000000..6db518db --- /dev/null +++ b/resources/src/mediawiki/page/rollback.js @@ -0,0 +1,67 @@ +/*! + * Enhance rollback links by using asynchronous API requests, + * rather than navigating to an action page. + * + * @since 1.28 + * @author Timo Tijhof + */ +( function ( mw, $ ) { + + $( function () { + $( '.mw-rollback-link' ).on( 'click', 'a[data-mw="interface"]', function ( e ) { + var api, $spinner, + $link = $( this ), + url = this.href, + page = mw.util.getParamValue( 'title', url ), + user = mw.util.getParamValue( 'from', url ); + + if ( !page || user === null ) { + // Let native browsing handle the link + return true; + } + + // Preload the notification module for mw.notify + mw.loader.load( 'mediawiki.notification' ); + + // Remove event handler so that next click (re-try) uses server action + $( e.delegateTarget ).off( 'click' ); + + // Hide the link and create a spinner to show it inside the brackets. + $spinner = $.createSpinner( { size: 'small', type: 'inline' } ); + $link.hide().after( $spinner ); + + // @todo: data.messageHtml is no more. Convert to using errorformat=html. + api = new mw.Api(); + api.rollback( page, user ) + .then( function ( data ) { + mw.notify( $.parseHTML( data.messageHtml ), { + title: mw.msg( 'actioncomplete' ) + } ); + + // Remove link container and the subsequent text node containing " | ". + if ( e.delegateTarget.nextSibling && e.delegateTarget.nextSibling.nodeType === Node.TEXT_NODE ) { + $( e.delegateTarget.nextSibling ).remove(); + } + $( e.delegateTarget ).remove(); + }, function ( errorCode, data ) { + var message = data && data.error && data.error.messageHtml ? + $.parseHTML( data.error.messageHtml ) : + mw.msg( 'rollbackfailed' ), + type = errorCode === 'alreadyrolled' ? 'warn' : 'error'; + + mw.notify( message, { + type: type, + title: mw.msg( 'rollbackfailed' ), + autoHide: false + } ); + + // Restore the link (enables user to try again) + $spinner.remove(); + $link.show(); + } ); + + e.preventDefault(); + } ); + } ); + +}( mediaWiki, jQuery ) );