Future changes to this page and its associated talk page will be listed there, and the page will appear '''bolded''' in the [[Special:RecentChanges|list of recent changes]] to make it easier to pick out.",
'removedwatch' => 'Removed from watchlist',
'removedwatchtext' => 'The page "[[:$1]]" has been removed from [[Special:Watchlist|your watchlist]].',
+'watcherrortext' => 'An error occurred while changing your watchlist settings for "$1".',
'watch' => 'Watch',
'watchthispage' => 'Watch this page',
'unwatch' => 'Unwatch',
'addedwatchtext' => 'Explanation shown when clicking on the {{msg|watch}} tab. See also {{msg|addedwatch}}.',
'removedwatch' => 'Page title displayed when clicking on {{msg|unwatch}} tab (only when not using the AJAX feauture which allows watching a page without reloading the page or such). See also {{msg|removedwatchtext}}.',
'removedwatchtext' => "After a page has been removed from a user's watchlist by clicking the {{msg|unwatch}} tab at the top of an article, this message appears just below the title of the article. $1 is the title of the article. See also {{msg|removedwatch}} and {{msg|addedwatchtext}}.",
+'watcherrortext' => "When a user clicked the watch/unwatch tab and the action did not succeed, this message is displayed. See also {{msg|addedwatchtext}}. and {{msg|addedwatchtext}}. This message is used raw and should not contain wikitext.",
'watch' => 'Name of the Watch tab. Should be in the imperative mood.',
'watchthispage' => '{{Identical|Watch this page}}',
'unwatch' => 'Label of "Unwatch" tab.',
),
'mediawiki.action.watch.ajax' => array(
'scripts' => 'resources/mediawiki.action/mediawiki.action.watch.ajax.js',
- 'dependencies' => 'mediawiki.util',
+ 'messages' => array(
+ 'watch',
+ 'unwatch',
+ 'watching',
+ 'unwatching',
+ 'tooltip-ca-watch',
+ 'tooltip-ca-unwatch',
+ 'watcherrortext',
+ ),
),
/* Special pages */
'scripts' => 'common/ajax.js',
'remoteBasePath' => $GLOBALS['wgStylePath'],
'localBasePath' => "{$GLOBALS['IP']}/skins",
- 'messages' => array(
- 'watch',
- 'unwatch',
- 'watching',
- 'unwatching',
- 'tooltip-ca-watch',
- 'tooltip-ca-unwatch',
- ),
'dependencies' => 'mediawiki.legacy.wikibits',
),
'mediawiki.legacy.commonPrint' => array(
}
};
+var errorHandler = function( $link ) {
+
+ // Reset link text to whatever it was before we switching it to the '(un)watch'+ing message.
+ setLinkText( $link, $link.data( 'action' ) );
+
+ // Format error message
+ var cleanTitle = mw.config.get( 'wgPageName' ).replace( /_/g, ' ' );
+ var link = mw.html.element(
+ 'a', {
+ 'href': mw.util.wikiGetlink( mw.config.get( 'wgPageName' ) ),
+ 'title': cleanTitle
+ }, cleanTitle
+ );
+ var msg = mw.msg( 'watcherrortext', link );
+
+ // Report to user about the error
+ mw.util.jsMessage( msg, 'watch' );
+};
+
+/**
+ * Process the result of the API watch action.
+ *
+ * @param response Data object from API request.
+ * @param $link jQuery object of the watch link.
+ * @return Boolean true on success, false otherwise.
+ */
var processResult = function( response, $link ) {
- watchResponse = response.watch;
+
+ if ( ( 'error' in response ) || !response.watch ) {
+ errorHandler( $link );
+ return false;
+ }
+
+ var watchResponse = response.watch;
// To ensure we set the same status for all watch links with the
// same target we trigger a custom event on *all* watch links.
} else {
// Either we got an error code or it just plain broke.
window.location.href = $link[0].href;
- return;
+ return false;
}
mw.util.jsMessage( watchResponse.message, 'watch' );
} else {
$( '#wpWatchthis' ).removeAttr( 'checked' );
}
+ return true;
};
$( document ).ready( function() {
// API return contains a localized data.watch.message string.
'uselang': mw.config.get( 'wgUserLanguage' )
};
+
if ( $link.data( 'action' ) == 'unwatch' ) {
reqData.unwatch = '';
}
- $.getJSON( mw.util.wikiScript( 'api' ),
- reqData,
- function( data, textStatus, xhr ) {
+
+ $.ajax({
+ url: mw.util.wikiScript( 'api' ),
+ dataType: 'json',
+ type: 'POST',
+ data: reqData,
+ success: function( data, textStatus, xhr ) {
processResult( data, $link );
+ },
+ error: function(){
+ processResult( {}, $link );
}
- );
+ });
return false;
});