From f9cc4281b6a080a67cf81cfedf08862e84619441 Mon Sep 17 00:00:00 2001 From: Samuel Degueldre Date: Mon, 5 Jul 2021 09:37:03 +0000 Subject: [PATCH] [REF] web, website: convert public widget registry to core registry With the introduction of the new webclient, we introduced a new way to create and interact with registry using categories. This alleviates the need to explicitly export and import registries. This commit converts the public root widget's custom registry to use the new registry to avoid code duplication and having multiple diverging implementations Part of #72675 --- addons/web/__manifest__.py | 2 + .../src/legacy/js/public/public_root.js | 6 +- .../src/legacy/js/public/public_widget.js | 82 ++----------------- .../static/src/js/content/website_root.js | 2 - addons/website/static/src/js/menu/content.js | 13 ++- .../website/static/src/js/menu/customize.js | 12 ++- addons/website/static/src/js/menu/edit.js | 7 +- .../website/static/src/js/menu/mobile_view.js | 7 +- addons/website/static/src/js/menu/navbar.js | 11 +-- .../website/static/src/js/menu/new_content.js | 7 +- addons/website/static/src/js/menu/seo.js | 7 +- .../website/static/src/js/menu/translate.js | 7 +- .../static/src/js/website_links_menu.js | 7 +- 13 files changed, 72 insertions(+), 98 deletions(-) diff --git a/addons/web/__manifest__.py b/addons/web/__manifest__.py index 7fd1cfcc0d3..d158d4d658e 100644 --- a/addons/web/__manifest__.py +++ b/addons/web/__manifest__.py @@ -198,6 +198,8 @@ This module provides the core of the Odoo Web Client. ('include', 'web._assets_bootstrap'), + 'web/static/src/core/registry.js', + 'web/static/src/legacy/scss/base_frontend.scss', 'web/static/src/legacy/scss/lazyloader.scss', 'web/static/src/legacy/scss/navbar_mobile.scss', diff --git a/addons/web/static/src/legacy/js/public/public_root.js b/addons/web/static/src/legacy/js/public/public_root.js index d25594b662b..5b22cea2099 100644 --- a/addons/web/static/src/legacy/js/public/public_root.js +++ b/addons/web/static/src/legacy/js/public/public_root.js @@ -6,8 +6,7 @@ import env from 'web.public_env'; import session from 'web.session'; import utils from 'web.utils'; import publicWidget from 'web.public.widget'; - -var publicRootRegistry = new publicWidget.RootWidgetRegistry(); +import { registry } from '@web/core/registry'; // Load localizations outside the PublicRoot to not wait for DOM ready (but // wait for them in PublicRoot) @@ -134,7 +133,7 @@ var PublicRoot = publicWidget.RootWidget.extend({ * @override */ _getRegistry: function () { - return publicRootRegistry; + return registry.category("public_root_widgets"); }, /** * Creates an PublicWidget instance for each DOM element which matches the @@ -331,5 +330,4 @@ var PublicRoot = publicWidget.RootWidget.extend({ export default { PublicRoot: PublicRoot, - publicRootRegistry: publicRootRegistry, }; diff --git a/addons/web/static/src/legacy/js/public/public_widget.js b/addons/web/static/src/legacy/js/public/public_widget.js index ed2bb4c6093..ef2805b12b2 100644 --- a/addons/web/static/src/legacy/js/public/public_widget.js +++ b/addons/web/static/src/legacy/js/public/public_widget.js @@ -4,9 +4,7 @@ * Provides a way to start JS code for public contents. */ -import Class from 'web.Class'; import dom from 'web.dom'; -import mixins from 'web.mixins'; import session from 'web.session'; import Widget from 'web.Widget'; @@ -19,18 +17,12 @@ import Widget from 'web.Widget'; * @todo Merge with 'PublicWidget' ? */ var RootWidget = Widget.extend({ - custom_events: _.extend({}, Widget.prototype.custom_events || {}, { - 'registry_update': '_onRegistryUpdate', - 'get_session': '_onGetSession', - }), /** * @constructor */ init: function () { this._super.apply(this, arguments); this._widgets = []; - this._listenToUpdates = false; - this._getRegistry().setParent(this); }, /** * @override @@ -40,7 +32,11 @@ var RootWidget = Widget.extend({ var defs = [this._super.apply(this, arguments)]; defs.push(this._attachComponents()); - this._listenToUpdates = true; + this._getRegistry().on("UPDATE", this, ({ operation, value }) => { + if (operation === "add") { + this._attachComponent(value); + } + }); return Promise.all(defs); }, @@ -83,7 +79,7 @@ var RootWidget = Widget.extend({ */ _attachComponents: function ($from) { var self = this; - var childInfos = this._getRegistry().get(); + var childInfos = this._getRegistry().getAll(); var defs = _.map(childInfos, function (childInfo) { return self._attachComponent(childInfo, $from); }); @@ -98,71 +94,6 @@ var RootWidget = Widget.extend({ * @returns {RootWidgetRegistry} */ _getRegistry: function () {}, - - //-------------------------------------------------------------------------- - // Handlers - //-------------------------------------------------------------------------- - - /** - * Get the curuent session module. - * - * @private - * @param {OdooEvent} ev - */ - _onGetSession: function (event) { - if (event.data.callback) { - event.data.callback(session); - } - }, - /** - * Called when the linked registry is updated after this `RootWidget` - * - * @private - * @param {OdooEvent} ev - */ - _onRegistryUpdate: function (ev) { - ev.stopPropagation(); - if (this._listenToUpdates) { - this._attachComponent(ev.data); - } - }, -}); - -var RootWidgetRegistry = Class.extend(mixins.EventDispatcherMixin, { - /** - * @constructor - */ - init: function () { - mixins.EventDispatcherMixin.init.call(this); - this._registry = []; - }, - - //-------------------------------------------------------------------------- - // Public - //-------------------------------------------------------------------------- - - /** - * Adds an element to the registry (info of what and how to instantiate). - * - * @param {function} Widget - the widget class to instantiate - * @param {string} selector - * the jQuery selector to use to find the internal DOM element which - * needs to be attached to the instantiated widget - */ - add: function (Widget, selector) { - var registryInfo = { - Widget: Widget, - selector: selector, - }; - this._registry.push(registryInfo); - this.trigger_up('registry_update', registryInfo); - }, - /** - * Retrieves all the registry elements. - */ - get: function () { - return this._registry; - }, }); //:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: @@ -348,7 +279,6 @@ registry._fixAppleCollapse = PublicWidget.extend({ export default { RootWidget: RootWidget, - RootWidgetRegistry: RootWidgetRegistry, Widget: PublicWidget, registry: registry, }; diff --git a/addons/website/static/src/js/content/website_root.js b/addons/website/static/src/js/content/website_root.js index 3f0292e8757..f7021f5cd06 100644 --- a/addons/website/static/src/js/content/website_root.js +++ b/addons/website/static/src/js/content/website_root.js @@ -7,7 +7,6 @@ import session from 'web.session'; import publicRootData from 'web.public.root'; import "web.zoomodoo"; import { FullscreenIndication } from '@website/js/widgets/fullscreen_indication'; -var websiteRootRegistry = publicRootData.publicRootRegistry; var WebsiteRoot = publicRootData.PublicRoot.extend(KeyboardNavigationMixin, { events: _.extend({}, KeyboardNavigationMixin.events, publicRootData.PublicRoot.prototype.events || {}, { @@ -359,5 +358,4 @@ var WebsiteRoot = publicRootData.PublicRoot.extend(KeyboardNavigationMixin, { export default { WebsiteRoot: WebsiteRoot, - websiteRootRegistry: websiteRootRegistry, }; diff --git a/addons/website/static/src/js/menu/content.js b/addons/website/static/src/js/menu/content.js index 8ae8dd85167..abbe89401f5 100644 --- a/addons/website/static/src/js/menu/content.js +++ b/addons/website/static/src/js/menu/content.js @@ -6,9 +6,10 @@ import Dialog from 'web.Dialog'; import time from 'web.time'; import weWidgets from 'wysiwyg.widgets'; import websiteNavbarData from 'website.navbar'; -import websiteRootData from 'website.root'; import Widget from 'web.Widget'; +import { registry } from "@web/core/registry"; + var _t = core._t; var qweb = core.qweb; @@ -1112,8 +1113,14 @@ function _clonePage(pageId) { }); } -websiteNavbarData.websiteNavbarRegistry.add(ContentMenu, '#content-menu'); -websiteRootData.websiteRootRegistry.add(PageManagement, '#list_website_pages'); +registry.category("website_navbar_widgets").add("ContentMenu", { + Widget: ContentMenu, + selector: '#content-menu', +}); +registry.category("public_root_widgets").add("PageManagement", { + Widget: PageManagement, + selector: '#list_website_pages', +}); export default { PagePropertiesDialog: PagePropertiesDialog, diff --git a/addons/website/static/src/js/menu/customize.js b/addons/website/static/src/js/menu/customize.js index 4481d0f616c..0e2b48d98fa 100644 --- a/addons/website/static/src/js/menu/customize.js +++ b/addons/website/static/src/js/menu/customize.js @@ -6,6 +6,8 @@ var Widget = require('web.Widget'); var websiteNavbarData = require('website.navbar'); var WebsiteAceEditor = require('website.ace'); +const { registry } = require("@web/core/registry"); + var qweb = core.qweb; var CustomizeMenu = Widget.extend({ @@ -212,8 +214,14 @@ var AceEditorMenu = websiteNavbarData.WebsiteNavbarActionWidget.extend({ }, }); -websiteNavbarData.websiteNavbarRegistry.add(CustomizeMenu, '#customize-menu'); -websiteNavbarData.websiteNavbarRegistry.add(AceEditorMenu, '#html_editor'); +registry.category("website_navbar_widgets").add("CustomizeMenu", { + Widget: CustomizeMenu, + selector: '#customize-menu', +}); +registry.category("website_navbar_widgets").add("AceEditorMenu", { + Widget: AceEditorMenu, + selector: '#html_editor', +}); return CustomizeMenu; }); diff --git a/addons/website/static/src/js/menu/edit.js b/addons/website/static/src/js/menu/edit.js index 96b7ea87b19..2e87e8fde29 100644 --- a/addons/website/static/src/js/menu/edit.js +++ b/addons/website/static/src/js/menu/edit.js @@ -7,6 +7,8 @@ var wysiwygLoader = require('web_editor.loader'); var websiteNavbarData = require('website.navbar'); var Dialog = require('web.Dialog'); +const { registry } = require("@web/core/registry"); + var _t = core._t; /** @@ -540,7 +542,10 @@ var EditPageMenu = websiteNavbarData.WebsiteNavbarActionWidget.extend({ }, }); -websiteNavbarData.websiteNavbarRegistry.add(EditPageMenu, '#edit-page-menu'); +registry.category("website_navbar_widgets").add("EditPageMenu", { + Widget: EditPageMenu, + selector: '#edit-page-menu', +}); return EditPageMenu; }); diff --git a/addons/website/static/src/js/menu/mobile_view.js b/addons/website/static/src/js/menu/mobile_view.js index 668962c8a10..ed4df755018 100644 --- a/addons/website/static/src/js/menu/mobile_view.js +++ b/addons/website/static/src/js/menu/mobile_view.js @@ -5,6 +5,8 @@ var core = require('web.core'); var Dialog = require('web.Dialog'); var websiteNavbarData = require('website.navbar'); +const { registry } = require("@web/core/registry"); + var _t = core._t; var MobilePreviewDialog = Dialog.extend({ @@ -59,7 +61,10 @@ var MobileMenu = websiteNavbarData.WebsiteNavbarActionWidget.extend({ }, }); -websiteNavbarData.websiteNavbarRegistry.add(MobileMenu, '#mobile-menu'); +registry.category("website_navbar_widgets").add("MobileMenu", { + Widget: MobileMenu, + selector: '#mobile-menu', +}); return { MobileMenu: MobileMenu, diff --git a/addons/website/static/src/js/menu/navbar.js b/addons/website/static/src/js/menu/navbar.js index e8fabd52453..e316988a76a 100644 --- a/addons/website/static/src/js/menu/navbar.js +++ b/addons/website/static/src/js/menu/navbar.js @@ -5,9 +5,8 @@ import dom from 'web.dom'; import publicWidget from 'web.public.widget'; import concurrency from 'web.concurrency'; import Widget from 'web.Widget'; -import websiteRootData from 'website.root'; -var websiteNavbarRegistry = new publicWidget.RootWidgetRegistry(); +import { registry } from "@web/core/registry"; var WebsiteNavbar = publicWidget.RootWidget.extend({ xmlDependencies: ['/website/static/src/xml/website.xml'], @@ -77,7 +76,7 @@ var WebsiteNavbar = publicWidget.RootWidget.extend({ * @override */ _getRegistry: function () { - return websiteNavbarRegistry; + return registry.category("website_navbar_widgets"); }, /** * Searches for the automatic widget {@see RootWidget} which can handle that @@ -281,10 +280,12 @@ var WebsiteNavbarActionWidget = Widget.extend({ }, }); -websiteRootData.websiteRootRegistry.add(WebsiteNavbar, '#oe_main_menu_navbar'); +registry.category("public_root_widgets").add("WebsiteNavbar", { + Widget: WebsiteNavbar, + selector: '#oe_main_menu_navbar', +}); export default { WebsiteNavbar: WebsiteNavbar, - websiteNavbarRegistry: websiteNavbarRegistry, WebsiteNavbarActionWidget: WebsiteNavbarActionWidget, }; diff --git a/addons/website/static/src/js/menu/new_content.js b/addons/website/static/src/js/menu/new_content.js index 67268f7245d..4c63e51d610 100644 --- a/addons/website/static/src/js/menu/new_content.js +++ b/addons/website/static/src/js/menu/new_content.js @@ -7,6 +7,8 @@ var websiteNavbarData = require('website.navbar'); var wUtils = require('website.utils'); var tour = require('web_tour.tour'); +const { registry } = require("@web/core/registry"); + const {qweb, _t} = core; var enableFlag = 'enable_new_content'; @@ -342,7 +344,10 @@ var NewContentMenu = websiteNavbarData.WebsiteNavbarActionWidget.extend({ }, }); -websiteNavbarData.websiteNavbarRegistry.add(NewContentMenu, '.o_new_content_menu'); +registry.category("website_navbar_widgets").add("NewContentMenu", { + Widget: NewContentMenu, + selector: '.o_new_content_menu', +}); return NewContentMenu; }); diff --git a/addons/website/static/src/js/menu/seo.js b/addons/website/static/src/js/menu/seo.js index 0512c7e8ad5..54cc4b926be 100644 --- a/addons/website/static/src/js/menu/seo.js +++ b/addons/website/static/src/js/menu/seo.js @@ -11,6 +11,8 @@ var weWidgets = require('wysiwyg.widgets'); var websiteNavbarData = require('website.navbar'); const { session } = require('@web/session'); +const { registry } = require("@web/core/registry"); + var _t = core._t; // This replaces \b, because accents(e.g. à, é) are not seen as word boundaries. @@ -894,7 +896,10 @@ var SeoMenu = websiteNavbarData.WebsiteNavbarActionWidget.extend({ }, }); -websiteNavbarData.websiteNavbarRegistry.add(SeoMenu, '#promote-menu'); +registry.category("website_navbar_widgets").add("SeoMenu", { + Widget: SeoMenu, + selector: '#promote-menu', +}); return { SeoConfigurator: SeoConfigurator, diff --git a/addons/website/static/src/js/menu/translate.js b/addons/website/static/src/js/menu/translate.js index dc811996887..2588d6b6104 100644 --- a/addons/website/static/src/js/menu/translate.js +++ b/addons/website/static/src/js/menu/translate.js @@ -9,6 +9,8 @@ var EditorMenu = require('website.editMenu'); var localStorage = require('web.local_storage'); var websiteNavbarData = require('website.navbar'); +const { registry } = require("@web/core/registry"); + var _t = core._t; var localStorageNoDialogKey = 'website_translator_nodialog'; @@ -347,5 +349,8 @@ var TranslatePageMenu = websiteNavbarData.WebsiteNavbarActionWidget.extend({ }, }); -websiteNavbarData.websiteNavbarRegistry.add(TranslatePageMenu, '.o_menu_systray:has([data-action="translate"])'); +registry.category("website_navbar_widgets").add("TranslatePageMenu", { + Widget: TranslatePageMenu, + selector: '.o_menu_systray:has([data-action="translate"])', +}); }); diff --git a/addons/website_links/static/src/js/website_links_menu.js b/addons/website_links/static/src/js/website_links_menu.js index 6f673223720..b7158d6efe5 100644 --- a/addons/website_links/static/src/js/website_links_menu.js +++ b/addons/website_links/static/src/js/website_links_menu.js @@ -10,6 +10,8 @@ odoo.define('website_links.website_links_menu', function (require) { var publicWidget = require('web.public.widget'); var websiteNavbarData = require('website.navbar'); +const { registry } = require("@web/core/registry"); + var WebsiteLinksMenu = publicWidget.Widget.extend({ /** @@ -21,6 +23,9 @@ var WebsiteLinksMenu = publicWidget.Widget.extend({ }, }); -websiteNavbarData.websiteNavbarRegistry.add(WebsiteLinksMenu, '#o_website_links_share_page'); +registry.category("website_navbar_widgets").add("WebsiteLinksMenu", { + Widget: WebsiteLinksMenu, + selector: '#o_website_links_share_page', +}); });