From 01e3a5996f9fab841be270b84f0877d0b8b9fc37 Mon Sep 17 00:00:00 2001 From: mcm-odoo <mcm@odoo.com> Date: Wed, 15 Jan 2020 13:03:29 +0000 Subject: [PATCH] [REF] web: pivot: use owl_compatibility tools MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This commit changes ControllerAdapter to a mixin that inherits WidgetAdapterMixin and RendererWrapper now extends ComponentWrapper. This commit also changes PivotController base class/mixin and uses the Odoo legacy custom_events because of the adapter. closes odoo/odoo#43256 Related: odoo/enterprise#7744 Signed-off-by: Géry Debongnie (ged) <ged@openerp.com> --- .../src/js/views/abstract_controller.js | 20 +++++-- .../static/src/js/views/controller_adapter.js | 44 -------------- .../src/js/views/pivot/pivot_controller.js | 27 ++++----- .../static/src/js/views/pivot/pivot_view.js | 2 +- .../static/src/js/views/renderer_wrapper.js | 57 +------------------ .../tests/views/abstract_controller_tests.js | 9 +-- addons/web/static/tests/views/pivot_tests.js | 2 +- addons/web/views/webclient_templates.xml | 1 - 8 files changed, 36 insertions(+), 126 deletions(-) delete mode 100644 addons/web/static/src/js/views/controller_adapter.js diff --git a/addons/web/static/src/js/views/abstract_controller.js b/addons/web/static/src/js/views/abstract_controller.js index 152d8c080715..a0152e5ccc4d 100644 --- a/addons/web/static/src/js/views/abstract_controller.js +++ b/addons/web/static/src/js/views/abstract_controller.js @@ -18,12 +18,13 @@ var concurrency = require('web.concurrency'); var config = require('web.config'); var core = require('web.core'); var mvc = require('web.mvc'); +var { WidgetAdapterMixin } = require('web.OwlCompatibility'); var session = require('web.session'); var QWeb = core.qweb; -var AbstractController = mvc.Controller.extend(ActionMixin, { +var AbstractController = mvc.Controller.extend(ActionMixin, WidgetAdapterMixin, { custom_events: _.extend({}, ActionMixin.custom_events, { navigation_move: '_onNavigationMove', open_record: '_onOpenRecord', @@ -106,6 +107,7 @@ var AbstractController = mvc.Controller.extend(ActionMixin, { this.controlPanelElements.$switch_buttons.off(); } this._super.apply(this, arguments); + WidgetAdapterMixin.destroy.call(this, ...arguments); }, /** * Called each time the controller is attached into the DOM. @@ -118,6 +120,7 @@ var AbstractController = mvc.Controller.extend(ActionMixin, { this._searchPanel.on_attach_callback(); } this.renderer.on_attach_callback(); + WidgetAdapterMixin.on_attach_callback.call(this, ...arguments); }, /** * Called each time the controller is detached from the DOM. @@ -127,6 +130,7 @@ var AbstractController = mvc.Controller.extend(ActionMixin, { this._controlPanel.on_detach_callback(); } this.renderer.on_detach_callback(); + WidgetAdapterMixin.on_detach_callback.call(this, ...arguments); }, //-------------------------------------------------------------------------- @@ -296,16 +300,17 @@ var AbstractController = mvc.Controller.extend(ActionMixin, { }); }); }, - /** - * Update the state of the renderer. - * This method is required to be overridden in OWL components through the controller - * adapter + * Update the state of the renderer (handle both Widget and Component + * renderers). * * @param {Object} state the model state * @param {Object} params will be given to the model and to the renderer */ - updateRendererState: function(state, params) { + updateRendererState: function (state, params) { + if (this.renderer instanceof owl.Component) { + return this.renderer.update(state); + } return this.renderer.updateState(state, params); }, @@ -462,6 +467,9 @@ var AbstractController = mvc.Controller.extend(ActionMixin, { * @private */ _startRenderer: function () { + if (this.renderer instanceof owl.Component) { + return this.renderer.mount(this.$('.o_content')[0]); + } return this.renderer.appendTo(this.$('.o_content')); }, /** diff --git a/addons/web/static/src/js/views/controller_adapter.js b/addons/web/static/src/js/views/controller_adapter.js deleted file mode 100644 index aeb857b6763c..000000000000 --- a/addons/web/static/src/js/views/controller_adapter.js +++ /dev/null @@ -1,44 +0,0 @@ -odoo.define('web.ControllerAdapter', function (require) { -"use strict"; - -var AbstractController = require('web.AbstractController'); - -var ControllerAdapter = AbstractController.extend({ - - /** - * @override - */ - destroy: function () { - this._super.apply(this, arguments); - this.renderer.destroy(); - }, - - /** - * @override - * */ - updateRendererState: async function (props) { - let prom; - this.renderer.updateProps(props); - if (this.renderer.__owl__.isMounted) { - prom = this.renderer.render(); - } else { - prom = this.renderer.mount(this.$('.o_content')[0], true); - } - return prom; - }, - - //-------------------------------------------------------------------------- - // Private - //-------------------------------------------------------------------------- - /** - * @override - * @private - */ - _startRenderer: async function () { - return this.renderer.mount(this.$('.o_content')[0]); - }, -}); - -return ControllerAdapter; - -}); diff --git a/addons/web/static/src/js/views/pivot/pivot_controller.js b/addons/web/static/src/js/views/pivot/pivot_controller.js index 606367d4d3ac..e1c33a53fec9 100644 --- a/addons/web/static/src/js/views/pivot/pivot_controller.js +++ b/addons/web/static/src/js/views/pivot/pivot_controller.js @@ -12,7 +12,7 @@ odoo.define('web.PivotController', function (require) { * view. */ - const ControllerAdapter = require('web.ControllerAdapter'); + const AbstractController = require('web.AbstractController'); const core = require('web.core'); const framework = require('web.framework'); const session = require('web.session'); @@ -20,14 +20,15 @@ odoo.define('web.PivotController', function (require) { const _t = core._t; const QWeb = core.qweb; - const PivotController = ControllerAdapter.extend({ - events: Object.assign({}, ControllerAdapter.prototype.events, { + const PivotController = AbstractController.extend({ + custom_events: Object.assign({}, AbstractController.prototype.custom_events, { closed_header_click: '_onClosedHeaderClicked', open_view: '_onOpenView', opened_header_click: '_onOpenedHeaderClicked', sort_rows: '_onSortRows', groupby_menu_selection: '_onGroupByMenuSelection', }), + /** * @override * @param parent @@ -206,7 +207,7 @@ odoo.define('web.PivotController', function (require) { * @private * */ _onOpenedHeaderClicked: function (ev) { - this.model.closeGroup(ev.detail.cell.groupId, ev.detail.type); + this.model.closeGroup(ev.data.cell.groupId, ev.data.type); this.update({}, { reload: false }); }, /** @@ -214,9 +215,9 @@ odoo.define('web.PivotController', function (require) { * @private * */ _onClosedHeaderClicked: async function (ev) { - const cell = ev.detail.cell; + const cell = ev.data.cell; const groupId = cell.groupId; - const type = ev.detail.type; + const type = ev.data.type; const group = { rowValues: groupId[0], @@ -245,8 +246,8 @@ odoo.define('web.PivotController', function (require) { _onGroupByMenuSelection: async function (ev) { ev.stopPropagation(); - let groupBy = ev.detail.field.name; - const interval = ev.detail.interval; + let groupBy = ev.data.field.name; + const interval = ev.data.interval; if (interval) { groupBy = groupBy + ':' + interval; } @@ -260,7 +261,7 @@ odoo.define('web.PivotController', function (require) { */ _onOpenView: function (ev) { ev.stopPropagation(); - const cell = ev.detail; + const cell = ev.data; if (cell.value === undefined || this.initialState.disableLinking) { return; } @@ -297,10 +298,10 @@ odoo.define('web.PivotController', function (require) { */ _onSortRows: function (ev) { this.model.sortRows({ - groupId: ev.detail.groupId, - measure: ev.detail.measure, - order: (ev.detail.order || 'desc') === 'asc' ? 'desc' : 'asc', - originIndexes: ev.detail.originIndexes, + groupId: ev.data.groupId, + measure: ev.data.measure, + order: (ev.data.order || 'desc') === 'asc' ? 'desc' : 'asc', + originIndexes: ev.data.originIndexes, }); this.update({}, { reload: false }); }, diff --git a/addons/web/static/src/js/views/pivot/pivot_view.js b/addons/web/static/src/js/views/pivot/pivot_view.js index ab8cc5de7c86..bd259d9d0aa3 100644 --- a/addons/web/static/src/js/views/pivot/pivot_view.js +++ b/addons/web/static/src/js/views/pivot/pivot_view.js @@ -141,7 +141,7 @@ odoo.define('web.PivotView', function (require) { */ getRenderer(parent, state) { state = Object.assign(state || {}, this.rendererParams); - return new RendererWrapper(null, state, this.config.Renderer); + return new RendererWrapper(null, this.config.Renderer, state); }, }); diff --git a/addons/web/static/src/js/views/renderer_wrapper.js b/addons/web/static/src/js/views/renderer_wrapper.js index 9131e34e1289..5fb59a003cde 100644 --- a/addons/web/static/src/js/views/renderer_wrapper.js +++ b/addons/web/static/src/js/views/renderer_wrapper.js @@ -1,64 +1,13 @@ odoo.define('web.RendererWrapper', function (require) { "use strict"; - const { xml } = owl.tags; - const AbstractRenderer = require('web.AbstractRendererOwl'); - - class RendererWrapper extends owl.Component { - /** - * - * @param {Object} parent - * @param {Object} props - * @param {Class} concreteRenderer - */ - constructor(parent, props, concreteRenderer) { - super(...arguments); - this.concreteRenderer = concreteRenderer; - this.data = props; - } - - /** - * Update the props of the renderer before a re-render - * called on the initial render as well as when the renderer is re-mounted (view switched) - * - * @param {Object} props new props - */ - updateProps(props) { - this.data = Object.assign(this.data || {}, props); - } - - mounted() { - for (let x in this.__owl__.children) { - this.__owl__.children[x].__callMounted(); - } - } - - willUnmount() { - for (let x in this.__owl__.children) { - this.__owl__.children[x].__callWillUnmount(); - } - } - - on_attach_callback() { - this.__callMounted(); - } - - on_detach_callback() { - this.__callWillUnmount(); - } - - setParent() { } + const { ComponentWrapper } = require('web.OwlCompatibility'); + class RendererWrapper extends ComponentWrapper { getLocalState() { } - setLocalState() { } - giveFocus() { } - }; - - RendererWrapper.template = xml`<t t-component="concreteRenderer" t-props="data"/>`; - - RendererWrapper.components = { AbstractRenderer }; + } return RendererWrapper; diff --git a/addons/web/static/tests/views/abstract_controller_tests.js b/addons/web/static/tests/views/abstract_controller_tests.js index 39993592ac93..09b95abdddab 100644 --- a/addons/web/static/tests/views/abstract_controller_tests.js +++ b/addons/web/static/tests/views/abstract_controller_tests.js @@ -8,7 +8,6 @@ var createView = testUtils.createView; var BasicView = require("web.BasicView"); var BasicRenderer = require("web.BasicRenderer"); const AbstractRenderer = require('web.AbstractRendererOwl'); -const ControllerAdapter = require('web.ControllerAdapter'); const RendererWrapper = require('web.RendererWrapper'); function getHtmlRenderer(html) { @@ -26,10 +25,9 @@ function getOwlView(owlRenderer, viewType) { viewType: viewType, config: _.extend({}, BasicView.prototype.config, { Renderer: owlRenderer, - Controller: ControllerAdapter.extend({}) }), getRenderer() { - return new RendererWrapper(null, {}, this.config.Renderer); + return new RendererWrapper(null, this.config.Renderer, {}); } }); } @@ -96,9 +94,8 @@ QUnit.module("Views", { assert.verifySteps(["a1", "a2", "method", "method", "descr", "descr2"]); view.destroy(); - } - ); - + }); + QUnit.test('OWL Renderer correctly destroyed', async function (assert) { assert.expect(2); diff --git a/addons/web/static/tests/views/pivot_tests.js b/addons/web/static/tests/views/pivot_tests.js index d40fee98cefd..79c6bbcaecbb 100644 --- a/addons/web/static/tests/views/pivot_tests.js +++ b/addons/web/static/tests/views/pivot_tests.js @@ -11,7 +11,7 @@ var _t = core._t; var createActionManager = testUtils.createActionManager; var createView = testUtils.createView; var patchDate = testUtils.mock.patchDate; -const oldEnv = PivotRenderer.env; + /** * Helper function that returns, given a pivot instance, the values of the * table, separated by ','. diff --git a/addons/web/views/webclient_templates.xml b/addons/web/views/webclient_templates.xml index 07ca6f100667..1b110716ef25 100644 --- a/addons/web/views/webclient_templates.xml +++ b/addons/web/views/webclient_templates.xml @@ -304,7 +304,6 @@ <script type="text/javascript" src="/web/static/src/js/views/abstract_renderer_owl.js"></script> <script type="text/javascript" src="/web/static/src/js/views/abstract_model.js"></script> <script type="text/javascript" src="/web/static/src/js/views/abstract_controller.js"></script> - <script type="text/javascript" src="/web/static/src/js/views/controller_adapter.js"></script> <script type="text/javascript" src="/web/static/src/js/views/renderer_wrapper.js"></script> <script type="text/javascript" src="/web/static/src/js/views/basic/basic_model.js"></script> <script type="text/javascript" src="/web/static/src/js/views/basic/basic_view.js"></script> -- GitLab