@myrmidon/auth-jwt-admin 5.0.1 → 5.1.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.
@@ -1 +1 @@
1
- {"version":3,"file":"myrmidon-auth-jwt-admin.mjs","sources":["../../../../projects/myrmidon/auth-jwt-admin/src/lib/validators/password.validators.ts","../../../../projects/myrmidon/auth-jwt-admin/src/lib/services/auth-jwt-account.service.ts","../../../../projects/myrmidon/auth-jwt-admin/src/lib/components/state/user-list.repository.ts","../../../../projects/myrmidon/auth-jwt-admin/src/lib/components/password-strength-bar/password-strength-bar.component.ts","../../../../projects/myrmidon/auth-jwt-admin/src/lib/components/password-strength-bar/password-strength-bar.component.html","../../../../projects/myrmidon/auth-jwt-admin/src/lib/components/auth-jwt-registration/auth-jwt-registration.component.ts","../../../../projects/myrmidon/auth-jwt-admin/src/lib/components/auth-jwt-registration/auth-jwt-registration.component.html","../../../../projects/myrmidon/auth-jwt-admin/src/lib/components/user-filter/user-filter.component.ts","../../../../projects/myrmidon/auth-jwt-admin/src/lib/components/user-filter/user-filter.component.html","../../../../projects/myrmidon/auth-jwt-admin/src/lib/components/user-editor/user-editor.component.ts","../../../../projects/myrmidon/auth-jwt-admin/src/lib/components/user-editor/user-editor.component.html","../../../../projects/myrmidon/auth-jwt-admin/src/lib/components/user-list/user-list.component.ts","../../../../projects/myrmidon/auth-jwt-admin/src/lib/components/user-list/user-list.component.html","../../../../projects/myrmidon/auth-jwt-admin/src/lib/auth-jwt-admin.module.ts","../../../../projects/myrmidon/auth-jwt-admin/src/public-api.ts","../../../../projects/myrmidon/auth-jwt-admin/src/myrmidon-auth-jwt-admin.ts"],"sourcesContent":["import {\r\n AbstractControl,\r\n FormGroup,\r\n UntypedFormGroup,\r\n ValidationErrors,\r\n ValidatorFn,\r\n} from '@angular/forms';\r\n\r\nexport class PasswordValidators {\r\n /** \"Standard\" password validator for my API services. */\r\n public static standard(): ValidatorFn {\r\n return (control: AbstractControl): ValidationErrors | null => {\r\n if (!control.value) {\r\n return null;\r\n }\r\n\r\n if (control.value.length < 8) {\r\n return {\r\n passwordtooshort: true,\r\n };\r\n }\r\n\r\n if (!/.*[A-Z].*/.test(control.value)) {\r\n return {\r\n noupperinpassword: true,\r\n };\r\n }\r\n\r\n if (!/.*[a-z].*/.test(control.value)) {\r\n return {\r\n nolowerinpassword: true,\r\n };\r\n }\r\n\r\n if (!/.*[A-Z].*/.test(control.value)) {\r\n return {\r\n noupperinpassword: true,\r\n };\r\n }\r\n\r\n if (!/.*[-`~!@#$%^&*()_+=\\[\\]{};:'\",.<>/?|\\\\].*/.test(control.value)) {\r\n return {\r\n nosymbolinpassword: true,\r\n };\r\n }\r\n\r\n return null;\r\n };\r\n }\r\n\r\n public static areEqual(\r\n controlName: string,\r\n otherControlName: string\r\n ): ValidatorFn {\r\n return (control: AbstractControl): ValidationErrors | null => {\r\n const g = control as FormGroup | UntypedFormGroup;\r\n const a = g.controls[controlName];\r\n const b = g.controls[otherControlName];\r\n return a.value !== b.value\r\n ? {\r\n areequal: true,\r\n }\r\n : null;\r\n };\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { HttpClient, HttpParams } from '@angular/common/http';\r\nimport { Observable } from 'rxjs';\r\nimport { retry, catchError, map } from 'rxjs/operators';\r\n\r\nimport { DataPage, EnvService, ErrorService } from '@myrmidon/ng-tools';\r\nimport { User } from '@myrmidon/auth-jwt-login';\r\n\r\n/**\r\n * User registration model. You can expand this interface to add more data.\r\n */\r\nexport interface RegistrationModel {\r\n email: string;\r\n name: string;\r\n firstName?: string;\r\n lastName?: string;\r\n password: string;\r\n}\r\n\r\n/**\r\n * Result of an existing resource check.\r\n */\r\nexport interface ExistResult {\r\n entry: string;\r\n isExisting: boolean;\r\n}\r\n\r\n/**\r\n * Password change data.\r\n */\r\nexport interface PasswordChange {\r\n email: string;\r\n oldPassword: string;\r\n newPassword: string;\r\n confirmPassword: string;\r\n}\r\n\r\n/**\r\n * User filter parameters.\r\n */\r\nexport interface UserFilter {\r\n name?: string;\r\n}\r\n\r\n/**\r\n * The type of user data returned by the server.\r\n */\r\ninterface UserWithRoles<T> {\r\n user: T;\r\n roles?: string[];\r\n}\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class AuthJwtAccountService {\r\n constructor(\r\n private _http: HttpClient,\r\n private _error: ErrorService,\r\n private _env: EnvService\r\n ) {}\r\n\r\n /**\r\n * Checks if the specified email address is registered on the server.\r\n * @param email email address to test.\r\n * @returns result.\r\n */\r\n public isEmailRegistered(email: string): Observable<ExistResult> {\r\n return this._http.get<ExistResult>(\r\n this._env.get('apiUrl') +\r\n 'accounts/emailexists/' +\r\n encodeURIComponent(email)\r\n );\r\n }\r\n\r\n /**\r\n * Checks if the specified user's given name is registered on the server.\r\n * This name is a nickname chosen by users during registration, and is the key\r\n * used for referencing users when talking to the server.\r\n * @param name name to test.\r\n * @returns result.\r\n */\r\n public isNameRegistered(name: string): Observable<ExistResult> {\r\n return this._http.get<ExistResult>(\r\n this._env.get('apiUrl') +\r\n 'accounts/nameexists/' +\r\n encodeURIComponent(name)\r\n );\r\n }\r\n\r\n /**\r\n * Register the user with the specified registration data.\r\n * @param registration The registration data.\r\n * @param confirmed True to automatically confirm the user's email address\r\n * without sending the confirmation email message.\r\n */\r\n public register(\r\n registration: RegistrationModel,\r\n confirmed = false\r\n ): Observable<any> {\r\n return this._http.post(\r\n this._env.get('apiUrl') +\r\n 'accounts/register' +\r\n (confirmed ? '?confirmed=true' : ''),\r\n registration\r\n );\r\n }\r\n\r\n /**\r\n * Resend the confirmation email to the specified address.\r\n * @param email address.\r\n */\r\n public resendConfirmEmail(email: string): Observable<any> {\r\n return this._http.get(\r\n this._env.get('apiUrl') +\r\n 'accounts/resendconfirm/' +\r\n encodeURIComponent(email)\r\n // options\r\n );\r\n }\r\n\r\n /**\r\n * Request a password reset for the specified email address.\r\n * @param email Email address.\r\n */\r\n public requestPasswordReset(email: string): Observable<any> {\r\n return this._http.post(\r\n this._env.get('apiUrl') + 'accounts/resetpassword/request',\r\n { email }\r\n );\r\n }\r\n\r\n private getUserFromWrapper(response: UserWithRoles<User> | User): User {\r\n return (response as UserWithRoles<User>).user\r\n ? {\r\n ...((response as UserWithRoles<User>).user as User),\r\n roles: response.roles || [],\r\n }\r\n : (response as User);\r\n }\r\n\r\n public getAllUsers(): Observable<DataPage<User>> {\r\n return this._http\r\n .get<DataPage<UserWithRoles<User> | User>>(\r\n this._env.get('apiUrl') + 'users',\r\n {\r\n params: new HttpParams().set('pageNumber', '1'),\r\n }\r\n )\r\n .pipe(\r\n retry(3),\r\n map((dataPage: DataPage<UserWithRoles<User> | User>) => {\r\n return {\r\n ...dataPage,\r\n items: dataPage.items.map(this.getUserFromWrapper),\r\n };\r\n }),\r\n catchError(this._error.handleError)\r\n );\r\n }\r\n\r\n public getUsers(\r\n filter: UserFilter,\r\n pageNumber = 1,\r\n pageSize = 20\r\n ): Observable<DataPage<User>> {\r\n let httpParams = new HttpParams();\r\n httpParams = httpParams.set('pageNumber', pageNumber.toString());\r\n httpParams = httpParams.set('pageSize', pageSize.toString());\r\n if (filter.name) {\r\n httpParams = httpParams.set('name', filter.name);\r\n }\r\n\r\n return this._http\r\n .get<DataPage<UserWithRoles<User>>>(this._env.get('apiUrl') + 'users', {\r\n params: httpParams,\r\n })\r\n .pipe(\r\n retry(3),\r\n map((dataPage: DataPage<UserWithRoles<User>>) => {\r\n return {\r\n ...dataPage,\r\n items: dataPage.items.map(this.getUserFromWrapper),\r\n };\r\n }),\r\n catchError(this._error.handleError)\r\n );\r\n }\r\n /**\r\n * Get the top N users matching the specified name filter.\r\n * @param nameFilter The user name filter.\r\n * @param limit The maximum number of users to get.\r\n */\r\n public getTopUsers(nameFilter: string, limit = 10): Observable<User[]> {\r\n let httpParams = new HttpParams();\r\n httpParams = httpParams.set('pageNumber', '1');\r\n httpParams = httpParams.set('pageSize', limit.toString());\r\n if (nameFilter) {\r\n httpParams = httpParams.set('name', nameFilter);\r\n }\r\n const options =\r\n httpParams.keys().length > 0\r\n ? {\r\n params: httpParams,\r\n }\r\n : {};\r\n\r\n return this._http\r\n .get<UserWithRoles<User>[]>(this._env.get('apiUrl') + 'users', options)\r\n .pipe(\r\n retry(3),\r\n map((users: UserWithRoles<User>[]) => {\r\n return users.map(this.getUserFromWrapper);\r\n }),\r\n catchError(this._error.handleError)\r\n );\r\n }\r\n\r\n /**\r\n * Get information about all the users listed in the specified names.\r\n * @param names User(s) names.\r\n */\r\n public getUsersFromNames(names: string[]): Observable<User[]> {\r\n let httpParams = new HttpParams();\r\n if (names && names.length > 0) {\r\n httpParams = httpParams.set('names', names.join(','));\r\n }\r\n const options =\r\n httpParams.keys().length > 0\r\n ? {\r\n params: httpParams,\r\n }\r\n : {};\r\n\r\n return this._http\r\n .get<UserWithRoles<User>[]>(\r\n this._env.get('apiUrl') + 'users-from-names',\r\n options\r\n )\r\n .pipe(\r\n retry(3),\r\n map((users: UserWithRoles<User>[]) => {\r\n return users.map(this.getUserFromWrapper);\r\n }),\r\n catchError(this._error.handleError)\r\n );\r\n }\r\n\r\n /**\r\n * Get data about the specified user.\r\n * @param name The user name.\r\n */\r\n public getUser(name: string): Observable<User> {\r\n return this._http\r\n .get<UserWithRoles<User>>(this._env.get('apiUrl') + 'users/' + name)\r\n .pipe(\r\n retry(3),\r\n map(this.getUserFromWrapper),\r\n catchError(this._error.handleError)\r\n );\r\n }\r\n\r\n /**\r\n * Update the editable data for the specified user.\r\n * @param user The user to update.\r\n */\r\n public updateUser(user: User): Observable<any> {\r\n return this._http\r\n .put(\r\n this._env.get('apiUrl') +\r\n 'users' +\r\n (user.emailConfirmed ? '?confirmed=true' : ''),\r\n user\r\n )\r\n .pipe(catchError(this._error.handleError));\r\n }\r\n\r\n /**\r\n * Request a password reset email for the specified email address.\r\n * @param email The email address to receive the reset message.\r\n */\r\n public resetPassword(email: string): Observable<any> {\r\n return this._http\r\n .post(this._env.get('apiUrl') + 'accounts/resetpassword/request', {\r\n email: email,\r\n })\r\n .pipe(catchError(this._error.handleError));\r\n }\r\n\r\n /**\r\n * Change the password.\r\n * @param change The password change data.\r\n */\r\n public changePassword(change: PasswordChange): Observable<any> {\r\n return this._http\r\n .post(this._env.get('apiUrl') + 'accounts/changepassword', change)\r\n .pipe(catchError(this._error.handleError));\r\n }\r\n\r\n /**\r\n * Delete the user with the specified username.\r\n * @param name The user name.\r\n */\r\n public deleteUser(name: string): Observable<any> {\r\n return this._http\r\n .delete(this._env.get('apiUrl') + 'accounts/' + name)\r\n .pipe(catchError(this._error.handleError));\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { BehaviorSubject, Observable, take, tap } from 'rxjs';\r\n\r\nimport { User } from '@myrmidon/auth-jwt-login';\r\nimport { DataPage } from '@myrmidon/ng-tools';\r\nimport {\r\n PagedListStore,\r\n PagedListStoreService,\r\n} from '@myrmidon/paged-data-browsers';\r\n\r\nimport {\r\n AuthJwtAccountService,\r\n UserFilter,\r\n} from '../../services/auth-jwt-account.service';\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class UserListRepository\r\n implements PagedListStoreService<UserFilter, User>\r\n{\r\n private _store: PagedListStore<UserFilter, User>;\r\n private _activeUser$: BehaviorSubject<User | undefined>;\r\n private _loading$: BehaviorSubject<boolean>;\r\n private _saving$: BehaviorSubject<boolean>;\r\n\r\n public get activeUser$(): Observable<User | undefined> {\r\n return this._activeUser$.asObservable();\r\n }\r\n public get filter$(): Observable<UserFilter> {\r\n return this._store.filter$;\r\n }\r\n public get page$(): Observable<DataPage<User>> {\r\n return this._store.page$;\r\n }\r\n public get loading$(): Observable<boolean> {\r\n return this._loading$.asObservable();\r\n }\r\n public get saving$(): Observable<boolean> {\r\n return this._saving$.asObservable();\r\n }\r\n\r\n constructor(private _accService: AuthJwtAccountService) {\r\n this._store = new PagedListStore<UserFilter, User>(this);\r\n this._activeUser$ = new BehaviorSubject<User | undefined>(undefined);\r\n this._loading$ = new BehaviorSubject<boolean>(false);\r\n this._saving$ = new BehaviorSubject<boolean>(false);\r\n this._store.reset();\r\n }\r\n\r\n public loadPage(\r\n pageNumber: number,\r\n pageSize: number,\r\n filter: UserFilter\r\n ): Observable<DataPage<User>> {\r\n this._loading$.next(true);\r\n return this._accService.getUsers(filter, pageNumber, pageSize).pipe(\r\n tap({\r\n next: () => this._loading$.next(false),\r\n error: () => this._loading$.next(false),\r\n })\r\n );\r\n }\r\n\r\n public async reset(): Promise<void> {\r\n this._loading$.next(true);\r\n try {\r\n await this._store.reset();\r\n } catch (error) {\r\n throw error;\r\n } finally {\r\n this._loading$.next(false);\r\n }\r\n }\r\n\r\n public async setFilter(filter: UserFilter): Promise<void> {\r\n this._loading$.next(true);\r\n try {\r\n await this._store.setFilter(filter);\r\n } catch (error) {\r\n throw error;\r\n } finally {\r\n this._loading$.next(false);\r\n }\r\n }\r\n\r\n public getFilter(): UserFilter {\r\n return this._store.getFilter();\r\n }\r\n\r\n public async setPage(pageNumber: number, pageSize: number): Promise<void> {\r\n this._loading$.next(true);\r\n try {\r\n await this._store.setPage(pageNumber, pageSize);\r\n } catch (error) {\r\n throw error;\r\n } finally {\r\n this._loading$.next(false);\r\n }\r\n }\r\n\r\n public setActiveUser(user: User | null): void {\r\n this._activeUser$.next(user || undefined);\r\n }\r\n\r\n public updateActiveUser(user: User): Promise<boolean> {\r\n const promise: Promise<boolean> = new Promise((resolve, reject) => {\r\n this._saving$.next(true);\r\n\r\n this._accService.updateUser(user).subscribe({\r\n next: (_) => {\r\n this._saving$.next(false);\r\n this._store.reset();\r\n resolve(true);\r\n },\r\n error: (error) => {\r\n this._saving$.next(false);\r\n console.error(\r\n `Error updating user ${user.userName}: ` +\r\n JSON.stringify(error || {})\r\n );\r\n resolve(false);\r\n },\r\n });\r\n });\r\n return promise;\r\n }\r\n\r\n public deleteUser(name: string): Promise<boolean> {\r\n const promise: Promise<boolean> = new Promise((resolve, reject) => {\r\n if (this._activeUser$.value?.userName === name) {\r\n this._activeUser$.next(undefined);\r\n }\r\n\r\n this._saving$.next(true);\r\n\r\n this._accService.deleteUser(name).subscribe({\r\n next: (_) => {\r\n this._saving$.next(false);\r\n this._store.reset();\r\n resolve(true);\r\n },\r\n error: (error) => {\r\n this._saving$.next(false);\r\n console.error(\r\n `Error deleting user ${name}: ` + JSON.stringify(error || {})\r\n );\r\n reject(error);\r\n },\r\n });\r\n });\r\n return promise;\r\n }\r\n}\r\n","import {\r\n Component,\r\n OnChanges,\r\n EventEmitter,\r\n Input,\r\n Output,\r\n SimpleChange,\r\n} from '@angular/core';\r\n\r\n@Component({\r\n selector: 'auth-jwt-password-strength-bar',\r\n templateUrl: './password-strength-bar.component.html',\r\n styleUrls: ['./password-strength-bar.component.css'],\r\n})\r\nexport class PasswordStrengthBarComponent implements OnChanges {\r\n private _colors = ['#F00', '#F90', '#FF0', '#9F0', '#0F0'];\r\n\r\n @Input() passwordToCheck: string | undefined;\r\n\r\n @Output() strengthChange = new EventEmitter<number>();\r\n\r\n public bars: string[];\r\n\r\n constructor() {\r\n this.strengthChange = new EventEmitter<number>();\r\n this.bars = [];\r\n }\r\n\r\n private measureStrength(p: string): number {\r\n let force = 0;\r\n const regex = /[$-/:-?{-~!\"^_`\\[\\]]/g; // \"\r\n\r\n const lowerLetters = /[a-z]+/.test(p);\r\n const upperLetters = /[A-Z]+/.test(p);\r\n const numbers = /[0-9]+/.test(p);\r\n const symbols = regex.test(p);\r\n\r\n const flags = [lowerLetters, upperLetters, numbers, symbols];\r\n\r\n let passedMatches = 0;\r\n for (const flag of flags) {\r\n passedMatches += flag === true ? 1 : 0;\r\n }\r\n\r\n force += 2 * p.length + (p.length >= 10 ? 1 : 0);\r\n force += passedMatches * 10;\r\n\r\n // penalty (short password)\r\n force = p.length <= 6 ? Math.min(force, 10) : force;\r\n\r\n // penalty (poor letiety of characters)\r\n force = passedMatches === 1 ? Math.min(force, 10) : force;\r\n force = passedMatches === 2 ? Math.min(force, 20) : force;\r\n force = passedMatches === 3 ? Math.min(force, 40) : force;\r\n\r\n return force;\r\n }\r\n\r\n private getColor(s: number) {\r\n let idx = 0;\r\n if (s <= 10) {\r\n idx = 0;\r\n } else if (s <= 20) {\r\n idx = 1;\r\n } else if (s <= 30) {\r\n idx = 2;\r\n } else if (s <= 40) {\r\n idx = 3;\r\n } else {\r\n idx = 4;\r\n }\r\n return {\r\n idx: idx + 1,\r\n col: this._colors[idx],\r\n };\r\n }\r\n\r\n ngOnChanges(changes: { [propName: string]: SimpleChange }): void {\r\n const password = changes['passwordToCheck'].currentValue;\r\n this.setBarColors(5, '#DDD');\r\n if (password) {\r\n const strength = this.measureStrength(password);\r\n const c = this.getColor(strength);\r\n this.setBarColors(c.idx, c.col);\r\n this.strengthChange.emit(strength);\r\n }\r\n }\r\n\r\n private setBarColors(count: number, col: string) {\r\n for (let n = 0; n < count; n++) {\r\n this.bars[n] = col;\r\n }\r\n }\r\n}\r\n","<div id=\"strength\">\r\n <small>strength:</small>\r\n <ul id=\"strengthBar\">\r\n <li class=\"point\" [style.background-color]=\"bars[0]\"></li>\r\n <li class=\"point\" [style.background-color]=\"bars[1]\"></li>\r\n <li class=\"point\" [style.background-color]=\"bars[2]\"></li>\r\n <li class=\"point\" [style.background-color]=\"bars[3]\"></li>\r\n <li class=\"point\" [style.background-color]=\"bars[4]\"></li>\r\n </ul>\r\n</div>\r\n","import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core';\r\nimport {\r\n Validators,\r\n AbstractControl,\r\n ValidationErrors,\r\n FormGroup,\r\n FormControl,\r\n FormBuilder,\r\n} from '@angular/forms';\r\nimport { MatSnackBar } from '@angular/material/snack-bar';\r\nimport { Observable } from 'rxjs';\r\nimport { take } from 'rxjs/operators';\r\n\r\nimport {\r\n AuthJwtAccountService,\r\n ExistResult,\r\n RegistrationModel,\r\n} from '../../services/auth-jwt-account.service';\r\nimport { PasswordValidators } from '../../validators/password.validators';\r\nimport { UserListRepository } from '../state/user-list.repository';\r\n\r\n@Component({\r\n selector: 'auth-jwt-registration',\r\n templateUrl: './auth-jwt-registration.component.html',\r\n styleUrls: ['./auth-jwt-registration.component.css'],\r\n})\r\nexport class AuthJwtRegistrationComponent {\r\n public busy: boolean | undefined;\r\n // form\r\n public form: FormGroup;\r\n public email: FormControl<string>;\r\n public name: FormControl<string>;\r\n public firstName: FormControl<string>;\r\n public lastName: FormControl<string>;\r\n public password: FormControl<string>;\r\n public confirmPassword: FormControl<string>;\r\n\r\n /**\r\n * True if the registration should be confirmed automatically.\r\n */\r\n @Input()\r\n public autoConfirm?: boolean;\r\n\r\n /**\r\n * Emitted when a user was successfully registered. Usually\r\n * you should handle this to move away from the registration\r\n * page.\r\n */\r\n @Output()\r\n public registered: EventEmitter<any>;\r\n\r\n public hide = true;\r\n\r\n constructor(\r\n formBuilder: FormBuilder,\r\n private _snackbar: MatSnackBar,\r\n private _accountService: AuthJwtAccountService,\r\n private _userRepository: UserListRepository\r\n ) {\r\n this.registered = new EventEmitter<any>();\r\n // form\r\n this.email = formBuilder.control('', {\r\n validators: [Validators.required, Validators.email],\r\n asyncValidators: this.getUniqueEmailValidator(this._accountService).bind(\r\n this\r\n ),\r\n nonNullable: true,\r\n });\r\n\r\n this.name = formBuilder.control('', {\r\n validators: Validators.required,\r\n asyncValidators: this.getUniqueNameValidator(this._accountService).bind(\r\n this\r\n ),\r\n nonNullable: true,\r\n });\r\n\r\n this.firstName = formBuilder.control('', {\r\n validators: [Validators.required, Validators.maxLength(50)],\r\n nonNullable: true,\r\n });\r\n this.lastName = formBuilder.control('', {\r\n validators: [Validators.required, Validators.maxLength(50)],\r\n nonNullable: true,\r\n });\r\n\r\n // http://stackoverflow.com/questions/35474991/angular-2-form-validating-for-repeat-password\r\n this.password = formBuilder.control('', {\r\n validators: [Validators.required, PasswordValidators.standard()],\r\n nonNullable: true,\r\n });\r\n this.confirmPassword = formBuilder.control('', {\r\n validators: Validators.required,\r\n nonNullable: true,\r\n });\r\n\r\n this.form = formBuilder.group(\r\n {\r\n email: this.email,\r\n name: this.name,\r\n firstName: this.firstName,\r\n lastName: this.lastName,\r\n password: this.password,\r\n confirmPassword: this.confirmPassword,\r\n },\r\n {\r\n validators: [\r\n PasswordValidators.areEqual('password', 'confirmPassword'),\r\n ],\r\n }\r\n );\r\n }\r\n\r\n /**\r\n * Creates a unique name validator. There is no dependency injection at this level,\r\n * but we can use closures. As a matter of fact, we have access to the service instance\r\n * from the component where we register validators. So we will implement a function\r\n * that will accept the service as parameter, and create the actual validation function.\r\n * This function will have access to the service when called during the validation process.\r\n * See http://restlet.com/blog/2016/02/17/implementing-angular2-forms-beyond-basics-part-2/.\r\n */\r\n private getUniqueNameValidator(service: AuthJwtAccountService) {\r\n return (\r\n control: AbstractControl\r\n ):\r\n | Promise<ValidationErrors | null>\r\n | Observable<ValidationErrors | null> => {\r\n return new Promise((resolve, reject) => {\r\n // avoid checking if empty\r\n if (!control.value) {\r\n resolve(null);\r\n } else {\r\n service.isNameRegistered(control.value).subscribe({\r\n next: (data: ExistResult) => {\r\n if (!data.isExisting) {\r\n resolve(null);\r\n } else {\r\n resolve({ uniqueName: true });\r\n }\r\n },\r\n error: (error) => {\r\n console.error(\r\n 'Unique name validator error' +\r\n (error ? JSON.stringify(error) : '')\r\n );\r\n resolve({ uniqueName: true });\r\n },\r\n });\r\n }\r\n });\r\n };\r\n }\r\n\r\n private getUniqueEmailValidator(service: AuthJwtAccountService) {\r\n return (\r\n control: AbstractControl\r\n ):\r\n | Promise<ValidationErrors | null>\r\n | Observable<ValidationErrors | null> => {\r\n return new Promise((resolve, reject) => {\r\n // avoid checking if empty\r\n if (!control.value) {\r\n resolve(null);\r\n } else {\r\n service.isEmailRegistered(control.value).subscribe({\r\n next: (data: ExistResult) => {\r\n if (!data.isExisting) {\r\n resolve(null);\r\n } else {\r\n resolve({ uniqueEmail: true });\r\n }\r\n },\r\n error: (error) => {\r\n console.error(\r\n 'Unique email validator error' +\r\n (error ? JSON.stringify(error) : '')\r\n );\r\n resolve({ uniqueEmail: true });\r\n },\r\n });\r\n }\r\n });\r\n };\r\n }\r\n\r\n public onSubmit(): void {\r\n if (\r\n !this.form.valid ||\r\n this.busy ||\r\n this.name.pending ||\r\n this.email.pending\r\n ) {\r\n return;\r\n }\r\n\r\n const model: RegistrationModel = {\r\n email: this.email.value,\r\n name: this.name.value,\r\n firstName: this.firstName.value,\r\n lastName: this.lastName.value,\r\n password: this.password.value,\r\n };\r\n\r\n this.busy = true;\r\n this._accountService\r\n .register(model, this.autoConfirm)\r\n .pipe(take(1))\r\n .subscribe({\r\n next: () => {\r\n this.busy = false;\r\n this._snackbar.open(\r\n $localize`:auth-jwt-admin:Registration succeeded`,\r\n 'OK'\r\n );\r\n this._userRepository.reset();\r\n this.registered.emit();\r\n },\r\n error: (error) => {\r\n this.busy = false;\r\n console.error(\r\n 'Registration error' + (error ? JSON.stringify(error) : '')\r\n );\r\n this._snackbar.open(\r\n $localize`:auth-jwt-admin:Registration error`,\r\n 'OK'\r\n );\r\n },\r\n });\r\n }\r\n}\r\n","<div>\n <form role=\"form\" [formGroup]=\"form\" (submit)=\"onSubmit()\">\n <fieldset>\n <legend i18n=\"auth-jwt-admin\">registration</legend>\n <!-- email -->\n <div class=\"form-row\">\n <mat-form-field>\n <mat-label i18n>email</mat-label>\n <input\n matInput\n type=\"email\"\n id=\"email\"\n maxlength=\"256\"\n required\n autofocus\n spellcheck=\"false\"\n [formControl]=\"email\"\n />\n @if ( $any(email).errors?.required && (email.dirty || email.touched) )\n {\n <mat-error i18n=\"auth-jwt-admin\">email required</mat-error>\n } @if ($any(email).errors?.email && (email.dirty || email.touched)) {\n <mat-error i18n=\"auth-jwt-admin\">invalid email</mat-error>\n } @if ( $any(email).errors?.uniqueEmail && (email.dirty ||\n email.touched) ) {\n <mat-error i18n=\"auth-jwt-admin\">email already registered</mat-error>\n }\n </mat-form-field>\n @if (email.pending) {\n <mat-icon>hourglass</mat-icon>\n }\n </div>\n\n <!-- name -->\n <div class=\"form-row\">\n <mat-form-field>\n <mat-label i18n=\"auth-jwt-admin\">username</mat-label>\n <input\n matInput\n type=\"text\"\n id=\"name\"\n maxlength=\"50\"\n required\n pattern=\"^[a-zA-Z][a-zA-Z0-9]{2,49}$\"\n spellcheck=\"false\"\n [formControl]=\"name\"\n />\n @if ($any(name).errors?.required && (name.dirty || name.touched)) {\n <mat-error i18n=\"auth-jwt-admin\">username required</mat-error>\n } @if ($any(name).errors?.pattern && (name.dirty || name.touched)) {\n <mat-error i18n=\"auth-jwt-admin\">invalid username</mat-error>\n } @if ( $any(name).errors?.uniqueName && (name.dirty || name.touched)\n ) {\n <mat-error i18n=\"auth-jwt-admin\"\n >username already registered</mat-error\n >\n }\n </mat-form-field>\n @if (name.pending) {\n <mat-icon>hourglass</mat-icon>\n }\n </div>\n\n <!-- first name -->\n <div>\n <mat-form-field>\n <mat-label i18n=\"auth-jwt-admin\">first name</mat-label>\n <input\n matInput\n type=\"text\"\n id=\"firstName\"\n maxlength=\"50\"\n required\n spellcheck=\"false\"\n [formControl]=\"firstName\"\n />\n @if ( firstName.hasError('required') && (firstName.dirty ||\n firstName.touched) ) {\n <mat-error i18n=\"auth-jwt-admin\" class=\"text-danger small\">\n first name required\n </mat-error>\n }\n </mat-form-field>\n </div>\n\n <!-- last name -->\n <div>\n <mat-form-field>\n <mat-label i18n=\"auth-jwt-admin\">last name</mat-label>\n <input\n matInput\n type=\"text\"\n id=\"lastName\"\n maxlength=\"50\"\n required\n spellcheck=\"false\"\n [formControl]=\"lastName\"\n />\n @if ( lastName.hasError('required') && (lastName.dirty ||\n lastName.touched) ) {\n <mat-error i18n=\"auth-jwt-admin\" class=\"text-danger small\">\n last name required\n </mat-error>\n }\n </mat-form-field>\n </div>\n\n <!-- <div [formGroup]=\"passwords\"> -->\n <!-- password -->\n <div>\n <mat-form-field>\n <mat-label i18n=\"auth-jwt-admin\">password</mat-label>\n <input\n matInput\n [type]=\"hide ? 'password' : 'text'\"\n name=\"password\"\n autocomplete=\"new-password\"\n maxlength=\"50\"\n required\n spellcheck=\"false\"\n [formControl]=\"password\"\n />\n <button\n type=\"button\"\n mat-icon-button\n matSuffix\n (click)=\"hide = !hide\"\n i18n-aria-label=\"auth-jwt-login\"\n aria-label=\"Hide password\"\n [attr.aria-pressed]=\"hide\"\n >\n <mat-icon>{{ hide ? \"visibility_off\" : \"visibility\" }}</mat-icon>\n </button>\n <auth-jwt-password-strength-bar [passwordToCheck]=\"password.value\">\n </auth-jwt-password-strength-bar>\n @if ( $any(password).errors?.required && (password.dirty ||\n password.touched) ) {\n <mat-error i18n=\"auth-jwt-admin\">password required</mat-error>\n } @if ( $any(password).errors?.passwordtooshort && (password.dirty ||\n password.touched) ) {\n <mat-error i18n=\"auth-jwt-admin\">at least 8 characters</mat-error>\n } @if ( $any(password).errors?.noupperinpassword && (password.dirty ||\n password.touched) ) {\n <mat-error i18n=\"auth-jwt-admin\"\n >at least 1 uppercase letter</mat-error\n >\n } @if ( $any(password).errors?.nolowerinpassword && (password.dirty ||\n password.touched) ) {\n <mat-error i18n=\"auth-jwt-admin\"\n >at least 1 lowercase letter</mat-error\n >\n } @if ( $any(password).errors?.nosymbolinpassword && (password.dirty\n || password.touched) ) {\n <mat-error i18n=\"auth-jwt-admin\"\n >at least 1 punctuation/symbol</mat-error\n >\n }\n </mat-form-field>\n </div>\n\n <!-- confirm password -->\n <div>\n <mat-form-field>\n <mat-label i18n=\"auth-jwt-admin\">confirm password</mat-label>\n <input\n matInput\n [type]=\"hide ? 'password' : 'text'\"\n name=\"confirmPassword\"\n maxlength=\"50\"\n required\n spellcheck=\"false\"\n [formControl]=\"confirmPassword\"\n />\n </mat-form-field>\n </div>\n @if (form.errors?.areequal && confirmPassword.touched) {\n <div i18n=\"auth-jwt-admin\" style=\"color: red\">\n password differs from confirmation password\n </div>\n }\n\n <button\n i18n=\"auth-jwt-admin\"\n mat-flat-button\n type=\"submit\"\n color=\"primary\"\n class=\"mat-primary\"\n [disabled]=\"\n form.invalid || form.pristine || busy || name.pending || email.pending\n \"\n >\n register\n </button>\n @if (busy) {\n <mat-progress-spinner diameter=\"20\"></mat-progress-spinner>\n }\n </fieldset>\n </form>\n\n <details>\n <summary i18n=\"auth-jwt-admin\">Hints</summary>\n <div class=\"info\">\n <p i18n=\"auth-jwt-admin\">\n To register a new user, you must provide his email address, choose a\n password, and choose a username, which must be unique (you will be\n notified if another user has already taken that name). The username must\n include only letters/digits, start with a letter, and be no shorter than\n 3 characters, nor longer than 50.\n </p>\n <p i18n=\"auth-jwt-admin\">\n To promote a decent security level, the password must include at least 8\n characters, uppercase and lowercase letters, digits, and punctuation\n (like dashes, stops, parentheses, etc.).\n </p>\n <p i18n=\"auth-jwt-admin\">\n Once registered, if messaging is enabled on the server side the user\n will receive an email message to the email address you specified; he\n will have to click on the provided link to complete the registration\n process. Otherwise, you should edit the newly created user and confirm\n the email registration.\n </p>\n </div>\n </details>\n</div>\n","import { Component, Input, Output, OnInit, EventEmitter } from '@angular/core';\r\nimport { FormBuilder, FormControl, FormGroup } from '@angular/forms';\r\nimport { Observable } from 'rxjs';\r\n\r\nimport { UserFilter } from '../../services/auth-jwt-account.service';\r\n\r\n@Component({\r\n selector: 'auth-jwt-user-filter',\r\n templateUrl: './user-filter.component.html',\r\n styleUrls: ['./user-filter.component.css'],\r\n})\r\nexport class UserFilterComponent {\r\n private _filter?: UserFilter;\r\n\r\n @Input()\r\n public get filter(): UserFilter | null | undefined {\r\n return this._filter;\r\n }\r\n public set filter(value: UserFilter | null | undefined) {\r\n if (this._filter === value) {\r\n return;\r\n }\r\n this._filter = value || undefined;\r\n this.updateForm(this._filter);\r\n }\r\n\r\n @Input()\r\n public disabled: boolean | undefined;\r\n\r\n /**\r\n * Event emitted when the filter changes.\r\n */\r\n @Output()\r\n public filterChange: EventEmitter<UserFilter>;\r\n\r\n public name: FormControl<string | null>;\r\n public form: FormGroup;\r\n\r\n constructor(formBuilder: FormBuilder) {\r\n // form\r\n this.name = formBuilder.control<string | null>(null);\r\n this.form = formBuilder.group({\r\n name: this.name,\r\n });\r\n // event\r\n this.filterChange = new EventEmitter<UserFilter>();\r\n }\r\n\r\n private updateForm(filter?: UserFilter): void {\r\n if (!filter) {\r\n this.form.reset();\r\n return;\r\n }\r\n this.name.setValue(filter.name || null);\r\n this.form.markAsPristine();\r\n }\r\n\r\n private getFilter(): UserFilter {\r\n return {\r\n name: this.name.value?.trim(),\r\n };\r\n }\r\n\r\n public reset(): void {\r\n this.form.reset();\r\n this._filter = {};\r\n this.filterChange.emit(this._filter);\r\n }\r\n\r\n public apply(): void {\r\n this._filter = this.getFilter();\r\n this.filterChange.emit(this._filter);\r\n }\r\n}\r\n","<form [formGroup]=\"form\" (submit)=\"apply()\" ng-disabled=\"disabled\">\r\n <div class=\"form-row\">\r\n <mat-form-field>\r\n <mat-label i18n=\"auth-jwt-admin\">name or ID</mat-label>\r\n <input matInput [formControl]=\"name\" />\r\n <button\r\n mat-icon-button\r\n matSuffix\r\n type=\"button\"\r\n (click)=\"reset()\"\r\n color=\"warn\"\r\n i18n-matTooltip=\"auth-jwt-admin\"\r\n matTooltip=\"Reset filters\"\r\n [disabled]=\"disabled\"\r\n >\r\n <mat-icon class=\"mat-warn\">clear</mat-icon>\r\n </button>\r\n </mat-form-field>\r\n\r\n <button\r\n id=\"apply\"\r\n type=\"submit\"\r\n mat-icon-button\r\n color=\"primary\"\r\n [disabled]=\"disabled\"\r\n i18n-matTooltip=\"auth-jwt-admin\"\r\n matTooltip=\"Apply filters\"\r\n >\r\n <mat-icon class=\"mat-primary\">check_circle</mat-icon>\r\n </button>\r\n </div>\r\n</form>\r\n","import { Component, OnInit, Input, Output, EventEmitter } from '@angular/core';\r\nimport {\r\n UntypedFormGroup,\r\n UntypedFormControl,\r\n UntypedFormBuilder,\r\n Validators,\r\n} from '@angular/forms';\r\nimport { AuthJwtService, User } from '@myrmidon/auth-jwt-login';\r\n\r\n@Component({\r\n selector: 'auth-jwt-user-editor',\r\n templateUrl: './user-editor.component.html',\r\n styleUrls: ['./user-editor.component.css'],\r\n})\r\nexport class UserEditorComponent implements OnInit {\r\n private _user: User | undefined;\r\n\r\n public email: UntypedFormControl;\r\n public emailConfirmed: UntypedFormControl;\r\n public lockoutEnabled: UntypedFormControl;\r\n public firstName: UntypedFormControl;\r\n public lastName: UntypedFormControl;\r\n public roles: UntypedFormControl;\r\n public form: UntypedFormGroup;\r\n\r\n public unlocked: boolean | undefined;\r\n\r\n @Input() public set user(value: User | undefined) {\r\n this._user = value;\r\n this.updateForm(value);\r\n }\r\n public get user(): User | undefined {\r\n return this._user;\r\n }\r\n\r\n @Output() userChange: EventEmitter<User>;\r\n @Output() editorClose: EventEmitter<any>;\r\n\r\n constructor(formBuilder: UntypedFormBuilder, private _authService: AuthJwtService) {\r\n // events\r\n this.userChange = new EventEmitter<User>();\r\n this.editorClose = new EventEmitter<any>();\r\n // form\r\n this.email = formBuilder.control(null, [\r\n Validators.required,\r\n Validators.email,\r\n ]);\r\n this.emailConfirmed = formBuilder.control(false);\r\n this.lockoutEnabled = formBuilder.control(false);\r\n this.firstName = formBuilder.control(null, [\r\n Validators.required,\r\n Validators.maxLength(50),\r\n ]);\r\n this.lastName = formBuilder.control(null, [\r\n Validators.required,\r\n Validators.maxLength(50),\r\n ]);\r\n this.roles = formBuilder.control(null, Validators.maxLength(200));\r\n\r\n this.form = formBuilder.group({\r\n email: this.email,\r\n emailConfirmed: this.emailConfirmed,\r\n lockoutEnabled: this.lockoutEnabled,\r\n firstName: this.firstName,\r\n lastName: this.lastName,\r\n roles: this.roles,\r\n });\r\n }\r\n\r\n ngOnInit(): void {}\r\n\r\n private updateForm(user: User | undefined): void {\r\n if (!user) {\r\n this.form.reset();\r\n } else {\r\n this.email.setValue(user.email);\r\n this.emailConfirmed.setValue(user.emailConfirmed);\r\n this.lockoutEnabled.setValue(user.lockoutEnabled);\r\n this.firstName.setValue(user.firstName);\r\n this.lastName.setValue(user.lastName);\r\n if (user.roles?.length > 0) {\r\n this.roles.setValue(user.roles.join(' '));\r\n } else {\r\n this.roles.setValue(null);\r\n }\r\n }\r\n }\r\n\r\n private getUserFromForm(): User {\r\n return {\r\n userName: this._user?.userName || '',\r\n email: this.email.value,\r\n emailConfirmed: this.emailConfirmed.value,\r\n lockoutEnabled: this.lockoutEnabled.value,\r\n firstName: this.firstName.value,\r\n lastName: this.lastName.value,\r\n roles: this.roles.value\r\n ? this.roles.value.split(' ').filter((s: string) => s)\r\n : [],\r\n };\r\n }\r\n\r\n public endLockout(): void {\r\n if (this.unlocked) {\r\n return;\r\n }\r\n this._user!.lockoutEnd = this._authService.getUTCDate();\r\n this.unlocked = true;\r\n }\r\n\r\n public close(): void {\r\n this.editorClose.emit();\r\n }\r\n\r\n public save(): void {\r\n if (this.form.invalid) {\r\n return;\r\n }\r\n this.userChange.emit(this.getUserFromForm());\r\n }\r\n}\r\n","<form [formGroup]=\"form\" (submit)=\"save()\">\n <div class=\"form-row\">\n <!-- email -->\n <mat-form-field>\n <mat-label i18n=\"auth-jwt-admin\">email</mat-label>\n <input type=\"text\" matInput [formControl]=\"email\" />\n @if (email.hasError('required') && (email.dirty || email.touched)) {\n <mat-error i18n=\"auth-jwt-admin\"> email address required </mat-error>\n } @if (email.hasError('pattern') && (email.dirty || email.touched)) {\n <mat-error i18n=\"auth-jwt-admin\"> invalid email address </mat-error>\n }\n </mat-form-field>\n\n <!-- emailConfirmed -->\n <mat-checkbox [formControl]=\"emailConfirmed\" i18n=\"auth-jwt-admin\"\n >email address confirmed</mat-checkbox\n >\n </div>\n\n <!-- lockoutEnabled -->\n <div class=\"form-row\">\n <mat-checkbox [formControl]=\"lockoutEnabled\" i18n=\"auth-jwt-admin\"\n >lockout enabled</mat-checkbox\n >\n <button\n type=\"button\"\n mat-icon-button\n color=\"primary\"\n (click)=\"endLockout()\"\n [disabled]=\"unlocked\"\n i18n-matTooltip=\"auth-jwt-admin\"\n matTooltip=\"Unlock this user if locked\"\n >\n <mat-icon class=\"mat-primary\">lock_open</mat-icon>\n </button>\n </div>\n\n <div class=\"form-row\">\n <!-- firstName -->\n <mat-form-field>\n <mat-label i18n=\"auth-jwt-admin\">first name</mat-label>\n <input type=\"text\" matInput [formControl]=\"firstName\" />\n @if ( firstName.hasError('required') && (firstName.dirty ||\n firstName.touched) ) {\n <mat-error i18n=\"auth-jwt-admin\"> first name required </mat-error>\n } @if ( firstName.hasError('maxlength') && (firstName.dirty ||\n firstName.touched) ) {\n <mat-error i18n=\"auth-jwt-admin\"> first name too long </mat-error>\n }\n </mat-form-field>\n\n <!-- lastName -->\n <mat-form-field>\n <mat-label i18n=\"auth-jwt-admin\">last name</mat-label>\n <input type=\"text\" matInput [formControl]=\"lastName\" />\n @if ( lastName.hasError('required') && (lastName.dirty ||\n lastName.touched) ) {\n <mat-error i18n=\"auth-jwt-admin\"> last name required </mat-error>\n } @if ( lastName.hasError('maxlength') && (lastName.dirty ||\n lastName.touched) ) {\n <mat-error i18n=\"auth-jwt-admin\"> last name too long </mat-error>\n }\n </mat-form-field>\n </div>\n\n <!-- roles -->\n <div>\n <mat-form-field style=\"width: 16em\">\n <mat-label i18n=\"auth-jwt-admin\">roles</mat-label>\n <input type=\"text\" matInput [formControl]=\"roles\" />\n @if (roles.hasError('maxlength') && (roles.dirty || roles.touched)) {\n <mat-error i18n=\"auth-jwt-admin\"> too long </mat-error>\n }\n <mat-hint i18n>roles (separated by space)</mat-hint>\n </mat-form-field>\n </div>\n\n <!-- buttons -->\n <br />\n <div>\n <button\n type=\"button\"\n mat-icon-button\n color=\"warn\"\n i18n-matTooltip=\"auth-jwt-admin\"\n matTooltip=\"Close\"\n (click)=\"close()\"\n >\n <mat-icon class=\"mat-warn\">cancel</mat-icon>\n </button>\n <button\n type=\"submit\"\n mat-icon-button\n color=\"primary\"\n [disabled]=\"form.invalid\"\n i18n-matTooltip=\"auth-jwt-admin\"\n matTooltip=\"Save user\"\n >\n <mat-icon class=\"mat-primary\">check_circle</mat-icon>\n </button>\n </div>\n</form>\n","import { Component } from '@angular/core';\r\nimport { PageEvent } from '@angular/material/paginator';\r\nimport { Observable } from 'rxjs';\r\nimport '@angular/localize/init';\r\n\r\nimport { GravatarService, User } from '@myrmidon/auth-jwt-login';\r\nimport { DataPage } from '@myrmidon/ng-tools';\r\nimport { DialogService } from '@myrmidon/ng-mat-tools';\r\n\r\nimport { UserListRepository } from '../state/user-list.repository';\r\nimport { UserFilter } from '../../services/auth-jwt-account.service';\r\n\r\n@Component({\r\n selector: 'auth-jwt-user-list',\r\n templateUrl: './user-list.component.html',\r\n styleUrls: ['./user-list.component.css'],\r\n})\r\nexport class UserListComponent {\r\n public active$: Observable<User | undefined>;\r\n public loading$: Observable<boolean>;\r\n public filter$: Observable<UserFilter>;\r\n public page$: Observable<DataPage<User>>;\r\n\r\n constructor(\r\n private _repository: UserListRepository,\r\n private _dialogService: DialogService,\r\n private _gravatarService: GravatarService\r\n ) {\r\n this.filter$ = _repository.filter$;\r\n this.page$ = _repository.page$;\r\n this.active$ = _repository.activeUser$;\r\n this.loading$ = _repository.loading$;\r\n }\r\n\r\n public reset(): void {\r\n this._repository.reset();\r\n }\r\n\r\n public onFilterChange(filter: UserFilter): void {\r\n this._repository.setFilter(filter);\r\n }\r\n\r\n public onPageChange(event: PageEvent): void {\r\n this._repository.setPage(event.pageIndex + 1, event.pageSize);\r\n }\r\n\r\n public deleteUser(user: User): void {\r\n this._dialogService\r\n .confirm(\r\n $localize`:auth-jwt-admin:Confirm`,\r\n $localize`:auth-jwt-admin:Delete user ` + user.userName + '?'\r\n )\r\n .subscribe((yes) => {\r\n if (yes) {\r\n this._repository.deleteUser(user.userName);\r\n }\r\n });\r\n }\r\n\r\n public setActiveUser(user: User | null): void {\r\n this._repository.setActiveUser(user);\r\n }\r\n\r\n public resetActiveUser(): void {\r\n this._repository.setActiveUser(null);\r\n }\r\n\r\n public saveActiveUser(user: User): void {\r\n this._repository.updateActiveUser(user);\r\n this._repository.setActiveUser(null);\r\n }\r\n\r\n public onUserEditorClose(): void {\r\n this._repository.setActiveUser(null);\r\n }\r\n\r\n public getGravatarUrl(email: string, size = 80): string | null {\r\n return this._gravatarService.buildGravatarUrl(email, size);\r\n }\r\n}\r\n","<div id=\"container\">\n <div>\n <!-- filters -->\n <div id=\"filters\">\n <auth-jwt-user-filter\n [filter]=\"filter$ | async\"\n (filterChange)=\"onFilterChange($event)\"\n ></auth-jwt-user-filter>\n </div>\n\n <!-- list -->\n @if (page$ | async; as page) {\n <div id=\"list\">\n @if (loading$ | async) {\n <div>\n <mat-progress-bar mode=\"indeterminate\"></mat-progress-bar>\n </div>\n }\n <table>\n <thead>\n <td></td>\n <td></td>\n <th i18n=\"auth-jwt-admin\">name</th>\n <th i18n=\"auth-jwt-admin\" class=\"noif-lt-md\">first</th>\n <th i18n=\"auth-jwt-admin\" class=\"noif-lt-md\">last</th>\n <th i18n=\"auth-jwt-admin\" class=\"noif-lt-md\">email</th>\n <th i18n=\"auth-jwt-admin\">roles</th>\n <th i18n=\"auth-jwt-admin\" class=\"noif-lt-md\">lock end</th>\n </thead>\n <tbody>\n @for (user of page.items; track user) {\n <tr>\n <td class=\"fit-width\">\n <button\n mat-icon-button\n type=\"button\"\n i18n-matTooltip=\"auth-jwt-admin\"\n matTooltip=\"Edit this user\"\n color=\"primary\"\n (click)=\"setActiveUser(user)\"\n >\n <mat-icon class=\"mat-primary\">mode_edit</mat-icon>\n </button>\n <button\n mat-icon-button\n type=\"button\"\n i18n-matTooltip=\"auth-jwt-admin\"\n matTooltip=\"Delete this user\"\n color=\"warn\"\n (click)=\"deleteUser(user)\"\n >\n <mat-icon class=\"mat-warn\">remove_circle</mat-icon>\n </button>\n </td>\n <td class=\"fit-width\">\n <img\n alt=\"avatar\"\n [src]=\"getGravatarUrl(user.email, 32)\"\n [alt]=\"user.userName\"\n />\n </td>\n <td>{{ user.userName }}</td>\n <td class=\"noif-lt-md\">{{ user.firstName }}</td>\n <td class=\"noif-lt-md\">{{ user.lastName }}</td>\n <td class=\"noif-lt-md\">\n <a [href]=\"'mailto:' + user.email\">{{ user.email }}</a>\n </td>\n <td>{{ user.roles.join(\" \") }}</td>\n <td class=\"noif-lt-md\">{{ user.lockoutEnd }}</td>\n </tr>\n }\n </tbody>\n </table>\n <!-- paginator -->\n <div class=\"form-row\">\n <button\n type=\"button\"\n mat-icon-button\n color=\"warn\"\n i18n-matmatTooltip=\"auth-jwt-admin\"\n matTooltip=\"Refresh list\"\n (click)=\"reset()\"\n >\n <mat-icon class=\"mat-warn\">autorenew</mat-icon>\n </button>\n <mat-paginator\n [length]=\"page.total\"\n [pageIndex]=\"page.pageNumber - 1\"\n [pageSize]=\"page.pageSize\"\n [pageSizeOptions]=\"[5, 10, 20, 50, 100]\"\n (page)=\"onPageChange($event)\"\n [showFirstLastButtons]=\"true\"\n ></mat-paginator>\n </div>\n </div>\n }\n </div>\n\n <!-- editor -->\n <mat-expansion-panel\n id=\"editor\"\n [expanded]=\"active$ | async\"\n [disabled]=\"!(active$ | async)\"\n >\n @if (active$ | async; as active) {\n <div>\n <fieldset>\n <legend>{{ active.userName }}</legend>\n <auth-jwt-user-editor\n [user]=\"active\"\n (userChange)=\"saveActiveUser($event)\"\n (editorClose)=\"resetActiveUser()\"\n ></auth-jwt-user-editor>\n </fieldset>\n </div>\n }\n </mat-expansion-panel>\n</div>\n","import { CommonModule } from '@angular/common';\nimport { NgModule } from '@angular/core';\nimport { RouterModule } from '@angular/router';\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\n\nimport { MatCardModule } from '@angular/material/card';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatCheckboxModule } from '@angular/material/checkbox';\nimport { MatExpansionModule } from '@angular/material/expansion';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { MatPaginatorModule } from '@angular/material/paginator';\nimport { MatProgressBarModule } from '@angular/material/progress-bar';\nimport { MatProgressSpinnerModule } from '@angular/material/progress-spinner';\nimport { MatSnackBarModule } from '@angular/material/snack-bar';\nimport { MatDialogModule } from '@angular/material/dialog';\n\nimport { AuthJwtLoginModule } from '@myrmidon/auth-jwt-login';\nimport { NgToolsModule } from '@myrmidon/ng-tools';\n\nimport { AuthJwtRegistrationComponent } from './components/auth-jwt-registration/auth-jwt-registration.component';\nimport { PasswordStrengthBarComponent } from './components/password-strength-bar/password-strength-bar.component';\nimport { UserFilterComponent } from './components/user-filter/user-filter.component';\nimport { UserListComponent } from './components/user-list/user-list.component';\nimport { UserEditorComponent } from './components/user-editor/user-editor.component';\n\n@NgModule({\n declarations: [\n AuthJwtRegistrationComponent,\n PasswordStrengthBarComponent,\n UserFilterComponent,\n UserListComponent,\n UserEditorComponent,\n ],\n exports: [\n AuthJwtRegistrationComponent,\n PasswordStrengthBarComponent,\n UserFilterComponent,\n UserListComponent,\n ],\n imports: [\n CommonModule,\n FormsModule,\n RouterModule,\n ReactiveFormsModule,\n // material\n MatButtonModule,\n MatCardModule,\n MatCheckboxModule,\n MatDialogModule,\n MatExpansionModule,\n MatIconModule,\n MatInputModule,\n MatPaginatorModule,\n MatProgressBarModule,\n MatProgressSpinnerModule,\n MatSnackBarModule,\n MatTooltipModule,\n AuthJwtLoginModule,\n NgToolsModule,\n ],\n})\nexport class AuthJwtAdminModule {}\n","/*\r\n * Public API Surface of auth-jwt-admin\r\n */\r\n\r\nexport * from './lib/components/auth-jwt-registration/auth-jwt-registration.component';\r\nexport * from './lib/components/password-strength-bar/password-strength-bar.component';\r\nexport * from './lib/components/user-filter/user-filter.component';\r\nexport * from './lib/components/user-list/user-list.component';\r\nexport * from './lib/components/state/user-list.repository';\r\nexport * from './lib/services/auth-jwt-account.service';\r\nexport * from './lib/validators/password.validators';\r\nexport * from './lib/auth-jwt-admin.module';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1.AuthJwtAccountService","i1","i2","i3.AuthJwtAccountService","i4.UserListRepository","i10.PasswordStrengthBarComponent","i3","i4","i5","i6","i7","i8","i1.UserListRepository","i9","i10.UserFilterComponent","i11.UserEditorComponent"],"mappings":"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"}
1
+ {"version":3,"file":"myrmidon-auth-jwt-admin.mjs","sources":["../../../../projects/myrmidon/auth-jwt-admin/src/lib/validators/password.validators.ts","../../../../projects/myrmidon/auth-jwt-admin/src/lib/services/auth-jwt-account.service.ts","../../../../projects/myrmidon/auth-jwt-admin/src/lib/components/state/user-list.repository.ts","../../../../projects/myrmidon/auth-jwt-admin/src/lib/components/password-strength-bar/password-strength-bar.component.ts","../../../../projects/myrmidon/auth-jwt-admin/src/lib/components/password-strength-bar/password-strength-bar.component.html","../../../../projects/myrmidon/auth-jwt-admin/src/lib/components/auth-jwt-registration/auth-jwt-registration.component.ts","../../../../projects/myrmidon/auth-jwt-admin/src/lib/components/auth-jwt-registration/auth-jwt-registration.component.html","../../../../projects/myrmidon/auth-jwt-admin/src/lib/components/user-filter/user-filter.component.ts","../../../../projects/myrmidon/auth-jwt-admin/src/lib/components/user-filter/user-filter.component.html","../../../../projects/myrmidon/auth-jwt-admin/src/lib/components/user-editor/user-editor.component.ts","../../../../projects/myrmidon/auth-jwt-admin/src/lib/components/user-editor/user-editor.component.html","../../../../projects/myrmidon/auth-jwt-admin/src/lib/components/user-list/user-list.component.ts","../../../../projects/myrmidon/auth-jwt-admin/src/lib/components/user-list/user-list.component.html","../../../../projects/myrmidon/auth-jwt-admin/src/lib/auth-jwt-admin.module.ts","../../../../projects/myrmidon/auth-jwt-admin/src/public-api.ts","../../../../projects/myrmidon/auth-jwt-admin/src/myrmidon-auth-jwt-admin.ts"],"sourcesContent":["import {\r\n AbstractControl,\r\n FormGroup,\r\n UntypedFormGroup,\r\n ValidationErrors,\r\n ValidatorFn,\r\n} from '@angular/forms';\r\n\r\nexport class PasswordValidators {\r\n /** \"Standard\" password validator for my API services. */\r\n public static standard(): ValidatorFn {\r\n return (control: AbstractControl): ValidationErrors | null => {\r\n if (!control.value) {\r\n return null;\r\n }\r\n\r\n if (control.value.length < 8) {\r\n return {\r\n passwordtooshort: true,\r\n };\r\n }\r\n\r\n if (!/.*[A-Z].*/.test(control.value)) {\r\n return {\r\n noupperinpassword: true,\r\n };\r\n }\r\n\r\n if (!/.*[a-z].*/.test(control.value)) {\r\n return {\r\n nolowerinpassword: true,\r\n };\r\n }\r\n\r\n if (!/.*[A-Z].*/.test(control.value)) {\r\n return {\r\n noupperinpassword: true,\r\n };\r\n }\r\n\r\n if (!/.*[-`~!@#$%^&*()_+=\\[\\]{};:'\",.<>/?|\\\\].*/.test(control.value)) {\r\n return {\r\n nosymbolinpassword: true,\r\n };\r\n }\r\n\r\n return null;\r\n };\r\n }\r\n\r\n public static areEqual(\r\n controlName: string,\r\n otherControlName: string\r\n ): ValidatorFn {\r\n return (control: AbstractControl): ValidationErrors | null => {\r\n const g = control as FormGroup | UntypedFormGroup;\r\n const a = g.controls[controlName];\r\n const b = g.controls[otherControlName];\r\n return a.value !== b.value\r\n ? {\r\n areequal: true,\r\n }\r\n : null;\r\n };\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { HttpClient, HttpParams } from '@angular/common/http';\r\nimport { Observable } from 'rxjs';\r\nimport { retry, catchError, map } from 'rxjs/operators';\r\n\r\nimport { DataPage, EnvService, ErrorService } from '@myrmidon/ng-tools';\r\nimport { User } from '@myrmidon/auth-jwt-login';\r\n\r\n/**\r\n * User registration model. You can expand this interface to add more data.\r\n */\r\nexport interface RegistrationModel {\r\n email: string;\r\n name: string;\r\n firstName?: string;\r\n lastName?: string;\r\n password: string;\r\n}\r\n\r\n/**\r\n * Result of an existing resource check.\r\n */\r\nexport interface ExistResult {\r\n entry: string;\r\n isExisting: boolean;\r\n}\r\n\r\n/**\r\n * Password change data.\r\n */\r\nexport interface PasswordChange {\r\n email: string;\r\n oldPassword: string;\r\n newPassword: string;\r\n confirmPassword: string;\r\n}\r\n\r\n/**\r\n * User filter parameters.\r\n */\r\nexport interface UserFilter {\r\n name?: string;\r\n}\r\n\r\n/**\r\n * The type of user data returned by the server.\r\n */\r\ninterface UserWithRoles<T> {\r\n user: T;\r\n roles?: string[];\r\n}\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class AuthJwtAccountService {\r\n constructor(\r\n private _http: HttpClient,\r\n private _error: ErrorService,\r\n private _env: EnvService\r\n ) {}\r\n\r\n /**\r\n * Checks if the specified email address is registered on the server.\r\n * @param email email address to test.\r\n * @returns result.\r\n */\r\n public isEmailRegistered(email: string): Observable<ExistResult> {\r\n return this._http.get<ExistResult>(\r\n this._env.get('apiUrl') +\r\n 'accounts/emailexists/' +\r\n encodeURIComponent(email)\r\n );\r\n }\r\n\r\n /**\r\n * Checks if the specified user's given name is registered on the server.\r\n * This name is a nickname chosen by users during registration, and is the key\r\n * used for referencing users when talking to the server.\r\n * @param name name to test.\r\n * @returns result.\r\n */\r\n public isNameRegistered(name: string): Observable<ExistResult> {\r\n return this._http.get<ExistResult>(\r\n this._env.get('apiUrl') +\r\n 'accounts/nameexists/' +\r\n encodeURIComponent(name)\r\n );\r\n }\r\n\r\n /**\r\n * Register the user with the specified registration data.\r\n * @param registration The registration data.\r\n * @param confirmed True to automatically confirm the user's email address\r\n * without sending the confirmation email message.\r\n */\r\n public register(\r\n registration: RegistrationModel,\r\n confirmed = false\r\n ): Observable<any> {\r\n return this._http.post(\r\n this._env.get('apiUrl') +\r\n 'accounts/register' +\r\n (confirmed ? '?confirmed=true' : ''),\r\n registration\r\n );\r\n }\r\n\r\n /**\r\n * Resend the confirmation email to the specified address.\r\n * @param email address.\r\n */\r\n public resendConfirmEmail(email: string): Observable<any> {\r\n return this._http.get(\r\n this._env.get('apiUrl') +\r\n 'accounts/resendconfirm/' +\r\n encodeURIComponent(email)\r\n // options\r\n );\r\n }\r\n\r\n /**\r\n * Request a password reset for the specified email address.\r\n * @param email Email address.\r\n */\r\n public requestPasswordReset(email: string): Observable<any> {\r\n return this._http.post(\r\n this._env.get('apiUrl') + 'accounts/resetpassword/request',\r\n { email }\r\n );\r\n }\r\n\r\n private getUserFromWrapper(response: UserWithRoles<User> | User): User {\r\n return (response as UserWithRoles<User>).user\r\n ? {\r\n ...((response as UserWithRoles<User>).user as User),\r\n roles: response.roles || [],\r\n }\r\n : (response as User);\r\n }\r\n\r\n public getAllUsers(): Observable<DataPage<User>> {\r\n return this._http\r\n .get<DataPage<UserWithRoles<User> | User>>(\r\n this._env.get('apiUrl') + 'users',\r\n {\r\n params: new HttpParams().set('pageNumber', '1'),\r\n }\r\n )\r\n .pipe(\r\n retry(3),\r\n map((dataPage: DataPage<UserWithRoles<User> | User>) => {\r\n return {\r\n ...dataPage,\r\n items: dataPage.items.map(this.getUserFromWrapper),\r\n };\r\n }),\r\n catchError(this._error.handleError)\r\n );\r\n }\r\n\r\n public getUsers(\r\n filter: UserFilter,\r\n pageNumber = 1,\r\n pageSize = 20\r\n ): Observable<DataPage<User>> {\r\n let httpParams = new HttpParams();\r\n httpParams = httpParams.set('pageNumber', pageNumber.toString());\r\n httpParams = httpParams.set('pageSize', pageSize.toString());\r\n if (filter.name) {\r\n httpParams = httpParams.set('name', filter.name);\r\n }\r\n\r\n return this._http\r\n .get<DataPage<UserWithRoles<User>>>(this._env.get('apiUrl') + 'users', {\r\n params: httpParams,\r\n })\r\n .pipe(\r\n retry(3),\r\n map((dataPage: DataPage<UserWithRoles<User>>) => {\r\n return {\r\n ...dataPage,\r\n items: dataPage.items.map(this.getUserFromWrapper),\r\n };\r\n }),\r\n catchError(this._error.handleError)\r\n );\r\n }\r\n /**\r\n * Get the top N users matching the specified name filter.\r\n * @param nameFilter The user name filter.\r\n * @param limit The maximum number of users to get.\r\n */\r\n public getTopUsers(nameFilter: string, limit = 10): Observable<User[]> {\r\n let httpParams = new HttpParams();\r\n httpParams = httpParams.set('pageNumber', '1');\r\n httpParams = httpParams.set('pageSize', limit.toString());\r\n if (nameFilter) {\r\n httpParams = httpParams.set('name', nameFilter);\r\n }\r\n const options =\r\n httpParams.keys().length > 0\r\n ? {\r\n params: httpParams,\r\n }\r\n : {};\r\n\r\n return this._http\r\n .get<UserWithRoles<User>[]>(this._env.get('apiUrl') + 'users', options)\r\n .pipe(\r\n retry(3),\r\n map((users: UserWithRoles<User>[]) => {\r\n return users.map(this.getUserFromWrapper);\r\n }),\r\n catchError(this._error.handleError)\r\n );\r\n }\r\n\r\n /**\r\n * Get information about all the users listed in the specified names.\r\n * @param names User(s) names.\r\n */\r\n public getUsersFromNames(names: string[]): Observable<User[]> {\r\n let httpParams = new HttpParams();\r\n if (names && names.length > 0) {\r\n httpParams = httpParams.set('names', names.join(','));\r\n }\r\n const options =\r\n httpParams.keys().length > 0\r\n ? {\r\n params: httpParams,\r\n }\r\n : {};\r\n\r\n return this._http\r\n .get<UserWithRoles<User>[]>(\r\n this._env.get('apiUrl') + 'users-from-names',\r\n options\r\n )\r\n .pipe(\r\n retry(3),\r\n map((users: UserWithRoles<User>[]) => {\r\n return users.map(this.getUserFromWrapper);\r\n }),\r\n catchError(this._error.handleError)\r\n );\r\n }\r\n\r\n /**\r\n * Get data about the specified user.\r\n * @param name The user name.\r\n */\r\n public getUser(name: string): Observable<User> {\r\n return this._http\r\n .get<UserWithRoles<User>>(this._env.get('apiUrl') + 'users/' + name)\r\n .pipe(\r\n retry(3),\r\n map(this.getUserFromWrapper),\r\n catchError(this._error.handleError)\r\n );\r\n }\r\n\r\n /**\r\n * Update the editable data for the specified user.\r\n * @param user The user to update.\r\n */\r\n public updateUser(user: User): Observable<any> {\r\n return this._http\r\n .put(\r\n this._env.get('apiUrl') +\r\n 'users' +\r\n (user.emailConfirmed ? '?confirmed=true' : ''),\r\n user\r\n )\r\n .pipe(catchError(this._error.handleError));\r\n }\r\n\r\n /**\r\n * Request a password reset email for the specified email address.\r\n * @param email The email address to receive the reset message.\r\n */\r\n public resetPassword(email: string): Observable<any> {\r\n return this._http\r\n .post(this._env.get('apiUrl') + 'accounts/resetpassword/request', {\r\n email: email,\r\n })\r\n .pipe(catchError(this._error.handleError));\r\n }\r\n\r\n /**\r\n * Change the password.\r\n * @param change The password change data.\r\n */\r\n public changePassword(change: PasswordChange): Observable<any> {\r\n return this._http\r\n .post(this._env.get('apiUrl') + 'accounts/changepassword', change)\r\n .pipe(catchError(this._error.handleError));\r\n }\r\n\r\n /**\r\n * Delete the user with the specified username.\r\n * @param name The user name.\r\n */\r\n public deleteUser(name: string): Observable<any> {\r\n return this._http\r\n .delete(this._env.get('apiUrl') + 'accounts/' + name)\r\n .pipe(catchError(this._error.handleError));\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { BehaviorSubject, Observable, take, tap } from 'rxjs';\r\n\r\nimport { User } from '@myrmidon/auth-jwt-login';\r\nimport { DataPage } from '@myrmidon/ng-tools';\r\nimport {\r\n PagedListStore,\r\n PagedListStoreService,\r\n} from '@myrmidon/paged-data-browsers';\r\n\r\nimport {\r\n AuthJwtAccountService,\r\n UserFilter,\r\n} from '../../services/auth-jwt-account.service';\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class UserListRepository\r\n implements PagedListStoreService<UserFilter, User>\r\n{\r\n private _store: PagedListStore<UserFilter, User>;\r\n private _activeUser$: BehaviorSubject<User | undefined>;\r\n private _loading$: BehaviorSubject<boolean>;\r\n private _saving$: BehaviorSubject<boolean>;\r\n\r\n public get activeUser$(): Observable<User | undefined> {\r\n return this._activeUser$.asObservable();\r\n }\r\n public get filter$(): Observable<UserFilter> {\r\n return this._store.filter$;\r\n }\r\n public get page$(): Observable<DataPage<User>> {\r\n return this._store.page$;\r\n }\r\n public get loading$(): Observable<boolean> {\r\n return this._loading$.asObservable();\r\n }\r\n public get saving$(): Observable<boolean> {\r\n return this._saving$.asObservable();\r\n }\r\n\r\n constructor(private _accService: AuthJwtAccountService) {\r\n this._store = new PagedListStore<UserFilter, User>(this);\r\n this._activeUser$ = new BehaviorSubject<User | undefined>(undefined);\r\n this._loading$ = new BehaviorSubject<boolean>(false);\r\n this._saving$ = new BehaviorSubject<boolean>(false);\r\n this._store.reset();\r\n }\r\n\r\n public loadPage(\r\n pageNumber: number,\r\n pageSize: number,\r\n filter: UserFilter\r\n ): Observable<DataPage<User>> {\r\n this._loading$.next(true);\r\n return this._accService.getUsers(filter, pageNumber, pageSize).pipe(\r\n tap({\r\n next: () => this._loading$.next(false),\r\n error: () => this._loading$.next(false),\r\n })\r\n );\r\n }\r\n\r\n public async reset(): Promise<void> {\r\n this._loading$.next(true);\r\n try {\r\n await this._store.reset();\r\n } catch (error) {\r\n throw error;\r\n } finally {\r\n this._loading$.next(false);\r\n }\r\n }\r\n\r\n public async setFilter(filter: UserFilter): Promise<void> {\r\n this._loading$.next(true);\r\n try {\r\n await this._store.setFilter(filter);\r\n } catch (error) {\r\n throw error;\r\n } finally {\r\n this._loading$.next(false);\r\n }\r\n }\r\n\r\n public getFilter(): UserFilter {\r\n return this._store.getFilter();\r\n }\r\n\r\n public async setPage(pageNumber: number, pageSize: number): Promise<void> {\r\n this._loading$.next(true);\r\n try {\r\n await this._store.setPage(pageNumber, pageSize);\r\n } catch (error) {\r\n throw error;\r\n } finally {\r\n this._loading$.next(false);\r\n }\r\n }\r\n\r\n public setActiveUser(user: User | null): void {\r\n this._activeUser$.next(user || undefined);\r\n }\r\n\r\n public updateActiveUser(user: User): Promise<boolean> {\r\n const promise: Promise<boolean> = new Promise((resolve, reject) => {\r\n this._saving$.next(true);\r\n\r\n this._accService.updateUser(user).subscribe({\r\n next: (_) => {\r\n this._saving$.next(false);\r\n this._store.reset();\r\n resolve(true);\r\n },\r\n error: (error) => {\r\n this._saving$.next(false);\r\n console.error(\r\n `Error updating user ${user.userName}: ` +\r\n JSON.stringify(error || {})\r\n );\r\n resolve(false);\r\n },\r\n });\r\n });\r\n return promise;\r\n }\r\n\r\n public deleteUser(name: string): Promise<boolean> {\r\n const promise: Promise<boolean> = new Promise((resolve, reject) => {\r\n if (this._activeUser$.value?.userName === name) {\r\n this._activeUser$.next(undefined);\r\n }\r\n\r\n this._saving$.next(true);\r\n\r\n this._accService.deleteUser(name).subscribe({\r\n next: (_) => {\r\n this._saving$.next(false);\r\n this._store.reset();\r\n resolve(true);\r\n },\r\n error: (error) => {\r\n this._saving$.next(false);\r\n console.error(\r\n `Error deleting user ${name}: ` + JSON.stringify(error || {})\r\n );\r\n reject(error);\r\n },\r\n });\r\n });\r\n return promise;\r\n }\r\n}\r\n","import {\r\n Component,\r\n OnChanges,\r\n EventEmitter,\r\n Input,\r\n Output,\r\n SimpleChange,\r\n} from '@angular/core';\r\n\r\n@Component({\r\n selector: 'auth-jwt-password-strength-bar',\r\n templateUrl: './password-strength-bar.component.html',\r\n styleUrls: ['./password-strength-bar.component.css'],\r\n})\r\nexport class PasswordStrengthBarComponent implements OnChanges {\r\n private _colors = ['#F00', '#F90', '#FF0', '#9F0', '#0F0'];\r\n\r\n @Input() passwordToCheck: string | undefined;\r\n\r\n @Output() strengthChange = new EventEmitter<number>();\r\n\r\n public bars: string[];\r\n\r\n constructor() {\r\n this.strengthChange = new EventEmitter<number>();\r\n this.bars = [];\r\n }\r\n\r\n private measureStrength(p: string): number {\r\n let force = 0;\r\n const regex = /[$-/:-?{-~!\"^_`\\[\\]]/g; // \"\r\n\r\n const lowerLetters = /[a-z]+/.test(p);\r\n const upperLetters = /[A-Z]+/.test(p);\r\n const numbers = /[0-9]+/.test(p);\r\n const symbols = regex.test(p);\r\n\r\n const flags = [lowerLetters, upperLetters, numbers, symbols];\r\n\r\n let passedMatches = 0;\r\n for (const flag of flags) {\r\n passedMatches += flag === true ? 1 : 0;\r\n }\r\n\r\n force += 2 * p.length + (p.length >= 10 ? 1 : 0);\r\n force += passedMatches * 10;\r\n\r\n // penalty (short password)\r\n force = p.length <= 6 ? Math.min(force, 10) : force;\r\n\r\n // penalty (poor letiety of characters)\r\n force = passedMatches === 1 ? Math.min(force, 10) : force;\r\n force = passedMatches === 2 ? Math.min(force, 20) : force;\r\n force = passedMatches === 3 ? Math.min(force, 40) : force;\r\n\r\n return force;\r\n }\r\n\r\n private getColor(s: number) {\r\n let idx = 0;\r\n if (s <= 10) {\r\n idx = 0;\r\n } else if (s <= 20) {\r\n idx = 1;\r\n } else if (s <= 30) {\r\n idx = 2;\r\n } else if (s <= 40) {\r\n idx = 3;\r\n } else {\r\n idx = 4;\r\n }\r\n return {\r\n idx: idx + 1,\r\n col: this._colors[idx],\r\n };\r\n }\r\n\r\n ngOnChanges(changes: { [propName: string]: SimpleChange }): void {\r\n const password = changes['passwordToCheck'].currentValue;\r\n this.setBarColors(5, '#DDD');\r\n if (password) {\r\n const strength = this.measureStrength(password);\r\n const c = this.getColor(strength);\r\n this.setBarColors(c.idx, c.col);\r\n this.strengthChange.emit(strength);\r\n }\r\n }\r\n\r\n private setBarColors(count: number, col: string) {\r\n for (let n = 0; n < count; n++) {\r\n this.bars[n] = col;\r\n }\r\n }\r\n}\r\n","<div id=\"strength\">\r\n <small>strength:</small>\r\n <ul id=\"strengthBar\">\r\n <li class=\"point\" [style.background-color]=\"bars[0]\"></li>\r\n <li class=\"point\" [style.background-color]=\"bars[1]\"></li>\r\n <li class=\"point\" [style.background-color]=\"bars[2]\"></li>\r\n <li class=\"point\" [style.background-color]=\"bars[3]\"></li>\r\n <li class=\"point\" [style.background-color]=\"bars[4]\"></li>\r\n </ul>\r\n</div>\r\n","import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core';\r\nimport {\r\n Validators,\r\n AbstractControl,\r\n ValidationErrors,\r\n FormGroup,\r\n FormControl,\r\n FormBuilder,\r\n} from '@angular/forms';\r\nimport { MatSnackBar } from '@angular/material/snack-bar';\r\nimport { Observable } from 'rxjs';\r\nimport { take } from 'rxjs/operators';\r\n\r\nimport {\r\n AuthJwtAccountService,\r\n ExistResult,\r\n RegistrationModel,\r\n} from '../../services/auth-jwt-account.service';\r\nimport { PasswordValidators } from '../../validators/password.validators';\r\nimport { UserListRepository } from '../state/user-list.repository';\r\n\r\n@Component({\r\n selector: 'auth-jwt-registration',\r\n templateUrl: './auth-jwt-registration.component.html',\r\n styleUrls: ['./auth-jwt-registration.component.css'],\r\n})\r\nexport class AuthJwtRegistrationComponent {\r\n public busy: boolean | undefined;\r\n // form\r\n public form: FormGroup;\r\n public email: FormControl<string>;\r\n public name: FormControl<string>;\r\n public firstName: FormControl<string>;\r\n public lastName: FormControl<string>;\r\n public password: FormControl<string>;\r\n public confirmPassword: FormControl<string>;\r\n\r\n /**\r\n * True if the registration should be confirmed automatically.\r\n */\r\n @Input()\r\n public autoConfirm?: boolean;\r\n\r\n /**\r\n * Emitted when a user was successfully registered. Usually\r\n * you should handle this to move away from the registration\r\n * page.\r\n */\r\n @Output()\r\n public registered: EventEmitter<any>;\r\n\r\n public hide = true;\r\n\r\n constructor(\r\n formBuilder: FormBuilder,\r\n private _snackbar: MatSnackBar,\r\n private _accountService: AuthJwtAccountService,\r\n private _userRepository: UserListRepository\r\n ) {\r\n this.registered = new EventEmitter<any>();\r\n // form\r\n this.email = formBuilder.control('', {\r\n validators: [Validators.required, Validators.email],\r\n asyncValidators: this.getUniqueEmailValidator(this._accountService).bind(\r\n this\r\n ),\r\n nonNullable: true,\r\n });\r\n\r\n this.name = formBuilder.control('', {\r\n validators: Validators.required,\r\n asyncValidators: this.getUniqueNameValidator(this._accountService).bind(\r\n this\r\n ),\r\n nonNullable: true,\r\n });\r\n\r\n this.firstName = formBuilder.control('', {\r\n validators: [Validators.required, Validators.maxLength(50)],\r\n nonNullable: true,\r\n });\r\n this.lastName = formBuilder.control('', {\r\n validators: [Validators.required, Validators.maxLength(50)],\r\n nonNullable: true,\r\n });\r\n\r\n // http://stackoverflow.com/questions/35474991/angular-2-form-validating-for-repeat-password\r\n this.password = formBuilder.control('', {\r\n validators: [Validators.required, PasswordValidators.standard()],\r\n nonNullable: true,\r\n });\r\n this.confirmPassword = formBuilder.control('', {\r\n validators: Validators.required,\r\n nonNullable: true,\r\n });\r\n\r\n this.form = formBuilder.group(\r\n {\r\n email: this.email,\r\n name: this.name,\r\n firstName: this.firstName,\r\n lastName: this.lastName,\r\n password: this.password,\r\n confirmPassword: this.confirmPassword,\r\n },\r\n {\r\n validators: [\r\n PasswordValidators.areEqual('password', 'confirmPassword'),\r\n ],\r\n }\r\n );\r\n }\r\n\r\n /**\r\n * Creates a unique name validator. There is no dependency injection at this level,\r\n * but we can use closures. As a matter of fact, we have access to the service instance\r\n * from the component where we register validators. So we will implement a function\r\n * that will accept the service as parameter, and create the actual validation function.\r\n * This function will have access to the service when called during the validation process.\r\n * See http://restlet.com/blog/2016/02/17/implementing-angular2-forms-beyond-basics-part-2/.\r\n */\r\n private getUniqueNameValidator(service: AuthJwtAccountService) {\r\n return (\r\n control: AbstractControl\r\n ):\r\n | Promise<ValidationErrors | null>\r\n | Observable<ValidationErrors | null> => {\r\n return new Promise((resolve, reject) => {\r\n // avoid checking if empty\r\n if (!control.value) {\r\n resolve(null);\r\n } else {\r\n service.isNameRegistered(control.value).subscribe({\r\n next: (data: ExistResult) => {\r\n if (!data.isExisting) {\r\n resolve(null);\r\n } else {\r\n resolve({ uniqueName: true });\r\n }\r\n },\r\n error: (error) => {\r\n console.error(\r\n 'Unique name validator error' +\r\n (error ? JSON.stringify(error) : '')\r\n );\r\n resolve({ uniqueName: true });\r\n },\r\n });\r\n }\r\n });\r\n };\r\n }\r\n\r\n private getUniqueEmailValidator(service: AuthJwtAccountService) {\r\n return (\r\n control: AbstractControl\r\n ):\r\n | Promise<ValidationErrors | null>\r\n | Observable<ValidationErrors | null> => {\r\n return new Promise((resolve, reject) => {\r\n // avoid checking if empty\r\n if (!control.value) {\r\n resolve(null);\r\n } else {\r\n service.isEmailRegistered(control.value).subscribe({\r\n next: (data: ExistResult) => {\r\n if (!data.isExisting) {\r\n resolve(null);\r\n } else {\r\n resolve({ uniqueEmail: true });\r\n }\r\n },\r\n error: (error) => {\r\n console.error(\r\n 'Unique email validator error' +\r\n (error ? JSON.stringify(error) : '')\r\n );\r\n resolve({ uniqueEmail: true });\r\n },\r\n });\r\n }\r\n });\r\n };\r\n }\r\n\r\n public onSubmit(): void {\r\n if (\r\n !this.form.valid ||\r\n this.busy ||\r\n this.name.pending ||\r\n this.email.pending\r\n ) {\r\n return;\r\n }\r\n\r\n const model: RegistrationModel = {\r\n email: this.email.value,\r\n name: this.name.value,\r\n firstName: this.firstName.value,\r\n lastName: this.lastName.value,\r\n password: this.password.value,\r\n };\r\n\r\n this.busy = true;\r\n this._accountService\r\n .register(model, this.autoConfirm)\r\n .pipe(take(1))\r\n .subscribe({\r\n next: () => {\r\n this.busy = false;\r\n this._snackbar.open(\r\n $localize`:auth-jwt-admin:Registration succeeded`,\r\n 'OK'\r\n );\r\n this._userRepository.reset();\r\n this.registered.emit();\r\n },\r\n error: (error) => {\r\n this.busy = false;\r\n console.error(\r\n 'Registration error' + (error ? JSON.stringify(error) : '')\r\n );\r\n this._snackbar.open(\r\n $localize`:auth-jwt-admin:Registration error`,\r\n 'OK'\r\n );\r\n },\r\n });\r\n }\r\n}\r\n","<div>\n <form role=\"form\" [formGroup]=\"form\" (submit)=\"onSubmit()\">\n <fieldset>\n <legend i18n=\"auth-jwt-admin\">registration</legend>\n <!-- email -->\n <div class=\"form-row\">\n <mat-form-field>\n <mat-label i18n>email</mat-label>\n <input\n matInput\n type=\"email\"\n id=\"email\"\n maxlength=\"256\"\n required\n autofocus\n spellcheck=\"false\"\n [formControl]=\"email\"\n />\n @if ( $any(email).errors?.required && (email.dirty || email.touched) )\n {\n <mat-error i18n=\"auth-jwt-admin\">email required</mat-error>\n } @if ($any(email).errors?.email && (email.dirty || email.touched)) {\n <mat-error i18n=\"auth-jwt-admin\">invalid email</mat-error>\n } @if ( $any(email).errors?.uniqueEmail && (email.dirty ||\n email.touched) ) {\n <mat-error i18n=\"auth-jwt-admin\">email already registered</mat-error>\n }\n </mat-form-field>\n @if (email.pending) {\n <mat-icon>hourglass</mat-icon>\n }\n </div>\n\n <!-- name -->\n <div class=\"form-row\">\n <mat-form-field>\n <mat-label i18n=\"auth-jwt-admin\">username</mat-label>\n <input\n matInput\n type=\"text\"\n id=\"name\"\n maxlength=\"50\"\n required\n pattern=\"^[a-zA-Z][a-zA-Z0-9]{2,49}$\"\n spellcheck=\"false\"\n [formControl]=\"name\"\n />\n @if ($any(name).errors?.required && (name.dirty || name.touched)) {\n <mat-error i18n=\"auth-jwt-admin\">username required</mat-error>\n } @if ($any(name).errors?.pattern && (name.dirty || name.touched)) {\n <mat-error i18n=\"auth-jwt-admin\">invalid username</mat-error>\n } @if ( $any(name).errors?.uniqueName && (name.dirty || name.touched)\n ) {\n <mat-error i18n=\"auth-jwt-admin\"\n >username already registered</mat-error\n >\n }\n </mat-form-field>\n @if (name.pending) {\n <mat-icon>hourglass</mat-icon>\n }\n </div>\n\n <!-- first name -->\n <div>\n <mat-form-field>\n <mat-label i18n=\"auth-jwt-admin\">first name</mat-label>\n <input\n matInput\n type=\"text\"\n id=\"firstName\"\n maxlength=\"50\"\n required\n spellcheck=\"false\"\n [formControl]=\"firstName\"\n />\n @if ( firstName.hasError('required') && (firstName.dirty ||\n firstName.touched) ) {\n <mat-error i18n=\"auth-jwt-admin\" class=\"text-danger small\">\n first name required\n </mat-error>\n }\n </mat-form-field>\n </div>\n\n <!-- last name -->\n <div>\n <mat-form-field>\n <mat-label i18n=\"auth-jwt-admin\">last name</mat-label>\n <input\n matInput\n type=\"text\"\n id=\"lastName\"\n maxlength=\"50\"\n required\n spellcheck=\"false\"\n [formControl]=\"lastName\"\n />\n @if ( lastName.hasError('required') && (lastName.dirty ||\n lastName.touched) ) {\n <mat-error i18n=\"auth-jwt-admin\" class=\"text-danger small\">\n last name required\n </mat-error>\n }\n </mat-form-field>\n </div>\n\n <!-- <div [formGroup]=\"passwords\"> -->\n <!-- password -->\n <div>\n <mat-form-field>\n <mat-label i18n=\"auth-jwt-admin\">password</mat-label>\n <input\n matInput\n [type]=\"hide ? 'password' : 'text'\"\n name=\"password\"\n autocomplete=\"new-password\"\n maxlength=\"50\"\n required\n spellcheck=\"false\"\n [formControl]=\"password\"\n />\n <button\n type=\"button\"\n mat-icon-button\n matSuffix\n (click)=\"hide = !hide\"\n i18n-aria-label=\"auth-jwt-login\"\n aria-label=\"Hide password\"\n [attr.aria-pressed]=\"hide\"\n >\n <mat-icon>{{ hide ? \"visibility_off\" : \"visibility\" }}</mat-icon>\n </button>\n <auth-jwt-password-strength-bar [passwordToCheck]=\"password.value\">\n </auth-jwt-password-strength-bar>\n @if ( $any(password).errors?.required && (password.dirty ||\n password.touched) ) {\n <mat-error i18n=\"auth-jwt-admin\">password required</mat-error>\n } @if ( $any(password).errors?.passwordtooshort && (password.dirty ||\n password.touched) ) {\n <mat-error i18n=\"auth-jwt-admin\">at least 8 characters</mat-error>\n } @if ( $any(password).errors?.noupperinpassword && (password.dirty ||\n password.touched) ) {\n <mat-error i18n=\"auth-jwt-admin\"\n >at least 1 uppercase letter</mat-error\n >\n } @if ( $any(password).errors?.nolowerinpassword && (password.dirty ||\n password.touched) ) {\n <mat-error i18n=\"auth-jwt-admin\"\n >at least 1 lowercase letter</mat-error\n >\n } @if ( $any(password).errors?.nosymbolinpassword && (password.dirty\n || password.touched) ) {\n <mat-error i18n=\"auth-jwt-admin\"\n >at least 1 punctuation/symbol</mat-error\n >\n }\n </mat-form-field>\n </div>\n\n <!-- confirm password -->\n <div>\n <mat-form-field>\n <mat-label i18n=\"auth-jwt-admin\">confirm password</mat-label>\n <input\n matInput\n [type]=\"hide ? 'password' : 'text'\"\n name=\"confirmPassword\"\n maxlength=\"50\"\n required\n spellcheck=\"false\"\n [formControl]=\"confirmPassword\"\n />\n </mat-form-field>\n </div>\n @if (form.errors?.areequal && confirmPassword.touched) {\n <div i18n=\"auth-jwt-admin\" style=\"color: red\">\n password differs from confirmation password\n </div>\n }\n\n <button\n i18n=\"auth-jwt-admin\"\n mat-flat-button\n type=\"submit\"\n color=\"primary\"\n class=\"mat-primary\"\n [disabled]=\"\n form.invalid || form.pristine || busy || name.pending || email.pending\n \"\n >\n register\n </button>\n @if (busy) {\n <mat-progress-spinner diameter=\"20\"></mat-progress-spinner>\n }\n </fieldset>\n </form>\n\n <details>\n <summary i18n=\"auth-jwt-admin\">Hints</summary>\n <div class=\"info\">\n <p i18n=\"auth-jwt-admin\">\n To register a new user, you must provide his email address, choose a\n password, and choose a username, which must be unique (you will be\n notified if another user has already taken that name). The username must\n include only letters/digits, start with a letter, and be no shorter than\n 3 characters, nor longer than 50.\n </p>\n <p i18n=\"auth-jwt-admin\">\n To promote a decent security level, the password must include at least 8\n characters, uppercase and lowercase letters, digits, and punctuation\n (like dashes, stops, parentheses, etc.).\n </p>\n <p i18n=\"auth-jwt-admin\">\n Once registered, if messaging is enabled on the server side the user\n will receive an email message to the email address you specified; he\n will have to click on the provided link to complete the registration\n process. Otherwise, you should edit the newly created user and confirm\n the email registration.\n </p>\n </div>\n </details>\n</div>\n","import { Component, Input, Output, OnInit, EventEmitter } from '@angular/core';\r\nimport { FormBuilder, FormControl, FormGroup } from '@angular/forms';\r\nimport { Observable } from 'rxjs';\r\n\r\nimport { UserFilter } from '../../services/auth-jwt-account.service';\r\n\r\n@Component({\r\n selector: 'auth-jwt-user-filter',\r\n templateUrl: './user-filter.component.html',\r\n styleUrls: ['./user-filter.component.css'],\r\n})\r\nexport class UserFilterComponent {\r\n private _filter?: UserFilter;\r\n\r\n @Input()\r\n public get filter(): UserFilter | null | undefined {\r\n return this._filter;\r\n }\r\n public set filter(value: UserFilter | null | undefined) {\r\n if (this._filter === value) {\r\n return;\r\n }\r\n this._filter = value || undefined;\r\n this.updateForm(this._filter);\r\n }\r\n\r\n @Input()\r\n public disabled: boolean | undefined;\r\n\r\n /**\r\n * Event emitted when the filter changes.\r\n */\r\n @Output()\r\n public filterChange: EventEmitter<UserFilter>;\r\n\r\n public name: FormControl<string | null>;\r\n public form: FormGroup;\r\n\r\n constructor(formBuilder: FormBuilder) {\r\n // form\r\n this.name = formBuilder.control<string | null>(null);\r\n this.form = formBuilder.group({\r\n name: this.name,\r\n });\r\n // event\r\n this.filterChange = new EventEmitter<UserFilter>();\r\n }\r\n\r\n private updateForm(filter?: UserFilter): void {\r\n if (!filter) {\r\n this.form.reset();\r\n return;\r\n }\r\n this.name.setValue(filter.name || null);\r\n this.form.markAsPristine();\r\n }\r\n\r\n private getFilter(): UserFilter {\r\n return {\r\n name: this.name.value?.trim(),\r\n };\r\n }\r\n\r\n public reset(): void {\r\n this.form.reset();\r\n this._filter = {};\r\n this.filterChange.emit(this._filter);\r\n }\r\n\r\n public apply(): void {\r\n this._filter = this.getFilter();\r\n this.filterChange.emit(this._filter);\r\n }\r\n}\r\n","<form [formGroup]=\"form\" (submit)=\"apply()\" ng-disabled=\"disabled\">\r\n <div class=\"form-row\">\r\n <mat-form-field>\r\n <mat-label i18n=\"auth-jwt-admin\">name or ID</mat-label>\r\n <input matInput [formControl]=\"name\" />\r\n <button\r\n mat-icon-button\r\n matSuffix\r\n type=\"button\"\r\n (click)=\"reset()\"\r\n color=\"warn\"\r\n i18n-matTooltip=\"auth-jwt-admin\"\r\n matTooltip=\"Reset filters\"\r\n [disabled]=\"disabled\"\r\n >\r\n <mat-icon class=\"mat-warn\">clear</mat-icon>\r\n </button>\r\n </mat-form-field>\r\n\r\n <button\r\n id=\"apply\"\r\n type=\"submit\"\r\n mat-icon-button\r\n color=\"primary\"\r\n [disabled]=\"disabled\"\r\n i18n-matTooltip=\"auth-jwt-admin\"\r\n matTooltip=\"Apply filters\"\r\n >\r\n <mat-icon class=\"mat-primary\">check_circle</mat-icon>\r\n </button>\r\n </div>\r\n</form>\r\n","import { Component, OnInit, Input, Output, EventEmitter } from '@angular/core';\r\nimport {\r\n UntypedFormGroup,\r\n UntypedFormControl,\r\n UntypedFormBuilder,\r\n Validators,\r\n} from '@angular/forms';\r\nimport { AuthJwtService, User } from '@myrmidon/auth-jwt-login';\r\n\r\n@Component({\r\n selector: 'auth-jwt-user-editor',\r\n templateUrl: './user-editor.component.html',\r\n styleUrls: ['./user-editor.component.css'],\r\n})\r\nexport class UserEditorComponent implements OnInit {\r\n private _user: User | undefined;\r\n\r\n public email: UntypedFormControl;\r\n public emailConfirmed: UntypedFormControl;\r\n public lockoutEnabled: UntypedFormControl;\r\n public firstName: UntypedFormControl;\r\n public lastName: UntypedFormControl;\r\n public roles: UntypedFormControl;\r\n public form: UntypedFormGroup;\r\n\r\n public unlocked: boolean | undefined;\r\n\r\n @Input() public set user(value: User | undefined) {\r\n this._user = value;\r\n this.updateForm(value);\r\n }\r\n public get user(): User | undefined {\r\n return this._user;\r\n }\r\n\r\n @Output() userChange: EventEmitter<User>;\r\n @Output() editorClose: EventEmitter<any>;\r\n\r\n constructor(formBuilder: UntypedFormBuilder, private _authService: AuthJwtService) {\r\n // events\r\n this.userChange = new EventEmitter<User>();\r\n this.editorClose = new EventEmitter<any>();\r\n // form\r\n this.email = formBuilder.control(null, [\r\n Validators.required,\r\n Validators.email,\r\n ]);\r\n this.emailConfirmed = formBuilder.control(false);\r\n this.lockoutEnabled = formBuilder.control(false);\r\n this.firstName = formBuilder.control(null, [\r\n Validators.required,\r\n Validators.maxLength(50),\r\n ]);\r\n this.lastName = formBuilder.control(null, [\r\n Validators.required,\r\n Validators.maxLength(50),\r\n ]);\r\n this.roles = formBuilder.control(null, Validators.maxLength(200));\r\n\r\n this.form = formBuilder.group({\r\n email: this.email,\r\n emailConfirmed: this.emailConfirmed,\r\n lockoutEnabled: this.lockoutEnabled,\r\n firstName: this.firstName,\r\n lastName: this.lastName,\r\n roles: this.roles,\r\n });\r\n }\r\n\r\n ngOnInit(): void {}\r\n\r\n private updateForm(user: User | undefined): void {\r\n if (!user) {\r\n this.form.reset();\r\n } else {\r\n this.email.setValue(user.email);\r\n this.emailConfirmed.setValue(user.emailConfirmed);\r\n this.lockoutEnabled.setValue(user.lockoutEnabled);\r\n this.firstName.setValue(user.firstName);\r\n this.lastName.setValue(user.lastName);\r\n if (user.roles?.length > 0) {\r\n this.roles.setValue(user.roles.join(' '));\r\n } else {\r\n this.roles.setValue(null);\r\n }\r\n }\r\n }\r\n\r\n private getUserFromForm(): User {\r\n return {\r\n userName: this._user?.userName || '',\r\n email: this.email.value,\r\n emailConfirmed: this.emailConfirmed.value,\r\n lockoutEnabled: this.lockoutEnabled.value,\r\n firstName: this.firstName.value,\r\n lastName: this.lastName.value,\r\n roles: this.roles.value\r\n ? this.roles.value.split(' ').filter((s: string) => s)\r\n : [],\r\n };\r\n }\r\n\r\n public endLockout(): void {\r\n if (this.unlocked) {\r\n return;\r\n }\r\n this._user!.lockoutEnd = this._authService.getUTCDate();\r\n this.unlocked = true;\r\n }\r\n\r\n public close(): void {\r\n this.editorClose.emit();\r\n }\r\n\r\n public save(): void {\r\n if (this.form.invalid) {\r\n return;\r\n }\r\n this.userChange.emit(this.getUserFromForm());\r\n }\r\n}\r\n","<form [formGroup]=\"form\" (submit)=\"save()\">\n <div class=\"form-row\">\n <!-- email -->\n <mat-form-field>\n <mat-label i18n=\"auth-jwt-admin\">email</mat-label>\n <input type=\"text\" matInput [formControl]=\"email\" />\n @if (email.hasError('required') && (email.dirty || email.touched)) {\n <mat-error i18n=\"auth-jwt-admin\"> email address required </mat-error>\n } @if (email.hasError('pattern') && (email.dirty || email.touched)) {\n <mat-error i18n=\"auth-jwt-admin\"> invalid email address </mat-error>\n }\n </mat-form-field>\n\n <!-- emailConfirmed -->\n <mat-checkbox [formControl]=\"emailConfirmed\" i18n=\"auth-jwt-admin\"\n >email address confirmed</mat-checkbox\n >\n </div>\n\n <!-- lockoutEnabled -->\n <div class=\"form-row\">\n <mat-checkbox [formControl]=\"lockoutEnabled\" i18n=\"auth-jwt-admin\"\n >lockout enabled</mat-checkbox\n >\n <button\n type=\"button\"\n mat-icon-button\n color=\"primary\"\n (click)=\"endLockout()\"\n [disabled]=\"unlocked\"\n i18n-matTooltip=\"auth-jwt-admin\"\n matTooltip=\"Unlock this user if locked\"\n >\n <mat-icon class=\"mat-primary\">lock_open</mat-icon>\n </button>\n </div>\n\n <div class=\"form-row\">\n <!-- firstName -->\n <mat-form-field>\n <mat-label i18n=\"auth-jwt-admin\">first name</mat-label>\n <input type=\"text\" matInput [formControl]=\"firstName\" />\n @if ( firstName.hasError('required') && (firstName.dirty ||\n firstName.touched) ) {\n <mat-error i18n=\"auth-jwt-admin\"> first name required </mat-error>\n } @if ( firstName.hasError('maxlength') && (firstName.dirty ||\n firstName.touched) ) {\n <mat-error i18n=\"auth-jwt-admin\"> first name too long </mat-error>\n }\n </mat-form-field>\n\n <!-- lastName -->\n <mat-form-field>\n <mat-label i18n=\"auth-jwt-admin\">last name</mat-label>\n <input type=\"text\" matInput [formControl]=\"lastName\" />\n @if ( lastName.hasError('required') && (lastName.dirty ||\n lastName.touched) ) {\n <mat-error i18n=\"auth-jwt-admin\"> last name required </mat-error>\n } @if ( lastName.hasError('maxlength') && (lastName.dirty ||\n lastName.touched) ) {\n <mat-error i18n=\"auth-jwt-admin\"> last name too long </mat-error>\n }\n </mat-form-field>\n </div>\n\n <!-- roles -->\n <div>\n <mat-form-field style=\"width: 16em\">\n <mat-label i18n=\"auth-jwt-admin\">roles</mat-label>\n <input type=\"text\" matInput [formControl]=\"roles\" />\n @if (roles.hasError('maxlength') && (roles.dirty || roles.touched)) {\n <mat-error i18n=\"auth-jwt-admin\"> too long </mat-error>\n }\n <mat-hint i18n>roles (separated by space)</mat-hint>\n </mat-form-field>\n </div>\n\n <!-- buttons -->\n <br />\n <div>\n <button\n type=\"button\"\n mat-icon-button\n color=\"warn\"\n i18n-matTooltip=\"auth-jwt-admin\"\n matTooltip=\"Close\"\n (click)=\"close()\"\n >\n <mat-icon class=\"mat-warn\">cancel</mat-icon>\n </button>\n <button\n type=\"submit\"\n mat-icon-button\n color=\"primary\"\n [disabled]=\"form.invalid\"\n i18n-matTooltip=\"auth-jwt-admin\"\n matTooltip=\"Save user\"\n >\n <mat-icon class=\"mat-primary\">check_circle</mat-icon>\n </button>\n </div>\n</form>\n","import { Component } from '@angular/core';\r\nimport { PageEvent } from '@angular/material/paginator';\r\nimport { Observable } from 'rxjs';\r\nimport '@angular/localize/init';\r\n\r\nimport {\r\n GravatarOptions,\r\n GravatarService,\r\n User,\r\n} from '@myrmidon/auth-jwt-login';\r\nimport { DataPage } from '@myrmidon/ng-tools';\r\nimport { DialogService } from '@myrmidon/ng-mat-tools';\r\n\r\nimport { UserListRepository } from '../state/user-list.repository';\r\nimport { UserFilter } from '../../services/auth-jwt-account.service';\r\n\r\n@Component({\r\n selector: 'auth-jwt-user-list',\r\n templateUrl: './user-list.component.html',\r\n styleUrls: ['./user-list.component.css'],\r\n})\r\nexport class UserListComponent {\r\n public active$: Observable<User | undefined>;\r\n public loading$: Observable<boolean>;\r\n public filter$: Observable<UserFilter>;\r\n public page$: Observable<DataPage<User>>;\r\n\r\n constructor(\r\n private _repository: UserListRepository,\r\n private _dialogService: DialogService,\r\n private _gravatarService: GravatarService\r\n ) {\r\n this.filter$ = _repository.filter$;\r\n this.page$ = _repository.page$;\r\n this.active$ = _repository.activeUser$;\r\n this.loading$ = _repository.loading$;\r\n }\r\n\r\n public reset(): void {\r\n this._repository.reset();\r\n }\r\n\r\n public onFilterChange(filter: UserFilter): void {\r\n this._repository.setFilter(filter);\r\n }\r\n\r\n public onPageChange(event: PageEvent): void {\r\n this._repository.setPage(event.pageIndex + 1, event.pageSize);\r\n }\r\n\r\n public deleteUser(user: User): void {\r\n this._dialogService\r\n .confirm(\r\n $localize`:auth-jwt-admin:Confirm`,\r\n $localize`:auth-jwt-admin:Delete user ` + user.userName + '?'\r\n )\r\n .subscribe((yes) => {\r\n if (yes) {\r\n this._repository.deleteUser(user.userName);\r\n }\r\n });\r\n }\r\n\r\n public setActiveUser(user: User | null): void {\r\n this._repository.setActiveUser(user);\r\n }\r\n\r\n public resetActiveUser(): void {\r\n this._repository.setActiveUser(null);\r\n }\r\n\r\n public saveActiveUser(user: User): void {\r\n this._repository.updateActiveUser(user);\r\n this._repository.setActiveUser(null);\r\n }\r\n\r\n public onUserEditorClose(): void {\r\n this._repository.setActiveUser(null);\r\n }\r\n\r\n public getGravatarUrl(\r\n email: string,\r\n options?: GravatarOptions\r\n ): string | null {\r\n return this._gravatarService.buildGravatarUrl(email, options);\r\n }\r\n}\r\n","<div id=\"container\">\n <div>\n <!-- filters -->\n <div id=\"filters\">\n <auth-jwt-user-filter\n [filter]=\"filter$ | async\"\n (filterChange)=\"onFilterChange($event)\"\n ></auth-jwt-user-filter>\n </div>\n\n <!-- list -->\n @if (page$ | async; as page) {\n <div id=\"list\">\n @if (loading$ | async) {\n <div>\n <mat-progress-bar mode=\"indeterminate\"></mat-progress-bar>\n </div>\n }\n <table>\n <thead>\n <td></td>\n <td></td>\n <th i18n=\"auth-jwt-admin\">name</th>\n <th i18n=\"auth-jwt-admin\" class=\"noif-lt-md\">first</th>\n <th i18n=\"auth-jwt-admin\" class=\"noif-lt-md\">last</th>\n <th i18n=\"auth-jwt-admin\" class=\"noif-lt-md\">email</th>\n <th i18n=\"auth-jwt-admin\">roles</th>\n <th i18n=\"auth-jwt-admin\" class=\"noif-lt-md\">lock end</th>\n </thead>\n <tbody>\n @for (user of page.items; track user) {\n <tr>\n <td class=\"fit-width\">\n <button\n mat-icon-button\n type=\"button\"\n i18n-matTooltip=\"auth-jwt-admin\"\n matTooltip=\"Edit this user\"\n color=\"primary\"\n (click)=\"setActiveUser(user)\"\n >\n <mat-icon class=\"mat-primary\">mode_edit</mat-icon>\n </button>\n <button\n mat-icon-button\n type=\"button\"\n i18n-matTooltip=\"auth-jwt-admin\"\n matTooltip=\"Delete this user\"\n color=\"warn\"\n (click)=\"deleteUser(user)\"\n >\n <mat-icon class=\"mat-warn\">remove_circle</mat-icon>\n </button>\n </td>\n <td class=\"fit-width\">\n <img\n alt=\"avatar\"\n [src]=\"getGravatarUrl(user.email, { size: '32' })\"\n [alt]=\"user.userName\"\n />\n </td>\n <td>{{ user.userName }}</td>\n <td class=\"noif-lt-md\">{{ user.firstName }}</td>\n <td class=\"noif-lt-md\">{{ user.lastName }}</td>\n <td class=\"noif-lt-md\">\n <a [href]=\"'mailto:' + user.email\">{{ user.email }}</a>\n </td>\n <td>{{ user.roles.join(\" \") }}</td>\n <td class=\"noif-lt-md\">{{ user.lockoutEnd }}</td>\n </tr>\n }\n </tbody>\n </table>\n <!-- paginator -->\n <div class=\"form-row\">\n <button\n type=\"button\"\n mat-icon-button\n color=\"warn\"\n i18n-matmatTooltip=\"auth-jwt-admin\"\n matTooltip=\"Refresh list\"\n (click)=\"reset()\"\n >\n <mat-icon class=\"mat-warn\">autorenew</mat-icon>\n </button>\n <mat-paginator\n [length]=\"page.total\"\n [pageIndex]=\"page.pageNumber - 1\"\n [pageSize]=\"page.pageSize\"\n [pageSizeOptions]=\"[5, 10, 20, 50, 100]\"\n (page)=\"onPageChange($event)\"\n [showFirstLastButtons]=\"true\"\n ></mat-paginator>\n </div>\n </div>\n }\n </div>\n\n <!-- editor -->\n <mat-expansion-panel\n id=\"editor\"\n [expanded]=\"active$ | async\"\n [disabled]=\"!(active$ | async)\"\n >\n @if (active$ | async; as active) {\n <div>\n <fieldset>\n <legend>{{ active.userName }}</legend>\n <auth-jwt-user-editor\n [user]=\"active\"\n (userChange)=\"saveActiveUser($event)\"\n (editorClose)=\"resetActiveUser()\"\n ></auth-jwt-user-editor>\n </fieldset>\n </div>\n }\n </mat-expansion-panel>\n</div>\n","import { CommonModule } from '@angular/common';\nimport { NgModule } from '@angular/core';\nimport { RouterModule } from '@angular/router';\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\n\nimport { MatCardModule } from '@angular/material/card';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatCheckboxModule } from '@angular/material/checkbox';\nimport { MatExpansionModule } from '@angular/material/expansion';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { MatPaginatorModule } from '@angular/material/paginator';\nimport { MatProgressBarModule } from '@angular/material/progress-bar';\nimport { MatProgressSpinnerModule } from '@angular/material/progress-spinner';\nimport { MatSnackBarModule } from '@angular/material/snack-bar';\nimport { MatDialogModule } from '@angular/material/dialog';\n\nimport { AuthJwtLoginModule } from '@myrmidon/auth-jwt-login';\nimport { NgToolsModule } from '@myrmidon/ng-tools';\n\nimport { AuthJwtRegistrationComponent } from './components/auth-jwt-registration/auth-jwt-registration.component';\nimport { PasswordStrengthBarComponent } from './components/password-strength-bar/password-strength-bar.component';\nimport { UserFilterComponent } from './components/user-filter/user-filter.component';\nimport { UserListComponent } from './components/user-list/user-list.component';\nimport { UserEditorComponent } from './components/user-editor/user-editor.component';\n\n@NgModule({\n declarations: [\n AuthJwtRegistrationComponent,\n PasswordStrengthBarComponent,\n UserFilterComponent,\n UserListComponent,\n UserEditorComponent,\n ],\n exports: [\n AuthJwtRegistrationComponent,\n PasswordStrengthBarComponent,\n UserFilterComponent,\n UserListComponent,\n ],\n imports: [\n CommonModule,\n FormsModule,\n RouterModule,\n ReactiveFormsModule,\n // material\n MatButtonModule,\n MatCardModule,\n MatCheckboxModule,\n MatDialogModule,\n MatExpansionModule,\n MatIconModule,\n MatInputModule,\n MatPaginatorModule,\n MatProgressBarModule,\n MatProgressSpinnerModule,\n MatSnackBarModule,\n MatTooltipModule,\n AuthJwtLoginModule,\n NgToolsModule,\n ],\n})\nexport class AuthJwtAdminModule {}\n","/*\r\n * Public API Surface of auth-jwt-admin\r\n */\r\n\r\nexport * from './lib/components/auth-jwt-registration/auth-jwt-registration.component';\r\nexport * from './lib/components/password-strength-bar/password-strength-bar.component';\r\nexport * from './lib/components/user-filter/user-filter.component';\r\nexport * from './lib/components/user-list/user-list.component';\r\nexport * from './lib/components/state/user-list.repository';\r\nexport * from './lib/services/auth-jwt-account.service';\r\nexport * from './lib/validators/password.validators';\r\nexport * from './lib/auth-jwt-admin.module';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1.AuthJwtAccountService","i1","i2","i3.AuthJwtAccountService","i4.UserListRepository","i10.PasswordStrengthBarComponent","i3","i4","i5","i6","i7","i8","i1.UserListRepository","i9","i10.UserFilterComponent","i11.UserEditorComponent"],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  import { PageEvent } from '@angular/material/paginator';
2
2
  import { Observable } from 'rxjs';
3
3
  import '@angular/localize/init';
4
- import { GravatarService, User } from '@myrmidon/auth-jwt-login';
4
+ import { GravatarOptions, GravatarService, User } from '@myrmidon/auth-jwt-login';
5
5
  import { DataPage } from '@myrmidon/ng-tools';
6
6
  import { DialogService } from '@myrmidon/ng-mat-tools';
7
7
  import { UserListRepository } from '../state/user-list.repository';
@@ -24,7 +24,7 @@ export declare class UserListComponent {
24
24
  resetActiveUser(): void;
25
25
  saveActiveUser(user: User): void;
26
26
  onUserEditorClose(): void;
27
- getGravatarUrl(email: string, size?: number): string | null;
27
+ getGravatarUrl(email: string, options?: GravatarOptions): string | null;
28
28
  static ɵfac: i0.ɵɵFactoryDeclaration<UserListComponent, never>;
29
29
  static ɵcmp: i0.ɵɵComponentDeclaration<UserListComponent, "auth-jwt-user-list", never, {}, {}, never, never, false, never>;
30
30
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@myrmidon/auth-jwt-admin",
3
- "version": "5.0.1",
3
+ "version": "5.1.0",
4
4
  "description": "JWT-based auth services accounts admin component.",
5
5
  "keywords": [
6
6
  "JWT",