From 1950f805b3a3c56f7601b5037820d881934c3b29 Mon Sep 17 00:00:00 2001 From: Michael Shamoon <4887959+nikonratm@users.noreply.github.com> Date: Tue, 26 Jan 2021 22:27:50 -0800 Subject: [PATCH] Implement warning for closeAll --- .../app-frame/app-frame.component.ts | 28 ++++++++------- .../document-detail.component.ts | 3 ++ .../app/services/open-documents.service.ts | 36 ++++++++++++++++--- 3 files changed, 50 insertions(+), 17 deletions(-) diff --git a/src-ui/src/app/components/app-frame/app-frame.component.ts b/src-ui/src/app/components/app-frame/app-frame.component.ts index ad4460f16..d19fd660a 100644 --- a/src-ui/src/app/components/app-frame/app-frame.component.ts +++ b/src-ui/src/app/components/app-frame/app-frame.component.ts @@ -25,9 +25,7 @@ export class AppFrameComponent implements OnInit, OnDestroy { private searchService: SearchService, public savedViewService: SavedViewService, private meta: Meta - ) { - - } + ) { } versionString = `${environment.appTitle} ${environment.version}` @@ -78,17 +76,21 @@ export class AppFrameComponent implements OnInit, OnDestroy { } closeAll() { - this.closeMenu() - this.openDocumentsService.closeAll() + // user may need to confirm losing unsaved changes + this.openDocumentsService.closeAll().subscribe(confirmed => { + if (confirmed) { + this.closeMenu() - // TODO: is there a better way to do this? - let route = this.activatedRoute - while (route.firstChild) { - route = route.firstChild - } - if (route.component == DocumentDetailComponent) { - this.router.navigate([""]) - } + // TODO: is there a better way to do this? + let route = this.activatedRoute + while (route.firstChild) { + route = route.firstChild + } + if (route.component == DocumentDetailComponent) { + this.router.navigate([""]) + } + } + }) } ngOnInit() { diff --git a/src-ui/src/app/components/document-detail/document-detail.component.ts b/src-ui/src/app/components/document-detail/document-detail.component.ts index 2fa96f161..5658922df 100644 --- a/src-ui/src/app/components/document-detail/document-detail.component.ts +++ b/src-ui/src/app/components/document-detail/document-detail.component.ts @@ -136,6 +136,9 @@ export class DocumentDetailComponent implements OnInit, DirtyComponent { // Initialize dirtyCheck this.isDirty$ = dirtyCheck(this.documentForm, this.store.asObservable()) + this.isDirty$.subscribe(dirty => { + this.openDocumentService.setDirty(this.document.id, dirty) + }) } createDocumentType() { diff --git a/src-ui/src/app/services/open-documents.service.ts b/src-ui/src/app/services/open-documents.service.ts index 9e5746c10..4f4d9c8bb 100644 --- a/src-ui/src/app/services/open-documents.service.ts +++ b/src-ui/src/app/services/open-documents.service.ts @@ -2,6 +2,9 @@ import { Injectable } from '@angular/core'; import { PaperlessDocument } from '../data/paperless-document'; import { OPEN_DOCUMENT_SERVICE } from '../data/storage-keys'; import { DocumentService } from './rest/document.service'; +import { NgbModal } from '@ng-bootstrap/ng-bootstrap'; +import { ConfirmDialogComponent } from 'src/app/components/common/confirm-dialog/confirm-dialog.component'; +import { Observable, Subject, of } from 'rxjs'; @Injectable({ providedIn: 'root' @@ -10,7 +13,7 @@ export class OpenDocumentsService { private MAX_OPEN_DOCUMENTS = 5 - constructor(private documentService: DocumentService) { + constructor(private documentService: DocumentService, private modalService: NgbModal) { if (sessionStorage.getItem(OPEN_DOCUMENT_SERVICE.DOCUMENTS)) { try { this.openDocuments = JSON.parse(sessionStorage.getItem(OPEN_DOCUMENT_SERVICE.DOCUMENTS)) @@ -22,6 +25,7 @@ export class OpenDocumentsService { } private openDocuments: PaperlessDocument[] = [] + private dirtyDocuments: Set = new Set() refreshDocument(id: number) { let index = this.openDocuments.findIndex(doc => doc.id == id) @@ -53,6 +57,11 @@ export class OpenDocumentsService { } } + setDirty(documentId: number, dirty: boolean) { + if (dirty) this.dirtyDocuments.add(documentId) + else this.dirtyDocuments.delete(documentId) + } + closeDocument(doc: PaperlessDocument) { let index = this.openDocuments.findIndex(d => d.id == doc.id) if (index > -1) { @@ -61,9 +70,28 @@ export class OpenDocumentsService { } } - closeAll() { - this.openDocuments.splice(0, this.openDocuments.length) - this.save() + closeAll(): Observable { + if (this.dirtyDocuments.size) { + let modal = this.modalService.open(ConfirmDialogComponent, {backdrop: 'static'}) + modal.componentInstance.title = $localize`Unsaved Changes` + modal.componentInstance.messageBold = $localize`You have unsaved changes.` + modal.componentInstance.message = $localize`Are you sure you want to close all documents?` + modal.componentInstance.btnClass = "btn-warning" + modal.componentInstance.btnCaption = $localize`Close documents` + modal.componentInstance.confirmClicked.subscribe(() => { + modal.componentInstance.buttonsEnabled = false + modal.close() + this.openDocuments.splice(0, this.openDocuments.length) + this.save() + }) + const subject = new Subject() + modal.componentInstance.subject = subject + return subject.asObservable() + } else { + this.openDocuments.splice(0, this.openDocuments.length) + this.save() + return of(true) + } } save() {