[FIX] handling of setting/resetting ids on records in list collections
authorXavier Morel <xmo@openerp.com>
Mon, 2 Jul 2012 12:29:02 +0000 (14:29 +0200)
committerXavier Morel <xmo@openerp.com>
Mon, 2 Jul 2012 12:29:02 +0000 (14:29 +0200)
bzr revid: xmo@openerp.com-20120702122902-f349shdjslbbxd3k

addons/web/static/src/js/view_list.js
addons/web/static/test/list-utils.js

index 8cbe18a..07b24ed 100644 (file)
@@ -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);
     },
 
index 7890e71..97d7ec9 100644 (file)
@@ -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");
+    });
 });