<!DOCTYPE html>
<html ng-app="app">
<head>
<script data-require="angularjs@1.5.5" data-semver="1.5.5" src="https://code.angularjs.org/1.5.5/angular.js"></script>
<script data-require="echarts@*" data-semver="3.1.10" src="https://cdnjs.cloudflare.com/ajax/libs/echarts/3.1.10/echarts.min.js
"></script>
<link rel="stylesheet" href="style.css" />
<script src="script.js"></script>
<script src="util.js"></script>
<script src="echart.directive.js"></script>
</head>
<body ng-controller="MainCtrl as vm">
<h1>Hello Plunker!</h1>
<button ng-click="vm.addSales()">Add sales</button>
<button ng-click="vm.moveSales()">Move sales</button>
<echart option="vm.option" x="vm.x" y="vm.y" series="vm.series" legend="vm.legend" style="height: 300px"></echart>
<!-- <echart option="vm.option" x="vm.x" y="vm.y" series="vm.series" style="height: 300px"></echart> -->
</body>
</html>
// Code goes here
angular.module('app', [])
.controller('MainCtrl', MainCtrl);
function MainCtrl(util) {
var vm = this;
vm.option = {
tooltip: {
show: true,
formatter: function(params, ticket) {
var d = new Date(+params.name);
var dateOption = {
hour: 'numeric',
minute: 'numeric',
hour12: false
};
var name = d.toLocaleTimeString('en-US', dateOption);
return params.seriesName + '<br />' + name + ': ' + params.value;
}
}
};
vm.x = [{
type: 'category',
name: 'Time',
boundaryGap: true,
axisLabel: {
formatter: function(params) {
var d = new Date(params);
var dateOption = {
hour: 'numeric',
minute: 'numeric',
hour12: false
};
return d.toLocaleTimeString('en-US', dateOption);
}
},
data: setLabels(Date.now())
}];
vm.y = [{
type: 'value',
name: '€'
}];
vm.series = [{
"name": "Sales",
"type": "bar",
"data": vm.x[0].data.map(function (label) {
return '-';
})
}];
vm.legend = {
data: ['Sales']
};
vm.addSales = addSales;
vm.moveSales = moveSales;
var data = vm.series[0].data;
function addSales(val, index) {
/*var val = val || 1;
var index = index || util.randomInt(vm.x[0].data.length - 1);
data[index] = (data[index] === '-') ? val : data[index] + val;*/
data[data.length - 1] = (data[data.length - 1] == '-') ? 1 : data[data.length - 1] + 1;
}
function moveSales() {
var xData = vm.x[0].data;
var next = xData[xData.length - 1] + 9e+5;
xData.shift();
xData.push(next);
data.shift();
data.push(util.randomNull(5, 1, '-'));
}
function setLabels(time) {
var timeline = [];
var now = (time) ? new Date(time) : new Date();
now.setMilliseconds(0);
now.setSeconds(0);
var minutes = now.getMinutes();
minutes = Math.round(minutes / 15) * 15;
now.setMinutes(minutes);
var option = {
hour: 'numeric',
minute: 'numeric',
hour12: false
}
for (var i = now.getTime(); i >= now.getTime() - 7.2e+6; i -= 9e+5) {
timeline.unshift(i);
}
return timeline;
}
}
/* Styles go here */
// Code goes here
angular.module('app')
.directive('echart', echart);
function echart() {
var directive = {
scope: {
x: '=',
y: '=',
series: '=',
legend: '=',
option: '=?',
},
link: link,
};
return directive;
function link(scope, elem, attrs, controllers) {
init();
function init() {
var height = elem[0].style.getPropertyValue('height') || '300px';
var width = elem[0].style.getPropertyValue('width') || '600px';
elem.css({
display: 'block',
height: height,
width: width
});
var myChart = echarts.init(elem[0]);
var option = angular.extend({}, scope.option);
option.xAxis = scope.x;
option.yAxis = scope.y;
option.series = scope.series;
option.legend = scope.legend;
myChart.setOption(option);
scope.$watch('x', function(newVal, oldVal) {
option.xAxis = newVal;
myChart.setOption(option);
}, true);
scope.$watch('series', function(newVal, oldVal) {
if (newVal && newVal !== oldVal) {
option.series = newVal;
myChart.setOption(option);
}
}, true);
}
}
}
// Code goes here
angular.module('app')
.factory('util', util);
function util() {
return {
randomInt: randomInt,
randomNull: randomNull,
};
function randomInt(range, min) {
var min = min || 0;
return Math.round(Math.random() * range + min);
}
function randomNull(range, min, empty) {
var empty = empty || null;
var ratio = Math.floor(Math.random() * range);
if (ratio === 0) {
return empty;
} else {
return randomInt(range, min);
}
}
}