diff --git a/addons/web/static/src/js/view_list.js b/addons/web/static/src/js/view_list.js index 8cbe18a46cc..07b24edbfcf 100644 --- a/addons/web/static/src/js/view_list.js +++ b/addons/web/static/src/js/view_list.js @@ -919,6 +919,9 @@ instance.web.ListView.List = instance.web.Class.extend( /** @lends instance.web. throw new Error("Setting 'id' attribute on existing record " + JSON.stringify(record.attributes)); } + // add record to dataset + self.dataset.ids.splice( + self.records.indexOf(record), 0, value); // Set id on new record $row = self.$current.children('tr:not([data-id])'); } else { @@ -1846,9 +1849,21 @@ var Collection = instance.web.Class.extend(/** @lends Collection# */{ return this; }, - _onRecordEvent: function (event, record, options) { + _onRecordEvent: function (event) { + switch(event) { // don't propagate reset events - if (event === 'reset') { return; } + case 'reset': return; + case 'change:id': + var record = arguments[1]; + var new_value = arguments[2]; + var old_value = arguments[3]; + // [change:id, record, new_value, old_value] + if (this._byId[old_value] === record) { + delete this._byId[old_value]; + this._byId[new_value] = record; + } + break; + } this.trigger.apply(this, arguments); }, diff --git a/addons/web/static/test/list-utils.js b/addons/web/static/test/list-utils.js index 7890e71c6bc..97d7ec90cfc 100644 --- a/addons/web/static/test/list-utils.js +++ b/addons/web/static/test/list-utils.js @@ -338,4 +338,33 @@ $(document).ready(function () { ids, [1, 2, 3, 10, 20, 30], 'tree collections should be deeply iterated'); }); + + module("list-weirds", { + setup: function () { + openerp = window.openerp.init([]); + window.openerp.web.corelib(openerp); + window.openerp.web.coresetup(openerp); + window.openerp.web.chrome(openerp); + // views loader stuff + window.openerp.web.data(openerp); + window.openerp.web.views(openerp); + window.openerp.web.list(openerp); + } + }); + test('set-from-noid', function () { + var root = new openerp.web.list.Collection(); + root.add({v: 3}); + root.at(0).set('id', 42); + var record = root.get(42); + equal(root.length, 1); + equal(record.get('v'), 3, "should have fetched the original record"); + }); + test('set-from-previd', function () { + var root = new openerp.web.list.Collection(); + root.add({id: 1, v: 2}); + root.get(1).set('id', 42); + var record = root.get(42); + equal(root.length, 1); + equal(record.get('v'), 2, "should have fetched the original record"); + }); });