From f59a2945b223a19750afd46da7e33deff2583328 Mon Sep 17 00:00:00 2001 From: mehmet-erim Date: Fri, 10 Jan 2020 14:41:30 +0300 Subject: [PATCH 1/2] feat(theme-shared): trigger unload confirmation in the modal component when form is dirty --- .../core/src/lib/states/session.state.ts | 2 +- .../lib/components/modal/modal.component.ts | 35 +++++++++++++------ 2 files changed, 26 insertions(+), 11 deletions(-) diff --git a/npm/ng-packs/packages/core/src/lib/states/session.state.ts b/npm/ng-packs/packages/core/src/lib/states/session.state.ts index 7ceaa4a1bc..7ea742dce7 100644 --- a/npm/ng-packs/packages/core/src/lib/states/session.state.ts +++ b/npm/ng-packs/packages/core/src/lib/states/session.state.ts @@ -67,7 +67,7 @@ export class SessionState { this.store.dispatch(new ModifyOpenedTabCount('increase')); - fromEvent(window, 'beforeunload').subscribe(() => { + fromEvent(window, 'unload').subscribe(event => { this.store.dispatch(new ModifyOpenedTabCount('decrease')); }); }); 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 c3bdc2fecb..1c25529413 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 @@ -10,6 +10,7 @@ import { TemplateRef, ViewChild, ViewChildren, + HostListener, } from '@angular/core'; import { fromEvent, Subject } from 'rxjs'; import { debounceTime, filter, takeUntil } from 'rxjs/operators'; @@ -101,15 +102,7 @@ export class ModalComponent implements OnDestroy { destroy$ = new Subject(); - constructor(private renderer: Renderer2, private confirmationService: ConfirmationService) {} - - ngOnDestroy(): void { - this.destroy$.next(); - } - - close() { - if (this.busy) return; - + get isFormDirty(): boolean { let node: HTMLDivElement; if (!this.modalContent) { node = document.getElementById('modal-container') as HTMLDivElement; @@ -120,7 +113,19 @@ export class ModalComponent implements OnDestroy { .childNodes, ); - if (hasNgDirty(nodes)) { + return hasNgDirty(nodes); + } + + constructor(private renderer: Renderer2, private confirmationService: ConfirmationService) {} + + ngOnDestroy(): void { + this.destroy$.next(); + } + + close() { + if (this.busy) return; + + if (this.isFormDirty) { if (this.isConfirmationOpen) return; this.isConfirmationOpen = true; @@ -151,6 +156,16 @@ export class ModalComponent implements OnDestroy { this.close(); }); + fromEvent(window, 'beforeunload') + .pipe(takeUntil(this.destroy$)) + .subscribe(event => { + if (this.isFormDirty) { + event.returnValue = true; + } else { + delete event.returnValue; + } + }); + setTimeout(() => { if (!this.abpClose) return; fromEvent(this.abpClose.nativeElement, 'click') From e1842a56c8bbafe628f3277d83504406428b6585 Mon Sep 17 00:00:00 2001 From: mehmet-erim Date: Fri, 10 Jan 2020 14:49:17 +0300 Subject: [PATCH 2/2] chore: remove unneccessary import --- .../theme-shared/src/lib/components/modal/modal.component.ts | 1 - 1 file changed, 1 deletion(-) 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 1c25529413..8aaaa58076 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 @@ -10,7 +10,6 @@ import { TemplateRef, ViewChild, ViewChildren, - HostListener, } from '@angular/core'; import { fromEvent, Subject } from 'rxjs'; import { debounceTime, filter, takeUntil } from 'rxjs/operators';