From 4fb2e76b431d9f587d9f9a67925f6e0e56bdc683 Mon Sep 17 00:00:00 2001 From: Denis Ledoux Date: Thu, 10 Mar 2016 14:03:14 +0100 Subject: [PATCH] [FIX] web: `char_domain` rendering on record switch When using the left/riht arrow to switch of record in a form view, the rendering of the `char_domain` widget was done too early, before all fields are ready / set, and if the domain of the previous record could not be applied on the current record, it leaded to a traceback. This revision introduce a new deffered, because I coudln't find one that was doing what I was looking for: - `is_initialized` is a defferred which is resolved when the form view has finished its rendering for the first time - `reload_mutex` is a mutex used only when reloading or switch to left/right record. While the one needed in this case is a deferred which is resolved when the record has finished being rendered, wether when its when coming from the list view to the form view (and it's not the first time the form view is loaded, e.g. list view -> form view -> list view -> form view, another record), or on the switch of left/right record. opw-671594 --- addons/web/static/src/js/view_form.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/addons/web/static/src/js/view_form.js b/addons/web/static/src/js/view_form.js index 92121e75a85..5c7a85f3bc3 100644 --- a/addons/web/static/src/js/view_form.js +++ b/addons/web/static/src/js/view_form.js @@ -118,6 +118,7 @@ instance.web.FormView = instance.web.View.extend(instance.web.form.FieldManagerM "footer_to_buttons": false, }); this.is_initialized = $.Deferred(); + this.record_loaded = $.Deferred(); this.mutating_mutex = new $.Mutex(); this.save_list = []; this.render_value_defs = []; @@ -329,6 +330,7 @@ instance.web.FormView = instance.web.View.extend(instance.web.form.FieldManagerM this._actualize_mode(); this.set({ 'title' : record.id ? record.display_name : _t("New") }); + this.record_loaded = $.Deferred(); _(this.fields).each(function (field, f) { field._dirty_flag = false; field._inhibit_on_change_flag = true; @@ -344,6 +346,7 @@ instance.web.FormView = instance.web.View.extend(instance.web.form.FieldManagerM self.on_form_changed(); self.rendering_engine.init_fields(); self.is_initialized.resolve(); + self.record_loaded.resolve(); self.do_update_pager(record.id === null || record.id === undefined); if (self.sidebar) { self.sidebar.do_attachement_update(self.dataset, self.datarecord.id); @@ -2568,7 +2571,7 @@ instance.web.form.FieldCharDomain = instance.web.form.AbstractField.extend(insta }); if (this.options.model_field){ this.field_manager.fields[this.options.model_field].on("change:value", this, function(){ - if (self.view && self.view.onchanges_mutex){ + if (self.view && self.view.record_loaded.state == "resolved" && self.view.onchanges_mutex){ self.view.onchanges_mutex.def.then(function(){ self.display_field(); });