UNPKG

@ui-tool/core

Version:
88 lines 12 kB
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==