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;
|