MOBILE-3982 core: Extract CoreComponentsRegistry

main
Noel De Martin 2022-03-01 11:47:57 +01:00
parent b89735eef9
commit 717978388e
6 changed files with 23 additions and 15 deletions

View File

@ -20,6 +20,7 @@ import { CoreUtils } from '@services/utils/utils';
import { Translate } from '@singletons'; import { Translate } from '@singletons';
import { CoreContextMenuItemComponent } from './context-menu-item'; import { CoreContextMenuItemComponent } from './context-menu-item';
import { CoreContextMenuPopoverComponent } from './context-menu-popover'; import { CoreContextMenuPopoverComponent } from './context-menu-popover';
import { CoreComponentsRegistry } from '@singletons/components-registry';
/** /**
* This component adds a button (usually in the navigation bar) that displays a context menu popover. * This component adds a button (usually in the navigation bar) that displays a context menu popover.
@ -60,7 +61,7 @@ export class CoreContextMenuComponent implements OnInit, OnDestroy {
// Calculate the unique ID. // Calculate the unique ID.
this.uniqueId = 'core-context-menu-' + CoreUtils.getUniqueId('CoreContextMenuComponent'); this.uniqueId = 'core-context-menu-' + CoreUtils.getUniqueId('CoreContextMenuComponent');
CoreDomUtils.storeInstanceByElement(elementRef.nativeElement, this); CoreComponentsRegistry.register(elementRef.nativeElement, this);
} }
/** /**

View File

@ -25,6 +25,7 @@ import {
import { CoreLogger } from '@singletons/logger'; import { CoreLogger } from '@singletons/logger';
import { CoreDomUtils } from '@services/utils/dom'; import { CoreDomUtils } from '@services/utils/dom';
import { CoreContextMenuComponent } from '../context-menu/context-menu'; import { CoreContextMenuComponent } from '../context-menu/context-menu';
import { CoreComponentsRegistry } from '@singletons/components-registry';
const BUTTON_HIDDEN_CLASS = 'core-navbar-button-hidden'; const BUTTON_HIDDEN_CLASS = 'core-navbar-button-hidden';
@ -80,7 +81,7 @@ export class CoreNavBarButtonsComponent implements OnInit, OnDestroy {
this.element = element.nativeElement; this.element = element.nativeElement;
this.logger = CoreLogger.getInstance('CoreNavBarButtonsComponent'); this.logger = CoreLogger.getInstance('CoreNavBarButtonsComponent');
CoreDomUtils.storeInstanceByElement(this.element, this); CoreComponentsRegistry.register(this.element, this);
} }
/** /**
@ -154,11 +155,11 @@ export class CoreNavBarButtonsComponent implements OnInit, OnDestroy {
} }
const mainContextMenu = buttonsContainer.querySelector('core-context-menu'); const mainContextMenu = buttonsContainer.querySelector('core-context-menu');
const secondaryContextMenuInstance = CoreDomUtils.getInstanceByElement<CoreContextMenuComponent>(secondaryContextMenu); const secondaryContextMenuInstance = CoreComponentsRegistry.resolve(secondaryContextMenu, CoreContextMenuComponent);
let mainContextMenuInstance: CoreContextMenuComponent | undefined; let mainContextMenuInstance: CoreContextMenuComponent | null;
if (mainContextMenu) { if (mainContextMenu) {
// Both containers have a context menu. Merge them to prevent having 2 menus at the same time. // Both containers have a context menu. Merge them to prevent having 2 menus at the same time.
mainContextMenuInstance = CoreDomUtils.getInstanceByElement<CoreContextMenuComponent>(mainContextMenu); mainContextMenuInstance = CoreComponentsRegistry.resolve(mainContextMenu, CoreContextMenuComponent);
} else { } else {
// There is a context-menu in these buttons, but there is no main context menu in the header. // There is a context-menu in these buttons, but there is no main context menu in the header.
// Create one main context menu dynamically. // Create one main context menu dynamically.

View File

@ -29,7 +29,6 @@ import { Subscription } from 'rxjs';
import { CoreUtils } from '@services/utils/utils'; import { CoreUtils } from '@services/utils/utils';
import { Params } from '@angular/router'; import { Params } from '@angular/router';
import { CoreNavBarButtonsComponent } from '../navbar-buttons/navbar-buttons'; import { CoreNavBarButtonsComponent } from '../navbar-buttons/navbar-buttons';
import { CoreDomUtils } from '@services/utils/dom';
import { StackEvent } from '@ionic/angular/directives/navigation/stack-utils'; import { StackEvent } from '@ionic/angular/directives/navigation/stack-utils';
import { CoreNavigator } from '@services/navigator'; import { CoreNavigator } from '@services/navigator';
import { CoreTabBase, CoreTabsBaseComponent } from '@classes/tabs'; import { CoreTabBase, CoreTabsBaseComponent } from '@classes/tabs';
@ -188,7 +187,7 @@ export class CoreTabsOutletComponent extends CoreTabsBaseComponent<CoreTabsOutle
protected showHideNavBarButtons(activatedPageName: string): void { protected showHideNavBarButtons(activatedPageName: string): void {
const elements = this.ionTabs.outlet.nativeEl.querySelectorAll('core-navbar-buttons'); const elements = this.ionTabs.outlet.nativeEl.querySelectorAll('core-navbar-buttons');
elements.forEach((element) => { elements.forEach((element) => {
const instance = CoreDomUtils.getInstanceByElement<CoreNavBarButtonsComponent>(element); const instance = CoreComponentsRegistry.resolve(element, CoreNavBarButtonsComponent);
if (instance) { if (instance) {
const pagetagName = element.closest('.ion-page')?.tagName; const pagetagName = element.closest('.ion-page')?.tagName;

View File

@ -15,8 +15,8 @@
import { Component, Input, Output, OnInit, OnDestroy, ElementRef, EventEmitter, ContentChild, TemplateRef } from '@angular/core'; import { Component, Input, Output, OnInit, OnDestroy, ElementRef, EventEmitter, ContentChild, TemplateRef } from '@angular/core';
import { CoreTabBase } from '@classes/tabs'; import { CoreTabBase } from '@classes/tabs';
import { CoreDomUtils } from '@services/utils/dom';
import { CoreUtils } from '@services/utils/utils'; import { CoreUtils } from '@services/utils/utils';
import { CoreComponentsRegistry } from '@singletons/components-registry';
import { CoreNavBarButtonsComponent } from '../navbar-buttons/navbar-buttons'; import { CoreNavBarButtonsComponent } from '../navbar-buttons/navbar-buttons';
import { CoreTabsComponent } from './tabs'; import { CoreTabsComponent } from './tabs';
@ -144,7 +144,7 @@ export class CoreTabComponent implements OnInit, OnDestroy, CoreTabBase {
protected showHideNavBarButtons(show: boolean): void { protected showHideNavBarButtons(show: boolean): void {
const elements = this.element.querySelectorAll('core-navbar-buttons'); const elements = this.element.querySelectorAll('core-navbar-buttons');
elements.forEach((element) => { elements.forEach((element) => {
const instance = CoreDomUtils.getInstanceByElement<CoreNavBarButtonsComponent>(element); const instance = CoreComponentsRegistry.resolve(element, CoreNavBarButtonsComponent);
if (instance) { if (instance) {
instance.forceHide(!show); instance.forceHide(!show);

View File

@ -51,9 +51,11 @@ import { CoreUpdateManagerProvider } from '@services/update-manager';
import { CoreUrlUtilsProvider } from '@services/utils/url'; import { CoreUrlUtilsProvider } from '@services/utils/url';
import { CoreUtilsProvider } from '@services/utils/utils'; import { CoreUtilsProvider } from '@services/utils/utils';
import { CoreWSProvider } from '@services/ws'; import { CoreWSProvider } from '@services/ws';
import { CoreComponentsRegistry } from '@singletons/components-registry';
export const CORE_SERVICES: Type<unknown>[] = [ export const CORE_SERVICES: Type<unknown>[] = [
CoreAppProvider, CoreAppProvider,
CoreComponentsRegistry,
CoreConfigProvider, CoreConfigProvider,
CoreCronDelegateService, CoreCronDelegateService,
CoreCustomURLSchemesProvider, CoreCustomURLSchemesProvider,

View File

@ -52,6 +52,7 @@ import { CoreSites } from '@services/sites';
import { NavigationStart } from '@angular/router'; import { NavigationStart } from '@angular/router';
import { filter } from 'rxjs/operators'; import { filter } from 'rxjs/operators';
import { Subscription } from 'rxjs'; import { Subscription } from 'rxjs';
import { CoreComponentsRegistry } from '@singletons/components-registry';
/* /*
* "Utils" service with helper functions for UI, DOM elements and HTML code. * "Utils" service with helper functions for UI, DOM elements and HTML code.
@ -68,7 +69,6 @@ export class CoreDomUtilsProvider {
protected template: HTMLTemplateElement = document.createElement('template'); // A template element to convert HTML to element. protected template: HTMLTemplateElement = document.createElement('template'); // A template element to convert HTML to element.
protected matchesFunctionName?: string; // Name of the "matches" function to use when simulating a closest call. protected matchesFunctionName?: string; // Name of the "matches" function to use when simulating a closest call.
protected instances: WeakMap<Element, unknown> = new WeakMap(); // Store component/directive instances indexed by element.
protected debugDisplay = false; // Whether to display debug messages. Store it in a variable to make it synchronous. protected debugDisplay = false; // Whether to display debug messages. Store it in a variable to make it synchronous.
protected displayedAlerts: Record<string, HTMLIonAlertElement> = {}; // To prevent duplicated alerts. protected displayedAlerts: Record<string, HTMLIonAlertElement> = {}; // To prevent duplicated alerts.
protected displayedModals: Record<string, HTMLIonModalElement> = {}; // To prevent duplicated modals. protected displayedModals: Record<string, HTMLIonModalElement> = {}; // To prevent duplicated modals.
@ -671,9 +671,10 @@ export class CoreDomUtilsProvider {
* *
* @param element The root element of the component/directive. * @param element The root element of the component/directive.
* @return The instance, undefined if not found. * @return The instance, undefined if not found.
* @deprecated since 4.0.0. Use CoreComponentsRegistry instead.
*/ */
getInstanceByElement<T = unknown>(element: Element): T | undefined { getInstanceByElement<T = unknown>(element: Element): T | undefined {
return this.instances.get(element) as T; return CoreComponentsRegistry.resolve<T>(element) ?? undefined;
} }
/** /**
@ -892,19 +893,22 @@ export class CoreDomUtilsProvider {
* Remove a component/directive instance using the DOM Element. * Remove a component/directive instance using the DOM Element.
* *
* @param element The root element of the component/directive. * @param element The root element of the component/directive.
* @deprecated since 4.0.0. It's no longer necessary to remove instances.
*/ */
// eslint-disable-next-line @typescript-eslint/no-unused-vars
removeInstanceByElement(element: Element): void { removeInstanceByElement(element: Element): void {
const id = element.getAttribute(this.INSTANCE_ID_ATTR_NAME); //
id && delete this.instances[id];
} }
/** /**
* Remove a component/directive instance using the ID. * Remove a component/directive instance using the ID.
* *
* @param id The ID to remove. * @param id The ID to remove.
* @deprecated since 4.0.0. It's no longer necessary to remove instances.
*/ */
// eslint-disable-next-line @typescript-eslint/no-unused-vars
removeInstanceById(id: string): void { removeInstanceById(id: string): void {
delete this.instances[id]; //
} }
/** /**
@ -1664,9 +1668,10 @@ export class CoreDomUtilsProvider {
* *
* @param element The root element of the component/directive. * @param element The root element of the component/directive.
* @param instance The instance to store. * @param instance The instance to store.
* @deprecated since 4.0.0. Use CoreComponentsRegistry instead.
*/ */
storeInstanceByElement(element: Element, instance: unknown): void { storeInstanceByElement(element: Element, instance: unknown): void {
this.instances.set(element, instance); CoreComponentsRegistry.register(element, instance);
} }
/** /**