mirror of
https://gerrit.wikimedia.org/r/mediawiki/extensions/Echo
synced 2024-11-15 03:35:01 +00:00
177 lines
4.6 KiB
JavaScript
177 lines
4.6 KiB
JavaScript
|
( function ( mw, $ ) {
|
||
|
/**
|
||
|
* Echo notification NotificationItem model
|
||
|
*
|
||
|
* @class
|
||
|
* @mixins OO.EventEmitter
|
||
|
*
|
||
|
* @constructor
|
||
|
* @param {number} id Notification id,
|
||
|
* @param {Object} [config] Configuration object
|
||
|
* @cfg {jQuery|string} [content] The html content of this notification
|
||
|
* @cfg {string} [category] The category of this notification. The category identifies
|
||
|
* where the notification originates from.
|
||
|
* @cfg {boolean} [read=false] State the read state of the option
|
||
|
* @cfg {boolean} [seen=false] State the seen state of the option
|
||
|
* @cfg {string} [timestamp] Notification timestamp in Mediawiki timestamp format
|
||
|
* @cfg {string} [primaryUrl] Notification primary link in raw url format
|
||
|
*/
|
||
|
mw.echo.dm.NotificationItem = function mwFlowDmNotificationItem( id, config ) {
|
||
|
var date = new Date(),
|
||
|
normalizeNumber = function ( number ) {
|
||
|
return ( number < 10 ? '0' : '' ) + String( number );
|
||
|
},
|
||
|
fallbackMWDate = date.getUTCFullYear() +
|
||
|
normalizeNumber( date.getMonth() ) +
|
||
|
normalizeNumber( date.getUTCDate() ) +
|
||
|
normalizeNumber( date.getUTCHours() ) +
|
||
|
normalizeNumber( date.getUTCMinutes() ) +
|
||
|
normalizeNumber( date.getUTCSeconds() );
|
||
|
|
||
|
// Mixin constructor
|
||
|
OO.EventEmitter.call( this );
|
||
|
|
||
|
this.id = id || null;
|
||
|
|
||
|
// TODO: We should work on the API to release and work with actual
|
||
|
// data here, rather than getting a pre-made html content of the
|
||
|
// notification.
|
||
|
this.content = config.content || $();
|
||
|
|
||
|
this.category = config.category || '';
|
||
|
|
||
|
this.toggleRead( !!config.read );
|
||
|
this.toggleSeen( !!config.seen );
|
||
|
|
||
|
this.setTimestamp( config.timestamp || fallbackMWDate );
|
||
|
this.setPrimaryUrl( config.primaryUrl );
|
||
|
};
|
||
|
|
||
|
/* Inheritance */
|
||
|
|
||
|
OO.mixinClass( mw.echo.dm.NotificationItem, OO.EventEmitter );
|
||
|
|
||
|
/* Events */
|
||
|
|
||
|
/**
|
||
|
* @event seen
|
||
|
* @param {boolean} [seen] Notification is seen
|
||
|
*
|
||
|
* Seen status of the notification has changed
|
||
|
*/
|
||
|
|
||
|
/**
|
||
|
* @event read
|
||
|
* @param {boolean} [read] Notification is read
|
||
|
*
|
||
|
* Read status of the notification has changed
|
||
|
*/
|
||
|
|
||
|
/* Methods */
|
||
|
|
||
|
/**
|
||
|
* Get NotificationItem id
|
||
|
* @return {string} NotificationItem Id
|
||
|
*/
|
||
|
mw.echo.dm.NotificationItem.prototype.getId = function () {
|
||
|
return this.id;
|
||
|
};
|
||
|
|
||
|
/**
|
||
|
* Get NotificationItem content
|
||
|
* @return {jQuery|string} NotificationItem content
|
||
|
*/
|
||
|
mw.echo.dm.NotificationItem.prototype.getContent = function () {
|
||
|
return this.content;
|
||
|
};
|
||
|
|
||
|
/**
|
||
|
* Get NotificationItem category
|
||
|
* @return {string} NotificationItem category
|
||
|
*/
|
||
|
mw.echo.dm.NotificationItem.prototype.getCategory = function () {
|
||
|
return this.category;
|
||
|
};
|
||
|
|
||
|
/**
|
||
|
* Check whether this notification item is read
|
||
|
* @return {boolean} Notification item is read
|
||
|
*/
|
||
|
mw.echo.dm.NotificationItem.prototype.isRead = function () {
|
||
|
return this.read;
|
||
|
};
|
||
|
|
||
|
/**
|
||
|
* Check whether this notification item is seen
|
||
|
* @return {boolean} Notification item is seen
|
||
|
*/
|
||
|
mw.echo.dm.NotificationItem.prototype.isSeen = function () {
|
||
|
return this.seen;
|
||
|
};
|
||
|
|
||
|
/**
|
||
|
* Toggle the read state of the widget
|
||
|
*
|
||
|
* @param {boolean} [read] The current read state. If not given, the state will
|
||
|
* become the opposite of its current state.
|
||
|
*/
|
||
|
mw.echo.dm.NotificationItem.prototype.toggleRead = function ( read ) {
|
||
|
read = read !== undefined ? read : !this.read;
|
||
|
if ( this.read !== read ) {
|
||
|
this.read = read;
|
||
|
this.emit( 'read', this.read );
|
||
|
}
|
||
|
};
|
||
|
|
||
|
/**
|
||
|
* Toggle the seen state of the widget
|
||
|
*
|
||
|
* @param {boolean} [seen] The current seen state. If not given, the state will
|
||
|
* become the opposite of its current state.
|
||
|
*/
|
||
|
mw.echo.dm.NotificationItem.prototype.toggleSeen = function ( seen ) {
|
||
|
seen = seen !== undefined ? seen : !this.seen;
|
||
|
if ( this.seen !== seen ) {
|
||
|
this.seen = seen;
|
||
|
this.emit( 'seen', this.seen );
|
||
|
}
|
||
|
};
|
||
|
|
||
|
/**
|
||
|
* Set the notification timestamp
|
||
|
*
|
||
|
* @param {number} timestamp Notification timestamp in Mediawiki timestamp format
|
||
|
*/
|
||
|
mw.echo.dm.NotificationItem.prototype.setTimestamp = function ( timestamp ) {
|
||
|
this.timestamp = Number( timestamp );
|
||
|
};
|
||
|
|
||
|
/**
|
||
|
* Get the notification timestamp
|
||
|
*
|
||
|
* @return {number} Notification timestamp in Mediawiki timestamp format
|
||
|
*/
|
||
|
mw.echo.dm.NotificationItem.prototype.getTimestamp = function () {
|
||
|
return this.timestamp;
|
||
|
};
|
||
|
|
||
|
/**
|
||
|
* Set the notification link
|
||
|
*
|
||
|
* @param {string} link Notification url
|
||
|
*/
|
||
|
mw.echo.dm.NotificationItem.prototype.setPrimaryUrl = function ( link ) {
|
||
|
this.primaryUrl = link;
|
||
|
};
|
||
|
|
||
|
/**
|
||
|
* Get the notification link
|
||
|
*
|
||
|
* @return {string} Notification url
|
||
|
*/
|
||
|
mw.echo.dm.NotificationItem.prototype.getPrimaryUrl = function () {
|
||
|
return this.primaryUrl;
|
||
|
};
|
||
|
|
||
|
}( mediaWiki, jQuery ) );
|