Sbisson has uploaded a new change for review.
https://gerrit.wikimedia.org/r/282345
Change subject: [WIP] EchoController
......................................................................
[WIP] EchoController
Change-Id: I819cf0b7d6a8246df2461c71e41cd14854038247
---
M Resources.php
A modules/controller/mw.echo.controller.js
M modules/ext.echo.init.js
M modules/ooui/mw.echo.ui.BundledNotificationGroupWidget.js
M modules/ooui/mw.echo.ui.NotificationBadgeWidget.js
M modules/ooui/mw.echo.ui.NotificationGroupItemWidget.js
M modules/ooui/mw.echo.ui.NotificationItemWidget.js
M modules/ooui/mw.echo.ui.NotificationsWidget.js
M modules/viewmodel/mw.echo.dm.NotificationsModel.js
M modules/viewmodel/mw.echo.dm.UnreadNotificationCounter.js
10 files changed, 72 insertions(+), 17 deletions(-)
git pull ssh://gerrit.wikimedia.org:29418/mediawiki/extensions/Echo
refs/changes/45/282345/1
diff --git a/Resources.php b/Resources.php
index feea1c2..f789434 100644
--- a/Resources.php
+++ b/Resources.php
@@ -51,6 +51,7 @@
),
'dependencies' => array(
'ext.echo.ui',
+ 'ext.echo.controller',
'ext.echo.styles.badge',
),
'targets' => array( 'desktop' ),
@@ -165,6 +166,15 @@
),
'targets' => array( 'desktop', 'mobile' ),
),
+ 'ext.echo.controller' => $echoResourceTemplate + array(
+ 'scripts' => array(
+ 'controller/mw.echo.controller.js'
+ ),
+ 'dependencies' => array(
+ 'ext.echo.api'
+ ),
+ 'targets' => array( 'desktop', 'mobile' ),
+ ),
'ext.echo.api' => $echoResourceTemplate + array(
'scripts' => array(
'api/mw.echo.api.js',
diff --git a/modules/controller/mw.echo.controller.js
b/modules/controller/mw.echo.controller.js
new file mode 100644
index 0000000..89d0226
--- /dev/null
+++ b/modules/controller/mw.echo.controller.js
@@ -0,0 +1,29 @@
+( function ( mw ) {
+
+ mw.echo.Controller = function MwEchoController( echoApi, model, counter
) {
+ this.api = echoApi;
+ this.model = model;
+ this.counter = counter;
+ };
+
+ mw.echo.Controller.prototype.markNotificationAsRead = function ( id,
source ) {
+ var controller = this,
+ notification = this.model.getNotification( id, source );
+
+ if ( !notification ) {
+ console.log( 'notification not found' );
+ return;
+ }
+
+ notification.toggleRead();
+ this.api.markItemsRead( [ notification.getId() ], source,
notification.isRead() )
+ .then( function () {
+ return controller.refreshUnreadCount();
+ } );
+ };
+
+ mw.echo.Controller.prototype.refreshUnreadCount = function () {
+ return this.counter.update();
+ };
+
+} )( mediaWiki );
\ No newline at end of file
diff --git a/modules/ext.echo.init.js b/modules/ext.echo.init.js
index 3d08677..3c3e0d2 100644
--- a/modules/ext.echo.init.js
+++ b/modules/ext.echo.init.js
@@ -46,7 +46,8 @@
unreadMessageCounter,
unreadAlertCounter,
momentOrigLocale = moment.locale(),
- maxNotificationCount = mw.config.get(
'wgEchoMaxNotificationCount' );
+ maxNotificationCount = mw.config.get(
'wgEchoMaxNotificationCount' ),
+ messageController, alertController;
// Set up new 'short relative time' locale
strings for momentjs
moment.defineLocale( 'echo-shortRelativeTime', {
@@ -74,6 +75,7 @@
// Load message button and popup if messages
exist
if ( $existingMessageLink.length ) {
+
unreadMessageCounter = new
mw.echo.dm.UnreadNotificationCounter( echoApi, 'message', maxNotificationCount
);
messageNotificationsModel = new
mw.echo.dm.NotificationsModel(
echoApi,
@@ -82,7 +84,8 @@
type: 'message'
}
);
- mw.echo.ui.messageWidget = new
mw.echo.ui.NotificationBadgeWidget( messageNotificationsModel,
unreadMessageCounter, {
+ messageController = new
mw.echo.Controller( echoApi, messageNotificationsModel, unreadMessageCounter );
+ mw.echo.ui.messageWidget = new
mw.echo.ui.NotificationBadgeWidget( messageNotificationsModel,
unreadMessageCounter, messageController, {
markReadWhenSeen: false,
$overlay: mw.echo.ui.$overlay,
numItems: numMessages,
@@ -112,7 +115,8 @@
type: 'alert'
}
);
- mw.echo.ui.alertWidget = new
mw.echo.ui.NotificationBadgeWidget( alertNotificationsModel,
unreadAlertCounter, {
+ alertController = new mw.echo.Controller(
echoApi, alertNotificationsModel, unreadAlertCounter );
+ mw.echo.ui.alertWidget = new
mw.echo.ui.NotificationBadgeWidget( alertNotificationsModel,
unreadAlertCounter, alertController, {
markReadWhenSeen: true,
numItems: numAlerts,
hasUnseen: hasUnseenAlerts,
diff --git a/modules/ooui/mw.echo.ui.BundledNotificationGroupWidget.js
b/modules/ooui/mw.echo.ui.BundledNotificationGroupWidget.js
index 1751bd9..87793b3 100644
--- a/modules/ooui/mw.echo.ui.BundledNotificationGroupWidget.js
+++ b/modules/ooui/mw.echo.ui.BundledNotificationGroupWidget.js
@@ -12,10 +12,11 @@
* @cfg {jQuery} [$overlay] A jQuery element functioning as an overlay
* for popups.
*/
- mw.echo.ui.BundledNotificationGroupWidget = function
MwEchoUiBundledNotificationGroupWidget( model, config ) {
+ mw.echo.ui.BundledNotificationGroupWidget = function
MwEchoUiBundledNotificationGroupWidget( model, controller, config ) {
config = config || {};
this.model = model;
+ this.controller = controller;
this.id = this.model.getSource();
// Parent constructor
@@ -25,7 +26,7 @@
this.$overlay = config.$overlay || this.$element;
this.notifsWidget = new mw.echo.ui.NotificationsWidget(
- model,
+ model, this.controller,
{
bundle: true,
$overlay: this.$overlay,
diff --git a/modules/ooui/mw.echo.ui.NotificationBadgeWidget.js
b/modules/ooui/mw.echo.ui.NotificationBadgeWidget.js
index d8810f8..11db66c 100644
--- a/modules/ooui/mw.echo.ui.NotificationBadgeWidget.js
+++ b/modules/ooui/mw.echo.ui.NotificationBadgeWidget.js
@@ -25,7 +25,7 @@
* @cfg {jQuery} [$overlay] A jQuery element functioning as an overlay
* for popups.
*/
- mw.echo.ui.NotificationBadgeWidget = function
MwEchoUiNotificationBadgeButtonPopupWidget( model, unreadCounter, config ) {
+ mw.echo.ui.NotificationBadgeWidget = function
MwEchoUiNotificationBadgeButtonPopupWidget( model, unreadCounter, controller,
config ) {
var buttonFlags, allNotificationsButton, preferencesButton,
footerButtonGroupWidget, $footer,
initialNotifCount, notice;
@@ -47,6 +47,7 @@
// View model
this.notificationsModel = model;
this.unreadCounter = unreadCounter;
+ this.controller = controller;
this.type = this.notificationsModel.getType();
this.maxNotificationCount = mw.config.get(
'wgEchoMaxNotificationCount' );
@@ -73,7 +74,7 @@
// Notifications widget
this.notificationsWidget = new mw.echo.ui.NotificationsWidget(
- this.notificationsModel,
+ this.notificationsModel, this.controller,
{
type: this.type,
$overlay: this.$menuOverlay,
diff --git a/modules/ooui/mw.echo.ui.NotificationGroupItemWidget.js
b/modules/ooui/mw.echo.ui.NotificationGroupItemWidget.js
index b277ee2..6ae3feb 100644
--- a/modules/ooui/mw.echo.ui.NotificationGroupItemWidget.js
+++ b/modules/ooui/mw.echo.ui.NotificationGroupItemWidget.js
@@ -12,11 +12,11 @@
* @param {mw.echo.dm.NotificationGroupItem} model Item model
* @param {Object} [config] Configuration object
*/
- mw.echo.ui.NotificationGroupItemWidget = function
MwEchoUiNotificationGroupItemWidget( model, config ) {
+ mw.echo.ui.NotificationGroupItemWidget = function
MwEchoUiNotificationGroupItemWidget( model, controller, config ) {
config = config || {};
// Parent constructor
- mw.echo.ui.NotificationGroupItemWidget.parent.call( this,
model, config );
+ mw.echo.ui.NotificationGroupItemWidget.parent.call( this,
model, controller, config );
// Mixin constructor
OO.ui.mixin.GroupWidget.call( this, config );
@@ -99,7 +99,7 @@
mw.echo.ui.NotificationGroupItemWidget.prototype.onModelAddGroup =
function ( notificationsModel, index ) {
this.addItems(
[
- new mw.echo.ui.BundledNotificationGroupWidget(
notificationsModel, {
+ new mw.echo.ui.BundledNotificationGroupWidget(
notificationsModel, this.controller, {
showTitle: this.showTitles,
$overlay: this.$overlay
} )
@@ -172,7 +172,7 @@
for ( i = 0; i < items.length; i++ ) {
widgets.push(
- new mw.echo.ui.BundledNotificationGroupWidget(
items[ i ], {
+ new mw.echo.ui.BundledNotificationGroupWidget(
items[ i ], this.controller, {
showTitle: this.showTitles,
$overlay: this.$overlay
} )
diff --git a/modules/ooui/mw.echo.ui.NotificationItemWidget.js
b/modules/ooui/mw.echo.ui.NotificationItemWidget.js
index 81552ba..6a91cb0 100644
--- a/modules/ooui/mw.echo.ui.NotificationItemWidget.js
+++ b/modules/ooui/mw.echo.ui.NotificationItemWidget.js
@@ -14,7 +14,7 @@
* for popups.
* @cfg {boolean} [bundle=false] This notification item is part of a
bundle.
*/
- mw.echo.ui.NotificationItemWidget = function
MwEchoUiNotificationItemWidget( model, config ) {
+ mw.echo.ui.NotificationItemWidget = function
MwEchoUiNotificationItemWidget( model, controller, config ) {
var i, secondaryUrls, urlObj, linkButton, $icon, isInsideMenu,
echoMoment,
$message = $( '<div>' ).addClass(
'mw-echo-ui-notificationItemWidget-content-message' ),
widget = this;
@@ -25,6 +25,7 @@
mw.echo.ui.NotificationItemWidget.parent.call( this, $.extend(
{ data: model.getId() }, config ) );
this.model = model;
+ this.controller = controller;
this.$overlay = config.$overlay || this.$element;
this.bundle = !!config.bundle;
@@ -244,7 +245,7 @@
* Respond to mark as read button click
*/
mw.echo.ui.NotificationItemWidget.prototype.onMarkAsReadButtonClick =
function () {
- this.model.toggleRead( true );
+ this.controller.markNotificationAsRead( this.model.getId(),
this.model.getSource() );
};
/**
diff --git a/modules/ooui/mw.echo.ui.NotificationsWidget.js
b/modules/ooui/mw.echo.ui.NotificationsWidget.js
index af0e9c8..9d4954c 100644
--- a/modules/ooui/mw.echo.ui.NotificationsWidget.js
+++ b/modules/ooui/mw.echo.ui.NotificationsWidget.js
@@ -15,13 +15,14 @@
* @cfg {boolean} [bundle=false] This notification is part of a bundled
notification
* group. This affects the rendering of the items.
*/
- mw.echo.ui.NotificationsWidget = function MwEchoUiNotificationsWidget(
model, config ) {
+ mw.echo.ui.NotificationsWidget = function MwEchoUiNotificationsWidget(
model, controller, config ) {
config = config || {};
// Parent constructor
mw.echo.ui.NotificationsWidget.parent.call( this, config );
this.model = model;
+ this.controller = controller;
this.markReadWhenSeen = !!config.markReadWhenSeen;
this.bundle = !!config.bundle;
@@ -106,7 +107,7 @@
if ( notificationItem instanceof
mw.echo.dm.NotificationGroupItem ) {
widget = new mw.echo.ui.NotificationGroupItemWidget(
- notificationItem,
+ notificationItem, this.controller,
{
bundle: this.bundle,
$overlay: this.$overlay
@@ -114,7 +115,7 @@
);
} else {
widget = new mw.echo.ui.NotificationItemWidget(
- notificationItem,
+ notificationItem, this.controller,
{
$overlay: this.$overlay,
bundle: this.bundle,
diff --git a/modules/viewmodel/mw.echo.dm.NotificationsModel.js
b/modules/viewmodel/mw.echo.dm.NotificationsModel.js
index dba2eaf..7bb3be9 100644
--- a/modules/viewmodel/mw.echo.dm.NotificationsModel.js
+++ b/modules/viewmodel/mw.echo.dm.NotificationsModel.js
@@ -145,6 +145,14 @@
/* Methods */
+ mw.echo.dm.NotificationsModel.prototype.getNotification = function (
id, source ) {
+ if ( source === 'local' ) {
+ return this.getItems().find( function ( item ) { return
item.getId() === id; } );
+ }
+
+ return null;
+ };
+
/**
* Respond to item seen state change
*
diff --git a/modules/viewmodel/mw.echo.dm.UnreadNotificationCounter.js
b/modules/viewmodel/mw.echo.dm.UnreadNotificationCounter.js
index bae7171..d4d72ce 100644
--- a/modules/viewmodel/mw.echo.dm.UnreadNotificationCounter.js
+++ b/modules/viewmodel/mw.echo.dm.UnreadNotificationCounter.js
@@ -84,7 +84,7 @@
*/
mw.echo.dm.UnreadNotificationCounter.prototype.update = function () {
var model = this;
- this.api.fetchUnreadCount( this.source, this.type ).then(
function ( actualCount ) {
+ return this.api.fetchUnreadCount( this.source, this.type
).then( function ( actualCount ) {
model.setCount( actualCount, false );
} );
};
--
To view, visit https://gerrit.wikimedia.org/r/282345
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings
Gerrit-MessageType: newchange
Gerrit-Change-Id: I819cf0b7d6a8246df2461c71e41cd14854038247
Gerrit-PatchSet: 1
Gerrit-Project: mediawiki/extensions/Echo
Gerrit-Branch: master
Gerrit-Owner: Sbisson <[email protected]>
_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits