@myrmidon/auth-jwt-admin 7.0.0 → 7.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -15,7 +15,7 @@ import { MatInputModule } from '@angular/material/input';
15
15
  import * as i6 from '@angular/material/progress-spinner';
16
16
  import { MatProgressSpinnerModule } from '@angular/material/progress-spinner';
17
17
  import { HttpClient, HttpParams } from '@angular/common/http';
18
- import { ErrorService, EnvService } from '@myrmidon/ng-tools';
18
+ import { ErrorService, EnvService } from '@myrmidon/ngx-tools';
19
19
  import { BehaviorSubject, tap } from 'rxjs';
20
20
  import { PagedListStore } from '@myrmidon/paged-data-browsers';
21
21
  import * as i7 from '@angular/material/tooltip';
@@ -1 +1 @@
1
- {"version":3,"file":"myrmidon-auth-jwt-admin.mjs","sources":["../../../../projects/myrmidon/auth-jwt-admin/src/lib/services/auth-jwt-account.service.ts","../../../../projects/myrmidon/auth-jwt-admin/src/lib/validators/password.validators.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/public-api.ts","../../../../projects/myrmidon/auth-jwt-admin/src/myrmidon-auth-jwt-admin.ts"],"sourcesContent":["import { Injectable, inject } 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/**\r\n * Service for managing user accounts with JWT authentication.\r\n */\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class AuthJwtAccountService {\r\n private _http = inject(HttpClient);\r\n private _error = inject(ErrorService);\r\n private _env = inject(EnvService);\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 {\r\n AbstractControl,\r\n FormGroup,\r\n UntypedFormGroup,\r\n ValidationErrors,\r\n ValidatorFn,\r\n} from '@angular/forms';\r\n\r\n/**\r\n * Password validators.\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, inject } 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 _accService = inject(AuthJwtAccountService);\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() {\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 SimpleChange,\r\n input,\r\n output,\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 public readonly passwordToCheck = input<string>();\r\n public readonly strengthChange = output<number>();\r\n\r\n public bars: string[] = [];\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 public 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, input, inject, 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 ReactiveFormsModule,\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 { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { MatProgressSpinnerModule } from '@angular/material/progress-spinner';\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\nimport { PasswordStrengthBarComponent } from '../password-strength-bar/password-strength-bar.component';\r\n\r\n/**\r\n * User registration form.\r\n */\r\n@Component({\r\n selector: 'auth-jwt-registration',\r\n imports: [\r\n ReactiveFormsModule,\r\n MatButtonModule,\r\n MatFormFieldModule,\r\n MatIconModule,\r\n MatInputModule,\r\n MatProgressSpinnerModule,\r\n PasswordStrengthBarComponent,\r\n ],\r\n templateUrl: './auth-jwt-registration.component.html',\r\n styleUrls: ['./auth-jwt-registration.component.css'],\r\n})\r\nexport class AuthJwtRegistrationComponent {\r\n private _snackbar = inject(MatSnackBar);\r\n private _accountService = inject(AuthJwtAccountService);\r\n private _userRepository = inject(UserListRepository);\r\n\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 public readonly autoConfirm = input<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 public registered = output();\r\n\r\n public hide = true;\r\n\r\n constructor() {\r\n const formBuilder = inject(FormBuilder);\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\" class=\"error\">\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, inject, output, effect } from '@angular/core';\r\nimport {\r\n FormBuilder,\r\n FormControl,\r\n FormGroup,\r\n ReactiveFormsModule,\r\n} from '@angular/forms';\r\n\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\n\r\nimport { UserFilter } from '../../services/auth-jwt-account.service';\r\n\r\n/**\r\n * Users filter.\r\n */\r\n@Component({\r\n selector: 'auth-jwt-user-filter',\r\n imports: [\r\n ReactiveFormsModule,\r\n MatButtonModule,\r\n MatFormFieldModule,\r\n MatIconModule,\r\n MatInputModule,\r\n MatTooltipModule,\r\n ],\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 /**\r\n * The filter.\r\n */\r\n public readonly filter = input<UserFilter | null | undefined>();\r\n /**\r\n * Whether the filter is disabled.\r\n */\r\n public readonly disabled = input<boolean>();\r\n /**\r\n * Event emitted when the filter changes.\r\n */\r\n public filterChange = output<UserFilter>();\r\n\r\n public name: FormControl<string | null>;\r\n public form: FormGroup;\r\n\r\n constructor() {\r\n const formBuilder = inject(FormBuilder);\r\n\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\r\n // update form when filter changes\r\n effect(() => {\r\n this.updateForm(this.filter() || undefined);\r\n });\r\n\r\n // disable form when disabled\r\n effect(() => {\r\n if (this.disabled()) {\r\n this.form.disable();\r\n } else {\r\n this.form.enable();\r\n }\r\n });\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()\">\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 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 [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, inject, effect, input, output } from '@angular/core';\r\nimport {\r\n FormGroup,\r\n FormControl,\r\n FormBuilder,\r\n Validators,\r\n ReactiveFormsModule,\r\n} from '@angular/forms';\r\n\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatCheckboxModule } from '@angular/material/checkbox';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\n\r\nimport { AuthJwtService, User } from '@myrmidon/auth-jwt-login';\r\n\r\n/**\r\n * User editor form.\r\n */\r\n@Component({\r\n selector: 'auth-jwt-user-editor',\r\n imports: [\r\n ReactiveFormsModule,\r\n MatButtonModule,\r\n MatCheckboxModule,\r\n MatFormFieldModule,\r\n MatIconModule,\r\n MatInputModule,\r\n MatTooltipModule,\r\n ],\r\n templateUrl: './user-editor.component.html',\r\n styleUrls: ['./user-editor.component.css'],\r\n})\r\nexport class UserEditorComponent {\r\n private _authService = inject(AuthJwtService);\r\n\r\n public email: FormControl<string | null>;\r\n public emailConfirmed: FormControl<boolean>;\r\n public lockoutEnabled: FormControl<boolean>;\r\n public firstName: FormControl<string | null>;\r\n public lastName: FormControl<string | null>;\r\n public roles: FormControl<string | null>;\r\n public form: FormGroup;\r\n\r\n public unlocked?: boolean;\r\n\r\n /**\r\n * The user to edit.\r\n */\r\n public readonly user = input<User | undefined | null>(undefined);\r\n /**\r\n * Emitted when user changes.\r\n */\r\n public readonly userChange = output<User | undefined>();\r\n /**\r\n * Emitted when the user requests to close the user editor.\r\n */\r\n public readonly editorClose = output();\r\n\r\n constructor() {\r\n const formBuilder = inject(FormBuilder);\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<boolean>(false, {\r\n nonNullable: true,\r\n });\r\n this.lockoutEnabled = formBuilder.control<boolean>(false, {\r\n nonNullable: true,\r\n });\r\n this.firstName = formBuilder.control<string | null>(null, [\r\n Validators.required,\r\n Validators.maxLength(50),\r\n ]);\r\n this.lastName = formBuilder.control<string | null>(null, [\r\n Validators.required,\r\n Validators.maxLength(50),\r\n ]);\r\n this.roles = formBuilder.control<string | null>(\r\n null,\r\n Validators.maxLength(200)\r\n );\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 // update form when user changes\r\n effect(() => {\r\n this.updateForm(this.user() || undefined);\r\n });\r\n }\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 || false);\r\n this.lockoutEnabled.setValue(user.lockoutEnabled || false);\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 this.unlocked =\r\n user.lockoutEnabled &&\r\n (!user.lockoutEnd || user.lockoutEnd < this._authService.getUTCDate());\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\r\n const user = this.getUserFromForm();\r\n user.lockoutEnd = this._authService.getUTCDate();\r\n this.userChange.emit(user);\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 (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>\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 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, inject } from '@angular/core';\r\nimport { MatPaginatorModule, PageEvent } from '@angular/material/paginator';\r\nimport { ReactiveFormsModule } from '@angular/forms';\r\nimport { Observable } from 'rxjs';\r\nimport '@angular/localize/init';\r\n\r\nimport { CommonModule } from '@angular/common';\r\nimport { MatExpansionModule } from '@angular/material/expansion';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { MatProgressBarModule } from '@angular/material/progress-bar';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\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/ngx-mat-tools';\r\n\r\nimport { UserListRepository } from '../state/user-list.repository';\r\nimport { UserFilter } from '../../services/auth-jwt-account.service';\r\nimport { UserFilterComponent } from '../user-filter/user-filter.component';\r\nimport { UserEditorComponent } from '../user-editor/user-editor.component';\r\n\r\n/**\r\n * List of users.\r\n */\r\n@Component({\r\n selector: 'auth-jwt-user-list',\r\n imports: [\r\n CommonModule,\r\n ReactiveFormsModule,\r\n MatButtonModule,\r\n MatExpansionModule,\r\n MatIconModule,\r\n MatInputModule,\r\n MatPaginatorModule,\r\n MatProgressBarModule,\r\n MatTooltipModule,\r\n UserEditorComponent,\r\n UserFilterComponent,\r\n ],\r\n templateUrl: './user-list.component.html',\r\n styleUrls: ['./user-list.component.css'],\r\n})\r\nexport class UserListComponent {\r\n private _repository = inject(UserListRepository);\r\n private _dialogService = inject(DialogService);\r\n private _gravatarService = inject(GravatarService);\r\n\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 const _repository = this._repository;\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 | undefined): void {\r\n if (user) {\r\n this._repository.updateActiveUser(user);\r\n }\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","/*\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\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i6","i3","i4","i5"],"mappings":"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"}
1
+ {"version":3,"file":"myrmidon-auth-jwt-admin.mjs","sources":["../../../../projects/myrmidon/auth-jwt-admin/src/lib/services/auth-jwt-account.service.ts","../../../../projects/myrmidon/auth-jwt-admin/src/lib/validators/password.validators.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/public-api.ts","../../../../projects/myrmidon/auth-jwt-admin/src/myrmidon-auth-jwt-admin.ts"],"sourcesContent":["import { Injectable, inject } 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/ngx-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/**\r\n * Service for managing user accounts with JWT authentication.\r\n */\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class AuthJwtAccountService {\r\n private _http = inject(HttpClient);\r\n private _error = inject(ErrorService);\r\n private _env = inject(EnvService);\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 {\r\n AbstractControl,\r\n FormGroup,\r\n UntypedFormGroup,\r\n ValidationErrors,\r\n ValidatorFn,\r\n} from '@angular/forms';\r\n\r\n/**\r\n * Password validators.\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, inject } 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/ngx-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 _accService = inject(AuthJwtAccountService);\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() {\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 SimpleChange,\r\n input,\r\n output,\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 public readonly passwordToCheck = input<string>();\r\n public readonly strengthChange = output<number>();\r\n\r\n public bars: string[] = [];\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 public 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, input, inject, 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 ReactiveFormsModule,\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 { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { MatProgressSpinnerModule } from '@angular/material/progress-spinner';\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\nimport { PasswordStrengthBarComponent } from '../password-strength-bar/password-strength-bar.component';\r\n\r\n/**\r\n * User registration form.\r\n */\r\n@Component({\r\n selector: 'auth-jwt-registration',\r\n imports: [\r\n ReactiveFormsModule,\r\n MatButtonModule,\r\n MatFormFieldModule,\r\n MatIconModule,\r\n MatInputModule,\r\n MatProgressSpinnerModule,\r\n PasswordStrengthBarComponent,\r\n ],\r\n templateUrl: './auth-jwt-registration.component.html',\r\n styleUrls: ['./auth-jwt-registration.component.css'],\r\n})\r\nexport class AuthJwtRegistrationComponent {\r\n private _snackbar = inject(MatSnackBar);\r\n private _accountService = inject(AuthJwtAccountService);\r\n private _userRepository = inject(UserListRepository);\r\n\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 public readonly autoConfirm = input<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 public registered = output();\r\n\r\n public hide = true;\r\n\r\n constructor() {\r\n const formBuilder = inject(FormBuilder);\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\" class=\"error\">\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, inject, output, effect } from '@angular/core';\r\nimport {\r\n FormBuilder,\r\n FormControl,\r\n FormGroup,\r\n ReactiveFormsModule,\r\n} from '@angular/forms';\r\n\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\n\r\nimport { UserFilter } from '../../services/auth-jwt-account.service';\r\n\r\n/**\r\n * Users filter.\r\n */\r\n@Component({\r\n selector: 'auth-jwt-user-filter',\r\n imports: [\r\n ReactiveFormsModule,\r\n MatButtonModule,\r\n MatFormFieldModule,\r\n MatIconModule,\r\n MatInputModule,\r\n MatTooltipModule,\r\n ],\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 /**\r\n * The filter.\r\n */\r\n public readonly filter = input<UserFilter | null | undefined>();\r\n /**\r\n * Whether the filter is disabled.\r\n */\r\n public readonly disabled = input<boolean>();\r\n /**\r\n * Event emitted when the filter changes.\r\n */\r\n public filterChange = output<UserFilter>();\r\n\r\n public name: FormControl<string | null>;\r\n public form: FormGroup;\r\n\r\n constructor() {\r\n const formBuilder = inject(FormBuilder);\r\n\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\r\n // update form when filter changes\r\n effect(() => {\r\n this.updateForm(this.filter() || undefined);\r\n });\r\n\r\n // disable form when disabled\r\n effect(() => {\r\n if (this.disabled()) {\r\n this.form.disable();\r\n } else {\r\n this.form.enable();\r\n }\r\n });\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()\">\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 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 [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, inject, effect, input, output } from '@angular/core';\r\nimport {\r\n FormGroup,\r\n FormControl,\r\n FormBuilder,\r\n Validators,\r\n ReactiveFormsModule,\r\n} from '@angular/forms';\r\n\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatCheckboxModule } from '@angular/material/checkbox';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\n\r\nimport { AuthJwtService, User } from '@myrmidon/auth-jwt-login';\r\n\r\n/**\r\n * User editor form.\r\n */\r\n@Component({\r\n selector: 'auth-jwt-user-editor',\r\n imports: [\r\n ReactiveFormsModule,\r\n MatButtonModule,\r\n MatCheckboxModule,\r\n MatFormFieldModule,\r\n MatIconModule,\r\n MatInputModule,\r\n MatTooltipModule,\r\n ],\r\n templateUrl: './user-editor.component.html',\r\n styleUrls: ['./user-editor.component.css'],\r\n})\r\nexport class UserEditorComponent {\r\n private _authService = inject(AuthJwtService);\r\n\r\n public email: FormControl<string | null>;\r\n public emailConfirmed: FormControl<boolean>;\r\n public lockoutEnabled: FormControl<boolean>;\r\n public firstName: FormControl<string | null>;\r\n public lastName: FormControl<string | null>;\r\n public roles: FormControl<string | null>;\r\n public form: FormGroup;\r\n\r\n public unlocked?: boolean;\r\n\r\n /**\r\n * The user to edit.\r\n */\r\n public readonly user = input<User | undefined | null>(undefined);\r\n /**\r\n * Emitted when user changes.\r\n */\r\n public readonly userChange = output<User | undefined>();\r\n /**\r\n * Emitted when the user requests to close the user editor.\r\n */\r\n public readonly editorClose = output();\r\n\r\n constructor() {\r\n const formBuilder = inject(FormBuilder);\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<boolean>(false, {\r\n nonNullable: true,\r\n });\r\n this.lockoutEnabled = formBuilder.control<boolean>(false, {\r\n nonNullable: true,\r\n });\r\n this.firstName = formBuilder.control<string | null>(null, [\r\n Validators.required,\r\n Validators.maxLength(50),\r\n ]);\r\n this.lastName = formBuilder.control<string | null>(null, [\r\n Validators.required,\r\n Validators.maxLength(50),\r\n ]);\r\n this.roles = formBuilder.control<string | null>(\r\n null,\r\n Validators.maxLength(200)\r\n );\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 // update form when user changes\r\n effect(() => {\r\n this.updateForm(this.user() || undefined);\r\n });\r\n }\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 || false);\r\n this.lockoutEnabled.setValue(user.lockoutEnabled || false);\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 this.unlocked =\r\n user.lockoutEnabled &&\r\n (!user.lockoutEnd || user.lockoutEnd < this._authService.getUTCDate());\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\r\n const user = this.getUserFromForm();\r\n user.lockoutEnd = this._authService.getUTCDate();\r\n this.userChange.emit(user);\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 (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>\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 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, inject } from '@angular/core';\r\nimport { MatPaginatorModule, PageEvent } from '@angular/material/paginator';\r\nimport { ReactiveFormsModule } from '@angular/forms';\r\nimport { Observable } from 'rxjs';\r\nimport '@angular/localize/init';\r\n\r\nimport { CommonModule } from '@angular/common';\r\nimport { MatExpansionModule } from '@angular/material/expansion';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { MatProgressBarModule } from '@angular/material/progress-bar';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\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/ngx-tools';\r\nimport { DialogService } from '@myrmidon/ngx-mat-tools';\r\n\r\nimport { UserListRepository } from '../state/user-list.repository';\r\nimport { UserFilter } from '../../services/auth-jwt-account.service';\r\nimport { UserFilterComponent } from '../user-filter/user-filter.component';\r\nimport { UserEditorComponent } from '../user-editor/user-editor.component';\r\n\r\n/**\r\n * List of users.\r\n */\r\n@Component({\r\n selector: 'auth-jwt-user-list',\r\n imports: [\r\n CommonModule,\r\n ReactiveFormsModule,\r\n MatButtonModule,\r\n MatExpansionModule,\r\n MatIconModule,\r\n MatInputModule,\r\n MatPaginatorModule,\r\n MatProgressBarModule,\r\n MatTooltipModule,\r\n UserEditorComponent,\r\n UserFilterComponent,\r\n ],\r\n templateUrl: './user-list.component.html',\r\n styleUrls: ['./user-list.component.css'],\r\n})\r\nexport class UserListComponent {\r\n private _repository = inject(UserListRepository);\r\n private _dialogService = inject(DialogService);\r\n private _gravatarService = inject(GravatarService);\r\n\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 const _repository = this._repository;\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 | undefined): void {\r\n if (user) {\r\n this._repository.updateActiveUser(user);\r\n }\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","/*\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\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i6","i3","i4","i5"],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import { Observable } from 'rxjs';
2
2
  import { User } from '@myrmidon/auth-jwt-login';
3
- import { DataPage } from '@myrmidon/ng-tools';
3
+ import { DataPage } from '@myrmidon/ngx-tools';
4
4
  import { PagedListStoreService } from '@myrmidon/paged-data-browsers';
5
5
  import { UserFilter } from '../../services/auth-jwt-account.service';
6
6
  import * as i0 from "@angular/core";
@@ -2,7 +2,7 @@ import { PageEvent } from '@angular/material/paginator';
2
2
  import { Observable } from 'rxjs';
3
3
  import '@angular/localize/init';
4
4
  import { GravatarOptions, User } from '@myrmidon/auth-jwt-login';
5
- import { DataPage } from '@myrmidon/ng-tools';
5
+ import { DataPage } from '@myrmidon/ngx-tools';
6
6
  import { UserFilter } from '../../services/auth-jwt-account.service';
7
7
  import * as i0 from "@angular/core";
8
8
  /**
@@ -1,5 +1,5 @@
1
1
  import { Observable } from 'rxjs';
2
- import { DataPage } from '@myrmidon/ng-tools';
2
+ import { DataPage } from '@myrmidon/ngx-tools';
3
3
  import { User } from '@myrmidon/auth-jwt-login';
4
4
  import * as i0 from "@angular/core";
5
5
  /**
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@myrmidon/auth-jwt-admin",
3
- "version": "7.0.0",
3
+ "version": "7.0.2",
4
4
  "description": "JWT-based auth services accounts admin component.",
5
5
  "keywords": [
6
6
  "JWT",
@@ -18,9 +18,10 @@
18
18
  "@angular/common": "^19.0.0",
19
19
  "@angular/core": "^19.0.0",
20
20
  "@angular/material": "^19.0.0",
21
- "@myrmidon/auth-jwt-login": "^6.0.0",
21
+ "@myrmidon/auth-jwt-login": "^7.0.1",
22
22
  "@myrmidon/ngx-tools": "^0.0.1",
23
- "@myrmidon/ngx-mat-tools": "^0.0.1"
23
+ "@myrmidon/ngx-mat-tools": "^0.0.1",
24
+ "@myrmidon/paged-data-browsers": "^4.0.0"
24
25
  },
25
26
  "dependencies": {
26
27
  "tslib": "^2.3.0"