-
Notifications
You must be signed in to change notification settings - Fork 0
/
backbone.alertView.min.js
95 lines (95 loc) · 7.82 KB
/
backbone.alertView.min.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
!function(a){
// Set up Stickit appropriately for the environment. Start with AMD.
"function"==typeof define&&define.amd?define(["underscore","backbone","bootstrap"],a):"object"==typeof exports?a(require("underscore"),require("backbone"),require("bootstrap")):a(_,Backbone,{})}(function(a,b){
// Export onto Backbone object
return b.AlertView=b.View.extend({el:document.body,uiElements:{alertBox:"[data-alert-box]",alertMessages:"[data-alert-messages]",stamp:"[data-alert-stamp]",errorClass:".alert-error",alertWrapper:".alertWrapper"},holderKey:"AlertBox",config:{DEFAULT_SORT_INDEX:10,MESSAGE_DELAYS:{INIT_WAIT:3e3,ADDL_WAIT:2e3,FADE_IN_TIME:150,FADE_OUT_TIME:250}},initialize:function(a){a=a||{},this.alert_fadeIn_time=a.fadeInTime||this.config.MESSAGE_DELAYS.FADE_IN_TIME,this.alert_fadeOut_time=a.fadeOutTime||this.config.MESSAGE_DELAYS.FADE_OUT_TIME,this.sortIndex=a.sortIndex||this.config.DEFAULT_SORT_INDEX,this.initDelayTime=a.delayTime||this.config.MESSAGE_DELAYS.INIT_WAIT,this.extraDelayTime=a.extraDelay||this.config.MESSAGE_DELAYS.ADDL_WAIT},/**
* Display alert
* @param message {String} message to be displayed
* {Array} array containing type:'{error,info,success}', message,
* target (optional), and freeze (optional)
* @param type {String} alert type (error, info, success)
* @param freeze {Boolean|Undefined} do not close alert when there is a route change
* @param stamp {String} alert stamp
* @param target {Object|String} element or jquery string where alert message is to be inserted (optional)
*/
render:function(b,c,d,e,f){var g;
// Array of objects mode
if(b instanceof Array)for(var h=a.sortBy(b,function(a){// Sort by: error, info, success, others last.
return{error:1,info:2,success:3}[a.type.toLowerCase()]||this.sortIndex}),i=$(),j=0;j<h.length;j++)g=i.add(this.launchAlert(h[j].type,h[j].message,h[j].target,h[j].freeze,h[j].stamp));else g=this.launchAlert(c,b,f,d,e);return g},/**
* Escape bad HTML symbols
* @param str {String} input
* @returns {String} result
*/
_escapeMessage:function(a){var b={"&":"&","<":"<",">":">",'"':""","'":"'","/":"/"};return String(a).replace(/[&<>"'\/]/g,function(a){return b[a]})},/**
* Generates the alert's html, settings, and timings
* @param type {String} alert type (error, info, success)
* @param message {String} message to be displayed
* @param target {Object|String} element or jquery string where alert message is to be inserted (optional)
* @param freeze {Boolean|Undefined} do not close alert when there is a route change (optional)
* @param stamp {String} id used to identify an alert or a group of alerts (optional)
*/
launchAlert:function(a,b,c,d,e){a="error"===a?"danger":a;
// Set up message html
var f=e||"",g=this._escapeMessage(b).replace(/\n/g,"<br />"),h=$('<div class="alert alert-'+a+'" data-alert-stamp="'+f+'"><button type="button" class="close" data-dismiss="alert">×</button>'+g+"</div>"),i=this.findHolder(c);
// Add alert message to target
// If freeze is turned on then don't remove message - even for a route change
return this.attachAlertData(i,a),this.isUniqueMessage(b,a)?(h.hide().alert().appendTo(i).slideDown(this.alert_fadeIn_time),d||"error"===a?this.removeAlertAfterRouteChange(h):this.hideAlertWithDelay(h)):this.highLightAlert(b,a,d,e,i),h},/**
* Highlight existed alert message
* @param type {String} alert type (error, info, success)
* @param message {String} message to be displayed
* @param $holder {Object} element that contains alert box
* @param freeze {Boolean|Undefined} do not close alert when there is a route change (optional)
* @param stamp {String} id used to identify an alert or a group of alerts (optional)
*/
highLightAlert:function(a,b,c,d,e){b="error"===b?"danger":b;var f=this.getExistedAlert(a,b);$(f).remove();var g=d||"",h=$('<div class="alert alert-'+b+'" data-alert-stamp="'+g+'"><button type="button" class="close" data-dismiss="alert">×</button>'+a+"</div>");h.appendTo(e),c||"error"===b?this.removeAlertAfterRouteChange(h):this.hideAlertWithDelay(h),h.addClass("alert-reminder"),h.one("webkitAnimationEnd mozAnimationEnd MSAnimationEnd oanimationend animationend",function(){h.removeClass("alert-reminder")})},/**
* Check if message is unique
* @param message {String} message to be displayed
* @returns {Boolean} or not
*/
isUniqueMessage:function(a,b){return!this.getExistedAlert(a,b).length},/**
* Get existed alert with same message
* @param message {String} alert message
* @param type {String} type of alert
* @returns {Array} matched alerts
*/
getExistedAlert:function(a,b){var c=$(this.uiElements.stamp),d=c.filter(function(c,d){return $(d).clone().children().remove().end().text()===a&&$(d).hasClass("alert-"+b)});return d},/**
* Uses the target element or generates the html container for the error message
* @param target {Object} or {String} element or jquery string where alert message is to be inserted (optional)
*/
findHolder:function(a){var b,c={count:0,type:"",errorAlerts:0};
// Create html container for all messages if target element is not provided
if("undefined"==typeof a){var d=$(this.uiElements.alertBox);d.find(this.uiElements.alertWrapper).length||d.append('<div class="row"><div class="span6 offset5 alertWrapper"></div></div>'),a=this.uiElements.alertBox+" "+this.uiElements.alertWrapper}if(b=$(this.uiElements.alertMessages,a),b.length>1)console.warn("[Alert Widget] Multiple alert locations found in target: "+a);else if(0===b.length){b=$("<div "+this.uiElements.alertMessages.replace(/[\[\]]+/g,"")+' class="alertBox"></div>'),b.data(this.holderKey,c);
// Fix the target's position and add the alert box.
var e=$(a);e.css("position","static"===e.css("position")?"relative":e.css("position")).prepend(b)}return b},/**
* Creates and attaches alert tracking data to the passed in jQuery object
* @param $holder {Object} jQuery alert message container
* @param type {String} alert type (error, info, success)
*/
attachAlertData:function(a,b){var c=a.data(this.holderKey);return c.count++,c.type=b,"error"===b?c.errorAlerts++:c.errorAlerts,a.data(this.holderKey,c),a},/**
* Remove alert after route change
* @param $mAlert {jQuery} element
*/
removeAlertAfterRouteChange:function(a){b.history.once("all",function(){a.remove()}),this.setAlertData()},/**
* Hide alert after some delay
* @param $mAlert {jQuery} element
*/
hideAlertWithDelay:function(a){var b=$(this.uiElements.stamp).length,c=$(this.uiElements.errorClass).length,d=(b-c)*this.extraDelayTime+this.initDelayTime,e=this;a.delay(d).animate({opacity:0},this.alert_fadeIn_time,function(){a.slideUp(this.alert_fadeOut_time,function(){a.remove(),e.setAlertData()})})},/**
* Remove alerts from target element or remove all alerts if no target specified
* @param target {Object|String} element or jquery string where alert message is to be inserted (optional)
*/
clearAlerts:function(a){var b="undefined"==typeof a?$(this.uiElements.stamp):$(this.uiElements.stamp,a);b.each(function(a,b){$(b).remove()}),this.setAlertData()},/**
* Get alert element container
* @returns {Object} elements
*/
getAlertContainer:function(){return this.$el.find(this.uiElements.alertMessages)},/**
* Get alert with passed stamp
* @param stamp {String} alert stamp
*/
getAlertWithStamp:function(a){return this.getAlertContainer().find(this.uiElements.stamp.slice(0,-1)+'="'+a+'"]')},/**
* Remove alerts with passed stamp
* @param stamp {String} alert stamp
*/
hideWithStamp:function(a){var b=this;this.getAlertWithStamp(a).each(function(a,c){$(c).remove(),b.setAlertData()})},/**
* Update the alert data statistics
*/
setAlertData:function(){var a=$(this.uiElements.alertMessages).data(this.holderKey);a.count=$(this.uiElements.stamp).length,a.errorAlerts=$(this.uiElements.errorClass).length}}),b.AlertView});