+
+/******************************************************************************
+ * Drawing charts methods...
+ ******************************************************************************/
+ bar_chart: function () {
+ var self = this,
+ dim_x = this.pivot.rows.groupby.length,
+ dim_y = this.pivot.cols.groupby.length,
+ data;
+
+ // No groupby **************************************************************
+ if ((dim_x === 0) && (dim_y === 0)) {
+ data = [{key: 'Total', values:[{
+ x: 'Total',
+ y: this.pivot.get_value(this.pivot.rows.main.id, this.pivot.cols.main.id),
+ }]}];
+ // Only column groupbys ****************************************************
+ } else if ((dim_x === 0) && (dim_y >= 1)){
+ data = _.map(this.pivot.get_columns_depth(1), function (header) {
+ return {
+ key: header.title,
+ values: [{x:header.root.main.title, y: self.pivot.get_total(header)}]
+ };
+ });
+ // Just 1 row groupby ******************************************************
+ } else if ((dim_x === 1) && (dim_y === 0)) {
+ data = _.map(this.pivot.rows.main.children, function (pt) {
+ var value = self.pivot.get_value(pt.id, self.pivot.cols.main.id),
+ title = (pt.title !== undefined) ? pt.title : 'Undefined';
+ return {x: title, y: value};
+ });
+ data = [{key: this.measure_label(), values:data}];
+ // 1 row groupby and some col groupbys**************************************
+ } else if ((dim_x === 1) && (dim_y >= 1)) {
+ data = _.map(this.pivot.get_columns_depth(1), function (colhdr) {
+ var values = _.map(self.pivot.get_rows_depth(1), function (header) {
+ return {
+ x: header.title || 'Undefined',
+ y: self.pivot.get_value(header.id, colhdr.id, 0)
+ };
+ });
+ return {key: colhdr.title || 'Undefined', values: values};
+ });
+ // At least two row groupby*************************************************
+ } else {
+ var keys = _.uniq(_.map(this.pivot.get_rows_depth(2), function (hdr) {
+ return hdr.title || 'Undefined';
+ }));
+ data = _.map(keys, function (key) {
+ var values = _.map(self.pivot.get_rows_depth(1), function (hdr) {
+ var subhdr = _.find(hdr.children, function (child) {
+ return ((child.title === key) || ((child.title === undefined) && (key === 'Undefined')));
+ });
+ return {
+ x: hdr.title || 'Undefined',
+ y: (subhdr) ? self.pivot.get_total(subhdr) : 0
+ };
+ });
+ return {key:key, values: values};
+ });
+ }
+
+ nv.addGraph(function () {
+ var chart = nv.models.multiBarChart()
+ .width(self.width)
+ .height(self.height)
+ .stacked(self.bar_ui === 'stack')
+ .staggerLabels(true);
+
+ if (dim_x === 1 && dim_y === 0) { chart.showControls(false); }
+
+ d3.select(self.svg)
+ .datum(data)
+ .attr('width', self.width)
+ .attr('height', self.height)
+ .call(chart);
+
+ nv.utils.windowResize(chart.update);
+ return chart;
+ });
+
+ },
+
+ line_chart: function () {
+ var self = this,
+ dim_x = this.pivot.rows.groupby.length,
+ dim_y = this.pivot.cols.groupby.length;
+
+ var data = _.map(this.pivot.get_cols_leaves(), function (col) {
+ var values = _.map(self.pivot.get_rows_depth(dim_x), function (row) {
+ return {x: row.title, y: self.pivot.get_value(row.id,col.id, 0)};
+ });
+ var title = _.map(col.path, function (p) {
+ return p || 'Undefined';
+ }).join('/');
+ if (dim_y === 0) {
+ title = self.measure_label();
+ }
+ return {values: values, key: title};
+ });
+
+ nv.addGraph(function () {
+ var chart = nv.models.lineChart()
+ .x(function (d,u) { return u; })
+ .width(self.width)
+ .height(self.height)
+ .margin({top: 30, right: 20, bottom: 20, left: 60});
+
+ d3.select(self.svg)
+ .attr('width', self.width)
+ .attr('height', self.height)
+ .datum(data)
+ .call(chart);
+
+ return chart;
+ });
+ },
+
+ pie_chart: function () {
+ var self = this,
+ dim_x = this.pivot.rows.groupby.length;
+
+ var data = _.map(this.pivot.get_rows_leaves(), function (row) {
+ var title = _.map(row.path, function (p) {
+ return p || 'Undefined';
+ }).join('/');
+ if (dim_x === 0) {
+ title = self.measure_label;
+ }
+ return {x: title, y: self.pivot.get_total(row)};
+ });
+
+ nv.addGraph(function () {
+ var chart = nv.models.pieChart()
+ .color(d3.scale.category10().range())
+ .width(self.width)
+ .height(self.height);
+
+ d3.select(self.svg)
+ .datum(data)
+ .transition().duration(1200)
+ .attr('width', self.width)
+ .attr('height', self.height)
+ .call(chart);
+
+ nv.utils.windowResize(chart.update);
+ return chart;
+ });
+ },
+