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(); + }); + }); });