wiki.techinc.nl/resources/mediawiki.page/mediawiki.page.patrol.ajax.js
Marius Hoch d1debff476 (bug 7851) Implement mediawiki.page.patrol.ajax
Implement AJAX patrolling with the new mediawiki.page.patrol.ajax
module, which makes use of the API via mediawiki.api.

During the patrol process a spinner (created by jquery.spinner)
shows up and after it a suitable message gets shown via
mediawiki.notify.

Depending on whether we had success or not the link then turns up
again or the brackets completely disappear just like on a normal page view.

On top of adding the module, I've changed the following:
- Added the patrol token to the ResourceLoaderUserTokensModule.
- Registered messages 'markedaspatrollednotify' and
  'markedaspatrollederrornotify'.

Change-Id: I472357566dda0ab572c20e2e4b87508b0f2f4c73
2012-11-13 23:09:38 +01:00

63 lines
1.9 KiB
JavaScript

/**
* Animate patrol links to use asynchronous API requests to
* patrol pages, rather than navigating to a different URI.
*
* @since 1.21
* @author Marius Hoch <hoo@online.de>
*/
( function ( mw, $ ) {
if ( !mw.user.tokens.exists( 'patrolToken' ) ) {
// Current user has no patrol right, or an old cached version of user.tokens
// that didn't have patrolToken yet.
return;
}
$( document ).ready( function () {
var $patrolLinks = $( '.patrollink a' );
$patrolLinks.on( 'click', function ( e ) {
var $spinner, href, rcid, apiRequest;
// Hide the link and create a spinner to show it inside the brackets.
$spinner = $.createSpinner( {
size: 'small',
type: 'inline'
} );
$( this ).hide().after( $spinner );
href = $( this ).attr( 'href' );
rcid = mw.util.getParamValue( 'rcid', href );
apiRequest = new mw.Api();
apiRequest.post( {
action: 'patrol',
token: mw.user.tokens.get( 'patrolToken' ),
rcid: rcid
} )
.done( function ( data ) {
// Remove all patrollinks from the page (including any spinners inside).
$patrolLinks.closest( '.patrollink' ).remove();
if ( data.patrol !== undefined ) {
// Success
var title = new mw.Title( data.patrol.title );
mw.notify( mw.msg( 'markedaspatrollednotify', title.toText() ) );
} else {
// This should never happen as errors should trigger fail
mw.notify( mw.msg( 'markedaspatrollederrornotify' ) );
}
} )
.fail( function ( error ) {
$spinner.remove();
// Restore the patrol link. This allows the user to try again
// (or open it in a new window, bypassing this ajax module).
$patrolLinks.show();
if ( error === 'noautopatrol' ) {
// Can't patrol own
mw.notify( mw.msg( 'markedaspatrollederror-noautopatrol' ) );
} else {
mw.notify( mw.msg( 'markedaspatrollederrornotify' ) );
}
} );
e.preventDefault();
} );
} );
}( mediaWiki, jQuery ) );