diff --git a/addons/base/static/src/js/list-editable.js b/addons/base/static/src/js/list-editable.js index 8810d902346..1932688783d 100644 --- a/addons/base/static/src/js/list-editable.js +++ b/addons/base/static/src/js/list-editable.js @@ -105,7 +105,7 @@ openerp.base.list_editable = function (openerp) { } if (this.edition_index !== null) { - this.reload_record(this.edition_index).then(function () { + this.reload_record_at_index(this.edition_index).then(function () { cancelled.resolve(); }); } else { @@ -201,6 +201,21 @@ openerp.base.list_editable = function (openerp) { }); }); }, + handle_onwrite: function (record_id, index) { + var self = this; + var on_write_callback = self.view.fields_view.arch.attrs.on_write; + if (!on_write_callback) { return; } + this.dataset.call(on_write_callback, [record_id], function (ids) { + _(ids).each(function (id) { + var record = self.records.get(id); + if (!record) { + record = new openerp.base.list.Record({id: id}); + self.records.add(record, {at: index}); + } + self.reload_record(record); + }); + }); + }, /** * Saves the current row, and triggers the edition of its following * sibling if asked. @@ -215,6 +230,8 @@ openerp.base.list_editable = function (openerp) { {at: self.options.editable === 'top' ? 0 : null}); self.edition_index = self.dataset.index; } + self.handle_onwrite(self.dataset.ids[self.dataset.index], + self.dataset.index); self.cancel_pending_edition().then(function () { $(self).trigger('saved', [self.dataset]); if (!edit_next) { diff --git a/addons/base/static/src/js/list.js b/addons/base/static/src/js/list.js index 95db36f82de..b2faaa55faf 100644 --- a/addons/base/static/src/js/list.js +++ b/addons/base/static/src/js/list.js @@ -672,11 +672,10 @@ openerp.base.ListView.List = openerp.base.Class.extend( /** @lends openerp.base. var $target = $(e.currentTarget), field = $target.closest('td').data('field'), $row = $target.closest('tr'), - record_id = self.row_id($row), - index = self.row_position($row); + record_id = self.row_id($row); $(self).trigger('action', [field, record_id, function () { - return self.reload_record(index); + return self.reload_record(self.records.get(record_id)); }]); }) .delegate('tr', 'click', function (e) { @@ -757,25 +756,31 @@ openerp.base.ListView.List = openerp.base.Class.extend( /** @lends openerp.base. /** * Reloads the record at index ``row_index`` in the list's rows. * - * By default, simply re-renders the record. If the ``fetch`` parameter is - * provided and ``true``, will first fetch the record anew. - * * @param {Number} record_index index of the record to reload - * @param {Boolean} fetch fetches the record from remote before reloading it + * @returns {$.Deferred} promise to the finalization of the reloading */ - reload_record: function (record_index) { + reload_record_at_index: function (record_index) { var r = this.records.at(record_index); + return this.reload_record(r); + }, + /** + * Reloads the provided record by re-reading its content from the server. + * + * @param {Record} record + * @returns {$.Deferred} promise to the finalization of the reloading + */ + reload_record: function (record) { return this.dataset.read_ids( - [r.get('id')], + [record.get('id')], _.pluck(_(this.columns).filter(function (r) { return r.tag === 'field'; }), 'name'), - function (record) { - _(record[0]).each(function (value, key) { - r.set(key, value, {silent: true}); + function (records) { + _(records[0]).each(function (value, key) { + record.set(key, value, {silent: true}); }); - r.trigger('change', r); + record.trigger('change', record); } ); },