mirror of
				https://github.com/paperless-ngx/paperless-ngx.git
				synced 2025-10-30 03:56:23 -05:00 
			
		
		
		
	Merge pull request #1369 from paperless-ngx/fix/browser-unsaved-changes
Fix: Correct browser unsaved changes warning
This commit is contained in:
		| @@ -179,21 +179,21 @@ | |||||||
|         <source>Decrement hours</source> |         <source>Decrement hours</source> | ||||||
|         <context-group purpose="location"> |         <context-group purpose="location"> | ||||||
|           <context context-type="sourcefile">node_modules/src/timepicker/timepicker.ts</context> |           <context context-type="sourcefile">node_modules/src/timepicker/timepicker.ts</context> | ||||||
|           <context context-type="linenumber">240,243</context> |           <context context-type="linenumber">239,240</context> | ||||||
|         </context-group> |         </context-group> | ||||||
|       </trans-unit> |       </trans-unit> | ||||||
|       <trans-unit id="ngb.timepicker.increment-minutes" datatype="html"> |       <trans-unit id="ngb.timepicker.increment-minutes" datatype="html"> | ||||||
|         <source>Increment minutes</source> |         <source>Increment minutes</source> | ||||||
|         <context-group purpose="location"> |         <context-group purpose="location"> | ||||||
|           <context context-type="sourcefile">node_modules/src/timepicker/timepicker.ts</context> |           <context context-type="sourcefile">node_modules/src/timepicker/timepicker.ts</context> | ||||||
|           <context context-type="linenumber">268</context> |           <context context-type="linenumber">264,268</context> | ||||||
|         </context-group> |         </context-group> | ||||||
|       </trans-unit> |       </trans-unit> | ||||||
|       <trans-unit id="ngb.timepicker.decrement-minutes" datatype="html"> |       <trans-unit id="ngb.timepicker.decrement-minutes" datatype="html"> | ||||||
|         <source>Decrement minutes</source> |         <source>Decrement minutes</source> | ||||||
|         <context-group purpose="location"> |         <context-group purpose="location"> | ||||||
|           <context context-type="sourcefile">node_modules/src/timepicker/timepicker.ts</context> |           <context context-type="sourcefile">node_modules/src/timepicker/timepicker.ts</context> | ||||||
|           <context context-type="linenumber">288,289</context> |           <context context-type="linenumber">287,289</context> | ||||||
|         </context-group> |         </context-group> | ||||||
|       </trans-unit> |       </trans-unit> | ||||||
|       <trans-unit id="ngb.timepicker.SS" datatype="html"> |       <trans-unit id="ngb.timepicker.SS" datatype="html"> | ||||||
| @@ -1648,7 +1648,7 @@ | |||||||
|         <source>Confirm delete</source> |         <source>Confirm delete</source> | ||||||
|         <context-group purpose="location"> |         <context-group purpose="location"> | ||||||
|           <context context-type="sourcefile">src/app/components/document-detail/document-detail.component.ts</context> |           <context context-type="sourcefile">src/app/components/document-detail/document-detail.component.ts</context> | ||||||
|           <context context-type="linenumber">439</context> |           <context context-type="linenumber">442</context> | ||||||
|         </context-group> |         </context-group> | ||||||
|         <context-group purpose="location"> |         <context-group purpose="location"> | ||||||
|           <context context-type="sourcefile">src/app/components/manage/management-list/management-list.component.ts</context> |           <context context-type="sourcefile">src/app/components/manage/management-list/management-list.component.ts</context> | ||||||
| @@ -1659,35 +1659,35 @@ | |||||||
|         <source>Do you really want to delete document "<x id="PH" equiv-text="this.document.title"/>"?</source> |         <source>Do you really want to delete document "<x id="PH" equiv-text="this.document.title"/>"?</source> | ||||||
|         <context-group purpose="location"> |         <context-group purpose="location"> | ||||||
|           <context context-type="sourcefile">src/app/components/document-detail/document-detail.component.ts</context> |           <context context-type="sourcefile">src/app/components/document-detail/document-detail.component.ts</context> | ||||||
|           <context context-type="linenumber">440</context> |           <context context-type="linenumber">443</context> | ||||||
|         </context-group> |         </context-group> | ||||||
|       </trans-unit> |       </trans-unit> | ||||||
|       <trans-unit id="6691075929777935948" datatype="html"> |       <trans-unit id="6691075929777935948" datatype="html"> | ||||||
|         <source>The files for this document will be deleted permanently. This operation cannot be undone.</source> |         <source>The files for this document will be deleted permanently. This operation cannot be undone.</source> | ||||||
|         <context-group purpose="location"> |         <context-group purpose="location"> | ||||||
|           <context context-type="sourcefile">src/app/components/document-detail/document-detail.component.ts</context> |           <context context-type="sourcefile">src/app/components/document-detail/document-detail.component.ts</context> | ||||||
|           <context context-type="linenumber">441</context> |           <context context-type="linenumber">444</context> | ||||||
|         </context-group> |         </context-group> | ||||||
|       </trans-unit> |       </trans-unit> | ||||||
|       <trans-unit id="719892092227206532" datatype="html"> |       <trans-unit id="719892092227206532" datatype="html"> | ||||||
|         <source>Delete document</source> |         <source>Delete document</source> | ||||||
|         <context-group purpose="location"> |         <context-group purpose="location"> | ||||||
|           <context context-type="sourcefile">src/app/components/document-detail/document-detail.component.ts</context> |           <context context-type="sourcefile">src/app/components/document-detail/document-detail.component.ts</context> | ||||||
|           <context context-type="linenumber">443</context> |           <context context-type="linenumber">446</context> | ||||||
|         </context-group> |         </context-group> | ||||||
|       </trans-unit> |       </trans-unit> | ||||||
|       <trans-unit id="1844801255494293730" datatype="html"> |       <trans-unit id="1844801255494293730" datatype="html"> | ||||||
|         <source>Error deleting document: <x id="PH" equiv-text="JSON.stringify(error)"/></source> |         <source>Error deleting document: <x id="PH" equiv-text="JSON.stringify(error)"/></source> | ||||||
|         <context-group purpose="location"> |         <context-group purpose="location"> | ||||||
|           <context context-type="sourcefile">src/app/components/document-detail/document-detail.component.ts</context> |           <context context-type="sourcefile">src/app/components/document-detail/document-detail.component.ts</context> | ||||||
|           <context context-type="linenumber">459</context> |           <context context-type="linenumber">462</context> | ||||||
|         </context-group> |         </context-group> | ||||||
|       </trans-unit> |       </trans-unit> | ||||||
|       <trans-unit id="7362691899087997122" datatype="html"> |       <trans-unit id="7362691899087997122" datatype="html"> | ||||||
|         <source>Redo OCR confirm</source> |         <source>Redo OCR confirm</source> | ||||||
|         <context-group purpose="location"> |         <context-group purpose="location"> | ||||||
|           <context context-type="sourcefile">src/app/components/document-detail/document-detail.component.ts</context> |           <context context-type="sourcefile">src/app/components/document-detail/document-detail.component.ts</context> | ||||||
|           <context context-type="linenumber">479</context> |           <context context-type="linenumber">482</context> | ||||||
|         </context-group> |         </context-group> | ||||||
|         <context-group purpose="location"> |         <context-group purpose="location"> | ||||||
|           <context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context> |           <context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context> | ||||||
| @@ -1698,14 +1698,14 @@ | |||||||
|         <source>This operation will permanently redo OCR for this document.</source> |         <source>This operation will permanently redo OCR for this document.</source> | ||||||
|         <context-group purpose="location"> |         <context-group purpose="location"> | ||||||
|           <context context-type="sourcefile">src/app/components/document-detail/document-detail.component.ts</context> |           <context context-type="sourcefile">src/app/components/document-detail/document-detail.component.ts</context> | ||||||
|           <context context-type="linenumber">480</context> |           <context context-type="linenumber">483</context> | ||||||
|         </context-group> |         </context-group> | ||||||
|       </trans-unit> |       </trans-unit> | ||||||
|       <trans-unit id="5641451190833696892" datatype="html"> |       <trans-unit id="5641451190833696892" datatype="html"> | ||||||
|         <source>This operation cannot be undone.</source> |         <source>This operation cannot be undone.</source> | ||||||
|         <context-group purpose="location"> |         <context-group purpose="location"> | ||||||
|           <context context-type="sourcefile">src/app/components/document-detail/document-detail.component.ts</context> |           <context context-type="sourcefile">src/app/components/document-detail/document-detail.component.ts</context> | ||||||
|           <context context-type="linenumber">481</context> |           <context context-type="linenumber">484</context> | ||||||
|         </context-group> |         </context-group> | ||||||
|         <context-group purpose="location"> |         <context-group purpose="location"> | ||||||
|           <context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context> |           <context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context> | ||||||
| @@ -1720,7 +1720,7 @@ | |||||||
|         <source>Proceed</source> |         <source>Proceed</source> | ||||||
|         <context-group purpose="location"> |         <context-group purpose="location"> | ||||||
|           <context context-type="sourcefile">src/app/components/document-detail/document-detail.component.ts</context> |           <context context-type="sourcefile">src/app/components/document-detail/document-detail.component.ts</context> | ||||||
|           <context context-type="linenumber">483</context> |           <context context-type="linenumber">486</context> | ||||||
|         </context-group> |         </context-group> | ||||||
|         <context-group purpose="location"> |         <context-group purpose="location"> | ||||||
|           <context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context> |           <context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context> | ||||||
| @@ -1731,7 +1731,7 @@ | |||||||
|         <source>Redo OCR operation will begin in the background.</source> |         <source>Redo OCR operation will begin in the background.</source> | ||||||
|         <context-group purpose="location"> |         <context-group purpose="location"> | ||||||
|           <context context-type="sourcefile">src/app/components/document-detail/document-detail.component.ts</context> |           <context context-type="sourcefile">src/app/components/document-detail/document-detail.component.ts</context> | ||||||
|           <context context-type="linenumber">491</context> |           <context context-type="linenumber">494</context> | ||||||
|         </context-group> |         </context-group> | ||||||
|       </trans-unit> |       </trans-unit> | ||||||
|       <trans-unit id="8008978164775353960" datatype="html"> |       <trans-unit id="8008978164775353960" datatype="html"> | ||||||
| @@ -1740,7 +1740,7 @@ | |||||||
|               )"/></source> |               )"/></source> | ||||||
|         <context-group purpose="location"> |         <context-group purpose="location"> | ||||||
|           <context context-type="sourcefile">src/app/components/document-detail/document-detail.component.ts</context> |           <context context-type="sourcefile">src/app/components/document-detail/document-detail.component.ts</context> | ||||||
|           <context context-type="linenumber">502,504</context> |           <context context-type="linenumber">505,507</context> | ||||||
|         </context-group> |         </context-group> | ||||||
|       </trans-unit> |       </trans-unit> | ||||||
|       <trans-unit id="6857598786757174736" datatype="html"> |       <trans-unit id="6857598786757174736" datatype="html"> | ||||||
| @@ -3200,6 +3200,13 @@ | |||||||
|           <context context-type="linenumber">39</context> |           <context context-type="linenumber">39</context> | ||||||
|         </context-group> |         </context-group> | ||||||
|       </trans-unit> |       </trans-unit> | ||||||
|  |       <trans-unit id="5948496158474272829" datatype="html"> | ||||||
|  |         <source>Warning: You have unsaved changes to your document(s).</source> | ||||||
|  |         <context-group purpose="location"> | ||||||
|  |           <context context-type="sourcefile">src/app/guards/dirty-doc.guard.ts</context> | ||||||
|  |           <context context-type="linenumber">18</context> | ||||||
|  |         </context-group> | ||||||
|  |       </trans-unit> | ||||||
|       <trans-unit id="159901853873315050" datatype="html"> |       <trans-unit id="159901853873315050" datatype="html"> | ||||||
|         <source>Unsaved Changes</source> |         <source>Unsaved Changes</source> | ||||||
|         <context-group purpose="location"> |         <context-group purpose="location"> | ||||||
| @@ -3208,11 +3215,11 @@ | |||||||
|         </context-group> |         </context-group> | ||||||
|         <context-group purpose="location"> |         <context-group purpose="location"> | ||||||
|           <context context-type="sourcefile">src/app/services/open-documents.service.ts</context> |           <context context-type="sourcefile">src/app/services/open-documents.service.ts</context> | ||||||
|           <context context-type="linenumber">111</context> |           <context context-type="linenumber">116</context> | ||||||
|         </context-group> |         </context-group> | ||||||
|         <context-group purpose="location"> |         <context-group purpose="location"> | ||||||
|           <context context-type="sourcefile">src/app/services/open-documents.service.ts</context> |           <context context-type="sourcefile">src/app/services/open-documents.service.ts</context> | ||||||
|           <context context-type="linenumber">138</context> |           <context context-type="linenumber">143</context> | ||||||
|         </context-group> |         </context-group> | ||||||
|       </trans-unit> |       </trans-unit> | ||||||
|       <trans-unit id="2573823578527613511" datatype="html"> |       <trans-unit id="2573823578527613511" datatype="html"> | ||||||
| @@ -3223,7 +3230,7 @@ | |||||||
|         </context-group> |         </context-group> | ||||||
|         <context-group purpose="location"> |         <context-group purpose="location"> | ||||||
|           <context context-type="sourcefile">src/app/services/open-documents.service.ts</context> |           <context context-type="sourcefile">src/app/services/open-documents.service.ts</context> | ||||||
|           <context context-type="linenumber">139</context> |           <context context-type="linenumber">144</context> | ||||||
|         </context-group> |         </context-group> | ||||||
|       </trans-unit> |       </trans-unit> | ||||||
|       <trans-unit id="3305084982600522070" datatype="html"> |       <trans-unit id="3305084982600522070" datatype="html"> | ||||||
| @@ -3360,35 +3367,35 @@ | |||||||
|         <source>You have unsaved changes to the document</source> |         <source>You have unsaved changes to the document</source> | ||||||
|         <context-group purpose="location"> |         <context-group purpose="location"> | ||||||
|           <context context-type="sourcefile">src/app/services/open-documents.service.ts</context> |           <context context-type="sourcefile">src/app/services/open-documents.service.ts</context> | ||||||
|           <context context-type="linenumber">113</context> |           <context context-type="linenumber">118</context> | ||||||
|         </context-group> |         </context-group> | ||||||
|       </trans-unit> |       </trans-unit> | ||||||
|       <trans-unit id="2089045849587358256" datatype="html"> |       <trans-unit id="2089045849587358256" datatype="html"> | ||||||
|         <source>Are you sure you want to close this document?</source> |         <source>Are you sure you want to close this document?</source> | ||||||
|         <context-group purpose="location"> |         <context-group purpose="location"> | ||||||
|           <context context-type="sourcefile">src/app/services/open-documents.service.ts</context> |           <context context-type="sourcefile">src/app/services/open-documents.service.ts</context> | ||||||
|           <context context-type="linenumber">117</context> |           <context context-type="linenumber">122</context> | ||||||
|         </context-group> |         </context-group> | ||||||
|       </trans-unit> |       </trans-unit> | ||||||
|       <trans-unit id="2885986061416655600" datatype="html"> |       <trans-unit id="2885986061416655600" datatype="html"> | ||||||
|         <source>Close document</source> |         <source>Close document</source> | ||||||
|         <context-group purpose="location"> |         <context-group purpose="location"> | ||||||
|           <context context-type="sourcefile">src/app/services/open-documents.service.ts</context> |           <context context-type="sourcefile">src/app/services/open-documents.service.ts</context> | ||||||
|           <context context-type="linenumber">119</context> |           <context context-type="linenumber">124</context> | ||||||
|         </context-group> |         </context-group> | ||||||
|       </trans-unit> |       </trans-unit> | ||||||
|       <trans-unit id="6755718693176327396" datatype="html"> |       <trans-unit id="6755718693176327396" datatype="html"> | ||||||
|         <source>Are you sure you want to close all documents?</source> |         <source>Are you sure you want to close all documents?</source> | ||||||
|         <context-group purpose="location"> |         <context-group purpose="location"> | ||||||
|           <context context-type="sourcefile">src/app/services/open-documents.service.ts</context> |           <context context-type="sourcefile">src/app/services/open-documents.service.ts</context> | ||||||
|           <context context-type="linenumber">140</context> |           <context context-type="linenumber">145</context> | ||||||
|         </context-group> |         </context-group> | ||||||
|       </trans-unit> |       </trans-unit> | ||||||
|       <trans-unit id="4215561719980781894" datatype="html"> |       <trans-unit id="4215561719980781894" datatype="html"> | ||||||
|         <source>Close documents</source> |         <source>Close documents</source> | ||||||
|         <context-group purpose="location"> |         <context-group purpose="location"> | ||||||
|           <context context-type="sourcefile">src/app/services/open-documents.service.ts</context> |           <context context-type="sourcefile">src/app/services/open-documents.service.ts</context> | ||||||
|           <context context-type="linenumber">142</context> |           <context context-type="linenumber">147</context> | ||||||
|         </context-group> |         </context-group> | ||||||
|       </trans-unit> |       </trans-unit> | ||||||
|       <trans-unit id="3553216189604488439" datatype="html"> |       <trans-unit id="3553216189604488439" datatype="html"> | ||||||
|   | |||||||
| @@ -14,12 +14,14 @@ import { DocumentAsnComponent } from './components/document-asn/document-asn.com | |||||||
| import { DirtyFormGuard } from './guards/dirty-form.guard' | import { DirtyFormGuard } from './guards/dirty-form.guard' | ||||||
| import { StoragePathListComponent } from './components/manage/storage-path-list/storage-path-list.component' | import { StoragePathListComponent } from './components/manage/storage-path-list/storage-path-list.component' | ||||||
| import { TasksComponent } from './components/manage/tasks/tasks.component' | import { TasksComponent } from './components/manage/tasks/tasks.component' | ||||||
|  | import { DirtyDocGuard } from './guards/dirty-doc.guard' | ||||||
|  |  | ||||||
| const routes: Routes = [ | const routes: Routes = [ | ||||||
|   { path: '', redirectTo: 'dashboard', pathMatch: 'full' }, |   { path: '', redirectTo: 'dashboard', pathMatch: 'full' }, | ||||||
|   { |   { | ||||||
|     path: '', |     path: '', | ||||||
|     component: AppFrameComponent, |     component: AppFrameComponent, | ||||||
|  |     canDeactivate: [DirtyDocGuard], | ||||||
|     children: [ |     children: [ | ||||||
|       { path: 'dashboard', component: DashboardComponent }, |       { path: 'dashboard', component: DashboardComponent }, | ||||||
|       { path: 'documents', component: DocumentListComponent }, |       { path: 'documents', component: DocumentListComponent }, | ||||||
|   | |||||||
| @@ -67,6 +67,7 @@ import { ApiVersionInterceptor } from './interceptors/api-version.interceptor' | |||||||
| import { ColorSliderModule } from 'ngx-color/slider' | import { ColorSliderModule } from 'ngx-color/slider' | ||||||
| import { ColorComponent } from './components/common/input/color/color.component' | import { ColorComponent } from './components/common/input/color/color.component' | ||||||
| import { DocumentAsnComponent } from './components/document-asn/document-asn.component' | import { DocumentAsnComponent } from './components/document-asn/document-asn.component' | ||||||
|  | import { DirtyDocGuard } from './guards/dirty-doc.guard' | ||||||
|  |  | ||||||
| import localeBe from '@angular/common/locales/be' | import localeBe from '@angular/common/locales/be' | ||||||
| import localeCs from '@angular/common/locales/cs' | import localeCs from '@angular/common/locales/cs' | ||||||
| @@ -209,6 +210,7 @@ function initializeApp(settings: SettingsService) { | |||||||
|     DocumentTitlePipe, |     DocumentTitlePipe, | ||||||
|     { provide: NgbDateAdapter, useClass: ISODateAdapter }, |     { provide: NgbDateAdapter, useClass: ISODateAdapter }, | ||||||
|     { provide: NgbDateParserFormatter, useClass: LocalizedDateParserFormatter }, |     { provide: NgbDateParserFormatter, useClass: LocalizedDateParserFormatter }, | ||||||
|  |     DirtyDocGuard, | ||||||
|   ], |   ], | ||||||
|   bootstrap: [AppComponent], |   bootstrap: [AppComponent], | ||||||
| }) | }) | ||||||
|   | |||||||
| @@ -1,6 +1,6 @@ | |||||||
| import { Component } from '@angular/core' | import { Component, HostListener } from '@angular/core' | ||||||
| import { FormControl } from '@angular/forms' | import { FormControl } from '@angular/forms' | ||||||
| import { ActivatedRoute, Router, Params } from '@angular/router' | import { ActivatedRoute, Router } from '@angular/router' | ||||||
| import { from, Observable } from 'rxjs' | import { from, Observable } from 'rxjs' | ||||||
| import { | import { | ||||||
|   debounceTime, |   debounceTime, | ||||||
| @@ -23,13 +23,14 @@ import { | |||||||
| } from 'src/app/services/rest/remote-version.service' | } from 'src/app/services/rest/remote-version.service' | ||||||
| import { SettingsService } from 'src/app/services/settings.service' | import { SettingsService } from 'src/app/services/settings.service' | ||||||
| import { TasksService } from 'src/app/services/tasks.service' | import { TasksService } from 'src/app/services/tasks.service' | ||||||
|  | import { ComponentCanDeactivate } from 'src/app/guards/dirty-doc.guard' | ||||||
|  |  | ||||||
| @Component({ | @Component({ | ||||||
|   selector: 'app-app-frame', |   selector: 'app-app-frame', | ||||||
|   templateUrl: './app-frame.component.html', |   templateUrl: './app-frame.component.html', | ||||||
|   styleUrls: ['./app-frame.component.scss'], |   styleUrls: ['./app-frame.component.scss'], | ||||||
| }) | }) | ||||||
| export class AppFrameComponent { | export class AppFrameComponent implements ComponentCanDeactivate { | ||||||
|   constructor( |   constructor( | ||||||
|     public router: Router, |     public router: Router, | ||||||
|     private activatedRoute: ActivatedRoute, |     private activatedRoute: ActivatedRoute, | ||||||
| @@ -64,6 +65,11 @@ export class AppFrameComponent { | |||||||
|     return this.openDocumentsService.getOpenDocuments() |     return this.openDocumentsService.getOpenDocuments() | ||||||
|   } |   } | ||||||
|  |  | ||||||
|  |   @HostListener('window:beforeunload') | ||||||
|  |   canDeactivate(): Observable<boolean> | boolean { | ||||||
|  |     return !this.openDocumentsService.hasDirty() | ||||||
|  |   } | ||||||
|  |  | ||||||
|   searchAutoComplete = (text$: Observable<string>) => |   searchAutoComplete = (text$: Observable<string>) => | ||||||
|     text$.pipe( |     text$.pipe( | ||||||
|       debounceTime(200), |       debounceTime(200), | ||||||
|   | |||||||
| @@ -206,7 +206,7 @@ export class DocumentDetailComponent | |||||||
|                   this.store.getValue().title !== |                   this.store.getValue().title !== | ||||||
|                   this.documentForm.get('title').value |                   this.documentForm.get('title').value | ||||||
|                 ) { |                 ) { | ||||||
|                   this.openDocumentService.setDirty(doc.id, true) |                   this.openDocumentService.setDirty(doc, true) | ||||||
|                 } |                 } | ||||||
|               }, |               }, | ||||||
|             }) |             }) | ||||||
| @@ -228,12 +228,15 @@ export class DocumentDetailComponent | |||||||
|             this.store.asObservable() |             this.store.asObservable() | ||||||
|           ) |           ) | ||||||
|  |  | ||||||
|           return this.isDirty$.pipe(map((dirty) => ({ doc, dirty }))) |           return this.isDirty$.pipe( | ||||||
|  |             takeUntil(this.unsubscribeNotifier), | ||||||
|  |             map((dirty) => ({ doc, dirty })) | ||||||
|  |           ) | ||||||
|         }) |         }) | ||||||
|       ) |       ) | ||||||
|       .subscribe({ |       .subscribe({ | ||||||
|         next: ({ doc, dirty }) => { |         next: ({ doc, dirty }) => { | ||||||
|           this.openDocumentService.setDirty(doc.id, dirty) |           this.openDocumentService.setDirty(doc, dirty) | ||||||
|         }, |         }, | ||||||
|         error: (error) => { |         error: (error) => { | ||||||
|           this.router.navigate(['404']) |           this.router.navigate(['404']) | ||||||
| @@ -349,7 +352,7 @@ export class DocumentDetailComponent | |||||||
|           Object.assign(this.document, doc) |           Object.assign(this.document, doc) | ||||||
|           this.title = doc.title |           this.title = doc.title | ||||||
|           this.documentForm.patchValue(doc) |           this.documentForm.patchValue(doc) | ||||||
|           this.openDocumentService.setDirty(doc.id, false) |           this.openDocumentService.setDirty(doc, false) | ||||||
|         }, |         }, | ||||||
|         error: () => { |         error: () => { | ||||||
|           this.router.navigate(['404']) |           this.router.navigate(['404']) | ||||||
|   | |||||||
							
								
								
									
										20
									
								
								src-ui/src/app/guards/dirty-doc.guard.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										20
									
								
								src-ui/src/app/guards/dirty-doc.guard.ts
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,20 @@ | |||||||
|  | import { CanDeactivate } from '@angular/router' | ||||||
|  | import { Injectable } from '@angular/core' | ||||||
|  | import { Observable } from 'rxjs' | ||||||
|  |  | ||||||
|  | export interface ComponentCanDeactivate { | ||||||
|  |   canDeactivate: () => boolean | Observable<boolean> | ||||||
|  | } | ||||||
|  |  | ||||||
|  | @Injectable() | ||||||
|  | export class DirtyDocGuard implements CanDeactivate<ComponentCanDeactivate> { | ||||||
|  |   canDeactivate( | ||||||
|  |     component: ComponentCanDeactivate | ||||||
|  |   ): boolean | Observable<boolean> { | ||||||
|  |     return component.canDeactivate() | ||||||
|  |       ? true | ||||||
|  |       : confirm( | ||||||
|  |           $localize`Warning: You have unsaved changes to your document(s).` | ||||||
|  |         ) | ||||||
|  |   } | ||||||
|  | } | ||||||
| @@ -92,9 +92,14 @@ export class OpenDocumentsService { | |||||||
|     } |     } | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   setDirty(documentId: number, dirty: boolean) { |   setDirty(doc: PaperlessDocument, dirty: boolean) { | ||||||
|     if (dirty) this.dirtyDocuments.add(documentId) |     if (!this.openDocuments.find((d) => d.id == doc.id)) return | ||||||
|     else this.dirtyDocuments.delete(documentId) |     if (dirty) this.dirtyDocuments.add(doc.id) | ||||||
|  |     else this.dirtyDocuments.delete(doc.id) | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   hasDirty(): boolean { | ||||||
|  |     return this.dirtyDocuments.size > 0 | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   closeDocument(doc: PaperlessDocument): Observable<boolean> { |   closeDocument(doc: PaperlessDocument): Observable<boolean> { | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 shamoon
					shamoon