diff --git a/addons/web/static/src/legacy/action_adapters.js b/addons/web/static/src/legacy/action_adapters.js
index 095e299031e..bb3a1d6e2aa 100644
--- a/addons/web/static/src/legacy/action_adapters.js
+++ b/addons/web/static/src/legacy/action_adapters.js
@@ -13,6 +13,8 @@ import { cleanDomFromBootstrap, wrapSuccessOrFail, mapDoActionOptionAPI } from "
const { Component, tags } = owl;
+const warningDialogBodyTemplate = tags.xml``;
+
class ActionAdapter extends ComponentAdapter {
setup() {
super.setup();
@@ -95,7 +97,7 @@ class ActionAdapter extends ComponentAdapter {
this.title = this.props.title;
}
}
- WarningDialog.bodyTemplate = tags.xml``;
+ WarningDialog.bodyTemplate = warningDialogBodyTemplate;
this.dialogs.add(WarningDialog, {
title: payload.title,
message: payload.message,
diff --git a/addons/web/static/src/legacy/js/owl_compatibility.js b/addons/web/static/src/legacy/js/owl_compatibility.js
index afa2cb6a653..aece0d861f3 100644
--- a/addons/web/static/src/legacy/js/owl_compatibility.js
+++ b/addons/web/static/src/legacy/js/owl_compatibility.js
@@ -16,6 +16,8 @@ odoo.define('web.OwlCompatibility', function () {
const widgetSymbol = odoo.widgetSymbol;
const children = new WeakMap(); // associates legacy widgets with their Owl children
+ const templateForLegacy = tags.xml`
`;
+ const templateForOwl = tags.xml``;
/**
* Case 1) An Owl component has to instantiate legacy widgets
* ----------------------------------------------------------
@@ -85,15 +87,9 @@ odoo.define('web.OwlCompatibility', function () {
}
let template;
if (!(props.Component.prototype instanceof Component)) {
- template = tags.xml``;
+ template = templateForLegacy;
} else {
- let propsStr = '';
- for (let p in props) {
- if (p !== 'Component') {
- propsStr += ` ${p}="props.${p}"`;
- }
- }
- template = tags.xml``;
+ template = templateForOwl;
}
ComponentAdapter.template = template;
super(...arguments);
@@ -103,6 +99,14 @@ odoo.define('web.OwlCompatibility', function () {
this.widget = null; // widget instance, if Component is a legacy widget
}
+ get childProps() {
+ if (!this._childProps) {
+ this._childProps = Object.assign({}, this.props);
+ delete this._childProps.Component;
+ }
+ return this._childProps;
+ }
+
/**
* Starts the legacy widget (not in the DOM yet)
*
diff --git a/addons/web/static/src/legacy/legacy_client_actions.js b/addons/web/static/src/legacy/legacy_client_actions.js
index 93f2434c68b..38d33c805a3 100644
--- a/addons/web/static/src/legacy/legacy_client_actions.js
+++ b/addons/web/static/src/legacy/legacy_client_actions.js
@@ -11,6 +11,11 @@ import { breadcrumbsToLegacy } from "./utils";
const { Component, hooks, tags } = owl;
const actionRegistry = registry.category("actions");
+const legacyClientActionTemplate = tags.xml`
+ `;
+
// registers an action from the legacy action registry to the wowl one, ensuring
// that widget actions are actually Components
function registerClientAction(name, action) {
@@ -44,11 +49,7 @@ function registerClientAction(name, action) {
};
}
}
- Action.template = tags.xml`
-
- `;
+ Action.template = legacyClientActionTemplate;
Action.components = { ClientActionAdapter };
Action.isLegacy = true;
Action.target = action.prototype.target;
diff --git a/addons/web/static/src/legacy/legacy_views.js b/addons/web/static/src/legacy/legacy_views.js
index 5f7ae6962d9..e5268ae32df 100644
--- a/addons/web/static/src/legacy/legacy_views.js
+++ b/addons/web/static/src/legacy/legacy_views.js
@@ -18,6 +18,11 @@ function getJsClassWidget(fieldsInfo) {
return legacyViewRegistry.get(key);
}
+const legacyViewTemplate = tags.xml`
+ `;
+
// registers a view from the legacy view registry to the wowl one, but wrapped
// into an Owl Component
function registerView(name, LegacyView) {
@@ -106,7 +111,7 @@ function registerView(name, LegacyView) {
.map(([vid, vtype]) => {
const view = this.props.viewSwitcherEntries.find((v) => v.type === vtype);
if (view) {
- return Object.assign({}, view, {viewID: vid});
+ return Object.assign({}, view, { viewID: vid });
} else {
return {
viewID: vid,
@@ -122,12 +127,8 @@ function registerView(name, LegacyView) {
});
}
}
+ Controller.template = legacyViewTemplate;
- Controller.template = tags.xml`
-
- `;
Controller.components = { ViewAdapter };
Controller.display_name = LegacyView.prototype.display_name;
Controller.icon = LegacyView.prototype.icon;
diff --git a/addons/web/static/src/legacy/systray_menu_item.js b/addons/web/static/src/legacy/systray_menu_item.js
index 44adf61ec56..314fbde985c 100644
--- a/addons/web/static/src/legacy/systray_menu_item.js
+++ b/addons/web/static/src/legacy/systray_menu_item.js
@@ -20,6 +20,8 @@ const legacySystrayMenuItems = legacySystrayMenu.Items;
const convertedItems = [];
let id = 1;
+const legacySystrayItemTemplate = tags.xml``;
+
function addSystrayItem(Widget) {
const name = `_legacy_systray_item_${id++}`;
@@ -29,7 +31,7 @@ function addSystrayItem(Widget) {
this.Widget = Widget;
}
}
- SystrayItem.template = tags.xml``;
+ SystrayItem.template = legacySystrayItemTemplate;
SystrayItem.components = { SystrayItemAdapter };
systrayRegistry.add(name, { Component: SystrayItem }, { sequence: Widget.prototype.sequence });
diff --git a/addons/web/static/src/webclient/actions/action_service.js b/addons/web/static/src/webclient/actions/action_service.js
index 144c9173b08..dcca897e8b1 100644
--- a/addons/web/static/src/webclient/actions/action_service.js
+++ b/addons/web/static/src/webclient/actions/action_service.js
@@ -69,6 +69,13 @@ export class InvalidButtonParamsError extends Error {}
// regex that matches context keys not to forward from an action to another
const CTX_KEY_REGEX = /^(?:(?:default_|search_default_|show_).+|.+_view_ref|group_by|group_by_no_leaf|active_id|active_ids|orderedBy)$/;
+// only register this template once for all dynamic classes ControllerComponent
+const ControllerComponentTemplate = tags.xml``;
+
function makeActionManager(env) {
const keepLast = new KeepLast();
let id = 0;
@@ -525,13 +532,7 @@ function makeActionManager(env) {
controller.title = ev.detail;
}
}
-
- ControllerComponent.template = tags.xml``;
-
+ ControllerComponent.template = ControllerComponentTemplate;
ControllerComponent.Component = controller.Component;
let nextDialog = {};