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', +}); });