@ui-tool/core
Version:
85 lines • 11.5 kB
JavaScript
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==