diff --git a/addons/base/static/src/js/list-editable.js b/addons/base/static/src/js/list-editable.js index 4aa06cc8152..9a48889d801 100644 --- a/addons/base/static/src/js/list-editable.js +++ b/addons/base/static/src/js/list-editable.js @@ -103,18 +103,27 @@ openerp.base.list.editable = function (openerp) { * Checks if a record is being edited, and if so cancels it */ cancel_pending_edition: function () { + var self = this, cancelled = $.Deferred(); if (!this.edition) { - return; + cancelled.resolve(); + return cancelled.promise(); } if (this.edition_index !== null) { - this.reload_record(this.edition_index); + this.reload_record(this.edition_index, true).then(function () { + cancelled.resolve(); + }); + } else { + cancelled.resolve(); } - this.edition_form.stop(); - this.edition_form.$element.remove(); - delete this.edition_form; - delete this.edition_index; - delete this.edition; + cancelled.then(function () { + self.edition_form.stop(); + self.edition_form.$element.remove(); + delete self.edition_form; + delete self.edition_index; + delete self.edition; + }); + return cancelled.promise(); }, /** * Adapts this list's view description to be suitable to the inner form view of a row being edited. @@ -134,66 +143,66 @@ openerp.base.list.editable = function (openerp) { return view; }, render_row_as_form: function (row) { - this.cancel_pending_edition(); - var self = this; - var $new_row = $('', { - id: _.uniqueId('oe-editable-row-'), - 'class': $(row).attr('class'), - click: function (e) {e.stopPropagation();} - }) - .delegate('button.oe-edit-row-save', 'click', function () { - self.save_row(); - }) - .delegate('button.oe-edit-row-cancel', 'click', function () { - self.cancel_edition(); - }) - .delegate('button', 'keyup', function (e) { - e.stopImmediatePropagation(); - }) - .keyup(function (e) { - switch (e.which) { - case KEY_RETURN: - self.save_row(true); - break; - case KEY_ESCAPE: - self.cancel_edition(); - break; - default: - return; - } - }); - if (row) { - $new_row.replaceAll(row); - } else if (this.options.editable === 'top') { - this.$current.prepend($new_row); - } else if (this.options.editable) { - this.$current.append($new_row); - } - this.edition = true; - this.edition_index = this.dataset.index; - this.edition_form = _.extend(new openerp.base.FormView( - null, this.group.view.session, $new_row.attr('id'), - this.dataset, false), { - template: 'ListView.row.form', - registry: openerp.base.list.form.widgets - }); - $.when(this.edition_form.on_loaded({fields_view: this.get_form_fields_view()})).then(function () { - // put in $.when just in case FormView.on_loaded becomes asynchronous - $new_row.find('td') - .addClass('oe-field-cell') - .removeAttr('width') - .end() - .find('td:first').removeClass('oe-field-cell').end() - .find('td:last').removeClass('oe-field-cell').end(); - // pad in case of groupby - _(self.columns).each(function (column) { - if (column.meta) { - $new_row.prepend(''); - } + this.cancel_pending_edition().then(function () { + var $new_row = $('', { + id: _.uniqueId('oe-editable-row-'), + 'class': $(row).attr('class'), + click: function (e) {e.stopPropagation();} + }) + .delegate('button.oe-edit-row-save', 'click', function () { + self.save_row(); + }) + .delegate('button.oe-edit-row-cancel', 'click', function () { + self.cancel_edition(); + }) + .delegate('button', 'keyup', function (e) { + e.stopImmediatePropagation(); + }) + .keyup(function (e) { + switch (e.which) { + case KEY_RETURN: + self.save_row(true); + break; + case KEY_ESCAPE: + self.cancel_edition(); + break; + default: + return; + } + }); + if (row) { + $new_row.replaceAll(row); + } else if (self.options.editable === 'top') { + self.$current.prepend($new_row); + } else if (self.options.editable) { + self.$current.append($new_row); + } + self.edition = true; + self.edition_index = self.dataset.index; + self.edition_form = _.extend(new openerp.base.FormView( + null, self.group.view.session, $new_row.attr('id'), + self.dataset, false), { + template: 'ListView.row.form', + registry: openerp.base.list.form.widgets }); + $.when(self.edition_form.on_loaded({fields_view: self.get_form_fields_view()})).then(function () { + // put in $.when just in case FormView.on_loaded becomes asynchronous + $new_row.find('td') + .addClass('oe-field-cell') + .removeAttr('width') + .end() + .find('td:first').removeClass('oe-field-cell').end() + .find('td:last').removeClass('oe-field-cell').end(); + // pad in case of groupby + _(self.columns).each(function (column) { + if (column.meta) { + $new_row.prepend(''); + } + }); - self.edition_form.do_show(); + self.edition_form.do_show(); + }); }); }, /** @@ -205,12 +214,7 @@ openerp.base.list.editable = function (openerp) { save_row: function (edit_next) { var self = this; this.edition_form.do_save(function (result) { - self.reload_record(self.dataset.index, true).then(function () { - self.edition_form.stop(); - delete self.edition_form; - delete self.edition_index; - delete self.edition; - + self.cancel_pending_edition().then(function () { $(self).trigger('saved', [self.dataset]); if (!edit_next) { return;