summaryrefslogtreecommitdiff
path: root/addons
diff options
context:
space:
mode:
authorGéry Debongnie <ged@odoo.com>2017-11-16 11:10:03 +0100
committerGéry Debongnie <ged@odoo.com>2017-11-16 12:20:30 +0100
commit672b403d056f06eacf2c4c8ce6b31aed949df6e4 (patch)
tree895b72673e3d591a52b831d4d0dad78adb72549d /addons
parent797f0c1b6e6d7f137b15182b6011a77b8122a469 (diff)
[FIX] web: make sure modifiers works for async widgets
Before this commit, asynchronous field widgets (with willStart async), with a non empty template had a problem: the invisible modifier was not applied properly. The reason is that the code that applied the modifiers was called directly after the widget was 'willStarted'. This means that if this is async, and if there is a template, the $el in willStart will be replaced by another $el after, which will remove the invisible modifier. This was an interesting problem with the pad widget (it is asynchronous the first time a pad widget is instantiated)
Diffstat (limited to 'addons')
-rw-r--r--addons/web/static/src/js/views/basic/basic_renderer.js21
-rw-r--r--addons/web/static/tests/views/form_tests.js36
2 files changed, 48 insertions, 9 deletions
diff --git a/addons/web/static/src/js/views/basic/basic_renderer.js b/addons/web/static/src/js/views/basic/basic_renderer.js
index d335999582e..543ce01191e 100644
--- a/addons/web/static/src/js/views/basic/basic_renderer.js
+++ b/addons/web/static/src/js/views/basic/basic_renderer.js
@@ -513,15 +513,18 @@ var BasicRenderer = AbstractRenderer.extend({
// Update the modifiers registration by associating the widget and by
// giving the modifiers options now (as the potential callback is
// associated to new widget)
- this._registerModifiers(node, record, widget, _.extend({
- callback: (function (element, modifiers, record) {
- element.$el.toggleClass('o_field_empty', !!(
- record.data.id
- && (modifiers.readonly || this.mode === 'readonly')
- && !element.widget.isSet()
- ));
- }).bind(this),
- }, modifiersOptions || {}));
+ var self = this;
+ def.then(function () {
+ self._registerModifiers(node, record, widget, _.extend({
+ callback: function (element, modifiers, record) {
+ element.$el.toggleClass('o_field_empty', !!(
+ record.data.id
+ && (modifiers.readonly || self.mode === 'readonly')
+ && !element.widget.isSet()
+ ));
+ },
+ }, modifiersOptions || {}));
+ });
return widget;
},
diff --git a/addons/web/static/tests/views/form_tests.js b/addons/web/static/tests/views/form_tests.js
index e4e33af0a8f..ed61692a7fc 100644
--- a/addons/web/static/tests/views/form_tests.js
+++ b/addons/web/static/tests/views/form_tests.js
@@ -4,6 +4,7 @@ odoo.define('web.form_tests', function (require) {
var concurrency = require('web.concurrency');
var config = require('web.config');
var core = require('web.core');
+var fieldRegistry = require('web.field_registry');
var FormView = require('web.FormView');
var pyeval = require('web.pyeval');
var RainbowMan = require('web.rainbow_man');
@@ -309,6 +310,41 @@ QUnit.module('Views', {
form.destroy();
});
+ QUnit.test('asynchronous fields can be set invisible', function (assert) {
+ assert.expect(1);
+
+ var def = $.Deferred();
+
+ // we choose this widget because it is a quite simple widget with a non
+ // empty qweb template
+ var PercentPieWidget = fieldRegistry.get('percentpie');
+ fieldRegistry.add('asyncwidget', PercentPieWidget.extend({
+ willStart: function () {
+ return def;
+ },
+ }));
+
+ createAsyncView({
+ View: FormView,
+ model: 'partner',
+ data: this.data,
+ arch: '<form string="Partners">' +
+ '<sheet><group>' +
+ '<field name="foo"/>' +
+ '<field name="int_field" invisible="1" widget="asyncwidget"/>' +
+ '</group></sheet>' +
+ '</form>',
+ res_id: 1,
+ }).then(function (form) {
+ assert.ok(form.$('.o_field_widget[name="int_field"]').hasClass('o_invisible_modifier'),
+ 'int_field is invisible');
+ form.destroy();
+ delete fieldRegistry.map.asyncwidget;
+ });
+ def.resolve();
+ });
+
+
QUnit.test('properly handle modifiers and attributes on notebook tags', function (assert) {
assert.expect(2);