]> arthur.barton.de Git - netdata.git/blobdiff - web/index.html
allow functions to be given for easypiechart barColor; fixes #1089; fixes #958
[netdata.git] / web / index.html
index 3cd91a53a2858786cde124aa9550f3017d89c81c..0847ff1f7b40209fcc649e52ef1b9ce4706be107 100644 (file)
     <meta name="apple-mobile-web-app-status-bar-style" content="black-translucent">
     <meta name="author" content="costa@tsaousis.gr">
 
-    <link rel="shortcut icon" href="images/seo-performance-multi-size.ico">
+    <!-- <link rel="shortcut icon" href="images/seo-performance-multi-size.ico"> -->
 
-    <link rel="apple-touch-icon" href="images/seo-performance-72.png">
-    <link rel="apple-touch-icon" sizes="72x72" href="images/seo-performance-72.png">
-    <link rel="apple-touch-icon" sizes="114x114" href="images/seo-performance-114.png">
+    <!-- <link rel="apple-touch-icon" href="images/seo-performance-72.png"> -->
+    <!-- <link rel="apple-touch-icon" sizes="72x72" href="images/seo-performance-72.png"> -->
+    <!-- <link rel="apple-touch-icon" sizes="114x114" href="images/seo-performance-114.png"> -->
 
-    <link rel="icon" type="image/png" sizes="512x512" href="images/seo-performance-512.png">
-    <link rel="icon" type="image/png" sizes="256x256" href="images/seo-performance-256.png">
-    <link rel="icon" type="image/png" sizes="128x128" href="images/seo-performance-128.png">
-    <link rel="icon" type="image/png" sizes="64x64" href="images/seo-performance-64.png">
-    <link rel="icon" type="image/png" sizes="48x48" href="images/seo-performance-48.png">
-    <link rel="icon" type="image/png" sizes="32x32" href="images/seo-performance-32.png">
-    <link rel="icon" type="image/png" sizes="24x24" href="images/seo-performance-24.png">
-    <link rel="icon" type="image/png" sizes="16x16" href="images/seo-performance-16.png">
+    <!-- <link rel="icon" type="image/png" sizes="512x512" href="images/seo-performance-512.png"> -->
+    <!-- <link rel="icon" type="image/png" sizes="256x256" href="images/seo-performance-256.png"> -->
+    <!-- <link rel="icon" type="image/png" sizes="128x128" href="images/seo-performance-128.png"> -->
+    <!-- <link rel="icon" type="image/png" sizes="64x64" href="images/seo-performance-64.png"> -->
+    <!-- <link rel="icon" type="image/png" sizes="48x48" href="images/seo-performance-48.png"> -->
+    <!-- <link rel="icon" type="image/png" sizes="24x24" href="images/seo-performance-24.png"> -->
+    <!-- <link rel="icon" type="image/png" sizes="16x16" href="images/seo-performance-16.png"> -->
+    <!-- <link rel="icon" type="image/png" sizes="32x32" href="images/seo-performance-32.png"> -->
+
+    <link rel="icon" type="image/png" sizes="32x32" href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAACNklEQVRYhcXXv2tUQRAH8M+FEIJISBHCIWIhIQSUILERi4AiiqCggiIiomAjlhaC4j+ghYWISgqNohZaCBZBC8Ei8QdEUCutFBsxCBqDYkgci/cunkfuJffjJQPD8mZm5/vd2WV2HzlJ0Bs8CvrywsgCHwy+BpGOg0sJfjj4nYKX9FdwKG9gwZlgtgK8pLOpPxfw1mCoCnClDgWtzQTvCEYWCV7SkWAlFBoEb8dlDKBF8t2bMWUSH/AHr3CiEfz5CPUusPJLkRCdk5ZqyeqUrQv4R7E5TwK7M3zTeIKduRAIitiWEfIY69GdCwGcRFuG/xqONRkzkaA7+J5x+MaDtWmHvJ4HgeEM8Nn0bridfv9HoOFyBAdwJCPkqqTzHWwUaz7wgeBHxupfBKuCj2W25mxBsCGYyAB/FxTT27HcPlyep64tCLbjKbqqhLzBlgKfF8pVE4FgRXABI+ioEnYfOyzcFWsCbg+OV+xlpU4ER4O+4HVwL51b3xYEXcGu4Ao+YQhr5gmdxHmsQyfG0b/YxbWmLfRWmnxa0s06VbTMCpnBS9zFzQKTwR5cXCzwHIE02Sl8wSZsRI/kgLVJqjSd+t9LVjiG1diPszhdK3A5gR48k5zYMTwscC59sfT799CYKvA8EttbSeXgTr3gJQKl91kR+yTlvyG5uUbLYh9gb+ovltkb6qYtNSRo3kOygsBSzGlKsubf43USWLYK5CLLXoFWyU/CtzLbVDpW2n+m40yN9ukqdvAX9ac/EIgOapcAAAAASUVORK5CYII=">
 
     <meta property="og:locale" content="en_US" />
-    <meta property="og:image" content="http://my-netdata.io/images/post.png"/>
+    <meta property="og:image" content="https://cloud.githubusercontent.com/assets/2662304/19168687/f6a567be-8c19-11e6-8561-ce8d589e8346.gif"/>
     <meta property="og:url" content="http://my-netdata.io/"/>
     <meta property="og:type" content="website"/>
     <meta property="og:site_name" content="netdata"/>
         var error = 'failed';
 
         if(document.location.toString().startsWith('http://') && url.toString().startsWith('https://'))
-                // we penalize https only if the current url is http
-                // to allow the user walk through all its servers.
-                penaldy = 500;
+            // we penalize https only if the current url is http
+            // to allow the user walk through all its servers.
+            penaldy = 500;
 
         else if(document.location.toString().startsWith('https://') && url.toString().startsWith('http://'))
             error = 'can\'t check';
                             gotoServerMiddleClick = false;
                             document.getElementById('gotoServerResponse').innerHTML = '<b>Opening new window to ' + NETDATA.registry.machines[guid].name + '<br/><a href="' + finalURL + '">' + url + '</a></b><br/>(check your pop-up blocker if it fails)';
                         }
-                        else
+                        else {
+                            document.getElementById('gotoServerResponse').innerHTML += 'found it! It is at:<br/><small>' + url + '</small>';
                             document.location = finalURL;
+                        }
                     }
                 }
                 else {
             if(gotoServerStop === false) {
                 document.getElementById('gotoServerResponse').innerHTML = '<b>Added all the known URLs for this machine.</b>';
                 NETDATA.registry.search(guid, function(data) {
-                    console.log(data);
+                    // console.log(data);
                     len = data.urls.length;
                     while(len--) {
                         var url = data.urls[len][1];
-                        console.log(url);
+                        // console.log(url);
                         if(typeof checked[url] === 'undefined') {
                             gotoServerValidateRemaining++;
                             checked[url] = true;
     // scroll to a section, without changing the browser history
 
     function scrollToId(hash) {
-        if(hash && hash != '') {
+        if(hash && hash != '' && document.getElementById(hash) !== null) {
             var offset = $('#' + hash).offset();
             if(typeof offset !== 'undefined')
                 $('html, body').animate({ scrollTop: offset.top }, 0);
     function loadBootstrapTable(callback) {
         if(bootstrapTableLoaded === false) {
             bootstrapTableLoaded === true;
-            loadJs(NETDATA.serverDefault + 'lib/bootstrap-table.min.js?v1.11.0', function() {
-                loadJs(NETDATA.serverDefault + 'lib/bootstrap-table-export.min.js?v1.11.0', function() {
-                    loadJs(NETDATA.serverDefault + 'lib/tableExport.js', callback);
+            loadJs(NETDATA.serverDefault + 'lib/bootstrap-table-1.11.0.min.js', function() {
+                loadJs(NETDATA.serverDefault + 'lib/bootstrap-table-export-1.11.0.min.js', function() {
+                    loadJs(NETDATA.serverDefault + 'lib/tableExport-1.6.0.min.js', callback);
                 })
             });
         }
                 return t.toLocaleDateString() + space + t.toLocaleTimeString();
             }
 
-            function seconds4human(seconds, sfx, space) {
-                if(typeof space === 'undefined')
-                    space = '&nbsp;';
+            function seconds4human(seconds, options) {
+                var default_options = {
+                    now: 'now',
+                    space: '&nbsp;',
+                    negative_suffix: 'ago',
+                    hour: 'hour',
+                    hours: 'hours',
+                    minute: 'minute',
+                    minutes: 'minutes',
+                    second: 'second',
+                    seconds: 'seconds',
+                    and: 'and'
+                };
+
+                if(typeof options !== 'object')
+                    options = default_options;
+                else {
+                    var x;
+                    for(x in default_options) {
+                        if(typeof options[x] !== 'string')
+                            options[x] = default_options[x];
+                    }
+                }
+
+                if(typeof seconds === 'string')
+                    seconds = parseInt(seconds);
 
                 if(seconds === 0)
-                    return 'now';
+                    return options.now;
 
                 var suffix = '';
                 if(seconds < 0) {
                     seconds = -seconds;
-                    if(sfx) suffix = space + 'ago';
+                    if(options.negative_suffix !== '') suffix = options.space + options.negative_suffix;
                 }
 
                 var hours = Math.floor(seconds / 3600);
 
                 var txt = '';
                 
-                if(hours > 1) txt += hours.toString() + space + 'hours';
-                else if(hours === 1) txt += hours.toString() + space + 'hour';
+                if(hours > 1) txt += hours.toString() + options.space + options.hours;
+                else if(hours === 1) txt += hours.toString() + options.space + options.hour;
 
                 if(hours > 0 && minutes > 0 && seconds == 0)
-                    txt += space + 'and' + space;
+                    txt += options.space + options.and + options.space;
                 else if(hours > 0 && minutes > 0 && seconds > 0)
-                    txt += ',' + space;
+                    txt += ',' + options.space;
 
-                if(minutes > 1) txt += minutes.toString() + space + 'minutes';
-                else if(minutes === 1) txt += minutes.toString() + space + 'minute';
+                if(minutes > 1) txt += minutes.toString() + options.space + options.minutes;
+                else if(minutes === 1) txt += minutes.toString() + options.space + options.minute;
 
                 if((minutes > 0 || minutes > 0) && seconds > 0)
-                    txt += space + 'and' + space;
+                    txt += options.space + options.and + options.space;
 
-                if(seconds > 1) txt += seconds.toString() + space + 'seconds';
-                else if(seconds === 1) txt += seconds.toString() + space + 'second';
+                if(seconds > 1) txt += Math.floor(seconds).toString() + options.space + options.seconds;
+                else if(seconds === 1) txt += Math.floor(seconds).toString() + options.space + options.second;
 
                 return txt + suffix;
             }
 
                 return '<code>' + alarm.lookup_method + '</code> '
                     + dimensions + ', of chart <code>' + alarm.chart + '</code>'
-                    + ', starting <code>' + seconds4human(alarm.lookup_after + alarm.lookup_before, true) + '</code> and up to <code>' + seconds4human(alarm.lookup_before, true) + '</code>'
+                    + ', starting <code>' + seconds4human(alarm.lookup_after + alarm.lookup_before) + '</code> and up to <code>' + seconds4human(alarm.lookup_before) + '</code>'
                     + ((alarm.lookup_options)?(', with options <code>' + alarm.lookup_options.replace(' ', ',&nbsp;') + '</code>'):'')
                     + '.';
             }
                 var delay = '';
                 if((alarm.delay_up_duration > 0 || alarm.delay_down_duration > 0) && alarm.delay_multiplier != 0 && alarm.delay_max_duration > 0) {
                     if(alarm.delay_up_duration == alarm.delay_down_duration) {
-                        delay += '<small><br/>hysteresis ' + seconds4human(alarm.delay_up_duration);
+                        delay += '<small><br/>hysteresis ' + seconds4human(alarm.delay_up_duration, { negative_suffix: '' });
                     }
                     else {
                         delay = '<small><br/>hysteresis ';
                         if(alarm.delay_up_duration > 0) {
-                            delay += 'on&nbsp;escalation&nbsp;<code>' + seconds4human(alarm.delay_up_duration) + '</code>, ';
+                            delay += 'on&nbsp;escalation&nbsp;<code>' + seconds4human(alarm.delay_up_duration, { negative_suffix: '' }) + '</code>, ';
                         }
                         if(alarm.delay_down_duration > 0) {
-                            delay += 'on&nbsp;recovery&nbsp;<code>' + seconds4human(alarm.delay_down_duration) + '</code>, ';
+                            delay += 'on&nbsp;recovery&nbsp;<code>' + seconds4human(alarm.delay_down_duration, { negative_suffix: '' }) + '</code>, ';
                         }
                     }
                     if(alarm.delay_multiplier != 1.0) {
                         delay += 'multiplied&nbsp;by&nbsp;<code>' + alarm.delay_multiplier.toString() + '</code>';
-                        delay += ',&nbsp;up&nbsp;to&nbsp;<code>' + seconds4human(alarm.delay_max_duration) + '</code>';
+                        delay += ',&nbsp;up&nbsp;to&nbsp;<code>' + seconds4human(alarm.delay_max_duration, { negative_suffix: '' }) + '</code>';
                     }
                     delay += '</small>';
                 }
 
-                html += '<tr><td width="10%" style="text-align:right">check&nbsp;every</td><td>' + seconds4human(alarm.update_every) + '</td></tr>'
+                html += '<tr><td width="10%" style="text-align:right">check&nbsp;every</td><td>' + seconds4human(alarm.update_every, { negative_suffix: '' }) + '</td></tr>'
                     + '<tr><td width="10%" style="text-align:right">execute</td><td><span style="font-family: monospace;">' + alarm.exec + '</span>' + delay + '</td></tr>'
                     + '<tr><td width="10%" style="text-align:right">source</td><td><span style="font-family: monospace;">' + alarm.source + '</span></td></tr>'
                     + '</table></td></tr>';
                             field: 'when',
                             title: 'Event Date',
                             valign: 'middle',
+                            titleTooltip: 'The date and time the even took place',
                             switchable: false,
                             sortable: true,
                             formatter: function(value, row, index) { return timestamp4human(value, ' '); },
                             field: 'hostname',
                             title: 'Host',
                             valign: 'middle',
+                            titleTooltip: 'The host that generated this event',
                             visible: false,
                             sortable: true
                         },
                         {
                             field: 'unique_id',
                             title: 'Unique ID',
+                            titleTooltip: 'The host unique ID for this event',
                             valign: 'middle',
                             visible: false,
                             sortable: true
                         {
                             field: 'alarm_id',
                             title: 'Alarm ID',
+                            titleTooltip: 'The ID of the alarm that generated this event',
                             valign: 'middle',
                             visible: false,
                             sortable: true
                         {
                             field: 'alarm_event_id',
                             title: 'Alarm Event ID',
+                            titleTooltip: 'The incremental ID of this event for the given alarm',
                             valign: 'middle',
                             visible: false,
                             sortable: true
                         {
                             field: 'chart',
                             title: 'Chart',
+                            titleTooltip: 'The chart the alarm is attached to',
                             valign: 'middle',
                             switchable: false,
                             sortable: true
                         {
                             field: 'family',
                             title: 'Family',
+                            titleTooltip: 'The family of the chart the alarm is attached to',
                             valign: 'middle',
                             visible: false,
                             sortable: true
                         {
                             field: 'name',
                             title: 'Alarm',
+                            titleTooltip: 'The alarm name that generated this event',
                             formatter: function(value, row, index) {
                                 return value.toString().replace(/_/g, ' ');
                             },
                         {
                             field: 'old_value',
                             title: 'Old Value',
+                            titleTooltip: 'The value of the alarm, just before this event',
                             valign: 'middle',
                             visible: false,
                             sortable: true
                         {
                             field: 'value',
                             title: 'Value',
+                            titleTooltip: 'The value of the alarm, that triggered this event',
                             formatter: function(value, row, index) {
                                 return ((value !== null)?Math.floor(value):'NaN').toString();
                             },
                         {
                             field: 'units',
                             title: 'Units',
+                            titleTooltip: 'The units of the value of the alarm',
                             valign: 'middle',
                             sortable: true
                         },
                         {
                             field: 'old_status',
                             title: 'Old Status',
+                            titleTooltip: 'The status of the alarm, just before this event',
                             valign: 'middle',
                             visible: false,
                             sortable: true
                         {
                             field: 'status',
                             title: 'Status',
+                            titleTooltip: 'The status of the alarm, that was set due to this event',
                             valign: 'middle',
                             switchable: false,
                             sortable: true
                         },
                         {
                             field: 'duration',
-                            title: 'Duration',
-                            formatter: function(value, row, index) { return seconds4human(value, false, ' '); },
+                            title: 'Last Duration',
+                            titleTooltip: 'The duration the alarm was at its previous state, just before this event',
+                            formatter: function(value, row, index) { return seconds4human(value, { negative_suffix: '', space: ' ', now: 'no time' }); },
                             valign: 'middle',
                             visible: false,
                             sortable: true
                         {
                             field: 'non_clear_duration',
                             title: 'Raised Duration',
-                            formatter: function(value, row, index) { return seconds4human(value, false, ' '); },
+                            titleTooltip: 'The duration the alarm was raised, just before this event',
+                            formatter: function(value, row, index) { return seconds4human(value, { negative_suffix: '', space: ' ', now: 'no time' }); },
                             valign: 'middle',
                             visible: false,
                             sortable: true
                         {
                             field: 'recipient',
                             title: 'Recipient',
+                            titleTooltip: 'The recipient of this event',
                             valign: 'middle',
                             visible: false,
                             sortable: true
                         {
                             field: 'processed',
                             title: 'Processed Status',
+                            titleTooltip: 'True when this event is processed',
                             valign: 'middle',
                             visible: false,
                             sortable: true
                         {
                             field: 'updated',
                             title: 'Updated Status',
+                            titleTooltip: 'True when this event has been updated by another event',
                             valign: 'middle',
                             visible: false,
                             sortable: true
                         {
                             field: 'updated_by_id',
                             title: 'Updated By ID',
+                            titleTooltip: 'The unique ID of the event that obsoleted this one',
                             valign: 'middle',
                             visible: false,
                             sortable: true
                         {
                             field: 'updates_id',
                             title: 'Updates ID',
+                            titleTooltip: 'The unique ID of the event obsoleted because of this event',
                             valign: 'middle',
                             visible: false,
                             sortable: true
                         {
                             field: 'exec',
                             title: 'Script',
+                            titleTooltip: 'The script to handle the event notification',
                             valign: 'middle',
                             visible: false,
                             sortable: true
                         {
                             field: 'exec_run',
                             title: 'Script Run At',
+                            titleTooltip: 'The date and time the script has been ran',
                             formatter: function(value, row, index) { return timestamp4human(value, ' '); },
                             valign: 'middle',
                             visible: false,
                         {
                             field: 'exec_code',
                             title: 'Script Return Value',
+                            titleTooltip: 'The return code of the script',
                             valign: 'middle',
                             visible: false,
                             sortable: true
                         {
                             field: 'delay',
                             title: 'Script Delay',
-                            formatter: function(value, row, index) { return seconds4human(value, false, ' '); },
+                            titleTooltip: 'The hysteresis of the notification',
+                            formatter: function(value, row, index) { return seconds4human(value, { negative_suffix: '', space: ' ', now: 'no time' }); },
                             valign: 'middle',
                             visible: false,
                             sortable: true
                         {
                             field: 'delay_up_to_timestamp',
                             title: 'Script Delay Run At',
+                            titleTooltip: 'The date and time the script should be run, after hysteresis',
                             formatter: function(value, row, index) { return timestamp4human(value, ' '); },
                             valign: 'middle',
                             visible: false,
                         {
                             field: 'info',
                             title: 'Description',
+                            titleTooltip: 'A short description of the alarm',
                             valign: 'middle',
                             visible: false,
                             sortable: true
                         {
                             field: 'source',
                             title: 'Alarm Source',
+                            titleTooltip: 'The source of configuration of the alarm',
                             valign: 'middle',
                             visible: false,
                             sortable: true
     // callback to add the dashboard info to the
     // parallel javascript downloader in netdata
     var netdataPrepCallback = function() {
+        NETDATA.requiredCSS.push({
+            url: NETDATA.serverDefault + 'css/bootstrap-toggle-2.2.2.min.css',
+            isAlreadyLoaded: function() { return false; }
+        });
+
         NETDATA.requiredJs.push({
-            url: NETDATA.serverDefault + 'lib/bootstrap-toggle.min.js',
+            url: NETDATA.serverDefault + 'lib/bootstrap-toggle-2.2.2.min.js',
             isAlreadyLoaded: function() { return false; }
         });
 
         NETDATA.requiredJs.push({
-            url: NETDATA.serverDefault + 'dashboard_info.js?v58',
+            url: NETDATA.serverDefault + 'dashboard_info.js?v20161002-1',
             async: false,
             isAlreadyLoaded: function() { return false; }
         });
     </div>
 </body>
 </html>
-<script type="text/javascript" src="dashboard.js?v58"></script>
+<script type="text/javascript" src="dashboard.js?v20161009-1"></script>