summaryrefslogtreecommitdiff
path: root/addons/web/static/src/js
diff options
context:
space:
mode:
authorChristophe Simonis <chs@odoo.com>2017-03-28 17:27:19 +0200
committerChristophe Simonis <chs@odoo.com>2017-03-28 17:27:19 +0200
commit2f68e9e93a11f37241c1be2835e74ff8be95db1d (patch)
tree74dd3d3ae1bbca5b87f2b5715c2e4a3d1baf457b /addons/web/static/src/js
parent55895c7de10592751058b02c01eed39f2d3cffe9 (diff)
parent72fa3e8bdae7b339c75294de51ce261b7a9da173 (diff)
[MERGE] forward port branch 10.0 up to 72fa3e8bdae
Diffstat (limited to 'addons/web/static/src/js')
-rw-r--r--addons/web/static/src/js/framework/pyeval.js45
-rw-r--r--addons/web/static/src/js/views/form_relational_widgets.js3
-rw-r--r--addons/web/static/src/js/views/form_view.js33
-rw-r--r--addons/web/static/src/js/views/list_view.js8
-rw-r--r--addons/web/static/src/js/views/list_view_editable.js6
5 files changed, 78 insertions, 17 deletions
diff --git a/addons/web/static/src/js/framework/pyeval.js b/addons/web/static/src/js/framework/pyeval.js
index d0708bdf356..bcab0b0717f 100644
--- a/addons/web/static/src/js/framework/pyeval.js
+++ b/addons/web/static/src/js/framework/pyeval.js
@@ -850,31 +850,62 @@ function eval_contexts (contexts, evaluation_context) {
function eval_domains (domains, evaluation_context) {
evaluation_context = _.extend(pycontext(), evaluation_context || {});
var result_domain = [];
+ // Normalize only if the first domain is the array ["|"] or ["!"]
+ var need_normalization = (
+ domains &&
+ domains.length > 0 &&
+ domains[0].length === 1 &&
+ (domains[0][0] === "|" || domains[0][0] === "!")
+ );
_(domains).each(function (domain) {
if (_.isString(domain)) {
// wrap raw strings in domain
domain = { __ref: 'domain', __debug: domain };
}
+ var domain_array_to_combine;
switch(domain.__ref) {
case 'domain':
evaluation_context.context = evaluation_context;
- result_domain.push.apply(
- result_domain, py.eval(domain.__debug, wrap_context(evaluation_context)));
+ domain_array_to_combine = py.eval(domain.__debug, wrap_context(evaluation_context));
break;
case 'compound_domain':
var eval_context = eval_contexts([domain.__eval_context]);
- result_domain.push.apply(
- result_domain, eval_domains(
- domain.__domains, _.extend(
- {}, evaluation_context, eval_context)));
+ domain_array_to_combine = eval_domains(
+ domain.__domains, _.extend({}, evaluation_context, eval_context)
+ );
break;
default:
- result_domain.push.apply(result_domain, domain);
+ domain_array_to_combine = domain;
+ }
+ if (need_normalization) {
+ domain_array_to_combine = get_normalized_domain(domain_array_to_combine);
}
+ result_domain.push.apply(result_domain, domain_array_to_combine);
});
return result_domain;
}
+/**
+ * Returns a normalized copy of the given domain array. Normalization is
+ * is making the implicit "&" at the start of the domain explicit, e.g.
+ * [A, B, C] would become ["&", "&", A, B, C].
+ *
+ * @param {Array} domain_array
+ * @returns {Array} normalized copy of the given array
+ */
+function get_normalized_domain(domain_array) {
+ var expected = 1; // Holds the number of expected domain expressions
+ _.each(domain_array, function (item) {
+ if (item === "&" || item === "|") {
+ expected++;
+ } else if (item !== "!") {
+ expected--;
+ }
+ });
+ var new_explicit_ands = _.times(-expected, _.constant("&"));
+ return new_explicit_ands.concat(domain_array);
+}
+
function eval_groupbys (contexts, evaluation_context) {
evaluation_context = _.extend(pycontext(), evaluation_context || {});
var result_group = [];
diff --git a/addons/web/static/src/js/views/form_relational_widgets.js b/addons/web/static/src/js/views/form_relational_widgets.js
index 6a6c258f8f9..2517b3c57b8 100644
--- a/addons/web/static/src/js/views/form_relational_widgets.js
+++ b/addons/web/static/src/js/views/form_relational_widgets.js
@@ -959,7 +959,8 @@ var X2ManyListView = ListView.extend({
field.no_rerender = true;
current_values[field.name] = field.get('value');
});
- var cached_records = _.filter(this.dataset.cache, function(item){return !_.isEmpty(item.values) && !item.to_delete;});
+ var ids = _.map(this.records.records, function (item) { return item.attributes.id; });
+ var cached_records = _.filter(this.dataset.cache, function(item){return _.contains(ids, item.id) && !_.isEmpty(item.values) && !item.to_delete;});
var valid = _.every(cached_records, function(record){
_.each(fields, function(field){
var value = record.values[field.name];
diff --git a/addons/web/static/src/js/views/form_view.js b/addons/web/static/src/js/views/form_view.js
index b1638436742..93c9ceeac1b 100644
--- a/addons/web/static/src/js/views/form_view.js
+++ b/addons/web/static/src/js/views/form_view.js
@@ -55,7 +55,6 @@ var FormView = View.extend(common.FieldManagerMixin, {
this.fields = {};
this.fields_order = [];
this.datarecord = {};
- this._onchange_specs = {};
this.onchanges_mutex = new utils.Mutex();
this.default_focus_field = null;
this.default_focus_button = null;
@@ -75,7 +74,6 @@ var FormView = View.extend(common.FieldManagerMixin, {
this.rendering_engine = new FormRenderingEngine(this);
this.set({actual_mode: this.options.initial_mode});
this.has_been_loaded.done(function() {
- self._build_onchange_specs();
self.on("change:actual_mode", self, self.toggle_buttons);
self.on("change:actual_mode", self, self.toggle_sidebar);
});
@@ -318,8 +316,11 @@ var FormView = View.extend(common.FieldManagerMixin, {
this.update_pager(); // the mode must be actualized before updating the pager
return $.when.apply(null, set_values).then(function() {
if (!record.id) {
- // trigger onchanges
- self.do_onchange(null);
+ // trigger onchange for new record after x2many with non-embedded views are loaded
+ var fields_loaded = _.pluck(self.fields, 'is_loaded');
+ $.when.apply(null, fields_loaded).done(function() {
+ self.do_onchange(null);
+ });
}
self.on_form_changed();
self.rendering_engine.init_fields().then(function() {
@@ -333,7 +334,7 @@ var FormView = View.extend(common.FieldManagerMixin, {
} else {
self.do_push_state({});
}
- self.$el.removeClass('oe_form_dirty');
+ self.$el.removeClass('oe_form_dirty');
});
});
},
@@ -381,7 +382,24 @@ var FormView = View.extend(common.FieldManagerMixin, {
_.each(this.fields, function(field, name) {
self._onchange_fields.push(name);
self._onchange_specs[name] = find(name, field.node);
- _.each(field.field.views, function(view) {
+
+ // we get the list of first-level fields of x2many firstly by
+ // getting them from the field embedded views, then if no embedded
+ // view is present for a loaded view, we get them from the default
+ // view that has been loaded
+
+ // gather embedded view objects
+ var views = _.clone(field.field.views);
+ // also gather default view objects
+ if (field.viewmanager) {
+ _.each(field.viewmanager.views, function(view, view_type) {
+ // add default view if it was not embedded and it is loaded
+ if (views[view_type] === undefined && view.controller) {
+ views[view_type] = view.controller.fields_view;
+ }
+ });
+ }
+ _.each(views, function(view) {
_.each(view.fields, function(_, subname) {
self._onchange_specs[name + '.' + subname] = find(subname, view.arch);
});
@@ -410,6 +428,9 @@ var FormView = View.extend(common.FieldManagerMixin, {
do_onchange: function(widget) {
var self = this;
+ if (self._onchange_specs === undefined) {
+ self._build_onchange_specs();
+ }
var onchange_specs = self._onchange_specs;
try {
var def = $.when({});
diff --git a/addons/web/static/src/js/views/list_view.js b/addons/web/static/src/js/views/list_view.js
index b02c91ed147..83e1b7bf900 100644
--- a/addons/web/static/src/js/views/list_view.js
+++ b/addons/web/static/src/js/views/list_view.js
@@ -948,9 +948,11 @@ ListView.List = Class.extend({
$row = self.$current.children(
'[data-id=' + record.get('id') + ']');
}
- var $newRow = $(self.render_record(record));
- $newRow.find('.o_list_record_selector input').prop('checked', !!$row.find('.o_list_record_selector input').prop('checked'));
- $row.replaceWith($newRow);
+ if ($row.length) {
+ var $newRow = $(self.render_record(record));
+ $newRow.find('.o_list_record_selector input').prop('checked', !!$row.find('.o_list_record_selector input').prop('checked'));
+ $row.replaceWith($newRow);
+ }
},
'add': function (ev, records, record, index) {
var $new_row = $(self.render_record(record));
diff --git a/addons/web/static/src/js/views/list_view_editable.js b/addons/web/static/src/js/views/list_view_editable.js
index c3b2209c477..6beb6a7a044 100644
--- a/addons/web/static/src/js/views/list_view_editable.js
+++ b/addons/web/static/src/js/views/list_view_editable.js
@@ -828,6 +828,10 @@ ListView.List.include(/** @lends instance.web.ListView.List# */{
if (!this.view.editable() || !this.view.is_action_enabled('edit')) {
return this._super.apply(this, arguments);
}
+ if (this.__is_starting_edition) {
+ return;
+ }
+ this.__is_starting_edition = true;
var self = this;
var args = arguments;
@@ -839,6 +843,8 @@ ListView.List.include(/** @lends instance.web.ListView.List# */{
focus_field: $(event.target).not(".o_readonly").data('field'),
}).fail(function() {
return _super.apply(self, args); // The record can't be edited so open it in a modal (use-case: readonly mode)
+ }).always(function () {
+ self.__is_starting_edition = false;
});
},
/**