root / snf-astakos-app / astakos / im / static / im / js / usage.js @ 9b846781
History | View | Annotate | Download (7.3 kB)
1 | 401089d8 | Kostas Papadimitriou | ;(function() {
|
---|---|---|---|
2 | 401089d8 | Kostas Papadimitriou | |
3 | 401089d8 | Kostas Papadimitriou | |
4 | 401089d8 | Kostas Papadimitriou | // helper humanize methods
|
5 | 401089d8 | Kostas Papadimitriou | // https://github.com/taijinlee/humanize/blob/master/humanize.js
|
6 | 401089d8 | Kostas Papadimitriou | humanize = {}; |
7 | 401089d8 | Kostas Papadimitriou | humanize.filesize = function(filesize, kilo, decimals, decPoint, thousandsSep) { |
8 | 401089d8 | Kostas Papadimitriou | kilo = (kilo === undefined) ? 1024 : kilo; |
9 | 401089d8 | Kostas Papadimitriou | decimals = isNaN(decimals) ? 2 : Math.abs(decimals);
|
10 | 401089d8 | Kostas Papadimitriou | decPoint = (decPoint === undefined) ? '.' : decPoint; |
11 | 401089d8 | Kostas Papadimitriou | thousandsSep = (thousandsSep === undefined) ? ',' : thousandsSep; |
12 | 401089d8 | Kostas Papadimitriou | if (filesize <= 0) { return '0 bytes'; } |
13 | 401089d8 | Kostas Papadimitriou | |
14 | 401089d8 | Kostas Papadimitriou | var thresholds = [1]; |
15 | 4e41f055 | Olga Brani | var units = ['bytes', 'KB', 'MB', 'GB', 'TB', 'PB']; |
16 | 401089d8 | Kostas Papadimitriou | if (filesize < kilo) { return humanize.numberFormat(filesize, 0) + ' ' + units[0]; } |
17 | 401089d8 | Kostas Papadimitriou | |
18 | 401089d8 | Kostas Papadimitriou | for (var i = 1; i < units.length; i++) { |
19 | 401089d8 | Kostas Papadimitriou | thresholds[i] = thresholds[i-1] * kilo;
|
20 | 401089d8 | Kostas Papadimitriou | if (filesize < thresholds[i]) {
|
21 | 401089d8 | Kostas Papadimitriou | return humanize.numberFormat(filesize / thresholds[i-1], decimals, decPoint, thousandsSep) + ' ' + units[i-1]; |
22 | 401089d8 | Kostas Papadimitriou | } |
23 | 401089d8 | Kostas Papadimitriou | } |
24 | 401089d8 | Kostas Papadimitriou | |
25 | 401089d8 | Kostas Papadimitriou | // use the last unit if we drop out to here
|
26 | 401089d8 | Kostas Papadimitriou | return humanize.numberFormat(filesize / thresholds[units.length - 1], decimals, decPoint, thousandsSep) + ' ' + units[units.length - 1]; |
27 | 401089d8 | Kostas Papadimitriou | }; |
28 | 401089d8 | Kostas Papadimitriou | humanize.numberFormat = function(number, decimals, decPoint, thousandsSep) { |
29 | 401089d8 | Kostas Papadimitriou | decimals = isNaN(decimals) ? 2 : Math.abs(decimals);
|
30 | 401089d8 | Kostas Papadimitriou | decPoint = (decPoint === undefined) ? '.' : decPoint; |
31 | 401089d8 | Kostas Papadimitriou | thousandsSep = (thousandsSep === undefined) ? ',' : thousandsSep; |
32 | 401089d8 | Kostas Papadimitriou | |
33 | 401089d8 | Kostas Papadimitriou | var sign = number < 0 ? '-' : ''; |
34 | 401089d8 | Kostas Papadimitriou | number = Math.abs(+number || 0);
|
35 | 401089d8 | Kostas Papadimitriou | |
36 | 401089d8 | Kostas Papadimitriou | var intPart = parseInt(number.toFixed(decimals), 10) + ''; |
37 | 401089d8 | Kostas Papadimitriou | var j = intPart.length > 3 ? intPart.length % 3 : 0; |
38 | 401089d8 | Kostas Papadimitriou | |
39 | 401089d8 | Kostas Papadimitriou | return sign + (j ? intPart.substr(0, j) + thousandsSep : '') + intPart.substr(j).replace(/(\d{3})(?=\d)/g, '$1' + thousandsSep) + (decimals ? decPoint + Math.abs(number - intPart).toFixed(decimals).slice(2) : ''); |
40 | 401089d8 | Kostas Papadimitriou | }; |
41 | 401089d8 | Kostas Papadimitriou | |
42 | 4e03ba30 | Kostas Papadimitriou | |
43 | 4e03ba30 | Kostas Papadimitriou | DO_LOG = false
|
44 | 4e03ba30 | Kostas Papadimitriou | LOG = DO_LOG ? _.bind(console.log, console) : function() {};
|
45 | 4e03ba30 | Kostas Papadimitriou | WARN = DO_LOG ? _.bind(console.warn, console) : function() {};
|
46 | 4e03ba30 | Kostas Papadimitriou | |
47 | 4e03ba30 | Kostas Papadimitriou | var default_usage_cls_map = {
|
48 | 4e03ba30 | Kostas Papadimitriou | 0: 'green', |
49 | 4e03ba30 | Kostas Papadimitriou | 33: 'yellow', |
50 | 4e03ba30 | Kostas Papadimitriou | 66: 'red' |
51 | 4e03ba30 | Kostas Papadimitriou | } |
52 | 4e03ba30 | Kostas Papadimitriou | |
53 | 4e03ba30 | Kostas Papadimitriou | function UsageView(settings) { |
54 | 401089d8 | Kostas Papadimitriou | this.settings = settings;
|
55 | 401089d8 | Kostas Papadimitriou | this.url = this.settings.url; |
56 | 401089d8 | Kostas Papadimitriou | this.container = $(this.settings.container); |
57 | 4e03ba30 | Kostas Papadimitriou | this.meta = this.settings.meta; |
58 | 4e03ba30 | Kostas Papadimitriou | this.groups = this.settings.groups; |
59 | 4e03ba30 | Kostas Papadimitriou | this.el = {};
|
60 | 4e03ba30 | Kostas Papadimitriou | this.usage_cls_map = this.settings.usage_cls_map || default_usage_cls_map; |
61 | 4e03ba30 | Kostas Papadimitriou | this.initialize();
|
62 | 401089d8 | Kostas Papadimitriou | } |
63 | 401089d8 | Kostas Papadimitriou | |
64 | 401089d8 | Kostas Papadimitriou | |
65 | 4e03ba30 | Kostas Papadimitriou | _.extend(UsageView.prototype, { |
66 | 4e03ba30 | Kostas Papadimitriou | tpls: {
|
67 | 4e03ba30 | Kostas Papadimitriou | 'main': '<div class="stats clearfix"><ul></ul></div>', |
68 | 4e03ba30 | Kostas Papadimitriou | 'quotas': "#quotaTpl" |
69 | 4e03ba30 | Kostas Papadimitriou | }, |
70 | 401089d8 | Kostas Papadimitriou | |
71 | 4e03ba30 | Kostas Papadimitriou | initialize: function() { |
72 | 4e03ba30 | Kostas Papadimitriou | LOG("Initializing UsageView", this.settings); |
73 | 4e03ba30 | Kostas Papadimitriou | this.initResources();
|
74 | 401089d8 | Kostas Papadimitriou | |
75 | 4e03ba30 | Kostas Papadimitriou | // initial usage set ????
|
76 | 4e03ba30 | Kostas Papadimitriou | this.quotas = {};
|
77 | 4e03ba30 | Kostas Papadimitriou | if (this.settings.quotas && _.keys(this.settings.quotas).length > 0) { |
78 | 4e03ba30 | Kostas Papadimitriou | this.setQuotas(this.settings.quotas); |
79 | 4e03ba30 | Kostas Papadimitriou | } |
80 | 4e03ba30 | Kostas Papadimitriou | this.initLayout();
|
81 | 4e03ba30 | Kostas Papadimitriou | this.updateQuotas();
|
82 | 4e03ba30 | Kostas Papadimitriou | }, |
83 | 4e03ba30 | Kostas Papadimitriou | |
84 | 4e03ba30 | Kostas Papadimitriou | $: function(selector) { |
85 | 4e03ba30 | Kostas Papadimitriou | return this.container; |
86 | 4e03ba30 | Kostas Papadimitriou | }, |
87 | 4e03ba30 | Kostas Papadimitriou | |
88 | 4e03ba30 | Kostas Papadimitriou | render: function(tpl, params) { |
89 | 4e03ba30 | Kostas Papadimitriou | LOG("Rendering", tpl, params);
|
90 | 4e03ba30 | Kostas Papadimitriou | var tpl = this.tpls[tpl]; |
91 | 4e03ba30 | Kostas Papadimitriou | if (/^[#\.]/.exec(tpl)) { |
92 | 4e03ba30 | Kostas Papadimitriou | tpl = $(tpl).html();
|
93 | 4e03ba30 | Kostas Papadimitriou | } |
94 | 4e03ba30 | Kostas Papadimitriou | var rendered = Mustache.render(tpl, params);
|
95 | 4e03ba30 | Kostas Papadimitriou | return $(rendered); |
96 | 4e03ba30 | Kostas Papadimitriou | }, |
97 | 4e03ba30 | Kostas Papadimitriou | |
98 | 4e03ba30 | Kostas Papadimitriou | initLayout: function() { |
99 | 4e03ba30 | Kostas Papadimitriou | LOG("Initializing layout");
|
100 | 4e03ba30 | Kostas Papadimitriou | this.el.main = this.render('main'); |
101 | 4e03ba30 | Kostas Papadimitriou | this.container.append(this.el.main); |
102 | 4e03ba30 | Kostas Papadimitriou | var ul = this.container.find("ul"); |
103 | 4e03ba30 | Kostas Papadimitriou | this.el.list = this.render('quotas', { |
104 | 37d59b27 | Kostas Papadimitriou | 'resources': this.resources_ordered |
105 | 4e03ba30 | Kostas Papadimitriou | }); |
106 | 4e03ba30 | Kostas Papadimitriou | ul.append(this.el.list);
|
107 | 4e03ba30 | Kostas Papadimitriou | }, |
108 | 4e03ba30 | Kostas Papadimitriou | |
109 | 4e03ba30 | Kostas Papadimitriou | initResources: function() { |
110 | 4e03ba30 | Kostas Papadimitriou | var ordered = this.meta.resources_order; |
111 | 4e03ba30 | Kostas Papadimitriou | var resources = {};
|
112 | 4e03ba30 | Kostas Papadimitriou | var resources_ordered = [];
|
113 | 4e03ba30 | Kostas Papadimitriou | |
114 | 4e03ba30 | Kostas Papadimitriou | _.each(this.meta.resources, function(group, index) { |
115 | 4e03ba30 | Kostas Papadimitriou | _.each(group[1], function(resource, rindex) { |
116 | 4e03ba30 | Kostas Papadimitriou | var resource_index = ordered.length;
|
117 | 4e03ba30 | Kostas Papadimitriou | if (!_.contains(ordered, resource.name)) {
|
118 | 4e03ba30 | Kostas Papadimitriou | ordered.push(resource.name); |
119 | 4e03ba30 | Kostas Papadimitriou | } else {
|
120 | 4e03ba30 | Kostas Papadimitriou | resource_index = ordered.indexOf(resource.name); |
121 | 4e03ba30 | Kostas Papadimitriou | } |
122 | 4e03ba30 | Kostas Papadimitriou | resource.index = resource_index; |
123 | 4e03ba30 | Kostas Papadimitriou | resource.resource_name = resource.name.split(".")[1]; |
124 | 4e03ba30 | Kostas Papadimitriou | resources[resource.name] = resource; |
125 | 4e03ba30 | Kostas Papadimitriou | }) |
126 | 4e03ba30 | Kostas Papadimitriou | }); |
127 | 4e03ba30 | Kostas Papadimitriou | |
128 | 37d59b27 | Kostas Papadimitriou | resources_ordered = _.filter(_.map(ordered, |
129 | 37d59b27 | Kostas Papadimitriou | function(rk) {
|
130 | 37d59b27 | Kostas Papadimitriou | return resources[rk]
|
131 | 37d59b27 | Kostas Papadimitriou | }), |
132 | 37d59b27 | Kostas Papadimitriou | function(i) { return i}); |
133 | 4e03ba30 | Kostas Papadimitriou | this.resources = resources;
|
134 | 4e03ba30 | Kostas Papadimitriou | this.resources_ordered = resources_ordered;
|
135 | 4e03ba30 | Kostas Papadimitriou | |
136 | 4e03ba30 | Kostas Papadimitriou | LOG("Resources initialized", this.resources_ordered, this.resources); |
137 | 4e03ba30 | Kostas Papadimitriou | }, |
138 | 4e03ba30 | Kostas Papadimitriou | |
139 | 4e03ba30 | Kostas Papadimitriou | updateLayout: function() { |
140 | 4e03ba30 | Kostas Papadimitriou | LOG("Updating layout", this.quotas); |
141 | 4e03ba30 | Kostas Papadimitriou | var self = this; |
142 | 4e03ba30 | Kostas Papadimitriou | _.each(this.quotas, function(value, key) { |
143 | 4e03ba30 | Kostas Papadimitriou | var usage = self.getUsage(key);
|
144 | 37d59b27 | Kostas Papadimitriou | if (!usage) { return } |
145 | 4e03ba30 | Kostas Papadimitriou | var el = self.$().find("li[data-resource='"+key+"']"); |
146 | 4e03ba30 | Kostas Papadimitriou | self.updateResourceElement(el, usage); |
147 | 4e03ba30 | Kostas Papadimitriou | }) |
148 | 4e03ba30 | Kostas Papadimitriou | }, |
149 | 4e03ba30 | Kostas Papadimitriou | |
150 | 4e03ba30 | Kostas Papadimitriou | updateResourceElement: function(el, usage) { |
151 | 4e03ba30 | Kostas Papadimitriou | el.find(".currValue").text(usage.curr);
|
152 | 4e03ba30 | Kostas Papadimitriou | el.find(".maxValue").text(usage.max);
|
153 | 4e03ba30 | Kostas Papadimitriou | el.find(".bar span").css({width:usage.perc+"%"}); |
154 | 4e03ba30 | Kostas Papadimitriou | el.find(".bar .value").text(usage.perc+"%"); |
155 | 4e03ba30 | Kostas Papadimitriou | var left = usage.label_left == 'auto' ? |
156 | 4e03ba30 | Kostas Papadimitriou | usage.label_left : usage.label_left + "%";
|
157 | 4e03ba30 | Kostas Papadimitriou | el.find(".bar .value").css({left:left}); |
158 | 4e03ba30 | Kostas Papadimitriou | el.find(".bar .value").css({color:usage.label_color}); |
159 | 4e03ba30 | Kostas Papadimitriou | el.removeClass("green yellow red");
|
160 | 4e03ba30 | Kostas Papadimitriou | el.addClass(usage.cls); |
161 | 4e03ba30 | Kostas Papadimitriou | }, |
162 | 4e03ba30 | Kostas Papadimitriou | |
163 | 4e03ba30 | Kostas Papadimitriou | getUsage: function(resource_name) { |
164 | 4e03ba30 | Kostas Papadimitriou | var resource = this.quotas[resource_name]; |
165 | 4e03ba30 | Kostas Papadimitriou | var resource_meta = this.resources[resource_name]; |
166 | 37d59b27 | Kostas Papadimitriou | if (!resource_meta) { return } |
167 | 4e03ba30 | Kostas Papadimitriou | var value, limit, percentage;
|
168 | 4e03ba30 | Kostas Papadimitriou | |
169 | 4e03ba30 | Kostas Papadimitriou | limit = resource.limit; |
170 | 480974e6 | Giorgos Korfiatis | value = resource.usage; |
171 | 4e03ba30 | Kostas Papadimitriou | if (value < 0 ) { value = 0 } |
172 | 4e03ba30 | Kostas Papadimitriou | |
173 | 4e03ba30 | Kostas Papadimitriou | percentage = (value/limit) * 100;
|
174 | 4e03ba30 | Kostas Papadimitriou | if (value == 0) { percentage = 0 } |
175 | 480974e6 | Giorgos Korfiatis | if (value > limit) {
|
176 | 4e03ba30 | Kostas Papadimitriou | percentage = 100;
|
177 | 4e03ba30 | Kostas Papadimitriou | } |
178 | 37d59b27 | Kostas Papadimitriou | |
179 | 4e03ba30 | Kostas Papadimitriou | if (resource_meta.unit == 'bytes') { |
180 | 4e03ba30 | Kostas Papadimitriou | value = humanize.filesize(value); |
181 | 4e03ba30 | Kostas Papadimitriou | limit = humanize.filesize(limit); |
182 | 4e03ba30 | Kostas Papadimitriou | } |
183 | 401089d8 | Kostas Papadimitriou | |
184 | 4e03ba30 | Kostas Papadimitriou | var cls = 'green'; |
185 | 4e03ba30 | Kostas Papadimitriou | _.each(this.usage_cls_map, function(ucls, u){ |
186 | 4e03ba30 | Kostas Papadimitriou | if (percentage >= u) {
|
187 | 4e03ba30 | Kostas Papadimitriou | cls = ucls |
188 | 4e03ba30 | Kostas Papadimitriou | } |
189 | 4e03ba30 | Kostas Papadimitriou | }) |
190 | 401089d8 | Kostas Papadimitriou | |
191 | 4e03ba30 | Kostas Papadimitriou | var label_left = percentage >= 30 ? percentage - 17 : 'auto'; |
192 | 4e03ba30 | Kostas Papadimitriou | var label_col = label_left == 'auto' ? 'inherit' : '#fff'; |
193 | 4e03ba30 | Kostas Papadimitriou | percentage = humanize.numberFormat(percentage, 0);
|
194 | 4e03ba30 | Kostas Papadimitriou | qdata = {'curr': value, 'max': limit, 'perc': percentage, 'cls': cls, |
195 | 4e03ba30 | Kostas Papadimitriou | 'label_left': label_left, 'label_color': label_col} |
196 | 4e03ba30 | Kostas Papadimitriou | _.extend(qdata, resource); |
197 | 4e03ba30 | Kostas Papadimitriou | return qdata
|
198 | 4e03ba30 | Kostas Papadimitriou | }, |
199 | 4e03ba30 | Kostas Papadimitriou | |
200 | 4e03ba30 | Kostas Papadimitriou | setQuotas: function(data) { |
201 | 4e03ba30 | Kostas Papadimitriou | LOG("Set quotas", data);
|
202 | 4e03ba30 | Kostas Papadimitriou | var self = this; |
203 | 4e03ba30 | Kostas Papadimitriou | this.quotas = data;
|
204 | 4e03ba30 | Kostas Papadimitriou | _.each(this.quotas, function(v, k) { |
205 | 4e03ba30 | Kostas Papadimitriou | var r = self.resources[k];
|
206 | 4e03ba30 | Kostas Papadimitriou | var usage = self.getUsage(k);
|
207 | 37d59b27 | Kostas Papadimitriou | if (!usage) { return } |
208 | 4e03ba30 | Kostas Papadimitriou | r.usage = usage; |
209 | 4e03ba30 | Kostas Papadimitriou | self.resources[k].usage = usage; |
210 | 37d59b27 | Kostas Papadimitriou | if (!self.resources_ordered[r.index]) { return } |
211 | 4e03ba30 | Kostas Papadimitriou | self.resources_ordered[r.index].usage = usage; |
212 | 4e03ba30 | Kostas Papadimitriou | }); |
213 | 4e03ba30 | Kostas Papadimitriou | }, |
214 | 4e03ba30 | Kostas Papadimitriou | |
215 | 4e03ba30 | Kostas Papadimitriou | _ajaxOptions: function() { |
216 | 4e03ba30 | Kostas Papadimitriou | var token = $.cookie(this.settings.cookie_name).split("|")[1]; |
217 | 4e03ba30 | Kostas Papadimitriou | return {
|
218 | 4e03ba30 | Kostas Papadimitriou | 'url': this.url, |
219 | 4e03ba30 | Kostas Papadimitriou | 'headers': {
|
220 | 4e03ba30 | Kostas Papadimitriou | 'X-Auth-Token': token
|
221 | 4e03ba30 | Kostas Papadimitriou | }, |
222 | 4e03ba30 | Kostas Papadimitriou | } |
223 | 4e03ba30 | Kostas Papadimitriou | }, |
224 | 401089d8 | Kostas Papadimitriou | |
225 | 4e03ba30 | Kostas Papadimitriou | updateQuotas: function() { |
226 | 4e03ba30 | Kostas Papadimitriou | LOG("Updating quotas");
|
227 | 4e03ba30 | Kostas Papadimitriou | var self = this; |
228 | 4e03ba30 | Kostas Papadimitriou | this.getQuotas(function(data){ |
229 | 4e03ba30 | Kostas Papadimitriou | self.setQuotas(data.system); |
230 | 4e03ba30 | Kostas Papadimitriou | self.updateLayout(); |
231 | 4e03ba30 | Kostas Papadimitriou | }) |
232 | 4e03ba30 | Kostas Papadimitriou | }, |
233 | 4e03ba30 | Kostas Papadimitriou | |
234 | 4e03ba30 | Kostas Papadimitriou | getQuotas: function(callback) { |
235 | 4e03ba30 | Kostas Papadimitriou | var options = this._ajaxOptions(); |
236 | 4e03ba30 | Kostas Papadimitriou | options.success = callback; |
237 | 4e03ba30 | Kostas Papadimitriou | LOG("Calling quotas API", options);
|
238 | 4e03ba30 | Kostas Papadimitriou | $.ajax(options);
|
239 | 401089d8 | Kostas Papadimitriou | } |
240 | 401089d8 | Kostas Papadimitriou | |
241 | 4e03ba30 | Kostas Papadimitriou | }); |
242 | 401089d8 | Kostas Papadimitriou | |
243 | 4e03ba30 | Kostas Papadimitriou | window.UsageView = UsageView; |
244 | 401089d8 | Kostas Papadimitriou | })(); |