228 lines
7.9 KiB
JavaScript
228 lines
7.9 KiB
JavaScript
|
var chart;
|
||
|
var chartData = [];
|
||
|
var chartLoadInProgress = false;
|
||
|
var minPeriod = 'hh';
|
||
|
var validPeriods = ['24h', '72h', '168h', '30d', '90d', '1y'];
|
||
|
var defaultPeriod = (validPeriods.indexOf(localStorage.getItem('chartPeriod')) > -1) ? localStorage.getItem('chartPeriod') : '24h';
|
||
|
var periodGridCounts = {'24h': 24, '72h': 24, '168h': 14, '30d': 30, '90d': 45, '1y': 12 };
|
||
|
AmCharts.ready(function() {
|
||
|
chart = AmCharts.makeChart('block-size-chart', {
|
||
|
type: 'serial',
|
||
|
theme: 'light',
|
||
|
mouseWheelZoomEnabled: true,
|
||
|
categoryField: 'date',
|
||
|
synchronizeGrid: true,
|
||
|
dataProvider: chartData,
|
||
|
valueAxes: [
|
||
|
{
|
||
|
id: 'v-block-size',
|
||
|
axisColor: '#1e88e5',
|
||
|
axisThickness: 2,
|
||
|
labelFunction: function(value) {
|
||
|
return (Math.round((value / 1000) * 100)/100).toFixed(2) + ' KB';
|
||
|
}
|
||
|
},
|
||
|
{
|
||
|
id: 'v-price',
|
||
|
axisColor: '#00e676',
|
||
|
offset: 75,
|
||
|
gridAlpha: 0,
|
||
|
axisThickness: 2,
|
||
|
labelFunction: function(value) {
|
||
|
return '$' + value.toFixed(2);
|
||
|
}
|
||
|
}
|
||
|
],
|
||
|
categoryAxis: {
|
||
|
parseDates: true,
|
||
|
minPeriod: minPeriod, // DD for daily
|
||
|
autoGridCount: false,
|
||
|
minorGridEnabled: true,
|
||
|
minorGridAlpha: 0.04,
|
||
|
axisColor: '#dadada',
|
||
|
twoLineMode: true,
|
||
|
dateFormats: [{
|
||
|
period: 'fff',
|
||
|
format: 'JJ:NN:SS'
|
||
|
}, {
|
||
|
period: 'ss',
|
||
|
format: 'JJ:NN:SS'
|
||
|
}, {
|
||
|
period: 'mm',
|
||
|
format: 'JJ:NN'
|
||
|
}, {
|
||
|
period: 'hh',
|
||
|
format: 'JJ:NN'
|
||
|
}, {
|
||
|
period: 'DD',
|
||
|
format: 'DD'
|
||
|
}, {
|
||
|
period: 'WW',
|
||
|
format: 'DD MMM'
|
||
|
}, {
|
||
|
period: 'MM',
|
||
|
format: 'MMM'
|
||
|
}, {
|
||
|
period: 'YYYY',
|
||
|
format: 'YYYY'
|
||
|
}]
|
||
|
},
|
||
|
graphs: [
|
||
|
{
|
||
|
id: 'g-block-size',
|
||
|
valueAxis: 'v-block-size', // we have to indicate which value axis should be used
|
||
|
title: 'Avg Block Size',
|
||
|
valueField: 'AvgBlockSize',
|
||
|
bullet: 'round',
|
||
|
bulletBorderThickness: 1,
|
||
|
bulletBorderAlpha: 1,
|
||
|
bulletColor: '#ffffff',
|
||
|
bulletSize: 5,
|
||
|
useLineColorForBulletBorder: true,
|
||
|
lineColor: '#1e88e5',
|
||
|
hideBulletsCount: 101,
|
||
|
balloonText: '[[AvgBlockSize]] KB',
|
||
|
switchable: false,
|
||
|
balloonFunction: function(item, graph) {
|
||
|
var result = graph.balloonText;
|
||
|
return result.replace('[[AvgBlockSize]]', (Math.round((item.dataContext.AvgBlockSize / 1000) * 100)/100).toFixed(2));
|
||
|
}
|
||
|
},
|
||
|
{
|
||
|
id: 'g-price',
|
||
|
valueAxis: 'v-price',
|
||
|
title: 'Average Price',
|
||
|
valueField: 'AvgUSD',
|
||
|
bullet: 'round',
|
||
|
bulletBorderThickness: 1,
|
||
|
bulletBorderAlpha: 1,
|
||
|
bulletColor: '#ffffff',
|
||
|
bulletSize: 5,
|
||
|
useLineColorForBulletBorder: true,
|
||
|
lineColor: '#00e676',
|
||
|
balloonText: '$[[AvgUSD]]',
|
||
|
balloonFunction: function(item, graph) {
|
||
|
var result = graph.balloonText;
|
||
|
if (!item.dataContext.AvgUSD) {
|
||
|
return '';
|
||
|
}
|
||
|
return result.replace('[[AvgUSD]]', item.dataContext.AvgUSD.toFixed(2));
|
||
|
},
|
||
|
hideBulletsCount: 101,
|
||
|
labelFunction: function(value) {
|
||
|
return '$' + value;
|
||
|
},
|
||
|
}
|
||
|
],
|
||
|
chartCursor: {
|
||
|
cursorAlpha: 0.1,
|
||
|
fullWidth: true,
|
||
|
valueLineBalloonEnabled: true,
|
||
|
categoryBalloonColor: '#333333',
|
||
|
cursorColor: '#1e88e5',
|
||
|
categoryBalloonDateFormat: minPeriod === 'hh' ? 'D MMM HH:NN ' : 'D MMM'
|
||
|
},
|
||
|
chartScrollbar: {
|
||
|
scrollbarHeight: 36,
|
||
|
color: '#888888',
|
||
|
gridColor: '#bbbbbb'
|
||
|
},
|
||
|
legend: {
|
||
|
marginLeft: 110,
|
||
|
useGraphSettings: true,
|
||
|
valueAlign: 'right',
|
||
|
valueWidth: 60,
|
||
|
spacing: 64,
|
||
|
valueFunction: function(item, formatted) {
|
||
|
if (item.dataContext) {
|
||
|
var g = item.graph;
|
||
|
if (g.id === 'g-block-size' && item.dataContext.AvgBlockSize > 0) {
|
||
|
return g.balloonText.replace('[[AvgBlockSize]]', (Math.round((item.dataContext.AvgBlockSize / 1000) * 100)/100).toFixed(2) );
|
||
|
}
|
||
|
if (g.id === 'g-price' && item.dataContext.AvgUSD) {
|
||
|
return g.balloonText.replace('[[AvgUSD]]', item.dataContext.AvgUSD.toFixed(2));
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return formatted;
|
||
|
}
|
||
|
},
|
||
|
export: {
|
||
|
enabled: true,
|
||
|
fileName: 'lbry-block-size-chart',
|
||
|
position: 'bottom-right',
|
||
|
divId: 'chart-export'
|
||
|
}
|
||
|
});
|
||
|
|
||
|
loadChartData(defaultPeriod);
|
||
|
});
|
||
|
|
||
|
var loadChartData = function(dataPeriod) {
|
||
|
var loadProgress = $('.block-size-chart-container .load-progress');
|
||
|
// clear previous chart data
|
||
|
$.ajax({
|
||
|
url: '/api/v1/charts/blocksize/' + dataPeriod,
|
||
|
type: 'get',
|
||
|
dataType: 'json',
|
||
|
beforeSend: function() {
|
||
|
chartLoadInProgress = true;
|
||
|
loadProgress.css({ display: 'block' });
|
||
|
},
|
||
|
success: function(response) {
|
||
|
if (response.success) {
|
||
|
chartData = [];
|
||
|
var data = response.data;
|
||
|
for (var period in data) {
|
||
|
if (data.hasOwnProperty(period)) {
|
||
|
chartData.push({
|
||
|
date: Date.parse(period),
|
||
|
AvgBlockSize: data[period].AvgBlockSize,
|
||
|
AvgUSD: data[period].AvgUSD
|
||
|
});
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// save selcted period to localStorage
|
||
|
localStorage.setItem('chartPeriod', dataPeriod);
|
||
|
|
||
|
if (chart) {
|
||
|
var isHourly = (dataPeriod.indexOf('h') > -1);
|
||
|
var gridCount = periodGridCounts[dataPeriod];
|
||
|
chart.categoryAxis.minPeriod = isHourly ? 'hh' : 'DD';
|
||
|
chart.categoryAxis.dateFormats[4].format = isHourly ? 'DD MMM' : 'DD';
|
||
|
chart.chartCursor.categoryBalloonDateFormat = isHourly ? 'D MMM HH:NN ' : 'D MMM YYYY';
|
||
|
chart.categoryAxis.gridCount = gridCount;
|
||
|
chart.chartScrollbar.gridCount = gridCount;
|
||
|
chart.dataProvider = chartData;
|
||
|
chart.validateNow();
|
||
|
chart.validateData();
|
||
|
}
|
||
|
}
|
||
|
},
|
||
|
complete: function() {
|
||
|
chartLoadInProgress = false;
|
||
|
loadProgress.css({ display: 'none' });
|
||
|
}
|
||
|
});
|
||
|
};
|
||
|
|
||
|
$(document).ready(function() {
|
||
|
$('.block-size-data-links a').on('click', function(evt) {
|
||
|
evt.preventDefault();
|
||
|
if (chartLoadInProgress) {
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
var link = $(this);
|
||
|
if (link.hasClass('active')) {
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
link.addClass('active').siblings().removeClass('active');
|
||
|
var period = link.attr('data-period');
|
||
|
loadChartData(period);
|
||
|
});
|
||
|
|
||
|
$('a[data-period="' + defaultPeriod + '"]').addClass('active').siblings().removeClass('active');
|
||
|
});
|