Jdlrobson has uploaded a new change for review.
https://gerrit.wikimedia.org/r/153652
Change subject: Notification overlay Messages and Alerts sections
......................................................................
Notification overlay Messages and Alerts sections
Shift to new API to support 2 tab view
When a new has no messages they will see the old style overlay with
Notifications heading. I have added tests to assure this is the case!
TODO in follow up patches
1) Add the mark as read button only in message view
2) Note currently the tabs do not refresh when notifications is clear.
We need some kind of EventEmitter to make this sort of thing easier.
Change-Id: I62b590e81cd3fe867c4c13959cb43466aacfe2d5
---
M Resources.php
M i18n/en.json
M i18n/qqq.json
M modules/base/ext.echo.base.js
M modules/overlay/ext.echo.overlay.js
M modules/overlay/ext.echo.overlay.less
M tests/qunit/overlay/test_ext.echo.overlay.js
7 files changed, 375 insertions(+), 205 deletions(-)
git pull ssh://gerrit.wikimedia.org:29418/mediawiki/extensions/Echo
refs/changes/52/153652/1
diff --git a/Resources.php b/Resources.php
index c7f686f..c7f3e2f 100644
--- a/Resources.php
+++ b/Resources.php
@@ -70,13 +70,13 @@
'mediawiki.language',
),
'messages' => array(
- 'echo-overlay-title',
- 'echo-overlay-title-overflow',
'echo-overlay-link',
- 'echo-none',
'echo-mark-all-as-read',
'echo-more-info',
'echo-feedback',
+ 'echo-notification-alert',
+ 'echo-notification-message',
+ 'echo-email-batch-bullet'
),
),
'ext.echo.overlay.init' => $echoResourceTemplate + array(
diff --git a/i18n/en.json b/i18n/en.json
index f6d70b1..c186527 100644
--- a/i18n/en.json
+++ b/i18n/en.json
@@ -46,8 +46,6 @@
"tooltip-pt-notifications": "Your notifications",
"echo-specialpage": "Notifications",
"echo-anon": "To receive notifications, [$1 create an account] or [$2 log
in].",
- "echo-none": "You have no notifications.",
- "echo-more-info": "More info",
"echo-feedback": "Feedback",
"echo-quotation-marks": "\"$1\"",
"notification-link-text-view-message": "View message",
@@ -94,9 +92,9 @@
"echo-email-batch-body-default": "You have a new notification.",
"echo-email-footer-default": "$2\n\nTo control which emails we send you,
check your
preferences:\n{{canonicalurl:{{#special:Preferences}}#mw-prefsection-echo}}\n\n$1",
"echo-email-footer-default-html": "To control which emails we send you, <a
href=\"$2\" style=\"text-decoration:none; color: #3868B0;\">check your
preferences</a>.<br />\n$1",
+ "echo-notification-alert": "Alerts",
+ "echo-notification-message": "Messages",
"echo-overlay-link": "All notifications",
- "echo-overlay-title": "<b>Notifications</b>",
- "echo-overlay-title-overflow": "<b>{{PLURAL:$1|Notifications}}</b>
(showing $1 of $2 unread)",
"echo-mark-all-as-read": "Mark all as read",
"echo-date-today": "Today",
"echo-date-yesterday": "Yesterday",
diff --git a/i18n/qqq.json b/i18n/qqq.json
index 59cc389..06ef5a9 100644
--- a/i18n/qqq.json
+++ b/i18n/qqq.json
@@ -112,6 +112,8 @@
"echo-email-batch-body-default": "Default message for Echo e-mail
digest notifications",
"echo-email-footer-default": "Default footer content for Echo text
e-mail notifications. Parameters:\n* $1 - the address of the organization that
sent the email\n* $2 - \"-------...\"
({{msg-mw|echo-email-batch-separator}})\n\nFor HTML version, see
{{msg-mw|echo-email-footer-default-html}}.",
"echo-email-footer-default-html": "Default footer content for Echo html
e-mail notifications. Parameters:\n* $1 - the address of the organization that
sent the email\n* $2 - the URL to the notification preference page\nFor
plain-text version, see {{msg-mw|Echo-email-footer-default}}.",
+ "echo-notification-alert": "Label for alert notifications tab in Echo
overlay.",
+ "echo-notification-message": "Label for message notifications tab in
Echo overlay.",
"echo-overlay-link": "Link to \"all notifications\" at the bottom of
the overlay.\n{{Identical|All notifications}}",
"echo-overlay-title": "Title at the top of the notifications overlay.
Should include bold tags.",
"echo-overlay-title-overflow": "Title at the top of the notifications
overlay when there are additional unread notifications that are not being
shown.\n\nParameters:\n* $1 - the number of unread notifications being shown\n*
$2 - the total number of unread notifications that exist",
diff --git a/modules/base/ext.echo.base.js b/modules/base/ext.echo.base.js
index 1ad5d39..da3a90f 100644
--- a/modules/base/ext.echo.base.js
+++ b/modules/base/ext.echo.base.js
@@ -1,4 +1,4 @@
-( function ( mw ) {
+( function ( mw, $ ) {
'use strict';
mw.echo = {
@@ -61,6 +61,13 @@
mw.loader.using( 'ext.eventLogging', function() {
mw.eventLog.logEvent( 'EchoInteraction', myEvt
);
} );
+ },
+ /**
+ * @method
+ * @return jQuery element corresponding to the badge reflecting
the notification count
+ */
+ getBadge: function() {
+ return $( '.mw-echo-notifications-badge' );
}
};
@@ -74,4 +81,4 @@
} );
} );
}
-} )( mediaWiki );
+} )( mediaWiki, jQuery );
diff --git a/modules/overlay/ext.echo.overlay.js
b/modules/overlay/ext.echo.overlay.js
index 8c34d95..1aaf0a1 100644
--- a/modules/overlay/ext.echo.overlay.js
+++ b/modules/overlay/ext.echo.overlay.js
@@ -7,144 +7,55 @@
function EchoOverlay( apiResultNotifications ) {
this.api = mw.echo.overlay.api;
+ // set internal properties
+ this.tabs = [];
this._buildOverlay( apiResultNotifications );
}
- EchoOverlay.prototype = {
- /**
- * @var array a list of unread notification ids that are
visible in the UI
- */
+ function EchoOverlayTab( name, notifications ) {
+ this.api = mw.echo.overlay.api;
+ this.name = name;
+ this.unread = [];
+ this._buildList( notifications );
+ }
+
+ EchoOverlayTab.prototype = {
unread: [],
- /**
- * @var object current count status of notification types
- */
- notificationCount: {
- /* @var integer length of all notifications (both
unread and read) that will be visible in the overlay */
- all: 0,
- /* @var string a string representation the current
number of unread notifications (1, 99, 99+) */
- unread: '0',
- /* @var integer the total number of all unread
notifications including those not in the overlay */
- unreadRaw: 0
+ getUnreadIds: function() {
+ return this.unread;
},
/**
- * @param newCount formatted count
- * @param rawCount unformatted count
+ * Mark all unread notifications as read
+ * @method
+ * @return jQuery.Deferred
*/
- updateCount: function ( newCount, rawCount ) {
- var $badge = $( '.mw-echo-notifications-badge' );
- $badge.text( newCount );
-
- if ( rawCount !== '0' && rawCount !== 0 ) {
- $badge.addClass( 'mw-echo-unread-notifications'
);
+ markAsRead: function() {
+ var self = this;
+ // only need to mark as read if there is unread item
+ if ( this.unread.length ) {
+ return this.api.post(
mw.echo.desktop.appendUseLang( {
+ 'action' : 'echomarkread',
+ 'list' : this.unread.join( '|' ),
+ 'token': mw.user.tokens.get(
'editToken' )
+ } ) ).then( function ( result ) {
+ return
result.query.echomarkread[self.name];
+ } );
} else {
- $badge.removeClass(
'mw-echo-unread-notifications' );
+ return new $.Deferred();
}
- this.notificationCount.unread = newCount;
- this.notificationCount.unreadRaw = rawCount;
},
-
- configuration: mw.config.get( 'wgEchoOverlayConfiguration' ),
-
- _getFooterElement: function() {
- var $prefLink = $( '#pt-preferences a' ),
- $overlayFooter = $( '<div>' )
- .attr( 'id', 'mw-echo-overlay-footer' );
-
- // add link to notifications archive
- $overlayFooter.append(
- $( '<a>' )
- .attr( 'id', 'mw-echo-overlay-link' )
- .addClass( 'mw-echo-grey-link' )
- .attr( 'href', getUrl(
'Special:Notifications' ) )
- .text( mw.msg( 'echo-overlay-link' ) )
- .click( function () {
- mw.echo.logInteraction(
'ui-archive-link-click', 'flyout' );
- } )
- .hover(
- function() {
- $( this ).removeClass(
'mw-echo-grey-link' );
- },
- function() {
- $( this ).addClass(
'mw-echo-grey-link' );
- }
- )
- );
-
- // add link to notification preferences
- $overlayFooter.append(
- $( '<a>' )
- .html( $prefLink.html() )
- .attr( 'id',
'mw-echo-overlay-pref-link' )
- .addClass( 'mw-echo-grey-link' )
- .attr( 'href', $prefLink.attr( 'href' )
+ '#mw-prefsection-echo' )
- .click( function () {
- mw.echo.logInteraction(
'ui-prefs-click', 'flyout' );
- } )
- .hover(
- function() {
- $( this ).removeClass(
'mw-echo-grey-link' );
- },
- function() {
- $( this ).addClass(
'mw-echo-grey-link' );
- }
- )
- );
- return $overlayFooter;
- },
-
- _getTitleElement: function() {
- var titleText,
- counter = this.notificationCount,
- notificationsCount = counter.all,
- unreadRawTotalCount = counter.unreadRaw,
- unreadTotalCount = counter.unread,
- unreadCount = this.unread.length,
- $title = $( '<div>' ).addClass(
'mw-echo-overlay-title' );
-
- if ( notificationsCount > 0 ) {
- if ( unreadRawTotalCount > unreadCount ) {
- titleText = mw.msg(
- 'echo-overlay-title-overflow',
- mw.language.convertNumber(
unreadCount ),
- mw.language.convertNumber(
unreadTotalCount )
- );
- } else {
- titleText = mw.msg(
'echo-overlay-title' );
- }
- } else {
- titleText = mw.msg( 'echo-none' );
- }
-
- // Add the header to the title area
- $( '<div>' )
- .attr( 'id', 'mw-echo-overlay-title-text' )
- .html( titleText )
- .appendTo( $title );
-
- // Add help button
- $( '<a>' )
- .attr( 'href', mw.config.get( 'wgEchoHelpPage'
) )
- .attr( 'title', mw.msg( 'echo-more-info' ) )
- .attr( 'id', 'mw-echo-overlay-moreinfo-link' )
- .attr( 'target', '_blank' )
- .click( function () {
- mw.echo.logInteraction(
'ui-help-click', 'flyout' );
- } )
- .appendTo( $title );
- return $title;
- },
-
/**
* Builds an Echo notifications list
* @method
- * @param object as returned by the api of notification items
+ * @param string tabName the tab
+ * @param object notifications as returned by the api of
notification items
* @return jQuery element
*/
- _buildNotificationList: function( notifications ) {
+ _buildList: function( notifications ) {
var self = this,
$ul = $( '<ul>' ).addClass(
'mw-echo-notifications' )
+ .data( 'tab', this )
.css( 'max-height', $( window
).height() - 134 );
-
$.each( notifications.index, function ( index, id ) {
var $wrapper,
@@ -209,52 +120,178 @@
mw.echo.setUpDismissability( $li );
}
} );
+ this.$el = $ul;
+ }
+ };
+
+ EchoOverlay.prototype = {
+ /**
+ * @var string the name of the tab that is currently active
+ */
+ activeTabName: 'alert',
+ /**
+ * @var array a list of EchoOverlayTabs
+ */
+ tabs: [],
+ /**
+ * @var object current count status of notification types
+ */
+ notificationCount: {
+ /* @var integer length of all notifications (both
unread and read) that will be visible in the overlay */
+ all: 0,
+ /* @var string a string representation the current
number of unread notifications (1, 99, 99+) */
+ unread: '0',
+ /* @var integer the total number of all unread
notifications including those not in the overlay */
+ unreadRaw: 0
+ },
+
+ /**
+ * FIXME: This should be pulled out of EchoOverlay and use an
EventEmitter.
+ * @param newCount formatted count
+ * @param rawCount unformatted count
+ */
+ updateBadgeCount: function ( newCount, rawCount ) {
+ var $badge = mw.echo.getBadge();
+ $badge.text( newCount );
+
+ if ( rawCount !== '0' && rawCount !== 0 ) {
+ $badge.addClass( 'mw-echo-unread-notifications'
);
+ } else {
+ $badge.removeClass(
'mw-echo-unread-notifications' );
+ }
+ this.notificationCount.unread = newCount;
+ this.notificationCount.unreadRaw = rawCount;
+ },
+
+ configuration: mw.config.get( 'wgEchoOverlayConfiguration' ),
+
+ _getFooterElement: function() {
+ var $prefLink = $( '#pt-preferences a' ),
+ $overlayFooter = $( '<div>' )
+ .attr( 'id', 'mw-echo-overlay-footer' );
+
+ // add link to notifications archive
+ $overlayFooter.append(
+ $( '<a>' )
+ .attr( 'id', 'mw-echo-overlay-link' )
+ .addClass( 'mw-echo-grey-link' )
+ .attr( 'href', getUrl(
'Special:Notifications' ) )
+ .text( mw.msg( 'echo-overlay-link' ) )
+ .click( function () {
+ mw.echo.logInteraction(
'ui-archive-link-click', 'flyout' );
+ } )
+ .hover(
+ function() {
+ $( this ).removeClass(
'mw-echo-grey-link' );
+ },
+ function() {
+ $( this ).addClass(
'mw-echo-grey-link' );
+ }
+ )
+ );
+
+ // add link to notification preferences
+ $overlayFooter.append(
+ $( '<a>' )
+ .html( $prefLink.html() )
+ .attr( 'id',
'mw-echo-overlay-pref-link' )
+ .addClass( 'mw-echo-grey-link' )
+ .attr( 'href', $prefLink.attr( 'href' )
+ '#mw-prefsection-echo' )
+ .click( function () {
+ mw.echo.logInteraction(
'ui-prefs-click', 'flyout' );
+ } )
+ .hover(
+ function() {
+ $( this ).removeClass(
'mw-echo-grey-link' );
+ },
+ function() {
+ $( this ).addClass(
'mw-echo-grey-link' );
+ }
+ )
+ );
+ return $overlayFooter;
+ },
+
+ _showTabList: function( tab ) {
+ var $lists = this.$el.find( '.mw-echo-notifications'
).hide(),
+ self = this;
+
+ this.activeTabName = tab.name;
+ $lists.each( function() {
+ if ( $( this ).data( 'tab' ).name === tab.name
) {
+ $( this ).show();
+ tab.markAsRead().done( function( data )
{
+ self.updateBadgeCount(
data.count, data.rawcount );
+ } );
+ }
+ } );
+ },
+
+ _getTabsElement: function() {
+ var $li,
+ $ul = $( '<ul>' ), self = this;
+
+ $.each( this.tabs, function( i, echoTab ) {
+ var
+ tabName = echoTab.name,
+ // @todo: Pass the number of unread
messages
+ label = mw.msg( 'echo-notification-' +
tabName );
+
+ $li = $( '<li>' )
+ .on( 'click', function() {
+ var $this = $( this );
+ $ul.find( 'li' ).removeClass(
'mw-echo-section-current' );
+ $this.addClass(
'mw-echo-section-current' );
+ self._showTabList( $this.data(
'tab' ) );
+ } )
+ .data( 'tab', echoTab )
+ .addClass( i === 0 ?
'mw-echo-section-current' : '' )
+ .text( label )
+ .appendTo( $ul );
+ } );
return $ul;
},
+ getUnreadCount: function() {
+ var count = 0;
+ $.each( this.tabs, function( i, tab ) {
+ count += tab.getUnreadIds().length;
+ } );
+ return count;
+ },
+
+ _getTitleElement: function() {
+ var tabs = this._getTabsElement(),
+ $title = $( '<div>' ).addClass(
'mw-echo-overlay-title' );
+
+ $title.append( tabs );
+ this._showTabList( this.tabs[0] );
+
+ return $title;
+ },
+
_buildOverlay: function ( notifications ) {
- var $ul,
- $overlay = $( '<div>' ).addClass(
'mw-echo-overlay' ),
- self = this;
-
- this.notificationCount.all = notifications.index.length;
- if ( this.notificationCount.all !== undefined ) {
- self.updateCount( notifications.count,
notifications.rawcount );
- }
-
- $ul = self._buildNotificationList( notifications );
- self._getTitleElement().
- appendTo( $overlay );
-
- if ( $ul.find( 'li' ).length ) {
- $ul.appendTo( $overlay );
- }
-
- $overlay.append( self._getFooterElement() );
- self.markAsRead();
+ var tabs,
+ self = this,
+ $overlay = $( '<div>' ).addClass(
'mw-echo-overlay' );
this.$el = $overlay;
- },
- /**
- * Mark a list of notifications as read
- * @method
- */
- markAsRead: function() {
- var self = this;
- // only need to mark as read if there is unread item
- if ( this.unread.length ) {
- this.api.post( mw.echo.desktop.appendUseLang( {
- 'action' : 'echomarkread',
- 'list' : this.unread.join( '|' ),
- 'token': mw.user.tokens.get(
'editToken' )
- } ) ).done( function ( result ) {
- var count;
- if ( result.query.echomarkread.count
!== undefined ) {
- count =
result.query.echomarkread.count;
- self.updateCount( count,
result.query.echomarkread.rawcount );
- }
- } );
+
+ if ( notifications.message.index.length ) {
+ tabs = [ 'message', 'alert' ];
+ } else {
+ tabs = [ 'alert' ];
}
+
+ $.each( tabs, function( i, tabName ) {
+ var tab = new EchoOverlayTab( tabName,
notifications[tabName] );
+ self.$el.append( tab.$el );
+ self.tabs.push( tab );
+ self.notificationCount.all +=
notifications[tabName].index.length;
+ } );
+
+ $overlay.prepend( this._getTitleElement() );
+ $overlay.append( this._getFooterElement() );
}
};
@@ -276,6 +313,8 @@
var apiData = {
'action' : 'query',
'meta' : 'notifications',
+ notsections : 'alert|message',
+ notgroupbysection: 1,
'notformat' : 'flyout',
'notlimit' : this.notificationLimit,
'notprop' : 'index|list|count'
diff --git a/modules/overlay/ext.echo.overlay.less
b/modules/overlay/ext.echo.overlay.less
index dfc8ef6..4761b70 100644
--- a/modules/overlay/ext.echo.overlay.less
+++ b/modules/overlay/ext.echo.overlay.less
@@ -25,6 +25,7 @@
#p-personal {
+ .mw-echo-overlay-title ul,
ul.mw-echo-notifications {
// override #p-personal ul in core
padding: 0;
@@ -43,6 +44,10 @@
}
.mw-echo-overlay {
+ .mw-echo-section-current {
+ font-weight: bold;
+ }
+
a.mw-echo-grey-link {
color: #6D6D6D;
}
@@ -106,6 +111,24 @@
border-bottom: 1px solid #DDDDDD;
}
+/* override #p-personal li*/
+#p-personal .mw-echo-overlay-title li {
+ font-size: 1em;
+ margin-left: 0;
+}
+
+.mw-echo-overlay-title li {
+ &::after {
+ content: " ยท ";
+ padding: 0 .25em;
+ }
+ &:last-child {
+ &::after {
+ content: '';
+ }
+ }
+}
+
#mw-echo-overlay-title-text {
display: inline;
zoom: 1;
diff --git a/tests/qunit/overlay/test_ext.echo.overlay.js
b/tests/qunit/overlay/test_ext.echo.overlay.js
index 5ee1f82..f3f3c1d 100644
--- a/tests/qunit/overlay/test_ext.echo.overlay.js
+++ b/tests/qunit/overlay/test_ext.echo.overlay.js
@@ -1,67 +1,168 @@
( function( $, mw ) {
QUnit.module( 'ext.echo.overlay', {
setup: function() {
- var ApiStub = function() {};
+ this.$badge = $( '<a class="mw-echo-notifications-badge
mw-echo-unread-notifications">1</a>' );
+ this.sandbox.stub( mw.echo, 'getBadge' ).returns(
this.$badge );
+ // Kill any existing overlays to avoid clashing with
other tests
+ $( '.mw-echo-overlay' ).remove();
+
+ var ApiStub = function( mode ) {
+ this.mode = mode;
+ };
ApiStub.prototype = {
- post: function() {
- return $.Deferred().resolve( {
- query: {
- echomarkread: {
- count: 0
- }
- }
- } );
+ post: function( data ) {
+ return new $.Deferred().resolve(
this.getNewNotificationCountData( data ) );
},
get: function() {
- return new $.Deferred().resolve( {
+ var data = this.getData();
+ if ( this.mode === 1 ) {
+
data.query.notifications.message = {
+ index: [ 100 ],
+ list: {
+ 100: {
+ '*':
'Jon sent you a message on the Flow board Talk:XYZ',
+ read:
'20140805211446',
+
category: 'message',
+ id: 100,
+ type:
'message'
+ }
+ }
+ };
+ }
+ return $.Deferred().resolve( data );
+ },
+ getNewNotificationCountData: function( data ) {
+ var alertCount, messageCount,
+ rawCount = 0,
+ count = 0;
+
+ messageCount = {
+ count: '0',
+ rawcount: 0
+ };
+ if ( data.list === '100' ) {
+ alertCount = {
+ count: '1',
+ rawcount: 1
+ };
+ count = 1;
+ rawCount = 1;
+ } else {
+ alertCount = {
+ count: '0',
+ rawcount: 0
+ };
+ }
+ data = {
+ query: {
+ echomarkread: {
+ alert:
alertCount,
+ message:
messageCount,
+ rawcount:
rawCount,
+ count: count
+ }
+ }
+ };
+ return data;
+ },
+ getData: function() {
+ return {
query: {
notifications: {
- index: [ 70, 71
],
count: '1',
rawcount: 1,
- list: {
- 70: {
-
'*': 'Jon mentioned you.',
-
agent: { id: 212, name: 'Jon' },
-
category: 'mention',
-
id: 70,
-
read: '20140805211446',
-
timestamp: {
-
unix: '1407273276'
+ message: {
+ index:
[],
+ list: {}
+ },
+ alert: {
+ index:
[ 70, 71 ],
+ list: {
+
70: {
+
'*': 'Jon mentioned you.',
+
agent: { id: 212, name: 'Jon' },
+
category: 'mention',
+
id: 70,
+
read: '20140805211446',
+
timestamp: {
+
unix: '1407273276'
+
},
+
title: {
+
full: 'Spiders'
+
},
+
type: 'mention'
},
-
title: {
-
full: 'Spiders'
-
},
-
type: 'mention'
- },
- 71: {
-
'*': 'X talked to you.',
-
category: 'edit-user-talk',
-
id: 71,
-
type: 'edit-user-talk'
+
71: {
+
'*': 'X talked to you.',
+
category: 'edit-user-talk',
+
id: 71,
+
type: 'edit-user-talk'
+
}
}
}
}
}
- } );
+ };
}
};
- this.sandbox.stub( mw.echo.overlay, 'api', new
ApiStub() );
+ this.ApiStub = ApiStub;
}
} );
- QUnit.test( 'mw.echo.overlay.buildOverlay', 5, function( assert ) {
+ QUnit.test( 'mw.echo.overlay.buildOverlay', 7, function( assert ) {
var $overlay;
+ this.sandbox.stub( mw.echo.overlay, 'api', new this.ApiStub() );
mw.echo.overlay.buildOverlay( function( $o ) {
$overlay = $o;
} );
- assert.strictEqual( $overlay.find( 'ul' ).length, 1, 'Overlay
contains a list of notifications.' );
- assert.strictEqual( $overlay.find( 'li' ).length, 2, 'There are
two notifications.' );
+ assert.strictEqual( $overlay.find( '.mw-echo-overlay-title ul
li' ).length, 1, 'Only one tab in header' );
+ assert.strictEqual( $overlay.find( 'ul.mw-echo-notifications'
).length, 1, 'Overlay contains a list of notifications.' );
+ assert.strictEqual( $overlay.find( 'ul.mw-echo-notifications
li' ).length, 2, 'There are two notifications.' );
assert.strictEqual( $overlay.find( '.mw-echo-unread' ).length,
1, 'There is one unread notification.' );
assert.strictEqual( $overlay.find( '#mw-echo-overlay-footer a'
).length, 2,
'There is a footer with 2 links to preferences and all
notifications.' );
- assert.strictEqual( $overlay.find(
'a#mw-echo-overlay-moreinfo-link' ).length, 1,
- 'There is a help link.' );
+ assert.strictEqual( this.$badge.text(),
+ '0', 'The alerts are marked as read once opened.' );
+ assert.strictEqual( this.$badge.hasClass(
'mw-echo-unread-notifications' ),
+ false, 'The badge no longer indicates new messages.' );
+ } );
+
+ QUnit.test( 'mw.echo.overlay.buildOverlay with messages', 5, function(
assert ) {
+ var $overlay;
+ this.sandbox.stub( mw.echo.overlay, 'api', new this.ApiStub( 1
) );
+ mw.echo.overlay.buildOverlay( function( $o ) {
+ $overlay = $o;
+ } );
+ assert.strictEqual( $overlay.find( '.mw-echo-overlay-title ul
li' ).length, 2, 'There are two tabs in header' );
+ assert.strictEqual( $overlay.find( '.mw-echo-notifications'
).length, 2, 'Overlay contains 2 lists of notifications.' );
+ assert.strictEqual( $overlay.find( '.mw-echo-overlay-title li'
).eq( 0 ).hasClass( 'mw-echo-section-current' ),
+ true, 'First tab is the selected tab upon opening.' );
+ assert.strictEqual( this.$badge.text(),
+ '1', 'The label stays as 1 until you switch tabs.' );
+ assert.strictEqual( this.$badge.hasClass(
'mw-echo-unread-notifications' ),
+ true, 'The notification button class is not updated
until you switch to alert tab.' );
+ } );
+
+ QUnit.test( 'Switch tabs on overlay. No unread messages, 1 unread
alert.', 4, function( assert ) {
+ var $overlay, $tabs;
+
+ this.sandbox.stub( mw.echo.overlay, 'api', new this.ApiStub( 1
) );
+ mw.echo.overlay.buildOverlay( function( $o ) {
+ $overlay = $o;
+ $tabs = $overlay.find( '.mw-echo-overlay-title li' );
+ } );
+
+ // switch to 2nd tab
+ $overlay.find( '.mw-echo-overlay-title li' ).eq( 1 ).trigger(
'click' );
+
+ assert.strictEqual( $tabs.eq( 0 ).hasClass(
'mw-echo-section-current' ),
+ false, 'First tab is now the selected tab.' );
+ assert.strictEqual( $tabs.eq( 1 ).hasClass(
'mw-echo-section-current' ),
+ true, 'Second tab is now the selected tab.' );
+ assert.strictEqual( this.$badge.text(),
+ '0', 'The label is now set to 0.' );
+ assert.strictEqual( this.$badge.hasClass(
'mw-echo-unread-notifications' ),
+ false, 'There are now zero unread notifications.' );
} );
}( jQuery, mediaWiki ) );
--
To view, visit https://gerrit.wikimedia.org/r/153652
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings
Gerrit-MessageType: newchange
Gerrit-Change-Id: I62b590e81cd3fe867c4c13959cb43466aacfe2d5
Gerrit-PatchSet: 1
Gerrit-Project: mediawiki/extensions/Echo
Gerrit-Branch: two_tabs
Gerrit-Owner: Jdlrobson <[email protected]>
_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits