@firestitch/app-acl 18.0.1 → 18.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -247,11 +247,11 @@ export class FsAclRoleComponent {
|
|
|
247
247
|
});
|
|
248
248
|
}
|
|
249
249
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: FsAclRoleComponent, deps: [{ token: MAT_DIALOG_DATA }, { token: i1.FsAppAclService }, { token: i2.MatDialogRef }, { token: i3.FsMessage }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
|
|
250
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.7", type: FsAclRoleComponent, selector: "ng-component", viewQueries: [{ propertyName: "list", first: true, predicate: FsListComponent, descendants: true }, { propertyName: "submitButton", first: true, predicate: ["submit"], descendants: true }], ngImport: i0, template: "<form\n fsForm\n [submit]=\"save\">\n <fs-dialog>\n <ng-container *ngIf=\"aclRole\">\n <div mat-dialog-title>\n <ng-container *ngIf=\"!disabled\">\n {{ aclRole.id ? 'Edit' : 'Create' }}\n </ng-container>\n <ng-container *ngIf=\"disabled\">\n View\n </ng-container>\n Role\n </div>\n <mat-dialog-content>\n <div class=\"fs-row.gap-large.align-start\">\n <div class=\"fs-column left-column\">\n <mat-form-field>\n <mat-label>\n Name\n </mat-label>\n <input\n matInput\n [(ngModel)]=\"aclRole.name\"\n [disabled]=\"disabled\"\n name=\"name\"\n fsFormRequired>\n </mat-form-field>\n <mat-form-field>\n <mat-label>\n Description\n </mat-label>\n <input\n matInput\n [(ngModel)]=\"aclRole.description\"\n [disabled]=\"disabled\"\n name=\"description\">\n </mat-form-field>\n <fs-label-field *ngIf=\"aclRole.id || aclLevels.length === 1; else levels\">\n <fs-label>\n Level\n </fs-label>\n {{ indexedAclLevels[aclRole.level] }}\n </fs-label-field>\n <ng-template #levels>\n <div class=\"level\">\n <fs-radio-group\n [(ngModel)]=\"aclRole.level\"\n [disabled]=\"disabled\"\n (ngModelChange)=\"levelChange()\"\n fsFormRequired\n label=\"Level\"\n orientation=\"vertical\"\n name=\"level\">\n <mat-radio-button\n *ngFor=\"let item of aclLevels\"\n [value]=\"item.value\"\n [disabled]=\"!!aclRole.protected\">\n {{ item.name }}\n </mat-radio-button>\n </fs-radio-group>\n </div>\n </ng-template>\n <fs-label-field *ngIf=\"levelPermissions.length\">\n <fs-label>\n All Permissions\n </fs-label>\n <mat-checkbox\n [(ngModel)]=\"aclRole.allPermissions\"\n (ngModelChange)=\"allPermissionsChange($event)\"\n [disabled]=\"!!aclRole.protected || disabled\"\n name=\"allPermissions\">\n Enable\n </mat-checkbox>\n </fs-label-field>\n <div\n class=\"fs-column\"\n *ngFor=\"let roleConfig of roleConfigs\">\n <fs-label-field *ngIf=\"roleConfig.type === 'checkbox'\">\n <fs-label>\n {{ roleConfig.label }}\n </fs-label>\n <mat-checkbox\n [(ngModel)]=\"aclRoleConfigValues[roleConfig.name]\"\n [disabled]=\"disabled\"\n [name]=\"roleConfig.name\">\n Enable\n </mat-checkbox>\n <fs-label-message>\n <mat-hint>\n {{ roleConfig.description }}\n </mat-hint>\n </fs-label-message>\n </fs-label-field>\n <mat-form-field *ngIf=\"roleConfig.type === 'select'\">\n <mat-select\n [(ngModel)]=\"aclRoleConfigValues[roleConfig.name]\"\n [name]=\"roleConfig.name\"\n [required]=\"roleConfig.required\"\n [disabled]=\"disabled\"\n [placeholder]=\"roleConfig.label\">\n <mat-option\n *ngFor=\"let item of roleConfig.values\"\n [value]=\"item.value\">\n {{ item.name }}\n </mat-option>\n </mat-select>\n <mat-hint>\n {{ roleConfig.description }}\n </mat-hint>\n </mat-form-field>\n </div>\n </div>\n <div\n *ngIf=\"aclRole.level\"\n [hidden]=\"!levelPermissions.length\"\n class=\"permissions fs-column\">\n <fs-list [config]=\"listConfig\">\n <fs-list-column title=\"Permissions\">\n <ng-template\n fs-list-group-cell\n let-row=\"row\"\n class=\"permission-group\">\n <div class=\"permission-group\">\n {{ row.category || 'General' }}\n </div>\n </ng-template>\n <ng-template\n fs-list-cell\n let-row=\"row\">\n <div class=\"permission\">\n {{ row.name }}\n </div>\n <div class=\"description small\">\n {{ row.description }}\n </div>\n </ng-template>\n </fs-list-column>\n <fs-list-column\n title=\"Access\"\n width=\"1%\"\n class=\"access\">\n <ng-template\n fs-list-group-cell\n let-row=\"row\"\n let-group=\"group\"\n let-groupChildren=\"groupChildren\"\n class=\"permission-group\"\n align=\"right\">\n <ng-container *ngIf=\"!aclRole.allPermissions && !disabled\">\n <fs-menu>\n <ng-container *ngFor=\"let access of AclRoleAccesses | builkOptionsFilter: groupChildren\">\n <ng-template\n fs-menu-item\n (click)=\"bulkChange(access.value, groupChildren, group)\">\n {{ access.name }}\n </ng-template>\n </ng-container>\n </fs-menu>\n </ng-container>\n </ng-template>\n <ng-template\n fs-list-cell\n let-row=\"permission\"\n let-permission=\"row\">\n <span *ngIf=\"aclRole.allPermissions || disabled; else elseAll\">\n {{ indexedAccesses[aclRolePermissions[permission.value]] }}\n </span>\n <ng-template #elseAll>\n <ng-container *ngIf=\"permission|aclRolePermissionAvailable:aclRolePermissions; else permissionRequires\">\n <mat-form-field>\n <mat-select\n [(ngModel)]=\"aclRolePermissions[permission.value]\"\n [disabled]=\"!!aclRole.protected\"\n required\n class=\"form-field-padless\"\n [name]=\"'access-' + permission.value\"\n (ngModelChange)=\"permissionChange()\">\n <ng-container *ngFor=\"let access of AclRoleAccesses\">\n <mat-option\n *ngIf=\"access.value === 0 || permission.accesses.indexOf(access.value) !== -1\"\n [value]=\"access.value\">\n {{ access.name }}\n </mat-option>\n </ng-container>\n </mat-select>\n </mat-form-field>\n </ng-container>\n <ng-template #permissionRequires>\n Unavailable\n </ng-template>\n </ng-template>\n </ng-template>\n </fs-list-column>\n </fs-list>\n </div>\n </div>\n </mat-dialog-content>\n <mat-dialog-actions>\n <button\n *ngIf=\"!disabled\"\n #submit\n mat-button\n type=\"submit\"\n color=\"primary\">\n {{ aclRole.id ? 'Save' : 'Create' }}\n </button>\n <button\n mat-button\n [mat-dialog-close]=\"null\"\n type=\"button\">\n {{ disabled ? 'Done' : 'Cancel' }}\n </button>\n </mat-dialog-actions>\n </ng-container>\n </fs-dialog>\n</form>", styles: [".permissions{flex:1}.permissions ::ng-deep .fs-list-row-group{background-color:#e4e4e4;font-size:112%}.permissions ::ng-deep fs-list .access{white-space:nowrap}.permissions ::ng-deep .mat-form-field{width:100px}.permissions ::ng-deep .mat-form-field .mat-form-field-wrapper{padding-bottom:0}.permissions ::ng-deep .mat-form-field .mat-form-field-infix{border-top:0}.permissions ::ng-deep .mat-form-field .mat-form-field-underline{bottom:0}.permissions ::ng-deep fs-radio-group{width:100%}.permissions ::ng-deep fs-label-field{width:100%}.permissions .level{width:100%}.left-column{width:40%;max-width:400px}\n"], dependencies: [{ kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i5.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i5.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i5.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i5.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i5.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.MatDialogClose, selector: "[mat-dialog-close], [matDialogClose]", inputs: ["aria-label", "type", "mat-dialog-close", "matDialogClose"], exportAs: ["matDialogClose"] }, { kind: "directive", type: i2.MatDialogTitle, selector: "[mat-dialog-title], [matDialogTitle]", inputs: ["id"], exportAs: ["matDialogTitle"] }, { kind: "directive", type: i2.MatDialogActions, selector: "[mat-dialog-actions], mat-dialog-actions, [matDialogActions]", inputs: ["align"] }, { kind: "directive", type: i2.MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { kind: "component", type: i6.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i6.MatLabel, selector: "mat-label" }, { kind: "directive", type: i6.MatHint, selector: "mat-hint", inputs: ["align", "id"] }, { kind: "component", type: i7.MatCheckbox, selector: "mat-checkbox", inputs: ["aria-label", "aria-labelledby", "aria-describedby", "id", "required", "labelPosition", "name", "value", "disableRipple", "tabIndex", "color", "disabledInteractive", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { kind: "component", type: i8.MatSelect, selector: "mat-select", inputs: ["aria-describedby", "panelClass", "disabled", "disableRipple", "tabIndex", "hideSingleSelectionIndicator", "placeholder", "required", "multiple", "disableOptionCentering", "compareWith", "value", "aria-label", "aria-labelledby", "errorStateMatcher", "typeaheadDebounceInterval", "sortComparator", "id", "panelWidth"], outputs: ["openedChange", "opened", "closed", "selectionChange", "valueChange"], exportAs: ["matSelect"] }, { kind: "component", type: i9.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "component", type: i10.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: i11.MatRadioButton, selector: "mat-radio-button", inputs: ["id", "name", "aria-label", "aria-labelledby", "aria-describedby", "disableRipple", "tabIndex", "checked", "value", "labelPosition", "disabled", "required", "color", "disabledInteractive"], outputs: ["change"], exportAs: ["matRadioButton"] }, { kind: "directive", type: i12.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i13.FsListComponent, selector: "fs-list", inputs: ["config", "loaderLines"], outputs: ["filtersReady"] }, { kind: "directive", type: i13.FsListColumnDirective, selector: "fs-list-column", inputs: ["show", "title", "name", "customize", "sortable", "sortableDefault", "sortableDirection", "direction", "align", "width", "class"] }, { kind: "directive", type: i13.FsListCellDirective, selector: "[fs-list-cell]", inputs: ["colspan", "align", "class"] }, { kind: "directive", type: i13.FsListGroupHeaderDirective, selector: "[fs-list-group-cell],[fs-list-group-header]" }, { kind: "component", type: i14.FsDialogComponent, selector: "fs-dialog", inputs: ["mobileMode", "mobileButtonPlacement", "mobileWidth", "mode", "buttonLayout", "dock", "dockable", "fullscreenPercent"] }, { kind: "directive", type: i15.FsFormDirective, selector: "[fsForm]", inputs: ["wrapperSelector", "messageSelector", "hintSelector", "labelSelector", "autocomplete", "shortcuts", "confirm", "confirmDialog", "confirmDrawer", "confirmBrowser", "confirmTabs", "dirtySubmitButton", "submit", "successDelay", "errorDelay", "tabGroup", "deactivationGuard"], outputs: ["fsForm", "invalid", "valid", "submitted", "reseted", "cleared"], exportAs: ["fsForm"] }, { kind: "directive", type: i15.FsFormRequiredDirective, selector: "[fsFormRequired],[ngModel][required]", inputs: ["fsFormRequired", "required", "fsFormRequiredMessage"] }, { kind: "directive", type: i15.FsFormNoFsValidatorsDirective, selector: "[ngModel]:not([required]):not([fsFormRequired]):not([fsFormCompare]):not([fsFormDateRange]):not([fsFormEmail]):not([fsFormEmails]):not([fsFormFunction]):not([fsFormGreater]):not([fsFormGreaterEqual]):not([fsFormInteger]):not([fsFormLesser]):not([fsFormMax]):not([fsFormMaxLength]):not([fsFormMin]):not([fsFormMinLength]):not([fsFormNumeric]):not([fsFormPattern]):not([fsFormPhone]):not([fsFormUrl]):not([validate])" }, { kind: "directive", type: i15.FsButtonDirective, selector: "[mat-raised-button]:not([fsFormButtonStandalone]),[mat-button]:not([fsFormButtonStandalone]),[mat-flat-button]:not([fsFormButtonStandalone]),[mat-stroked-button]:not([fsFormButtonStandalone])", inputs: ["name", "dirtySubmit", "form"] }, { kind: "component", type: i16.FsLabelComponent, selector: "fs-label" }, { kind: "component", type: i16.FsLabelFieldComponent, selector: "fs-label-field", inputs: ["bottomMargin", "topMargin", "labelMargin"] }, { kind: "component", type: i16.FsLabelMessageComponent, selector: "fs-label-message" }, { kind: "component", type: i17.FsRadioGroupComponent, selector: "fs-radio-group", inputs: ["orientation", "label", "name", "disabled", "radioPosition", "compareWith", "required"] }, { kind: "component", type: i18.FsMenuComponent, selector: "fs-menu", inputs: ["class", "buttonClass", "buttonType", "buttonColor"], outputs: ["opened", "closed"] }, { kind: "directive", type: i18.FsMenuItemDirective, selector: "fs-menu-group,[fs-menu-item]" }, { kind: "pipe", type: i19.BulkOptionsFilterPipe, name: "builkOptionsFilter" }, { kind: "pipe", type: i20.AclRolePermissionAvailablePipe, name: "aclRolePermissionAvailable" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
250
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.7", type: FsAclRoleComponent, selector: "ng-component", viewQueries: [{ propertyName: "list", first: true, predicate: FsListComponent, descendants: true }, { propertyName: "submitButton", first: true, predicate: ["submit"], descendants: true }], ngImport: i0, template: "<form\n fsForm\n [submit]=\"save\">\n <fs-dialog>\n <ng-container *ngIf=\"aclRole\">\n <div mat-dialog-title>\n <ng-container *ngIf=\"!disabled\">\n {{ aclRole.id ? 'Edit' : 'Create' }}\n </ng-container>\n <ng-container *ngIf=\"disabled\">\n View\n </ng-container>\n Role\n </div>\n <mat-dialog-content>\n <div class=\"fs-row.gap-large.align-start\">\n <div class=\"fs-column left-column\">\n <mat-form-field>\n <mat-label>\n Name\n </mat-label>\n <input\n matInput\n [(ngModel)]=\"aclRole.name\"\n [disabled]=\"disabled\"\n name=\"name\"\n fsFormRequired>\n </mat-form-field>\n <mat-form-field>\n <mat-label>\n Description\n </mat-label>\n <input\n matInput\n [(ngModel)]=\"aclRole.description\"\n [disabled]=\"disabled\"\n name=\"description\">\n </mat-form-field>\n <fs-label-field *ngIf=\"aclRole.id || aclLevels.length === 1; else levels\">\n <fs-label>\n Level\n </fs-label>\n {{ indexedAclLevels[aclRole.level] }}\n </fs-label-field>\n <ng-template #levels>\n <div class=\"level\">\n <fs-radio-group\n [(ngModel)]=\"aclRole.level\"\n [disabled]=\"disabled\"\n (ngModelChange)=\"levelChange()\"\n fsFormRequired\n label=\"Level\"\n orientation=\"vertical\"\n name=\"level\">\n <mat-radio-button\n *ngFor=\"let item of aclLevels\"\n [value]=\"item.value\"\n [disabled]=\"!!aclRole.protected\">\n {{ item.name }}\n </mat-radio-button>\n </fs-radio-group>\n </div>\n </ng-template>\n <fs-label-field *ngIf=\"levelPermissions.length\">\n <fs-label>\n All Permissions\n </fs-label>\n <mat-checkbox\n [(ngModel)]=\"aclRole.allPermissions\"\n (ngModelChange)=\"allPermissionsChange($event)\"\n [disabled]=\"!!aclRole.protected || disabled\"\n name=\"allPermissions\">\n Enable\n </mat-checkbox>\n </fs-label-field>\n <div\n class=\"fs-column\"\n *ngFor=\"let roleConfig of roleConfigs\">\n <fs-label-field *ngIf=\"roleConfig.type === 'checkbox'\">\n <fs-label>\n {{ roleConfig.label }}\n </fs-label>\n <mat-checkbox\n [(ngModel)]=\"aclRoleConfigValues[roleConfig.name]\"\n [disabled]=\"disabled\"\n [name]=\"roleConfig.name\">\n Enable\n </mat-checkbox>\n <fs-label-message>\n <mat-hint>\n {{ roleConfig.description }}\n </mat-hint>\n </fs-label-message>\n </fs-label-field>\n <mat-form-field *ngIf=\"roleConfig.type === 'select'\">\n <mat-select\n [(ngModel)]=\"aclRoleConfigValues[roleConfig.name]\"\n [name]=\"roleConfig.name\"\n [required]=\"roleConfig.required\"\n [disabled]=\"disabled\"\n [placeholder]=\"roleConfig.label\">\n <mat-option\n *ngFor=\"let item of roleConfig.values\"\n [value]=\"item.value\">\n {{ item.name }}\n </mat-option>\n </mat-select>\n <mat-hint>\n {{ roleConfig.description }}\n </mat-hint>\n </mat-form-field>\n </div>\n </div>\n <div\n *ngIf=\"aclRole.level\"\n [hidden]=\"!levelPermissions.length\"\n class=\"permissions fs-column\">\n <fs-list [config]=\"listConfig\">\n <fs-list-column title=\"Permissions\">\n <ng-template\n fs-list-group-cell\n let-row=\"row\"\n class=\"permission-group\">\n <div class=\"permission-group\">\n {{ row.category || 'General' }}\n </div>\n </ng-template>\n <ng-template\n fs-list-cell\n let-row=\"row\">\n <div class=\"permission\">\n {{ row.name }}\n </div>\n <div class=\"description small\">\n {{ row.description }}\n </div>\n </ng-template>\n </fs-list-column>\n <fs-list-column\n title=\"Access\"\n width=\"1%\"\n class=\"access\">\n <ng-template\n fs-list-group-cell\n let-row=\"row\"\n let-group=\"group\"\n let-groupChildren=\"groupChildren\"\n class=\"permission-group\"\n align=\"right\">\n <ng-container *ngIf=\"!aclRole.allPermissions && !disabled\">\n <fs-menu>\n <ng-container *ngFor=\"let access of AclRoleAccesses | builkOptionsFilter: groupChildren\">\n <ng-template\n fs-menu-item\n (click)=\"bulkChange(access.value, groupChildren, group)\">\n {{ access.name }}\n </ng-template>\n </ng-container>\n </fs-menu>\n </ng-container>\n </ng-template>\n <ng-template\n fs-list-cell\n let-row=\"permission\"\n let-permission=\"row\">\n <span *ngIf=\"aclRole.allPermissions || disabled; else elseAll\">\n {{ indexedAccesses[aclRolePermissions[permission.value]] }}\n </span>\n <ng-template #elseAll>\n <ng-container *ngIf=\"permission|aclRolePermissionAvailable:aclRolePermissions; else permissionRequires\">\n <mat-form-field class=\"form-field-padless\">\n <mat-select\n [(ngModel)]=\"aclRolePermissions[permission.value]\"\n [disabled]=\"!!aclRole.protected\"\n required\n [name]=\"'access-' + permission.value\"\n (ngModelChange)=\"permissionChange()\">\n <ng-container *ngFor=\"let access of AclRoleAccesses\">\n <mat-option\n *ngIf=\"access.value === 0 || permission.accesses.indexOf(access.value) !== -1\"\n [value]=\"access.value\">\n {{ access.name }}\n </mat-option>\n </ng-container>\n </mat-select>\n </mat-form-field>\n </ng-container>\n <ng-template #permissionRequires>\n Unavailable\n </ng-template>\n </ng-template>\n </ng-template>\n </fs-list-column>\n </fs-list>\n </div>\n </div>\n </mat-dialog-content>\n <mat-dialog-actions>\n <button\n *ngIf=\"!disabled\"\n #submit\n mat-button\n type=\"submit\"\n color=\"primary\">\n {{ aclRole.id ? 'Save' : 'Create' }}\n </button>\n <button\n mat-button\n [mat-dialog-close]=\"null\"\n type=\"button\">\n {{ disabled ? 'Done' : 'Cancel' }}\n </button>\n </mat-dialog-actions>\n </ng-container>\n </fs-dialog>\n</form>", styles: [".permissions{flex:1}.permissions ::ng-deep .fs-list-row-group{background-color:#e4e4e4;font-size:112%}.permissions ::ng-deep fs-list .access{white-space:nowrap}.permissions ::ng-deep .mat-form-field{width:100px}.permissions ::ng-deep .mat-form-field .mat-form-field-wrapper{padding-bottom:0}.permissions ::ng-deep .mat-form-field .mat-form-field-infix{border-top:0}.permissions ::ng-deep .mat-form-field .mat-form-field-underline{bottom:0}.permissions ::ng-deep fs-radio-group{width:100%}.permissions ::ng-deep fs-label-field{width:100%}.permissions .level{width:100%}.left-column{width:40%;max-width:400px}\n"], dependencies: [{ kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i5.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i5.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i5.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i5.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i5.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.MatDialogClose, selector: "[mat-dialog-close], [matDialogClose]", inputs: ["aria-label", "type", "mat-dialog-close", "matDialogClose"], exportAs: ["matDialogClose"] }, { kind: "directive", type: i2.MatDialogTitle, selector: "[mat-dialog-title], [matDialogTitle]", inputs: ["id"], exportAs: ["matDialogTitle"] }, { kind: "directive", type: i2.MatDialogActions, selector: "[mat-dialog-actions], mat-dialog-actions, [matDialogActions]", inputs: ["align"] }, { kind: "directive", type: i2.MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { kind: "component", type: i6.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i6.MatLabel, selector: "mat-label" }, { kind: "directive", type: i6.MatHint, selector: "mat-hint", inputs: ["align", "id"] }, { kind: "component", type: i7.MatCheckbox, selector: "mat-checkbox", inputs: ["aria-label", "aria-labelledby", "aria-describedby", "id", "required", "labelPosition", "name", "value", "disableRipple", "tabIndex", "color", "disabledInteractive", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { kind: "component", type: i8.MatSelect, selector: "mat-select", inputs: ["aria-describedby", "panelClass", "disabled", "disableRipple", "tabIndex", "hideSingleSelectionIndicator", "placeholder", "required", "multiple", "disableOptionCentering", "compareWith", "value", "aria-label", "aria-labelledby", "errorStateMatcher", "typeaheadDebounceInterval", "sortComparator", "id", "panelWidth"], outputs: ["openedChange", "opened", "closed", "selectionChange", "valueChange"], exportAs: ["matSelect"] }, { kind: "component", type: i9.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "component", type: i10.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: i11.MatRadioButton, selector: "mat-radio-button", inputs: ["id", "name", "aria-label", "aria-labelledby", "aria-describedby", "disableRipple", "tabIndex", "checked", "value", "labelPosition", "disabled", "required", "color", "disabledInteractive"], outputs: ["change"], exportAs: ["matRadioButton"] }, { kind: "directive", type: i12.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i13.FsListComponent, selector: "fs-list", inputs: ["config", "loaderLines"], outputs: ["filtersReady"] }, { kind: "directive", type: i13.FsListColumnDirective, selector: "fs-list-column", inputs: ["show", "title", "name", "customize", "sortable", "sortableDefault", "sortableDirection", "direction", "align", "width", "class"] }, { kind: "directive", type: i13.FsListCellDirective, selector: "[fs-list-cell]", inputs: ["colspan", "align", "class"] }, { kind: "directive", type: i13.FsListGroupHeaderDirective, selector: "[fs-list-group-cell],[fs-list-group-header]" }, { kind: "component", type: i14.FsDialogComponent, selector: "fs-dialog", inputs: ["mobileMode", "mobileButtonPlacement", "mobileWidth", "mode", "buttonLayout", "dock", "dockable", "fullscreenPercent"] }, { kind: "directive", type: i15.FsFormDirective, selector: "[fsForm]", inputs: ["wrapperSelector", "messageSelector", "hintSelector", "labelSelector", "autocomplete", "shortcuts", "confirm", "confirmDialog", "confirmDrawer", "confirmBrowser", "confirmTabs", "dirtySubmitButton", "submit", "successDelay", "errorDelay", "tabGroup", "deactivationGuard"], outputs: ["fsForm", "invalid", "valid", "submitted", "reseted", "cleared"], exportAs: ["fsForm"] }, { kind: "directive", type: i15.FsFormRequiredDirective, selector: "[fsFormRequired],[ngModel][required]", inputs: ["fsFormRequired", "required", "fsFormRequiredMessage"] }, { kind: "directive", type: i15.FsFormNoFsValidatorsDirective, selector: "[ngModel]:not([required]):not([fsFormRequired]):not([fsFormCompare]):not([fsFormDateRange]):not([fsFormEmail]):not([fsFormEmails]):not([fsFormFunction]):not([fsFormGreater]):not([fsFormGreaterEqual]):not([fsFormInteger]):not([fsFormLesser]):not([fsFormMax]):not([fsFormMaxLength]):not([fsFormMin]):not([fsFormMinLength]):not([fsFormNumeric]):not([fsFormPattern]):not([fsFormPhone]):not([fsFormUrl]):not([validate])" }, { kind: "directive", type: i15.FsButtonDirective, selector: "[mat-raised-button]:not([fsFormButtonStandalone]),[mat-button]:not([fsFormButtonStandalone]),[mat-flat-button]:not([fsFormButtonStandalone]),[mat-stroked-button]:not([fsFormButtonStandalone])", inputs: ["name", "dirtySubmit", "form"] }, { kind: "component", type: i16.FsLabelComponent, selector: "fs-label" }, { kind: "component", type: i16.FsLabelFieldComponent, selector: "fs-label-field", inputs: ["bottomMargin", "topMargin", "labelMargin"] }, { kind: "component", type: i16.FsLabelMessageComponent, selector: "fs-label-message" }, { kind: "component", type: i17.FsRadioGroupComponent, selector: "fs-radio-group", inputs: ["orientation", "label", "name", "disabled", "radioPosition", "compareWith", "required"] }, { kind: "component", type: i18.FsMenuComponent, selector: "fs-menu", inputs: ["class", "buttonClass", "buttonType", "buttonColor"], outputs: ["opened", "closed"] }, { kind: "directive", type: i18.FsMenuItemDirective, selector: "fs-menu-group,[fs-menu-item]" }, { kind: "pipe", type: i19.BulkOptionsFilterPipe, name: "builkOptionsFilter" }, { kind: "pipe", type: i20.AclRolePermissionAvailablePipe, name: "aclRolePermissionAvailable" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
251
251
|
}
|
|
252
252
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: FsAclRoleComponent, decorators: [{
|
|
253
253
|
type: Component,
|
|
254
|
-
args: [{ changeDetection: ChangeDetectionStrategy.OnPush, template: "<form\n fsForm\n [submit]=\"save\">\n <fs-dialog>\n <ng-container *ngIf=\"aclRole\">\n <div mat-dialog-title>\n <ng-container *ngIf=\"!disabled\">\n {{ aclRole.id ? 'Edit' : 'Create' }}\n </ng-container>\n <ng-container *ngIf=\"disabled\">\n View\n </ng-container>\n Role\n </div>\n <mat-dialog-content>\n <div class=\"fs-row.gap-large.align-start\">\n <div class=\"fs-column left-column\">\n <mat-form-field>\n <mat-label>\n Name\n </mat-label>\n <input\n matInput\n [(ngModel)]=\"aclRole.name\"\n [disabled]=\"disabled\"\n name=\"name\"\n fsFormRequired>\n </mat-form-field>\n <mat-form-field>\n <mat-label>\n Description\n </mat-label>\n <input\n matInput\n [(ngModel)]=\"aclRole.description\"\n [disabled]=\"disabled\"\n name=\"description\">\n </mat-form-field>\n <fs-label-field *ngIf=\"aclRole.id || aclLevels.length === 1; else levels\">\n <fs-label>\n Level\n </fs-label>\n {{ indexedAclLevels[aclRole.level] }}\n </fs-label-field>\n <ng-template #levels>\n <div class=\"level\">\n <fs-radio-group\n [(ngModel)]=\"aclRole.level\"\n [disabled]=\"disabled\"\n (ngModelChange)=\"levelChange()\"\n fsFormRequired\n label=\"Level\"\n orientation=\"vertical\"\n name=\"level\">\n <mat-radio-button\n *ngFor=\"let item of aclLevels\"\n [value]=\"item.value\"\n [disabled]=\"!!aclRole.protected\">\n {{ item.name }}\n </mat-radio-button>\n </fs-radio-group>\n </div>\n </ng-template>\n <fs-label-field *ngIf=\"levelPermissions.length\">\n <fs-label>\n All Permissions\n </fs-label>\n <mat-checkbox\n [(ngModel)]=\"aclRole.allPermissions\"\n (ngModelChange)=\"allPermissionsChange($event)\"\n [disabled]=\"!!aclRole.protected || disabled\"\n name=\"allPermissions\">\n Enable\n </mat-checkbox>\n </fs-label-field>\n <div\n class=\"fs-column\"\n *ngFor=\"let roleConfig of roleConfigs\">\n <fs-label-field *ngIf=\"roleConfig.type === 'checkbox'\">\n <fs-label>\n {{ roleConfig.label }}\n </fs-label>\n <mat-checkbox\n [(ngModel)]=\"aclRoleConfigValues[roleConfig.name]\"\n [disabled]=\"disabled\"\n [name]=\"roleConfig.name\">\n Enable\n </mat-checkbox>\n <fs-label-message>\n <mat-hint>\n {{ roleConfig.description }}\n </mat-hint>\n </fs-label-message>\n </fs-label-field>\n <mat-form-field *ngIf=\"roleConfig.type === 'select'\">\n <mat-select\n [(ngModel)]=\"aclRoleConfigValues[roleConfig.name]\"\n [name]=\"roleConfig.name\"\n [required]=\"roleConfig.required\"\n [disabled]=\"disabled\"\n [placeholder]=\"roleConfig.label\">\n <mat-option\n *ngFor=\"let item of roleConfig.values\"\n [value]=\"item.value\">\n {{ item.name }}\n </mat-option>\n </mat-select>\n <mat-hint>\n {{ roleConfig.description }}\n </mat-hint>\n </mat-form-field>\n </div>\n </div>\n <div\n *ngIf=\"aclRole.level\"\n [hidden]=\"!levelPermissions.length\"\n class=\"permissions fs-column\">\n <fs-list [config]=\"listConfig\">\n <fs-list-column title=\"Permissions\">\n <ng-template\n fs-list-group-cell\n let-row=\"row\"\n class=\"permission-group\">\n <div class=\"permission-group\">\n {{ row.category || 'General' }}\n </div>\n </ng-template>\n <ng-template\n fs-list-cell\n let-row=\"row\">\n <div class=\"permission\">\n {{ row.name }}\n </div>\n <div class=\"description small\">\n {{ row.description }}\n </div>\n </ng-template>\n </fs-list-column>\n <fs-list-column\n title=\"Access\"\n width=\"1%\"\n class=\"access\">\n <ng-template\n fs-list-group-cell\n let-row=\"row\"\n let-group=\"group\"\n let-groupChildren=\"groupChildren\"\n class=\"permission-group\"\n align=\"right\">\n <ng-container *ngIf=\"!aclRole.allPermissions && !disabled\">\n <fs-menu>\n <ng-container *ngFor=\"let access of AclRoleAccesses | builkOptionsFilter: groupChildren\">\n <ng-template\n fs-menu-item\n (click)=\"bulkChange(access.value, groupChildren, group)\">\n {{ access.name }}\n </ng-template>\n </ng-container>\n </fs-menu>\n </ng-container>\n </ng-template>\n <ng-template\n fs-list-cell\n let-row=\"permission\"\n let-permission=\"row\">\n <span *ngIf=\"aclRole.allPermissions || disabled; else elseAll\">\n {{ indexedAccesses[aclRolePermissions[permission.value]] }}\n </span>\n <ng-template #elseAll>\n <ng-container *ngIf=\"permission|aclRolePermissionAvailable:aclRolePermissions; else permissionRequires\">\n <mat-form-field>\n <mat-select\n [(ngModel)]=\"aclRolePermissions[permission.value]\"\n [disabled]=\"!!aclRole.protected\"\n required\n
|
|
254
|
+
args: [{ changeDetection: ChangeDetectionStrategy.OnPush, template: "<form\n fsForm\n [submit]=\"save\">\n <fs-dialog>\n <ng-container *ngIf=\"aclRole\">\n <div mat-dialog-title>\n <ng-container *ngIf=\"!disabled\">\n {{ aclRole.id ? 'Edit' : 'Create' }}\n </ng-container>\n <ng-container *ngIf=\"disabled\">\n View\n </ng-container>\n Role\n </div>\n <mat-dialog-content>\n <div class=\"fs-row.gap-large.align-start\">\n <div class=\"fs-column left-column\">\n <mat-form-field>\n <mat-label>\n Name\n </mat-label>\n <input\n matInput\n [(ngModel)]=\"aclRole.name\"\n [disabled]=\"disabled\"\n name=\"name\"\n fsFormRequired>\n </mat-form-field>\n <mat-form-field>\n <mat-label>\n Description\n </mat-label>\n <input\n matInput\n [(ngModel)]=\"aclRole.description\"\n [disabled]=\"disabled\"\n name=\"description\">\n </mat-form-field>\n <fs-label-field *ngIf=\"aclRole.id || aclLevels.length === 1; else levels\">\n <fs-label>\n Level\n </fs-label>\n {{ indexedAclLevels[aclRole.level] }}\n </fs-label-field>\n <ng-template #levels>\n <div class=\"level\">\n <fs-radio-group\n [(ngModel)]=\"aclRole.level\"\n [disabled]=\"disabled\"\n (ngModelChange)=\"levelChange()\"\n fsFormRequired\n label=\"Level\"\n orientation=\"vertical\"\n name=\"level\">\n <mat-radio-button\n *ngFor=\"let item of aclLevels\"\n [value]=\"item.value\"\n [disabled]=\"!!aclRole.protected\">\n {{ item.name }}\n </mat-radio-button>\n </fs-radio-group>\n </div>\n </ng-template>\n <fs-label-field *ngIf=\"levelPermissions.length\">\n <fs-label>\n All Permissions\n </fs-label>\n <mat-checkbox\n [(ngModel)]=\"aclRole.allPermissions\"\n (ngModelChange)=\"allPermissionsChange($event)\"\n [disabled]=\"!!aclRole.protected || disabled\"\n name=\"allPermissions\">\n Enable\n </mat-checkbox>\n </fs-label-field>\n <div\n class=\"fs-column\"\n *ngFor=\"let roleConfig of roleConfigs\">\n <fs-label-field *ngIf=\"roleConfig.type === 'checkbox'\">\n <fs-label>\n {{ roleConfig.label }}\n </fs-label>\n <mat-checkbox\n [(ngModel)]=\"aclRoleConfigValues[roleConfig.name]\"\n [disabled]=\"disabled\"\n [name]=\"roleConfig.name\">\n Enable\n </mat-checkbox>\n <fs-label-message>\n <mat-hint>\n {{ roleConfig.description }}\n </mat-hint>\n </fs-label-message>\n </fs-label-field>\n <mat-form-field *ngIf=\"roleConfig.type === 'select'\">\n <mat-select\n [(ngModel)]=\"aclRoleConfigValues[roleConfig.name]\"\n [name]=\"roleConfig.name\"\n [required]=\"roleConfig.required\"\n [disabled]=\"disabled\"\n [placeholder]=\"roleConfig.label\">\n <mat-option\n *ngFor=\"let item of roleConfig.values\"\n [value]=\"item.value\">\n {{ item.name }}\n </mat-option>\n </mat-select>\n <mat-hint>\n {{ roleConfig.description }}\n </mat-hint>\n </mat-form-field>\n </div>\n </div>\n <div\n *ngIf=\"aclRole.level\"\n [hidden]=\"!levelPermissions.length\"\n class=\"permissions fs-column\">\n <fs-list [config]=\"listConfig\">\n <fs-list-column title=\"Permissions\">\n <ng-template\n fs-list-group-cell\n let-row=\"row\"\n class=\"permission-group\">\n <div class=\"permission-group\">\n {{ row.category || 'General' }}\n </div>\n </ng-template>\n <ng-template\n fs-list-cell\n let-row=\"row\">\n <div class=\"permission\">\n {{ row.name }}\n </div>\n <div class=\"description small\">\n {{ row.description }}\n </div>\n </ng-template>\n </fs-list-column>\n <fs-list-column\n title=\"Access\"\n width=\"1%\"\n class=\"access\">\n <ng-template\n fs-list-group-cell\n let-row=\"row\"\n let-group=\"group\"\n let-groupChildren=\"groupChildren\"\n class=\"permission-group\"\n align=\"right\">\n <ng-container *ngIf=\"!aclRole.allPermissions && !disabled\">\n <fs-menu>\n <ng-container *ngFor=\"let access of AclRoleAccesses | builkOptionsFilter: groupChildren\">\n <ng-template\n fs-menu-item\n (click)=\"bulkChange(access.value, groupChildren, group)\">\n {{ access.name }}\n </ng-template>\n </ng-container>\n </fs-menu>\n </ng-container>\n </ng-template>\n <ng-template\n fs-list-cell\n let-row=\"permission\"\n let-permission=\"row\">\n <span *ngIf=\"aclRole.allPermissions || disabled; else elseAll\">\n {{ indexedAccesses[aclRolePermissions[permission.value]] }}\n </span>\n <ng-template #elseAll>\n <ng-container *ngIf=\"permission|aclRolePermissionAvailable:aclRolePermissions; else permissionRequires\">\n <mat-form-field class=\"form-field-padless\">\n <mat-select\n [(ngModel)]=\"aclRolePermissions[permission.value]\"\n [disabled]=\"!!aclRole.protected\"\n required\n [name]=\"'access-' + permission.value\"\n (ngModelChange)=\"permissionChange()\">\n <ng-container *ngFor=\"let access of AclRoleAccesses\">\n <mat-option\n *ngIf=\"access.value === 0 || permission.accesses.indexOf(access.value) !== -1\"\n [value]=\"access.value\">\n {{ access.name }}\n </mat-option>\n </ng-container>\n </mat-select>\n </mat-form-field>\n </ng-container>\n <ng-template #permissionRequires>\n Unavailable\n </ng-template>\n </ng-template>\n </ng-template>\n </fs-list-column>\n </fs-list>\n </div>\n </div>\n </mat-dialog-content>\n <mat-dialog-actions>\n <button\n *ngIf=\"!disabled\"\n #submit\n mat-button\n type=\"submit\"\n color=\"primary\">\n {{ aclRole.id ? 'Save' : 'Create' }}\n </button>\n <button\n mat-button\n [mat-dialog-close]=\"null\"\n type=\"button\">\n {{ disabled ? 'Done' : 'Cancel' }}\n </button>\n </mat-dialog-actions>\n </ng-container>\n </fs-dialog>\n</form>", styles: [".permissions{flex:1}.permissions ::ng-deep .fs-list-row-group{background-color:#e4e4e4;font-size:112%}.permissions ::ng-deep fs-list .access{white-space:nowrap}.permissions ::ng-deep .mat-form-field{width:100px}.permissions ::ng-deep .mat-form-field .mat-form-field-wrapper{padding-bottom:0}.permissions ::ng-deep .mat-form-field .mat-form-field-infix{border-top:0}.permissions ::ng-deep .mat-form-field .mat-form-field-underline{bottom:0}.permissions ::ng-deep fs-radio-group{width:100%}.permissions ::ng-deep fs-label-field{width:100%}.permissions .level{width:100%}.left-column{width:40%;max-width:400px}\n"] }]
|
|
255
255
|
}], ctorParameters: () => [{ type: undefined, decorators: [{
|
|
256
256
|
type: Inject,
|
|
257
257
|
args: [MAT_DIALOG_DATA]
|
|
@@ -262,4 +262,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.7", ngImpor
|
|
|
262
262
|
type: ViewChild,
|
|
263
263
|
args: ['submit', { static: false }]
|
|
264
264
|
}] } });
|
|
265
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWNsLXJvbGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9jb21wb25lbnRzL2FjbC1yb2xlL2FjbC1yb2xlLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvY29tcG9uZW50cy9hY2wtcm9sZS9hY2wtcm9sZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsdUJBQXVCLEVBQ3ZCLGlCQUFpQixFQUNqQixTQUFTLEVBQ1QsTUFBTSxFQUdOLFNBQVMsRUFDVixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsZUFBZSxFQUFFLFlBQVksRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBRXpFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUVuRSxPQUFPLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRWhELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNoRCxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDMUMsT0FBTyxFQUFFLGVBQWUsRUFBZ0IsTUFBTSxrQkFBa0IsQ0FBQztBQUVqRSxPQUFPLEVBQUUsUUFBUSxFQUFjLEVBQUUsRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDekQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBRW5FLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUM1RCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFRckQsTUFBTSxPQUFPLGtCQUFrQjtJQTRCZTtJQUN6QjtJQUNBO0lBQ0E7SUFDVDtJQTdCSCxJQUFJLENBQWtCO0lBR3RCLFlBQVksQ0FBWTtJQUV4QixPQUFP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QkFMOUIsU0FBUztzQ0FHUyx1QkFBdUIsQ0FBQyxNQUFNOzswQkE4QjVDLE1BQU07MkJBQUMsZUFBZTswSkF6QmxCLElBQUk7c0JBRFYsU0FBUzt1QkFBQyxlQUFlO2dCQUluQixZQUFZO3NCQURsQixTQUFTO3VCQUFDLFFBQVEsRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgSW5qZWN0LFxuICBPbkRlc3Ryb3ksXG4gIE9uSW5pdCxcbiAgVmlld0NoaWxkXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTUFUX0RJQUxPR19EQVRBLCBNYXREaWFsb2dSZWYgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kaWFsb2cnO1xuXG5pbXBvcnQgeyBBY2xSb2xlQWNjZXNzZXMgfSBmcm9tICcuLy4uLy4uL2NvbnN0cy9hY2wtcm9sZS1hY2Nlc3Nlcyc7XG5pbXBvcnQgeyBBY2xSb2xlIH0gZnJvbSAnLi8uLi8uLi9pbnRlcmZhY2VzL2FjbC1yb2xlJztcbmltcG9ydCB7IHRha2VVbnRpbCwgdGFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5pbXBvcnQgeyBGc01lc3NhZ2UgfSBmcm9tICdAZmlyZXN0aXRjaC9tZXNzYWdlJztcbmltcG9ydCB7IGxpc3QgfSBmcm9tICdAZmlyZXN0aXRjaC9jb21tb24nO1xuaW1wb3J0IHsgRnNMaXN0Q29tcG9uZW50LCBGc0xpc3RDb25maWcgfSBmcm9tICdAZmlyZXN0aXRjaC9saXN0JztcblxuaW1wb3J0IHsgZm9ya0pvaW4sIE9ic2VydmFibGUsIG9mLCBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBGc0FwcEFjbFNlcnZpY2UgfSBmcm9tICcuLy4uLy4uL3NlcnZpY2VzL2FwcC1hY2wuc2VydmljZSc7XG5pbXBvcnQgeyBSb2xlQ29uZmlnIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBBY2xSb2xlQWNjZXNzIH0gZnJvbSAnLi4vLi4vZW51bXMvYWNsLXJvbGUtYWNjZXNzJztcbmltcG9ydCB7IE1hdEJ1dHRvbiB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2J1dHRvbic7XG5cblxuQENvbXBvbmVudCh7XG4gIHRlbXBsYXRlVXJsOiAnLi9hY2wtcm9sZS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2FjbC1yb2xlLmNvbXBvbmVudC5zY3NzJ10sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBGc0FjbFJvbGVDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG5cbiAgQFZpZXdDaGlsZChGc0xpc3RDb21wb25lbnQpXG4gIHB1YmxpYyBsaXN0OiBGc0xpc3RDb21wb25lbnQ7XG5cbiAgQFZpZXdDaGlsZCgnc3VibWl0JywgeyBzdGF0aWM6IGZhbHNlIH0pXG4gIHB1YmxpYyBzdWJtaXRCdXR0b246IE1hdEJ1dHRvbjtcblxuICBwdWJsaWMgYWNsUm9sZTogQWNsUm9sZSA9IG51bGw7XG4gIHB1YmxpYyBlbnZpcm9ubWVudDtcbiAgcHVibGljIHBlcm1pc3Npb25zOiBhbnlbXSA9IFtdO1xuICBwdWJsaWMgbGlzdENvbmZpZzogRnNMaXN0Q29uZmlnO1xuICBwdWJsaWMgbGV2ZWxQZXJtaXNzaW9ucyA9IFtdO1xuICBwdWJsaWMgQWNsUm9sZUFjY2Vzc2VzID0gQWNsUm9sZUFjY2Vzc2VzO1xuICBwdWJsaWMgaW5kZXhlZEFjY2Vzc2VzID0ge307XG4gIHB1YmxpYyBhY2xMZXZlbHM6IGFueVtdID0gW107XG4gIHB1YmxpYyBpbmRleGVkQWNsTGV2ZWxzID0ge307XG4gIHB1YmxpYyBvbmx5RnVsbEFjY2VzcyA9IGZhbHNlO1xuICBwdWJsaWMgQWNsTGV2ZWxzID0ge307XG4gIHB1YmxpYyByb2xlQ29uZmlnczogUm9sZUNvbmZpZ1tdID0gW107XG4gIHB1YmxpYyBhY2xSb2xlQ29uZmlnVmFsdWVzID0ge307XG4gIHB1YmxpYyBhY2xSb2xlUGVybWlzc2lvbnMgPSB7fTtcbiAgcHVibGljIGxvYWRSb2xlQ29uZmlnczogKGFjbFJvbGU6IEFjbFJvbGUsIHF1ZXJ5KSA9PiBPYnNlcnZhYmxlPFJvbGVDb25maWdbXT47XG4gIHB1YmxpYyBkaXNhYmxlZDogYm9vbGVhbjtcblxuICBwcml2YXRlIF9kZXN0cm95JCA9IG5ldyBTdWJqZWN0KCk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgQEluamVjdChNQVRfRElBTE9HX0RBVEEpIHByaXZhdGUgcmVhZG9ubHkgX2RhdGE6IGFueSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9hcHBBY2xTZXJ2aWNlOiBGc0FwcEFjbFNlcnZpY2UsXG4gICAgcHJpdmF0ZSByZWFkb25seSBfZGlhbG9nUmVmOiBNYXREaWFsb2dSZWY8RnNBY2xSb2xlQ29tcG9uZW50PixcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9tZXNzYWdlOiBGc01lc3NhZ2UsXG4gICAgcHJpdmF0ZSBfY2RSZWY6IENoYW5nZURldGVjdG9yUmVmLFxuICApIHsgfVxuXG4gIHB1YmxpYyBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICBmb3JrSm9pbihcbiAgICAgIHRoaXMuZ2V0Um9sZSgpLFxuICAgICAgdGhpcy5fYXBwQWNsU2VydmljZS5nZXRQZXJtaXNzaW9ucygpLFxuICAgIClcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLl9kZXN0cm95JCkpXG4gICAgICAuc3Vic2NyaWJlKChbXG4gICAgICAgIGFjbFJvbGUsXG4gICAgICAgIGFjbFBlcm1pc3Npb25zLFxuICAgICAgXSkgPT4ge1xuXG4gICAgICAgIHRoaXMucGVybWlzc2lvbnMgPSBhY2xQZXJtaXNzaW9ucztcbiAgICAgICAgdGhpcy5hY2xMZXZlbHMgPSB0aGlzLl9kYXRhLmFjbExldmVscztcbiAgICAgICAgdGhpcy5kaXNhYmxlZCA9IHRoaXMuX2RhdGEuZGlzYWJsZWQ7XG5cbiAgICAgICAgdGhpcy5pbmRleGVkQWNsTGV2ZWxzID0gbGlzdCh0aGlzLmFjbExldmVscywgJ25hbWUnLCAndmFsdWUnKTtcbiAgICAgICAgdGhpcy5pbmRleGVkQWNjZXNzZXMgPSBsaXN0KEFjbFJvbGVBY2Nlc3NlcywgJ25hbWUnLCAndmFsdWUnKTtcblxuICAgICAgICB0aGlzLmFjbFJvbGUgPSB7XG4gICAgICAgICAgLi4ue1xuICAgICAgICAgICAgYWNsUGVybWlzc2lvbnM6IFtdLFxuICAgICAgICAgICAgYWxsUGVybWlzc2lvbnM6IHRydWUsXG4gICAgICAgICAgICBhY2xSb2xlQ29uZmlnczogW10sXG4gICAgICAgICAgICBwZXJtaXNzaW9uczoge30sXG4gICAgICAgICAgICBsZXZlbDogdGhpcy5hY2xMZXZlbHNbMF0udmFsdWUsXG4gICAgICAgICAgfSxcbiAgICAgICAgICAuLi5hY2xSb2xlLFxuICAgICAgICB9O1xuXG4gICAgICAgIHRoaXMuYWNsUm9sZUNvbmZpZ1ZhbHVlcyA9IChhY2xSb2xlLmFjbFJvbGVDb25maWdzIHx8IFtdKVxuICAgICAgICAgIC5yZWR1Y2UoKGFjY3VtLCBhY2xSb2xlQ29uZmlnKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAuLi5hY2N1bSxcbiAgICAgICAgICAgICAgW2FjbFJvbGVDb25maWcubmFtZV06IGFjbFJvbGVDb25maWcudmFsdWUsXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSwge30pO1xuXG4gICAgICAgIGlmICh0aGlzLmFjbFJvbGUuaWQpIHtcbiAgICAgICAgICB0aGlzLnBlcm1pc3Npb25zLmZvckVhY2goKHBlcm1pc3Npb24pID0+IHtcbiAgICAgICAgICAgIGxldCBhY2Nlc3MgPSAwO1xuXG4gICAgICAgICAgICBjb25zdCBhY2xQZXJtaXNzaW9uID0gdGhpcy5hY2xSb2xlLmFjbFBlcm1pc3Npb25zLmZpbmQoKGl0ZW0pID0+IHtcbiAgICAgICAgICAgICAgcmV0dXJuIGl0ZW0ucGVybWlzc2lvbiA9PT0gcGVybWlzc2lvbi52YWx1ZTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBpZiAoYWNsUGVybWlzc2lvbikge1xuICAgICAgICAgICAgICBhY2Nlc3MgPSBhY2xQZXJtaXNzaW9uLmFjY2VzcztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5hY2xSb2xlUGVybWlzc2lvbnNbcGVybWlzc2lvbi52YWx1ZV0gPSBhY2Nlc3M7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5hY2xSb2xlLmFsbFBlcm1pc3Npb25zKSB7XG4gICAgICAgICAgdGhpcy5fYXBwbHlNYXhQZXJtaXNzaW9uQWNjZXNzKCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl91cGRhdGVQZXJtaXNzaW9ucygpO1xuICAgICAgICB0aGlzLl91cGRhdGVSb2xlQ29uZmlncygpO1xuXG4gICAgICAgIHRoaXMuX2NkUmVmLm1hcmtGb3JDaGVjaygpO1xuICAgICAgfSk7XG5cbiAgICB0aGlzLmxpc3RDb25maWcgPSB7XG4gICAgICBzdGF0dXM6IGZhbHNlLFxuICAgICAgcGFnaW5nOiBmYWxzZSxcbiAgICAgIHJvd0hvdmVySGlnaGxpZ2h0OiBmYWxzZSxcbiAgICAgIG5vUmVzdWx0czoge1xuICAgICAgICBtZXNzYWdlOiAnJyxcbiAgICAgIH0sXG4gICAgICBncm91cDoge1xuICAgICAgICBpbml0aWFsRXhwYW5kOiB0cnVlLFxuICAgICAgICBncm91cEJ5OiAoZGF0YSkgPT4ge1xuICAgICAgICAgIHJldHVybiBkYXRhO1xuICAgICAgICB9LFxuICAgICAgICBjb21wYXJlQnk6IChkYXRhKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIGRhdGEuY2F0ZWdvcnkgfHwgJ0dlbmVyYWwnO1xuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIGZldGNoOiAoKSA9PiB7XG4gICAgICAgIHJldHVybiBvZih7XG4gICAgICAgICAgZGF0YTogdGhpcy5sZXZlbFBlcm1pc3Npb25zLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgICAgICAgIGEgPSBhLm5hbWUudG9VcHBlckNhc2UoKTtcbiAgICAgICAgICAgIGIgPSBiLm5hbWUudG9VcHBlckNhc2UoKTtcbiAgICAgICAgICAgIGlmIChhIDwgYikge1xuICAgICAgICAgICAgICByZXR1cm4gLTE7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGEgPiBiKSB7XG4gICAgICAgICAgICAgIHJldHVybiAxO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgICB9KSxcbiAgICAgICAgfSk7XG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICBwdWJsaWMgYnVsa0NoYW5nZSh2YWx1ZTogbnVtYmVyLCBncm91cENoaWxkcmVuLCBncm91cCk6IHZvaWQge1xuICAgIGdyb3VwQ2hpbGRyZW5cbiAgICAgIC5mb3JFYWNoKChwZXJtaXNzaW9uKSA9PiB7XG4gICAgICAgIGNvbnN0IGFjY2VzcyA9IHBlcm1pc3Npb24uYWNjZXNzZXNcbiAgICAgICAgICAuZmluZCgoYWNjZXNzKSA9PiB2YWx1ZSA9PT0gYWNjZXNzKTtcblxuICAgICAgICBpZihhY2Nlc3MgfHwgIXZhbHVlKSB7XG4gICAgICAgICAgdGhpcy5hY2xSb2xlUGVybWlzc2lvbnNbcGVybWlzc2lvbi52YWx1ZV0gPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuc3VibWl0QnV0dG9uLmRpc2FibGVkID0gZmFsc2U7XG4gICAgICB0aGlzLnBlcm1pc3Npb25DaGFuZ2UoKTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBwZXJtaXNzaW9uQ2hhbmdlKCk6IHZvaWQge1xuICAgIHRoaXMuYWNsUm9sZVBlcm1pc3Npb25zID0ge1xuICAgICAgLi4udGhpcy5hY2xSb2xlUGVybWlzc2lvbnMsICAgICAgICBcbiAgICB9O1xuICAgIHRoaXMuX2NkUmVmLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgcHVibGljIGxldmVsQ2hhbmdlKCk6IHZvaWQge1xuICAgIHRoaXMuX3VwZGF0ZVBlcm1pc3Npb25zKCk7XG4gICAgdGhpcy5fdXBkYXRlUm9sZUNvbmZpZ3MoKTtcbiAgICB0aGlzLmxpc3QucmVsb2FkKCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0Um9sZSgpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIGlmICghdGhpcy5fZGF0YS5hY2xSb2xlLmlkKSB7XG4gICAgICByZXR1cm4gb2YodGhpcy5fZGF0YS5hY2xSb2xlKTtcbiAgICB9XG5cbiAgICBjb25zdCBxdWVyeTogYW55ID0ge1xuICAgICAgYWNsUGVybWlzc2lvbnM6IHRydWUsXG4gICAgICBhY2xSb2xlQ29uZmlnczogdHJ1ZSxcbiAgICB9O1xuXG4gICAgaWYgKCF0aGlzLmVudmlyb25tZW50KSB7XG4gICAgICBxdWVyeS5lbnZpcm9ubWVudElkID0gbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5fZGF0YS5sb2FkQWNsUm9sZSh0aGlzLl9kYXRhLmFjbFJvbGUsIHF1ZXJ5KTtcbiAgfVxuXG4gIHB1YmxpYyBzYXZlID0gKCk6IE9ic2VydmFibGU8YW55PiA9PiB7XG4gICAgY29uc3QgYWNsUm9sZUNvbmZpZ3MgPSB0aGlzLnJvbGVDb25maWdzXG4gICAgICAubWFwKChyb2xlQ29uZmlnKSA9PiB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgbmFtZTogcm9sZUNvbmZpZy5uYW1lLFxuICAgICAgICAgIHZhbHVlOiB0aGlzLmFjbFJvbGVDb25maWdWYWx1ZXNbcm9sZUNvbmZpZy5uYW1lXSxcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICBjb25zdCBhY2xSb2xlID0ge1xuICAgICAgLi4udGhpcy5hY2xSb2xlLFxuICAgICAgcGVybWlzc2lvbnM6IHRoaXMubGV2ZWxQZXJtaXNzaW9ucy5tYXAoKHBlcm1pc3Npb24pID0+IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB2YWx1ZTogcGVybWlzc2lvbi52YWx1ZSxcbiAgICAgICAgICBhY2Nlc3M6IHRoaXMuYWNsUm9sZVBlcm1pc3Npb25zW3Blcm1pc3Npb24udmFsdWVdIHx8IDAsXG4gICAgICAgIH07XG4gICAgICB9KSxcbiAgICAgIGFjbFJvbGVDb25maWdzLFxuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5fZGF0YS5zYXZlQWNsUm9sZShhY2xSb2xlKVxuICAgICAgLnBpcGUoXG4gICAgICAgIHRhcCgocmVzcG9uc2UpID0+IHtcbiAgICAgICAgICB0aGlzLl9tZXNzYWdlLnN1Y2Nlc3MoJ1NhdmVkIENoYW5nZXMnKTtcbiAgICAgICAgICB0aGlzLmNsb3NlKHJlc3BvbnNlKTtcbiAgICAgICAgfSksXG4gICAgICApO1xuICB9XG5cbiAgcHVibGljIGNsb3NlKGRhdGE6IGFueSA9IG51bGwpOiB2b2lkIHtcbiAgICB0aGlzLl9kaWFsb2dSZWYuY2xvc2UoZGF0YSk7XG4gIH1cblxuICBwdWJsaWMgYWxsUGVybWlzc2lvbnNDaGFuZ2UoYWxsOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5fdXBkYXRlUGVybWlzc2lvbnMoKTtcbiAgICBpZiAoYWxsKSB7XG4gICAgICB0aGlzLl9hcHBseU1heFBlcm1pc3Npb25BY2Nlc3MoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fYXBwbHlOb25lUGVybWlzc2lvbkFjY2VzcygpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLl9kZXN0cm95JC5uZXh0KG51bGwpO1xuICAgIHRoaXMuX2Rlc3Ryb3kkLmNvbXBsZXRlKCk7XG4gIH1cblxuICBwcml2YXRlIF91cGRhdGVQZXJtaXNzaW9ucygpOiB2b2lkIHtcbiAgICB0aGlzLmxldmVsUGVybWlzc2lvbnMgPSB0aGlzLnBlcm1pc3Npb25zXG4gICAgLmZpbHRlcigocGVybWlzc2lvbikgPT4ge1xuICAgICAgcmV0dXJuIHBlcm1pc3Npb24ubGV2ZWxzLnNvbWUoKGl0ZW0pID0+IHtcbiAgICAgICAgcmV0dXJuIGl0ZW0gPT09IHRoaXMuYWNsUm9sZS5sZXZlbDtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfdXBkYXRlUm9sZUNvbmZpZ3MoKTogdm9pZCB7XG4gICAgaWYodGhpcy5fZGF0YS5sb2FkUm9sZUNvbmZpZ3MpIHtcbiAgICAgIHRoaXMuX2RhdGEubG9hZFJvbGVDb25maWdzKClcbiAgICAgIC5zdWJzY3JpYmUoKHJvbGVDb25maWdzOiBSb2xlQ29uZmlnW10pID0+IHtcbiAgICAgICAgdGhpcy5yb2xlQ29uZmlncyA9IHJvbGVDb25maWdzXG4gICAgICAgICAgLmZpbHRlcigocm9sZUNvbmZpZykgPT4gcm9sZUNvbmZpZy5sZXZlbCA9PT0gdGhpcy5hY2xSb2xlLmxldmVsKTtcbiAgICAgICAgdGhpcy5fY2RSZWYubWFya0ZvckNoZWNrKCk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9hcHBseU1heFBlcm1pc3Npb25BY2Nlc3MoKTogdm9pZCB7XG4gICAgdGhpcy5wZXJtaXNzaW9ucy5mb3JFYWNoKChwZXJtaXNzaW9uKSA9PiB7XG4gICAgICB0aGlzLmFjbFJvbGVQZXJtaXNzaW9uc1twZXJtaXNzaW9uLnZhbHVlXSA9IE1hdGgubWF4KC4uLnBlcm1pc3Npb24uYWNjZXNzZXMpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfYXBwbHlOb25lUGVybWlzc2lvbkFjY2VzcygpOiB2b2lkIHtcbiAgICB0aGlzLnBlcm1pc3Npb25zLmZvckVhY2goKHBlcm1pc3Npb24pID0+IHtcbiAgICAgIHRoaXMuYWNsUm9sZVBlcm1pc3Npb25zW3Blcm1pc3Npb24udmFsdWVdID0gQWNsUm9sZUFjY2Vzcy5Ob25lO1xuICAgIH0pO1xuICB9XG5cbn1cbiIsIjxmb3JtXG4gICAgZnNGb3JtXG4gICAgW3N1Ym1pdF09XCJzYXZlXCI+XG4gIDxmcy1kaWFsb2c+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImFjbFJvbGVcIj5cbiAgICAgIDxkaXYgbWF0LWRpYWxvZy10aXRsZT5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFkaXNhYmxlZFwiPlxuICAgICAgICAgIHt7IGFjbFJvbGUuaWQgPyAnRWRpdCcgOiAnQ3JlYXRlJyB9fVxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImRpc2FibGVkXCI+XG4gICAgICAgICAgVmlld1xuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgUm9sZVxuICAgICAgPC9kaXY+XG4gICAgICA8bWF0LWRpYWxvZy1jb250ZW50PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZnMtcm93LmdhcC1sYXJnZS5hbGlnbi1zdGFydFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmcy1jb2x1bW4gbGVmdC1jb2x1bW5cIj5cbiAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICAgICAgPG1hdC1sYWJlbD5cbiAgICAgICAgICAgICAgICBOYW1lXG4gICAgICAgICAgICAgIDwvbWF0LWxhYmVsPlxuICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICBtYXRJbnB1dFxuICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiYWNsUm9sZS5uYW1lXCJcbiAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgICAgICAgICAgICAgIG5hbWU9XCJuYW1lXCJcbiAgICAgICAgICAgICAgICBmc0Zvcm1SZXF1aXJlZD5cbiAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgICAgIDxtYXQtbGFiZWw+XG4gICAgICAgICAgICAgICAgRGVzY3JpcHRpb25cbiAgICAgICAgICAgICAgPC9tYXQtbGFiZWw+XG4gICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgIG1hdElucHV0XG4gICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJhY2xSb2xlLmRlc2NyaXB0aW9uXCJcbiAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgICAgICAgICAgICAgIG5hbWU9XCJkZXNjcmlwdGlvblwiPlxuICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICAgIDxmcy1sYWJlbC1maWVsZCAqbmdJZj1cImFjbFJvbGUuaWQgfHwgYWNsTGV2ZWxzLmxlbmd0aCA9PT0gMTsgZWxzZSBsZXZlbHNcIj5cbiAgICAgICAgICAgICAgPGZzLWxhYmVsPlxuICAgICAgICAgICAgICAgIExldmVsXG4gICAgICAgICAgICAgIDwvZnMtbGFiZWw+XG4gICAgICAgICAgICAgIHt7IGluZGV4ZWRBY2xMZXZlbHNbYWNsUm9sZS5sZXZlbF0gfX1cbiAgICAgICAgICAgIDwvZnMtbGFiZWwtZmllbGQ+XG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgI2xldmVscz5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxldmVsXCI+XG4gICAgICAgICAgICAgICAgPGZzLXJhZGlvLWdyb3VwXG4gICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiYWNsUm9sZS5sZXZlbFwiXG4gICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXG4gICAgICAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cImxldmVsQ2hhbmdlKClcIlxuICAgICAgICAgICAgICAgICAgICBmc0Zvcm1SZXF1aXJlZFxuICAgICAgICAgICAgICAgICAgICBsYWJlbD1cIkxldmVsXCJcbiAgICAgICAgICAgICAgICAgICAgb3JpZW50YXRpb249XCJ2ZXJ0aWNhbFwiXG4gICAgICAgICAgICAgICAgICAgIG5hbWU9XCJsZXZlbFwiPlxuICAgICAgICAgICAgICAgICAgPG1hdC1yYWRpby1idXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgaXRlbSBvZiBhY2xMZXZlbHNcIlxuICAgICAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJpdGVtLnZhbHVlXCJcbiAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiISFhY2xSb2xlLnByb3RlY3RlZFwiPlxuICAgICAgICAgICAgICAgICAgICB7eyBpdGVtLm5hbWUgfX1cbiAgICAgICAgICAgICAgICAgIDwvbWF0LXJhZGlvLWJ1dHRvbj5cbiAgICAgICAgICAgICAgICA8L2ZzLXJhZGlvLWdyb3VwPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICA8ZnMtbGFiZWwtZmllbGQgKm5nSWY9XCJsZXZlbFBlcm1pc3Npb25zLmxlbmd0aFwiPlxuICAgICAgICAgICAgICA8ZnMtbGFiZWw+XG4gICAgICAgICAgICAgICAgQWxsIFBlcm1pc3Npb25zXG4gICAgICAgICAgICAgIDwvZnMtbGFiZWw+XG4gICAgICAgICAgICAgIDxtYXQtY2hlY2tib3hcbiAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiYWNsUm9sZS5hbGxQZXJtaXNzaW9uc1wiXG4gICAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJhbGxQZXJtaXNzaW9uc0NoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhIWFjbFJvbGUucHJvdGVjdGVkIHx8IGRpc2FibGVkXCJcbiAgICAgICAgICAgICAgICAgIG5hbWU9XCJhbGxQZXJtaXNzaW9uc1wiPlxuICAgICAgICAgICAgICAgIEVuYWJsZVxuICAgICAgICAgICAgICA8L21hdC1jaGVja2JveD5cbiAgICAgICAgICAgIDwvZnMtbGFiZWwtZmllbGQ+XG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgY2xhc3M9XCJmcy1jb2x1bW5cIlxuICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCByb2xlQ29uZmlnIG9mIHJvbGVDb25maWdzXCI+XG4gICAgICAgICAgICAgIDxmcy1sYWJlbC1maWVsZCAqbmdJZj1cInJvbGVDb25maWcudHlwZSA9PT0gJ2NoZWNrYm94J1wiPlxuICAgICAgICAgICAgICAgIDxmcy1sYWJlbD5cbiAgICAgICAgICAgICAgICAgIHt7IHJvbGVDb25maWcubGFiZWwgfX1cbiAgICAgICAgICAgICAgICA8L2ZzLWxhYmVsPlxuICAgICAgICAgICAgICAgIDxtYXQtY2hlY2tib3hcbiAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJhY2xSb2xlQ29uZmlnVmFsdWVzW3JvbGVDb25maWcubmFtZV1cIlxuICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgICAgICAgICAgICAgICAgICBbbmFtZV09XCJyb2xlQ29uZmlnLm5hbWVcIj5cbiAgICAgICAgICAgICAgICAgIEVuYWJsZVxuICAgICAgICAgICAgICAgIDwvbWF0LWNoZWNrYm94PlxuICAgICAgICAgICAgICAgIDxmcy1sYWJlbC1tZXNzYWdlPlxuICAgICAgICAgICAgICAgICAgPG1hdC1oaW50PlxuICAgICAgICAgICAgICAgICAgICB7eyByb2xlQ29uZmlnLmRlc2NyaXB0aW9uIH19XG4gICAgICAgICAgICAgICAgICA8L21hdC1oaW50PlxuICAgICAgICAgICAgICAgIDwvZnMtbGFiZWwtbWVzc2FnZT5cbiAgICAgICAgICAgICAgPC9mcy1sYWJlbC1maWVsZD5cbiAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkICpuZ0lmPVwicm9sZUNvbmZpZy50eXBlID09PSAnc2VsZWN0J1wiPlxuICAgICAgICAgICAgICAgIDxtYXQtc2VsZWN0XG4gICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiYWNsUm9sZUNvbmZpZ1ZhbHVlc1tyb2xlQ29uZmlnLm5hbWVdXCJcbiAgICAgICAgICAgICAgICAgICAgW25hbWVdPVwicm9sZUNvbmZpZy5uYW1lXCJcbiAgICAgICAgICAgICAgICAgICAgW3JlcXVpcmVkXT1cInJvbGVDb25maWcucmVxdWlyZWRcIlxuICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgICAgICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwicm9sZUNvbmZpZy5sYWJlbFwiPlxuICAgICAgICAgICAgICAgICAgPG1hdC1vcHRpb25cbiAgICAgICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgaXRlbSBvZiByb2xlQ29uZmlnLnZhbHVlc1wiXG4gICAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cIml0ZW0udmFsdWVcIj5cbiAgICAgICAgICAgICAgICAgICAge3sgaXRlbS5uYW1lIH19XG4gICAgICAgICAgICAgICAgICA8L21hdC1vcHRpb24+XG4gICAgICAgICAgICAgICAgPC9tYXQtc2VsZWN0PlxuICAgICAgICAgICAgICAgIDxtYXQtaGludD5cbiAgICAgICAgICAgICAgICAgIHt7IHJvbGVDb25maWcuZGVzY3JpcHRpb24gfX1cbiAgICAgICAgICAgICAgICA8L21hdC1oaW50PlxuICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAqbmdJZj1cImFjbFJvbGUubGV2ZWxcIlxuICAgICAgICAgICAgICBbaGlkZGVuXT1cIiFsZXZlbFBlcm1pc3Npb25zLmxlbmd0aFwiXG4gICAgICAgICAgICAgIGNsYXNzPVwicGVybWlzc2lvbnMgZnMtY29sdW1uXCI+XG4gICAgICAgICAgICA8ZnMtbGlzdCBbY29uZmlnXT1cImxpc3RDb25maWdcIj5cbiAgICAgICAgICAgICAgPGZzLWxpc3QtY29sdW1uIHRpdGxlPVwiUGVybWlzc2lvbnNcIj5cbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGVcbiAgICAgICAgICAgICAgICAgICAgZnMtbGlzdC1ncm91cC1jZWxsXG4gICAgICAgICAgICAgICAgICAgIGxldC1yb3c9XCJyb3dcIlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInBlcm1pc3Npb24tZ3JvdXBcIj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwZXJtaXNzaW9uLWdyb3VwXCI+XG4gICAgICAgICAgICAgICAgICAgIHt7IHJvdy5jYXRlZ29yeSB8fCAnR2VuZXJhbCcgfX1cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlXG4gICAgICAgICAgICAgICAgICAgIGZzLWxpc3QtY2VsbFxuICAgICAgICAgICAgICAgICAgICBsZXQtcm93PVwicm93XCI+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicGVybWlzc2lvblwiPlxuICAgICAgICAgICAgICAgICAgICB7eyByb3cubmFtZSB9fVxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGVzY3JpcHRpb24gc21hbGxcIj5cbiAgICAgICAgICAgICAgICAgICAge3sgcm93LmRlc2NyaXB0aW9uIH19XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICA8L2ZzLWxpc3QtY29sdW1uPlxuICAgICAgICAgICAgICA8ZnMtbGlzdC1jb2x1bW5cbiAgICAgICAgICAgICAgICAgIHRpdGxlPVwiQWNjZXNzXCJcbiAgICAgICAgICAgICAgICAgIHdpZHRoPVwiMSVcIlxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJhY2Nlc3NcIj5cbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGVcbiAgICAgICAgICAgICAgICAgICAgZnMtbGlzdC1ncm91cC1jZWxsXG4gICAgICAgICAgICAgICAgICAgIGxldC1yb3c9XCJyb3dcIlxuICAgICAgICAgICAgICAgICAgICBsZXQtZ3JvdXA9XCJncm91cFwiXG4gICAgICAgICAgICAgICAgICAgIGxldC1ncm91cENoaWxkcmVuPVwiZ3JvdXBDaGlsZHJlblwiXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwicGVybWlzc2lvbi1ncm91cFwiXG4gICAgICAgICAgICAgICAgICAgIGFsaWduPVwicmlnaHRcIj5cbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhYWNsUm9sZS5hbGxQZXJtaXNzaW9ucyAmJiAhZGlzYWJsZWRcIj5cbiAgICAgICAgICAgICAgICAgICAgPGZzLW1lbnU+XG4gICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgYWNjZXNzIG9mIEFjbFJvbGVBY2Nlc3NlcyB8IGJ1aWxrT3B0aW9uc0ZpbHRlcjogZ3JvdXBDaGlsZHJlblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnMtbWVudS1pdGVtXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImJ1bGtDaGFuZ2UoYWNjZXNzLnZhbHVlLCBncm91cENoaWxkcmVuLCBncm91cClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAge3sgYWNjZXNzLm5hbWUgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgIDwvZnMtbWVudT5cbiAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlXG4gICAgICAgICAgICAgICAgICAgIGZzLWxpc3QtY2VsbFxuICAgICAgICAgICAgICAgICAgICBsZXQtcm93PVwicGVybWlzc2lvblwiXG4gICAgICAgICAgICAgICAgICAgIGxldC1wZXJtaXNzaW9uPVwicm93XCI+XG4gICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cImFjbFJvbGUuYWxsUGVybWlzc2lvbnMgfHwgZGlzYWJsZWQ7IGVsc2UgZWxzZUFsbFwiPlxuICAgICAgICAgICAgICAgICAgICB7eyBpbmRleGVkQWNjZXNzZXNbYWNsUm9sZVBlcm1pc3Npb25zW3Blcm1pc3Npb24udmFsdWVdXSB9fVxuICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNlbHNlQWxsPlxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwicGVybWlzc2lvbnxhY2xSb2xlUGVybWlzc2lvbkF2YWlsYWJsZTphY2xSb2xlUGVybWlzc2lvbnM7IGVsc2UgcGVybWlzc2lvblJlcXVpcmVzXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1zZWxlY3RcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cImFjbFJvbGVQZXJtaXNzaW9uc1twZXJtaXNzaW9uLnZhbHVlXVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiEhYWNsUm9sZS5wcm90ZWN0ZWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWZpZWxkLXBhZGxlc3NcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuYW1lXT1cIidhY2Nlc3MtJyArIHBlcm1pc3Npb24udmFsdWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cInBlcm1pc3Npb25DaGFuZ2UoKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBhY2Nlc3Mgb2YgQWNsUm9sZUFjY2Vzc2VzXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1vcHRpb25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJhY2Nlc3MudmFsdWUgPT09IDAgfHwgcGVybWlzc2lvbi5hY2Nlc3Nlcy5pbmRleE9mKGFjY2Vzcy52YWx1ZSkgIT09IC0xXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cImFjY2Vzcy52YWx1ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgYWNjZXNzLm5hbWUgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtc2VsZWN0PlxuICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI3Blcm1pc3Npb25SZXF1aXJlcz5cbiAgICAgICAgICAgICAgICAgICAgICBVbmF2YWlsYWJsZVxuICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICA8L2ZzLWxpc3QtY29sdW1uPlxuICAgICAgICAgICAgPC9mcy1saXN0PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvbWF0LWRpYWxvZy1jb250ZW50PlxuICAgICAgPG1hdC1kaWFsb2ctYWN0aW9ucz5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgKm5nSWY9XCIhZGlzYWJsZWRcIlxuICAgICAgICAgICAgI3N1Ym1pdFxuICAgICAgICAgICAgbWF0LWJ1dHRvblxuICAgICAgICAgICAgdHlwZT1cInN1Ym1pdFwiXG4gICAgICAgICAgICBjb2xvcj1cInByaW1hcnlcIj5cbiAgICAgICAgICB7eyBhY2xSb2xlLmlkID8gJ1NhdmUnIDogJ0NyZWF0ZScgfX1cbiAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIG1hdC1idXR0b25cbiAgICAgICAgICAgIFttYXQtZGlhbG9nLWNsb3NlXT1cIm51bGxcIlxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiPlxuICAgICAgICAgIHt7IGRpc2FibGVkID8gJ0RvbmUnIDogJ0NhbmNlbCcgfX1cbiAgICAgICAgPC9idXR0b24+XG4gICAgICA8L21hdC1kaWFsb2ctYWN0aW9ucz5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgPC9mcy1kaWFsb2c+XG48L2Zvcm0+Il19
|
|
265
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWNsLXJvbGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9jb21wb25lbnRzL2FjbC1yb2xlL2FjbC1yb2xlLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvY29tcG9uZW50cy9hY2wtcm9sZS9hY2wtcm9sZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsdUJBQXVCLEVBQ3ZCLGlCQUFpQixFQUNqQixTQUFTLEVBQ1QsTUFBTSxFQUdOLFNBQVMsRUFDVixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsZUFBZSxFQUFFLFlBQVksRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBRXpFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUVuRSxPQUFPLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRWhELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNoRCxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDMUMsT0FBTyxFQUFFLGVBQWUsRUFBZ0IsTUFBTSxrQkFBa0IsQ0FBQztBQUVqRSxPQUFPLEVBQUUsUUFBUSxFQUFjLEVBQUUsRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDekQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBRW5FLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUM1RCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFRckQsTUFBTSxPQUFPLGtCQUFrQjtJQTRCZTtJQUN6QjtJQUNBO0lBQ0E7SUFDVDtJQTdCSCxJQUFJLENBQWtCO0lBR3RCLFlBQVksQ0FBWTtJQUV4QixPQUFP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QkFMOUIsU0FBUztzQ0FHUyx1QkFBdUIsQ0FBQyxNQUFNOzswQkE4QjVDLE1BQU07MkJBQUMsZUFBZTswSkF6QmxCLElBQUk7c0JBRFYsU0FBUzt1QkFBQyxlQUFlO2dCQUluQixZQUFZO3NCQURsQixTQUFTO3VCQUFDLFFBQVEsRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgSW5qZWN0LFxuICBPbkRlc3Ryb3ksXG4gIE9uSW5pdCxcbiAgVmlld0NoaWxkXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTUFUX0RJQUxPR19EQVRBLCBNYXREaWFsb2dSZWYgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kaWFsb2cnO1xuXG5pbXBvcnQgeyBBY2xSb2xlQWNjZXNzZXMgfSBmcm9tICcuLy4uLy4uL2NvbnN0cy9hY2wtcm9sZS1hY2Nlc3Nlcyc7XG5pbXBvcnQgeyBBY2xSb2xlIH0gZnJvbSAnLi8uLi8uLi9pbnRlcmZhY2VzL2FjbC1yb2xlJztcbmltcG9ydCB7IHRha2VVbnRpbCwgdGFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5pbXBvcnQgeyBGc01lc3NhZ2UgfSBmcm9tICdAZmlyZXN0aXRjaC9tZXNzYWdlJztcbmltcG9ydCB7IGxpc3QgfSBmcm9tICdAZmlyZXN0aXRjaC9jb21tb24nO1xuaW1wb3J0IHsgRnNMaXN0Q29tcG9uZW50LCBGc0xpc3RDb25maWcgfSBmcm9tICdAZmlyZXN0aXRjaC9saXN0JztcblxuaW1wb3J0IHsgZm9ya0pvaW4sIE9ic2VydmFibGUsIG9mLCBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBGc0FwcEFjbFNlcnZpY2UgfSBmcm9tICcuLy4uLy4uL3NlcnZpY2VzL2FwcC1hY2wuc2VydmljZSc7XG5pbXBvcnQgeyBSb2xlQ29uZmlnIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBBY2xSb2xlQWNjZXNzIH0gZnJvbSAnLi4vLi4vZW51bXMvYWNsLXJvbGUtYWNjZXNzJztcbmltcG9ydCB7IE1hdEJ1dHRvbiB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2J1dHRvbic7XG5cblxuQENvbXBvbmVudCh7XG4gIHRlbXBsYXRlVXJsOiAnLi9hY2wtcm9sZS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2FjbC1yb2xlLmNvbXBvbmVudC5zY3NzJ10sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBGc0FjbFJvbGVDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG5cbiAgQFZpZXdDaGlsZChGc0xpc3RDb21wb25lbnQpXG4gIHB1YmxpYyBsaXN0OiBGc0xpc3RDb21wb25lbnQ7XG5cbiAgQFZpZXdDaGlsZCgnc3VibWl0JywgeyBzdGF0aWM6IGZhbHNlIH0pXG4gIHB1YmxpYyBzdWJtaXRCdXR0b246IE1hdEJ1dHRvbjtcblxuICBwdWJsaWMgYWNsUm9sZTogQWNsUm9sZSA9IG51bGw7XG4gIHB1YmxpYyBlbnZpcm9ubWVudDtcbiAgcHVibGljIHBlcm1pc3Npb25zOiBhbnlbXSA9IFtdO1xuICBwdWJsaWMgbGlzdENvbmZpZzogRnNMaXN0Q29uZmlnO1xuICBwdWJsaWMgbGV2ZWxQZXJtaXNzaW9ucyA9IFtdO1xuICBwdWJsaWMgQWNsUm9sZUFjY2Vzc2VzID0gQWNsUm9sZUFjY2Vzc2VzO1xuICBwdWJsaWMgaW5kZXhlZEFjY2Vzc2VzID0ge307XG4gIHB1YmxpYyBhY2xMZXZlbHM6IGFueVtdID0gW107XG4gIHB1YmxpYyBpbmRleGVkQWNsTGV2ZWxzID0ge307XG4gIHB1YmxpYyBvbmx5RnVsbEFjY2VzcyA9IGZhbHNlO1xuICBwdWJsaWMgQWNsTGV2ZWxzID0ge307XG4gIHB1YmxpYyByb2xlQ29uZmlnczogUm9sZUNvbmZpZ1tdID0gW107XG4gIHB1YmxpYyBhY2xSb2xlQ29uZmlnVmFsdWVzID0ge307XG4gIHB1YmxpYyBhY2xSb2xlUGVybWlzc2lvbnMgPSB7fTtcbiAgcHVibGljIGxvYWRSb2xlQ29uZmlnczogKGFjbFJvbGU6IEFjbFJvbGUsIHF1ZXJ5KSA9PiBPYnNlcnZhYmxlPFJvbGVDb25maWdbXT47XG4gIHB1YmxpYyBkaXNhYmxlZDogYm9vbGVhbjtcblxuICBwcml2YXRlIF9kZXN0cm95JCA9IG5ldyBTdWJqZWN0KCk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgQEluamVjdChNQVRfRElBTE9HX0RBVEEpIHByaXZhdGUgcmVhZG9ubHkgX2RhdGE6IGFueSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9hcHBBY2xTZXJ2aWNlOiBGc0FwcEFjbFNlcnZpY2UsXG4gICAgcHJpdmF0ZSByZWFkb25seSBfZGlhbG9nUmVmOiBNYXREaWFsb2dSZWY8RnNBY2xSb2xlQ29tcG9uZW50PixcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9tZXNzYWdlOiBGc01lc3NhZ2UsXG4gICAgcHJpdmF0ZSBfY2RSZWY6IENoYW5nZURldGVjdG9yUmVmLFxuICApIHsgfVxuXG4gIHB1YmxpYyBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICBmb3JrSm9pbihcbiAgICAgIHRoaXMuZ2V0Um9sZSgpLFxuICAgICAgdGhpcy5fYXBwQWNsU2VydmljZS5nZXRQZXJtaXNzaW9ucygpLFxuICAgIClcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLl9kZXN0cm95JCkpXG4gICAgICAuc3Vic2NyaWJlKChbXG4gICAgICAgIGFjbFJvbGUsXG4gICAgICAgIGFjbFBlcm1pc3Npb25zLFxuICAgICAgXSkgPT4ge1xuXG4gICAgICAgIHRoaXMucGVybWlzc2lvbnMgPSBhY2xQZXJtaXNzaW9ucztcbiAgICAgICAgdGhpcy5hY2xMZXZlbHMgPSB0aGlzLl9kYXRhLmFjbExldmVscztcbiAgICAgICAgdGhpcy5kaXNhYmxlZCA9IHRoaXMuX2RhdGEuZGlzYWJsZWQ7XG5cbiAgICAgICAgdGhpcy5pbmRleGVkQWNsTGV2ZWxzID0gbGlzdCh0aGlzLmFjbExldmVscywgJ25hbWUnLCAndmFsdWUnKTtcbiAgICAgICAgdGhpcy5pbmRleGVkQWNjZXNzZXMgPSBsaXN0KEFjbFJvbGVBY2Nlc3NlcywgJ25hbWUnLCAndmFsdWUnKTtcblxuICAgICAgICB0aGlzLmFjbFJvbGUgPSB7XG4gICAgICAgICAgLi4ue1xuICAgICAgICAgICAgYWNsUGVybWlzc2lvbnM6IFtdLFxuICAgICAgICAgICAgYWxsUGVybWlzc2lvbnM6IHRydWUsXG4gICAgICAgICAgICBhY2xSb2xlQ29uZmlnczogW10sXG4gICAgICAgICAgICBwZXJtaXNzaW9uczoge30sXG4gICAgICAgICAgICBsZXZlbDogdGhpcy5hY2xMZXZlbHNbMF0udmFsdWUsXG4gICAgICAgICAgfSxcbiAgICAgICAgICAuLi5hY2xSb2xlLFxuICAgICAgICB9O1xuXG4gICAgICAgIHRoaXMuYWNsUm9sZUNvbmZpZ1ZhbHVlcyA9IChhY2xSb2xlLmFjbFJvbGVDb25maWdzIHx8IFtdKVxuICAgICAgICAgIC5yZWR1Y2UoKGFjY3VtLCBhY2xSb2xlQ29uZmlnKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAuLi5hY2N1bSxcbiAgICAgICAgICAgICAgW2FjbFJvbGVDb25maWcubmFtZV06IGFjbFJvbGVDb25maWcudmFsdWUsXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSwge30pO1xuXG4gICAgICAgIGlmICh0aGlzLmFjbFJvbGUuaWQpIHtcbiAgICAgICAgICB0aGlzLnBlcm1pc3Npb25zLmZvckVhY2goKHBlcm1pc3Npb24pID0+IHtcbiAgICAgICAgICAgIGxldCBhY2Nlc3MgPSAwO1xuXG4gICAgICAgICAgICBjb25zdCBhY2xQZXJtaXNzaW9uID0gdGhpcy5hY2xSb2xlLmFjbFBlcm1pc3Npb25zLmZpbmQoKGl0ZW0pID0+IHtcbiAgICAgICAgICAgICAgcmV0dXJuIGl0ZW0ucGVybWlzc2lvbiA9PT0gcGVybWlzc2lvbi52YWx1ZTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBpZiAoYWNsUGVybWlzc2lvbikge1xuICAgICAgICAgICAgICBhY2Nlc3MgPSBhY2xQZXJtaXNzaW9uLmFjY2VzcztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5hY2xSb2xlUGVybWlzc2lvbnNbcGVybWlzc2lvbi52YWx1ZV0gPSBhY2Nlc3M7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5hY2xSb2xlLmFsbFBlcm1pc3Npb25zKSB7XG4gICAgICAgICAgdGhpcy5fYXBwbHlNYXhQZXJtaXNzaW9uQWNjZXNzKCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl91cGRhdGVQZXJtaXNzaW9ucygpO1xuICAgICAgICB0aGlzLl91cGRhdGVSb2xlQ29uZmlncygpO1xuXG4gICAgICAgIHRoaXMuX2NkUmVmLm1hcmtGb3JDaGVjaygpO1xuICAgICAgfSk7XG5cbiAgICB0aGlzLmxpc3RDb25maWcgPSB7XG4gICAgICBzdGF0dXM6IGZhbHNlLFxuICAgICAgcGFnaW5nOiBmYWxzZSxcbiAgICAgIHJvd0hvdmVySGlnaGxpZ2h0OiBmYWxzZSxcbiAgICAgIG5vUmVzdWx0czoge1xuICAgICAgICBtZXNzYWdlOiAnJyxcbiAgICAgIH0sXG4gICAgICBncm91cDoge1xuICAgICAgICBpbml0aWFsRXhwYW5kOiB0cnVlLFxuICAgICAgICBncm91cEJ5OiAoZGF0YSkgPT4ge1xuICAgICAgICAgIHJldHVybiBkYXRhO1xuICAgICAgICB9LFxuICAgICAgICBjb21wYXJlQnk6IChkYXRhKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIGRhdGEuY2F0ZWdvcnkgfHwgJ0dlbmVyYWwnO1xuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIGZldGNoOiAoKSA9PiB7XG4gICAgICAgIHJldHVybiBvZih7XG4gICAgICAgICAgZGF0YTogdGhpcy5sZXZlbFBlcm1pc3Npb25zLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgICAgICAgIGEgPSBhLm5hbWUudG9VcHBlckNhc2UoKTtcbiAgICAgICAgICAgIGIgPSBiLm5hbWUudG9VcHBlckNhc2UoKTtcbiAgICAgICAgICAgIGlmIChhIDwgYikge1xuICAgICAgICAgICAgICByZXR1cm4gLTE7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGEgPiBiKSB7XG4gICAgICAgICAgICAgIHJldHVybiAxO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgICB9KSxcbiAgICAgICAgfSk7XG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICBwdWJsaWMgYnVsa0NoYW5nZSh2YWx1ZTogbnVtYmVyLCBncm91cENoaWxkcmVuLCBncm91cCk6IHZvaWQge1xuICAgIGdyb3VwQ2hpbGRyZW5cbiAgICAgIC5mb3JFYWNoKChwZXJtaXNzaW9uKSA9PiB7XG4gICAgICAgIGNvbnN0IGFjY2VzcyA9IHBlcm1pc3Npb24uYWNjZXNzZXNcbiAgICAgICAgICAuZmluZCgoYWNjZXNzKSA9PiB2YWx1ZSA9PT0gYWNjZXNzKTtcblxuICAgICAgICBpZihhY2Nlc3MgfHwgIXZhbHVlKSB7XG4gICAgICAgICAgdGhpcy5hY2xSb2xlUGVybWlzc2lvbnNbcGVybWlzc2lvbi52YWx1ZV0gPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuc3VibWl0QnV0dG9uLmRpc2FibGVkID0gZmFsc2U7XG4gICAgICB0aGlzLnBlcm1pc3Npb25DaGFuZ2UoKTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBwZXJtaXNzaW9uQ2hhbmdlKCk6IHZvaWQge1xuICAgIHRoaXMuYWNsUm9sZVBlcm1pc3Npb25zID0ge1xuICAgICAgLi4udGhpcy5hY2xSb2xlUGVybWlzc2lvbnMsICAgICAgICBcbiAgICB9O1xuICAgIHRoaXMuX2NkUmVmLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgcHVibGljIGxldmVsQ2hhbmdlKCk6IHZvaWQge1xuICAgIHRoaXMuX3VwZGF0ZVBlcm1pc3Npb25zKCk7XG4gICAgdGhpcy5fdXBkYXRlUm9sZUNvbmZpZ3MoKTtcbiAgICB0aGlzLmxpc3QucmVsb2FkKCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0Um9sZSgpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIGlmICghdGhpcy5fZGF0YS5hY2xSb2xlLmlkKSB7XG4gICAgICByZXR1cm4gb2YodGhpcy5fZGF0YS5hY2xSb2xlKTtcbiAgICB9XG5cbiAgICBjb25zdCBxdWVyeTogYW55ID0ge1xuICAgICAgYWNsUGVybWlzc2lvbnM6IHRydWUsXG4gICAgICBhY2xSb2xlQ29uZmlnczogdHJ1ZSxcbiAgICB9O1xuXG4gICAgaWYgKCF0aGlzLmVudmlyb25tZW50KSB7XG4gICAgICBxdWVyeS5lbnZpcm9ubWVudElkID0gbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5fZGF0YS5sb2FkQWNsUm9sZSh0aGlzLl9kYXRhLmFjbFJvbGUsIHF1ZXJ5KTtcbiAgfVxuXG4gIHB1YmxpYyBzYXZlID0gKCk6IE9ic2VydmFibGU8YW55PiA9PiB7XG4gICAgY29uc3QgYWNsUm9sZUNvbmZpZ3MgPSB0aGlzLnJvbGVDb25maWdzXG4gICAgICAubWFwKChyb2xlQ29uZmlnKSA9PiB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgbmFtZTogcm9sZUNvbmZpZy5uYW1lLFxuICAgICAgICAgIHZhbHVlOiB0aGlzLmFjbFJvbGVDb25maWdWYWx1ZXNbcm9sZUNvbmZpZy5uYW1lXSxcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICBjb25zdCBhY2xSb2xlID0ge1xuICAgICAgLi4udGhpcy5hY2xSb2xlLFxuICAgICAgcGVybWlzc2lvbnM6IHRoaXMubGV2ZWxQZXJtaXNzaW9ucy5tYXAoKHBlcm1pc3Npb24pID0+IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB2YWx1ZTogcGVybWlzc2lvbi52YWx1ZSxcbiAgICAgICAgICBhY2Nlc3M6IHRoaXMuYWNsUm9sZVBlcm1pc3Npb25zW3Blcm1pc3Npb24udmFsdWVdIHx8IDAsXG4gICAgICAgIH07XG4gICAgICB9KSxcbiAgICAgIGFjbFJvbGVDb25maWdzLFxuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5fZGF0YS5zYXZlQWNsUm9sZShhY2xSb2xlKVxuICAgICAgLnBpcGUoXG4gICAgICAgIHRhcCgocmVzcG9uc2UpID0+IHtcbiAgICAgICAgICB0aGlzLl9tZXNzYWdlLnN1Y2Nlc3MoJ1NhdmVkIENoYW5nZXMnKTtcbiAgICAgICAgICB0aGlzLmNsb3NlKHJlc3BvbnNlKTtcbiAgICAgICAgfSksXG4gICAgICApO1xuICB9XG5cbiAgcHVibGljIGNsb3NlKGRhdGE6IGFueSA9IG51bGwpOiB2b2lkIHtcbiAgICB0aGlzLl9kaWFsb2dSZWYuY2xvc2UoZGF0YSk7XG4gIH1cblxuICBwdWJsaWMgYWxsUGVybWlzc2lvbnNDaGFuZ2UoYWxsOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5fdXBkYXRlUGVybWlzc2lvbnMoKTtcbiAgICBpZiAoYWxsKSB7XG4gICAgICB0aGlzLl9hcHBseU1heFBlcm1pc3Npb25BY2Nlc3MoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fYXBwbHlOb25lUGVybWlzc2lvbkFjY2VzcygpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLl9kZXN0cm95JC5uZXh0KG51bGwpO1xuICAgIHRoaXMuX2Rlc3Ryb3kkLmNvbXBsZXRlKCk7XG4gIH1cblxuICBwcml2YXRlIF91cGRhdGVQZXJtaXNzaW9ucygpOiB2b2lkIHtcbiAgICB0aGlzLmxldmVsUGVybWlzc2lvbnMgPSB0aGlzLnBlcm1pc3Npb25zXG4gICAgLmZpbHRlcigocGVybWlzc2lvbikgPT4ge1xuICAgICAgcmV0dXJuIHBlcm1pc3Npb24ubGV2ZWxzLnNvbWUoKGl0ZW0pID0+IHtcbiAgICAgICAgcmV0dXJuIGl0ZW0gPT09IHRoaXMuYWNsUm9sZS5sZXZlbDtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfdXBkYXRlUm9sZUNvbmZpZ3MoKTogdm9pZCB7XG4gICAgaWYodGhpcy5fZGF0YS5sb2FkUm9sZUNvbmZpZ3MpIHtcbiAgICAgIHRoaXMuX2RhdGEubG9hZFJvbGVDb25maWdzKClcbiAgICAgIC5zdWJzY3JpYmUoKHJvbGVDb25maWdzOiBSb2xlQ29uZmlnW10pID0+IHtcbiAgICAgICAgdGhpcy5yb2xlQ29uZmlncyA9IHJvbGVDb25maWdzXG4gICAgICAgICAgLmZpbHRlcigocm9sZUNvbmZpZykgPT4gcm9sZUNvbmZpZy5sZXZlbCA9PT0gdGhpcy5hY2xSb2xlLmxldmVsKTtcbiAgICAgICAgdGhpcy5fY2RSZWYubWFya0ZvckNoZWNrKCk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9hcHBseU1heFBlcm1pc3Npb25BY2Nlc3MoKTogdm9pZCB7XG4gICAgdGhpcy5wZXJtaXNzaW9ucy5mb3JFYWNoKChwZXJtaXNzaW9uKSA9PiB7XG4gICAgICB0aGlzLmFjbFJvbGVQZXJtaXNzaW9uc1twZXJtaXNzaW9uLnZhbHVlXSA9IE1hdGgubWF4KC4uLnBlcm1pc3Npb24uYWNjZXNzZXMpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfYXBwbHlOb25lUGVybWlzc2lvbkFjY2VzcygpOiB2b2lkIHtcbiAgICB0aGlzLnBlcm1pc3Npb25zLmZvckVhY2goKHBlcm1pc3Npb24pID0+IHtcbiAgICAgIHRoaXMuYWNsUm9sZVBlcm1pc3Npb25zW3Blcm1pc3Npb24udmFsdWVdID0gQWNsUm9sZUFjY2Vzcy5Ob25lO1xuICAgIH0pO1xuICB9XG5cbn1cbiIsIjxmb3JtXG4gICAgZnNGb3JtXG4gICAgW3N1Ym1pdF09XCJzYXZlXCI+XG4gIDxmcy1kaWFsb2c+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImFjbFJvbGVcIj5cbiAgICAgIDxkaXYgbWF0LWRpYWxvZy10aXRsZT5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFkaXNhYmxlZFwiPlxuICAgICAgICAgIHt7IGFjbFJvbGUuaWQgPyAnRWRpdCcgOiAnQ3JlYXRlJyB9fVxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImRpc2FibGVkXCI+XG4gICAgICAgICAgVmlld1xuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgUm9sZVxuICAgICAgPC9kaXY+XG4gICAgICA8bWF0LWRpYWxvZy1jb250ZW50PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZnMtcm93LmdhcC1sYXJnZS5hbGlnbi1zdGFydFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmcy1jb2x1bW4gbGVmdC1jb2x1bW5cIj5cbiAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICAgICAgPG1hdC1sYWJlbD5cbiAgICAgICAgICAgICAgICBOYW1lXG4gICAgICAgICAgICAgIDwvbWF0LWxhYmVsPlxuICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICBtYXRJbnB1dFxuICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiYWNsUm9sZS5uYW1lXCJcbiAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgICAgICAgICAgICAgIG5hbWU9XCJuYW1lXCJcbiAgICAgICAgICAgICAgICBmc0Zvcm1SZXF1aXJlZD5cbiAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgICAgIDxtYXQtbGFiZWw+XG4gICAgICAgICAgICAgICAgRGVzY3JpcHRpb25cbiAgICAgICAgICAgICAgPC9tYXQtbGFiZWw+XG4gICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgIG1hdElucHV0XG4gICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJhY2xSb2xlLmRlc2NyaXB0aW9uXCJcbiAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgICAgICAgICAgICAgIG5hbWU9XCJkZXNjcmlwdGlvblwiPlxuICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICAgIDxmcy1sYWJlbC1maWVsZCAqbmdJZj1cImFjbFJvbGUuaWQgfHwgYWNsTGV2ZWxzLmxlbmd0aCA9PT0gMTsgZWxzZSBsZXZlbHNcIj5cbiAgICAgICAgICAgICAgPGZzLWxhYmVsPlxuICAgICAgICAgICAgICAgIExldmVsXG4gICAgICAgICAgICAgIDwvZnMtbGFiZWw+XG4gICAgICAgICAgICAgIHt7IGluZGV4ZWRBY2xMZXZlbHNbYWNsUm9sZS5sZXZlbF0gfX1cbiAgICAgICAgICAgIDwvZnMtbGFiZWwtZmllbGQ+XG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgI2xldmVscz5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxldmVsXCI+XG4gICAgICAgICAgICAgICAgPGZzLXJhZGlvLWdyb3VwXG4gICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiYWNsUm9sZS5sZXZlbFwiXG4gICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXG4gICAgICAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cImxldmVsQ2hhbmdlKClcIlxuICAgICAgICAgICAgICAgICAgICBmc0Zvcm1SZXF1aXJlZFxuICAgICAgICAgICAgICAgICAgICBsYWJlbD1cIkxldmVsXCJcbiAgICAgICAgICAgICAgICAgICAgb3JpZW50YXRpb249XCJ2ZXJ0aWNhbFwiXG4gICAgICAgICAgICAgICAgICAgIG5hbWU9XCJsZXZlbFwiPlxuICAgICAgICAgICAgICAgICAgPG1hdC1yYWRpby1idXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgaXRlbSBvZiBhY2xMZXZlbHNcIlxuICAgICAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJpdGVtLnZhbHVlXCJcbiAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiISFhY2xSb2xlLnByb3RlY3RlZFwiPlxuICAgICAgICAgICAgICAgICAgICB7eyBpdGVtLm5hbWUgfX1cbiAgICAgICAgICAgICAgICAgIDwvbWF0LXJhZGlvLWJ1dHRvbj5cbiAgICAgICAgICAgICAgICA8L2ZzLXJhZGlvLWdyb3VwPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICA8ZnMtbGFiZWwtZmllbGQgKm5nSWY9XCJsZXZlbFBlcm1pc3Npb25zLmxlbmd0aFwiPlxuICAgICAgICAgICAgICA8ZnMtbGFiZWw+XG4gICAgICAgICAgICAgICAgQWxsIFBlcm1pc3Npb25zXG4gICAgICAgICAgICAgIDwvZnMtbGFiZWw+XG4gICAgICAgICAgICAgIDxtYXQtY2hlY2tib3hcbiAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiYWNsUm9sZS5hbGxQZXJtaXNzaW9uc1wiXG4gICAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJhbGxQZXJtaXNzaW9uc0NoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhIWFjbFJvbGUucHJvdGVjdGVkIHx8IGRpc2FibGVkXCJcbiAgICAgICAgICAgICAgICAgIG5hbWU9XCJhbGxQZXJtaXNzaW9uc1wiPlxuICAgICAgICAgICAgICAgIEVuYWJsZVxuICAgICAgICAgICAgICA8L21hdC1jaGVja2JveD5cbiAgICAgICAgICAgIDwvZnMtbGFiZWwtZmllbGQ+XG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgY2xhc3M9XCJmcy1jb2x1bW5cIlxuICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCByb2xlQ29uZmlnIG9mIHJvbGVDb25maWdzXCI+XG4gICAgICAgICAgICAgIDxmcy1sYWJlbC1maWVsZCAqbmdJZj1cInJvbGVDb25maWcudHlwZSA9PT0gJ2NoZWNrYm94J1wiPlxuICAgICAgICAgICAgICAgIDxmcy1sYWJlbD5cbiAgICAgICAgICAgICAgICAgIHt7IHJvbGVDb25maWcubGFiZWwgfX1cbiAgICAgICAgICAgICAgICA8L2ZzLWxhYmVsPlxuICAgICAgICAgICAgICAgIDxtYXQtY2hlY2tib3hcbiAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJhY2xSb2xlQ29uZmlnVmFsdWVzW3JvbGVDb25maWcubmFtZV1cIlxuICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgICAgICAgICAgICAgICAgICBbbmFtZV09XCJyb2xlQ29uZmlnLm5hbWVcIj5cbiAgICAgICAgICAgICAgICAgIEVuYWJsZVxuICAgICAgICAgICAgICAgIDwvbWF0LWNoZWNrYm94PlxuICAgICAgICAgICAgICAgIDxmcy1sYWJlbC1tZXNzYWdlPlxuICAgICAgICAgICAgICAgICAgPG1hdC1oaW50PlxuICAgICAgICAgICAgICAgICAgICB7eyByb2xlQ29uZmlnLmRlc2NyaXB0aW9uIH19XG4gICAgICAgICAgICAgICAgICA8L21hdC1oaW50PlxuICAgICAgICAgICAgICAgIDwvZnMtbGFiZWwtbWVzc2FnZT5cbiAgICAgICAgICAgICAgPC9mcy1sYWJlbC1maWVsZD5cbiAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkICpuZ0lmPVwicm9sZUNvbmZpZy50eXBlID09PSAnc2VsZWN0J1wiPlxuICAgICAgICAgICAgICAgIDxtYXQtc2VsZWN0XG4gICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiYWNsUm9sZUNvbmZpZ1ZhbHVlc1tyb2xlQ29uZmlnLm5hbWVdXCJcbiAgICAgICAgICAgICAgICAgICAgW25hbWVdPVwicm9sZUNvbmZpZy5uYW1lXCJcbiAgICAgICAgICAgICAgICAgICAgW3JlcXVpcmVkXT1cInJvbGVDb25maWcucmVxdWlyZWRcIlxuICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgICAgICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwicm9sZUNvbmZpZy5sYWJlbFwiPlxuICAgICAgICAgICAgICAgICAgPG1hdC1vcHRpb25cbiAgICAgICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgaXRlbSBvZiByb2xlQ29uZmlnLnZhbHVlc1wiXG4gICAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cIml0ZW0udmFsdWVcIj5cbiAgICAgICAgICAgICAgICAgICAge3sgaXRlbS5uYW1lIH19XG4gICAgICAgICAgICAgICAgICA8L21hdC1vcHRpb24+XG4gICAgICAgICAgICAgICAgPC9tYXQtc2VsZWN0PlxuICAgICAgICAgICAgICAgIDxtYXQtaGludD5cbiAgICAgICAgICAgICAgICAgIHt7IHJvbGVDb25maWcuZGVzY3JpcHRpb24gfX1cbiAgICAgICAgICAgICAgICA8L21hdC1oaW50PlxuICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAqbmdJZj1cImFjbFJvbGUubGV2ZWxcIlxuICAgICAgICAgICAgICBbaGlkZGVuXT1cIiFsZXZlbFBlcm1pc3Npb25zLmxlbmd0aFwiXG4gICAgICAgICAgICAgIGNsYXNzPVwicGVybWlzc2lvbnMgZnMtY29sdW1uXCI+XG4gICAgICAgICAgICA8ZnMtbGlzdCBbY29uZmlnXT1cImxpc3RDb25maWdcIj5cbiAgICAgICAgICAgICAgPGZzLWxpc3QtY29sdW1uIHRpdGxlPVwiUGVybWlzc2lvbnNcIj5cbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGVcbiAgICAgICAgICAgICAgICAgICAgZnMtbGlzdC1ncm91cC1jZWxsXG4gICAgICAgICAgICAgICAgICAgIGxldC1yb3c9XCJyb3dcIlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInBlcm1pc3Npb24tZ3JvdXBcIj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwZXJtaXNzaW9uLWdyb3VwXCI+XG4gICAgICAgICAgICAgICAgICAgIHt7IHJvdy5jYXRlZ29yeSB8fCAnR2VuZXJhbCcgfX1cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlXG4gICAgICAgICAgICAgICAgICAgIGZzLWxpc3QtY2VsbFxuICAgICAgICAgICAgICAgICAgICBsZXQtcm93PVwicm93XCI+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicGVybWlzc2lvblwiPlxuICAgICAgICAgICAgICAgICAgICB7eyByb3cubmFtZSB9fVxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGVzY3JpcHRpb24gc21hbGxcIj5cbiAgICAgICAgICAgICAgICAgICAge3sgcm93LmRlc2NyaXB0aW9uIH19XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICA8L2ZzLWxpc3QtY29sdW1uPlxuICAgICAgICAgICAgICA8ZnMtbGlzdC1jb2x1bW5cbiAgICAgICAgICAgICAgICAgIHRpdGxlPVwiQWNjZXNzXCJcbiAgICAgICAgICAgICAgICAgIHdpZHRoPVwiMSVcIlxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJhY2Nlc3NcIj5cbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGVcbiAgICAgICAgICAgICAgICAgICAgZnMtbGlzdC1ncm91cC1jZWxsXG4gICAgICAgICAgICAgICAgICAgIGxldC1yb3c9XCJyb3dcIlxuICAgICAgICAgICAgICAgICAgICBsZXQtZ3JvdXA9XCJncm91cFwiXG4gICAgICAgICAgICAgICAgICAgIGxldC1ncm91cENoaWxkcmVuPVwiZ3JvdXBDaGlsZHJlblwiXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwicGVybWlzc2lvbi1ncm91cFwiXG4gICAgICAgICAgICAgICAgICAgIGFsaWduPVwicmlnaHRcIj5cbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhYWNsUm9sZS5hbGxQZXJtaXNzaW9ucyAmJiAhZGlzYWJsZWRcIj5cbiAgICAgICAgICAgICAgICAgICAgPGZzLW1lbnU+XG4gICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgYWNjZXNzIG9mIEFjbFJvbGVBY2Nlc3NlcyB8IGJ1aWxrT3B0aW9uc0ZpbHRlcjogZ3JvdXBDaGlsZHJlblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnMtbWVudS1pdGVtXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImJ1bGtDaGFuZ2UoYWNjZXNzLnZhbHVlLCBncm91cENoaWxkcmVuLCBncm91cClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAge3sgYWNjZXNzLm5hbWUgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgIDwvZnMtbWVudT5cbiAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlXG4gICAgICAgICAgICAgICAgICAgIGZzLWxpc3QtY2VsbFxuICAgICAgICAgICAgICAgICAgICBsZXQtcm93PVwicGVybWlzc2lvblwiXG4gICAgICAgICAgICAgICAgICAgIGxldC1wZXJtaXNzaW9uPVwicm93XCI+XG4gICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cImFjbFJvbGUuYWxsUGVybWlzc2lvbnMgfHwgZGlzYWJsZWQ7IGVsc2UgZWxzZUFsbFwiPlxuICAgICAgICAgICAgICAgICAgICB7eyBpbmRleGVkQWNjZXNzZXNbYWNsUm9sZVBlcm1pc3Npb25zW3Blcm1pc3Npb24udmFsdWVdXSB9fVxuICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNlbHNlQWxsPlxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwicGVybWlzc2lvbnxhY2xSb2xlUGVybWlzc2lvbkF2YWlsYWJsZTphY2xSb2xlUGVybWlzc2lvbnM7IGVsc2UgcGVybWlzc2lvblJlcXVpcmVzXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwiZm9ybS1maWVsZC1wYWRsZXNzXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LXNlbGVjdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiYWNsUm9sZVBlcm1pc3Npb25zW3Blcm1pc3Npb24udmFsdWVdXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiISFhY2xSb2xlLnByb3RlY3RlZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmFtZV09XCInYWNjZXNzLScgKyBwZXJtaXNzaW9uLnZhbHVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJwZXJtaXNzaW9uQ2hhbmdlKClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgYWNjZXNzIG9mIEFjbFJvbGVBY2Nlc3Nlc1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtb3B0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiYWNjZXNzLnZhbHVlID09PSAwIHx8IHBlcm1pc3Npb24uYWNjZXNzZXMuaW5kZXhPZihhY2Nlc3MudmFsdWUpICE9PSAtMVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJhY2Nlc3MudmFsdWVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGFjY2Vzcy5uYW1lIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LXNlbGVjdD5cbiAgICAgICAgICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNwZXJtaXNzaW9uUmVxdWlyZXM+XG4gICAgICAgICAgICAgICAgICAgICAgVW5hdmFpbGFibGVcbiAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgPC9mcy1saXN0LWNvbHVtbj5cbiAgICAgICAgICAgIDwvZnMtbGlzdD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L21hdC1kaWFsb2ctY29udGVudD5cbiAgICAgIDxtYXQtZGlhbG9nLWFjdGlvbnM+XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICpuZ0lmPVwiIWRpc2FibGVkXCJcbiAgICAgICAgICAgICNzdWJtaXRcbiAgICAgICAgICAgIG1hdC1idXR0b25cbiAgICAgICAgICAgIHR5cGU9XCJzdWJtaXRcIlxuICAgICAgICAgICAgY29sb3I9XCJwcmltYXJ5XCI+XG4gICAgICAgICAge3sgYWNsUm9sZS5pZCA/ICdTYXZlJyA6ICdDcmVhdGUnIH19XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICBtYXQtYnV0dG9uXG4gICAgICAgICAgICBbbWF0LWRpYWxvZy1jbG9zZV09XCJudWxsXCJcbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIj5cbiAgICAgICAgICB7eyBkaXNhYmxlZCA/ICdEb25lJyA6ICdDYW5jZWwnIH19XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9tYXQtZGlhbG9nLWFjdGlvbnM+XG4gICAgPC9uZy1jb250YWluZXI+XG4gIDwvZnMtZGlhbG9nPlxuPC9mb3JtPiJdfQ==
|
|
@@ -371,11 +371,11 @@ class FsAclRoleComponent {
|
|
|
371
371
|
});
|
|
372
372
|
}
|
|
373
373
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: FsAclRoleComponent, deps: [{ token: MAT_DIALOG_DATA }, { token: FsAppAclService }, { token: i2.MatDialogRef }, { token: i3.FsMessage }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
|
|
374
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.7", type: FsAclRoleComponent, selector: "ng-component", viewQueries: [{ propertyName: "list", first: true, predicate: FsListComponent, descendants: true }, { propertyName: "submitButton", first: true, predicate: ["submit"], descendants: true }], ngImport: i0, template: "<form\n fsForm\n [submit]=\"save\">\n <fs-dialog>\n <ng-container *ngIf=\"aclRole\">\n <div mat-dialog-title>\n <ng-container *ngIf=\"!disabled\">\n {{ aclRole.id ? 'Edit' : 'Create' }}\n </ng-container>\n <ng-container *ngIf=\"disabled\">\n View\n </ng-container>\n Role\n </div>\n <mat-dialog-content>\n <div class=\"fs-row.gap-large.align-start\">\n <div class=\"fs-column left-column\">\n <mat-form-field>\n <mat-label>\n Name\n </mat-label>\n <input\n matInput\n [(ngModel)]=\"aclRole.name\"\n [disabled]=\"disabled\"\n name=\"name\"\n fsFormRequired>\n </mat-form-field>\n <mat-form-field>\n <mat-label>\n Description\n </mat-label>\n <input\n matInput\n [(ngModel)]=\"aclRole.description\"\n [disabled]=\"disabled\"\n name=\"description\">\n </mat-form-field>\n <fs-label-field *ngIf=\"aclRole.id || aclLevels.length === 1; else levels\">\n <fs-label>\n Level\n </fs-label>\n {{ indexedAclLevels[aclRole.level] }}\n </fs-label-field>\n <ng-template #levels>\n <div class=\"level\">\n <fs-radio-group\n [(ngModel)]=\"aclRole.level\"\n [disabled]=\"disabled\"\n (ngModelChange)=\"levelChange()\"\n fsFormRequired\n label=\"Level\"\n orientation=\"vertical\"\n name=\"level\">\n <mat-radio-button\n *ngFor=\"let item of aclLevels\"\n [value]=\"item.value\"\n [disabled]=\"!!aclRole.protected\">\n {{ item.name }}\n </mat-radio-button>\n </fs-radio-group>\n </div>\n </ng-template>\n <fs-label-field *ngIf=\"levelPermissions.length\">\n <fs-label>\n All Permissions\n </fs-label>\n <mat-checkbox\n [(ngModel)]=\"aclRole.allPermissions\"\n (ngModelChange)=\"allPermissionsChange($event)\"\n [disabled]=\"!!aclRole.protected || disabled\"\n name=\"allPermissions\">\n Enable\n </mat-checkbox>\n </fs-label-field>\n <div\n class=\"fs-column\"\n *ngFor=\"let roleConfig of roleConfigs\">\n <fs-label-field *ngIf=\"roleConfig.type === 'checkbox'\">\n <fs-label>\n {{ roleConfig.label }}\n </fs-label>\n <mat-checkbox\n [(ngModel)]=\"aclRoleConfigValues[roleConfig.name]\"\n [disabled]=\"disabled\"\n [name]=\"roleConfig.name\">\n Enable\n </mat-checkbox>\n <fs-label-message>\n <mat-hint>\n {{ roleConfig.description }}\n </mat-hint>\n </fs-label-message>\n </fs-label-field>\n <mat-form-field *ngIf=\"roleConfig.type === 'select'\">\n <mat-select\n [(ngModel)]=\"aclRoleConfigValues[roleConfig.name]\"\n [name]=\"roleConfig.name\"\n [required]=\"roleConfig.required\"\n [disabled]=\"disabled\"\n [placeholder]=\"roleConfig.label\">\n <mat-option\n *ngFor=\"let item of roleConfig.values\"\n [value]=\"item.value\">\n {{ item.name }}\n </mat-option>\n </mat-select>\n <mat-hint>\n {{ roleConfig.description }}\n </mat-hint>\n </mat-form-field>\n </div>\n </div>\n <div\n *ngIf=\"aclRole.level\"\n [hidden]=\"!levelPermissions.length\"\n class=\"permissions fs-column\">\n <fs-list [config]=\"listConfig\">\n <fs-list-column title=\"Permissions\">\n <ng-template\n fs-list-group-cell\n let-row=\"row\"\n class=\"permission-group\">\n <div class=\"permission-group\">\n {{ row.category || 'General' }}\n </div>\n </ng-template>\n <ng-template\n fs-list-cell\n let-row=\"row\">\n <div class=\"permission\">\n {{ row.name }}\n </div>\n <div class=\"description small\">\n {{ row.description }}\n </div>\n </ng-template>\n </fs-list-column>\n <fs-list-column\n title=\"Access\"\n width=\"1%\"\n class=\"access\">\n <ng-template\n fs-list-group-cell\n let-row=\"row\"\n let-group=\"group\"\n let-groupChildren=\"groupChildren\"\n class=\"permission-group\"\n align=\"right\">\n <ng-container *ngIf=\"!aclRole.allPermissions && !disabled\">\n <fs-menu>\n <ng-container *ngFor=\"let access of AclRoleAccesses | builkOptionsFilter: groupChildren\">\n <ng-template\n fs-menu-item\n (click)=\"bulkChange(access.value, groupChildren, group)\">\n {{ access.name }}\n </ng-template>\n </ng-container>\n </fs-menu>\n </ng-container>\n </ng-template>\n <ng-template\n fs-list-cell\n let-row=\"permission\"\n let-permission=\"row\">\n <span *ngIf=\"aclRole.allPermissions || disabled; else elseAll\">\n {{ indexedAccesses[aclRolePermissions[permission.value]] }}\n </span>\n <ng-template #elseAll>\n <ng-container *ngIf=\"permission|aclRolePermissionAvailable:aclRolePermissions; else permissionRequires\">\n <mat-form-field>\n <mat-select\n [(ngModel)]=\"aclRolePermissions[permission.value]\"\n [disabled]=\"!!aclRole.protected\"\n required\n class=\"form-field-padless\"\n [name]=\"'access-' + permission.value\"\n (ngModelChange)=\"permissionChange()\">\n <ng-container *ngFor=\"let access of AclRoleAccesses\">\n <mat-option\n *ngIf=\"access.value === 0 || permission.accesses.indexOf(access.value) !== -1\"\n [value]=\"access.value\">\n {{ access.name }}\n </mat-option>\n </ng-container>\n </mat-select>\n </mat-form-field>\n </ng-container>\n <ng-template #permissionRequires>\n Unavailable\n </ng-template>\n </ng-template>\n </ng-template>\n </fs-list-column>\n </fs-list>\n </div>\n </div>\n </mat-dialog-content>\n <mat-dialog-actions>\n <button\n *ngIf=\"!disabled\"\n #submit\n mat-button\n type=\"submit\"\n color=\"primary\">\n {{ aclRole.id ? 'Save' : 'Create' }}\n </button>\n <button\n mat-button\n [mat-dialog-close]=\"null\"\n type=\"button\">\n {{ disabled ? 'Done' : 'Cancel' }}\n </button>\n </mat-dialog-actions>\n </ng-container>\n </fs-dialog>\n</form>", styles: [".permissions{flex:1}.permissions ::ng-deep .fs-list-row-group{background-color:#e4e4e4;font-size:112%}.permissions ::ng-deep fs-list .access{white-space:nowrap}.permissions ::ng-deep .mat-form-field{width:100px}.permissions ::ng-deep .mat-form-field .mat-form-field-wrapper{padding-bottom:0}.permissions ::ng-deep .mat-form-field .mat-form-field-infix{border-top:0}.permissions ::ng-deep .mat-form-field .mat-form-field-underline{bottom:0}.permissions ::ng-deep fs-radio-group{width:100%}.permissions ::ng-deep fs-label-field{width:100%}.permissions .level{width:100%}.left-column{width:40%;max-width:400px}\n"], dependencies: [{ kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i5.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i5.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i5.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i5.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i5.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.MatDialogClose, selector: "[mat-dialog-close], [matDialogClose]", inputs: ["aria-label", "type", "mat-dialog-close", "matDialogClose"], exportAs: ["matDialogClose"] }, { kind: "directive", type: i2.MatDialogTitle, selector: "[mat-dialog-title], [matDialogTitle]", inputs: ["id"], exportAs: ["matDialogTitle"] }, { kind: "directive", type: i2.MatDialogActions, selector: "[mat-dialog-actions], mat-dialog-actions, [matDialogActions]", inputs: ["align"] }, { kind: "directive", type: i2.MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { kind: "component", type: i6.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i6.MatLabel, selector: "mat-label" }, { kind: "directive", type: i6.MatHint, selector: "mat-hint", inputs: ["align", "id"] }, { kind: "component", type: i7.MatCheckbox, selector: "mat-checkbox", inputs: ["aria-label", "aria-labelledby", "aria-describedby", "id", "required", "labelPosition", "name", "value", "disableRipple", "tabIndex", "color", "disabledInteractive", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { kind: "component", type: i8.MatSelect, selector: "mat-select", inputs: ["aria-describedby", "panelClass", "disabled", "disableRipple", "tabIndex", "hideSingleSelectionIndicator", "placeholder", "required", "multiple", "disableOptionCentering", "compareWith", "value", "aria-label", "aria-labelledby", "errorStateMatcher", "typeaheadDebounceInterval", "sortComparator", "id", "panelWidth"], outputs: ["openedChange", "opened", "closed", "selectionChange", "valueChange"], exportAs: ["matSelect"] }, { kind: "component", type: i9.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "component", type: i10.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: i11.MatRadioButton, selector: "mat-radio-button", inputs: ["id", "name", "aria-label", "aria-labelledby", "aria-describedby", "disableRipple", "tabIndex", "checked", "value", "labelPosition", "disabled", "required", "color", "disabledInteractive"], outputs: ["change"], exportAs: ["matRadioButton"] }, { kind: "directive", type: i12.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i13.FsListComponent, selector: "fs-list", inputs: ["config", "loaderLines"], outputs: ["filtersReady"] }, { kind: "directive", type: i13.FsListColumnDirective, selector: "fs-list-column", inputs: ["show", "title", "name", "customize", "sortable", "sortableDefault", "sortableDirection", "direction", "align", "width", "class"] }, { kind: "directive", type: i13.FsListCellDirective, selector: "[fs-list-cell]", inputs: ["colspan", "align", "class"] }, { kind: "directive", type: i13.FsListGroupHeaderDirective, selector: "[fs-list-group-cell],[fs-list-group-header]" }, { kind: "component", type: i14.FsDialogComponent, selector: "fs-dialog", inputs: ["mobileMode", "mobileButtonPlacement", "mobileWidth", "mode", "buttonLayout", "dock", "dockable", "fullscreenPercent"] }, { kind: "directive", type: i15.FsFormDirective, selector: "[fsForm]", inputs: ["wrapperSelector", "messageSelector", "hintSelector", "labelSelector", "autocomplete", "shortcuts", "confirm", "confirmDialog", "confirmDrawer", "confirmBrowser", "confirmTabs", "dirtySubmitButton", "submit", "successDelay", "errorDelay", "tabGroup", "deactivationGuard"], outputs: ["fsForm", "invalid", "valid", "submitted", "reseted", "cleared"], exportAs: ["fsForm"] }, { kind: "directive", type: i15.FsFormRequiredDirective, selector: "[fsFormRequired],[ngModel][required]", inputs: ["fsFormRequired", "required", "fsFormRequiredMessage"] }, { kind: "directive", type: i15.FsFormNoFsValidatorsDirective, selector: "[ngModel]:not([required]):not([fsFormRequired]):not([fsFormCompare]):not([fsFormDateRange]):not([fsFormEmail]):not([fsFormEmails]):not([fsFormFunction]):not([fsFormGreater]):not([fsFormGreaterEqual]):not([fsFormInteger]):not([fsFormLesser]):not([fsFormMax]):not([fsFormMaxLength]):not([fsFormMin]):not([fsFormMinLength]):not([fsFormNumeric]):not([fsFormPattern]):not([fsFormPhone]):not([fsFormUrl]):not([validate])" }, { kind: "directive", type: i15.FsButtonDirective, selector: "[mat-raised-button]:not([fsFormButtonStandalone]),[mat-button]:not([fsFormButtonStandalone]),[mat-flat-button]:not([fsFormButtonStandalone]),[mat-stroked-button]:not([fsFormButtonStandalone])", inputs: ["name", "dirtySubmit", "form"] }, { kind: "component", type: i16.FsLabelComponent, selector: "fs-label" }, { kind: "component", type: i16.FsLabelFieldComponent, selector: "fs-label-field", inputs: ["bottomMargin", "topMargin", "labelMargin"] }, { kind: "component", type: i16.FsLabelMessageComponent, selector: "fs-label-message" }, { kind: "component", type: i17.FsRadioGroupComponent, selector: "fs-radio-group", inputs: ["orientation", "label", "name", "disabled", "radioPosition", "compareWith", "required"] }, { kind: "component", type: i18.FsMenuComponent, selector: "fs-menu", inputs: ["class", "buttonClass", "buttonType", "buttonColor"], outputs: ["opened", "closed"] }, { kind: "directive", type: i18.FsMenuItemDirective, selector: "fs-menu-group,[fs-menu-item]" }, { kind: "pipe", type: BulkOptionsFilterPipe, name: "builkOptionsFilter" }, { kind: "pipe", type: AclRolePermissionAvailablePipe, name: "aclRolePermissionAvailable" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
374
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.7", type: FsAclRoleComponent, selector: "ng-component", viewQueries: [{ propertyName: "list", first: true, predicate: FsListComponent, descendants: true }, { propertyName: "submitButton", first: true, predicate: ["submit"], descendants: true }], ngImport: i0, template: "<form\n fsForm\n [submit]=\"save\">\n <fs-dialog>\n <ng-container *ngIf=\"aclRole\">\n <div mat-dialog-title>\n <ng-container *ngIf=\"!disabled\">\n {{ aclRole.id ? 'Edit' : 'Create' }}\n </ng-container>\n <ng-container *ngIf=\"disabled\">\n View\n </ng-container>\n Role\n </div>\n <mat-dialog-content>\n <div class=\"fs-row.gap-large.align-start\">\n <div class=\"fs-column left-column\">\n <mat-form-field>\n <mat-label>\n Name\n </mat-label>\n <input\n matInput\n [(ngModel)]=\"aclRole.name\"\n [disabled]=\"disabled\"\n name=\"name\"\n fsFormRequired>\n </mat-form-field>\n <mat-form-field>\n <mat-label>\n Description\n </mat-label>\n <input\n matInput\n [(ngModel)]=\"aclRole.description\"\n [disabled]=\"disabled\"\n name=\"description\">\n </mat-form-field>\n <fs-label-field *ngIf=\"aclRole.id || aclLevels.length === 1; else levels\">\n <fs-label>\n Level\n </fs-label>\n {{ indexedAclLevels[aclRole.level] }}\n </fs-label-field>\n <ng-template #levels>\n <div class=\"level\">\n <fs-radio-group\n [(ngModel)]=\"aclRole.level\"\n [disabled]=\"disabled\"\n (ngModelChange)=\"levelChange()\"\n fsFormRequired\n label=\"Level\"\n orientation=\"vertical\"\n name=\"level\">\n <mat-radio-button\n *ngFor=\"let item of aclLevels\"\n [value]=\"item.value\"\n [disabled]=\"!!aclRole.protected\">\n {{ item.name }}\n </mat-radio-button>\n </fs-radio-group>\n </div>\n </ng-template>\n <fs-label-field *ngIf=\"levelPermissions.length\">\n <fs-label>\n All Permissions\n </fs-label>\n <mat-checkbox\n [(ngModel)]=\"aclRole.allPermissions\"\n (ngModelChange)=\"allPermissionsChange($event)\"\n [disabled]=\"!!aclRole.protected || disabled\"\n name=\"allPermissions\">\n Enable\n </mat-checkbox>\n </fs-label-field>\n <div\n class=\"fs-column\"\n *ngFor=\"let roleConfig of roleConfigs\">\n <fs-label-field *ngIf=\"roleConfig.type === 'checkbox'\">\n <fs-label>\n {{ roleConfig.label }}\n </fs-label>\n <mat-checkbox\n [(ngModel)]=\"aclRoleConfigValues[roleConfig.name]\"\n [disabled]=\"disabled\"\n [name]=\"roleConfig.name\">\n Enable\n </mat-checkbox>\n <fs-label-message>\n <mat-hint>\n {{ roleConfig.description }}\n </mat-hint>\n </fs-label-message>\n </fs-label-field>\n <mat-form-field *ngIf=\"roleConfig.type === 'select'\">\n <mat-select\n [(ngModel)]=\"aclRoleConfigValues[roleConfig.name]\"\n [name]=\"roleConfig.name\"\n [required]=\"roleConfig.required\"\n [disabled]=\"disabled\"\n [placeholder]=\"roleConfig.label\">\n <mat-option\n *ngFor=\"let item of roleConfig.values\"\n [value]=\"item.value\">\n {{ item.name }}\n </mat-option>\n </mat-select>\n <mat-hint>\n {{ roleConfig.description }}\n </mat-hint>\n </mat-form-field>\n </div>\n </div>\n <div\n *ngIf=\"aclRole.level\"\n [hidden]=\"!levelPermissions.length\"\n class=\"permissions fs-column\">\n <fs-list [config]=\"listConfig\">\n <fs-list-column title=\"Permissions\">\n <ng-template\n fs-list-group-cell\n let-row=\"row\"\n class=\"permission-group\">\n <div class=\"permission-group\">\n {{ row.category || 'General' }}\n </div>\n </ng-template>\n <ng-template\n fs-list-cell\n let-row=\"row\">\n <div class=\"permission\">\n {{ row.name }}\n </div>\n <div class=\"description small\">\n {{ row.description }}\n </div>\n </ng-template>\n </fs-list-column>\n <fs-list-column\n title=\"Access\"\n width=\"1%\"\n class=\"access\">\n <ng-template\n fs-list-group-cell\n let-row=\"row\"\n let-group=\"group\"\n let-groupChildren=\"groupChildren\"\n class=\"permission-group\"\n align=\"right\">\n <ng-container *ngIf=\"!aclRole.allPermissions && !disabled\">\n <fs-menu>\n <ng-container *ngFor=\"let access of AclRoleAccesses | builkOptionsFilter: groupChildren\">\n <ng-template\n fs-menu-item\n (click)=\"bulkChange(access.value, groupChildren, group)\">\n {{ access.name }}\n </ng-template>\n </ng-container>\n </fs-menu>\n </ng-container>\n </ng-template>\n <ng-template\n fs-list-cell\n let-row=\"permission\"\n let-permission=\"row\">\n <span *ngIf=\"aclRole.allPermissions || disabled; else elseAll\">\n {{ indexedAccesses[aclRolePermissions[permission.value]] }}\n </span>\n <ng-template #elseAll>\n <ng-container *ngIf=\"permission|aclRolePermissionAvailable:aclRolePermissions; else permissionRequires\">\n <mat-form-field class=\"form-field-padless\">\n <mat-select\n [(ngModel)]=\"aclRolePermissions[permission.value]\"\n [disabled]=\"!!aclRole.protected\"\n required\n [name]=\"'access-' + permission.value\"\n (ngModelChange)=\"permissionChange()\">\n <ng-container *ngFor=\"let access of AclRoleAccesses\">\n <mat-option\n *ngIf=\"access.value === 0 || permission.accesses.indexOf(access.value) !== -1\"\n [value]=\"access.value\">\n {{ access.name }}\n </mat-option>\n </ng-container>\n </mat-select>\n </mat-form-field>\n </ng-container>\n <ng-template #permissionRequires>\n Unavailable\n </ng-template>\n </ng-template>\n </ng-template>\n </fs-list-column>\n </fs-list>\n </div>\n </div>\n </mat-dialog-content>\n <mat-dialog-actions>\n <button\n *ngIf=\"!disabled\"\n #submit\n mat-button\n type=\"submit\"\n color=\"primary\">\n {{ aclRole.id ? 'Save' : 'Create' }}\n </button>\n <button\n mat-button\n [mat-dialog-close]=\"null\"\n type=\"button\">\n {{ disabled ? 'Done' : 'Cancel' }}\n </button>\n </mat-dialog-actions>\n </ng-container>\n </fs-dialog>\n</form>", styles: [".permissions{flex:1}.permissions ::ng-deep .fs-list-row-group{background-color:#e4e4e4;font-size:112%}.permissions ::ng-deep fs-list .access{white-space:nowrap}.permissions ::ng-deep .mat-form-field{width:100px}.permissions ::ng-deep .mat-form-field .mat-form-field-wrapper{padding-bottom:0}.permissions ::ng-deep .mat-form-field .mat-form-field-infix{border-top:0}.permissions ::ng-deep .mat-form-field .mat-form-field-underline{bottom:0}.permissions ::ng-deep fs-radio-group{width:100%}.permissions ::ng-deep fs-label-field{width:100%}.permissions .level{width:100%}.left-column{width:40%;max-width:400px}\n"], dependencies: [{ kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i5.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i5.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i5.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i5.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i5.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.MatDialogClose, selector: "[mat-dialog-close], [matDialogClose]", inputs: ["aria-label", "type", "mat-dialog-close", "matDialogClose"], exportAs: ["matDialogClose"] }, { kind: "directive", type: i2.MatDialogTitle, selector: "[mat-dialog-title], [matDialogTitle]", inputs: ["id"], exportAs: ["matDialogTitle"] }, { kind: "directive", type: i2.MatDialogActions, selector: "[mat-dialog-actions], mat-dialog-actions, [matDialogActions]", inputs: ["align"] }, { kind: "directive", type: i2.MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { kind: "component", type: i6.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i6.MatLabel, selector: "mat-label" }, { kind: "directive", type: i6.MatHint, selector: "mat-hint", inputs: ["align", "id"] }, { kind: "component", type: i7.MatCheckbox, selector: "mat-checkbox", inputs: ["aria-label", "aria-labelledby", "aria-describedby", "id", "required", "labelPosition", "name", "value", "disableRipple", "tabIndex", "color", "disabledInteractive", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { kind: "component", type: i8.MatSelect, selector: "mat-select", inputs: ["aria-describedby", "panelClass", "disabled", "disableRipple", "tabIndex", "hideSingleSelectionIndicator", "placeholder", "required", "multiple", "disableOptionCentering", "compareWith", "value", "aria-label", "aria-labelledby", "errorStateMatcher", "typeaheadDebounceInterval", "sortComparator", "id", "panelWidth"], outputs: ["openedChange", "opened", "closed", "selectionChange", "valueChange"], exportAs: ["matSelect"] }, { kind: "component", type: i9.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "component", type: i10.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: i11.MatRadioButton, selector: "mat-radio-button", inputs: ["id", "name", "aria-label", "aria-labelledby", "aria-describedby", "disableRipple", "tabIndex", "checked", "value", "labelPosition", "disabled", "required", "color", "disabledInteractive"], outputs: ["change"], exportAs: ["matRadioButton"] }, { kind: "directive", type: i12.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i13.FsListComponent, selector: "fs-list", inputs: ["config", "loaderLines"], outputs: ["filtersReady"] }, { kind: "directive", type: i13.FsListColumnDirective, selector: "fs-list-column", inputs: ["show", "title", "name", "customize", "sortable", "sortableDefault", "sortableDirection", "direction", "align", "width", "class"] }, { kind: "directive", type: i13.FsListCellDirective, selector: "[fs-list-cell]", inputs: ["colspan", "align", "class"] }, { kind: "directive", type: i13.FsListGroupHeaderDirective, selector: "[fs-list-group-cell],[fs-list-group-header]" }, { kind: "component", type: i14.FsDialogComponent, selector: "fs-dialog", inputs: ["mobileMode", "mobileButtonPlacement", "mobileWidth", "mode", "buttonLayout", "dock", "dockable", "fullscreenPercent"] }, { kind: "directive", type: i15.FsFormDirective, selector: "[fsForm]", inputs: ["wrapperSelector", "messageSelector", "hintSelector", "labelSelector", "autocomplete", "shortcuts", "confirm", "confirmDialog", "confirmDrawer", "confirmBrowser", "confirmTabs", "dirtySubmitButton", "submit", "successDelay", "errorDelay", "tabGroup", "deactivationGuard"], outputs: ["fsForm", "invalid", "valid", "submitted", "reseted", "cleared"], exportAs: ["fsForm"] }, { kind: "directive", type: i15.FsFormRequiredDirective, selector: "[fsFormRequired],[ngModel][required]", inputs: ["fsFormRequired", "required", "fsFormRequiredMessage"] }, { kind: "directive", type: i15.FsFormNoFsValidatorsDirective, selector: "[ngModel]:not([required]):not([fsFormRequired]):not([fsFormCompare]):not([fsFormDateRange]):not([fsFormEmail]):not([fsFormEmails]):not([fsFormFunction]):not([fsFormGreater]):not([fsFormGreaterEqual]):not([fsFormInteger]):not([fsFormLesser]):not([fsFormMax]):not([fsFormMaxLength]):not([fsFormMin]):not([fsFormMinLength]):not([fsFormNumeric]):not([fsFormPattern]):not([fsFormPhone]):not([fsFormUrl]):not([validate])" }, { kind: "directive", type: i15.FsButtonDirective, selector: "[mat-raised-button]:not([fsFormButtonStandalone]),[mat-button]:not([fsFormButtonStandalone]),[mat-flat-button]:not([fsFormButtonStandalone]),[mat-stroked-button]:not([fsFormButtonStandalone])", inputs: ["name", "dirtySubmit", "form"] }, { kind: "component", type: i16.FsLabelComponent, selector: "fs-label" }, { kind: "component", type: i16.FsLabelFieldComponent, selector: "fs-label-field", inputs: ["bottomMargin", "topMargin", "labelMargin"] }, { kind: "component", type: i16.FsLabelMessageComponent, selector: "fs-label-message" }, { kind: "component", type: i17.FsRadioGroupComponent, selector: "fs-radio-group", inputs: ["orientation", "label", "name", "disabled", "radioPosition", "compareWith", "required"] }, { kind: "component", type: i18.FsMenuComponent, selector: "fs-menu", inputs: ["class", "buttonClass", "buttonType", "buttonColor"], outputs: ["opened", "closed"] }, { kind: "directive", type: i18.FsMenuItemDirective, selector: "fs-menu-group,[fs-menu-item]" }, { kind: "pipe", type: BulkOptionsFilterPipe, name: "builkOptionsFilter" }, { kind: "pipe", type: AclRolePermissionAvailablePipe, name: "aclRolePermissionAvailable" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
375
375
|
}
|
|
376
376
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: FsAclRoleComponent, decorators: [{
|
|
377
377
|
type: Component,
|
|
378
|
-
args: [{ changeDetection: ChangeDetectionStrategy.OnPush, template: "<form\n fsForm\n [submit]=\"save\">\n <fs-dialog>\n <ng-container *ngIf=\"aclRole\">\n <div mat-dialog-title>\n <ng-container *ngIf=\"!disabled\">\n {{ aclRole.id ? 'Edit' : 'Create' }}\n </ng-container>\n <ng-container *ngIf=\"disabled\">\n View\n </ng-container>\n Role\n </div>\n <mat-dialog-content>\n <div class=\"fs-row.gap-large.align-start\">\n <div class=\"fs-column left-column\">\n <mat-form-field>\n <mat-label>\n Name\n </mat-label>\n <input\n matInput\n [(ngModel)]=\"aclRole.name\"\n [disabled]=\"disabled\"\n name=\"name\"\n fsFormRequired>\n </mat-form-field>\n <mat-form-field>\n <mat-label>\n Description\n </mat-label>\n <input\n matInput\n [(ngModel)]=\"aclRole.description\"\n [disabled]=\"disabled\"\n name=\"description\">\n </mat-form-field>\n <fs-label-field *ngIf=\"aclRole.id || aclLevels.length === 1; else levels\">\n <fs-label>\n Level\n </fs-label>\n {{ indexedAclLevels[aclRole.level] }}\n </fs-label-field>\n <ng-template #levels>\n <div class=\"level\">\n <fs-radio-group\n [(ngModel)]=\"aclRole.level\"\n [disabled]=\"disabled\"\n (ngModelChange)=\"levelChange()\"\n fsFormRequired\n label=\"Level\"\n orientation=\"vertical\"\n name=\"level\">\n <mat-radio-button\n *ngFor=\"let item of aclLevels\"\n [value]=\"item.value\"\n [disabled]=\"!!aclRole.protected\">\n {{ item.name }}\n </mat-radio-button>\n </fs-radio-group>\n </div>\n </ng-template>\n <fs-label-field *ngIf=\"levelPermissions.length\">\n <fs-label>\n All Permissions\n </fs-label>\n <mat-checkbox\n [(ngModel)]=\"aclRole.allPermissions\"\n (ngModelChange)=\"allPermissionsChange($event)\"\n [disabled]=\"!!aclRole.protected || disabled\"\n name=\"allPermissions\">\n Enable\n </mat-checkbox>\n </fs-label-field>\n <div\n class=\"fs-column\"\n *ngFor=\"let roleConfig of roleConfigs\">\n <fs-label-field *ngIf=\"roleConfig.type === 'checkbox'\">\n <fs-label>\n {{ roleConfig.label }}\n </fs-label>\n <mat-checkbox\n [(ngModel)]=\"aclRoleConfigValues[roleConfig.name]\"\n [disabled]=\"disabled\"\n [name]=\"roleConfig.name\">\n Enable\n </mat-checkbox>\n <fs-label-message>\n <mat-hint>\n {{ roleConfig.description }}\n </mat-hint>\n </fs-label-message>\n </fs-label-field>\n <mat-form-field *ngIf=\"roleConfig.type === 'select'\">\n <mat-select\n [(ngModel)]=\"aclRoleConfigValues[roleConfig.name]\"\n [name]=\"roleConfig.name\"\n [required]=\"roleConfig.required\"\n [disabled]=\"disabled\"\n [placeholder]=\"roleConfig.label\">\n <mat-option\n *ngFor=\"let item of roleConfig.values\"\n [value]=\"item.value\">\n {{ item.name }}\n </mat-option>\n </mat-select>\n <mat-hint>\n {{ roleConfig.description }}\n </mat-hint>\n </mat-form-field>\n </div>\n </div>\n <div\n *ngIf=\"aclRole.level\"\n [hidden]=\"!levelPermissions.length\"\n class=\"permissions fs-column\">\n <fs-list [config]=\"listConfig\">\n <fs-list-column title=\"Permissions\">\n <ng-template\n fs-list-group-cell\n let-row=\"row\"\n class=\"permission-group\">\n <div class=\"permission-group\">\n {{ row.category || 'General' }}\n </div>\n </ng-template>\n <ng-template\n fs-list-cell\n let-row=\"row\">\n <div class=\"permission\">\n {{ row.name }}\n </div>\n <div class=\"description small\">\n {{ row.description }}\n </div>\n </ng-template>\n </fs-list-column>\n <fs-list-column\n title=\"Access\"\n width=\"1%\"\n class=\"access\">\n <ng-template\n fs-list-group-cell\n let-row=\"row\"\n let-group=\"group\"\n let-groupChildren=\"groupChildren\"\n class=\"permission-group\"\n align=\"right\">\n <ng-container *ngIf=\"!aclRole.allPermissions && !disabled\">\n <fs-menu>\n <ng-container *ngFor=\"let access of AclRoleAccesses | builkOptionsFilter: groupChildren\">\n <ng-template\n fs-menu-item\n (click)=\"bulkChange(access.value, groupChildren, group)\">\n {{ access.name }}\n </ng-template>\n </ng-container>\n </fs-menu>\n </ng-container>\n </ng-template>\n <ng-template\n fs-list-cell\n let-row=\"permission\"\n let-permission=\"row\">\n <span *ngIf=\"aclRole.allPermissions || disabled; else elseAll\">\n {{ indexedAccesses[aclRolePermissions[permission.value]] }}\n </span>\n <ng-template #elseAll>\n <ng-container *ngIf=\"permission|aclRolePermissionAvailable:aclRolePermissions; else permissionRequires\">\n <mat-form-field>\n <mat-select\n [(ngModel)]=\"aclRolePermissions[permission.value]\"\n [disabled]=\"!!aclRole.protected\"\n required\n
|
|
378
|
+
args: [{ changeDetection: ChangeDetectionStrategy.OnPush, template: "<form\n fsForm\n [submit]=\"save\">\n <fs-dialog>\n <ng-container *ngIf=\"aclRole\">\n <div mat-dialog-title>\n <ng-container *ngIf=\"!disabled\">\n {{ aclRole.id ? 'Edit' : 'Create' }}\n </ng-container>\n <ng-container *ngIf=\"disabled\">\n View\n </ng-container>\n Role\n </div>\n <mat-dialog-content>\n <div class=\"fs-row.gap-large.align-start\">\n <div class=\"fs-column left-column\">\n <mat-form-field>\n <mat-label>\n Name\n </mat-label>\n <input\n matInput\n [(ngModel)]=\"aclRole.name\"\n [disabled]=\"disabled\"\n name=\"name\"\n fsFormRequired>\n </mat-form-field>\n <mat-form-field>\n <mat-label>\n Description\n </mat-label>\n <input\n matInput\n [(ngModel)]=\"aclRole.description\"\n [disabled]=\"disabled\"\n name=\"description\">\n </mat-form-field>\n <fs-label-field *ngIf=\"aclRole.id || aclLevels.length === 1; else levels\">\n <fs-label>\n Level\n </fs-label>\n {{ indexedAclLevels[aclRole.level] }}\n </fs-label-field>\n <ng-template #levels>\n <div class=\"level\">\n <fs-radio-group\n [(ngModel)]=\"aclRole.level\"\n [disabled]=\"disabled\"\n (ngModelChange)=\"levelChange()\"\n fsFormRequired\n label=\"Level\"\n orientation=\"vertical\"\n name=\"level\">\n <mat-radio-button\n *ngFor=\"let item of aclLevels\"\n [value]=\"item.value\"\n [disabled]=\"!!aclRole.protected\">\n {{ item.name }}\n </mat-radio-button>\n </fs-radio-group>\n </div>\n </ng-template>\n <fs-label-field *ngIf=\"levelPermissions.length\">\n <fs-label>\n All Permissions\n </fs-label>\n <mat-checkbox\n [(ngModel)]=\"aclRole.allPermissions\"\n (ngModelChange)=\"allPermissionsChange($event)\"\n [disabled]=\"!!aclRole.protected || disabled\"\n name=\"allPermissions\">\n Enable\n </mat-checkbox>\n </fs-label-field>\n <div\n class=\"fs-column\"\n *ngFor=\"let roleConfig of roleConfigs\">\n <fs-label-field *ngIf=\"roleConfig.type === 'checkbox'\">\n <fs-label>\n {{ roleConfig.label }}\n </fs-label>\n <mat-checkbox\n [(ngModel)]=\"aclRoleConfigValues[roleConfig.name]\"\n [disabled]=\"disabled\"\n [name]=\"roleConfig.name\">\n Enable\n </mat-checkbox>\n <fs-label-message>\n <mat-hint>\n {{ roleConfig.description }}\n </mat-hint>\n </fs-label-message>\n </fs-label-field>\n <mat-form-field *ngIf=\"roleConfig.type === 'select'\">\n <mat-select\n [(ngModel)]=\"aclRoleConfigValues[roleConfig.name]\"\n [name]=\"roleConfig.name\"\n [required]=\"roleConfig.required\"\n [disabled]=\"disabled\"\n [placeholder]=\"roleConfig.label\">\n <mat-option\n *ngFor=\"let item of roleConfig.values\"\n [value]=\"item.value\">\n {{ item.name }}\n </mat-option>\n </mat-select>\n <mat-hint>\n {{ roleConfig.description }}\n </mat-hint>\n </mat-form-field>\n </div>\n </div>\n <div\n *ngIf=\"aclRole.level\"\n [hidden]=\"!levelPermissions.length\"\n class=\"permissions fs-column\">\n <fs-list [config]=\"listConfig\">\n <fs-list-column title=\"Permissions\">\n <ng-template\n fs-list-group-cell\n let-row=\"row\"\n class=\"permission-group\">\n <div class=\"permission-group\">\n {{ row.category || 'General' }}\n </div>\n </ng-template>\n <ng-template\n fs-list-cell\n let-row=\"row\">\n <div class=\"permission\">\n {{ row.name }}\n </div>\n <div class=\"description small\">\n {{ row.description }}\n </div>\n </ng-template>\n </fs-list-column>\n <fs-list-column\n title=\"Access\"\n width=\"1%\"\n class=\"access\">\n <ng-template\n fs-list-group-cell\n let-row=\"row\"\n let-group=\"group\"\n let-groupChildren=\"groupChildren\"\n class=\"permission-group\"\n align=\"right\">\n <ng-container *ngIf=\"!aclRole.allPermissions && !disabled\">\n <fs-menu>\n <ng-container *ngFor=\"let access of AclRoleAccesses | builkOptionsFilter: groupChildren\">\n <ng-template\n fs-menu-item\n (click)=\"bulkChange(access.value, groupChildren, group)\">\n {{ access.name }}\n </ng-template>\n </ng-container>\n </fs-menu>\n </ng-container>\n </ng-template>\n <ng-template\n fs-list-cell\n let-row=\"permission\"\n let-permission=\"row\">\n <span *ngIf=\"aclRole.allPermissions || disabled; else elseAll\">\n {{ indexedAccesses[aclRolePermissions[permission.value]] }}\n </span>\n <ng-template #elseAll>\n <ng-container *ngIf=\"permission|aclRolePermissionAvailable:aclRolePermissions; else permissionRequires\">\n <mat-form-field class=\"form-field-padless\">\n <mat-select\n [(ngModel)]=\"aclRolePermissions[permission.value]\"\n [disabled]=\"!!aclRole.protected\"\n required\n [name]=\"'access-' + permission.value\"\n (ngModelChange)=\"permissionChange()\">\n <ng-container *ngFor=\"let access of AclRoleAccesses\">\n <mat-option\n *ngIf=\"access.value === 0 || permission.accesses.indexOf(access.value) !== -1\"\n [value]=\"access.value\">\n {{ access.name }}\n </mat-option>\n </ng-container>\n </mat-select>\n </mat-form-field>\n </ng-container>\n <ng-template #permissionRequires>\n Unavailable\n </ng-template>\n </ng-template>\n </ng-template>\n </fs-list-column>\n </fs-list>\n </div>\n </div>\n </mat-dialog-content>\n <mat-dialog-actions>\n <button\n *ngIf=\"!disabled\"\n #submit\n mat-button\n type=\"submit\"\n color=\"primary\">\n {{ aclRole.id ? 'Save' : 'Create' }}\n </button>\n <button\n mat-button\n [mat-dialog-close]=\"null\"\n type=\"button\">\n {{ disabled ? 'Done' : 'Cancel' }}\n </button>\n </mat-dialog-actions>\n </ng-container>\n </fs-dialog>\n</form>", styles: [".permissions{flex:1}.permissions ::ng-deep .fs-list-row-group{background-color:#e4e4e4;font-size:112%}.permissions ::ng-deep fs-list .access{white-space:nowrap}.permissions ::ng-deep .mat-form-field{width:100px}.permissions ::ng-deep .mat-form-field .mat-form-field-wrapper{padding-bottom:0}.permissions ::ng-deep .mat-form-field .mat-form-field-infix{border-top:0}.permissions ::ng-deep .mat-form-field .mat-form-field-underline{bottom:0}.permissions ::ng-deep fs-radio-group{width:100%}.permissions ::ng-deep fs-label-field{width:100%}.permissions .level{width:100%}.left-column{width:40%;max-width:400px}\n"] }]
|
|
379
379
|
}], ctorParameters: () => [{ type: undefined, decorators: [{
|
|
380
380
|
type: Inject,
|
|
381
381
|
args: [MAT_DIALOG_DATA]
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"firestitch-app-acl.mjs","sources":["../../src/app/enums/acl-role-access.ts","../../src/app/consts/acl-role-accesses.ts","../../src/app/injectors/app-acl-config.injector.ts","../../src/app/services/app-acl.service.ts","../../src/app/pipes/bulk-options-filter.pipe.ts","../../src/app/pipes/acl-role-permission-available.pipe.ts","../../src/app/components/acl-role/acl-role.component.ts","../../src/app/components/acl-role/acl-role.component.html","../../src/app/components/acl-permission-popover/acl-permission-popover.component.ts","../../src/app/components/acl-permission-popover/acl-permission-popover.component.html","../../src/app/components/acl-roles/acl-roles.component.ts","../../src/app/components/acl-roles/acl-roles.component.html","../../src/app/components/acl-role-popover/acl-role-popover.component.ts","../../src/app/components/acl-role-popover/acl-role-popover.component.html","../../src/app/components/acl-object-roles/acl-object-roles.component.ts","../../src/app/components/acl-object-roles/acl-object-roles.component.html","../../src/app/components/acl-entry/acl-entry.component.ts","../../src/app/components/acl-entry/acl-entry.component.html","../../src/app/components/acl-entries/acl-entries.component.ts","../../src/app/components/acl-entries/acl-entries.component.html","../../src/app/fs-app-acl.module.ts","../../src/firestitch-app-acl.ts"],"sourcesContent":["export enum AclRoleAccess {\n None = 0,\n Read = 5,\n Write = 10,\n Full = 15,\n}\n","\nimport { AclRoleAccess } from '../enums/acl-role-access';\n\nexport const AclRoleAccesses = [\n { name: 'None', value: AclRoleAccess.None },\n { name: 'Read', value: AclRoleAccess.Read },\n { name: 'Write', value: AclRoleAccess.Write },\n { name: 'Full', value: AclRoleAccess.Full }\n];\n","import { InjectionToken } from '@angular/core';\n\nexport const FS_APP_ACL_CONFIG = new InjectionToken<any[]>('fs-app-acl-config');\n","import { Injectable, Inject } from '@angular/core';\n\nimport { list } from '@firestitch/common';\n\nimport { map } from 'rxjs/operators';\nimport { ReplaySubject } from 'rxjs';\n\n\nimport { FS_APP_ACL_CONFIG } from './../injectors/app-acl-config.injector';\nimport { AppAclConfig } from './../interfaces/app-acl-config';\nimport { AclPermission } from './../interfaces/acl-permission';\nimport { AclLevel } from './../interfaces/acl-level';\n\n\n@Injectable({\n providedIn: 'root',\n})\nexport class FsAppAclService {\n\n private _permissions$: ReplaySubject<AclPermission[]>;\n private _levels$: ReplaySubject<AclLevel[]>;\n\n constructor(\n @Inject(FS_APP_ACL_CONFIG) private _appAclConfig: AppAclConfig,\n ) { }\n\n public getPermissions() {\n\n if (!this._permissions$) {\n this._permissions$ = new ReplaySubject();\n\n this._appAclConfig.permissions\n .subscribe((permissions) => {\n this._permissions$.next(permissions);\n this._permissions$.complete();\n });\n }\n\n return this._permissions$;\n }\n\n public getLevels() {\n\n if (!this._levels$) {\n this._levels$ = new ReplaySubject();\n\n this._appAclConfig.levels\n .subscribe((levels) => {\n this._levels$.next(levels);\n this._levels$.complete();\n });\n }\n\n return this._levels$;\n }\n\n\n public getIndexedLevels() {\n return this.getLevels()\n .pipe(\n map((data) => {\n return list(data, 'name', 'value');\n })\n );\n }\n}\n","import { Pipe, PipeTransform } from '@angular/core';\n\nimport { AclRoleAccess } from '../enums/acl-role-access';\nimport { AclPermission } from '../interfaces/acl-permission';\n\n\n@Pipe({\n name: 'builkOptionsFilter'\n})\nexport class BulkOptionsFilterPipe implements PipeTransform {\n\n public transform(rolesList: { name: string, value: AclRoleAccess }[], children: AclPermission[]): any {\n const accessLevels = this._uniqListOfAccessLevels(children);\n\n return rolesList.filter((permission) => {\n return permission.value === 0 || accessLevels.has(permission.value);\n });\n }\n\n private _uniqListOfAccessLevels(children: AclPermission[]): Set<number> {\n return children.reduce((acc, value: AclPermission) => {\n value.accesses.forEach((access) => {\n acc.add(access);\n })\n\n return acc;\n }, (new Set) as Set<number>);\n }\n}\n","import { Pipe, PipeTransform } from '@angular/core';\n\n\n@Pipe({\n name: 'aclRolePermissionAvailable'\n})\nexport class AclRolePermissionAvailablePipe implements PipeTransform {\n\n public transform(permission, aclRolePermissions): boolean {\n if(permission.requires && permission.requires.length) {\n \n const exists = permission.requires\n .every((item) => aclRolePermissions[item]);\n\n return exists;\n }\n \n return true;\n }\n}\n","import {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n Inject,\n OnDestroy,\n OnInit,\n ViewChild\n} from '@angular/core';\nimport { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog';\n\nimport { AclRoleAccesses } from './../../consts/acl-role-accesses';\nimport { AclRole } from './../../interfaces/acl-role';\nimport { takeUntil, tap } from 'rxjs/operators';\n\nimport { FsMessage } from '@firestitch/message';\nimport { list } from '@firestitch/common';\nimport { FsListComponent, FsListConfig } from '@firestitch/list';\n\nimport { forkJoin, Observable, of, Subject } from 'rxjs';\nimport { FsAppAclService } from './../../services/app-acl.service';\nimport { RoleConfig } from '../../interfaces';\nimport { AclRoleAccess } from '../../enums/acl-role-access';\nimport { MatButton } from '@angular/material/button';\n\n\n@Component({\n templateUrl: './acl-role.component.html',\n styleUrls: ['./acl-role.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class FsAclRoleComponent implements OnInit, OnDestroy {\n\n @ViewChild(FsListComponent)\n public list: FsListComponent;\n\n @ViewChild('submit', { static: false })\n public submitButton: MatButton;\n\n public aclRole: AclRole = null;\n public environment;\n public permissions: any[] = [];\n public listConfig: FsListConfig;\n public levelPermissions = [];\n public AclRoleAccesses = AclRoleAccesses;\n public indexedAccesses = {};\n public aclLevels: any[] = [];\n public indexedAclLevels = {};\n public onlyFullAccess = false;\n public AclLevels = {};\n public roleConfigs: RoleConfig[] = [];\n public aclRoleConfigValues = {};\n public aclRolePermissions = {};\n public loadRoleConfigs: (aclRole: AclRole, query) => Observable<RoleConfig[]>;\n public disabled: boolean;\n\n private _destroy$ = new Subject();\n\n constructor(\n @Inject(MAT_DIALOG_DATA) private readonly _data: any,\n private readonly _appAclService: FsAppAclService,\n private readonly _dialogRef: MatDialogRef<FsAclRoleComponent>,\n private readonly _message: FsMessage,\n private _cdRef: ChangeDetectorRef,\n ) { }\n\n public ngOnInit(): void {\n forkJoin(\n this.getRole(),\n this._appAclService.getPermissions(),\n )\n .pipe(takeUntil(this._destroy$))\n .subscribe(([\n aclRole,\n aclPermissions,\n ]) => {\n\n this.permissions = aclPermissions;\n this.aclLevels = this._data.aclLevels;\n this.disabled = this._data.disabled;\n\n this.indexedAclLevels = list(this.aclLevels, 'name', 'value');\n this.indexedAccesses = list(AclRoleAccesses, 'name', 'value');\n\n this.aclRole = {\n ...{\n aclPermissions: [],\n allPermissions: true,\n aclRoleConfigs: [],\n permissions: {},\n level: this.aclLevels[0].value,\n },\n ...aclRole,\n };\n\n this.aclRoleConfigValues = (aclRole.aclRoleConfigs || [])\n .reduce((accum, aclRoleConfig) => {\n return {\n ...accum,\n [aclRoleConfig.name]: aclRoleConfig.value,\n }\n }, {});\n\n if (this.aclRole.id) {\n this.permissions.forEach((permission) => {\n let access = 0;\n\n const aclPermission = this.aclRole.aclPermissions.find((item) => {\n return item.permission === permission.value;\n });\n\n if (aclPermission) {\n access = aclPermission.access;\n }\n\n this.aclRolePermissions[permission.value] = access;\n });\n }\n\n if (this.aclRole.allPermissions) {\n this._applyMaxPermissionAccess();\n }\n\n this._updatePermissions();\n this._updateRoleConfigs();\n\n this._cdRef.markForCheck();\n });\n\n this.listConfig = {\n status: false,\n paging: false,\n rowHoverHighlight: false,\n noResults: {\n message: '',\n },\n group: {\n initialExpand: true,\n groupBy: (data) => {\n return data;\n },\n compareBy: (data) => {\n return data.category || 'General';\n },\n },\n fetch: () => {\n return of({\n data: this.levelPermissions.sort((a, b) => {\n a = a.name.toUpperCase();\n b = b.name.toUpperCase();\n if (a < b) {\n return -1;\n } else if (a > b) {\n return 1;\n }\n\n return 0;\n }),\n });\n },\n };\n }\n\n public bulkChange(value: number, groupChildren, group): void {\n groupChildren\n .forEach((permission) => {\n const access = permission.accesses\n .find((access) => value === access);\n\n if(access || !value) {\n this.aclRolePermissions[permission.value] = value;\n }\n });\n\n setTimeout(() => {\n this.submitButton.disabled = false;\n this.permissionChange();\n });\n }\n\n public permissionChange(): void {\n this.aclRolePermissions = {\n ...this.aclRolePermissions, \n };\n this._cdRef.markForCheck();\n }\n\n public levelChange(): void {\n this._updatePermissions();\n this._updateRoleConfigs();\n this.list.reload();\n }\n\n public getRole(): Observable<any> {\n if (!this._data.aclRole.id) {\n return of(this._data.aclRole);\n }\n\n const query: any = {\n aclPermissions: true,\n aclRoleConfigs: true,\n };\n\n if (!this.environment) {\n query.environmentId = null;\n }\n\n return this._data.loadAclRole(this._data.aclRole, query);\n }\n\n public save = (): Observable<any> => {\n const aclRoleConfigs = this.roleConfigs\n .map((roleConfig) => {\n return {\n name: roleConfig.name,\n value: this.aclRoleConfigValues[roleConfig.name],\n }\n });\n\n const aclRole = {\n ...this.aclRole,\n permissions: this.levelPermissions.map((permission) => {\n return {\n value: permission.value,\n access: this.aclRolePermissions[permission.value] || 0,\n };\n }),\n aclRoleConfigs,\n };\n\n return this._data.saveAclRole(aclRole)\n .pipe(\n tap((response) => {\n this._message.success('Saved Changes');\n this.close(response);\n }),\n );\n }\n\n public close(data: any = null): void {\n this._dialogRef.close(data);\n }\n\n public allPermissionsChange(all: boolean): void {\n this._updatePermissions();\n if (all) {\n this._applyMaxPermissionAccess();\n } else {\n this._applyNonePermissionAccess();\n }\n }\n\n public ngOnDestroy(): void {\n this._destroy$.next(null);\n this._destroy$.complete();\n }\n\n private _updatePermissions(): void {\n this.levelPermissions = this.permissions\n .filter((permission) => {\n return permission.levels.some((item) => {\n return item === this.aclRole.level;\n });\n });\n }\n\n private _updateRoleConfigs(): void {\n if(this._data.loadRoleConfigs) {\n this._data.loadRoleConfigs()\n .subscribe((roleConfigs: RoleConfig[]) => {\n this.roleConfigs = roleConfigs\n .filter((roleConfig) => roleConfig.level === this.aclRole.level);\n this._cdRef.markForCheck();\n });\n }\n }\n\n private _applyMaxPermissionAccess(): void {\n this.permissions.forEach((permission) => {\n this.aclRolePermissions[permission.value] = Math.max(...permission.accesses);\n });\n }\n\n private _applyNonePermissionAccess(): void {\n this.permissions.forEach((permission) => {\n this.aclRolePermissions[permission.value] = AclRoleAccess.None;\n });\n }\n\n}\n","<form\n fsForm\n [submit]=\"save\">\n <fs-dialog>\n <ng-container *ngIf=\"aclRole\">\n <div mat-dialog-title>\n <ng-container *ngIf=\"!disabled\">\n {{ aclRole.id ? 'Edit' : 'Create' }}\n </ng-container>\n <ng-container *ngIf=\"disabled\">\n View\n </ng-container>\n Role\n </div>\n <mat-dialog-content>\n <div class=\"fs-row.gap-large.align-start\">\n <div class=\"fs-column left-column\">\n <mat-form-field>\n <mat-label>\n Name\n </mat-label>\n <input\n matInput\n [(ngModel)]=\"aclRole.name\"\n [disabled]=\"disabled\"\n name=\"name\"\n fsFormRequired>\n </mat-form-field>\n <mat-form-field>\n <mat-label>\n Description\n </mat-label>\n <input\n matInput\n [(ngModel)]=\"aclRole.description\"\n [disabled]=\"disabled\"\n name=\"description\">\n </mat-form-field>\n <fs-label-field *ngIf=\"aclRole.id || aclLevels.length === 1; else levels\">\n <fs-label>\n Level\n </fs-label>\n {{ indexedAclLevels[aclRole.level] }}\n </fs-label-field>\n <ng-template #levels>\n <div class=\"level\">\n <fs-radio-group\n [(ngModel)]=\"aclRole.level\"\n [disabled]=\"disabled\"\n (ngModelChange)=\"levelChange()\"\n fsFormRequired\n label=\"Level\"\n orientation=\"vertical\"\n name=\"level\">\n <mat-radio-button\n *ngFor=\"let item of aclLevels\"\n [value]=\"item.value\"\n [disabled]=\"!!aclRole.protected\">\n {{ item.name }}\n </mat-radio-button>\n </fs-radio-group>\n </div>\n </ng-template>\n <fs-label-field *ngIf=\"levelPermissions.length\">\n <fs-label>\n All Permissions\n </fs-label>\n <mat-checkbox\n [(ngModel)]=\"aclRole.allPermissions\"\n (ngModelChange)=\"allPermissionsChange($event)\"\n [disabled]=\"!!aclRole.protected || disabled\"\n name=\"allPermissions\">\n Enable\n </mat-checkbox>\n </fs-label-field>\n <div\n class=\"fs-column\"\n *ngFor=\"let roleConfig of roleConfigs\">\n <fs-label-field *ngIf=\"roleConfig.type === 'checkbox'\">\n <fs-label>\n {{ roleConfig.label }}\n </fs-label>\n <mat-checkbox\n [(ngModel)]=\"aclRoleConfigValues[roleConfig.name]\"\n [disabled]=\"disabled\"\n [name]=\"roleConfig.name\">\n Enable\n </mat-checkbox>\n <fs-label-message>\n <mat-hint>\n {{ roleConfig.description }}\n </mat-hint>\n </fs-label-message>\n </fs-label-field>\n <mat-form-field *ngIf=\"roleConfig.type === 'select'\">\n <mat-select\n [(ngModel)]=\"aclRoleConfigValues[roleConfig.name]\"\n [name]=\"roleConfig.name\"\n [required]=\"roleConfig.required\"\n [disabled]=\"disabled\"\n [placeholder]=\"roleConfig.label\">\n <mat-option\n *ngFor=\"let item of roleConfig.values\"\n [value]=\"item.value\">\n {{ item.name }}\n </mat-option>\n </mat-select>\n <mat-hint>\n {{ roleConfig.description }}\n </mat-hint>\n </mat-form-field>\n </div>\n </div>\n <div\n *ngIf=\"aclRole.level\"\n [hidden]=\"!levelPermissions.length\"\n class=\"permissions fs-column\">\n <fs-list [config]=\"listConfig\">\n <fs-list-column title=\"Permissions\">\n <ng-template\n fs-list-group-cell\n let-row=\"row\"\n class=\"permission-group\">\n <div class=\"permission-group\">\n {{ row.category || 'General' }}\n </div>\n </ng-template>\n <ng-template\n fs-list-cell\n let-row=\"row\">\n <div class=\"permission\">\n {{ row.name }}\n </div>\n <div class=\"description small\">\n {{ row.description }}\n </div>\n </ng-template>\n </fs-list-column>\n <fs-list-column\n title=\"Access\"\n width=\"1%\"\n class=\"access\">\n <ng-template\n fs-list-group-cell\n let-row=\"row\"\n let-group=\"group\"\n let-groupChildren=\"groupChildren\"\n class=\"permission-group\"\n align=\"right\">\n <ng-container *ngIf=\"!aclRole.allPermissions && !disabled\">\n <fs-menu>\n <ng-container *ngFor=\"let access of AclRoleAccesses | builkOptionsFilter: groupChildren\">\n <ng-template\n fs-menu-item\n (click)=\"bulkChange(access.value, groupChildren, group)\">\n {{ access.name }}\n </ng-template>\n </ng-container>\n </fs-menu>\n </ng-container>\n </ng-template>\n <ng-template\n fs-list-cell\n let-row=\"permission\"\n let-permission=\"row\">\n <span *ngIf=\"aclRole.allPermissions || disabled; else elseAll\">\n {{ indexedAccesses[aclRolePermissions[permission.value]] }}\n </span>\n <ng-template #elseAll>\n <ng-container *ngIf=\"permission|aclRolePermissionAvailable:aclRolePermissions; else permissionRequires\">\n <mat-form-field>\n <mat-select\n [(ngModel)]=\"aclRolePermissions[permission.value]\"\n [disabled]=\"!!aclRole.protected\"\n required\n class=\"form-field-padless\"\n [name]=\"'access-' + permission.value\"\n (ngModelChange)=\"permissionChange()\">\n <ng-container *ngFor=\"let access of AclRoleAccesses\">\n <mat-option\n *ngIf=\"access.value === 0 || permission.accesses.indexOf(access.value) !== -1\"\n [value]=\"access.value\">\n {{ access.name }}\n </mat-option>\n </ng-container>\n </mat-select>\n </mat-form-field>\n </ng-container>\n <ng-template #permissionRequires>\n Unavailable\n </ng-template>\n </ng-template>\n </ng-template>\n </fs-list-column>\n </fs-list>\n </div>\n </div>\n </mat-dialog-content>\n <mat-dialog-actions>\n <button\n *ngIf=\"!disabled\"\n #submit\n mat-button\n type=\"submit\"\n color=\"primary\">\n {{ aclRole.id ? 'Save' : 'Create' }}\n </button>\n <button\n mat-button\n [mat-dialog-close]=\"null\"\n type=\"button\">\n {{ disabled ? 'Done' : 'Cancel' }}\n </button>\n </mat-dialog-actions>\n </ng-container>\n </fs-dialog>\n</form>","import { Component, OnInit, Input, Inject } from '@angular/core';\nimport { FsAppAclService } from './../../services/app-acl.service';\n\n@Component({\n selector: 'acl-permission-popover',\n templateUrl: './acl-permission-popover.component.html',\n styleUrls: ['./acl-permission-popover.component.scss']\n})\nexport class FsAclPermissionPopoverComponent implements OnInit {\n\n @Input() permission;\n\n public description;\n\n public constructor(\n private _appAclService: FsAppAclService\n ) { }\n\n public ngOnInit() {\n this._appAclService.getPermissions()\n .subscribe(permissions => {\n this.description = permissions.filter(item => {\n return item.value === this.permission.value;\n }).map(item => {\n return item.description;\n })[0];\n });\n }\n}\n","\n<fs-popover [template]=\"popover\" [maxWidth]=\"400\">\n <ng-content></ng-content>\n</fs-popover>\n\n<ng-template #popover>\n {{permission.name}}\n <div class=\"small\">{{description}}</div>\n</ng-template>\n\n","import { takeUntil, filter, map, tap } from 'rxjs/operators';\nimport { Component, OnInit, OnDestroy, ChangeDetectionStrategy, Input, ChangeDetectorRef, ViewChildren, QueryList } from '@angular/core';\n\nimport { MatDialog } from '@angular/material/dialog';\n\nimport { FsListComponent, FsListConfig } from '@firestitch/list';\nimport { ItemType } from '@firestitch/filter';\nimport { list } from '@firestitch/common';\n\nimport { Subject, Observable } from 'rxjs';\n\nimport { AclRole } from './../../interfaces/acl-role';\nimport { AclLevel } from './../../interfaces/acl-level';\nimport { FsAclRoleComponent } from '../acl-role/acl-role.component';\nimport { FsAppAclService } from '../../services/app-acl.service';\nimport { RoleConfig } from '../../interfaces';\n\n\n@Component({\n selector: 'fs-acl-roles',\n templateUrl: 'acl-roles.component.html',\n styleUrls: [ 'acl-roles.component.scss' ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class FsAclRolesComponent implements OnInit, OnDestroy {\n\n @Input() deleteAclRole: (aclRole: AclRole) => Observable<AclRole>;\n @Input() restoreAclRole: (aclRole: AclRole) => Observable<AclRole>;\n @Input() saveAclRole: (aclRole: AclRole) => Observable<AclRole>;\n @Input() loadAclRoles: (query: any) => Observable<{ data: AclRole[], paging: any }>;\n @Input() loadAclRole: (aclRole: AclRole, query) => Observable<AclRole>;\n @Input() loadRoleConfigs: (aclRole: AclRole, query) => Observable<RoleConfig[]>;\n @Input() aclLevels: AclLevel[] = [];\n @Input()\n public disabledAclRole: (aclRole: AclRole) => boolean;\n\n @ViewChildren(FsListComponent)\n public list = new QueryList<FsListComponent>();\n\n public listConfig: FsListConfig;\n public permissions;\n public indexedAclRoleLevels: { [value: string]: string } = {};\n\n private _destroy$ = new Subject();\n\n constructor(\n private readonly _appAclService: FsAppAclService,\n private readonly _dialog: MatDialog,\n ) { }\n\n public ngOnInit(): void {\n new Observable(observer => {\n if (this.aclLevels.length) {\n observer.next(this.aclLevels);\n observer.complete();\n } else {\n\n this._appAclService.getLevels()\n .subscribe((aclLevels: AclLevel[]) => {\n observer.next(aclLevels);\n observer.complete();\n });\n }\n })\n .subscribe((aclLevels: AclLevel[]) => {\n this.aclLevels = aclLevels;\n this.indexedAclRoleLevels = list(this.aclLevels, 'name', 'value');\n this._loadListConfig();\n });\n }\n\n public openDialog(aclRole: AclRole = { id: null }): void {\n this._dialog.open(FsAclRoleComponent, {\n width: '70%',\n data: {\n aclRole,\n aclLevels: this.aclLevels,\n loadAclRole: this.loadAclRole,\n saveAclRole: this.saveAclRole,\n loadRoleConfigs: this.loadRoleConfigs,\n disabled: this.disabledAclRole\n ? this.disabledAclRole(aclRole)\n : false,\n\n },\n })\n .afterClosed()\n .pipe(\n takeUntil(this._destroy$),\n filter((response) => !!response),\n )\n .subscribe((response) => {\n this.list.forEach((list: FsListComponent) => {\n list.reload();\n });\n });\n }\n\n public ngOnDestroy(): void {\n this._destroy$.next(null);\n this._destroy$.complete();\n }\n\n private _loadListConfig() {\n this.listConfig = {\n sort: { value: 'hierarchy' },\n filters: [\n {\n name: 'keyword',\n type: ItemType.Keyword,\n label: 'Search',\n },\n {\n name: 'level',\n label: 'Level',\n type: ItemType.Select,\n values: this.aclLevels,\n hide: this.aclLevels.length <= 1\n },\n {\n name: 'state',\n label: 'Show Deleted',\n type: ItemType.Checkbox,\n unchecked: 'active',\n checked: 'deleted',\n },\n ],\n actions: [\n {\n click: (event) => {\n this.openDialog();\n },\n label: 'Create',\n },\n ],\n rowActions: [\n {\n click: (data) => {\n return this.deleteAclRole(data);\n },\n remove: {\n title: 'Confirm',\n template: 'Are you sure you would like to delete this role?',\n },\n menu: true,\n label: 'Delete',\n show: (row) => {\n const hideDelete = !!this.disabledAclRole\n ? this.disabledAclRole(row)\n : false;\n\n return !!this.deleteAclRole\n && row.state !== 'deleted'\n && !hideDelete;\n },\n },\n {\n click: (data) => {\n return this.restoreAclRole(data)\n .pipe(\n tap(() => {\n this.list.forEach((l: FsListComponent) => {\n l.reload();\n });\n }),\n takeUntil(this._destroy$),\n )\n .subscribe();\n },\n label: 'Restore',\n show: (row) => !!this.restoreAclRole && row.state === 'deleted',\n },\n ],\n fetch: (query) => {\n query.permissions = true;\n return this.loadAclRoles(query)\n .pipe(\n map((data) => data)\n );\n },\n };\n }\n\n}\n","<fs-list [config]=\"listConfig\" *ngIf=\"listConfig\">\n <fs-list-column title=\"Name\" name=\"name\" [sortable]=\"true\">\n <ng-template fs-list-cell let-row=\"row\">\n <ng-container *ngIf=\"row.state !== 'deleted' else deletedRole\">\n <a (click)=\"openDialog(row)\">{{ row.name }}</a>\n </ng-container>\n <ng-template #deletedRole>\n {{ row.name }}\n </ng-template>\n <div class=\"small\">{{row.description}}</div>\n </ng-template>\n </fs-list-column>\n <fs-list-column name=\"hierarchy\" title=\"Level\" [sortable]=\"true\">\n <ng-template fs-list-cell let-row=\"row\">\n {{ indexedAclRoleLevels[row.level] }}\n </ng-template>\n </fs-list-column>\n <fs-list-column title=\"Permissions\">\n <ng-template fs-list-cell let-row=\"row\">\n <div class=\"permissions\">\n <ng-container *ngFor=\"let permission of row.permissions\">\n <span *ngIf=\"permission.access\" class=\"permission\">\n <acl-permission-popover [permission]=\"permission\">{{permission.name}}</acl-permission-popover>\n </span>\n </ng-container>\n </div>\n </ng-template>\n </fs-list-column>\n</fs-list>\n","import { Component, OnInit, Input } from '@angular/core';\nimport { FsAppAclService } from './../../services/app-acl.service';\n\n@Component({\n selector: 'fs-acl-role-popover',\n templateUrl: './acl-role-popover.component.html',\n styleUrls: ['./acl-role-popover.component.scss']\n})\nexport class FsAclRolePopoverComponent implements OnInit {\n\n @Input() aclRole;\n @Input() objectName;\n\n public permissions = [];\n\n public constructor(\n private readonly _appAclService: FsAppAclService,\n ) {}\n\n public ngOnInit() {\n const aclRolePermissions = this.aclRole.permissions || [];\n\n this._appAclService.getPermissions()\n .subscribe((response) => {\n this.permissions = response.filter(item => {\n return aclRolePermissions.some(permission => {\n return item.value === permission.value;\n });\n });\n });\n }\n}\n","\n<fs-popover [template]=\"popover\" [maxWidth]=\"400\">\n <ng-content></ng-content>\n</fs-popover>\n\n<ng-template #popover>\n <div class=\"name small\">{{aclRole.name}}<span *ngIf=\"objectName\">: {{objectName}}</span></div>\n\n <ng-container *ngIf=\"permissions.length; else nonePermission\">\n <div *ngFor=\"let permission of permissions\" class=\"permission\">\n <div>{{permission.name}}</div>\n <div class=\"small\">{{permission.description}}</div>\n </div>\n </ng-container>\n\n <ng-template #nonePermission>\n None\n </ng-template>\n</ng-template>\n","import { ControlContainer, NgForm } from '@angular/forms';\nimport { Component, Input, EventEmitter, Output } from '@angular/core';\n\nimport { AclObjectRole } from '../../interfaces/acl-object-role';\nimport { AclRole } from '../../interfaces/acl-role';\n\n\n@Component({\n selector: 'fs-acl-object-roles',\n templateUrl: './acl-object-roles.component.html',\n styleUrls: ['./acl-object-roles.component.scss'],\n viewProviders: [ { provide: ControlContainer, useExisting: NgForm } ]\n})\nexport class FsAclObjectRolesComponent {\n\n @Input() aclRoles: AclRole[] = [];\n @Input() required = false;\n @Input() multiple = false;\n @Input() disabled = false;\n @Input() aclObjectRoles: AclObjectRole[] = [];\n @Input() rolesLabel = 'Roles';\n @Input() levelLabel = '';\n @Output() change = new EventEmitter<AclObjectRole[]>();\n\n public compareAclRole = (o1: any, o2: any) => {\n return o1 && o2 && o1.id === o2.id;\n }\n\n public changed() {\n this.change.emit(this.aclObjectRoles);\n }\n}\n","<ng-container *ngIf=\"!multiple\">\n <ng-container *ngFor=\"let aclObjectRole of aclObjectRoles\">\n <fs-checkbox-group\n [(ngModel)]=\"aclObjectRole.aclRoles\"\n (ngModelChange)=\"changed()\"\n name=\"roles\"\n [compareWith]=\"compareAclRole\"\n [disabled]=\"disabled\"\n [label]=\"rolesLabel\"\n [fsFormRequired]=\"required\"\n orientation=\"vertical\">\n <mat-checkbox [disabled]=\"disabled\" *ngFor=\"let aclRole of aclRoles\" [value]=\"$any(aclRole)\">\n {{ aclRole.name }}\n </mat-checkbox>\n </fs-checkbox-group>\n </ng-container>\n</ng-container>\n\n<ng-container *ngIf=\"multiple\">\n <table>\n <tr>\n <td>\n <small>{{levelLabel}}</small>\n </td>\n <td>\n <small>{{rolesLabel}}</small>\n </td>\n </tr>\n <tr *ngFor=\"let aclObjectRole of aclObjectRoles\">\n <td>{{aclObjectRole.object.name}}</td>\n <td>\n <mat-form-field class=\"form-field-padless\">\n <mat-select\n [(ngModel)]=\"aclObjectRole.aclRoles\"\n multiple=\"true\"\n [disabled]=\"disabled\"\n [compareWith]=\"compareAclRole\"\n (ngModelChange)=\"changed()\"\n name=\"aclRole_{{ aclObjectRole.object.id }}\">\n <mat-option *ngFor=\"let aclRole of aclRoles\" [value]=\"aclRole\">\n {{ aclRole.name }}\n </mat-option>\n </mat-select>\n </mat-form-field>\n </td>\n </tr>\n </table>\n</ng-container>\n","import { Component, Inject, OnInit } from '@angular/core';\nimport { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog';\n\nimport { FsMessage } from '@firestitch/message';\n\nimport { forkJoin } from 'rxjs';\n\nimport { AclRole} from './../../interfaces/acl-role';\nimport { AclEntryData } from './../../interfaces/acl-entry-data';\nimport { AclObjectRole } from './../../interfaces/acl-object-role';\nimport { AclObjectEntry } from './../../interfaces/acl-object-entry';\nimport { AclEntry } from './../../interfaces/acl-entry';\nimport { FsAppAclService } from './../../services/app-acl.service';\nimport { tap } from 'rxjs/operators';\n\n\n@Component({\n templateUrl: './acl-entry.component.html',\n styleUrls: ['./acl-entry.component.scss'],\n})\nexport class FsAclEntryComponent implements OnInit {\n\n public aclRoles: AclRole[] = [];\n public aclObjectEntry: AclObjectEntry;\n public aclObjectRole: AclObjectRole;\n public aclEntries: AclEntry[] = [];\n public indexedAclRoleLevels = {};\n public titleEdit = 'Edit Roles';\n public titleAdd = 'Assign Roles';\n public required = true;\n\n constructor(\n private readonly _appAclService: FsAppAclService,\n private readonly _dialogRef: MatDialogRef<FsAclEntryComponent>,\n private readonly _message: FsMessage,\n @Inject(MAT_DIALOG_DATA) private readonly _data: AclEntryData\n ) {\n this.aclObjectEntry = { ..._data.aclObjectEntry };\n this.required = _data.required ?? true;\n\n if (_data.titleEdit) {\n this.titleEdit = _data.titleEdit;\n }\n\n if (_data.titleAdd) {\n this.titleAdd = _data.titleAdd;\n }\n }\n\n public ngOnInit() {\n forkJoin(\n this._data.loadAclRoles({\n level: this.aclObjectEntry.level,\n environmentId: this.aclObjectEntry.environmentId || null,\n }),\n this._appAclService.getIndexedLevels()\n )\n .subscribe(([\n aclRoles,\n levels,\n ]) => {\n\n this.aclRoles = aclRoles;\n this.indexedAclRoleLevels = levels;\n\n this.aclObjectRole = {\n object: this.aclObjectEntry.object,\n aclRoles: this.aclObjectEntry.aclEntries\n .map((aclEntry: AclEntry) => {\n return aclEntry.aclRole;\n }),\n };\n });\n }\n\n public aclObjectRoleChange(aclObjectRoles: AclObjectRole[]) {\n this.aclEntries = aclObjectRoles.reduce((aclEntries, aclObjectRole) => {\n aclObjectRole.aclRoles.forEach(aclRole => {\n aclEntries.push({\n aclRoleId: aclRole.id,\n aclRole: aclRole,\n objectId: aclObjectRole.object ? aclObjectRole.object.id : null,\n object: aclObjectRole.object || null\n });\n });\n\n return aclEntries;\n }, []);\n }\n\n public save = () => {\n const aclObjectEntry = {\n ...this.aclObjectEntry,\n aclEntries: this.aclEntries,\n };\n\n return this._data.saveAclObjectEntry(aclObjectEntry)\n .pipe(\n tap((data) => {\n this._message.success('Saved Changes');\n this.close(data);\n })\n );\n }\n\n public close(data = null) {\n this._dialogRef.close(data);\n }\n\n}\n","<form fsForm [submit]=\"save\">\n <fs-dialog>\n <div mat-dialog-title>{{ titleEdit? titleEdit : titleAdd }}</div>\n <mat-dialog-content>\n <div *ngIf=\"aclObjectRole\">\n <fs-label-field *ngIf=\"aclObjectEntry.object\">\n <fs-label>{{indexedAclRoleLevels[aclObjectEntry.level]}}</fs-label>\n {{aclObjectEntry.object.name}}\n </fs-label-field>\n\n <fs-acl-object-roles\n [aclRoles]=\"aclRoles\"\n [aclObjectRoles]=\"[aclObjectRole]\"\n [required]=\"required\"\n (change)=\"aclObjectRoleChange($event)\">\n </fs-acl-object-roles>\n </div>\n </mat-dialog-content>\n <mat-dialog-actions>\n <button mat-button type=\"submit\" color=\"primary\">Save</button>\n <button mat-button mat-dialog-close type=\"button\">Cancel</button>\n </mat-dialog-actions>\n </fs-dialog>\n</form>\n","import { takeUntil, map } from 'rxjs/operators';\nimport { Component, OnInit, ViewChild, OnDestroy, Input } from '@angular/core';\nimport { MatDialog } from '@angular/material/dialog';\n\nimport { Subject, Observable } from 'rxjs';\n\nimport { sortBy, groupBy } from 'lodash-es';\n\nimport { FsListAction, FsListComponent, FsListConfig } from '@firestitch/list';\nimport { FsPrompt } from '@firestitch/prompt';\n\nimport { FsAppAclService } from '../../services/app-acl.service';\nimport { AclEntryData } from '../../interfaces/acl-entry-data';\nimport { AclEntry } from '../../interfaces/acl-entry';\nimport { AclRole } from '../../interfaces/acl-role';\nimport { AclObjectEntry } from '../../interfaces/acl-object-entry';\nimport { FsAclEntryComponent } from '../acl-entry/acl-entry.component';\n\n\n@Component({\n selector: 'fs-acl-entries',\n templateUrl: './acl-entries.component.html',\n styleUrls: ['./acl-entries.component.scss']\n})\nexport class FsAclEntriesComponent implements OnInit, OnDestroy {\n\n @Input() public loadAclEntries: (query: any) => Observable<AclEntry[]>;\n @Input() public loadAclRoles: (query: any) => Observable<AclRole[]>;\n @Input() public saveAclObjectEntry: (aclObjectEntry: AclObjectEntry) => Observable<any>;\n @Input() public environmentShow = true;\n @Input() public environmentLabel = 'Environment';\n @Input() public environmentKey = 'environment';\n @Input() public actions: FsListAction[] = [];\n\n @ViewChild(FsListComponent)\n public aclEntriesList: FsListComponent = null;\n\n public aclEntriesConfig: FsListConfig = null;\n public permissions: any[] = [];\n\n private _destroy$ = new Subject();\n\n constructor(\n private readonly _appAclService: FsAppAclService,\n private readonly _dialog: MatDialog,\n private _confirm: FsPrompt,\n ) { }\n\n public ngOnInit(): void {\n this._appAclService.getPermissions()\n .subscribe(response => {\n this.permissions = response;\n });\n\n this.aclEntriesConfig = {\n status: false,\n paging: false,\n actions: this.actions,\n rowActions: [\n {\n label: 'Remove All Roles',\n click: (aclObjectEntry: AclObjectEntry) => {\n this._confirm\n .confirm({\n title: 'Remove All Roles',\n commitLabel: 'Save',\n template: `Please note that removing roles may prevent users from being able to successfully login.<br>\n These changes are effective immediately.<br>\n Are you sure you would like to continue?`,\n }).subscribe(() => {\n const data = { ...aclObjectEntry, aclEntries: [] };\n this.saveAclObjectEntry(data)\n .subscribe(() => {\n this.aclEntriesList.reload();\n });\n });\n }\n }\n ],\n fetch: () => {\n return new Observable((observer) => {\n this.loadAclEntries({\n aclRoles: true,\n aclRolePermissions: true,\n objects: true,\n aclRoleState: 'active',\n })\n .subscribe((aclEntries: AclEntry[]) => {\n const objects = aclEntries\n .filter((aclEntry) => (!!aclEntry.object))\n .reduce((items, item) => {\n return {\n ...items,\n [item.object.id]: item.object,\n };\n }, {});\n\n const environments = aclEntries\n .filter((aclEntry) => (!!aclEntry[this.environmentKey]))\n .reduce((items, item) => {\n const environment = item[this.environmentKey];\n return {\n ...items,\n [environment.id]: environment,\n };\n }, {});\n\n const groupedAclEntries = groupBy(aclEntries, (item) => {\n const environmentId = (item[this.environmentKey])?.id;\n return [item.aclRole.level, environmentId, item.objectId];\n });\n\n let aclObjectEntries: AclObjectEntry[] = Object.keys(groupedAclEntries)\n .reduce((accum, key: any) => {\n const parts = key.split(',');\n return [\n ...accum,\n {\n object: objects[parts[2]],\n level: parts[0],\n [`${this.environmentKey}Id`]: parts[1] ? parseInt(parts[1]) : null,\n [this.environmentKey]: environments[parts[1]],\n aclEntries: groupedAclEntries[key],\n }\n ];\n }, []);\n\n const hasApp = aclObjectEntries.some((item) => {\n return item.aclEntries.some((entry) => {\n return !entry.objectId;\n });\n });\n\n if (!hasApp) {\n aclObjectEntries.unshift({\n object: null,\n aclEntries: [],\n level: 'app',\n environmentId: null,\n });\n }\n\n aclObjectEntries = sortBy(aclObjectEntries, (item: AclObjectEntry) => {\n return item.object ? item.level : '';\n });\n\n observer.next({ data: aclObjectEntries });\n observer.complete();\n });\n });\n },\n };\n }\n\n public update(aclObjectEntry: AclObjectEntry) {\n const data: AclEntryData = {\n aclObjectEntry,\n required: false,\n loadAclRoles: this.loadAclRoles,\n saveAclObjectEntry: this.saveAclObjectEntry\n }\n\n this._dialog.open(FsAclEntryComponent, {\n data: data\n })\n .afterClosed()\n .pipe(\n takeUntil(this._destroy$),\n )\n .subscribe(() => {\n this.aclEntriesList.reload();\n });\n }\n\n public ngOnDestroy() {\n this._destroy$.next(null);\n this._destroy$.complete();\n }\n\n public reload(): void {\n this.aclEntriesList.reload();\n }\n\n}\n","\n<fs-list [config]=\"aclEntriesConfig\">\n <fs-list-column>\n <ng-template fs-list-header>Context</ng-template>\n <ng-template fs-list-cell let-row=\"row\">\n <div\n *ngIf=\"row.object; else elseObject\"\n class=\"fs-row.gap-small\">\n <fs-badge *ngIf=\"row.object.imageUrl\" shape=\"circle\" image=\"{{ row.object.imageUrl }}\"></fs-badge>\n <span>\n <div><small>{{ row.object.className }}</small></div>\n <a (click)=\"update(row)\">{{ row.object.name }}</a>\n </span>\n </div>\n\n <ng-template #elseObject>\n <a (click)=\"update(row)\">App</a>\n </ng-template>\n </ng-template>\n </fs-list-column>\n\n <fs-list-column [show]=\"environmentShow\">\n <ng-template fs-list-header>{{environmentLabel}}</ng-template>\n <ng-template fs-list-cell let-row=\"row\">\n {{row.environment?.name}}\n </ng-template>\n </fs-list-column>\n\n <fs-list-column>\n <ng-template fs-list-header>Roles</ng-template>\n <ng-template fs-list-cell let-row=\"row\">\n <div class=\"fs-column\">\n <div div *ngFor=\"let aclEntry of row.aclEntries\">\n <ng-container [ngSwitch]=\"row.level\">\n <ng-container *ngSwitchCase=\"'app'\">\n <fs-acl-role-popover [aclRole]=\"aclEntry.aclRole\" objectName=\"App\">{{aclEntry.aclRole.name}}</fs-acl-role-popover>\n </ng-container>\n <ng-container *ngSwitchDefault>\n <ng-container *ngIf=\"row.object\">\n <fs-acl-role-popover [aclRole]=\"aclEntry.aclRole\">{{aclEntry.aclRole.name}}</fs-acl-role-popover>\n </ng-container>\n </ng-container>\n </ng-container>\n </div>\n </div>\n </ng-template>\n </fs-list-column>\n</fs-list>\n","import { MatInputModule } from '@angular/material/input';\nimport { MatRadioModule } from '@angular/material/radio';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatSelectModule } from '@angular/material/select';\nimport { MatCheckboxModule } from '@angular/material/checkbox';\nimport { MatDialogModule } from '@angular/material/dialog';\nimport { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\n\nimport { FsListModule } from '@firestitch/list';\nimport { FsPopoverModule } from '@firestitch/popover';\nimport { FsDialogModule } from '@firestitch/dialog';\nimport { FsFormModule } from '@firestitch/form';\nimport { FsLabelModule } from '@firestitch/label';\nimport { FsRadioGroupModule } from '@firestitch/radiogroup';\nimport { FsBadgeModule } from '@firestitch/badge';\nimport { FsCheckboxGroupModule } from '@firestitch/checkboxgroup';\nimport { FsMenuModule } from '@firestitch/menu';\n\nimport { FsAclRolesComponent } from './components/acl-roles/acl-roles.component';\nimport { FsAclPermissionPopoverComponent } from './components/acl-permission-popover/acl-permission-popover.component';\nimport { FsAclRolePopoverComponent } from './components/acl-role-popover/acl-role-popover.component';\nimport { FsAclEntriesComponent } from './components/acl-entries/acl-entries.component';\nimport { FsAclRoleComponent } from './components/acl-role/acl-role.component';\nimport { FsAclObjectRolesComponent } from './components/acl-object-roles/acl-object-roles.component';\nimport { FsAclEntryComponent } from './components/acl-entry/acl-entry.component';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { FormsModule } from '@angular/forms';\nimport { AclRolePermissionAvailablePipe, BulkOptionsFilterPipe } from './pipes';\n\n\n@NgModule({\n imports: [\n CommonModule,\n FormsModule,\n\n MatDialogModule,\n MatFormFieldModule,\n MatCheckboxModule,\n MatSelectModule,\n MatButtonModule,\n MatRadioModule,\n MatInputModule,\n\n FsListModule,\n FsPopoverModule,\n FsDialogModule,\n FsFormModule,\n FsLabelModule,\n FsRadioGroupModule,\n FsBadgeModule,\n FsCheckboxGroupModule,\n FsMenuModule,\n ],\n declarations: [\n FsAclRolesComponent,\n FsAclPermissionPopoverComponent,\n FsAclRoleComponent,\n FsAclEntriesComponent,\n FsAclRolePopoverComponent,\n FsAclObjectRolesComponent,\n FsAclEntryComponent,\n BulkOptionsFilterPipe,\n AclRolePermissionAvailablePipe,\n ],\n exports: [\n FsAclRolesComponent,\n FsAclPermissionPopoverComponent,\n FsAclRoleComponent,\n FsAclEntriesComponent,\n FsAclRolePopoverComponent,\n FsAclObjectRolesComponent,\n FsAclEntryComponent,\n ],\n})\nexport class FsAppAclModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":["i1.FsAppAclService","i19.BulkOptionsFilterPipe","i20.AclRolePermissionAvailablePipe","i2","i3","i4","i5.FsAclPermissionPopoverComponent","i1","i5","i6","i7","i8","i9","i10.FsAclObjectRolesComponent","i7.FsAclRolePopoverComponent"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"firestitch-app-acl.mjs","sources":["../../src/app/enums/acl-role-access.ts","../../src/app/consts/acl-role-accesses.ts","../../src/app/injectors/app-acl-config.injector.ts","../../src/app/services/app-acl.service.ts","../../src/app/pipes/bulk-options-filter.pipe.ts","../../src/app/pipes/acl-role-permission-available.pipe.ts","../../src/app/components/acl-role/acl-role.component.ts","../../src/app/components/acl-role/acl-role.component.html","../../src/app/components/acl-permission-popover/acl-permission-popover.component.ts","../../src/app/components/acl-permission-popover/acl-permission-popover.component.html","../../src/app/components/acl-roles/acl-roles.component.ts","../../src/app/components/acl-roles/acl-roles.component.html","../../src/app/components/acl-role-popover/acl-role-popover.component.ts","../../src/app/components/acl-role-popover/acl-role-popover.component.html","../../src/app/components/acl-object-roles/acl-object-roles.component.ts","../../src/app/components/acl-object-roles/acl-object-roles.component.html","../../src/app/components/acl-entry/acl-entry.component.ts","../../src/app/components/acl-entry/acl-entry.component.html","../../src/app/components/acl-entries/acl-entries.component.ts","../../src/app/components/acl-entries/acl-entries.component.html","../../src/app/fs-app-acl.module.ts","../../src/firestitch-app-acl.ts"],"sourcesContent":["export enum AclRoleAccess {\n None = 0,\n Read = 5,\n Write = 10,\n Full = 15,\n}\n","\nimport { AclRoleAccess } from '../enums/acl-role-access';\n\nexport const AclRoleAccesses = [\n { name: 'None', value: AclRoleAccess.None },\n { name: 'Read', value: AclRoleAccess.Read },\n { name: 'Write', value: AclRoleAccess.Write },\n { name: 'Full', value: AclRoleAccess.Full }\n];\n","import { InjectionToken } from '@angular/core';\n\nexport const FS_APP_ACL_CONFIG = new InjectionToken<any[]>('fs-app-acl-config');\n","import { Injectable, Inject } from '@angular/core';\n\nimport { list } from '@firestitch/common';\n\nimport { map } from 'rxjs/operators';\nimport { ReplaySubject } from 'rxjs';\n\n\nimport { FS_APP_ACL_CONFIG } from './../injectors/app-acl-config.injector';\nimport { AppAclConfig } from './../interfaces/app-acl-config';\nimport { AclPermission } from './../interfaces/acl-permission';\nimport { AclLevel } from './../interfaces/acl-level';\n\n\n@Injectable({\n providedIn: 'root',\n})\nexport class FsAppAclService {\n\n private _permissions$: ReplaySubject<AclPermission[]>;\n private _levels$: ReplaySubject<AclLevel[]>;\n\n constructor(\n @Inject(FS_APP_ACL_CONFIG) private _appAclConfig: AppAclConfig,\n ) { }\n\n public getPermissions() {\n\n if (!this._permissions$) {\n this._permissions$ = new ReplaySubject();\n\n this._appAclConfig.permissions\n .subscribe((permissions) => {\n this._permissions$.next(permissions);\n this._permissions$.complete();\n });\n }\n\n return this._permissions$;\n }\n\n public getLevels() {\n\n if (!this._levels$) {\n this._levels$ = new ReplaySubject();\n\n this._appAclConfig.levels\n .subscribe((levels) => {\n this._levels$.next(levels);\n this._levels$.complete();\n });\n }\n\n return this._levels$;\n }\n\n\n public getIndexedLevels() {\n return this.getLevels()\n .pipe(\n map((data) => {\n return list(data, 'name', 'value');\n })\n );\n }\n}\n","import { Pipe, PipeTransform } from '@angular/core';\n\nimport { AclRoleAccess } from '../enums/acl-role-access';\nimport { AclPermission } from '../interfaces/acl-permission';\n\n\n@Pipe({\n name: 'builkOptionsFilter'\n})\nexport class BulkOptionsFilterPipe implements PipeTransform {\n\n public transform(rolesList: { name: string, value: AclRoleAccess }[], children: AclPermission[]): any {\n const accessLevels = this._uniqListOfAccessLevels(children);\n\n return rolesList.filter((permission) => {\n return permission.value === 0 || accessLevels.has(permission.value);\n });\n }\n\n private _uniqListOfAccessLevels(children: AclPermission[]): Set<number> {\n return children.reduce((acc, value: AclPermission) => {\n value.accesses.forEach((access) => {\n acc.add(access);\n })\n\n return acc;\n }, (new Set) as Set<number>);\n }\n}\n","import { Pipe, PipeTransform } from '@angular/core';\n\n\n@Pipe({\n name: 'aclRolePermissionAvailable'\n})\nexport class AclRolePermissionAvailablePipe implements PipeTransform {\n\n public transform(permission, aclRolePermissions): boolean {\n if(permission.requires && permission.requires.length) {\n \n const exists = permission.requires\n .every((item) => aclRolePermissions[item]);\n\n return exists;\n }\n \n return true;\n }\n}\n","import {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n Inject,\n OnDestroy,\n OnInit,\n ViewChild\n} from '@angular/core';\nimport { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog';\n\nimport { AclRoleAccesses } from './../../consts/acl-role-accesses';\nimport { AclRole } from './../../interfaces/acl-role';\nimport { takeUntil, tap } from 'rxjs/operators';\n\nimport { FsMessage } from '@firestitch/message';\nimport { list } from '@firestitch/common';\nimport { FsListComponent, FsListConfig } from '@firestitch/list';\n\nimport { forkJoin, Observable, of, Subject } from 'rxjs';\nimport { FsAppAclService } from './../../services/app-acl.service';\nimport { RoleConfig } from '../../interfaces';\nimport { AclRoleAccess } from '../../enums/acl-role-access';\nimport { MatButton } from '@angular/material/button';\n\n\n@Component({\n templateUrl: './acl-role.component.html',\n styleUrls: ['./acl-role.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class FsAclRoleComponent implements OnInit, OnDestroy {\n\n @ViewChild(FsListComponent)\n public list: FsListComponent;\n\n @ViewChild('submit', { static: false })\n public submitButton: MatButton;\n\n public aclRole: AclRole = null;\n public environment;\n public permissions: any[] = [];\n public listConfig: FsListConfig;\n public levelPermissions = [];\n public AclRoleAccesses = AclRoleAccesses;\n public indexedAccesses = {};\n public aclLevels: any[] = [];\n public indexedAclLevels = {};\n public onlyFullAccess = false;\n public AclLevels = {};\n public roleConfigs: RoleConfig[] = [];\n public aclRoleConfigValues = {};\n public aclRolePermissions = {};\n public loadRoleConfigs: (aclRole: AclRole, query) => Observable<RoleConfig[]>;\n public disabled: boolean;\n\n private _destroy$ = new Subject();\n\n constructor(\n @Inject(MAT_DIALOG_DATA) private readonly _data: any,\n private readonly _appAclService: FsAppAclService,\n private readonly _dialogRef: MatDialogRef<FsAclRoleComponent>,\n private readonly _message: FsMessage,\n private _cdRef: ChangeDetectorRef,\n ) { }\n\n public ngOnInit(): void {\n forkJoin(\n this.getRole(),\n this._appAclService.getPermissions(),\n )\n .pipe(takeUntil(this._destroy$))\n .subscribe(([\n aclRole,\n aclPermissions,\n ]) => {\n\n this.permissions = aclPermissions;\n this.aclLevels = this._data.aclLevels;\n this.disabled = this._data.disabled;\n\n this.indexedAclLevels = list(this.aclLevels, 'name', 'value');\n this.indexedAccesses = list(AclRoleAccesses, 'name', 'value');\n\n this.aclRole = {\n ...{\n aclPermissions: [],\n allPermissions: true,\n aclRoleConfigs: [],\n permissions: {},\n level: this.aclLevels[0].value,\n },\n ...aclRole,\n };\n\n this.aclRoleConfigValues = (aclRole.aclRoleConfigs || [])\n .reduce((accum, aclRoleConfig) => {\n return {\n ...accum,\n [aclRoleConfig.name]: aclRoleConfig.value,\n }\n }, {});\n\n if (this.aclRole.id) {\n this.permissions.forEach((permission) => {\n let access = 0;\n\n const aclPermission = this.aclRole.aclPermissions.find((item) => {\n return item.permission === permission.value;\n });\n\n if (aclPermission) {\n access = aclPermission.access;\n }\n\n this.aclRolePermissions[permission.value] = access;\n });\n }\n\n if (this.aclRole.allPermissions) {\n this._applyMaxPermissionAccess();\n }\n\n this._updatePermissions();\n this._updateRoleConfigs();\n\n this._cdRef.markForCheck();\n });\n\n this.listConfig = {\n status: false,\n paging: false,\n rowHoverHighlight: false,\n noResults: {\n message: '',\n },\n group: {\n initialExpand: true,\n groupBy: (data) => {\n return data;\n },\n compareBy: (data) => {\n return data.category || 'General';\n },\n },\n fetch: () => {\n return of({\n data: this.levelPermissions.sort((a, b) => {\n a = a.name.toUpperCase();\n b = b.name.toUpperCase();\n if (a < b) {\n return -1;\n } else if (a > b) {\n return 1;\n }\n\n return 0;\n }),\n });\n },\n };\n }\n\n public bulkChange(value: number, groupChildren, group): void {\n groupChildren\n .forEach((permission) => {\n const access = permission.accesses\n .find((access) => value === access);\n\n if(access || !value) {\n this.aclRolePermissions[permission.value] = value;\n }\n });\n\n setTimeout(() => {\n this.submitButton.disabled = false;\n this.permissionChange();\n });\n }\n\n public permissionChange(): void {\n this.aclRolePermissions = {\n ...this.aclRolePermissions, \n };\n this._cdRef.markForCheck();\n }\n\n public levelChange(): void {\n this._updatePermissions();\n this._updateRoleConfigs();\n this.list.reload();\n }\n\n public getRole(): Observable<any> {\n if (!this._data.aclRole.id) {\n return of(this._data.aclRole);\n }\n\n const query: any = {\n aclPermissions: true,\n aclRoleConfigs: true,\n };\n\n if (!this.environment) {\n query.environmentId = null;\n }\n\n return this._data.loadAclRole(this._data.aclRole, query);\n }\n\n public save = (): Observable<any> => {\n const aclRoleConfigs = this.roleConfigs\n .map((roleConfig) => {\n return {\n name: roleConfig.name,\n value: this.aclRoleConfigValues[roleConfig.name],\n }\n });\n\n const aclRole = {\n ...this.aclRole,\n permissions: this.levelPermissions.map((permission) => {\n return {\n value: permission.value,\n access: this.aclRolePermissions[permission.value] || 0,\n };\n }),\n aclRoleConfigs,\n };\n\n return this._data.saveAclRole(aclRole)\n .pipe(\n tap((response) => {\n this._message.success('Saved Changes');\n this.close(response);\n }),\n );\n }\n\n public close(data: any = null): void {\n this._dialogRef.close(data);\n }\n\n public allPermissionsChange(all: boolean): void {\n this._updatePermissions();\n if (all) {\n this._applyMaxPermissionAccess();\n } else {\n this._applyNonePermissionAccess();\n }\n }\n\n public ngOnDestroy(): void {\n this._destroy$.next(null);\n this._destroy$.complete();\n }\n\n private _updatePermissions(): void {\n this.levelPermissions = this.permissions\n .filter((permission) => {\n return permission.levels.some((item) => {\n return item === this.aclRole.level;\n });\n });\n }\n\n private _updateRoleConfigs(): void {\n if(this._data.loadRoleConfigs) {\n this._data.loadRoleConfigs()\n .subscribe((roleConfigs: RoleConfig[]) => {\n this.roleConfigs = roleConfigs\n .filter((roleConfig) => roleConfig.level === this.aclRole.level);\n this._cdRef.markForCheck();\n });\n }\n }\n\n private _applyMaxPermissionAccess(): void {\n this.permissions.forEach((permission) => {\n this.aclRolePermissions[permission.value] = Math.max(...permission.accesses);\n });\n }\n\n private _applyNonePermissionAccess(): void {\n this.permissions.forEach((permission) => {\n this.aclRolePermissions[permission.value] = AclRoleAccess.None;\n });\n }\n\n}\n","<form\n fsForm\n [submit]=\"save\">\n <fs-dialog>\n <ng-container *ngIf=\"aclRole\">\n <div mat-dialog-title>\n <ng-container *ngIf=\"!disabled\">\n {{ aclRole.id ? 'Edit' : 'Create' }}\n </ng-container>\n <ng-container *ngIf=\"disabled\">\n View\n </ng-container>\n Role\n </div>\n <mat-dialog-content>\n <div class=\"fs-row.gap-large.align-start\">\n <div class=\"fs-column left-column\">\n <mat-form-field>\n <mat-label>\n Name\n </mat-label>\n <input\n matInput\n [(ngModel)]=\"aclRole.name\"\n [disabled]=\"disabled\"\n name=\"name\"\n fsFormRequired>\n </mat-form-field>\n <mat-form-field>\n <mat-label>\n Description\n </mat-label>\n <input\n matInput\n [(ngModel)]=\"aclRole.description\"\n [disabled]=\"disabled\"\n name=\"description\">\n </mat-form-field>\n <fs-label-field *ngIf=\"aclRole.id || aclLevels.length === 1; else levels\">\n <fs-label>\n Level\n </fs-label>\n {{ indexedAclLevels[aclRole.level] }}\n </fs-label-field>\n <ng-template #levels>\n <div class=\"level\">\n <fs-radio-group\n [(ngModel)]=\"aclRole.level\"\n [disabled]=\"disabled\"\n (ngModelChange)=\"levelChange()\"\n fsFormRequired\n label=\"Level\"\n orientation=\"vertical\"\n name=\"level\">\n <mat-radio-button\n *ngFor=\"let item of aclLevels\"\n [value]=\"item.value\"\n [disabled]=\"!!aclRole.protected\">\n {{ item.name }}\n </mat-radio-button>\n </fs-radio-group>\n </div>\n </ng-template>\n <fs-label-field *ngIf=\"levelPermissions.length\">\n <fs-label>\n All Permissions\n </fs-label>\n <mat-checkbox\n [(ngModel)]=\"aclRole.allPermissions\"\n (ngModelChange)=\"allPermissionsChange($event)\"\n [disabled]=\"!!aclRole.protected || disabled\"\n name=\"allPermissions\">\n Enable\n </mat-checkbox>\n </fs-label-field>\n <div\n class=\"fs-column\"\n *ngFor=\"let roleConfig of roleConfigs\">\n <fs-label-field *ngIf=\"roleConfig.type === 'checkbox'\">\n <fs-label>\n {{ roleConfig.label }}\n </fs-label>\n <mat-checkbox\n [(ngModel)]=\"aclRoleConfigValues[roleConfig.name]\"\n [disabled]=\"disabled\"\n [name]=\"roleConfig.name\">\n Enable\n </mat-checkbox>\n <fs-label-message>\n <mat-hint>\n {{ roleConfig.description }}\n </mat-hint>\n </fs-label-message>\n </fs-label-field>\n <mat-form-field *ngIf=\"roleConfig.type === 'select'\">\n <mat-select\n [(ngModel)]=\"aclRoleConfigValues[roleConfig.name]\"\n [name]=\"roleConfig.name\"\n [required]=\"roleConfig.required\"\n [disabled]=\"disabled\"\n [placeholder]=\"roleConfig.label\">\n <mat-option\n *ngFor=\"let item of roleConfig.values\"\n [value]=\"item.value\">\n {{ item.name }}\n </mat-option>\n </mat-select>\n <mat-hint>\n {{ roleConfig.description }}\n </mat-hint>\n </mat-form-field>\n </div>\n </div>\n <div\n *ngIf=\"aclRole.level\"\n [hidden]=\"!levelPermissions.length\"\n class=\"permissions fs-column\">\n <fs-list [config]=\"listConfig\">\n <fs-list-column title=\"Permissions\">\n <ng-template\n fs-list-group-cell\n let-row=\"row\"\n class=\"permission-group\">\n <div class=\"permission-group\">\n {{ row.category || 'General' }}\n </div>\n </ng-template>\n <ng-template\n fs-list-cell\n let-row=\"row\">\n <div class=\"permission\">\n {{ row.name }}\n </div>\n <div class=\"description small\">\n {{ row.description }}\n </div>\n </ng-template>\n </fs-list-column>\n <fs-list-column\n title=\"Access\"\n width=\"1%\"\n class=\"access\">\n <ng-template\n fs-list-group-cell\n let-row=\"row\"\n let-group=\"group\"\n let-groupChildren=\"groupChildren\"\n class=\"permission-group\"\n align=\"right\">\n <ng-container *ngIf=\"!aclRole.allPermissions && !disabled\">\n <fs-menu>\n <ng-container *ngFor=\"let access of AclRoleAccesses | builkOptionsFilter: groupChildren\">\n <ng-template\n fs-menu-item\n (click)=\"bulkChange(access.value, groupChildren, group)\">\n {{ access.name }}\n </ng-template>\n </ng-container>\n </fs-menu>\n </ng-container>\n </ng-template>\n <ng-template\n fs-list-cell\n let-row=\"permission\"\n let-permission=\"row\">\n <span *ngIf=\"aclRole.allPermissions || disabled; else elseAll\">\n {{ indexedAccesses[aclRolePermissions[permission.value]] }}\n </span>\n <ng-template #elseAll>\n <ng-container *ngIf=\"permission|aclRolePermissionAvailable:aclRolePermissions; else permissionRequires\">\n <mat-form-field class=\"form-field-padless\">\n <mat-select\n [(ngModel)]=\"aclRolePermissions[permission.value]\"\n [disabled]=\"!!aclRole.protected\"\n required\n [name]=\"'access-' + permission.value\"\n (ngModelChange)=\"permissionChange()\">\n <ng-container *ngFor=\"let access of AclRoleAccesses\">\n <mat-option\n *ngIf=\"access.value === 0 || permission.accesses.indexOf(access.value) !== -1\"\n [value]=\"access.value\">\n {{ access.name }}\n </mat-option>\n </ng-container>\n </mat-select>\n </mat-form-field>\n </ng-container>\n <ng-template #permissionRequires>\n Unavailable\n </ng-template>\n </ng-template>\n </ng-template>\n </fs-list-column>\n </fs-list>\n </div>\n </div>\n </mat-dialog-content>\n <mat-dialog-actions>\n <button\n *ngIf=\"!disabled\"\n #submit\n mat-button\n type=\"submit\"\n color=\"primary\">\n {{ aclRole.id ? 'Save' : 'Create' }}\n </button>\n <button\n mat-button\n [mat-dialog-close]=\"null\"\n type=\"button\">\n {{ disabled ? 'Done' : 'Cancel' }}\n </button>\n </mat-dialog-actions>\n </ng-container>\n </fs-dialog>\n</form>","import { Component, OnInit, Input, Inject } from '@angular/core';\nimport { FsAppAclService } from './../../services/app-acl.service';\n\n@Component({\n selector: 'acl-permission-popover',\n templateUrl: './acl-permission-popover.component.html',\n styleUrls: ['./acl-permission-popover.component.scss']\n})\nexport class FsAclPermissionPopoverComponent implements OnInit {\n\n @Input() permission;\n\n public description;\n\n public constructor(\n private _appAclService: FsAppAclService\n ) { }\n\n public ngOnInit() {\n this._appAclService.getPermissions()\n .subscribe(permissions => {\n this.description = permissions.filter(item => {\n return item.value === this.permission.value;\n }).map(item => {\n return item.description;\n })[0];\n });\n }\n}\n","\n<fs-popover [template]=\"popover\" [maxWidth]=\"400\">\n <ng-content></ng-content>\n</fs-popover>\n\n<ng-template #popover>\n {{permission.name}}\n <div class=\"small\">{{description}}</div>\n</ng-template>\n\n","import { takeUntil, filter, map, tap } from 'rxjs/operators';\nimport { Component, OnInit, OnDestroy, ChangeDetectionStrategy, Input, ChangeDetectorRef, ViewChildren, QueryList } from '@angular/core';\n\nimport { MatDialog } from '@angular/material/dialog';\n\nimport { FsListComponent, FsListConfig } from '@firestitch/list';\nimport { ItemType } from '@firestitch/filter';\nimport { list } from '@firestitch/common';\n\nimport { Subject, Observable } from 'rxjs';\n\nimport { AclRole } from './../../interfaces/acl-role';\nimport { AclLevel } from './../../interfaces/acl-level';\nimport { FsAclRoleComponent } from '../acl-role/acl-role.component';\nimport { FsAppAclService } from '../../services/app-acl.service';\nimport { RoleConfig } from '../../interfaces';\n\n\n@Component({\n selector: 'fs-acl-roles',\n templateUrl: 'acl-roles.component.html',\n styleUrls: [ 'acl-roles.component.scss' ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class FsAclRolesComponent implements OnInit, OnDestroy {\n\n @Input() deleteAclRole: (aclRole: AclRole) => Observable<AclRole>;\n @Input() restoreAclRole: (aclRole: AclRole) => Observable<AclRole>;\n @Input() saveAclRole: (aclRole: AclRole) => Observable<AclRole>;\n @Input() loadAclRoles: (query: any) => Observable<{ data: AclRole[], paging: any }>;\n @Input() loadAclRole: (aclRole: AclRole, query) => Observable<AclRole>;\n @Input() loadRoleConfigs: (aclRole: AclRole, query) => Observable<RoleConfig[]>;\n @Input() aclLevels: AclLevel[] = [];\n @Input()\n public disabledAclRole: (aclRole: AclRole) => boolean;\n\n @ViewChildren(FsListComponent)\n public list = new QueryList<FsListComponent>();\n\n public listConfig: FsListConfig;\n public permissions;\n public indexedAclRoleLevels: { [value: string]: string } = {};\n\n private _destroy$ = new Subject();\n\n constructor(\n private readonly _appAclService: FsAppAclService,\n private readonly _dialog: MatDialog,\n ) { }\n\n public ngOnInit(): void {\n new Observable(observer => {\n if (this.aclLevels.length) {\n observer.next(this.aclLevels);\n observer.complete();\n } else {\n\n this._appAclService.getLevels()\n .subscribe((aclLevels: AclLevel[]) => {\n observer.next(aclLevels);\n observer.complete();\n });\n }\n })\n .subscribe((aclLevels: AclLevel[]) => {\n this.aclLevels = aclLevels;\n this.indexedAclRoleLevels = list(this.aclLevels, 'name', 'value');\n this._loadListConfig();\n });\n }\n\n public openDialog(aclRole: AclRole = { id: null }): void {\n this._dialog.open(FsAclRoleComponent, {\n width: '70%',\n data: {\n aclRole,\n aclLevels: this.aclLevels,\n loadAclRole: this.loadAclRole,\n saveAclRole: this.saveAclRole,\n loadRoleConfigs: this.loadRoleConfigs,\n disabled: this.disabledAclRole\n ? this.disabledAclRole(aclRole)\n : false,\n\n },\n })\n .afterClosed()\n .pipe(\n takeUntil(this._destroy$),\n filter((response) => !!response),\n )\n .subscribe((response) => {\n this.list.forEach((list: FsListComponent) => {\n list.reload();\n });\n });\n }\n\n public ngOnDestroy(): void {\n this._destroy$.next(null);\n this._destroy$.complete();\n }\n\n private _loadListConfig() {\n this.listConfig = {\n sort: { value: 'hierarchy' },\n filters: [\n {\n name: 'keyword',\n type: ItemType.Keyword,\n label: 'Search',\n },\n {\n name: 'level',\n label: 'Level',\n type: ItemType.Select,\n values: this.aclLevels,\n hide: this.aclLevels.length <= 1\n },\n {\n name: 'state',\n label: 'Show Deleted',\n type: ItemType.Checkbox,\n unchecked: 'active',\n checked: 'deleted',\n },\n ],\n actions: [\n {\n click: (event) => {\n this.openDialog();\n },\n label: 'Create',\n },\n ],\n rowActions: [\n {\n click: (data) => {\n return this.deleteAclRole(data);\n },\n remove: {\n title: 'Confirm',\n template: 'Are you sure you would like to delete this role?',\n },\n menu: true,\n label: 'Delete',\n show: (row) => {\n const hideDelete = !!this.disabledAclRole\n ? this.disabledAclRole(row)\n : false;\n\n return !!this.deleteAclRole\n && row.state !== 'deleted'\n && !hideDelete;\n },\n },\n {\n click: (data) => {\n return this.restoreAclRole(data)\n .pipe(\n tap(() => {\n this.list.forEach((l: FsListComponent) => {\n l.reload();\n });\n }),\n takeUntil(this._destroy$),\n )\n .subscribe();\n },\n label: 'Restore',\n show: (row) => !!this.restoreAclRole && row.state === 'deleted',\n },\n ],\n fetch: (query) => {\n query.permissions = true;\n return this.loadAclRoles(query)\n .pipe(\n map((data) => data)\n );\n },\n };\n }\n\n}\n","<fs-list [config]=\"listConfig\" *ngIf=\"listConfig\">\n <fs-list-column title=\"Name\" name=\"name\" [sortable]=\"true\">\n <ng-template fs-list-cell let-row=\"row\">\n <ng-container *ngIf=\"row.state !== 'deleted' else deletedRole\">\n <a (click)=\"openDialog(row)\">{{ row.name }}</a>\n </ng-container>\n <ng-template #deletedRole>\n {{ row.name }}\n </ng-template>\n <div class=\"small\">{{row.description}}</div>\n </ng-template>\n </fs-list-column>\n <fs-list-column name=\"hierarchy\" title=\"Level\" [sortable]=\"true\">\n <ng-template fs-list-cell let-row=\"row\">\n {{ indexedAclRoleLevels[row.level] }}\n </ng-template>\n </fs-list-column>\n <fs-list-column title=\"Permissions\">\n <ng-template fs-list-cell let-row=\"row\">\n <div class=\"permissions\">\n <ng-container *ngFor=\"let permission of row.permissions\">\n <span *ngIf=\"permission.access\" class=\"permission\">\n <acl-permission-popover [permission]=\"permission\">{{permission.name}}</acl-permission-popover>\n </span>\n </ng-container>\n </div>\n </ng-template>\n </fs-list-column>\n</fs-list>\n","import { Component, OnInit, Input } from '@angular/core';\nimport { FsAppAclService } from './../../services/app-acl.service';\n\n@Component({\n selector: 'fs-acl-role-popover',\n templateUrl: './acl-role-popover.component.html',\n styleUrls: ['./acl-role-popover.component.scss']\n})\nexport class FsAclRolePopoverComponent implements OnInit {\n\n @Input() aclRole;\n @Input() objectName;\n\n public permissions = [];\n\n public constructor(\n private readonly _appAclService: FsAppAclService,\n ) {}\n\n public ngOnInit() {\n const aclRolePermissions = this.aclRole.permissions || [];\n\n this._appAclService.getPermissions()\n .subscribe((response) => {\n this.permissions = response.filter(item => {\n return aclRolePermissions.some(permission => {\n return item.value === permission.value;\n });\n });\n });\n }\n}\n","\n<fs-popover [template]=\"popover\" [maxWidth]=\"400\">\n <ng-content></ng-content>\n</fs-popover>\n\n<ng-template #popover>\n <div class=\"name small\">{{aclRole.name}}<span *ngIf=\"objectName\">: {{objectName}}</span></div>\n\n <ng-container *ngIf=\"permissions.length; else nonePermission\">\n <div *ngFor=\"let permission of permissions\" class=\"permission\">\n <div>{{permission.name}}</div>\n <div class=\"small\">{{permission.description}}</div>\n </div>\n </ng-container>\n\n <ng-template #nonePermission>\n None\n </ng-template>\n</ng-template>\n","import { ControlContainer, NgForm } from '@angular/forms';\nimport { Component, Input, EventEmitter, Output } from '@angular/core';\n\nimport { AclObjectRole } from '../../interfaces/acl-object-role';\nimport { AclRole } from '../../interfaces/acl-role';\n\n\n@Component({\n selector: 'fs-acl-object-roles',\n templateUrl: './acl-object-roles.component.html',\n styleUrls: ['./acl-object-roles.component.scss'],\n viewProviders: [ { provide: ControlContainer, useExisting: NgForm } ]\n})\nexport class FsAclObjectRolesComponent {\n\n @Input() aclRoles: AclRole[] = [];\n @Input() required = false;\n @Input() multiple = false;\n @Input() disabled = false;\n @Input() aclObjectRoles: AclObjectRole[] = [];\n @Input() rolesLabel = 'Roles';\n @Input() levelLabel = '';\n @Output() change = new EventEmitter<AclObjectRole[]>();\n\n public compareAclRole = (o1: any, o2: any) => {\n return o1 && o2 && o1.id === o2.id;\n }\n\n public changed() {\n this.change.emit(this.aclObjectRoles);\n }\n}\n","<ng-container *ngIf=\"!multiple\">\n <ng-container *ngFor=\"let aclObjectRole of aclObjectRoles\">\n <fs-checkbox-group\n [(ngModel)]=\"aclObjectRole.aclRoles\"\n (ngModelChange)=\"changed()\"\n name=\"roles\"\n [compareWith]=\"compareAclRole\"\n [disabled]=\"disabled\"\n [label]=\"rolesLabel\"\n [fsFormRequired]=\"required\"\n orientation=\"vertical\">\n <mat-checkbox [disabled]=\"disabled\" *ngFor=\"let aclRole of aclRoles\" [value]=\"$any(aclRole)\">\n {{ aclRole.name }}\n </mat-checkbox>\n </fs-checkbox-group>\n </ng-container>\n</ng-container>\n\n<ng-container *ngIf=\"multiple\">\n <table>\n <tr>\n <td>\n <small>{{levelLabel}}</small>\n </td>\n <td>\n <small>{{rolesLabel}}</small>\n </td>\n </tr>\n <tr *ngFor=\"let aclObjectRole of aclObjectRoles\">\n <td>{{aclObjectRole.object.name}}</td>\n <td>\n <mat-form-field class=\"form-field-padless\">\n <mat-select\n [(ngModel)]=\"aclObjectRole.aclRoles\"\n multiple=\"true\"\n [disabled]=\"disabled\"\n [compareWith]=\"compareAclRole\"\n (ngModelChange)=\"changed()\"\n name=\"aclRole_{{ aclObjectRole.object.id }}\">\n <mat-option *ngFor=\"let aclRole of aclRoles\" [value]=\"aclRole\">\n {{ aclRole.name }}\n </mat-option>\n </mat-select>\n </mat-form-field>\n </td>\n </tr>\n </table>\n</ng-container>\n","import { Component, Inject, OnInit } from '@angular/core';\nimport { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog';\n\nimport { FsMessage } from '@firestitch/message';\n\nimport { forkJoin } from 'rxjs';\n\nimport { AclRole} from './../../interfaces/acl-role';\nimport { AclEntryData } from './../../interfaces/acl-entry-data';\nimport { AclObjectRole } from './../../interfaces/acl-object-role';\nimport { AclObjectEntry } from './../../interfaces/acl-object-entry';\nimport { AclEntry } from './../../interfaces/acl-entry';\nimport { FsAppAclService } from './../../services/app-acl.service';\nimport { tap } from 'rxjs/operators';\n\n\n@Component({\n templateUrl: './acl-entry.component.html',\n styleUrls: ['./acl-entry.component.scss'],\n})\nexport class FsAclEntryComponent implements OnInit {\n\n public aclRoles: AclRole[] = [];\n public aclObjectEntry: AclObjectEntry;\n public aclObjectRole: AclObjectRole;\n public aclEntries: AclEntry[] = [];\n public indexedAclRoleLevels = {};\n public titleEdit = 'Edit Roles';\n public titleAdd = 'Assign Roles';\n public required = true;\n\n constructor(\n private readonly _appAclService: FsAppAclService,\n private readonly _dialogRef: MatDialogRef<FsAclEntryComponent>,\n private readonly _message: FsMessage,\n @Inject(MAT_DIALOG_DATA) private readonly _data: AclEntryData\n ) {\n this.aclObjectEntry = { ..._data.aclObjectEntry };\n this.required = _data.required ?? true;\n\n if (_data.titleEdit) {\n this.titleEdit = _data.titleEdit;\n }\n\n if (_data.titleAdd) {\n this.titleAdd = _data.titleAdd;\n }\n }\n\n public ngOnInit() {\n forkJoin(\n this._data.loadAclRoles({\n level: this.aclObjectEntry.level,\n environmentId: this.aclObjectEntry.environmentId || null,\n }),\n this._appAclService.getIndexedLevels()\n )\n .subscribe(([\n aclRoles,\n levels,\n ]) => {\n\n this.aclRoles = aclRoles;\n this.indexedAclRoleLevels = levels;\n\n this.aclObjectRole = {\n object: this.aclObjectEntry.object,\n aclRoles: this.aclObjectEntry.aclEntries\n .map((aclEntry: AclEntry) => {\n return aclEntry.aclRole;\n }),\n };\n });\n }\n\n public aclObjectRoleChange(aclObjectRoles: AclObjectRole[]) {\n this.aclEntries = aclObjectRoles.reduce((aclEntries, aclObjectRole) => {\n aclObjectRole.aclRoles.forEach(aclRole => {\n aclEntries.push({\n aclRoleId: aclRole.id,\n aclRole: aclRole,\n objectId: aclObjectRole.object ? aclObjectRole.object.id : null,\n object: aclObjectRole.object || null\n });\n });\n\n return aclEntries;\n }, []);\n }\n\n public save = () => {\n const aclObjectEntry = {\n ...this.aclObjectEntry,\n aclEntries: this.aclEntries,\n };\n\n return this._data.saveAclObjectEntry(aclObjectEntry)\n .pipe(\n tap((data) => {\n this._message.success('Saved Changes');\n this.close(data);\n })\n );\n }\n\n public close(data = null) {\n this._dialogRef.close(data);\n }\n\n}\n","<form fsForm [submit]=\"save\">\n <fs-dialog>\n <div mat-dialog-title>{{ titleEdit? titleEdit : titleAdd }}</div>\n <mat-dialog-content>\n <div *ngIf=\"aclObjectRole\">\n <fs-label-field *ngIf=\"aclObjectEntry.object\">\n <fs-label>{{indexedAclRoleLevels[aclObjectEntry.level]}}</fs-label>\n {{aclObjectEntry.object.name}}\n </fs-label-field>\n\n <fs-acl-object-roles\n [aclRoles]=\"aclRoles\"\n [aclObjectRoles]=\"[aclObjectRole]\"\n [required]=\"required\"\n (change)=\"aclObjectRoleChange($event)\">\n </fs-acl-object-roles>\n </div>\n </mat-dialog-content>\n <mat-dialog-actions>\n <button mat-button type=\"submit\" color=\"primary\">Save</button>\n <button mat-button mat-dialog-close type=\"button\">Cancel</button>\n </mat-dialog-actions>\n </fs-dialog>\n</form>\n","import { takeUntil, map } from 'rxjs/operators';\nimport { Component, OnInit, ViewChild, OnDestroy, Input } from '@angular/core';\nimport { MatDialog } from '@angular/material/dialog';\n\nimport { Subject, Observable } from 'rxjs';\n\nimport { sortBy, groupBy } from 'lodash-es';\n\nimport { FsListAction, FsListComponent, FsListConfig } from '@firestitch/list';\nimport { FsPrompt } from '@firestitch/prompt';\n\nimport { FsAppAclService } from '../../services/app-acl.service';\nimport { AclEntryData } from '../../interfaces/acl-entry-data';\nimport { AclEntry } from '../../interfaces/acl-entry';\nimport { AclRole } from '../../interfaces/acl-role';\nimport { AclObjectEntry } from '../../interfaces/acl-object-entry';\nimport { FsAclEntryComponent } from '../acl-entry/acl-entry.component';\n\n\n@Component({\n selector: 'fs-acl-entries',\n templateUrl: './acl-entries.component.html',\n styleUrls: ['./acl-entries.component.scss']\n})\nexport class FsAclEntriesComponent implements OnInit, OnDestroy {\n\n @Input() public loadAclEntries: (query: any) => Observable<AclEntry[]>;\n @Input() public loadAclRoles: (query: any) => Observable<AclRole[]>;\n @Input() public saveAclObjectEntry: (aclObjectEntry: AclObjectEntry) => Observable<any>;\n @Input() public environmentShow = true;\n @Input() public environmentLabel = 'Environment';\n @Input() public environmentKey = 'environment';\n @Input() public actions: FsListAction[] = [];\n\n @ViewChild(FsListComponent)\n public aclEntriesList: FsListComponent = null;\n\n public aclEntriesConfig: FsListConfig = null;\n public permissions: any[] = [];\n\n private _destroy$ = new Subject();\n\n constructor(\n private readonly _appAclService: FsAppAclService,\n private readonly _dialog: MatDialog,\n private _confirm: FsPrompt,\n ) { }\n\n public ngOnInit(): void {\n this._appAclService.getPermissions()\n .subscribe(response => {\n this.permissions = response;\n });\n\n this.aclEntriesConfig = {\n status: false,\n paging: false,\n actions: this.actions,\n rowActions: [\n {\n label: 'Remove All Roles',\n click: (aclObjectEntry: AclObjectEntry) => {\n this._confirm\n .confirm({\n title: 'Remove All Roles',\n commitLabel: 'Save',\n template: `Please note that removing roles may prevent users from being able to successfully login.<br>\n These changes are effective immediately.<br>\n Are you sure you would like to continue?`,\n }).subscribe(() => {\n const data = { ...aclObjectEntry, aclEntries: [] };\n this.saveAclObjectEntry(data)\n .subscribe(() => {\n this.aclEntriesList.reload();\n });\n });\n }\n }\n ],\n fetch: () => {\n return new Observable((observer) => {\n this.loadAclEntries({\n aclRoles: true,\n aclRolePermissions: true,\n objects: true,\n aclRoleState: 'active',\n })\n .subscribe((aclEntries: AclEntry[]) => {\n const objects = aclEntries\n .filter((aclEntry) => (!!aclEntry.object))\n .reduce((items, item) => {\n return {\n ...items,\n [item.object.id]: item.object,\n };\n }, {});\n\n const environments = aclEntries\n .filter((aclEntry) => (!!aclEntry[this.environmentKey]))\n .reduce((items, item) => {\n const environment = item[this.environmentKey];\n return {\n ...items,\n [environment.id]: environment,\n };\n }, {});\n\n const groupedAclEntries = groupBy(aclEntries, (item) => {\n const environmentId = (item[this.environmentKey])?.id;\n return [item.aclRole.level, environmentId, item.objectId];\n });\n\n let aclObjectEntries: AclObjectEntry[] = Object.keys(groupedAclEntries)\n .reduce((accum, key: any) => {\n const parts = key.split(',');\n return [\n ...accum,\n {\n object: objects[parts[2]],\n level: parts[0],\n [`${this.environmentKey}Id`]: parts[1] ? parseInt(parts[1]) : null,\n [this.environmentKey]: environments[parts[1]],\n aclEntries: groupedAclEntries[key],\n }\n ];\n }, []);\n\n const hasApp = aclObjectEntries.some((item) => {\n return item.aclEntries.some((entry) => {\n return !entry.objectId;\n });\n });\n\n if (!hasApp) {\n aclObjectEntries.unshift({\n object: null,\n aclEntries: [],\n level: 'app',\n environmentId: null,\n });\n }\n\n aclObjectEntries = sortBy(aclObjectEntries, (item: AclObjectEntry) => {\n return item.object ? item.level : '';\n });\n\n observer.next({ data: aclObjectEntries });\n observer.complete();\n });\n });\n },\n };\n }\n\n public update(aclObjectEntry: AclObjectEntry) {\n const data: AclEntryData = {\n aclObjectEntry,\n required: false,\n loadAclRoles: this.loadAclRoles,\n saveAclObjectEntry: this.saveAclObjectEntry\n }\n\n this._dialog.open(FsAclEntryComponent, {\n data: data\n })\n .afterClosed()\n .pipe(\n takeUntil(this._destroy$),\n )\n .subscribe(() => {\n this.aclEntriesList.reload();\n });\n }\n\n public ngOnDestroy() {\n this._destroy$.next(null);\n this._destroy$.complete();\n }\n\n public reload(): void {\n this.aclEntriesList.reload();\n }\n\n}\n","\n<fs-list [config]=\"aclEntriesConfig\">\n <fs-list-column>\n <ng-template fs-list-header>Context</ng-template>\n <ng-template fs-list-cell let-row=\"row\">\n <div\n *ngIf=\"row.object; else elseObject\"\n class=\"fs-row.gap-small\">\n <fs-badge *ngIf=\"row.object.imageUrl\" shape=\"circle\" image=\"{{ row.object.imageUrl }}\"></fs-badge>\n <span>\n <div><small>{{ row.object.className }}</small></div>\n <a (click)=\"update(row)\">{{ row.object.name }}</a>\n </span>\n </div>\n\n <ng-template #elseObject>\n <a (click)=\"update(row)\">App</a>\n </ng-template>\n </ng-template>\n </fs-list-column>\n\n <fs-list-column [show]=\"environmentShow\">\n <ng-template fs-list-header>{{environmentLabel}}</ng-template>\n <ng-template fs-list-cell let-row=\"row\">\n {{row.environment?.name}}\n </ng-template>\n </fs-list-column>\n\n <fs-list-column>\n <ng-template fs-list-header>Roles</ng-template>\n <ng-template fs-list-cell let-row=\"row\">\n <div class=\"fs-column\">\n <div div *ngFor=\"let aclEntry of row.aclEntries\">\n <ng-container [ngSwitch]=\"row.level\">\n <ng-container *ngSwitchCase=\"'app'\">\n <fs-acl-role-popover [aclRole]=\"aclEntry.aclRole\" objectName=\"App\">{{aclEntry.aclRole.name}}</fs-acl-role-popover>\n </ng-container>\n <ng-container *ngSwitchDefault>\n <ng-container *ngIf=\"row.object\">\n <fs-acl-role-popover [aclRole]=\"aclEntry.aclRole\">{{aclEntry.aclRole.name}}</fs-acl-role-popover>\n </ng-container>\n </ng-container>\n </ng-container>\n </div>\n </div>\n </ng-template>\n </fs-list-column>\n</fs-list>\n","import { MatInputModule } from '@angular/material/input';\nimport { MatRadioModule } from '@angular/material/radio';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatSelectModule } from '@angular/material/select';\nimport { MatCheckboxModule } from '@angular/material/checkbox';\nimport { MatDialogModule } from '@angular/material/dialog';\nimport { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\n\nimport { FsListModule } from '@firestitch/list';\nimport { FsPopoverModule } from '@firestitch/popover';\nimport { FsDialogModule } from '@firestitch/dialog';\nimport { FsFormModule } from '@firestitch/form';\nimport { FsLabelModule } from '@firestitch/label';\nimport { FsRadioGroupModule } from '@firestitch/radiogroup';\nimport { FsBadgeModule } from '@firestitch/badge';\nimport { FsCheckboxGroupModule } from '@firestitch/checkboxgroup';\nimport { FsMenuModule } from '@firestitch/menu';\n\nimport { FsAclRolesComponent } from './components/acl-roles/acl-roles.component';\nimport { FsAclPermissionPopoverComponent } from './components/acl-permission-popover/acl-permission-popover.component';\nimport { FsAclRolePopoverComponent } from './components/acl-role-popover/acl-role-popover.component';\nimport { FsAclEntriesComponent } from './components/acl-entries/acl-entries.component';\nimport { FsAclRoleComponent } from './components/acl-role/acl-role.component';\nimport { FsAclObjectRolesComponent } from './components/acl-object-roles/acl-object-roles.component';\nimport { FsAclEntryComponent } from './components/acl-entry/acl-entry.component';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { FormsModule } from '@angular/forms';\nimport { AclRolePermissionAvailablePipe, BulkOptionsFilterPipe } from './pipes';\n\n\n@NgModule({\n imports: [\n CommonModule,\n FormsModule,\n\n MatDialogModule,\n MatFormFieldModule,\n MatCheckboxModule,\n MatSelectModule,\n MatButtonModule,\n MatRadioModule,\n MatInputModule,\n\n FsListModule,\n FsPopoverModule,\n FsDialogModule,\n FsFormModule,\n FsLabelModule,\n FsRadioGroupModule,\n FsBadgeModule,\n FsCheckboxGroupModule,\n FsMenuModule,\n ],\n declarations: [\n FsAclRolesComponent,\n FsAclPermissionPopoverComponent,\n FsAclRoleComponent,\n FsAclEntriesComponent,\n FsAclRolePopoverComponent,\n FsAclObjectRolesComponent,\n FsAclEntryComponent,\n BulkOptionsFilterPipe,\n AclRolePermissionAvailablePipe,\n ],\n exports: [\n FsAclRolesComponent,\n FsAclPermissionPopoverComponent,\n FsAclRoleComponent,\n FsAclEntriesComponent,\n FsAclRolePopoverComponent,\n FsAclObjectRolesComponent,\n FsAclEntryComponent,\n ],\n})\nexport class FsAppAclModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":["i1.FsAppAclService","i19.BulkOptionsFilterPipe","i20.AclRolePermissionAvailablePipe","i2","i3","i4","i5.FsAclPermissionPopoverComponent","i1","i5","i6","i7","i8","i9","i10.FsAclObjectRolesComponent","i7.FsAclRolePopoverComponent"],"mappings":"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"}
|