diff --git a/addons/web_graph/static/src/js/graph.js b/addons/web_graph/static/src/js/graph.js
index 3363f7cb3a8..7ad283c6810 100644
--- a/addons/web_graph/static/src/js/graph.js
+++ b/addons/web_graph/static/src/js/graph.js
@@ -125,87 +125,66 @@ instance.web_graph.GraphView = instance.web.View.extend({
draw_table: function () {
this.draw_top_headers();
- _.each(this.pivot_table.rows, this.proxy('draw_row'));
+ this.pivot_table.iterate(this.pivot_table.rows, this.proxy('draw_row'));
+ },
+
+ make_border_cell: function (colspan, rowspan) {
+ return $('
| ').addClass('graph_border')
+ .attr('colspan', colspan)
+ .attr('rowspan', rowspan);
+ },
+
+ make_header_title: function (header) {
+ return $(' ')
+ .addClass('web_graph_click')
+ .attr('href', '#')
+ .addClass((header.is_expanded) ? 'icon-minus-sign' : 'icon-plus-sign')
+ .append(header.name);
},
draw_top_headers: function () {
var self = this,
- pivot = this.pivot_table;
+ pivot = this.pivot_table,
+ height = pivot.get_max_path_length(pivot.cols),
+ header_cells = [[this.make_border_cell(1, height)]];
- function get_column_tree(cols, level) {
- var height,
- width,
- children = _.map(cols[0].children, function (child) {
- get_column_tree(child, level - 1);
- });
- if (children.length > 0) {
- height = 1;
- width = _.reduce(children, function (x,y) { return x + y;}, 0);
- } else {
- height = level;
- width = 1;
- }
- return {level: level,
- width: width,
- height: height,
- col:cols[0],
- children: children};
+ function make_col_header (col) {
+ var cell = self.make_border_cell(col.width, col.height);
+ return cell.append(self.make_header_title(col))
+ .attr('data-col-id', col.id);
}
- function make_cell(elem) {
- var title = $(' ')
- .addClass('web_graph_click')
- .attr('href', '#')
- .attr('data-col-id', elem.col.id)
- .addClass((elem.col.is_expanded) ? 'icon-minus-sign' : 'icon-plus-sign')
- .append(elem.col.name);
- return $(' | ').addClass('graph_border')
- .append(title)
- .attr('rowspan', elem.height)
- .attr('colspan', elem.width);
- }
-
- var height = _.max(_.map(pivot.cols, function(g) {return g.path.length;}));
- height = (height === 0) ? 1 : height;
-
- var col_tree = get_column_tree(pivot.cols, height);
-
- var header_cells = [[$(' | ')
- .attr('rowspan', height)
- .addClass('graph_border')]];
-
function make_cells (queue, level) {
- var tree = queue.shift();
- queue = queue.concat(tree.children);
- if (tree.level == level) {
- _.last(header_cells).push(make_cell(tree));
+ var col = queue.shift();
+ queue = queue.concat(col.children);
+ console.log("col",col, level);
+ if (col.path.length == level) {
+ _.last(header_cells).push(make_col_header(col));
} else {
- level -=1;
- header_cells.push([make_cell(tree)]);
+ level +=1;
+ header_cells.push([make_col_header(col)]);
}
if (queue.length !== 0) {
make_cells(queue, level);
}
}
- make_cells([col_tree], height);
+ if (pivot.cols.children.length === 0) {
+ make_cells([pivot.cols], 0);
+ } else {
+ make_cells(pivot.cols.children, 1);
+ }
+
_.each(header_cells, function (cells) {
- var row = $("
").append(cells);
- self.table.append(row);
+ self.table.append($("
").append(cells));
});
},
draw_row: function (row) {
var pivot = this.pivot_table,
html_row = $('
'),
- name = $(' ')
- .addClass('web_graph_click')
- .attr('href', '#')
- .attr('data-row-id', row.id)
- .addClass((row.is_expanded) ? 'icon-minus-sign' : 'icon-plus-sign')
- .append(row.name),
row_header = $(' | ')
- .append(name)
+ .append(this.make_header_title(row))
.addClass('graph_border');
for (var i in _.range(row.path.length)) {
@@ -214,7 +193,7 @@ instance.web_graph.GraphView = instance.web.View.extend({
html_row.append(row_header);
- _.each(pivot.cols, function (col) {
+ pivot.iterate(pivot.cols, function (col) {
var cell = $(' | ').append(pivot.get_value(row.id, col.id));
html_row.append(cell)
});
diff --git a/addons/web_graph/static/src/js/pivot.js b/addons/web_graph/static/src/js/pivot.js
index 3df67e188d8..dca21087ce5 100644
--- a/addons/web_graph/static/src/js/pivot.js
+++ b/addons/web_graph/static/src/js/pivot.js
@@ -2,8 +2,8 @@
var PivotTable = openerp.web.Class.extend({
init: function (options) {
- this.rows = [];
- this.cols = [];
+ this.rows = {};
+ this.cols = {};
this.cells = [];
this.row_groupby = options.row_groupby;
this.col_groupby = [];
@@ -20,7 +20,7 @@ var PivotTable = openerp.web.Class.extend({
// drawing the table (otherwise the data returned will be empty...)
start: function () {
var self = this;
- var main_row = {
+ this.rows = {
id: this.generate_id(),
path: [],
name: "Total",
@@ -28,10 +28,11 @@ var PivotTable = openerp.web.Class.extend({
parent: null,
children: [],
domain: this.domain,
+ height: 1,
+ width: 1,
};
- this.rows.push(main_row);
- var main_col = {
+ this.cols = {
id: this.generate_id(),
path: [],
name: this.measure_label,
@@ -39,34 +40,37 @@ var PivotTable = openerp.web.Class.extend({
parent: null,
children: [],
domain: this.domain,
+ height: 1,
+ width: 1,
};
- this.cols.push(main_col);
// get total and create first cell
var tot = query_groups (this.model, this.measure, this.domain, [])
.then(function (total) {
var val = total[0].attributes.aggregates[self.measure];
- self.set_value(main_row.id, main_col.id, val);
+ self.set_value(self.rows.id, self.cols.id, val);
});
var grp = query_groups (this.model, this.visible_fields(), this.domain, this.row_groupby)
.then(function (groups) {
_.each(groups, function (group) {
- var new_row = {
- id: self.generate_id(),
+ var new_id = self.generate_id();
+ self.rows.children.push({
+ id: new_id,
path: [group.attributes.value[1]],
name: group.attributes.value[1],
is_expanded: false,
- parent: main_row,
+ parent: self.rows,
children: [],
domain: group.model._domain,
- }
- self.rows.push(new_row);
- main_row.children.push(new_row.id);
- self.set_value(new_row.id, main_col.id,
+ height: 1,
+ width: 1,
+ });
+ self.set_value(new_id, self.cols.id,
group.attributes.aggregates[self.measure]);
});
- main_row.is_expanded = true;
+ self.rows.is_expanded = true;
+ self.rows.width = groups.length;
});
return $.when(tot, grp);
@@ -97,8 +101,39 @@ var PivotTable = openerp.web.Class.extend({
return ((c.row_id == row) && (c.col_id == col));
});
return (cell) ? cell.value : '';
- }
+ },
+ iterate: function (header, iterator) {
+ var self = this;
+ iterator(header);
+ _.each(header.children, function (child) {
+ self.iterate(child, iterator);
+ });
+ },
+
+ get_max_path_length: function (header) {
+ var height = 0;
+ this.iterate(this.cols, function (col) {
+ height = Math.max(height, col.path.length);
+ });
+ return height;
+ },
+
+ // function set_dim (cols) {
+ // _.each(cols.children, set_dim);
+ // if (cols.children.length === 0) {
+ // cols.height = height - cols.path.length + 1;
+ // cols.width = 1;
+ // } else {
+ // cols.height = 1;
+ // cols.width = _.reduce(cols.children, function (sum,c) { return sum + c.width;}, 0);
+ // }
+ // }
+
+
+ // toArray: function (header) {
+ // return [header].concat(_.map(header.children), this.toArray(hea))
+ // }
});