Skip to content

Commit 00af027

Browse files
committed
Merge pull request marcorinck#38 from chasemgray/master
Programmatically destroy messages & allow disabling click to close
2 parents 483a797 + 8b4bfe2 commit 00af027

File tree

8 files changed

+263
-200
lines changed

8 files changed

+263
-200
lines changed

build/angular-growl.css

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

build/angular-growl.js

Lines changed: 121 additions & 89 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,10 @@
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
*/
66
angular.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+
}]);
13979
angular.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">&times;</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">&times;</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+
]);

build/angular-growl.min.css

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)