summaryrefslogtreecommitdiff
path: root/addons/web_graph/static/src/js/graph_widget.js
diff options
context:
space:
mode:
authorVidhin Mehta (OpenERP) <vme@tinyerp.com>2014-05-05 10:02:33 +0530
committerVidhin Mehta (OpenERP) <vme@tinyerp.com>2014-05-05 10:02:33 +0530
commite41508cb8d7fd2a2c06e3fab9ce1503e8efa30fa (patch)
tree8e0fbb849cebc9b3ac0f87355a5248f51826a491 /addons/web_graph/static/src/js/graph_widget.js
parent4312b921f3db41529cbd4f501a6b5dcba2bebd08 (diff)
parent8fbebfd752fa8933584711522675d354b3217839 (diff)
[MERGE]Trunk.
bzr revid: vme@tinyerp.com-20140505043233-2t2e2vb1yv86hyxp
Diffstat (limited to 'addons/web_graph/static/src/js/graph_widget.js')
-rw-r--r--addons/web_graph/static/src/js/graph_widget.js183
1 files changed, 102 insertions, 81 deletions
diff --git a/addons/web_graph/static/src/js/graph_widget.js b/addons/web_graph/static/src/js/graph_widget.js
index 317ea6cbfb9..9946e149d96 100644
--- a/addons/web_graph/static/src/js/graph_widget.js
+++ b/addons/web_graph/static/src/js/graph_widget.js
@@ -43,8 +43,15 @@ openerp.web_graph.Graph = openerp.web.Widget.extend({
this.$('.graph_main_content').addClass('graph_pivot_mode');
}
+ // get search view
+ var parent = this.getParent();
+ while (!(parent instanceof openerp.web.ViewManager)) {
+ parent = parent.getParent();
+ }
+ this.search_view = parent.searchview;
+
openerp.session.rpc('/web_graph/check_xlwt').then(function (result) {
- self.$('.graph_options_selection label').toggle(result);
+ self.$('.graph_options_selection label').last().toggle(result);
});
return this.model.call('fields_get', []).then(function (f) {
@@ -76,16 +83,9 @@ openerp.web_graph.Graph = openerp.web.Widget.extend({
// this method gets the fields that appear in the search view, under the
// 'Groupby' heading
get_search_fields: function () {
- var self = this,
- parent = this.getParent();
-
- while (!(parent instanceof openerp.web.ViewManager)) {
- parent = parent.getParent();
- }
-
- var search_view = parent.searchview;
+ var self = this;
- var groupbygroups = _(search_view.inputs).select(function (g) {
+ var groupbygroups = _(this.search_view.inputs).select(function (g) {
return g instanceof openerp.web.search.GroupbyGroup;
});
@@ -260,21 +260,12 @@ openerp.web_graph.Graph = openerp.web.Widget.extend({
option_selection: function (event) {
event.preventDefault();
switch (event.currentTarget.getAttribute('data-choice')) {
- case 'bar_grouped':
- this.bar_ui = 'group';
- if (this.mode === 'bar') {
- this.display_data();
- }
- break;
- case 'bar_stacked':
- this.bar_ui = 'stack';
- if (this.mode === 'bar') {
- this.display_data();
- }
- break;
case 'swap_axis':
this.swap_axis();
break;
+ case 'expand_all':
+ this.pivot.expand_all().then(this.proxy('display_data'));
+ break;
case 'update_values':
this.pivot.update_data().then(this.proxy('display_data'));
break;
@@ -305,11 +296,11 @@ openerp.web_graph.Graph = openerp.web.Widget.extend({
if (header.expanded) {
this.fold(header);
return;
- }
+ }
if (header.path.length < header.root.groupby.length) {
this.expand(id);
return;
- }
+ }
if (!this.important_fields.length) {
return;
}
@@ -453,55 +444,67 @@ openerp.web_graph.Graph = openerp.web.Widget.extend({
build_rows: function (raw) {
var self = this,
pivot = this.pivot,
- m, i, cell;
-
- return _.map(pivot.rows.headers, function (row) {
- var cells = [];
- var pivot_cells = [];
- for (i = 0; i < pivot.cells.length; i++) {
- if (pivot.cells[i].x == row.id || pivot.cells[i].y == row.id) {
- pivot_cells.push(pivot.cells[i]);
- }
+ m, i, j, k, cell, row;
+
+ var rows = [];
+ var cells, pivot_cells, values;
+
+ var nbr_of_rows = pivot.rows.headers.length;
+ var col_headers = pivot.get_cols_leaves();
+
+ for (i = 0; i < nbr_of_rows; i++) {
+ row = pivot.rows.headers[i];
+ cells = [];
+ pivot_cells = [];
+ for (j = 0; j < pivot.cells.length; j++) {
+ if (pivot.cells[j].x == row.id || pivot.cells[j].y == row.id) {
+ pivot_cells.push(pivot.cells[j]);
+ }
}
- _.each(pivot.get_cols_leaves(), function (col) {
- var values;
- for (i = 0; i < pivot_cells.length; i++) {
- if (pivot_cells[i].x == col.id || pivot_cells[i].y == col.id) {
- values = pivot_cells[i].values;
+
+ for (j = 0; j < col_headers.length; j++) {
+ values = undefined;
+ for (k = 0; k < pivot_cells.length; k++) {
+ if (pivot_cells[k].x == col_headers[j].id || pivot_cells[k].y == col_headers[j].id) {
+ values = pivot_cells[k].values;
break;
- }
+ }
}
if (!values) { values = new Array(pivot.measures.length);}
for (m = 0; m < pivot.measures.length; m++) {
- cells.push(self.make_cell(row,col,values[m], m, raw));
+ cells.push(self.make_cell(row,col_headers[j],values[m], m, raw));
}
- });
- if (pivot.get_cols_leaves().length > 1) {
+ }
+ if (col_headers.length > 1) {
var totals = pivot.get_total(row);
for (m = 0; m < pivot.measures.length; m++) {
- cell = self.make_cell(row, pivot.main_col(), totals[m], m, raw);
+ cell = self.make_cell(row, pivot.cols.headers[0], totals[m], m, raw);
cell.is_bold = 'true';
cells.push(cell);
}
}
- return {
+ rows.push({
id: row.id,
indent: row.path.length,
title: row.title,
expanded: row.expanded,
cells: cells,
- };
- });
+ });
+ }
+
+ return rows;
},
// ----------------------------------------------------------------------
// Main display method
// ----------------------------------------------------------------------
display_data: function () {
+ var scroll = $(window).scrollTop();
this.$('.graph_main_content svg').remove();
this.$('.graph_main_content div').remove();
this.table.empty();
this.table.toggleClass('heatmap', this.heatmap_mode !== 'none');
+ this.$('.graph_options_selection label').last().toggleClass('disabled', this.pivot.no_data);
this.width = this.$el.width();
this.height = Math.min(Math.max(document.documentElement.clientHeight - 116 - 60, 250), Math.round(0.8*this.$el.width()));
@@ -511,6 +514,7 @@ openerp.web_graph.Graph = openerp.web.Widget.extend({
} else {
if (this.mode === 'pivot') {
this.draw_table();
+ $(window).scrollTop(scroll);
} else {
this.$('.graph_main_content').append($('<div><svg>'));
this.svg = this.$('.graph_main_content svg')[0];
@@ -524,9 +528,11 @@ openerp.web_graph.Graph = openerp.web.Widget.extend({
// ----------------------------------------------------------------------
draw_table: function () {
var table = this.build_table();
- this.draw_headers(table.headers);
- this.draw_measure_row(table.measure_row);
- this.draw_rows(table.rows);
+ var doc_fragment = $(document.createDocumentFragment());
+ this.draw_headers(table.headers, doc_fragment);
+ this.draw_measure_row(table.measure_row, doc_fragment);
+ this.draw_rows(table.rows, doc_fragment);
+ this.table.append(doc_fragment);
},
make_header_cell: function (header) {
@@ -549,7 +555,7 @@ openerp.web_graph.Graph = openerp.web.Widget.extend({
return cell.append(content);
},
- draw_headers: function (headers) {
+ draw_headers: function (headers, doc_fragment) {
var make_cell = this.make_header_cell,
empty_cell = $('<th>').attr('rowspan', headers.length),
thead = $('<thead>');
@@ -562,10 +568,11 @@ openerp.web_graph.Graph = openerp.web.Widget.extend({
thead.append(html_row);
});
thead.children(':first').prepend(empty_cell);
- this.table.append(thead);
+ doc_fragment.append(thead);
+ this.thead = thead;
},
- draw_measure_row: function (measure_row) {
+ draw_measure_row: function (measure_row, doc_fragment) {
if (this.pivot.measures.length === 1) { return; }
var html_row = $('<tr>').append('<th>');
_.each(measure_row, function (cell) {
@@ -573,25 +580,39 @@ openerp.web_graph.Graph = openerp.web.Widget.extend({
if (cell.is_bold) {measure_cell.css('font-weight', 'bold');}
html_row.append(measure_cell);
});
- this.$('thead').append(html_row);
+ this.thead.append(html_row);
},
- draw_rows: function (rows) {
- var table = this.table,
- make_cell = this.make_header_cell;
-
- _.each(rows, function (row) {
- var html_row = $('<tr>').append(make_cell(row));
- _.each(row.cells, function (cell) {
- var html_cell = $('<td>').text(cell.value);
- if (_.has(cell, 'color')) {
- html_cell.css('background-color', $.Color(255, cell.color, cell.color));
+ draw_rows: function (rows, doc_fragment) {
+ var make_cell = this.make_header_cell,
+ cell,
+ html_row, i, j;
+
+ var cells_list,
+ hcell,
+ rows_length, cells_length;
+
+ rows_length = rows.length;
+ for (i = 0; i < rows_length; i++) {
+ html_row = $('<tr>').append(make_cell(rows[i]));
+ cells_length = rows[i].cells.length;
+ cells_list = [];
+
+ for (j = 0; j < cells_length; j++) {
+ cell = rows[i].cells[j];
+ hcell = '<td';
+ if (cell.is_bold || cell.color) {
+ hcell += ' style="';
+ if (cell.is_bold) hcell += 'font-weight: bold;';
+ if (cell.color) hcell += 'background-color:' + $.Color(255, cell.color, cell.color) + ';';
+ hcell += '"';
}
- if (cell.is_bold) { html_cell.css('font-weight', 'bold'); }
- html_row.append(html_cell);
- });
- table.append(html_row);
- });
+ hcell += '>' + cell.value + '</td>';
+ cells_list[j] = hcell;
+ }
+ html_row.append(cells_list.join(''));
+ doc_fragment.append($('<tbody>').append(html_row));
+ }
},
// ----------------------------------------------------------------------
@@ -608,7 +629,7 @@ openerp.web_graph.Graph = openerp.web.Widget.extend({
if ((dim_x === 0) && (dim_y === 0)) {
data = [{key: _t('Total'), values:[{
x: _t('Total'),
- y: this.pivot.get_total(),
+ y: this.pivot.get_total()[0],
}]}];
// Only column groupbys
} else if ((dim_x === 0) && (dim_y >= 1)){
@@ -621,7 +642,7 @@ openerp.web_graph.Graph = openerp.web.Widget.extend({
// Just 1 row groupby
} else if ((dim_x === 1) && (dim_y === 0)) {
data = _.map(this.pivot.main_row().children, function (pt) {
- var value = self.pivot.get_total(pt),
+ var value = self.pivot.get_total(pt)[0],
title = (pt.title !== undefined) ? pt.title : _t('Undefined');
return {x: title, y: value};
});
@@ -658,8 +679,6 @@ openerp.web_graph.Graph = openerp.web.Widget.extend({
nv.addGraph(function () {
var chart = nv.models.multiBarChart()
- .width(self.width)
- .height(self.height)
.reduceXTicks(false)
.stacked(self.bar_ui === 'stack')
.showControls(show_controls);
@@ -687,9 +706,12 @@ openerp.web_graph.Graph = openerp.web.Widget.extend({
dim_x = this.pivot.rows.groupby.length,
dim_y = this.pivot.cols.groupby.length;
+ var rows = this.pivot.get_rows_with_depth(dim_x),
+ labels = _.pluck(rows, 'title');
+
var data = _.map(this.pivot.get_cols_leaves(), function (col) {
- var values = _.map(self.pivot.get_rows_with_depth(dim_x), function (row) {
- return {x: row.title, y: self.pivot.get_values(row.id,col.id)[0] || 0};
+ var values = _.map(rows, function (row, index) {
+ return {x: index, y: self.pivot.get_values(row.id,col.id)[0] || 0};
});
var title = _.map(col.path, function (p) {
return p || _t('Undefined');
@@ -702,10 +724,9 @@ openerp.web_graph.Graph = openerp.web.Widget.extend({
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});
+ .x(function (d,u) { return u; });
+
+ chart.xAxis.tickFormat(function (d,u) {return labels[d];});
d3.select(self.svg)
.attr('width', self.width)
@@ -727,14 +748,14 @@ openerp.web_graph.Graph = openerp.web.Widget.extend({
if (dim_x === 0) {
title = self.measure_label;
}
- return {x: title, y: self.pivot.get_total(row)};
+ return {x: title, y: self.pivot.get_total(row)[0]};
});
nv.addGraph(function () {
var chart = nv.models.pieChart()
- .color(d3.scale.category10().range())
.width(self.width)
- .height(self.height);
+ .height(self.height)
+ .color(d3.scale.category10().range());
d3.select(self.svg)
.datum(data)