* [FEATURE] Allow in-class checking for user permissions * [FEATURE] Allow in-class creation of the JSON data for coherence * [FEATURE} Added API version in JSON data for client side checks * [IMPROVEMENT] Adjusted all API calls to use the new JSON layout **NOTE**: This is breaking backwads compatibility with the old API! Please adjust your client application to support this new version. The data array should not change much more other than added features.
151 lines
8.0 KiB
Smarty
151 lines
8.0 KiB
Smarty
<script type="text/javascript" src="{$PATH}/js/plugins/jqplot.json2.min.js"></script>
|
|
<script type="text/javascript" src="{$PATH}/js/plugins/jqplot.dateAxisRenderer.js"></script>
|
|
<script type="text/javascript" src="{$PATH}/js/plugins/jqplot.highlighter.js"></script>
|
|
<script type="text/javascript" src="{$PATH}/js/plugins/jqplot.canvasTextRenderer.min.js"></script>
|
|
<script type="text/javascript" src="{$PATH}/js/plugins/jqplot.canvasAxisLabelRenderer.min.js"></script>
|
|
<script type="text/javascript" src="{$PATH}/js/plugins/jqplot.trendline.min.js"></script>
|
|
<script type="text/javascript" src="{$PATH}/js/plugins/jqplot.enhancedLegendRenderer.min.js"></script>
|
|
<script type="text/javascript" src="{$PATH}/js/plugins/jqplot.canvasTextRenderer.min.js"></script>
|
|
<script type="text/javascript" src="{$PATH}/js/plugins/jqplot.canvasAxisTickRenderer.min.js"></script>
|
|
<script type="text/javascript" src="{$PATH}/js/plugins/jqplot.categoryAxisRenderer.min.js"></script>
|
|
<script type="text/javascript" src="{$PATH}/js/plugins/jqplot.barRenderer.min.js"></script>
|
|
<script type="text/javascript" src="{$PATH}/js/plugins/jqplot.pointLabels.js"></script>
|
|
|
|
<script>
|
|
{literal}
|
|
$(document).ready(function(){
|
|
var g1, g2, g3, g4, g5;
|
|
|
|
// Ajax API URL
|
|
var url = "{/literal}{$smarty.server.PHP_SELF}?page=api&action=getdashboarddata&api_key={$GLOBAL.userdata.api_key}&id={$GLOBAL.userdata.id}{literal}";
|
|
|
|
// Enable all included plugins
|
|
// $.jqplot.config.enablePlugins = true;
|
|
|
|
// Store our data globally
|
|
var storedPersonalHashrate=[];
|
|
var storedPoolHashrate=[];
|
|
var storedPersonalSharerate=[];
|
|
|
|
// jqPlit defaults
|
|
var jqPlotOverviewOptions = {
|
|
highlighter: { show: true },
|
|
grid: { drawBorder: false, background: '#fbfbfb', shadow: false },
|
|
stackSeries: false,
|
|
seriesColors: [ '#26a4ed', '#ee8310', '#e9e744' ],
|
|
seriesDefaults:{
|
|
lineWidth: 4, shadow: false,
|
|
fill: false, fillAndStroke: true, fillAlpha: 0.3,
|
|
trendline: { show: true, color: '#be1e2d', lineWidth: 1.0, label: 'Your Average', shadow: true },
|
|
markerOptions: { show: true, size: 6 },
|
|
rendererOptions: { smooth: true }
|
|
},
|
|
series: [
|
|
{ yaxis: 'yaxis', label: 'Own', fill: true },
|
|
{ yaxis: 'yaxis', label: 'Pool', fill: false, trendline: { show: false }, lineWidth: 2, markerOptions: { show: true, size: 4 }},
|
|
{ yaxis: 'y3axis', label: 'Sharerate', fill: false, trendline: { show: false } },
|
|
],
|
|
legend: { show: true, location: 'sw', renderer: $.jqplot.EnhancedLegendRenderer, rendererOptions: { seriesToggleReplot: { resetAxes: true } } },
|
|
axes: {
|
|
yaxis: { min: 0, pad: 1.25, label: 'Hashrate' , labelRenderer: $.jqplot.CanvasAxisLabelRenderer },
|
|
y3axis: { min: 0, pad: 1.25, label: 'Sharerate', labelRenderer: $.jqplot.CanvasAxisLabelRenderer },
|
|
xaxis: { tickInterval: {/literal}{$GLOBAL.config.statistics_ajax_refresh_interval}{literal}, labelRenderer: $.jqplot.CanvasAxisLabelRenderer, renderer: $.jqplot.DateAxisRenderer, angle: 30, tickOptions: { formatString: '%T' } },
|
|
},
|
|
};
|
|
|
|
var jqPlotShareinfoOptions = {
|
|
title: 'Shares',
|
|
highlighter: { show: false },
|
|
grid: { drawBorder: false, background: '#fbfbfb', shadow: false },
|
|
seriesColors: [ '#26a4ed', '#ee8310', '#e9e744' ],
|
|
seriesDefaults: {
|
|
pointLabels: { show: true },
|
|
renderer: $.jqplot.BarRenderer,
|
|
shadowAngle: 135,
|
|
rendererOptions: {
|
|
barWidth: 5,
|
|
barDirection: 'horizontal'
|
|
},
|
|
trendline: { show: false },
|
|
},
|
|
axesDefaults: {
|
|
autoscale: true,
|
|
tickRenderer: $.jqplot.CanvasAxisTickRenderer ,
|
|
},
|
|
series: [
|
|
{label: 'Own', }, {label: 'Pool'}
|
|
],
|
|
legend: { show: true, location: 'ne', renderer: $.jqplot.EnhancedLegendRenderer, rendererOptions: { seriesToggleReplot: { resetAxes: true } } },
|
|
axes: {
|
|
yaxis: { tickOptions: { angle: -90 }, ticks: [ 'invalid', 'valid' ], renderer: $.jqplot.CategoryAxisRenderer },
|
|
xaxis: { tickOptions: { angle: -15 }, pointLabels: { show: true } }
|
|
}
|
|
};
|
|
|
|
// Init empty graph with 0 data, otherwise some plugins fail
|
|
var plot1 = $.jqplot('hashrategraph', [[storedPersonalHashrate], [storedPoolHashrate], [[0, 0.0]]], jqPlotOverviewOptions);
|
|
var plot2 = $.jqplot('shareinfograph', [[[0]]], jqPlotShareinfoOptions);
|
|
|
|
// Helper to initilize gauges
|
|
function initGauges(data) {
|
|
g1 = new JustGage({id: "nethashrate", value: parseFloat(data.getdashboarddata.data.network.hashrate).toFixed(2), min: 0, max: Math.round(data.getdashboarddata.data.network.hashrate * 2), title: "Net Hashrate", label: "{/literal}{$GLOBAL.hashunits.network}{literal}"});
|
|
g2 = new JustGage({id: "poolhashrate", value: parseFloat(data.getdashboarddata.data.pool.hashrate).toFixed(2), min: 0, max: Math.round(data.getdashboarddata.data.pool.hashrate * 2), title: "Pool Hashrate", label: "{/literal}{$GLOBAL.hashunits.pool}{literal}"});
|
|
g3 = new JustGage({id: "hashrate", value: parseFloat(data.getdashboarddata.data.personal.hashrate).toFixed(2), min: 0, max: Math.round(data.getdashboarddata.data.personal.hashrate * 2), title: "Hashrate", label: "{/literal}{$GLOBAL.hashunits.personal}{literal}"});
|
|
g4 = new JustGage({id: "sharerate", value: parseFloat(data.getdashboarddata.data.personal.sharerate).toFixed(2), min: 0, max: Math.round(data.getdashboarddata.data.personal.sharerate * 2), title: "Sharerate", label: "shares/s"});
|
|
g5 = new JustGage({id: "querytime", value: parseFloat(data.getdashboarddata.runtime).toFixed(2), min: 0, max: Math.round(data.getdashboarddata.runtime * 3), title: "Querytime", label: "ms"});
|
|
}
|
|
|
|
// Helper to refresh graphs
|
|
function refreshInformation(data) {
|
|
g1.refresh(parseFloat(data.getdashboarddata.data.network.hashrate).toFixed(2));
|
|
g2.refresh(parseFloat(data.getdashboarddata.data.pool.hashrate).toFixed(2));
|
|
g3.refresh(parseFloat(data.getdashboarddata.data.personal.hashrate).toFixed(2));
|
|
g4.refresh(parseFloat(data.getdashboarddata.data.personal.sharerate).toFixed(2));
|
|
g5.refresh(parseFloat(data.getdashboarddata.runtime).toFixed(2));
|
|
if (storedPersonalHashrate.length > 20) { storedPersonalHashrate.shift(); }
|
|
if (storedPoolHashrate.length > 20) { storedPoolHashrate.shift(); }
|
|
if (storedPersonalSharerate.length > 20) { storedPersonalSharerate.shift(); }
|
|
timeNow = new Date().getTime();
|
|
storedPersonalHashrate[storedPersonalHashrate.length] = [timeNow, data.getdashboarddata.data.raw.personal.hashrate];
|
|
storedPersonalSharerate[storedPersonalSharerate.length] = [timeNow, parseFloat(data.getdashboarddata.data.personal.sharerate)];
|
|
storedPoolHashrate[storedPoolHashrate.length] = [timeNow, data.getdashboarddata.data.raw.pool.hashrate];
|
|
tempShareinfoData = [
|
|
[parseInt(data.getdashboarddata.data.personal.shares.valid), parseInt(data.getdashboarddata.data.personal.shares.invalid)],
|
|
[parseInt(data.getdashboarddata.data.pool.shares.valid), parseInt(data.getdashboarddata.data.pool.shares.invalid)]
|
|
];
|
|
replotOverviewOptions = {
|
|
data: [storedPersonalHashrate, storedPoolHashrate, storedPersonalSharerate],
|
|
series: [ {show: plot1.series[0].show}, {show: plot1.series[1].show}, {show: plot1.series[2].show} ]
|
|
};
|
|
replotShareinfoOptions= {
|
|
data: tempShareinfoData
|
|
};
|
|
if (typeof(plot1) != "undefined") plot1.replot(replotOverviewOptions);
|
|
if (typeof(plot2) != "undefined") plot2.replot(replotShareinfoOptions);
|
|
}
|
|
|
|
// Fetch initial data via Ajax, starts proper gauges to display
|
|
$.ajax({
|
|
url: url,
|
|
async: false, // Run all others requests after this only if it's done
|
|
dataType: 'json',
|
|
success: function (data) { initGauges(data); }
|
|
});
|
|
|
|
// Our worker process to keep gauges and graph updated
|
|
(function worker() {
|
|
$.ajax({
|
|
url: url,
|
|
dataType: 'json',
|
|
success: function(data) {
|
|
refreshInformation(data);
|
|
},
|
|
complete: function() {
|
|
setTimeout(worker, {/literal}{($GLOBAL.config.statistics_ajax_refresh_interval * 1000)|default:"10000"}{literal})
|
|
}
|
|
});
|
|
})();
|
|
});
|
|
{/literal}
|
|
</script>
|