diff --git a/web/static/src/ts/core/Widget.ts b/web/static/src/ts/core/Widget.ts index 3077079a..01ef8d5d 100644 --- a/web/static/src/ts/core/Widget.ts +++ b/web/static/src/ts/core/Widget.ts @@ -31,6 +31,10 @@ interface Meta { const patch = init([sdListeners, sdAttrs]); +export interface Type extends Function { + new (...args: any[]): T; +} + //------------------------------------------------------------------------------ // Widget //------------------------------------------------------------------------------ diff --git a/web/static/src/ts/core/registry.ts b/web/static/src/ts/core/registry.ts new file mode 100644 index 00000000..8de0ebf7 --- /dev/null +++ b/web/static/src/ts/core/registry.ts @@ -0,0 +1,23 @@ +//------------------------------------------------------------------------------ +// Registry code +//------------------------------------------------------------------------------ +export class Registry { + private map: { [key: string]: T } = {}; + + add(key: string, item: T): Registry { + if (key in this.map) { + throw new Error(`Key ${key} already exists!`); + } + this.map[key] = item; + return this; + } + + get(key: string): T { + return this.map[key]; + } +} + +//------------------------------------------------------------------------------ +// Main registry instance +//------------------------------------------------------------------------------ +export const registry = new Registry(); diff --git a/web/static/src/ts/env.ts b/web/static/src/ts/env.ts index 95817859..ae7a1fa4 100644 --- a/web/static/src/ts/env.ts +++ b/web/static/src/ts/env.ts @@ -7,11 +7,12 @@ import { INotificationManager, NotificationManager } from "./core/notifications"; -import { registry, Registry } from "./services/registry"; +import { actionRegistry } from "./registries"; +import { Registry } from "./core/registry"; import { IRouter, Router } from "./core/router"; import { CRM } from "./widgets/crm"; import { Discuss } from "./widgets/discuss"; - +import { Widget, Type } from "./core/widget"; //------------------------------------------------------------------------------ // Types //------------------------------------------------------------------------------ @@ -26,9 +27,11 @@ export interface Env extends WEnv { actionManager: IActionManager; ajax: IAjax; notifications: INotificationManager; - registry: Registry; router: IRouter; + // registries + actionRegistry: Registry>>; + // data menus: Menu[]; @@ -56,14 +59,13 @@ export interface Env extends WEnv { */ export const makeEnvironment = memoize(async function(): Promise { // main application registry - registry.add("action", "discuss", Discuss); - registry.add("action", "crm", CRM); + actionRegistry.add("discuss", Discuss).add("crm", CRM); // services const qweb = new QWeb(); const router = new Router(); const ajax = new Ajax(); - const actionManager = new ActionManager(router, registry); + const actionManager = new ActionManager(router, actionRegistry); const notifications = new NotificationManager(); // demo data @@ -89,7 +91,7 @@ export const makeEnvironment = memoize(async function(): Promise { actionManager, ajax, notifications, - registry, + actionRegistry, router, menus, diff --git a/web/static/src/ts/main.ts b/web/static/src/ts/main.ts index 3d9c5f92..7fb2a30c 100644 --- a/web/static/src/ts/main.ts +++ b/web/static/src/ts/main.ts @@ -2,7 +2,7 @@ import { debounce } from "./core/utils"; import { makeEnvironment } from "./env"; -import { Root } from "./root"; +import { Root } from "./widgets/root"; //------------------------------------------------------------------------------ // Application bootstrapping diff --git a/web/static/src/ts/registries.ts b/web/static/src/ts/registries.ts new file mode 100644 index 00000000..bf97d29e --- /dev/null +++ b/web/static/src/ts/registries.ts @@ -0,0 +1,5 @@ +import { Registry } from "./core/registry"; +import { Widget, Type } from "./core/widget"; +import { Env } from "./env"; + +export const actionRegistry: Registry>> = new Registry(); diff --git a/web/static/src/ts/services/action_manager.ts b/web/static/src/ts/services/action_manager.ts index d682e57f..4d11da5f 100644 --- a/web/static/src/ts/services/action_manager.ts +++ b/web/static/src/ts/services/action_manager.ts @@ -1,8 +1,7 @@ import { EventBus } from "../core/event_bus"; -import { Widget } from "../core/widget"; +import { Widget, Type } from "../core/widget"; import { Env } from "../env"; -import { Registry } from "./registry"; -import { Type } from "../types"; +import { Registry } from "../core/registry"; import { IRouter, Query } from "../core/router"; //------------------------------------------------------------------------------ @@ -51,10 +50,10 @@ export interface IActionManager { export class ActionManager extends EventBus implements IActionManager { router: IRouter; - registry: Registry; + registry: Registry>>; stack: ActionStack; - constructor(router: IRouter, registry: Registry) { + constructor(router: IRouter, registry: Registry>>) { super(); this.router = router; this.registry = registry; @@ -71,7 +70,7 @@ export class ActionManager extends EventBus implements IActionManager { // this is an action ID let name = request === 1 ? "discuss" : "crm"; let title = request === 1 ? "Discuss" : "CRM"; - let Widget = this.registry.getAction(name); + let Widget = this.registry.get(name); this.stack = [ { id: 1, diff --git a/web/static/src/ts/services/registry.ts b/web/static/src/ts/services/registry.ts deleted file mode 100644 index 6a251510..00000000 --- a/web/static/src/ts/services/registry.ts +++ /dev/null @@ -1,35 +0,0 @@ -import { Widget } from "../core/widget"; -import { Env } from "../env"; -import { Type } from "../types"; - -//------------------------------------------------------------------------------ -// Types -//------------------------------------------------------------------------------ - -type ActionWidget = Type>; - -//------------------------------------------------------------------------------ -// Registry code -//------------------------------------------------------------------------------ -export class Registry { - registries: { [key: string]: { [key: string]: any } } = { - action: {} - }; - - add(type: "action", name: string, action: ActionWidget): Registry { - if (name in this.registries[type]) { - throw new Error(`Key ${name} already exists!`); - } - this.registries[type][name] = action; - return this; - } - - getAction(name: string): ActionWidget { - return this.registries.action[name]; - } -} - -//------------------------------------------------------------------------------ -// Main registry instance -//------------------------------------------------------------------------------ -export const registry = new Registry(); diff --git a/web/static/src/ts/types.ts b/web/static/src/ts/types.ts deleted file mode 100644 index 3a5628f4..00000000 --- a/web/static/src/ts/types.ts +++ /dev/null @@ -1,3 +0,0 @@ -export interface Type extends Function { - new (...args: any[]): T; -} diff --git a/web/static/src/ts/root.ts b/web/static/src/ts/widgets/root.ts similarity index 75% rename from web/static/src/ts/root.ts rename to web/static/src/ts/widgets/root.ts index fa22545b..684e2ac5 100644 --- a/web/static/src/ts/root.ts +++ b/web/static/src/ts/widgets/root.ts @@ -1,11 +1,11 @@ -import { Widget } from "./core/widget"; -import { Env } from "./env"; -import { ActionStack } from "./services/action_manager"; -import { INotification } from "./core/notifications"; -import { Action } from "./widgets/action"; -import { HomeMenu } from "./widgets/home_menu"; -import { Navbar } from "./widgets/navbar"; -import { Notification } from "./widgets/notification"; +import { Widget } from "../core/widget"; +import { Env } from "../env"; +import { ActionStack } from "../services/action_manager"; +import { INotification } from "../core/notifications"; +import { Action } from "./action"; +import { HomeMenu } from "./home_menu"; +import { Navbar } from "./navbar"; +import { Notification } from "./notification"; //------------------------------------------------------------------------------ // Types diff --git a/web/static/tests/helpers.ts b/web/static/tests/helpers.ts index 7f164322..0d6fb86e 100644 --- a/web/static/tests/helpers.ts +++ b/web/static/tests/helpers.ts @@ -3,7 +3,7 @@ import { idGenerator } from "../src/ts/core/utils"; import { WEnv } from "../src/ts/core/widget"; import { Env } from "../src/ts/env"; import { IAjax, RPCQuery } from "../src/ts/core/ajax"; -import { Registry } from "../src/ts/services/registry"; +import { Registry } from "../src/ts/core/registry"; import { NotificationManager } from "../src/ts/core/notifications"; import { IActionManager, ActionEvent } from "../src/ts/services/action_manager"; @@ -30,11 +30,10 @@ export function makeTestEnv(): Env { const router = new MockRouter(); const notifications = new NotificationManager(); let { qweb, getID } = makeTestWEnv(); - const registry = new Registry(); return { qweb, getID, - registry, + actionRegistry: new Registry(), ajax, actionManager, notifications,