Browse Source

refactor(admin-ui): Create DeactivateAware interface for routing guards

Michael Bromley 6 years ago
parent
commit
ddb18e46b1

+ 3 - 1
packages/admin-ui/src/app/common/base-detail.component.ts

@@ -5,10 +5,12 @@ import { distinctUntilChanged, map, shareReplay, switchMap, takeUntil, tap } fro
 
 
 import { ServerConfigService } from '../data/server-config';
 import { ServerConfigService } from '../data/server-config';
 
 
+import { DeactivateAware } from './deactivate-aware';
 import { CustomFieldConfig, CustomFields, LanguageCode } from './generated-types';
 import { CustomFieldConfig, CustomFields, LanguageCode } from './generated-types';
 import { getDefaultLanguage } from './utilities/get-default-language';
 import { getDefaultLanguage } from './utilities/get-default-language';
 
 
-export abstract class BaseDetailComponent<Entity extends { id: string; updatedAt?: string }> {
+export abstract class BaseDetailComponent<Entity extends { id: string; updatedAt?: string }>
+    implements DeactivateAware {
     entity$: Observable<Entity>;
     entity$: Observable<Entity>;
     availableLanguages$: Observable<LanguageCode[]>;
     availableLanguages$: Observable<LanguageCode[]>;
     languageCode$: Observable<LanguageCode>;
     languageCode$: Observable<LanguageCode>;

+ 8 - 0
packages/admin-ui/src/app/common/deactivate-aware.ts

@@ -0,0 +1,8 @@
+/**
+ * This interface should be implemented by those top-level components which want to
+ * signal to the user if a route deactivation is attempted in a state where chages
+ * would be lost.
+ */
+export interface DeactivateAware {
+    canDeactivate(): boolean;
+}

+ 3 - 3
packages/admin-ui/src/app/shared/providers/routing/can-deactivate-detail-guard.ts

@@ -4,7 +4,7 @@ import { Observable } from 'rxjs';
 import { map } from 'rxjs/operators';
 import { map } from 'rxjs/operators';
 import { _ } from 'src/app/core/providers/i18n/mark-for-extraction';
 import { _ } from 'src/app/core/providers/i18n/mark-for-extraction';
 
 
-import { BaseDetailComponent } from '../../../common/base-detail.component';
+import { DeactivateAware } from '../../../common/deactivate-aware';
 import { ModalService } from '../modal/modal.service';
 import { ModalService } from '../modal/modal.service';
 
 
 /**
 /**
@@ -14,11 +14,11 @@ import { ModalService } from '../modal/modal.service';
 export const IGNORE_CAN_DEACTIVATE_GUARD = 'IGNORE_CAN_DEACTIVATE_GUARD';
 export const IGNORE_CAN_DEACTIVATE_GUARD = 'IGNORE_CAN_DEACTIVATE_GUARD';
 
 
 @Injectable()
 @Injectable()
-export class CanDeactivateDetailGuard implements CanDeactivate<BaseDetailComponent<any>> {
+export class CanDeactivateDetailGuard implements CanDeactivate<DeactivateAware> {
     constructor(private modalService: ModalService, private router: Router) {}
     constructor(private modalService: ModalService, private router: Router) {}
 
 
     canDeactivate(
     canDeactivate(
-        component: BaseDetailComponent<any>,
+        component: DeactivateAware,
         currentRoute: ActivatedRouteSnapshot,
         currentRoute: ActivatedRouteSnapshot,
         currentState: RouterStateSnapshot,
         currentState: RouterStateSnapshot,
         nextState?: RouterStateSnapshot,
         nextState?: RouterStateSnapshot,