[FIX] correctly calls the parent of the graph view in the constructor (now, the view...
[odoo/odoo.git] / addons / web_graph / static / src / js / graph.js
index 234fffc..9806e70 100644 (file)
@@ -18,7 +18,7 @@ instance.web_graph.GraphView = instance.web.View.extend({
     view_type: 'graph',
 
     init: function(parent, dataset, view_id, options) {
-        this._super(parent);
+        this._super(parent, dataset, view_id, options);
         this.dataset = dataset;
         this.model = new instance.web.Model(dataset.model, {group_by_no_leaf: true});
         this.search_view = parent.searchview;
@@ -50,38 +50,60 @@ instance.web_graph.GraphView = instance.web.View.extend({
 
     view_loading: function (fields_view_get) {
         var self = this,
-            measure = null;
+            arch = fields_view_get.arch,
+            measure = null,
+            stacked = false;
 
-        if (fields_view_get.arch.attrs.type === 'bar') {
+        if (arch.attrs.type === 'bar' || !_.has(arch.attrs, 'type')) {
             this.graph_widget.mode = 'bar_chart';
         }
+        if (arch.attrs.stacked === 'True') {
+            stacked = true;
+        }
 
-        _.each(fields_view_get.arch.children, function (field) {
-            if ('name' in field.attrs) {
+        _.each(arch.children, function (field) {
+            if (_.has(field.attrs, 'type')) {
+                switch (field.attrs.type) {
+                    case 'row':
+                        self.default_row_groupby.push(field.attrs.name);
+                        break;
+                    case 'col':
+                        self.default_col_groupby.push(field.attrs.name);
+                        break;
+                    case 'measure':
+                        measure = field.attrs.name;
+                        break;
+                }
+            } else {  // old style, kept for backward compatibility
                 if ('operator' in field.attrs) {
-                    measure = field.attrs.name;
+                    measure = (measure) ? measure : field.attrs.name;
                 } else {
-                    if (measure) {
-                        self.default_col_groupby.push(field.attrs.name);
-                    } else {
-                        self.default_row_groupby.push(field.attrs.name);
-                    }
+                    self.default_row_groupby.push(field.attrs.name);
                 }
             }
         });
-        this.graph_widget.pivot.config({measure:measure, update:false});
+        this.graph_widget.config({
+            measure:measure,
+            update:false,
+            bar_ui: (stacked) ? 'stack' : 'group'
+        });
     },
 
     do_search: function (domain, context, group_by) {
-        var self = this,
-            col_groupby = context.col_group_by || [],
+        var col_groupby = context.col_group_by || [],
             options = {domain:domain};
 
         this.search_view_groupby = group_by;
+
+        if (group_by.length && this.groupby_mode !== 'manual') {
+            if (_.isEqual(col_groupby, [])) {
+                col_groupby = this.default_col_groupby;
+            }
+        }
         if (group_by.length || col_groupby.length) {
             this.groupby_mode = 'manual';
         }
-        if (!this.graph_widget.enabled) { 
+        if (!this.graph_widget.enabled) {
             options.update = false;
             options.silent = true;
         }
@@ -97,6 +119,7 @@ instance.web_graph.GraphView = instance.web.View.extend({
 
         if (!this.graph_widget.enabled) {
             this.graph_widget.activate_display();
+            this.ViewManager.on('switch_mode', this, function () {this.graph_widget.pivot.update_data(); });
         }
     },
 
@@ -110,7 +133,8 @@ instance.web_graph.GraphView = instance.web.View.extend({
             query = this.search_view.query;
 
         this.groupby_mode = 'manual';
-        if (_.isEqual(this.search_view_groupby, this.graph_widget.pivot.rows.groupby)) {
+        if (_.isEqual(this.search_view_groupby, this.graph_widget.pivot.rows.groupby) ||
+            (!_.has(this.search_view, '_s_groupby'))) {
             return;
         }
         var rows = _.map(this.graph_widget.pivot.rows.groupby, function (group) {
@@ -148,7 +172,7 @@ instance.web_graph.GraphView = instance.web.View.extend({
 });
 
 instance.web_graph.Graph = instance.web.Widget.extend({
-    template: "GraphWidget",
+    template: 'GraphWidget',
 
     events: {
         'click .graph_mode_selection li' : 'mode_selection',
@@ -225,7 +249,6 @@ instance.web_graph.Graph = instance.web.Widget.extend({
                                          .attr('href', '#')
                                          .append(self.fields[measure].string);
                 measure_selection.append($('<li></li>').append(choice));
-
             });
         });
 
@@ -240,7 +263,7 @@ instance.web_graph.Graph = instance.web.Widget.extend({
         this.pivot.on('redraw_required', this, this.proxy('display_data'));
         this.pivot.update_data();
         this.enabled = true;
-        instance.web.bus.on('click', this, function (ev) {
+        instance.web.bus.on('click', this, function () {
             if (this.dropdown) {
                 this.dropdown.remove();
                 this.dropdown = null;
@@ -249,8 +272,8 @@ instance.web_graph.Graph = instance.web.Widget.extend({
     },
 
     display_data: function () {
-        var pivot = this.pivot;
         this.$('.graph_main_content svg').remove();
+        this.$('.graph_main_content div').remove();
         this.table.empty();
 
         if (this.visible_ui) {
@@ -258,9 +281,8 @@ instance.web_graph.Graph = instance.web.Widget.extend({
         } else {
             this.$('.graph_header').css('display', 'none');
         }
-        if (pivot.no_data) {
-            var msg = 'No data available. Try to remove any filter or add some data.';
-            this.table.append($('<tr><td>' + msg + '</td></tr>'));
+        if (this.pivot.no_data) {
+            this.$('.graph_main_content').append($(QWeb.render('graph_no_data')));
         } else {
             var table_modes = ['pivot', 'heatmap', 'row_heatmap', 'col_heatmap'];
             if (_.contains(table_modes, this.mode)) {
@@ -270,15 +292,7 @@ instance.web_graph.Graph = instance.web.Widget.extend({
                 this.svg = this.$('.graph_main_content svg')[0];
                 this.width = this.$el.width();
                 this.height = Math.min(Math.max(document.documentElement.clientHeight - 116 - 60, 250), Math.round(0.8*this.$el.width()));
-                // var options = {
-                //     svg: 
-                //     mode: this.mode,
-                //     width: this.$el.width(),
-                //     height: Math.min(Math.max(document.documentElement.clientHeight - 116 - 60, 250), Math.round(0.8*this.$el.width())),
-                //     measure_label: this.measure_label()
-                // };
                 this[this.mode]();
-                // openerp.web_graph.draw_chart(options);
             }
         }
     },
@@ -322,8 +336,7 @@ instance.web_graph.Graph = instance.web.Widget.extend({
         event.stopPropagation();
         var id = event.target.attributes['data-id'].nodeValue,
             header = this.pivot.get_header(id),
-            self = this,
-            dim = header.root.groupby.length;
+            self = this;
 
         if (header.is_expanded) {
             this.pivot.fold(header);
@@ -332,6 +345,9 @@ instance.web_graph.Graph = instance.web.Widget.extend({
                 var field = header.root.groupby[header.path.length];
                 this.pivot.expand(id, field);
             } else {
+                if (!this.important_fields.length) {
+                    return;
+                }
                 var fields = _.map(this.important_fields, function (field) {
                         return {id: field, value: self.fields[field].string};
                 });
@@ -346,8 +362,7 @@ instance.web_graph.Graph = instance.web.Widget.extend({
     },
 
     field_selection: function (event) {
-        var self = this,
-            id = event.target.attributes['data-id'].nodeValue,
+        var id = event.target.attributes['data-id'].nodeValue,
             field_id = event.target.attributes['data-field-id'].nodeValue;
         event.preventDefault();
         this.pivot.expand(id, field_id);
@@ -560,12 +575,13 @@ instance.web_graph.Graph = instance.web.Widget.extend({
 
         nv.addGraph(function () {
           var chart = nv.models.multiBarChart()
-                .tooltips(false)
                 .width(self.width)
                 .height(self.height)
-                .stacked(self.bar_ui === 'stacked')
+                .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)
@@ -615,8 +631,7 @@ instance.web_graph.Graph = instance.web.Widget.extend({
 
     pie_chart: function () {
         var self = this,
-            dim_x = this.pivot.rows.groupby.length,
-            dim_y = this.pivot.cols.groupby.length;
+            dim_x = this.pivot.rows.groupby.length;
 
         var data = _.map(this.pivot.get_rows_leaves(), function (row) {
             var title = _.map(row.path, function (p) {