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