11/**
2- * angular-growl-v2 - v0.7.1 - 2014-08-18
2+ * angular-growl-v2 - v0.7.1 - 2014-09-11
33 * http://janstevens.github.io/angular-growl-2
44 * Copyright (c) 2014 Marco Rinck,Jan Stevens; Licensed MIT
55 */
66angular . module ( 'angular-growl' , [ ] ) ;
7- angular . module ( 'angular-growl' ) . directive ( 'growl' , [
8- '$rootScope' ,
9- '$sce' ,
10- function ( $rootScope , $sce ) {
7+ angular . module ( 'angular-growl' ) . directive ( 'growl' , [ function ( ) {
118 'use strict' ;
129 return {
1310 restrict : 'A' ,
@@ -22,84 +19,28 @@ angular.module('angular-growl').directive('growl', [
2219 '$scope' ,
2320 '$timeout' ,
2421 'growl' ,
25- function ( $scope , $timeout , growl ) {
26- var onlyUnique = growl . onlyUnique ( ) ;
27- $scope . messages = [ ] ;
28- var referenceId = $scope . reference || 0 ;
22+ 'growlMessages' ,
23+ function ( $scope , $timeout , growl , growlMessages ) {
24+ $scope . referenceId = $scope . reference || 0 ;
25+ growlMessages . initDirective ( $scope . referenceId , $scope . limitMessages ) ;
26+ $scope . growlMessages = growlMessages ;
2927 $scope . inlineMessage = $scope . inline || growl . inlineMessages ( ) ;
30- function addMessage ( message ) {
31- $timeout ( function ( ) {
32- var found ;
33- var msgText ;
34- if ( onlyUnique ) {
35- angular . forEach ( $scope . messages , function ( msg ) {
36- msgText = $sce . getTrustedHtml ( msg . text ) ;
37- if ( message . text === msgText && message . severity === msg . severity && msg . title === msg . title ) {
38- found = true ;
39- }
40- } ) ;
41- if ( found ) {
42- return ;
43- }
44- }
45- message . text = $sce . trustAsHtml ( String ( message . text ) ) ;
46- if ( message . ttl && message . ttl !== - 1 ) {
47- message . countdown = message . ttl / 1000 ;
48- message . promises = [ ] ;
49- message . close = false ;
50- message . countdownFunction = function ( ) {
51- if ( message . countdown > 1 ) {
52- message . countdown -- ;
53- message . promises . push ( $timeout ( message . countdownFunction , 1000 ) ) ;
54- } else {
55- message . countdown -- ;
56- }
57- } ;
58- }
59- if ( angular . isDefined ( $scope . limitMessages ) ) {
60- var diff = $scope . messages . length - ( $scope . limitMessages - 1 ) ;
61- if ( diff > 0 ) {
62- $scope . messages . splice ( $scope . limitMessages - 1 , diff ) ;
63- }
64- }
65- if ( growl . reverseOrder ( ) ) {
66- $scope . messages . unshift ( message ) ;
67- } else {
68- $scope . messages . push ( message ) ;
69- }
70- if ( typeof message . onopen === 'function' ) {
71- message . onopen ( ) ;
72- }
73- if ( message . ttl && message . ttl !== - 1 ) {
74- message . promises . push ( $timeout ( function ( ) {
75- $scope . deleteMessage ( message ) ;
76- } , message . ttl ) ) ;
77- message . promises . push ( $timeout ( message . countdownFunction , 1000 ) ) ;
78- }
79- } , true ) ;
80- }
81- $rootScope . $on ( 'growlMessage' , function ( event , message ) {
82- if ( parseInt ( referenceId , 10 ) === parseInt ( message . referenceId , 10 ) ) {
83- addMessage ( message ) ;
28+ $scope . $watch ( 'limitMessages' , function ( limitMessages ) {
29+ var directive = growlMessages . directives [ $scope . referenceId ] ;
30+ if ( ! angular . isUndefined ( limitMessages ) && ! angular . isUndefined ( directive ) ) {
31+ directive . limitMessages = limitMessages ;
8432 }
8533 } ) ;
86- $scope . deleteMessage = function ( message ) {
87- var index = $scope . messages . indexOf ( message ) ;
88- if ( index > - 1 ) {
89- $scope . messages . splice ( index , 1 ) ;
90- }
91- if ( typeof message . onclose === 'function' ) {
92- message . onclose ( ) ;
93- }
94- } ;
9534 $scope . stopTimeoutClose = function ( message ) {
96- angular . forEach ( message . promises , function ( promise ) {
97- $timeout . cancel ( promise ) ;
98- } ) ;
99- if ( message . close ) {
100- $scope . deleteMessage ( message ) ;
101- } else {
102- message . close = true ;
35+ if ( ! message . clickToClose ) {
36+ angular . forEach ( message . promises , function ( promise ) {
37+ $timeout . cancel ( promise ) ;
38+ } ) ;
39+ if ( message . close ) {
40+ growlMessages . deleteMessage ( message ) ;
41+ } else {
42+ message . close = true ;
43+ }
10344 }
10445 } ;
10546 $scope . alertClasses = function ( message ) {
@@ -134,14 +75,13 @@ angular.module('angular-growl').directive('growl', [
13475 }
13576 ]
13677 } ;
137- }
138- ] ) ;
78+ } ] ) ;
13979angular . module ( 'angular-growl' ) . run ( [
14080 '$templateCache' ,
14181 function ( $templateCache ) {
14282 'use strict' ;
14383 if ( $templateCache . get ( 'templates/growl/growl.html' ) === undefined ) {
144- $templateCache . put ( 'templates/growl/growl.html' , '<div class="growl-container" ng-class="wrapperClasses()">' + '<div class="growl-item alert" ng-repeat="message in messages" ng-class="alertClasses(message)" ng-click="stopTimeoutClose(message)">' + '<button type="button" class="close" data-dismiss="alert" aria-hidden="true" ng-click="deleteMessage(message)" ng-show="!message.disableCloseButton">×</button>' + '<button type="button" class="close" aria-hidden="true" ng-show="showCountDown(message)">{{message.countdown}}</button>' + '<h4 class="growl-title" ng-show="message.title" ng-bind="message.title"></h4>' + '<div class="growl-message" ng-bind-html="message.text"></div>' + '</div>' + '</div>' ) ;
84+ $templateCache . put ( 'templates/growl/growl.html' , '<div class="growl-container" ng-class="wrapperClasses()">' + '<div class="growl-item alert" ng-repeat="message in growlMessages.directives[referenceId]. messages" ng-class="alertClasses(message)" ng-click="stopTimeoutClose(message)">' + '<button type="button" class="close" data-dismiss="alert" aria-hidden="true" ng-click="growlMessages. deleteMessage(message)" ng-show="!message.disableCloseButton">×</button>' + '<button type="button" class="close" aria-hidden="true" ng-show="showCountDown(message)">{{message.countdown}}</button>' + '<h4 class="growl-title" ng-show="message.title" ng-bind="message.title"></h4>' + '<div class="growl-message" ng-bind-html="message.text"></div>' + '</div>' + '</div>' ) ;
14585 }
14686 }
14787] ) ;
@@ -228,9 +168,14 @@ angular.module('angular-growl').provider('growl', function () {
228168 this . $get = [
229169 '$rootScope' ,
230170 '$interpolate' ,
171+ '$sce' ,
231172 '$filter' ,
232- function ( $rootScope , $interpolate , $filter ) {
173+ '$timeout' ,
174+ 'growlMessages' ,
175+ function ( $rootScope , $interpolate , $sce , $filter , $timeout , growlMessages ) {
233176 var translate ;
177+ growlMessages . onlyUnique = _onlyUniqueMessages ;
178+ growlMessages . reverseOrder = _reverseOrder ;
234179 try {
235180 translate = $filter ( 'translate' ) ;
236181 } catch ( e ) {
@@ -242,7 +187,11 @@ angular.module('angular-growl').provider('growl', function () {
242187 var polation = $interpolate ( message . text ) ;
243188 message . text = polation ( message . variables ) ;
244189 }
190+ var addedMessage = growlMessages . addMessage ( message ) ;
245191 $rootScope . $broadcast ( 'growlMessage' , message ) ;
192+ $timeout ( function ( ) {
193+ } , 0 ) ;
194+ return addedMessage ;
246195 }
247196 function sendMessage ( text , config , severity ) {
248197 var _config = config || { } , message ;
@@ -257,22 +206,28 @@ angular.module('angular-growl').provider('growl', function () {
257206 disableCountDown : _config . disableCountDown === undefined ? _disableCountDown : _config . disableCountDown ,
258207 position : _config . position || _position ,
259208 referenceId : _config . referenceId || _referenceId ,
209+ destroy : function ( ) {
210+ growlMessages . deleteMessage ( message ) ;
211+ } ,
212+ setText : function ( newText ) {
213+ message . text = $sce . trustAsHtml ( String ( newText ) ) ;
214+ } ,
260215 onclose : _config . onclose ,
261216 onopen : _config . onopen
262217 } ;
263- broadcastMessage ( message ) ;
218+ return broadcastMessage ( message ) ;
264219 }
265220 function warning ( text , config ) {
266- sendMessage ( text , config , 'warning' ) ;
221+ return sendMessage ( text , config , 'warning' ) ;
267222 }
268223 function error ( text , config ) {
269- sendMessage ( text , config , 'error' ) ;
224+ return sendMessage ( text , config , 'error' ) ;
270225 }
271226 function info ( text , config ) {
272- sendMessage ( text , config , 'info' ) ;
227+ return sendMessage ( text , config , 'info' ) ;
273228 }
274229 function success ( text , config ) {
275- sendMessage ( text , config , 'success' ) ;
230+ return sendMessage ( text , config , 'success' ) ;
276231 }
277232 function addServerMessages ( messages ) {
278233 var i , message , severity , length ;
@@ -313,4 +268,81 @@ angular.module('angular-growl').provider('growl', function () {
313268 } ;
314269 }
315270 ] ;
316- } ) ;
271+ } ) ;
272+ angular . module ( 'angular-growl' ) . service ( 'growlMessages' , [
273+ '$sce' ,
274+ '$timeout' ,
275+ function ( $sce , $timeout ) {
276+ 'use strict' ;
277+ this . directives = { } ;
278+ this . initDirective = function ( referenceId , limitMessages ) {
279+ this . directives [ referenceId ] = {
280+ messages : [ ] ,
281+ limitMessages : limitMessages
282+ } ;
283+ } ;
284+ this . addMessage = function ( message ) {
285+ var directive = this . directives [ message . referenceId ] ;
286+ var messages = directive . messages ;
287+ var found ;
288+ var msgText ;
289+ if ( this . onlyUnique ) {
290+ angular . forEach ( messages , function ( msg ) {
291+ msgText = $sce . getTrustedHtml ( msg . text ) ;
292+ if ( message . text === msgText && message . severity === msg . severity && msg . title === msg . title ) {
293+ found = true ;
294+ }
295+ } ) ;
296+ if ( found ) {
297+ return ;
298+ }
299+ }
300+ message . text = $sce . trustAsHtml ( String ( message . text ) ) ;
301+ if ( message . ttl && message . ttl !== - 1 ) {
302+ message . countdown = message . ttl / 1000 ;
303+ message . promises = [ ] ;
304+ message . close = false ;
305+ message . countdownFunction = function ( ) {
306+ if ( message . countdown > 1 ) {
307+ message . countdown -- ;
308+ message . promises . push ( $timeout ( message . countdownFunction , 1000 ) ) ;
309+ } else {
310+ message . countdown -- ;
311+ }
312+ } ;
313+ }
314+ if ( angular . isDefined ( directive . limitMessages ) ) {
315+ var diff = messages . length - ( directive . limitMessages - 1 ) ;
316+ if ( diff > 0 ) {
317+ messages . splice ( directive . limitMessages - 1 , diff ) ;
318+ }
319+ }
320+ if ( this . reverseOrder ) {
321+ messages . unshift ( message ) ;
322+ } else {
323+ messages . push ( message ) ;
324+ }
325+ if ( typeof message . onopen === 'function' ) {
326+ message . onopen ( ) ;
327+ }
328+ if ( message . ttl && message . ttl !== - 1 ) {
329+ message . promises . push ( $timeout ( angular . bind ( this , function ( ) {
330+ this . deleteMessage ( message ) ;
331+ } ) , message . ttl ) ) ;
332+ message . promises . push ( $timeout ( message . countdownFunction , 1000 ) ) ;
333+ }
334+ return message ;
335+ } ;
336+ this . deleteMessage = function ( message ) {
337+ var messages = this . directives [ message . referenceId ] . messages ;
338+ var index = messages . indexOf ( message ) ;
339+ if ( index > - 1 ) {
340+ messages [ index ] . close = true ;
341+ messages . splice ( index , 1 ) ;
342+ }
343+ if ( typeof message . onclose === 'function' ) {
344+ message . onclose ( ) ;
345+ }
346+ } ;
347+ }
348+ ] ) ;
0 commit comments