UNPKG

@ui-tool/core

Version:
85 lines 11.5 kB
import { Directive, Inject, Input } from '@angular/core'; import { ROLE_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 RoleSentinelDirective { //#endregion //#region Constructor constructor(_requireRolePermissionService, _viewContainerRef, _templateRef) { this._requireRolePermissionService = _requireRolePermissionService; this._viewContainerRef = _viewContainerRef; this._templateRef = _templateRef; this.__names = []; this.__displayRoleContent$ = new ReplaySubject(1); this._subscription = new Subscription(); } //#endregion //#region Accessors set name(value) { if (value instanceof Array) { this.__names = value; } else { this.__names = [value]; } this.__displayRoleContent$.next(); } set elseTemplate(value) { this.__elseTemplateRef = value; this.__displayRoleContent$.next(); } //#endregion //#region Methods ngOnInit() { const displayFeatureContentSubscription = this.__displayRoleContent$ .pipe(switchMap(() => { return this._requireRolePermissionService .hasAnyRoleAsync(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; } const embeddedView = this._viewContainerRef.createEmbeddedView(this._templateRef); embeddedView.markForCheck(); }); // Trigger validation. this.__displayRoleContent$.next(); const hookRoleValidationSubscription = this._requireRolePermissionService .hookValidationEventAsync() .subscribe(() => { this.__displayRoleContent$.next(); }); this._subscription.add(hookRoleValidationSubscription); this._subscription.add(displayFeatureContentSubscription); } ngOnDestroy() { this._subscription?.unsubscribe(); this.__displayRoleContent$.complete(); } } RoleSentinelDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: RoleSentinelDirective, deps: [{ token: ROLE_SENTINEL_SERVICE }, { token: i0.ViewContainerRef }, { token: i0.TemplateRef }], target: i0.ɵɵFactoryTarget.Directive }); RoleSentinelDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "13.3.11", type: RoleSentinelDirective, selector: "[hasRoles]", inputs: { name: ["hasRoles", "name"], elseTemplate: ["hasRolesElse", "elseTemplate"] }, ngImport: i0 }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: RoleSentinelDirective, decorators: [{ type: Directive, args: [{ selector: '[hasRoles]' }] }], ctorParameters: function () { return [{ type: undefined, decorators: [{ type: Inject, args: [ROLE_SENTINEL_SERVICE] }] }, { type: i0.ViewContainerRef }, { type: i0.TemplateRef }]; }, propDecorators: { name: [{ type: Input, args: ['hasRoles'] }], elseTemplate: [{ type: Input, args: ['hasRolesElse'] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm9sZS1zZW50aW5lbC5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2NvcmUvc3JjL21vZHVsZXMvc2VudGluZWwvcm9sZS1zZW50aW5lbC9yb2xlLXNlbnRpbmVsLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsU0FBUyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQW1ELE1BQU0sZUFBZSxDQUFDO0FBQ3pHLE9BQU8sRUFBQyxxQkFBcUIsRUFBQyxNQUFNLHdDQUF3QyxDQUFDO0FBQzdFLE9BQU8sRUFBQyxFQUFFLEVBQUUsYUFBYSxFQUFXLFlBQVksRUFBQyxNQUFNLE1BQU0sQ0FBQztBQUM5RCxPQUFPLEVBQUMsVUFBVSxFQUFnQixvQkFBb0IsRUFBRSxTQUFTLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQzs7QUFNekYsTUFBTSxPQUFPLHFCQUFxQjtJQXFDaEMsWUFBWTtJQUVaLHFCQUFxQjtJQUVyQixZQUNzQyw2QkFBbUQsRUFDbkQsaUJBQW1DLEVBQ25DLFlBQThCO1FBRjlCLGtDQUE2QixHQUE3Qiw2QkFBNkIsQ0FBc0I7UUFDbkQsc0JBQWlCLEdBQWpCLGlCQUFpQixDQUFrQjtRQUNuQyxpQkFBWSxHQUFaLFlBQVksQ0FBa0I7UUFFbEUsSUFBSSxDQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7UUFDbEIsSUFBSSxDQUFDLHFCQUFxQixHQUFHLElBQUksYUFBYSxDQUFPLENBQUMsQ0FBQyxDQUFDO1FBQ3hELElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztJQUMxQyxDQUFDO0lBbENELFlBQVk7SUFFWixtQkFBbUI7SUFFbkIsSUFDVyxJQUFJLENBQUMsS0FBd0I7UUFFdEMsSUFBSSxLQUFLLFlBQVksS0FBSyxFQUFFO1lBQzFCLElBQUksQ0FBQyxPQUFPLEdBQUcsS0FBaUIsQ0FBQztTQUNsQzthQUFNO1lBQ0wsSUFBSSxDQUFDLE9BQU8sR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQ3hCO1FBRUQsSUFBSSxDQUFDLHFCQUFxQixDQUFDLElBQUksRUFBRSxDQUFDO0lBQ3BDLENBQUM7SUFFRCxJQUNXLFlBQVksQ0FBQyxLQUF1QjtRQUM3QyxJQUFJLENBQUMsaUJBQWlCLEdBQUcsS0FBSyxDQUFDO1FBQy9CLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUNwQyxDQUFDO0lBZ0JILFlBQVk7SUFFVixpQkFBaUI7SUFFVixRQUFRO1FBRWIsTUFBTSxpQ0FBaUMsR0FBRyxJQUFJLENBQUMscUJBQXFCO2FBQ2pFLElBQUksQ0FDSCxTQUFTLENBQUMsR0FBRyxFQUFFO1lBQ2IsT0FBTyxJQUFJLENBQUMsNkJBQTZCO2lCQUN0QyxlQUFlLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQztpQkFDN0IsSUFBSSxDQUNILFVBQVUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUMzQixDQUFDO1FBQ04sQ0FBQyxDQUFDLEVBQ0Ysb0JBQW9CLEVBQUUsQ0FDdkI7YUFDQSxTQUFTLENBQUMsbUJBQW1CLENBQUMsRUFBRTtZQUMvQixJQUFJLENBQUMsaUJBQWlCLENBQUMsS0FBSyxFQUFFLENBQUM7WUFFL0IsSUFBSSxDQUFDLG1CQUFtQixFQUFFO2dCQUN4QixJQUFJLElBQUksQ0FBQyxpQkFBaUIsRUFBRTtvQkFDMUIsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO29CQUNuRixRQUFRLENBQUMsWUFBWSxFQUFFLENBQUM7aUJBQ3pCO2dCQUNELE9BQU87YUFDUjtZQUVELE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7WUFDbEYsWUFBWSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQzlCLENBQUMsQ0FBQyxDQUFDO1FBRUwsc0JBQXNCO1FBQ3RCLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUVsQyxNQUFNLDhCQUE4QixHQUFHLElBQUksQ0FBQyw2QkFBNkI7YUFDdEUsd0JBQXdCLEVBQUU7YUFDMUIsU0FBUyxDQUFDLEdBQUcsRUFBRTtZQUNkLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNwQyxDQUFDLENBQUMsQ0FBQztRQUdMLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLDhCQUE4QixDQUFDLENBQUM7UUFDdkQsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsaUNBQWlDLENBQUMsQ0FBQztJQUM1RCxDQUFDO0lBRU0sV0FBVztRQUNoQixJQUFJLENBQUMsYUFBYSxFQUFFLFdBQVcsRUFBRSxDQUFDO1FBQ2xDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUN4QyxDQUFDOzttSEFwR1UscUJBQXFCLGtCQXlDTCxxQkFBcUI7dUdBekNyQyxxQkFBcUI7NEZBQXJCLHFCQUFxQjtrQkFIakMsU0FBUzttQkFBQztvQkFDVCxRQUFRLEVBQUUsWUFBWTtpQkFDdkI7OzBCQTBDcUIsTUFBTTsyQkFBQyxxQkFBcUI7cUdBckJyQyxJQUFJO3NCQURkLEtBQUs7dUJBQUMsVUFBVTtnQkFhTixZQUFZO3NCQUR0QixLQUFLO3VCQUFDLGNBQWMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0RpcmVjdGl2ZSwgSW5qZWN0LCBJbnB1dCwgT25EZXN0cm95LCBPbkluaXQsIFRlbXBsYXRlUmVmLCBWaWV3Q29udGFpbmVyUmVmfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7Uk9MRV9TRU5USU5FTF9TRVJWSUNFfSBmcm9tICcuLi8uLi8uLi9jb25zdGFudHMvaW5qZWN0b3JzL2luamVjdG9ycyc7XG5pbXBvcnQge29mLCBSZXBsYXlTdWJqZWN0LCBTdWJqZWN0LCBTdWJzY3JpcHRpb259IGZyb20gJ3J4anMnO1xuaW1wb3J0IHtjYXRjaEVycm9yLCBkZWJvdW5jZVRpbWUsIGRpc3RpbmN0VW50aWxDaGFuZ2VkLCBzd2l0Y2hNYXB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7SVJvbGVTZW50aW5lbFNlcnZpY2V9IGZyb20gJy4vcm9sZS1zZW50aW5lbC1zZXJ2aWNlLmludGVyZmFjZSc7XG5cbkBEaXJlY3RpdmUoe1xuICBzZWxlY3RvcjogJ1toYXNSb2xlc10nXG59KVxuZXhwb3J0IGNsYXNzIFJvbGVTZW50aW5lbERpcmVjdGl2ZSBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcblxuICAvLyNyZWdpb24gUHJvcGVydGllc1xuXG4gIC8vIE5hbWUgb2YgZmVhdHVyZS5cbiAgcHJpdmF0ZSBfX25hbWVzOiBzdHJpbmdbXTtcblxuICAvLyBSYWlzZSBldmVudCBhYm91dCBkaXNwbGF5aW5nIGZlYXR1cmUgY29udGVudC5cbiAgcHJpdmF0ZSBfX2Rpc3BsYXlSb2xlQ29udGVudCQ6IFN1YmplY3Q8dm9pZD47XG5cbiAgcHJpdmF0ZSBfX2Vsc2VUZW1wbGF0ZVJlZj86IFRlbXBsYXRlUmVmPGFueT47XG5cbiAgLy8gU3Vic2NyaXB0aW9uIHdhdGNoIGxpc3QuXG4gIHByb3RlY3RlZCByZWFkb25seSBfc3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XG5cbiAgLy8jZW5kcmVnaW9uXG5cbiAgLy8jcmVnaW9uIEFjY2Vzc29yc1xuXG4gIEBJbnB1dCgnaGFzUm9sZXMnKVxuICBwdWJsaWMgc2V0IG5hbWUodmFsdWU6IHN0cmluZyB8IHN0cmluZ1tdKSB7XG5cbiAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBBcnJheSkge1xuICAgICAgdGhpcy5fX25hbWVzID0gdmFsdWUgYXMgc3RyaW5nW107XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX19uYW1lcyA9IFt2YWx1ZV07XG4gICAgfVxuXG4gICAgdGhpcy5fX2Rpc3BsYXlSb2xlQ29udGVudCQubmV4dCgpO1xuICB9XG5cbiAgQElucHV0KCdoYXNSb2xlc0Vsc2UnKVxuICBwdWJsaWMgc2V0IGVsc2VUZW1wbGF0ZSh2YWx1ZTogVGVtcGxhdGVSZWY8YW55Pikge1xuICAgIHRoaXMuX19lbHNlVGVtcGxhdGVSZWYgPSB2YWx1ZTtcbiAgICB0aGlzLl9fZGlzcGxheVJvbGVDb250ZW50JC5uZXh0KCk7XG4gIH1cblxuICAvLyNlbmRyZWdpb25cblxuICAvLyNyZWdpb24gQ29uc3RydWN0b3JcblxuICBwdWJsaWMgY29uc3RydWN0b3IoQEluamVjdChST0xFX1NFTlRJTkVMX1NFUlZJQ0UpXG4gICAgICAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgX3JlcXVpcmVSb2xlUGVybWlzc2lvblNlcnZpY2U6IElSb2xlU2VudGluZWxTZXJ2aWNlLFxuICAgICAgICAgICAgICAgICAgICAgcHJvdGVjdGVkIHJlYWRvbmx5IF92aWV3Q29udGFpbmVyUmVmOiBWaWV3Q29udGFpbmVyUmVmLFxuICAgICAgICAgICAgICAgICAgICAgcHJvdGVjdGVkIHJlYWRvbmx5IF90ZW1wbGF0ZVJlZjogVGVtcGxhdGVSZWY8YW55Pikge1xuXG4gICAgdGhpcy5fX25hbWVzID0gW107XG4gICAgdGhpcy5fX2Rpc3BsYXlSb2xlQ29udGVudCQgPSBuZXcgUmVwbGF5U3ViamVjdDx2b2lkPigxKTtcbiAgICB0aGlzLl9zdWJzY3JpcHRpb24gPSBuZXcgU3Vic2NyaXB0aW9uKCk7XG4gIH1cblxuLy8jZW5kcmVnaW9uXG5cbiAgLy8jcmVnaW9uIE1ldGhvZHNcblxuICBwdWJsaWMgbmdPbkluaXQoKTogdm9pZCB7XG5cbiAgICBjb25zdCBkaXNwbGF5RmVhdHVyZUNvbnRlbnRTdWJzY3JpcHRpb24gPSB0aGlzLl9fZGlzcGxheVJvbGVDb250ZW50JFxuICAgICAgLnBpcGUoXG4gICAgICAgIHN3aXRjaE1hcCgoKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuX3JlcXVpcmVSb2xlUGVybWlzc2lvblNlcnZpY2VcbiAgICAgICAgICAgIC5oYXNBbnlSb2xlQXN5bmModGhpcy5fX25hbWVzKVxuICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgIGNhdGNoRXJyb3IoXyA9PiBvZihmYWxzZSkpXG4gICAgICAgICAgICApO1xuICAgICAgICB9KSxcbiAgICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKVxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZShhYmxlVG9BY2Nlc3NGZWF0dXJlID0+IHtcbiAgICAgICAgdGhpcy5fdmlld0NvbnRhaW5lclJlZi5jbGVhcigpO1xuXG4gICAgICAgIGlmICghYWJsZVRvQWNjZXNzRmVhdHVyZSkge1xuICAgICAgICAgIGlmICh0aGlzLl9fZWxzZVRlbXBsYXRlUmVmKSB7XG4gICAgICAgICAgICBjb25zdCBlbHNlVmlldyA9IHRoaXMuX3ZpZXdDb250YWluZXJSZWYuY3JlYXRlRW1iZWRkZWRWaWV3KHRoaXMuX19lbHNlVGVtcGxhdGVSZWYpO1xuICAgICAgICAgICAgZWxzZVZpZXcubWFya0ZvckNoZWNrKCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGVtYmVkZGVkVmlldyA9IHRoaXMuX3ZpZXdDb250YWluZXJSZWYuY3JlYXRlRW1iZWRkZWRWaWV3KHRoaXMuX3RlbXBsYXRlUmVmKTtcbiAgICAgICAgZW1iZWRkZWRWaWV3Lm1hcmtGb3JDaGVjaygpO1xuICAgICAgfSk7XG5cbiAgICAvLyBUcmlnZ2VyIHZhbGlkYXRpb24uXG4gICAgdGhpcy5fX2Rpc3BsYXlSb2xlQ29udGVudCQubmV4dCgpO1xuXG4gICAgY29uc3QgaG9va1JvbGVWYWxpZGF0aW9uU3Vic2NyaXB0aW9uID0gdGhpcy5fcmVxdWlyZVJvbGVQZXJtaXNzaW9uU2VydmljZVxuICAgICAgLmhvb2tWYWxpZGF0aW9uRXZlbnRBc3luYygpXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgdGhpcy5fX2Rpc3BsYXlSb2xlQ29udGVudCQubmV4dCgpO1xuICAgICAgfSk7XG5cblxuICAgIHRoaXMuX3N1YnNjcmlwdGlvbi5hZGQoaG9va1JvbGVWYWxpZGF0aW9uU3Vic2NyaXB0aW9uKTtcbiAgICB0aGlzLl9zdWJzY3JpcHRpb24uYWRkKGRpc3BsYXlGZWF0dXJlQ29udGVudFN1YnNjcmlwdGlvbik7XG4gIH1cblxuICBwdWJsaWMgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5fc3Vic2NyaXB0aW9uPy51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMuX19kaXNwbGF5Um9sZUNvbnRlbnQkLmNvbXBsZXRlKCk7XG4gIH1cblxuICAvLyNlbmRyZWdpb25cbn1cbiJdfQ==