@myrmidon/auth-jwt-admin 5.0.0 → 5.0.1

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.
@@ -96,11 +96,11 @@ export class UserEditorComponent {
96
96
  this.userChange.emit(this.getUserFromForm());
97
97
  }
98
98
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.2", ngImport: i0, type: UserEditorComponent, deps: [{ token: i1.UntypedFormBuilder }, { token: i2.AuthJwtService }], target: i0.ɵɵFactoryTarget.Component }); }
99
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.0.2", type: UserEditorComponent, selector: "auth-jwt-user-editor", inputs: { user: "user" }, outputs: { userChange: "userChange", editorClose: "editorClose" }, ngImport: i0, template: "<form [formGroup]=\"form\" (submit)=\"save()\">\n <div class=\"form-row\">\n <!-- email -->\n <mat-form-field>\n <mat-label i18n=\"auth-jwt-admin\">email</mat-label>\n <input type=\"text\" matInput [formControl]=\"email\" />\n @if (email.hasError('required') && (email.dirty || email.touched)) {\n <mat-error i18n=\"auth-jwt-admin\"> email address required </mat-error>\n } @if (email.hasError('pattern') && (email.dirty || email.touched)) {\n <mat-error i18n=\"auth-jwt-admin\"> invalid email address </mat-error>\n }\n </mat-form-field>\n\n <!-- emailConfirmed -->\n <mat-checkbox [formControl]=\"emailConfirmed\" i18n=\"auth-jwt-admin\"\n >email address confirmed</mat-checkbox\n >\n </div>\n\n <!-- lockoutEnabled -->\n <div class=\"form-row\">\n <mat-checkbox [formControl]=\"lockoutEnabled\" i18n=\"auth-jwt-admin\"\n >lockout enabled</mat-checkbox\n >\n <button\n type=\"button\"\n mat-icon-button\n color=\"primary\"\n class=\"mat-primary\"\n (click)=\"endLockout()\"\n [disabled]=\"unlocked\"\n i18n-matTooltip=\"auth-jwt-admin\"\n matTooltip=\"Unlock this user if locked\"\n >\n <mat-icon>lock_open</mat-icon>\n </button>\n </div>\n\n <div class=\"form-row\">\n <!-- firstName -->\n <mat-form-field>\n <mat-label i18n=\"auth-jwt-admin\">first name</mat-label>\n <input type=\"text\" matInput [formControl]=\"firstName\" />\n @if ( firstName.hasError('required') && (firstName.dirty ||\n firstName.touched) ) {\n <mat-error i18n=\"auth-jwt-admin\"> first name required </mat-error>\n } @if ( firstName.hasError('maxlength') && (firstName.dirty ||\n firstName.touched) ) {\n <mat-error i18n=\"auth-jwt-admin\"> first name too long </mat-error>\n }\n </mat-form-field>\n\n <!-- lastName -->\n <mat-form-field>\n <mat-label i18n=\"auth-jwt-admin\">last name</mat-label>\n <input type=\"text\" matInput [formControl]=\"lastName\" />\n @if ( lastName.hasError('required') && (lastName.dirty ||\n lastName.touched) ) {\n <mat-error i18n=\"auth-jwt-admin\"> last name required </mat-error>\n } @if ( lastName.hasError('maxlength') && (lastName.dirty ||\n lastName.touched) ) {\n <mat-error i18n=\"auth-jwt-admin\"> last name too long </mat-error>\n }\n </mat-form-field>\n </div>\n\n <!-- roles -->\n <div>\n <mat-form-field style=\"width: 16em\">\n <mat-label i18n=\"auth-jwt-admin\">roles</mat-label>\n <input type=\"text\" matInput [formControl]=\"roles\" />\n @if (roles.hasError('maxlength') && (roles.dirty || roles.touched)) {\n <mat-error i18n=\"auth-jwt-admin\"> too long </mat-error>\n }\n <mat-hint i18n>roles (separated by space)</mat-hint>\n </mat-form-field>\n </div>\n\n <!-- buttons -->\n <br />\n <div>\n <button\n type=\"button\"\n mat-icon-button\n color=\"warn\"\n class=\"mat-warn\"\n i18n-matTooltip=\"auth-jwt-admin\"\n matTooltip=\"Close\"\n (click)=\"close()\"\n >\n <mat-icon>cancel</mat-icon>\n </button>\n <button\n type=\"submit\"\n mat-icon-button\n color=\"primary\"\n class=\"mat-primary\"\n [disabled]=\"form.invalid\"\n i18n-matTooltip=\"auth-jwt-admin\"\n matTooltip=\"Save user\"\n >\n <mat-icon>check_circle</mat-icon>\n </button>\n </div>\n</form>\n", styles: [".form-row{display:flex;gap:8px;align-items:center;flex-wrap:wrap}.form-row *{flex:0 0 auto}\n"], dependencies: [{ kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.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: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: i3.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "component", type: i4.MatCheckbox, selector: "mat-checkbox", inputs: ["aria-label", "aria-labelledby", "aria-describedby", "id", "required", "labelPosition", "name", "value", "disableRipple", "tabIndex", "color", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { kind: "component", type: i5.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i6.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: i7.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i7.MatLabel, selector: "mat-label" }, { kind: "directive", type: i7.MatHint, selector: "mat-hint", inputs: ["align", "id"] }, { kind: "directive", type: i7.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "directive", type: i8.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }] }); }
99
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.0.2", type: UserEditorComponent, selector: "auth-jwt-user-editor", inputs: { user: "user" }, outputs: { userChange: "userChange", editorClose: "editorClose" }, ngImport: i0, template: "<form [formGroup]=\"form\" (submit)=\"save()\">\n <div class=\"form-row\">\n <!-- email -->\n <mat-form-field>\n <mat-label i18n=\"auth-jwt-admin\">email</mat-label>\n <input type=\"text\" matInput [formControl]=\"email\" />\n @if (email.hasError('required') && (email.dirty || email.touched)) {\n <mat-error i18n=\"auth-jwt-admin\"> email address required </mat-error>\n } @if (email.hasError('pattern') && (email.dirty || email.touched)) {\n <mat-error i18n=\"auth-jwt-admin\"> invalid email address </mat-error>\n }\n </mat-form-field>\n\n <!-- emailConfirmed -->\n <mat-checkbox [formControl]=\"emailConfirmed\" i18n=\"auth-jwt-admin\"\n >email address confirmed</mat-checkbox\n >\n </div>\n\n <!-- lockoutEnabled -->\n <div class=\"form-row\">\n <mat-checkbox [formControl]=\"lockoutEnabled\" i18n=\"auth-jwt-admin\"\n >lockout enabled</mat-checkbox\n >\n <button\n type=\"button\"\n mat-icon-button\n color=\"primary\"\n (click)=\"endLockout()\"\n [disabled]=\"unlocked\"\n i18n-matTooltip=\"auth-jwt-admin\"\n matTooltip=\"Unlock this user if locked\"\n >\n <mat-icon class=\"mat-primary\">lock_open</mat-icon>\n </button>\n </div>\n\n <div class=\"form-row\">\n <!-- firstName -->\n <mat-form-field>\n <mat-label i18n=\"auth-jwt-admin\">first name</mat-label>\n <input type=\"text\" matInput [formControl]=\"firstName\" />\n @if ( firstName.hasError('required') && (firstName.dirty ||\n firstName.touched) ) {\n <mat-error i18n=\"auth-jwt-admin\"> first name required </mat-error>\n } @if ( firstName.hasError('maxlength') && (firstName.dirty ||\n firstName.touched) ) {\n <mat-error i18n=\"auth-jwt-admin\"> first name too long </mat-error>\n }\n </mat-form-field>\n\n <!-- lastName -->\n <mat-form-field>\n <mat-label i18n=\"auth-jwt-admin\">last name</mat-label>\n <input type=\"text\" matInput [formControl]=\"lastName\" />\n @if ( lastName.hasError('required') && (lastName.dirty ||\n lastName.touched) ) {\n <mat-error i18n=\"auth-jwt-admin\"> last name required </mat-error>\n } @if ( lastName.hasError('maxlength') && (lastName.dirty ||\n lastName.touched) ) {\n <mat-error i18n=\"auth-jwt-admin\"> last name too long </mat-error>\n }\n </mat-form-field>\n </div>\n\n <!-- roles -->\n <div>\n <mat-form-field style=\"width: 16em\">\n <mat-label i18n=\"auth-jwt-admin\">roles</mat-label>\n <input type=\"text\" matInput [formControl]=\"roles\" />\n @if (roles.hasError('maxlength') && (roles.dirty || roles.touched)) {\n <mat-error i18n=\"auth-jwt-admin\"> too long </mat-error>\n }\n <mat-hint i18n>roles (separated by space)</mat-hint>\n </mat-form-field>\n </div>\n\n <!-- buttons -->\n <br />\n <div>\n <button\n type=\"button\"\n mat-icon-button\n color=\"warn\"\n i18n-matTooltip=\"auth-jwt-admin\"\n matTooltip=\"Close\"\n (click)=\"close()\"\n >\n <mat-icon class=\"mat-warn\">cancel</mat-icon>\n </button>\n <button\n type=\"submit\"\n mat-icon-button\n color=\"primary\"\n [disabled]=\"form.invalid\"\n i18n-matTooltip=\"auth-jwt-admin\"\n matTooltip=\"Save user\"\n >\n <mat-icon class=\"mat-primary\">check_circle</mat-icon>\n </button>\n </div>\n</form>\n", styles: [".form-row{display:flex;gap:8px;align-items:center;flex-wrap:wrap}.form-row *{flex:0 0 auto}\n"], dependencies: [{ kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.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: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: i3.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "component", type: i4.MatCheckbox, selector: "mat-checkbox", inputs: ["aria-label", "aria-labelledby", "aria-describedby", "id", "required", "labelPosition", "name", "value", "disableRipple", "tabIndex", "color", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { kind: "component", type: i5.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i6.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: i7.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i7.MatLabel, selector: "mat-label" }, { kind: "directive", type: i7.MatHint, selector: "mat-hint", inputs: ["align", "id"] }, { kind: "directive", type: i7.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "directive", type: i8.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }] }); }
100
100
  }
101
101
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.2", ngImport: i0, type: UserEditorComponent, decorators: [{
102
102
  type: Component,
103
- args: [{ selector: 'auth-jwt-user-editor', template: "<form [formGroup]=\"form\" (submit)=\"save()\">\n <div class=\"form-row\">\n <!-- email -->\n <mat-form-field>\n <mat-label i18n=\"auth-jwt-admin\">email</mat-label>\n <input type=\"text\" matInput [formControl]=\"email\" />\n @if (email.hasError('required') && (email.dirty || email.touched)) {\n <mat-error i18n=\"auth-jwt-admin\"> email address required </mat-error>\n } @if (email.hasError('pattern') && (email.dirty || email.touched)) {\n <mat-error i18n=\"auth-jwt-admin\"> invalid email address </mat-error>\n }\n </mat-form-field>\n\n <!-- emailConfirmed -->\n <mat-checkbox [formControl]=\"emailConfirmed\" i18n=\"auth-jwt-admin\"\n >email address confirmed</mat-checkbox\n >\n </div>\n\n <!-- lockoutEnabled -->\n <div class=\"form-row\">\n <mat-checkbox [formControl]=\"lockoutEnabled\" i18n=\"auth-jwt-admin\"\n >lockout enabled</mat-checkbox\n >\n <button\n type=\"button\"\n mat-icon-button\n color=\"primary\"\n class=\"mat-primary\"\n (click)=\"endLockout()\"\n [disabled]=\"unlocked\"\n i18n-matTooltip=\"auth-jwt-admin\"\n matTooltip=\"Unlock this user if locked\"\n >\n <mat-icon>lock_open</mat-icon>\n </button>\n </div>\n\n <div class=\"form-row\">\n <!-- firstName -->\n <mat-form-field>\n <mat-label i18n=\"auth-jwt-admin\">first name</mat-label>\n <input type=\"text\" matInput [formControl]=\"firstName\" />\n @if ( firstName.hasError('required') && (firstName.dirty ||\n firstName.touched) ) {\n <mat-error i18n=\"auth-jwt-admin\"> first name required </mat-error>\n } @if ( firstName.hasError('maxlength') && (firstName.dirty ||\n firstName.touched) ) {\n <mat-error i18n=\"auth-jwt-admin\"> first name too long </mat-error>\n }\n </mat-form-field>\n\n <!-- lastName -->\n <mat-form-field>\n <mat-label i18n=\"auth-jwt-admin\">last name</mat-label>\n <input type=\"text\" matInput [formControl]=\"lastName\" />\n @if ( lastName.hasError('required') && (lastName.dirty ||\n lastName.touched) ) {\n <mat-error i18n=\"auth-jwt-admin\"> last name required </mat-error>\n } @if ( lastName.hasError('maxlength') && (lastName.dirty ||\n lastName.touched) ) {\n <mat-error i18n=\"auth-jwt-admin\"> last name too long </mat-error>\n }\n </mat-form-field>\n </div>\n\n <!-- roles -->\n <div>\n <mat-form-field style=\"width: 16em\">\n <mat-label i18n=\"auth-jwt-admin\">roles</mat-label>\n <input type=\"text\" matInput [formControl]=\"roles\" />\n @if (roles.hasError('maxlength') && (roles.dirty || roles.touched)) {\n <mat-error i18n=\"auth-jwt-admin\"> too long </mat-error>\n }\n <mat-hint i18n>roles (separated by space)</mat-hint>\n </mat-form-field>\n </div>\n\n <!-- buttons -->\n <br />\n <div>\n <button\n type=\"button\"\n mat-icon-button\n color=\"warn\"\n class=\"mat-warn\"\n i18n-matTooltip=\"auth-jwt-admin\"\n matTooltip=\"Close\"\n (click)=\"close()\"\n >\n <mat-icon>cancel</mat-icon>\n </button>\n <button\n type=\"submit\"\n mat-icon-button\n color=\"primary\"\n class=\"mat-primary\"\n [disabled]=\"form.invalid\"\n i18n-matTooltip=\"auth-jwt-admin\"\n matTooltip=\"Save user\"\n >\n <mat-icon>check_circle</mat-icon>\n </button>\n </div>\n</form>\n", styles: [".form-row{display:flex;gap:8px;align-items:center;flex-wrap:wrap}.form-row *{flex:0 0 auto}\n"] }]
103
+ args: [{ selector: 'auth-jwt-user-editor', template: "<form [formGroup]=\"form\" (submit)=\"save()\">\n <div class=\"form-row\">\n <!-- email -->\n <mat-form-field>\n <mat-label i18n=\"auth-jwt-admin\">email</mat-label>\n <input type=\"text\" matInput [formControl]=\"email\" />\n @if (email.hasError('required') && (email.dirty || email.touched)) {\n <mat-error i18n=\"auth-jwt-admin\"> email address required </mat-error>\n } @if (email.hasError('pattern') && (email.dirty || email.touched)) {\n <mat-error i18n=\"auth-jwt-admin\"> invalid email address </mat-error>\n }\n </mat-form-field>\n\n <!-- emailConfirmed -->\n <mat-checkbox [formControl]=\"emailConfirmed\" i18n=\"auth-jwt-admin\"\n >email address confirmed</mat-checkbox\n >\n </div>\n\n <!-- lockoutEnabled -->\n <div class=\"form-row\">\n <mat-checkbox [formControl]=\"lockoutEnabled\" i18n=\"auth-jwt-admin\"\n >lockout enabled</mat-checkbox\n >\n <button\n type=\"button\"\n mat-icon-button\n color=\"primary\"\n (click)=\"endLockout()\"\n [disabled]=\"unlocked\"\n i18n-matTooltip=\"auth-jwt-admin\"\n matTooltip=\"Unlock this user if locked\"\n >\n <mat-icon class=\"mat-primary\">lock_open</mat-icon>\n </button>\n </div>\n\n <div class=\"form-row\">\n <!-- firstName -->\n <mat-form-field>\n <mat-label i18n=\"auth-jwt-admin\">first name</mat-label>\n <input type=\"text\" matInput [formControl]=\"firstName\" />\n @if ( firstName.hasError('required') && (firstName.dirty ||\n firstName.touched) ) {\n <mat-error i18n=\"auth-jwt-admin\"> first name required </mat-error>\n } @if ( firstName.hasError('maxlength') && (firstName.dirty ||\n firstName.touched) ) {\n <mat-error i18n=\"auth-jwt-admin\"> first name too long </mat-error>\n }\n </mat-form-field>\n\n <!-- lastName -->\n <mat-form-field>\n <mat-label i18n=\"auth-jwt-admin\">last name</mat-label>\n <input type=\"text\" matInput [formControl]=\"lastName\" />\n @if ( lastName.hasError('required') && (lastName.dirty ||\n lastName.touched) ) {\n <mat-error i18n=\"auth-jwt-admin\"> last name required </mat-error>\n } @if ( lastName.hasError('maxlength') && (lastName.dirty ||\n lastName.touched) ) {\n <mat-error i18n=\"auth-jwt-admin\"> last name too long </mat-error>\n }\n </mat-form-field>\n </div>\n\n <!-- roles -->\n <div>\n <mat-form-field style=\"width: 16em\">\n <mat-label i18n=\"auth-jwt-admin\">roles</mat-label>\n <input type=\"text\" matInput [formControl]=\"roles\" />\n @if (roles.hasError('maxlength') && (roles.dirty || roles.touched)) {\n <mat-error i18n=\"auth-jwt-admin\"> too long </mat-error>\n }\n <mat-hint i18n>roles (separated by space)</mat-hint>\n </mat-form-field>\n </div>\n\n <!-- buttons -->\n <br />\n <div>\n <button\n type=\"button\"\n mat-icon-button\n color=\"warn\"\n i18n-matTooltip=\"auth-jwt-admin\"\n matTooltip=\"Close\"\n (click)=\"close()\"\n >\n <mat-icon class=\"mat-warn\">cancel</mat-icon>\n </button>\n <button\n type=\"submit\"\n mat-icon-button\n color=\"primary\"\n [disabled]=\"form.invalid\"\n i18n-matTooltip=\"auth-jwt-admin\"\n matTooltip=\"Save user\"\n >\n <mat-icon class=\"mat-primary\">check_circle</mat-icon>\n </button>\n </div>\n</form>\n", styles: [".form-row{display:flex;gap:8px;align-items:center;flex-wrap:wrap}.form-row *{flex:0 0 auto}\n"] }]
104
104
  }], ctorParameters: () => [{ type: i1.UntypedFormBuilder }, { type: i2.AuthJwtService }], propDecorators: { user: [{
105
105
  type: Input
106
106
  }], userChange: [{
@@ -108,4 +108,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.2", ngImpor
108
108
  }], editorClose: [{
109
109
  type: Output
110
110
  }] } });
111
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlci1lZGl0b3IuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbXlybWlkb24vYXV0aC1qd3QtYWRtaW4vc3JjL2xpYi9jb21wb25lbnRzL3VzZXItZWRpdG9yL3VzZXItZWRpdG9yLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL215cm1pZG9uL2F1dGgtand0LWFkbWluL3NyYy9saWIvY29tcG9uZW50cy91c2VyLWVkaXRvci91c2VyLWVkaXRvci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFVLEtBQUssRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQy9FLE9BQU8sRUFJTCxVQUFVLEdBQ1gsTUFBTSxnQkFBZ0IsQ0FBQzs7Ozs7Ozs7OztBQVF4QixNQUFNLE9BQU8sbUJBQW1CO0lBYTlCLElBQW9CLElBQUksQ0FBQyxLQUF1QjtRQUM5QyxJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztRQUNuQixJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3pCLENBQUM7SUFDRCxJQUFXLElBQUk7UUFDYixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUM7SUFDcEIsQ0FBQztJQUtELFlBQVksV0FBK0IsRUFBVSxZQUE0QjtRQUE1QixpQkFBWSxHQUFaLFlBQVksQ0FBZ0I7UUFDL0UsU0FBUztRQUNULElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxZQUFZLEVBQVEsQ0FBQztRQUMzQyxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksWUFBWSxFQUFPLENBQUM7UUFDM0MsT0FBTztRQUNQLElBQUksQ0FBQyxLQUFLLEdBQUcsV0FBVyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUU7WUFDckMsVUFBVSxDQUFDLFFBQVE7WUFDbkIsVUFBVSxDQUFD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LEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFTLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztnQkFDdEQsQ0FBQyxDQUFDLEVBQUU7U0FDUCxDQUFDO0lBQ0osQ0FBQztJQUVNLFVBQVU7UUFDZixJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNsQixPQUFPO1FBQ1QsQ0FBQztRQUNELElBQUksQ0FBQyxLQUFNLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDeEQsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUM7SUFDdkIsQ0FBQztJQUVNLEtBQUs7UUFDVixJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxDQUFDO0lBQzFCLENBQUM7SUFFTSxJQUFJO1FBQ1QsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ3RCLE9BQU87UUFDVCxDQUFDO1FBQ0QsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDLENBQUM7SUFDL0MsQ0FBQzs4R0F6R1UsbUJBQW1CO2tHQUFuQixtQkFBbUIseUpDZGhDLDg0R0F5R0E7OzJGRDNGYSxtQkFBbUI7a0JBTC9CLFNBQVM7K0JBQ0Usc0JBQXNCO29IQWlCWixJQUFJO3NCQUF2QixLQUFLO2dCQVFJLFVBQVU7c0JBQW5CLE1BQU07Z0JBQ0csV0FBVztzQkFBcEIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0LCBJbnB1dCwgT3V0cHV0LCBFdmVudEVtaXR0ZXIgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHtcclxuICBVbnR5cGVkRm9ybUdyb3VwLFxyXG4gIFVudHlwZWRGb3JtQ29udHJvbCxcclxuICBVbnR5cGVkRm9ybUJ1aWxkZXIsXHJcbiAgVmFsaWRhdG9ycyxcclxufSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IEF1dGhKd3RTZXJ2aWNlLCBVc2VyIH0gZnJvbSAnQG15cm1pZG9uL2F1dGgtand0LWxvZ2luJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnYXV0aC1qd3QtdXNlci1lZGl0b3InLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi91c2VyLWVkaXRvci5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vdXNlci1lZGl0b3IuY29tcG9uZW50LmNzcyddLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgVXNlckVkaXRvckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XHJcbiAgcHJpdmF0ZSBfdXNlcjogVXNlciB8IHVuZGVmaW5lZDtcclxuXHJcbiAgcHVibGljIGVtYWlsOiBVbnR5cGVkRm9ybUNvbnRyb2w7XHJcbiAgcHVibGljIGVtYWlsQ29uZmlybWVkOiBVbnR5cGVkRm9ybUNvbnRyb2w7XHJcbiAgcHVibGljIGxvY2tvdXRFbmFibGVkOiBVbnR5cGVkRm9ybUNvbnRyb2w7XHJcbiAgcHVibGljIGZpcnN0TmFtZTogVW50eXBlZEZvcm1Db250cm9sO1xyXG4gIHB1YmxpYyBsYXN0TmFtZTogVW50eXBlZEZvcm1Db250cm9sO1xyXG4gIHB1YmxpYyByb2xlczogVW50eXBlZEZvcm1Db250cm9sO1xyXG4gIHB1YmxpYyBmb3JtOiBVbnR5cGVkRm9ybUdyb3VwO1xyXG5cclxuICBwdWJsaWMgdW5sb2NrZWQ6IGJvb2xlYW4gfCB1bmRlZmluZWQ7XHJcblxyXG4gIEBJbnB1dCgpIHB1YmxpYyBzZXQgdXNlcih2YWx1ZTogVXNlciB8IHVuZGVmaW5lZCkge1xyXG4gICAgdGhpcy5fdXNlciA9IHZhbHVlO1xyXG4gICAgdGhpcy51cGRhdGVGb3JtKHZhbHVlKTtcclxuICB9XHJcbiAgcHVibGljIGdldCB1c2VyKCk6IFVzZXIgfCB1bmRlZmluZWQge1xyXG4gICAgcmV0dXJuIHRoaXMuX3VzZXI7XHJcbiAgfVxyXG5cclxuICBAT3V0cHV0KCkgdXNlckNoYW5nZTogRXZlbnRFbWl0dGVyPFVzZXI+O1xyXG4gIEBPdXRwdXQoKSBlZGl0b3JDbG9zZTogRXZlbnRFbWl0dGVyPGFueT47XHJcblxyXG4gIGNvbnN0cnVjdG9yKGZvcm1CdWlsZGVyOiBVbnR5cGVkRm9ybUJ1aWxkZXIsIHByaXZhdGUgX2F1dGhTZXJ2aWNlOiBBdXRoSnd0U2VydmljZSkge1xyXG4gICAgLy8gZXZlbnRzXHJcbiAgICB0aGlzLnVzZXJDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPFVzZXI+KCk7XHJcbiAgICB0aGlzLmVkaXRvckNsb3NlID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcbiAgICAvLyBmb3JtXHJcbiAgICB0aGlzLmVtYWlsID0gZm9ybUJ1aWxkZXIuY29udHJvbChudWxsLCBbXHJcbiAgICAgIFZhbGlkYXRvcnMucmVxdWlyZWQsXHJcbiAgICAgIFZhbGlkYXRvcnMuZW1haWwsXHJcbiAgICBdKTtcclxuICAgIHRoaXMuZW1haWxDb25maXJtZWQgPSBmb3JtQnVpbGRlci5jb250cm9sKGZhbHNlKTtcclxuICAgIHRoaXMubG9ja291dEVuYWJsZWQgPSBmb3JtQnVpbGRlci5jb250cm9sKGZhbHNlKTtcclxuICAgIHRoaXMuZmlyc3ROYW1lID0gZm9ybUJ1aWxkZXIuY29udHJvbChudWxsLCBbXHJcbiAgICAgIFZhbGlkYXRvcnMucmVxdWlyZWQsXHJcbiAgICAgIFZhbGlkYXRvcnMubWF4TGVuZ3RoKDUwKSxcclxuICAgIF0pO1xyXG4gICAgdGhpcy5sYXN0TmFtZSA9IGZvcm1CdWlsZGVyLmNvbnRyb2wobnVsbCwgW1xyXG4gICAgICBWYWxpZGF0b3JzLnJlcXVpcmVkLFxyXG4gICAgICBWYWxpZGF0b3JzLm1heExlbmd0aCg1MCksXHJcbiAgICBdKTtcclxuICAgIHRoaXMucm9sZXMgPSBmb3JtQnVpbGRlci5jb250cm9sKG51bGwsIFZhbGlkYXRvcnMubWF4TGVuZ3RoKDIwMCkpO1xyXG5cclxuICAgIHRoaXMuZm9ybSA9IGZvcm1CdWlsZGVyLmdyb3VwKHtcclxuICAgICAgZW1haWw6IHRoaXMuZW1haWwsXHJcbiAgICAgIGVtYWlsQ29uZmlybWVkOiB0aGlzLmVtYWlsQ29uZmlybWVkLFxyXG4gICAgICBsb2Nrb3V0RW5hYmxlZDogdGhpcy5sb2Nrb3V0RW5hYmxlZCxcclxuICAgICAgZmlyc3ROYW1lOiB0aGlzLmZpcnN0TmFtZSxcclxuICAgICAgbGFzdE5hbWU6IHRoaXMubGFzdE5hbWUsXHJcbiAgICAgIHJvbGVzOiB0aGlzLnJvbGVzLFxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBuZ09uSW5pdCgpOiB2b2lkIHt9XHJcblxyXG4gIHByaXZhdGUgdXBkYXRlRm9ybSh1c2VyOiBVc2VyIHwgdW5kZWZpbmVkKTogdm9pZCB7XHJcbiAgICBpZiAoIXVzZXIpIHtcclxuICAgICAgdGhpcy5mb3JtLnJlc2V0KCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmVtYWlsLnNldFZhbHVlKHVzZXIuZW1haWwpO1xyXG4gICAgICB0aGlzLmVtYWlsQ29uZmlybWVkLnNldFZhbHVlKHVzZXIuZW1haWxDb25maXJtZWQpO1xyXG4gICAgICB0aGlzLmxvY2tvdXRFbmFibGVkLnNldFZhbHVlKHVzZXIubG9ja291dEVuYWJsZWQpO1xyXG4gICAgICB0aGlzLmZpcnN0TmFtZS5zZXRWYWx1ZSh1c2VyLmZpcnN0TmFtZSk7XHJcbiAgICAgIHRoaXMubGFzdE5hbWUuc2V0VmFsdWUodXNlci5sYXN0TmFtZSk7XHJcbiAgICAgIGlmICh1c2VyLnJvbGVzPy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgdGhpcy5yb2xlcy5zZXRWYWx1ZSh1c2VyLnJvbGVzLmpvaW4oJyAnKSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5yb2xlcy5zZXRWYWx1ZShudWxsKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRVc2VyRnJvbUZvcm0oKTogVXNlciB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICB1c2VyTmFtZTogdGhpcy5fdXNlcj8udXNlck5hbWUgfHwgJycsXHJcbiAgICAgIGVtYWlsOiB0aGlzLmVtYWlsLnZhbHVlLFxyXG4gICAgICBlbWFpbENvbmZpcm1lZDogdGhpcy5lbWFpbENvbmZpcm1lZC52YWx1ZSxcclxuICAgICAgbG9ja291dEVuYWJsZWQ6IHRoaXMubG9ja291dEVuYWJsZWQudmFsdWUsXHJcbiAgICAgIGZpcnN0TmFtZTogdGhpcy5maXJzdE5hbWUudmFsdWUsXHJcbiAgICAgIGxhc3ROYW1lOiB0aGlzLmxhc3ROYW1lLnZhbHVlLFxyXG4gICAgICByb2xlczogdGhpcy5yb2xlcy52YWx1ZVxyXG4gICAgICAgID8gdGhpcy5yb2xlcy52YWx1ZS5zcGxpdCgnICcpLmZpbHRlcigoczogc3RyaW5nKSA9PiBzKVxyXG4gICAgICAgIDogW10sXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGVuZExvY2tvdXQoKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy51bmxvY2tlZCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLl91c2VyIS5sb2Nrb3V0RW5kID0gdGhpcy5fYXV0aFNlcnZpY2UuZ2V0VVRDRGF0ZSgpO1xyXG4gICAgdGhpcy51bmxvY2tlZCA9IHRydWU7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgY2xvc2UoKTogdm9pZCB7XHJcbiAgICB0aGlzLmVkaXRvckNsb3NlLmVtaXQoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzYXZlKCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuZm9ybS5pbnZhbGlkKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRoaXMudXNlckNoYW5nZS5lbWl0KHRoaXMuZ2V0VXNlckZyb21Gb3JtKCkpO1xyXG4gIH1cclxufVxyXG4iLCI8Zm9ybSBbZm9ybUdyb3VwXT1cImZvcm1cIiAoc3VibWl0KT1cInNhdmUoKVwiPlxuICA8ZGl2IGNsYXNzPVwiZm9ybS1yb3dcIj5cbiAgICA8IS0tIGVtYWlsIC0tPlxuICAgIDxtYXQtZm9ybS1maWVsZD5cbiAgICAgIDxtYXQtbGFiZWwgaTE4bj1cImF1dGgtand0LWFkbWluXCI+ZW1haWw8L21hdC1sYWJlbD5cbiAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIG1hdElucHV0IFtmb3JtQ29udHJvbF09XCJlbWFpbFwiIC8+XG4gICAgICBAaWYgKGVtYWlsLmhhc0Vycm9yKCdyZXF1aXJlZCcpICYmIChlbWFpbC5kaXJ0eSB8fCBlbWFpbC50b3VjaGVkKSkge1xuICAgICAgPG1hdC1lcnJvciBpMThuPVwiYXV0aC1qd3QtYWRtaW5cIj4gZW1haWwgYWRkcmVzcyByZXF1aXJlZCA8L21hdC1lcnJvcj5cbiAgICAgIH0gQGlmIChlbWFpbC5oYXNFcnJvcigncGF0dGVybicpICYmIChlbWFpbC5kaXJ0eSB8fCBlbWFpbC50b3VjaGVkKSkge1xuICAgICAgPG1hdC1lcnJvciBpMThuPVwiYXV0aC1qd3QtYWRtaW5cIj4gaW52YWxpZCBlbWFpbCBhZGRyZXNzIDwvbWF0LWVycm9yPlxuICAgICAgfVxuICAgIDwvbWF0LWZvcm0tZmllbGQ+XG5cbiAgICA8IS0tIGVtYWlsQ29uZmlybWVkIC0tPlxuICAgIDxtYXQtY2hlY2tib3ggW2Zvcm1Db250cm9sXT1cImVtYWlsQ29uZmlybWVkXCIgaTE4bj1cImF1dGgtand0LWFkbWluXCJcbiAgICAgID5lbWFpbCBhZGRyZXNzIGNvbmZpcm1lZDwvbWF0LWNoZWNrYm94XG4gICAgPlxuICA8L2Rpdj5cblxuICA8IS0tIGxvY2tvdXRFbmFibGVkIC0tPlxuICA8ZGl2IGNsYXNzPVwiZm9ybS1yb3dcIj5cbiAgICA8bWF0LWNoZWNrYm94IFtmb3JtQ29udHJvbF09XCJsb2Nrb3V0RW5hYmxlZFwiIGkxOG49XCJhdXRoLWp3dC1hZG1pblwiXG4gICAgICA+bG9ja291dCBlbmFibGVkPC9tYXQtY2hlY2tib3hcbiAgICA+XG4gICAgPGJ1dHRvblxuICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICBtYXQtaWNvbi1idXR0b25cbiAgICAgIGNvbG9yPVwicHJpbWFyeVwiXG4gICAgICBjbGFzcz1cIm1hdC1wcmltYXJ5XCJcbiAgICAgIChjbGljayk9XCJlbmRMb2Nrb3V0KClcIlxuICAgICAgW2Rpc2FibGVkXT1cInVubG9ja2VkXCJcbiAgICAgIGkxOG4tbWF0VG9vbHRpcD1cImF1dGgtand0LWFkbWluXCJcbiAgICAgIG1hdFRvb2x0aXA9XCJVbmxvY2sgdGhpcyB1c2VyIGlmIGxvY2tlZFwiXG4gICAgPlxuICAgICAgPG1hdC1pY29uPmxvY2tfb3BlbjwvbWF0LWljb24+XG4gICAgPC9idXR0b24+XG4gIDwvZGl2PlxuXG4gIDxkaXYgY2xhc3M9XCJmb3JtLXJvd1wiPlxuICAgIDwhLS0gZmlyc3ROYW1lIC0tPlxuICAgIDxtYXQtZm9ybS1maWVsZD5cbiAgICAgIDxtYXQtbGFiZWwgaTE4bj1cImF1dGgtand0LWFkbWluXCI+Zmlyc3QgbmFtZTwvbWF0LWxhYmVsPlxuICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgbWF0SW5wdXQgW2Zvcm1Db250cm9sXT1cImZpcnN0TmFtZVwiIC8+XG4gICAgICBAaWYgKCBmaXJzdE5hbWUuaGFzRXJyb3IoJ3JlcXVpcmVkJykgJiYgKGZpcnN0TmFtZS5kaXJ0eSB8fFxuICAgICAgZmlyc3ROYW1lLnRvdWNoZWQpICkge1xuICAgICAgPG1hdC1lcnJvciBpMThuPVwiYXV0aC1qd3QtYWRtaW5cIj4gZmlyc3QgbmFtZSByZXF1aXJlZCA8L21hdC1lcnJvcj5cbiAgICAgIH0gQGlmICggZmlyc3ROYW1lLmhhc0Vycm9yKCdtYXhsZW5ndGgnKSAmJiAoZmlyc3ROYW1lLmRpcnR5IHx8XG4gICAgICBmaXJzdE5hbWUudG91Y2hlZCkgKSB7XG4gICAgICA8bWF0LWVycm9yIGkxOG49XCJhdXRoLWp3dC1hZG1pblwiPiBmaXJzdCBuYW1lIHRvbyBsb25nIDwvbWF0LWVycm9yPlxuICAgICAgfVxuICAgIDwvbWF0LWZvcm0tZmllbGQ+XG5cbiAgICA8IS0tIGxhc3ROYW1lIC0tPlxuICAgIDxtYXQtZm9ybS1maWVsZD5cbiAgICAgIDxtYXQtbGFiZWwgaTE4bj1cImF1dGgtand0LWFkbWluXCI+bGFzdCBuYW1lPC9tYXQtbGFiZWw+XG4gICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBtYXRJbnB1dCBbZm9ybUNvbnRyb2xdPVwibGFzdE5hbWVcIiAvPlxuICAgICAgQGlmICggbGFzdE5hbWUuaGFzRXJyb3IoJ3JlcXVpcmVkJykgJiYgKGxhc3ROYW1lLmRpcnR5IHx8XG4gICAgICBsYXN0TmFtZS50b3VjaGVkKSApIHtcbiAgICAgIDxtYXQtZXJyb3IgaTE4bj1cImF1dGgtand0LWFkbWluXCI+IGxhc3QgbmFtZSByZXF1aXJlZCA8L21hdC1lcnJvcj5cbiAgICAgIH0gQGlmICggbGFzdE5hbWUuaGFzRXJyb3IoJ21heGxlbmd0aCcpICYmIChsYXN0TmFtZS5kaXJ0eSB8fFxuICAgICAgbGFzdE5hbWUudG91Y2hlZCkgKSB7XG4gICAgICA8bWF0LWVycm9yIGkxOG49XCJhdXRoLWp3dC1hZG1pblwiPiBsYXN0IG5hbWUgdG9vIGxvbmcgPC9tYXQtZXJyb3I+XG4gICAgICB9XG4gICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgPC9kaXY+XG5cbiAgPCEtLSByb2xlcyAtLT5cbiAgPGRpdj5cbiAgICA8bWF0LWZvcm0tZmllbGQgc3R5bGU9XCJ3aWR0aDogMTZlbVwiPlxuICAgICAgPG1hdC1sYWJlbCBpMThuPVwiYXV0aC1qd3QtYWRtaW5cIj5yb2xlczwvbWF0LWxhYmVsPlxuICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgbWF0SW5wdXQgW2Zvcm1Db250cm9sXT1cInJvbGVzXCIgLz5cbiAgICAgIEBpZiAocm9sZXMuaGFzRXJyb3IoJ21heGxlbmd0aCcpICYmIChyb2xlcy5kaXJ0eSB8fCByb2xlcy50b3VjaGVkKSkge1xuICAgICAgPG1hdC1lcnJvciBpMThuPVwiYXV0aC1qd3QtYWRtaW5cIj4gdG9vIGxvbmcgPC9tYXQtZXJyb3I+XG4gICAgICB9XG4gICAgICA8bWF0LWhpbnQgaTE4bj5yb2xlcyAoc2VwYXJhdGVkIGJ5IHNwYWNlKTwvbWF0LWhpbnQ+XG4gICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgPC9kaXY+XG5cbiAgPCEtLSBidXR0b25zIC0tPlxuICA8YnIgLz5cbiAgPGRpdj5cbiAgICA8YnV0dG9uXG4gICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgIG1hdC1pY29uLWJ1dHRvblxuICAgICAgY29sb3I9XCJ3YXJuXCJcbiAgICAgIGNsYXNzPVwibWF0LXdhcm5cIlxuICAgICAgaTE4bi1tYXRUb29sdGlwPVwiYXV0aC1qd3QtYWRtaW5cIlxuICAgICAgbWF0VG9vbHRpcD1cIkNsb3NlXCJcbiAgICAgIChjbGljayk9XCJjbG9zZSgpXCJcbiAgICA+XG4gICAgICA8bWF0LWljb24+Y2FuY2VsPC9tYXQtaWNvbj5cbiAgICA8L2J1dHRvbj5cbiAgICA8YnV0dG9uXG4gICAgICB0eXBlPVwic3VibWl0XCJcbiAgICAgIG1hdC1pY29uLWJ1dHRvblxuICAgICAgY29sb3I9XCJwcmltYXJ5XCJcbiAgICAgIGNsYXNzPVwibWF0LXByaW1hcnlcIlxuICAgICAgW2Rpc2FibGVkXT1cImZvcm0uaW52YWxpZFwiXG4gICAgICBpMThuLW1hdFRvb2x0aXA9XCJhdXRoLWp3dC1hZG1pblwiXG4gICAgICBtYXRUb29sdGlwPVwiU2F2ZSB1c2VyXCJcbiAgICA+XG4gICAgICA8bWF0LWljb24+Y2hlY2tfY2lyY2xlPC9tYXQtaWNvbj5cbiAgICA8L2J1dHRvbj5cbiAgPC9kaXY+XG48L2Zvcm0+XG4iXX0=
111
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlci1lZGl0b3IuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbXlybWlkb24vYXV0aC1qd3QtYWRtaW4vc3JjL2xpYi9jb21wb25lbnRzL3VzZXItZWRpdG9yL3VzZXItZWRpdG9yLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL215cm1pZG9uL2F1dGgtand0LWFkbWluL3NyYy9saWIvY29tcG9uZW50cy91c2VyLWVkaXRvci91c2VyLWVkaXRvci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFVLEtBQUssRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQy9FLE9BQU8sRUFJTCxVQUFVLEdBQ1gsTUFBTSxnQkFBZ0IsQ0FBQzs7Ozs7Ozs7OztBQVF4QixNQUFNLE9BQU8sbUJBQW1CO0lBYTlCLElBQW9CLElBQUksQ0FBQyxLQUF1QjtRQUM5QyxJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztRQUNuQixJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3pCLENBQUM7SUFDRCxJQUFXLElBQUk7UUFDYixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUM7SUFDcEIsQ0FBQztJQUtELFlBQVksV0FBK0IsRUFBVSxZQUE0QjtRQUE1QixpQkFBWSxHQUFaLFlBQVksQ0FBZ0I7UUFDL0UsU0FBUztRQUNULElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxZQUFZLEVBQVEsQ0FBQztRQUMzQyxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksWUFBWSxFQUFPLENBQUM7UUFDM0MsT0FBTztRQUNQLElBQUksQ0FBQyxLQUFLLEdBQUcsV0FBVyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUU7WUFDckMsVUFBVSxDQUFDLFFBQVE7WUFDbkIsVUFBVSxDQUFD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LEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFTLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztnQkFDdEQsQ0FBQyxDQUFDLEVBQUU7U0FDUCxDQUFDO0lBQ0osQ0FBQztJQUVNLFVBQVU7UUFDZixJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNsQixPQUFPO1FBQ1QsQ0FBQztRQUNELElBQUksQ0FBQyxLQUFNLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDeEQsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUM7SUFDdkIsQ0FBQztJQUVNLEtBQUs7UUFDVixJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxDQUFDO0lBQzFCLENBQUM7SUFFTSxJQUFJO1FBQ1QsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ3RCLE9BQU87UUFDVCxDQUFDO1FBQ0QsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDLENBQUM7SUFDL0MsQ0FBQzs4R0F6R1UsbUJBQW1CO2tHQUFuQixtQkFBbUIseUpDZGhDLHkzR0FzR0E7OzJGRHhGYSxtQkFBbUI7a0JBTC9CLFNBQVM7K0JBQ0Usc0JBQXNCO29IQWlCWixJQUFJO3NCQUF2QixLQUFLO2dCQVFJLFVBQVU7c0JBQW5CLE1BQU07Z0JBQ0csV0FBVztzQkFBcEIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0LCBJbnB1dCwgT3V0cHV0LCBFdmVudEVtaXR0ZXIgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHtcclxuICBVbnR5cGVkRm9ybUdyb3VwLFxyXG4gIFVudHlwZWRGb3JtQ29udHJvbCxcclxuICBVbnR5cGVkRm9ybUJ1aWxkZXIsXHJcbiAgVmFsaWRhdG9ycyxcclxufSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IEF1dGhKd3RTZXJ2aWNlLCBVc2VyIH0gZnJvbSAnQG15cm1pZG9uL2F1dGgtand0LWxvZ2luJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnYXV0aC1qd3QtdXNlci1lZGl0b3InLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi91c2VyLWVkaXRvci5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vdXNlci1lZGl0b3IuY29tcG9uZW50LmNzcyddLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgVXNlckVkaXRvckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XHJcbiAgcHJpdmF0ZSBfdXNlcjogVXNlciB8IHVuZGVmaW5lZDtcclxuXHJcbiAgcHVibGljIGVtYWlsOiBVbnR5cGVkRm9ybUNvbnRyb2w7XHJcbiAgcHVibGljIGVtYWlsQ29uZmlybWVkOiBVbnR5cGVkRm9ybUNvbnRyb2w7XHJcbiAgcHVibGljIGxvY2tvdXRFbmFibGVkOiBVbnR5cGVkRm9ybUNvbnRyb2w7XHJcbiAgcHVibGljIGZpcnN0TmFtZTogVW50eXBlZEZvcm1Db250cm9sO1xyXG4gIHB1YmxpYyBsYXN0TmFtZTogVW50eXBlZEZvcm1Db250cm9sO1xyXG4gIHB1YmxpYyByb2xlczogVW50eXBlZEZvcm1Db250cm9sO1xyXG4gIHB1YmxpYyBmb3JtOiBVbnR5cGVkRm9ybUdyb3VwO1xyXG5cclxuICBwdWJsaWMgdW5sb2NrZWQ6IGJvb2xlYW4gfCB1bmRlZmluZWQ7XHJcblxyXG4gIEBJbnB1dCgpIHB1YmxpYyBzZXQgdXNlcih2YWx1ZTogVXNlciB8IHVuZGVmaW5lZCkge1xyXG4gICAgdGhpcy5fdXNlciA9IHZhbHVlO1xyXG4gICAgdGhpcy51cGRhdGVGb3JtKHZhbHVlKTtcclxuICB9XHJcbiAgcHVibGljIGdldCB1c2VyKCk6IFVzZXIgfCB1bmRlZmluZWQge1xyXG4gICAgcmV0dXJuIHRoaXMuX3VzZXI7XHJcbiAgfVxyXG5cclxuICBAT3V0cHV0KCkgdXNlckNoYW5nZTogRXZlbnRFbWl0dGVyPFVzZXI+O1xyXG4gIEBPdXRwdXQoKSBlZGl0b3JDbG9zZTogRXZlbnRFbWl0dGVyPGFueT47XHJcblxyXG4gIGNvbnN0cnVjdG9yKGZvcm1CdWlsZGVyOiBVbnR5cGVkRm9ybUJ1aWxkZXIsIHByaXZhdGUgX2F1dGhTZXJ2aWNlOiBBdXRoSnd0U2VydmljZSkge1xyXG4gICAgLy8gZXZlbnRzXHJcbiAgICB0aGlzLnVzZXJDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPFVzZXI+KCk7XHJcbiAgICB0aGlzLmVkaXRvckNsb3NlID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcbiAgICAvLyBmb3JtXHJcbiAgICB0aGlzLmVtYWlsID0gZm9ybUJ1aWxkZXIuY29udHJvbChudWxsLCBbXHJcbiAgICAgIFZhbGlkYXRvcnMucmVxdWlyZWQsXHJcbiAgICAgIFZhbGlkYXRvcnMuZW1haWwsXHJcbiAgICBdKTtcclxuICAgIHRoaXMuZW1haWxDb25maXJtZWQgPSBmb3JtQnVpbGRlci5jb250cm9sKGZhbHNlKTtcclxuICAgIHRoaXMubG9ja291dEVuYWJsZWQgPSBmb3JtQnVpbGRlci5jb250cm9sKGZhbHNlKTtcclxuICAgIHRoaXMuZmlyc3ROYW1lID0gZm9ybUJ1aWxkZXIuY29udHJvbChudWxsLCBbXHJcbiAgICAgIFZhbGlkYXRvcnMucmVxdWlyZWQsXHJcbiAgICAgIFZhbGlkYXRvcnMubWF4TGVuZ3RoKDUwKSxcclxuICAgIF0pO1xyXG4gICAgdGhpcy5sYXN0TmFtZSA9IGZvcm1CdWlsZGVyLmNvbnRyb2wobnVsbCwgW1xyXG4gICAgICBWYWxpZGF0b3JzLnJlcXVpcmVkLFxyXG4gICAgICBWYWxpZGF0b3JzLm1heExlbmd0aCg1MCksXHJcbiAgICBdKTtcclxuICAgIHRoaXMucm9sZXMgPSBmb3JtQnVpbGRlci5jb250cm9sKG51bGwsIFZhbGlkYXRvcnMubWF4TGVuZ3RoKDIwMCkpO1xyXG5cclxuICAgIHRoaXMuZm9ybSA9IGZvcm1CdWlsZGVyLmdyb3VwKHtcclxuICAgICAgZW1haWw6IHRoaXMuZW1haWwsXHJcbiAgICAgIGVtYWlsQ29uZmlybWVkOiB0aGlzLmVtYWlsQ29uZmlybWVkLFxyXG4gICAgICBsb2Nrb3V0RW5hYmxlZDogdGhpcy5sb2Nrb3V0RW5hYmxlZCxcclxuICAgICAgZmlyc3ROYW1lOiB0aGlzLmZpcnN0TmFtZSxcclxuICAgICAgbGFzdE5hbWU6IHRoaXMubGFzdE5hbWUsXHJcbiAgICAgIHJvbGVzOiB0aGlzLnJvbGVzLFxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBuZ09uSW5pdCgpOiB2b2lkIHt9XHJcblxyXG4gIHByaXZhdGUgdXBkYXRlRm9ybSh1c2VyOiBVc2VyIHwgdW5kZWZpbmVkKTogdm9pZCB7XHJcbiAgICBpZiAoIXVzZXIpIHtcclxuICAgICAgdGhpcy5mb3JtLnJlc2V0KCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmVtYWlsLnNldFZhbHVlKHVzZXIuZW1haWwpO1xyXG4gICAgICB0aGlzLmVtYWlsQ29uZmlybWVkLnNldFZhbHVlKHVzZXIuZW1haWxDb25maXJtZWQpO1xyXG4gICAgICB0aGlzLmxvY2tvdXRFbmFibGVkLnNldFZhbHVlKHVzZXIubG9ja291dEVuYWJsZWQpO1xyXG4gICAgICB0aGlzLmZpcnN0TmFtZS5zZXRWYWx1ZSh1c2VyLmZpcnN0TmFtZSk7XHJcbiAgICAgIHRoaXMubGFzdE5hbWUuc2V0VmFsdWUodXNlci5sYXN0TmFtZSk7XHJcbiAgICAgIGlmICh1c2VyLnJvbGVzPy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgdGhpcy5yb2xlcy5zZXRWYWx1ZSh1c2VyLnJvbGVzLmpvaW4oJyAnKSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5yb2xlcy5zZXRWYWx1ZShudWxsKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRVc2VyRnJvbUZvcm0oKTogVXNlciB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICB1c2VyTmFtZTogdGhpcy5fdXNlcj8udXNlck5hbWUgfHwgJycsXHJcbiAgICAgIGVtYWlsOiB0aGlzLmVtYWlsLnZhbHVlLFxyXG4gICAgICBlbWFpbENvbmZpcm1lZDogdGhpcy5lbWFpbENvbmZpcm1lZC52YWx1ZSxcclxuICAgICAgbG9ja291dEVuYWJsZWQ6IHRoaXMubG9ja291dEVuYWJsZWQudmFsdWUsXHJcbiAgICAgIGZpcnN0TmFtZTogdGhpcy5maXJzdE5hbWUudmFsdWUsXHJcbiAgICAgIGxhc3ROYW1lOiB0aGlzLmxhc3ROYW1lLnZhbHVlLFxyXG4gICAgICByb2xlczogdGhpcy5yb2xlcy52YWx1ZVxyXG4gICAgICAgID8gdGhpcy5yb2xlcy52YWx1ZS5zcGxpdCgnICcpLmZpbHRlcigoczogc3RyaW5nKSA9PiBzKVxyXG4gICAgICAgIDogW10sXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGVuZExvY2tvdXQoKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy51bmxvY2tlZCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLl91c2VyIS5sb2Nrb3V0RW5kID0gdGhpcy5fYXV0aFNlcnZpY2UuZ2V0VVRDRGF0ZSgpO1xyXG4gICAgdGhpcy51bmxvY2tlZCA9IHRydWU7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgY2xvc2UoKTogdm9pZCB7XHJcbiAgICB0aGlzLmVkaXRvckNsb3NlLmVtaXQoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzYXZlKCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuZm9ybS5pbnZhbGlkKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRoaXMudXNlckNoYW5nZS5lbWl0KHRoaXMuZ2V0VXNlckZyb21Gb3JtKCkpO1xyXG4gIH1cclxufVxyXG4iLCI8Zm9ybSBbZm9ybUdyb3VwXT1cImZvcm1cIiAoc3VibWl0KT1cInNhdmUoKVwiPlxuICA8ZGl2IGNsYXNzPVwiZm9ybS1yb3dcIj5cbiAgICA8IS0tIGVtYWlsIC0tPlxuICAgIDxtYXQtZm9ybS1maWVsZD5cbiAgICAgIDxtYXQtbGFiZWwgaTE4bj1cImF1dGgtand0LWFkbWluXCI+ZW1haWw8L21hdC1sYWJlbD5cbiAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIG1hdElucHV0IFtmb3JtQ29udHJvbF09XCJlbWFpbFwiIC8+XG4gICAgICBAaWYgKGVtYWlsLmhhc0Vycm9yKCdyZXF1aXJlZCcpICYmIChlbWFpbC5kaXJ0eSB8fCBlbWFpbC50b3VjaGVkKSkge1xuICAgICAgPG1hdC1lcnJvciBpMThuPVwiYXV0aC1qd3QtYWRtaW5cIj4gZW1haWwgYWRkcmVzcyByZXF1aXJlZCA8L21hdC1lcnJvcj5cbiAgICAgIH0gQGlmIChlbWFpbC5oYXNFcnJvcigncGF0dGVybicpICYmIChlbWFpbC5kaXJ0eSB8fCBlbWFpbC50b3VjaGVkKSkge1xuICAgICAgPG1hdC1lcnJvciBpMThuPVwiYXV0aC1qd3QtYWRtaW5cIj4gaW52YWxpZCBlbWFpbCBhZGRyZXNzIDwvbWF0LWVycm9yPlxuICAgICAgfVxuICAgIDwvbWF0LWZvcm0tZmllbGQ+XG5cbiAgICA8IS0tIGVtYWlsQ29uZmlybWVkIC0tPlxuICAgIDxtYXQtY2hlY2tib3ggW2Zvcm1Db250cm9sXT1cImVtYWlsQ29uZmlybWVkXCIgaTE4bj1cImF1dGgtand0LWFkbWluXCJcbiAgICAgID5lbWFpbCBhZGRyZXNzIGNvbmZpcm1lZDwvbWF0LWNoZWNrYm94XG4gICAgPlxuICA8L2Rpdj5cblxuICA8IS0tIGxvY2tvdXRFbmFibGVkIC0tPlxuICA8ZGl2IGNsYXNzPVwiZm9ybS1yb3dcIj5cbiAgICA8bWF0LWNoZWNrYm94IFtmb3JtQ29udHJvbF09XCJsb2Nrb3V0RW5hYmxlZFwiIGkxOG49XCJhdXRoLWp3dC1hZG1pblwiXG4gICAgICA+bG9ja291dCBlbmFibGVkPC9tYXQtY2hlY2tib3hcbiAgICA+XG4gICAgPGJ1dHRvblxuICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICBtYXQtaWNvbi1idXR0b25cbiAgICAgIGNvbG9yPVwicHJpbWFyeVwiXG4gICAgICAoY2xpY2spPVwiZW5kTG9ja291dCgpXCJcbiAgICAgIFtkaXNhYmxlZF09XCJ1bmxvY2tlZFwiXG4gICAgICBpMThuLW1hdFRvb2x0aXA9XCJhdXRoLWp3dC1hZG1pblwiXG4gICAgICBtYXRUb29sdGlwPVwiVW5sb2NrIHRoaXMgdXNlciBpZiBsb2NrZWRcIlxuICAgID5cbiAgICAgIDxtYXQtaWNvbiBjbGFzcz1cIm1hdC1wcmltYXJ5XCI+bG9ja19vcGVuPC9tYXQtaWNvbj5cbiAgICA8L2J1dHRvbj5cbiAgPC9kaXY+XG5cbiAgPGRpdiBjbGFzcz1cImZvcm0tcm93XCI+XG4gICAgPCEtLSBmaXJzdE5hbWUgLS0+XG4gICAgPG1hdC1mb3JtLWZpZWxkPlxuICAgICAgPG1hdC1sYWJlbCBpMThuPVwiYXV0aC1qd3QtYWRtaW5cIj5maXJzdCBuYW1lPC9tYXQtbGFiZWw+XG4gICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBtYXRJbnB1dCBbZm9ybUNvbnRyb2xdPVwiZmlyc3ROYW1lXCIgLz5cbiAgICAgIEBpZiAoIGZpcnN0TmFtZS5oYXNFcnJvcigncmVxdWlyZWQnKSAmJiAoZmlyc3ROYW1lLmRpcnR5IHx8XG4gICAgICBmaXJzdE5hbWUudG91Y2hlZCkgKSB7XG4gICAgICA8bWF0LWVycm9yIGkxOG49XCJhdXRoLWp3dC1hZG1pblwiPiBmaXJzdCBuYW1lIHJlcXVpcmVkIDwvbWF0LWVycm9yPlxuICAgICAgfSBAaWYgKCBmaXJzdE5hbWUuaGFzRXJyb3IoJ21heGxlbmd0aCcpICYmIChmaXJzdE5hbWUuZGlydHkgfHxcbiAgICAgIGZpcnN0TmFtZS50b3VjaGVkKSApIHtcbiAgICAgIDxtYXQtZXJyb3IgaTE4bj1cImF1dGgtand0LWFkbWluXCI+IGZpcnN0IG5hbWUgdG9vIGxvbmcgPC9tYXQtZXJyb3I+XG4gICAgICB9XG4gICAgPC9tYXQtZm9ybS1maWVsZD5cblxuICAgIDwhLS0gbGFzdE5hbWUgLS0+XG4gICAgPG1hdC1mb3JtLWZpZWxkPlxuICAgICAgPG1hdC1sYWJlbCBpMThuPVwiYXV0aC1qd3QtYWRtaW5cIj5sYXN0IG5hbWU8L21hdC1sYWJlbD5cbiAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIG1hdElucHV0IFtmb3JtQ29udHJvbF09XCJsYXN0TmFtZVwiIC8+XG4gICAgICBAaWYgKCBsYXN0TmFtZS5oYXNFcnJvcigncmVxdWlyZWQnKSAmJiAobGFzdE5hbWUuZGlydHkgfHxcbiAgICAgIGxhc3ROYW1lLnRvdWNoZWQpICkge1xuICAgICAgPG1hdC1lcnJvciBpMThuPVwiYXV0aC1qd3QtYWRtaW5cIj4gbGFzdCBuYW1lIHJlcXVpcmVkIDwvbWF0LWVycm9yPlxuICAgICAgfSBAaWYgKCBsYXN0TmFtZS5oYXNFcnJvcignbWF4bGVuZ3RoJykgJiYgKGxhc3ROYW1lLmRpcnR5IHx8XG4gICAgICBsYXN0TmFtZS50b3VjaGVkKSApIHtcbiAgICAgIDxtYXQtZXJyb3IgaTE4bj1cImF1dGgtand0LWFkbWluXCI+IGxhc3QgbmFtZSB0b28gbG9uZyA8L21hdC1lcnJvcj5cbiAgICAgIH1cbiAgICA8L21hdC1mb3JtLWZpZWxkPlxuICA8L2Rpdj5cblxuICA8IS0tIHJvbGVzIC0tPlxuICA8ZGl2PlxuICAgIDxtYXQtZm9ybS1maWVsZCBzdHlsZT1cIndpZHRoOiAxNmVtXCI+XG4gICAgICA8bWF0LWxhYmVsIGkxOG49XCJhdXRoLWp3dC1hZG1pblwiPnJvbGVzPC9tYXQtbGFiZWw+XG4gICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBtYXRJbnB1dCBbZm9ybUNvbnRyb2xdPVwicm9sZXNcIiAvPlxuICAgICAgQGlmIChyb2xlcy5oYXNFcnJvcignbWF4bGVuZ3RoJykgJiYgKHJvbGVzLmRpcnR5IHx8IHJvbGVzLnRvdWNoZWQpKSB7XG4gICAgICA8bWF0LWVycm9yIGkxOG49XCJhdXRoLWp3dC1hZG1pblwiPiB0b28gbG9uZyA8L21hdC1lcnJvcj5cbiAgICAgIH1cbiAgICAgIDxtYXQtaGludCBpMThuPnJvbGVzIChzZXBhcmF0ZWQgYnkgc3BhY2UpPC9tYXQtaGludD5cbiAgICA8L21hdC1mb3JtLWZpZWxkPlxuICA8L2Rpdj5cblxuICA8IS0tIGJ1dHRvbnMgLS0+XG4gIDxiciAvPlxuICA8ZGl2PlxuICAgIDxidXR0b25cbiAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgbWF0LWljb24tYnV0dG9uXG4gICAgICBjb2xvcj1cIndhcm5cIlxuICAgICAgaTE4bi1tYXRUb29sdGlwPVwiYXV0aC1qd3QtYWRtaW5cIlxuICAgICAgbWF0VG9vbHRpcD1cIkNsb3NlXCJcbiAgICAgIChjbGljayk9XCJjbG9zZSgpXCJcbiAgICA+XG4gICAgICA8bWF0LWljb24gY2xhc3M9XCJtYXQtd2FyblwiPmNhbmNlbDwvbWF0LWljb24+XG4gICAgPC9idXR0b24+XG4gICAgPGJ1dHRvblxuICAgICAgdHlwZT1cInN1Ym1pdFwiXG4gICAgICBtYXQtaWNvbi1idXR0b25cbiAgICAgIGNvbG9yPVwicHJpbWFyeVwiXG4gICAgICBbZGlzYWJsZWRdPVwiZm9ybS5pbnZhbGlkXCJcbiAgICAgIGkxOG4tbWF0VG9vbHRpcD1cImF1dGgtand0LWFkbWluXCJcbiAgICAgIG1hdFRvb2x0aXA9XCJTYXZlIHVzZXJcIlxuICAgID5cbiAgICAgIDxtYXQtaWNvbiBjbGFzcz1cIm1hdC1wcmltYXJ5XCI+Y2hlY2tfY2lyY2xlPC9tYXQtaWNvbj5cbiAgICA8L2J1dHRvbj5cbiAgPC9kaXY+XG48L2Zvcm0+XG4iXX0=
@@ -49,11 +49,11 @@ export class UserFilterComponent {
49
49
  this.filterChange.emit(this._filter);
50
50
  }
51
51
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.2", ngImport: i0, type: UserFilterComponent, deps: [{ token: i1.FormBuilder }], target: i0.ɵɵFactoryTarget.Component }); }
52
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.0.2", type: UserFilterComponent, selector: "auth-jwt-user-filter", inputs: { filter: "filter", disabled: "disabled" }, outputs: { filterChange: "filterChange" }, ngImport: i0, template: "<form [formGroup]=\"form\" (submit)=\"apply()\" ng-disabled=\"disabled\">\r\n <div class=\"form-row\">\r\n <mat-form-field>\r\n <mat-label i18n=\"auth-jwt-admin\">name or ID</mat-label>\r\n <input matInput [formControl]=\"name\" />\r\n <button\r\n mat-icon-button\r\n matSuffix\r\n type=\"button\"\r\n (click)=\"reset()\"\r\n color=\"warn\"\r\n class=\"mat-warn\"\r\n i18n-matTooltip=\"auth-jwt-admin\"\r\n matTooltip=\"Reset filters\"\r\n [disabled]=\"disabled\"\r\n >\r\n <mat-icon>clear</mat-icon>\r\n </button>\r\n </mat-form-field>\r\n\r\n <button\r\n id=\"apply\"\r\n type=\"submit\"\r\n mat-icon-button\r\n color=\"primary\"\r\n class=\"mat-primary\"\r\n [disabled]=\"disabled\"\r\n i18n-matTooltip=\"auth-jwt-admin\"\r\n matTooltip=\"Apply filters\"\r\n >\r\n <mat-icon>check_circle</mat-icon>\r\n </button>\r\n </div>\r\n</form>\r\n", styles: [".form-row{display:flex;gap:8px;align-items:center;flex-wrap:wrap}.form-row *{flex:0 0 auto}#apply{margin-top:-20px}\n"], dependencies: [{ kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.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: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: i2.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "component", type: i3.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i4.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: i5.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i5.MatLabel, selector: "mat-label" }, { kind: "directive", type: i5.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "directive", type: i6.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }] }); }
52
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.0.2", type: UserFilterComponent, selector: "auth-jwt-user-filter", inputs: { filter: "filter", disabled: "disabled" }, outputs: { filterChange: "filterChange" }, ngImport: i0, template: "<form [formGroup]=\"form\" (submit)=\"apply()\" ng-disabled=\"disabled\">\r\n <div class=\"form-row\">\r\n <mat-form-field>\r\n <mat-label i18n=\"auth-jwt-admin\">name or ID</mat-label>\r\n <input matInput [formControl]=\"name\" />\r\n <button\r\n mat-icon-button\r\n matSuffix\r\n type=\"button\"\r\n (click)=\"reset()\"\r\n color=\"warn\"\r\n i18n-matTooltip=\"auth-jwt-admin\"\r\n matTooltip=\"Reset filters\"\r\n [disabled]=\"disabled\"\r\n >\r\n <mat-icon class=\"mat-warn\">clear</mat-icon>\r\n </button>\r\n </mat-form-field>\r\n\r\n <button\r\n id=\"apply\"\r\n type=\"submit\"\r\n mat-icon-button\r\n color=\"primary\"\r\n [disabled]=\"disabled\"\r\n i18n-matTooltip=\"auth-jwt-admin\"\r\n matTooltip=\"Apply filters\"\r\n >\r\n <mat-icon class=\"mat-primary\">check_circle</mat-icon>\r\n </button>\r\n </div>\r\n</form>\r\n", styles: [".form-row{display:flex;gap:8px;align-items:center;flex-wrap:wrap}.form-row *{flex:0 0 auto}#apply{margin-top:-20px}\n"], dependencies: [{ kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.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: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: i2.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "component", type: i3.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i4.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: i5.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i5.MatLabel, selector: "mat-label" }, { kind: "directive", type: i5.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "directive", type: i6.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }] }); }
53
53
  }
54
54
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.2", ngImport: i0, type: UserFilterComponent, decorators: [{
55
55
  type: Component,
56
- args: [{ selector: 'auth-jwt-user-filter', template: "<form [formGroup]=\"form\" (submit)=\"apply()\" ng-disabled=\"disabled\">\r\n <div class=\"form-row\">\r\n <mat-form-field>\r\n <mat-label i18n=\"auth-jwt-admin\">name or ID</mat-label>\r\n <input matInput [formControl]=\"name\" />\r\n <button\r\n mat-icon-button\r\n matSuffix\r\n type=\"button\"\r\n (click)=\"reset()\"\r\n color=\"warn\"\r\n class=\"mat-warn\"\r\n i18n-matTooltip=\"auth-jwt-admin\"\r\n matTooltip=\"Reset filters\"\r\n [disabled]=\"disabled\"\r\n >\r\n <mat-icon>clear</mat-icon>\r\n </button>\r\n </mat-form-field>\r\n\r\n <button\r\n id=\"apply\"\r\n type=\"submit\"\r\n mat-icon-button\r\n color=\"primary\"\r\n class=\"mat-primary\"\r\n [disabled]=\"disabled\"\r\n i18n-matTooltip=\"auth-jwt-admin\"\r\n matTooltip=\"Apply filters\"\r\n >\r\n <mat-icon>check_circle</mat-icon>\r\n </button>\r\n </div>\r\n</form>\r\n", styles: [".form-row{display:flex;gap:8px;align-items:center;flex-wrap:wrap}.form-row *{flex:0 0 auto}#apply{margin-top:-20px}\n"] }]
56
+ args: [{ selector: 'auth-jwt-user-filter', template: "<form [formGroup]=\"form\" (submit)=\"apply()\" ng-disabled=\"disabled\">\r\n <div class=\"form-row\">\r\n <mat-form-field>\r\n <mat-label i18n=\"auth-jwt-admin\">name or ID</mat-label>\r\n <input matInput [formControl]=\"name\" />\r\n <button\r\n mat-icon-button\r\n matSuffix\r\n type=\"button\"\r\n (click)=\"reset()\"\r\n color=\"warn\"\r\n i18n-matTooltip=\"auth-jwt-admin\"\r\n matTooltip=\"Reset filters\"\r\n [disabled]=\"disabled\"\r\n >\r\n <mat-icon class=\"mat-warn\">clear</mat-icon>\r\n </button>\r\n </mat-form-field>\r\n\r\n <button\r\n id=\"apply\"\r\n type=\"submit\"\r\n mat-icon-button\r\n color=\"primary\"\r\n [disabled]=\"disabled\"\r\n i18n-matTooltip=\"auth-jwt-admin\"\r\n matTooltip=\"Apply filters\"\r\n >\r\n <mat-icon class=\"mat-primary\">check_circle</mat-icon>\r\n </button>\r\n </div>\r\n</form>\r\n", styles: [".form-row{display:flex;gap:8px;align-items:center;flex-wrap:wrap}.form-row *{flex:0 0 auto}#apply{margin-top:-20px}\n"] }]
57
57
  }], ctorParameters: () => [{ type: i1.FormBuilder }], propDecorators: { filter: [{
58
58
  type: Input
59
59
  }], disabled: [{
@@ -61,4 +61,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.2", ngImpor
61
61
  }], filterChange: [{
62
62
  type: Output
63
63
  }] } });
64
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlci1maWx0ZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbXlybWlkb24vYXV0aC1qd3QtYWRtaW4vc3JjL2xpYi9jb21wb25lbnRzL3VzZXItZmlsdGVyL3VzZXItZmlsdGVyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL215cm1pZG9uL2F1dGgtand0LWFkbWluL3NyYy9saWIvY29tcG9uZW50cy91c2VyLWZpbHRlci91c2VyLWZpbHRlci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQVUsWUFBWSxFQUFFLE1BQU0sZUFBZSxDQUFDOzs7Ozs7OztBQVcvRSxNQUFNLE9BQU8sbUJBQW1CO0lBRzlCLElBQ1csTUFBTTtRQUNmLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQztJQUN0QixDQUFDO0lBQ0QsSUFBVyxNQUFNLENBQUMsS0FBb0M7UUFDcEQsSUFBSSxJQUFJLENBQUMsT0FBTyxLQUFLLEtBQUssRUFBRSxDQUFDO1lBQzNCLE9BQU87UUFDVCxDQUFDO1FBQ0QsSUFBSSxDQUFDLE9BQU8sR0FBRyxLQUFLLElBQUksU0FBUyxDQUFDO1FBQ2xDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ2hDLENBQUM7SUFjRCxZQUFZLFdBQXdCO1FBQ2xDLE9BQU87UUFDUCxJQUFJLENBQUMsSUFBSSxHQUFHLFdBQVcsQ0FBQyxPQUFPLENBQWdCLElBQUksQ0FBQyxDQUFDO1FBQ3JELElBQUksQ0FBQyxJQUFJLEdBQUcsV0FBVyxDQUFDLEtBQUssQ0FBQztZQUM1QixJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUk7U0FDaEIsQ0FBQyxDQUFDO1FBQ0gsUUFBUTtRQUNSLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxZQUFZLEVBQWMsQ0FBQztJQUNyRCxDQUFDO0lBRU8sVUFBVSxDQUFDLE1BQW1CO1FBQ3BDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNaLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDbEIsT0FBTztRQUNULENBQUM7UUFDRCxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxDQUFDO1FBQ3hDLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7SUFDN0IsQ0FBQztJQUVPLFNBQVM7UUFDZixPQUFPO1lBQ0wsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRTtTQUM5QixDQUFDO0lBQ0osQ0FBQztJQUVNLEtBQUs7UUFDVixJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ2xCLElBQUksQ0FBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO1FBQ2xCLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUN2QyxDQUFDO0lBRU0sS0FBSztRQUNWLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQ2hDLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUN2QyxDQUFDOzhHQTdEVSxtQkFBbUI7a0dBQW5CLG1CQUFtQiwySkNYaEMsdytCQWtDQTs7MkZEdkJhLG1CQUFtQjtrQkFML0IsU0FBUzsrQkFDRSxzQkFBc0I7Z0ZBUXJCLE1BQU07c0JBRGhCLEtBQUs7Z0JBYUMsUUFBUTtzQkFEZCxLQUFLO2dCQU9DLFlBQVk7c0JBRGxCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBPdXRwdXQsIE9uSW5pdCwgRXZlbnRFbWl0dGVyIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEZvcm1CdWlsZGVyLCBGb3JtQ29udHJvbCwgRm9ybUdyb3VwIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XHJcblxyXG5pbXBvcnQgeyBVc2VyRmlsdGVyIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvYXV0aC1qd3QtYWNjb3VudC5zZXJ2aWNlJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnYXV0aC1qd3QtdXNlci1maWx0ZXInLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi91c2VyLWZpbHRlci5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vdXNlci1maWx0ZXIuY29tcG9uZW50LmNzcyddLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgVXNlckZpbHRlckNvbXBvbmVudCB7XHJcbiAgcHJpdmF0ZSBfZmlsdGVyPzogVXNlckZpbHRlcjtcclxuXHJcbiAgQElucHV0KClcclxuICBwdWJsaWMgZ2V0IGZpbHRlcigpOiBVc2VyRmlsdGVyIHwgbnVsbCB8IHVuZGVmaW5lZCB7XHJcbiAgICByZXR1cm4gdGhpcy5fZmlsdGVyO1xyXG4gIH1cclxuICBwdWJsaWMgc2V0IGZpbHRlcih2YWx1ZTogVXNlckZpbHRlciB8IG51bGwgfCB1bmRlZmluZWQpIHtcclxuICAgIGlmICh0aGlzLl9maWx0ZXIgPT09IHZhbHVlKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRoaXMuX2ZpbHRlciA9IHZhbHVlIHx8IHVuZGVmaW5lZDtcclxuICAgIHRoaXMudXBkYXRlRm9ybSh0aGlzLl9maWx0ZXIpO1xyXG4gIH1cclxuXHJcbiAgQElucHV0KClcclxuICBwdWJsaWMgZGlzYWJsZWQ6IGJvb2xlYW4gfCB1bmRlZmluZWQ7XHJcblxyXG4gIC8qKlxyXG4gICAqIEV2ZW50IGVtaXR0ZWQgd2hlbiB0aGUgZmlsdGVyIGNoYW5nZXMuXHJcbiAgICovXHJcbiAgQE91dHB1dCgpXHJcbiAgcHVibGljIGZpbHRlckNoYW5nZTogRXZlbnRFbWl0dGVyPFVzZXJGaWx0ZXI+O1xyXG5cclxuICBwdWJsaWMgbmFtZTogRm9ybUNvbnRyb2w8c3RyaW5nIHwgbnVsbD47XHJcbiAgcHVibGljIGZvcm06IEZvcm1Hcm91cDtcclxuXHJcbiAgY29uc3RydWN0b3IoZm9ybUJ1aWxkZXI6IEZvcm1CdWlsZGVyKSB7XHJcbiAgICAvLyBmb3JtXHJcbiAgICB0aGlzLm5hbWUgPSBmb3JtQnVpbGRlci5jb250cm9sPHN0cmluZyB8IG51bGw+KG51bGwpO1xyXG4gICAgdGhpcy5mb3JtID0gZm9ybUJ1aWxkZXIuZ3JvdXAoe1xyXG4gICAgICBuYW1lOiB0aGlzLm5hbWUsXHJcbiAgICB9KTtcclxuICAgIC8vIGV2ZW50XHJcbiAgICB0aGlzLmZpbHRlckNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8VXNlckZpbHRlcj4oKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgdXBkYXRlRm9ybShmaWx0ZXI/OiBVc2VyRmlsdGVyKTogdm9pZCB7XHJcbiAgICBpZiAoIWZpbHRlcikge1xyXG4gICAgICB0aGlzLmZvcm0ucmVzZXQoKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy5uYW1lLnNldFZhbHVlKGZpbHRlci5uYW1lIHx8IG51bGwpO1xyXG4gICAgdGhpcy5mb3JtLm1hcmtBc1ByaXN0aW5lKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldEZpbHRlcigpOiBVc2VyRmlsdGVyIHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIG5hbWU6IHRoaXMubmFtZS52YWx1ZT8udHJpbSgpLFxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyByZXNldCgpOiB2b2lkIHtcclxuICAgIHRoaXMuZm9ybS5yZXNldCgpO1xyXG4gICAgdGhpcy5fZmlsdGVyID0ge307XHJcbiAgICB0aGlzLmZpbHRlckNoYW5nZS5lbWl0KHRoaXMuX2ZpbHRlcik7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXBwbHkoKTogdm9pZCB7XHJcbiAgICB0aGlzLl9maWx0ZXIgPSB0aGlzLmdldEZpbHRlcigpO1xyXG4gICAgdGhpcy5maWx0ZXJDaGFuZ2UuZW1pdCh0aGlzLl9maWx0ZXIpO1xyXG4gIH1cclxufVxyXG4iLCI8Zm9ybSBbZm9ybUdyb3VwXT1cImZvcm1cIiAoc3VibWl0KT1cImFwcGx5KClcIiBuZy1kaXNhYmxlZD1cImRpc2FibGVkXCI+XHJcbiAgPGRpdiBjbGFzcz1cImZvcm0tcm93XCI+XHJcbiAgICA8bWF0LWZvcm0tZmllbGQ+XHJcbiAgICAgIDxtYXQtbGFiZWwgaTE4bj1cImF1dGgtand0LWFkbWluXCI+bmFtZSBvciBJRDwvbWF0LWxhYmVsPlxyXG4gICAgICA8aW5wdXQgbWF0SW5wdXQgW2Zvcm1Db250cm9sXT1cIm5hbWVcIiAvPlxyXG4gICAgICA8YnV0dG9uXHJcbiAgICAgICAgbWF0LWljb24tYnV0dG9uXHJcbiAgICAgICAgbWF0U3VmZml4XHJcbiAgICAgICAgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgICAgKGNsaWNrKT1cInJlc2V0KClcIlxyXG4gICAgICAgIGNvbG9yPVwid2FyblwiXHJcbiAgICAgICAgY2xhc3M9XCJtYXQtd2FyblwiXHJcbiAgICAgICAgaTE4bi1tYXRUb29sdGlwPVwiYXV0aC1qd3QtYWRtaW5cIlxyXG4gICAgICAgIG1hdFRvb2x0aXA9XCJSZXNldCBmaWx0ZXJzXCJcclxuICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxyXG4gICAgICA+XHJcbiAgICAgICAgPG1hdC1pY29uPmNsZWFyPC9tYXQtaWNvbj5cclxuICAgICAgPC9idXR0b24+XHJcbiAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG5cclxuICAgIDxidXR0b25cclxuICAgICAgaWQ9XCJhcHBseVwiXHJcbiAgICAgIHR5cGU9XCJzdWJtaXRcIlxyXG4gICAgICBtYXQtaWNvbi1idXR0b25cclxuICAgICAgY29sb3I9XCJwcmltYXJ5XCJcclxuICAgICAgY2xhc3M9XCJtYXQtcHJpbWFyeVwiXHJcbiAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXHJcbiAgICAgIGkxOG4tbWF0VG9vbHRpcD1cImF1dGgtand0LWFkbWluXCJcclxuICAgICAgbWF0VG9vbHRpcD1cIkFwcGx5IGZpbHRlcnNcIlxyXG4gICAgPlxyXG4gICAgICA8bWF0LWljb24+Y2hlY2tfY2lyY2xlPC9tYXQtaWNvbj5cclxuICAgIDwvYnV0dG9uPlxyXG4gIDwvZGl2PlxyXG48L2Zvcm0+XHJcbiJdfQ==
64
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlci1maWx0ZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbXlybWlkb24vYXV0aC1qd3QtYWRtaW4vc3JjL2xpYi9jb21wb25lbnRzL3VzZXItZmlsdGVyL3VzZXItZmlsdGVyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL215cm1pZG9uL2F1dGgtand0LWFkbWluL3NyYy9saWIvY29tcG9uZW50cy91c2VyLWZpbHRlci91c2VyLWZpbHRlci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQVUsWUFBWSxFQUFFLE1BQU0sZUFBZSxDQUFDOzs7Ozs7OztBQVcvRSxNQUFNLE9BQU8sbUJBQW1CO0lBRzlCLElBQ1csTUFBTTtRQUNmLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQztJQUN0QixDQUFDO0lBQ0QsSUFBVyxNQUFNLENBQUMsS0FBb0M7UUFDcEQsSUFBSSxJQUFJLENBQUMsT0FBTyxLQUFLLEtBQUssRUFBRSxDQUFDO1lBQzNCLE9BQU87UUFDVCxDQUFDO1FBQ0QsSUFBSSxDQUFDLE9BQU8sR0FBRyxLQUFLLElBQUksU0FBUyxDQUFDO1FBQ2xDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ2hDLENBQUM7SUFjRCxZQUFZLFdBQXdCO1FBQ2xDLE9BQU87UUFDUCxJQUFJLENBQUMsSUFBSSxHQUFHLFdBQVcsQ0FBQyxPQUFPLENBQWdCLElBQUksQ0FBQyxDQUFDO1FBQ3JELElBQUksQ0FBQyxJQUFJLEdBQUcsV0FBVyxDQUFDLEtBQUssQ0FBQztZQUM1QixJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUk7U0FDaEIsQ0FBQyxDQUFDO1FBQ0gsUUFBUTtRQUNSLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxZQUFZLEVBQWMsQ0FBQztJQUNyRCxDQUFDO0lBRU8sVUFBVSxDQUFDLE1BQW1CO1FBQ3BDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNaLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDbEIsT0FBTztRQUNULENBQUM7UUFDRCxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxDQUFDO1FBQ3hDLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7SUFDN0IsQ0FBQztJQUVPLFNBQVM7UUFDZixPQUFPO1lBQ0wsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRTtTQUM5QixDQUFDO0lBQ0osQ0FBQztJQUVNLEtBQUs7UUFDVixJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ2xCLElBQUksQ0FBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO1FBQ2xCLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUN2QyxDQUFDO0lBRU0sS0FBSztRQUNWLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQ2hDLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUN2QyxDQUFDOzhHQTdEVSxtQkFBbUI7a0dBQW5CLG1CQUFtQiwySkNYaEMsbzlCQWdDQTs7MkZEckJhLG1CQUFtQjtrQkFML0IsU0FBUzsrQkFDRSxzQkFBc0I7Z0ZBUXJCLE1BQU07c0JBRGhCLEtBQUs7Z0JBYUMsUUFBUTtzQkFEZCxLQUFLO2dCQU9DLFlBQVk7c0JBRGxCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBPdXRwdXQsIE9uSW5pdCwgRXZlbnRFbWl0dGVyIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEZvcm1CdWlsZGVyLCBGb3JtQ29udHJvbCwgRm9ybUdyb3VwIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XHJcblxyXG5pbXBvcnQgeyBVc2VyRmlsdGVyIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvYXV0aC1qd3QtYWNjb3VudC5zZXJ2aWNlJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnYXV0aC1qd3QtdXNlci1maWx0ZXInLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi91c2VyLWZpbHRlci5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vdXNlci1maWx0ZXIuY29tcG9uZW50LmNzcyddLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgVXNlckZpbHRlckNvbXBvbmVudCB7XHJcbiAgcHJpdmF0ZSBfZmlsdGVyPzogVXNlckZpbHRlcjtcclxuXHJcbiAgQElucHV0KClcclxuICBwdWJsaWMgZ2V0IGZpbHRlcigpOiBVc2VyRmlsdGVyIHwgbnVsbCB8IHVuZGVmaW5lZCB7XHJcbiAgICByZXR1cm4gdGhpcy5fZmlsdGVyO1xyXG4gIH1cclxuICBwdWJsaWMgc2V0IGZpbHRlcih2YWx1ZTogVXNlckZpbHRlciB8IG51bGwgfCB1bmRlZmluZWQpIHtcclxuICAgIGlmICh0aGlzLl9maWx0ZXIgPT09IHZhbHVlKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRoaXMuX2ZpbHRlciA9IHZhbHVlIHx8IHVuZGVmaW5lZDtcclxuICAgIHRoaXMudXBkYXRlRm9ybSh0aGlzLl9maWx0ZXIpO1xyXG4gIH1cclxuXHJcbiAgQElucHV0KClcclxuICBwdWJsaWMgZGlzYWJsZWQ6IGJvb2xlYW4gfCB1bmRlZmluZWQ7XHJcblxyXG4gIC8qKlxyXG4gICAqIEV2ZW50IGVtaXR0ZWQgd2hlbiB0aGUgZmlsdGVyIGNoYW5nZXMuXHJcbiAgICovXHJcbiAgQE91dHB1dCgpXHJcbiAgcHVibGljIGZpbHRlckNoYW5nZTogRXZlbnRFbWl0dGVyPFVzZXJGaWx0ZXI+O1xyXG5cclxuICBwdWJsaWMgbmFtZTogRm9ybUNvbnRyb2w8c3RyaW5nIHwgbnVsbD47XHJcbiAgcHVibGljIGZvcm06IEZvcm1Hcm91cDtcclxuXHJcbiAgY29uc3RydWN0b3IoZm9ybUJ1aWxkZXI6IEZvcm1CdWlsZGVyKSB7XHJcbiAgICAvLyBmb3JtXHJcbiAgICB0aGlzLm5hbWUgPSBmb3JtQnVpbGRlci5jb250cm9sPHN0cmluZyB8IG51bGw+KG51bGwpO1xyXG4gICAgdGhpcy5mb3JtID0gZm9ybUJ1aWxkZXIuZ3JvdXAoe1xyXG4gICAgICBuYW1lOiB0aGlzLm5hbWUsXHJcbiAgICB9KTtcclxuICAgIC8vIGV2ZW50XHJcbiAgICB0aGlzLmZpbHRlckNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8VXNlckZpbHRlcj4oKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgdXBkYXRlRm9ybShmaWx0ZXI/OiBVc2VyRmlsdGVyKTogdm9pZCB7XHJcbiAgICBpZiAoIWZpbHRlcikge1xyXG4gICAgICB0aGlzLmZvcm0ucmVzZXQoKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy5uYW1lLnNldFZhbHVlKGZpbHRlci5uYW1lIHx8IG51bGwpO1xyXG4gICAgdGhpcy5mb3JtLm1hcmtBc1ByaXN0aW5lKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldEZpbHRlcigpOiBVc2VyRmlsdGVyIHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIG5hbWU6IHRoaXMubmFtZS52YWx1ZT8udHJpbSgpLFxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyByZXNldCgpOiB2b2lkIHtcclxuICAgIHRoaXMuZm9ybS5yZXNldCgpO1xyXG4gICAgdGhpcy5fZmlsdGVyID0ge307XHJcbiAgICB0aGlzLmZpbHRlckNoYW5nZS5lbWl0KHRoaXMuX2ZpbHRlcik7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXBwbHkoKTogdm9pZCB7XHJcbiAgICB0aGlzLl9maWx0ZXIgPSB0aGlzLmdldEZpbHRlcigpO1xyXG4gICAgdGhpcy5maWx0ZXJDaGFuZ2UuZW1pdCh0aGlzLl9maWx0ZXIpO1xyXG4gIH1cclxufVxyXG4iLCI8Zm9ybSBbZm9ybUdyb3VwXT1cImZvcm1cIiAoc3VibWl0KT1cImFwcGx5KClcIiBuZy1kaXNhYmxlZD1cImRpc2FibGVkXCI+XHJcbiAgPGRpdiBjbGFzcz1cImZvcm0tcm93XCI+XHJcbiAgICA8bWF0LWZvcm0tZmllbGQ+XHJcbiAgICAgIDxtYXQtbGFiZWwgaTE4bj1cImF1dGgtand0LWFkbWluXCI+bmFtZSBvciBJRDwvbWF0LWxhYmVsPlxyXG4gICAgICA8aW5wdXQgbWF0SW5wdXQgW2Zvcm1Db250cm9sXT1cIm5hbWVcIiAvPlxyXG4gICAgICA8YnV0dG9uXHJcbiAgICAgICAgbWF0LWljb24tYnV0dG9uXHJcbiAgICAgICAgbWF0U3VmZml4XHJcbiAgICAgICAgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgICAgKGNsaWNrKT1cInJlc2V0KClcIlxyXG4gICAgICAgIGNvbG9yPVwid2FyblwiXHJcbiAgICAgICAgaTE4bi1tYXRUb29sdGlwPVwiYXV0aC1qd3QtYWRtaW5cIlxyXG4gICAgICAgIG1hdFRvb2x0aXA9XCJSZXNldCBmaWx0ZXJzXCJcclxuICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxyXG4gICAgICA+XHJcbiAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwibWF0LXdhcm5cIj5jbGVhcjwvbWF0LWljb24+XHJcbiAgICAgIDwvYnV0dG9uPlxyXG4gICAgPC9tYXQtZm9ybS1maWVsZD5cclxuXHJcbiAgICA8YnV0dG9uXHJcbiAgICAgIGlkPVwiYXBwbHlcIlxyXG4gICAgICB0eXBlPVwic3VibWl0XCJcclxuICAgICAgbWF0LWljb24tYnV0dG9uXHJcbiAgICAgIGNvbG9yPVwicHJpbWFyeVwiXHJcbiAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXHJcbiAgICAgIGkxOG4tbWF0VG9vbHRpcD1cImF1dGgtand0LWFkbWluXCJcclxuICAgICAgbWF0VG9vbHRpcD1cIkFwcGx5IGZpbHRlcnNcIlxyXG4gICAgPlxyXG4gICAgICA8bWF0LWljb24gY2xhc3M9XCJtYXQtcHJpbWFyeVwiPmNoZWNrX2NpcmNsZTwvbWF0LWljb24+XHJcbiAgICA8L2J1dHRvbj5cclxuICA8L2Rpdj5cclxuPC9mb3JtPlxyXG4iXX0=
@@ -58,10 +58,10 @@ export class UserListComponent {
58
58
  return this._gravatarService.buildGravatarUrl(email, size);
59
59
  }
60
60
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.2", ngImport: i0, type: UserListComponent, deps: [{ token: i1.UserListRepository }, { token: i2.DialogService }, { token: i3.GravatarService }], target: i0.ɵɵFactoryTarget.Component }); }
61
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.0.2", type: UserListComponent, selector: "auth-jwt-user-list", ngImport: i0, template: "<div id=\"container\">\n <div>\n <!-- filters -->\n <div id=\"filters\">\n <auth-jwt-user-filter\n [filter]=\"filter$ | async\"\n (filterChange)=\"onFilterChange($event)\"\n ></auth-jwt-user-filter>\n </div>\n\n <!-- list -->\n @if (page$ | async; as page) {\n <div id=\"list\">\n @if (loading$ | async) {\n <div>\n <mat-progress-bar mode=\"indeterminate\"></mat-progress-bar>\n </div>\n }\n <table>\n <thead>\n <td></td>\n <td></td>\n <th i18n=\"auth-jwt-admin\">name</th>\n <th i18n=\"auth-jwt-admin\" class=\"noif-lt-md\">first</th>\n <th i18n=\"auth-jwt-admin\" class=\"noif-lt-md\">last</th>\n <th i18n=\"auth-jwt-admin\" class=\"noif-lt-md\">email</th>\n <th i18n=\"auth-jwt-admin\">roles</th>\n <th i18n=\"auth-jwt-admin\" class=\"noif-lt-md\">lock end</th>\n </thead>\n <tbody>\n @for (user of page.items; track user) {\n <tr>\n <td class=\"fit-width\">\n <button\n mat-icon-button\n type=\"button\"\n i18n-matTooltip=\"auth-jwt-admin\"\n matTooltip=\"Edit this user\"\n color=\"primary\"\n class=\"mat-primary\"\n (click)=\"setActiveUser(user)\"\n >\n <mat-icon>mode_edit</mat-icon>\n </button>\n <button\n mat-icon-button\n type=\"button\"\n i18n-matTooltip=\"auth-jwt-admin\"\n matTooltip=\"Delete this user\"\n color=\"warn\"\n class=\"mat-warn\"\n (click)=\"deleteUser(user)\"\n >\n <mat-icon>remove_circle</mat-icon>\n </button>\n </td>\n <td class=\"fit-width\">\n <img\n alt=\"avatar\"\n [src]=\"getGravatarUrl(user.email, 32)\"\n [alt]=\"user.userName\"\n />\n </td>\n <td>{{ user.userName }}</td>\n <td class=\"noif-lt-md\">{{ user.firstName }}</td>\n <td class=\"noif-lt-md\">{{ user.lastName }}</td>\n <td class=\"noif-lt-md\">\n <a [href]=\"'mailto:' + user.email\">{{ user.email }}</a>\n </td>\n <td>{{ user.roles.join(\" \") }}</td>\n <td class=\"noif-lt-md\">{{ user.lockoutEnd }}</td>\n </tr>\n }\n </tbody>\n </table>\n <!-- paginator -->\n <div class=\"form-row\">\n <button\n type=\"button\"\n mat-icon-button\n color=\"warn\"\n class=\"mat-warn\"\n i18n-matmatTooltip=\"auth-jwt-admin\"\n matTooltip=\"Refresh list\"\n (click)=\"reset()\"\n >\n <mat-icon>autorenew</mat-icon>\n </button>\n <mat-paginator\n [length]=\"page.total\"\n [pageIndex]=\"page.pageNumber - 1\"\n [pageSize]=\"page.pageSize\"\n [pageSizeOptions]=\"[5, 10, 20, 50, 100]\"\n (page)=\"onPageChange($event)\"\n [showFirstLastButtons]=\"true\"\n ></mat-paginator>\n </div>\n </div>\n }\n </div>\n\n <!-- editor -->\n <mat-expansion-panel\n id=\"editor\"\n [expanded]=\"active$ | async\"\n [disabled]=\"!(active$ | async)\"\n >\n @if (active$ | async; as active) {\n <div>\n <fieldset>\n <legend>{{ active.userName }}</legend>\n <auth-jwt-user-editor\n [user]=\"active\"\n (userChange)=\"saveActiveUser($event)\"\n (editorClose)=\"resetActiveUser()\"\n ></auth-jwt-user-editor>\n </fieldset>\n </div>\n }\n </mat-expansion-panel>\n</div>\n", styles: ["tr:nth-child(odd){background-color:#f8f8f8}th{padding:0 8px;text-align:left;color:silver;font-weight:400}td{padding:0 8px}td.fit-width{width:1px;white-space:nowrap}table{width:100%;border-collapse:collapse}fieldset{border:1px solid silver;border-radius:8px;padding:16px}.form-row{display:flex;gap:8px;align-items:center;flex-wrap:wrap}.form-row *{flex:0 0 auto}div#filters{grid-area:filters}div#list{grid-area:list}div#editor{grid-area:editor}div#container{display:grid;grid-template-rows:auto 1fr auto;grid-template-columns:1fr;grid-template-areas:\"filters\" \"list\" \"editor\";gap:8px}@media only screen and (max-width: 959px){.noif-lt-md{display:none}}@media only screen and (min-width: 1920px){div#container{grid-template-rows:auto 1fr;grid-template-columns:1fr auto;grid-template-areas:\"filters filters\" \"list editor\"}}\n"], dependencies: [{ kind: "component", type: i4.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "component", type: i5.MatExpansionPanel, selector: "mat-expansion-panel", inputs: ["hideToggle", "togglePosition"], outputs: ["afterExpand", "afterCollapse"], exportAs: ["matExpansionPanel"] }, { kind: "component", type: i6.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i7.MatPaginator, selector: "mat-paginator", inputs: ["color", "pageIndex", "length", "pageSize", "pageSizeOptions", "hidePageSize", "showFirstLastButtons", "selectConfig", "disabled"], outputs: ["page"], exportAs: ["matPaginator"] }, { kind: "component", type: i8.MatProgressBar, selector: "mat-progress-bar", inputs: ["color", "value", "bufferValue", "mode"], outputs: ["animationEnd"], exportAs: ["matProgressBar"] }, { kind: "directive", type: i9.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "component", type: i10.UserFilterComponent, selector: "auth-jwt-user-filter", inputs: ["filter", "disabled"], outputs: ["filterChange"] }, { kind: "component", type: i11.UserEditorComponent, selector: "auth-jwt-user-editor", inputs: ["user"], outputs: ["userChange", "editorClose"] }, { kind: "pipe", type: i12.AsyncPipe, name: "async" }] }); }
61
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.0.2", type: UserListComponent, selector: "auth-jwt-user-list", ngImport: i0, template: "<div id=\"container\">\n <div>\n <!-- filters -->\n <div id=\"filters\">\n <auth-jwt-user-filter\n [filter]=\"filter$ | async\"\n (filterChange)=\"onFilterChange($event)\"\n ></auth-jwt-user-filter>\n </div>\n\n <!-- list -->\n @if (page$ | async; as page) {\n <div id=\"list\">\n @if (loading$ | async) {\n <div>\n <mat-progress-bar mode=\"indeterminate\"></mat-progress-bar>\n </div>\n }\n <table>\n <thead>\n <td></td>\n <td></td>\n <th i18n=\"auth-jwt-admin\">name</th>\n <th i18n=\"auth-jwt-admin\" class=\"noif-lt-md\">first</th>\n <th i18n=\"auth-jwt-admin\" class=\"noif-lt-md\">last</th>\n <th i18n=\"auth-jwt-admin\" class=\"noif-lt-md\">email</th>\n <th i18n=\"auth-jwt-admin\">roles</th>\n <th i18n=\"auth-jwt-admin\" class=\"noif-lt-md\">lock end</th>\n </thead>\n <tbody>\n @for (user of page.items; track user) {\n <tr>\n <td class=\"fit-width\">\n <button\n mat-icon-button\n type=\"button\"\n i18n-matTooltip=\"auth-jwt-admin\"\n matTooltip=\"Edit this user\"\n color=\"primary\"\n (click)=\"setActiveUser(user)\"\n >\n <mat-icon class=\"mat-primary\">mode_edit</mat-icon>\n </button>\n <button\n mat-icon-button\n type=\"button\"\n i18n-matTooltip=\"auth-jwt-admin\"\n matTooltip=\"Delete this user\"\n color=\"warn\"\n (click)=\"deleteUser(user)\"\n >\n <mat-icon class=\"mat-warn\">remove_circle</mat-icon>\n </button>\n </td>\n <td class=\"fit-width\">\n <img\n alt=\"avatar\"\n [src]=\"getGravatarUrl(user.email, 32)\"\n [alt]=\"user.userName\"\n />\n </td>\n <td>{{ user.userName }}</td>\n <td class=\"noif-lt-md\">{{ user.firstName }}</td>\n <td class=\"noif-lt-md\">{{ user.lastName }}</td>\n <td class=\"noif-lt-md\">\n <a [href]=\"'mailto:' + user.email\">{{ user.email }}</a>\n </td>\n <td>{{ user.roles.join(\" \") }}</td>\n <td class=\"noif-lt-md\">{{ user.lockoutEnd }}</td>\n </tr>\n }\n </tbody>\n </table>\n <!-- paginator -->\n <div class=\"form-row\">\n <button\n type=\"button\"\n mat-icon-button\n color=\"warn\"\n i18n-matmatTooltip=\"auth-jwt-admin\"\n matTooltip=\"Refresh list\"\n (click)=\"reset()\"\n >\n <mat-icon class=\"mat-warn\">autorenew</mat-icon>\n </button>\n <mat-paginator\n [length]=\"page.total\"\n [pageIndex]=\"page.pageNumber - 1\"\n [pageSize]=\"page.pageSize\"\n [pageSizeOptions]=\"[5, 10, 20, 50, 100]\"\n (page)=\"onPageChange($event)\"\n [showFirstLastButtons]=\"true\"\n ></mat-paginator>\n </div>\n </div>\n }\n </div>\n\n <!-- editor -->\n <mat-expansion-panel\n id=\"editor\"\n [expanded]=\"active$ | async\"\n [disabled]=\"!(active$ | async)\"\n >\n @if (active$ | async; as active) {\n <div>\n <fieldset>\n <legend>{{ active.userName }}</legend>\n <auth-jwt-user-editor\n [user]=\"active\"\n (userChange)=\"saveActiveUser($event)\"\n (editorClose)=\"resetActiveUser()\"\n ></auth-jwt-user-editor>\n </fieldset>\n </div>\n }\n </mat-expansion-panel>\n</div>\n", styles: ["tr:nth-child(odd){background-color:#f8f8f8}th{padding:0 8px;text-align:left;color:silver;font-weight:400}td{padding:0 8px}td.fit-width{width:1px;white-space:nowrap}table{width:100%;border-collapse:collapse}fieldset{border:1px solid silver;border-radius:8px;padding:16px}.form-row{display:flex;gap:8px;align-items:center;flex-wrap:wrap}.form-row *{flex:0 0 auto}div#filters{grid-area:filters}div#list{grid-area:list}div#editor{grid-area:editor}div#container{display:grid;grid-template-rows:auto 1fr auto;grid-template-columns:1fr;grid-template-areas:\"filters\" \"list\" \"editor\";gap:8px}@media only screen and (max-width: 959px){.noif-lt-md{display:none}}@media only screen and (min-width: 1920px){div#container{grid-template-rows:auto 1fr;grid-template-columns:1fr auto;grid-template-areas:\"filters filters\" \"list editor\"}}\n"], dependencies: [{ kind: "component", type: i4.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "component", type: i5.MatExpansionPanel, selector: "mat-expansion-panel", inputs: ["hideToggle", "togglePosition"], outputs: ["afterExpand", "afterCollapse"], exportAs: ["matExpansionPanel"] }, { kind: "component", type: i6.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i7.MatPaginator, selector: "mat-paginator", inputs: ["color", "pageIndex", "length", "pageSize", "pageSizeOptions", "hidePageSize", "showFirstLastButtons", "selectConfig", "disabled"], outputs: ["page"], exportAs: ["matPaginator"] }, { kind: "component", type: i8.MatProgressBar, selector: "mat-progress-bar", inputs: ["color", "value", "bufferValue", "mode"], outputs: ["animationEnd"], exportAs: ["matProgressBar"] }, { kind: "directive", type: i9.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "component", type: i10.UserFilterComponent, selector: "auth-jwt-user-filter", inputs: ["filter", "disabled"], outputs: ["filterChange"] }, { kind: "component", type: i11.UserEditorComponent, selector: "auth-jwt-user-editor", inputs: ["user"], outputs: ["userChange", "editorClose"] }, { kind: "pipe", type: i12.AsyncPipe, name: "async" }] }); }
62
62
  }
63
63
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.2", ngImport: i0, type: UserListComponent, decorators: [{
64
64
  type: Component,
65
- args: [{ selector: 'auth-jwt-user-list', template: "<div id=\"container\">\n <div>\n <!-- filters -->\n <div id=\"filters\">\n <auth-jwt-user-filter\n [filter]=\"filter$ | async\"\n (filterChange)=\"onFilterChange($event)\"\n ></auth-jwt-user-filter>\n </div>\n\n <!-- list -->\n @if (page$ | async; as page) {\n <div id=\"list\">\n @if (loading$ | async) {\n <div>\n <mat-progress-bar mode=\"indeterminate\"></mat-progress-bar>\n </div>\n }\n <table>\n <thead>\n <td></td>\n <td></td>\n <th i18n=\"auth-jwt-admin\">name</th>\n <th i18n=\"auth-jwt-admin\" class=\"noif-lt-md\">first</th>\n <th i18n=\"auth-jwt-admin\" class=\"noif-lt-md\">last</th>\n <th i18n=\"auth-jwt-admin\" class=\"noif-lt-md\">email</th>\n <th i18n=\"auth-jwt-admin\">roles</th>\n <th i18n=\"auth-jwt-admin\" class=\"noif-lt-md\">lock end</th>\n </thead>\n <tbody>\n @for (user of page.items; track user) {\n <tr>\n <td class=\"fit-width\">\n <button\n mat-icon-button\n type=\"button\"\n i18n-matTooltip=\"auth-jwt-admin\"\n matTooltip=\"Edit this user\"\n color=\"primary\"\n class=\"mat-primary\"\n (click)=\"setActiveUser(user)\"\n >\n <mat-icon>mode_edit</mat-icon>\n </button>\n <button\n mat-icon-button\n type=\"button\"\n i18n-matTooltip=\"auth-jwt-admin\"\n matTooltip=\"Delete this user\"\n color=\"warn\"\n class=\"mat-warn\"\n (click)=\"deleteUser(user)\"\n >\n <mat-icon>remove_circle</mat-icon>\n </button>\n </td>\n <td class=\"fit-width\">\n <img\n alt=\"avatar\"\n [src]=\"getGravatarUrl(user.email, 32)\"\n [alt]=\"user.userName\"\n />\n </td>\n <td>{{ user.userName }}</td>\n <td class=\"noif-lt-md\">{{ user.firstName }}</td>\n <td class=\"noif-lt-md\">{{ user.lastName }}</td>\n <td class=\"noif-lt-md\">\n <a [href]=\"'mailto:' + user.email\">{{ user.email }}</a>\n </td>\n <td>{{ user.roles.join(\" \") }}</td>\n <td class=\"noif-lt-md\">{{ user.lockoutEnd }}</td>\n </tr>\n }\n </tbody>\n </table>\n <!-- paginator -->\n <div class=\"form-row\">\n <button\n type=\"button\"\n mat-icon-button\n color=\"warn\"\n class=\"mat-warn\"\n i18n-matmatTooltip=\"auth-jwt-admin\"\n matTooltip=\"Refresh list\"\n (click)=\"reset()\"\n >\n <mat-icon>autorenew</mat-icon>\n </button>\n <mat-paginator\n [length]=\"page.total\"\n [pageIndex]=\"page.pageNumber - 1\"\n [pageSize]=\"page.pageSize\"\n [pageSizeOptions]=\"[5, 10, 20, 50, 100]\"\n (page)=\"onPageChange($event)\"\n [showFirstLastButtons]=\"true\"\n ></mat-paginator>\n </div>\n </div>\n }\n </div>\n\n <!-- editor -->\n <mat-expansion-panel\n id=\"editor\"\n [expanded]=\"active$ | async\"\n [disabled]=\"!(active$ | async)\"\n >\n @if (active$ | async; as active) {\n <div>\n <fieldset>\n <legend>{{ active.userName }}</legend>\n <auth-jwt-user-editor\n [user]=\"active\"\n (userChange)=\"saveActiveUser($event)\"\n (editorClose)=\"resetActiveUser()\"\n ></auth-jwt-user-editor>\n </fieldset>\n </div>\n }\n </mat-expansion-panel>\n</div>\n", styles: ["tr:nth-child(odd){background-color:#f8f8f8}th{padding:0 8px;text-align:left;color:silver;font-weight:400}td{padding:0 8px}td.fit-width{width:1px;white-space:nowrap}table{width:100%;border-collapse:collapse}fieldset{border:1px solid silver;border-radius:8px;padding:16px}.form-row{display:flex;gap:8px;align-items:center;flex-wrap:wrap}.form-row *{flex:0 0 auto}div#filters{grid-area:filters}div#list{grid-area:list}div#editor{grid-area:editor}div#container{display:grid;grid-template-rows:auto 1fr auto;grid-template-columns:1fr;grid-template-areas:\"filters\" \"list\" \"editor\";gap:8px}@media only screen and (max-width: 959px){.noif-lt-md{display:none}}@media only screen and (min-width: 1920px){div#container{grid-template-rows:auto 1fr;grid-template-columns:1fr auto;grid-template-areas:\"filters filters\" \"list editor\"}}\n"] }]
65
+ args: [{ selector: 'auth-jwt-user-list', template: "<div id=\"container\">\n <div>\n <!-- filters -->\n <div id=\"filters\">\n <auth-jwt-user-filter\n [filter]=\"filter$ | async\"\n (filterChange)=\"onFilterChange($event)\"\n ></auth-jwt-user-filter>\n </div>\n\n <!-- list -->\n @if (page$ | async; as page) {\n <div id=\"list\">\n @if (loading$ | async) {\n <div>\n <mat-progress-bar mode=\"indeterminate\"></mat-progress-bar>\n </div>\n }\n <table>\n <thead>\n <td></td>\n <td></td>\n <th i18n=\"auth-jwt-admin\">name</th>\n <th i18n=\"auth-jwt-admin\" class=\"noif-lt-md\">first</th>\n <th i18n=\"auth-jwt-admin\" class=\"noif-lt-md\">last</th>\n <th i18n=\"auth-jwt-admin\" class=\"noif-lt-md\">email</th>\n <th i18n=\"auth-jwt-admin\">roles</th>\n <th i18n=\"auth-jwt-admin\" class=\"noif-lt-md\">lock end</th>\n </thead>\n <tbody>\n @for (user of page.items; track user) {\n <tr>\n <td class=\"fit-width\">\n <button\n mat-icon-button\n type=\"button\"\n i18n-matTooltip=\"auth-jwt-admin\"\n matTooltip=\"Edit this user\"\n color=\"primary\"\n (click)=\"setActiveUser(user)\"\n >\n <mat-icon class=\"mat-primary\">mode_edit</mat-icon>\n </button>\n <button\n mat-icon-button\n type=\"button\"\n i18n-matTooltip=\"auth-jwt-admin\"\n matTooltip=\"Delete this user\"\n color=\"warn\"\n (click)=\"deleteUser(user)\"\n >\n <mat-icon class=\"mat-warn\">remove_circle</mat-icon>\n </button>\n </td>\n <td class=\"fit-width\">\n <img\n alt=\"avatar\"\n [src]=\"getGravatarUrl(user.email, 32)\"\n [alt]=\"user.userName\"\n />\n </td>\n <td>{{ user.userName }}</td>\n <td class=\"noif-lt-md\">{{ user.firstName }}</td>\n <td class=\"noif-lt-md\">{{ user.lastName }}</td>\n <td class=\"noif-lt-md\">\n <a [href]=\"'mailto:' + user.email\">{{ user.email }}</a>\n </td>\n <td>{{ user.roles.join(\" \") }}</td>\n <td class=\"noif-lt-md\">{{ user.lockoutEnd }}</td>\n </tr>\n }\n </tbody>\n </table>\n <!-- paginator -->\n <div class=\"form-row\">\n <button\n type=\"button\"\n mat-icon-button\n color=\"warn\"\n i18n-matmatTooltip=\"auth-jwt-admin\"\n matTooltip=\"Refresh list\"\n (click)=\"reset()\"\n >\n <mat-icon class=\"mat-warn\">autorenew</mat-icon>\n </button>\n <mat-paginator\n [length]=\"page.total\"\n [pageIndex]=\"page.pageNumber - 1\"\n [pageSize]=\"page.pageSize\"\n [pageSizeOptions]=\"[5, 10, 20, 50, 100]\"\n (page)=\"onPageChange($event)\"\n [showFirstLastButtons]=\"true\"\n ></mat-paginator>\n </div>\n </div>\n }\n </div>\n\n <!-- editor -->\n <mat-expansion-panel\n id=\"editor\"\n [expanded]=\"active$ | async\"\n [disabled]=\"!(active$ | async)\"\n >\n @if (active$ | async; as active) {\n <div>\n <fieldset>\n <legend>{{ active.userName }}</legend>\n <auth-jwt-user-editor\n [user]=\"active\"\n (userChange)=\"saveActiveUser($event)\"\n (editorClose)=\"resetActiveUser()\"\n ></auth-jwt-user-editor>\n </fieldset>\n </div>\n }\n </mat-expansion-panel>\n</div>\n", styles: ["tr:nth-child(odd){background-color:#f8f8f8}th{padding:0 8px;text-align:left;color:silver;font-weight:400}td{padding:0 8px}td.fit-width{width:1px;white-space:nowrap}table{width:100%;border-collapse:collapse}fieldset{border:1px solid silver;border-radius:8px;padding:16px}.form-row{display:flex;gap:8px;align-items:center;flex-wrap:wrap}.form-row *{flex:0 0 auto}div#filters{grid-area:filters}div#list{grid-area:list}div#editor{grid-area:editor}div#container{display:grid;grid-template-rows:auto 1fr auto;grid-template-columns:1fr;grid-template-areas:\"filters\" \"list\" \"editor\";gap:8px}@media only screen and (max-width: 959px){.noif-lt-md{display:none}}@media only screen and (min-width: 1920px){div#container{grid-template-rows:auto 1fr;grid-template-columns:1fr auto;grid-template-areas:\"filters filters\" \"list editor\"}}\n"] }]
66
66
  }], ctorParameters: () => [{ type: i1.UserListRepository }, { type: i2.DialogService }, { type: i3.GravatarService }] });
67
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlci1saXN0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL215cm1pZG9uL2F1dGgtand0LWFkbWluL3NyYy9saWIvY29tcG9uZW50cy91c2VyLWxpc3QvdXNlci1saXN0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL215cm1pZG9uL2F1dGgtand0LWFkbWluL3NyYy9saWIvY29tcG9uZW50cy91c2VyLWxpc3QvdXNlci1saXN0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFHMUMsT0FBTyx3QkFBd0IsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7QUFjaEMsTUFBTSxPQUFPLGlCQUFpQjtJQU01QixZQUNVLFdBQStCLEVBQy9CLGNBQTZCLEVBQzdCLGdCQUFpQztRQUZqQyxnQkFBVyxHQUFYLFdBQVcsQ0FBb0I7UUFDL0IsbUJBQWMsR0FBZCxjQUFjLENBQWU7UUFDN0IscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFpQjtRQUV6QyxJQUFJLENBQUMsT0FBTyxHQUFHLFdBQVcsQ0FBQyxPQUFPLENBQUM7UUFDbkMsSUFBSSxDQUFDLEtBQUssR0FBRyxXQUFXLENBQUMsS0FBSyxDQUFDO1FBQy9CLElBQUksQ0FBQyxPQUFPLEdBQUcsV0FBVyxDQUFDLFdBQVcsQ0FBQztRQUN2QyxJQUFJLENBQUMsUUFBUSxHQUFHLFdBQVcsQ0FBQyxRQUFRLENBQUM7SUFDdkMsQ0FBQztJQUVNLEtBQUs7UUFDVixJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQzNCLENBQUM7SUFFTSxjQUFjLENBQUMsTUFBa0I7UUFDdEMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDckMsQ0FBQztJQUVNLFlBQVksQ0FBQyxLQUFnQjtRQUNsQyxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsU0FBUyxHQUFHLENBQUMsRUFBRSxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDaEUsQ0FBQztJQUVNLFVBQVUsQ0FBQyxJQUFVO1FBQzFCLElBQUksQ0FBQyxjQUFjO2FBQ2hCLE9BQU8sQ0FDTixTQUFTLENBQUEseUJBQXlCLEVBQ2xDLFNBQVMsQ0FBQSw4QkFBOEIsR0FBRyxJQUFJLENBQUMsUUFBUSxHQUFHLEdBQUcsQ0FDOUQ7YUFDQSxTQUFTLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRTtZQUNqQixJQUFJLEdBQUcsRUFBRSxDQUFDO2dCQUNSLElBQUksQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUM3QyxDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRU0sYUFBYSxDQUFDLElBQWlCO1FBQ3BDLElBQUksQ0FBQyxXQUFXLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3ZDLENBQUM7SUFFTSxlQUFlO1FBQ3BCLElBQUksQ0FBQyxXQUFXLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3ZDLENBQUM7SUFFTSxjQUFjLENBQUMsSUFBVTtRQUM5QixJQUFJLENBQUMsV0FBVyxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3hDLElBQUksQ0FBQyxXQUFXLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3ZDLENBQUM7SUFFTSxpQkFBaUI7UUFDdEIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDdkMsQ0FBQztJQUVNLGNBQWMsQ0FBQyxLQUFhLEVBQUUsSUFBSSxHQUFHLEVBQUU7UUFDNUMsT0FBTyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQzdELENBQUM7OEdBN0RVLGlCQUFpQjtrR0FBakIsaUJBQWlCLDBEQ2pCOUIsbXdIQXlIQTs7MkZEeEdhLGlCQUFpQjtrQkFMN0IsU0FBUzsrQkFDRSxvQkFBb0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgUGFnZUV2ZW50IH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvcGFnaW5hdG9yJztcclxuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgJ0Bhbmd1bGFyL2xvY2FsaXplL2luaXQnO1xyXG5cclxuaW1wb3J0IHsgR3JhdmF0YXJTZXJ2aWNlLCBVc2VyIH0gZnJvbSAnQG15cm1pZG9uL2F1dGgtand0LWxvZ2luJztcclxuaW1wb3J0IHsgRGF0YVBhZ2UgfSBmcm9tICdAbXlybWlkb24vbmctdG9vbHMnO1xyXG5pbXBvcnQgeyBEaWFsb2dTZXJ2aWNlIH0gZnJvbSAnQG15cm1pZG9uL25nLW1hdC10b29scyc7XHJcblxyXG5pbXBvcnQgeyBVc2VyTGlzdFJlcG9zaXRvcnkgfSBmcm9tICcuLi9zdGF0ZS91c2VyLWxpc3QucmVwb3NpdG9yeSc7XHJcbmltcG9ydCB7IFVzZXJGaWx0ZXIgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9hdXRoLWp3dC1hY2NvdW50LnNlcnZpY2UnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdhdXRoLWp3dC11c2VyLWxpc3QnLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi91c2VyLWxpc3QuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL3VzZXItbGlzdC5jb21wb25lbnQuY3NzJ10sXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBVc2VyTGlzdENvbXBvbmVudCB7XHJcbiAgcHVibGljIGFjdGl2ZSQ6IE9ic2VydmFibGU8VXNlciB8IHVuZGVmaW5lZD47XHJcbiAgcHVibGljIGxvYWRpbmckOiBPYnNlcnZhYmxlPGJvb2xlYW4+O1xyXG4gIHB1YmxpYyBmaWx0ZXIkOiBPYnNlcnZhYmxlPFVzZXJGaWx0ZXI+O1xyXG4gIHB1YmxpYyBwYWdlJDogT2JzZXJ2YWJsZTxEYXRhUGFnZTxVc2VyPj47XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSBfcmVwb3NpdG9yeTogVXNlckxpc3RSZXBvc2l0b3J5LFxyXG4gICAgcHJpdmF0ZSBfZGlhbG9nU2VydmljZTogRGlhbG9nU2VydmljZSxcclxuICAgIHByaXZhdGUgX2dyYXZhdGFyU2VydmljZTogR3JhdmF0YXJTZXJ2aWNlXHJcbiAgKSB7XHJcbiAgICB0aGlzLmZpbHRlciQgPSBfcmVwb3NpdG9yeS5maWx0ZXIkO1xyXG4gICAgdGhpcy5wYWdlJCA9IF9yZXBvc2l0b3J5LnBhZ2UkO1xyXG4gICAgdGhpcy5hY3RpdmUkID0gX3JlcG9zaXRvcnkuYWN0aXZlVXNlciQ7XHJcbiAgICB0aGlzLmxvYWRpbmckID0gX3JlcG9zaXRvcnkubG9hZGluZyQ7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgcmVzZXQoKTogdm9pZCB7XHJcbiAgICB0aGlzLl9yZXBvc2l0b3J5LnJlc2V0KCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgb25GaWx0ZXJDaGFuZ2UoZmlsdGVyOiBVc2VyRmlsdGVyKTogdm9pZCB7XHJcbiAgICB0aGlzLl9yZXBvc2l0b3J5LnNldEZpbHRlcihmaWx0ZXIpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIG9uUGFnZUNoYW5nZShldmVudDogUGFnZUV2ZW50KTogdm9pZCB7XHJcbiAgICB0aGlzLl9yZXBvc2l0b3J5LnNldFBhZ2UoZXZlbnQucGFnZUluZGV4ICsgMSwgZXZlbnQucGFnZVNpemUpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGRlbGV0ZVVzZXIodXNlcjogVXNlcik6IHZvaWQge1xyXG4gICAgdGhpcy5fZGlhbG9nU2VydmljZVxyXG4gICAgICAuY29uZmlybShcclxuICAgICAgICAkbG9jYWxpemVgOmF1dGgtand0LWFkbWluOkNvbmZpcm1gLFxyXG4gICAgICAgICRsb2NhbGl6ZWA6YXV0aC1qd3QtYWRtaW46RGVsZXRlIHVzZXIgYCArIHVzZXIudXNlck5hbWUgKyAnPydcclxuICAgICAgKVxyXG4gICAgICAuc3Vic2NyaWJlKCh5ZXMpID0+IHtcclxuICAgICAgICBpZiAoeWVzKSB7XHJcbiAgICAgICAgICB0aGlzLl9yZXBvc2l0b3J5LmRlbGV0ZVVzZXIodXNlci51c2VyTmFtZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXRBY3RpdmVVc2VyKHVzZXI6IFVzZXIgfCBudWxsKTogdm9pZCB7XHJcbiAgICB0aGlzLl9yZXBvc2l0b3J5LnNldEFjdGl2ZVVzZXIodXNlcik7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgcmVzZXRBY3RpdmVVc2VyKCk6IHZvaWQge1xyXG4gICAgdGhpcy5fcmVwb3NpdG9yeS5zZXRBY3RpdmVVc2VyKG51bGwpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNhdmVBY3RpdmVVc2VyKHVzZXI6IFVzZXIpOiB2b2lkIHtcclxuICAgIHRoaXMuX3JlcG9zaXRvcnkudXBkYXRlQWN0aXZlVXNlcih1c2VyKTtcclxuICAgIHRoaXMuX3JlcG9zaXRvcnkuc2V0QWN0aXZlVXNlcihudWxsKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBvblVzZXJFZGl0b3JDbG9zZSgpOiB2b2lkIHtcclxuICAgIHRoaXMuX3JlcG9zaXRvcnkuc2V0QWN0aXZlVXNlcihudWxsKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXRHcmF2YXRhclVybChlbWFpbDogc3RyaW5nLCBzaXplID0gODApOiBzdHJpbmcgfCBudWxsIHtcclxuICAgIHJldHVybiB0aGlzLl9ncmF2YXRhclNlcnZpY2UuYnVpbGRHcmF2YXRhclVybChlbWFpbCwgc2l6ZSk7XHJcbiAgfVxyXG59XHJcbiIsIjxkaXYgaWQ9XCJjb250YWluZXJcIj5cbiAgPGRpdj5cbiAgICA8IS0tIGZpbHRlcnMgLS0+XG4gICAgPGRpdiBpZD1cImZpbHRlcnNcIj5cbiAgICAgIDxhdXRoLWp3dC11c2VyLWZpbHRlclxuICAgICAgICBbZmlsdGVyXT1cImZpbHRlciQgfCBhc3luY1wiXG4gICAgICAgIChmaWx0ZXJDaGFuZ2UpPVwib25GaWx0ZXJDaGFuZ2UoJGV2ZW50KVwiXG4gICAgICA+PC9hdXRoLWp3dC11c2VyLWZpbHRlcj5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gbGlzdCAtLT5cbiAgICBAaWYgKHBhZ2UkIHwgYXN5bmM7IGFzIHBhZ2UpIHtcbiAgICA8ZGl2IGlkPVwibGlzdFwiPlxuICAgICAgQGlmIChsb2FkaW5nJCB8IGFzeW5jKSB7XG4gICAgICA8ZGl2PlxuICAgICAgICA8bWF0LXByb2dyZXNzLWJhciBtb2RlPVwiaW5kZXRlcm1pbmF0ZVwiPjwvbWF0LXByb2dyZXNzLWJhcj5cbiAgICAgIDwvZGl2PlxuICAgICAgfVxuICAgICAgPHRhYmxlPlxuICAgICAgICA8dGhlYWQ+XG4gICAgICAgICAgPHRkPjwvdGQ+XG4gICAgICAgICAgPHRkPjwvdGQ+XG4gICAgICAgICAgPHRoIGkxOG49XCJhdXRoLWp3dC1hZG1pblwiPm5hbWU8L3RoPlxuICAgICAgICAgIDx0aCBpMThuPVwiYXV0aC1qd3QtYWRtaW5cIiBjbGFzcz1cIm5vaWYtbHQtbWRcIj5maXJzdDwvdGg+XG4gICAgICAgICAgPHRoIGkxOG49XCJhdXRoLWp3dC1hZG1pblwiIGNsYXNzPVwibm9pZi1sdC1tZFwiPmxhc3Q8L3RoPlxuICAgICAgICAgIDx0aCBpMThuPVwiYXV0aC1qd3QtYWRtaW5cIiBjbGFzcz1cIm5vaWYtbHQtbWRcIj5lbWFpbDwvdGg+XG4gICAgICAgICAgPHRoIGkxOG49XCJhdXRoLWp3dC1hZG1pblwiPnJvbGVzPC90aD5cbiAgICAgICAgICA8dGggaTE4bj1cImF1dGgtand0LWFkbWluXCIgY2xhc3M9XCJub2lmLWx0LW1kXCI+bG9jayBlbmQ8L3RoPlxuICAgICAgICA8L3RoZWFkPlxuICAgICAgICA8dGJvZHk+XG4gICAgICAgICAgQGZvciAodXNlciBvZiBwYWdlLml0ZW1zOyB0cmFjayB1c2VyKSB7XG4gICAgICAgICAgPHRyPlxuICAgICAgICAgICAgPHRkIGNsYXNzPVwiZml0LXdpZHRoXCI+XG4gICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICBtYXQtaWNvbi1idXR0b25cbiAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICBpMThuLW1hdFRvb2x0aXA9XCJhdXRoLWp3dC1hZG1pblwiXG4gICAgICAgICAgICAgICAgbWF0VG9vbHRpcD1cIkVkaXQgdGhpcyB1c2VyXCJcbiAgICAgICAgICAgICAgICBjb2xvcj1cInByaW1hcnlcIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwibWF0LXByaW1hcnlcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJzZXRBY3RpdmVVc2VyKHVzZXIpXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxtYXQtaWNvbj5tb2RlX2VkaXQ8L21hdC1pY29uPlxuICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgIG1hdC1pY29uLWJ1dHRvblxuICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgIGkxOG4tbWF0VG9vbHRpcD1cImF1dGgtand0LWFkbWluXCJcbiAgICAgICAgICAgICAgICBtYXRUb29sdGlwPVwiRGVsZXRlIHRoaXMgdXNlclwiXG4gICAgICAgICAgICAgICAgY29sb3I9XCJ3YXJuXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cIm1hdC13YXJuXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwiZGVsZXRlVXNlcih1c2VyKVwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8bWF0LWljb24+cmVtb3ZlX2NpcmNsZTwvbWF0LWljb24+XG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgIDx0ZCBjbGFzcz1cImZpdC13aWR0aFwiPlxuICAgICAgICAgICAgICA8aW1nXG4gICAgICAgICAgICAgICAgYWx0PVwiYXZhdGFyXCJcbiAgICAgICAgICAgICAgICBbc3JjXT1cImdldEdyYXZhdGFyVXJsKHVzZXIuZW1haWwsIDMyKVwiXG4gICAgICAgICAgICAgICAgW2FsdF09XCJ1c2VyLnVzZXJOYW1lXCJcbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICA8dGQ+e3sgdXNlci51c2VyTmFtZSB9fTwvdGQ+XG4gICAgICAgICAgICA8dGQgY2xhc3M9XCJub2lmLWx0LW1kXCI+e3sgdXNlci5maXJzdE5hbWUgfX08L3RkPlxuICAgICAgICAgICAgPHRkIGNsYXNzPVwibm9pZi1sdC1tZFwiPnt7IHVzZXIubGFzdE5hbWUgfX08L3RkPlxuICAgICAgICAgICAgPHRkIGNsYXNzPVwibm9pZi1sdC1tZFwiPlxuICAgICAgICAgICAgICA8YSBbaHJlZl09XCInbWFpbHRvOicgKyB1c2VyLmVtYWlsXCI+e3sgdXNlci5lbWFpbCB9fTwvYT5cbiAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICA8dGQ+e3sgdXNlci5yb2xlcy5qb2luKFwiIFwiKSB9fTwvdGQ+XG4gICAgICAgICAgICA8dGQgY2xhc3M9XCJub2lmLWx0LW1kXCI+e3sgdXNlci5sb2Nrb3V0RW5kIH19PC90ZD5cbiAgICAgICAgICA8L3RyPlxuICAgICAgICAgIH1cbiAgICAgICAgPC90Ym9keT5cbiAgICAgIDwvdGFibGU+XG4gICAgICA8IS0tIHBhZ2luYXRvciAtLT5cbiAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLXJvd1wiPlxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgbWF0LWljb24tYnV0dG9uXG4gICAgICAgICAgY29sb3I9XCJ3YXJuXCJcbiAgICAgICAgICBjbGFzcz1cIm1hdC13YXJuXCJcbiAgICAgICAgICBpMThuLW1hdG1hdFRvb2x0aXA9XCJhdXRoLWp3dC1hZG1pblwiXG4gICAgICAgICAgbWF0VG9vbHRpcD1cIlJlZnJlc2ggbGlzdFwiXG4gICAgICAgICAgKGNsaWNrKT1cInJlc2V0KClcIlxuICAgICAgICA+XG4gICAgICAgICAgPG1hdC1pY29uPmF1dG9yZW5ldzwvbWF0LWljb24+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8bWF0LXBhZ2luYXRvclxuICAgICAgICAgIFtsZW5ndGhdPVwicGFnZS50b3RhbFwiXG4gICAgICAgICAgW3BhZ2VJbmRleF09XCJwYWdlLnBhZ2VOdW1iZXIgLSAxXCJcbiAgICAgICAgICBbcGFnZVNpemVdPVwicGFnZS5wYWdlU2l6ZVwiXG4gICAgICAgICAgW3BhZ2VTaXplT3B0aW9uc109XCJbNSwgMTAsIDIwLCA1MCwgMTAwXVwiXG4gICAgICAgICAgKHBhZ2UpPVwib25QYWdlQ2hhbmdlKCRldmVudClcIlxuICAgICAgICAgIFtzaG93Rmlyc3RMYXN0QnV0dG9uc109XCJ0cnVlXCJcbiAgICAgICAgPjwvbWF0LXBhZ2luYXRvcj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICAgIH1cbiAgPC9kaXY+XG5cbiAgPCEtLSBlZGl0b3IgLS0+XG4gIDxtYXQtZXhwYW5zaW9uLXBhbmVsXG4gICAgaWQ9XCJlZGl0b3JcIlxuICAgIFtleHBhbmRlZF09XCJhY3RpdmUkIHwgYXN5bmNcIlxuICAgIFtkaXNhYmxlZF09XCIhKGFjdGl2ZSQgfCBhc3luYylcIlxuICA+XG4gICAgQGlmIChhY3RpdmUkIHwgYXN5bmM7IGFzIGFjdGl2ZSkge1xuICAgIDxkaXY+XG4gICAgICA8ZmllbGRzZXQ+XG4gICAgICAgIDxsZWdlbmQ+e3sgYWN0aXZlLnVzZXJOYW1lIH19PC9sZWdlbmQ+XG4gICAgICAgIDxhdXRoLWp3dC11c2VyLWVkaXRvclxuICAgICAgICAgIFt1c2VyXT1cImFjdGl2ZVwiXG4gICAgICAgICAgKHVzZXJDaGFuZ2UpPVwic2F2ZUFjdGl2ZVVzZXIoJGV2ZW50KVwiXG4gICAgICAgICAgKGVkaXRvckNsb3NlKT1cInJlc2V0QWN0aXZlVXNlcigpXCJcbiAgICAgICAgPjwvYXV0aC1qd3QtdXNlci1lZGl0b3I+XG4gICAgICA8L2ZpZWxkc2V0PlxuICAgIDwvZGl2PlxuICAgIH1cbiAgPC9tYXQtZXhwYW5zaW9uLXBhbmVsPlxuPC9kaXY+XG4iXX0=
67
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlci1saXN0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL215cm1pZG9uL2F1dGgtand0LWFkbWluL3NyYy9saWIvY29tcG9uZW50cy91c2VyLWxpc3QvdXNlci1saXN0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL215cm1pZG9uL2F1dGgtand0LWFkbWluL3NyYy9saWIvY29tcG9uZW50cy91c2VyLWxpc3QvdXNlci1saXN0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFHMUMsT0FBTyx3QkFBd0IsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7QUFjaEMsTUFBTSxPQUFPLGlCQUFpQjtJQU01QixZQUNVLFdBQStCLEVBQy9CLGNBQTZCLEVBQzdCLGdCQUFpQztRQUZqQyxnQkFBVyxHQUFYLFdBQVcsQ0FBb0I7UUFDL0IsbUJBQWMsR0FBZCxjQUFjLENBQWU7UUFDN0IscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFpQjtRQUV6QyxJQUFJLENBQUMsT0FBTyxHQUFHLFdBQVcsQ0FBQyxPQUFPLENBQUM7UUFDbkMsSUFBSSxDQUFDLEtBQUssR0FBRyxXQUFXLENBQUMsS0FBSyxDQUFDO1FBQy9CLElBQUksQ0FBQyxPQUFPLEdBQUcsV0FBVyxDQUFDLFdBQVcsQ0FBQztRQUN2QyxJQUFJLENBQUMsUUFBUSxHQUFHLFdBQVcsQ0FBQyxRQUFRLENBQUM7SUFDdkMsQ0FBQztJQUVNLEtBQUs7UUFDVixJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQzNCLENBQUM7SUFFTSxjQUFjLENBQUMsTUFBa0I7UUFDdEMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDckMsQ0FBQztJQUVNLFlBQVksQ0FBQyxLQUFnQjtRQUNsQyxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsU0FBUyxHQUFHLENBQUMsRUFBRSxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDaEUsQ0FBQztJQUVNLFVBQVUsQ0FBQyxJQUFVO1FBQzFCLElBQUksQ0FBQyxjQUFjO2FBQ2hCLE9BQU8sQ0FDTixTQUFTLENBQUEseUJBQXlCLEVBQ2xDLFNBQVMsQ0FBQSw4QkFBOEIsR0FBRyxJQUFJLENBQUMsUUFBUSxHQUFHLEdBQUcsQ0FDOUQ7YUFDQSxTQUFTLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRTtZQUNqQixJQUFJLEdBQUcsRUFBRSxDQUFDO2dCQUNSLElBQUksQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUM3QyxDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRU0sYUFBYSxDQUFDLElBQWlCO1FBQ3BDLElBQUksQ0FBQyxXQUFXLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3ZDLENBQUM7SUFFTSxlQUFlO1FBQ3BCLElBQUksQ0FBQyxXQUFXLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3ZDLENBQUM7SUFFTSxjQUFjLENBQUMsSUFBVTtRQUM5QixJQUFJLENBQUMsV0FBVyxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3hDLElBQUksQ0FBQyxXQUFXLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3ZDLENBQUM7SUFFTSxpQkFBaUI7UUFDdEIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDdkMsQ0FBQztJQUVNLGNBQWMsQ0FBQyxLQUFhLEVBQUUsSUFBSSxHQUFHLEVBQUU7UUFDNUMsT0FBTyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQzdELENBQUM7OEdBN0RVLGlCQUFpQjtrR0FBakIsaUJBQWlCLDBEQ2pCOUIsc3RIQXNIQTs7MkZEckdhLGlCQUFpQjtrQkFMN0IsU0FBUzsrQkFDRSxvQkFBb0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgUGFnZUV2ZW50IH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvcGFnaW5hdG9yJztcclxuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgJ0Bhbmd1bGFyL2xvY2FsaXplL2luaXQnO1xyXG5cclxuaW1wb3J0IHsgR3JhdmF0YXJTZXJ2aWNlLCBVc2VyIH0gZnJvbSAnQG15cm1pZG9uL2F1dGgtand0LWxvZ2luJztcclxuaW1wb3J0IHsgRGF0YVBhZ2UgfSBmcm9tICdAbXlybWlkb24vbmctdG9vbHMnO1xyXG5pbXBvcnQgeyBEaWFsb2dTZXJ2aWNlIH0gZnJvbSAnQG15cm1pZG9uL25nLW1hdC10b29scyc7XHJcblxyXG5pbXBvcnQgeyBVc2VyTGlzdFJlcG9zaXRvcnkgfSBmcm9tICcuLi9zdGF0ZS91c2VyLWxpc3QucmVwb3NpdG9yeSc7XHJcbmltcG9ydCB7IFVzZXJGaWx0ZXIgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9hdXRoLWp3dC1hY2NvdW50LnNlcnZpY2UnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdhdXRoLWp3dC11c2VyLWxpc3QnLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi91c2VyLWxpc3QuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL3VzZXItbGlzdC5jb21wb25lbnQuY3NzJ10sXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBVc2VyTGlzdENvbXBvbmVudCB7XHJcbiAgcHVibGljIGFjdGl2ZSQ6IE9ic2VydmFibGU8VXNlciB8IHVuZGVmaW5lZD47XHJcbiAgcHVibGljIGxvYWRpbmckOiBPYnNlcnZhYmxlPGJvb2xlYW4+O1xyXG4gIHB1YmxpYyBmaWx0ZXIkOiBPYnNlcnZhYmxlPFVzZXJGaWx0ZXI+O1xyXG4gIHB1YmxpYyBwYWdlJDogT2JzZXJ2YWJsZTxEYXRhUGFnZTxVc2VyPj47XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSBfcmVwb3NpdG9yeTogVXNlckxpc3RSZXBvc2l0b3J5LFxyXG4gICAgcHJpdmF0ZSBfZGlhbG9nU2VydmljZTogRGlhbG9nU2VydmljZSxcclxuICAgIHByaXZhdGUgX2dyYXZhdGFyU2VydmljZTogR3JhdmF0YXJTZXJ2aWNlXHJcbiAgKSB7XHJcbiAgICB0aGlzLmZpbHRlciQgPSBfcmVwb3NpdG9yeS5maWx0ZXIkO1xyXG4gICAgdGhpcy5wYWdlJCA9IF9yZXBvc2l0b3J5LnBhZ2UkO1xyXG4gICAgdGhpcy5hY3RpdmUkID0gX3JlcG9zaXRvcnkuYWN0aXZlVXNlciQ7XHJcbiAgICB0aGlzLmxvYWRpbmckID0gX3JlcG9zaXRvcnkubG9hZGluZyQ7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgcmVzZXQoKTogdm9pZCB7XHJcbiAgICB0aGlzLl9yZXBvc2l0b3J5LnJlc2V0KCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgb25GaWx0ZXJDaGFuZ2UoZmlsdGVyOiBVc2VyRmlsdGVyKTogdm9pZCB7XHJcbiAgICB0aGlzLl9yZXBvc2l0b3J5LnNldEZpbHRlcihmaWx0ZXIpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIG9uUGFnZUNoYW5nZShldmVudDogUGFnZUV2ZW50KTogdm9pZCB7XHJcbiAgICB0aGlzLl9yZXBvc2l0b3J5LnNldFBhZ2UoZXZlbnQucGFnZUluZGV4ICsgMSwgZXZlbnQucGFnZVNpemUpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGRlbGV0ZVVzZXIodXNlcjogVXNlcik6IHZvaWQge1xyXG4gICAgdGhpcy5fZGlhbG9nU2VydmljZVxyXG4gICAgICAuY29uZmlybShcclxuICAgICAgICAkbG9jYWxpemVgOmF1dGgtand0LWFkbWluOkNvbmZpcm1gLFxyXG4gICAgICAgICRsb2NhbGl6ZWA6YXV0aC1qd3QtYWRtaW46RGVsZXRlIHVzZXIgYCArIHVzZXIudXNlck5hbWUgKyAnPydcclxuICAgICAgKVxyXG4gICAgICAuc3Vic2NyaWJlKCh5ZXMpID0+IHtcclxuICAgICAgICBpZiAoeWVzKSB7XHJcbiAgICAgICAgICB0aGlzLl9yZXBvc2l0b3J5LmRlbGV0ZVVzZXIodXNlci51c2VyTmFtZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXRBY3RpdmVVc2VyKHVzZXI6IFVzZXIgfCBudWxsKTogdm9pZCB7XHJcbiAgICB0aGlzLl9yZXBvc2l0b3J5LnNldEFjdGl2ZVVzZXIodXNlcik7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgcmVzZXRBY3RpdmVVc2VyKCk6IHZvaWQge1xyXG4gICAgdGhpcy5fcmVwb3NpdG9yeS5zZXRBY3RpdmVVc2VyKG51bGwpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNhdmVBY3RpdmVVc2VyKHVzZXI6IFVzZXIpOiB2b2lkIHtcclxuICAgIHRoaXMuX3JlcG9zaXRvcnkudXBkYXRlQWN0aXZlVXNlcih1c2VyKTtcclxuICAgIHRoaXMuX3JlcG9zaXRvcnkuc2V0QWN0aXZlVXNlcihudWxsKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBvblVzZXJFZGl0b3JDbG9zZSgpOiB2b2lkIHtcclxuICAgIHRoaXMuX3JlcG9zaXRvcnkuc2V0QWN0aXZlVXNlcihudWxsKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXRHcmF2YXRhclVybChlbWFpbDogc3RyaW5nLCBzaXplID0gODApOiBzdHJpbmcgfCBudWxsIHtcclxuICAgIHJldHVybiB0aGlzLl9ncmF2YXRhclNlcnZpY2UuYnVpbGRHcmF2YXRhclVybChlbWFpbCwgc2l6ZSk7XHJcbiAgfVxyXG59XHJcbiIsIjxkaXYgaWQ9XCJjb250YWluZXJcIj5cbiAgPGRpdj5cbiAgICA8IS0tIGZpbHRlcnMgLS0+XG4gICAgPGRpdiBpZD1cImZpbHRlcnNcIj5cbiAgICAgIDxhdXRoLWp3dC11c2VyLWZpbHRlclxuICAgICAgICBbZmlsdGVyXT1cImZpbHRlciQgfCBhc3luY1wiXG4gICAgICAgIChmaWx0ZXJDaGFuZ2UpPVwib25GaWx0ZXJDaGFuZ2UoJGV2ZW50KVwiXG4gICAgICA+PC9hdXRoLWp3dC11c2VyLWZpbHRlcj5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gbGlzdCAtLT5cbiAgICBAaWYgKHBhZ2UkIHwgYXN5bmM7IGFzIHBhZ2UpIHtcbiAgICA8ZGl2IGlkPVwibGlzdFwiPlxuICAgICAgQGlmIChsb2FkaW5nJCB8IGFzeW5jKSB7XG4gICAgICA8ZGl2PlxuICAgICAgICA8bWF0LXByb2dyZXNzLWJhciBtb2RlPVwiaW5kZXRlcm1pbmF0ZVwiPjwvbWF0LXByb2dyZXNzLWJhcj5cbiAgICAgIDwvZGl2PlxuICAgICAgfVxuICAgICAgPHRhYmxlPlxuICAgICAgICA8dGhlYWQ+XG4gICAgICAgICAgPHRkPjwvdGQ+XG4gICAgICAgICAgPHRkPjwvdGQ+XG4gICAgICAgICAgPHRoIGkxOG49XCJhdXRoLWp3dC1hZG1pblwiPm5hbWU8L3RoPlxuICAgICAgICAgIDx0aCBpMThuPVwiYXV0aC1qd3QtYWRtaW5cIiBjbGFzcz1cIm5vaWYtbHQtbWRcIj5maXJzdDwvdGg+XG4gICAgICAgICAgPHRoIGkxOG49XCJhdXRoLWp3dC1hZG1pblwiIGNsYXNzPVwibm9pZi1sdC1tZFwiPmxhc3Q8L3RoPlxuICAgICAgICAgIDx0aCBpMThuPVwiYXV0aC1qd3QtYWRtaW5cIiBjbGFzcz1cIm5vaWYtbHQtbWRcIj5lbWFpbDwvdGg+XG4gICAgICAgICAgPHRoIGkxOG49XCJhdXRoLWp3dC1hZG1pblwiPnJvbGVzPC90aD5cbiAgICAgICAgICA8dGggaTE4bj1cImF1dGgtand0LWFkbWluXCIgY2xhc3M9XCJub2lmLWx0LW1kXCI+bG9jayBlbmQ8L3RoPlxuICAgICAgICA8L3RoZWFkPlxuICAgICAgICA8dGJvZHk+XG4gICAgICAgICAgQGZvciAodXNlciBvZiBwYWdlLml0ZW1zOyB0cmFjayB1c2VyKSB7XG4gICAgICAgICAgPHRyPlxuICAgICAgICAgICAgPHRkIGNsYXNzPVwiZml0LXdpZHRoXCI+XG4gICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICBtYXQtaWNvbi1idXR0b25cbiAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICBpMThuLW1hdFRvb2x0aXA9XCJhdXRoLWp3dC1hZG1pblwiXG4gICAgICAgICAgICAgICAgbWF0VG9vbHRpcD1cIkVkaXQgdGhpcyB1c2VyXCJcbiAgICAgICAgICAgICAgICBjb2xvcj1cInByaW1hcnlcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJzZXRBY3RpdmVVc2VyKHVzZXIpXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cIm1hdC1wcmltYXJ5XCI+bW9kZV9lZGl0PC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICBtYXQtaWNvbi1idXR0b25cbiAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICBpMThuLW1hdFRvb2x0aXA9XCJhdXRoLWp3dC1hZG1pblwiXG4gICAgICAgICAgICAgICAgbWF0VG9vbHRpcD1cIkRlbGV0ZSB0aGlzIHVzZXJcIlxuICAgICAgICAgICAgICAgIGNvbG9yPVwid2FyblwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cImRlbGV0ZVVzZXIodXNlcilcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwibWF0LXdhcm5cIj5yZW1vdmVfY2lyY2xlPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgPHRkIGNsYXNzPVwiZml0LXdpZHRoXCI+XG4gICAgICAgICAgICAgIDxpbWdcbiAgICAgICAgICAgICAgICBhbHQ9XCJhdmF0YXJcIlxuICAgICAgICAgICAgICAgIFtzcmNdPVwiZ2V0R3JhdmF0YXJVcmwodXNlci5lbWFpbCwgMzIpXCJcbiAgICAgICAgICAgICAgICBbYWx0XT1cInVzZXIudXNlck5hbWVcIlxuICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgIDx0ZD57eyB1c2VyLnVzZXJOYW1lIH19PC90ZD5cbiAgICAgICAgICAgIDx0ZCBjbGFzcz1cIm5vaWYtbHQtbWRcIj57eyB1c2VyLmZpcnN0TmFtZSB9fTwvdGQ+XG4gICAgICAgICAgICA8dGQgY2xhc3M9XCJub2lmLWx0LW1kXCI+e3sgdXNlci5sYXN0TmFtZSB9fTwvdGQ+XG4gICAgICAgICAgICA8dGQgY2xhc3M9XCJub2lmLWx0LW1kXCI+XG4gICAgICAgICAgICAgIDxhIFtocmVmXT1cIidtYWlsdG86JyArIHVzZXIuZW1haWxcIj57eyB1c2VyLmVtYWlsIH19PC9hPlxuICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgIDx0ZD57eyB1c2VyLnJvbGVzLmpvaW4oXCIgXCIpIH19PC90ZD5cbiAgICAgICAgICAgIDx0ZCBjbGFzcz1cIm5vaWYtbHQtbWRcIj57eyB1c2VyLmxvY2tvdXRFbmQgfX08L3RkPlxuICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgfVxuICAgICAgICA8L3Rib2R5PlxuICAgICAgPC90YWJsZT5cbiAgICAgIDwhLS0gcGFnaW5hdG9yIC0tPlxuICAgICAgPGRpdiBjbGFzcz1cImZvcm0tcm93XCI+XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICBtYXQtaWNvbi1idXR0b25cbiAgICAgICAgICBjb2xvcj1cIndhcm5cIlxuICAgICAgICAgIGkxOG4tbWF0bWF0VG9vbHRpcD1cImF1dGgtand0LWFkbWluXCJcbiAgICAgICAgICBtYXRUb29sdGlwPVwiUmVmcmVzaCBsaXN0XCJcbiAgICAgICAgICAoY2xpY2spPVwicmVzZXQoKVwiXG4gICAgICAgID5cbiAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJtYXQtd2FyblwiPmF1dG9yZW5ldzwvbWF0LWljb24+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8bWF0LXBhZ2luYXRvclxuICAgICAgICAgIFtsZW5ndGhdPVwicGFnZS50b3RhbFwiXG4gICAgICAgICAgW3BhZ2VJbmRleF09XCJwYWdlLnBhZ2VOdW1iZXIgLSAxXCJcbiAgICAgICAgICBbcGFnZVNpemVdPVwicGFnZS5wYWdlU2l6ZVwiXG4gICAgICAgICAgW3BhZ2VTaXplT3B0aW9uc109XCJbNSwgMTAsIDIwLCA1MCwgMTAwXVwiXG4gICAgICAgICAgKHBhZ2UpPVwib25QYWdlQ2hhbmdlKCRldmVudClcIlxuICAgICAgICAgIFtzaG93Rmlyc3RMYXN0QnV0dG9uc109XCJ0cnVlXCJcbiAgICAgICAgPjwvbWF0LXBhZ2luYXRvcj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICAgIH1cbiAgPC9kaXY+XG5cbiAgPCEtLSBlZGl0b3IgLS0+XG4gIDxtYXQtZXhwYW5zaW9uLXBhbmVsXG4gICAgaWQ9XCJlZGl0b3JcIlxuICAgIFtleHBhbmRlZF09XCJhY3RpdmUkIHwgYXN5bmNcIlxuICAgIFtkaXNhYmxlZF09XCIhKGFjdGl2ZSQgfCBhc3luYylcIlxuICA+XG4gICAgQGlmIChhY3RpdmUkIHwgYXN5bmM7IGFzIGFjdGl2ZSkge1xuICAgIDxkaXY+XG4gICAgICA8ZmllbGRzZXQ+XG4gICAgICAgIDxsZWdlbmQ+e3sgYWN0aXZlLnVzZXJOYW1lIH19PC9sZWdlbmQ+XG4gICAgICAgIDxhdXRoLWp3dC11c2VyLWVkaXRvclxuICAgICAgICAgIFt1c2VyXT1cImFjdGl2ZVwiXG4gICAgICAgICAgKHVzZXJDaGFuZ2UpPVwic2F2ZUFjdGl2ZVVzZXIoJGV2ZW50KVwiXG4gICAgICAgICAgKGVkaXRvckNsb3NlKT1cInJlc2V0QWN0aXZlVXNlcigpXCJcbiAgICAgICAgPjwvYXV0aC1qd3QtdXNlci1lZGl0b3I+XG4gICAgICA8L2ZpZWxkc2V0PlxuICAgIDwvZGl2PlxuICAgIH1cbiAgPC9tYXQtZXhwYW5zaW9uLXBhbmVsPlxuPC9kaXY+XG4iXX0=
@@ -682,11 +682,11 @@ class UserFilterComponent {
682
682
  this.filterChange.emit(this._filter);
683
683
  }
684
684
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.2", ngImport: i0, type: UserFilterComponent, deps: [{ token: i1$1.FormBuilder }], target: i0.ɵɵFactoryTarget.Component }); }
685
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.0.2", type: UserFilterComponent, selector: "auth-jwt-user-filter", inputs: { filter: "filter", disabled: "disabled" }, outputs: { filterChange: "filterChange" }, ngImport: i0, template: "<form [formGroup]=\"form\" (submit)=\"apply()\" ng-disabled=\"disabled\">\r\n <div class=\"form-row\">\r\n <mat-form-field>\r\n <mat-label i18n=\"auth-jwt-admin\">name or ID</mat-label>\r\n <input matInput [formControl]=\"name\" />\r\n <button\r\n mat-icon-button\r\n matSuffix\r\n type=\"button\"\r\n (click)=\"reset()\"\r\n color=\"warn\"\r\n class=\"mat-warn\"\r\n i18n-matTooltip=\"auth-jwt-admin\"\r\n matTooltip=\"Reset filters\"\r\n [disabled]=\"disabled\"\r\n >\r\n <mat-icon>clear</mat-icon>\r\n </button>\r\n </mat-form-field>\r\n\r\n <button\r\n id=\"apply\"\r\n type=\"submit\"\r\n mat-icon-button\r\n color=\"primary\"\r\n class=\"mat-primary\"\r\n [disabled]=\"disabled\"\r\n i18n-matTooltip=\"auth-jwt-admin\"\r\n matTooltip=\"Apply filters\"\r\n >\r\n <mat-icon>check_circle</mat-icon>\r\n </button>\r\n </div>\r\n</form>\r\n", styles: [".form-row{display:flex;gap:8px;align-items:center;flex-wrap:wrap}.form-row *{flex:0 0 auto}#apply{margin-top:-20px}\n"], dependencies: [{ kind: "directive", type: i1$1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1$1.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: i1$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1$1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i1$1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: i5.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "component", type: i6.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i7.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: i8.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i8.MatLabel, selector: "mat-label" }, { kind: "directive", type: i8.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "directive", type: i6$1.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }] }); }
685
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.0.2", type: UserFilterComponent, selector: "auth-jwt-user-filter", inputs: { filter: "filter", disabled: "disabled" }, outputs: { filterChange: "filterChange" }, ngImport: i0, template: "<form [formGroup]=\"form\" (submit)=\"apply()\" ng-disabled=\"disabled\">\r\n <div class=\"form-row\">\r\n <mat-form-field>\r\n <mat-label i18n=\"auth-jwt-admin\">name or ID</mat-label>\r\n <input matInput [formControl]=\"name\" />\r\n <button\r\n mat-icon-button\r\n matSuffix\r\n type=\"button\"\r\n (click)=\"reset()\"\r\n color=\"warn\"\r\n i18n-matTooltip=\"auth-jwt-admin\"\r\n matTooltip=\"Reset filters\"\r\n [disabled]=\"disabled\"\r\n >\r\n <mat-icon class=\"mat-warn\">clear</mat-icon>\r\n </button>\r\n </mat-form-field>\r\n\r\n <button\r\n id=\"apply\"\r\n type=\"submit\"\r\n mat-icon-button\r\n color=\"primary\"\r\n [disabled]=\"disabled\"\r\n i18n-matTooltip=\"auth-jwt-admin\"\r\n matTooltip=\"Apply filters\"\r\n >\r\n <mat-icon class=\"mat-primary\">check_circle</mat-icon>\r\n </button>\r\n </div>\r\n</form>\r\n", styles: [".form-row{display:flex;gap:8px;align-items:center;flex-wrap:wrap}.form-row *{flex:0 0 auto}#apply{margin-top:-20px}\n"], dependencies: [{ kind: "directive", type: i1$1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1$1.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: i1$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1$1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i1$1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: i5.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "component", type: i6.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i7.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: i8.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i8.MatLabel, selector: "mat-label" }, { kind: "directive", type: i8.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "directive", type: i6$1.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }] }); }
686
686
  }
687
687
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.2", ngImport: i0, type: UserFilterComponent, decorators: [{
688
688
  type: Component,
689
- args: [{ selector: 'auth-jwt-user-filter', template: "<form [formGroup]=\"form\" (submit)=\"apply()\" ng-disabled=\"disabled\">\r\n <div class=\"form-row\">\r\n <mat-form-field>\r\n <mat-label i18n=\"auth-jwt-admin\">name or ID</mat-label>\r\n <input matInput [formControl]=\"name\" />\r\n <button\r\n mat-icon-button\r\n matSuffix\r\n type=\"button\"\r\n (click)=\"reset()\"\r\n color=\"warn\"\r\n class=\"mat-warn\"\r\n i18n-matTooltip=\"auth-jwt-admin\"\r\n matTooltip=\"Reset filters\"\r\n [disabled]=\"disabled\"\r\n >\r\n <mat-icon>clear</mat-icon>\r\n </button>\r\n </mat-form-field>\r\n\r\n <button\r\n id=\"apply\"\r\n type=\"submit\"\r\n mat-icon-button\r\n color=\"primary\"\r\n class=\"mat-primary\"\r\n [disabled]=\"disabled\"\r\n i18n-matTooltip=\"auth-jwt-admin\"\r\n matTooltip=\"Apply filters\"\r\n >\r\n <mat-icon>check_circle</mat-icon>\r\n </button>\r\n </div>\r\n</form>\r\n", styles: [".form-row{display:flex;gap:8px;align-items:center;flex-wrap:wrap}.form-row *{flex:0 0 auto}#apply{margin-top:-20px}\n"] }]
689
+ args: [{ selector: 'auth-jwt-user-filter', template: "<form [formGroup]=\"form\" (submit)=\"apply()\" ng-disabled=\"disabled\">\r\n <div class=\"form-row\">\r\n <mat-form-field>\r\n <mat-label i18n=\"auth-jwt-admin\">name or ID</mat-label>\r\n <input matInput [formControl]=\"name\" />\r\n <button\r\n mat-icon-button\r\n matSuffix\r\n type=\"button\"\r\n (click)=\"reset()\"\r\n color=\"warn\"\r\n i18n-matTooltip=\"auth-jwt-admin\"\r\n matTooltip=\"Reset filters\"\r\n [disabled]=\"disabled\"\r\n >\r\n <mat-icon class=\"mat-warn\">clear</mat-icon>\r\n </button>\r\n </mat-form-field>\r\n\r\n <button\r\n id=\"apply\"\r\n type=\"submit\"\r\n mat-icon-button\r\n color=\"primary\"\r\n [disabled]=\"disabled\"\r\n i18n-matTooltip=\"auth-jwt-admin\"\r\n matTooltip=\"Apply filters\"\r\n >\r\n <mat-icon class=\"mat-primary\">check_circle</mat-icon>\r\n </button>\r\n </div>\r\n</form>\r\n", styles: [".form-row{display:flex;gap:8px;align-items:center;flex-wrap:wrap}.form-row *{flex:0 0 auto}#apply{margin-top:-20px}\n"] }]
690
690
  }], ctorParameters: () => [{ type: i1$1.FormBuilder }], propDecorators: { filter: [{
691
691
  type: Input
692
692
  }], disabled: [{
@@ -782,11 +782,11 @@ class UserEditorComponent {
782
782
  this.userChange.emit(this.getUserFromForm());
783
783
  }
784
784
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.2", ngImport: i0, type: UserEditorComponent, deps: [{ token: i1$1.UntypedFormBuilder }, { token: i2$2.AuthJwtService }], target: i0.ɵɵFactoryTarget.Component }); }
785
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.0.2", type: UserEditorComponent, selector: "auth-jwt-user-editor", inputs: { user: "user" }, outputs: { userChange: "userChange", editorClose: "editorClose" }, ngImport: i0, template: "<form [formGroup]=\"form\" (submit)=\"save()\">\n <div class=\"form-row\">\n <!-- email -->\n <mat-form-field>\n <mat-label i18n=\"auth-jwt-admin\">email</mat-label>\n <input type=\"text\" matInput [formControl]=\"email\" />\n @if (email.hasError('required') && (email.dirty || email.touched)) {\n <mat-error i18n=\"auth-jwt-admin\"> email address required </mat-error>\n } @if (email.hasError('pattern') && (email.dirty || email.touched)) {\n <mat-error i18n=\"auth-jwt-admin\"> invalid email address </mat-error>\n }\n </mat-form-field>\n\n <!-- emailConfirmed -->\n <mat-checkbox [formControl]=\"emailConfirmed\" i18n=\"auth-jwt-admin\"\n >email address confirmed</mat-checkbox\n >\n </div>\n\n <!-- lockoutEnabled -->\n <div class=\"form-row\">\n <mat-checkbox [formControl]=\"lockoutEnabled\" i18n=\"auth-jwt-admin\"\n >lockout enabled</mat-checkbox\n >\n <button\n type=\"button\"\n mat-icon-button\n color=\"primary\"\n class=\"mat-primary\"\n (click)=\"endLockout()\"\n [disabled]=\"unlocked\"\n i18n-matTooltip=\"auth-jwt-admin\"\n matTooltip=\"Unlock this user if locked\"\n >\n <mat-icon>lock_open</mat-icon>\n </button>\n </div>\n\n <div class=\"form-row\">\n <!-- firstName -->\n <mat-form-field>\n <mat-label i18n=\"auth-jwt-admin\">first name</mat-label>\n <input type=\"text\" matInput [formControl]=\"firstName\" />\n @if ( firstName.hasError('required') && (firstName.dirty ||\n firstName.touched) ) {\n <mat-error i18n=\"auth-jwt-admin\"> first name required </mat-error>\n } @if ( firstName.hasError('maxlength') && (firstName.dirty ||\n firstName.touched) ) {\n <mat-error i18n=\"auth-jwt-admin\"> first name too long </mat-error>\n }\n </mat-form-field>\n\n <!-- lastName -->\n <mat-form-field>\n <mat-label i18n=\"auth-jwt-admin\">last name</mat-label>\n <input type=\"text\" matInput [formControl]=\"lastName\" />\n @if ( lastName.hasError('required') && (lastName.dirty ||\n lastName.touched) ) {\n <mat-error i18n=\"auth-jwt-admin\"> last name required </mat-error>\n } @if ( lastName.hasError('maxlength') && (lastName.dirty ||\n lastName.touched) ) {\n <mat-error i18n=\"auth-jwt-admin\"> last name too long </mat-error>\n }\n </mat-form-field>\n </div>\n\n <!-- roles -->\n <div>\n <mat-form-field style=\"width: 16em\">\n <mat-label i18n=\"auth-jwt-admin\">roles</mat-label>\n <input type=\"text\" matInput [formControl]=\"roles\" />\n @if (roles.hasError('maxlength') && (roles.dirty || roles.touched)) {\n <mat-error i18n=\"auth-jwt-admin\"> too long </mat-error>\n }\n <mat-hint i18n>roles (separated by space)</mat-hint>\n </mat-form-field>\n </div>\n\n <!-- buttons -->\n <br />\n <div>\n <button\n type=\"button\"\n mat-icon-button\n color=\"warn\"\n class=\"mat-warn\"\n i18n-matTooltip=\"auth-jwt-admin\"\n matTooltip=\"Close\"\n (click)=\"close()\"\n >\n <mat-icon>cancel</mat-icon>\n </button>\n <button\n type=\"submit\"\n mat-icon-button\n color=\"primary\"\n class=\"mat-primary\"\n [disabled]=\"form.invalid\"\n i18n-matTooltip=\"auth-jwt-admin\"\n matTooltip=\"Save user\"\n >\n <mat-icon>check_circle</mat-icon>\n </button>\n </div>\n</form>\n", styles: [".form-row{display:flex;gap:8px;align-items:center;flex-wrap:wrap}.form-row *{flex:0 0 auto}\n"], dependencies: [{ kind: "directive", type: i1$1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1$1.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: i1$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1$1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i1$1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: i5.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "component", type: i4.MatCheckbox, selector: "mat-checkbox", inputs: ["aria-label", "aria-labelledby", "aria-describedby", "id", "required", "labelPosition", "name", "value", "disableRipple", "tabIndex", "color", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { kind: "component", type: i6.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i7.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: i8.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i8.MatLabel, selector: "mat-label" }, { kind: "directive", type: i8.MatHint, selector: "mat-hint", inputs: ["align", "id"] }, { kind: "directive", type: i8.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "directive", type: i6$1.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }] }); }
785
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.0.2", type: UserEditorComponent, selector: "auth-jwt-user-editor", inputs: { user: "user" }, outputs: { userChange: "userChange", editorClose: "editorClose" }, ngImport: i0, template: "<form [formGroup]=\"form\" (submit)=\"save()\">\n <div class=\"form-row\">\n <!-- email -->\n <mat-form-field>\n <mat-label i18n=\"auth-jwt-admin\">email</mat-label>\n <input type=\"text\" matInput [formControl]=\"email\" />\n @if (email.hasError('required') && (email.dirty || email.touched)) {\n <mat-error i18n=\"auth-jwt-admin\"> email address required </mat-error>\n } @if (email.hasError('pattern') && (email.dirty || email.touched)) {\n <mat-error i18n=\"auth-jwt-admin\"> invalid email address </mat-error>\n }\n </mat-form-field>\n\n <!-- emailConfirmed -->\n <mat-checkbox [formControl]=\"emailConfirmed\" i18n=\"auth-jwt-admin\"\n >email address confirmed</mat-checkbox\n >\n </div>\n\n <!-- lockoutEnabled -->\n <div class=\"form-row\">\n <mat-checkbox [formControl]=\"lockoutEnabled\" i18n=\"auth-jwt-admin\"\n >lockout enabled</mat-checkbox\n >\n <button\n type=\"button\"\n mat-icon-button\n color=\"primary\"\n (click)=\"endLockout()\"\n [disabled]=\"unlocked\"\n i18n-matTooltip=\"auth-jwt-admin\"\n matTooltip=\"Unlock this user if locked\"\n >\n <mat-icon class=\"mat-primary\">lock_open</mat-icon>\n </button>\n </div>\n\n <div class=\"form-row\">\n <!-- firstName -->\n <mat-form-field>\n <mat-label i18n=\"auth-jwt-admin\">first name</mat-label>\n <input type=\"text\" matInput [formControl]=\"firstName\" />\n @if ( firstName.hasError('required') && (firstName.dirty ||\n firstName.touched) ) {\n <mat-error i18n=\"auth-jwt-admin\"> first name required </mat-error>\n } @if ( firstName.hasError('maxlength') && (firstName.dirty ||\n firstName.touched) ) {\n <mat-error i18n=\"auth-jwt-admin\"> first name too long </mat-error>\n }\n </mat-form-field>\n\n <!-- lastName -->\n <mat-form-field>\n <mat-label i18n=\"auth-jwt-admin\">last name</mat-label>\n <input type=\"text\" matInput [formControl]=\"lastName\" />\n @if ( lastName.hasError('required') && (lastName.dirty ||\n lastName.touched) ) {\n <mat-error i18n=\"auth-jwt-admin\"> last name required </mat-error>\n } @if ( lastName.hasError('maxlength') && (lastName.dirty ||\n lastName.touched) ) {\n <mat-error i18n=\"auth-jwt-admin\"> last name too long </mat-error>\n }\n </mat-form-field>\n </div>\n\n <!-- roles -->\n <div>\n <mat-form-field style=\"width: 16em\">\n <mat-label i18n=\"auth-jwt-admin\">roles</mat-label>\n <input type=\"text\" matInput [formControl]=\"roles\" />\n @if (roles.hasError('maxlength') && (roles.dirty || roles.touched)) {\n <mat-error i18n=\"auth-jwt-admin\"> too long </mat-error>\n }\n <mat-hint i18n>roles (separated by space)</mat-hint>\n </mat-form-field>\n </div>\n\n <!-- buttons -->\n <br />\n <div>\n <button\n type=\"button\"\n mat-icon-button\n color=\"warn\"\n i18n-matTooltip=\"auth-jwt-admin\"\n matTooltip=\"Close\"\n (click)=\"close()\"\n >\n <mat-icon class=\"mat-warn\">cancel</mat-icon>\n </button>\n <button\n type=\"submit\"\n mat-icon-button\n color=\"primary\"\n [disabled]=\"form.invalid\"\n i18n-matTooltip=\"auth-jwt-admin\"\n matTooltip=\"Save user\"\n >\n <mat-icon class=\"mat-primary\">check_circle</mat-icon>\n </button>\n </div>\n</form>\n", styles: [".form-row{display:flex;gap:8px;align-items:center;flex-wrap:wrap}.form-row *{flex:0 0 auto}\n"], dependencies: [{ kind: "directive", type: i1$1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1$1.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: i1$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1$1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i1$1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: i5.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "component", type: i4.MatCheckbox, selector: "mat-checkbox", inputs: ["aria-label", "aria-labelledby", "aria-describedby", "id", "required", "labelPosition", "name", "value", "disableRipple", "tabIndex", "color", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { kind: "component", type: i6.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i7.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: i8.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i8.MatLabel, selector: "mat-label" }, { kind: "directive", type: i8.MatHint, selector: "mat-hint", inputs: ["align", "id"] }, { kind: "directive", type: i8.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "directive", type: i6$1.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }] }); }
786
786
  }
787
787
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.2", ngImport: i0, type: UserEditorComponent, decorators: [{
788
788
  type: Component,
789
- args: [{ selector: 'auth-jwt-user-editor', template: "<form [formGroup]=\"form\" (submit)=\"save()\">\n <div class=\"form-row\">\n <!-- email -->\n <mat-form-field>\n <mat-label i18n=\"auth-jwt-admin\">email</mat-label>\n <input type=\"text\" matInput [formControl]=\"email\" />\n @if (email.hasError('required') && (email.dirty || email.touched)) {\n <mat-error i18n=\"auth-jwt-admin\"> email address required </mat-error>\n } @if (email.hasError('pattern') && (email.dirty || email.touched)) {\n <mat-error i18n=\"auth-jwt-admin\"> invalid email address </mat-error>\n }\n </mat-form-field>\n\n <!-- emailConfirmed -->\n <mat-checkbox [formControl]=\"emailConfirmed\" i18n=\"auth-jwt-admin\"\n >email address confirmed</mat-checkbox\n >\n </div>\n\n <!-- lockoutEnabled -->\n <div class=\"form-row\">\n <mat-checkbox [formControl]=\"lockoutEnabled\" i18n=\"auth-jwt-admin\"\n >lockout enabled</mat-checkbox\n >\n <button\n type=\"button\"\n mat-icon-button\n color=\"primary\"\n class=\"mat-primary\"\n (click)=\"endLockout()\"\n [disabled]=\"unlocked\"\n i18n-matTooltip=\"auth-jwt-admin\"\n matTooltip=\"Unlock this user if locked\"\n >\n <mat-icon>lock_open</mat-icon>\n </button>\n </div>\n\n <div class=\"form-row\">\n <!-- firstName -->\n <mat-form-field>\n <mat-label i18n=\"auth-jwt-admin\">first name</mat-label>\n <input type=\"text\" matInput [formControl]=\"firstName\" />\n @if ( firstName.hasError('required') && (firstName.dirty ||\n firstName.touched) ) {\n <mat-error i18n=\"auth-jwt-admin\"> first name required </mat-error>\n } @if ( firstName.hasError('maxlength') && (firstName.dirty ||\n firstName.touched) ) {\n <mat-error i18n=\"auth-jwt-admin\"> first name too long </mat-error>\n }\n </mat-form-field>\n\n <!-- lastName -->\n <mat-form-field>\n <mat-label i18n=\"auth-jwt-admin\">last name</mat-label>\n <input type=\"text\" matInput [formControl]=\"lastName\" />\n @if ( lastName.hasError('required') && (lastName.dirty ||\n lastName.touched) ) {\n <mat-error i18n=\"auth-jwt-admin\"> last name required </mat-error>\n } @if ( lastName.hasError('maxlength') && (lastName.dirty ||\n lastName.touched) ) {\n <mat-error i18n=\"auth-jwt-admin\"> last name too long </mat-error>\n }\n </mat-form-field>\n </div>\n\n <!-- roles -->\n <div>\n <mat-form-field style=\"width: 16em\">\n <mat-label i18n=\"auth-jwt-admin\">roles</mat-label>\n <input type=\"text\" matInput [formControl]=\"roles\" />\n @if (roles.hasError('maxlength') && (roles.dirty || roles.touched)) {\n <mat-error i18n=\"auth-jwt-admin\"> too long </mat-error>\n }\n <mat-hint i18n>roles (separated by space)</mat-hint>\n </mat-form-field>\n </div>\n\n <!-- buttons -->\n <br />\n <div>\n <button\n type=\"button\"\n mat-icon-button\n color=\"warn\"\n class=\"mat-warn\"\n i18n-matTooltip=\"auth-jwt-admin\"\n matTooltip=\"Close\"\n (click)=\"close()\"\n >\n <mat-icon>cancel</mat-icon>\n </button>\n <button\n type=\"submit\"\n mat-icon-button\n color=\"primary\"\n class=\"mat-primary\"\n [disabled]=\"form.invalid\"\n i18n-matTooltip=\"auth-jwt-admin\"\n matTooltip=\"Save user\"\n >\n <mat-icon>check_circle</mat-icon>\n </button>\n </div>\n</form>\n", styles: [".form-row{display:flex;gap:8px;align-items:center;flex-wrap:wrap}.form-row *{flex:0 0 auto}\n"] }]
789
+ args: [{ selector: 'auth-jwt-user-editor', template: "<form [formGroup]=\"form\" (submit)=\"save()\">\n <div class=\"form-row\">\n <!-- email -->\n <mat-form-field>\n <mat-label i18n=\"auth-jwt-admin\">email</mat-label>\n <input type=\"text\" matInput [formControl]=\"email\" />\n @if (email.hasError('required') && (email.dirty || email.touched)) {\n <mat-error i18n=\"auth-jwt-admin\"> email address required </mat-error>\n } @if (email.hasError('pattern') && (email.dirty || email.touched)) {\n <mat-error i18n=\"auth-jwt-admin\"> invalid email address </mat-error>\n }\n </mat-form-field>\n\n <!-- emailConfirmed -->\n <mat-checkbox [formControl]=\"emailConfirmed\" i18n=\"auth-jwt-admin\"\n >email address confirmed</mat-checkbox\n >\n </div>\n\n <!-- lockoutEnabled -->\n <div class=\"form-row\">\n <mat-checkbox [formControl]=\"lockoutEnabled\" i18n=\"auth-jwt-admin\"\n >lockout enabled</mat-checkbox\n >\n <button\n type=\"button\"\n mat-icon-button\n color=\"primary\"\n (click)=\"endLockout()\"\n [disabled]=\"unlocked\"\n i18n-matTooltip=\"auth-jwt-admin\"\n matTooltip=\"Unlock this user if locked\"\n >\n <mat-icon class=\"mat-primary\">lock_open</mat-icon>\n </button>\n </div>\n\n <div class=\"form-row\">\n <!-- firstName -->\n <mat-form-field>\n <mat-label i18n=\"auth-jwt-admin\">first name</mat-label>\n <input type=\"text\" matInput [formControl]=\"firstName\" />\n @if ( firstName.hasError('required') && (firstName.dirty ||\n firstName.touched) ) {\n <mat-error i18n=\"auth-jwt-admin\"> first name required </mat-error>\n } @if ( firstName.hasError('maxlength') && (firstName.dirty ||\n firstName.touched) ) {\n <mat-error i18n=\"auth-jwt-admin\"> first name too long </mat-error>\n }\n </mat-form-field>\n\n <!-- lastName -->\n <mat-form-field>\n <mat-label i18n=\"auth-jwt-admin\">last name</mat-label>\n <input type=\"text\" matInput [formControl]=\"lastName\" />\n @if ( lastName.hasError('required') && (lastName.dirty ||\n lastName.touched) ) {\n <mat-error i18n=\"auth-jwt-admin\"> last name required </mat-error>\n } @if ( lastName.hasError('maxlength') && (lastName.dirty ||\n lastName.touched) ) {\n <mat-error i18n=\"auth-jwt-admin\"> last name too long </mat-error>\n }\n </mat-form-field>\n </div>\n\n <!-- roles -->\n <div>\n <mat-form-field style=\"width: 16em\">\n <mat-label i18n=\"auth-jwt-admin\">roles</mat-label>\n <input type=\"text\" matInput [formControl]=\"roles\" />\n @if (roles.hasError('maxlength') && (roles.dirty || roles.touched)) {\n <mat-error i18n=\"auth-jwt-admin\"> too long </mat-error>\n }\n <mat-hint i18n>roles (separated by space)</mat-hint>\n </mat-form-field>\n </div>\n\n <!-- buttons -->\n <br />\n <div>\n <button\n type=\"button\"\n mat-icon-button\n color=\"warn\"\n i18n-matTooltip=\"auth-jwt-admin\"\n matTooltip=\"Close\"\n (click)=\"close()\"\n >\n <mat-icon class=\"mat-warn\">cancel</mat-icon>\n </button>\n <button\n type=\"submit\"\n mat-icon-button\n color=\"primary\"\n [disabled]=\"form.invalid\"\n i18n-matTooltip=\"auth-jwt-admin\"\n matTooltip=\"Save user\"\n >\n <mat-icon class=\"mat-primary\">check_circle</mat-icon>\n </button>\n </div>\n</form>\n", styles: [".form-row{display:flex;gap:8px;align-items:center;flex-wrap:wrap}.form-row *{flex:0 0 auto}\n"] }]
790
790
  }], ctorParameters: () => [{ type: i1$1.UntypedFormBuilder }, { type: i2$2.AuthJwtService }], propDecorators: { user: [{
791
791
  type: Input
792
792
  }], userChange: [{
@@ -840,11 +840,11 @@ class UserListComponent {
840
840
  return this._gravatarService.buildGravatarUrl(email, size);
841
841
  }
842
842
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.2", ngImport: i0, type: UserListComponent, deps: [{ token: UserListRepository }, { token: i2$3.DialogService }, { token: i2$2.GravatarService }], target: i0.ɵɵFactoryTarget.Component }); }
843
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.0.2", type: UserListComponent, selector: "auth-jwt-user-list", ngImport: i0, template: "<div id=\"container\">\n <div>\n <!-- filters -->\n <div id=\"filters\">\n <auth-jwt-user-filter\n [filter]=\"filter$ | async\"\n (filterChange)=\"onFilterChange($event)\"\n ></auth-jwt-user-filter>\n </div>\n\n <!-- list -->\n @if (page$ | async; as page) {\n <div id=\"list\">\n @if (loading$ | async) {\n <div>\n <mat-progress-bar mode=\"indeterminate\"></mat-progress-bar>\n </div>\n }\n <table>\n <thead>\n <td></td>\n <td></td>\n <th i18n=\"auth-jwt-admin\">name</th>\n <th i18n=\"auth-jwt-admin\" class=\"noif-lt-md\">first</th>\n <th i18n=\"auth-jwt-admin\" class=\"noif-lt-md\">last</th>\n <th i18n=\"auth-jwt-admin\" class=\"noif-lt-md\">email</th>\n <th i18n=\"auth-jwt-admin\">roles</th>\n <th i18n=\"auth-jwt-admin\" class=\"noif-lt-md\">lock end</th>\n </thead>\n <tbody>\n @for (user of page.items; track user) {\n <tr>\n <td class=\"fit-width\">\n <button\n mat-icon-button\n type=\"button\"\n i18n-matTooltip=\"auth-jwt-admin\"\n matTooltip=\"Edit this user\"\n color=\"primary\"\n class=\"mat-primary\"\n (click)=\"setActiveUser(user)\"\n >\n <mat-icon>mode_edit</mat-icon>\n </button>\n <button\n mat-icon-button\n type=\"button\"\n i18n-matTooltip=\"auth-jwt-admin\"\n matTooltip=\"Delete this user\"\n color=\"warn\"\n class=\"mat-warn\"\n (click)=\"deleteUser(user)\"\n >\n <mat-icon>remove_circle</mat-icon>\n </button>\n </td>\n <td class=\"fit-width\">\n <img\n alt=\"avatar\"\n [src]=\"getGravatarUrl(user.email, 32)\"\n [alt]=\"user.userName\"\n />\n </td>\n <td>{{ user.userName }}</td>\n <td class=\"noif-lt-md\">{{ user.firstName }}</td>\n <td class=\"noif-lt-md\">{{ user.lastName }}</td>\n <td class=\"noif-lt-md\">\n <a [href]=\"'mailto:' + user.email\">{{ user.email }}</a>\n </td>\n <td>{{ user.roles.join(\" \") }}</td>\n <td class=\"noif-lt-md\">{{ user.lockoutEnd }}</td>\n </tr>\n }\n </tbody>\n </table>\n <!-- paginator -->\n <div class=\"form-row\">\n <button\n type=\"button\"\n mat-icon-button\n color=\"warn\"\n class=\"mat-warn\"\n i18n-matmatTooltip=\"auth-jwt-admin\"\n matTooltip=\"Refresh list\"\n (click)=\"reset()\"\n >\n <mat-icon>autorenew</mat-icon>\n </button>\n <mat-paginator\n [length]=\"page.total\"\n [pageIndex]=\"page.pageNumber - 1\"\n [pageSize]=\"page.pageSize\"\n [pageSizeOptions]=\"[5, 10, 20, 50, 100]\"\n (page)=\"onPageChange($event)\"\n [showFirstLastButtons]=\"true\"\n ></mat-paginator>\n </div>\n </div>\n }\n </div>\n\n <!-- editor -->\n <mat-expansion-panel\n id=\"editor\"\n [expanded]=\"active$ | async\"\n [disabled]=\"!(active$ | async)\"\n >\n @if (active$ | async; as active) {\n <div>\n <fieldset>\n <legend>{{ active.userName }}</legend>\n <auth-jwt-user-editor\n [user]=\"active\"\n (userChange)=\"saveActiveUser($event)\"\n (editorClose)=\"resetActiveUser()\"\n ></auth-jwt-user-editor>\n </fieldset>\n </div>\n }\n </mat-expansion-panel>\n</div>\n", styles: ["tr:nth-child(odd){background-color:#f8f8f8}th{padding:0 8px;text-align:left;color:silver;font-weight:400}td{padding:0 8px}td.fit-width{width:1px;white-space:nowrap}table{width:100%;border-collapse:collapse}fieldset{border:1px solid silver;border-radius:8px;padding:16px}.form-row{display:flex;gap:8px;align-items:center;flex-wrap:wrap}.form-row *{flex:0 0 auto}div#filters{grid-area:filters}div#list{grid-area:list}div#editor{grid-area:editor}div#container{display:grid;grid-template-rows:auto 1fr auto;grid-template-columns:1fr;grid-template-areas:\"filters\" \"list\" \"editor\";gap:8px}@media only screen and (max-width: 959px){.noif-lt-md{display:none}}@media only screen and (min-width: 1920px){div#container{grid-template-rows:auto 1fr;grid-template-columns:1fr auto;grid-template-areas:\"filters filters\" \"list editor\"}}\n"], dependencies: [{ kind: "component", type: i5.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "component", type: i5$1.MatExpansionPanel, selector: "mat-expansion-panel", inputs: ["hideToggle", "togglePosition"], outputs: ["afterExpand", "afterCollapse"], exportAs: ["matExpansionPanel"] }, { kind: "component", type: i6.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i7$1.MatPaginator, selector: "mat-paginator", inputs: ["color", "pageIndex", "length", "pageSize", "pageSizeOptions", "hidePageSize", "showFirstLastButtons", "selectConfig", "disabled"], outputs: ["page"], exportAs: ["matPaginator"] }, { kind: "component", type: i8$1.MatProgressBar, selector: "mat-progress-bar", inputs: ["color", "value", "bufferValue", "mode"], outputs: ["animationEnd"], exportAs: ["matProgressBar"] }, { kind: "directive", type: i6$1.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "component", type: UserFilterComponent, selector: "auth-jwt-user-filter", inputs: ["filter", "disabled"], outputs: ["filterChange"] }, { kind: "component", type: UserEditorComponent, selector: "auth-jwt-user-editor", inputs: ["user"], outputs: ["userChange", "editorClose"] }, { kind: "pipe", type: i12.AsyncPipe, name: "async" }] }); }
843
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.0.2", type: UserListComponent, selector: "auth-jwt-user-list", ngImport: i0, template: "<div id=\"container\">\n <div>\n <!-- filters -->\n <div id=\"filters\">\n <auth-jwt-user-filter\n [filter]=\"filter$ | async\"\n (filterChange)=\"onFilterChange($event)\"\n ></auth-jwt-user-filter>\n </div>\n\n <!-- list -->\n @if (page$ | async; as page) {\n <div id=\"list\">\n @if (loading$ | async) {\n <div>\n <mat-progress-bar mode=\"indeterminate\"></mat-progress-bar>\n </div>\n }\n <table>\n <thead>\n <td></td>\n <td></td>\n <th i18n=\"auth-jwt-admin\">name</th>\n <th i18n=\"auth-jwt-admin\" class=\"noif-lt-md\">first</th>\n <th i18n=\"auth-jwt-admin\" class=\"noif-lt-md\">last</th>\n <th i18n=\"auth-jwt-admin\" class=\"noif-lt-md\">email</th>\n <th i18n=\"auth-jwt-admin\">roles</th>\n <th i18n=\"auth-jwt-admin\" class=\"noif-lt-md\">lock end</th>\n </thead>\n <tbody>\n @for (user of page.items; track user) {\n <tr>\n <td class=\"fit-width\">\n <button\n mat-icon-button\n type=\"button\"\n i18n-matTooltip=\"auth-jwt-admin\"\n matTooltip=\"Edit this user\"\n color=\"primary\"\n (click)=\"setActiveUser(user)\"\n >\n <mat-icon class=\"mat-primary\">mode_edit</mat-icon>\n </button>\n <button\n mat-icon-button\n type=\"button\"\n i18n-matTooltip=\"auth-jwt-admin\"\n matTooltip=\"Delete this user\"\n color=\"warn\"\n (click)=\"deleteUser(user)\"\n >\n <mat-icon class=\"mat-warn\">remove_circle</mat-icon>\n </button>\n </td>\n <td class=\"fit-width\">\n <img\n alt=\"avatar\"\n [src]=\"getGravatarUrl(user.email, 32)\"\n [alt]=\"user.userName\"\n />\n </td>\n <td>{{ user.userName }}</td>\n <td class=\"noif-lt-md\">{{ user.firstName }}</td>\n <td class=\"noif-lt-md\">{{ user.lastName }}</td>\n <td class=\"noif-lt-md\">\n <a [href]=\"'mailto:' + user.email\">{{ user.email }}</a>\n </td>\n <td>{{ user.roles.join(\" \") }}</td>\n <td class=\"noif-lt-md\">{{ user.lockoutEnd }}</td>\n </tr>\n }\n </tbody>\n </table>\n <!-- paginator -->\n <div class=\"form-row\">\n <button\n type=\"button\"\n mat-icon-button\n color=\"warn\"\n i18n-matmatTooltip=\"auth-jwt-admin\"\n matTooltip=\"Refresh list\"\n (click)=\"reset()\"\n >\n <mat-icon class=\"mat-warn\">autorenew</mat-icon>\n </button>\n <mat-paginator\n [length]=\"page.total\"\n [pageIndex]=\"page.pageNumber - 1\"\n [pageSize]=\"page.pageSize\"\n [pageSizeOptions]=\"[5, 10, 20, 50, 100]\"\n (page)=\"onPageChange($event)\"\n [showFirstLastButtons]=\"true\"\n ></mat-paginator>\n </div>\n </div>\n }\n </div>\n\n <!-- editor -->\n <mat-expansion-panel\n id=\"editor\"\n [expanded]=\"active$ | async\"\n [disabled]=\"!(active$ | async)\"\n >\n @if (active$ | async; as active) {\n <div>\n <fieldset>\n <legend>{{ active.userName }}</legend>\n <auth-jwt-user-editor\n [user]=\"active\"\n (userChange)=\"saveActiveUser($event)\"\n (editorClose)=\"resetActiveUser()\"\n ></auth-jwt-user-editor>\n </fieldset>\n </div>\n }\n </mat-expansion-panel>\n</div>\n", styles: ["tr:nth-child(odd){background-color:#f8f8f8}th{padding:0 8px;text-align:left;color:silver;font-weight:400}td{padding:0 8px}td.fit-width{width:1px;white-space:nowrap}table{width:100%;border-collapse:collapse}fieldset{border:1px solid silver;border-radius:8px;padding:16px}.form-row{display:flex;gap:8px;align-items:center;flex-wrap:wrap}.form-row *{flex:0 0 auto}div#filters{grid-area:filters}div#list{grid-area:list}div#editor{grid-area:editor}div#container{display:grid;grid-template-rows:auto 1fr auto;grid-template-columns:1fr;grid-template-areas:\"filters\" \"list\" \"editor\";gap:8px}@media only screen and (max-width: 959px){.noif-lt-md{display:none}}@media only screen and (min-width: 1920px){div#container{grid-template-rows:auto 1fr;grid-template-columns:1fr auto;grid-template-areas:\"filters filters\" \"list editor\"}}\n"], dependencies: [{ kind: "component", type: i5.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "component", type: i5$1.MatExpansionPanel, selector: "mat-expansion-panel", inputs: ["hideToggle", "togglePosition"], outputs: ["afterExpand", "afterCollapse"], exportAs: ["matExpansionPanel"] }, { kind: "component", type: i6.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i7$1.MatPaginator, selector: "mat-paginator", inputs: ["color", "pageIndex", "length", "pageSize", "pageSizeOptions", "hidePageSize", "showFirstLastButtons", "selectConfig", "disabled"], outputs: ["page"], exportAs: ["matPaginator"] }, { kind: "component", type: i8$1.MatProgressBar, selector: "mat-progress-bar", inputs: ["color", "value", "bufferValue", "mode"], outputs: ["animationEnd"], exportAs: ["matProgressBar"] }, { kind: "directive", type: i6$1.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "component", type: UserFilterComponent, selector: "auth-jwt-user-filter", inputs: ["filter", "disabled"], outputs: ["filterChange"] }, { kind: "component", type: UserEditorComponent, selector: "auth-jwt-user-editor", inputs: ["user"], outputs: ["userChange", "editorClose"] }, { kind: "pipe", type: i12.AsyncPipe, name: "async" }] }); }
844
844
  }
845
845
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.2", ngImport: i0, type: UserListComponent, decorators: [{
846
846
  type: Component,
847
- args: [{ selector: 'auth-jwt-user-list', template: "<div id=\"container\">\n <div>\n <!-- filters -->\n <div id=\"filters\">\n <auth-jwt-user-filter\n [filter]=\"filter$ | async\"\n (filterChange)=\"onFilterChange($event)\"\n ></auth-jwt-user-filter>\n </div>\n\n <!-- list -->\n @if (page$ | async; as page) {\n <div id=\"list\">\n @if (loading$ | async) {\n <div>\n <mat-progress-bar mode=\"indeterminate\"></mat-progress-bar>\n </div>\n }\n <table>\n <thead>\n <td></td>\n <td></td>\n <th i18n=\"auth-jwt-admin\">name</th>\n <th i18n=\"auth-jwt-admin\" class=\"noif-lt-md\">first</th>\n <th i18n=\"auth-jwt-admin\" class=\"noif-lt-md\">last</th>\n <th i18n=\"auth-jwt-admin\" class=\"noif-lt-md\">email</th>\n <th i18n=\"auth-jwt-admin\">roles</th>\n <th i18n=\"auth-jwt-admin\" class=\"noif-lt-md\">lock end</th>\n </thead>\n <tbody>\n @for (user of page.items; track user) {\n <tr>\n <td class=\"fit-width\">\n <button\n mat-icon-button\n type=\"button\"\n i18n-matTooltip=\"auth-jwt-admin\"\n matTooltip=\"Edit this user\"\n color=\"primary\"\n class=\"mat-primary\"\n (click)=\"setActiveUser(user)\"\n >\n <mat-icon>mode_edit</mat-icon>\n </button>\n <button\n mat-icon-button\n type=\"button\"\n i18n-matTooltip=\"auth-jwt-admin\"\n matTooltip=\"Delete this user\"\n color=\"warn\"\n class=\"mat-warn\"\n (click)=\"deleteUser(user)\"\n >\n <mat-icon>remove_circle</mat-icon>\n </button>\n </td>\n <td class=\"fit-width\">\n <img\n alt=\"avatar\"\n [src]=\"getGravatarUrl(user.email, 32)\"\n [alt]=\"user.userName\"\n />\n </td>\n <td>{{ user.userName }}</td>\n <td class=\"noif-lt-md\">{{ user.firstName }}</td>\n <td class=\"noif-lt-md\">{{ user.lastName }}</td>\n <td class=\"noif-lt-md\">\n <a [href]=\"'mailto:' + user.email\">{{ user.email }}</a>\n </td>\n <td>{{ user.roles.join(\" \") }}</td>\n <td class=\"noif-lt-md\">{{ user.lockoutEnd }}</td>\n </tr>\n }\n </tbody>\n </table>\n <!-- paginator -->\n <div class=\"form-row\">\n <button\n type=\"button\"\n mat-icon-button\n color=\"warn\"\n class=\"mat-warn\"\n i18n-matmatTooltip=\"auth-jwt-admin\"\n matTooltip=\"Refresh list\"\n (click)=\"reset()\"\n >\n <mat-icon>autorenew</mat-icon>\n </button>\n <mat-paginator\n [length]=\"page.total\"\n [pageIndex]=\"page.pageNumber - 1\"\n [pageSize]=\"page.pageSize\"\n [pageSizeOptions]=\"[5, 10, 20, 50, 100]\"\n (page)=\"onPageChange($event)\"\n [showFirstLastButtons]=\"true\"\n ></mat-paginator>\n </div>\n </div>\n }\n </div>\n\n <!-- editor -->\n <mat-expansion-panel\n id=\"editor\"\n [expanded]=\"active$ | async\"\n [disabled]=\"!(active$ | async)\"\n >\n @if (active$ | async; as active) {\n <div>\n <fieldset>\n <legend>{{ active.userName }}</legend>\n <auth-jwt-user-editor\n [user]=\"active\"\n (userChange)=\"saveActiveUser($event)\"\n (editorClose)=\"resetActiveUser()\"\n ></auth-jwt-user-editor>\n </fieldset>\n </div>\n }\n </mat-expansion-panel>\n</div>\n", styles: ["tr:nth-child(odd){background-color:#f8f8f8}th{padding:0 8px;text-align:left;color:silver;font-weight:400}td{padding:0 8px}td.fit-width{width:1px;white-space:nowrap}table{width:100%;border-collapse:collapse}fieldset{border:1px solid silver;border-radius:8px;padding:16px}.form-row{display:flex;gap:8px;align-items:center;flex-wrap:wrap}.form-row *{flex:0 0 auto}div#filters{grid-area:filters}div#list{grid-area:list}div#editor{grid-area:editor}div#container{display:grid;grid-template-rows:auto 1fr auto;grid-template-columns:1fr;grid-template-areas:\"filters\" \"list\" \"editor\";gap:8px}@media only screen and (max-width: 959px){.noif-lt-md{display:none}}@media only screen and (min-width: 1920px){div#container{grid-template-rows:auto 1fr;grid-template-columns:1fr auto;grid-template-areas:\"filters filters\" \"list editor\"}}\n"] }]
847
+ args: [{ selector: 'auth-jwt-user-list', template: "<div id=\"container\">\n <div>\n <!-- filters -->\n <div id=\"filters\">\n <auth-jwt-user-filter\n [filter]=\"filter$ | async\"\n (filterChange)=\"onFilterChange($event)\"\n ></auth-jwt-user-filter>\n </div>\n\n <!-- list -->\n @if (page$ | async; as page) {\n <div id=\"list\">\n @if (loading$ | async) {\n <div>\n <mat-progress-bar mode=\"indeterminate\"></mat-progress-bar>\n </div>\n }\n <table>\n <thead>\n <td></td>\n <td></td>\n <th i18n=\"auth-jwt-admin\">name</th>\n <th i18n=\"auth-jwt-admin\" class=\"noif-lt-md\">first</th>\n <th i18n=\"auth-jwt-admin\" class=\"noif-lt-md\">last</th>\n <th i18n=\"auth-jwt-admin\" class=\"noif-lt-md\">email</th>\n <th i18n=\"auth-jwt-admin\">roles</th>\n <th i18n=\"auth-jwt-admin\" class=\"noif-lt-md\">lock end</th>\n </thead>\n <tbody>\n @for (user of page.items; track user) {\n <tr>\n <td class=\"fit-width\">\n <button\n mat-icon-button\n type=\"button\"\n i18n-matTooltip=\"auth-jwt-admin\"\n matTooltip=\"Edit this user\"\n color=\"primary\"\n (click)=\"setActiveUser(user)\"\n >\n <mat-icon class=\"mat-primary\">mode_edit</mat-icon>\n </button>\n <button\n mat-icon-button\n type=\"button\"\n i18n-matTooltip=\"auth-jwt-admin\"\n matTooltip=\"Delete this user\"\n color=\"warn\"\n (click)=\"deleteUser(user)\"\n >\n <mat-icon class=\"mat-warn\">remove_circle</mat-icon>\n </button>\n </td>\n <td class=\"fit-width\">\n <img\n alt=\"avatar\"\n [src]=\"getGravatarUrl(user.email, 32)\"\n [alt]=\"user.userName\"\n />\n </td>\n <td>{{ user.userName }}</td>\n <td class=\"noif-lt-md\">{{ user.firstName }}</td>\n <td class=\"noif-lt-md\">{{ user.lastName }}</td>\n <td class=\"noif-lt-md\">\n <a [href]=\"'mailto:' + user.email\">{{ user.email }}</a>\n </td>\n <td>{{ user.roles.join(\" \") }}</td>\n <td class=\"noif-lt-md\">{{ user.lockoutEnd }}</td>\n </tr>\n }\n </tbody>\n </table>\n <!-- paginator -->\n <div class=\"form-row\">\n <button\n type=\"button\"\n mat-icon-button\n color=\"warn\"\n i18n-matmatTooltip=\"auth-jwt-admin\"\n matTooltip=\"Refresh list\"\n (click)=\"reset()\"\n >\n <mat-icon class=\"mat-warn\">autorenew</mat-icon>\n </button>\n <mat-paginator\n [length]=\"page.total\"\n [pageIndex]=\"page.pageNumber - 1\"\n [pageSize]=\"page.pageSize\"\n [pageSizeOptions]=\"[5, 10, 20, 50, 100]\"\n (page)=\"onPageChange($event)\"\n [showFirstLastButtons]=\"true\"\n ></mat-paginator>\n </div>\n </div>\n }\n </div>\n\n <!-- editor -->\n <mat-expansion-panel\n id=\"editor\"\n [expanded]=\"active$ | async\"\n [disabled]=\"!(active$ | async)\"\n >\n @if (active$ | async; as active) {\n <div>\n <fieldset>\n <legend>{{ active.userName }}</legend>\n <auth-jwt-user-editor\n [user]=\"active\"\n (userChange)=\"saveActiveUser($event)\"\n (editorClose)=\"resetActiveUser()\"\n ></auth-jwt-user-editor>\n </fieldset>\n </div>\n }\n </mat-expansion-panel>\n</div>\n", styles: ["tr:nth-child(odd){background-color:#f8f8f8}th{padding:0 8px;text-align:left;color:silver;font-weight:400}td{padding:0 8px}td.fit-width{width:1px;white-space:nowrap}table{width:100%;border-collapse:collapse}fieldset{border:1px solid silver;border-radius:8px;padding:16px}.form-row{display:flex;gap:8px;align-items:center;flex-wrap:wrap}.form-row *{flex:0 0 auto}div#filters{grid-area:filters}div#list{grid-area:list}div#editor{grid-area:editor}div#container{display:grid;grid-template-rows:auto 1fr auto;grid-template-columns:1fr;grid-template-areas:\"filters\" \"list\" \"editor\";gap:8px}@media only screen and (max-width: 959px){.noif-lt-md{display:none}}@media only screen and (min-width: 1920px){div#container{grid-template-rows:auto 1fr;grid-template-columns:1fr auto;grid-template-areas:\"filters filters\" \"list editor\"}}\n"] }]
848
848
  }], ctorParameters: () => [{ type: UserListRepository }, { type: i2$3.DialogService }, { type: i2$2.GravatarService }] });
849
849
 
850
850
  class AuthJwtAdminModule {
@@ -1 +1 @@
1
- {"version":3,"file":"myrmidon-auth-jwt-admin.mjs","sources":["../../../../projects/myrmidon/auth-jwt-admin/src/lib/validators/password.validators.ts","../../../../projects/myrmidon/auth-jwt-admin/src/lib/services/auth-jwt-account.service.ts","../../../../projects/myrmidon/auth-jwt-admin/src/lib/components/state/user-list.repository.ts","../../../../projects/myrmidon/auth-jwt-admin/src/lib/components/password-strength-bar/password-strength-bar.component.ts","../../../../projects/myrmidon/auth-jwt-admin/src/lib/components/password-strength-bar/password-strength-bar.component.html","../../../../projects/myrmidon/auth-jwt-admin/src/lib/components/auth-jwt-registration/auth-jwt-registration.component.ts","../../../../projects/myrmidon/auth-jwt-admin/src/lib/components/auth-jwt-registration/auth-jwt-registration.component.html","../../../../projects/myrmidon/auth-jwt-admin/src/lib/components/user-filter/user-filter.component.ts","../../../../projects/myrmidon/auth-jwt-admin/src/lib/components/user-filter/user-filter.component.html","../../../../projects/myrmidon/auth-jwt-admin/src/lib/components/user-editor/user-editor.component.ts","../../../../projects/myrmidon/auth-jwt-admin/src/lib/components/user-editor/user-editor.component.html","../../../../projects/myrmidon/auth-jwt-admin/src/lib/components/user-list/user-list.component.ts","../../../../projects/myrmidon/auth-jwt-admin/src/lib/components/user-list/user-list.component.html","../../../../projects/myrmidon/auth-jwt-admin/src/lib/auth-jwt-admin.module.ts","../../../../projects/myrmidon/auth-jwt-admin/src/public-api.ts","../../../../projects/myrmidon/auth-jwt-admin/src/myrmidon-auth-jwt-admin.ts"],"sourcesContent":["import {\r\n AbstractControl,\r\n FormGroup,\r\n UntypedFormGroup,\r\n ValidationErrors,\r\n ValidatorFn,\r\n} from '@angular/forms';\r\n\r\nexport class PasswordValidators {\r\n /** \"Standard\" password validator for my API services. */\r\n public static standard(): ValidatorFn {\r\n return (control: AbstractControl): ValidationErrors | null => {\r\n if (!control.value) {\r\n return null;\r\n }\r\n\r\n if (control.value.length < 8) {\r\n return {\r\n passwordtooshort: true,\r\n };\r\n }\r\n\r\n if (!/.*[A-Z].*/.test(control.value)) {\r\n return {\r\n noupperinpassword: true,\r\n };\r\n }\r\n\r\n if (!/.*[a-z].*/.test(control.value)) {\r\n return {\r\n nolowerinpassword: true,\r\n };\r\n }\r\n\r\n if (!/.*[A-Z].*/.test(control.value)) {\r\n return {\r\n noupperinpassword: true,\r\n };\r\n }\r\n\r\n if (!/.*[-`~!@#$%^&*()_+=\\[\\]{};:'\",.<>/?|\\\\].*/.test(control.value)) {\r\n return {\r\n nosymbolinpassword: true,\r\n };\r\n }\r\n\r\n return null;\r\n };\r\n }\r\n\r\n public static areEqual(\r\n controlName: string,\r\n otherControlName: string\r\n ): ValidatorFn {\r\n return (control: AbstractControl): ValidationErrors | null => {\r\n const g = control as FormGroup | UntypedFormGroup;\r\n const a = g.controls[controlName];\r\n const b = g.controls[otherControlName];\r\n return a.value !== b.value\r\n ? {\r\n areequal: true,\r\n }\r\n : null;\r\n };\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { HttpClient, HttpParams } from '@angular/common/http';\r\nimport { Observable } from 'rxjs';\r\nimport { retry, catchError, map } from 'rxjs/operators';\r\n\r\nimport { DataPage, EnvService, ErrorService } from '@myrmidon/ng-tools';\r\nimport { User } from '@myrmidon/auth-jwt-login';\r\n\r\n/**\r\n * User registration model. You can expand this interface to add more data.\r\n */\r\nexport interface RegistrationModel {\r\n email: string;\r\n name: string;\r\n firstName?: string;\r\n lastName?: string;\r\n password: string;\r\n}\r\n\r\n/**\r\n * Result of an existing resource check.\r\n */\r\nexport interface ExistResult {\r\n entry: string;\r\n isExisting: boolean;\r\n}\r\n\r\n/**\r\n * Password change data.\r\n */\r\nexport interface PasswordChange {\r\n email: string;\r\n oldPassword: string;\r\n newPassword: string;\r\n confirmPassword: string;\r\n}\r\n\r\n/**\r\n * User filter parameters.\r\n */\r\nexport interface UserFilter {\r\n name?: string;\r\n}\r\n\r\n/**\r\n * The type of user data returned by the server.\r\n */\r\ninterface UserWithRoles<T> {\r\n user: T;\r\n roles?: string[];\r\n}\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class AuthJwtAccountService {\r\n constructor(\r\n private _http: HttpClient,\r\n private _error: ErrorService,\r\n private _env: EnvService\r\n ) {}\r\n\r\n /**\r\n * Checks if the specified email address is registered on the server.\r\n * @param email email address to test.\r\n * @returns result.\r\n */\r\n public isEmailRegistered(email: string): Observable<ExistResult> {\r\n return this._http.get<ExistResult>(\r\n this._env.get('apiUrl') +\r\n 'accounts/emailexists/' +\r\n encodeURIComponent(email)\r\n );\r\n }\r\n\r\n /**\r\n * Checks if the specified user's given name is registered on the server.\r\n * This name is a nickname chosen by users during registration, and is the key\r\n * used for referencing users when talking to the server.\r\n * @param name name to test.\r\n * @returns result.\r\n */\r\n public isNameRegistered(name: string): Observable<ExistResult> {\r\n return this._http.get<ExistResult>(\r\n this._env.get('apiUrl') +\r\n 'accounts/nameexists/' +\r\n encodeURIComponent(name)\r\n );\r\n }\r\n\r\n /**\r\n * Register the user with the specified registration data.\r\n * @param registration The registration data.\r\n * @param confirmed True to automatically confirm the user's email address\r\n * without sending the confirmation email message.\r\n */\r\n public register(\r\n registration: RegistrationModel,\r\n confirmed = false\r\n ): Observable<any> {\r\n return this._http.post(\r\n this._env.get('apiUrl') +\r\n 'accounts/register' +\r\n (confirmed ? '?confirmed=true' : ''),\r\n registration\r\n );\r\n }\r\n\r\n /**\r\n * Resend the confirmation email to the specified address.\r\n * @param email address.\r\n */\r\n public resendConfirmEmail(email: string): Observable<any> {\r\n return this._http.get(\r\n this._env.get('apiUrl') +\r\n 'accounts/resendconfirm/' +\r\n encodeURIComponent(email)\r\n // options\r\n );\r\n }\r\n\r\n /**\r\n * Request a password reset for the specified email address.\r\n * @param email Email address.\r\n */\r\n public requestPasswordReset(email: string): Observable<any> {\r\n return this._http.post(\r\n this._env.get('apiUrl') + 'accounts/resetpassword/request',\r\n { email }\r\n );\r\n }\r\n\r\n private getUserFromWrapper(response: UserWithRoles<User> | User): User {\r\n return (response as UserWithRoles<User>).user\r\n ? {\r\n ...((response as UserWithRoles<User>).user as User),\r\n roles: response.roles || [],\r\n }\r\n : (response as User);\r\n }\r\n\r\n public getAllUsers(): Observable<DataPage<User>> {\r\n return this._http\r\n .get<DataPage<UserWithRoles<User> | User>>(\r\n this._env.get('apiUrl') + 'users',\r\n {\r\n params: new HttpParams().set('pageNumber', '1'),\r\n }\r\n )\r\n .pipe(\r\n retry(3),\r\n map((dataPage: DataPage<UserWithRoles<User> | User>) => {\r\n return {\r\n ...dataPage,\r\n items: dataPage.items.map(this.getUserFromWrapper),\r\n };\r\n }),\r\n catchError(this._error.handleError)\r\n );\r\n }\r\n\r\n public getUsers(\r\n filter: UserFilter,\r\n pageNumber = 1,\r\n pageSize = 20\r\n ): Observable<DataPage<User>> {\r\n let httpParams = new HttpParams();\r\n httpParams = httpParams.set('pageNumber', pageNumber.toString());\r\n httpParams = httpParams.set('pageSize', pageSize.toString());\r\n if (filter.name) {\r\n httpParams = httpParams.set('name', filter.name);\r\n }\r\n\r\n return this._http\r\n .get<DataPage<UserWithRoles<User>>>(this._env.get('apiUrl') + 'users', {\r\n params: httpParams,\r\n })\r\n .pipe(\r\n retry(3),\r\n map((dataPage: DataPage<UserWithRoles<User>>) => {\r\n return {\r\n ...dataPage,\r\n items: dataPage.items.map(this.getUserFromWrapper),\r\n };\r\n }),\r\n catchError(this._error.handleError)\r\n );\r\n }\r\n /**\r\n * Get the top N users matching the specified name filter.\r\n * @param nameFilter The user name filter.\r\n * @param limit The maximum number of users to get.\r\n */\r\n public getTopUsers(nameFilter: string, limit = 10): Observable<User[]> {\r\n let httpParams = new HttpParams();\r\n httpParams = httpParams.set('pageNumber', '1');\r\n httpParams = httpParams.set('pageSize', limit.toString());\r\n if (nameFilter) {\r\n httpParams = httpParams.set('name', nameFilter);\r\n }\r\n const options =\r\n httpParams.keys().length > 0\r\n ? {\r\n params: httpParams,\r\n }\r\n : {};\r\n\r\n return this._http\r\n .get<UserWithRoles<User>[]>(this._env.get('apiUrl') + 'users', options)\r\n .pipe(\r\n retry(3),\r\n map((users: UserWithRoles<User>[]) => {\r\n return users.map(this.getUserFromWrapper);\r\n }),\r\n catchError(this._error.handleError)\r\n );\r\n }\r\n\r\n /**\r\n * Get information about all the users listed in the specified names.\r\n * @param names User(s) names.\r\n */\r\n public getUsersFromNames(names: string[]): Observable<User[]> {\r\n let httpParams = new HttpParams();\r\n if (names && names.length > 0) {\r\n httpParams = httpParams.set('names', names.join(','));\r\n }\r\n const options =\r\n httpParams.keys().length > 0\r\n ? {\r\n params: httpParams,\r\n }\r\n : {};\r\n\r\n return this._http\r\n .get<UserWithRoles<User>[]>(\r\n this._env.get('apiUrl') + 'users-from-names',\r\n options\r\n )\r\n .pipe(\r\n retry(3),\r\n map((users: UserWithRoles<User>[]) => {\r\n return users.map(this.getUserFromWrapper);\r\n }),\r\n catchError(this._error.handleError)\r\n );\r\n }\r\n\r\n /**\r\n * Get data about the specified user.\r\n * @param name The user name.\r\n */\r\n public getUser(name: string): Observable<User> {\r\n return this._http\r\n .get<UserWithRoles<User>>(this._env.get('apiUrl') + 'users/' + name)\r\n .pipe(\r\n retry(3),\r\n map(this.getUserFromWrapper),\r\n catchError(this._error.handleError)\r\n );\r\n }\r\n\r\n /**\r\n * Update the editable data for the specified user.\r\n * @param user The user to update.\r\n */\r\n public updateUser(user: User): Observable<any> {\r\n return this._http\r\n .put(\r\n this._env.get('apiUrl') +\r\n 'users' +\r\n (user.emailConfirmed ? '?confirmed=true' : ''),\r\n user\r\n )\r\n .pipe(catchError(this._error.handleError));\r\n }\r\n\r\n /**\r\n * Request a password reset email for the specified email address.\r\n * @param email The email address to receive the reset message.\r\n */\r\n public resetPassword(email: string): Observable<any> {\r\n return this._http\r\n .post(this._env.get('apiUrl') + 'accounts/resetpassword/request', {\r\n email: email,\r\n })\r\n .pipe(catchError(this._error.handleError));\r\n }\r\n\r\n /**\r\n * Change the password.\r\n * @param change The password change data.\r\n */\r\n public changePassword(change: PasswordChange): Observable<any> {\r\n return this._http\r\n .post(this._env.get('apiUrl') + 'accounts/changepassword', change)\r\n .pipe(catchError(this._error.handleError));\r\n }\r\n\r\n /**\r\n * Delete the user with the specified username.\r\n * @param name The user name.\r\n */\r\n public deleteUser(name: string): Observable<any> {\r\n return this._http\r\n .delete(this._env.get('apiUrl') + 'accounts/' + name)\r\n .pipe(catchError(this._error.handleError));\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { BehaviorSubject, Observable, take, tap } from 'rxjs';\r\n\r\nimport { User } from '@myrmidon/auth-jwt-login';\r\nimport { DataPage } from '@myrmidon/ng-tools';\r\nimport {\r\n PagedListStore,\r\n PagedListStoreService,\r\n} from '@myrmidon/paged-data-browsers';\r\n\r\nimport {\r\n AuthJwtAccountService,\r\n UserFilter,\r\n} from '../../services/auth-jwt-account.service';\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class UserListRepository\r\n implements PagedListStoreService<UserFilter, User>\r\n{\r\n private _store: PagedListStore<UserFilter, User>;\r\n private _activeUser$: BehaviorSubject<User | undefined>;\r\n private _loading$: BehaviorSubject<boolean>;\r\n private _saving$: BehaviorSubject<boolean>;\r\n\r\n public get activeUser$(): Observable<User | undefined> {\r\n return this._activeUser$.asObservable();\r\n }\r\n public get filter$(): Observable<UserFilter> {\r\n return this._store.filter$;\r\n }\r\n public get page$(): Observable<DataPage<User>> {\r\n return this._store.page$;\r\n }\r\n public get loading$(): Observable<boolean> {\r\n return this._loading$.asObservable();\r\n }\r\n public get saving$(): Observable<boolean> {\r\n return this._saving$.asObservable();\r\n }\r\n\r\n constructor(private _accService: AuthJwtAccountService) {\r\n this._store = new PagedListStore<UserFilter, User>(this);\r\n this._activeUser$ = new BehaviorSubject<User | undefined>(undefined);\r\n this._loading$ = new BehaviorSubject<boolean>(false);\r\n this._saving$ = new BehaviorSubject<boolean>(false);\r\n this._store.reset();\r\n }\r\n\r\n public loadPage(\r\n pageNumber: number,\r\n pageSize: number,\r\n filter: UserFilter\r\n ): Observable<DataPage<User>> {\r\n this._loading$.next(true);\r\n return this._accService.getUsers(filter, pageNumber, pageSize).pipe(\r\n tap({\r\n next: () => this._loading$.next(false),\r\n error: () => this._loading$.next(false),\r\n })\r\n );\r\n }\r\n\r\n public async reset(): Promise<void> {\r\n this._loading$.next(true);\r\n try {\r\n await this._store.reset();\r\n } catch (error) {\r\n throw error;\r\n } finally {\r\n this._loading$.next(false);\r\n }\r\n }\r\n\r\n public async setFilter(filter: UserFilter): Promise<void> {\r\n this._loading$.next(true);\r\n try {\r\n await this._store.setFilter(filter);\r\n } catch (error) {\r\n throw error;\r\n } finally {\r\n this._loading$.next(false);\r\n }\r\n }\r\n\r\n public getFilter(): UserFilter {\r\n return this._store.getFilter();\r\n }\r\n\r\n public async setPage(pageNumber: number, pageSize: number): Promise<void> {\r\n this._loading$.next(true);\r\n try {\r\n await this._store.setPage(pageNumber, pageSize);\r\n } catch (error) {\r\n throw error;\r\n } finally {\r\n this._loading$.next(false);\r\n }\r\n }\r\n\r\n public setActiveUser(user: User | null): void {\r\n this._activeUser$.next(user || undefined);\r\n }\r\n\r\n public updateActiveUser(user: User): Promise<boolean> {\r\n const promise: Promise<boolean> = new Promise((resolve, reject) => {\r\n this._saving$.next(true);\r\n\r\n this._accService.updateUser(user).subscribe({\r\n next: (_) => {\r\n this._saving$.next(false);\r\n this._store.reset();\r\n resolve(true);\r\n },\r\n error: (error) => {\r\n this._saving$.next(false);\r\n console.error(\r\n `Error updating user ${user.userName}: ` +\r\n JSON.stringify(error || {})\r\n );\r\n resolve(false);\r\n },\r\n });\r\n });\r\n return promise;\r\n }\r\n\r\n public deleteUser(name: string): Promise<boolean> {\r\n const promise: Promise<boolean> = new Promise((resolve, reject) => {\r\n if (this._activeUser$.value?.userName === name) {\r\n this._activeUser$.next(undefined);\r\n }\r\n\r\n this._saving$.next(true);\r\n\r\n this._accService.deleteUser(name).subscribe({\r\n next: (_) => {\r\n this._saving$.next(false);\r\n this._store.reset();\r\n resolve(true);\r\n },\r\n error: (error) => {\r\n this._saving$.next(false);\r\n console.error(\r\n `Error deleting user ${name}: ` + JSON.stringify(error || {})\r\n );\r\n reject(error);\r\n },\r\n });\r\n });\r\n return promise;\r\n }\r\n}\r\n","import {\r\n Component,\r\n OnChanges,\r\n EventEmitter,\r\n Input,\r\n Output,\r\n SimpleChange,\r\n} from '@angular/core';\r\n\r\n@Component({\r\n selector: 'auth-jwt-password-strength-bar',\r\n templateUrl: './password-strength-bar.component.html',\r\n styleUrls: ['./password-strength-bar.component.css'],\r\n})\r\nexport class PasswordStrengthBarComponent implements OnChanges {\r\n private _colors = ['#F00', '#F90', '#FF0', '#9F0', '#0F0'];\r\n\r\n @Input() passwordToCheck: string | undefined;\r\n\r\n @Output() strengthChange = new EventEmitter<number>();\r\n\r\n public bars: string[];\r\n\r\n constructor() {\r\n this.strengthChange = new EventEmitter<number>();\r\n this.bars = [];\r\n }\r\n\r\n private measureStrength(p: string): number {\r\n let force = 0;\r\n const regex = /[$-/:-?{-~!\"^_`\\[\\]]/g; // \"\r\n\r\n const lowerLetters = /[a-z]+/.test(p);\r\n const upperLetters = /[A-Z]+/.test(p);\r\n const numbers = /[0-9]+/.test(p);\r\n const symbols = regex.test(p);\r\n\r\n const flags = [lowerLetters, upperLetters, numbers, symbols];\r\n\r\n let passedMatches = 0;\r\n for (const flag of flags) {\r\n passedMatches += flag === true ? 1 : 0;\r\n }\r\n\r\n force += 2 * p.length + (p.length >= 10 ? 1 : 0);\r\n force += passedMatches * 10;\r\n\r\n // penalty (short password)\r\n force = p.length <= 6 ? Math.min(force, 10) : force;\r\n\r\n // penalty (poor letiety of characters)\r\n force = passedMatches === 1 ? Math.min(force, 10) : force;\r\n force = passedMatches === 2 ? Math.min(force, 20) : force;\r\n force = passedMatches === 3 ? Math.min(force, 40) : force;\r\n\r\n return force;\r\n }\r\n\r\n private getColor(s: number) {\r\n let idx = 0;\r\n if (s <= 10) {\r\n idx = 0;\r\n } else if (s <= 20) {\r\n idx = 1;\r\n } else if (s <= 30) {\r\n idx = 2;\r\n } else if (s <= 40) {\r\n idx = 3;\r\n } else {\r\n idx = 4;\r\n }\r\n return {\r\n idx: idx + 1,\r\n col: this._colors[idx],\r\n };\r\n }\r\n\r\n ngOnChanges(changes: { [propName: string]: SimpleChange }): void {\r\n const password = changes['passwordToCheck'].currentValue;\r\n this.setBarColors(5, '#DDD');\r\n if (password) {\r\n const strength = this.measureStrength(password);\r\n const c = this.getColor(strength);\r\n this.setBarColors(c.idx, c.col);\r\n this.strengthChange.emit(strength);\r\n }\r\n }\r\n\r\n private setBarColors(count: number, col: string) {\r\n for (let n = 0; n < count; n++) {\r\n this.bars[n] = col;\r\n }\r\n }\r\n}\r\n","<div id=\"strength\">\r\n <small>strength:</small>\r\n <ul id=\"strengthBar\">\r\n <li class=\"point\" [style.background-color]=\"bars[0]\"></li>\r\n <li class=\"point\" [style.background-color]=\"bars[1]\"></li>\r\n <li class=\"point\" [style.background-color]=\"bars[2]\"></li>\r\n <li class=\"point\" [style.background-color]=\"bars[3]\"></li>\r\n <li class=\"point\" [style.background-color]=\"bars[4]\"></li>\r\n </ul>\r\n</div>\r\n","import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core';\r\nimport {\r\n Validators,\r\n AbstractControl,\r\n ValidationErrors,\r\n FormGroup,\r\n FormControl,\r\n FormBuilder,\r\n} from '@angular/forms';\r\nimport { MatSnackBar } from '@angular/material/snack-bar';\r\nimport { Observable } from 'rxjs';\r\nimport { take } from 'rxjs/operators';\r\n\r\nimport {\r\n AuthJwtAccountService,\r\n ExistResult,\r\n RegistrationModel,\r\n} from '../../services/auth-jwt-account.service';\r\nimport { PasswordValidators } from '../../validators/password.validators';\r\nimport { UserListRepository } from '../state/user-list.repository';\r\n\r\n@Component({\r\n selector: 'auth-jwt-registration',\r\n templateUrl: './auth-jwt-registration.component.html',\r\n styleUrls: ['./auth-jwt-registration.component.css'],\r\n})\r\nexport class AuthJwtRegistrationComponent {\r\n public busy: boolean | undefined;\r\n // form\r\n public form: FormGroup;\r\n public email: FormControl<string>;\r\n public name: FormControl<string>;\r\n public firstName: FormControl<string>;\r\n public lastName: FormControl<string>;\r\n public password: FormControl<string>;\r\n public confirmPassword: FormControl<string>;\r\n\r\n /**\r\n * True if the registration should be confirmed automatically.\r\n */\r\n @Input()\r\n public autoConfirm?: boolean;\r\n\r\n /**\r\n * Emitted when a user was successfully registered. Usually\r\n * you should handle this to move away from the registration\r\n * page.\r\n */\r\n @Output()\r\n public registered: EventEmitter<any>;\r\n\r\n public hide = true;\r\n\r\n constructor(\r\n formBuilder: FormBuilder,\r\n private _snackbar: MatSnackBar,\r\n private _accountService: AuthJwtAccountService,\r\n private _userRepository: UserListRepository\r\n ) {\r\n this.registered = new EventEmitter<any>();\r\n // form\r\n this.email = formBuilder.control('', {\r\n validators: [Validators.required, Validators.email],\r\n asyncValidators: this.getUniqueEmailValidator(this._accountService).bind(\r\n this\r\n ),\r\n nonNullable: true,\r\n });\r\n\r\n this.name = formBuilder.control('', {\r\n validators: Validators.required,\r\n asyncValidators: this.getUniqueNameValidator(this._accountService).bind(\r\n this\r\n ),\r\n nonNullable: true,\r\n });\r\n\r\n this.firstName = formBuilder.control('', {\r\n validators: [Validators.required, Validators.maxLength(50)],\r\n nonNullable: true,\r\n });\r\n this.lastName = formBuilder.control('', {\r\n validators: [Validators.required, Validators.maxLength(50)],\r\n nonNullable: true,\r\n });\r\n\r\n // http://stackoverflow.com/questions/35474991/angular-2-form-validating-for-repeat-password\r\n this.password = formBuilder.control('', {\r\n validators: [Validators.required, PasswordValidators.standard()],\r\n nonNullable: true,\r\n });\r\n this.confirmPassword = formBuilder.control('', {\r\n validators: Validators.required,\r\n nonNullable: true,\r\n });\r\n\r\n this.form = formBuilder.group(\r\n {\r\n email: this.email,\r\n name: this.name,\r\n firstName: this.firstName,\r\n lastName: this.lastName,\r\n password: this.password,\r\n confirmPassword: this.confirmPassword,\r\n },\r\n {\r\n validators: [\r\n PasswordValidators.areEqual('password', 'confirmPassword'),\r\n ],\r\n }\r\n );\r\n }\r\n\r\n /**\r\n * Creates a unique name validator. There is no dependency injection at this level,\r\n * but we can use closures. As a matter of fact, we have access to the service instance\r\n * from the component where we register validators. So we will implement a function\r\n * that will accept the service as parameter, and create the actual validation function.\r\n * This function will have access to the service when called during the validation process.\r\n * See http://restlet.com/blog/2016/02/17/implementing-angular2-forms-beyond-basics-part-2/.\r\n */\r\n private getUniqueNameValidator(service: AuthJwtAccountService) {\r\n return (\r\n control: AbstractControl\r\n ):\r\n | Promise<ValidationErrors | null>\r\n | Observable<ValidationErrors | null> => {\r\n return new Promise((resolve, reject) => {\r\n // avoid checking if empty\r\n if (!control.value) {\r\n resolve(null);\r\n } else {\r\n service.isNameRegistered(control.value).subscribe({\r\n next: (data: ExistResult) => {\r\n if (!data.isExisting) {\r\n resolve(null);\r\n } else {\r\n resolve({ uniqueName: true });\r\n }\r\n },\r\n error: (error) => {\r\n console.error(\r\n 'Unique name validator error' +\r\n (error ? JSON.stringify(error) : '')\r\n );\r\n resolve({ uniqueName: true });\r\n },\r\n });\r\n }\r\n });\r\n };\r\n }\r\n\r\n private getUniqueEmailValidator(service: AuthJwtAccountService) {\r\n return (\r\n control: AbstractControl\r\n ):\r\n | Promise<ValidationErrors | null>\r\n | Observable<ValidationErrors | null> => {\r\n return new Promise((resolve, reject) => {\r\n // avoid checking if empty\r\n if (!control.value) {\r\n resolve(null);\r\n } else {\r\n service.isEmailRegistered(control.value).subscribe({\r\n next: (data: ExistResult) => {\r\n if (!data.isExisting) {\r\n resolve(null);\r\n } else {\r\n resolve({ uniqueEmail: true });\r\n }\r\n },\r\n error: (error) => {\r\n console.error(\r\n 'Unique email validator error' +\r\n (error ? JSON.stringify(error) : '')\r\n );\r\n resolve({ uniqueEmail: true });\r\n },\r\n });\r\n }\r\n });\r\n };\r\n }\r\n\r\n public onSubmit(): void {\r\n if (\r\n !this.form.valid ||\r\n this.busy ||\r\n this.name.pending ||\r\n this.email.pending\r\n ) {\r\n return;\r\n }\r\n\r\n const model: RegistrationModel = {\r\n email: this.email.value,\r\n name: this.name.value,\r\n firstName: this.firstName.value,\r\n lastName: this.lastName.value,\r\n password: this.password.value,\r\n };\r\n\r\n this.busy = true;\r\n this._accountService\r\n .register(model, this.autoConfirm)\r\n .pipe(take(1))\r\n .subscribe({\r\n next: () => {\r\n this.busy = false;\r\n this._snackbar.open(\r\n $localize`:auth-jwt-admin:Registration succeeded`,\r\n 'OK'\r\n );\r\n this._userRepository.reset();\r\n this.registered.emit();\r\n },\r\n error: (error) => {\r\n this.busy = false;\r\n console.error(\r\n 'Registration error' + (error ? JSON.stringify(error) : '')\r\n );\r\n this._snackbar.open(\r\n $localize`:auth-jwt-admin:Registration error`,\r\n 'OK'\r\n );\r\n },\r\n });\r\n }\r\n}\r\n","<div>\n <form role=\"form\" [formGroup]=\"form\" (submit)=\"onSubmit()\">\n <fieldset>\n <legend i18n=\"auth-jwt-admin\">registration</legend>\n <!-- email -->\n <div class=\"form-row\">\n <mat-form-field>\n <mat-label i18n>email</mat-label>\n <input\n matInput\n type=\"email\"\n id=\"email\"\n maxlength=\"256\"\n required\n autofocus\n spellcheck=\"false\"\n [formControl]=\"email\"\n />\n @if ( $any(email).errors?.required && (email.dirty || email.touched) )\n {\n <mat-error i18n=\"auth-jwt-admin\">email required</mat-error>\n } @if ($any(email).errors?.email && (email.dirty || email.touched)) {\n <mat-error i18n=\"auth-jwt-admin\">invalid email</mat-error>\n } @if ( $any(email).errors?.uniqueEmail && (email.dirty ||\n email.touched) ) {\n <mat-error i18n=\"auth-jwt-admin\">email already registered</mat-error>\n }\n </mat-form-field>\n @if (email.pending) {\n <mat-icon>hourglass</mat-icon>\n }\n </div>\n\n <!-- name -->\n <div class=\"form-row\">\n <mat-form-field>\n <mat-label i18n=\"auth-jwt-admin\">username</mat-label>\n <input\n matInput\n type=\"text\"\n id=\"name\"\n maxlength=\"50\"\n required\n pattern=\"^[a-zA-Z][a-zA-Z0-9]{2,49}$\"\n spellcheck=\"false\"\n [formControl]=\"name\"\n />\n @if ($any(name).errors?.required && (name.dirty || name.touched)) {\n <mat-error i18n=\"auth-jwt-admin\">username required</mat-error>\n } @if ($any(name).errors?.pattern && (name.dirty || name.touched)) {\n <mat-error i18n=\"auth-jwt-admin\">invalid username</mat-error>\n } @if ( $any(name).errors?.uniqueName && (name.dirty || name.touched)\n ) {\n <mat-error i18n=\"auth-jwt-admin\"\n >username already registered</mat-error\n >\n }\n </mat-form-field>\n @if (name.pending) {\n <mat-icon>hourglass</mat-icon>\n }\n </div>\n\n <!-- first name -->\n <div>\n <mat-form-field>\n <mat-label i18n=\"auth-jwt-admin\">first name</mat-label>\n <input\n matInput\n type=\"text\"\n id=\"firstName\"\n maxlength=\"50\"\n required\n spellcheck=\"false\"\n [formControl]=\"firstName\"\n />\n @if ( firstName.hasError('required') && (firstName.dirty ||\n firstName.touched) ) {\n <mat-error i18n=\"auth-jwt-admin\" class=\"text-danger small\">\n first name required\n </mat-error>\n }\n </mat-form-field>\n </div>\n\n <!-- last name -->\n <div>\n <mat-form-field>\n <mat-label i18n=\"auth-jwt-admin\">last name</mat-label>\n <input\n matInput\n type=\"text\"\n id=\"lastName\"\n maxlength=\"50\"\n required\n spellcheck=\"false\"\n [formControl]=\"lastName\"\n />\n @if ( lastName.hasError('required') && (lastName.dirty ||\n lastName.touched) ) {\n <mat-error i18n=\"auth-jwt-admin\" class=\"text-danger small\">\n last name required\n </mat-error>\n }\n </mat-form-field>\n </div>\n\n <!-- <div [formGroup]=\"passwords\"> -->\n <!-- password -->\n <div>\n <mat-form-field>\n <mat-label i18n=\"auth-jwt-admin\">password</mat-label>\n <input\n matInput\n [type]=\"hide ? 'password' : 'text'\"\n name=\"password\"\n autocomplete=\"new-password\"\n maxlength=\"50\"\n required\n spellcheck=\"false\"\n [formControl]=\"password\"\n />\n <button\n type=\"button\"\n mat-icon-button\n matSuffix\n (click)=\"hide = !hide\"\n i18n-aria-label=\"auth-jwt-login\"\n aria-label=\"Hide password\"\n [attr.aria-pressed]=\"hide\"\n >\n <mat-icon>{{ hide ? \"visibility_off\" : \"visibility\" }}</mat-icon>\n </button>\n <auth-jwt-password-strength-bar [passwordToCheck]=\"password.value\">\n </auth-jwt-password-strength-bar>\n @if ( $any(password).errors?.required && (password.dirty ||\n password.touched) ) {\n <mat-error i18n=\"auth-jwt-admin\">password required</mat-error>\n } @if ( $any(password).errors?.passwordtooshort && (password.dirty ||\n password.touched) ) {\n <mat-error i18n=\"auth-jwt-admin\">at least 8 characters</mat-error>\n } @if ( $any(password).errors?.noupperinpassword && (password.dirty ||\n password.touched) ) {\n <mat-error i18n=\"auth-jwt-admin\"\n >at least 1 uppercase letter</mat-error\n >\n } @if ( $any(password).errors?.nolowerinpassword && (password.dirty ||\n password.touched) ) {\n <mat-error i18n=\"auth-jwt-admin\"\n >at least 1 lowercase letter</mat-error\n >\n } @if ( $any(password).errors?.nosymbolinpassword && (password.dirty\n || password.touched) ) {\n <mat-error i18n=\"auth-jwt-admin\"\n >at least 1 punctuation/symbol</mat-error\n >\n }\n </mat-form-field>\n </div>\n\n <!-- confirm password -->\n <div>\n <mat-form-field>\n <mat-label i18n=\"auth-jwt-admin\">confirm password</mat-label>\n <input\n matInput\n [type]=\"hide ? 'password' : 'text'\"\n name=\"confirmPassword\"\n maxlength=\"50\"\n required\n spellcheck=\"false\"\n [formControl]=\"confirmPassword\"\n />\n </mat-form-field>\n </div>\n @if (form.errors?.areequal && confirmPassword.touched) {\n <div i18n=\"auth-jwt-admin\" style=\"color: red\">\n password differs from confirmation password\n </div>\n }\n\n <button\n i18n=\"auth-jwt-admin\"\n mat-flat-button\n type=\"submit\"\n color=\"primary\"\n class=\"mat-primary\"\n [disabled]=\"\n form.invalid || form.pristine || busy || name.pending || email.pending\n \"\n >\n register\n </button>\n @if (busy) {\n <mat-progress-spinner diameter=\"20\"></mat-progress-spinner>\n }\n </fieldset>\n </form>\n\n <details>\n <summary i18n=\"auth-jwt-admin\">Hints</summary>\n <div class=\"info\">\n <p i18n=\"auth-jwt-admin\">\n To register a new user, you must provide his email address, choose a\n password, and choose a username, which must be unique (you will be\n notified if another user has already taken that name). The username must\n include only letters/digits, start with a letter, and be no shorter than\n 3 characters, nor longer than 50.\n </p>\n <p i18n=\"auth-jwt-admin\">\n To promote a decent security level, the password must include at least 8\n characters, uppercase and lowercase letters, digits, and punctuation\n (like dashes, stops, parentheses, etc.).\n </p>\n <p i18n=\"auth-jwt-admin\">\n Once registered, if messaging is enabled on the server side the user\n will receive an email message to the email address you specified; he\n will have to click on the provided link to complete the registration\n process. Otherwise, you should edit the newly created user and confirm\n the email registration.\n </p>\n </div>\n </details>\n</div>\n","import { Component, Input, Output, OnInit, EventEmitter } from '@angular/core';\r\nimport { FormBuilder, FormControl, FormGroup } from '@angular/forms';\r\nimport { Observable } from 'rxjs';\r\n\r\nimport { UserFilter } from '../../services/auth-jwt-account.service';\r\n\r\n@Component({\r\n selector: 'auth-jwt-user-filter',\r\n templateUrl: './user-filter.component.html',\r\n styleUrls: ['./user-filter.component.css'],\r\n})\r\nexport class UserFilterComponent {\r\n private _filter?: UserFilter;\r\n\r\n @Input()\r\n public get filter(): UserFilter | null | undefined {\r\n return this._filter;\r\n }\r\n public set filter(value: UserFilter | null | undefined) {\r\n if (this._filter === value) {\r\n return;\r\n }\r\n this._filter = value || undefined;\r\n this.updateForm(this._filter);\r\n }\r\n\r\n @Input()\r\n public disabled: boolean | undefined;\r\n\r\n /**\r\n * Event emitted when the filter changes.\r\n */\r\n @Output()\r\n public filterChange: EventEmitter<UserFilter>;\r\n\r\n public name: FormControl<string | null>;\r\n public form: FormGroup;\r\n\r\n constructor(formBuilder: FormBuilder) {\r\n // form\r\n this.name = formBuilder.control<string | null>(null);\r\n this.form = formBuilder.group({\r\n name: this.name,\r\n });\r\n // event\r\n this.filterChange = new EventEmitter<UserFilter>();\r\n }\r\n\r\n private updateForm(filter?: UserFilter): void {\r\n if (!filter) {\r\n this.form.reset();\r\n return;\r\n }\r\n this.name.setValue(filter.name || null);\r\n this.form.markAsPristine();\r\n }\r\n\r\n private getFilter(): UserFilter {\r\n return {\r\n name: this.name.value?.trim(),\r\n };\r\n }\r\n\r\n public reset(): void {\r\n this.form.reset();\r\n this._filter = {};\r\n this.filterChange.emit(this._filter);\r\n }\r\n\r\n public apply(): void {\r\n this._filter = this.getFilter();\r\n this.filterChange.emit(this._filter);\r\n }\r\n}\r\n","<form [formGroup]=\"form\" (submit)=\"apply()\" ng-disabled=\"disabled\">\r\n <div class=\"form-row\">\r\n <mat-form-field>\r\n <mat-label i18n=\"auth-jwt-admin\">name or ID</mat-label>\r\n <input matInput [formControl]=\"name\" />\r\n <button\r\n mat-icon-button\r\n matSuffix\r\n type=\"button\"\r\n (click)=\"reset()\"\r\n color=\"warn\"\r\n class=\"mat-warn\"\r\n i18n-matTooltip=\"auth-jwt-admin\"\r\n matTooltip=\"Reset filters\"\r\n [disabled]=\"disabled\"\r\n >\r\n <mat-icon>clear</mat-icon>\r\n </button>\r\n </mat-form-field>\r\n\r\n <button\r\n id=\"apply\"\r\n type=\"submit\"\r\n mat-icon-button\r\n color=\"primary\"\r\n class=\"mat-primary\"\r\n [disabled]=\"disabled\"\r\n i18n-matTooltip=\"auth-jwt-admin\"\r\n matTooltip=\"Apply filters\"\r\n >\r\n <mat-icon>check_circle</mat-icon>\r\n </button>\r\n </div>\r\n</form>\r\n","import { Component, OnInit, Input, Output, EventEmitter } from '@angular/core';\r\nimport {\r\n UntypedFormGroup,\r\n UntypedFormControl,\r\n UntypedFormBuilder,\r\n Validators,\r\n} from '@angular/forms';\r\nimport { AuthJwtService, User } from '@myrmidon/auth-jwt-login';\r\n\r\n@Component({\r\n selector: 'auth-jwt-user-editor',\r\n templateUrl: './user-editor.component.html',\r\n styleUrls: ['./user-editor.component.css'],\r\n})\r\nexport class UserEditorComponent implements OnInit {\r\n private _user: User | undefined;\r\n\r\n public email: UntypedFormControl;\r\n public emailConfirmed: UntypedFormControl;\r\n public lockoutEnabled: UntypedFormControl;\r\n public firstName: UntypedFormControl;\r\n public lastName: UntypedFormControl;\r\n public roles: UntypedFormControl;\r\n public form: UntypedFormGroup;\r\n\r\n public unlocked: boolean | undefined;\r\n\r\n @Input() public set user(value: User | undefined) {\r\n this._user = value;\r\n this.updateForm(value);\r\n }\r\n public get user(): User | undefined {\r\n return this._user;\r\n }\r\n\r\n @Output() userChange: EventEmitter<User>;\r\n @Output() editorClose: EventEmitter<any>;\r\n\r\n constructor(formBuilder: UntypedFormBuilder, private _authService: AuthJwtService) {\r\n // events\r\n this.userChange = new EventEmitter<User>();\r\n this.editorClose = new EventEmitter<any>();\r\n // form\r\n this.email = formBuilder.control(null, [\r\n Validators.required,\r\n Validators.email,\r\n ]);\r\n this.emailConfirmed = formBuilder.control(false);\r\n this.lockoutEnabled = formBuilder.control(false);\r\n this.firstName = formBuilder.control(null, [\r\n Validators.required,\r\n Validators.maxLength(50),\r\n ]);\r\n this.lastName = formBuilder.control(null, [\r\n Validators.required,\r\n Validators.maxLength(50),\r\n ]);\r\n this.roles = formBuilder.control(null, Validators.maxLength(200));\r\n\r\n this.form = formBuilder.group({\r\n email: this.email,\r\n emailConfirmed: this.emailConfirmed,\r\n lockoutEnabled: this.lockoutEnabled,\r\n firstName: this.firstName,\r\n lastName: this.lastName,\r\n roles: this.roles,\r\n });\r\n }\r\n\r\n ngOnInit(): void {}\r\n\r\n private updateForm(user: User | undefined): void {\r\n if (!user) {\r\n this.form.reset();\r\n } else {\r\n this.email.setValue(user.email);\r\n this.emailConfirmed.setValue(user.emailConfirmed);\r\n this.lockoutEnabled.setValue(user.lockoutEnabled);\r\n this.firstName.setValue(user.firstName);\r\n this.lastName.setValue(user.lastName);\r\n if (user.roles?.length > 0) {\r\n this.roles.setValue(user.roles.join(' '));\r\n } else {\r\n this.roles.setValue(null);\r\n }\r\n }\r\n }\r\n\r\n private getUserFromForm(): User {\r\n return {\r\n userName: this._user?.userName || '',\r\n email: this.email.value,\r\n emailConfirmed: this.emailConfirmed.value,\r\n lockoutEnabled: this.lockoutEnabled.value,\r\n firstName: this.firstName.value,\r\n lastName: this.lastName.value,\r\n roles: this.roles.value\r\n ? this.roles.value.split(' ').filter((s: string) => s)\r\n : [],\r\n };\r\n }\r\n\r\n public endLockout(): void {\r\n if (this.unlocked) {\r\n return;\r\n }\r\n this._user!.lockoutEnd = this._authService.getUTCDate();\r\n this.unlocked = true;\r\n }\r\n\r\n public close(): void {\r\n this.editorClose.emit();\r\n }\r\n\r\n public save(): void {\r\n if (this.form.invalid) {\r\n return;\r\n }\r\n this.userChange.emit(this.getUserFromForm());\r\n }\r\n}\r\n","<form [formGroup]=\"form\" (submit)=\"save()\">\n <div class=\"form-row\">\n <!-- email -->\n <mat-form-field>\n <mat-label i18n=\"auth-jwt-admin\">email</mat-label>\n <input type=\"text\" matInput [formControl]=\"email\" />\n @if (email.hasError('required') && (email.dirty || email.touched)) {\n <mat-error i18n=\"auth-jwt-admin\"> email address required </mat-error>\n } @if (email.hasError('pattern') && (email.dirty || email.touched)) {\n <mat-error i18n=\"auth-jwt-admin\"> invalid email address </mat-error>\n }\n </mat-form-field>\n\n <!-- emailConfirmed -->\n <mat-checkbox [formControl]=\"emailConfirmed\" i18n=\"auth-jwt-admin\"\n >email address confirmed</mat-checkbox\n >\n </div>\n\n <!-- lockoutEnabled -->\n <div class=\"form-row\">\n <mat-checkbox [formControl]=\"lockoutEnabled\" i18n=\"auth-jwt-admin\"\n >lockout enabled</mat-checkbox\n >\n <button\n type=\"button\"\n mat-icon-button\n color=\"primary\"\n class=\"mat-primary\"\n (click)=\"endLockout()\"\n [disabled]=\"unlocked\"\n i18n-matTooltip=\"auth-jwt-admin\"\n matTooltip=\"Unlock this user if locked\"\n >\n <mat-icon>lock_open</mat-icon>\n </button>\n </div>\n\n <div class=\"form-row\">\n <!-- firstName -->\n <mat-form-field>\n <mat-label i18n=\"auth-jwt-admin\">first name</mat-label>\n <input type=\"text\" matInput [formControl]=\"firstName\" />\n @if ( firstName.hasError('required') && (firstName.dirty ||\n firstName.touched) ) {\n <mat-error i18n=\"auth-jwt-admin\"> first name required </mat-error>\n } @if ( firstName.hasError('maxlength') && (firstName.dirty ||\n firstName.touched) ) {\n <mat-error i18n=\"auth-jwt-admin\"> first name too long </mat-error>\n }\n </mat-form-field>\n\n <!-- lastName -->\n <mat-form-field>\n <mat-label i18n=\"auth-jwt-admin\">last name</mat-label>\n <input type=\"text\" matInput [formControl]=\"lastName\" />\n @if ( lastName.hasError('required') && (lastName.dirty ||\n lastName.touched) ) {\n <mat-error i18n=\"auth-jwt-admin\"> last name required </mat-error>\n } @if ( lastName.hasError('maxlength') && (lastName.dirty ||\n lastName.touched) ) {\n <mat-error i18n=\"auth-jwt-admin\"> last name too long </mat-error>\n }\n </mat-form-field>\n </div>\n\n <!-- roles -->\n <div>\n <mat-form-field style=\"width: 16em\">\n <mat-label i18n=\"auth-jwt-admin\">roles</mat-label>\n <input type=\"text\" matInput [formControl]=\"roles\" />\n @if (roles.hasError('maxlength') && (roles.dirty || roles.touched)) {\n <mat-error i18n=\"auth-jwt-admin\"> too long </mat-error>\n }\n <mat-hint i18n>roles (separated by space)</mat-hint>\n </mat-form-field>\n </div>\n\n <!-- buttons -->\n <br />\n <div>\n <button\n type=\"button\"\n mat-icon-button\n color=\"warn\"\n class=\"mat-warn\"\n i18n-matTooltip=\"auth-jwt-admin\"\n matTooltip=\"Close\"\n (click)=\"close()\"\n >\n <mat-icon>cancel</mat-icon>\n </button>\n <button\n type=\"submit\"\n mat-icon-button\n color=\"primary\"\n class=\"mat-primary\"\n [disabled]=\"form.invalid\"\n i18n-matTooltip=\"auth-jwt-admin\"\n matTooltip=\"Save user\"\n >\n <mat-icon>check_circle</mat-icon>\n </button>\n </div>\n</form>\n","import { Component } from '@angular/core';\r\nimport { PageEvent } from '@angular/material/paginator';\r\nimport { Observable } from 'rxjs';\r\nimport '@angular/localize/init';\r\n\r\nimport { GravatarService, User } from '@myrmidon/auth-jwt-login';\r\nimport { DataPage } from '@myrmidon/ng-tools';\r\nimport { DialogService } from '@myrmidon/ng-mat-tools';\r\n\r\nimport { UserListRepository } from '../state/user-list.repository';\r\nimport { UserFilter } from '../../services/auth-jwt-account.service';\r\n\r\n@Component({\r\n selector: 'auth-jwt-user-list',\r\n templateUrl: './user-list.component.html',\r\n styleUrls: ['./user-list.component.css'],\r\n})\r\nexport class UserListComponent {\r\n public active$: Observable<User | undefined>;\r\n public loading$: Observable<boolean>;\r\n public filter$: Observable<UserFilter>;\r\n public page$: Observable<DataPage<User>>;\r\n\r\n constructor(\r\n private _repository: UserListRepository,\r\n private _dialogService: DialogService,\r\n private _gravatarService: GravatarService\r\n ) {\r\n this.filter$ = _repository.filter$;\r\n this.page$ = _repository.page$;\r\n this.active$ = _repository.activeUser$;\r\n this.loading$ = _repository.loading$;\r\n }\r\n\r\n public reset(): void {\r\n this._repository.reset();\r\n }\r\n\r\n public onFilterChange(filter: UserFilter): void {\r\n this._repository.setFilter(filter);\r\n }\r\n\r\n public onPageChange(event: PageEvent): void {\r\n this._repository.setPage(event.pageIndex + 1, event.pageSize);\r\n }\r\n\r\n public deleteUser(user: User): void {\r\n this._dialogService\r\n .confirm(\r\n $localize`:auth-jwt-admin:Confirm`,\r\n $localize`:auth-jwt-admin:Delete user ` + user.userName + '?'\r\n )\r\n .subscribe((yes) => {\r\n if (yes) {\r\n this._repository.deleteUser(user.userName);\r\n }\r\n });\r\n }\r\n\r\n public setActiveUser(user: User | null): void {\r\n this._repository.setActiveUser(user);\r\n }\r\n\r\n public resetActiveUser(): void {\r\n this._repository.setActiveUser(null);\r\n }\r\n\r\n public saveActiveUser(user: User): void {\r\n this._repository.updateActiveUser(user);\r\n this._repository.setActiveUser(null);\r\n }\r\n\r\n public onUserEditorClose(): void {\r\n this._repository.setActiveUser(null);\r\n }\r\n\r\n public getGravatarUrl(email: string, size = 80): string | null {\r\n return this._gravatarService.buildGravatarUrl(email, size);\r\n }\r\n}\r\n","<div id=\"container\">\n <div>\n <!-- filters -->\n <div id=\"filters\">\n <auth-jwt-user-filter\n [filter]=\"filter$ | async\"\n (filterChange)=\"onFilterChange($event)\"\n ></auth-jwt-user-filter>\n </div>\n\n <!-- list -->\n @if (page$ | async; as page) {\n <div id=\"list\">\n @if (loading$ | async) {\n <div>\n <mat-progress-bar mode=\"indeterminate\"></mat-progress-bar>\n </div>\n }\n <table>\n <thead>\n <td></td>\n <td></td>\n <th i18n=\"auth-jwt-admin\">name</th>\n <th i18n=\"auth-jwt-admin\" class=\"noif-lt-md\">first</th>\n <th i18n=\"auth-jwt-admin\" class=\"noif-lt-md\">last</th>\n <th i18n=\"auth-jwt-admin\" class=\"noif-lt-md\">email</th>\n <th i18n=\"auth-jwt-admin\">roles</th>\n <th i18n=\"auth-jwt-admin\" class=\"noif-lt-md\">lock end</th>\n </thead>\n <tbody>\n @for (user of page.items; track user) {\n <tr>\n <td class=\"fit-width\">\n <button\n mat-icon-button\n type=\"button\"\n i18n-matTooltip=\"auth-jwt-admin\"\n matTooltip=\"Edit this user\"\n color=\"primary\"\n class=\"mat-primary\"\n (click)=\"setActiveUser(user)\"\n >\n <mat-icon>mode_edit</mat-icon>\n </button>\n <button\n mat-icon-button\n type=\"button\"\n i18n-matTooltip=\"auth-jwt-admin\"\n matTooltip=\"Delete this user\"\n color=\"warn\"\n class=\"mat-warn\"\n (click)=\"deleteUser(user)\"\n >\n <mat-icon>remove_circle</mat-icon>\n </button>\n </td>\n <td class=\"fit-width\">\n <img\n alt=\"avatar\"\n [src]=\"getGravatarUrl(user.email, 32)\"\n [alt]=\"user.userName\"\n />\n </td>\n <td>{{ user.userName }}</td>\n <td class=\"noif-lt-md\">{{ user.firstName }}</td>\n <td class=\"noif-lt-md\">{{ user.lastName }}</td>\n <td class=\"noif-lt-md\">\n <a [href]=\"'mailto:' + user.email\">{{ user.email }}</a>\n </td>\n <td>{{ user.roles.join(\" \") }}</td>\n <td class=\"noif-lt-md\">{{ user.lockoutEnd }}</td>\n </tr>\n }\n </tbody>\n </table>\n <!-- paginator -->\n <div class=\"form-row\">\n <button\n type=\"button\"\n mat-icon-button\n color=\"warn\"\n class=\"mat-warn\"\n i18n-matmatTooltip=\"auth-jwt-admin\"\n matTooltip=\"Refresh list\"\n (click)=\"reset()\"\n >\n <mat-icon>autorenew</mat-icon>\n </button>\n <mat-paginator\n [length]=\"page.total\"\n [pageIndex]=\"page.pageNumber - 1\"\n [pageSize]=\"page.pageSize\"\n [pageSizeOptions]=\"[5, 10, 20, 50, 100]\"\n (page)=\"onPageChange($event)\"\n [showFirstLastButtons]=\"true\"\n ></mat-paginator>\n </div>\n </div>\n }\n </div>\n\n <!-- editor -->\n <mat-expansion-panel\n id=\"editor\"\n [expanded]=\"active$ | async\"\n [disabled]=\"!(active$ | async)\"\n >\n @if (active$ | async; as active) {\n <div>\n <fieldset>\n <legend>{{ active.userName }}</legend>\n <auth-jwt-user-editor\n [user]=\"active\"\n (userChange)=\"saveActiveUser($event)\"\n (editorClose)=\"resetActiveUser()\"\n ></auth-jwt-user-editor>\n </fieldset>\n </div>\n }\n </mat-expansion-panel>\n</div>\n","import { CommonModule } from '@angular/common';\nimport { NgModule } from '@angular/core';\nimport { RouterModule } from '@angular/router';\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\n\nimport { MatCardModule } from '@angular/material/card';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatCheckboxModule } from '@angular/material/checkbox';\nimport { MatExpansionModule } from '@angular/material/expansion';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { MatPaginatorModule } from '@angular/material/paginator';\nimport { MatProgressBarModule } from '@angular/material/progress-bar';\nimport { MatProgressSpinnerModule } from '@angular/material/progress-spinner';\nimport { MatSnackBarModule } from '@angular/material/snack-bar';\nimport { MatDialogModule } from '@angular/material/dialog';\n\nimport { AuthJwtLoginModule } from '@myrmidon/auth-jwt-login';\nimport { NgToolsModule } from '@myrmidon/ng-tools';\n\nimport { AuthJwtRegistrationComponent } from './components/auth-jwt-registration/auth-jwt-registration.component';\nimport { PasswordStrengthBarComponent } from './components/password-strength-bar/password-strength-bar.component';\nimport { UserFilterComponent } from './components/user-filter/user-filter.component';\nimport { UserListComponent } from './components/user-list/user-list.component';\nimport { UserEditorComponent } from './components/user-editor/user-editor.component';\n\n@NgModule({\n declarations: [\n AuthJwtRegistrationComponent,\n PasswordStrengthBarComponent,\n UserFilterComponent,\n UserListComponent,\n UserEditorComponent,\n ],\n exports: [\n AuthJwtRegistrationComponent,\n PasswordStrengthBarComponent,\n UserFilterComponent,\n UserListComponent,\n ],\n imports: [\n CommonModule,\n FormsModule,\n RouterModule,\n ReactiveFormsModule,\n // material\n MatButtonModule,\n MatCardModule,\n MatCheckboxModule,\n MatDialogModule,\n MatExpansionModule,\n MatIconModule,\n MatInputModule,\n MatPaginatorModule,\n MatProgressBarModule,\n MatProgressSpinnerModule,\n MatSnackBarModule,\n MatTooltipModule,\n AuthJwtLoginModule,\n NgToolsModule,\n ],\n})\nexport class AuthJwtAdminModule {}\n","/*\r\n * Public API Surface of auth-jwt-admin\r\n */\r\n\r\nexport * from './lib/components/auth-jwt-registration/auth-jwt-registration.component';\r\nexport * from './lib/components/password-strength-bar/password-strength-bar.component';\r\nexport * from './lib/components/user-filter/user-filter.component';\r\nexport * from './lib/components/user-list/user-list.component';\r\nexport * from './lib/components/state/user-list.repository';\r\nexport * from './lib/services/auth-jwt-account.service';\r\nexport * from './lib/validators/password.validators';\r\nexport * from './lib/auth-jwt-admin.module';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1.AuthJwtAccountService","i1","i2","i3.AuthJwtAccountService","i4.UserListRepository","i10.PasswordStrengthBarComponent","i3","i4","i5","i6","i7","i8","i1.UserListRepository","i9","i10.UserFilterComponent","i11.UserEditorComponent"],"mappings":"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"}
1
+ {"version":3,"file":"myrmidon-auth-jwt-admin.mjs","sources":["../../../../projects/myrmidon/auth-jwt-admin/src/lib/validators/password.validators.ts","../../../../projects/myrmidon/auth-jwt-admin/src/lib/services/auth-jwt-account.service.ts","../../../../projects/myrmidon/auth-jwt-admin/src/lib/components/state/user-list.repository.ts","../../../../projects/myrmidon/auth-jwt-admin/src/lib/components/password-strength-bar/password-strength-bar.component.ts","../../../../projects/myrmidon/auth-jwt-admin/src/lib/components/password-strength-bar/password-strength-bar.component.html","../../../../projects/myrmidon/auth-jwt-admin/src/lib/components/auth-jwt-registration/auth-jwt-registration.component.ts","../../../../projects/myrmidon/auth-jwt-admin/src/lib/components/auth-jwt-registration/auth-jwt-registration.component.html","../../../../projects/myrmidon/auth-jwt-admin/src/lib/components/user-filter/user-filter.component.ts","../../../../projects/myrmidon/auth-jwt-admin/src/lib/components/user-filter/user-filter.component.html","../../../../projects/myrmidon/auth-jwt-admin/src/lib/components/user-editor/user-editor.component.ts","../../../../projects/myrmidon/auth-jwt-admin/src/lib/components/user-editor/user-editor.component.html","../../../../projects/myrmidon/auth-jwt-admin/src/lib/components/user-list/user-list.component.ts","../../../../projects/myrmidon/auth-jwt-admin/src/lib/components/user-list/user-list.component.html","../../../../projects/myrmidon/auth-jwt-admin/src/lib/auth-jwt-admin.module.ts","../../../../projects/myrmidon/auth-jwt-admin/src/public-api.ts","../../../../projects/myrmidon/auth-jwt-admin/src/myrmidon-auth-jwt-admin.ts"],"sourcesContent":["import {\r\n AbstractControl,\r\n FormGroup,\r\n UntypedFormGroup,\r\n ValidationErrors,\r\n ValidatorFn,\r\n} from '@angular/forms';\r\n\r\nexport class PasswordValidators {\r\n /** \"Standard\" password validator for my API services. */\r\n public static standard(): ValidatorFn {\r\n return (control: AbstractControl): ValidationErrors | null => {\r\n if (!control.value) {\r\n return null;\r\n }\r\n\r\n if (control.value.length < 8) {\r\n return {\r\n passwordtooshort: true,\r\n };\r\n }\r\n\r\n if (!/.*[A-Z].*/.test(control.value)) {\r\n return {\r\n noupperinpassword: true,\r\n };\r\n }\r\n\r\n if (!/.*[a-z].*/.test(control.value)) {\r\n return {\r\n nolowerinpassword: true,\r\n };\r\n }\r\n\r\n if (!/.*[A-Z].*/.test(control.value)) {\r\n return {\r\n noupperinpassword: true,\r\n };\r\n }\r\n\r\n if (!/.*[-`~!@#$%^&*()_+=\\[\\]{};:'\",.<>/?|\\\\].*/.test(control.value)) {\r\n return {\r\n nosymbolinpassword: true,\r\n };\r\n }\r\n\r\n return null;\r\n };\r\n }\r\n\r\n public static areEqual(\r\n controlName: string,\r\n otherControlName: string\r\n ): ValidatorFn {\r\n return (control: AbstractControl): ValidationErrors | null => {\r\n const g = control as FormGroup | UntypedFormGroup;\r\n const a = g.controls[controlName];\r\n const b = g.controls[otherControlName];\r\n return a.value !== b.value\r\n ? {\r\n areequal: true,\r\n }\r\n : null;\r\n };\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { HttpClient, HttpParams } from '@angular/common/http';\r\nimport { Observable } from 'rxjs';\r\nimport { retry, catchError, map } from 'rxjs/operators';\r\n\r\nimport { DataPage, EnvService, ErrorService } from '@myrmidon/ng-tools';\r\nimport { User } from '@myrmidon/auth-jwt-login';\r\n\r\n/**\r\n * User registration model. You can expand this interface to add more data.\r\n */\r\nexport interface RegistrationModel {\r\n email: string;\r\n name: string;\r\n firstName?: string;\r\n lastName?: string;\r\n password: string;\r\n}\r\n\r\n/**\r\n * Result of an existing resource check.\r\n */\r\nexport interface ExistResult {\r\n entry: string;\r\n isExisting: boolean;\r\n}\r\n\r\n/**\r\n * Password change data.\r\n */\r\nexport interface PasswordChange {\r\n email: string;\r\n oldPassword: string;\r\n newPassword: string;\r\n confirmPassword: string;\r\n}\r\n\r\n/**\r\n * User filter parameters.\r\n */\r\nexport interface UserFilter {\r\n name?: string;\r\n}\r\n\r\n/**\r\n * The type of user data returned by the server.\r\n */\r\ninterface UserWithRoles<T> {\r\n user: T;\r\n roles?: string[];\r\n}\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class AuthJwtAccountService {\r\n constructor(\r\n private _http: HttpClient,\r\n private _error: ErrorService,\r\n private _env: EnvService\r\n ) {}\r\n\r\n /**\r\n * Checks if the specified email address is registered on the server.\r\n * @param email email address to test.\r\n * @returns result.\r\n */\r\n public isEmailRegistered(email: string): Observable<ExistResult> {\r\n return this._http.get<ExistResult>(\r\n this._env.get('apiUrl') +\r\n 'accounts/emailexists/' +\r\n encodeURIComponent(email)\r\n );\r\n }\r\n\r\n /**\r\n * Checks if the specified user's given name is registered on the server.\r\n * This name is a nickname chosen by users during registration, and is the key\r\n * used for referencing users when talking to the server.\r\n * @param name name to test.\r\n * @returns result.\r\n */\r\n public isNameRegistered(name: string): Observable<ExistResult> {\r\n return this._http.get<ExistResult>(\r\n this._env.get('apiUrl') +\r\n 'accounts/nameexists/' +\r\n encodeURIComponent(name)\r\n );\r\n }\r\n\r\n /**\r\n * Register the user with the specified registration data.\r\n * @param registration The registration data.\r\n * @param confirmed True to automatically confirm the user's email address\r\n * without sending the confirmation email message.\r\n */\r\n public register(\r\n registration: RegistrationModel,\r\n confirmed = false\r\n ): Observable<any> {\r\n return this._http.post(\r\n this._env.get('apiUrl') +\r\n 'accounts/register' +\r\n (confirmed ? '?confirmed=true' : ''),\r\n registration\r\n );\r\n }\r\n\r\n /**\r\n * Resend the confirmation email to the specified address.\r\n * @param email address.\r\n */\r\n public resendConfirmEmail(email: string): Observable<any> {\r\n return this._http.get(\r\n this._env.get('apiUrl') +\r\n 'accounts/resendconfirm/' +\r\n encodeURIComponent(email)\r\n // options\r\n );\r\n }\r\n\r\n /**\r\n * Request a password reset for the specified email address.\r\n * @param email Email address.\r\n */\r\n public requestPasswordReset(email: string): Observable<any> {\r\n return this._http.post(\r\n this._env.get('apiUrl') + 'accounts/resetpassword/request',\r\n { email }\r\n );\r\n }\r\n\r\n private getUserFromWrapper(response: UserWithRoles<User> | User): User {\r\n return (response as UserWithRoles<User>).user\r\n ? {\r\n ...((response as UserWithRoles<User>).user as User),\r\n roles: response.roles || [],\r\n }\r\n : (response as User);\r\n }\r\n\r\n public getAllUsers(): Observable<DataPage<User>> {\r\n return this._http\r\n .get<DataPage<UserWithRoles<User> | User>>(\r\n this._env.get('apiUrl') + 'users',\r\n {\r\n params: new HttpParams().set('pageNumber', '1'),\r\n }\r\n )\r\n .pipe(\r\n retry(3),\r\n map((dataPage: DataPage<UserWithRoles<User> | User>) => {\r\n return {\r\n ...dataPage,\r\n items: dataPage.items.map(this.getUserFromWrapper),\r\n };\r\n }),\r\n catchError(this._error.handleError)\r\n );\r\n }\r\n\r\n public getUsers(\r\n filter: UserFilter,\r\n pageNumber = 1,\r\n pageSize = 20\r\n ): Observable<DataPage<User>> {\r\n let httpParams = new HttpParams();\r\n httpParams = httpParams.set('pageNumber', pageNumber.toString());\r\n httpParams = httpParams.set('pageSize', pageSize.toString());\r\n if (filter.name) {\r\n httpParams = httpParams.set('name', filter.name);\r\n }\r\n\r\n return this._http\r\n .get<DataPage<UserWithRoles<User>>>(this._env.get('apiUrl') + 'users', {\r\n params: httpParams,\r\n })\r\n .pipe(\r\n retry(3),\r\n map((dataPage: DataPage<UserWithRoles<User>>) => {\r\n return {\r\n ...dataPage,\r\n items: dataPage.items.map(this.getUserFromWrapper),\r\n };\r\n }),\r\n catchError(this._error.handleError)\r\n );\r\n }\r\n /**\r\n * Get the top N users matching the specified name filter.\r\n * @param nameFilter The user name filter.\r\n * @param limit The maximum number of users to get.\r\n */\r\n public getTopUsers(nameFilter: string, limit = 10): Observable<User[]> {\r\n let httpParams = new HttpParams();\r\n httpParams = httpParams.set('pageNumber', '1');\r\n httpParams = httpParams.set('pageSize', limit.toString());\r\n if (nameFilter) {\r\n httpParams = httpParams.set('name', nameFilter);\r\n }\r\n const options =\r\n httpParams.keys().length > 0\r\n ? {\r\n params: httpParams,\r\n }\r\n : {};\r\n\r\n return this._http\r\n .get<UserWithRoles<User>[]>(this._env.get('apiUrl') + 'users', options)\r\n .pipe(\r\n retry(3),\r\n map((users: UserWithRoles<User>[]) => {\r\n return users.map(this.getUserFromWrapper);\r\n }),\r\n catchError(this._error.handleError)\r\n );\r\n }\r\n\r\n /**\r\n * Get information about all the users listed in the specified names.\r\n * @param names User(s) names.\r\n */\r\n public getUsersFromNames(names: string[]): Observable<User[]> {\r\n let httpParams = new HttpParams();\r\n if (names && names.length > 0) {\r\n httpParams = httpParams.set('names', names.join(','));\r\n }\r\n const options =\r\n httpParams.keys().length > 0\r\n ? {\r\n params: httpParams,\r\n }\r\n : {};\r\n\r\n return this._http\r\n .get<UserWithRoles<User>[]>(\r\n this._env.get('apiUrl') + 'users-from-names',\r\n options\r\n )\r\n .pipe(\r\n retry(3),\r\n map((users: UserWithRoles<User>[]) => {\r\n return users.map(this.getUserFromWrapper);\r\n }),\r\n catchError(this._error.handleError)\r\n );\r\n }\r\n\r\n /**\r\n * Get data about the specified user.\r\n * @param name The user name.\r\n */\r\n public getUser(name: string): Observable<User> {\r\n return this._http\r\n .get<UserWithRoles<User>>(this._env.get('apiUrl') + 'users/' + name)\r\n .pipe(\r\n retry(3),\r\n map(this.getUserFromWrapper),\r\n catchError(this._error.handleError)\r\n );\r\n }\r\n\r\n /**\r\n * Update the editable data for the specified user.\r\n * @param user The user to update.\r\n */\r\n public updateUser(user: User): Observable<any> {\r\n return this._http\r\n .put(\r\n this._env.get('apiUrl') +\r\n 'users' +\r\n (user.emailConfirmed ? '?confirmed=true' : ''),\r\n user\r\n )\r\n .pipe(catchError(this._error.handleError));\r\n }\r\n\r\n /**\r\n * Request a password reset email for the specified email address.\r\n * @param email The email address to receive the reset message.\r\n */\r\n public resetPassword(email: string): Observable<any> {\r\n return this._http\r\n .post(this._env.get('apiUrl') + 'accounts/resetpassword/request', {\r\n email: email,\r\n })\r\n .pipe(catchError(this._error.handleError));\r\n }\r\n\r\n /**\r\n * Change the password.\r\n * @param change The password change data.\r\n */\r\n public changePassword(change: PasswordChange): Observable<any> {\r\n return this._http\r\n .post(this._env.get('apiUrl') + 'accounts/changepassword', change)\r\n .pipe(catchError(this._error.handleError));\r\n }\r\n\r\n /**\r\n * Delete the user with the specified username.\r\n * @param name The user name.\r\n */\r\n public deleteUser(name: string): Observable<any> {\r\n return this._http\r\n .delete(this._env.get('apiUrl') + 'accounts/' + name)\r\n .pipe(catchError(this._error.handleError));\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { BehaviorSubject, Observable, take, tap } from 'rxjs';\r\n\r\nimport { User } from '@myrmidon/auth-jwt-login';\r\nimport { DataPage } from '@myrmidon/ng-tools';\r\nimport {\r\n PagedListStore,\r\n PagedListStoreService,\r\n} from '@myrmidon/paged-data-browsers';\r\n\r\nimport {\r\n AuthJwtAccountService,\r\n UserFilter,\r\n} from '../../services/auth-jwt-account.service';\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class UserListRepository\r\n implements PagedListStoreService<UserFilter, User>\r\n{\r\n private _store: PagedListStore<UserFilter, User>;\r\n private _activeUser$: BehaviorSubject<User | undefined>;\r\n private _loading$: BehaviorSubject<boolean>;\r\n private _saving$: BehaviorSubject<boolean>;\r\n\r\n public get activeUser$(): Observable<User | undefined> {\r\n return this._activeUser$.asObservable();\r\n }\r\n public get filter$(): Observable<UserFilter> {\r\n return this._store.filter$;\r\n }\r\n public get page$(): Observable<DataPage<User>> {\r\n return this._store.page$;\r\n }\r\n public get loading$(): Observable<boolean> {\r\n return this._loading$.asObservable();\r\n }\r\n public get saving$(): Observable<boolean> {\r\n return this._saving$.asObservable();\r\n }\r\n\r\n constructor(private _accService: AuthJwtAccountService) {\r\n this._store = new PagedListStore<UserFilter, User>(this);\r\n this._activeUser$ = new BehaviorSubject<User | undefined>(undefined);\r\n this._loading$ = new BehaviorSubject<boolean>(false);\r\n this._saving$ = new BehaviorSubject<boolean>(false);\r\n this._store.reset();\r\n }\r\n\r\n public loadPage(\r\n pageNumber: number,\r\n pageSize: number,\r\n filter: UserFilter\r\n ): Observable<DataPage<User>> {\r\n this._loading$.next(true);\r\n return this._accService.getUsers(filter, pageNumber, pageSize).pipe(\r\n tap({\r\n next: () => this._loading$.next(false),\r\n error: () => this._loading$.next(false),\r\n })\r\n );\r\n }\r\n\r\n public async reset(): Promise<void> {\r\n this._loading$.next(true);\r\n try {\r\n await this._store.reset();\r\n } catch (error) {\r\n throw error;\r\n } finally {\r\n this._loading$.next(false);\r\n }\r\n }\r\n\r\n public async setFilter(filter: UserFilter): Promise<void> {\r\n this._loading$.next(true);\r\n try {\r\n await this._store.setFilter(filter);\r\n } catch (error) {\r\n throw error;\r\n } finally {\r\n this._loading$.next(false);\r\n }\r\n }\r\n\r\n public getFilter(): UserFilter {\r\n return this._store.getFilter();\r\n }\r\n\r\n public async setPage(pageNumber: number, pageSize: number): Promise<void> {\r\n this._loading$.next(true);\r\n try {\r\n await this._store.setPage(pageNumber, pageSize);\r\n } catch (error) {\r\n throw error;\r\n } finally {\r\n this._loading$.next(false);\r\n }\r\n }\r\n\r\n public setActiveUser(user: User | null): void {\r\n this._activeUser$.next(user || undefined);\r\n }\r\n\r\n public updateActiveUser(user: User): Promise<boolean> {\r\n const promise: Promise<boolean> = new Promise((resolve, reject) => {\r\n this._saving$.next(true);\r\n\r\n this._accService.updateUser(user).subscribe({\r\n next: (_) => {\r\n this._saving$.next(false);\r\n this._store.reset();\r\n resolve(true);\r\n },\r\n error: (error) => {\r\n this._saving$.next(false);\r\n console.error(\r\n `Error updating user ${user.userName}: ` +\r\n JSON.stringify(error || {})\r\n );\r\n resolve(false);\r\n },\r\n });\r\n });\r\n return promise;\r\n }\r\n\r\n public deleteUser(name: string): Promise<boolean> {\r\n const promise: Promise<boolean> = new Promise((resolve, reject) => {\r\n if (this._activeUser$.value?.userName === name) {\r\n this._activeUser$.next(undefined);\r\n }\r\n\r\n this._saving$.next(true);\r\n\r\n this._accService.deleteUser(name).subscribe({\r\n next: (_) => {\r\n this._saving$.next(false);\r\n this._store.reset();\r\n resolve(true);\r\n },\r\n error: (error) => {\r\n this._saving$.next(false);\r\n console.error(\r\n `Error deleting user ${name}: ` + JSON.stringify(error || {})\r\n );\r\n reject(error);\r\n },\r\n });\r\n });\r\n return promise;\r\n }\r\n}\r\n","import {\r\n Component,\r\n OnChanges,\r\n EventEmitter,\r\n Input,\r\n Output,\r\n SimpleChange,\r\n} from '@angular/core';\r\n\r\n@Component({\r\n selector: 'auth-jwt-password-strength-bar',\r\n templateUrl: './password-strength-bar.component.html',\r\n styleUrls: ['./password-strength-bar.component.css'],\r\n})\r\nexport class PasswordStrengthBarComponent implements OnChanges {\r\n private _colors = ['#F00', '#F90', '#FF0', '#9F0', '#0F0'];\r\n\r\n @Input() passwordToCheck: string | undefined;\r\n\r\n @Output() strengthChange = new EventEmitter<number>();\r\n\r\n public bars: string[];\r\n\r\n constructor() {\r\n this.strengthChange = new EventEmitter<number>();\r\n this.bars = [];\r\n }\r\n\r\n private measureStrength(p: string): number {\r\n let force = 0;\r\n const regex = /[$-/:-?{-~!\"^_`\\[\\]]/g; // \"\r\n\r\n const lowerLetters = /[a-z]+/.test(p);\r\n const upperLetters = /[A-Z]+/.test(p);\r\n const numbers = /[0-9]+/.test(p);\r\n const symbols = regex.test(p);\r\n\r\n const flags = [lowerLetters, upperLetters, numbers, symbols];\r\n\r\n let passedMatches = 0;\r\n for (const flag of flags) {\r\n passedMatches += flag === true ? 1 : 0;\r\n }\r\n\r\n force += 2 * p.length + (p.length >= 10 ? 1 : 0);\r\n force += passedMatches * 10;\r\n\r\n // penalty (short password)\r\n force = p.length <= 6 ? Math.min(force, 10) : force;\r\n\r\n // penalty (poor letiety of characters)\r\n force = passedMatches === 1 ? Math.min(force, 10) : force;\r\n force = passedMatches === 2 ? Math.min(force, 20) : force;\r\n force = passedMatches === 3 ? Math.min(force, 40) : force;\r\n\r\n return force;\r\n }\r\n\r\n private getColor(s: number) {\r\n let idx = 0;\r\n if (s <= 10) {\r\n idx = 0;\r\n } else if (s <= 20) {\r\n idx = 1;\r\n } else if (s <= 30) {\r\n idx = 2;\r\n } else if (s <= 40) {\r\n idx = 3;\r\n } else {\r\n idx = 4;\r\n }\r\n return {\r\n idx: idx + 1,\r\n col: this._colors[idx],\r\n };\r\n }\r\n\r\n ngOnChanges(changes: { [propName: string]: SimpleChange }): void {\r\n const password = changes['passwordToCheck'].currentValue;\r\n this.setBarColors(5, '#DDD');\r\n if (password) {\r\n const strength = this.measureStrength(password);\r\n const c = this.getColor(strength);\r\n this.setBarColors(c.idx, c.col);\r\n this.strengthChange.emit(strength);\r\n }\r\n }\r\n\r\n private setBarColors(count: number, col: string) {\r\n for (let n = 0; n < count; n++) {\r\n this.bars[n] = col;\r\n }\r\n }\r\n}\r\n","<div id=\"strength\">\r\n <small>strength:</small>\r\n <ul id=\"strengthBar\">\r\n <li class=\"point\" [style.background-color]=\"bars[0]\"></li>\r\n <li class=\"point\" [style.background-color]=\"bars[1]\"></li>\r\n <li class=\"point\" [style.background-color]=\"bars[2]\"></li>\r\n <li class=\"point\" [style.background-color]=\"bars[3]\"></li>\r\n <li class=\"point\" [style.background-color]=\"bars[4]\"></li>\r\n </ul>\r\n</div>\r\n","import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core';\r\nimport {\r\n Validators,\r\n AbstractControl,\r\n ValidationErrors,\r\n FormGroup,\r\n FormControl,\r\n FormBuilder,\r\n} from '@angular/forms';\r\nimport { MatSnackBar } from '@angular/material/snack-bar';\r\nimport { Observable } from 'rxjs';\r\nimport { take } from 'rxjs/operators';\r\n\r\nimport {\r\n AuthJwtAccountService,\r\n ExistResult,\r\n RegistrationModel,\r\n} from '../../services/auth-jwt-account.service';\r\nimport { PasswordValidators } from '../../validators/password.validators';\r\nimport { UserListRepository } from '../state/user-list.repository';\r\n\r\n@Component({\r\n selector: 'auth-jwt-registration',\r\n templateUrl: './auth-jwt-registration.component.html',\r\n styleUrls: ['./auth-jwt-registration.component.css'],\r\n})\r\nexport class AuthJwtRegistrationComponent {\r\n public busy: boolean | undefined;\r\n // form\r\n public form: FormGroup;\r\n public email: FormControl<string>;\r\n public name: FormControl<string>;\r\n public firstName: FormControl<string>;\r\n public lastName: FormControl<string>;\r\n public password: FormControl<string>;\r\n public confirmPassword: FormControl<string>;\r\n\r\n /**\r\n * True if the registration should be confirmed automatically.\r\n */\r\n @Input()\r\n public autoConfirm?: boolean;\r\n\r\n /**\r\n * Emitted when a user was successfully registered. Usually\r\n * you should handle this to move away from the registration\r\n * page.\r\n */\r\n @Output()\r\n public registered: EventEmitter<any>;\r\n\r\n public hide = true;\r\n\r\n constructor(\r\n formBuilder: FormBuilder,\r\n private _snackbar: MatSnackBar,\r\n private _accountService: AuthJwtAccountService,\r\n private _userRepository: UserListRepository\r\n ) {\r\n this.registered = new EventEmitter<any>();\r\n // form\r\n this.email = formBuilder.control('', {\r\n validators: [Validators.required, Validators.email],\r\n asyncValidators: this.getUniqueEmailValidator(this._accountService).bind(\r\n this\r\n ),\r\n nonNullable: true,\r\n });\r\n\r\n this.name = formBuilder.control('', {\r\n validators: Validators.required,\r\n asyncValidators: this.getUniqueNameValidator(this._accountService).bind(\r\n this\r\n ),\r\n nonNullable: true,\r\n });\r\n\r\n this.firstName = formBuilder.control('', {\r\n validators: [Validators.required, Validators.maxLength(50)],\r\n nonNullable: true,\r\n });\r\n this.lastName = formBuilder.control('', {\r\n validators: [Validators.required, Validators.maxLength(50)],\r\n nonNullable: true,\r\n });\r\n\r\n // http://stackoverflow.com/questions/35474991/angular-2-form-validating-for-repeat-password\r\n this.password = formBuilder.control('', {\r\n validators: [Validators.required, PasswordValidators.standard()],\r\n nonNullable: true,\r\n });\r\n this.confirmPassword = formBuilder.control('', {\r\n validators: Validators.required,\r\n nonNullable: true,\r\n });\r\n\r\n this.form = formBuilder.group(\r\n {\r\n email: this.email,\r\n name: this.name,\r\n firstName: this.firstName,\r\n lastName: this.lastName,\r\n password: this.password,\r\n confirmPassword: this.confirmPassword,\r\n },\r\n {\r\n validators: [\r\n PasswordValidators.areEqual('password', 'confirmPassword'),\r\n ],\r\n }\r\n );\r\n }\r\n\r\n /**\r\n * Creates a unique name validator. There is no dependency injection at this level,\r\n * but we can use closures. As a matter of fact, we have access to the service instance\r\n * from the component where we register validators. So we will implement a function\r\n * that will accept the service as parameter, and create the actual validation function.\r\n * This function will have access to the service when called during the validation process.\r\n * See http://restlet.com/blog/2016/02/17/implementing-angular2-forms-beyond-basics-part-2/.\r\n */\r\n private getUniqueNameValidator(service: AuthJwtAccountService) {\r\n return (\r\n control: AbstractControl\r\n ):\r\n | Promise<ValidationErrors | null>\r\n | Observable<ValidationErrors | null> => {\r\n return new Promise((resolve, reject) => {\r\n // avoid checking if empty\r\n if (!control.value) {\r\n resolve(null);\r\n } else {\r\n service.isNameRegistered(control.value).subscribe({\r\n next: (data: ExistResult) => {\r\n if (!data.isExisting) {\r\n resolve(null);\r\n } else {\r\n resolve({ uniqueName: true });\r\n }\r\n },\r\n error: (error) => {\r\n console.error(\r\n 'Unique name validator error' +\r\n (error ? JSON.stringify(error) : '')\r\n );\r\n resolve({ uniqueName: true });\r\n },\r\n });\r\n }\r\n });\r\n };\r\n }\r\n\r\n private getUniqueEmailValidator(service: AuthJwtAccountService) {\r\n return (\r\n control: AbstractControl\r\n ):\r\n | Promise<ValidationErrors | null>\r\n | Observable<ValidationErrors | null> => {\r\n return new Promise((resolve, reject) => {\r\n // avoid checking if empty\r\n if (!control.value) {\r\n resolve(null);\r\n } else {\r\n service.isEmailRegistered(control.value).subscribe({\r\n next: (data: ExistResult) => {\r\n if (!data.isExisting) {\r\n resolve(null);\r\n } else {\r\n resolve({ uniqueEmail: true });\r\n }\r\n },\r\n error: (error) => {\r\n console.error(\r\n 'Unique email validator error' +\r\n (error ? JSON.stringify(error) : '')\r\n );\r\n resolve({ uniqueEmail: true });\r\n },\r\n });\r\n }\r\n });\r\n };\r\n }\r\n\r\n public onSubmit(): void {\r\n if (\r\n !this.form.valid ||\r\n this.busy ||\r\n this.name.pending ||\r\n this.email.pending\r\n ) {\r\n return;\r\n }\r\n\r\n const model: RegistrationModel = {\r\n email: this.email.value,\r\n name: this.name.value,\r\n firstName: this.firstName.value,\r\n lastName: this.lastName.value,\r\n password: this.password.value,\r\n };\r\n\r\n this.busy = true;\r\n this._accountService\r\n .register(model, this.autoConfirm)\r\n .pipe(take(1))\r\n .subscribe({\r\n next: () => {\r\n this.busy = false;\r\n this._snackbar.open(\r\n $localize`:auth-jwt-admin:Registration succeeded`,\r\n 'OK'\r\n );\r\n this._userRepository.reset();\r\n this.registered.emit();\r\n },\r\n error: (error) => {\r\n this.busy = false;\r\n console.error(\r\n 'Registration error' + (error ? JSON.stringify(error) : '')\r\n );\r\n this._snackbar.open(\r\n $localize`:auth-jwt-admin:Registration error`,\r\n 'OK'\r\n );\r\n },\r\n });\r\n }\r\n}\r\n","<div>\n <form role=\"form\" [formGroup]=\"form\" (submit)=\"onSubmit()\">\n <fieldset>\n <legend i18n=\"auth-jwt-admin\">registration</legend>\n <!-- email -->\n <div class=\"form-row\">\n <mat-form-field>\n <mat-label i18n>email</mat-label>\n <input\n matInput\n type=\"email\"\n id=\"email\"\n maxlength=\"256\"\n required\n autofocus\n spellcheck=\"false\"\n [formControl]=\"email\"\n />\n @if ( $any(email).errors?.required && (email.dirty || email.touched) )\n {\n <mat-error i18n=\"auth-jwt-admin\">email required</mat-error>\n } @if ($any(email).errors?.email && (email.dirty || email.touched)) {\n <mat-error i18n=\"auth-jwt-admin\">invalid email</mat-error>\n } @if ( $any(email).errors?.uniqueEmail && (email.dirty ||\n email.touched) ) {\n <mat-error i18n=\"auth-jwt-admin\">email already registered</mat-error>\n }\n </mat-form-field>\n @if (email.pending) {\n <mat-icon>hourglass</mat-icon>\n }\n </div>\n\n <!-- name -->\n <div class=\"form-row\">\n <mat-form-field>\n <mat-label i18n=\"auth-jwt-admin\">username</mat-label>\n <input\n matInput\n type=\"text\"\n id=\"name\"\n maxlength=\"50\"\n required\n pattern=\"^[a-zA-Z][a-zA-Z0-9]{2,49}$\"\n spellcheck=\"false\"\n [formControl]=\"name\"\n />\n @if ($any(name).errors?.required && (name.dirty || name.touched)) {\n <mat-error i18n=\"auth-jwt-admin\">username required</mat-error>\n } @if ($any(name).errors?.pattern && (name.dirty || name.touched)) {\n <mat-error i18n=\"auth-jwt-admin\">invalid username</mat-error>\n } @if ( $any(name).errors?.uniqueName && (name.dirty || name.touched)\n ) {\n <mat-error i18n=\"auth-jwt-admin\"\n >username already registered</mat-error\n >\n }\n </mat-form-field>\n @if (name.pending) {\n <mat-icon>hourglass</mat-icon>\n }\n </div>\n\n <!-- first name -->\n <div>\n <mat-form-field>\n <mat-label i18n=\"auth-jwt-admin\">first name</mat-label>\n <input\n matInput\n type=\"text\"\n id=\"firstName\"\n maxlength=\"50\"\n required\n spellcheck=\"false\"\n [formControl]=\"firstName\"\n />\n @if ( firstName.hasError('required') && (firstName.dirty ||\n firstName.touched) ) {\n <mat-error i18n=\"auth-jwt-admin\" class=\"text-danger small\">\n first name required\n </mat-error>\n }\n </mat-form-field>\n </div>\n\n <!-- last name -->\n <div>\n <mat-form-field>\n <mat-label i18n=\"auth-jwt-admin\">last name</mat-label>\n <input\n matInput\n type=\"text\"\n id=\"lastName\"\n maxlength=\"50\"\n required\n spellcheck=\"false\"\n [formControl]=\"lastName\"\n />\n @if ( lastName.hasError('required') && (lastName.dirty ||\n lastName.touched) ) {\n <mat-error i18n=\"auth-jwt-admin\" class=\"text-danger small\">\n last name required\n </mat-error>\n }\n </mat-form-field>\n </div>\n\n <!-- <div [formGroup]=\"passwords\"> -->\n <!-- password -->\n <div>\n <mat-form-field>\n <mat-label i18n=\"auth-jwt-admin\">password</mat-label>\n <input\n matInput\n [type]=\"hide ? 'password' : 'text'\"\n name=\"password\"\n autocomplete=\"new-password\"\n maxlength=\"50\"\n required\n spellcheck=\"false\"\n [formControl]=\"password\"\n />\n <button\n type=\"button\"\n mat-icon-button\n matSuffix\n (click)=\"hide = !hide\"\n i18n-aria-label=\"auth-jwt-login\"\n aria-label=\"Hide password\"\n [attr.aria-pressed]=\"hide\"\n >\n <mat-icon>{{ hide ? \"visibility_off\" : \"visibility\" }}</mat-icon>\n </button>\n <auth-jwt-password-strength-bar [passwordToCheck]=\"password.value\">\n </auth-jwt-password-strength-bar>\n @if ( $any(password).errors?.required && (password.dirty ||\n password.touched) ) {\n <mat-error i18n=\"auth-jwt-admin\">password required</mat-error>\n } @if ( $any(password).errors?.passwordtooshort && (password.dirty ||\n password.touched) ) {\n <mat-error i18n=\"auth-jwt-admin\">at least 8 characters</mat-error>\n } @if ( $any(password).errors?.noupperinpassword && (password.dirty ||\n password.touched) ) {\n <mat-error i18n=\"auth-jwt-admin\"\n >at least 1 uppercase letter</mat-error\n >\n } @if ( $any(password).errors?.nolowerinpassword && (password.dirty ||\n password.touched) ) {\n <mat-error i18n=\"auth-jwt-admin\"\n >at least 1 lowercase letter</mat-error\n >\n } @if ( $any(password).errors?.nosymbolinpassword && (password.dirty\n || password.touched) ) {\n <mat-error i18n=\"auth-jwt-admin\"\n >at least 1 punctuation/symbol</mat-error\n >\n }\n </mat-form-field>\n </div>\n\n <!-- confirm password -->\n <div>\n <mat-form-field>\n <mat-label i18n=\"auth-jwt-admin\">confirm password</mat-label>\n <input\n matInput\n [type]=\"hide ? 'password' : 'text'\"\n name=\"confirmPassword\"\n maxlength=\"50\"\n required\n spellcheck=\"false\"\n [formControl]=\"confirmPassword\"\n />\n </mat-form-field>\n </div>\n @if (form.errors?.areequal && confirmPassword.touched) {\n <div i18n=\"auth-jwt-admin\" style=\"color: red\">\n password differs from confirmation password\n </div>\n }\n\n <button\n i18n=\"auth-jwt-admin\"\n mat-flat-button\n type=\"submit\"\n color=\"primary\"\n class=\"mat-primary\"\n [disabled]=\"\n form.invalid || form.pristine || busy || name.pending || email.pending\n \"\n >\n register\n </button>\n @if (busy) {\n <mat-progress-spinner diameter=\"20\"></mat-progress-spinner>\n }\n </fieldset>\n </form>\n\n <details>\n <summary i18n=\"auth-jwt-admin\">Hints</summary>\n <div class=\"info\">\n <p i18n=\"auth-jwt-admin\">\n To register a new user, you must provide his email address, choose a\n password, and choose a username, which must be unique (you will be\n notified if another user has already taken that name). The username must\n include only letters/digits, start with a letter, and be no shorter than\n 3 characters, nor longer than 50.\n </p>\n <p i18n=\"auth-jwt-admin\">\n To promote a decent security level, the password must include at least 8\n characters, uppercase and lowercase letters, digits, and punctuation\n (like dashes, stops, parentheses, etc.).\n </p>\n <p i18n=\"auth-jwt-admin\">\n Once registered, if messaging is enabled on the server side the user\n will receive an email message to the email address you specified; he\n will have to click on the provided link to complete the registration\n process. Otherwise, you should edit the newly created user and confirm\n the email registration.\n </p>\n </div>\n </details>\n</div>\n","import { Component, Input, Output, OnInit, EventEmitter } from '@angular/core';\r\nimport { FormBuilder, FormControl, FormGroup } from '@angular/forms';\r\nimport { Observable } from 'rxjs';\r\n\r\nimport { UserFilter } from '../../services/auth-jwt-account.service';\r\n\r\n@Component({\r\n selector: 'auth-jwt-user-filter',\r\n templateUrl: './user-filter.component.html',\r\n styleUrls: ['./user-filter.component.css'],\r\n})\r\nexport class UserFilterComponent {\r\n private _filter?: UserFilter;\r\n\r\n @Input()\r\n public get filter(): UserFilter | null | undefined {\r\n return this._filter;\r\n }\r\n public set filter(value: UserFilter | null | undefined) {\r\n if (this._filter === value) {\r\n return;\r\n }\r\n this._filter = value || undefined;\r\n this.updateForm(this._filter);\r\n }\r\n\r\n @Input()\r\n public disabled: boolean | undefined;\r\n\r\n /**\r\n * Event emitted when the filter changes.\r\n */\r\n @Output()\r\n public filterChange: EventEmitter<UserFilter>;\r\n\r\n public name: FormControl<string | null>;\r\n public form: FormGroup;\r\n\r\n constructor(formBuilder: FormBuilder) {\r\n // form\r\n this.name = formBuilder.control<string | null>(null);\r\n this.form = formBuilder.group({\r\n name: this.name,\r\n });\r\n // event\r\n this.filterChange = new EventEmitter<UserFilter>();\r\n }\r\n\r\n private updateForm(filter?: UserFilter): void {\r\n if (!filter) {\r\n this.form.reset();\r\n return;\r\n }\r\n this.name.setValue(filter.name || null);\r\n this.form.markAsPristine();\r\n }\r\n\r\n private getFilter(): UserFilter {\r\n return {\r\n name: this.name.value?.trim(),\r\n };\r\n }\r\n\r\n public reset(): void {\r\n this.form.reset();\r\n this._filter = {};\r\n this.filterChange.emit(this._filter);\r\n }\r\n\r\n public apply(): void {\r\n this._filter = this.getFilter();\r\n this.filterChange.emit(this._filter);\r\n }\r\n}\r\n","<form [formGroup]=\"form\" (submit)=\"apply()\" ng-disabled=\"disabled\">\r\n <div class=\"form-row\">\r\n <mat-form-field>\r\n <mat-label i18n=\"auth-jwt-admin\">name or ID</mat-label>\r\n <input matInput [formControl]=\"name\" />\r\n <button\r\n mat-icon-button\r\n matSuffix\r\n type=\"button\"\r\n (click)=\"reset()\"\r\n color=\"warn\"\r\n i18n-matTooltip=\"auth-jwt-admin\"\r\n matTooltip=\"Reset filters\"\r\n [disabled]=\"disabled\"\r\n >\r\n <mat-icon class=\"mat-warn\">clear</mat-icon>\r\n </button>\r\n </mat-form-field>\r\n\r\n <button\r\n id=\"apply\"\r\n type=\"submit\"\r\n mat-icon-button\r\n color=\"primary\"\r\n [disabled]=\"disabled\"\r\n i18n-matTooltip=\"auth-jwt-admin\"\r\n matTooltip=\"Apply filters\"\r\n >\r\n <mat-icon class=\"mat-primary\">check_circle</mat-icon>\r\n </button>\r\n </div>\r\n</form>\r\n","import { Component, OnInit, Input, Output, EventEmitter } from '@angular/core';\r\nimport {\r\n UntypedFormGroup,\r\n UntypedFormControl,\r\n UntypedFormBuilder,\r\n Validators,\r\n} from '@angular/forms';\r\nimport { AuthJwtService, User } from '@myrmidon/auth-jwt-login';\r\n\r\n@Component({\r\n selector: 'auth-jwt-user-editor',\r\n templateUrl: './user-editor.component.html',\r\n styleUrls: ['./user-editor.component.css'],\r\n})\r\nexport class UserEditorComponent implements OnInit {\r\n private _user: User | undefined;\r\n\r\n public email: UntypedFormControl;\r\n public emailConfirmed: UntypedFormControl;\r\n public lockoutEnabled: UntypedFormControl;\r\n public firstName: UntypedFormControl;\r\n public lastName: UntypedFormControl;\r\n public roles: UntypedFormControl;\r\n public form: UntypedFormGroup;\r\n\r\n public unlocked: boolean | undefined;\r\n\r\n @Input() public set user(value: User | undefined) {\r\n this._user = value;\r\n this.updateForm(value);\r\n }\r\n public get user(): User | undefined {\r\n return this._user;\r\n }\r\n\r\n @Output() userChange: EventEmitter<User>;\r\n @Output() editorClose: EventEmitter<any>;\r\n\r\n constructor(formBuilder: UntypedFormBuilder, private _authService: AuthJwtService) {\r\n // events\r\n this.userChange = new EventEmitter<User>();\r\n this.editorClose = new EventEmitter<any>();\r\n // form\r\n this.email = formBuilder.control(null, [\r\n Validators.required,\r\n Validators.email,\r\n ]);\r\n this.emailConfirmed = formBuilder.control(false);\r\n this.lockoutEnabled = formBuilder.control(false);\r\n this.firstName = formBuilder.control(null, [\r\n Validators.required,\r\n Validators.maxLength(50),\r\n ]);\r\n this.lastName = formBuilder.control(null, [\r\n Validators.required,\r\n Validators.maxLength(50),\r\n ]);\r\n this.roles = formBuilder.control(null, Validators.maxLength(200));\r\n\r\n this.form = formBuilder.group({\r\n email: this.email,\r\n emailConfirmed: this.emailConfirmed,\r\n lockoutEnabled: this.lockoutEnabled,\r\n firstName: this.firstName,\r\n lastName: this.lastName,\r\n roles: this.roles,\r\n });\r\n }\r\n\r\n ngOnInit(): void {}\r\n\r\n private updateForm(user: User | undefined): void {\r\n if (!user) {\r\n this.form.reset();\r\n } else {\r\n this.email.setValue(user.email);\r\n this.emailConfirmed.setValue(user.emailConfirmed);\r\n this.lockoutEnabled.setValue(user.lockoutEnabled);\r\n this.firstName.setValue(user.firstName);\r\n this.lastName.setValue(user.lastName);\r\n if (user.roles?.length > 0) {\r\n this.roles.setValue(user.roles.join(' '));\r\n } else {\r\n this.roles.setValue(null);\r\n }\r\n }\r\n }\r\n\r\n private getUserFromForm(): User {\r\n return {\r\n userName: this._user?.userName || '',\r\n email: this.email.value,\r\n emailConfirmed: this.emailConfirmed.value,\r\n lockoutEnabled: this.lockoutEnabled.value,\r\n firstName: this.firstName.value,\r\n lastName: this.lastName.value,\r\n roles: this.roles.value\r\n ? this.roles.value.split(' ').filter((s: string) => s)\r\n : [],\r\n };\r\n }\r\n\r\n public endLockout(): void {\r\n if (this.unlocked) {\r\n return;\r\n }\r\n this._user!.lockoutEnd = this._authService.getUTCDate();\r\n this.unlocked = true;\r\n }\r\n\r\n public close(): void {\r\n this.editorClose.emit();\r\n }\r\n\r\n public save(): void {\r\n if (this.form.invalid) {\r\n return;\r\n }\r\n this.userChange.emit(this.getUserFromForm());\r\n }\r\n}\r\n","<form [formGroup]=\"form\" (submit)=\"save()\">\n <div class=\"form-row\">\n <!-- email -->\n <mat-form-field>\n <mat-label i18n=\"auth-jwt-admin\">email</mat-label>\n <input type=\"text\" matInput [formControl]=\"email\" />\n @if (email.hasError('required') && (email.dirty || email.touched)) {\n <mat-error i18n=\"auth-jwt-admin\"> email address required </mat-error>\n } @if (email.hasError('pattern') && (email.dirty || email.touched)) {\n <mat-error i18n=\"auth-jwt-admin\"> invalid email address </mat-error>\n }\n </mat-form-field>\n\n <!-- emailConfirmed -->\n <mat-checkbox [formControl]=\"emailConfirmed\" i18n=\"auth-jwt-admin\"\n >email address confirmed</mat-checkbox\n >\n </div>\n\n <!-- lockoutEnabled -->\n <div class=\"form-row\">\n <mat-checkbox [formControl]=\"lockoutEnabled\" i18n=\"auth-jwt-admin\"\n >lockout enabled</mat-checkbox\n >\n <button\n type=\"button\"\n mat-icon-button\n color=\"primary\"\n (click)=\"endLockout()\"\n [disabled]=\"unlocked\"\n i18n-matTooltip=\"auth-jwt-admin\"\n matTooltip=\"Unlock this user if locked\"\n >\n <mat-icon class=\"mat-primary\">lock_open</mat-icon>\n </button>\n </div>\n\n <div class=\"form-row\">\n <!-- firstName -->\n <mat-form-field>\n <mat-label i18n=\"auth-jwt-admin\">first name</mat-label>\n <input type=\"text\" matInput [formControl]=\"firstName\" />\n @if ( firstName.hasError('required') && (firstName.dirty ||\n firstName.touched) ) {\n <mat-error i18n=\"auth-jwt-admin\"> first name required </mat-error>\n } @if ( firstName.hasError('maxlength') && (firstName.dirty ||\n firstName.touched) ) {\n <mat-error i18n=\"auth-jwt-admin\"> first name too long </mat-error>\n }\n </mat-form-field>\n\n <!-- lastName -->\n <mat-form-field>\n <mat-label i18n=\"auth-jwt-admin\">last name</mat-label>\n <input type=\"text\" matInput [formControl]=\"lastName\" />\n @if ( lastName.hasError('required') && (lastName.dirty ||\n lastName.touched) ) {\n <mat-error i18n=\"auth-jwt-admin\"> last name required </mat-error>\n } @if ( lastName.hasError('maxlength') && (lastName.dirty ||\n lastName.touched) ) {\n <mat-error i18n=\"auth-jwt-admin\"> last name too long </mat-error>\n }\n </mat-form-field>\n </div>\n\n <!-- roles -->\n <div>\n <mat-form-field style=\"width: 16em\">\n <mat-label i18n=\"auth-jwt-admin\">roles</mat-label>\n <input type=\"text\" matInput [formControl]=\"roles\" />\n @if (roles.hasError('maxlength') && (roles.dirty || roles.touched)) {\n <mat-error i18n=\"auth-jwt-admin\"> too long </mat-error>\n }\n <mat-hint i18n>roles (separated by space)</mat-hint>\n </mat-form-field>\n </div>\n\n <!-- buttons -->\n <br />\n <div>\n <button\n type=\"button\"\n mat-icon-button\n color=\"warn\"\n i18n-matTooltip=\"auth-jwt-admin\"\n matTooltip=\"Close\"\n (click)=\"close()\"\n >\n <mat-icon class=\"mat-warn\">cancel</mat-icon>\n </button>\n <button\n type=\"submit\"\n mat-icon-button\n color=\"primary\"\n [disabled]=\"form.invalid\"\n i18n-matTooltip=\"auth-jwt-admin\"\n matTooltip=\"Save user\"\n >\n <mat-icon class=\"mat-primary\">check_circle</mat-icon>\n </button>\n </div>\n</form>\n","import { Component } from '@angular/core';\r\nimport { PageEvent } from '@angular/material/paginator';\r\nimport { Observable } from 'rxjs';\r\nimport '@angular/localize/init';\r\n\r\nimport { GravatarService, User } from '@myrmidon/auth-jwt-login';\r\nimport { DataPage } from '@myrmidon/ng-tools';\r\nimport { DialogService } from '@myrmidon/ng-mat-tools';\r\n\r\nimport { UserListRepository } from '../state/user-list.repository';\r\nimport { UserFilter } from '../../services/auth-jwt-account.service';\r\n\r\n@Component({\r\n selector: 'auth-jwt-user-list',\r\n templateUrl: './user-list.component.html',\r\n styleUrls: ['./user-list.component.css'],\r\n})\r\nexport class UserListComponent {\r\n public active$: Observable<User | undefined>;\r\n public loading$: Observable<boolean>;\r\n public filter$: Observable<UserFilter>;\r\n public page$: Observable<DataPage<User>>;\r\n\r\n constructor(\r\n private _repository: UserListRepository,\r\n private _dialogService: DialogService,\r\n private _gravatarService: GravatarService\r\n ) {\r\n this.filter$ = _repository.filter$;\r\n this.page$ = _repository.page$;\r\n this.active$ = _repository.activeUser$;\r\n this.loading$ = _repository.loading$;\r\n }\r\n\r\n public reset(): void {\r\n this._repository.reset();\r\n }\r\n\r\n public onFilterChange(filter: UserFilter): void {\r\n this._repository.setFilter(filter);\r\n }\r\n\r\n public onPageChange(event: PageEvent): void {\r\n this._repository.setPage(event.pageIndex + 1, event.pageSize);\r\n }\r\n\r\n public deleteUser(user: User): void {\r\n this._dialogService\r\n .confirm(\r\n $localize`:auth-jwt-admin:Confirm`,\r\n $localize`:auth-jwt-admin:Delete user ` + user.userName + '?'\r\n )\r\n .subscribe((yes) => {\r\n if (yes) {\r\n this._repository.deleteUser(user.userName);\r\n }\r\n });\r\n }\r\n\r\n public setActiveUser(user: User | null): void {\r\n this._repository.setActiveUser(user);\r\n }\r\n\r\n public resetActiveUser(): void {\r\n this._repository.setActiveUser(null);\r\n }\r\n\r\n public saveActiveUser(user: User): void {\r\n this._repository.updateActiveUser(user);\r\n this._repository.setActiveUser(null);\r\n }\r\n\r\n public onUserEditorClose(): void {\r\n this._repository.setActiveUser(null);\r\n }\r\n\r\n public getGravatarUrl(email: string, size = 80): string | null {\r\n return this._gravatarService.buildGravatarUrl(email, size);\r\n }\r\n}\r\n","<div id=\"container\">\n <div>\n <!-- filters -->\n <div id=\"filters\">\n <auth-jwt-user-filter\n [filter]=\"filter$ | async\"\n (filterChange)=\"onFilterChange($event)\"\n ></auth-jwt-user-filter>\n </div>\n\n <!-- list -->\n @if (page$ | async; as page) {\n <div id=\"list\">\n @if (loading$ | async) {\n <div>\n <mat-progress-bar mode=\"indeterminate\"></mat-progress-bar>\n </div>\n }\n <table>\n <thead>\n <td></td>\n <td></td>\n <th i18n=\"auth-jwt-admin\">name</th>\n <th i18n=\"auth-jwt-admin\" class=\"noif-lt-md\">first</th>\n <th i18n=\"auth-jwt-admin\" class=\"noif-lt-md\">last</th>\n <th i18n=\"auth-jwt-admin\" class=\"noif-lt-md\">email</th>\n <th i18n=\"auth-jwt-admin\">roles</th>\n <th i18n=\"auth-jwt-admin\" class=\"noif-lt-md\">lock end</th>\n </thead>\n <tbody>\n @for (user of page.items; track user) {\n <tr>\n <td class=\"fit-width\">\n <button\n mat-icon-button\n type=\"button\"\n i18n-matTooltip=\"auth-jwt-admin\"\n matTooltip=\"Edit this user\"\n color=\"primary\"\n (click)=\"setActiveUser(user)\"\n >\n <mat-icon class=\"mat-primary\">mode_edit</mat-icon>\n </button>\n <button\n mat-icon-button\n type=\"button\"\n i18n-matTooltip=\"auth-jwt-admin\"\n matTooltip=\"Delete this user\"\n color=\"warn\"\n (click)=\"deleteUser(user)\"\n >\n <mat-icon class=\"mat-warn\">remove_circle</mat-icon>\n </button>\n </td>\n <td class=\"fit-width\">\n <img\n alt=\"avatar\"\n [src]=\"getGravatarUrl(user.email, 32)\"\n [alt]=\"user.userName\"\n />\n </td>\n <td>{{ user.userName }}</td>\n <td class=\"noif-lt-md\">{{ user.firstName }}</td>\n <td class=\"noif-lt-md\">{{ user.lastName }}</td>\n <td class=\"noif-lt-md\">\n <a [href]=\"'mailto:' + user.email\">{{ user.email }}</a>\n </td>\n <td>{{ user.roles.join(\" \") }}</td>\n <td class=\"noif-lt-md\">{{ user.lockoutEnd }}</td>\n </tr>\n }\n </tbody>\n </table>\n <!-- paginator -->\n <div class=\"form-row\">\n <button\n type=\"button\"\n mat-icon-button\n color=\"warn\"\n i18n-matmatTooltip=\"auth-jwt-admin\"\n matTooltip=\"Refresh list\"\n (click)=\"reset()\"\n >\n <mat-icon class=\"mat-warn\">autorenew</mat-icon>\n </button>\n <mat-paginator\n [length]=\"page.total\"\n [pageIndex]=\"page.pageNumber - 1\"\n [pageSize]=\"page.pageSize\"\n [pageSizeOptions]=\"[5, 10, 20, 50, 100]\"\n (page)=\"onPageChange($event)\"\n [showFirstLastButtons]=\"true\"\n ></mat-paginator>\n </div>\n </div>\n }\n </div>\n\n <!-- editor -->\n <mat-expansion-panel\n id=\"editor\"\n [expanded]=\"active$ | async\"\n [disabled]=\"!(active$ | async)\"\n >\n @if (active$ | async; as active) {\n <div>\n <fieldset>\n <legend>{{ active.userName }}</legend>\n <auth-jwt-user-editor\n [user]=\"active\"\n (userChange)=\"saveActiveUser($event)\"\n (editorClose)=\"resetActiveUser()\"\n ></auth-jwt-user-editor>\n </fieldset>\n </div>\n }\n </mat-expansion-panel>\n</div>\n","import { CommonModule } from '@angular/common';\nimport { NgModule } from '@angular/core';\nimport { RouterModule } from '@angular/router';\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\n\nimport { MatCardModule } from '@angular/material/card';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatCheckboxModule } from '@angular/material/checkbox';\nimport { MatExpansionModule } from '@angular/material/expansion';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { MatPaginatorModule } from '@angular/material/paginator';\nimport { MatProgressBarModule } from '@angular/material/progress-bar';\nimport { MatProgressSpinnerModule } from '@angular/material/progress-spinner';\nimport { MatSnackBarModule } from '@angular/material/snack-bar';\nimport { MatDialogModule } from '@angular/material/dialog';\n\nimport { AuthJwtLoginModule } from '@myrmidon/auth-jwt-login';\nimport { NgToolsModule } from '@myrmidon/ng-tools';\n\nimport { AuthJwtRegistrationComponent } from './components/auth-jwt-registration/auth-jwt-registration.component';\nimport { PasswordStrengthBarComponent } from './components/password-strength-bar/password-strength-bar.component';\nimport { UserFilterComponent } from './components/user-filter/user-filter.component';\nimport { UserListComponent } from './components/user-list/user-list.component';\nimport { UserEditorComponent } from './components/user-editor/user-editor.component';\n\n@NgModule({\n declarations: [\n AuthJwtRegistrationComponent,\n PasswordStrengthBarComponent,\n UserFilterComponent,\n UserListComponent,\n UserEditorComponent,\n ],\n exports: [\n AuthJwtRegistrationComponent,\n PasswordStrengthBarComponent,\n UserFilterComponent,\n UserListComponent,\n ],\n imports: [\n CommonModule,\n FormsModule,\n RouterModule,\n ReactiveFormsModule,\n // material\n MatButtonModule,\n MatCardModule,\n MatCheckboxModule,\n MatDialogModule,\n MatExpansionModule,\n MatIconModule,\n MatInputModule,\n MatPaginatorModule,\n MatProgressBarModule,\n MatProgressSpinnerModule,\n MatSnackBarModule,\n MatTooltipModule,\n AuthJwtLoginModule,\n NgToolsModule,\n ],\n})\nexport class AuthJwtAdminModule {}\n","/*\r\n * Public API Surface of auth-jwt-admin\r\n */\r\n\r\nexport * from './lib/components/auth-jwt-registration/auth-jwt-registration.component';\r\nexport * from './lib/components/password-strength-bar/password-strength-bar.component';\r\nexport * from './lib/components/user-filter/user-filter.component';\r\nexport * from './lib/components/user-list/user-list.component';\r\nexport * from './lib/components/state/user-list.repository';\r\nexport * from './lib/services/auth-jwt-account.service';\r\nexport * from './lib/validators/password.validators';\r\nexport * from './lib/auth-jwt-admin.module';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1.AuthJwtAccountService","i1","i2","i3.AuthJwtAccountService","i4.UserListRepository","i10.PasswordStrengthBarComponent","i3","i4","i5","i6","i7","i8","i1.UserListRepository","i9","i10.UserFilterComponent","i11.UserEditorComponent"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@myrmidon/auth-jwt-admin",
3
- "version": "5.0.0",
3
+ "version": "5.0.1",
4
4
  "description": "JWT-based auth services accounts admin component.",
5
5
  "keywords": [
6
6
  "JWT",