@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.
Files changed (29) hide show
  1. package/{esm2015/lib/auth-jwt-admin.module.js → esm2020/lib/auth-jwt-admin.module.mjs} +4 -4
  2. package/esm2020/lib/components/auth-jwt-registration/auth-jwt-registration.component.mjs +203 -0
  3. package/{esm2015/lib/components/confirm-dialog/confirm-dialog.component.js → esm2020/lib/components/confirm-dialog/confirm-dialog.component.mjs} +5 -10
  4. 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
  5. package/{esm2015/lib/components/state/users.paginator.js → esm2020/lib/components/state/users.paginator.mjs} +0 -0
  6. package/{esm2015/lib/components/state/users.query.js → esm2020/lib/components/state/users.query.mjs} +3 -3
  7. package/esm2020/lib/components/state/users.service.mjs +65 -0
  8. package/{esm2015/lib/components/state/users.store.js → esm2020/lib/components/state/users.store.mjs} +3 -3
  9. package/esm2020/lib/components/user-editor/user-editor.component.mjs +112 -0
  10. package/esm2020/lib/components/user-filter/user-filter.component.mjs +58 -0
  11. package/esm2020/lib/components/user-list/user-list.component.mjs +134 -0
  12. package/{esm2015/lib/services/auth-jwt-account.service.js → esm2020/lib/services/auth-jwt-account.service.mjs} +3 -3
  13. package/{esm2015/lib/services/dialog.service.js → esm2020/lib/services/dialog.service.mjs} +3 -3
  14. package/{esm2015/lib/validators/password.validators.js → esm2020/lib/validators/password.validators.mjs} +0 -0
  15. package/{esm2015/myrmidon-auth-jwt-admin.js → esm2020/myrmidon-auth-jwt-admin.mjs} +0 -0
  16. package/{esm2015/public-api.js → esm2020/public-api.mjs} +0 -0
  17. package/fesm2015/myrmidon-auth-jwt-admin.mjs +1061 -0
  18. package/fesm2015/myrmidon-auth-jwt-admin.mjs.map +1 -0
  19. package/{fesm2015/myrmidon-auth-jwt-admin.js → fesm2020/myrmidon-auth-jwt-admin.mjs} +50 -78
  20. package/fesm2020/myrmidon-auth-jwt-admin.mjs.map +1 -0
  21. package/package.json +22 -9
  22. package/bundles/myrmidon-auth-jwt-admin.umd.js +0 -1466
  23. package/bundles/myrmidon-auth-jwt-admin.umd.js.map +0 -1
  24. package/esm2015/lib/components/auth-jwt-registration/auth-jwt-registration.component.js +0 -207
  25. package/esm2015/lib/components/state/users.service.js +0 -65
  26. package/esm2015/lib/components/user-editor/user-editor.component.js +0 -118
  27. package/esm2015/lib/components/user-filter/user-filter.component.js +0 -63
  28. package/esm2015/lib/components/user-list/user-list.component.js +0 -138
  29. package/fesm2015/myrmidon-auth-jwt-admin.js.map +0 -1
@@ -1,65 +0,0 @@
1
- import { Injectable } from '@angular/core';
2
- import * as i0 from "@angular/core";
3
- import * as i1 from "./users.store";
4
- import * as i2 from "../../services/auth-jwt-account.service";
5
- export class UsersService {
6
- constructor(_store, _accountService) {
7
- this._store = _store;
8
- this._accountService = _accountService;
9
- }
10
- /**
11
- * Update the filter in the store.
12
- * @param filter The filter.
13
- */
14
- updateFilter(filter) {
15
- this._store.update({
16
- filter: filter,
17
- });
18
- }
19
- setActive(name) {
20
- this._store.setActive(name);
21
- }
22
- updateActive(user) {
23
- const promise = new Promise((resolve, reject) => {
24
- this._store.setLoading(true);
25
- this._accountService.updateUser(user).subscribe((_) => {
26
- this._store.setLoading(false);
27
- this._store.setError(null);
28
- this._store.updateActive((u) => {
29
- return Object.assign({}, user);
30
- });
31
- resolve(true);
32
- }, (error) => {
33
- console.error(error);
34
- this._store.setLoading(false);
35
- this._store.setError('Error updating user');
36
- resolve(false);
37
- });
38
- });
39
- return promise;
40
- }
41
- deleteUser(name) {
42
- const promise = new Promise((resolve, reject) => {
43
- this._store.setLoading(true);
44
- this._accountService.deleteUser(name).subscribe((_) => {
45
- this._store.setLoading(false);
46
- this._store.setError(null);
47
- this._store.remove(name);
48
- resolve(true);
49
- }, (error) => {
50
- console.error(error);
51
- this._store.setLoading(false);
52
- this._store.setError('Error deleting user');
53
- reject(error);
54
- });
55
- });
56
- return promise;
57
- }
58
- }
59
- UsersService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: UsersService, deps: [{ token: i1.UsersStore }, { token: i2.AuthJwtAccountService }], target: i0.ɵɵFactoryTarget.Injectable });
60
- UsersService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: UsersService, providedIn: 'root' });
61
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: UsersService, decorators: [{
62
- type: Injectable,
63
- args: [{ providedIn: 'root' }]
64
- }], ctorParameters: function () { return [{ type: i1.UsersStore }, { type: i2.AuthJwtAccountService }]; } });
65
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlcnMuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL215cm1pZG9uL2F1dGgtand0LWFkbWluL3NyYy9saWIvY29tcG9uZW50cy9zdGF0ZS91c2Vycy5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7Ozs7QUFTM0MsTUFBTSxPQUFPLFlBQVk7SUFDdkIsWUFDVSxNQUFrQixFQUNsQixlQUFzQztRQUR0QyxXQUFNLEdBQU4sTUFBTSxDQUFZO1FBQ2xCLG9CQUFlLEdBQWYsZUFBZSxDQUF1QjtJQUM3QyxDQUFDO0lBRUo7OztPQUdHO0lBQ0ksWUFBWSxDQUFDLE1BQWtCO1FBQ3BDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDO1lBQ2pCLE1BQU0sRUFBRSxNQUFNO1NBQ2YsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVNLFNBQVMsQ0FBQyxJQUFtQjtRQUNsQyxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUM5QixDQUFDO0lBRU0sWUFBWSxDQUFDLElBQVU7UUFDNUIsTUFBTSxPQUFPLEdBQXFCLElBQUksT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxFQUFFO1lBQ2hFLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBRTdCLElBQUksQ0FBQyxlQUFlLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLFNBQVMsQ0FDN0MsQ0FBQyxDQUFDLEVBQUUsRUFBRTtnQkFDSixJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDOUIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQzNCLElBQUksQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUU7b0JBQzdCLHlCQUFZLElBQUksRUFBRztnQkFDckIsQ0FBQyxDQUFDLENBQUM7Z0JBQ0gsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ2hCLENBQUMsRUFDRCxDQUFDLEtBQUssRUFBRSxFQUFFO2dCQUNSLE9BQU8sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQ3JCLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUM5QixJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO2dCQUM1QyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDakIsQ0FBQyxDQUNGLENBQUM7UUFDSixDQUFDLENBQUMsQ0FBQztRQUNILE9BQU8sT0FBTyxDQUFDO0lBQ2pCLENBQUM7SUFFTSxVQUFVLENBQUMsSUFBWTtRQUM1QixNQUFNLE9BQU8sR0FBcUIsSUFBSSxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLEVBQUU7WUFDaEUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7WUFFN0IsSUFBSSxDQUFDLGVBQWUsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsU0FBUyxDQUM3QyxDQUFDLENBQUMsRUFBRSxFQUFFO2dCQUNKLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUM5QixJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDM0IsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ3pCLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNoQixDQUFDLEVBQ0QsQ0FBQyxLQUFLLEVBQUUsRUFBRTtnQkFDUixPQUFPLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUNyQixJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDOUIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMscUJBQXFCLENBQUMsQ0FBQztnQkFDNUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ2hCLENBQUMsQ0FDRixDQUFDO1FBQ0osQ0FBQyxDQUFDLENBQUM7UUFDSCxPQUFPLE9BQU8sQ0FBQztJQUNqQixDQUFDOzt5R0FoRVUsWUFBWTs2R0FBWixZQUFZLGNBREMsTUFBTTsyRkFDbkIsWUFBWTtrQkFEeEIsVUFBVTttQkFBQyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IFVzZXIgfSBmcm9tICdAbXlybWlkb24vYXV0aC1qd3QtbG9naW4nO1xyXG5pbXBvcnQge1xyXG4gIEF1dGhKd3RBY2NvdW50U2VydmljZSxcclxuICBVc2VyRmlsdGVyLFxyXG59IGZyb20gJy4uLy4uL3NlcnZpY2VzL2F1dGgtand0LWFjY291bnQuc2VydmljZSc7XHJcbmltcG9ydCB7IFVzZXJzU3RvcmUgfSBmcm9tICcuL3VzZXJzLnN0b3JlJztcclxuXHJcbkBJbmplY3RhYmxlKHsgcHJvdmlkZWRJbjogJ3Jvb3QnIH0pXHJcbmV4cG9ydCBjbGFzcyBVc2Vyc1NlcnZpY2Uge1xyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSBfc3RvcmU6IFVzZXJzU3RvcmUsXHJcbiAgICBwcml2YXRlIF9hY2NvdW50U2VydmljZTogQXV0aEp3dEFjY291bnRTZXJ2aWNlXHJcbiAgKSB7fVxyXG5cclxuICAvKipcclxuICAgKiBVcGRhdGUgdGhlIGZpbHRlciBpbiB0aGUgc3RvcmUuXHJcbiAgICogQHBhcmFtIGZpbHRlciBUaGUgZmlsdGVyLlxyXG4gICAqL1xyXG4gIHB1YmxpYyB1cGRhdGVGaWx0ZXIoZmlsdGVyOiBVc2VyRmlsdGVyKTogdm9pZCB7XHJcbiAgICB0aGlzLl9zdG9yZS51cGRhdGUoe1xyXG4gICAgICBmaWx0ZXI6IGZpbHRlcixcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldEFjdGl2ZShuYW1lOiBzdHJpbmcgfCBudWxsKTogdm9pZCB7XHJcbiAgICB0aGlzLl9zdG9yZS5zZXRBY3RpdmUobmFtZSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgdXBkYXRlQWN0aXZlKHVzZXI6IFVzZXIpOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIGNvbnN0IHByb21pc2U6IFByb21pc2U8Ym9vbGVhbj4gPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgIHRoaXMuX3N0b3JlLnNldExvYWRpbmcodHJ1ZSk7XHJcblxyXG4gICAgICB0aGlzLl9hY2NvdW50U2VydmljZS51cGRhdGVVc2VyKHVzZXIpLnN1YnNjcmliZShcclxuICAgICAgICAoXykgPT4ge1xyXG4gICAgICAgICAgdGhpcy5fc3RvcmUuc2V0TG9hZGluZyhmYWxzZSk7XHJcbiAgICAgICAgICB0aGlzLl9zdG9yZS5zZXRFcnJvcihudWxsKTtcclxuICAgICAgICAgIHRoaXMuX3N0b3JlLnVwZGF0ZUFjdGl2ZSgodSkgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4geyAuLi51c2VyIH07XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICAgIHJlc29sdmUodHJ1ZSk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAoZXJyb3IpID0+IHtcclxuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xyXG4gICAgICAgICAgdGhpcy5fc3RvcmUuc2V0TG9hZGluZyhmYWxzZSk7XHJcbiAgICAgICAgICB0aGlzLl9zdG9yZS5zZXRFcnJvcignRXJyb3IgdXBkYXRpbmcgdXNlcicpO1xyXG4gICAgICAgICAgcmVzb2x2ZShmYWxzZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICApO1xyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gcHJvbWlzZTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBkZWxldGVVc2VyKG5hbWU6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgY29uc3QgcHJvbWlzZTogUHJvbWlzZTxib29sZWFuPiA9IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgdGhpcy5fc3RvcmUuc2V0TG9hZGluZyh0cnVlKTtcclxuXHJcbiAgICAgIHRoaXMuX2FjY291bnRTZXJ2aWNlLmRlbGV0ZVVzZXIobmFtZSkuc3Vic2NyaWJlKFxyXG4gICAgICAgIChfKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLl9zdG9yZS5zZXRMb2FkaW5nKGZhbHNlKTtcclxuICAgICAgICAgIHRoaXMuX3N0b3JlLnNldEVycm9yKG51bGwpO1xyXG4gICAgICAgICAgdGhpcy5fc3RvcmUucmVtb3ZlKG5hbWUpO1xyXG4gICAgICAgICAgcmVzb2x2ZSh0cnVlKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgIChlcnJvcikgPT4ge1xyXG4gICAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XHJcbiAgICAgICAgICB0aGlzLl9zdG9yZS5zZXRMb2FkaW5nKGZhbHNlKTtcclxuICAgICAgICAgIHRoaXMuX3N0b3JlLnNldEVycm9yKCdFcnJvciBkZWxldGluZyB1c2VyJyk7XHJcbiAgICAgICAgICByZWplY3QoZXJyb3IpO1xyXG4gICAgICAgIH1cclxuICAgICAgKTtcclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIHByb21pc2U7XHJcbiAgfVxyXG59XHJcbiJdfQ==
@@ -1,118 +0,0 @@
1
- import { Component, Input, Output, EventEmitter } from '@angular/core';
2
- import { Validators, } from '@angular/forms';
3
- import * as i0 from "@angular/core";
4
- import * as i1 from "@angular/forms";
5
- import * as i2 from "@myrmidon/auth-jwt-login";
6
- import * as i3 from "@angular/material/form-field";
7
- import * as i4 from "@angular/material/checkbox";
8
- import * as i5 from "@angular/material/button";
9
- import * as i6 from "@angular/material/icon";
10
- import * as i7 from "@angular/material/input";
11
- import * as i8 from "@angular/common";
12
- import * as i9 from "@angular/material/tooltip";
13
- export class UserEditorComponent {
14
- constructor(formBuilder, _authService) {
15
- this._authService = _authService;
16
- // events
17
- this.userChange = new EventEmitter();
18
- this.editorClose = new EventEmitter();
19
- // form
20
- this.email = formBuilder.control(null, [
21
- Validators.required,
22
- Validators.email,
23
- ]);
24
- this.emailConfirmed = formBuilder.control(false);
25
- this.lockoutEnabled = formBuilder.control(false);
26
- this.firstName = formBuilder.control(null, [
27
- Validators.required,
28
- Validators.maxLength(50),
29
- ]);
30
- this.lastName = formBuilder.control(null, [
31
- Validators.required,
32
- Validators.maxLength(50),
33
- ]);
34
- this.roles = formBuilder.control(null, Validators.maxLength(200));
35
- this.form = formBuilder.group({
36
- email: this.email,
37
- emailConfirmed: this.emailConfirmed,
38
- lockoutEnabled: this.lockoutEnabled,
39
- firstName: this.firstName,
40
- lastName: this.lastName,
41
- roles: this.roles,
42
- });
43
- }
44
- set user(value) {
45
- this._user = value;
46
- this.updateForm(value);
47
- }
48
- get user() {
49
- return this._user;
50
- }
51
- ngOnInit() { }
52
- updateForm(user) {
53
- var _a;
54
- if (!user) {
55
- this.form.reset();
56
- }
57
- else {
58
- this.email.setValue(user.email);
59
- this.emailConfirmed.setValue(user.emailConfirmed);
60
- this.lockoutEnabled.setValue(user.lockoutEnabled);
61
- this.firstName.setValue(user.firstName);
62
- this.lastName.setValue(user.lastName);
63
- if (((_a = user.roles) === null || _a === void 0 ? void 0 : _a.length) > 0) {
64
- this.roles.setValue(user.roles.join(' '));
65
- }
66
- else {
67
- this.roles.setValue(null);
68
- }
69
- }
70
- }
71
- getUserFromForm() {
72
- var _a;
73
- return {
74
- userName: ((_a = this._user) === null || _a === void 0 ? void 0 : _a.userName) || '',
75
- email: this.email.value,
76
- emailConfirmed: this.emailConfirmed.value,
77
- lockoutEnabled: this.lockoutEnabled.value,
78
- firstName: this.firstName.value,
79
- lastName: this.lastName.value,
80
- roles: this.roles.value
81
- ? this.roles.value.split(' ').filter((s) => s)
82
- : [],
83
- };
84
- }
85
- endLockout() {
86
- if (this.unlocked) {
87
- return;
88
- }
89
- this._user.lockoutEnd = this._authService.getUTCDate();
90
- this.unlocked = true;
91
- }
92
- close() {
93
- this.editorClose.emit();
94
- }
95
- save() {
96
- if (this.form.invalid) {
97
- return;
98
- }
99
- this.userChange.emit(this.getUserFromForm());
100
- }
101
- }
102
- UserEditorComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: UserEditorComponent, deps: [{ token: i1.FormBuilder }, { token: i2.AuthJwtService }], target: i0.ɵɵFactoryTarget.Component });
103
- UserEditorComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.1.5", type: UserEditorComponent, selector: "auth-jwt-user-editor", inputs: { user: "user" }, outputs: { userChange: "userChange", editorClose: "editorClose" }, ngImport: i0, template: "<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 &nbsp;\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 &nbsp;\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", styles: [""], components: [{ type: i3.MatFormField, selector: "mat-form-field", inputs: ["color", "floatLabel", "appearance", "hideRequiredMarker", "hintLabel"], exportAs: ["matFormField"] }, { type: i4.MatCheckbox, selector: "mat-checkbox", inputs: ["disableRipple", "color", "tabIndex", "aria-label", "aria-labelledby", "id", "labelPosition", "name", "required", "checked", "disabled", "indeterminate", "aria-describedby", "value"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { type: i5.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { type: i6.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }], directives: [{ type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { type: i7.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["id", "disabled", "required", "type", "value", "readonly", "placeholder", "errorStateMatcher", "aria-describedby"], exportAs: ["matInput"] }, { type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i1.FormControlDirective, selector: "[formControl]", inputs: ["disabled", "formControl", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { type: i8.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i3.MatError, selector: "mat-error", inputs: ["id"] }, { type: i9.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }] });
104
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: UserEditorComponent, decorators: [{
105
- type: Component,
106
- args: [{
107
- selector: 'auth-jwt-user-editor',
108
- templateUrl: './user-editor.component.html',
109
- styleUrls: ['./user-editor.component.css'],
110
- }]
111
- }], ctorParameters: function () { return [{ type: i1.FormBuilder }, { type: i2.AuthJwtService }]; }, propDecorators: { user: [{
112
- type: Input
113
- }], userChange: [{
114
- type: Output
115
- }], editorClose: [{
116
- type: Output
117
- }] } });
118
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlci1lZGl0b3IuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbXlybWlkb24vYXV0aC1qd3QtYWRtaW4vc3JjL2xpYi9jb21wb25lbnRzL3VzZXItZWRpdG9yL3VzZXItZWRpdG9yLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL215cm1pZG9uL2F1dGgtand0LWFkbWluL3NyYy9saWIvY29tcG9uZW50cy91c2VyLWVkaXRvci91c2VyLWVkaXRvci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFVLEtBQUssRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQy9FLE9BQU8sRUFJTCxVQUFVLEdBQ1gsTUFBTSxnQkFBZ0IsQ0FBQzs7Ozs7Ozs7Ozs7QUFReEIsTUFBTSxPQUFPLG1CQUFtQjtJQXdCOUIsWUFBWSxXQUF3QixFQUFVLFlBQTRCO1FBQTVCLGlCQUFZLEdBQVosWUFBWSxDQUFnQjtRQUN4RSxTQUFTO1FBQ1QsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLFlBQVksRUFBUSxDQUFDO1FBQzNDLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxZQUFZLEVBQU8sQ0FBQztRQUMzQyxPQUFPO1FBQ1AsSUFBSSxDQUFDLEtBQUssR0FBRyxXQUFXLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRTtZQUNyQyxVQUFVLENBQUMsUUFBUTtZQUNuQixVQUFVLENBQUMsS0FBSztTQUNqQixDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsY0FBYyxHQUFHLFdBQVcsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDakQsSUFBSSxDQUFDLGNBQWMsR0FBRyxXQUFXLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2pELElBQUksQ0FBQyxTQUFTLEdBQUcs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QUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFTLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztnQkFDdEQsQ0FBQyxDQUFDLEVBQUU7U0FDUCxDQUFDO0lBQ0osQ0FBQztJQUVNLFVBQVU7UUFDZixJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDakIsT0FBTztTQUNSO1FBQ0QsSUFBSSxDQUFDLEtBQU0sQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUN4RCxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQztJQUN2QixDQUFDO0lBRU0sS0FBSztRQUNWLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDMUIsQ0FBQztJQUVNLElBQUk7UUFDVCxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFO1lBQ3JCLE9BQU87U0FDUjtRQUNELElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQyxDQUFDO0lBQy9DLENBQUM7O2dIQXpHVSxtQkFBbUI7b0dBQW5CLG1CQUFtQix5SkNkaEMsdy9GQWtJQTsyRkRwSGEsbUJBQW1CO2tCQUwvQixTQUFTO21CQUFDO29CQUNULFFBQVEsRUFBRSxzQkFBc0I7b0JBQ2hDLFdBQVcsRUFBRSw4QkFBOEI7b0JBQzNDLFNBQVMsRUFBRSxDQUFDLDZCQUE2QixDQUFDO2lCQUMzQzsrSEFjcUIsSUFBSTtzQkFBdkIsS0FBSztnQkFRSSxVQUFVO3NCQUFuQixNQUFNO2dCQUNHLFdBQVc7c0JBQXBCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgSW5wdXQsIE91dHB1dCwgRXZlbnRFbWl0dGVyIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICBGb3JtR3JvdXAsXG4gIEZvcm1Db250cm9sLFxuICBGb3JtQnVpbGRlcixcbiAgVmFsaWRhdG9ycyxcbn0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgQXV0aEp3dFNlcnZpY2UsIFVzZXIgfSBmcm9tICdAbXlybWlkb24vYXV0aC1qd3QtbG9naW4nO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhdXRoLWp3dC11c2VyLWVkaXRvcicsXG4gIHRlbXBsYXRlVXJsOiAnLi91c2VyLWVkaXRvci5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3VzZXItZWRpdG9yLmNvbXBvbmVudC5jc3MnXSxcbn0pXG5leHBvcnQgY2xhc3MgVXNlckVkaXRvckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIHByaXZhdGUgX3VzZXI6IFVzZXIgfCB1bmRlZmluZWQ7XG5cbiAgcHVibGljIGVtYWlsOiBGb3JtQ29udHJvbDtcbiAgcHVibGljIGVtYWlsQ29uZmlybWVkOiBGb3JtQ29udHJvbDtcbiAgcHVibGljIGxvY2tvdXRFbmFibGVkOiBGb3JtQ29udHJvbDtcbiAgcHVibGljIGZpcnN0TmFtZTogRm9ybUNvbnRyb2w7XG4gIHB1YmxpYyBsYXN0TmFtZTogRm9ybUNvbnRyb2w7XG4gIHB1YmxpYyByb2xlczogRm9ybUNvbnRyb2w7XG4gIHB1YmxpYyBmb3JtOiBGb3JtR3JvdXA7XG5cbiAgcHVibGljIHVubG9ja2VkOiBib29sZWFuIHwgdW5kZWZpbmVkO1xuXG4gIEBJbnB1dCgpIHB1YmxpYyBzZXQgdXNlcih2YWx1ZTogVXNlciB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuX3VzZXIgPSB2YWx1ZTtcbiAgICB0aGlzLnVwZGF0ZUZvcm0odmFsdWUpO1xuICB9XG4gIHB1YmxpYyBnZXQgdXNlcigpOiBVc2VyIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fdXNlcjtcbiAgfVxuXG4gIEBPdXRwdXQoKSB1c2VyQ2hhbmdlOiBFdmVudEVtaXR0ZXI8VXNlcj47XG4gIEBPdXRwdXQoKSBlZGl0b3JDbG9zZTogRXZlbnRFbWl0dGVyPGFueT47XG5cbiAgY29uc3RydWN0b3IoZm9ybUJ1aWxkZXI6IEZvcm1CdWlsZGVyLCBwcml2YXRlIF9hdXRoU2VydmljZTogQXV0aEp3dFNlcnZpY2UpIHtcbiAgICAvLyBldmVudHNcbiAgICB0aGlzLnVzZXJDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPFVzZXI+KCk7XG4gICAgdGhpcy5lZGl0b3JDbG9zZSA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICAgIC8vIGZvcm1cbiAgICB0aGlzLmVtYWlsID0gZm9ybUJ1aWxkZXIuY29udHJvbChudWxsLCBbXG4gICAgICBWYWxpZGF0b3JzLnJlcXVpcmVkLFxuICAgICAgVmFsaWRhdG9ycy5lbWFpbCxcbiAgICBdKTtcbiAgICB0aGlzLmVtYWlsQ29uZmlybWVkID0gZm9ybUJ1aWxkZXIuY29udHJvbChmYWxzZSk7XG4gICAgdGhpcy5sb2Nrb3V0RW5hYmxlZCA9IGZvcm1CdWlsZGVyLmNvbnRyb2woZmFsc2UpO1xuICAgIHRoaXMuZmlyc3ROYW1lID0gZm9ybUJ1aWxkZXIuY29udHJvbChudWxsLCBbXG4gICAgICBWYWxpZGF0b3JzLnJlcXVpcmVkLFxuICAgICAgVmFsaWRhdG9ycy5tYXhMZW5ndGgoNTApLFxuICAgIF0pO1xuICAgIHRoaXMubGFzdE5hbWUgPSBmb3JtQnVpbGRlci5jb250cm9sKG51bGwsIFtcbiAgICAgIFZhbGlkYXRvcnMucmVxdWlyZWQsXG4gICAgICBWYWxpZGF0b3JzLm1heExlbmd0aCg1MCksXG4gICAgXSk7XG4gICAgdGhpcy5yb2xlcyA9IGZvcm1CdWlsZGVyLmNvbnRyb2wobnVsbCwgVmFsaWRhdG9ycy5tYXhMZW5ndGgoMjAwKSk7XG5cbiAgICB0aGlzLmZvcm0gPSBmb3JtQnVpbGRlci5ncm91cCh7XG4gICAgICBlbWFpbDogdGhpcy5lbWFpbCxcbiAgICAgIGVtYWlsQ29uZmlybWVkOiB0aGlzLmVtYWlsQ29uZmlybWVkLFxuICAgICAgbG9ja291dEVuYWJsZWQ6IHRoaXMubG9ja291dEVuYWJsZWQsXG4gICAgICBmaXJzdE5hbWU6IHRoaXMuZmlyc3ROYW1lLFxuICAgICAgbGFzdE5hbWU6IHRoaXMubGFzdE5hbWUsXG4gICAgICByb2xlczogdGhpcy5yb2xlcyxcbiAgICB9KTtcbiAgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge31cblxuICBwcml2YXRlIHVwZGF0ZUZvcm0odXNlcjogVXNlciB8IHVuZGVmaW5lZCk6IHZvaWQge1xuICAgIGlmICghdXNlcikge1xuICAgICAgdGhpcy5mb3JtLnJlc2V0KCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZW1haWwuc2V0VmFsdWUodXNlci5lbWFpbCk7XG4gICAgICB0aGlzLmVtYWlsQ29uZmlybWVkLnNldFZhbHVlKHVzZXIuZW1haWxDb25maXJtZWQpO1xuICAgICAgdGhpcy5sb2Nrb3V0RW5hYmxlZC5zZXRWYWx1ZSh1c2VyLmxvY2tvdXRFbmFibGVkKTtcbiAgICAgIHRoaXMuZmlyc3ROYW1lLnNldFZhbHVlKHVzZXIuZmlyc3ROYW1lKTtcbiAgICAgIHRoaXMubGFzdE5hbWUuc2V0VmFsdWUodXNlci5sYXN0TmFtZSk7XG4gICAgICBpZiAodXNlci5yb2xlcz8ubGVuZ3RoID4gMCkge1xuICAgICAgICB0aGlzLnJvbGVzLnNldFZhbHVlKHVzZXIucm9sZXMuam9pbignICcpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMucm9sZXMuc2V0VmFsdWUobnVsbCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnZXRVc2VyRnJvbUZvcm0oKTogVXNlciB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHVzZXJOYW1lOiB0aGlzLl91c2VyPy51c2VyTmFtZSB8fCAnJyxcbiAgICAgIGVtYWlsOiB0aGlzLmVtYWlsLnZhbHVlLFxuICAgICAgZW1haWxDb25maXJtZWQ6IHRoaXMuZW1haWxDb25maXJtZWQudmFsdWUsXG4gICAgICBsb2Nrb3V0RW5hYmxlZDogdGhpcy5sb2Nrb3V0RW5hYmxlZC52YWx1ZSxcbiAgICAgIGZpcnN0TmFtZTogdGhpcy5maXJzdE5hbWUudmFsdWUsXG4gICAgICBsYXN0TmFtZTogdGhpcy5sYXN0TmFtZS52YWx1ZSxcbiAgICAgIHJvbGVzOiB0aGlzLnJvbGVzLnZhbHVlXG4gICAgICAgID8gdGhpcy5yb2xlcy52YWx1ZS5zcGxpdCgnICcpLmZpbHRlcigoczogc3RyaW5nKSA9PiBzKVxuICAgICAgICA6IFtdLFxuICAgIH07XG4gIH1cblxuICBwdWJsaWMgZW5kTG9ja291dCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy51bmxvY2tlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLl91c2VyIS5sb2Nrb3V0RW5kID0gdGhpcy5fYXV0aFNlcnZpY2UuZ2V0VVRDRGF0ZSgpO1xuICAgIHRoaXMudW5sb2NrZWQgPSB0cnVlO1xuICB9XG5cbiAgcHVibGljIGNsb3NlKCk6IHZvaWQge1xuICAgIHRoaXMuZWRpdG9yQ2xvc2UuZW1pdCgpO1xuICB9XG5cbiAgcHVibGljIHNhdmUoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZm9ybS5pbnZhbGlkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMudXNlckNoYW5nZS5lbWl0KHRoaXMuZ2V0VXNlckZyb21Gb3JtKCkpO1xuICB9XG59XG4iLCI8Zm9ybSBbZm9ybUdyb3VwXT1cImZvcm1cIiAoc3VibWl0KT1cInNhdmUoKVwiPlxuICA8IS0tIGVtYWlsIC0tPlxuICA8ZGl2PlxuICAgIDxtYXQtZm9ybS1maWVsZD5cbiAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIG1hdElucHV0IFtmb3JtQ29udHJvbF09XCJlbWFpbFwiIHBsYWNlaG9sZGVyPVwiZW1haWxcIiAvPlxuICAgICAgPG1hdC1lcnJvclxuICAgICAgICAqbmdJZj1cImVtYWlsLmhhc0Vycm9yKCdyZXF1aXJlZCcpICYmIChlbWFpbC5kaXJ0eSB8fCBlbWFpbC50b3VjaGVkKVwiXG4gICAgICA+XG4gICAgICAgIGVtYWlsIGFkZHJlc3MgcmVxdWlyZWRcbiAgICAgIDwvbWF0LWVycm9yPlxuICAgICAgPG1hdC1lcnJvclxuICAgICAgICAqbmdJZj1cImVtYWlsLmhhc0Vycm9yKCdwYXR0ZXJuJykgJiYgKGVtYWlsLmRpcnR5IHx8IGVtYWlsLnRvdWNoZWQpXCJcbiAgICAgID5cbiAgICAgICAgaW52YWxpZCBlbWFpbCBhZGRyZXNzXG4gICAgICA8L21hdC1lcnJvcj5cbiAgICA8L21hdC1mb3JtLWZpZWxkPlxuICA8L2Rpdj5cblxuICA8IS0tIGVtYWlsQ29uZmlybWVkIC0tPlxuICA8ZGl2PlxuICAgIDxtYXQtY2hlY2tib3ggW2Zvcm1Db250cm9sXT1cImVtYWlsQ29uZmlybWVkXCJcbiAgICAgID5lbWFpbCBhZGRyZXNzIGNvbmZpcm1lZDwvbWF0LWNoZWNrYm94XG4gICAgPlxuICA8L2Rpdj5cblxuICA8IS0tIGxvY2tvdXRFbmFibGVkIC0tPlxuICA8ZGl2PlxuICAgIDxtYXQtY2hlY2tib3ggW2Zvcm1Db250cm9sXT1cImxvY2tvdXRFbmFibGVkXCJcbiAgICAgID5sb2Nrb3V0IGVuYWJsZWQ8L21hdC1jaGVja2JveFxuICAgID5cbiAgICAmbmJzcDtcbiAgICA8YnV0dG9uXG4gICAgICBtYXQtc3Ryb2tlZC1idXR0b25cbiAgICAgIChjbGljayk9XCJlbmRMb2Nrb3V0KClcIlxuICAgICAgW2Rpc2FibGVkXT1cInVubG9ja2VkXCJcbiAgICAgIG1hdFRvb2x0aXA9XCJVbmxvY2sgdGhpcyB1c2VyIGlmIGxvY2tlZFwiXG4gICAgPlxuICAgICAgdW5sb2NrXG4gICAgPC9idXR0b24+XG4gIDwvZGl2PlxuXG4gIDwhLS0gZmlyc3ROYW1lIC0tPlxuICA8ZGl2PlxuICAgIDxtYXQtZm9ybS1maWVsZD5cbiAgICAgIDxpbnB1dFxuICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgIG1hdElucHV0XG4gICAgICAgIFtmb3JtQ29udHJvbF09XCJmaXJzdE5hbWVcIlxuICAgICAgICBwbGFjZWhvbGRlcj1cImZpcnN0IG5hbWVcIlxuICAgICAgLz5cbiAgICAgIDxtYXQtZXJyb3JcbiAgICAgICAgKm5nSWY9XCJcbiAgICAgICAgICBmaXJzdE5hbWUuaGFzRXJyb3IoJ3JlcXVpcmVkJykgJiZcbiAgICAgICAgICAoZmlyc3ROYW1lLmRpcnR5IHx8IGZpcnN0TmFtZS50b3VjaGVkKVxuICAgICAgICBcIlxuICAgICAgPlxuICAgICAgICBmaXJzdCBuYW1lIHJlcXVpcmVkXG4gICAgICA8L21hdC1lcnJvcj5cbiAgICAgIDxtYXQtZXJyb3JcbiAgICAgICAgKm5nSWY9XCJcbiAgICAgICAgICBmaXJzdE5hbWUuaGFzRXJyb3IoJ21heGxlbmd0aCcpICYmXG4gICAgICAgICAgKGZpcnN0TmFtZS5kaXJ0eSB8fCBmaXJzdE5hbWUudG91Y2hlZClcbiAgICAgICAgXCJcbiAgICAgID5cbiAgICAgICAgZmlyc3QgbmFtZSB0b28gbG9uZ1xuICAgICAgPC9tYXQtZXJyb3I+XG4gICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgPC9kaXY+XG5cbiAgPCEtLSBsYXN0TmFtZSAtLT5cbiAgPGRpdj5cbiAgICA8bWF0LWZvcm0tZmllbGQ+XG4gICAgICA8aW5wdXRcbiAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICBtYXRJbnB1dFxuICAgICAgICBbZm9ybUNvbnRyb2xdPVwibGFzdE5hbWVcIlxuICAgICAgICBwbGFjZWhvbGRlcj1cImxhc3QgbmFtZVwiXG4gICAgICAvPlxuICAgICAgPG1hdC1lcnJvclxuICAgICAgICAqbmdJZj1cIlxuICAgICAgICAgIGxhc3ROYW1lLmhhc0Vycm9yKCdyZXF1aXJlZCcpICYmIChsYXN0TmFtZS5kaXJ0eSB8fCBsYXN0TmFtZS50b3VjaGVkKVxuICAgICAgICBcIlxuICAgICAgPlxuICAgICAgICBsYXN0IG5hbWUgcmVxdWlyZWRcbiAgICAgIDwvbWF0LWVycm9yPlxuICAgICAgPG1hdC1lcnJvclxuICAgICAgICAqbmdJZj1cIlxuICAgICAgICAgIGxhc3ROYW1lLmhhc0Vycm9yKCdtYXhsZW5ndGgnKSAmJiAobGFzdE5hbWUuZGlydHkgfHwgbGFzdE5hbWUudG91Y2hlZClcbiAgICAgICAgXCJcbiAgICAgID5cbiAgICAgICAgbGFzdCBuYW1lIHRvbyBsb25nXG4gICAgICA8L21hdC1lcnJvcj5cbiAgICA8L21hdC1mb3JtLWZpZWxkPlxuICA8L2Rpdj5cblxuICA8IS0tIHJvbGVzIC0tPlxuICA8ZGl2PlxuICAgIDxtYXQtZm9ybS1maWVsZD5cbiAgICAgIDxpbnB1dFxuICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgIG1hdElucHV0XG4gICAgICAgIFtmb3JtQ29udHJvbF09XCJyb2xlc1wiXG4gICAgICAgIHBsYWNlaG9sZGVyPVwicm9sZXMgKHNlcGFyYXRlZCBieSBzcGFjZSlcIlxuICAgICAgLz5cbiAgICAgIDxtYXQtZXJyb3JcbiAgICAgICAgKm5nSWY9XCJyb2xlcy5oYXNFcnJvcignbWF4bGVuZ3RoJykgJiYgKHJvbGVzLmRpcnR5IHx8IHJvbGVzLnRvdWNoZWQpXCJcbiAgICAgID5cbiAgICAgICAgdG9vIGxvbmdcbiAgICAgIDwvbWF0LWVycm9yPlxuICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gIDwvZGl2PlxuXG4gIDwhLS0gYnV0dG9ucyAtLT5cbiAgPGJyIC8+XG4gIDxkaXY+XG4gICAgPGJ1dHRvbiBtYXQtaWNvbi1idXR0b24gY29sb3I9XCJ3YXJuXCIgbWF0VG9vbHRpcD1cIkNsb3NlXCIgKGNsaWNrKT1cImNsb3NlKClcIj5cbiAgICAgIDxtYXQtaWNvbj5jYW5jZWw8L21hdC1pY29uPlxuICAgIDwvYnV0dG9uPlxuICAgICZuYnNwO1xuICAgIDxidXR0b25cbiAgICAgIHR5cGU9XCJzdWJtaXRcIlxuICAgICAgbWF0LWJ1dHRvblxuICAgICAgY29sb3I9XCJwcmltYXJ5XCJcbiAgICAgIFtkaXNhYmxlZF09XCJmb3JtLmludmFsaWRcIlxuICAgICAgbWF0VG9vbHRpcD1cIlNhdmUgdXNlciBkYXRhXCJcbiAgICA+XG4gICAgICA8bWF0LWljb24+Y2hlY2tfY2lyY2xlPC9tYXQtaWNvbj4gc2F2ZVxuICAgIDwvYnV0dG9uPlxuICA8L2Rpdj5cbjwvZm9ybT5cbiJdfQ==
@@ -1,63 +0,0 @@
1
- import { Component, Input } from '@angular/core';
2
- import * as i0 from "@angular/core";
3
- import * as i1 from "@angular/forms";
4
- import * as i2 from "../state/users.query";
5
- import * as i3 from "../state/users.service";
6
- import * as i4 from "@angular/material/form-field";
7
- import * as i5 from "@angular/material/button";
8
- import * as i6 from "@angular/material/icon";
9
- import * as i7 from "@angular/material/input";
10
- import * as i8 from "@angular/material/tooltip";
11
- export class UserFilterComponent {
12
- constructor(formBuilder, query, _corporaService) {
13
- this._corporaService = _corporaService;
14
- this.filter$ = query.selectFilter();
15
- // form
16
- this.name = formBuilder.control(null);
17
- this.form = formBuilder.group({
18
- name: this.name,
19
- });
20
- }
21
- ngOnInit() {
22
- this.filter$.subscribe((f) => {
23
- this.updateForm(f);
24
- });
25
- }
26
- updateForm(filter) {
27
- this.name.setValue(filter.name);
28
- this.form.markAsPristine();
29
- }
30
- reset() {
31
- this.form.reset();
32
- this.apply();
33
- }
34
- getFilter() {
35
- var _a;
36
- return {
37
- pageNumber: 1,
38
- pageSize: 20,
39
- name: (_a = this.name.value) === null || _a === void 0 ? void 0 : _a.trim(),
40
- };
41
- }
42
- apply() {
43
- if (this.form.invalid) {
44
- return;
45
- }
46
- const filter = this.getFilter();
47
- // update filter in state
48
- this._corporaService.updateFilter(filter);
49
- }
50
- }
51
- UserFilterComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: UserFilterComponent, deps: [{ token: i1.FormBuilder }, { token: i2.UsersQuery }, { token: i3.UsersService }], target: i0.ɵɵFactoryTarget.Component });
52
- UserFilterComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.1.5", type: UserFilterComponent, selector: "auth-jwt-user-filter", inputs: { disabled: "disabled" }, ngImport: i0, template: "<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", styles: [""], components: [{ type: i4.MatFormField, selector: "mat-form-field", inputs: ["color", "floatLabel", "appearance", "hideRequiredMarker", "hintLabel"], exportAs: ["matFormField"] }, { type: i5.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { type: i6.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }], directives: [{ type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { type: i7.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["id", "disabled", "required", "type", "value", "readonly", "placeholder", "errorStateMatcher", "aria-describedby"], exportAs: ["matInput"] }, { type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i1.FormControlDirective, selector: "[formControl]", inputs: ["disabled", "formControl", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { type: i4.MatSuffix, selector: "[matSuffix]" }, { type: i8.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }] });
53
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: UserFilterComponent, decorators: [{
54
- type: Component,
55
- args: [{
56
- selector: 'auth-jwt-user-filter',
57
- templateUrl: './user-filter.component.html',
58
- styleUrls: ['./user-filter.component.css'],
59
- }]
60
- }], ctorParameters: function () { return [{ type: i1.FormBuilder }, { type: i2.UsersQuery }, { type: i3.UsersService }]; }, propDecorators: { disabled: [{
61
- type: Input
62
- }] } });
63
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlci1maWx0ZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbXlybWlkb24vYXV0aC1qd3QtYWRtaW4vc3JjL2xpYi9jb21wb25lbnRzL3VzZXItZmlsdGVyL3VzZXItZmlsdGVyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL215cm1pZG9uL2F1dGgtand0LWFkbWluL3NyYy9saWIvY29tcG9uZW50cy91c2VyLWZpbHRlci91c2VyLWZpbHRlci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBVSxNQUFNLGVBQWUsQ0FBQzs7Ozs7Ozs7OztBQVl6RCxNQUFNLE9BQU8sbUJBQW1CO0lBUzlCLFlBQ0UsV0FBd0IsRUFDeEIsS0FBaUIsRUFDVCxlQUE2QjtRQUE3QixvQkFBZSxHQUFmLGVBQWUsQ0FBYztRQUVyQyxJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUVwQyxPQUFPO1FBQ1AsSUFBSSxDQUFDLElBQUksR0FBRyxXQUFXLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3RDLElBQUksQ0FBQyxJQUFJLEdBQUcsV0FBVyxDQUFDLEtBQUssQ0FBQztZQUM1QixJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUk7U0FDaEIsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELFFBQVE7UUFDTixJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFO1lBQzNCLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDckIsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRU8sVUFBVSxDQUFDLE1BQWtCO1FBQ25DLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNoQyxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO0lBQzdCLENBQUM7SUFFTSxLQUFLO1FBQ1YsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNsQixJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDZixDQUFDO0lBRU8sU0FBUzs7UUFDZixPQUFPO1lBQ0wsVUFBVSxFQUFFLENBQUM7WUFDYixRQUFRLEVBQUUsRUFBRTtZQUNaLElBQUksRUFBRSxNQUFBLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSywwQ0FBRSxJQUFJLEVBQUU7U0FDOUIsQ0FBQztJQUNKLENBQUM7SUFFTSxLQUFLO1FBQ1YsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRTtZQUNyQixPQUFPO1NBQ1I7UUFDRCxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7UUFFaEMseUJBQXlCO1FBQ3pCLElBQUksQ0FBQyxlQUFlLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzVDLENBQUM7O2dIQXZEVSxtQkFBbUI7b0dBQW5CLG1CQUFtQiw4RkNaaEMsdW9CQTBCQTsyRkRkYSxtQkFBbUI7a0JBTC9CLFNBQVM7bUJBQUM7b0JBQ1QsUUFBUSxFQUFFLHNCQUFzQjtvQkFDaEMsV0FBVyxFQUFFLDhCQUE4QjtvQkFDM0MsU0FBUyxFQUFFLENBQUMsNkJBQTZCLENBQUM7aUJBQzNDO3NKQUdRLFFBQVE7c0JBRGQsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQsIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRm9ybUJ1aWxkZXIsIEZvcm1Db250cm9sLCBGb3JtR3JvdXAgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBVc2VyRmlsdGVyIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvYXV0aC1qd3QtYWNjb3VudC5zZXJ2aWNlJztcbmltcG9ydCB7IFVzZXJzUXVlcnkgfSBmcm9tICcuLi9zdGF0ZS91c2Vycy5xdWVyeSc7XG5pbXBvcnQgeyBVc2Vyc1NlcnZpY2UgfSBmcm9tICcuLi9zdGF0ZS91c2Vycy5zZXJ2aWNlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXV0aC1qd3QtdXNlci1maWx0ZXInLFxuICB0ZW1wbGF0ZVVybDogJy4vdXNlci1maWx0ZXIuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi91c2VyLWZpbHRlci5jb21wb25lbnQuY3NzJ10sXG59KVxuZXhwb3J0IGNsYXNzIFVzZXJGaWx0ZXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICBASW5wdXQoKVxuICBwdWJsaWMgZGlzYWJsZWQ6IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG5cbiAgcHVibGljIGZpbHRlciQ6IE9ic2VydmFibGU8VXNlckZpbHRlcj47XG5cbiAgcHVibGljIG5hbWU6IEZvcm1Db250cm9sO1xuICBwdWJsaWMgZm9ybTogRm9ybUdyb3VwO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIGZvcm1CdWlsZGVyOiBGb3JtQnVpbGRlcixcbiAgICBxdWVyeTogVXNlcnNRdWVyeSxcbiAgICBwcml2YXRlIF9jb3Jwb3JhU2VydmljZTogVXNlcnNTZXJ2aWNlXG4gICkge1xuICAgIHRoaXMuZmlsdGVyJCA9IHF1ZXJ5LnNlbGVjdEZpbHRlcigpO1xuXG4gICAgLy8gZm9ybVxuICAgIHRoaXMubmFtZSA9IGZvcm1CdWlsZGVyLmNvbnRyb2wobnVsbCk7XG4gICAgdGhpcy5mb3JtID0gZm9ybUJ1aWxkZXIuZ3JvdXAoe1xuICAgICAgbmFtZTogdGhpcy5uYW1lLFxuICAgIH0pO1xuICB9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5maWx0ZXIkLnN1YnNjcmliZSgoZikgPT4ge1xuICAgICAgdGhpcy51cGRhdGVGb3JtKGYpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVGb3JtKGZpbHRlcjogVXNlckZpbHRlcik6IHZvaWQge1xuICAgIHRoaXMubmFtZS5zZXRWYWx1ZShmaWx0ZXIubmFtZSk7XG4gICAgdGhpcy5mb3JtLm1hcmtBc1ByaXN0aW5lKCk7XG4gIH1cblxuICBwdWJsaWMgcmVzZXQoKTogdm9pZCB7XG4gICAgdGhpcy5mb3JtLnJlc2V0KCk7XG4gICAgdGhpcy5hcHBseSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRGaWx0ZXIoKTogVXNlckZpbHRlciB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHBhZ2VOdW1iZXI6IDEsIC8vIG5vdCB1c2VkXG4gICAgICBwYWdlU2l6ZTogMjAsIC8vIG5vdCB1c2VkXG4gICAgICBuYW1lOiB0aGlzLm5hbWUudmFsdWU/LnRyaW0oKSxcbiAgICB9O1xuICB9XG5cbiAgcHVibGljIGFwcGx5KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmZvcm0uaW52YWxpZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBmaWx0ZXIgPSB0aGlzLmdldEZpbHRlcigpO1xuXG4gICAgLy8gdXBkYXRlIGZpbHRlciBpbiBzdGF0ZVxuICAgIHRoaXMuX2NvcnBvcmFTZXJ2aWNlLnVwZGF0ZUZpbHRlcihmaWx0ZXIpO1xuICB9XG59XG4iLCI8Zm9ybSBbZm9ybUdyb3VwXT1cImZvcm1cIiAoc3VibWl0KT1cImFwcGx5KClcIiBuZy1kaXNhYmxlZD1cImRpc2FibGVkXCI+XG4gIDxtYXQtZm9ybS1maWVsZD5cbiAgICA8aW5wdXQgbWF0SW5wdXQgW2Zvcm1Db250cm9sXT1cIm5hbWVcIiBwbGFjZWhvbGRlcj1cIm5hbWUgb3IgSURcIiAvPlxuICAgIDxidXR0b25cbiAgICAgIG1hdC1pY29uLWJ1dHRvblxuICAgICAgbWF0U3VmZml4XG4gICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgIChjbGljayk9XCJyZXNldCgpXCJcbiAgICAgIGNvbG9yPVwid2FyblwiXG4gICAgICBtYXRUb29sdGlwPVwiUmVzZXQgZmlsdGVyc1wiXG4gICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgID5cbiAgICAgIDxtYXQtaWNvbj5jbGVhcjwvbWF0LWljb24+XG4gICAgPC9idXR0b24+XG4gIDwvbWF0LWZvcm0tZmllbGQ+XG5cbiAgPGJ1dHRvblxuICAgIHR5cGU9XCJzdWJtaXRcIlxuICAgIG1hdC1pY29uLWJ1dHRvblxuICAgIGNvbG9yPVwicHJpbWFyeVwiXG4gICAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCJcbiAgICBtYXRUb29sdGlwPVwiQXBwbHkgZmlsdGVyc1wiXG4gID5cbiAgICA8bWF0LWljb24+Y2hlY2tfY2lyY2xlPC9tYXQtaWNvbj5cbiAgPC9idXR0b24+XG48L2Zvcm0+XG4iXX0=
@@ -1,138 +0,0 @@
1
- import { Component, Inject } from '@angular/core';
2
- import { BehaviorSubject, combineLatest } from 'rxjs';
3
- import { map, startWith, switchMap, take, tap } from 'rxjs/operators';
4
- import { USERS_PAGINATOR } from '../state/users.paginator';
5
- import * as i0 from "@angular/core";
6
- import * as i1 from "../state/users.query";
7
- import * as i2 from "../../services/auth-jwt-account.service";
8
- import * as i3 from "../state/users.service";
9
- import * as i4 from "../../services/dialog.service";
10
- import * as i5 from "@myrmidon/auth-jwt-login";
11
- import * as i6 from "@angular/forms";
12
- import * as i7 from "../user-filter/user-filter.component";
13
- import * as i8 from "@angular/material/progress-bar";
14
- import * as i9 from "@angular/material/button";
15
- import * as i10 from "@angular/material/icon";
16
- import * as i11 from "@angular/material/paginator";
17
- import * as i12 from "../user-editor/user-editor.component";
18
- import * as i13 from "@angular/common";
19
- import * as i14 from "@angular/material/tooltip";
20
- import * as i15 from "@datorama/akita";
21
- export class UserListComponent {
22
- constructor(paginator, userQuery, _accountService, _usersService, _dialogService, _gravatarService, formBuilder) {
23
- this.paginator = paginator;
24
- this._accountService = _accountService;
25
- this._usersService = _usersService;
26
- this._dialogService = _dialogService;
27
- this._gravatarService = _gravatarService;
28
- this.pageSize = formBuilder.control(20);
29
- this._refresh$ = new BehaviorSubject(0);
30
- this._filter$ = userQuery.selectFilter();
31
- // https://netbasal.com/manage-your-entities-with-akita-like-a-boss-768732f8d4d1
32
- this.active$ = userQuery.selectActive();
33
- this.pagination$ = combineLatest([
34
- this.paginator.pageChanges,
35
- this.pageSize.valueChanges.pipe(
36
- // we are required to emit at least the initial value
37
- // as combineLatest emits only if ALL observables have emitted
38
- startWith(20),
39
- // clear the cache when page size changes
40
- tap((_) => {
41
- this.paginator.clearCache();
42
- })),
43
- this._filter$.pipe(
44
- // clear the cache when filters changed
45
- tap((_) => {
46
- this.paginator.clearCache();
47
- })),
48
- this._refresh$.pipe(
49
- // clear the cache when forcing refresh
50
- tap((_) => {
51
- this.paginator.clearCache();
52
- })),
53
- ]).pipe(
54
- // for each emitted value, combine into a filter and use it
55
- // to request the page from server
56
- switchMap(([pageNumber, pageSize, filter, refresh]) => {
57
- // const filter = { ...this._docsQuery.getValue().filter };
58
- const f = Object.assign({}, filter);
59
- f.pageNumber = pageNumber;
60
- f.pageSize = pageSize;
61
- const request = this.getRequest(f);
62
- // update saved filters
63
- this.paginator.metadata.set('filter', f);
64
- return this.paginator.getPage(request);
65
- }));
66
- }
67
- ngOnDestroy() {
68
- this.paginator.destroy();
69
- }
70
- getRequest(filter) {
71
- return () => this._accountService.getUsers(filter).pipe(
72
- // adapt server results to the paginator plugin
73
- map((p) => {
74
- return {
75
- currentPage: p.pageNumber,
76
- perPage: p.pageSize,
77
- lastPage: p.pageCount,
78
- data: p.items,
79
- total: p.total,
80
- };
81
- }));
82
- }
83
- pageChange(event) {
84
- // https://material.angular.io/components/paginator/api
85
- this.paginator.setPage(event.pageIndex + 1);
86
- if (event.pageSize !== this.pageSize.value) {
87
- this.pageSize.setValue(event.pageSize);
88
- }
89
- }
90
- refresh() {
91
- this.paginator.clearCache();
92
- this._refresh$.next(this._refresh$.value + 1);
93
- }
94
- deleteUser(user) {
95
- this._dialogService
96
- .confirm('Confirm', `Delete User ${user.userName}?`)
97
- .pipe(take(1))
98
- .subscribe((yes) => {
99
- if (!yes) {
100
- return;
101
- }
102
- this._usersService.deleteUser(user.userName).finally(() => {
103
- this.refresh();
104
- });
105
- });
106
- }
107
- setActiveUser(user) {
108
- this._usersService.setActive((user === null || user === void 0 ? void 0 : user.userName) || null);
109
- }
110
- resetActiveUser() {
111
- this._usersService.setActive(null);
112
- }
113
- saveActiveUser(user) {
114
- this._usersService.updateActive(user).finally(() => {
115
- this.refresh();
116
- });
117
- }
118
- onUserEditorClose() {
119
- this.setActiveUser(null);
120
- }
121
- getGravatarUrl(email, size = 80) {
122
- return this._gravatarService.buildGravatarUrl(email, size);
123
- }
124
- }
125
- UserListComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: UserListComponent, deps: [{ token: USERS_PAGINATOR }, { token: i1.UsersQuery }, { token: i2.AuthJwtAccountService }, { token: i3.UsersService }, { token: i4.DialogService }, { token: i5.GravatarService }, { token: i6.FormBuilder }], target: i0.ɵɵFactoryTarget.Component });
126
- UserListComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.1.5", type: UserListComponent, selector: "auth-jwt-user-list", ngImport: i0, template: "<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", styles: ["tr:nth-child(odd){background-color:#f8f8f8}th{padding:0 8px;text-align:left;color:silver;font-weight:normal}td{padding:0 8px}td.command{width:24px}table{width:100%;border-collapse:collapse}fieldset{border:1px solid silver;border-radius:8px;padding:16px}\n"], components: [{ type: i7.UserFilterComponent, selector: "auth-jwt-user-filter", inputs: ["disabled"] }, { type: i8.MatProgressBar, selector: "mat-progress-bar", inputs: ["color", "mode", "value", "bufferValue"], outputs: ["animationEnd"], exportAs: ["matProgressBar"] }, { type: i9.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { type: i10.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { type: i11.MatPaginator, selector: "mat-paginator", inputs: ["disabled"], exportAs: ["matPaginator"] }, { type: i12.UserEditorComponent, selector: "auth-jwt-user-editor", inputs: ["user"], outputs: ["userChange", "editorClose"] }], directives: [{ type: i13.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i13.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i14.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }], pipes: { "async": i13.AsyncPipe } });
127
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: UserListComponent, decorators: [{
128
- type: Component,
129
- args: [{
130
- selector: 'auth-jwt-user-list',
131
- templateUrl: './user-list.component.html',
132
- styleUrls: ['./user-list.component.css'],
133
- }]
134
- }], ctorParameters: function () { return [{ type: i15.PaginatorPlugin, decorators: [{
135
- type: Inject,
136
- args: [USERS_PAGINATOR]
137
- }] }, { type: i1.UsersQuery }, { type: i2.AuthJwtAccountService }, { type: i3.UsersService }, { type: i4.DialogService }, { type: i5.GravatarService }, { type: i6.FormBuilder }]; } });
138
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlci1saXN0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL215cm1pZG9uL2F1dGgtand0LWFkbWluL3NyYy9saWIvY29tcG9uZW50cy91c2VyLWxpc3QvdXNlci1saXN0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL215cm1pZG9uL2F1dGgtand0LWFkbWluL3NyYy9saWIvY29tcG9uZW50cy91c2VyLWxpc3QvdXNlci1saXN0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFhLE1BQU0sZUFBZSxDQUFDO0FBRzdELE9BQU8sRUFBRSxlQUFlLEVBQUUsYUFBYSxFQUFjLE1BQU0sTUFBTSxDQUFDO0FBQ2xFLE9BQU8sRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFVdEUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDBCQUEwQixDQUFDOzs7Ozs7Ozs7Ozs7Ozs7OztBQVczRCxNQUFNLE9BQU8saUJBQWlCO0lBUTVCLFlBRVMsU0FBc0MsRUFDN0MsU0FBcUIsRUFDYixlQUFzQyxFQUN0QyxhQUEyQixFQUMzQixjQUE2QixFQUM3QixnQkFBaUMsRUFDekMsV0FBd0I7UUFOakIsY0FBUyxHQUFULFNBQVMsQ0FBNkI7UUFFckMsb0JBQWUsR0FBZixlQUFlLENBQXVCO1FBQ3RDLGtCQUFhLEdBQWIsYUFBYSxDQUFjO1FBQzNCLG1CQUFjLEdBQWQsY0FBYyxDQUFlO1FBQzdCLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBaUI7UUFHekMsSUFBSSxDQUFDLFFBQVEsR0FBRyxXQUFXLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3hDLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFB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QUNMLENBQUM7SUFFTSxpQkFBaUI7UUFDdEIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMzQixDQUFDO0lBRU0sY0FBYyxDQUFDLEtBQWEsRUFBRSxJQUFJLEdBQUcsRUFBRTtRQUM1QyxPQUFPLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDN0QsQ0FBQzs7OEdBcElVLGlCQUFpQixrQkFTbEIsZUFBZTtrR0FUZCxpQkFBaUIsMERDekI5QixzN0ZBbUdBOzJGRDFFYSxpQkFBaUI7a0JBTDdCLFNBQVM7bUJBQUM7b0JBQ1QsUUFBUSxFQUFFLG9CQUFvQjtvQkFDOUIsV0FBVyxFQUFFLDRCQUE0QjtvQkFDekMsU0FBUyxFQUFFLENBQUMsMkJBQTJCLENBQUM7aUJBQ3pDOzswQkFVSSxNQUFNOzJCQUFDLGVBQWUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEluamVjdCwgT25EZXN0cm95IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGb3JtQnVpbGRlciwgRm9ybUNvbnRyb2wgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBQYWdlRXZlbnQgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9wYWdpbmF0b3InO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBjb21iaW5lTGF0ZXN0LCBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBtYXAsIHN0YXJ0V2l0aCwgc3dpdGNoTWFwLCB0YWtlLCB0YXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBQYWdpbmF0aW9uUmVzcG9uc2UsIFBhZ2luYXRvclBsdWdpbiB9IGZyb20gJ0BkYXRvcmFtYS9ha2l0YSc7XG5cbmltcG9ydCB7IEdyYXZhdGFyU2VydmljZSwgVXNlciB9IGZyb20gJ0BteXJtaWRvbi9hdXRoLWp3dC1sb2dpbic7XG5pbXBvcnQgeyBEYXRhUGFnZSB9IGZyb20gJ0BteXJtaWRvbi9uZy10b29scyc7XG5cbmltcG9ydCB7XG4gIEF1dGhKd3RBY2NvdW50U2VydmljZSxcbiAgVXNlckZpbHRlcixcbn0gZnJvbSAnLi4vLi4vc2VydmljZXMvYXV0aC1qd3QtYWNjb3VudC5zZXJ2aWNlJztcbmltcG9ydCB7IFVTRVJTX1BBR0lOQVRPUiB9IGZyb20gJy4uL3N0YXRlL3VzZXJzLnBhZ2luYXRvcic7XG5pbXBvcnQgeyBVc2Vyc1N0YXRlIH0gZnJvbSAnLi4vc3RhdGUvdXNlcnMuc3RvcmUnO1xuaW1wb3J0IHsgVXNlcnNRdWVyeSB9IGZyb20gJy4uL3N0YXRlL3VzZXJzLnF1ZXJ5JztcbmltcG9ydCB7IERpYWxvZ1NlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9kaWFsb2cuc2VydmljZSc7XG5pbXBvcnQgeyBVc2Vyc1NlcnZpY2UgfSBmcm9tICcuLi9zdGF0ZS91c2Vycy5zZXJ2aWNlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXV0aC1qd3QtdXNlci1saXN0JyxcbiAgdGVtcGxhdGVVcmw6ICcuL3VzZXItbGlzdC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3VzZXItbGlzdC5jb21wb25lbnQuY3NzJ10sXG59KVxuZXhwb3J0IGNsYXNzIFVzZXJMaXN0Q29tcG9uZW50IGltcGxlbWVudHMgT25EZXN0cm95IHtcbiAgcHJpdmF0ZSBfcmVmcmVzaCQ6IEJlaGF2aW9yU3ViamVjdDxudW1iZXI+O1xuICBwcml2YXRlIF9maWx0ZXIkOiBPYnNlcnZhYmxlPFVzZXJGaWx0ZXI+O1xuXG4gIHB1YmxpYyBwYWdpbmF0aW9uJDogT2JzZXJ2YWJsZTxQYWdpbmF0aW9uUmVzcG9uc2U8VXNlcj4+O1xuICBwdWJsaWMgcGFnZVNpemU6IEZvcm1Db250cm9sO1xuICBwdWJsaWMgYWN0aXZlJDogT2JzZXJ2YWJsZTxVc2VyIHwgdW5kZWZpbmVkPjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBASW5qZWN0KFVTRVJTX1BBR0lOQVRPUilcbiAgICBwdWJsaWMgcGFnaW5hdG9yOiBQYWdpbmF0b3JQbHVnaW48VXNlcnNTdGF0ZT4sXG4gICAgdXNlclF1ZXJ5OiBVc2Vyc1F1ZXJ5LFxuICAgIHByaXZhdGUgX2FjY291bnRTZXJ2aWNlOiBBdXRoSnd0QWNjb3VudFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBfdXNlcnNTZXJ2aWNlOiBVc2Vyc1NlcnZpY2UsXG4gICAgcHJpdmF0ZSBfZGlhbG9nU2VydmljZTogRGlhbG9nU2VydmljZSxcbiAgICBwcml2YXRlIF9ncmF2YXRhclNlcnZpY2U6IEdyYXZhdGFyU2VydmljZSxcbiAgICBmb3JtQnVpbGRlcjogRm9ybUJ1aWxkZXJcbiAgKSB7XG4gICAgdGhpcy5wYWdlU2l6ZSA9IGZvcm1CdWlsZGVyLmNvbnRyb2woMjApO1xuICAgIHRoaXMuX3JlZnJlc2gkID0gbmV3IEJlaGF2aW9yU3ViamVjdCgwKTtcbiAgICB0aGlzLl9maWx0ZXIkID0gdXNlclF1ZXJ5LnNlbGVjdEZpbHRlcigpO1xuICAgIC8vIGh0dHBzOi8vbmV0YmFzYWwuY29tL21hbmFnZS15b3VyLWVudGl0aWVzLXdpdGgtYWtpdGEtbGlrZS1hLWJvc3MtNzY4NzMyZjhkNGQxXG4gICAgdGhpcy5hY3RpdmUkID0gdXNlclF1ZXJ5LnNlbGVjdEFjdGl2ZTxVc2VyPigpO1xuXG4gICAgdGhpcy5wYWdpbmF0aW9uJCA9IGNvbWJpbmVMYXRlc3QoW1xuICAgICAgdGhpcy5wYWdpbmF0b3IucGFnZUNoYW5nZXMsXG4gICAgICB0aGlzLnBhZ2VTaXplLnZhbHVlQ2hhbmdlcy5waXBlKFxuICAgICAgICAvLyB3ZSBhcmUgcmVxdWlyZWQgdG8gZW1pdCBhdCBsZWFzdCB0aGUgaW5pdGlhbCB2YWx1ZVxuICAgICAgICAvLyBhcyBjb21iaW5lTGF0ZXN0IGVtaXRzIG9ubHkgaWYgQUxMIG9ic2VydmFibGVzIGhhdmUgZW1pdHRlZFxuICAgICAgICBzdGFydFdpdGgoMjApLFxuICAgICAgICAvLyBjbGVhciB0aGUgY2FjaGUgd2hlbiBwYWdlIHNpemUgY2hhbmdlc1xuICAgICAgICB0YXAoKF8pID0+IHtcbiAgICAgICAgICB0aGlzLnBhZ2luYXRvci5jbGVhckNhY2hlKCk7XG4gICAgICAgIH0pXG4gICAgICApLFxuICAgICAgdGhpcy5fZmlsdGVyJC5waXBlKFxuICAgICAgICAvLyBjbGVhciB0aGUgY2FjaGUgd2hlbiBmaWx0ZXJzIGNoYW5nZWRcbiAgICAgICAgdGFwKChfKSA9PiB7XG4gICAgICAgICAgdGhpcy5wYWdpbmF0b3IuY2xlYXJDYWNoZSgpO1xuICAgICAgICB9KVxuICAgICAgKSxcbiAgICAgIHRoaXMuX3JlZnJlc2gkLnBpcGUoXG4gICAgICAgIC8vIGNsZWFyIHRoZSBjYWNoZSB3aGVuIGZvcmNpbmcgcmVmcmVzaFxuICAgICAgICB0YXAoKF8pID0+IHtcbiAgICAgICAgICB0aGlzLnBhZ2luYXRvci5jbGVhckNhY2hlKCk7XG4gICAgICAgIH0pXG4gICAgICApLFxuICAgIF0pLnBpcGUoXG4gICAgICAvLyBmb3IgZWFjaCBlbWl0dGVkIHZhbHVlLCBjb21iaW5lIGludG8gYSBmaWx0ZXIgYW5kIHVzZSBpdFxuICAgICAgLy8gdG8gcmVxdWVzdCB0aGUgcGFnZSBmcm9tIHNlcnZlclxuICAgICAgc3dpdGNoTWFwKChbcGFnZU51bWJlciwgcGFnZVNpemUsIGZpbHRlciwgcmVmcmVzaF0pID0+IHtcbiAgICAgICAgLy8gY29uc3QgZmlsdGVyID0geyAuLi50aGlzLl9kb2NzUXVlcnkuZ2V0VmFsdWUoKS5maWx0ZXIgfTtcbiAgICAgICAgY29uc3QgZiA9IHsgLi4uZmlsdGVyIH07XG4gICAgICAgIGYucGFnZU51bWJlciA9IHBhZ2VOdW1iZXI7XG4gICAgICAgIGYucGFnZVNpemUgPSBwYWdlU2l6ZTtcbiAgICAgICAgY29uc3QgcmVxdWVzdCA9IHRoaXMuZ2V0UmVxdWVzdChmKTtcbiAgICAgICAgLy8gdXBkYXRlIHNhdmVkIGZpbHRlcnNcbiAgICAgICAgdGhpcy5wYWdpbmF0b3IubWV0YWRhdGEuc2V0KCdmaWx0ZXInLCBmKTtcbiAgICAgICAgcmV0dXJuIHRoaXMucGFnaW5hdG9yLmdldFBhZ2UocmVxdWVzdCk7XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLnBhZ2luYXRvci5kZXN0cm95KCk7XG4gIH1cblxuICBwcml2YXRlIGdldFJlcXVlc3QoXG4gICAgZmlsdGVyOiBVc2VyRmlsdGVyXG4gICk6ICgpID0+IE9ic2VydmFibGU8UGFnaW5hdGlvblJlc3BvbnNlPFVzZXI+PiB7XG4gICAgcmV0dXJuICgpID0+XG4gICAgICB0aGlzLl9hY2NvdW50U2VydmljZS5nZXRVc2VycyhmaWx0ZXIpLnBpcGUoXG4gICAgICAgIC8vIGFkYXB0IHNlcnZlciByZXN1bHRzIHRvIHRoZSBwYWdpbmF0b3IgcGx1Z2luXG4gICAgICAgIG1hcCgocDogRGF0YVBhZ2U8VXNlcj4pID0+IHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY3VycmVudFBhZ2U6IHAucGFnZU51bWJlcixcbiAgICAgICAgICAgIHBlclBhZ2U6IHAucGFnZVNpemUsXG4gICAgICAgICAgICBsYXN0UGFnZTogcC5wYWdlQ291bnQsXG4gICAgICAgICAgICBkYXRhOiBwLml0ZW1zLFxuICAgICAgICAgICAgdG90YWw6IHAudG90YWwsXG4gICAgICAgICAgfTtcbiAgICAgICAgfSlcbiAgICAgICk7XG4gIH1cblxuICBwdWJsaWMgcGFnZUNoYW5nZShldmVudDogUGFnZUV2ZW50KTogdm9pZCB7XG4gICAgLy8gaHR0cHM6Ly9tYXRlcmlhbC5hbmd1bGFyLmlvL2NvbXBvbmVudHMvcGFnaW5hdG9yL2FwaVxuICAgIHRoaXMucGFnaW5hdG9yLnNldFBhZ2UoZXZlbnQucGFnZUluZGV4ICsgMSk7XG4gICAgaWYgKGV2ZW50LnBhZ2VTaXplICE9PSB0aGlzLnBhZ2VTaXplLnZhbHVlKSB7XG4gICAgICB0aGlzLnBhZ2VTaXplLnNldFZhbHVlKGV2ZW50LnBhZ2VTaXplKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgcmVmcmVzaCgpOiB2b2lkIHtcbiAgICB0aGlzLnBhZ2luYXRvci5jbGVhckNhY2hlKCk7XG4gICAgdGhpcy5fcmVmcmVzaCQubmV4dCh0aGlzLl9yZWZyZXNoJC52YWx1ZSArIDEpO1xuICB9XG5cbiAgcHVibGljIGRlbGV0ZVVzZXIodXNlcjogVXNlcik6IHZvaWQge1xuICAgIHRoaXMuX2RpYWxvZ1NlcnZpY2VcbiAgICAgIC5jb25maXJtKCdDb25maXJtJywgYERlbGV0ZSBVc2VyICR7dXNlci51c2VyTmFtZX0/YClcbiAgICAgIC5waXBlKHRha2UoMSkpXG4gICAgICAuc3Vic2NyaWJlKCh5ZXMpID0+IHtcbiAgICAgICAgaWYgKCF5ZXMpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fdXNlcnNTZXJ2aWNlLmRlbGV0ZVVzZXIodXNlci51c2VyTmFtZSkuZmluYWxseSgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5yZWZyZXNoKCk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gIH1cblxuICBwdWJsaWMgc2V0QWN0aXZlVXNlcih1c2VyOiBVc2VyIHwgbnVsbCk6IHZvaWQge1xuICAgIHRoaXMuX3VzZXJzU2VydmljZS5zZXRBY3RpdmUodXNlcj8udXNlck5hbWUgfHwgbnVsbCk7XG4gIH1cblxuICBwdWJsaWMgcmVzZXRBY3RpdmVVc2VyKCk6IHZvaWQge1xuICAgIHRoaXMuX3VzZXJzU2VydmljZS5zZXRBY3RpdmUobnVsbCk7XG4gIH1cblxuICBwdWJsaWMgc2F2ZUFjdGl2ZVVzZXIodXNlcjogVXNlcik6IHZvaWQge1xuICAgIHRoaXMuX3VzZXJzU2VydmljZS51cGRhdGVBY3RpdmUodXNlcikuZmluYWxseSgoKSA9PiB7XG4gICAgICB0aGlzLnJlZnJlc2goKTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBvblVzZXJFZGl0b3JDbG9zZSgpOiB2b2lkIHtcbiAgICB0aGlzLnNldEFjdGl2ZVVzZXIobnVsbCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0R3JhdmF0YXJVcmwoZW1haWw6IHN0cmluZywgc2l6ZSA9IDgwKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuX2dyYXZhdGFyU2VydmljZS5idWlsZEdyYXZhdGFyVXJsKGVtYWlsLCBzaXplKTtcbiAgfVxufVxuIiwiPGRpdlxuICBnZEFyZWFzPVwiZmlsdGVycyB8IHByb2dyZXNzIHwgbGlzdCB8IHBhZ2VyIHwgZWRpdG9yXCJcbiAgZ2RSb3dzPVwiODBweCA2NHB4IDJmciA0MHB4IDFmclwiXG4gIGdkQ29sdW1ucz1cIjFmclwiXG4gIGdkR2FwPVwiOHB4XCJcbj5cbiAgPGRpdj5cbiAgICA8IS0tIGZpbHRlcnMgLS0+XG4gICAgPGRpdiBnZEFyZWE9XCJmaWx0ZXJzXCI+XG4gICAgICA8YXV0aC1qd3QtdXNlci1maWx0ZXI+PC9hdXRoLWp3dC11c2VyLWZpbHRlcj5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gcHJvZ3Jlc3MgLS0+XG4gICAgPGRpdiAqbmdJZj1cInBhZ2luYXRvci5pc0xvYWRpbmckIHwgYXN5bmNcIiBnZEFyZWE9XCJwcm9ncmVzc1wiPlxuICAgICAgPG1hdC1wcm9ncmVzcy1iYXIgbW9kZT1cImluZGV0ZXJtaW5hdGVcIj48L21hdC1wcm9ncmVzcy1iYXI+XG4gICAgPC9kaXY+XG5cbiAgICA8IS0tIGxpc3QgLS0+XG4gICAgPGRpdiBnZEFyZWE9XCJsaXN0XCIgKm5nSWY9XCJwYWdpbmF0aW9uJCB8IGFzeW5jIGFzIHBhZ2luYXRpb25cIj5cbiAgICAgIDx0YWJsZT5cbiAgICAgICAgPHRoZWFkPlxuICAgICAgICAgIDx0ZD48L3RkPlxuICAgICAgICAgIDx0ZD48L3RkPlxuICAgICAgICAgIDx0ZD48L3RkPlxuICAgICAgICAgIDx0aD5uYW1lPC90aD5cbiAgICAgICAgICA8dGg+Zmlyc3Q8L3RoPlxuICAgICAgICAgIDx0aD5sYXN0PC90aD5cbiAgICAgICAgICA8dGg+ZW1haWw8L3RoPlxuICAgICAgICAgIDx0aD5yb2xlczwvdGg+XG4gICAgICAgICAgPHRoPmxvY2sgZW5kPC90aD5cbiAgICAgICAgPC90aGVhZD5cbiAgICAgICAgPHRib2R5PlxuICAgICAgICAgIDx0ciAqbmdGb3I9XCJsZXQgdXNlciBvZiBwYWdpbmF0aW9uLmRhdGFcIj5cbiAgICAgICAgICAgIDx0ZCBjbGFzcz1cImNvbW1hbmRcIj5cbiAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgIG1hdC1pY29uLWJ1dHRvblxuICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgIG1hdFRvb2x0aXA9XCJFZGl0IHt7IHVzZXIudXNlck5hbWUgfX1cIlxuICAgICAgICAgICAgICAgIGNvbG9yPVwicHJpbWFyeVwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cInNldEFjdGl2ZVVzZXIodXNlcilcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPG1hdC1pY29uPm1vZGVfZWRpdDwvbWF0LWljb24+XG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgIDx0ZCBjbGFzcz1cImNvbW1hbmRcIj5cbiAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgIG1hdC1pY29uLWJ1dHRvblxuICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgIG1hdFRvb2x0aXA9XCJEZWxldGUge3sgdXNlci51c2VyTmFtZSB9fVwiXG4gICAgICAgICAgICAgICAgY29sb3I9XCJ3YXJuXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwiZGVsZXRlVXNlcih1c2VyKVwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8bWF0LWljb24+cmVtb3ZlX2NpcmNsZTwvbWF0LWljb24+XG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgIDx0ZD5cbiAgICAgICAgICAgICAgPGltZ1xuICAgICAgICAgICAgICAgIFtzcmNdPVwiZ2V0R3JhdmF0YXJVcmwodXNlci5lbWFpbCwgMzIpXCJcbiAgICAgICAgICAgICAgICBbYWx0XT1cInVzZXIudXNlck5hbWVcIlxuICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgIDx0ZD57eyB1c2VyLnVzZXJOYW1lIH19PC90ZD5cbiAgICAgICAgICAgIDx0ZD57eyB1c2VyLmZpcnN0TmFtZSB9fTwvdGQ+XG4gICAgICAgICAgICA8dGQ+e3sgdXNlci5sYXN0TmFtZSB9fTwvdGQ+XG4gICAgICAgICAgICA8dGQ+XG4gICAgICAgICAgICAgIDxhIFtocmVmXT1cIidtYWlsdG86JyArIHVzZXIuZW1haWxcIj57eyB1c2VyLmVtYWlsIH19PC9hPlxuICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgIDx0ZD57eyB1c2VyLnJvbGVzPy5qb2luKFwiIFwiKSB9fTwvdGQ+XG4gICAgICAgICAgICA8dGQ+e3sgdXNlci5sb2Nrb3V0RW5kIH19PC90ZD5cbiAgICAgICAgICA8L3RyPlxuICAgICAgICA8L3Rib2R5PlxuICAgICAgPC90YWJsZT5cbiAgICAgIDwhLS0gcGFnaW5hdGlvbiAtLT5cbiAgICAgIDxtYXQtcGFnaW5hdG9yXG4gICAgICAgIGdkQXJlYT1cInBhZ2VyXCJcbiAgICAgICAgZ2RBbGlnbkNvbHVtbnM9XCJjZW50ZXJcIlxuICAgICAgICBnZEFsaWduUm93cz1cInN0YXJ0XCJcbiAgICAgICAgW2xlbmd0aF09XCJwYWdpbmF0aW9uLnRvdGFsXCJcbiAgICAgICAgW3BhZ2VTaXplXT1cInBhZ2VTaXplPy52YWx1ZVwiXG4gICAgICAgIFtwYWdlU2l6ZU9wdGlvbnNdPVwiWzIwLCA1MCwgNzUsIDEwMF1cIlxuICAgICAgICBbcGFnZUluZGV4XT1cInBhZ2luYXRpb24uY3VycmVudFBhZ2UgLSAxXCJcbiAgICAgICAgW3Nob3dGaXJzdExhc3RCdXR0b25zXT1cInRydWVcIlxuICAgICAgICAocGFnZSk9XCJwYWdlQ2hhbmdlKCRldmVudClcIlxuICAgICAgPjwvbWF0LXBhZ2luYXRvcj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG5cbiAgPCEtLSBlZGl0b3IgLS0+XG4gIDxkaXYgZ2RBcmVhPVwiZWRpdG9yXCIgKm5nSWY9XCJhY3RpdmUkIHwgYXN5bmMgYXMgYWN0aXZlXCI+XG4gICAgPGZpZWxkc2V0PlxuICAgICAgPGxlZ2VuZD57eyBhY3RpdmUudXNlck5hbWUgfX08L2xlZ2VuZD5cbiAgICAgIDxhdXRoLWp3dC11c2VyLWVkaXRvclxuICAgICAgICBbdXNlcl09XCJhY3RpdmVcIlxuICAgICAgICAodXNlckNoYW5nZSk9XCJzYXZlQWN0aXZlVXNlcigkZXZlbnQpXCJcbiAgICAgICAgKGVkaXRvckNsb3NlKT1cInJlc2V0QWN0aXZlVXNlcigpXCJcbiAgICAgID48L2F1dGgtand0LXVzZXItZWRpdG9yPlxuICAgIDwvZmllbGRzZXQ+XG4gIDwvZGl2PlxuPC9kaXY+XG4iXX0=