Commit 8e190438 authored by Morris Jobke's avatar Morris Jobke
Browse files

Add timeout for notifications

* options for timeout in seconds and if it contains HTML
* if timeout is 0 it will show the message permanently
* removes the notification after a given (default: 5 seconds) timeframe
* based on work by @brantje
* provide JS unit tests for notifications
parent 14e534e9
...@@ -669,6 +669,7 @@ OC.msg={ ...@@ -669,6 +669,7 @@ OC.msg={
OC.Notification={ OC.Notification={
queuedNotifications: [], queuedNotifications: [],
getDefaultNotificationFunction: null, getDefaultNotificationFunction: null,
notificationTimer: 0,
/** /**
* @param callback * @param callback
...@@ -731,6 +732,42 @@ OC.Notification={ ...@@ -731,6 +732,42 @@ OC.Notification={
} }
}, },
/**
* Shows a notification that disappears after x seconds, default is
* 7 seconds
* @param {string} text Message to show
* @param {array} [options] options array
* @param {int} [options.timeout=7] timeout in seconds, if this is 0 it will show the message permanently
* @param {boolean} [options.isHTML=false] an indicator for HTML notifications (true) or text (false)
*/
showTemporary: function(text, options) {
var defaults = {
isHTML: false,
timeout: 7
},
options = options || {};
// merge defaults with passed in options
_.defaults(options, defaults);
// clear previous notifications
OC.Notification.hide();
if(OC.Notification.notificationTimer) {
clearTimeout(OC.Notification.notificationTimer);
}
if(options.isHTML) {
OC.Notification.showHtml(text);
} else {
OC.Notification.show(text);
}
if(options.timeout > 0) {
// register timeout to vanish notification
OC.Notification.notificationTimer = setTimeout(OC.Notification.hide, (options.timeout * 1000));
}
},
/** /**
* Returns whether a notification is hidden. * Returns whether a notification is hidden.
* @return {boolean} * @return {boolean}
......
...@@ -686,5 +686,102 @@ describe('Core base tests', function() { ...@@ -686,5 +686,102 @@ describe('Core base tests', function() {
expect(obj.attached).not.toBeDefined(); expect(obj.attached).not.toBeDefined();
}); });
}); });
describe('Notifications', function() {
beforeEach(function(){
notificationMock = sinon.mock(OC.Notification);
});
afterEach(function(){
// verify that all expectations are met
notificationMock.verify();
// restore mocked methods
notificationMock.restore();
// clean up the global variable
delete notificationMock;
});
it('Should show a plain text notification' , function() {
// one is shown ...
notificationMock.expects('show').once().withExactArgs('My notification test');
// ... but not the HTML one
notificationMock.expects('showHtml').never();
OC.Notification.showTemporary('My notification test');
// verification is done in afterEach
});
it('Should show a HTML notification' , function() {
// no plain is shown ...
notificationMock.expects('show').never();
// ... but one HTML notification
notificationMock.expects('showHtml').once().withExactArgs('<a>My notification test</a>');
OC.Notification.showTemporary('<a>My notification test</a>', { isHTML: true });
// verification is done in afterEach
});
it('Should hide previous notification and hide itself after 7 seconds' , function() {
var clock = sinon.useFakeTimers();
// previous notifications get hidden
notificationMock.expects('hide').once();
OC.Notification.showTemporary('');
// verify the first call
notificationMock.verify();
// expect it a second time
notificationMock.expects('hide').once();
// travel in time +7000 milliseconds
clock.tick(7000);
// verification is done in afterEach
});
it('Should hide itself after a given time' , function() {
var clock = sinon.useFakeTimers();
// previous notifications get hidden
notificationMock.expects('hide').once();
OC.Notification.showTemporary('', { timeout: 10 });
// verify the first call
notificationMock.verify();
// expect to not be called after 9 seconds
notificationMock.expects('hide').never();
// travel in time +9 seconds
clock.tick(9000);
// verify this
notificationMock.verify();
// expect the second call one second later
notificationMock.expects('hide').once();
// travel in time +1 seconds
clock.tick(1000);
// verification is done in afterEach
});
it('Should not hide itself after a given time if a timeout of 0 is defined' , function() {
var clock = sinon.useFakeTimers();
// previous notifications get hidden
notificationMock.expects('hide').once();
OC.Notification.showTemporary('', { timeout: 0 });
// verify the first call
notificationMock.verify();
// expect to not be called after 1000 seconds
notificationMock.expects('hide').never();
// travel in time +1000 seconds
clock.tick(1000000);
// verification is done in afterEach
});
});
}); });
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment