From 4abdfc35d30510b04d1d88a7add74efc591d9236 Mon Sep 17 00:00:00 2001 From: svs-odoo Date: Thu, 13 Dec 2018 10:44:32 +0000 Subject: [PATCH] [FIX] web: wait many2many tags' fetches for rendering Before this commit, we don't assure fetch's deferreds were resolved to return _readGroup. Thus, in some conditions, kanban was rendered before records data was updated so many2many tags could be missing. Now, we return _readGroup when fetch's deferreds were resolved. Task #1910805 closes odoo/odoo#29508 --- .../static/src/js/views/basic/basic_model.js | 9 ++-- addons/web/static/tests/views/kanban_tests.js | 45 +++++++++++++++++++ 2 files changed, 51 insertions(+), 3 deletions(-) diff --git a/addons/web/static/src/js/views/basic/basic_model.js b/addons/web/static/src/js/views/basic/basic_model.js index 8266b1dee42..fecbaa5b90c 100644 --- a/addons/web/static/src/js/views/basic/basic_model.js +++ b/addons/web/static/src/js/views/basic/basic_model.js @@ -4289,9 +4289,12 @@ var BasicModel = AbstractModel.extend({ } return list; }).then(function () { - self._fetchX2ManysSingleBatch(list); - self._fetchReferencesSingleBatch(list); - return list; + var fetchingDefs = []; + fetchingDefs.push(self._fetchX2ManysSingleBatch(list)); + fetchingDefs.push(self._fetchReferencesSingleBatch(list)); + return $.when.apply($, fetchingDefs).then(function () { + return list; + }); }); }); }, diff --git a/addons/web/static/tests/views/kanban_tests.js b/addons/web/static/tests/views/kanban_tests.js index 814cf7f5173..c8ac8890da1 100644 --- a/addons/web/static/tests/views/kanban_tests.js +++ b/addons/web/static/tests/views/kanban_tests.js @@ -2378,6 +2378,51 @@ QUnit.module('Views', { kanban.destroy(); }); + QUnit.test('wait x2manys batch fetches to re-render', function (assert) { + assert.expect(4); + var done = assert.async(); + + var def; + var kanban = createView({ + View: KanbanView, + model: 'partner', + data: this.data, + arch: '' + + '' + + '' + + '
' + + '' + + '
' + + '
' + + '
', + groupBy: ['product_id'], + mockRPC: function (route, args) { + var result = this._super(route, args); + if (args.method === 'read') { + return $.when(def).then(function() { + return result; + }); + } + return result; + }, + }); + + def = $.Deferred(); + assert.containsN(kanban, '.o_tag', 2); + kanban.update({groupBy: ['state']}); + + def.resolve().then(function () { + assert.containsN(kanban, '.o_tag', 2, + 'Should display 2 tags after update'); + assert.strictEqual(kanban.$('.o_kanban_group:eq(1) .o_tag').text(), + 'gold', 'First category should be \'gold\''); + assert.strictEqual(kanban.$('.o_kanban_group:eq(2) .o_tag').text(), + 'silver', 'Second category should be \'silver\''); + kanban.destroy(); + done(); + }); + }); + QUnit.test('can drag and drop a record from one column to the next', function (assert) { assert.expect(9);