diff options
| author | Christophe Simonis <chs@odoo.com> | 2017-03-28 17:27:19 +0200 |
|---|---|---|
| committer | Christophe Simonis <chs@odoo.com> | 2017-03-28 17:27:19 +0200 |
| commit | 2f68e9e93a11f37241c1be2835e74ff8be95db1d (patch) | |
| tree | 74dd3d3ae1bbca5b87f2b5715c2e4a3d1baf457b /addons/web/static/src/js/views | |
| parent | 55895c7de10592751058b02c01eed39f2d3cffe9 (diff) | |
| parent | 72fa3e8bdae7b339c75294de51ce261b7a9da173 (diff) | |
[MERGE] forward port branch 10.0 up to 72fa3e8bdae
Diffstat (limited to 'addons/web/static/src/js/views')
4 files changed, 40 insertions, 10 deletions
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; }); }, /** |
