@ui-tool/core
Version:
88 lines • 12 kB
JavaScript
import { Directive, Inject, Input } from '@angular/core';
import { FEATURE_SENTINEL_SERVICE } from '../../../constants/injectors/injectors';
import { of, ReplaySubject, Subscription } from 'rxjs';
import { catchError, distinctUntilChanged, switchMap } from 'rxjs/operators';
import * as i0 from "@angular/core";
export class FeatureSentinelDirective {
//#endregion
//#region Constructor
constructor(_requireFeaturePermissionService, _viewContainerRef, _templateRef) {
this._requireFeaturePermissionService = _requireFeaturePermissionService;
this._viewContainerRef = _viewContainerRef;
this._templateRef = _templateRef;
this.__names = [];
this.__displayFeatureContent$ = new ReplaySubject();
this._subscription = new Subscription();
}
//#endregion
//#region Accessors
set name(value) {
if (value instanceof Array) {
this.__names = value;
}
else {
this.__names = [value];
}
this.__displayFeatureContent$.next();
}
set elseTemplate(value) {
this.__elseTemplateRef = value;
this.__displayFeatureContent$.next();
}
//#endregion
//#region Methods
ngOnInit() {
// Display feature subscription.
const displayFeatureContentSubscription = this.__displayFeatureContent$
.pipe(switchMap(() => {
return this._requireFeaturePermissionService
.ableToAccessFeaturesAsync(this.__names)
.pipe(catchError(_ => of(false)));
}), distinctUntilChanged())
.subscribe(ableToAccessFeature => {
this._viewContainerRef.clear();
if (!ableToAccessFeature) {
if (this.__elseTemplateRef) {
const elseView = this._viewContainerRef.createEmbeddedView(this.__elseTemplateRef);
elseView.markForCheck();
}
return;
}
else {
const embeddedView = this._viewContainerRef.createEmbeddedView(this._templateRef);
embeddedView.markForCheck();
}
});
this._subscription.add(displayFeatureContentSubscription);
// Hook validation event from service.
const hookValidationEventSubscription = this._requireFeaturePermissionService
.hookValidationEventAsync()
.subscribe(() => {
this.__displayFeatureContent$.next();
});
this._subscription.add(hookValidationEventSubscription);
this.__displayFeatureContent$.next();
}
ngOnDestroy() {
this.__displayFeatureContent$.complete();
this._subscription?.unsubscribe();
}
}
FeatureSentinelDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: FeatureSentinelDirective, deps: [{ token: FEATURE_SENTINEL_SERVICE }, { token: i0.ViewContainerRef }, { token: i0.TemplateRef }], target: i0.ɵɵFactoryTarget.Directive });
FeatureSentinelDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "13.3.11", type: FeatureSentinelDirective, selector: "[hasFeatureAccess]", inputs: { name: ["hasFeatureAccess", "name"], elseTemplate: ["hasFeatureAccessElse", "elseTemplate"] }, ngImport: i0 });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: FeatureSentinelDirective, decorators: [{
type: Directive,
args: [{
selector: '[hasFeatureAccess]'
}]
}], ctorParameters: function () { return [{ type: undefined, decorators: [{
type: Inject,
args: [FEATURE_SENTINEL_SERVICE]
}] }, { type: i0.ViewContainerRef }, { type: i0.TemplateRef }]; }, propDecorators: { name: [{
type: Input,
args: ['hasFeatureAccess']
}], elseTemplate: [{
type: Input,
args: ['hasFeatureAccessElse']
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmVhdHVyZS1zZW50aW5lbC5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2NvcmUvc3JjL21vZHVsZXMvc2VudGluZWwvZmVhdHVyZS1zZW50aW5lbC9mZWF0dXJlLXNlbnRpbmVsLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsU0FBUyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQW1ELE1BQU0sZUFBZSxDQUFDO0FBQ3pHLE9BQU8sRUFBQyx3QkFBd0IsRUFBQyxNQUFNLHdDQUF3QyxDQUFDO0FBRWhGLE9BQU8sRUFBQyxFQUFFLEVBQUUsYUFBYSxFQUFXLFlBQVksRUFBQyxNQUFNLE1BQU0sQ0FBQztBQUM5RCxPQUFPLEVBQUMsVUFBVSxFQUFnQixvQkFBb0IsRUFBRSxTQUFTLEVBQU0sTUFBTSxnQkFBZ0IsQ0FBQzs7QUFLOUYsTUFBTSxPQUFPLHdCQUF3QjtJQXFDbkMsWUFBWTtJQUVaLHFCQUFxQjtJQUVyQixZQUNzQyxnQ0FBeUQsRUFDekQsaUJBQW1DLEVBQ25DLFlBQThCO1FBRjlCLHFDQUFnQyxHQUFoQyxnQ0FBZ0MsQ0FBeUI7UUFDekQsc0JBQWlCLEdBQWpCLGlCQUFpQixDQUFrQjtRQUNuQyxpQkFBWSxHQUFaLFlBQVksQ0FBa0I7UUFFbEUsSUFBSSxDQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7UUFDbEIsSUFBSSxDQUFDLHdCQUF3QixHQUFHLElBQUksYUFBYSxFQUFRLENBQUM7UUFDMUQsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO0lBQzFDLENBQUM7SUFsQ0QsWUFBWTtJQUVaLG1CQUFtQjtJQUVuQixJQUNXLElBQUksQ0FBQyxLQUF3QjtRQUV0QyxJQUFJLEtBQUssWUFBWSxLQUFLLEVBQUU7WUFDMUIsSUFBSSxDQUFDLE9BQU8sR0FBRyxLQUFpQixDQUFDO1NBQ2xDO2FBQU07WUFDTCxJQUFJLENBQUMsT0FBTyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7U0FDeEI7UUFFRCxJQUFJLENBQUMsd0JBQXdCLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDdkMsQ0FBQztJQUVELElBQ1csWUFBWSxDQUFDLEtBQXVCO1FBQzdDLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxLQUFLLENBQUM7UUFDL0IsSUFBSSxDQUFDLHdCQUF3QixDQUFDLElBQUksRUFBRSxDQUFDO0lBQ3ZDLENBQUM7SUFnQkgsWUFBWTtJQUVWLGlCQUFpQjtJQUVWLFFBQVE7UUFFYixnQ0FBZ0M7UUFDaEMsTUFBTSxpQ0FBaUMsR0FBRyxJQUFJLENBQUMsd0JBQXdCO2FBQ3BFLElBQUksQ0FDSCxTQUFTLENBQUMsR0FBRyxFQUFFO1lBQ2IsT0FBTyxJQUFJLENBQUMsZ0NBQWdDO2lCQUN6Qyx5QkFBeUIsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDO2lCQUN2QyxJQUFJLENBQ0gsVUFBVSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQzNCLENBQUM7UUFDTixDQUFDLENBQUMsRUFDRixvQkFBb0IsRUFBRSxDQUN2QjthQUNBLFNBQVMsQ0FBQyxtQkFBbUIsQ0FBQyxFQUFFO1lBQy9CLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUMvQixJQUFJLENBQUMsbUJBQW1CLEVBQUU7Z0JBQ3hCLElBQUksSUFBSSxDQUFDLGlCQUFpQixFQUFFO29CQUMxQixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUM7b0JBQ25GLFFBQVEsQ0FBQyxZQUFZLEVBQUUsQ0FBQztpQkFDekI7Z0JBQ0QsT0FBTzthQUNSO2lCQUFNO2dCQUNMLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7Z0JBQ2xGLFlBQVksQ0FBQyxZQUFZLEVBQUUsQ0FBQzthQUM3QjtRQUNILENBQUMsQ0FBQyxDQUFDO1FBQ0wsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsaUNBQWlDLENBQUMsQ0FBQztRQUUxRCxzQ0FBc0M7UUFDdEMsTUFBTSwrQkFBK0IsR0FBRyxJQUFJLENBQUMsZ0NBQWdDO2FBQzFFLHdCQUF3QixFQUFFO2FBQzFCLFNBQVMsQ0FBQyxHQUFHLEVBQUU7WUFDZCxJQUFJLENBQUMsd0JBQXdCLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDdkMsQ0FBQyxDQUFDLENBQUM7UUFDTCxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQywrQkFBK0IsQ0FBQyxDQUFDO1FBRXhELElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUN2QyxDQUFDO0lBRU0sV0FBVztRQUNoQixJQUFJLENBQUMsd0JBQXdCLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDekMsSUFBSSxDQUFDLGFBQWEsRUFBRSxXQUFXLEVBQUUsQ0FBQztJQUNwQyxDQUFDOztzSEFsR1Usd0JBQXdCLGtCQXlDUix3QkFBd0I7MEdBekN4Qyx3QkFBd0I7NEZBQXhCLHdCQUF3QjtrQkFIcEMsU0FBUzttQkFBQztvQkFDVCxRQUFRLEVBQUUsb0JBQW9CO2lCQUMvQjs7MEJBMENxQixNQUFNOzJCQUFDLHdCQUF3QjtxR0FyQnhDLElBQUk7c0JBRGQsS0FBSzt1QkFBQyxrQkFBa0I7Z0JBYWQsWUFBWTtzQkFEdEIsS0FBSzt1QkFBQyxzQkFBc0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0RpcmVjdGl2ZSwgSW5qZWN0LCBJbnB1dCwgT25EZXN0cm95LCBPbkluaXQsIFRlbXBsYXRlUmVmLCBWaWV3Q29udGFpbmVyUmVmfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7RkVBVFVSRV9TRU5USU5FTF9TRVJWSUNFfSBmcm9tICcuLi8uLi8uLi9jb25zdGFudHMvaW5qZWN0b3JzL2luamVjdG9ycyc7XG5pbXBvcnQge0lGZWF0dXJlU2VudGluZWxTZXJ2aWNlfSBmcm9tICcuL2ZlYXR1cmUtc2VudGluZWwtc2VydmljZS5pbnRlcmZhY2UnO1xuaW1wb3J0IHtvZiwgUmVwbGF5U3ViamVjdCwgU3ViamVjdCwgU3Vic2NyaXB0aW9ufSBmcm9tICdyeGpzJztcbmltcG9ydCB7Y2F0Y2hFcnJvciwgZGVib3VuY2VUaW1lLCBkaXN0aW5jdFVudGlsQ2hhbmdlZCwgc3dpdGNoTWFwLCB0YXB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuQERpcmVjdGl2ZSh7XG4gIHNlbGVjdG9yOiAnW2hhc0ZlYXR1cmVBY2Nlc3NdJ1xufSlcbmV4cG9ydCBjbGFzcyBGZWF0dXJlU2VudGluZWxEaXJlY3RpdmUgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG5cbiAgLy8jcmVnaW9uIFByb3BlcnRpZXNcblxuICAvLyBOYW1lIG9mIGZlYXR1cmUuXG4gIHByaXZhdGUgX19uYW1lczogc3RyaW5nW107XG5cbiAgcHJpdmF0ZSBfX2Vsc2VUZW1wbGF0ZVJlZj86IFRlbXBsYXRlUmVmPGFueT47XG5cbiAgLy8gUmFpc2UgZXZlbnQgYWJvdXQgZGlzcGxheWluZyBmZWF0dXJlIGNvbnRlbnQuXG4gIHByaXZhdGUgX19kaXNwbGF5RmVhdHVyZUNvbnRlbnQkOiBTdWJqZWN0PHZvaWQ+O1xuXG4gIC8vIFN1YnNjcmlwdGlvbiB3YXRjaCBsaXN0LlxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgX3N1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xuXG4gIC8vI2VuZHJlZ2lvblxuXG4gIC8vI3JlZ2lvbiBBY2Nlc3NvcnNcblxuICBASW5wdXQoJ2hhc0ZlYXR1cmVBY2Nlc3MnKVxuICBwdWJsaWMgc2V0IG5hbWUodmFsdWU6IHN0cmluZyB8IHN0cmluZ1tdKSB7XG5cbiAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBBcnJheSkge1xuICAgICAgdGhpcy5fX25hbWVzID0gdmFsdWUgYXMgc3RyaW5nW107XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX19uYW1lcyA9IFt2YWx1ZV07XG4gICAgfVxuXG4gICAgdGhpcy5fX2Rpc3BsYXlGZWF0dXJlQ29udGVudCQubmV4dCgpO1xuICB9XG5cbiAgQElucHV0KCdoYXNGZWF0dXJlQWNjZXNzRWxzZScpXG4gIHB1YmxpYyBzZXQgZWxzZVRlbXBsYXRlKHZhbHVlOiBUZW1wbGF0ZVJlZjxhbnk+KSB7XG4gICAgdGhpcy5fX2Vsc2VUZW1wbGF0ZVJlZiA9IHZhbHVlO1xuICAgIHRoaXMuX19kaXNwbGF5RmVhdHVyZUNvbnRlbnQkLm5leHQoKTtcbiAgfVxuXG4gIC8vI2VuZHJlZ2lvblxuXG4gIC8vI3JlZ2lvbiBDb25zdHJ1Y3RvclxuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihASW5qZWN0KEZFQVRVUkVfU0VOVElORUxfU0VSVklDRSlcbiAgICAgICAgICAgICAgICAgICAgIHByb3RlY3RlZCByZWFkb25seSBfcmVxdWlyZUZlYXR1cmVQZXJtaXNzaW9uU2VydmljZTogSUZlYXR1cmVTZW50aW5lbFNlcnZpY2UsXG4gICAgICAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgX3ZpZXdDb250YWluZXJSZWY6IFZpZXdDb250YWluZXJSZWYsXG4gICAgICAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgX3RlbXBsYXRlUmVmOiBUZW1wbGF0ZVJlZjxhbnk+KSB7XG5cbiAgICB0aGlzLl9fbmFtZXMgPSBbXTtcbiAgICB0aGlzLl9fZGlzcGxheUZlYXR1cmVDb250ZW50JCA9IG5ldyBSZXBsYXlTdWJqZWN0PHZvaWQ+KCk7XG4gICAgdGhpcy5fc3Vic2NyaXB0aW9uID0gbmV3IFN1YnNjcmlwdGlvbigpO1xuICB9XG5cbi8vI2VuZHJlZ2lvblxuXG4gIC8vI3JlZ2lvbiBNZXRob2RzXG5cbiAgcHVibGljIG5nT25Jbml0KCk6IHZvaWQge1xuXG4gICAgLy8gRGlzcGxheSBmZWF0dXJlIHN1YnNjcmlwdGlvbi5cbiAgICBjb25zdCBkaXNwbGF5RmVhdHVyZUNvbnRlbnRTdWJzY3JpcHRpb24gPSB0aGlzLl9fZGlzcGxheUZlYXR1cmVDb250ZW50JFxuICAgICAgLnBpcGUoXG4gICAgICAgIHN3aXRjaE1hcCgoKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuX3JlcXVpcmVGZWF0dXJlUGVybWlzc2lvblNlcnZpY2VcbiAgICAgICAgICAgIC5hYmxlVG9BY2Nlc3NGZWF0dXJlc0FzeW5jKHRoaXMuX19uYW1lcylcbiAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICBjYXRjaEVycm9yKF8gPT4gb2YoZmFsc2UpKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSksXG4gICAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKClcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoYWJsZVRvQWNjZXNzRmVhdHVyZSA9PiB7XG4gICAgICAgIHRoaXMuX3ZpZXdDb250YWluZXJSZWYuY2xlYXIoKTtcbiAgICAgICAgaWYgKCFhYmxlVG9BY2Nlc3NGZWF0dXJlKSB7XG4gICAgICAgICAgaWYgKHRoaXMuX19lbHNlVGVtcGxhdGVSZWYpIHtcbiAgICAgICAgICAgIGNvbnN0IGVsc2VWaWV3ID0gdGhpcy5fdmlld0NvbnRhaW5lclJlZi5jcmVhdGVFbWJlZGRlZFZpZXcodGhpcy5fX2Vsc2VUZW1wbGF0ZVJlZik7XG4gICAgICAgICAgICBlbHNlVmlldy5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnN0IGVtYmVkZGVkVmlldyA9IHRoaXMuX3ZpZXdDb250YWluZXJSZWYuY3JlYXRlRW1iZWRkZWRWaWV3KHRoaXMuX3RlbXBsYXRlUmVmKTtcbiAgICAgICAgICBlbWJlZGRlZFZpZXcubWFya0ZvckNoZWNrKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIHRoaXMuX3N1YnNjcmlwdGlvbi5hZGQoZGlzcGxheUZlYXR1cmVDb250ZW50U3Vic2NyaXB0aW9uKTtcblxuICAgIC8vIEhvb2sgdmFsaWRhdGlvbiBldmVudCBmcm9tIHNlcnZpY2UuXG4gICAgY29uc3QgaG9va1ZhbGlkYXRpb25FdmVudFN1YnNjcmlwdGlvbiA9IHRoaXMuX3JlcXVpcmVGZWF0dXJlUGVybWlzc2lvblNlcnZpY2VcbiAgICAgIC5ob29rVmFsaWRhdGlvbkV2ZW50QXN5bmMoKVxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIHRoaXMuX19kaXNwbGF5RmVhdHVyZUNvbnRlbnQkLm5leHQoKTtcbiAgICAgIH0pO1xuICAgIHRoaXMuX3N1YnNjcmlwdGlvbi5hZGQoaG9va1ZhbGlkYXRpb25FdmVudFN1YnNjcmlwdGlvbik7XG5cbiAgICB0aGlzLl9fZGlzcGxheUZlYXR1cmVDb250ZW50JC5uZXh0KCk7XG4gIH1cblxuICBwdWJsaWMgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5fX2Rpc3BsYXlGZWF0dXJlQ29udGVudCQuY29tcGxldGUoKTtcbiAgICB0aGlzLl9zdWJzY3JpcHRpb24/LnVuc3Vic2NyaWJlKCk7XG4gIH1cblxuICAvLyNlbmRyZWdpb25cbn1cbiJdfQ==