Commit 7759a050 authored by Paul Asmuth's avatar Paul Asmuth
Browse files

fnordmetric-ui: basic counter widget working

parent 746635b3
Loading
Loading
Loading
Loading
+0 −116
Original line number Diff line number Diff line
FnordMetric.js_api = (function(){

  var timer = null;
  var update_interval = 1000;

  var widgets = [];

  function init() {
    $("*[data-fnordmetric]").each(function(n, e){
      var elem = $(e);
      var wkey = FnordMetric.util.getNextWidgetUID();

      var wupdate = elem.attr("data-autoupdate");
      if (!wupdate) { wupdate = 60; }
      wupdate = parseInt(wupdate, 10);

      if (elem.attr("data-fnordmetric") == "counter") {
        var gauge = elem.attr("data-gauge");
        var offset = elem.attr("data-time-range");
        if (!offset){ offset = 0; }

        widgets.push({
          announce: function(evt) {
            if (evt.widget_key == wkey) {
              for (k in evt.values) {
                elem.attr("data", evt.values[k].value);
                FnordMetric.util.updateNumbers(elem, null, true);
              }
            }
          }
        });

        window.setInterval(function(){
          FnordMetric.publish({
            "type": "widget_request",
            "klass": "NumbersWidget",
            "cmd": "values_for",
            "gauge": gauge,
            "offsets": [offset],
            "widget_key": wkey
          })
        }, wupdate * 1000);
      }

      if (elem.attr("data-fnordmetric") == "timeseries") {
        var widget = FnordMetric.widgets.timeseriesWidget();
        var gauges = elem.attr("data-gauges").split(",");
        var colors = elem.attr("data-colors");
        if (colors) { colors = colors.split(",") } else { colors = []; }
        var series = [];

        var wstyle = elem.attr("data-style");
        if (!wstyle) { wstlye = "line"; }

        var wheight = elem.attr("data-height");
        if (!wheight) { wheight = 240; }
        wheight = parseInt(wheight, 10);

        var wrange = elem.attr("data-time-range");
        if (!wrange) { wrange = 3600; }
        wrange = parseInt(wrange, 10);

        $(gauges).each(function(i, gname){
          var gcolor = colors[i];
          if (!gcolor) { gcolor = "#4572a7"; }
          series.push(
            { "color": gcolor, "data": [{x:0, y:0}], name: gname });
        });

        widget.render({
          elem: elem,
          async_chart: true,
          include_current: true,
          width: 100,
          height: wheight,
          ext: true,
          gauges: gauges,
          series: series,
          default_cardinal: false,
          default_style: wstyle,
          autoupdate: wupdate,
          trange: wrange,
          widget_key: wkey
        });

        widgets.push(widget);
      }

    });
  }

  function socketOpen(){
    console.log("[FnordMetric] connected...");
    init();
  }

  function socketClose(){
    console.log("[FnordMetric] socket closed");
    window.setTimeout(FnordMetric.connect, 1000);
  }

  function socketMessage(raw){
    var evt = JSON.parse(raw.data);

    for (n = 0; n < widgets.length; n++)
      widgets[n].announce(evt);
  }

  return {
    init: init,
    socketOpen: socketOpen,
    socketClose: socketClose,
    socketMessage: socketMessage
  };

}());
+5 −1
Original line number Diff line number Diff line
@@ -49,11 +49,15 @@ var FnordMetric = (function(){
    elem.attr('data-widget-key', widget_key);

    widgets[widget_key] = FnordMetric.widgets[widget_type](elem);
    widgets[widget_key].init();
  }

  function onSocketMessage(raw) {
    var evt = JSON.parse(raw.data);
    var n, evt = JSON.parse(raw.data);
    console.log(evt);

    if (evt.widget_key && widgets[evt.widget_key])
      widgets[evt.widget_key].send(evt);
  }

  function onSocketOpen() {
+0 −32
Original line number Diff line number Diff line
@@ -47,35 +47,3 @@ FnordMetric.util.formatPercentValue = function(value){
FnordMetric.util.generateUUID = function (){
  return Math.floor((1 + Math.random()) * 0x1000000).toString(16);
}

FnordMetric.util.updateCounter = function(trgt_elem, diff_factor){
  var still_running = false;
  if(!diff_factor){ diff_factor = 4; }
  $([trgt_elem]).each(function(){
    var target_val = parseFloat($(this).attr('data-value'));
    var current_val = parseFloat($(this).attr('data-current'));
    if(!current_val){ current_val=0; }
    if(!target_val){ target_val=0; }
    var diff = (target_val-current_val)/diff_factor;
    if((diff > 0) && (diff < 1)){ diff=1; }
    if((diff < 0) && (diff > -1)){ diff=-1; }
    if(target_val != current_val){
      still_running = true;
      var new_val = current_val+diff;
      if((diff > 0) && (new_val > target_val)){ new_val = target_val; }
      if((diff < 0) && (new_val < target_val)){ new_val = target_val; }
      $(this).attr('data-current', new_val);
      var val_txt = FnordMetric.util.formatValue(new_val);
      if ($(this).attr('data-unit')){ val_txt += $(this).attr('data-unit'); }
      $(this).html(val_txt);
    }
  });
  if(still_running){
    (function(te, df, sg){
      window.setTimeout(function(){ 
        FnordMetric.util.updateCounter(te, df, sg); 
      }, 30);
    })(trgt_elem, diff_factor);
  }
}
+78 −1
Original line number Diff line number Diff line
@@ -6,12 +6,89 @@ if (typeof FnordMetric.widgets == 'undefined')


FnordMetric.widgets.counter = function(elem){
  var gauge, offset, refresh_timer, refresh_interval;
  var widget_key = elem.attr("data-widget-key");

  function init() {
    gauge = elem.attr('data-gauge');

    if (!gauge)
      return console.log("[FnordMetric] element is missing the data-gauge attribute");

    offset = elem.attr('data-offset');
    if (!offset) offset = 0;

    requestDataAsync();

    if (refresh_interval = elem.attr('data-autoupdate'))
      refresh_interval = parseFloat(refresh_interval);

    if (refresh_interval)
      refresh_timer = window.setInterval(
        requestDataAsync, refresh_interval * 1000);
  }

  function send(evt) {
    for (vkey in evt.values)
      updateValue(evt.values[vkey].value);
  }

  function updateValue(val) {
    elem.attr('data-value', val);
    updateDisplay();
  }

  function requestDataAsync() {
    FnordMetric.publish({
      "type": "widget_request",
      "klass": "generic",
      "cmd": "values_for",
      "gauge": gauge,
      "offsets": [offset],
      "widget_key": widget_key
    })
  }

  function destroy() {
    console.log("destroy called");
    if (refresh_timer)
      window.clearInterval(refresh_timer);
  }

  function updateDisplay() {
    var target_val = parseFloat(elem.attr('data-value'));
    if(!target_val){ target_val=0; }

    var current_val = parseFloat(elem.attr('data-current'));
    if(!current_val){ current_val=0; }

    var diff = (target_val-current_val) / 4;

    if((diff > 0) && (diff < 1)){ diff=1; }
    if((diff < 0) && (diff > -1)){ diff=-1; }

    if(target_val != current_val){
      var new_val = current_val + diff;

      if((diff > 0) && (new_val > target_val)){ new_val = target_val; }
      if((diff < 0) && (new_val < target_val)){ new_val = target_val; }

      var val_txt = FnordMetric.util.formatValue(new_val);

      if (elem.attr('data-unit'))
        val_txt += elem.attr('data-unit');

      elem.attr('data-current', new_val);
      elem.html(val_txt);

      (function(){
        window.setTimeout(updateDisplay, 30);
      })();
    }
  }

  return {
    init: init,
    send: send,
    destroy: destroy
  };

+1 −1
Original line number Diff line number Diff line
@@ -11,7 +11,7 @@
  </head>
  <body>

    <span data-fnordmetric="counter" data-value="123" id="my_counter">0</span>
    <span data-fnordmetric="counter" data-value="123" data-autoupdate="1" data-gauge="useronline_total" id="my_counter">0</span>
    <script>
      $(document).ready(function(){
        FnordMetric.setup({