diff --git a/public/css/minimal-icons-codes.css b/public/css/minimal-icons-codes.css
new file mode 100644
index 0000000..c266dc8
--- /dev/null
+++ b/public/css/minimal-icons-codes.css
@@ -0,0 +1,20 @@
+
+.icon-truck:before { content: '\e800'; } /* '' */
+.icon-database:before { content: '\e801'; } /* '' */
+.icon-mining:before { content: '\e802'; } /* '' */
+.icon-check:before { content: '\e803'; } /* '' */
+.icon-cancel:before { content: '\e804'; } /* '' */
+.icon-loader:before { content: '\e805'; } /* '' */
+.icon-check-o:before { content: '\e806'; } /* '' */
+.icon-cancel-o:before { content: '\e807'; } /* '' */
+.icon-warning-o:before { content: '\e808'; } /* '' */
+.icon-network:before { content: '\e809'; } /* '' */
+.icon-block:before { content: '\e80a'; } /* '' */
+.icon-bulb:before { content: '\e80b'; } /* '' */
+.icon-node:before { content: '\e80c'; } /* '' */
+.icon-laptop:before { content: '\e80d'; } /* '' */
+.icon-time:before { content: '\e80e'; } /* '' */
+.icon-clock:before { content: '\e80f'; } /* '' */
+.icon-group:before { content: '\e810'; } /* '' */
+.icon-gas:before { content: '\e811'; } /* '' */
+.icon-difficulty:before { content: '\e812'; } /* '' */
\ No newline at end of file
diff --git a/public/css/minimal-icons-embedded.css b/public/css/minimal-icons-embedded.css
new file mode 100644
index 0000000..e54ec05
--- /dev/null
+++ b/public/css/minimal-icons-embedded.css
@@ -0,0 +1,73 @@
+@font-face {
+ font-family: 'minimal-icons';
+ src: url('../fonts/minimal-icons.eot?82572300');
+ src: url('../fonts/minimal-icons.eot?82572300#iefix') format('embedded-opentype'),
+ url('../fonts/minimal-icons.svg?82572300#minimal-icons') format('svg');
+ font-weight: normal;
+ font-style: normal;
+}
+@font-face {
+ font-family: 'minimal-icons';
+ src: url('data:application/octet-stream;base64,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') format('woff'),
+ url('data:application/octet-stream;base64,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RyNhsAlDKyMgPCAuIzixKwEUKy2wQSyxCAQlQrAAFrAEJbAEJSAuRyNHI2EgsAQjQrAJQysgsGBQWCCwQFFYswIgAyAbswImAxpZQkIjIEewBEOwAmIgsABQWLBAYFlmsAFjYCCwASsgiophILACQ2BkI7ADQ2FkUFiwAkNhG7ADQ2BZsAMlsAJiILAAUFiwQGBZZrABY2GwAiVGYTgjIDwjOBshICBGI0ewASsjYTghWbErARQrLbBCLLA1Ky6xKwEUKy2wQyywNishIyAgPLAEI0IjOLErARQrsARDLrArKy2wRCywABUgR7AAI0KyAAEBFRQTLrAxKi2wRSywABUgR7AAI0KyAAEBFRQTLrAxKi2wRiyxAAEUE7AyKi2wRyywNCotsEgssAAWRSMgLiBGiiNhOLErARQrLbBJLLAII0KwSCstsEossgAAQSstsEsssgABQSstsEwssgEAQSstsE0ssgEBQSstsE4ssgAAQistsE8ssgABQistsFAssgEAQistsFEssgEBQistsFIssgAAPistsFMssgABPistsFQssgEAPistsFUssgEBPistsFYssgAAQCstsFcssgABQCstsFgssgEAQCstsFkssgEBQCstsFossgAAQystsFsssgABQystsFwssgEAQystsF0ssgEBQystsF4ssgAAPystsF8ssgABPystsGAssgEAPystsGEssgEBPystsGIssDcrLrErARQrLbBjLLA3K7A7Ky2wZCywNyuwPCstsGUssAAWsDcrsD0rLbBmLLA4Ky6xKwEUKy2wZyywOCuwOystsGgssDgrsDwrLbBpLLA4K7A9Ky2waiywOSsusSsBFCstsGsssDkrsDsrLbBsLLA5K7A8Ky2wbSywOSuwPSstsG4ssDorLrErARQrLbBvLLA6K7A7Ky2wcCywOiuwPCstsHEssDorsD0rLbByLLMJBAIDRVghGyMhWUIrsAhlsAMkUHiwARUwLQBLuADIUlixAQGOWbABuQgACABjcLEABUKxAAAqsQAFQrEACCqxAAVCsQAIKrEABUK5AAAACSqxAAVCuQAAAAkqsQMARLEkAYhRWLBAiFixA2REsSYBiFFYugiAAAEEQIhjVFixAwBEWVlZWbEADCq4Af+FsASNsQIARAA=') format('truetype');
+}
+/* Chrome hack: SVG is rendered more smooth in Windozze. 100% magic, uncomment if you need it. */
+/* Note, that will break hinting! In other OS-es font will be not as sharp as it could be */
+/*
+@media screen and (-webkit-min-device-pixel-ratio:0) {
+ @font-face {
+ font-family: 'minimal-icons';
+ src: url('../fonts/minimal-icons.svg?82572300#minimal-icons') format('svg');
+ }
+}
+*/
+
+ [class^="icon-"]:before, [class*=" icon-"]:before {
+ font-family: "minimal-icons";
+ font-style: normal;
+ font-weight: normal;
+ speak: none;
+
+ display: inline-block;
+ text-decoration: inherit;
+ width: 1em;
+ margin-right: .2em;
+ text-align: center;
+ /* opacity: .8; */
+
+ /* For safety - reset parent styles, that can break glyph codes*/
+ font-variant: normal;
+ text-transform: none;
+
+ /* fix buttons height, for twitter bootstrap */
+ line-height: 1em;
+
+ /* Animation center compensation - margins should be symmetric */
+ /* remove if not needed */
+ margin-left: .2em;
+
+ /* you can be more comfortable with increased icons size */
+ /* font-size: 120%; */
+
+ /* Uncomment for 3D effect */
+ /* text-shadow: 1px 1px 1px rgba(127, 127, 127, 0.3); */
+}
+.icon-truck:before { content: '\e800'; } /* '' */
+.icon-database:before { content: '\e801'; } /* '' */
+.icon-mining:before { content: '\e802'; } /* '' */
+.icon-check:before { content: '\e803'; } /* '' */
+.icon-cancel:before { content: '\e804'; } /* '' */
+.icon-loader:before { content: '\e805'; } /* '' */
+.icon-check-o:before { content: '\e806'; } /* '' */
+.icon-cancel-o:before { content: '\e807'; } /* '' */
+.icon-warning-o:before { content: '\e808'; } /* '' */
+.icon-network:before { content: '\e809'; } /* '' */
+.icon-block:before { content: '\e80a'; } /* '' */
+.icon-bulb:before { content: '\e80b'; } /* '' */
+.icon-node:before { content: '\e80c'; } /* '' */
+.icon-laptop:before { content: '\e80d'; } /* '' */
+.icon-time:before { content: '\e80e'; } /* '' */
+.icon-clock:before { content: '\e80f'; } /* '' */
+.icon-group:before { content: '\e810'; } /* '' */
+.icon-gas:before { content: '\e811'; } /* '' */
+.icon-difficulty:before { content: '\e812'; } /* '' */
\ No newline at end of file
diff --git a/public/css/minimal-icons-ie7-codes.css b/public/css/minimal-icons-ie7-codes.css
new file mode 100644
index 0000000..6f6c4cb
--- /dev/null
+++ b/public/css/minimal-icons-ie7-codes.css
@@ -0,0 +1,20 @@
+
+.icon-truck { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); }
+.icon-database { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); }
+.icon-mining { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); }
+.icon-check { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); }
+.icon-cancel { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); }
+.icon-loader { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); }
+.icon-check-o { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); }
+.icon-cancel-o { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); }
+.icon-warning-o { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); }
+.icon-network { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); }
+.icon-block { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); }
+.icon-bulb { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); }
+.icon-node { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); }
+.icon-laptop { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); }
+.icon-time { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); }
+.icon-clock { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); }
+.icon-group { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); }
+.icon-gas { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); }
+.icon-difficulty { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); }
\ No newline at end of file
diff --git a/public/css/minimal-icons-ie7.css b/public/css/minimal-icons-ie7.css
index 37410fd..676f6b8 100644
--- a/public/css/minimal-icons-ie7.css
+++ b/public/css/minimal-icons-ie7.css
@@ -26,4 +26,6 @@
.icon-laptop { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); }
.icon-time { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); }
.icon-clock { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); }
-.icon-group { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); }
\ No newline at end of file
+.icon-group { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); }
+.icon-gas { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); }
+.icon-difficulty { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); }
\ No newline at end of file
diff --git a/public/css/minimal-icons.css b/public/css/minimal-icons.css
index 8d683d9..2a61386 100644
--- a/public/css/minimal-icons.css
+++ b/public/css/minimal-icons.css
@@ -1,10 +1,10 @@
@font-face {
font-family: 'minimal-icons';
- src: url('../fonts/minimal-icons.eot?18158983');
- src: url('../fonts/minimal-icons.eot?18158983#iefix') format('embedded-opentype'),
- url('../fonts/minimal-icons.woff?18158983') format('woff'),
- url('../fonts/minimal-icons.ttf?18158983') format('truetype'),
- url('../fonts/minimal-icons.svg?18158983#minimal-icons') format('svg');
+ src: url('../fonts/minimal-icons.eot?55431205');
+ src: url('../fonts/minimal-icons.eot?55431205#iefix') format('embedded-opentype'),
+ url('../fonts/minimal-icons.woff?55431205') format('woff'),
+ url('../fonts/minimal-icons.ttf?55431205') format('truetype'),
+ url('../fonts/minimal-icons.svg?55431205#minimal-icons') format('svg');
font-weight: normal;
font-style: normal;
}
@@ -14,7 +14,7 @@
@media screen and (-webkit-min-device-pixel-ratio:0) {
@font-face {
font-family: 'minimal-icons';
- src: url('../fonts/minimal-icons.svg?18158983#minimal-icons') format('svg');
+ src: url('../fonts/minimal-icons.svg?55431205#minimal-icons') format('svg');
}
}
*/
@@ -66,4 +66,6 @@
.icon-laptop:before { content: '\e80d'; } /* '' */
.icon-time:before { content: '\e80e'; } /* '' */
.icon-clock:before { content: '\e80f'; } /* '' */
-.icon-group:before { content: '\e810'; } /* '' */
\ No newline at end of file
+.icon-group:before { content: '\e810'; } /* '' */
+.icon-gas:before { content: '\e811'; } /* '' */
+.icon-difficulty:before { content: '\e812'; } /* '' */
\ No newline at end of file
diff --git a/public/fonts/minimal-icons.eot b/public/fonts/minimal-icons.eot
index cb2a55f..c8b8ce5 100644
Binary files a/public/fonts/minimal-icons.eot and b/public/fonts/minimal-icons.eot differ
diff --git a/public/fonts/minimal-icons.svg b/public/fonts/minimal-icons.svg
index 1827646..98a057a 100644
--- a/public/fonts/minimal-icons.svg
+++ b/public/fonts/minimal-icons.svg
@@ -1,7 +1,7 @@
\ No newline at end of file
diff --git a/public/fonts/minimal-icons.ttf b/public/fonts/minimal-icons.ttf
index 27bbfa9..1b7c4ae 100644
Binary files a/public/fonts/minimal-icons.ttf and b/public/fonts/minimal-icons.ttf differ
diff --git a/public/fonts/minimal-icons.woff b/public/fonts/minimal-icons.woff
index 24c30f1..5d06fe0 100644
Binary files a/public/fonts/minimal-icons.woff and b/public/fonts/minimal-icons.woff differ
diff --git a/public/js/controllers.js b/public/js/controllers.js
index 10f676b..e49a2c4 100644
--- a/public/js/controllers.js
+++ b/public/js/controllers.js
@@ -11,7 +11,9 @@ function StatsCtrl($scope, $filter, socket, _, toastr) {
$scope.nodesActive = 0;
$scope.bestBlock = 0;
$scope.lastBlock = 0;
+ $scope.lastDifficulty = 0;
$scope.upTimeTotal = 0;
+ $scope.avgBlockTime = 0;
$scope.nodes = [];
$scope.map = [];
@@ -117,6 +119,14 @@ function StatsCtrl($scope, $filter, socket, _, toastr) {
return parseInt(node.stats.block.timestamp);
}).stats.block.timestamp;
+ $scope.lastDifficulty = _.max($scope.nodes, function(node) {
+ return parseInt(node.stats.block.timestamp);
+ }).stats.block.difficulty;
+
+ $scope.avgBlockTime = _.max($scope.nodes, function(node) {
+ return parseInt(node.stats.block.timestamp);
+ }).stats.blocktimeAvg;
+
$scope.upTimeTotal = _.reduce($scope.nodes, function(total, node) {
return total + node.stats.uptime;
}, 0) / $scope.nodes.length;
diff --git a/public/js/filters.js b/public/js/filters.js
index 725de41..0ac0534 100644
--- a/public/js/filters.js
+++ b/public/js/filters.js
@@ -44,7 +44,7 @@ angular.module('netStatsApp.filters', [])
version = version.replace('eth version ', 'v')
.replace("\n" + 'Network protocol version: ', ' (')
.replace("\n" + 'Client database version: ', ',')
- .replace("\n" + 'Build: ', ')
');
+ .replace("\n" + 'Build: ', ') - ');
return $sce.trustAsHtml(version);
};
})
@@ -63,6 +63,16 @@ angular.module('netStatsApp.filters', [])
return timeClass(timestamp);
};
})
+.filter('avgTimeFilter', function() {
+ return function(time) {
+ return Math.round(time) + 's';
+ };
+})
+.filter('avgTimeClass', function() {
+ return function(time) {
+ return blockTimeClass(time);
+ }
+})
.filter('upTimeFilter', function() {
return function(uptime) {
return Math.round(uptime) + '%';
@@ -115,6 +125,11 @@ function timeClass(timestamp)
var time = Math.floor((new Date()).getTime() / 1000);
var diff = time - timestamp;
+ return blockTimeClass(diff);
+}
+
+function blockTimeClass(diff)
+{
if(diff <= 12)
return 'text-success';
@@ -124,5 +139,5 @@ function timeClass(timestamp)
if(diff <= 30)
return 'text-warning';
- return 'text-danger';
+ return 'text-danger'
}
\ No newline at end of file
diff --git a/views/index.jade b/views/index.jade
index b9b3538..21845ad 100644
--- a/views/index.jade
+++ b/views/index.jade
@@ -3,14 +3,14 @@ extends layout
block content
div.container-fluid(ng-controller='StatsCtrl')
div.row
- div.col-lg-6(ng-cloak)
+ div.col-lg-8(ng-cloak)
div.col-sm-12
h1= title
//- p Welcome to #{title}
div.clearfix
- div.col-xs-6.stat-holder
+ div.col-xs-4.stat-holder
div.row.big-info.nodesactive(class="{{ nodesActive | nodesActiveClass : nodesTotal }}")
div.pull-left.icon-full-width
i.icon-bulb
@@ -18,23 +18,15 @@ block content
span.small-title active nodes
span.big-details {{nodesActive}}/{{nodesTotal}}
div.clearfix
- div.col-xs-6.stat-holder
- div.row.big-info.bestblock.text-info
+ div.col-xs-4.stat-holder
+ div.row.big-info.difficulty.text-info
div.pull-left.icon-full-width
- i.icon-block
+ i.icon-difficulty
div.pull-left
- span.small-title best block
- span.big-details {{"#" + bestBlock}}
+ span.small-title difficulty
+ span.big-details {{ lastDifficulty }}
div.clearfix
- div.col-xs-6.stat-holder
- div.row.big-info.blocktime(class="{{ lastBlock | timeClass }}")
- div.pull-left.icon-full-width
- i.icon-time
- div.pull-left
- span.small-title last block
- span.big-details(am-time-ago="lastBlock", am-preprocess="unix") ∞
- div.clearfix
- div.col-xs-6.stat-holder
+ div.col-xs-4.stat-holder
div.row.big-info.uptime(class="{{ upTimeTotal | upTimeClass }}")
div.pull-left.icon-full-width
i.icon-clock
@@ -42,10 +34,34 @@ block content
span.small-title up-time
span.big-details {{ upTimeTotal | upTimeFilter }}
div.clearfix
+ div.col-xs-4.stat-holder
+ div.row.big-info.bestblock.text-info
+ div.pull-left.icon-full-width
+ i.icon-block
+ div.pull-left
+ span.small-title best block
+ span.big-details {{"#" + bestBlock}}
+ div.clearfix
+ div.col-xs-4.stat-holder
+ div.row.big-info.blocktime(class="{{ lastBlock | timeClass }}")
+ div.pull-left.icon-full-width
+ i.icon-time
+ div.pull-left
+ span.small-title last block
+ span.big-details(am-time-ago="lastBlock", am-preprocess="unix") ∞
+ div.clearfix
+ div.col-xs-4.stat-holder
+ div.row.big-info.avgblocktime(class="{{ avgBlockTime | timeClass }}")
+ div.pull-left.icon-full-width
+ i.icon-gas
+ div.pull-left
+ span.small-title avg block time
+ span.big-details {{ avgBlockTime | avgTimeFilter }}
+ div.clearfix
div.clearfix
- div.col-lg-6
+ div.col-lg-4
div.col-xs-12
nodemap#mapHolder(data="map")
@@ -75,9 +91,10 @@ block content
tbody
tr(ng-repeat='node in nodes', class="{{ node.stats | mainClass : bestBlock }}")
td(rel="{{node.id}}")
- span(data-toggle="tooltip", data-placement="top", data-original-title="{{node.geo | geoTooltip}}") {{node.info.name}}
- div.small {{node.info.ip}}
- td.small
+ span.small(data-toggle="tooltip", data-placement="top", data-original-title="{{node.geo | geoTooltip}}") {{node.info.name}}
+ -
+ span.small {{node.info.ip}}
+ td
div.small(ng-bind-html="node.info.node | nodeVersion")
//- div.small {{node.info.os}}, {{node.info.os_v}}
td(class="{{ node.stats.peers | peerClass }}") {{node.stats.peers}}
@@ -86,6 +103,6 @@ block content
td(class="{{ node.stats.block.number | blockClass : bestBlock }}") {{'#' + node.stats.block.number}}
td(class="{{ node.stats.block.number | blockClass : bestBlock }}").hidden-sm.hidden-xs
span.small {{node.stats.block.hash}}
- div.small Difficulty: {{node.stats.block.difficulty | gasFilter}} | Gas used: {{node.stats.block.gasUsed | gasFilter}} | Min gas price: {{node.stats.block.minGasPrice | gasFilter}} | Gas limit: {{node.stats.block.gasLimit | gasFilter}}
+ //- div.small Difficulty: {{node.stats.block.difficulty | gasFilter}} | Gas used: {{node.stats.block.gasUsed | gasFilter}} | Min gas price: {{node.stats.block.minGasPrice | gasFilter}} | Gas limit: {{node.stats.block.gasLimit | gasFilter}}
td(am-time-ago="node.stats.block.timestamp", am-preprocess="unix", class="{{ node.stats.block.timestamp | timeClass }}") ∞
td(class="{{ node.stats.uptime | upTimeClass }}") {{ node.stats.uptime | upTimeFilter }}