From 7c165f30ce6c3be1df8b929f0afef7f4179178a9 Mon Sep 17 00:00:00 2001 From: Brandon Clayton <bclayton@usgs.gov> Date: Tue, 18 Mar 2025 13:33:11 -0600 Subject: [PATCH] add nav service --- .../src/shared/services/navigation.service.ts | 216 ++++++++++++++++++ 1 file changed, 216 insertions(+) create mode 100644 projects/nshmp-apps/src/shared/services/navigation.service.ts diff --git a/projects/nshmp-apps/src/shared/services/navigation.service.ts b/projects/nshmp-apps/src/shared/services/navigation.service.ts new file mode 100644 index 00000000..70328b79 --- /dev/null +++ b/projects/nshmp-apps/src/shared/services/navigation.service.ts @@ -0,0 +1,216 @@ +import {Injectable, Signal, signal} from '@angular/core'; +import {Navigation, NavigationList} from '@ghsc/nshmp-template'; +import {catchError, map, of} from 'rxjs'; + +import * as ApplicationsUtils from '../utils/applications.utils'; +import {AuthService} from './auth.service'; + +const APPS = ApplicationsUtils.apps(); +const DEV_APPS = ApplicationsUtils.devApps(); +const INTERNAL_APPS = ApplicationsUtils.internalApps(); + +@Injectable({ + providedIn: 'root', +}) +export class NavigationService { + private navListSignal = signal<NavigationList[]>([]); + private devNavListSignal = signal<NavigationList[]>(this.devNavigationList()); + private internalNavListSignal = signal<NavigationList[]>( + this.internalNavigationList(), + ); + + constructor(private authService: AuthService) { + this.navigation(); + } + + /** + * Returns the list of design map application. + */ + designMapApps(): Navigation[] { + return Object.values(APPS.designMaps) as Navigation[]; + } + + devGmmApps(): Navigation[] { + return Object.values(DEV_APPS.gmm) as Navigation[]; + } + + devHazardApps(): Navigation[] { + return Object.values(DEV_APPS.hazard) as Navigation[]; + } + + /** + * Returns the list development main applications. + */ + devMainApps(): Navigation[] { + return [ + DEV_APPS.math.exceedanceExplorer, + DEV_APPS.hazard.dynamicCompare, + DEV_APPS.gmm.hangingWallEffects, + ]; + } + + devMathApps(): Navigation[] { + return Object.values(DEV_APPS.math) as Navigation[]; + } + + /** + * Returns the drop down navigation menu for development applications. + */ + get devNavigation(): Signal<NavigationList[]> { + return this.devNavListSignal.asReadonly(); + } + + /** + * Returns the list of ground motion model applications. + */ + gmmApps(): Navigation[] { + return Object.values(APPS.gmm) as Navigation[]; + } + + /** + * Returns list of hazard applications. + */ + hazardApps(): Navigation[] { + return Object.values(APPS.hazard) as Navigation[]; + } + + /** + * Returns the list of AWS applications. + */ + internalAwsApps(): Navigation[] { + return Object.values(INTERNAL_APPS.aws) as Navigation[]; + } + + internalMainApps(): Navigation[] { + return this.internalAwsApps(); + } + + get internalNavigation(): Signal<NavigationList[]> { + return this.internalNavListSignal.asReadonly(); + } + + get navigationList(): Signal<NavigationList[]> { + return this.navListSignal; + } + + /** + * Returns the list services apps. + */ + serviceApps(): Navigation[] { + return [APPS.services]; + } + + /** + * Returns the list of NCM appliations. + */ + ncmApps(): Navigation[] { + return Object.values(APPS.ncm) as Navigation[]; + } + + /** + * Returns the list of source model applicaitons. + */ + sourceModelApps(): Navigation[] { + return Object.values(APPS.source) as Navigation[]; + } + + private devNavigationList(): NavigationList[] { + const devNavigation: NavigationList[] = [ + { + navigation: [DEV_APPS.dashboard], + }, + { + navigation: this.devHazardApps(), + subHeader: 'Hazard', + }, + { + navigation: this.devGmmApps(), + subHeader: 'Ground Motion Models', + }, + { + navigation: this.devMathApps(), + subHeader: 'Math', + }, + ]; + + return devNavigation; + } + + private internalNavigationList(): NavigationList[] { + const internalNavigation: NavigationList[] = [ + { + navigation: [INTERNAL_APPS.dashboard], + }, + { + navigation: this.internalAwsApps(), + subHeader: 'AWS', + }, + ]; + + return [...internalNavigation]; + } + + /** + * Get navigation. + */ + private navigation() { + const navigation: NavigationList[] = [ + { + navigation: [APPS.dashboard], + }, + { + navigation: this.hazardApps(), + subHeader: 'Hazard', + }, + { + navigation: this.sourceModelApps(), + subHeader: 'Source Models', + }, + { + navigation: this.gmmApps(), + subHeader: 'Ground Motion Models', + }, + { + navigation: this.designMapApps(), + subHeader: 'Design Map', + }, + { + navigation: this.ncmApps(), + subHeader: 'National Crustal Model', + }, + { + navigation: [DEV_APPS.dashboard, ...this.devMainApps()], + subHeader: 'Development', + }, + ]; + + this.authService + .isAuthorized(false) + .pipe( + map(isInternal => { + if (isInternal) { + navigation.push({ + navigation: this.internalMainApps(), + subHeader: 'Internal', + }); + } + + navigation.push({ + navigation: [APPS.services], + }); + + return navigation; + }), + catchError(() => { + navigation.push({ + navigation: [APPS.services], + }); + this.navListSignal.set(navigation); + return of(); + }), + ) + .subscribe(navList => { + this.navListSignal.set(navList); + }); + } +} -- GitLab