]> source.dussan.org Git - nextcloud-server.git/commitdiff
Add timeout for notifications
authorMorris Jobke <hey@morrisjobke.de>
Wed, 7 Jan 2015 13:51:20 +0000 (14:51 +0100)
committerMorris Jobke <hey@morrisjobke.de>
Thu, 8 Jan 2015 12:06:45 +0000 (13:06 +0100)
* 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

core/js/js.js
core/js/tests/specs/coreSpec.js

index 8bcd546b42011785fd6dbdcf63ad0f433c537dd9..579bf09b2e421721e403fb654d80509821b76d04 100644 (file)
@@ -669,6 +669,7 @@ OC.msg={
 OC.Notification={
        queuedNotifications: [],
        getDefaultNotificationFunction: null,
+       notificationTimer: 0,
 
        /**
         * @param callback
@@ -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.
         * @return {boolean}
index 08395f4d4c23e55555a19154739da8dd04821d55..d283839d7e79f883c28fd3896ad8c1b1ab46b2be 100644 (file)
@@ -686,5 +686,102 @@ describe('Core base tests', function() {
                        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
+               });
+       });
 });