diff --git a/Echo.php b/Echo.php index 29d78ced7..d4777f5ad 100644 --- a/Echo.php +++ b/Echo.php @@ -152,6 +152,16 @@ $wgResourceModules += array( ), 'targets' => array( 'desktop', 'mobile' ), ), + 'ext.echo.desktop' => $echoResourceTemplate + array( + 'scripts' => 'desktop/ext.echo.desktop.js', + 'dependencies' => array( + 'ext.echo.base', + 'mediawiki.api', + 'mediawiki.Uri', + 'mediawiki.jqueryMsg', + 'mediawiki.user', + ), + ), 'ext.echo.overlay' => $echoResourceTemplate + array( 'scripts' => array( 'overlay/ext.echo.overlay.js', @@ -162,12 +172,8 @@ $wgResourceModules += array( 'monobook' => 'overlay/ext.echo.overlay.monobook.css', ), 'dependencies' => array( - 'ext.echo.base', - 'mediawiki.api', - 'mediawiki.Uri', + 'ext.echo.desktop', 'mediawiki.util', - 'mediawiki.jqueryMsg', - 'mediawiki.user', ), 'messages' => array( 'echo-overlay-title', @@ -185,12 +191,8 @@ $wgResourceModules += array( ), 'styles' => 'special/ext.echo.special.css', 'dependencies' => array( - 'ext.echo.base', - 'mediawiki.api', - 'mediawiki.Uri', + 'ext.echo.desktop', 'mediawiki.ui', - 'mediawiki.jqueryMsg', - 'mediawiki.user', ), 'messages' => array( 'echo-load-more-error', diff --git a/api/ApiEchoMarkRead.php b/api/ApiEchoMarkRead.php index 5467af764..6183e0534 100644 --- a/api/ApiEchoMarkRead.php +++ b/api/ApiEchoMarkRead.php @@ -29,7 +29,13 @@ class ApiEchoMarkRead extends ApiBase { } } - $result = array( 'result' => 'success', 'count' => $notifUser->getFormattedNotificationCount() ); + $rawCount = $notifUser->getNotificationCount(); + + $result = array( + 'result' => 'success', + 'rawcount' => $rawCount, + 'count' => EchoNotificationController::formatNotificationCount( $rawCount ), + ); $this->getResult()->addValue( 'query', $this->getModuleName(), $result ); } @@ -45,6 +51,7 @@ class ApiEchoMarkRead extends ApiBase { 'token' => array( ApiBase::PARAM_REQUIRED => true, ), + 'uselang' => null ); } @@ -53,6 +60,7 @@ class ApiEchoMarkRead extends ApiBase { 'list' => 'A list of notification IDs to mark as read', 'all' => "If set to true, marks all of a user's notifications as read", 'token' => 'edit token', + 'uselang' => 'the desired language to format the output' ); } diff --git a/api/ApiEchoNotifications.php b/api/ApiEchoNotifications.php index af827f106..a570b61e6 100644 --- a/api/ApiEchoNotifications.php +++ b/api/ApiEchoNotifications.php @@ -50,7 +50,9 @@ class ApiEchoNotifications extends ApiQueryBase { } if ( in_array( 'count', $prop ) ) { - $result['count'] = $notifUser->getFormattedNotificationCount(); + $rawCount = $notifUser->getNotificationCount(); + $result['rawcount'] = $rawCount; + $result['count'] = EchoNotificationController::formatNotificationCount( $rawCount ); } if ( in_array( 'index', $prop ) ) { diff --git a/modules/desktop/ext.echo.desktop.js b/modules/desktop/ext.echo.desktop.js new file mode 100644 index 000000000..d2be57f7f --- /dev/null +++ b/modules/desktop/ext.echo.desktop.js @@ -0,0 +1,20 @@ +( function ( $, mw ) { + 'use strict'; + + // Functions that are only available to echo desktop version + mw.echo.desktop = { + /** + * Append uselang param to API get/post data if applicable + * @param apiData {Object} + */ + appendUseLang: function ( apiData ) { + var curUri = new mw.Uri(); + if ( curUri.query.uselang !== undefined ) { + apiData.uselang = curUri.query.uselang; + } + + return apiData; + } + }; + +} )( jQuery, mediaWiki ); diff --git a/modules/overlay/ext.echo.overlay.js b/modules/overlay/ext.echo.overlay.js index 8d5c60e74..55ddda8fc 100644 --- a/modules/overlay/ext.echo.overlay.js +++ b/modules/overlay/ext.echo.overlay.js @@ -4,12 +4,15 @@ mw.echo.overlay = { - updateCount: function ( newCount ) { + /** + * @param newCount formatted count + * @param rawCount unformatted count + */ + updateCount: function ( newCount, rawCount ) { var $badge = $( '.mw-echo-notifications-badge' ); $badge.text( newCount ); - // newCount could be '99+' or another string. - // Checking for number as well just to be paranoid. - if ( newCount !== '0' && newCount !== 0 ) { + + if ( rawCount !== '0' && rawCount !== 0 ) { $badge.addClass( 'mw-echo-unread-notifications' ); } else { $badge.removeClass( 'mw-echo-unread-notifications' ); @@ -24,7 +27,6 @@ $prefLink = $( '#pt-preferences a' ), count = 0, apiData, - curUri = new mw.Uri(), api = new mw.Api( { ajax: { cache: false } } ); // Set notification limit based on height of the window @@ -44,14 +46,11 @@ 'notprop' : 'index|list|count' }; - if ( curUri.query.uselang !== undefined ) { - apiData.uselang = curUri.query.uselang; - } - - api.get( apiData ).done( function ( result ) { + api.get( mw.echo.desktop.appendUseLang( apiData ) ).done( function ( result ) { var notifications = result.query.notifications, unread = [], unreadTotalCount = result.query.notifications.count, + unreadRawTotalCount = result.query.notifications.rawcount, $title = $( '
' ), $ul = $( '' ), titleText = '', @@ -60,7 +59,7 @@ $markReadButton; if ( unreadTotalCount !== undefined ) { - mw.echo.overlay.updateCount( unreadTotalCount ); + mw.echo.overlay.updateCount( unreadTotalCount, unreadRawTotalCount ); } $ul.css( 'max-height', notificationLimit * 95 + 'px' ); $.each( notifications.index, function ( index, id ) { @@ -123,7 +122,7 @@ } ); if ( notifications.index.length > 0 ) { - if ( isNaN( unreadTotalCount ) || unreadTotalCount > unread.length ) { + if ( unreadRawTotalCount > unread.length ) { titleText = mw.msg( 'echo-overlay-title-overflow', unread.length, unreadTotalCount ); overflow = true; } else { @@ -139,14 +138,14 @@ .text( mw.msg( 'echo-mark-all-as-read' ) ) .click( function ( e ) { e.preventDefault(); - api.post( { + api.post( mw.echo.desktop.appendUseLang( { 'action' : 'echomarkread', 'all' : true, 'token': mw.user.tokens.get( 'editToken' ) - } ).done( function ( result ) { + } ) ).done( function ( result ) { if ( result.query.echomarkread.count !== undefined ) { count = result.query.echomarkread.count; - mw.echo.overlay.updateCount( count ); + mw.echo.overlay.updateCount( count, result.query.echomarkread.rawcount ); // Reset header to 'Notifications' $( '#mw-echo-overlay-title-text').msg( 'echo-overlay-title' ); } @@ -158,9 +157,7 @@ // The only reason we limit it to the maximum is to prevent expensive // database updates. If the count is more than the maximum, it could // be thousands. - if ( overflow && - !isNaN( unreadTotalCount ) && - unreadTotalCount < mw.echo.overlay.configuration['max-notification-count'] + if ( overflow && unreadRawTotalCount < mw.echo.overlay.configuration['max-notification-count'] ) { // Add the 'mark all as read' button to the title area $title.append( $markReadButton ); @@ -239,14 +236,14 @@ // only need to mark as read if there is unread item if ( unread.length > 0 ) { - api.post( { + api.post( mw.echo.desktop.appendUseLang( { 'action' : 'echomarkread', 'list' : unread.join( '|' ), 'token': mw.user.tokens.get( 'editToken' ) - } ).done( function ( result ) { + } ) ).done( function ( result ) { if ( result.query.echomarkread.count !== undefined ) { count = result.query.echomarkread.count; - mw.echo.overlay.updateCount( count ); + mw.echo.overlay.updateCount( count, result.query.echomarkread.rawcount ); } } ); } diff --git a/modules/special/ext.echo.special.js b/modules/special/ext.echo.special.js index dbeaf355a..eb92347d6 100644 --- a/modules/special/ext.echo.special.js +++ b/modules/special/ext.echo.special.js @@ -58,7 +58,7 @@ * Load more notification records. */ loadMore: function () { - var api = new mw.Api( { ajax: { cache: false } } ), curUri = new mw.Uri(), + var api = new mw.Api( { ajax: { cache: false } } ), notifications, data, container, $li, that = this, unread = [], apiData; apiData = { @@ -70,11 +70,7 @@ 'notlimit': mw.config.get( 'wgEchoDisplayNum' ) }; - if ( curUri.query.uselang !== undefined ) { - apiData.uselang = curUri.query.uselang; - } - - api.get( apiData ).done( function ( result ) { + api.get( mw.echo.desktop.appendUseLang( apiData ) ).done( function ( result ) { container = $( '#mw-echo-special-container' ); notifications = result.query.notifications; unread = []; @@ -128,16 +124,16 @@ markAsRead: function ( unread ) { var api = new mw.Api(), that = this; - api.post( { + api.post( mw.echo.desktop.appendUseLang( { 'action' : 'echomarkread', 'list' : unread.join( '|' ), 'token': mw.user.tokens.get( 'editToken' ) - } ).done( function ( result ) { + } ) ).done( function ( result ) { // update the badge if the link is enabled if ( result.query.echomarkread.count !== undefined && $( '#pt-notifications').length && typeof mw.echo.overlay === 'object' ) { - mw.echo.overlay.updateCount( result.query.echomarkread.count ); + mw.echo.overlay.updateCount( result.query.echomarkread.count, result.query.echomarkread.rawcount ); } that.onSuccess(); } ).fail( function () {