diff --git a/src/atlasComponents/regionalFeatures/bsFeatures/kgRegionalFeature/kgRegList/kgReglist.directive.ts b/src/atlasComponents/regionalFeatures/bsFeatures/kgRegionalFeature/kgRegList/kgReglist.directive.ts index 60e38ee33d056bc7ebecc9ee975e6569228fefd3..9c183003a49de3c208b06a399e2dbc8326cb19a4 100644 --- a/src/atlasComponents/regionalFeatures/bsFeatures/kgRegionalFeature/kgRegList/kgReglist.directive.ts +++ b/src/atlasComponents/regionalFeatures/bsFeatures/kgRegionalFeature/kgRegList/kgReglist.directive.ts @@ -1,10 +1,11 @@ -import { Directive, EventEmitter, OnDestroy, Output } from "@angular/core"; +import { Directive, EventEmitter, Inject, OnDestroy, Optional, Output } from "@angular/core"; import { KG_REGIONAL_FEATURE_KEY, TBSSummary } from "../type"; -import { BsFeatureService } from "../../service"; +import { BsFeatureService, TFeatureCmpInput } from "../../service"; import { BsRegionInputBase } from "../../bsRegionInputBase"; import { merge, of, Subscription } from "rxjs"; -import { filter, mapTo, startWith, switchMap, tap } from "rxjs/operators"; +import { catchError, mapTo, startWith, switchMap, tap } from "rxjs/operators"; import { IRegionalFeatureReadyDirective } from "../../type"; +import { REGISTERED_FEATURE_INJECT_DATA } from "../../constants"; @Directive({ selector: '[kg-regional-features-list-directive]', @@ -14,21 +15,27 @@ import { IRegionalFeatureReadyDirective } from "../../type"; export class KgRegionalFeaturesListDirective extends BsRegionInputBase implements IRegionalFeatureReadyDirective, OnDestroy { public kgRegionalFeatures: TBSSummary[] = [] public kgRegionalFeatures$ = this.region$.pipe( - filter(v => !!v), // must not use switchmapto here switchMap(() => { this.busyEmitter.emit(true) - return this.getFeatureInstancesList(KG_REGIONAL_FEATURE_KEY).pipe( - tap(() => { - this.busyEmitter.emit(false) - }) + return merge( + of([]), + this.getFeatureInstancesList(KG_REGIONAL_FEATURE_KEY).pipe( + catchError(() => of([])), + tap(() => { + this.busyEmitter.emit(false) + }), + ) ) }), startWith([]) ) - constructor(svc: BsFeatureService){ - super(svc) + constructor( + svc: BsFeatureService, + @Optional() @Inject(REGISTERED_FEATURE_INJECT_DATA) data: TFeatureCmpInput, + ){ + super(svc, data) this.sub.push( this.kgRegionalFeatures$.subscribe(val => { this.kgRegionalFeatures = val diff --git a/src/atlasComponents/regionalFeatures/bsFeatures/regionalFeatureWrapper/regionalFeatureWrapper.component.ts b/src/atlasComponents/regionalFeatures/bsFeatures/regionalFeatureWrapper/regionalFeatureWrapper.component.ts index 0df3cd98f0519b9cfc0f22d236a9f26b2f13f619..610eb96e615f23690710ab392b4d492059bcb13b 100644 --- a/src/atlasComponents/regionalFeatures/bsFeatures/regionalFeatureWrapper/regionalFeatureWrapper.component.ts +++ b/src/atlasComponents/regionalFeatures/bsFeatures/regionalFeatureWrapper/regionalFeatureWrapper.component.ts @@ -1,8 +1,8 @@ import { Component, ComponentFactory, ComponentFactoryResolver, Injector, Input, OnChanges, ViewChild, ViewContainerRef } from "@angular/core"; import { TRegion } from "../type"; -import { BsFeatureService, TFeatureCmpInput, TRegisteredFeature } from "../service"; -import { BehaviorSubject, Observable } from "rxjs"; -import { map } from "rxjs/operators"; +import { BsFeatureService, TFeatureCmpInput } from "../service"; +import { BehaviorSubject, combineLatest, Observable } from "rxjs"; +import { map, scan } from "rxjs/operators"; import { REGISTERED_FEATURE_INJECT_DATA } from "../constants"; @Component({ @@ -23,13 +23,37 @@ export class RegionalFeatureWrapperCmp implements OnChanges{ private weakmap = new WeakMap<(new () => any), ComponentFactory<any>>() - public registeredFeatures$ = this.svc.registeredFeatures$ + public registeredFeatures$: Observable<{ + name: string + icon: string + + }[]> constructor( private svc: BsFeatureService, private cfr: ComponentFactoryResolver, private injector: Injector, ){ - + this.registeredFeatures$ = this.registeredFeatureMasterStream$.pipe( + scan((acc, curr) => { + return { + ...acc, + ...curr + } + }), + map(obj => { + const returnArr = [] + for (const name in obj) { + if (obj[name].busy || obj[name].results.length === 0) { + continue + } + returnArr.push({ + name, + icon: obj[name].icon + }) + } + return returnArr + }) + ) } private regionOnDestroyCb: (() => void)[] = [] @@ -37,11 +61,15 @@ export class RegionalFeatureWrapperCmp implements OnChanges{ if (!this.region) return const { region } = this for (const feat of this.svc.registeredFeatures){ + const { name, icon } = feat const ctrl = new feat.Ctrl(this.svc, { region }) - const sub = ctrl.busy$.subscribe( - flag => { - this.busyMasterStream$.next({ - [feat.name]: flag + const sub = combineLatest([ + ctrl.busy$, + ctrl.results$ + ]).subscribe( + ([busy, results]) => { + this.registeredFeatureMasterStream$.next({ + [name]: { busy, results, icon } }) } ) @@ -50,16 +78,20 @@ export class RegionalFeatureWrapperCmp implements OnChanges{ } private cleanUpRegionalFeature(){ while (this.regionOnDestroyCb.length) this.regionOnDestroyCb.pop()() - this.busyMasterStream$.next({}) + this.registeredFeatureMasterStream$.next({}) } - private busyMasterStream$ = new BehaviorSubject<{ - [key: string]: boolean + private registeredFeatureMasterStream$ = new BehaviorSubject<{ + [key: string]: { + icon: string + busy: boolean + results: any[] + } }>({}) - public busy$: Observable<boolean> = this.busyMasterStream$.pipe( + public busy$: Observable<boolean> = this.registeredFeatureMasterStream$.pipe( map(obj => { for (const key in obj) { - if(obj[key]) return true + if(obj[key].busy) return true } return false }), @@ -71,8 +103,15 @@ export class RegionalFeatureWrapperCmp implements OnChanges{ } public activatedFeatureName: string = null - activateFeature(feat: TRegisteredFeature){ - this.activatedFeatureName = feat.name + activateFeature(featNameObj: { + name: string + }){ + const feat = this.svc.registeredFeatures.find(f => f.name === featNameObj.name) + if (!feat) { + console.log(`cannot find feature with name ${featNameObj.name}`) + return + } + this.activatedFeatureName = featNameObj.name if (!this.regionalFeatureContainerRef) { console.warn(`regionalFeatureContainerRef not defined.`) return