[FIX] web: proper rendering of widget tag
There was no consideration of the fact that the widget rendering process could be asynchronous. This commit fixes that situation so that render a node of type <widget name="..."> is now possible.
This commit is contained in:
@@ -629,15 +629,23 @@ var BasicRenderer = AbstractRenderer.extend({
|
||||
|
||||
// Prepare widget rendering and save the related deferred
|
||||
var def = widget._widgetRenderAndInsert(function () {});
|
||||
if (def.state() === 'pending') {
|
||||
var async = def.state() === 'pending';
|
||||
if (async) {
|
||||
this.defs.push(def);
|
||||
}
|
||||
var $el = async ? $('<div>') : widget.$el;
|
||||
|
||||
// handle other attributes/modifiers
|
||||
this._handleAttributes(widget.$el, node);
|
||||
this._registerModifiers(node, record, widget);
|
||||
widget.$el.addClass('o_widget');
|
||||
return widget.$el;
|
||||
var self = this;
|
||||
def.then(function () {
|
||||
self._handleAttributes(widget.$el, node);
|
||||
self._registerModifiers(node, record, widget);
|
||||
widget.$el.addClass('o_widget');
|
||||
if (async) {
|
||||
$el.replaceWith(widget.$el);
|
||||
}
|
||||
});
|
||||
|
||||
return $el;
|
||||
},
|
||||
|
||||
/**
|
||||
|
||||
@@ -7172,6 +7172,35 @@ QUnit.module('Views', {
|
||||
assert.ok("Behavior can't be tested");
|
||||
});
|
||||
|
||||
QUnit.test('asynchronous rendering of a widget tag', function (assert) {
|
||||
assert.expect(1);
|
||||
|
||||
var def1 = $.Deferred();
|
||||
|
||||
var MyWidget = Widget.extend({
|
||||
willStart: function() {
|
||||
return def1;
|
||||
},
|
||||
});
|
||||
|
||||
widgetRegistry.add('test', MyWidget);
|
||||
|
||||
createAsyncView({
|
||||
View: FormView,
|
||||
model: 'partner',
|
||||
data: this.data,
|
||||
arch: '<form>' +
|
||||
'<widget name="test"/>' +
|
||||
'</form>',
|
||||
}).then(function(form) {
|
||||
assert.strictEqual(form.$('div.o_widget').length, 1,
|
||||
"there should be a div with widget class");
|
||||
form.destroy();
|
||||
delete widgetRegistry.map.test;
|
||||
});
|
||||
|
||||
def1.resolve();
|
||||
});
|
||||
});
|
||||
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user