diff --git a/README.md b/README.md index 095036a..09198c7 100644 --- a/README.md +++ b/README.md @@ -269,6 +269,12 @@ app.config(["growlProvider", "$httpProvider", function(growlProvider, $httpProvi growlProvider.messageTextKey("messagetext"); growlProvider.messageSeverityKey("severity-level"); $httpProvider.responseInterceptors.push(growlProvider.serverMessagesInterceptor); + growlProvider.messageClasses({ + 'success' : 'success-notification', + 'error' : 'error-notification bold', + 'info' : 'info-notification', + 'warn' : 'warn-notification' + }); }]); ```` diff --git a/bower.json b/bower.json index d91288b..79bdef0 100644 --- a/bower.json +++ b/bower.json @@ -1,12 +1,12 @@ { - "author": "Marco Rinck", - "name": "angular-growl", + "author": "Dmitry Ishkov", + "name": "angular-growl-fork", "description": "growl like notifications for angularJS projects, using bootstrap alert classes", - "version": "0.4.0", - "homepage": "https://github.com/marcorinck/angular-growl", + "version": "0.4.1", + "homepage": "https://github.com/TheRusskiy/angular-growl", "repository": { "type": "git", - "url": "https://github.com/marcorinck/angular-growl" + "url": "https://github.com/TheRusskiy/angular-growl" }, "license": "MIT", "main": "./build/angular-growl.js", @@ -22,9 +22,9 @@ ".gitignore" ], "dependencies": { - "angular": "1.2.1" + "angular": "~1.2" }, "devDependencies": { - "angular-mocks": "1.2.1" + "angular-mocks": "~1.2" } } \ No newline at end of file diff --git a/build/angular-growl.js b/build/angular-growl.js index e461296..f54565d 100644 --- a/build/angular-growl.js +++ b/build/angular-growl.js @@ -1,7 +1,7 @@ /** - * angular-growl - v0.4.0 - 2013-11-19 + * angular-growl - v0.4.0 - 2014-01-08 * https://github.com/marcorinck/angular-growl - * Copyright (c) 2013 Marco Rinck; Licensed MIT + * Copyright (c) 2014 Marco Rinck; Licensed MIT */ angular.module('angular-growl', []); angular.module('angular-growl').directive('growl', [ @@ -50,13 +50,7 @@ angular.module('angular-growl').directive('growl', [ } }; $scope.computeClasses = function (message) { - return { - 'alert-success': message.severity === 'success', - 'alert-error': message.severity === 'error', - 'alert-danger': message.severity === 'error', - 'alert-info': message.severity === 'info', - 'alert-warning': message.severity === 'warn' - }; + return growl.messageClasses()[message.severity]; }; } ] @@ -65,7 +59,12 @@ angular.module('angular-growl').directive('growl', [ ]); angular.module('angular-growl').provider('growl', function () { 'use strict'; - var _ttl = null, _enableHtml = false, _messagesKey = 'messages', _messageTextKey = 'text', _messageSeverityKey = 'severity', _onlyUniqueMessages = true; + var _ttl = null, _enableHtml = false, _messagesKey = 'messages', _messageTextKey = 'text', _messageSeverityKey = 'severity', _onlyUniqueMessages = true, _messageClasses = { + 'success': 'alert-success', + 'error': 'alert-error alert-danger', + 'info': 'alert-info', + 'warn': 'alert-warning' + }; this.globalTimeToLive = function (ttl) { _ttl = ttl; }; @@ -84,6 +83,9 @@ angular.module('angular-growl').provider('growl', function () { this.onlyUniqueMessages = function (onlyUniqueMessages) { _onlyUniqueMessages = onlyUniqueMessages; }; + this.messageClasses = function (messageClasses) { + _messageClasses = messageClasses; + }; this.serverMessagesInterceptor = [ '$q', 'growl', @@ -170,13 +172,17 @@ angular.module('angular-growl').provider('growl', function () { function onlyUnique() { return _onlyUniqueMessages; } + function messageClasses() { + return _messageClasses; + } return { addWarnMessage: addWarnMessage, addErrorMessage: addErrorMessage, addInfoMessage: addInfoMessage, addSuccessMessage: addSuccessMessage, addServerMessages: addServerMessages, - onlyUnique: onlyUnique + onlyUnique: onlyUnique, + messageClasses: messageClasses }; } ]; diff --git a/build/angular-growl.min.css b/build/angular-growl.min.css index e1ed842..fc88d9c 100644 --- a/build/angular-growl.min.css +++ b/build/angular-growl.min.css @@ -1,7 +1,7 @@ /** - * angular-growl - v0.4.0 - 2013-11-19 + * angular-growl - v0.4.0 - 2014-01-08 * https://github.com/marcorinck/angular-growl - * Copyright (c) 2013 Marco Rinck; Licensed MIT + * Copyright (c) 2014 Marco Rinck; Licensed MIT */ .growl{position:fixed;top:10px;right:10px;float:right;width:250px}.growl-item.ng-enter,.growl-item.ng-leave{-webkit-transition:.5s linear all;-moz-transition:.5s linear all;-o-transition:.5s linear all;transition:.5s linear all}.growl-item.ng-enter,.growl-item.ng-leave.ng-leave-active{opacity:0}.growl-item.ng-leave,.growl-item.ng-enter.ng-enter-active{opacity:1} \ No newline at end of file diff --git a/build/angular-growl.min.js b/build/angular-growl.min.js index 83798c5..fde4b0a 100644 --- a/build/angular-growl.min.js +++ b/build/angular-growl.min.js @@ -1,6 +1,6 @@ /** - * angular-growl - v0.4.0 - 2013-11-19 + * angular-growl - v0.4.0 - 2014-01-08 * https://github.com/marcorinck/angular-growl - * Copyright (c) 2013 Marco Rinck; Licensed MIT + * Copyright (c) 2014 Marco Rinck; Licensed MIT */ -angular.module("angular-growl",[]),angular.module("angular-growl").directive("growl",["$rootScope",function(a){"use strict";return{restrict:"A",template:'
',replace:!1,scope:!0,controller:["$scope","$timeout","growl",function(b,c,d){function e(a){b.messages.push(a),a.ttl&&-1!==a.ttl&&c(function(){b.deleteMessage(a)},a.ttl)}var f=d.onlyUnique();b.messages=[],a.$on("growlMessage",function(a,c){var d;f?(angular.forEach(b.messages,function(a){c.text===a.text&&c.severity===a.severity&&(d=!0)}),d||e(c)):e(c)}),b.deleteMessage=function(a){var c=b.messages.indexOf(a);c>-1&&b.messages.splice(c,1)},b.computeClasses=function(a){return{"alert-success":"success"===a.severity,"alert-error":"error"===a.severity,"alert-danger":"error"===a.severity,"alert-info":"info"===a.severity,"alert-warning":"warn"===a.severity}}}]}}]),angular.module("angular-growl").provider("growl",function(){"use strict";var a=null,b=!1,c="messages",d="text",e="severity",f=!0;this.globalTimeToLive=function(b){a=b},this.globalEnableHtml=function(a){b=a},this.messagesKey=function(a){c=a},this.messageTextKey=function(a){d=a},this.messageSeverityKey=function(a){e=a},this.onlyUniqueMessages=function(a){f=a},this.serverMessagesInterceptor=["$q","growl",function(a,b){function d(a){a.data[c]&&a.data[c].length>0&&b.addServerMessages(a.data[c])}function e(a){return d(a),a}function f(b){return d(b),a.reject(b)}return function(a){return a.then(e,f)}}],this.$get=["$rootScope","$filter",function(c,g){function h(a){p&&(a.text=p(a.text)),c.$broadcast("growlMessage",a)}function i(c,d,e){var f,g=d||{};f={text:c,severity:e,ttl:g.ttl||a,enableHtml:g.enableHtml||b},h(f)}function j(a,b){i(a,b,"warn")}function k(a,b){i(a,b,"error")}function l(a,b){i(a,b,"info")}function m(a,b){i(a,b,"success")}function n(a){var b,c,f,g;for(g=a.length,b=0;g>b;b++)if(c=a[b],c[d]&&c[e]){switch(c[e]){case"warn":f="warn";break;case"success":f="success";break;case"info":f="info";break;case"error":f="error"}i(c[d],void 0,f)}}function o(){return f}var p;try{p=g("translate")}catch(q){}return{addWarnMessage:j,addErrorMessage:k,addInfoMessage:l,addSuccessMessage:m,addServerMessages:n,onlyUnique:o}}]}); \ No newline at end of file +angular.module("angular-growl",[]),angular.module("angular-growl").directive("growl",["$rootScope",function(a){"use strict";return{restrict:"A",template:'
',replace:!1,scope:!0,controller:["$scope","$timeout","growl",function(b,c,d){function e(a){b.messages.push(a),a.ttl&&-1!==a.ttl&&c(function(){b.deleteMessage(a)},a.ttl)}var f=d.onlyUnique();b.messages=[],a.$on("growlMessage",function(a,c){var d;f?(angular.forEach(b.messages,function(a){c.text===a.text&&c.severity===a.severity&&(d=!0)}),d||e(c)):e(c)}),b.deleteMessage=function(a){var c=b.messages.indexOf(a);c>-1&&b.messages.splice(c,1)},b.computeClasses=function(a){return d.messageClasses()[a.severity]}}]}}]),angular.module("angular-growl").provider("growl",function(){"use strict";var a=null,b=!1,c="messages",d="text",e="severity",f=!0,g={success:"alert-success",error:"alert-error alert-danger",info:"alert-info",warn:"alert-warning"};this.globalTimeToLive=function(b){a=b},this.globalEnableHtml=function(a){b=a},this.messagesKey=function(a){c=a},this.messageTextKey=function(a){d=a},this.messageSeverityKey=function(a){e=a},this.onlyUniqueMessages=function(a){f=a},this.messageClasses=function(a){g=a},this.serverMessagesInterceptor=["$q","growl",function(a,b){function d(a){a.data[c]&&a.data[c].length>0&&b.addServerMessages(a.data[c])}function e(a){return d(a),a}function f(b){return d(b),a.reject(b)}return function(a){return a.then(e,f)}}],this.$get=["$rootScope","$filter",function(c,h){function i(a){r&&(a.text=r(a.text)),c.$broadcast("growlMessage",a)}function j(c,d,e){var f,g=d||{};f={text:c,severity:e,ttl:g.ttl||a,enableHtml:g.enableHtml||b},i(f)}function k(a,b){j(a,b,"warn")}function l(a,b){j(a,b,"error")}function m(a,b){j(a,b,"info")}function n(a,b){j(a,b,"success")}function o(a){var b,c,f,g;for(g=a.length,b=0;g>b;b++)if(c=a[b],c[d]&&c[e]){switch(c[e]){case"warn":f="warn";break;case"success":f="success";break;case"info":f="info";break;case"error":f="error"}j(c[d],void 0,f)}}function p(){return f}function q(){return g}var r;try{r=h("translate")}catch(s){}return{addWarnMessage:k,addErrorMessage:l,addInfoMessage:m,addSuccessMessage:n,addServerMessages:o,onlyUnique:p,messageClasses:q}}]}); \ No newline at end of file diff --git a/src/growlDirective.js b/src/growlDirective.js index edad549..47d3c06 100644 --- a/src/growlDirective.js +++ b/src/growlDirective.js @@ -54,13 +54,7 @@ angular.module("angular-growl").directive("growl", ["$rootScope", function ($roo }; $scope.computeClasses = function (message) { - return { - 'alert-success': message.severity === "success", - 'alert-error': message.severity === "error", //bootstrap 2.3 - 'alert-danger': message.severity === "error", //bootstrap 3 - 'alert-info': message.severity === "info", - 'alert-warning': message.severity === "warn" //bootstrap 3, no effect in bs 2.3 - }; + return growl.messageClasses()[message.severity]; }; }] }; diff --git a/src/growlFactory.js b/src/growlFactory.js index d3e5329..48aecdc 100644 --- a/src/growlFactory.js +++ b/src/growlFactory.js @@ -6,7 +6,13 @@ angular.module("angular-growl").provider("growl", function() { _messagesKey = 'messages', _messageTextKey = 'text', _messageSeverityKey = 'severity', - _onlyUniqueMessages = true; + _onlyUniqueMessages = true, + _messageClasses = { + 'success' : 'alert-success', + 'error' : 'alert-error alert-danger', + 'info' : 'alert-info', + 'warn' : 'alert-warning' + }; /** * set a global timeout (time to live) after which messages will be automatically closed @@ -58,6 +64,19 @@ angular.module("angular-growl").provider("growl", function() { _onlyUniqueMessages = onlyUniqueMessages; }; + /** + * Sets association between message severity and applied css class + * + * @param {object} classes default: twitter bootstrap alert classes: + * 'success' : 'alert-success', + * 'error' : 'alert-error alert-danger', + * 'info' : 'alert-info', + * 'warn' : 'alert-warning' + */ + this.messageClasses = function (messageClasses) { + _messageClasses = messageClasses; + }; + /** * $http interceptor that can be added to array of $http interceptors during config phase of application * via $httpProvider.responseInterceptors.push(...) @@ -189,13 +208,22 @@ angular.module("angular-growl").provider("growl", function() { return _onlyUniqueMessages; } + /** + * Returns object with severity levels + * as keys and CSS classes (string) as values + */ + function messageClasses() { + return _messageClasses; + } + return { addWarnMessage: addWarnMessage, addErrorMessage: addErrorMessage, addInfoMessage: addInfoMessage, addSuccessMessage: addSuccessMessage, addServerMessages: addServerMessages, - onlyUnique: onlyUnique + onlyUnique: onlyUnique, + messageClasses: messageClasses }; }]; }); diff --git a/test/growlDirectiveTest.js b/test/growlDirectiveTest.js index ca39c82..d2dfde8 100644 --- a/test/growlDirectiveTest.js +++ b/test/growlDirectiveTest.js @@ -1,7 +1,43 @@ describe("growlDirective", function() { "use strict"; - it("should be true ", function() { - expect(true).toBe(true); + var ele, scope, growl, $timeout; + beforeEach(module('angular-growl')); + + beforeEach(inject(function($compile, $rootScope, _growl_, _$timeout_) { + scope = $rootScope; + $timeout = _$timeout_; + growl = _growl_; + ele = angular.element( + '
' + ); + $compile(ele)(scope); + scope.$apply(); + })); + + it("initially messages should be empty", function() { + expect(ele.scope().messages.length).toEqual(0); + }); + + it("messages can be added", function() { + growl.addWarnMessage("Warn message"); + growl.addErrorMessage("Error message"); + growl.addInfoMessage("Info message"); + growl.addSuccessMessage("Success message"); + expect(ele.scope().messages.length).toEqual(4); + }); + + it("should generate correct html", function() { + growl.addWarnMessage("Warn message"); + expect(ele.html()).not.toMatch("Warn message"); + scope.$apply(); + expect(ele.html()).toMatch("Warn message"); + }); + + it("message should live limited time", function() { + growl.addWarnMessage("Some message", {ttl:100}); + expect(ele.scope().messages.length).toEqual(1); + $timeout.flush(100); + expect(ele.scope().messages.length).toEqual(0); }); }); \ No newline at end of file diff --git a/test/growlProviderTest.js b/test/growlProviderTest.js new file mode 100644 index 0000000..da5df01 --- /dev/null +++ b/test/growlProviderTest.js @@ -0,0 +1,29 @@ +describe("growlProvider", function() { + "use strict"; + + var ele, scope, growl, $timeout; + var provider; + beforeEach(module('angular-growl', function(growlProvider) { + provider = growlProvider; + })); + + beforeEach(inject(function($compile, $rootScope, _growl_, _$timeout_) { + scope = $rootScope; + $timeout = _$timeout_; + growl = _growl_; + ele = angular.element( + '
' + ); + $compile(ele)(scope); + scope.$apply(); + })); + + it('should let you configure CSS classes', function() { + provider.messageClasses({ + 'warn' : 'custom-warn-class' + }); + growl.addWarnMessage("Warn message"); + scope.$apply(); + expect(ele.html()).toMatch("custom-warn-class"); + }); +}); \ No newline at end of file