Created
July 10, 2015 18:57
-
-
Save microbial/59b377b30a866b0ed3fb to your computer and use it in GitHub Desktop.
msg-ctr-for-jsbin
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/*jshint strict:false */ | |
'use strict'; | |
// Create a new angular module. | |
var MessageCenterModule = angular.module('MessageCenterModule', []); | |
// Define a service to inject. | |
MessageCenterModule | |
.provider("$messageCenterService", function() { | |
var _this = this; | |
_this.options = {}; | |
_this.setGlobalOptions = function(options) { | |
_this.options = options; | |
} | |
_this.getOptions = function(options) { | |
return _this.options; | |
} | |
this.$get = function() { | |
return { | |
setGlobalOptions: _this.setGlobalOptions, | |
options: _this.options, | |
getOptions: _this.getOptions | |
} | |
} | |
}) | |
.service('messageCenterService', ['$rootScope', '$sce', '$timeout','$messageCenterService', | |
function ($rootScope, $sce, $timeout,$messageCenterService) { | |
return { | |
mcMessages: this.mcMessages || [], | |
offlistener: this.offlistener || undefined, | |
status: { | |
unseen: 'unseen', | |
shown: 'shown', | |
/** @var Odds are that you will show a message and right after that | |
* change your route/state. If that happens your message will only be | |
* seen for a fraction of a second. To avoid that use the "next" | |
* status, that will make the message available to the next page */ | |
next: 'next', | |
/** @var Do not delete this message automatically. */ | |
permanent: 'permanent' | |
}, | |
add: function (type, message, options) { | |
var availableTypes = ['info', 'warning', 'danger', 'success'], | |
service = this; | |
options = options || {}; | |
var options = angular.extend($messageCenterService.getOptions(), options); | |
if (availableTypes.indexOf(type) == -1) { | |
throw "Invalid message type"; | |
} | |
var messageObject = { | |
type: type, | |
status: options.status || this.status.unseen, | |
processed: false, | |
close: function() { | |
return service.remove(this); | |
} | |
}; | |
messageObject.message = options.html ? $sce.trustAsHtml(message) : message; | |
messageObject.html = !!options.html; | |
if (angular.isDefined(options.timeout)) { | |
messageObject.timer = $timeout(function () { | |
messageObject.close(); | |
}, options.timeout); | |
} | |
this.mcMessages.push(messageObject); | |
return messageObject; | |
}, | |
remove: function (message) { | |
var index = this.mcMessages.indexOf(message); | |
this.mcMessages.splice(index, 1); | |
}, | |
reset: function () { | |
this.mcMessages = []; | |
}, | |
removeShown: function () { | |
for (var index = this.mcMessages.length - 1; index >= 0; index--) { | |
if (this.mcMessages[index].status == this.status.shown) { | |
this.remove(this.mcMessages[index]); | |
} | |
} | |
}, | |
markShown: function () { | |
for (var index = this.mcMessages.length - 1; index >= 0; index--) { | |
if (!this.mcMessages[index].processed) { | |
if (this.mcMessages[index].status == this.status.unseen) { | |
this.mcMessages[index].status = this.status.shown; | |
this.mcMessages[index].processed = true; | |
} | |
else if (this.mcMessages[index].status == this.status.next) { | |
this.mcMessages[index].status = this.status.unseen; | |
} | |
} | |
} | |
}, | |
flush: function () { | |
$rootScope.mcMessages = this.mcMessages; | |
} | |
}; | |
} | |
]); | |
MessageCenterModule. | |
directive('mcMessages', ['$rootScope', 'messageCenterService', function ($rootScope, messageCenterService) { | |
/*jshint multistr: true */ | |
var templateString = '\ | |
<div id="mc-messages-wrapper">\ | |
<div class="alert alert-{{ message.type }} {{ animation }}" ng-repeat="message in mcMessages">\ | |
<a class="close" ng-click="message.close();" data-dismiss="alert" aria-hidden="true">×</a>\ | |
<span ng-switch on="message.html">\ | |
<span ng-switch-when="true">\ | |
<span ng-bind-html="message.message"></span>\ | |
</span>\ | |
<span ng-switch-default>\ | |
{{ message.message }}\ | |
</span>\ | |
</div>\ | |
</div>\ | |
'; | |
return { | |
restrict: 'EA', | |
template: templateString, | |
link: function(scope, element, attrs) { | |
// Bind the messages from the service to the root scope. | |
messageCenterService.flush(); | |
var changeReaction = function (event, to, from) { | |
// Update 'unseen' messages to be marked as 'shown'. | |
messageCenterService.markShown(); | |
// Remove the messages that have been shown. | |
messageCenterService.removeShown(); | |
$rootScope.mcMessages = messageCenterService.mcMessages; | |
messageCenterService.flush(); | |
}; | |
if (messageCenterService.offlistener === undefined) { | |
messageCenterService.offlistener = $rootScope.$on('$locationChangeSuccess', changeReaction); | |
} | |
scope.animation = attrs.animation || 'fade in'; | |
} | |
}; | |
}]); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment