Fixing mediawiki.action.watch.ajax
authorKrinkle <krinkle@users.mediawiki.org>
Sat, 21 May 2011 18:33:48 +0000 (18:33 +0000)
committerKrinkle <krinkle@users.mediawiki.org>
Sat, 21 May 2011 18:33:48 +0000 (18:33 +0000)
* Adding error capturing in case there is an error (either in the API or with the request itself). Right now if it fails it just keeps reading "Watching..." and no error is displayed.
This lack became visible when r88522 changed ApiWatch to require a token and POST.
* Added message 'watcherrortext'.
* Moved messages-array in Resources.php form legacy.ajax to action.watch.ajax (looks like this was forgotten in r78147)
* Switched it to make a POST request in preparation of making it work with the changed API backend as of r88522.

languages/messages/MessagesEn.php
languages/messages/MessagesQqq.php
maintenance/language/messages.inc
resources/Resources.php
resources/mediawiki.action/mediawiki.action.watch.ajax.js

index 8dd6b38..9719c47 100644 (file)
@@ -2718,6 +2718,7 @@ The e-mail address you entered in [[Special:Preferences|your user preferences]]
 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',
index d1b2274..e23dfb1 100644 (file)
@@ -2360,6 +2360,7 @@ This is a button text used in [[Special:Emailuser]] when called without a (valid
 '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.',
index 20464a4..e927586 100644 (file)
@@ -1820,7 +1820,8 @@ $wgMessageStructure = array(
        ),
        'watching' => array(
                'watching',
-               'unwatching',
+               'watching',
+               'watcherrortext',
        ),
        'enotif' => array(
                'enotif_mailer',
index 3e95931..84d918a 100644 (file)
@@ -482,7 +482,15 @@ return array(
        ),
        '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 */
@@ -580,14 +588,6 @@ return array(
                '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(
index 484b3b0..55a131f 100644 (file)
@@ -23,8 +23,40 @@ var setLinkText = function( $link, action ) {
        }
 };
 
+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.
@@ -35,7 +67,7 @@ var processResult = function( response, $link ) {
        } 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' );
@@ -47,6 +79,7 @@ var processResult = function( response, $link ) {
        } else {
                $( '#wpWatchthis' ).removeAttr( 'checked' );
        }
+       return true;
 };
 
 $( document ).ready( function() {
@@ -88,15 +121,23 @@ $( 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;
        });