From 811b6a52a67b160169413ae3a7c0386e5f28a461 Mon Sep 17 00:00:00 2001 From: bnymncoskuner Date: Wed, 21 Apr 2021 04:52:09 +0300 Subject: [PATCH] fix: add modal-ref-service to dismiss active modals --- .../theme-shared/src/lib/components/index.ts | 1 + .../lib/components/modal/modal-ref.service.ts | 26 +++++++++++++++++++ .../lib/components/modal/modal.component.ts | 22 +++++++++++++++- 3 files changed, 48 insertions(+), 1 deletion(-) create mode 100644 npm/ng-packs/packages/theme-shared/src/lib/components/modal/modal-ref.service.ts diff --git a/npm/ng-packs/packages/theme-shared/src/lib/components/index.ts b/npm/ng-packs/packages/theme-shared/src/lib/components/index.ts index a80a7cb574..45036680be 100644 --- a/npm/ng-packs/packages/theme-shared/src/lib/components/index.ts +++ b/npm/ng-packs/packages/theme-shared/src/lib/components/index.ts @@ -7,6 +7,7 @@ export * from './loader-bar/loader-bar.component'; export * from './loading/loading.component'; export * from './modal/modal.component'; export * from './modal/modal-close.directive'; +export * from './modal/modal-ref.service'; export * from './sort-order-icon/sort-order-icon.component'; export * from './table-empty-message/table-empty-message.component'; export * from './table/table.component'; diff --git a/npm/ng-packs/packages/theme-shared/src/lib/components/modal/modal-ref.service.ts b/npm/ng-packs/packages/theme-shared/src/lib/components/modal/modal-ref.service.ts new file mode 100644 index 0000000000..c9f7ea41e2 --- /dev/null +++ b/npm/ng-packs/packages/theme-shared/src/lib/components/modal/modal-ref.service.ts @@ -0,0 +1,26 @@ +import { Injectable } from '@angular/core'; + +export type ModalDismissMode = 'hard' | 'soft'; + +export interface DismissableModal { + dismiss(mode: ModalDismissMode); +} + +@Injectable({ providedIn: 'root' }) +export class ModalRefService { + modalRefs: DismissableModal[] = []; + + register(modal: DismissableModal) { + this.modalRefs.push(modal); + } + unregister(modal: DismissableModal) { + const index = this.modalRefs.indexOf(modal); + if (index > -1) { + this.modalRefs.splice(index, 1); + } + } + + dismissAll(mode: ModalDismissMode) { + this.modalRefs.forEach(modal => modal.dismiss(mode)); + } +} diff --git a/npm/ng-packs/packages/theme-shared/src/lib/components/modal/modal.component.ts b/npm/ng-packs/packages/theme-shared/src/lib/components/modal/modal.component.ts index 4195e84d9b..e33573438e 100644 --- a/npm/ng-packs/packages/theme-shared/src/lib/components/modal/modal.component.ts +++ b/npm/ng-packs/packages/theme-shared/src/lib/components/modal/modal.component.ts @@ -12,6 +12,7 @@ import { TemplateRef, ViewChild, isDevMode, + OnInit, } from '@angular/core'; import { NgbModal, NgbModalOptions, NgbModalRef } from '@ng-bootstrap/ng-bootstrap'; import { fromEvent, Subject } from 'rxjs'; @@ -20,6 +21,7 @@ import { Confirmation } from '../../models/confirmation'; import { ConfirmationService } from '../../services/confirmation.service'; import { SUPPRESS_UNSAVED_CHANGES_WARNING } from '../../tokens/suppress-unsaved-changes-warning.token'; import { ButtonComponent } from '../button/button.component'; +import { DismissableModal, ModalRefService, ModalDismissMode } from './modal-ref.service'; export type ModalSize = 'sm' | 'md' | 'lg' | 'xl'; @@ -29,7 +31,7 @@ export type ModalSize = 'sm' | 'md' | 'lg' | 'xl'; styleUrls: ['./modal.component.scss'], providers: [SubscriptionService], }) -export class ModalComponent implements OnDestroy { +export class ModalComponent implements OnInit, OnDestroy, DismissableModal { /** * @deprecated Use centered property of options input instead. To be deleted in v5.0. */ @@ -116,9 +118,26 @@ export class ModalComponent implements OnDestroy { @Inject(SUPPRESS_UNSAVED_CHANGES_WARNING) private suppressUnsavedChangesWarningToken: boolean, private modal: NgbModal, + private modalRefService: ModalRefService, ) { this.initToggleStream(); } + ngOnInit(): void { + this.modalRefService.register(this); + } + + dismiss(mode: ModalDismissMode) { + switch (mode) { + case 'hard': + this.visible = false; + break; + case 'soft': + this.close(); + break; + default: + break; + } + } private initToggleStream() { this.subscription.addOne(this.toggle$.pipe(debounceTime(0), distinctUntilChanged()), value => @@ -158,6 +177,7 @@ export class ModalComponent implements OnDestroy { } ngOnDestroy(): void { + this.modalRefService.unregister(this); this.toggle(false); this.destroy$.next(); }