From e9d6b595c9689194cf86d8baf464fd606ecfe1fa Mon Sep 17 00:00:00 2001 From: Fabien Meghazi Date: Mon, 26 May 2014 13:41:29 +0200 Subject: [PATCH 1/2] [FIX] Temporary fix o2m editable list onchange bug The edition is cancelled when an onchange happen in o2m while editing. Editor.shelve() and Editor.unshelve() are prepared but doesn't work. Would need help of xmo. --- addons/web/static/src/js/view_form.js | 67 +++++++++++++------ .../web/static/src/js/view_list_editable.js | 13 ++++ 2 files changed, 59 insertions(+), 21 deletions(-) diff --git a/addons/web/static/src/js/view_form.js b/addons/web/static/src/js/view_form.js index 9ef75775e3928..ecf39ec23d468 100644 --- a/addons/web/static/src/js/view_form.js +++ b/addons/web/static/src/js/view_form.js @@ -619,8 +619,8 @@ instance.web.FormView = instance.web.View.extend(instance.web.form.FieldManagerM if (!field) { return; } field.node.attrs.domain = domain; }); - - if (result.value) { + + if (!_.isEmpty(result.value)) { this._internal_set_values(result.value, processed); } if (!_.isEmpty(result.warning)) { @@ -4187,28 +4187,50 @@ instance.web.form.FieldOne2Many = instance.web.form.AbstractField.extend({ reload_current_view: function() { var self = this; self.is_loaded = self.is_loaded.then(function() { - var active_view = self.viewmanager.active_view; - var view = self.viewmanager.views[active_view].controller; - if(active_view === "list") { - return view.reload_content(); - } else if (active_view === "form") { + var view = self.get_active_view(); + if (view.type === "list") { + return view.controller.reload_content(); + } else if (view.type === "form") { if (self.dataset.index === null && self.dataset.ids.length >= 1) { self.dataset.index = 0; } var act = function() { - return view.do_show(); + return view.controller.do_show(); }; self.form_last_update = self.form_last_update.then(act, act); return self.form_last_update; - } else if (view.do_search) { - return view.do_search(self.build_domain(), self.dataset.get_context(), []); + } else if (view.controller.do_search) { + return view.controller.do_search(self.build_domain(), self.dataset.get_context(), []); } }, undefined); return self.is_loaded; }, + get_active_view: function () { + /** + * Returns the current active view if any. + */ + if (this.viewmanager && this.viewmanager.views && this.viewmanager.active_view && + this.viewmanager.views[this.viewmanager.active_view] && + this.viewmanager.views[this.viewmanager.active_view].controller) { + return { + type: this.viewmanager.active_view, + controller: this.viewmanager.views[this.viewmanager.active_view].controller + }; + } + }, set_value: function(value_) { value_ = value_ || []; var self = this; + var view = this.get_active_view(); + var was_editing = false; + if (view && view.type == 'list' && view.controller.editor.is_editing()) { + was_editing = true; + // TODO: make shelve, unshelve work + // view.controller.editor.shelve(); + + // Meanwhile ... + view.controller.cancel_edition(); + } this.dataset.reset_ids([]); var ids; if(value_.length >= 1 && value_[0] instanceof Array) { @@ -4262,6 +4284,10 @@ instance.web.form.FieldOne2Many = instance.web.form.AbstractField.extend({ if (this.dataset.index === null && this.dataset.ids.length > 0) { this.dataset.index = 0; } + if (was_editing) { + // TODO: make shelve, unshelve work + // view.controller.editor.unshelve(); + } this.trigger_on_change(); if (this.is_started) { return self.reload_current_view(); @@ -4293,33 +4319,32 @@ instance.web.form.FieldOne2Many = instance.web.form.AbstractField.extend({ return this.save_any_view(); }, save_any_view: function() { - if (this.viewmanager && this.viewmanager.views && this.viewmanager.active_view && - this.viewmanager.views[this.viewmanager.active_view] && - this.viewmanager.views[this.viewmanager.active_view].controller) { - var view = this.viewmanager.views[this.viewmanager.active_view].controller; + var view = this.get_active_view(); + if (view) { if (this.viewmanager.active_view === "form") { - if (view.is_initialized.state() !== 'resolved') { + if (view.controller.is_initialized.state() !== 'resolved') { return $.when(false); } - return $.when(view.save()); + return $.when(view.controller.save()); } else if (this.viewmanager.active_view === "list") { - return $.when(view.ensure_saved()); + return $.when(view.controller.ensure_saved()); } } return $.when(false); }, is_syntax_valid: function() { - if (! this.viewmanager || ! this.viewmanager.views[this.viewmanager.active_view]) + var view = this.get_active_view(); + if (!view){ return true; - var view = this.viewmanager.views[this.viewmanager.active_view].controller; + } switch (this.viewmanager.active_view) { case 'form': - return _(view.fields).chain() + return _(view.controller.fields).chain() .invoke('is_valid') .all(_.identity) .value(); case 'list': - return view.is_valid(); + return view.controller.is_valid(); } return true; }, diff --git a/addons/web/static/src/js/view_list_editable.js b/addons/web/static/src/js/view_list_editable.js index e2c63eb191ac5..ebb6b0d99bf17 100644 --- a/addons/web/static/src/js/view_list_editable.js +++ b/addons/web/static/src/js/view_list_editable.js @@ -686,6 +686,7 @@ this.delegate = this.options.delegate; this.record = null; + this._shelve = []; this.form = new (this.options.formView)( this, this.delegate.dataset, false, { @@ -813,6 +814,18 @@ this.record = null; this.form.do_hide(); return $.when(record); + }, + shelve: function () { + var self = this; + return this.cancel(true).then(function (record) { + self._shelve.push(record); + return record; + }); + }, + unshelve: function () { + this.record = this._shelve.pop(); + this.form.do_show(); + return $.when(this.record); } }); From 4803fc4faa598e265dc0d643982abf85ce3ea72f Mon Sep 17 00:00:00 2001 From: Fabien Meghazi Date: Mon, 26 May 2014 15:59:14 +0200 Subject: [PATCH 2/2] [FIX] prevent o2m onchange to fail Still need to properly fix it, currently doesn't apply the onchange --- addons/web/static/src/js/view_form.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/addons/web/static/src/js/view_form.js b/addons/web/static/src/js/view_form.js index ecf39ec23d468..3a54c22a5a156 100644 --- a/addons/web/static/src/js/view_form.js +++ b/addons/web/static/src/js/view_form.js @@ -4224,12 +4224,14 @@ instance.web.form.FieldOne2Many = instance.web.form.AbstractField.extend({ var view = this.get_active_view(); var was_editing = false; if (view && view.type == 'list' && view.controller.editor.is_editing()) { - was_editing = true; // TODO: make shelve, unshelve work + // was_editing = true; // view.controller.editor.shelve(); // Meanwhile ... - view.controller.cancel_edition(); + view.controller.cancel_edition(true); + view.controller.start_edition(); + return; } this.dataset.reset_ids([]); var ids;