static/dhcp/hosts.js
author Tero Marttila <terom@paivola.fi>
Sun, 07 Sep 2014 14:40:31 +0300
changeset 428 956b3d4918bb
parent 205 f7658198c224
permissions -rw-r--r--
pvl.rrd.hosts: also support @domain for the collectd host
/* http://fgnass.github.com/spin.js/ */
$.fn.spin = function(opts) {
  this.each(function() {
    var $this = $(this),
        data = $this.data();

    if (data.spinner) {
      data.spinner.stop();
      delete data.spinner;
    }
    if (opts !== false) {
      data.spinner = new Spinner($.extend({color: $this.css('color')}, opts)).spin(this);
    }
  });
  return this;
};

$.fn.disabled = function (disabled) {
    if (disabled)
        this.attr('disabled', 'disabled');
    else
        this.removeAttr('disabled');

    return this;
};

var Timer = function (interval, cb) {
    var handle = null;

    this.enable = function () {
        if (handle) return;

        handle = window.setInterval(cb, interval);
    };

    this.disable = function () {
        if (!handle) return;

        window.clearInterval(handle);
        handle = null;
    };

    return this;
};

/*
 * Initialize the realtime host table.
 *
 *  table       - Table to manipulate
 *  url         - base URL for ?t=...
 *  filters     - { attr: value } for ?t=...
 *  t           - ?t=... to poll for
 *
 *  $(document).ready(HostsRealtime(Table(...), ...));
 *
 */
function HostsRealtime (table, params) {
    var t = params.t;
    var refreshTimer = Timer(2 * 1000, refresh);

    // XXX: refresh > interval?
    function refresh () {
        console.log("refresh: " + t);
        
        var refresh = $('#refresh').disabled(true);
        var spinner = $('#wrapper').spin();

        var url = params.url;
        var query = $.param($.extend(params.filters, {t: t }), true);   // using traditional encoding for multi-values

        $.getJSON(url, query, function (data) {
            var t1 = data.t;
            var hosts = data.hosts;

            console.log("refresh: " + t + " -> " + t1 + ": " + hosts.length);

            $.each(hosts, function (i, host) {
                table.update(host);
            });
            
            // update
            t = t1;

        }).error(function () {
            alert("Error :("); 

            // disable auto-refresh
            refreshTimer.disable();

        }).complete(function () {
            spinner.spin(false);
            refresh.disabled(false);
        });
    }

    return function () {
        // init
        $("#refresh").click(function () {
            // in case diabled on error
            refreshTimer.enable();
            refresh();
            $("#pause").disabled(false);
        });

        $("#pause").click(function () {
            console.log("pause");
            refreshTimer.disable();
            $("#pause").disabled(true);
        });
        
        // start auto-refresh
        refreshTimer.enable();
    }
}