Changed tweets, added eca
This commit is contained in:
368
template_static/lib/charts.js
Normal file
368
template_static/lib/charts.js
Normal file
@@ -0,0 +1,368 @@
|
||||
(function($, block) {
|
||||
|
||||
// a simple rolling chart with memory
|
||||
block.fn.rolling_chart = function(config) {
|
||||
// combine default configuration with user configuration
|
||||
var options = $.extend({
|
||||
memory: 100,
|
||||
// required!!
|
||||
series: {
|
||||
'default': {data: []}
|
||||
},
|
||||
// flot initialization options
|
||||
options: {
|
||||
xaxis: {
|
||||
show: false
|
||||
}
|
||||
}
|
||||
}, config);
|
||||
|
||||
// maintain state for this block
|
||||
var data = {};
|
||||
for(var k in options.series) {
|
||||
data[k] = (options.series[k].data || []).slice();
|
||||
}
|
||||
|
||||
// function to project our state to something the library understands
|
||||
var prepare_data = function() {
|
||||
var result = [];
|
||||
|
||||
// process each series
|
||||
for(var k in data) {
|
||||
var series = data[k];
|
||||
var points = [];
|
||||
|
||||
// create point pairs and gap values
|
||||
for(var i in series) {
|
||||
if(series[i] == null) {
|
||||
points.push(null);
|
||||
} else {
|
||||
points.push([i, series[i]]);
|
||||
}
|
||||
}
|
||||
|
||||
// combine state data with series configuration by user
|
||||
result.push($.extend(options.series[k], {data: points}));
|
||||
}
|
||||
|
||||
return result;
|
||||
};
|
||||
|
||||
// initial setup of library state (also builds necessary HTML)
|
||||
var plot = $.plot(this.$element, prepare_data(), options.options);
|
||||
|
||||
|
||||
// register actions for this block
|
||||
this.actions({
|
||||
'add': function(e, message) {
|
||||
// if the 'value' field is used, update all series (useful with a single series)
|
||||
if(typeof message.values == 'undefined' && typeof message.value != 'undefined') {
|
||||
message.values = {}
|
||||
for(var k in options.series) {
|
||||
message.values[k] = message.value;
|
||||
}
|
||||
}
|
||||
|
||||
// update all series
|
||||
for(var k in options.series) {
|
||||
// roll memory
|
||||
if(data[k].length > options.memory) {
|
||||
data[k] = data[k].slice(1);
|
||||
}
|
||||
|
||||
// insert value or gap (in case of null)
|
||||
data[k].push(message.values[k]);
|
||||
}
|
||||
|
||||
// update HTML
|
||||
plot.setData(prepare_data());
|
||||
plot.setupGrid();
|
||||
plot.draw();
|
||||
}
|
||||
});
|
||||
|
||||
// return element to allow further work
|
||||
return this.$element;
|
||||
}
|
||||
|
||||
//
|
||||
//
|
||||
//
|
||||
|
||||
// a simple linechart example
|
||||
block.fn.linechart = function(config) {
|
||||
var options = $.extend({
|
||||
// required
|
||||
series : {default:{}},
|
||||
// flot initialization options
|
||||
options : {}
|
||||
}, config);
|
||||
|
||||
// create empty linechart with parameter options
|
||||
var plot = $.plot(this.$element, [],options.options);
|
||||
|
||||
// dict containing the labels and values
|
||||
var linedata_series = {};
|
||||
var linedata_first;
|
||||
|
||||
var initline = function(series) {
|
||||
linedata_first = undefined;
|
||||
for(var k in series) {
|
||||
var si = series[k];
|
||||
si.data = [];
|
||||
linedata_series[k] = si;
|
||||
if ( linedata_first == undefined )
|
||||
linedata_first = si;
|
||||
}
|
||||
}
|
||||
|
||||
initline(options.series);
|
||||
|
||||
var addline = function(label, values) {
|
||||
var data;
|
||||
|
||||
if (linedata_series.hasOwnProperty(label))
|
||||
data = linedata_series[label].data;
|
||||
else
|
||||
data = linedata_first.data;
|
||||
for(var v in values) {
|
||||
data.push(values[v]);
|
||||
}
|
||||
redraw();
|
||||
}
|
||||
|
||||
var setline = function(label, values) {
|
||||
if (linedata_series.hasOwnProperty(label))
|
||||
linedata_series[label].data = values;
|
||||
else
|
||||
linedata_first.data = values;
|
||||
redraw();
|
||||
}
|
||||
|
||||
var redraw = function() {
|
||||
var result = [];
|
||||
for(var k in linedata_series) {
|
||||
if (linedata_series.hasOwnProperty(k)) {
|
||||
var line_serie = linedata_series[k];
|
||||
|
||||
result.push({label:k,data:line_serie.data});
|
||||
}
|
||||
}
|
||||
plot.setData(result);
|
||||
plot.setupGrid();
|
||||
plot.draw();
|
||||
}
|
||||
|
||||
var reset = function() {
|
||||
initline(options.series);
|
||||
}
|
||||
|
||||
this.actions({
|
||||
'set': function(e, message) {
|
||||
setline(message.series, message.value);
|
||||
},
|
||||
'add': function(e, message) {
|
||||
addline(message.series, message.value);
|
||||
},
|
||||
'reset': function(e, message) {
|
||||
reset();
|
||||
}
|
||||
});
|
||||
// return element to allow further work
|
||||
return this.$element;
|
||||
}
|
||||
|
||||
//
|
||||
//
|
||||
//
|
||||
|
||||
// a simple barchart example
|
||||
block.fn.barchart = function(config) {
|
||||
var options = $.extend({
|
||||
filter_function : function(category,val,max) { return true; },
|
||||
// required
|
||||
series : { "default":{
|
||||
data: {},
|
||||
label: "default",
|
||||
bars: {
|
||||
show: true,
|
||||
barWidth: 0.2,
|
||||
align: "left"
|
||||
}
|
||||
|
||||
} },
|
||||
// flot initialization options
|
||||
options: { xaxis: {
|
||||
mode: "categories",
|
||||
tickLength: 0
|
||||
}}
|
||||
|
||||
}, config);
|
||||
|
||||
var bardata_series = options.series;
|
||||
var bardata_first;
|
||||
|
||||
for (bardata_first in bardata_series) break;
|
||||
|
||||
var translate_bar = function() {
|
||||
var result = [];
|
||||
for(var k in bardata_series) {
|
||||
if (bardata_series.hasOwnProperty(k)) {
|
||||
var newserie = jQuery.extend({}, bardata_series[k]);
|
||||
var newdata = [];
|
||||
var data = newserie.data;
|
||||
var max = 0;
|
||||
|
||||
for(var l in data) {
|
||||
if (data.hasOwnProperty(l)) {
|
||||
max = Math.max(max, data[l]);
|
||||
}
|
||||
}
|
||||
|
||||
for(var l in data) {
|
||||
if (data.hasOwnProperty(l)) {
|
||||
if ( options.filter_function(l,data[l],max) )
|
||||
newdata.push([l,data[l]]);
|
||||
}
|
||||
}
|
||||
newserie.data = newdata;
|
||||
result.push(newserie);
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
var plot = $.plot(this.$element, translate_bar(), options.options);
|
||||
|
||||
var addbar = function(serie_label, category, value) {
|
||||
var data;
|
||||
|
||||
if ( serie_label == undefined )
|
||||
data = bardata_series[bardata_first].data;
|
||||
else
|
||||
data = bardata_series[serie_label].data;
|
||||
if (data.hasOwnProperty(category))
|
||||
data[category] = (data[category] + value);
|
||||
else
|
||||
data[category] = value;
|
||||
redraw();
|
||||
}
|
||||
|
||||
var setbar = function(serie_label, category, value) {
|
||||
var data;
|
||||
|
||||
if ( serie_label == undefined )
|
||||
data = bardata_series[bardata_first].data;
|
||||
else
|
||||
data = bardata_series[serie_label].data;
|
||||
data[category] = value;
|
||||
redraw();
|
||||
}
|
||||
|
||||
var redraw = function() {
|
||||
plot.setData(translate_bar());
|
||||
plot.setupGrid();
|
||||
plot.draw();
|
||||
}
|
||||
|
||||
var reset = function() {
|
||||
for(var k in bardata_series) {
|
||||
if (bardata_series.hasOwnProperty(k)) {
|
||||
bardata_series[k].data = {};
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
this.actions({
|
||||
'set': function(e, message) {
|
||||
setbar(message.series,message.value[0],message.value[1]);
|
||||
},
|
||||
'add': function(e, message) {
|
||||
addbar(message.series,message.value[0],message.value[1]);
|
||||
},
|
||||
'reset': function(e, message) {
|
||||
reset();
|
||||
}
|
||||
});
|
||||
// return element to allow further work
|
||||
return this.$element;
|
||||
}
|
||||
|
||||
//
|
||||
//
|
||||
//
|
||||
|
||||
// a simple piechart example
|
||||
block.fn.piechart = function(config) {
|
||||
var options = $.extend({
|
||||
// see: http://www.flotcharts.org/flot/examples/series-pie/
|
||||
filter_function : function(category,val,max) { return true; },
|
||||
options : {
|
||||
series: {
|
||||
pie: {
|
||||
show: true
|
||||
}
|
||||
},
|
||||
// demo crashes with this option
|
||||
// legend: { show: false }
|
||||
}}, config);
|
||||
|
||||
// create empty piechart with parameter options
|
||||
var plot = $.plot(this.$element, [],options.options);
|
||||
|
||||
// dict containing the labels and values
|
||||
var piedata_dict = {};
|
||||
|
||||
var addpie = function(label, value) {
|
||||
if (piedata_dict.hasOwnProperty(label))
|
||||
piedata_dict[label] = (piedata_dict[label] + value);
|
||||
else
|
||||
piedata_dict[label] = value;
|
||||
redraw();
|
||||
}
|
||||
|
||||
var setpie = function(label, value) {
|
||||
piedata_dict[label] = value;
|
||||
redraw();
|
||||
}
|
||||
|
||||
var redraw = function() {
|
||||
var result = [];
|
||||
var max = 0;
|
||||
|
||||
for(var k in piedata_dict) {
|
||||
if (piedata_dict.hasOwnProperty(k)) {
|
||||
max = Math.max(max, piedata_dict[k]);
|
||||
}
|
||||
}
|
||||
for(var k in piedata_dict) {
|
||||
if (piedata_dict.hasOwnProperty(k)) {
|
||||
if ( options.filter_function(k,piedata_dict[k],max) )
|
||||
result.push({label:k,data:piedata_dict[k]});
|
||||
}
|
||||
}
|
||||
plot.setData(result);
|
||||
plot.setupGrid();
|
||||
plot.draw();
|
||||
}
|
||||
|
||||
var reset = function() {
|
||||
piedata_dict = {};
|
||||
}
|
||||
|
||||
this.actions({
|
||||
'set': function(e, message) {
|
||||
setpie(message.value[0],message.value[1]);
|
||||
},
|
||||
'add': function(e, message) {
|
||||
addpie(message.value[0],message.value[1]);
|
||||
},
|
||||
'reset': function(e, message) {
|
||||
reset();
|
||||
}
|
||||
});
|
||||
// return element to allow further work
|
||||
return this.$element;
|
||||
}
|
||||
|
||||
})(jQuery, block);
|
||||
Reference in New Issue
Block a user