Statistics
| Branch: | Tag: | Revision:

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
})();