From 5305d57586a9fb101648d26284caaca6471e055c Mon Sep 17 00:00:00 2001 From: muhammedaltug Date: Thu, 1 Oct 2020 14:49:36 +0300 Subject: [PATCH 1/2] fix: add prefix to toaster css classes - Toaster Interface added for custom toaster service implementation - optimize imports and removed unnecessary service --- .../toast-container.component.html | 2 +- .../toast-container.component.scss | 2 +- .../lib/components/toast/toast.component.html | 12 ++-- .../lib/components/toast/toast.component.scss | 22 +++---- .../lib/components/toast/toast.component.ts | 12 ++-- .../theme-shared/src/lib/models/toaster.ts | 32 +++++++++++ .../src/lib/services/toaster.service.ts | 6 +- .../src/lib/theme-shared.module.ts | 57 +++++++------------ 8 files changed, 80 insertions(+), 65 deletions(-) diff --git a/npm/ng-packs/packages/theme-shared/src/lib/components/toast-container/toast-container.component.html b/npm/ng-packs/packages/theme-shared/src/lib/components/toast-container/toast-container.component.html index 88d45ff04b..3dc2427f92 100644 --- a/npm/ng-packs/packages/theme-shared/src/lib/components/toast-container/toast-container.component.html +++ b/npm/ng-packs/packages/theme-shared/src/lib/components/toast-container/toast-container.component.html @@ -1,5 +1,5 @@
-
+
+
-
- -
+
{{ toast.title | abpLocalization: toast.options?.titleLocalizationParams }}
-

+

{{ toast.message | abpLocalization: toast.options?.messageLocalizationParams }}

diff --git a/npm/ng-packs/packages/theme-shared/src/lib/components/toast/toast.component.scss b/npm/ng-packs/packages/theme-shared/src/lib/components/toast/toast.component.scss index 7b5a2a24d1..64bf8a6068 100644 --- a/npm/ng-packs/packages/theme-shared/src/lib/components/toast/toast.component.scss +++ b/npm/ng-packs/packages/theme-shared/src/lib/components/toast/toast.component.scss @@ -10,7 +10,9 @@ } } -.toast { +$toastClass: abp-toast; + +.#{$toastClass} { display: grid; grid-template-columns: 50px 1fr; gap: 10px; @@ -23,19 +25,19 @@ z-index: 9999; @include fillColor(#f0f0f0, #000); opacity: 1; - &.toast-success { + &.#{$toastClass}-success { @include fillColor(#51a351, #fff); } - &.toast-info { + &.#{$toastClass}-info { @include fillColor(#2f96b4, #fff); } - &.toast-warning { + &.#{$toastClass}-warning { @include fillColor(#f89406, #fff); } - &.toast-error { + &.#{$toastClass}-error { @include fillColor(#bd362f, #fff); } - .toast-icon { + .#{$toastClass}-icon { display: flex; align-items: center; justify-content: center; @@ -43,9 +45,9 @@ font-size: 36px; } } - .toast-content { + .#{$toastClass}-content { position: relative; - .toast-close-button { + .#{$toastClass}-close-button { position: absolute; top: 0; right: 0; @@ -64,13 +66,13 @@ outline: none; } } - .toast-title { + .#{$toastClass}-title { margin: 0; padding: 0; font-size: 1rem; font-weight: 600; } - .toast-message { + .#{$toastClass}-message { margin: 0; padding: 0; max-width: 240px; diff --git a/npm/ng-packs/packages/theme-shared/src/lib/components/toast/toast.component.ts b/npm/ng-packs/packages/theme-shared/src/lib/components/toast/toast.component.ts index b4465934b6..48298e74a0 100644 --- a/npm/ng-packs/packages/theme-shared/src/lib/components/toast/toast.component.ts +++ b/npm/ng-packs/packages/theme-shared/src/lib/components/toast/toast.component.ts @@ -1,7 +1,6 @@ import { Component, Input, OnInit } from '@angular/core'; import { Toaster } from '../../models/toaster'; import { ToasterService } from '../../services/toaster.service'; -import { LocalizationService } from '@abp/ng.core'; import snq from 'snq'; @Component({ @@ -15,7 +14,7 @@ export class ToastComponent implements OnInit { get severityClass(): string { if (!this.toast || !this.toast.severity) return ''; - return `toast-${this.toast.severity}`; + return `abp-toast-${this.toast.severity}`; } get iconClass(): string { @@ -33,10 +32,7 @@ export class ToastComponent implements OnInit { } } - constructor( - private toastService: ToasterService, - private localizationService: LocalizationService, - ) {} + constructor(private toasterService: ToasterService) {} ngOnInit() { if (snq(() => this.toast.options.sticky)) return; @@ -47,10 +43,10 @@ export class ToastComponent implements OnInit { } close() { - this.toastService.remove(this.toast.options.id); + this.toasterService.remove(this.toast.options.id); } tap() { - if (this.toast.options && this.toast.options.tapToDismiss) this.close(); + if (this.toast.options?.tapToDismiss) this.close(); } } diff --git a/npm/ng-packs/packages/theme-shared/src/lib/models/toaster.ts b/npm/ng-packs/packages/theme-shared/src/lib/models/toaster.ts index e7f456fee4..7addf08162 100644 --- a/npm/ng-packs/packages/theme-shared/src/lib/models/toaster.ts +++ b/npm/ng-packs/packages/theme-shared/src/lib/models/toaster.ts @@ -20,4 +20,36 @@ export namespace Toaster { } export type Severity = 'neutral' | 'success' | 'info' | 'warning' | 'error'; + export type ToasterId = string | number; + + export interface Service { + show: ( + message: Config.LocalizationParam, + title: Config.LocalizationParam, + severity: Toaster.Severity, + options: Partial, + ) => ToasterId; + remove: (id: number) => void; + clear: (key?: string) => void; + info: ( + message: Config.LocalizationParam, + title?: Config.LocalizationParam, + options?: Partial, + ) => ToasterId; + success: ( + message: Config.LocalizationParam, + title?: Config.LocalizationParam, + options?: Partial, + ) => ToasterId; + warn: ( + message: Config.LocalizationParam, + title?: Config.LocalizationParam, + options?: Partial, + ) => ToasterId; + error: ( + message: Config.LocalizationParam, + title?: Config.LocalizationParam, + options?: Partial, + ) => ToasterId; + } } diff --git a/npm/ng-packs/packages/theme-shared/src/lib/services/toaster.service.ts b/npm/ng-packs/packages/theme-shared/src/lib/services/toaster.service.ts index 295647309d..83f6655371 100644 --- a/npm/ng-packs/packages/theme-shared/src/lib/services/toaster.service.ts +++ b/npm/ng-packs/packages/theme-shared/src/lib/services/toaster.service.ts @@ -1,14 +1,14 @@ -import { Injectable, ComponentRef } from '@angular/core'; +import { ComponentRef, Injectable } from '@angular/core'; import { Toaster } from '../models'; import { ReplaySubject } from 'rxjs'; -import { Config, PROJECTION_STRATEGY, ContentProjectionService } from '@abp/ng.core'; +import { Config, ContentProjectionService, PROJECTION_STRATEGY } from '@abp/ng.core'; import snq from 'snq'; import { ToastContainerComponent } from '../components/toast-container/toast-container.component'; @Injectable({ providedIn: 'root', }) -export class ToasterService { +export class ToasterService implements Toaster.Service { toasts$ = new ReplaySubject(1); private lastId = -1; diff --git a/npm/ng-packs/packages/theme-shared/src/lib/theme-shared.module.ts b/npm/ng-packs/packages/theme-shared/src/lib/theme-shared.module.ts index e45ac8d1e3..2ba44dfa7a 100644 --- a/npm/ng-packs/packages/theme-shared/src/lib/theme-shared.module.ts +++ b/npm/ng-packs/packages/theme-shared/src/lib/theme-shared.module.ts @@ -22,54 +22,41 @@ import { LoadingDirective } from './directives/loading.directive'; import { NgxDatatableDefaultDirective } from './directives/ngx-datatable-default.directive'; import { NgxDatatableListDirective } from './directives/ngx-datatable-list.directive'; import { TableSortDirective } from './directives/table-sort.directive'; -import { ErrorHandler } from './handlers/error.handler'; import { initLazyStyleHandler } from './handlers/lazy-style.handler'; import { RootParams } from './models/common'; import { THEME_SHARED_ROUTE_PROVIDERS } from './providers/route.provider'; import { THEME_SHARED_APPEND_CONTENT } from './tokens/append-content.token'; -import { httpErrorConfigFactory, HTTP_ERROR_CONFIG } from './tokens/http-error.token'; +import { HTTP_ERROR_CONFIG, httpErrorConfigFactory } from './tokens/http-error.token'; import { DateParserFormatter } from './utils/date-parser-formatter'; +const declarationsWithExports = [ + BreadcrumbComponent, + ButtonComponent, + ChartComponent, + ConfirmationComponent, + LoaderBarComponent, + LoadingComponent, + ModalComponent, + TableComponent, + TableEmptyMessageComponent, + ToastComponent, + ToastContainerComponent, + SortOrderIconComponent, + NgxDatatableDefaultDirective, + NgxDatatableListDirective, + LoadingDirective, + TableSortDirective, +]; @NgModule({ imports: [CoreModule, NgxDatatableModule, NgxValidateCoreModule, NgbPaginationModule], declarations: [ - BreadcrumbComponent, - ButtonComponent, - ChartComponent, - ConfirmationComponent, + ...declarationsWithExports, HttpErrorWrapperComponent, - LoaderBarComponent, - LoadingComponent, - ModalComponent, ModalContainerComponent, - TableComponent, - TableEmptyMessageComponent, - ToastComponent, - ToastContainerComponent, - SortOrderIconComponent, - NgxDatatableDefaultDirective, - NgxDatatableListDirective, - LoadingDirective, - TableSortDirective, ], exports: [ NgxDatatableModule, - BreadcrumbComponent, - ButtonComponent, - ChartComponent, - ConfirmationComponent, - LoaderBarComponent, - LoadingComponent, - ModalComponent, - TableComponent, - TableEmptyMessageComponent, - ToastComponent, - ToastContainerComponent, - SortOrderIconComponent, - NgxDatatableDefaultDirective, - NgxDatatableListDirective, - LoadingDirective, - TableSortDirective, + ...declarationsWithExports, ], providers: [DatePipe], entryComponents: [ @@ -81,8 +68,6 @@ import { DateParserFormatter } from './utils/date-parser-formatter'; ], }) export class ThemeSharedModule { - constructor(private errorHandler: ErrorHandler) {} - static forRoot(options = {} as RootParams): ModuleWithProviders { return { ngModule: ThemeSharedModule, From 8a113064a5edf214aaaec8d6bb17b49961de362d Mon Sep 17 00:00:00 2001 From: muhammedaltug Date: Mon, 5 Oct 2020 17:35:27 +0300 Subject: [PATCH 2/2] fix: toaster container removed from empty layout and account layout - selectors changed in toaster service test - documentation update for implementing Toaster.Service interface --- docs/en/UI/Angular/Toaster-Service.md | 96 +++++++++++++++++++ .../packages/core/src/lib/models/utility.ts | 4 + .../account-layout.component.ts | 1 - .../empty-layout/empty-layout.component.ts | 1 - .../theme-shared/src/lib/models/toaster.ts | 2 +- .../src/lib/services/toaster.service.ts | 24 ++--- .../src/lib/tests/toaster.service.spec.ts | 34 +++---- .../src/lib/theme-shared.module.ts | 3 + 8 files changed, 134 insertions(+), 31 deletions(-) diff --git a/docs/en/UI/Angular/Toaster-Service.md b/docs/en/UI/Angular/Toaster-Service.md index d2c1fc08f3..4778af020b 100644 --- a/docs/en/UI/Angular/Toaster-Service.md +++ b/docs/en/UI/Angular/Toaster-Service.md @@ -85,7 +85,103 @@ The all open toasts can be removed manually via the `clear` method: ```js this.toaster.clear(); ``` +## Replacing ToasterService with 3rd party toaster libraries +If you want the ABP Framework to utilize 3rd party libraries for the toasters instead of the built-in one, you can provide a service that implements `Toaster.Service` interface, and provide it as follows (ngx-toastr library used in example): + +> You can use *LocalizationService* for toaster messages translations. +```js +// your-custom-toaster.service.ts +import { Injectable } from '@angular/core'; +import { Config, LocalizationService } from '@abp/ng.core'; +import { Toaster } from '@abp/ng.theme.shared'; +import { ToastrService } from 'ngx-toastr'; + +@Injectable() +export class CustomToasterService implements Toaster.Service { + constructor(private toastr: ToastrService, private localizationService: LocalizationService) {} + + error( + message: Config.LocalizationParam, + title?: Config.LocalizationParam, + options?: Partial, + ) { + return this.show(message, title, 'error', options); + } + + clear(): void { + this.toastr.clear(); + } + + info( + message: Config.LocalizationParam, + title: Config.LocalizationParam | undefined, + options: Partial | undefined, + ): Toaster.ToasterId { + return this.show(message, title, 'info', options); + } + + remove(id: number): void { + this.toastr.remove(id); + } + + show( + message: Config.LocalizationParam, + title: Config.LocalizationParam, + severity: Toaster.Severity, + options: Partial, + ): Toaster.ToasterId { + const translatedMessage = this.localizationService.instant(message); + const translatedTitle = this.localizationService.instant(title); + const toasterOptions = { + positionClass: 'toast-bottom-right', + tapToDismiss: options.tapToDismiss, + ...(options.sticky && { + extendedTimeOut: 0, + timeOut: 0, + }), + }; + const activeToast = this.toastr.show( + translatedMessage, + translatedTitle, + toasterOptions, + `toast-${severity}`, + ); + return activeToast.toastId; + } + + success( + message: Config.LocalizationParam, + title: Config.LocalizationParam | undefined, + options: Partial | undefined, + ): Toaster.ToasterId { + return this.show(message, title, 'success', options); + } + + warn( + message: Config.LocalizationParam, + title: Config.LocalizationParam | undefined, + options: Partial | undefined, + ): Toaster.ToasterId { + return this.show(message, title, 'warning', options); + } +} +``` +```js +// app.module.ts + +import { ToasterService } from '@abp/ng.theme.shared'; + +@NgModule({ + providers: [ + // ... + { + provide: ToasterService, + useClass: CustomToasterService, + }, + ] +}) +``` ## API ### success diff --git a/npm/ng-packs/packages/core/src/lib/models/utility.ts b/npm/ng-packs/packages/core/src/lib/models/utility.ts index 228cab0de3..f1cfbdb6da 100644 --- a/npm/ng-packs/packages/core/src/lib/models/utility.ts +++ b/npm/ng-packs/packages/core/src/lib/models/utility.ts @@ -11,3 +11,7 @@ type Serializable = Record< export type InferredInstanceOf = T extends Type ? U : never; export type InferredContextOf = T extends TemplateRef ? U : never; + +export type Strict = Class extends Contract + ? { [K in keyof Class]: K extends keyof Contract ? Contract[K] : never } + : Contract; diff --git a/npm/ng-packs/packages/theme-basic/src/lib/components/account-layout/account-layout.component.ts b/npm/ng-packs/packages/theme-basic/src/lib/components/account-layout/account-layout.component.ts index 105c756e54..56851c6d27 100644 --- a/npm/ng-packs/packages/theme-basic/src/lib/components/account-layout/account-layout.component.ts +++ b/npm/ng-packs/packages/theme-basic/src/lib/components/account-layout/account-layout.component.ts @@ -6,7 +6,6 @@ import { eLayoutType } from '@abp/ng.core'; template: ` - `, }) export class AccountLayoutComponent { diff --git a/npm/ng-packs/packages/theme-basic/src/lib/components/empty-layout/empty-layout.component.ts b/npm/ng-packs/packages/theme-basic/src/lib/components/empty-layout/empty-layout.component.ts index 4f1dac52ca..f961ecc321 100644 --- a/npm/ng-packs/packages/theme-basic/src/lib/components/empty-layout/empty-layout.component.ts +++ b/npm/ng-packs/packages/theme-basic/src/lib/components/empty-layout/empty-layout.component.ts @@ -6,7 +6,6 @@ import { eLayoutType } from '@abp/ng.core'; template: ` - `, }) export class EmptyLayoutComponent { diff --git a/npm/ng-packs/packages/theme-shared/src/lib/models/toaster.ts b/npm/ng-packs/packages/theme-shared/src/lib/models/toaster.ts index 7addf08162..beb5d4fc6c 100644 --- a/npm/ng-packs/packages/theme-shared/src/lib/models/toaster.ts +++ b/npm/ng-packs/packages/theme-shared/src/lib/models/toaster.ts @@ -30,7 +30,7 @@ export namespace Toaster { options: Partial, ) => ToasterId; remove: (id: number) => void; - clear: (key?: string) => void; + clear: (containerKey?: string) => void; info: ( message: Config.LocalizationParam, title?: Config.LocalizationParam, diff --git a/npm/ng-packs/packages/theme-shared/src/lib/services/toaster.service.ts b/npm/ng-packs/packages/theme-shared/src/lib/services/toaster.service.ts index 83f6655371..84275a0fc8 100644 --- a/npm/ng-packs/packages/theme-shared/src/lib/services/toaster.service.ts +++ b/npm/ng-packs/packages/theme-shared/src/lib/services/toaster.service.ts @@ -1,15 +1,15 @@ import { ComponentRef, Injectable } from '@angular/core'; import { Toaster } from '../models'; import { ReplaySubject } from 'rxjs'; -import { Config, ContentProjectionService, PROJECTION_STRATEGY } from '@abp/ng.core'; +import { Config, ContentProjectionService, PROJECTION_STRATEGY, Strict } from '@abp/ng.core'; import snq from 'snq'; import { ToastContainerComponent } from '../components/toast-container/toast-container.component'; @Injectable({ providedIn: 'root', }) -export class ToasterService implements Toaster.Service { - toasts$ = new ReplaySubject(1); +export class ToasterService implements ToasterContract { + private toasts$ = new ReplaySubject(1); private lastId = -1; @@ -37,7 +37,7 @@ export class ToasterService implements Toaster.Service { message: Config.LocalizationParam, title?: Config.LocalizationParam, options?: Partial, - ): number { + ): Toaster.ToasterId { return this.show(message, title, 'info', options); } @@ -51,7 +51,7 @@ export class ToasterService implements Toaster.Service { message: Config.LocalizationParam, title?: Config.LocalizationParam, options?: Partial, - ): number { + ): Toaster.ToasterId { return this.show(message, title, 'success', options); } @@ -65,7 +65,7 @@ export class ToasterService implements Toaster.Service { message: Config.LocalizationParam, title?: Config.LocalizationParam, options?: Partial, - ): number { + ): Toaster.ToasterId { return this.show(message, title, 'warning', options); } @@ -79,7 +79,7 @@ export class ToasterService implements Toaster.Service { message: Config.LocalizationParam, title?: Config.LocalizationParam, options?: Partial, - ): number { + ): Toaster.ToasterId { return this.show(message, title, 'error', options); } @@ -96,7 +96,7 @@ export class ToasterService implements Toaster.Service { title: Config.LocalizationParam = null, severity: Toaster.Severity = 'neutral', options = {} as Partial, - ): number { + ): Toaster.ToasterId { if (!this.containerComponentRef) this.setContainer(); const id = ++this.lastId; @@ -122,10 +122,12 @@ export class ToasterService implements Toaster.Service { /** * Removes all open toasts at once. */ - clear(key?: string): void { - this.toasts = !key + clear(containerKey?: string): void { + this.toasts = !containerKey ? [] - : this.toasts.filter(toast => snq(() => toast.options.containerKey) !== key); + : this.toasts.filter(toast => snq(() => toast.options.containerKey) !== containerKey); this.toasts$.next(this.toasts); } } + +export type ToasterContract = Strict; diff --git a/npm/ng-packs/packages/theme-shared/src/lib/tests/toaster.service.spec.ts b/npm/ng-packs/packages/theme-shared/src/lib/tests/toaster.service.spec.ts index 0807bf632e..d47e4a7cf5 100644 --- a/npm/ng-packs/packages/theme-shared/src/lib/tests/toaster.service.spec.ts +++ b/npm/ng-packs/packages/theme-shared/src/lib/tests/toaster.service.spec.ts @@ -14,6 +14,7 @@ import { ToasterService } from '../services/toaster.service'; imports: [CoreModule.forTest()], }) export class MockModule {} +const toastClassPrefix = 'abp-toast'; describe('ToasterService', () => { let spectator: SpectatorService; @@ -39,24 +40,23 @@ describe('ToasterService', () => { service['containerComponentRef'].changeDetectorRef.detectChanges(); expect(selectToasterElement('.fa-exclamation-circle')).toBeTruthy(); - expect(selectToasterContent('.toast-title')).toBe('TITLE'); - expect(selectToasterContent('.toast-message')).toBe('MESSAGE'); + expect(selectToasterContent(`.${toastClassPrefix}-title`)).toBe('TITLE'); + expect(selectToasterContent(`.${toastClassPrefix}-message`)).toBe('MESSAGE'); }); test.each` - type | selector | icon - ${'info'} | ${'.toast-info'} | ${'.fa-info-circle'} - ${'success'} | ${'.toast-success'} | ${'.fa-check-circle'} - ${'warn'} | ${'.toast-warning'} | ${'.fa-exclamation-triangle'} - ${'error'} | ${'.toast-error'} | ${'.fa-times-circle'} + type | selector | icon + ${'info'} | ${`.${toastClassPrefix}-info`} | ${'.fa-info-circle'} + ${'success'} | ${`.${toastClassPrefix}-success`} | ${'.fa-check-circle'} + ${'warn'} | ${`.${toastClassPrefix}-warning`} | ${'.fa-exclamation-triangle'} + ${'error'} | ${`.${toastClassPrefix}-error`} | ${'.fa-times-circle'} `('should display $type toast', async ({ type, selector, icon }) => { service[type]('MESSAGE', 'TITLE'); await timer(0).toPromise(); service['containerComponentRef'].changeDetectorRef.detectChanges(); - - expect(selectToasterContent('.toast-title')).toBe('TITLE'); - expect(selectToasterContent('.toast-message')).toBe('MESSAGE'); + expect(selectToasterContent(`.${toastClassPrefix}-title`)).toBe('TITLE'); + expect(selectToasterContent(`.${toastClassPrefix}-message`)).toBe('MESSAGE'); expect(selectToasterElement()).toBe(document.querySelector(selector)); expect(selectToasterElement(icon)).toBeTruthy(); }); @@ -68,10 +68,10 @@ describe('ToasterService', () => { await timer(0).toPromise(); service['containerComponentRef'].changeDetectorRef.detectChanges(); - const titles = document.querySelectorAll('.toast-title'); + const titles = document.querySelectorAll(`.${toastClassPrefix}-title`); expect(titles.length).toBe(2); - const messages = document.querySelectorAll('.toast-message'); + const messages = document.querySelectorAll(`.${toastClassPrefix}-message`); expect(messages.length).toBe(2); }); @@ -104,19 +104,19 @@ describe('ToasterService', () => { service['containerComponentRef'].changeDetectorRef.detectChanges(); expect(selectToasterElement('.fa-exclamation-circle')).toBeTruthy(); - expect(selectToasterContent('.toast-title')).toBe('TITLE_2'); - expect(selectToasterContent('.toast-message')).toBe('MESSAGE_2'); + expect(selectToasterContent(`.${toastClassPrefix}-title`)).toBe('TITLE_2'); + expect(selectToasterContent(`.${toastClassPrefix}-message`)).toBe('MESSAGE_2'); }); }); -function clearElements(selector = '.toast') { +function clearElements(selector = `.${toastClassPrefix}`) { document.querySelectorAll(selector).forEach(element => element.parentNode.removeChild(element)); } -function selectToasterContent(selector = '.toast'): string { +function selectToasterContent(selector = `.${toastClassPrefix}`): string { return selectToasterElement(selector).textContent.trim(); } -function selectToasterElement(selector = '.toast'): T { +function selectToasterElement(selector = `.${toastClassPrefix}`): T { return document.querySelector(selector); } diff --git a/npm/ng-packs/packages/theme-shared/src/lib/theme-shared.module.ts b/npm/ng-packs/packages/theme-shared/src/lib/theme-shared.module.ts index 2ba44dfa7a..c4647cbcd1 100644 --- a/npm/ng-packs/packages/theme-shared/src/lib/theme-shared.module.ts +++ b/npm/ng-packs/packages/theme-shared/src/lib/theme-shared.module.ts @@ -22,6 +22,7 @@ import { LoadingDirective } from './directives/loading.directive'; import { NgxDatatableDefaultDirective } from './directives/ngx-datatable-default.directive'; import { NgxDatatableListDirective } from './directives/ngx-datatable-list.directive'; import { TableSortDirective } from './directives/table-sort.directive'; +import { ErrorHandler } from './handlers/error.handler'; import { initLazyStyleHandler } from './handlers/lazy-style.handler'; import { RootParams } from './models/common'; import { THEME_SHARED_ROUTE_PROVIDERS } from './providers/route.provider'; @@ -68,6 +69,8 @@ const declarationsWithExports = [ ], }) export class ThemeSharedModule { + constructor(private errorHandler: ErrorHandler) {} + static forRoot(options = {} as RootParams): ModuleWithProviders { return { ngModule: ThemeSharedModule,