2 * angular-growl-v2 - v0.7.5 - 2015-06-17
3 * http://janstevens.github.io/angular-growl-2
4 * Copyright (c) 2015 Marco Rinck,Jan Stevens; Licensed MIT
6 angular.module('angular-growl', []);
7 angular.module('angular-growl').directive('growl', [function () {
11 templateUrl: 'templates/growl/growl.html',
23 function ($scope, $timeout, growl, growlMessages) {
24 $scope.referenceId = $scope.reference || 0;
25 growlMessages.initDirective($scope.referenceId, $scope.limitMessages);
26 $scope.growlMessages = growlMessages;
27 $scope.inlineMessage = angular.isDefined($scope.inline) ? $scope.inline : growl.inlineMessages();
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;
34 $scope.stopTimeoutClose = function (message) {
35 if (!message.clickToClose) {
36 angular.forEach(message.promises, function (promise) {
37 $timeout.cancel(promise);
40 growlMessages.deleteMessage(message);
46 $scope.alertClasses = function (message) {
48 'alert-success': message.severity === 'success',
49 'alert-error': message.severity === 'error',
50 'alert-danger': message.severity === 'error',
51 'alert-info': message.severity === 'info',
52 'alert-warning': message.severity === 'warning',
53 'icon': message.disableIcons === false,
54 'alert-dismissable': !message.disableCloseButton
57 $scope.showCountDown = function (message) {
58 return !message.disableCountDown && message.ttl > 0;
60 $scope.wrapperClasses = function () {
62 classes['growl-fixed'] = !$scope.inlineMessage;
63 classes[growl.position()] = true;
66 $scope.computeTitle = function (message) {
70 'info': 'Information',
73 return ret[message.severity];
79 angular.module('angular-growl').run([
81 function ($templateCache) {
83 if ($templateCache.get('templates/growl/growl.html') === undefined) {
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>');
88 angular.module('angular-growl').provider('growl', function () {
95 }, _messagesKey = 'messages', _messageTextKey = 'text', _messageTitleKey = 'title', _messageSeverityKey = 'severity', _onlyUniqueMessages = true, _messageVariableKey = 'variables', _referenceId = 0, _inline = false, _position = 'top-right', _disableCloseButton = false, _disableIcons = false, _reverseOrder = false, _disableCountDown = false, _translateMessages = true;
96 this.globalTimeToLive = function (ttl) {
97 if (typeof ttl === 'object') {
99 if (ttl.hasOwnProperty(k)) {
104 for (var severity in _ttl) {
105 if (_ttl.hasOwnProperty(severity)) {
106 _ttl[severity] = ttl;
112 this.globalTranslateMessages = function (translateMessages) {
113 _translateMessages = translateMessages;
116 this.globalDisableCloseButton = function (disableCloseButton) {
117 _disableCloseButton = disableCloseButton;
120 this.globalDisableIcons = function (disableIcons) {
121 _disableIcons = disableIcons;
124 this.globalReversedOrder = function (reverseOrder) {
125 _reverseOrder = reverseOrder;
128 this.globalDisableCountDown = function (countDown) {
129 _disableCountDown = countDown;
132 this.messageVariableKey = function (messageVariableKey) {
133 _messageVariableKey = messageVariableKey;
136 this.globalInlineMessages = function (inline) {
140 this.globalPosition = function (position) {
141 _position = position;
144 this.messagesKey = function (messagesKey) {
145 _messagesKey = messagesKey;
148 this.messageTextKey = function (messageTextKey) {
149 _messageTextKey = messageTextKey;
152 this.messageTitleKey = function (messageTitleKey) {
153 _messageTitleKey = messageTitleKey;
156 this.messageSeverityKey = function (messageSeverityKey) {
157 _messageSeverityKey = messageSeverityKey;
160 this.onlyUniqueMessages = function (onlyUniqueMessages) {
161 _onlyUniqueMessages = onlyUniqueMessages;
164 this.serverMessagesInterceptor = [
167 function ($q, growl) {
168 function checkResponse(response) {
169 if (response !== undefined && response.data && response.data[_messagesKey] && response.data[_messagesKey].length > 0) {
170 growl.addServerMessages(response.data[_messagesKey]);
174 'response': function (response) {
175 checkResponse(response);
178 'responseError': function (rejection) {
179 checkResponse(rejection);
180 return $q.reject(rejection);
192 function ($rootScope, $interpolate, $sce, $filter, $timeout, growlMessages) {
194 growlMessages.onlyUnique = _onlyUniqueMessages;
195 growlMessages.reverseOrder = _reverseOrder;
197 translate = $filter('translate');
200 function broadcastMessage(message) {
201 if (translate && message.translateMessage) {
202 message.text = translate(message.text, message.variables) || message.text;
203 message.title = translate(message.title) || message.title;
205 var polation = $interpolate(message.text);
206 message.text = polation(message.variables);
208 var addedMessage = growlMessages.addMessage(message);
209 $rootScope.$broadcast('growlMessage', message);
210 $timeout(function () {
214 function sendMessage(text, config, severity) {
215 var _config = config || {}, message;
218 title: _config.title,
220 ttl: _config.ttl || _ttl[severity],
221 variables: _config.variables || {},
222 disableCloseButton: _config.disableCloseButton === undefined ? _disableCloseButton : _config.disableCloseButton,
223 disableIcons: _config.disableIcons === undefined ? _disableIcons : _config.disableIcons,
224 disableCountDown: _config.disableCountDown === undefined ? _disableCountDown : _config.disableCountDown,
225 position: _config.position || _position,
226 referenceId: _config.referenceId || _referenceId,
227 translateMessage: _config.translateMessage === undefined ? _translateMessages : _config.translateMessage,
228 destroy: function () {
229 growlMessages.deleteMessage(message);
231 setText: function (newText) {
232 message.text = $sce.trustAsHtml(String(newText));
234 onclose: _config.onclose,
235 onopen: _config.onopen
237 return broadcastMessage(message);
239 function warning(text, config) {
240 return sendMessage(text, config, 'warning');
242 function error(text, config) {
243 return sendMessage(text, config, 'error');
245 function info(text, config) {
246 return sendMessage(text, config, 'info');
248 function success(text, config) {
249 return sendMessage(text, config, 'success');
251 function general(text, config, severity) {
252 severity = (severity || 'error').toLowerCase();
253 return sendMessage(text, config, severity);
255 function addServerMessages(messages) {
256 if (!messages || !messages.length) {
259 var i, message, severity, length;
260 length = messages.length;
261 for (i = 0; i < length; i++) {
262 message = messages[i];
263 if (message[_messageTextKey]) {
264 severity = (message[_messageSeverityKey] || 'error').toLowerCase();
266 config.variables = message[_messageVariableKey] || {};
267 config.title = message[_messageTitleKey];
268 sendMessage(message[_messageTextKey], config, severity);
272 function onlyUnique() {
273 return _onlyUniqueMessages;
275 function reverseOrder() {
276 return _reverseOrder;
278 function inlineMessages() {
281 function position() {
290 addServerMessages: addServerMessages,
291 onlyUnique: onlyUnique,
292 reverseOrder: reverseOrder,
293 inlineMessages: inlineMessages,
299 angular.module('angular-growl').service('growlMessages', [
302 function ($sce, $timeout) {
305 this.directives = {};
306 var preloadDirectives = {};
307 function preLoad(referenceId) {
309 if (preloadDirectives[referenceId]) {
310 directive = preloadDirectives[referenceId];
312 directive = preloadDirectives[referenceId] = { messages: [] };
316 function directiveForRefId(referenceId) {
317 var refId = referenceId || 0;
318 return self.directives[refId] || preloadDirectives[refId];
320 this.initDirective = function (referenceId, limitMessages) {
321 if (preloadDirectives[referenceId]) {
322 this.directives[referenceId] = preloadDirectives[referenceId];
323 this.directives[referenceId].limitMessages = limitMessages;
325 this.directives[referenceId] = {
327 limitMessages: limitMessages
330 return this.directives[referenceId];
332 this.getAllMessages = function (referenceId) {
333 referenceId = referenceId || 0;
335 if (directiveForRefId(referenceId)) {
336 messages = directiveForRefId(referenceId).messages;
342 this.destroyAllMessages = function (referenceId) {
343 var messages = this.getAllMessages(referenceId);
344 for (var i = messages.length - 1; i >= 0; i--) {
345 messages[i].destroy();
347 var directive = directiveForRefId(referenceId);
349 directive.messages = [];
352 this.addMessage = function (message) {
353 var directive, messages, found, msgText;
354 if (this.directives[message.referenceId]) {
355 directive = this.directives[message.referenceId];
357 directive = preLoad(message.referenceId);
359 messages = directive.messages;
360 if (this.onlyUnique) {
361 angular.forEach(messages, function (msg) {
362 msgText = $sce.getTrustedHtml(msg.text);
363 if (message.text === msgText && message.severity === msg.severity && message.title === msg.title) {
371 message.text = $sce.trustAsHtml(String(message.text));
372 if (message.ttl && message.ttl !== -1) {
373 message.countdown = message.ttl / 1000;
374 message.promises = [];
375 message.close = false;
376 message.countdownFunction = function () {
377 if (message.countdown > 1) {
379 message.promises.push($timeout(message.countdownFunction, 1000));
385 if (angular.isDefined(directive.limitMessages)) {
386 var diff = messages.length - (directive.limitMessages - 1);
388 messages.splice(directive.limitMessages - 1, diff);
391 if (this.reverseOrder) {
392 messages.unshift(message);
394 messages.push(message);
396 if (typeof message.onopen === 'function') {
399 if (message.ttl && message.ttl !== -1) {
401 message.promises.push($timeout(angular.bind(this, function () {
402 self.deleteMessage(message);
404 message.promises.push($timeout(message.countdownFunction, 1000));
408 this.deleteMessage = function (message) {
409 var messages = this.getAllMessages(message.referenceId), index = messages.indexOf(message);
411 messages[index].close = true;
412 messages.splice(index, 1);
414 if (typeof message.onclose === 'function') {