@myrmidon/auth-jwt-admin 0.0.2 → 0.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/{esm2015/lib/auth-jwt-admin.module.js → esm2020/lib/auth-jwt-admin.module.mjs} +4 -4
- package/esm2020/lib/components/auth-jwt-registration/auth-jwt-registration.component.mjs +203 -0
- package/{esm2015/lib/components/confirm-dialog/confirm-dialog.component.js → esm2020/lib/components/confirm-dialog/confirm-dialog.component.mjs} +5 -10
- package/{esm2015/lib/components/password-strength-bar/password-strength-bar.component.js → esm2020/lib/components/password-strength-bar/password-strength-bar.component.mjs} +5 -9
- package/{esm2015/lib/components/state/users.paginator.js → esm2020/lib/components/state/users.paginator.mjs} +0 -0
- package/{esm2015/lib/components/state/users.query.js → esm2020/lib/components/state/users.query.mjs} +3 -3
- package/esm2020/lib/components/state/users.service.mjs +65 -0
- package/{esm2015/lib/components/state/users.store.js → esm2020/lib/components/state/users.store.mjs} +3 -3
- package/esm2020/lib/components/user-editor/user-editor.component.mjs +112 -0
- package/esm2020/lib/components/user-filter/user-filter.component.mjs +58 -0
- package/esm2020/lib/components/user-list/user-list.component.mjs +134 -0
- package/{esm2015/lib/services/auth-jwt-account.service.js → esm2020/lib/services/auth-jwt-account.service.mjs} +3 -3
- package/{esm2015/lib/services/dialog.service.js → esm2020/lib/services/dialog.service.mjs} +3 -3
- package/{esm2015/lib/validators/password.validators.js → esm2020/lib/validators/password.validators.mjs} +0 -0
- package/{esm2015/myrmidon-auth-jwt-admin.js → esm2020/myrmidon-auth-jwt-admin.mjs} +0 -0
- package/{esm2015/public-api.js → esm2020/public-api.mjs} +0 -0
- package/fesm2015/myrmidon-auth-jwt-admin.mjs +1061 -0
- package/fesm2015/myrmidon-auth-jwt-admin.mjs.map +1 -0
- package/{fesm2015/myrmidon-auth-jwt-admin.js → fesm2020/myrmidon-auth-jwt-admin.mjs} +50 -78
- package/fesm2020/myrmidon-auth-jwt-admin.mjs.map +1 -0
- package/package.json +22 -9
- package/bundles/myrmidon-auth-jwt-admin.umd.js +0 -1466
- package/bundles/myrmidon-auth-jwt-admin.umd.js.map +0 -1
- package/esm2015/lib/components/auth-jwt-registration/auth-jwt-registration.component.js +0 -207
- package/esm2015/lib/components/state/users.service.js +0 -65
- package/esm2015/lib/components/user-editor/user-editor.component.js +0 -118
- package/esm2015/lib/components/user-filter/user-filter.component.js +0 -63
- package/esm2015/lib/components/user-list/user-list.component.js +0 -138
- package/fesm2015/myrmidon-auth-jwt-admin.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"myrmidon-auth-jwt-admin.js","sources":["../../../../projects/myrmidon/auth-jwt-admin/src/lib/validators/password.validators.ts","../../../../projects/myrmidon/auth-jwt-admin/src/lib/services/auth-jwt-account.service.ts","../../../../projects/myrmidon/auth-jwt-admin/src/lib/components/password-strength-bar/password-strength-bar.component.ts","../../../../projects/myrmidon/auth-jwt-admin/src/lib/components/password-strength-bar/password-strength-bar.component.html","../../../../projects/myrmidon/auth-jwt-admin/src/lib/components/auth-jwt-registration/auth-jwt-registration.component.ts","../../../../projects/myrmidon/auth-jwt-admin/src/lib/components/auth-jwt-registration/auth-jwt-registration.component.html","../../../../projects/myrmidon/auth-jwt-admin/src/lib/components/state/users.store.ts","../../../../projects/myrmidon/auth-jwt-admin/src/lib/components/state/users.query.ts","../../../../projects/myrmidon/auth-jwt-admin/src/lib/components/state/users.service.ts","../../../../projects/myrmidon/auth-jwt-admin/src/lib/components/user-filter/user-filter.component.ts","../../../../projects/myrmidon/auth-jwt-admin/src/lib/components/user-filter/user-filter.component.html","../../../../projects/myrmidon/auth-jwt-admin/src/lib/components/state/users.paginator.ts","../../../../projects/myrmidon/auth-jwt-admin/src/lib/components/confirm-dialog/confirm-dialog.component.ts","../../../../projects/myrmidon/auth-jwt-admin/src/lib/components/confirm-dialog/confirm-dialog.component.html","../../../../projects/myrmidon/auth-jwt-admin/src/lib/services/dialog.service.ts","../../../../projects/myrmidon/auth-jwt-admin/src/lib/components/user-editor/user-editor.component.ts","../../../../projects/myrmidon/auth-jwt-admin/src/lib/components/user-editor/user-editor.component.html","../../../../projects/myrmidon/auth-jwt-admin/src/lib/components/user-list/user-list.component.ts","../../../../projects/myrmidon/auth-jwt-admin/src/lib/components/user-list/user-list.component.html","../../../../projects/myrmidon/auth-jwt-admin/src/lib/auth-jwt-admin.module.ts","../../../../projects/myrmidon/auth-jwt-admin/src/public-api.ts","../../../../projects/myrmidon/auth-jwt-admin/src/myrmidon-auth-jwt-admin.ts"],"sourcesContent":["import { AbstractControl, ValidationErrors, ValidatorFn } from '@angular/forms';\r\n\r\nexport class PasswordValidators {\r\n /** \"Standard\" password validator for my API services. */\r\n public static standard(): ValidatorFn {\r\n return (control: AbstractControl): ValidationErrors | null => {\r\n if (!control.value) {\r\n return null;\r\n }\r\n\r\n if (control.value.length < 8) {\r\n return {\r\n passwordTooShort: true,\r\n };\r\n }\r\n\r\n if (!/.*[A-Z].*/.test(control.value)) {\r\n return {\r\n noUpperInPassword: true,\r\n };\r\n }\r\n\r\n if (!/.*[a-z].*/.test(control.value)) {\r\n return {\r\n noLowerInPassword: true,\r\n };\r\n }\r\n\r\n if (!/.*[A-Z].*/.test(control.value)) {\r\n return {\r\n noUpperInPassword: true,\r\n };\r\n }\r\n\r\n if (!/.*[-`~!@#$%^&*()_+=\\[\\]{};:'\",.<>/?|\\\\].*/.test(control.value)) {\r\n return {\r\n noSymbolInPassword: true,\r\n };\r\n }\r\n\r\n return null;\r\n };\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\nimport { HttpClient, HttpParams } from '@angular/common/http';\nimport { Observable } from 'rxjs';\nimport { retry, catchError } from 'rxjs/operators';\nimport { DataPage, EnvService, ErrorService } from '@myrmidon/ng-tools';\nimport { User } from '@myrmidon/auth-jwt-login';\n\n/**\n * User registration model. You can expand this interface to add more data.\n */\nexport interface RegistrationModel {\n email: string;\n name: string;\n firstName?: string;\n lastName?: string;\n password: string;\n}\n\n/**\n * Result of an existing resource check.\n */\nexport interface ExistResult {\n entry: string;\n isExisting: boolean;\n}\n\n/**\n * Password change data.\n */\nexport interface PasswordChange {\n email: string;\n oldPassword: string;\n newPassword: string;\n confirmPassword: string;\n}\n\n/**\n * User filter parameters.\n */\nexport interface UserFilter {\n pageNumber: number;\n pageSize: number;\n name?: string;\n}\n\n@Injectable({\n providedIn: 'root',\n})\nexport class AuthJwtAccountService {\n constructor(\n private _http: HttpClient,\n private _error: ErrorService,\n private _env: EnvService\n ) {}\n\n /**\n * Checks if the specified email address is registered on the server.\n * @param email email address to test.\n * @returns result.\n */\n public isEmailRegistered(email: string): Observable<ExistResult> {\n return this._http.get<ExistResult>(\n this._env.get('apiUrl') +\n 'accounts/emailexists/' +\n encodeURIComponent(email)\n );\n }\n\n /**\n * Checks if the specified user's given name is registered on the server.\n * This name is a nickname chosen by users during registration, and is the key\n * used for referencing users when talking to the server.\n * @param name name to test.\n * @returns result.\n */\n public isNameRegistered(name: string): Observable<ExistResult> {\n return this._http.get<ExistResult>(\n this._env.get('apiUrl') +\n 'accounts/nameexists/' +\n encodeURIComponent(name)\n );\n }\n\n /**\n * Register the user with the specified registration data.\n * @param registration The registration data.\n */\n public register(registration: RegistrationModel): Observable<any> {\n // const options = {\n // headers: this.createAuthHeaders({\n // 'Content-Type': 'application/json',\n // }),\n // };\n return this._http.post(\n this._env.get('apiUrl') + 'accounts/register',\n registration\n // options\n );\n }\n\n /**\n * Resend the confirmation email to the specified address.\n * @param email address.\n */\n public resendConfirmEmail(email: string): Observable<any> {\n // const options = {\n // headers: this.createAuthHeaders({\n // 'Content-Type': 'application/json',\n // }),\n // };\n return this._http.get(\n this._env.get('apiUrl') +\n 'accounts/resendconfirm/' +\n encodeURIComponent(email)\n // options\n );\n }\n\n /**\n * Request a password reset for the specified email address.\n * @param email Email address.\n */\n public requestPasswordReset(email: string): Observable<any> {\n return this._http.post(\n this._env.get('apiUrl') + 'accounts/resetpassword/request',\n { email }\n );\n }\n\n public getAllUsers(): Observable<DataPage<User>> {\n return this._http\n .get<DataPage<User>>(this._env.get('apiUrl') + 'users', {\n params: new HttpParams().set('pageNumber', '1'),\n })\n .pipe(retry(3), catchError(this._error.handleError));\n }\n\n public getUsers(filter: UserFilter): Observable<DataPage<User>> {\n let httpParams = new HttpParams();\n httpParams = httpParams.set('pageNumber', filter.pageNumber.toString());\n httpParams = httpParams.set('pageSize', filter.pageSize.toString());\n if (filter.name) {\n httpParams = httpParams.set('name', filter.name);\n }\n\n return this._http\n .get<DataPage<User>>(this._env.get('apiUrl') + 'users', {\n params: httpParams,\n })\n .pipe(retry(3), catchError(this._error.handleError));\n }\n /**\n * Get the top N users matching the specified name filter.\n * @param nameFilter The user name filter.\n * @param limit The maximum number of users to get.\n */\n public getTopUsers(nameFilter: string, limit = 10): Observable<User[]> {\n let httpParams = new HttpParams();\n httpParams = httpParams.set('pageNumber', '1');\n httpParams = httpParams.set('pageSize', limit.toString());\n if (nameFilter) {\n httpParams = httpParams.set('name', nameFilter);\n }\n const options =\n httpParams.keys().length > 0\n ? {\n params: httpParams,\n }\n : {};\n\n return this._http\n .get<User[]>(this._env.get('apiUrl') + 'users', options)\n .pipe(retry(3), catchError(this._error.handleError));\n }\n\n /**\n * Get information about all the users listed in the specified names.\n * @param names User(s) names.\n */\n public getUsersFromNames(names: string[]): Observable<User[]> {\n let httpParams = new HttpParams();\n if (names && names.length > 0) {\n httpParams = httpParams.set('names', names.join(','));\n }\n const options =\n httpParams.keys().length > 0\n ? {\n params: httpParams,\n }\n : {};\n\n return this._http\n .get<User[]>(this._env.get('apiUrl') + 'users-from-names', options)\n .pipe(retry(3), catchError(this._error.handleError));\n }\n\n /**\n * Get data about the specified user.\n * @param name The user name.\n */\n public getUser(name: string): Observable<User> {\n return this._http\n .get<User>(this._env.get('apiUrl') + 'users/' + name)\n .pipe(retry(3), catchError(this._error.handleError));\n }\n\n /**\n * Update the editable data for the specified user.\n * @param user The user to update.\n */\n public updateUser(user: User): Observable<any> {\n return this._http\n .put(this._env.get('apiUrl') + 'users', user)\n .pipe(catchError(this._error.handleError));\n }\n\n /**\n * Request a password reset email for the specified email address.\n * @param email The email address to receive the reset message.\n */\n public resetPassword(email: string): Observable<any> {\n return this._http\n .post(this._env.get('apiUrl') + 'accounts/resetpassword/request', {\n email: email,\n })\n .pipe(catchError(this._error.handleError));\n }\n\n /**\n * Change the password.\n * @param change The password change data.\n */\n public changePassword(change: PasswordChange): Observable<any> {\n return this._http\n .post(this._env.get('apiUrl') + 'accounts/changepassword', change)\n .pipe(catchError(this._error.handleError));\n }\n\n /**\n * Delete the user with the specified username.\n * @param name The user name.\n */\n public deleteUser(name: string): Observable<any> {\n return this._http\n .delete(this._env.get('apiUrl') + 'accounts/' + name)\n .pipe(catchError(this._error.handleError));\n }\n}\n","import {\n Component,\n OnChanges,\n EventEmitter,\n Input,\n Output,\n SimpleChange,\n} from '@angular/core';\n\n@Component({\n selector: 'auth-jwt-password-strength-bar',\n templateUrl: './password-strength-bar.component.html',\n styleUrls: ['./password-strength-bar.component.css'],\n})\nexport class PasswordStrengthBarComponent implements OnChanges {\n private _colors = ['#F00', '#F90', '#FF0', '#9F0', '#0F0'];\n\n @Input() passwordToCheck: string | undefined;\n\n @Output() strengthChange = new EventEmitter<number>();\n\n public bars: string[];\n\n constructor() {\n this.strengthChange = new EventEmitter<number>();\n this.bars = [];\n }\n\n private measureStrength(p: string): number {\n let force = 0;\n const regex = /[$-/:-?{-~!\"^_`\\[\\]]/g; // \"\n\n const lowerLetters = /[a-z]+/.test(p);\n const upperLetters = /[A-Z]+/.test(p);\n const numbers = /[0-9]+/.test(p);\n const symbols = regex.test(p);\n\n const flags = [lowerLetters, upperLetters, numbers, symbols];\n\n let passedMatches = 0;\n for (const flag of flags) {\n passedMatches += flag === true ? 1 : 0;\n }\n\n force += 2 * p.length + (p.length >= 10 ? 1 : 0);\n force += passedMatches * 10;\n\n // penalty (short password)\n force = p.length <= 6 ? Math.min(force, 10) : force;\n\n // penalty (poor letiety of characters)\n force = passedMatches === 1 ? Math.min(force, 10) : force;\n force = passedMatches === 2 ? Math.min(force, 20) : force;\n force = passedMatches === 3 ? Math.min(force, 40) : force;\n\n return force;\n }\n\n private getColor(s: number) {\n let idx = 0;\n if (s <= 10) {\n idx = 0;\n } else if (s <= 20) {\n idx = 1;\n } else if (s <= 30) {\n idx = 2;\n } else if (s <= 40) {\n idx = 3;\n } else {\n idx = 4;\n }\n return {\n idx: idx + 1,\n col: this._colors[idx],\n };\n }\n\n ngOnChanges(changes: { [propName: string]: SimpleChange }): void {\n const password = changes['passwordToCheck'].currentValue;\n this.setBarColors(5, '#DDD');\n if (password) {\n const strength = this.measureStrength(password);\n const c = this.getColor(strength);\n this.setBarColors(c.idx, c.col);\n this.strengthChange.emit(strength);\n }\n }\n\n private setBarColors(count: number, col: string) {\n for (let n = 0; n < count; n++) {\n this.bars[n] = col;\n }\n }\n}\n","<div id=\"strength\">\n <small>strength:</small>\n <ul id=\"strengthBar\">\n <li class=\"point\" [style.background-color]=\"bars[0]\"></li>\n <li class=\"point\" [style.background-color]=\"bars[1]\"></li>\n <li class=\"point\" [style.background-color]=\"bars[2]\"></li>\n <li class=\"point\" [style.background-color]=\"bars[3]\"></li>\n <li class=\"point\" [style.background-color]=\"bars[4]\"></li>\n </ul>\n</div>\n","import { Component, EventEmitter, OnInit, Output } from '@angular/core';\nimport {\n FormGroup,\n FormControl,\n FormBuilder,\n Validators,\n AbstractControl,\n ValidationErrors,\n} from '@angular/forms';\nimport { MatSnackBar } from '@angular/material/snack-bar';\nimport { Observable } from 'rxjs';\nimport { take } from 'rxjs/operators';\nimport {\n AuthJwtAccountService,\n ExistResult,\n RegistrationModel,\n} from '../../services/auth-jwt-account.service';\n\nimport { PasswordValidators } from '../../validators/password.validators';\n\n@Component({\n selector: 'auth-jwt-registration',\n templateUrl: './auth-jwt-registration.component.html',\n styleUrls: ['./auth-jwt-registration.component.css'],\n})\nexport class AuthJwtRegistrationComponent implements OnInit {\n public busy: boolean | undefined;\n // form\n public registration: FormGroup;\n public email: FormControl;\n public name: FormControl;\n public firstName: FormControl;\n public lastName: FormControl;\n public passwords: FormGroup;\n public password: FormControl;\n public confirmPassword: FormControl;\n\n /**\n * Emitted when a user was successfully registered. Usually\n * you should handle this to move away from the registration\n * page.\n */\n @Output()\n public registered: EventEmitter<any>;\n\n constructor(\n formBuilder: FormBuilder,\n private _snackbar: MatSnackBar,\n private _accountService: AuthJwtAccountService\n ) {\n this.registered = new EventEmitter<any>();\n // form\n this.email = formBuilder.control(\n '',\n [Validators.required, Validators.email],\n this.getUniqueEmailValidator(this._accountService).bind(this)\n );\n\n this.name = formBuilder.control(\n '',\n Validators.required,\n this.getUniqueNameValidator(this._accountService).bind(this)\n );\n\n this.firstName = formBuilder.control('', [\n Validators.required,\n Validators.maxLength(50),\n ]);\n this.lastName = formBuilder.control('', [\n Validators.required,\n Validators.maxLength(50),\n ]);\n\n // http://stackoverflow.com/questions/35474991/angular-2-form-validating-for-repeat-password\n this.password = formBuilder.control(\n '',\n Validators.compose([Validators.required, PasswordValidators.standard])\n );\n this.confirmPassword = formBuilder.control('', Validators.required);\n this.passwords = formBuilder.group(\n {\n password: this.password,\n confirmPassword: this.confirmPassword,\n },\n { validator: this.areEqual.bind(this) }\n );\n\n this.registration = formBuilder.group({\n email: this.email,\n name: this.name,\n firstName: this.firstName,\n lastName: this.lastName,\n passwords: this.passwords,\n });\n }\n\n private areEqual(group: FormGroup): { [key: string]: boolean } | null {\n if (this.password.value === this.confirmPassword.value) {\n return null;\n }\n return {\n areEqual: true,\n };\n }\n\n /**\n * Creates a unique name validator. There is no dependency injection at this level,\n * but we can use closures. As a matter of fact, we have access to the service instance\n * from the component where we register validators. So we will implement a function\n * that will accept the service as parameter, and create the actual validation function.\n * This function will have access to the service when called during the validation process.\n * See http://restlet.com/blog/2016/02/17/implementing-angular2-forms-beyond-basics-part-2/.\n */\n private getUniqueNameValidator(service: AuthJwtAccountService) {\n return (\n control: AbstractControl\n ):\n | Promise<ValidationErrors | null>\n | Observable<ValidationErrors | null> => {\n return new Promise((resolve, reject) => {\n // avoid checking if empty\n if (!control.value) {\n resolve(null);\n } else {\n service.isNameRegistered(control.value).subscribe(\n (data: ExistResult) => {\n if (!data.isExisting) {\n resolve(null);\n } else {\n resolve({ uniqueName: true });\n }\n },\n (err) => {\n resolve({ uniqueName: true });\n }\n );\n }\n });\n };\n }\n\n private getUniqueEmailValidator(service: AuthJwtAccountService) {\n return (\n control: AbstractControl\n ):\n | Promise<ValidationErrors | null>\n | Observable<ValidationErrors | null> => {\n return new Promise((resolve, reject) => {\n // avoid checking if empty\n if (!control.value) {\n resolve(null);\n } else {\n service.isEmailRegistered(control.value).subscribe(\n (data: ExistResult) => {\n if (!data.isExisting) {\n resolve(null);\n } else {\n resolve({ uniqueEmail: true });\n }\n },\n (err) => {\n resolve({ uniqueEmail: true });\n }\n );\n }\n });\n };\n }\n\n ngOnInit(): void {}\n\n public getEmailErrorLabel(): string | null {\n if (!this.email.dirty) {\n return null;\n }\n\n if (this.email.hasError('required')) {\n return 'email address required';\n }\n if (this.email.hasError('email')) {\n return 'invalid email address';\n }\n if (this.email.hasError('uniqueEmail') && !this.email.pending) {\n return 'email address already registered';\n }\n return null;\n }\n\n public getNameErrorLabel(): string | null {\n if (!this.name.dirty) {\n return null;\n }\n\n if (this.name.hasError('required')) {\n return 'username required';\n }\n\n if (this.name.hasError('pattern')) {\n return 'invalid username';\n }\n\n if (this.name.hasError('uniqueName') && !this.name.pending) {\n return 'username already taken';\n }\n\n return null;\n }\n\n public getPasswordErrorLabel(): string | null {\n if (!this.password.dirty) {\n return null;\n }\n\n if (this.password.hasError('required')) {\n return 'password required';\n }\n if (this.password.hasError('passwordTooShort')) {\n let s = 'at least 8 characters';\n if (this.password.value) {\n s += ` (now ${this.password.value.length})`;\n }\n return s;\n }\n if (this.password.hasError('noUpperInPassword')) {\n return 'at least 1 uppercase letter';\n }\n if (this.password.hasError('noLowerInPassword')) {\n return 'at least 1 lowercase letter';\n }\n if (this.password.hasError('noSymbolInPassword')) {\n return 'at least 1 punctuation or symbol';\n }\n\n return null;\n }\n\n public onSubmit(): void {\n if (\n !this.registration.valid ||\n this.busy ||\n this.name.pending ||\n this.email.pending\n ) {\n return;\n }\n\n const model: RegistrationModel = {\n email: this.email.value,\n name: this.name.value,\n firstName: this.firstName.value,\n lastName: this.lastName.value,\n password: this.password.value,\n };\n\n this.busy = true;\n this._accountService\n .register(model)\n .pipe(take(1))\n .subscribe(\n () => {\n this.busy = false;\n this._snackbar.open('Registration succeeded', 'OK');\n // this.registration.reset();\n // this.registration.clearValidators();\n // this.registration.markAsPristine();\n this.registered.emit();\n },\n (error) => {\n this.busy = false;\n console.error(error);\n this._snackbar.open('Registration error', 'OK');\n }\n );\n }\n}\n","<div>\n <div>\n <p>\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 3\n characters, nor longer than 50.\n </p>\n <p>\n To promote a decent security level, the password must include at least 8\n characters, uppercase and lowercase letters, digits, and punctuation (like\n dashes, stops, parentheses, etc.).\n </p>\n <p>\n Once registered, the user will receive an email message to the email\n address you specified; he will have to click on the provided link to\n complete the registration process.\n </p>\n </div>\n\n <form role=\"form\" [formGroup]=\"registration\" (submit)=\"onSubmit()\">\n <fieldset>\n <label>register user</label>\n <!-- email -->\n <div>\n <mat-form-field>\n <input\n matInput\n type=\"email\"\n id=\"email\"\n maxlength=\"256\"\n required\n autofocus\n spellcheck=\"false\"\n placeholder=\"email\"\n formControlName=\"email\"\n />\n <mat-error>{{ getEmailErrorLabel() }}</mat-error>\n <mat-icon *ngIf=\"email.pending\">hourglass</mat-icon>\n </mat-form-field>\n </div>\n\n <!-- name -->\n <div>\n <mat-form-field>\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 placeholder=\"username\"\n formControlName=\"name\"\n />\n <mat-error>{{ getNameErrorLabel() }}</mat-error>\n <mat-icon *ngIf=\"name.pending\">hourglass</mat-icon>\n </mat-form-field>\n </div>\n\n <!-- first name -->\n <div>\n <mat-form-field>\n <input\n matInput\n type=\"text\"\n id=\"firstName\"\n maxlength=\"50\"\n required\n spellcheck=\"false\"\n placeholder=\"first name\"\n formControlName=\"firstName\"\n />\n <mat-error\n *ngIf=\"\n firstName.hasError('required') &&\n (firstName.dirty || firstName.touched)\n \"\n class=\"text-danger small\"\n >\n first name required\n </mat-error>\n </mat-form-field>\n </div>\n\n <!-- last name -->\n <div>\n <mat-form-field>\n <input\n matInput\n type=\"text\"\n id=\"lastName\"\n maxlength=\"50\"\n required\n spellcheck=\"false\"\n placeholder=\"last name\"\n formControlName=\"lastName\"\n />\n <mat-error\n *ngIf=\"\n lastName.hasError('required') &&\n (lastName.dirty || lastName.touched)\n \"\n class=\"text-danger small\"\n >\n last name required\n </mat-error>\n </mat-form-field>\n </div>\n\n <div [formGroup]=\"passwords\">\n <!-- password -->\n <div>\n <mat-form-field>\n <input\n matInput\n type=\"password\"\n name=\"password\"\n autocomplete=\"new-password\"\n maxlength=\"50\"\n required\n spellcheck=\"false\"\n placeholder=\"password\"\n formControlName=\"password\"\n />\n <auth-jwt-password-strength-bar [passwordToCheck]=\"password.value\">\n </auth-jwt-password-strength-bar>\n <mat-error>{{ getPasswordErrorLabel() }}</mat-error>\n </mat-form-field>\n </div>\n\n <!-- confirm password -->\n <div>\n <mat-form-field>\n <input\n matInput\n type=\"password\"\n name=\"confirmPassword\"\n maxlength=\"50\"\n required\n spellcheck=\"false\"\n placeholder=\"confirm password\"\n formControlName=\"confirmPassword\"\n />\n <mat-error\n *ngIf=\"\n passwords.hasError('areEqual') &&\n (confirmPassword.dirty || confirmPassword.touched)\n \"\n >\n password differs from confirmation password\n </mat-error>\n </mat-form-field>\n </div>\n </div>\n\n <button\n mat-raised-button\n type=\"submit\"\n color=\"primary\"\n [disabled]=\"\n !registration.valid || busy || name.pending || email.pending\n \"\n >\n register\n </button>\n <mat-progress-spinner\n diameter=\"20\"\n *ngIf=\"busy\"\n aria-label=\"Busy\"\n ></mat-progress-spinner>\n </fieldset>\n </form>\n</div>\n","import { StoreConfig, EntityStore, EntityState, ActiveState } from '@datorama/akita';\r\nimport { Injectable } from '@angular/core';\r\nimport { User } from '@myrmidon/auth-jwt-login';\r\nimport { UserFilter } from '../../services/auth-jwt-account.service';\r\n\r\n// https://netbasal.gitbook.io/akita/entity-store/entity-store/active-state\r\nexport interface UsersState\r\n extends EntityState<User, string>,\r\n ActiveState<string> {\r\n filter: UserFilter;\r\n active: string | null;\r\n}\r\n\r\nconst initialState: UsersState = {\r\n filter: {\r\n pageNumber: 1,\r\n pageSize: 20,\r\n },\r\n active: null\r\n};\r\n\r\n@Injectable({ providedIn: 'root' })\r\n@StoreConfig({ name: 'Users', idKey: 'userName', resettable: true })\r\nexport class UsersStore extends EntityStore<UsersState> {\r\n constructor() {\r\n super(initialState);\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { QueryEntity } from '@datorama/akita';\r\nimport { Observable } from 'rxjs';\r\nimport { UserFilter } from '../../services/auth-jwt-account.service';\r\nimport { UsersState, UsersStore } from './users.store';\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class UsersQuery extends QueryEntity<UsersState> {\r\n constructor(protected _store: UsersStore) {\r\n super(_store);\r\n }\r\n\r\n public selectFilter(): Observable<UserFilter> {\r\n return this.select((state: UsersState) => state.filter);\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { User } from '@myrmidon/auth-jwt-login';\r\nimport {\r\n AuthJwtAccountService,\r\n UserFilter,\r\n} from '../../services/auth-jwt-account.service';\r\nimport { UsersStore } from './users.store';\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class UsersService {\r\n constructor(\r\n private _store: UsersStore,\r\n private _accountService: AuthJwtAccountService\r\n ) {}\r\n\r\n /**\r\n * Update the filter in the store.\r\n * @param filter The filter.\r\n */\r\n public updateFilter(filter: UserFilter): void {\r\n this._store.update({\r\n filter: filter,\r\n });\r\n }\r\n\r\n public setActive(name: string | null): void {\r\n this._store.setActive(name);\r\n }\r\n\r\n public updateActive(user: User): Promise<boolean> {\r\n const promise: Promise<boolean> = new Promise((resolve, reject) => {\r\n this._store.setLoading(true);\r\n\r\n this._accountService.updateUser(user).subscribe(\r\n (_) => {\r\n this._store.setLoading(false);\r\n this._store.setError(null);\r\n this._store.updateActive((u) => {\r\n return { ...user };\r\n });\r\n resolve(true);\r\n },\r\n (error) => {\r\n console.error(error);\r\n this._store.setLoading(false);\r\n this._store.setError('Error updating user');\r\n resolve(false);\r\n }\r\n );\r\n });\r\n return promise;\r\n }\r\n\r\n public deleteUser(name: string): Promise<boolean> {\r\n const promise: Promise<boolean> = new Promise((resolve, reject) => {\r\n this._store.setLoading(true);\r\n\r\n this._accountService.deleteUser(name).subscribe(\r\n (_) => {\r\n this._store.setLoading(false);\r\n this._store.setError(null);\r\n this._store.remove(name);\r\n resolve(true);\r\n },\r\n (error) => {\r\n console.error(error);\r\n this._store.setLoading(false);\r\n this._store.setError('Error deleting user');\r\n reject(error);\r\n }\r\n );\r\n });\r\n return promise;\r\n }\r\n}\r\n","import { Component, Input, OnInit } from '@angular/core';\nimport { FormBuilder, FormControl, FormGroup } from '@angular/forms';\nimport { Observable } from 'rxjs';\nimport { UserFilter } from '../../services/auth-jwt-account.service';\nimport { UsersQuery } from '../state/users.query';\nimport { UsersService } from '../state/users.service';\n\n@Component({\n selector: 'auth-jwt-user-filter',\n templateUrl: './user-filter.component.html',\n styleUrls: ['./user-filter.component.css'],\n})\nexport class UserFilterComponent implements OnInit {\n @Input()\n public disabled: boolean | undefined;\n\n public filter$: Observable<UserFilter>;\n\n public name: FormControl;\n public form: FormGroup;\n\n constructor(\n formBuilder: FormBuilder,\n query: UsersQuery,\n private _corporaService: UsersService\n ) {\n this.filter$ = query.selectFilter();\n\n // form\n this.name = formBuilder.control(null);\n this.form = formBuilder.group({\n name: this.name,\n });\n }\n\n ngOnInit(): void {\n this.filter$.subscribe((f) => {\n this.updateForm(f);\n });\n }\n\n private updateForm(filter: UserFilter): void {\n this.name.setValue(filter.name);\n this.form.markAsPristine();\n }\n\n public reset(): void {\n this.form.reset();\n this.apply();\n }\n\n private getFilter(): UserFilter {\n return {\n pageNumber: 1, // not used\n pageSize: 20, // not used\n name: this.name.value?.trim(),\n };\n }\n\n public apply(): void {\n if (this.form.invalid) {\n return;\n }\n const filter = this.getFilter();\n\n // update filter in state\n this._corporaService.updateFilter(filter);\n }\n}\n","<form [formGroup]=\"form\" (submit)=\"apply()\" ng-disabled=\"disabled\">\n <mat-form-field>\n <input matInput [formControl]=\"name\" placeholder=\"name or ID\" />\n <button\n mat-icon-button\n matSuffix\n type=\"button\"\n (click)=\"reset()\"\n color=\"warn\"\n matTooltip=\"Reset filters\"\n [disabled]=\"disabled\"\n >\n <mat-icon>clear</mat-icon>\n </button>\n </mat-form-field>\n\n <button\n type=\"submit\"\n mat-icon-button\n color=\"primary\"\n [disabled]=\"disabled\"\n matTooltip=\"Apply filters\"\n >\n <mat-icon>check_circle</mat-icon>\n </button>\n</form>\n","import { inject, InjectionToken } from '@angular/core';\r\nimport { PaginatorPlugin } from '@datorama/akita';\r\nimport { UsersQuery } from './users.query';\r\n\r\n// create a factory provider for the paginator\r\nexport const USERS_PAGINATOR = new InjectionToken('USERS_PAGINATOR', {\r\n providedIn: 'root',\r\n factory: () => {\r\n const query = inject(UsersQuery);\r\n return new PaginatorPlugin(query).withControls().withRange();\r\n },\r\n});\r\n","import { Component, OnInit, Inject, Optional } from '@angular/core';\r\nimport { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog';\r\n\r\n// https://medium.com/@tarik.nzl/making-use-of-dialogs-in-material-2-mddialog-7533d27df41\r\n\r\n@Component({\r\n // https://github.com/angular/components/issues/7718\r\n // selector: 'cadmus-confirm-dialog',\r\n templateUrl: './confirm-dialog.component.html',\r\n styleUrls: ['./confirm-dialog.component.css'],\r\n})\r\nexport class ConfirmDialogComponent implements OnInit {\r\n public title: string;\r\n public prompt: string;\r\n public ok: string;\r\n public cancel: string;\r\n\r\n constructor(\r\n public dialogRef: MatDialogRef<ConfirmDialogComponent>,\r\n @Optional() @Inject(MAT_DIALOG_DATA) public data: any\r\n ) {\r\n this.title = 'Confirm';\r\n this.prompt = 'Confirm operation?';\r\n this.ok = 'yes';\r\n this.cancel = 'no';\r\n }\r\n\r\n ngOnInit() {}\r\n}\r\n","<h1 mat-dialog-title>{{ title }}</h1>\r\n<mat-dialog-content>\r\n {{ prompt }}\r\n</mat-dialog-content>\r\n<mat-dialog-actions>\r\n <button\r\n type=\"button\"\r\n mat-raised-button\r\n color=\"warn\"\r\n (click)=\"dialogRef.close(true)\"\r\n >\r\n {{ ok }}\r\n </button>\r\n <button type=\"button\" mat-button (click)=\"dialogRef.close()\">\r\n {{ cancel }}\r\n </button>\r\n</mat-dialog-actions>\r\n","import { Injectable } from '@angular/core';\r\nimport { MatDialog, MatDialogRef } from '@angular/material/dialog';\r\nimport { ConfirmDialogComponent } from '../components/confirm-dialog/confirm-dialog.component';\r\nimport { Observable } from 'rxjs';\r\n\r\n// https://medium.com/@tarik.nzl/making-use-of-dialogs-in-material-2-mddialog-7533d27df41\r\n\r\n/**\r\n * This service acts as a wrapper for MatDialog to simplify the process of calling\r\n * the dialog and subscribing to it. What it will do is create an Instance of\r\n * MatDialog with our custom component (ConfirmDialogComponent). Then it will set\r\n * any public properties it needs to by setting the properties on the\r\n * componentInstance object. It will return the observable afterClosed()\r\n * to the caller so they can subscribe to it. This will emit an event whenever\r\n * the dialog is closed.\r\n */\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class DialogService {\r\n\r\n constructor(private dialog: MatDialog) { }\r\n\r\n public confirm(title: string, prompt: string, ok = 'yes', cancel = 'no'):\r\n Observable<boolean> {\r\n\r\n let dialogRef: MatDialogRef<ConfirmDialogComponent>;\r\n\r\n dialogRef = this.dialog.open(ConfirmDialogComponent);\r\n dialogRef.componentInstance.title = title;\r\n dialogRef.componentInstance.prompt = prompt;\r\n dialogRef.componentInstance.ok = ok;\r\n dialogRef.componentInstance.cancel = cancel;\r\n\r\n return dialogRef.afterClosed();\r\n }\r\n}\r\n","import { Component, OnInit, Input, Output, EventEmitter } from '@angular/core';\nimport {\n FormGroup,\n FormControl,\n FormBuilder,\n Validators,\n} from '@angular/forms';\nimport { AuthJwtService, User } from '@myrmidon/auth-jwt-login';\n\n@Component({\n selector: 'auth-jwt-user-editor',\n templateUrl: './user-editor.component.html',\n styleUrls: ['./user-editor.component.css'],\n})\nexport class UserEditorComponent implements OnInit {\n private _user: User | undefined;\n\n public email: FormControl;\n public emailConfirmed: FormControl;\n public lockoutEnabled: FormControl;\n public firstName: FormControl;\n public lastName: FormControl;\n public roles: FormControl;\n public form: FormGroup;\n\n public unlocked: boolean | undefined;\n\n @Input() public set user(value: User | undefined) {\n this._user = value;\n this.updateForm(value);\n }\n public get user(): User | undefined {\n return this._user;\n }\n\n @Output() userChange: EventEmitter<User>;\n @Output() editorClose: EventEmitter<any>;\n\n constructor(formBuilder: FormBuilder, private _authService: AuthJwtService) {\n // events\n this.userChange = new EventEmitter<User>();\n this.editorClose = new EventEmitter<any>();\n // form\n this.email = formBuilder.control(null, [\n Validators.required,\n Validators.email,\n ]);\n this.emailConfirmed = formBuilder.control(false);\n this.lockoutEnabled = formBuilder.control(false);\n this.firstName = formBuilder.control(null, [\n Validators.required,\n Validators.maxLength(50),\n ]);\n this.lastName = formBuilder.control(null, [\n Validators.required,\n Validators.maxLength(50),\n ]);\n this.roles = formBuilder.control(null, Validators.maxLength(200));\n\n this.form = formBuilder.group({\n email: this.email,\n emailConfirmed: this.emailConfirmed,\n lockoutEnabled: this.lockoutEnabled,\n firstName: this.firstName,\n lastName: this.lastName,\n roles: this.roles,\n });\n }\n\n ngOnInit(): void {}\n\n private updateForm(user: User | undefined): void {\n if (!user) {\n this.form.reset();\n } else {\n this.email.setValue(user.email);\n this.emailConfirmed.setValue(user.emailConfirmed);\n this.lockoutEnabled.setValue(user.lockoutEnabled);\n this.firstName.setValue(user.firstName);\n this.lastName.setValue(user.lastName);\n if (user.roles?.length > 0) {\n this.roles.setValue(user.roles.join(' '));\n } else {\n this.roles.setValue(null);\n }\n }\n }\n\n private getUserFromForm(): User {\n return {\n userName: this._user?.userName || '',\n email: this.email.value,\n emailConfirmed: this.emailConfirmed.value,\n lockoutEnabled: this.lockoutEnabled.value,\n firstName: this.firstName.value,\n lastName: this.lastName.value,\n roles: this.roles.value\n ? this.roles.value.split(' ').filter((s: string) => s)\n : [],\n };\n }\n\n public endLockout(): void {\n if (this.unlocked) {\n return;\n }\n this._user!.lockoutEnd = this._authService.getUTCDate();\n this.unlocked = true;\n }\n\n public close(): void {\n this.editorClose.emit();\n }\n\n public save(): void {\n if (this.form.invalid) {\n return;\n }\n this.userChange.emit(this.getUserFromForm());\n }\n}\n","<form [formGroup]=\"form\" (submit)=\"save()\">\n <!-- email -->\n <div>\n <mat-form-field>\n <input type=\"text\" matInput [formControl]=\"email\" placeholder=\"email\" />\n <mat-error\n *ngIf=\"email.hasError('required') && (email.dirty || email.touched)\"\n >\n email address required\n </mat-error>\n <mat-error\n *ngIf=\"email.hasError('pattern') && (email.dirty || email.touched)\"\n >\n invalid email address\n </mat-error>\n </mat-form-field>\n </div>\n\n <!-- emailConfirmed -->\n <div>\n <mat-checkbox [formControl]=\"emailConfirmed\"\n >email address confirmed</mat-checkbox\n >\n </div>\n\n <!-- lockoutEnabled -->\n <div>\n <mat-checkbox [formControl]=\"lockoutEnabled\"\n >lockout enabled</mat-checkbox\n >\n \n <button\n mat-stroked-button\n (click)=\"endLockout()\"\n [disabled]=\"unlocked\"\n matTooltip=\"Unlock this user if locked\"\n >\n unlock\n </button>\n </div>\n\n <!-- firstName -->\n <div>\n <mat-form-field>\n <input\n type=\"text\"\n matInput\n [formControl]=\"firstName\"\n placeholder=\"first name\"\n />\n <mat-error\n *ngIf=\"\n firstName.hasError('required') &&\n (firstName.dirty || firstName.touched)\n \"\n >\n first name required\n </mat-error>\n <mat-error\n *ngIf=\"\n firstName.hasError('maxlength') &&\n (firstName.dirty || firstName.touched)\n \"\n >\n first name too long\n </mat-error>\n </mat-form-field>\n </div>\n\n <!-- lastName -->\n <div>\n <mat-form-field>\n <input\n type=\"text\"\n matInput\n [formControl]=\"lastName\"\n placeholder=\"last name\"\n />\n <mat-error\n *ngIf=\"\n lastName.hasError('required') && (lastName.dirty || lastName.touched)\n \"\n >\n last name required\n </mat-error>\n <mat-error\n *ngIf=\"\n lastName.hasError('maxlength') && (lastName.dirty || lastName.touched)\n \"\n >\n last name too long\n </mat-error>\n </mat-form-field>\n </div>\n\n <!-- roles -->\n <div>\n <mat-form-field>\n <input\n type=\"text\"\n matInput\n [formControl]=\"roles\"\n placeholder=\"roles (separated by space)\"\n />\n <mat-error\n *ngIf=\"roles.hasError('maxlength') && (roles.dirty || roles.touched)\"\n >\n too long\n </mat-error>\n </mat-form-field>\n </div>\n\n <!-- buttons -->\n <br />\n <div>\n <button mat-icon-button color=\"warn\" matTooltip=\"Close\" (click)=\"close()\">\n <mat-icon>cancel</mat-icon>\n </button>\n \n <button\n type=\"submit\"\n mat-button\n color=\"primary\"\n [disabled]=\"form.invalid\"\n matTooltip=\"Save user data\"\n >\n <mat-icon>check_circle</mat-icon> save\n </button>\n </div>\n</form>\n","import { Component, Inject, OnDestroy } from '@angular/core';\nimport { FormBuilder, FormControl } from '@angular/forms';\nimport { PageEvent } from '@angular/material/paginator';\nimport { BehaviorSubject, combineLatest, Observable } from 'rxjs';\nimport { map, startWith, switchMap, take, tap } from 'rxjs/operators';\nimport { PaginationResponse, PaginatorPlugin } from '@datorama/akita';\n\nimport { GravatarService, User } from '@myrmidon/auth-jwt-login';\nimport { DataPage } from '@myrmidon/ng-tools';\n\nimport {\n AuthJwtAccountService,\n UserFilter,\n} from '../../services/auth-jwt-account.service';\nimport { USERS_PAGINATOR } from '../state/users.paginator';\nimport { UsersState } from '../state/users.store';\nimport { UsersQuery } from '../state/users.query';\nimport { DialogService } from '../../services/dialog.service';\nimport { UsersService } from '../state/users.service';\n\n@Component({\n selector: 'auth-jwt-user-list',\n templateUrl: './user-list.component.html',\n styleUrls: ['./user-list.component.css'],\n})\nexport class UserListComponent implements OnDestroy {\n private _refresh$: BehaviorSubject<number>;\n private _filter$: Observable<UserFilter>;\n\n public pagination$: Observable<PaginationResponse<User>>;\n public pageSize: FormControl;\n public active$: Observable<User | undefined>;\n\n constructor(\n @Inject(USERS_PAGINATOR)\n public paginator: PaginatorPlugin<UsersState>,\n userQuery: UsersQuery,\n private _accountService: AuthJwtAccountService,\n private _usersService: UsersService,\n private _dialogService: DialogService,\n private _gravatarService: GravatarService,\n formBuilder: FormBuilder\n ) {\n this.pageSize = formBuilder.control(20);\n this._refresh$ = new BehaviorSubject(0);\n this._filter$ = userQuery.selectFilter();\n // https://netbasal.com/manage-your-entities-with-akita-like-a-boss-768732f8d4d1\n this.active$ = userQuery.selectActive<User>();\n\n this.pagination$ = combineLatest([\n this.paginator.pageChanges,\n this.pageSize.valueChanges.pipe(\n // we are required to emit at least the initial value\n // as combineLatest emits only if ALL observables have emitted\n startWith(20),\n // clear the cache when page size changes\n tap((_) => {\n this.paginator.clearCache();\n })\n ),\n this._filter$.pipe(\n // clear the cache when filters changed\n tap((_) => {\n this.paginator.clearCache();\n })\n ),\n this._refresh$.pipe(\n // clear the cache when forcing refresh\n tap((_) => {\n this.paginator.clearCache();\n })\n ),\n ]).pipe(\n // for each emitted value, combine into a filter and use it\n // to request the page from server\n switchMap(([pageNumber, pageSize, filter, refresh]) => {\n // const filter = { ...this._docsQuery.getValue().filter };\n const f = { ...filter };\n f.pageNumber = pageNumber;\n f.pageSize = pageSize;\n const request = this.getRequest(f);\n // update saved filters\n this.paginator.metadata.set('filter', f);\n return this.paginator.getPage(request);\n })\n );\n }\n\n ngOnDestroy(): void {\n this.paginator.destroy();\n }\n\n private getRequest(\n filter: UserFilter\n ): () => Observable<PaginationResponse<User>> {\n return () =>\n this._accountService.getUsers(filter).pipe(\n // adapt server results to the paginator plugin\n map((p: DataPage<User>) => {\n return {\n currentPage: p.pageNumber,\n perPage: p.pageSize,\n lastPage: p.pageCount,\n data: p.items,\n total: p.total,\n };\n })\n );\n }\n\n public pageChange(event: PageEvent): void {\n // https://material.angular.io/components/paginator/api\n this.paginator.setPage(event.pageIndex + 1);\n if (event.pageSize !== this.pageSize.value) {\n this.pageSize.setValue(event.pageSize);\n }\n }\n\n public refresh(): void {\n this.paginator.clearCache();\n this._refresh$.next(this._refresh$.value + 1);\n }\n\n public deleteUser(user: User): void {\n this._dialogService\n .confirm('Confirm', `Delete User ${user.userName}?`)\n .pipe(take(1))\n .subscribe((yes) => {\n if (!yes) {\n return;\n }\n this._usersService.deleteUser(user.userName).finally(() => {\n this.refresh();\n });\n });\n }\n\n public setActiveUser(user: User | null): void {\n this._usersService.setActive(user?.userName || null);\n }\n\n public resetActiveUser(): void {\n this._usersService.setActive(null);\n }\n\n public saveActiveUser(user: User): void {\n this._usersService.updateActive(user).finally(() => {\n this.refresh();\n });\n }\n\n public onUserEditorClose(): void {\n this.setActiveUser(null);\n }\n\n public getGravatarUrl(email: string, size = 80): string | null {\n return this._gravatarService.buildGravatarUrl(email, size);\n }\n}\n","<div\n gdAreas=\"filters | progress | list | pager | editor\"\n gdRows=\"80px 64px 2fr 40px 1fr\"\n gdColumns=\"1fr\"\n gdGap=\"8px\"\n>\n <div>\n <!-- filters -->\n <div gdArea=\"filters\">\n <auth-jwt-user-filter></auth-jwt-user-filter>\n </div>\n\n <!-- progress -->\n <div *ngIf=\"paginator.isLoading$ | async\" gdArea=\"progress\">\n <mat-progress-bar mode=\"indeterminate\"></mat-progress-bar>\n </div>\n\n <!-- list -->\n <div gdArea=\"list\" *ngIf=\"pagination$ | async as pagination\">\n <table>\n <thead>\n <td></td>\n <td></td>\n <td></td>\n <th>name</th>\n <th>first</th>\n <th>last</th>\n <th>email</th>\n <th>roles</th>\n <th>lock end</th>\n </thead>\n <tbody>\n <tr *ngFor=\"let user of pagination.data\">\n <td class=\"command\">\n <button\n mat-icon-button\n type=\"button\"\n matTooltip=\"Edit {{ user.userName }}\"\n color=\"primary\"\n (click)=\"setActiveUser(user)\"\n >\n <mat-icon>mode_edit</mat-icon>\n </button>\n </td>\n <td class=\"command\">\n <button\n mat-icon-button\n type=\"button\"\n matTooltip=\"Delete {{ user.userName }}\"\n color=\"warn\"\n (click)=\"deleteUser(user)\"\n >\n <mat-icon>remove_circle</mat-icon>\n </button>\n </td>\n <td>\n <img\n [src]=\"getGravatarUrl(user.email, 32)\"\n [alt]=\"user.userName\"\n />\n </td>\n <td>{{ user.userName }}</td>\n <td>{{ user.firstName }}</td>\n <td>{{ user.lastName }}</td>\n <td>\n <a [href]=\"'mailto:' + user.email\">{{ user.email }}</a>\n </td>\n <td>{{ user.roles?.join(\" \") }}</td>\n <td>{{ user.lockoutEnd }}</td>\n </tr>\n </tbody>\n </table>\n <!-- pagination -->\n <mat-paginator\n gdArea=\"pager\"\n gdAlignColumns=\"center\"\n gdAlignRows=\"start\"\n [length]=\"pagination.total\"\n [pageSize]=\"pageSize?.value\"\n [pageSizeOptions]=\"[20, 50, 75, 100]\"\n [pageIndex]=\"pagination.currentPage - 1\"\n [showFirstLastButtons]=\"true\"\n (page)=\"pageChange($event)\"\n ></mat-paginator>\n </div>\n </div>\n\n <!-- editor -->\n <div gdArea=\"editor\" *ngIf=\"active$ | async as active\">\n <fieldset>\n <legend>{{ active.userName }}</legend>\n <auth-jwt-user-editor\n [user]=\"active\"\n (userChange)=\"saveActiveUser($event)\"\n (editorClose)=\"resetActiveUser()\"\n ></auth-jwt-user-editor>\n </fieldset>\n </div>\n</div>\n","import { CommonModule } from '@angular/common';\nimport { HttpClientModule } from '@angular/common/http';\nimport { NgModule } from '@angular/core';\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\nimport { MatCardModule } from '@angular/material/card';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatProgressBarModule } from '@angular/material/progress-bar';\nimport { MatProgressSpinnerModule } from '@angular/material/progress-spinner';\nimport { MatSnackBarModule } from '@angular/material/snack-bar';\nimport { RouterModule } from '@angular/router';\nimport { AuthJwtLoginModule } from '@myrmidon/auth-jwt-login';\nimport { NgToolsModule } from '@myrmidon/ng-tools';\n\nimport { AuthJwtRegistrationComponent } from './components/auth-jwt-registration/auth-jwt-registration.component';\nimport { PasswordStrengthBarComponent } from './components/password-strength-bar/password-strength-bar.component';\nimport { UserFilterComponent } from './components/user-filter/user-filter.component';\nimport { UserListComponent } from './components/user-list/user-list.component';\nimport { ConfirmDialogComponent } from './components/confirm-dialog/confirm-dialog.component';\nimport { MatDialogModule } from '@angular/material/dialog';\nimport { UserEditorComponent } from './components/user-editor/user-editor.component';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatCheckboxModule } from '@angular/material/checkbox';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { MatPaginatorModule } from '@angular/material/paginator';\n\n@NgModule({\n declarations: [\n AuthJwtRegistrationComponent,\n PasswordStrengthBarComponent,\n UserFilterComponent,\n UserListComponent,\n ConfirmDialogComponent,\n UserEditorComponent,\n ],\n imports: [\n CommonModule,\n HttpClientModule,\n FormsModule,\n RouterModule,\n ReactiveFormsModule,\n // material\n MatButtonModule,\n MatCardModule,\n MatCheckboxModule,\n MatDialogModule,\n MatIconModule,\n MatInputModule,\n MatPaginatorModule,\n MatProgressBarModule,\n MatProgressSpinnerModule,\n MatSnackBarModule,\n MatTooltipModule,\n AuthJwtLoginModule,\n NgToolsModule\n ],\n exports: [\n AuthJwtRegistrationComponent,\n PasswordStrengthBarComponent,\n UserFilterComponent,\n UserListComponent\n ],\n})\nexport class AuthJwtAdminModule {}\n","/*\n * Public API Surface of auth-jwt-admin\n */\n\nexport * from './lib/components/auth-jwt-registration/auth-jwt-registration.component';\nexport * from './lib/components/password-strength-bar/password-strength-bar.component';\nexport * from './lib/components/user-filter/user-filter.component';\nexport * from './lib/components/user-list/user-list.component';\nexport * from './lib/services/auth-jwt-account.service';\nexport * from './lib/validators/password.validators';\nexport * from './lib/auth-jwt-admin.module';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|