From 86842fe9c8129d3530c622875c2ad5ec8d06e8a0 Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Fri, 16 Nov 2012 17:44:16 +0100 Subject: [PATCH] [FIX] correctly handle case of deleting-an-o2m-line-being-edited move special case in o2m listview to main editable and expand to correctly fit edition cases, not just work in case of creation issue: if a row being edited is deleted in an o2m, the form will be blurred and try cancelling/saving the edition and reloading the row, but this will only happen *after* the record/row/whatever has been "deleted" and (amongst other things) removed from the buffered o2m cache, leading to a tentative read on the server side (usually with a local id which doesn't even make sense) and thus an error. Intercept the deletion signal to cancel the edition immediately and only let the deletion through after the edition has successfully been canceled. bzr revid: xmo@openerp.com-20121116164416-8kr39t6jtqy2s3jc --- addons/web/static/src/js/view_form.js | 25 +++++-------------- .../web/static/src/js/view_list_editable.js | 9 +++++++ 2 files changed, 15 insertions(+), 19 deletions(-) diff --git a/addons/web/static/src/js/view_form.js b/addons/web/static/src/js/view_form.js index 05e0acb6f33..dad622fb7f9 100644 --- a/addons/web/static/src/js/view_form.js +++ b/addons/web/static/src/js/view_form.js @@ -3837,26 +3837,13 @@ instance.web.form.One2ManyListView = instance.web.ListView.extend({ this._super.apply(this, arguments); }, do_delete: function (ids) { - var self = this; - var next = $.when(); - var _super = this._super; - // handle deletion of an item which does not exist - // TODO: better handle that in the editable list? - var false_id_index = _(ids).indexOf(false); - if (false_id_index !== -1) { - ids.splice(false_id_index, 1); - next = this.cancel_edition(true); + var confirm = window.confirm; + window.confirm = function () { return true; }; + try { + return this._super(ids); + } finally { + window.confirm = confirm; } - return next.then(function () { - // wheeee - var confirm = window.confirm; - window.confirm = function () { return true; }; - try { - return _super.call(self, ids); - } finally { - window.confirm = confirm; - } - }); } }); instance.web.form.One2ManyGroups = instance.web.ListView.Groups.extend({ diff --git a/addons/web/static/src/js/view_list_editable.js b/addons/web/static/src/js/view_list_editable.js index 8bcf8b5d036..1abe3caab39 100644 --- a/addons/web/static/src/js/view_list_editable.js +++ b/addons/web/static/src/js/view_list_editable.js @@ -77,6 +77,15 @@ openerp.web.list_editable = function (instance) { do_edit: function (index, id, dataset) { _.extend(this.dataset, dataset); }, + do_delete: function (ids) { + var _super = this._super.bind(this); + var next = this.editor.is_editing() + ? this.cancel_edition(true) + : $.when(); + return next.then(function () { + return _super(ids); + }); + }, editable: function () { return this.fields_view.arch.attrs.editable || this._context_editable