mirror of https://github.com/abpframework/abp.git
3 changed files with 62 additions and 0 deletions
@ -0,0 +1,59 @@ |
|||
import { OnInit, Directive, OnDestroy, Input, ViewContainerRef, TemplateRef } from '@angular/core'; |
|||
import { EMPTY, from, Observable, of, Subscription } from 'rxjs'; |
|||
|
|||
@Directive({ |
|||
selector: '[abpVisible]', |
|||
}) |
|||
export class AbpVisibleDirective implements OnDestroy, OnInit { |
|||
conditionSubscription: Subscription | undefined; |
|||
isVisible: boolean | undefined; |
|||
|
|||
@Input('abpVisible') set abpVisible( |
|||
value: boolean | Promise<boolean> | Observable<boolean> | undefined | null, |
|||
) { |
|||
this.condition$ = checkType(value); |
|||
this.subscribeToCondition(); |
|||
} |
|||
|
|||
private condition$: Observable<boolean> = of(false); |
|||
|
|||
constructor( |
|||
private viewContainerRef: ViewContainerRef, |
|||
private templateRef: TemplateRef<unknown>, |
|||
) {} |
|||
ngOnInit(): void { |
|||
this.updateVisibility(); |
|||
} |
|||
ngOnDestroy(): void { |
|||
this.conditionSubscription?.unsubscribe(); |
|||
} |
|||
|
|||
private subscribeToCondition() { |
|||
this.conditionSubscription = this.condition$.subscribe(value => { |
|||
this.isVisible = value; |
|||
this.updateVisibility(); |
|||
}); |
|||
} |
|||
private updateVisibility() { |
|||
this.viewContainerRef.clear(); |
|||
// it should be false not falsy
|
|||
if (this.isVisible === false) { |
|||
return; |
|||
} |
|||
this.viewContainerRef.createEmbeddedView(this.templateRef); |
|||
} |
|||
} |
|||
|
|||
function checkType(value: boolean | Promise<boolean> | Observable<boolean> | undefined | null) { |
|||
if (value instanceof Promise) { |
|||
return from(value); |
|||
} else if (value instanceof Observable) { |
|||
return value; |
|||
} else if (typeof value === 'boolean') { |
|||
return of(value); |
|||
} else if (value === undefined || value === null) { |
|||
return of(true); |
|||
} else { |
|||
return EMPTY; |
|||
} |
|||
} |
|||
Loading…
Reference in new issue