From 5c6edfc8d339d010bccf6e4426e315e911b21ee5 Mon Sep 17 00:00:00 2001 From: Nicolas Lempereur Date: Tue, 9 Oct 2018 14:34:21 +0000 Subject: [PATCH] [FIX] base: res_config_settings allow deferred field If a deferred field, for example with auth_user_policy installed: is inside the res_config_settings view, the rendering will be deferred which is not taken into account when initializing the content (_initModules) or attaching to DOM (after start). Thus we would would get an error and have no access to settings. The issue that happened in 12.0 was solved with 23bec7fb7 and refactored in between in 5bbbd25ed, but the heart of the issue was not solved in the case of a customization. With this commit, we do not lose the deferred when it is necessary to keep them in the case of deferred while rendering. Without fix, the added test fails with a traceback and message: TypeError: Cannot read property 'settingView' of undefined opw-1890343 closes #27589 --- .../base/static/src/js/res_config_settings.js | 19 +++-- .../base/static/tests/base_settings_tests.js | 79 +++++++++++++++++++ 2 files changed, 90 insertions(+), 8 deletions(-) diff --git a/odoo/addons/base/static/src/js/res_config_settings.js b/odoo/addons/base/static/src/js/res_config_settings.js index 855b03452ae..6edb5a7e264 100644 --- a/odoo/addons/base/static/src/js/res_config_settings.js +++ b/odoo/addons/base/static/src/js/res_config_settings.js @@ -24,12 +24,13 @@ var BaseSettingRenderer = FormRenderer.extend({ }, start: function () { - this._super.apply(this, arguments); + var res = this._super.apply(this, arguments); if (config.device.isMobile) { core.bus.on("DOM_updated", this, function () { this._moveToTab(this.currentIndex || this._currentAppIndex()); }); } + return res; }, /** @@ -266,14 +267,16 @@ var BaseSettingRenderer = FormRenderer.extend({ }, _render: function () { + var self = this; var res = this._super.apply(this, arguments); - this._initModules(); - this._renderLeftPanel(); - this._initSearch(); - if (config.device.isMobile) { - this._enableSwipe(); - } - return res; + return res.then(function () { + self._initModules(); + self._renderLeftPanel(); + self._initSearch(); + if (config.device.isMobile) { + self._enableSwipe(); + } + }); }, _renderLeftPanel: function () { diff --git a/odoo/addons/base/static/tests/base_settings_tests.js b/odoo/addons/base/static/tests/base_settings_tests.js index e0ee5dd6380..8ee80605e18 100644 --- a/odoo/addons/base/static/tests/base_settings_tests.js +++ b/odoo/addons/base/static/tests/base_settings_tests.js @@ -1,9 +1,11 @@ odoo.define('base.settings_tests', function (require) { "use strict"; +var field_registry = require('web.field_registry'); var testUtils = require('web.test_utils'); var view_registry = require('web.view_registry'); +var createAsyncView = testUtils.createAsyncView; var createView = testUtils.createView; var BaseSettingsView = view_registry.get('base_settings'); var createActionManager = testUtils.createActionManager; @@ -178,5 +180,82 @@ QUnit.module('base_settings_tests', { form.destroy(); }); + QUnit.test('settings view works with deferred field', function (assert) { + assert.expect(7); + + var def = $.Deferred(); + testUtils.patch(field_registry.map.boolean, { + willStart: function () { + var res = this._super.apply(this, arguments); + return $.when(def, res); + } + }); + + createAsyncView({ + View: BaseSettingsView, + model: 'project', + data: this.data, + arch: '
' + + '
' + + '
' + + ' ' + + '
' + + '
' + + '
' + + '
' + + '
' + + '
'+ + '
' + + '
No Record Found
' + + '
' + + '
' + + ''+ + '
'+ + '
'+ + '
' + + '
' + + '
' + + '
' + + ''+ + '
'+ + '
'+ + '
' + + '
' + + '
' + + '
' + + '', + }).then(function (form) { + assert.notOk(form.$('.oe_form_configuration').is(':empty'), + "render should finish once deferred fields are resolved"); + assert.ok(form.$('.tab.selected').is('[data-key="crm"]')); + assert.ok(form.$('.tab').is('[data-key="otherapp"]')); + assert.ok(form.$('.app_settings_block[data-key="crm"]').is(':visible')); + assert.ok(form.$('.app_settings_block[data-key="otherapp"]').is(':hidden')); + assert.ok($(document.activeElement).is('.searchInput'), "search has focus"); + form.destroy(); + }).always(function () { + testUtils.unpatch(field_registry.map.boolean); + }); + + assert.strictEqual($('.oe_form_configuration').length, 0, + "view is not attached until deferred are resolved"); + + // resolve fields widget deferred so view is attached + def.resolve(); + }); + }); });