diff --git a/addons/web/static/src/js/pyeval.js b/addons/web/static/src/js/pyeval.js index d5499a028b7..bad98e7b2a0 100644 --- a/addons/web/static/src/js/pyeval.js +++ b/addons/web/static/src/js/pyeval.js @@ -888,15 +888,9 @@ return new $.Deferred(function (d) {setTimeout(function () { var result; try { - var contexts = ([instance.session.user_context] || []).concat(source.contexts); - // see Session.eval_context in Python - result = { - context: instance.web.pyeval.eval('contexts', contexts), - domain: instance.web.pyeval.eval('domains', source.domains), - group_by: instance.web.pyeval.eval('groupbys', source.group_by_seq || []) - }; - - } catch (e) { + result = instance.web.pyeval.sync_eval_domains_and_contexts(source); + } + catch (e) { result = { error: { code: 400, message: instance.web._t("Evaluation Error"), @@ -906,9 +900,18 @@ instance.web._t("Local evaluation failure\n%s\n\n%s"), e.message, JSON.stringify(source)) } - }}; + }}; } d.resolve(result); }, 0); }); }; + instance.web.pyeval.sync_eval_domains_and_contexts = function (source) { + var contexts = ([instance.session.user_context] || []).concat(source.contexts); + // see Session.eval_context in Python + return { + context: instance.web.pyeval.eval('contexts', contexts), + domain: instance.web.pyeval.eval('domains', source.domains), + group_by: instance.web.pyeval.eval('groupbys', source.group_by_seq || []) + }; + }; })(); diff --git a/addons/web_graph/static/src/js/graph_view.js b/addons/web_graph/static/src/js/graph_view.js index 953de133ef9..8ae99849bab 100644 --- a/addons/web_graph/static/src/js/graph_view.js +++ b/addons/web_graph/static/src/js/graph_view.js @@ -162,6 +162,10 @@ instance.web_graph.GraphView = instance.web.View.extend({ return; } + var custom_groups = this.get_custom_filter_groupbys(); + row_groupby = row_groupby.slice(custom_groups.groupby.length); + col_groupby = col_groupby.slice(custom_groups.col_groupby.length); + if (row_gb_changed && col_gb_changed) { // when two changes to the search view will be done, the method do_search // will be called twice, once with the correct groupby and incorrect col_groupby, @@ -233,5 +237,46 @@ instance.web_graph.GraphView = instance.web.View.extend({ }; }); }, + + get_custom_filter_groupbys: function () { + var gb = [], + col_gb = []; + + var facet = this.search_view.query.at(0); + if (facet) { + if (facet.get('category') !== 'GroupBy' && facet.get('category') !== 'ColGroupBy') { + gb = get_groupby(facet); + col_gb = get_col_groupby(facet); + } + } + return { + groupby: gb, + col_groupby: col_gb, + } + } + }); + +function get_groupby(facet) { + var field = facet.get('field'), + result = []; + if ('get_groupby' in field) { + result = instance.web.pyeval.sync_eval_domains_and_contexts({ + group_by_seq: field.get_groupby(facet) + }).group_by; + } + return result; +} +function get_col_groupby(facet) { + var field = facet.get('field'), + result = []; + if ('get_context' in field) { + result = instance.web.pyeval.sync_eval_domains_and_contexts({ + contexts: field.get_context(facet) + }).context.col_group_by || []; + } + return result; +} + + }; diff --git a/addons/web_graph/static/src/js/graph_widget.js b/addons/web_graph/static/src/js/graph_widget.js index f0e07e06e6a..060eb70b514 100644 --- a/addons/web_graph/static/src/js/graph_widget.js +++ b/addons/web_graph/static/src/js/graph_widget.js @@ -594,41 +594,52 @@ openerp.web_graph.Graph = openerp.web.Widget.extend({ // Drawing the table // ---------------------------------------------------------------------- draw_table: function () { + var custom_gbs = this.graph_view.get_custom_filter_groupbys(), + frozen_rows = custom_gbs.groupby.length, + frozen_cols = custom_gbs.col_groupby.length; + var table = this.build_table(); var doc_fragment = $(document.createDocumentFragment()); - this.draw_headers(table.headers, doc_fragment); + this.draw_headers(table.headers, doc_fragment, frozen_cols); this.draw_measure_row(table.measure_row, doc_fragment); - this.draw_rows(table.rows, doc_fragment); + this.draw_rows(table.rows, doc_fragment, frozen_rows); this.table.append(doc_fragment); }, - make_header_cell: function (header) { + make_header_cell: function (header, frozen) { var cell = (_.has(header, 'cells') ? $('