@myrmidon/auth-jwt-admin 2.0.0 → 3.0.0
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.
- package/esm2022/lib/auth-jwt-admin.module.mjs +4 -4
- package/esm2022/lib/components/auth-jwt-registration/auth-jwt-registration.component.mjs +3 -3
- package/esm2022/lib/components/confirm-dialog/confirm-dialog.component.mjs +3 -3
- package/esm2022/lib/components/password-strength-bar/password-strength-bar.component.mjs +3 -3
- package/esm2022/lib/components/state/user-list.repository.mjs +69 -87
- package/esm2022/lib/components/user-editor/user-editor.component.mjs +3 -3
- package/esm2022/lib/components/user-filter/user-filter.component.mjs +40 -31
- package/esm2022/lib/components/user-list/user-list.component.mjs +22 -25
- package/esm2022/lib/services/auth-jwt-account.service.mjs +3 -3
- package/esm2022/lib/services/dialog.service.mjs +3 -3
- package/fesm2022/myrmidon-auth-jwt-admin.mjs +174 -184
- package/fesm2022/myrmidon-auth-jwt-admin.mjs.map +1 -1
- package/lib/components/state/user-list.repository.d.ts +16 -23
- package/lib/components/user-filter/user-filter.component.d.ts +12 -10
- package/lib/components/user-list/user-list.component.d.ts +7 -6
- package/package.json +2 -2
|
@@ -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/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/state/user-list.repository.ts","../../../../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/confirm-dialog/confirm-dialog.component.ts","../../../../projects/myrmidon/auth-jwt-admin/src/lib/components/confirm-dialog/confirm-dialog.component.html","../../../../projects/myrmidon/auth-jwt-admin/src/lib/services/dialog.service.ts","../../../../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';\nimport { HttpClient, HttpParams } from '@angular/common/http';\nimport { Observable } from 'rxjs';\nimport { retry, catchError } from 'rxjs/operators';\n\nimport { DataPage, EnvService, ErrorService } from '@myrmidon/ng-tools';\nimport { User } from '@myrmidon/auth-jwt-login';\n\n/**\n * User registration model. You can expand this interface to add more data.\n */\nexport interface RegistrationModel {\n email: string;\n name: string;\n firstName?: string;\n lastName?: string;\n password: string;\n}\n\n/**\n * Result of an existing resource check.\n */\nexport interface ExistResult {\n entry: string;\n isExisting: boolean;\n}\n\n/**\n * Password change data.\n */\nexport interface PasswordChange {\n email: string;\n oldPassword: string;\n newPassword: string;\n confirmPassword: string;\n}\n\n/**\n * User filter parameters.\n */\nexport interface UserFilter {\n name?: string;\n}\n\n@Injectable({\n providedIn: 'root',\n})\nexport class AuthJwtAccountService {\n constructor(\n private _http: HttpClient,\n private _error: ErrorService,\n private _env: EnvService\n ) {}\n\n /**\n * Checks if the specified email address is registered on the server.\n * @param email email address to test.\n * @returns result.\n */\n public isEmailRegistered(email: string): Observable<ExistResult> {\n return this._http.get<ExistResult>(\n this._env.get('apiUrl') +\n 'accounts/emailexists/' +\n encodeURIComponent(email)\n );\n }\n\n /**\n * Checks if the specified user's given name is registered on the server.\n * This name is a nickname chosen by users during registration, and is the key\n * used for referencing users when talking to the server.\n * @param name name to test.\n * @returns result.\n */\n public isNameRegistered(name: string): Observable<ExistResult> {\n return this._http.get<ExistResult>(\n this._env.get('apiUrl') +\n 'accounts/nameexists/' +\n encodeURIComponent(name)\n );\n }\n\n /**\n * Register the user with the specified registration data.\n * @param registration The registration data.\n * @param confirmed True to automatically confirm the user's email address\n * without sending the confirmation email message.\n */\n public register(\n registration: RegistrationModel,\n confirmed = false\n ): Observable<any> {\n return this._http.post(\n this._env.get('apiUrl') +\n 'accounts/register' +\n (confirmed ? '?confirmed=true' : ''),\n registration\n );\n }\n\n /**\n * Resend the confirmation email to the specified address.\n * @param email address.\n */\n public resendConfirmEmail(email: string): Observable<any> {\n return this._http.get(\n this._env.get('apiUrl') +\n 'accounts/resendconfirm/' +\n encodeURIComponent(email)\n // options\n );\n }\n\n /**\n * Request a password reset for the specified email address.\n * @param email Email address.\n */\n public requestPasswordReset(email: string): Observable<any> {\n return this._http.post(\n this._env.get('apiUrl') + 'accounts/resetpassword/request',\n { email }\n );\n }\n\n public getAllUsers(): Observable<DataPage<User>> {\n return this._http\n .get<DataPage<User>>(this._env.get('apiUrl') + 'users', {\n params: new HttpParams().set('pageNumber', '1'),\n })\n .pipe(retry(3), catchError(this._error.handleError));\n }\n\n public getUsers(\n filter: UserFilter,\n pageNumber = 1,\n pageSize = 20\n ): Observable<DataPage<User>> {\n let httpParams = new HttpParams();\n httpParams = httpParams.set('pageNumber', pageNumber.toString());\n httpParams = httpParams.set('pageSize', pageSize.toString());\n if (filter.name) {\n httpParams = httpParams.set('name', filter.name);\n }\n\n return this._http\n .get<DataPage<User>>(this._env.get('apiUrl') + 'users', {\n params: httpParams,\n })\n .pipe(retry(3), catchError(this._error.handleError));\n }\n /**\n * Get the top N users matching the specified name filter.\n * @param nameFilter The user name filter.\n * @param limit The maximum number of users to get.\n */\n public getTopUsers(nameFilter: string, limit = 10): Observable<User[]> {\n let httpParams = new HttpParams();\n httpParams = httpParams.set('pageNumber', '1');\n httpParams = httpParams.set('pageSize', limit.toString());\n if (nameFilter) {\n httpParams = httpParams.set('name', nameFilter);\n }\n const options =\n httpParams.keys().length > 0\n ? {\n params: httpParams,\n }\n : {};\n\n return this._http\n .get<User[]>(this._env.get('apiUrl') + 'users', options)\n .pipe(retry(3), catchError(this._error.handleError));\n }\n\n /**\n * Get information about all the users listed in the specified names.\n * @param names User(s) names.\n */\n public getUsersFromNames(names: string[]): Observable<User[]> {\n let httpParams = new HttpParams();\n if (names && names.length > 0) {\n httpParams = httpParams.set('names', names.join(','));\n }\n const options =\n httpParams.keys().length > 0\n ? {\n params: httpParams,\n }\n : {};\n\n return this._http\n .get<User[]>(this._env.get('apiUrl') + 'users-from-names', options)\n .pipe(retry(3), catchError(this._error.handleError));\n }\n\n /**\n * Get data about the specified user.\n * @param name The user name.\n */\n public getUser(name: string): Observable<User> {\n return this._http\n .get<User>(this._env.get('apiUrl') + 'users/' + name)\n .pipe(retry(3), catchError(this._error.handleError));\n }\n\n /**\n * Update the editable data for the specified user.\n * @param user The user to update.\n */\n public updateUser(user: User): Observable<any> {\n return this._http\n .put(\n this._env.get('apiUrl') +\n 'users' +\n (user.emailConfirmed ? '?confirmed=true' : ''),\n user\n )\n .pipe(catchError(this._error.handleError));\n }\n\n /**\n * Request a password reset email for the specified email address.\n * @param email The email address to receive the reset message.\n */\n public resetPassword(email: string): Observable<any> {\n return this._http\n .post(this._env.get('apiUrl') + 'accounts/resetpassword/request', {\n email: email,\n })\n .pipe(catchError(this._error.handleError));\n }\n\n /**\n * Change the password.\n * @param change The password change data.\n */\n public changePassword(change: PasswordChange): Observable<any> {\n return this._http\n .post(this._env.get('apiUrl') + 'accounts/changepassword', change)\n .pipe(catchError(this._error.handleError));\n }\n\n /**\n * Delete the user with the specified username.\n * @param name The user name.\n */\n public deleteUser(name: string): Observable<any> {\n return this._http\n .delete(this._env.get('apiUrl') + 'accounts/' + name)\n .pipe(catchError(this._error.handleError));\n }\n}\n","import {\n Component,\n OnChanges,\n EventEmitter,\n Input,\n Output,\n SimpleChange,\n} from '@angular/core';\n\n@Component({\n selector: 'auth-jwt-password-strength-bar',\n templateUrl: './password-strength-bar.component.html',\n styleUrls: ['./password-strength-bar.component.css'],\n})\nexport class PasswordStrengthBarComponent implements OnChanges {\n private _colors = ['#F00', '#F90', '#FF0', '#9F0', '#0F0'];\n\n @Input() passwordToCheck: string | undefined;\n\n @Output() strengthChange = new EventEmitter<number>();\n\n public bars: string[];\n\n constructor() {\n this.strengthChange = new EventEmitter<number>();\n this.bars = [];\n }\n\n private measureStrength(p: string): number {\n let force = 0;\n const regex = /[$-/:-?{-~!\"^_`\\[\\]]/g; // \"\n\n const lowerLetters = /[a-z]+/.test(p);\n const upperLetters = /[A-Z]+/.test(p);\n const numbers = /[0-9]+/.test(p);\n const symbols = regex.test(p);\n\n const flags = [lowerLetters, upperLetters, numbers, symbols];\n\n let passedMatches = 0;\n for (const flag of flags) {\n passedMatches += flag === true ? 1 : 0;\n }\n\n force += 2 * p.length + (p.length >= 10 ? 1 : 0);\n force += passedMatches * 10;\n\n // penalty (short password)\n force = p.length <= 6 ? Math.min(force, 10) : force;\n\n // penalty (poor letiety of characters)\n force = passedMatches === 1 ? Math.min(force, 10) : force;\n force = passedMatches === 2 ? Math.min(force, 20) : force;\n force = passedMatches === 3 ? Math.min(force, 40) : force;\n\n return force;\n }\n\n private getColor(s: number) {\n let idx = 0;\n if (s <= 10) {\n idx = 0;\n } else if (s <= 20) {\n idx = 1;\n } else if (s <= 30) {\n idx = 2;\n } else if (s <= 40) {\n idx = 3;\n } else {\n idx = 4;\n }\n return {\n idx: idx + 1,\n col: this._colors[idx],\n };\n }\n\n ngOnChanges(changes: { [propName: string]: SimpleChange }): void {\n const password = changes['passwordToCheck'].currentValue;\n this.setBarColors(5, '#DDD');\n if (password) {\n const strength = this.measureStrength(password);\n const c = this.getColor(strength);\n this.setBarColors(c.idx, c.col);\n this.strengthChange.emit(strength);\n }\n }\n\n private setBarColors(count: number, col: string) {\n for (let n = 0; n < count; n++) {\n this.bars[n] = col;\n }\n }\n}\n","<div id=\"strength\">\n <small>strength:</small>\n <ul id=\"strengthBar\">\n <li class=\"point\" [style.background-color]=\"bars[0]\"></li>\n <li class=\"point\" [style.background-color]=\"bars[1]\"></li>\n <li class=\"point\" [style.background-color]=\"bars[2]\"></li>\n <li class=\"point\" [style.background-color]=\"bars[3]\"></li>\n <li class=\"point\" [style.background-color]=\"bars[4]\"></li>\n </ul>\n</div>\n","import { Component, EventEmitter, 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\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 * 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 constructor(\r\n formBuilder: FormBuilder,\r\n private _snackbar: MatSnackBar,\r\n private _accountService: AuthJwtAccountService\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)\r\n .pipe(take(1))\r\n .subscribe({\r\n next: () => {\r\n this.busy = false;\r\n this._snackbar.open($localize`Registration succeeded`, 'OK');\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($localize`Registration error`, 'OK');\r\n },\r\n });\r\n }\r\n}\r\n","<div>\r\n <form role=\"form\" [formGroup]=\"form\" (submit)=\"onSubmit()\">\r\n <fieldset>\r\n <legend i18n>registration</legend>\r\n <!-- email -->\r\n <div class=\"form-row\">\r\n <mat-form-field>\r\n <mat-label i18n>email</mat-label>\r\n <input\r\n matInput\r\n type=\"email\"\r\n id=\"email\"\r\n maxlength=\"256\"\r\n required\r\n autofocus\r\n spellcheck=\"false\"\r\n [formControl]=\"email\"\r\n />\r\n <mat-error\r\n i18n\r\n *ngIf=\"\r\n $any(email).errors?.required && (email.dirty || email.touched)\r\n \"\r\n >email required</mat-error\r\n >\r\n <mat-error\r\n i18n\r\n *ngIf=\"$any(email).errors?.email && (email.dirty || email.touched)\"\r\n >invalid email</mat-error\r\n >\r\n <mat-error\r\n i18n\r\n *ngIf=\"\r\n $any(email).errors?.uniqueEmail && (email.dirty || email.touched)\r\n \"\r\n >email already registered</mat-error\r\n >\r\n </mat-form-field>\r\n <mat-icon *ngIf=\"email.pending\">hourglass</mat-icon>\r\n </div>\r\n\r\n <!-- name -->\r\n <div class=\"form-row\">\r\n <mat-form-field>\r\n <mat-label i18n>username</mat-label>\r\n <input\r\n matInput\r\n type=\"text\"\r\n id=\"name\"\r\n maxlength=\"50\"\r\n required\r\n pattern=\"^[a-zA-Z][a-zA-Z0-9]{2,49}$\"\r\n spellcheck=\"false\"\r\n [formControl]=\"name\"\r\n />\r\n <mat-error\r\n i18n\r\n *ngIf=\"$any(name).errors?.required && (name.dirty || name.touched)\"\r\n >username required</mat-error\r\n >\r\n <mat-error\r\n i18n\r\n *ngIf=\"$any(name).errors?.pattern && (name.dirty || name.touched)\"\r\n >invalid username</mat-error\r\n >\r\n <mat-error\r\n i18n\r\n *ngIf=\"\r\n $any(name).errors?.uniqueName && (name.dirty || name.touched)\r\n \"\r\n >username already registered</mat-error\r\n >\r\n </mat-form-field>\r\n <mat-icon *ngIf=\"name.pending\">hourglass</mat-icon>\r\n </div>\r\n\r\n <!-- first name -->\r\n <div>\r\n <mat-form-field>\r\n <mat-label i18n>first name</mat-label>\r\n <input\r\n matInput\r\n type=\"text\"\r\n id=\"firstName\"\r\n maxlength=\"50\"\r\n required\r\n spellcheck=\"false\"\r\n [formControl]=\"firstName\"\r\n />\r\n <mat-error\r\n i18n\r\n *ngIf=\"\r\n firstName.hasError('required') &&\r\n (firstName.dirty || firstName.touched)\r\n \"\r\n class=\"text-danger small\"\r\n >\r\n first name required\r\n </mat-error>\r\n </mat-form-field>\r\n </div>\r\n\r\n <!-- last name -->\r\n <div>\r\n <mat-form-field>\r\n <mat-label i18n>last name</mat-label>\r\n <input\r\n matInput\r\n type=\"text\"\r\n id=\"lastName\"\r\n maxlength=\"50\"\r\n required\r\n spellcheck=\"false\"\r\n [formControl]=\"lastName\"\r\n />\r\n <mat-error\r\n i18n\r\n *ngIf=\"\r\n lastName.hasError('required') &&\r\n (lastName.dirty || lastName.touched)\r\n \"\r\n class=\"text-danger small\"\r\n >\r\n last name required\r\n </mat-error>\r\n </mat-form-field>\r\n </div>\r\n\r\n <!-- <div [formGroup]=\"passwords\"> -->\r\n <!-- password -->\r\n <div>\r\n <mat-form-field>\r\n <mat-label i18n>password</mat-label>\r\n <input\r\n matInput\r\n type=\"password\"\r\n name=\"password\"\r\n autocomplete=\"new-password\"\r\n maxlength=\"50\"\r\n required\r\n spellcheck=\"false\"\r\n [formControl]=\"password\"\r\n />\r\n <auth-jwt-password-strength-bar [passwordToCheck]=\"password.value\">\r\n </auth-jwt-password-strength-bar>\r\n <mat-error\r\n i18n\r\n *ngIf=\"\r\n $any(password).errors?.required &&\r\n (password.dirty || password.touched)\r\n \"\r\n >password required</mat-error\r\n >\r\n <mat-error\r\n i18n\r\n *ngIf=\"\r\n $any(password).errors?.passwordtooshort &&\r\n (password.dirty || password.touched)\r\n \"\r\n >at least 8 characters</mat-error\r\n >\r\n <mat-error\r\n i18n\r\n *ngIf=\"\r\n $any(password).errors?.noupperinpassword &&\r\n (password.dirty || password.touched)\r\n \"\r\n >at least 1 uppercase letter</mat-error\r\n >\r\n <mat-error\r\n i18n\r\n *ngIf=\"\r\n $any(password).errors?.nolowerinpassword &&\r\n (password.dirty || password.touched)\r\n \"\r\n >at least 1 lowercase letter</mat-error\r\n >\r\n <mat-error\r\n i18n\r\n *ngIf=\"\r\n $any(password).errors?.nosymbolinpassword &&\r\n (password.dirty || password.touched)\r\n \"\r\n >at least 1 punctuation/symbol</mat-error\r\n >\r\n </mat-form-field>\r\n </div>\r\n\r\n <!-- confirm password -->\r\n <div>\r\n <mat-form-field>\r\n <mat-label i18n>confirm password</mat-label>\r\n <input\r\n matInput\r\n type=\"password\"\r\n name=\"confirmPassword\"\r\n maxlength=\"50\"\r\n required\r\n spellcheck=\"false\"\r\n [formControl]=\"confirmPassword\"\r\n />\r\n </mat-form-field>\r\n </div>\r\n <div\r\n i18n\r\n *ngIf=\"form.errors?.areequal && confirmPassword.touched\"\r\n style=\"color: red\"\r\n >\r\n password differs from confirmation password\r\n </div>\r\n\r\n <button i18n\r\n mat-raised-button\r\n type=\"submit\"\r\n color=\"primary\"\r\n [disabled]=\"\r\n form.invalid || form.pristine || busy || name.pending || email.pending\r\n \"\r\n >\r\n register\r\n </button>\r\n <mat-progress-spinner diameter=\"20\" *ngIf=\"busy\"></mat-progress-spinner>\r\n </fieldset>\r\n </form>\r\n\r\n <details>\r\n <summary i18n>Hints</summary>\r\n <p i18n>\r\n To register a new user, you must provide his email address, choose a\r\n password, and choose a username, which must be unique (you will be\r\n notified if another user has already taken that name). The username must\r\n include only letters/digits, start with a letter, and be no shorter than 3\r\n characters, nor longer than 50.\r\n </p>\r\n <p i18n>\r\n To promote a decent security level, the password must include at least 8\r\n characters, uppercase and lowercase letters, digits, and punctuation (like\r\n dashes, stops, parentheses, etc.).\r\n </p>\r\n <p i18n>\r\n Once registered, if messaging is enabled on the server side the user will\r\n receive an email message to the email address you specified; he will have\r\n to click on the provided link to complete the registration process.\r\n Otherwise, you should edit the newly created user and confirm the email\r\n registration.\r\n </p>\r\n </details>\r\n</div>\r\n","import { Injectable } from '@angular/core';\r\nimport {\r\n BehaviorSubject,\r\n combineLatest,\r\n debounceTime,\r\n map,\r\n Observable,\r\n take,\r\n} from 'rxjs';\r\n\r\nimport { createStore, select, withProps } from '@ngneat/elf';\r\nimport {\r\n deleteAllEntities,\r\n selectActiveEntity,\r\n setActiveId,\r\n updateEntities,\r\n upsertEntities,\r\n withActiveId,\r\n withEntities,\r\n} from '@ngneat/elf-entities';\r\nimport {\r\n deleteAllPages,\r\n hasPage,\r\n PaginationData,\r\n selectCurrentPageEntities,\r\n selectPaginationData,\r\n setCurrentPage,\r\n setPage,\r\n updatePaginationData,\r\n withPagination,\r\n} from '@ngneat/elf-pagination';\r\nimport {\r\n selectRequestStatus,\r\n StatusState,\r\n updateRequestStatus,\r\n withRequestsCache,\r\n withRequestsStatus,\r\n} from '@ngneat/elf-requests';\r\n\r\nimport { User } from '@myrmidon/auth-jwt-login';\r\nimport { DataPage } from '@myrmidon/ng-tools';\r\n\r\nimport {\r\n AuthJwtAccountService,\r\n UserFilter,\r\n} from '../../services/auth-jwt-account.service';\r\n\r\nconst PAGE_SIZE = 20;\r\n\r\nexport interface UserListProps {\r\n filter: UserFilter;\r\n}\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class UserListRepository {\r\n private _store;\r\n private _lastPageSize: number;\r\n private _loading$: BehaviorSubject<boolean>;\r\n private _saving$: BehaviorSubject<boolean>;\r\n\r\n public activeUser$: Observable<User | undefined>;\r\n public filter$: Observable<UserFilter>;\r\n public pagination$: Observable<PaginationData & { data: User[] }>;\r\n public status$: Observable<StatusState>;\r\n public loading$: Observable<boolean>;\r\n public saving$: Observable<boolean>;\r\n\r\n constructor(private _accService: AuthJwtAccountService) {\r\n // create store\r\n this._store = this.createStore();\r\n this._lastPageSize = PAGE_SIZE;\r\n this._loading$ = new BehaviorSubject<boolean>(false);\r\n this._saving$ = new BehaviorSubject<boolean>(false);\r\n this.loading$ = this._loading$.asObservable();\r\n this.saving$ = this._saving$.asObservable();\r\n // combine pagination parameters with page data for our consumers\r\n this.pagination$ = combineLatest([\r\n this._store.pipe(selectPaginationData()),\r\n this._store.pipe(selectCurrentPageEntities()),\r\n ]).pipe(\r\n map(([pagination, data]) => ({ ...pagination, data })),\r\n debounceTime(0)\r\n );\r\n // the active user, if required\r\n this.activeUser$ = this._store.pipe(selectActiveEntity());\r\n // the filter, if required\r\n this.filter$ = this._store.pipe(select((state) => state.filter));\r\n this.filter$.subscribe((filter) => {\r\n // when filter changed, reset any existing page and move to page 1\r\n const paginationData = this._store.getValue().pagination;\r\n this._store.update(deleteAllPages());\r\n // load page 1\r\n this.loadPage(1, paginationData.perPage);\r\n });\r\n\r\n // the request status\r\n this.status$ = this._store.pipe(selectRequestStatus('user-list'));\r\n\r\n // load page 1 and subscribe to pagination\r\n this.loadPage(1, PAGE_SIZE);\r\n this.pagination$.subscribe(console.log);\r\n }\r\n\r\n private createStore(): typeof store {\r\n const store = createStore(\r\n { name: 'user-list' },\r\n withProps<UserListProps>({\r\n filter: {},\r\n }),\r\n withEntities<User, 'userName'>({ idKey: 'userName' }),\r\n withActiveId(),\r\n withRequestsCache<'user-list'>(),\r\n withRequestsStatus(),\r\n withPagination()\r\n );\r\n\r\n return store;\r\n }\r\n\r\n private adaptPage(page: DataPage<User>): PaginationData & { data: User[] } {\r\n // adapt the server page DataPage<T> to Elf pagination\r\n return {\r\n currentPage: page.pageNumber,\r\n perPage: page.pageSize,\r\n lastPage: page.pageCount,\r\n total: page.total,\r\n data: page.items,\r\n };\r\n }\r\n\r\n private addPage(response: PaginationData & { data: User[] }): void {\r\n const { data, ...paginationData } = response;\r\n this._store.update(\r\n upsertEntities(data),\r\n updatePaginationData(paginationData),\r\n setPage(\r\n paginationData.currentPage,\r\n data.map((c) => c.userName)\r\n )\r\n );\r\n }\r\n\r\n public loadPage(pageNumber: number, pageSize?: number): void {\r\n if (!pageSize) {\r\n pageSize = PAGE_SIZE;\r\n }\r\n // if the page exists and page size is the same, just move to it\r\n if (\r\n this._store.query(hasPage(pageNumber)) &&\r\n pageSize === this._lastPageSize\r\n ) {\r\n console.log('Page exists: ' + pageNumber);\r\n this._store.update(setCurrentPage(pageNumber));\r\n return;\r\n }\r\n\r\n // reset cached pages if page size changed\r\n if (this._lastPageSize !== pageSize) {\r\n this._store.update(deleteAllPages());\r\n this._lastPageSize = pageSize;\r\n }\r\n\r\n // load page from server\r\n this._store.update(updateRequestStatus('user-list', 'pending'));\r\n this._loading$.next(true);\r\n this._accService\r\n .getUsers(this._store.getValue().filter, pageNumber, pageSize)\r\n .pipe(take(1))\r\n .subscribe((page) => {\r\n this._loading$.next(false);\r\n this.addPage({ ...this.adaptPage(page), data: page.items });\r\n this._store.update(updateRequestStatus('user-list', 'success'));\r\n });\r\n }\r\n\r\n public setFilter(filter: UserFilter): void {\r\n this._store.update((state) => ({ ...state, filter: filter }));\r\n }\r\n\r\n clearCache() {\r\n this._store.update(deleteAllEntities(), deleteAllPages());\r\n }\r\n\r\n public setActive(name: string | null): void {\r\n this._store.update(setActiveId(name));\r\n }\r\n\r\n public updateActive(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.update(upsertEntities(user));\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 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.clearCache();\r\n this.loadPage(1);\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 { Component, Input, OnInit } from '@angular/core';\nimport { FormBuilder, FormControl, FormGroup } from '@angular/forms';\nimport { Observable } from 'rxjs';\n\nimport { UserFilter } from '../../services/auth-jwt-account.service';\nimport { UserListRepository } from '../state/user-list.repository';\n\n@Component({\n selector: 'auth-jwt-user-filter',\n templateUrl: './user-filter.component.html',\n styleUrls: ['./user-filter.component.css'],\n})\nexport class UserFilterComponent implements OnInit {\n @Input()\n public disabled: boolean | undefined;\n\n public filter$: Observable<UserFilter>;\n\n public name: FormControl<string | null>;\n public form: FormGroup;\n\n constructor(\n formBuilder: FormBuilder,\n private _repository: UserListRepository\n ) {\n this.filter$ = _repository.filter$;\n\n // form\n this.name = formBuilder.control<string | null>(null);\n this.form = formBuilder.group({\n name: this.name,\n });\n }\n\n ngOnInit(): void {\n this.filter$.subscribe((f) => {\n this.updateForm(f);\n });\n }\n\n private updateForm(filter: UserFilter): void {\n this.name.setValue(filter.name || null);\n this.form.markAsPristine();\n }\n\n public reset(): void {\n this.form.reset();\n this.apply();\n }\n\n private getFilter(): UserFilter {\n return {\n name: this.name.value?.trim(),\n };\n }\n\n public apply(): void {\n if (this.form.invalid) {\n return;\n }\n const filter = this.getFilter();\n\n // update filter in state\n this._repository.setFilter(filter);\n }\n}\n","<form [formGroup]=\"form\" (submit)=\"apply()\" ng-disabled=\"disabled\">\n <div class=\"form-row\">\n <mat-form-field>\n <mat-label i18n>name or ID</mat-label>\n <input matInput [formControl]=\"name\" />\n <button\n mat-icon-button\n matSuffix\n type=\"button\"\n (click)=\"reset()\"\n color=\"warn\"\n i18n-matTooltip\n matTooltip=\"Reset filters\"\n [disabled]=\"disabled\"\n >\n <mat-icon>clear</mat-icon>\n </button>\n </mat-form-field>\n\n <button\n style=\"margin-top: -20px\"\n type=\"submit\"\n mat-icon-button\n color=\"primary\"\n [disabled]=\"disabled\"\n i18n-matTooltip\n matTooltip=\"Apply filters\"\n >\n <mat-icon>check_circle</mat-icon>\n </button>\n </div>\n</form>\n","import { Component, OnInit, Inject, Optional } from '@angular/core';\r\nimport { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog';\r\n\r\n// https://medium.com/@tarik.nzl/making-use-of-dialogs-in-material-2-mddialog-7533d27df41\r\n\r\n@Component({\r\n // https://github.com/angular/components/issues/7718\r\n // selector: 'cadmus-confirm-dialog',\r\n templateUrl: './confirm-dialog.component.html',\r\n styleUrls: ['./confirm-dialog.component.css'],\r\n})\r\nexport class ConfirmDialogComponent implements OnInit {\r\n public title: string;\r\n public prompt: string;\r\n public ok: string;\r\n public cancel: string;\r\n\r\n constructor(\r\n public dialogRef: MatDialogRef<ConfirmDialogComponent>,\r\n @Optional() @Inject(MAT_DIALOG_DATA) public data: any\r\n ) {\r\n this.title = $localize`Confirm`;\r\n this.prompt = $localize`Confirm operation?`;\r\n this.ok = $localize`yes`;\r\n this.cancel = $localize`no`;\r\n }\r\n\r\n ngOnInit() {}\r\n}\r\n","<h1 mat-dialog-title>{{ title }}</h1>\r\n<mat-dialog-content>\r\n {{ prompt }}\r\n</mat-dialog-content>\r\n<mat-dialog-actions>\r\n <button\r\n type=\"button\"\r\n mat-raised-button\r\n color=\"warn\"\r\n (click)=\"dialogRef.close(true)\"\r\n >\r\n {{ ok }}\r\n </button>\r\n <button type=\"button\" mat-button (click)=\"dialogRef.close()\">\r\n {{ cancel }}\r\n </button>\r\n</mat-dialog-actions>\r\n","import { Injectable } from '@angular/core';\r\nimport { MatDialog, MatDialogRef } from '@angular/material/dialog';\r\nimport { ConfirmDialogComponent } from '../components/confirm-dialog/confirm-dialog.component';\r\nimport { Observable } from 'rxjs';\r\n\r\n// https://medium.com/@tarik.nzl/making-use-of-dialogs-in-material-2-mddialog-7533d27df41\r\n\r\n/**\r\n * This service acts as a wrapper for MatDialog to simplify the process of calling\r\n * the dialog and subscribing to it. What it will do is create an Instance of\r\n * MatDialog with our custom component (ConfirmDialogComponent). Then it will set\r\n * any public properties it needs to by setting the properties on the\r\n * componentInstance object. It will return the observable afterClosed()\r\n * to the caller so they can subscribe to it. This will emit an event whenever\r\n * the dialog is closed.\r\n */\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class DialogService {\r\n\r\n constructor(private dialog: MatDialog) { }\r\n\r\n public confirm(title: string, prompt: string, ok = $localize`yes`, cancel = $localize`no`):\r\n Observable<boolean> {\r\n\r\n let dialogRef: MatDialogRef<ConfirmDialogComponent>;\r\n\r\n dialogRef = this.dialog.open(ConfirmDialogComponent);\r\n dialogRef.componentInstance.title = title;\r\n dialogRef.componentInstance.prompt = prompt;\r\n dialogRef.componentInstance.ok = ok;\r\n dialogRef.componentInstance.cancel = cancel;\r\n\r\n return dialogRef.afterClosed();\r\n }\r\n}\r\n","import { Component, OnInit, Input, Output, EventEmitter } from '@angular/core';\nimport {\n UntypedFormGroup,\n UntypedFormControl,\n UntypedFormBuilder,\n Validators,\n} from '@angular/forms';\nimport { AuthJwtService, User } from '@myrmidon/auth-jwt-login';\n\n@Component({\n selector: 'auth-jwt-user-editor',\n templateUrl: './user-editor.component.html',\n styleUrls: ['./user-editor.component.css'],\n})\nexport class UserEditorComponent implements OnInit {\n private _user: User | undefined;\n\n public email: UntypedFormControl;\n public emailConfirmed: UntypedFormControl;\n public lockoutEnabled: UntypedFormControl;\n public firstName: UntypedFormControl;\n public lastName: UntypedFormControl;\n public roles: UntypedFormControl;\n public form: UntypedFormGroup;\n\n public unlocked: boolean | undefined;\n\n @Input() public set user(value: User | undefined) {\n this._user = value;\n this.updateForm(value);\n }\n public get user(): User | undefined {\n return this._user;\n }\n\n @Output() userChange: EventEmitter<User>;\n @Output() editorClose: EventEmitter<any>;\n\n constructor(formBuilder: UntypedFormBuilder, private _authService: AuthJwtService) {\n // events\n this.userChange = new EventEmitter<User>();\n this.editorClose = new EventEmitter<any>();\n // form\n this.email = formBuilder.control(null, [\n Validators.required,\n Validators.email,\n ]);\n this.emailConfirmed = formBuilder.control(false);\n this.lockoutEnabled = formBuilder.control(false);\n this.firstName = formBuilder.control(null, [\n Validators.required,\n Validators.maxLength(50),\n ]);\n this.lastName = formBuilder.control(null, [\n Validators.required,\n Validators.maxLength(50),\n ]);\n this.roles = formBuilder.control(null, Validators.maxLength(200));\n\n this.form = formBuilder.group({\n email: this.email,\n emailConfirmed: this.emailConfirmed,\n lockoutEnabled: this.lockoutEnabled,\n firstName: this.firstName,\n lastName: this.lastName,\n roles: this.roles,\n });\n }\n\n ngOnInit(): void {}\n\n private updateForm(user: User | undefined): void {\n if (!user) {\n this.form.reset();\n } else {\n this.email.setValue(user.email);\n this.emailConfirmed.setValue(user.emailConfirmed);\n this.lockoutEnabled.setValue(user.lockoutEnabled);\n this.firstName.setValue(user.firstName);\n this.lastName.setValue(user.lastName);\n if (user.roles?.length > 0) {\n this.roles.setValue(user.roles.join(' '));\n } else {\n this.roles.setValue(null);\n }\n }\n }\n\n private getUserFromForm(): User {\n return {\n userName: this._user?.userName || '',\n email: this.email.value,\n emailConfirmed: this.emailConfirmed.value,\n lockoutEnabled: this.lockoutEnabled.value,\n firstName: this.firstName.value,\n lastName: this.lastName.value,\n roles: this.roles.value\n ? this.roles.value.split(' ').filter((s: string) => s)\n : [],\n };\n }\n\n public endLockout(): void {\n if (this.unlocked) {\n return;\n }\n this._user!.lockoutEnd = this._authService.getUTCDate();\n this.unlocked = true;\n }\n\n public close(): void {\n this.editorClose.emit();\n }\n\n public save(): void {\n if (this.form.invalid) {\n return;\n }\n this.userChange.emit(this.getUserFromForm());\n }\n}\n","<form [formGroup]=\"form\" (submit)=\"save()\">\n <div class=\"form-row\">\n <!-- email -->\n <mat-form-field>\n <mat-label i18n>email</mat-label>\n <input type=\"text\" matInput [formControl]=\"email\" />\n <mat-error\n i18n\n *ngIf=\"email.hasError('required') && (email.dirty || email.touched)\"\n >\n email address required\n </mat-error>\n <mat-error\n i18n\n *ngIf=\"email.hasError('pattern') && (email.dirty || email.touched)\"\n >\n invalid email address\n </mat-error>\n </mat-form-field>\n\n <!-- emailConfirmed -->\n <mat-checkbox [formControl]=\"emailConfirmed\" i18n\n >email address confirmed</mat-checkbox\n >\n </div>\n\n <!-- lockoutEnabled -->\n <div class=\"form-row\">\n <mat-checkbox [formControl]=\"lockoutEnabled\" i18n\n >lockout enabled</mat-checkbox\n >\n <button\n mat-icon-button\n color=\"primary\"\n (click)=\"endLockout()\"\n [disabled]=\"unlocked\"\n i18n-matTooltip\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>first name</mat-label>\n <input type=\"text\" matInput [formControl]=\"firstName\" />\n <mat-error\n i18n\n *ngIf=\"\n firstName.hasError('required') &&\n (firstName.dirty || firstName.touched)\n \"\n >\n first name required\n </mat-error>\n <mat-error\n i18n\n *ngIf=\"\n firstName.hasError('maxlength') &&\n (firstName.dirty || firstName.touched)\n \"\n >\n first name too long\n </mat-error>\n </mat-form-field>\n\n <!-- lastName -->\n <mat-form-field>\n <mat-label i18n>last name</mat-label>\n <input type=\"text\" matInput [formControl]=\"lastName\" />\n <mat-error\n i18n\n *ngIf=\"\n lastName.hasError('required') && (lastName.dirty || lastName.touched)\n \"\n >\n last name required\n </mat-error>\n <mat-error\n i18n\n *ngIf=\"\n lastName.hasError('maxlength') && (lastName.dirty || lastName.touched)\n \"\n >\n last name too long\n </mat-error>\n </mat-form-field>\n </div>\n\n <!-- roles -->\n <div>\n <mat-form-field style=\"width: 16em\">\n <mat-label i18n>roles</mat-label>\n <input type=\"text\" matInput [formControl]=\"roles\" />\n <mat-error\n i18n\n *ngIf=\"roles.hasError('maxlength') && (roles.dirty || roles.touched)\"\n >\n too long\n </mat-error>\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\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 [disabled]=\"form.invalid\"\n i18n-matTooltip\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 { take } from 'rxjs/operators';\r\nimport '@angular/localize/init';\r\n\r\nimport { PaginationData } from '@ngneat/elf-pagination';\r\n\r\nimport { GravatarService, User } from '@myrmidon/auth-jwt-login';\r\n\r\nimport { DialogService } from '../../services/dialog.service';\r\nimport { UserListRepository } from '../state/user-list.repository';\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 pagination$: Observable<PaginationData & { data: User[] }>;\r\n public active$: Observable<User | undefined>;\r\n public loading$: Observable<boolean>;\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.pagination$ = _repository.pagination$;\r\n this.active$ = _repository.activeUser$;\r\n this.loading$ = _repository.loading$;\r\n }\r\n\r\n public pageChange(event: PageEvent): void {\r\n this._repository.loadPage(event.pageIndex + 1, event.pageSize);\r\n }\r\n\r\n public deleteUser(user: User): void {\r\n this._dialogService\r\n .confirm($localize`Confirm`, $localize`Delete user ${user.userName}?`)\r\n .pipe(take(1))\r\n .subscribe((yes) => {\r\n if (!yes) {\r\n return;\r\n }\r\n this._repository.deleteUser(user.userName).finally(() => {\r\n this._repository.clearCache();\r\n this._repository.loadPage(1);\r\n });\r\n });\r\n }\r\n\r\n public setActiveUser(user: User | null): void {\r\n this._repository.setActive(user?.userName || null);\r\n }\r\n\r\n public resetActiveUser(): void {\r\n this._repository.setActive(null);\r\n }\r\n\r\n public saveActiveUser(user: User): void {\r\n this._repository.updateActive(user);\r\n this._repository.setActive(null);\r\n }\r\n\r\n public onUserEditorClose(): void {\r\n this._repository.setActive(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 public clearCache(): void {\r\n this._repository.clearCache();\r\n this._repository.loadPage(1);\r\n }\r\n}\r\n","<div id=\"container\">\n <div>\n <!-- filters -->\n <div id=\"filters\">\n <auth-jwt-user-filter></auth-jwt-user-filter>\n </div>\n\n <!-- list -->\n <div id=\"list\" *ngIf=\"pagination$ | async as pagination\">\n <div *ngIf=\"loading$ | async\" gdArea=\"progress\">\n <mat-progress-bar mode=\"indeterminate\"></mat-progress-bar>\n </div>\n <table>\n <thead>\n <td></td>\n <td></td>\n <th i18n>name</th>\n <th i18n class=\"noif-lt-md\">first</th>\n <th i18n class=\"noif-lt-md\">last</th>\n <th i18n class=\"noif-lt-md\">email</th>\n <th i18n>roles</th>\n <th i18n class=\"noif-lt-md\">lock end</th>\n </thead>\n <tbody>\n <tr *ngFor=\"let user of pagination.data\">\n <td>\n <button\n mat-icon-button\n type=\"button\"\n i18n-matTooltip\n matTooltip=\"Edit this user\"\n color=\"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\n matTooltip=\"Delete this user\"\n color=\"warn\"\n (click)=\"deleteUser(user)\"\n >\n <mat-icon>remove_circle</mat-icon>\n </button>\n </td>\n <td>\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 </tbody>\n </table>\n\n <!-- paginator -->\n <div id=\"paginator\" class=\"form-row\">\n <button\n type=\"button\"\n mat-icon-button\n color=\"warn\"\n i18n-matmatTooltip\n matTooltip=\"Clear items cache\"\n (click)=\"clearCache()\"\n >\n <mat-icon>autorenew</mat-icon>\n </button>\n\n <mat-paginator\n gdArea=\"pager\"\n gdAlignColumns=\"center\"\n gdAlignRows=\"start\"\n [length]=\"pagination.total\"\n [pageSize]=\"pagination.perPage\"\n [pageSizeOptions]=\"[20, 50, 75, 100]\"\n [pageIndex]=\"pagination.currentPage - 1\"\n [showFirstLastButtons]=\"true\"\n (page)=\"pageChange($event)\"\n ></mat-paginator>\n </div>\n </div>\n </div>\n\n <!-- editor -->\n <mat-expansion-panel\n id=\"editor\"\n [expanded]=\"active$ | async\"\n [disabled]=\"!(active$ | async)\"\n >\n <div *ngIf=\"active$ | async as active\">\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 </mat-expansion-panel>\n</div>\n","import { CommonModule } from '@angular/common';\r\nimport { HttpClientModule } from '@angular/common/http';\r\nimport { NgModule } from '@angular/core';\r\nimport { RouterModule } from '@angular/router';\r\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\r\n\r\nimport { MatCardModule } from '@angular/material/card';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatCheckboxModule } from '@angular/material/checkbox';\r\nimport {MatExpansionModule} from '@angular/material/expansion';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\nimport { MatPaginatorModule } from '@angular/material/paginator';\r\nimport { MatProgressBarModule } from '@angular/material/progress-bar';\r\nimport { MatProgressSpinnerModule } from '@angular/material/progress-spinner';\r\nimport { MatSnackBarModule } from '@angular/material/snack-bar';\r\nimport { MatDialogModule } from '@angular/material/dialog';\r\n\r\nimport { AuthJwtLoginModule } from '@myrmidon/auth-jwt-login';\r\nimport { NgToolsModule } from '@myrmidon/ng-tools';\r\n\r\nimport { AuthJwtRegistrationComponent } from './components/auth-jwt-registration/auth-jwt-registration.component';\r\nimport { PasswordStrengthBarComponent } from './components/password-strength-bar/password-strength-bar.component';\r\nimport { UserFilterComponent } from './components/user-filter/user-filter.component';\r\nimport { UserListComponent } from './components/user-list/user-list.component';\r\nimport { ConfirmDialogComponent } from './components/confirm-dialog/confirm-dialog.component';\r\nimport { UserEditorComponent } from './components/user-editor/user-editor.component';\r\n\r\n@NgModule({\r\n declarations: [\r\n AuthJwtRegistrationComponent,\r\n PasswordStrengthBarComponent,\r\n UserFilterComponent,\r\n UserListComponent,\r\n ConfirmDialogComponent,\r\n UserEditorComponent,\r\n ],\r\n imports: [\r\n CommonModule,\r\n HttpClientModule,\r\n FormsModule,\r\n RouterModule,\r\n ReactiveFormsModule,\r\n // material\r\n MatButtonModule,\r\n MatCardModule,\r\n MatCheckboxModule,\r\n MatDialogModule,\r\n MatExpansionModule,\r\n MatIconModule,\r\n MatInputModule,\r\n MatPaginatorModule,\r\n MatProgressBarModule,\r\n MatProgressSpinnerModule,\r\n MatSnackBarModule,\r\n MatTooltipModule,\r\n AuthJwtLoginModule,\r\n NgToolsModule\r\n ],\r\n exports: [\r\n AuthJwtRegistrationComponent,\r\n PasswordStrengthBarComponent,\r\n UserFilterComponent,\r\n UserListComponent\r\n ],\r\n})\r\nexport class AuthJwtAdminModule {}\r\n","/*\n * Public API Surface of auth-jwt-admin\n */\n\nexport * from './lib/components/auth-jwt-registration/auth-jwt-registration.component';\nexport * from './lib/components/password-strength-bar/password-strength-bar.component';\nexport * from './lib/components/user-filter/user-filter.component';\nexport * from './lib/components/user-list/user-list.component';\nexport * from './lib/components/state/user-list.repository';\nexport * from './lib/services/auth-jwt-account.service';\nexport * from './lib/validators/password.validators';\nexport * from './lib/auth-jwt-admin.module';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1","i2","i3.AuthJwtAccountService","i10.PasswordStrengthBarComponent","take","i1.AuthJwtAccountService","i2.UserListRepository","i3","i4","i5","i6","i7","i9","i1.UserListRepository","i2.DialogService","i8","i10","i11.UserFilterComponent","i12.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/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/state/user-list.repository.ts","../../../../projects/myrmidon/auth-jwt-admin/src/lib/components/confirm-dialog/confirm-dialog.component.ts","../../../../projects/myrmidon/auth-jwt-admin/src/lib/components/confirm-dialog/confirm-dialog.component.html","../../../../projects/myrmidon/auth-jwt-admin/src/lib/services/dialog.service.ts","../../../../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';\nimport { HttpClient, HttpParams } from '@angular/common/http';\nimport { Observable } from 'rxjs';\nimport { retry, catchError } from 'rxjs/operators';\n\nimport { DataPage, EnvService, ErrorService } from '@myrmidon/ng-tools';\nimport { User } from '@myrmidon/auth-jwt-login';\n\n/**\n * User registration model. You can expand this interface to add more data.\n */\nexport interface RegistrationModel {\n email: string;\n name: string;\n firstName?: string;\n lastName?: string;\n password: string;\n}\n\n/**\n * Result of an existing resource check.\n */\nexport interface ExistResult {\n entry: string;\n isExisting: boolean;\n}\n\n/**\n * Password change data.\n */\nexport interface PasswordChange {\n email: string;\n oldPassword: string;\n newPassword: string;\n confirmPassword: string;\n}\n\n/**\n * User filter parameters.\n */\nexport interface UserFilter {\n name?: string;\n}\n\n@Injectable({\n providedIn: 'root',\n})\nexport class AuthJwtAccountService {\n constructor(\n private _http: HttpClient,\n private _error: ErrorService,\n private _env: EnvService\n ) {}\n\n /**\n * Checks if the specified email address is registered on the server.\n * @param email email address to test.\n * @returns result.\n */\n public isEmailRegistered(email: string): Observable<ExistResult> {\n return this._http.get<ExistResult>(\n this._env.get('apiUrl') +\n 'accounts/emailexists/' +\n encodeURIComponent(email)\n );\n }\n\n /**\n * Checks if the specified user's given name is registered on the server.\n * This name is a nickname chosen by users during registration, and is the key\n * used for referencing users when talking to the server.\n * @param name name to test.\n * @returns result.\n */\n public isNameRegistered(name: string): Observable<ExistResult> {\n return this._http.get<ExistResult>(\n this._env.get('apiUrl') +\n 'accounts/nameexists/' +\n encodeURIComponent(name)\n );\n }\n\n /**\n * Register the user with the specified registration data.\n * @param registration The registration data.\n * @param confirmed True to automatically confirm the user's email address\n * without sending the confirmation email message.\n */\n public register(\n registration: RegistrationModel,\n confirmed = false\n ): Observable<any> {\n return this._http.post(\n this._env.get('apiUrl') +\n 'accounts/register' +\n (confirmed ? '?confirmed=true' : ''),\n registration\n );\n }\n\n /**\n * Resend the confirmation email to the specified address.\n * @param email address.\n */\n public resendConfirmEmail(email: string): Observable<any> {\n return this._http.get(\n this._env.get('apiUrl') +\n 'accounts/resendconfirm/' +\n encodeURIComponent(email)\n // options\n );\n }\n\n /**\n * Request a password reset for the specified email address.\n * @param email Email address.\n */\n public requestPasswordReset(email: string): Observable<any> {\n return this._http.post(\n this._env.get('apiUrl') + 'accounts/resetpassword/request',\n { email }\n );\n }\n\n public getAllUsers(): Observable<DataPage<User>> {\n return this._http\n .get<DataPage<User>>(this._env.get('apiUrl') + 'users', {\n params: new HttpParams().set('pageNumber', '1'),\n })\n .pipe(retry(3), catchError(this._error.handleError));\n }\n\n public getUsers(\n filter: UserFilter,\n pageNumber = 1,\n pageSize = 20\n ): Observable<DataPage<User>> {\n let httpParams = new HttpParams();\n httpParams = httpParams.set('pageNumber', pageNumber.toString());\n httpParams = httpParams.set('pageSize', pageSize.toString());\n if (filter.name) {\n httpParams = httpParams.set('name', filter.name);\n }\n\n return this._http\n .get<DataPage<User>>(this._env.get('apiUrl') + 'users', {\n params: httpParams,\n })\n .pipe(retry(3), catchError(this._error.handleError));\n }\n /**\n * Get the top N users matching the specified name filter.\n * @param nameFilter The user name filter.\n * @param limit The maximum number of users to get.\n */\n public getTopUsers(nameFilter: string, limit = 10): Observable<User[]> {\n let httpParams = new HttpParams();\n httpParams = httpParams.set('pageNumber', '1');\n httpParams = httpParams.set('pageSize', limit.toString());\n if (nameFilter) {\n httpParams = httpParams.set('name', nameFilter);\n }\n const options =\n httpParams.keys().length > 0\n ? {\n params: httpParams,\n }\n : {};\n\n return this._http\n .get<User[]>(this._env.get('apiUrl') + 'users', options)\n .pipe(retry(3), catchError(this._error.handleError));\n }\n\n /**\n * Get information about all the users listed in the specified names.\n * @param names User(s) names.\n */\n public getUsersFromNames(names: string[]): Observable<User[]> {\n let httpParams = new HttpParams();\n if (names && names.length > 0) {\n httpParams = httpParams.set('names', names.join(','));\n }\n const options =\n httpParams.keys().length > 0\n ? {\n params: httpParams,\n }\n : {};\n\n return this._http\n .get<User[]>(this._env.get('apiUrl') + 'users-from-names', options)\n .pipe(retry(3), catchError(this._error.handleError));\n }\n\n /**\n * Get data about the specified user.\n * @param name The user name.\n */\n public getUser(name: string): Observable<User> {\n return this._http\n .get<User>(this._env.get('apiUrl') + 'users/' + name)\n .pipe(retry(3), catchError(this._error.handleError));\n }\n\n /**\n * Update the editable data for the specified user.\n * @param user The user to update.\n */\n public updateUser(user: User): Observable<any> {\n return this._http\n .put(\n this._env.get('apiUrl') +\n 'users' +\n (user.emailConfirmed ? '?confirmed=true' : ''),\n user\n )\n .pipe(catchError(this._error.handleError));\n }\n\n /**\n * Request a password reset email for the specified email address.\n * @param email The email address to receive the reset message.\n */\n public resetPassword(email: string): Observable<any> {\n return this._http\n .post(this._env.get('apiUrl') + 'accounts/resetpassword/request', {\n email: email,\n })\n .pipe(catchError(this._error.handleError));\n }\n\n /**\n * Change the password.\n * @param change The password change data.\n */\n public changePassword(change: PasswordChange): Observable<any> {\n return this._http\n .post(this._env.get('apiUrl') + 'accounts/changepassword', change)\n .pipe(catchError(this._error.handleError));\n }\n\n /**\n * Delete the user with the specified username.\n * @param name The user name.\n */\n public deleteUser(name: string): Observable<any> {\n return this._http\n .delete(this._env.get('apiUrl') + 'accounts/' + name)\n .pipe(catchError(this._error.handleError));\n }\n}\n","import {\n Component,\n OnChanges,\n EventEmitter,\n Input,\n Output,\n SimpleChange,\n} from '@angular/core';\n\n@Component({\n selector: 'auth-jwt-password-strength-bar',\n templateUrl: './password-strength-bar.component.html',\n styleUrls: ['./password-strength-bar.component.css'],\n})\nexport class PasswordStrengthBarComponent implements OnChanges {\n private _colors = ['#F00', '#F90', '#FF0', '#9F0', '#0F0'];\n\n @Input() passwordToCheck: string | undefined;\n\n @Output() strengthChange = new EventEmitter<number>();\n\n public bars: string[];\n\n constructor() {\n this.strengthChange = new EventEmitter<number>();\n this.bars = [];\n }\n\n private measureStrength(p: string): number {\n let force = 0;\n const regex = /[$-/:-?{-~!\"^_`\\[\\]]/g; // \"\n\n const lowerLetters = /[a-z]+/.test(p);\n const upperLetters = /[A-Z]+/.test(p);\n const numbers = /[0-9]+/.test(p);\n const symbols = regex.test(p);\n\n const flags = [lowerLetters, upperLetters, numbers, symbols];\n\n let passedMatches = 0;\n for (const flag of flags) {\n passedMatches += flag === true ? 1 : 0;\n }\n\n force += 2 * p.length + (p.length >= 10 ? 1 : 0);\n force += passedMatches * 10;\n\n // penalty (short password)\n force = p.length <= 6 ? Math.min(force, 10) : force;\n\n // penalty (poor letiety of characters)\n force = passedMatches === 1 ? Math.min(force, 10) : force;\n force = passedMatches === 2 ? Math.min(force, 20) : force;\n force = passedMatches === 3 ? Math.min(force, 40) : force;\n\n return force;\n }\n\n private getColor(s: number) {\n let idx = 0;\n if (s <= 10) {\n idx = 0;\n } else if (s <= 20) {\n idx = 1;\n } else if (s <= 30) {\n idx = 2;\n } else if (s <= 40) {\n idx = 3;\n } else {\n idx = 4;\n }\n return {\n idx: idx + 1,\n col: this._colors[idx],\n };\n }\n\n ngOnChanges(changes: { [propName: string]: SimpleChange }): void {\n const password = changes['passwordToCheck'].currentValue;\n this.setBarColors(5, '#DDD');\n if (password) {\n const strength = this.measureStrength(password);\n const c = this.getColor(strength);\n this.setBarColors(c.idx, c.col);\n this.strengthChange.emit(strength);\n }\n }\n\n private setBarColors(count: number, col: string) {\n for (let n = 0; n < count; n++) {\n this.bars[n] = col;\n }\n }\n}\n","<div id=\"strength\">\n <small>strength:</small>\n <ul id=\"strengthBar\">\n <li class=\"point\" [style.background-color]=\"bars[0]\"></li>\n <li class=\"point\" [style.background-color]=\"bars[1]\"></li>\n <li class=\"point\" [style.background-color]=\"bars[2]\"></li>\n <li class=\"point\" [style.background-color]=\"bars[3]\"></li>\n <li class=\"point\" [style.background-color]=\"bars[4]\"></li>\n </ul>\n</div>\n","import { Component, EventEmitter, 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\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 * 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 constructor(\r\n formBuilder: FormBuilder,\r\n private _snackbar: MatSnackBar,\r\n private _accountService: AuthJwtAccountService\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)\r\n .pipe(take(1))\r\n .subscribe({\r\n next: () => {\r\n this.busy = false;\r\n this._snackbar.open($localize`Registration succeeded`, 'OK');\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($localize`Registration error`, 'OK');\r\n },\r\n });\r\n }\r\n}\r\n","<div>\r\n <form role=\"form\" [formGroup]=\"form\" (submit)=\"onSubmit()\">\r\n <fieldset>\r\n <legend i18n>registration</legend>\r\n <!-- email -->\r\n <div class=\"form-row\">\r\n <mat-form-field>\r\n <mat-label i18n>email</mat-label>\r\n <input\r\n matInput\r\n type=\"email\"\r\n id=\"email\"\r\n maxlength=\"256\"\r\n required\r\n autofocus\r\n spellcheck=\"false\"\r\n [formControl]=\"email\"\r\n />\r\n <mat-error\r\n i18n\r\n *ngIf=\"\r\n $any(email).errors?.required && (email.dirty || email.touched)\r\n \"\r\n >email required</mat-error\r\n >\r\n <mat-error\r\n i18n\r\n *ngIf=\"$any(email).errors?.email && (email.dirty || email.touched)\"\r\n >invalid email</mat-error\r\n >\r\n <mat-error\r\n i18n\r\n *ngIf=\"\r\n $any(email).errors?.uniqueEmail && (email.dirty || email.touched)\r\n \"\r\n >email already registered</mat-error\r\n >\r\n </mat-form-field>\r\n <mat-icon *ngIf=\"email.pending\">hourglass</mat-icon>\r\n </div>\r\n\r\n <!-- name -->\r\n <div class=\"form-row\">\r\n <mat-form-field>\r\n <mat-label i18n>username</mat-label>\r\n <input\r\n matInput\r\n type=\"text\"\r\n id=\"name\"\r\n maxlength=\"50\"\r\n required\r\n pattern=\"^[a-zA-Z][a-zA-Z0-9]{2,49}$\"\r\n spellcheck=\"false\"\r\n [formControl]=\"name\"\r\n />\r\n <mat-error\r\n i18n\r\n *ngIf=\"$any(name).errors?.required && (name.dirty || name.touched)\"\r\n >username required</mat-error\r\n >\r\n <mat-error\r\n i18n\r\n *ngIf=\"$any(name).errors?.pattern && (name.dirty || name.touched)\"\r\n >invalid username</mat-error\r\n >\r\n <mat-error\r\n i18n\r\n *ngIf=\"\r\n $any(name).errors?.uniqueName && (name.dirty || name.touched)\r\n \"\r\n >username already registered</mat-error\r\n >\r\n </mat-form-field>\r\n <mat-icon *ngIf=\"name.pending\">hourglass</mat-icon>\r\n </div>\r\n\r\n <!-- first name -->\r\n <div>\r\n <mat-form-field>\r\n <mat-label i18n>first name</mat-label>\r\n <input\r\n matInput\r\n type=\"text\"\r\n id=\"firstName\"\r\n maxlength=\"50\"\r\n required\r\n spellcheck=\"false\"\r\n [formControl]=\"firstName\"\r\n />\r\n <mat-error\r\n i18n\r\n *ngIf=\"\r\n firstName.hasError('required') &&\r\n (firstName.dirty || firstName.touched)\r\n \"\r\n class=\"text-danger small\"\r\n >\r\n first name required\r\n </mat-error>\r\n </mat-form-field>\r\n </div>\r\n\r\n <!-- last name -->\r\n <div>\r\n <mat-form-field>\r\n <mat-label i18n>last name</mat-label>\r\n <input\r\n matInput\r\n type=\"text\"\r\n id=\"lastName\"\r\n maxlength=\"50\"\r\n required\r\n spellcheck=\"false\"\r\n [formControl]=\"lastName\"\r\n />\r\n <mat-error\r\n i18n\r\n *ngIf=\"\r\n lastName.hasError('required') &&\r\n (lastName.dirty || lastName.touched)\r\n \"\r\n class=\"text-danger small\"\r\n >\r\n last name required\r\n </mat-error>\r\n </mat-form-field>\r\n </div>\r\n\r\n <!-- <div [formGroup]=\"passwords\"> -->\r\n <!-- password -->\r\n <div>\r\n <mat-form-field>\r\n <mat-label i18n>password</mat-label>\r\n <input\r\n matInput\r\n type=\"password\"\r\n name=\"password\"\r\n autocomplete=\"new-password\"\r\n maxlength=\"50\"\r\n required\r\n spellcheck=\"false\"\r\n [formControl]=\"password\"\r\n />\r\n <auth-jwt-password-strength-bar [passwordToCheck]=\"password.value\">\r\n </auth-jwt-password-strength-bar>\r\n <mat-error\r\n i18n\r\n *ngIf=\"\r\n $any(password).errors?.required &&\r\n (password.dirty || password.touched)\r\n \"\r\n >password required</mat-error\r\n >\r\n <mat-error\r\n i18n\r\n *ngIf=\"\r\n $any(password).errors?.passwordtooshort &&\r\n (password.dirty || password.touched)\r\n \"\r\n >at least 8 characters</mat-error\r\n >\r\n <mat-error\r\n i18n\r\n *ngIf=\"\r\n $any(password).errors?.noupperinpassword &&\r\n (password.dirty || password.touched)\r\n \"\r\n >at least 1 uppercase letter</mat-error\r\n >\r\n <mat-error\r\n i18n\r\n *ngIf=\"\r\n $any(password).errors?.nolowerinpassword &&\r\n (password.dirty || password.touched)\r\n \"\r\n >at least 1 lowercase letter</mat-error\r\n >\r\n <mat-error\r\n i18n\r\n *ngIf=\"\r\n $any(password).errors?.nosymbolinpassword &&\r\n (password.dirty || password.touched)\r\n \"\r\n >at least 1 punctuation/symbol</mat-error\r\n >\r\n </mat-form-field>\r\n </div>\r\n\r\n <!-- confirm password -->\r\n <div>\r\n <mat-form-field>\r\n <mat-label i18n>confirm password</mat-label>\r\n <input\r\n matInput\r\n type=\"password\"\r\n name=\"confirmPassword\"\r\n maxlength=\"50\"\r\n required\r\n spellcheck=\"false\"\r\n [formControl]=\"confirmPassword\"\r\n />\r\n </mat-form-field>\r\n </div>\r\n <div\r\n i18n\r\n *ngIf=\"form.errors?.areequal && confirmPassword.touched\"\r\n style=\"color: red\"\r\n >\r\n password differs from confirmation password\r\n </div>\r\n\r\n <button i18n\r\n mat-raised-button\r\n type=\"submit\"\r\n color=\"primary\"\r\n [disabled]=\"\r\n form.invalid || form.pristine || busy || name.pending || email.pending\r\n \"\r\n >\r\n register\r\n </button>\r\n <mat-progress-spinner diameter=\"20\" *ngIf=\"busy\"></mat-progress-spinner>\r\n </fieldset>\r\n </form>\r\n\r\n <details>\r\n <summary i18n>Hints</summary>\r\n <p i18n>\r\n To register a new user, you must provide his email address, choose a\r\n password, and choose a username, which must be unique (you will be\r\n notified if another user has already taken that name). The username must\r\n include only letters/digits, start with a letter, and be no shorter than 3\r\n characters, nor longer than 50.\r\n </p>\r\n <p i18n>\r\n To promote a decent security level, the password must include at least 8\r\n characters, uppercase and lowercase letters, digits, and punctuation (like\r\n dashes, stops, parentheses, etc.).\r\n </p>\r\n <p i18n>\r\n Once registered, if messaging is enabled on the server side the user will\r\n receive an email message to the email address you specified; he will have\r\n to click on the provided link to complete the registration process.\r\n Otherwise, you should edit the newly created user and confirm the email\r\n registration.\r\n </p>\r\n </details>\r\n</div>\r\n","import { Component, Input, Output, OnInit, EventEmitter } from '@angular/core';\nimport { FormBuilder, FormControl, FormGroup } from '@angular/forms';\nimport { Observable } from 'rxjs';\n\nimport { UserFilter } from '../../services/auth-jwt-account.service';\n\n@Component({\n selector: 'auth-jwt-user-filter',\n templateUrl: './user-filter.component.html',\n styleUrls: ['./user-filter.component.css'],\n})\nexport class UserFilterComponent {\n private _filter?: UserFilter;\n\n @Input()\n public get filter(): UserFilter | null | undefined {\n return this._filter;\n }\n public set filter(value: UserFilter | null | undefined) {\n if (this._filter === value) {\n return;\n }\n this._filter = value || undefined;\n this.updateForm(this._filter);\n }\n\n @Input()\n public disabled: boolean | undefined;\n\n /**\n * Event emitted when the filter changes.\n */\n @Output()\n public filterChange: EventEmitter<UserFilter>;\n\n public name: FormControl<string | null>;\n public form: FormGroup;\n\n constructor(formBuilder: FormBuilder) {\n // form\n this.name = formBuilder.control<string | null>(null);\n this.form = formBuilder.group({\n name: this.name,\n });\n // event\n this.filterChange = new EventEmitter<UserFilter>();\n }\n\n private updateForm(filter?: UserFilter): void {\n if (!filter) {\n this.form.reset();\n return;\n }\n this.name.setValue(filter.name || null);\n this.form.markAsPristine();\n }\n\n private getFilter(): UserFilter {\n return {\n name: this.name.value?.trim(),\n };\n }\n\n public reset(): void {\n this.form.reset();\n this._filter = {};\n this.filterChange.emit(this._filter);\n }\n\n public apply(): void {\n this._filter = this.getFilter();\n this.filterChange.emit(this._filter);\n }\n}\n","<form [formGroup]=\"form\" (submit)=\"apply()\" ng-disabled=\"disabled\">\n <div class=\"form-row\">\n <mat-form-field>\n <mat-label i18n>name or ID</mat-label>\n <input matInput [formControl]=\"name\" />\n <button\n mat-icon-button\n matSuffix\n type=\"button\"\n (click)=\"reset()\"\n color=\"warn\"\n i18n-matTooltip\n matTooltip=\"Reset filters\"\n [disabled]=\"disabled\"\n >\n <mat-icon>clear</mat-icon>\n </button>\n </mat-form-field>\n\n <button\n id=\"apply\"\n type=\"submit\"\n mat-icon-button\n color=\"primary\"\n [disabled]=\"disabled\"\n i18n-matTooltip\n matTooltip=\"Apply filters\"\n >\n <mat-icon>check_circle</mat-icon>\n </button>\n </div>\n</form>\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 { Component, OnInit, Inject, Optional } from '@angular/core';\r\nimport { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog';\r\n\r\n// https://medium.com/@tarik.nzl/making-use-of-dialogs-in-material-2-mddialog-7533d27df41\r\n\r\n@Component({\r\n // https://github.com/angular/components/issues/7718\r\n // selector: 'cadmus-confirm-dialog',\r\n templateUrl: './confirm-dialog.component.html',\r\n styleUrls: ['./confirm-dialog.component.css'],\r\n})\r\nexport class ConfirmDialogComponent implements OnInit {\r\n public title: string;\r\n public prompt: string;\r\n public ok: string;\r\n public cancel: string;\r\n\r\n constructor(\r\n public dialogRef: MatDialogRef<ConfirmDialogComponent>,\r\n @Optional() @Inject(MAT_DIALOG_DATA) public data: any\r\n ) {\r\n this.title = $localize`Confirm`;\r\n this.prompt = $localize`Confirm operation?`;\r\n this.ok = $localize`yes`;\r\n this.cancel = $localize`no`;\r\n }\r\n\r\n ngOnInit() {}\r\n}\r\n","<h1 mat-dialog-title>{{ title }}</h1>\r\n<mat-dialog-content>\r\n {{ prompt }}\r\n</mat-dialog-content>\r\n<mat-dialog-actions>\r\n <button\r\n type=\"button\"\r\n mat-raised-button\r\n color=\"warn\"\r\n (click)=\"dialogRef.close(true)\"\r\n >\r\n {{ ok }}\r\n </button>\r\n <button type=\"button\" mat-button (click)=\"dialogRef.close()\">\r\n {{ cancel }}\r\n </button>\r\n</mat-dialog-actions>\r\n","import { Injectable } from '@angular/core';\r\nimport { MatDialog, MatDialogRef } from '@angular/material/dialog';\r\nimport { ConfirmDialogComponent } from '../components/confirm-dialog/confirm-dialog.component';\r\nimport { Observable } from 'rxjs';\r\n\r\n// https://medium.com/@tarik.nzl/making-use-of-dialogs-in-material-2-mddialog-7533d27df41\r\n\r\n/**\r\n * This service acts as a wrapper for MatDialog to simplify the process of calling\r\n * the dialog and subscribing to it. What it will do is create an Instance of\r\n * MatDialog with our custom component (ConfirmDialogComponent). Then it will set\r\n * any public properties it needs to by setting the properties on the\r\n * componentInstance object. It will return the observable afterClosed()\r\n * to the caller so they can subscribe to it. This will emit an event whenever\r\n * the dialog is closed.\r\n */\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class DialogService {\r\n\r\n constructor(private dialog: MatDialog) { }\r\n\r\n public confirm(title: string, prompt: string, ok = $localize`yes`, cancel = $localize`no`):\r\n Observable<boolean> {\r\n\r\n let dialogRef: MatDialogRef<ConfirmDialogComponent>;\r\n\r\n dialogRef = this.dialog.open(ConfirmDialogComponent);\r\n dialogRef.componentInstance.title = title;\r\n dialogRef.componentInstance.prompt = prompt;\r\n dialogRef.componentInstance.ok = ok;\r\n dialogRef.componentInstance.cancel = cancel;\r\n\r\n return dialogRef.afterClosed();\r\n }\r\n}\r\n","import { Component, OnInit, Input, Output, EventEmitter } from '@angular/core';\nimport {\n UntypedFormGroup,\n UntypedFormControl,\n UntypedFormBuilder,\n Validators,\n} from '@angular/forms';\nimport { AuthJwtService, User } from '@myrmidon/auth-jwt-login';\n\n@Component({\n selector: 'auth-jwt-user-editor',\n templateUrl: './user-editor.component.html',\n styleUrls: ['./user-editor.component.css'],\n})\nexport class UserEditorComponent implements OnInit {\n private _user: User | undefined;\n\n public email: UntypedFormControl;\n public emailConfirmed: UntypedFormControl;\n public lockoutEnabled: UntypedFormControl;\n public firstName: UntypedFormControl;\n public lastName: UntypedFormControl;\n public roles: UntypedFormControl;\n public form: UntypedFormGroup;\n\n public unlocked: boolean | undefined;\n\n @Input() public set user(value: User | undefined) {\n this._user = value;\n this.updateForm(value);\n }\n public get user(): User | undefined {\n return this._user;\n }\n\n @Output() userChange: EventEmitter<User>;\n @Output() editorClose: EventEmitter<any>;\n\n constructor(formBuilder: UntypedFormBuilder, private _authService: AuthJwtService) {\n // events\n this.userChange = new EventEmitter<User>();\n this.editorClose = new EventEmitter<any>();\n // form\n this.email = formBuilder.control(null, [\n Validators.required,\n Validators.email,\n ]);\n this.emailConfirmed = formBuilder.control(false);\n this.lockoutEnabled = formBuilder.control(false);\n this.firstName = formBuilder.control(null, [\n Validators.required,\n Validators.maxLength(50),\n ]);\n this.lastName = formBuilder.control(null, [\n Validators.required,\n Validators.maxLength(50),\n ]);\n this.roles = formBuilder.control(null, Validators.maxLength(200));\n\n this.form = formBuilder.group({\n email: this.email,\n emailConfirmed: this.emailConfirmed,\n lockoutEnabled: this.lockoutEnabled,\n firstName: this.firstName,\n lastName: this.lastName,\n roles: this.roles,\n });\n }\n\n ngOnInit(): void {}\n\n private updateForm(user: User | undefined): void {\n if (!user) {\n this.form.reset();\n } else {\n this.email.setValue(user.email);\n this.emailConfirmed.setValue(user.emailConfirmed);\n this.lockoutEnabled.setValue(user.lockoutEnabled);\n this.firstName.setValue(user.firstName);\n this.lastName.setValue(user.lastName);\n if (user.roles?.length > 0) {\n this.roles.setValue(user.roles.join(' '));\n } else {\n this.roles.setValue(null);\n }\n }\n }\n\n private getUserFromForm(): User {\n return {\n userName: this._user?.userName || '',\n email: this.email.value,\n emailConfirmed: this.emailConfirmed.value,\n lockoutEnabled: this.lockoutEnabled.value,\n firstName: this.firstName.value,\n lastName: this.lastName.value,\n roles: this.roles.value\n ? this.roles.value.split(' ').filter((s: string) => s)\n : [],\n };\n }\n\n public endLockout(): void {\n if (this.unlocked) {\n return;\n }\n this._user!.lockoutEnd = this._authService.getUTCDate();\n this.unlocked = true;\n }\n\n public close(): void {\n this.editorClose.emit();\n }\n\n public save(): void {\n if (this.form.invalid) {\n return;\n }\n this.userChange.emit(this.getUserFromForm());\n }\n}\n","<form [formGroup]=\"form\" (submit)=\"save()\">\n <div class=\"form-row\">\n <!-- email -->\n <mat-form-field>\n <mat-label i18n>email</mat-label>\n <input type=\"text\" matInput [formControl]=\"email\" />\n <mat-error\n i18n\n *ngIf=\"email.hasError('required') && (email.dirty || email.touched)\"\n >\n email address required\n </mat-error>\n <mat-error\n i18n\n *ngIf=\"email.hasError('pattern') && (email.dirty || email.touched)\"\n >\n invalid email address\n </mat-error>\n </mat-form-field>\n\n <!-- emailConfirmed -->\n <mat-checkbox [formControl]=\"emailConfirmed\" i18n\n >email address confirmed</mat-checkbox\n >\n </div>\n\n <!-- lockoutEnabled -->\n <div class=\"form-row\">\n <mat-checkbox [formControl]=\"lockoutEnabled\" i18n\n >lockout enabled</mat-checkbox\n >\n <button\n mat-icon-button\n color=\"primary\"\n (click)=\"endLockout()\"\n [disabled]=\"unlocked\"\n i18n-matTooltip\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>first name</mat-label>\n <input type=\"text\" matInput [formControl]=\"firstName\" />\n <mat-error\n i18n\n *ngIf=\"\n firstName.hasError('required') &&\n (firstName.dirty || firstName.touched)\n \"\n >\n first name required\n </mat-error>\n <mat-error\n i18n\n *ngIf=\"\n firstName.hasError('maxlength') &&\n (firstName.dirty || firstName.touched)\n \"\n >\n first name too long\n </mat-error>\n </mat-form-field>\n\n <!-- lastName -->\n <mat-form-field>\n <mat-label i18n>last name</mat-label>\n <input type=\"text\" matInput [formControl]=\"lastName\" />\n <mat-error\n i18n\n *ngIf=\"\n lastName.hasError('required') && (lastName.dirty || lastName.touched)\n \"\n >\n last name required\n </mat-error>\n <mat-error\n i18n\n *ngIf=\"\n lastName.hasError('maxlength') && (lastName.dirty || lastName.touched)\n \"\n >\n last name too long\n </mat-error>\n </mat-form-field>\n </div>\n\n <!-- roles -->\n <div>\n <mat-form-field style=\"width: 16em\">\n <mat-label i18n>roles</mat-label>\n <input type=\"text\" matInput [formControl]=\"roles\" />\n <mat-error\n i18n\n *ngIf=\"roles.hasError('maxlength') && (roles.dirty || roles.touched)\"\n >\n too long\n </mat-error>\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\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 [disabled]=\"form.invalid\"\n i18n-matTooltip\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\n\r\nimport { DialogService } from '../../services/dialog.service';\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($localize`Confirm`, $localize`Delete user ${user.userName}?`)\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 <div id=\"list\" *ngIf=\"page$ | async as page\">\n <div *ngIf=\"loading$ | async\">\n <mat-progress-bar mode=\"indeterminate\"></mat-progress-bar>\n </div>\n <table>\n <thead>\n <td></td>\n <td></td>\n <th i18n>name</th>\n <th i18n class=\"noif-lt-md\">first</th>\n <th i18n class=\"noif-lt-md\">last</th>\n <th i18n class=\"noif-lt-md\">email</th>\n <th i18n>roles</th>\n <th i18n class=\"noif-lt-md\">lock end</th>\n </thead>\n <tbody>\n <tr *ngFor=\"let user of page.items\">\n <td class=\"fit-width\">\n <button\n mat-icon-button\n type=\"button\"\n i18n-matTooltip\n matTooltip=\"Edit this user\"\n color=\"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\n matTooltip=\"Delete this user\"\n color=\"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 </tbody>\n </table>\n\n <!-- paginator -->\n <div class=\"form-row\">\n <button\n type=\"button\"\n mat-icon-button\n color=\"warn\"\n i18n-matmatTooltip\n matTooltip=\"Refresh list\"\n (click)=\"reset()\"\n >\n <mat-icon>autorenew</mat-icon>\n </button>\n\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 </div>\n\n <!-- editor -->\n <mat-expansion-panel\n id=\"editor\"\n [expanded]=\"active$ | async\"\n [disabled]=\"!(active$ | async)\"\n >\n <div *ngIf=\"active$ | async as active\">\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 </mat-expansion-panel>\n</div>\n","import { CommonModule } from '@angular/common';\r\nimport { HttpClientModule } from '@angular/common/http';\r\nimport { NgModule } from '@angular/core';\r\nimport { RouterModule } from '@angular/router';\r\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\r\n\r\nimport { MatCardModule } from '@angular/material/card';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatCheckboxModule } from '@angular/material/checkbox';\r\nimport {MatExpansionModule} from '@angular/material/expansion';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\nimport { MatPaginatorModule } from '@angular/material/paginator';\r\nimport { MatProgressBarModule } from '@angular/material/progress-bar';\r\nimport { MatProgressSpinnerModule } from '@angular/material/progress-spinner';\r\nimport { MatSnackBarModule } from '@angular/material/snack-bar';\r\nimport { MatDialogModule } from '@angular/material/dialog';\r\n\r\nimport { AuthJwtLoginModule } from '@myrmidon/auth-jwt-login';\r\nimport { NgToolsModule } from '@myrmidon/ng-tools';\r\n\r\nimport { AuthJwtRegistrationComponent } from './components/auth-jwt-registration/auth-jwt-registration.component';\r\nimport { PasswordStrengthBarComponent } from './components/password-strength-bar/password-strength-bar.component';\r\nimport { UserFilterComponent } from './components/user-filter/user-filter.component';\r\nimport { UserListComponent } from './components/user-list/user-list.component';\r\nimport { ConfirmDialogComponent } from './components/confirm-dialog/confirm-dialog.component';\r\nimport { UserEditorComponent } from './components/user-editor/user-editor.component';\r\n\r\n@NgModule({\r\n declarations: [\r\n AuthJwtRegistrationComponent,\r\n PasswordStrengthBarComponent,\r\n UserFilterComponent,\r\n UserListComponent,\r\n ConfirmDialogComponent,\r\n UserEditorComponent,\r\n ],\r\n imports: [\r\n CommonModule,\r\n HttpClientModule,\r\n FormsModule,\r\n RouterModule,\r\n ReactiveFormsModule,\r\n // material\r\n MatButtonModule,\r\n MatCardModule,\r\n MatCheckboxModule,\r\n MatDialogModule,\r\n MatExpansionModule,\r\n MatIconModule,\r\n MatInputModule,\r\n MatPaginatorModule,\r\n MatProgressBarModule,\r\n MatProgressSpinnerModule,\r\n MatSnackBarModule,\r\n MatTooltipModule,\r\n AuthJwtLoginModule,\r\n NgToolsModule\r\n ],\r\n exports: [\r\n AuthJwtRegistrationComponent,\r\n PasswordStrengthBarComponent,\r\n UserFilterComponent,\r\n UserListComponent\r\n ],\r\n})\r\nexport class AuthJwtAdminModule {}\r\n","/*\n * Public API Surface of auth-jwt-admin\n */\n\nexport * from './lib/components/auth-jwt-registration/auth-jwt-registration.component';\nexport * from './lib/components/password-strength-bar/password-strength-bar.component';\nexport * from './lib/components/user-filter/user-filter.component';\nexport * from './lib/components/user-list/user-list.component';\nexport * from './lib/components/state/user-list.repository';\nexport * from './lib/services/auth-jwt-account.service';\nexport * from './lib/validators/password.validators';\nexport * from './lib/auth-jwt-admin.module';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1","i2","i3.AuthJwtAccountService","i5","i10.PasswordStrengthBarComponent","i3","i4","i6","i1.AuthJwtAccountService","i9","i1.UserListRepository","i2.DialogService","i7","i8","i10","i11.UserFilterComponent","i12.UserEditorComponent"],"mappings":"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"}
|
|
@@ -1,35 +1,28 @@
|
|
|
1
1
|
import { Observable } from 'rxjs';
|
|
2
|
-
import { PaginationData } from '@ngneat/elf-pagination';
|
|
3
|
-
import { StatusState } from '@ngneat/elf-requests';
|
|
4
2
|
import { User } from '@myrmidon/auth-jwt-login';
|
|
3
|
+
import { DataPage } from '@myrmidon/ng-tools';
|
|
4
|
+
import { PagedListStoreService } from '@myrmidon/paged-data-browsers';
|
|
5
5
|
import { AuthJwtAccountService, UserFilter } from '../../services/auth-jwt-account.service';
|
|
6
6
|
import * as i0 from "@angular/core";
|
|
7
|
-
export
|
|
8
|
-
filter: UserFilter;
|
|
9
|
-
}
|
|
10
|
-
export declare class UserListRepository {
|
|
7
|
+
export declare class UserListRepository implements PagedListStoreService<UserFilter, User> {
|
|
11
8
|
private _accService;
|
|
12
9
|
private _store;
|
|
13
|
-
private
|
|
10
|
+
private _activeUser$;
|
|
14
11
|
private _loading$;
|
|
15
12
|
private _saving$;
|
|
16
|
-
activeUser
|
|
17
|
-
filter
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
status$: Observable<StatusState>;
|
|
22
|
-
loading$: Observable<boolean>;
|
|
23
|
-
saving$: Observable<boolean>;
|
|
13
|
+
get activeUser$(): Observable<User | undefined>;
|
|
14
|
+
get filter$(): Observable<UserFilter>;
|
|
15
|
+
get page$(): Observable<DataPage<User>>;
|
|
16
|
+
get loading$(): Observable<boolean>;
|
|
17
|
+
get saving$(): Observable<boolean>;
|
|
24
18
|
constructor(_accService: AuthJwtAccountService);
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
updateActive(user: User): Promise<boolean>;
|
|
19
|
+
loadPage(pageNumber: number, pageSize: number, filter: UserFilter): Observable<DataPage<User>>;
|
|
20
|
+
reset(): Promise<void>;
|
|
21
|
+
setFilter(filter: UserFilter): Promise<void>;
|
|
22
|
+
getFilter(): UserFilter;
|
|
23
|
+
setPage(pageNumber: number, pageSize: number): Promise<void>;
|
|
24
|
+
setActiveUser(user: User | null): void;
|
|
25
|
+
updateActiveUser(user: User): Promise<boolean>;
|
|
33
26
|
deleteUser(name: string): Promise<boolean>;
|
|
34
27
|
static ɵfac: i0.ɵɵFactoryDeclaration<UserListRepository, never>;
|
|
35
28
|
static ɵprov: i0.ɵɵInjectableDeclaration<UserListRepository>;
|
|
@@ -1,21 +1,23 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { EventEmitter } from '@angular/core';
|
|
2
2
|
import { FormBuilder, FormControl, FormGroup } from '@angular/forms';
|
|
3
|
-
import { Observable } from 'rxjs';
|
|
4
3
|
import { UserFilter } from '../../services/auth-jwt-account.service';
|
|
5
|
-
import { UserListRepository } from '../state/user-list.repository';
|
|
6
4
|
import * as i0 from "@angular/core";
|
|
7
|
-
export declare class UserFilterComponent
|
|
8
|
-
private
|
|
5
|
+
export declare class UserFilterComponent {
|
|
6
|
+
private _filter?;
|
|
7
|
+
get filter(): UserFilter | null | undefined;
|
|
8
|
+
set filter(value: UserFilter | null | undefined);
|
|
9
9
|
disabled: boolean | undefined;
|
|
10
|
-
|
|
10
|
+
/**
|
|
11
|
+
* Event emitted when the filter changes.
|
|
12
|
+
*/
|
|
13
|
+
filterChange: EventEmitter<UserFilter>;
|
|
11
14
|
name: FormControl<string | null>;
|
|
12
15
|
form: FormGroup;
|
|
13
|
-
constructor(formBuilder: FormBuilder
|
|
14
|
-
ngOnInit(): void;
|
|
16
|
+
constructor(formBuilder: FormBuilder);
|
|
15
17
|
private updateForm;
|
|
16
|
-
reset(): void;
|
|
17
18
|
private getFilter;
|
|
19
|
+
reset(): void;
|
|
18
20
|
apply(): void;
|
|
19
21
|
static ɵfac: i0.ɵɵFactoryDeclaration<UserFilterComponent, never>;
|
|
20
|
-
static ɵcmp: i0.ɵɵComponentDeclaration<UserFilterComponent, "auth-jwt-user-filter", never, { "disabled": { "alias": "disabled"; "required": false; }; }, {}, never, never, false, never>;
|
|
22
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<UserFilterComponent, "auth-jwt-user-filter", never, { "filter": { "alias": "filter"; "required": false; }; "disabled": { "alias": "disabled"; "required": false; }; }, { "filterChange": "filterChange"; }, never, never, false, never>;
|
|
21
23
|
}
|