mindreframer-riemann-dash 0.2.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.gitignore +8 -0
- data/Gemfile +7 -0
- data/Gemfile.lock +52 -0
- data/LICENSE +21 -0
- data/README.markdown +52 -0
- data/Rakefile.rb +11 -0
- data/bin/riemann-dash +7 -0
- data/example/config.rb +17 -0
- data/lib/riemann/dash.rb +5 -0
- data/lib/riemann/dash/app.rb +32 -0
- data/lib/riemann/dash/config.rb +154 -0
- data/lib/riemann/dash/controller/css.rb +5 -0
- data/lib/riemann/dash/controller/index.rb +20 -0
- data/lib/riemann/dash/public/clock.js +45 -0
- data/lib/riemann/dash/public/dash.js +287 -0
- data/lib/riemann/dash/public/format.js +24 -0
- data/lib/riemann/dash/public/jquery-1.7.2.min.js +4 -0
- data/lib/riemann/dash/public/jquery-ui-1.9.0.custom.min.js +6 -0
- data/lib/riemann/dash/public/jquery.json-2.2.min.js +31 -0
- data/lib/riemann/dash/public/jquery.quickfit.js +144 -0
- data/lib/riemann/dash/public/jquery.simplemodal.1.4.3.min.js +26 -0
- data/lib/riemann/dash/public/keys.js +46 -0
- data/lib/riemann/dash/public/mustache.js +597 -0
- data/lib/riemann/dash/public/persistence.js +30 -0
- data/lib/riemann/dash/public/profile.js +33 -0
- data/lib/riemann/dash/public/subs.js +164 -0
- data/lib/riemann/dash/public/toastr.css +174 -0
- data/lib/riemann/dash/public/toastr.js +207 -0
- data/lib/riemann/dash/public/toolbar.js +217 -0
- data/lib/riemann/dash/public/underscore-min.js +5 -0
- data/lib/riemann/dash/public/util.js +34 -0
- data/lib/riemann/dash/public/vendor/smoothie.js +374 -0
- data/lib/riemann/dash/public/view.js +704 -0
- data/lib/riemann/dash/public/views/gauge.js +76 -0
- data/lib/riemann/dash/public/views/grid.js +279 -0
- data/lib/riemann/dash/public/views/help.js +28 -0
- data/lib/riemann/dash/public/views/timeseries.js +107 -0
- data/lib/riemann/dash/public/views/title.js +35 -0
- data/lib/riemann/dash/public/x.png +0 -0
- data/lib/riemann/dash/rack/static.rb +16 -0
- data/lib/riemann/dash/version.rb +4 -0
- data/lib/riemann/dash/views/css.scss +393 -0
- data/lib/riemann/dash/views/index.erubis +203 -0
- data/lib/riemann/dash/views/layout.erubis +21 -0
- data/riemann-dash.gemspec +28 -0
- data/sh/c +1 -0
- data/sh/env.rb +2 -0
- data/sh/test +1 -0
- data/test/config_test.rb +106 -0
- data/test/fixtures/config/basic_config.rb +2 -0
- data/test/fixtures/config/ws_config.rb +1 -0
- data/test/fixtures/ws_config/dummy_config.json +1 -0
- data/test/fixtures/ws_config/pretty_printed_config.json +6 -0
- data/test/test_helper.rb +10 -0
- metadata +202 -0
@@ -0,0 +1,30 @@
|
|
1
|
+
// Provides persistent storage for dashboard configuration.
|
2
|
+
var persistence = (function() {
|
3
|
+
// Saves configuration to persistent store. Calls success() or error() when
|
4
|
+
// complete.
|
5
|
+
var save = function(config, success, error) {
|
6
|
+
jQuery.ajax('/config', {
|
7
|
+
type: 'POST',
|
8
|
+
success: success,
|
9
|
+
error: error,
|
10
|
+
contentType: 'application/json',
|
11
|
+
data: JSON.stringify(config),
|
12
|
+
dataType: 'json'
|
13
|
+
});
|
14
|
+
};
|
15
|
+
|
16
|
+
// Returns configuration from persistent store.
|
17
|
+
var load = function(success, error) {
|
18
|
+
jQuery.ajax('/config', {
|
19
|
+
type: 'GET',
|
20
|
+
success: success,
|
21
|
+
error: error,
|
22
|
+
dataType: 'json'
|
23
|
+
});
|
24
|
+
};
|
25
|
+
|
26
|
+
return {
|
27
|
+
save: save,
|
28
|
+
load: load
|
29
|
+
}
|
30
|
+
})();
|
@@ -0,0 +1,33 @@
|
|
1
|
+
var profile = (function() {
|
2
|
+
// Instrumentation for how much time we spend doing things. With 0 args,
|
3
|
+
// returns current busy fraction. With a start and stop time in milliseconds,
|
4
|
+
// updates the current busy fraction.
|
5
|
+
|
6
|
+
// Returns a load meter with a sampling period in ms.
|
7
|
+
var load = function(period) {
|
8
|
+
// Start of the sample interval
|
9
|
+
var interval = 0;
|
10
|
+
|
11
|
+
// Fraction of time busy
|
12
|
+
var load = 0;
|
13
|
+
var acc = 0;
|
14
|
+
|
15
|
+
return function(t1, t2) {
|
16
|
+
if (t1 === undefined) {
|
17
|
+
return load;
|
18
|
+
}
|
19
|
+
|
20
|
+
if (interval < t2) {
|
21
|
+
interval = (Math.floor(t2 / period) * period) + period;
|
22
|
+
load = acc / period;
|
23
|
+
acc = 0;
|
24
|
+
}
|
25
|
+
|
26
|
+
acc += (t2 - t1);
|
27
|
+
}
|
28
|
+
};
|
29
|
+
|
30
|
+
return {
|
31
|
+
load: load
|
32
|
+
};
|
33
|
+
})();
|
@@ -0,0 +1,164 @@
|
|
1
|
+
var subs = (function() {
|
2
|
+
// What server shall we connect to by default?
|
3
|
+
var server;
|
4
|
+
|
5
|
+
// Subscription ID counter.
|
6
|
+
var id_counter = -1;
|
7
|
+
|
8
|
+
// Subscriptions
|
9
|
+
var subs = {};
|
10
|
+
|
11
|
+
// Switch to turn on/off event processing
|
12
|
+
var active = true;
|
13
|
+
|
14
|
+
// Error queue for notification
|
15
|
+
var errorQueue = [];
|
16
|
+
|
17
|
+
// Instrumentation
|
18
|
+
var load1 = profile.load(1000);
|
19
|
+
var load5 = profile.load(5000);
|
20
|
+
|
21
|
+
// Get a new subscription ID.
|
22
|
+
var newId = function() {
|
23
|
+
return id_counter += 1;
|
24
|
+
}
|
25
|
+
|
26
|
+
// Close a subscription's websocket channel.
|
27
|
+
var close = function(sub) {
|
28
|
+
if (sub.ws == null) {
|
29
|
+
return sub;
|
30
|
+
}
|
31
|
+
sub.ws.close();
|
32
|
+
sub.ws == null;
|
33
|
+
return sub;
|
34
|
+
}
|
35
|
+
|
36
|
+
// Closes a subscription and deletes it from the subscription manager.
|
37
|
+
var unsubscribe = function(sub) {
|
38
|
+
delete subs[sub.id];
|
39
|
+
close(sub);
|
40
|
+
}
|
41
|
+
|
42
|
+
// Unsubscribe from all subscriptions.
|
43
|
+
var unsubscribeAll = function() {
|
44
|
+
_.each(subs, unsubscribe);
|
45
|
+
}
|
46
|
+
|
47
|
+
// Open a subscription's websocket channel.
|
48
|
+
var open = function(sub) {
|
49
|
+
if (sub.ws != null && sub.ws.readyState != WebSocket.CLOSED) {
|
50
|
+
return sub;
|
51
|
+
}
|
52
|
+
|
53
|
+
var f = sub.f;
|
54
|
+
var queryString = "query=" + encodeURI(sub.query);
|
55
|
+
var uri = "ws://" + server + "/index?subscribe=true&" + queryString;
|
56
|
+
sub.ws = new WebSocket(uri);
|
57
|
+
var $ws = $(sub.ws);
|
58
|
+
|
59
|
+
$ws.bind('open', function() {
|
60
|
+
console.log("Socket opened", sub.query);
|
61
|
+
});
|
62
|
+
|
63
|
+
$ws.bind('close', function(e) {
|
64
|
+
console.log("Socket closed", sub.query);
|
65
|
+
sub.ws = null;
|
66
|
+
});
|
67
|
+
|
68
|
+
$ws.bind('error', function(e) {
|
69
|
+
console.log("Socket error", sub.query);
|
70
|
+
errorQueue.push(e);
|
71
|
+
sub.ws.close();
|
72
|
+
});
|
73
|
+
|
74
|
+
$ws.bind('message', function(e) {
|
75
|
+
t1 = Date.now();
|
76
|
+
if (active) {
|
77
|
+
f(JSON.parse(e.originalEvent.data));
|
78
|
+
}
|
79
|
+
load1(t1, Date.now());
|
80
|
+
load5(t1, Date.now());
|
81
|
+
});
|
82
|
+
|
83
|
+
return sub;
|
84
|
+
}
|
85
|
+
|
86
|
+
// Add a subscription. Returns a subscription object. Subscriptions are
|
87
|
+
// opened immediately.
|
88
|
+
var subscribe = function(query, f) {
|
89
|
+
var sub = {
|
90
|
+
id: newId(),
|
91
|
+
query: query,
|
92
|
+
f: f,
|
93
|
+
ws: null
|
94
|
+
}
|
95
|
+
subs[sub.id] = sub;
|
96
|
+
open(sub);
|
97
|
+
return sub;
|
98
|
+
}
|
99
|
+
|
100
|
+
// Reconnect all inactive subs.
|
101
|
+
var converge = function() {
|
102
|
+
var closed = _.filter(subs, function(sub) {
|
103
|
+
return (sub.ws == null || sub.ws.readyState == WebSocket.CLOSED);
|
104
|
+
});
|
105
|
+
if (_.isEmpty(closed)) {
|
106
|
+
// Done here.
|
107
|
+
return;
|
108
|
+
}
|
109
|
+
|
110
|
+
// Display reconnection notice
|
111
|
+
toastr.warning(_.size(closed) + " lost connections");
|
112
|
+
|
113
|
+
// Reopen
|
114
|
+
_.each(closed, function(sub) {
|
115
|
+
open(sub);
|
116
|
+
});
|
117
|
+
}
|
118
|
+
|
119
|
+
var notifyErrors = function() {
|
120
|
+
if (errorQueue.length == 0) {
|
121
|
+
return;
|
122
|
+
}
|
123
|
+
toastr.warning(errorQueue.length + " socket errors");
|
124
|
+
errorQueue.length = 0;
|
125
|
+
converge();
|
126
|
+
}
|
127
|
+
|
128
|
+
// Periodically notify of errors.
|
129
|
+
window.setInterval(notifyErrors, 100);
|
130
|
+
|
131
|
+
// Periodically converge.
|
132
|
+
setInterval(converge, 6000);
|
133
|
+
|
134
|
+
// When terminating, close all connections.
|
135
|
+
$(window).unload(unsubscribeAll);
|
136
|
+
|
137
|
+
return {
|
138
|
+
subscribe: subscribe,
|
139
|
+
unsubscribe: unsubscribe,
|
140
|
+
unsubscribeAll: unsubscribeAll,
|
141
|
+
converge: converge,
|
142
|
+
load1: load1,
|
143
|
+
load5: load5,
|
144
|
+
subs: function() { return subs; },
|
145
|
+
enable: function() { active = true; console.log("Subs enabled."); },
|
146
|
+
disable: function() { active = false; console.log("Subs disabled."); },
|
147
|
+
toggle: function() {
|
148
|
+
active = ! active;
|
149
|
+
if (active) {
|
150
|
+
console.log("Subs enabled.");
|
151
|
+
} else {
|
152
|
+
console.log("Subs disabled.");
|
153
|
+
}
|
154
|
+
},
|
155
|
+
server: function(s) {
|
156
|
+
if (s === undefined) {
|
157
|
+
return server;
|
158
|
+
} else {
|
159
|
+
server = s;
|
160
|
+
return s;
|
161
|
+
}
|
162
|
+
}
|
163
|
+
};
|
164
|
+
})();
|
@@ -0,0 +1,174 @@
|
|
1
|
+
.toast-title
|
2
|
+
{
|
3
|
+
font-weight: bold;
|
4
|
+
}
|
5
|
+
|
6
|
+
.toast-message
|
7
|
+
{
|
8
|
+
-ms-word-wrap: break-word;
|
9
|
+
word-wrap: break-word;
|
10
|
+
}
|
11
|
+
|
12
|
+
.toast-message a,
|
13
|
+
.toast-message label
|
14
|
+
{
|
15
|
+
color: #FFF;
|
16
|
+
}
|
17
|
+
|
18
|
+
.toast-message a:hover
|
19
|
+
{
|
20
|
+
color: #CCC;
|
21
|
+
text-decoration: none;
|
22
|
+
}
|
23
|
+
|
24
|
+
.toast-top-left
|
25
|
+
{
|
26
|
+
left: 12px;
|
27
|
+
top: 12px;
|
28
|
+
}
|
29
|
+
|
30
|
+
.toast-bottom-right
|
31
|
+
{
|
32
|
+
bottom: 12px;
|
33
|
+
right: 12px;
|
34
|
+
}
|
35
|
+
|
36
|
+
.toast-bottom-left
|
37
|
+
{
|
38
|
+
bottom: 12px;
|
39
|
+
left: 12px;
|
40
|
+
}
|
41
|
+
|
42
|
+
#toast-container
|
43
|
+
{
|
44
|
+
position: fixed;
|
45
|
+
z-index: 9999;
|
46
|
+
}
|
47
|
+
|
48
|
+
#toast-container > div
|
49
|
+
{
|
50
|
+
background-position: 15px center;
|
51
|
+
background-repeat: no-repeat;
|
52
|
+
-moz-border-radius: 3px 3px 3px 3px;
|
53
|
+
-webkit-border-radius: 3px 3px 3px 3px;
|
54
|
+
border-radius: 3px 3px 3px 3px;
|
55
|
+
-moz-box-shadow: 0 0 12px #999999;
|
56
|
+
-webkit-box-shadow: 0 0 12px #999999;
|
57
|
+
box-shadow: 0 0 12px #999999;
|
58
|
+
color: #FFFFFF;
|
59
|
+
-ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=80)";
|
60
|
+
filter: alpha(opacity=80);
|
61
|
+
margin: 0 0 6px;
|
62
|
+
opacity: 0.8;
|
63
|
+
padding: 15px 15px 15px 50px;
|
64
|
+
width: 300px;
|
65
|
+
}
|
66
|
+
|
67
|
+
.toast
|
68
|
+
{
|
69
|
+
background-color: #030303;
|
70
|
+
}
|
71
|
+
|
72
|
+
.toast-success
|
73
|
+
{
|
74
|
+
background-color: #51A351;
|
75
|
+
}
|
76
|
+
|
77
|
+
.toast-error
|
78
|
+
{
|
79
|
+
background-color: #BD362F;
|
80
|
+
}
|
81
|
+
|
82
|
+
.toast-info
|
83
|
+
{
|
84
|
+
background-color: #2F96B4;
|
85
|
+
}
|
86
|
+
|
87
|
+
.toast-warning
|
88
|
+
{
|
89
|
+
background-color: #F89406;
|
90
|
+
}
|
91
|
+
|
92
|
+
.toast-top-right
|
93
|
+
{
|
94
|
+
right: 12px;
|
95
|
+
top: 12px;
|
96
|
+
}
|
97
|
+
|
98
|
+
#toast-container > :hover
|
99
|
+
{
|
100
|
+
-moz-box-shadow: 0 0 12px #000000;
|
101
|
+
-webkit-box-shadow: 0 0 12px #000000;
|
102
|
+
box-shadow: 0 0 12px #000000;
|
103
|
+
cursor: pointer;
|
104
|
+
-ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=100)";
|
105
|
+
filter: alpha(opacity=100);
|
106
|
+
opacity: 1;
|
107
|
+
}
|
108
|
+
|
109
|
+
#toast-container > .toast-info
|
110
|
+
{
|
111
|
+
background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAGwSURBVEhLtZa9SgNBEMc9sUxxRcoUKSzSWIhXpFMhhYWFhaBg4yPYiWCXZxBLERsLRS3EQkEfwCKdjWJAwSKCgoKCcudv4O5YLrt7EzgXhiU3/4+b2ckmwVjJSpKkQ6wAi4gwhT+z3wRBcEz0yjSseUTrcRyfsHsXmD0AmbHOC9Ii8VImnuXBPglHpQ5wwSVM7sNnTG7Za4JwDdCjxyAiH3nyA2mtaTJufiDZ5dCaqlItILh1NHatfN5skvjx9Z38m69CgzuXmZgVrPIGE763Jx9qKsRozWYw6xOHdER+nn2KkO+Bb+UV5CBN6WC6QtBgbRVozrahAbmm6HtUsgtPC19tFdxXZYBOfkbmFJ1VaHA1VAHjd0pp70oTZzvR+EVrx2Ygfdsq6eu55BHYR8hlcki+n+kERUFG8BrA0BwjeAv2M8WLQBtcy+SD6fNsmnB3AlBLrgTtVW1c2QN4bVWLATaIS60J2Du5y1TiJgjSBvFVZgTmwCU+dAZFoPxGEEs8nyHC9Bwe2GvEJv2WXZb0vjdyFT4Cxk3e/kIqlOGoVLwwPevpYHT+00T+hWwXDf4AJAOUqWcDhbwAAAAASUVORK5CYII=") !important;
|
112
|
+
}
|
113
|
+
|
114
|
+
#toast-container > .toast-error
|
115
|
+
{
|
116
|
+
background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAHOSURBVEhLrZa/SgNBEMZzh0WKCClSCKaIYOED+AAKeQQLG8HWztLCImBrYadgIdY+gIKNYkBFSwu7CAoqCgkkoGBI/E28PdbLZmeDLgzZzcx83/zZ2SSXC1j9fr+I1Hq93g2yxH4iwM1vkoBWAdxCmpzTxfkN2RcyZNaHFIkSo10+8kgxkXIURV5HGxTmFuc75B2RfQkpxHG8aAgaAFa0tAHqYFfQ7Iwe2yhODk8+J4C7yAoRTWI3w/4klGRgR4lO7Rpn9+gvMyWp+uxFh8+H+ARlgN1nJuJuQAYvNkEnwGFck18Er4q3egEc/oO+mhLdKgRyhdNFiacC0rlOCbhNVz4H9FnAYgDBvU3QIioZlJFLJtsoHYRDfiZoUyIxqCtRpVlANq0EU4dApjrtgezPFad5S19Wgjkc0hNVnuF4HjVA6C7QrSIbylB+oZe3aHgBsqlNqKYH48jXyJKMuAbiyVJ8KzaB3eRc0pg9VwQ4niFryI68qiOi3AbjwdsfnAtk0bCjTLJKr6mrD9g8iq/S/B81hguOMlQTnVyG40wAcjnmgsCNESDrjme7wfftP4P7SP4N3CJZdvzoNyGq2c/HWOXJGsvVg+RA/k2MC/wN6I2YA2Pt8GkAAAAASUVORK5CYII=") !important;
|
117
|
+
}
|
118
|
+
|
119
|
+
#toast-container > .toast-success
|
120
|
+
{
|
121
|
+
background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAADsSURBVEhLY2AYBfQMgf///3P8+/evAIgvA/FsIF+BavYDDWMBGroaSMMBiE8VC7AZDrIFaMFnii3AZTjUgsUUWUDA8OdAH6iQbQEhw4HyGsPEcKBXBIC4ARhex4G4BsjmweU1soIFaGg/WtoFZRIZdEvIMhxkCCjXIVsATV6gFGACs4Rsw0EGgIIH3QJYJgHSARQZDrWAB+jawzgs+Q2UO49D7jnRSRGoEFRILcdmEMWGI0cm0JJ2QpYA1RDvcmzJEWhABhD/pqrL0S0CWuABKgnRki9lLseS7g2AlqwHWQSKH4oKLrILpRGhEQCw2LiRUIa4lwAAAABJRU5ErkJggg==") !important;
|
122
|
+
}
|
123
|
+
|
124
|
+
#toast-container > .toast-warning
|
125
|
+
{
|
126
|
+
background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAGYSURBVEhL5ZSvTsNQFMbXZGICMYGYmJhAQIJAICYQPAACiSDB8AiICQQJT4CqQEwgJvYASAQCiZiYmJhAIBATCARJy+9rTsldd8sKu1M0+dLb057v6/lbq/2rK0mS/TRNj9cWNAKPYIJII7gIxCcQ51cvqID+GIEX8ASG4B1bK5gIZFeQfoJdEXOfgX4QAQg7kH2A65yQ87lyxb27sggkAzAuFhbbg1K2kgCkB1bVwyIR9m2L7PRPIhDUIXgGtyKw575yz3lTNs6X4JXnjV+LKM/m3MydnTbtOKIjtz6VhCBq4vSm3ncdrD2lk0VgUXSVKjVDJXJzijW1RQdsU7F77He8u68koNZTz8Oz5yGa6J3H3lZ0xYgXBK2QymlWWA+RWnYhskLBv2vmE+hBMCtbA7KX5drWyRT/2JsqZ2IvfB9Y4bWDNMFbJRFmC9E74SoS0CqulwjkC0+5bpcV1CZ8NMej4pjy0U+doDQsGyo1hzVJttIjhQ7GnBtRFN1UarUlH8F3xict+HY07rEzoUGPlWcjRFRr4/gChZgc3ZL2d8oAAAAASUVORK5CYII=") !important;
|
127
|
+
}
|
128
|
+
|
129
|
+
/*Responsive Design*/
|
130
|
+
|
131
|
+
@media all and (max-width: 240px)
|
132
|
+
{
|
133
|
+
#toast-container > div
|
134
|
+
{
|
135
|
+
padding: 8px 8px 8px 50px;
|
136
|
+
width: 108px;
|
137
|
+
}
|
138
|
+
}
|
139
|
+
|
140
|
+
@media all and (min-width: 241px) and (max-width: 320px)
|
141
|
+
{
|
142
|
+
#toast-container > div
|
143
|
+
{
|
144
|
+
padding: 8px 8px 8px 50px;
|
145
|
+
width: 128px;
|
146
|
+
}
|
147
|
+
}
|
148
|
+
|
149
|
+
@media all and (min-width: 321px) and (max-width: 480px)
|
150
|
+
{
|
151
|
+
#toast-container > div
|
152
|
+
{
|
153
|
+
padding: 8px 8px 8px 50px;
|
154
|
+
width: 192px;
|
155
|
+
}
|
156
|
+
}
|
157
|
+
|
158
|
+
@media all and (min-width: 481px) and (max-width: 768px)
|
159
|
+
{
|
160
|
+
#toast-container > div
|
161
|
+
{
|
162
|
+
padding: 15px 15px 15px 50px;
|
163
|
+
width: 300px;
|
164
|
+
}
|
165
|
+
}
|
166
|
+
|
167
|
+
@media all and (min-width: 769px)
|
168
|
+
{
|
169
|
+
#toast-container > div
|
170
|
+
{
|
171
|
+
padding: 15px 15px 15px 50px;
|
172
|
+
width: 300px;
|
173
|
+
}
|
174
|
+
}
|
@@ -0,0 +1,207 @@
|
|
1
|
+
// By: Hans Fjällemark and John Papa
|
2
|
+
// https://github.com/CodeSeven/toastr
|
3
|
+
//
|
4
|
+
// Modified to support css styling instead of inline styling
|
5
|
+
// Inspired by https://github.com/Srirangan/notifer.js/
|
6
|
+
|
7
|
+
; (function (define) {
|
8
|
+
define(['jquery'], function ($) {
|
9
|
+
var toastr = (function () {
|
10
|
+
var
|
11
|
+
defaults = {
|
12
|
+
tapToDismiss: true,
|
13
|
+
toastClass: 'toast',
|
14
|
+
containerId: 'toast-container',
|
15
|
+
debug: false,
|
16
|
+
fadeIn: 300,
|
17
|
+
fadeOut: 1000,
|
18
|
+
extendedTimeOut: 1000,
|
19
|
+
iconClasses: {
|
20
|
+
error: 'toast-error',
|
21
|
+
info: 'toast-info',
|
22
|
+
success: 'toast-success',
|
23
|
+
warning: 'toast-warning'
|
24
|
+
},
|
25
|
+
iconClass: 'toast-info',
|
26
|
+
positionClass: 'toast-top-right',
|
27
|
+
timeOut: 5000, // Set timeOut to 0 to make it sticky
|
28
|
+
titleClass: 'toast-title',
|
29
|
+
messageClass: 'toast-message'
|
30
|
+
},
|
31
|
+
|
32
|
+
error = function (message, title, optionsOverride) {
|
33
|
+
return notify({
|
34
|
+
iconClass: getOptions().iconClasses.error,
|
35
|
+
message: message,
|
36
|
+
optionsOverride: optionsOverride,
|
37
|
+
title: title
|
38
|
+
});
|
39
|
+
},
|
40
|
+
|
41
|
+
getContainer = function (options) {
|
42
|
+
var $container = $('#' + options.containerId);
|
43
|
+
if ($container.length) {
|
44
|
+
return $container;
|
45
|
+
}
|
46
|
+
$container = $('<div/>')
|
47
|
+
.attr('id', options.containerId)
|
48
|
+
.addClass(options.positionClass);
|
49
|
+
$container.appendTo($('body'));
|
50
|
+
return $container;
|
51
|
+
},
|
52
|
+
|
53
|
+
getOptions = function () {
|
54
|
+
return $.extend({}, defaults, toastr.options);
|
55
|
+
},
|
56
|
+
|
57
|
+
info = function (message, title, optionsOverride) {
|
58
|
+
return notify({
|
59
|
+
iconClass: getOptions().iconClasses.info,
|
60
|
+
message: message,
|
61
|
+
optionsOverride: optionsOverride,
|
62
|
+
title: title
|
63
|
+
});
|
64
|
+
},
|
65
|
+
|
66
|
+
notify = function (map) {
|
67
|
+
var
|
68
|
+
options = getOptions(),
|
69
|
+
iconClass = map.iconClass || options.iconClass;
|
70
|
+
|
71
|
+
if (typeof (map.optionsOverride) !== 'undefined') {
|
72
|
+
options = $.extend(options, map.optionsOverride);
|
73
|
+
iconClass = map.optionsOverride.iconClass || iconClass;
|
74
|
+
}
|
75
|
+
|
76
|
+
var
|
77
|
+
intervalId = null,
|
78
|
+
$container = getContainer(options),
|
79
|
+
$toastElement = $('<div/>'),
|
80
|
+
$titleElement = $('<div/>'),
|
81
|
+
$messageElement = $('<div/>'),
|
82
|
+
response = { options: options, map: map };
|
83
|
+
|
84
|
+
if (map.iconClass) {
|
85
|
+
$toastElement.addClass(options.toastClass).addClass(iconClass);
|
86
|
+
}
|
87
|
+
|
88
|
+
if (map.title) {
|
89
|
+
$titleElement.append(map.title).addClass(options.titleClass);
|
90
|
+
$toastElement.append($titleElement);
|
91
|
+
}
|
92
|
+
|
93
|
+
if (map.message) {
|
94
|
+
$messageElement.append(map.message).addClass(options.messageClass);
|
95
|
+
$toastElement.append($messageElement);
|
96
|
+
}
|
97
|
+
|
98
|
+
var fadeAway = function () {
|
99
|
+
if ($(':focus', $toastElement).length > 0) {
|
100
|
+
return;
|
101
|
+
}
|
102
|
+
var fade = function (callback) {
|
103
|
+
return $toastElement.fadeOut(options.fadeOut, callback);
|
104
|
+
};
|
105
|
+
var removeToast = function () {
|
106
|
+
if ($toastElement.is(':visible')) {
|
107
|
+
return;
|
108
|
+
}
|
109
|
+
$toastElement.remove();
|
110
|
+
if ($container.children().length === 0) {
|
111
|
+
$container.remove();
|
112
|
+
}
|
113
|
+
};
|
114
|
+
fade(removeToast);
|
115
|
+
};
|
116
|
+
var delayedFadeAway = function () {
|
117
|
+
if (options.timeOut > 0 || options.extendedTimeOut > 0) {
|
118
|
+
intervalId = setTimeout(fadeAway, options.extendedTimeOut);
|
119
|
+
}
|
120
|
+
};
|
121
|
+
var stickAround = function () {
|
122
|
+
clearTimeout(intervalId);
|
123
|
+
$toastElement.stop(true, true).fadeIn(options.fadeIn);
|
124
|
+
};
|
125
|
+
$toastElement.hide();
|
126
|
+
$container.prepend($toastElement);
|
127
|
+
$toastElement.fadeIn(options.fadeIn);
|
128
|
+
if (options.timeOut > 0) {
|
129
|
+
intervalId = setTimeout(fadeAway, options.timeOut);
|
130
|
+
}
|
131
|
+
|
132
|
+
$toastElement.hover(stickAround, delayedFadeAway);
|
133
|
+
if (!options.onclick && options.tapToDismiss) {
|
134
|
+
$toastElement.click(fadeAway);
|
135
|
+
}
|
136
|
+
|
137
|
+
if (options.onclick) {
|
138
|
+
$toastElement.click(function () {
|
139
|
+
options.onclick() && fadeAway();
|
140
|
+
});
|
141
|
+
}
|
142
|
+
|
143
|
+
if (options.debug && console) {
|
144
|
+
console.log(response);
|
145
|
+
}
|
146
|
+
return $toastElement;
|
147
|
+
},
|
148
|
+
|
149
|
+
success = function (message, title, optionsOverride) {
|
150
|
+
return notify({
|
151
|
+
iconClass: getOptions().iconClasses.success,
|
152
|
+
message: message,
|
153
|
+
optionsOverride: optionsOverride,
|
154
|
+
title: title
|
155
|
+
});
|
156
|
+
},
|
157
|
+
|
158
|
+
warning = function (message, title, optionsOverride) {
|
159
|
+
return notify({
|
160
|
+
iconClass: getOptions().iconClasses.warning,
|
161
|
+
message: message,
|
162
|
+
optionsOverride: optionsOverride,
|
163
|
+
title: title
|
164
|
+
});
|
165
|
+
},
|
166
|
+
|
167
|
+
clear = function ($toastElement) {
|
168
|
+
var options = getOptions();
|
169
|
+
var $container = $('#' + options.containerId);
|
170
|
+
if ($toastElement && $(':focus', $toastElement).length === 0) {
|
171
|
+
var removeToast = function () {
|
172
|
+
if ($toastElement.is(':visible')) {
|
173
|
+
return;
|
174
|
+
}
|
175
|
+
$toastElement.remove();
|
176
|
+
if ($container.children().length === 0) {
|
177
|
+
$container.remove();
|
178
|
+
}
|
179
|
+
};
|
180
|
+
$toastElement.fadeOut(options.fadeOut, removeToast);
|
181
|
+
return;
|
182
|
+
}
|
183
|
+
if ($container.length) {
|
184
|
+
$container.fadeOut(options.fadeOut, function () {
|
185
|
+
$container.remove();
|
186
|
+
});
|
187
|
+
}
|
188
|
+
};
|
189
|
+
return {
|
190
|
+
clear: clear,
|
191
|
+
error: error,
|
192
|
+
info: info,
|
193
|
+
options: {},
|
194
|
+
success: success,
|
195
|
+
version: '1.1.2',
|
196
|
+
warning: warning
|
197
|
+
};
|
198
|
+
})();
|
199
|
+
return toastr;
|
200
|
+
});
|
201
|
+
}(typeof define === 'function' && define.amd ? define : function (deps, factory) {
|
202
|
+
if (typeof module !== 'undefined' && module.exports) { //Node
|
203
|
+
module.exports = factory(require(deps[0]));
|
204
|
+
} else {
|
205
|
+
window['toastr'] = factory(window['jQuery']);
|
206
|
+
}
|
207
|
+
}));
|