chart
Version:
event based time series charting API
99 lines (88 loc) • 4.43 kB
JavaScript
var util = require('./util');
var Hash = require('hashish');
var interaction = undefined;
var config = {
padding : {
left : 10,
top : 20,
bottom : 30
},
axispadding : {
left : 50, // yaxis
bottom : 20 // xaxis
}
};
exports.displayConfig = function(params) {
if (params !== undefined) {
Hash(config).update(params);
}
};
exports.setInteraction = function(obj) {
interaction = obj;
interaction.config = config;
}
exports.setCanvas = function(el,that) {
that.canvas = el;
// transfer inline style to wrapping div
var style = $(el).attr('style');
var wrappingDiv = document.createElement('div');
$(wrappingDiv).attr('style',style);
$(el).removeAttr('style');
wrappingDiv.id = that.wrappingDivId;
wrappingDiv.height = that.canvas.height;
$(that.canvas).wrap(wrappingDiv);
that.ctx = el.getContext('2d');
that.ctx.fillStyle = that.color.bg;
that.ctx.fillRect(0,0,that.canvas.width,that.canvas.height);
};
exports.legendClear = function() {
legend.clear(this.legend_el);
};
exports.setSource = function(source) {
var id = source.id;
this.buffer[id].width = this.canvas.width;
this.buffer[id].height = this.canvas.height;
$(this.buffer[id]).css('position','absolute');
$(this.canvas).before(this.buffer[id]);
var onDataGraph = function(data,flags) {
// timestamp
data.date = new Date().getTime(); // actual timestamp
if ((source.dataset === undefined) || (flags && flags.clear)) {
source.dataset = [];
}
source.dataset.push(data);
if (this.pause === true)
return
var windowsize = source.windowsize || data.windowsize || 10;
var datatodisplay = (this.custom.cropFn) ? this.custom.cropFn(source.dataset,windowsize,this.custom.boundaries) : util.cropData(source.dataset,windowsize);
var startx = util.getStartX(datatodisplay.length,windowsize,this.canvas.width);
var spacing = util.getSpacing(windowsize,this.canvas.width);
var yaxises = this.legendobj.update(datatodisplay,this.color.line);
if (this.legend_el !== undefined)
this.legendobj.updateHTML({el:this.legend_el});
this.ctx.fillStyle = this.color.bg;
this.ctx.fillRect(0,0,this.canvas.width,this.canvas.height);
if (flags && flags.multiple && (flags.multiple === true)) {
Hash(yaxises).forEach(function(axis,key) {
axis.range = util.rangeY(datatodisplay,key);
});
util.drawYaxisMultiple(this.canvas,this.ctx,yaxises,config);
// util.drawHorizontalGrid(this.canvas.width,this.canvas.height,this.ctx);
// util.drawVerticalGrid(datatodisplay,this.ctx,spacing,startx,this.canvas.height);
util.draw_multiple({startx:startx,datatodisplay:datatodisplay,spacing:spacing,buffer:this.buffer[id],bufferctx:this.bufferctx[id],yaxises:yaxises});
} else {
var range = util.filterDynamicRangeY(datatodisplay,yaxises);
// util.drawHorizontalGrid(this.canvas.width,this.canvas.height,this.ctx);
util.drawXaxis({datatodisplay:datatodisplay,ctx:this.ctx,spacing:spacing,startx:startx,height:this.canvas.height,width:this.canvas.width,config:config,gridcolor:this.color.grid,xlabel:this.color.xlabel,xline:this.color.xline,doVertGrid:true});
util.draw({startx:startx,datatodisplay:datatodisplay,spacing:spacing,buffer:this.buffer[id],bufferctx:this.bufferctx[id],yaxises:yaxises,config:config,rendermode:source.rendermode || this.rendermode || "line", range:range});
util.clip({ctx:this.bufferctx[id],config:config,height:this.buffer[id].height,type:'clear',clipcolor:this.color.bg});
util.clip({ctx:this.ctx,config:config,height:this.canvas.height,type:'fill',clipcolor:this.color.bg});
util.drawYaxis({canvas:this.canvas,ctx:this.ctx,range:range,config:config,yline:this.color.yline,ylabel:this.color.ylabel});
source.displayData = util.getDisplayPoints({startx:startx,datatodisplay:datatodisplay,spacing:spacing,height:this.buffer[id].height,yaxises:yaxises,config:config,range:range});
}
if (interaction !== undefined) {
interaction.redraw();
}
};
source.on('data',onDataGraph.bind(this));
};