From 93cf24f73ae79cdfd0346145d0b828ebd1ea07f9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9ry=20Debongnie?= Date: Wed, 13 Sep 2017 11:48:02 +0200 Subject: [FIX] web: reimplement custom widgets in basic views With the new views, we lost a (almost unused and undocumented) feature: the ability to instantiate custom widgets in a form view, not linked to a particular field. For example: We reintroduce this feature in this commit, with a nice twist: it also works for the list view and the kanban view. --- .../static/src/js/views/basic/basic_renderer.js | 39 ++++++++++++++++++++++ 1 file changed, 39 insertions(+) (limited to 'addons/web/static/src/js/views/basic/basic_renderer.js') 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 0e26e2fa19f..ee6e685c3d4 100644 --- a/addons/web/static/src/js/views/basic/basic_renderer.js +++ b/addons/web/static/src/js/views/basic/basic_renderer.js @@ -11,6 +11,7 @@ var AbstractRenderer = require('web.AbstractRenderer'); var config = require('web.config'); var core = require('web.core'); var dom = require('web.dom'); +var widgetRegistry = require('web.widget_registry'); var qweb = core.qweb; @@ -331,6 +332,19 @@ var BasicRenderer = AbstractRenderer.extend({ _getModifiersData: function (node) { return _.findWhere(this.allModifiersData, {node: node}); }, + /** + * @private + * @param {jQueryElement} $el + * @param {Object} node + */ + _handleAttributes: function ($el, node) { + if (node.attrs.class) { + $el.addClass(node.attrs.class); + } + if (node.attrs.style) { + $el.attr('style', node.attrs.style); + } + }, /** * Used by list and kanban renderers to determine whether or not to display * the no content helper (if there is no data in the state to display) @@ -540,6 +554,31 @@ var BasicRenderer = AbstractRenderer.extend({ _renderView: function () { return $.when(); }, + /** + * Instantiate custom widgets + * + * @private + * @param {Object} record + * @param {Object} node + * @returns {jQueryElement} + */ + _renderWidget: function (record, node) { + var Widget = widgetRegistry.get(node.attrs.name); + var widget = new Widget(this, record); + + // Prepare widget rendering and save the related deferred + var def = widget.__widgetRenderAndInsert(function () {}); + if (def.state() === 'pending') { + this.defs.push(def); + } + + // handle other attributes/modifiers + this._handleAttributes(widget.$el, node); + this._registerModifiers(node, record, widget); + widget.$el.addClass('o_widget'); + return widget.$el; + }, + /** * Rerenders a given widget and make sure the associated data which * referenced the old one is updated. -- cgit v1.2.3