@myrmidon/auth-jwt-admin 1.0.6 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (40) hide show
  1. package/esm2022/lib/auth-jwt-admin.module.mjs +120 -0
  2. package/esm2022/lib/components/auth-jwt-registration/auth-jwt-registration.component.mjs +165 -0
  3. package/esm2022/lib/components/confirm-dialog/confirm-dialog.component.mjs +30 -0
  4. package/esm2022/lib/components/password-strength-bar/password-strength-bar.component.mjs +81 -0
  5. package/esm2022/lib/components/state/user-list.repository.mjs +145 -0
  6. package/esm2022/lib/components/user-editor/user-editor.component.mjs +113 -0
  7. package/esm2022/lib/components/user-filter/user-filter.component.mjs +56 -0
  8. package/{esm2020 → esm2022}/lib/components/user-list/user-list.component.mjs +71 -70
  9. package/esm2022/lib/services/auth-jwt-account.service.mjs +182 -0
  10. package/esm2022/lib/services/dialog.service.mjs +38 -0
  11. package/{esm2020 → esm2022}/lib/validators/password.validators.mjs +48 -48
  12. package/{esm2020 → esm2022}/myrmidon-auth-jwt-admin.mjs +4 -4
  13. package/{esm2020 → esm2022}/public-api.mjs +11 -11
  14. package/{fesm2020 → fesm2022}/myrmidon-auth-jwt-admin.mjs +919 -919
  15. package/{fesm2020 → fesm2022}/myrmidon-auth-jwt-admin.mjs.map +1 -1
  16. package/index.d.ts +5 -5
  17. package/lib/auth-jwt-admin.module.d.ts +30 -30
  18. package/lib/components/auth-jwt-registration/auth-jwt-registration.component.d.ts +37 -37
  19. package/lib/components/confirm-dialog/confirm-dialog.component.d.ts +15 -15
  20. package/lib/components/password-strength-bar/password-strength-bar.component.d.ts +17 -17
  21. package/lib/components/state/user-list.repository.d.ts +36 -36
  22. package/lib/components/user-editor/user-editor.component.d.ts +29 -29
  23. package/lib/components/user-filter/user-filter.component.d.ts +21 -21
  24. package/lib/components/user-list/user-list.component.d.ts +29 -29
  25. package/lib/services/auth-jwt-account.service.d.ts +114 -114
  26. package/lib/services/dialog.service.d.ts +19 -19
  27. package/lib/validators/password.validators.d.ts +6 -6
  28. package/package.json +24 -17
  29. package/public-api.d.ts +8 -8
  30. package/esm2020/lib/auth-jwt-admin.module.mjs +0 -119
  31. package/esm2020/lib/components/auth-jwt-registration/auth-jwt-registration.component.mjs +0 -164
  32. package/esm2020/lib/components/confirm-dialog/confirm-dialog.component.mjs +0 -29
  33. package/esm2020/lib/components/password-strength-bar/password-strength-bar.component.mjs +0 -80
  34. package/esm2020/lib/components/state/user-list.repository.mjs +0 -144
  35. package/esm2020/lib/components/user-editor/user-editor.component.mjs +0 -112
  36. package/esm2020/lib/components/user-filter/user-filter.component.mjs +0 -55
  37. package/esm2020/lib/services/auth-jwt-account.service.mjs +0 -181
  38. package/esm2020/lib/services/dialog.service.mjs +0 -37
  39. package/fesm2015/myrmidon-auth-jwt-admin.mjs +0 -998
  40. package/fesm2015/myrmidon-auth-jwt-admin.mjs.map +0 -1
@@ -1,144 +0,0 @@
1
- import { Injectable } from '@angular/core';
2
- import { BehaviorSubject, combineLatest, debounceTime, map, take, } from 'rxjs';
3
- import { createStore, select, withProps } from '@ngneat/elf';
4
- import { deleteAllEntities, selectActiveEntity, setActiveId, upsertEntities, withActiveId, withEntities, } from '@ngneat/elf-entities';
5
- import { deleteAllPages, hasPage, selectCurrentPageEntities, selectPaginationData, setCurrentPage, setPage, updatePaginationData, withPagination, } from '@ngneat/elf-pagination';
6
- import { selectRequestStatus, updateRequestStatus, withRequestsCache, withRequestsStatus, } from '@ngneat/elf-requests';
7
- import * as i0 from "@angular/core";
8
- import * as i1 from "../../services/auth-jwt-account.service";
9
- const PAGE_SIZE = 20;
10
- export class UserListRepository {
11
- constructor(_accService) {
12
- this._accService = _accService;
13
- // create store
14
- this._store = this.createStore();
15
- this._lastPageSize = PAGE_SIZE;
16
- this._loading$ = new BehaviorSubject(false);
17
- this._saving$ = new BehaviorSubject(false);
18
- this.loading$ = this._loading$.asObservable();
19
- this.saving$ = this._saving$.asObservable();
20
- // combine pagination parameters with page data for our consumers
21
- this.pagination$ = combineLatest([
22
- this._store.pipe(selectPaginationData()),
23
- this._store.pipe(selectCurrentPageEntities()),
24
- ]).pipe(map(([pagination, data]) => ({ ...pagination, data })), debounceTime(0));
25
- // the active user, if required
26
- this.activeUser$ = this._store.pipe(selectActiveEntity());
27
- // the filter, if required
28
- this.filter$ = this._store.pipe(select((state) => state.filter));
29
- this.filter$.subscribe((filter) => {
30
- // when filter changed, reset any existing page and move to page 1
31
- const paginationData = this._store.getValue().pagination;
32
- this._store.update(deleteAllPages());
33
- // load page 1
34
- this.loadPage(1, paginationData.perPage);
35
- });
36
- // the request status
37
- this.status$ = this._store.pipe(selectRequestStatus('user-list'));
38
- // load page 1 and subscribe to pagination
39
- this.loadPage(1, PAGE_SIZE);
40
- this.pagination$.subscribe(console.log);
41
- }
42
- createStore() {
43
- const store = createStore({ name: 'user-list' }, withProps({
44
- filter: {},
45
- }), withEntities({ idKey: 'userName' }), withActiveId(), withRequestsCache(), withRequestsStatus(), withPagination());
46
- return store;
47
- }
48
- adaptPage(page) {
49
- // adapt the server page DataPage<T> to Elf pagination
50
- return {
51
- currentPage: page.pageNumber,
52
- perPage: page.pageSize,
53
- lastPage: page.pageCount,
54
- total: page.total,
55
- data: page.items,
56
- };
57
- }
58
- addPage(response) {
59
- const { data, ...paginationData } = response;
60
- this._store.update(upsertEntities(data), updatePaginationData(paginationData), setPage(paginationData.currentPage, data.map((c) => c.userName)));
61
- }
62
- loadPage(pageNumber, pageSize) {
63
- if (!pageSize) {
64
- pageSize = PAGE_SIZE;
65
- }
66
- // if the page exists and page size is the same, just move to it
67
- if (this._store.query(hasPage(pageNumber)) &&
68
- pageSize === this._lastPageSize) {
69
- console.log('Page exists: ' + pageNumber);
70
- this._store.update(setCurrentPage(pageNumber));
71
- return;
72
- }
73
- // reset cached pages if page size changed
74
- if (this._lastPageSize !== pageSize) {
75
- this._store.update(deleteAllPages());
76
- this._lastPageSize = pageSize;
77
- }
78
- // load page from server
79
- this._store.update(updateRequestStatus('user-list', 'pending'));
80
- this._loading$.next(true);
81
- this._accService
82
- .getUsers(this._store.getValue().filter, pageNumber, pageSize)
83
- .pipe(take(1))
84
- .subscribe((page) => {
85
- this._loading$.next(false);
86
- this.addPage({ ...this.adaptPage(page), data: page.items });
87
- this._store.update(updateRequestStatus('user-list', 'success'));
88
- });
89
- }
90
- setFilter(filter) {
91
- this._store.update((state) => ({ ...state, filter: filter }));
92
- }
93
- clearCache() {
94
- this._store.update(deleteAllEntities(), deleteAllPages());
95
- }
96
- setActive(name) {
97
- this._store.update(setActiveId(name));
98
- }
99
- updateActive(user) {
100
- const promise = new Promise((resolve, reject) => {
101
- this._saving$.next(true);
102
- this._accService.updateUser(user).subscribe({
103
- next: (_) => {
104
- this._saving$.next(false);
105
- this._store.update(upsertEntities(user));
106
- resolve(true);
107
- },
108
- error: (error) => {
109
- this._saving$.next(false);
110
- console.error(`Error updating user ${user.userName}: ` +
111
- JSON.stringify(error || {}));
112
- resolve(false);
113
- },
114
- });
115
- });
116
- return promise;
117
- }
118
- deleteUser(name) {
119
- const promise = new Promise((resolve, reject) => {
120
- this._saving$.next(true);
121
- this._accService.deleteUser(name).subscribe({
122
- next: (_) => {
123
- this._saving$.next(false);
124
- this.clearCache();
125
- this.loadPage(1);
126
- resolve(true);
127
- },
128
- error: (error) => {
129
- this._saving$.next(false);
130
- console.error(`Error deleting user ${name}: ` + JSON.stringify(error || {}));
131
- reject(error);
132
- },
133
- });
134
- });
135
- return promise;
136
- }
137
- }
138
- UserListRepository.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.1", ngImport: i0, type: UserListRepository, deps: [{ token: i1.AuthJwtAccountService }], target: i0.ɵɵFactoryTarget.Injectable });
139
- UserListRepository.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.1", ngImport: i0, type: UserListRepository, providedIn: 'root' });
140
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.1", ngImport: i0, type: UserListRepository, decorators: [{
141
- type: Injectable,
142
- args: [{ providedIn: 'root' }]
143
- }], ctorParameters: function () { return [{ type: i1.AuthJwtAccountService }]; } });
144
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlci1saXN0LnJlcG9zaXRvcnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9teXJtaWRvbi9hdXRoLWp3dC1hZG1pbi9zcmMvbGliL2NvbXBvbmVudHMvc3RhdGUvdXNlci1saXN0LnJlcG9zaXRvcnkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQ0wsZUFBZSxFQUNmLGFBQWEsRUFDYixZQUFZLEVBQ1osR0FBRyxFQUVILElBQUksR0FDTCxNQUFNLE1BQU0sQ0FBQztBQUVkLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUM3RCxPQUFPLEVBQ0wsaUJBQWlCLEVBQ2pCLGtCQUFrQixFQUNsQixXQUFXLEVBRVgsY0FBYyxFQUNkLFlBQVksRUFDWixZQUFZLEdBQ2IsTUFBTSxzQkFBc0IsQ0FBQztBQUM5QixPQUFPLEVBQ0wsY0FBYyxFQUNkLE9BQU8sRUFFUCx5QkFBeUIsRUFDekIsb0JBQW9CLEVBQ3BCLGNBQWMsRUFDZCxPQUFPLEVBQ1Asb0JBQW9CLEVBQ3BCLGNBQWMsR0FDZixNQUFNLHdCQUF3QixDQUFDO0FBQ2hDLE9BQU8sRUFDTCxtQkFBbUIsRUFFbkIsbUJBQW1CLEVBQ25CLGlCQUFpQixFQUNqQixrQkFBa0IsR0FDbkIsTUFBTSxzQkFBc0IsQ0FBQzs7O0FBVTlCLE1BQU0sU0FBUyxHQUFHLEVBQUUsQ0FBQztBQU9yQixNQUFNLE9BQU8sa0JBQWtCO0lBYTdCLFlBQW9CLFdBQWtDO1FBQWxDLGdCQUFXLEdBQVgsV0FBVyxDQUF1QjtRQUNwRCxlQUFlO1FBQ2YsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDakMsSUFBSSxDQUFDLGFBQWEsR0FBRyxTQUFTLENBQUM7UUFDL0IsSUFBSSxD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RSxDQUFDO29CQUNsQixJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO29CQUNqQixPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ2hCLENBQUM7Z0JBQ0QsS0FBSyxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUU7b0JBQ2YsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7b0JBQzFCLE9BQU8sQ0FBQyxLQUFLLENBQ1gsdUJBQXVCLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FBQyxDQUM5RCxDQUFDO29CQUNGLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDaEIsQ0FBQzthQUNGLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxPQUFPLENBQUM7SUFDakIsQ0FBQzs7K0dBakxVLGtCQUFrQjttSEFBbEIsa0JBQWtCLGNBREwsTUFBTTsyRkFDbkIsa0JBQWtCO2tCQUQ5QixVQUFVO21CQUFDLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHtcclxuICBCZWhhdmlvclN1YmplY3QsXHJcbiAgY29tYmluZUxhdGVzdCxcclxuICBkZWJvdW5jZVRpbWUsXHJcbiAgbWFwLFxyXG4gIE9ic2VydmFibGUsXHJcbiAgdGFrZSxcclxufSBmcm9tICdyeGpzJztcclxuXHJcbmltcG9ydCB7IGNyZWF0ZVN0b3JlLCBzZWxlY3QsIHdpdGhQcm9wcyB9IGZyb20gJ0BuZ25lYXQvZWxmJztcclxuaW1wb3J0IHtcclxuICBkZWxldGVBbGxFbnRpdGllcyxcclxuICBzZWxlY3RBY3RpdmVFbnRpdHksXHJcbiAgc2V0QWN0aXZlSWQsXHJcbiAgdXBkYXRlRW50aXRpZXMsXHJcbiAgdXBzZXJ0RW50aXRpZXMsXHJcbiAgd2l0aEFjdGl2ZUlkLFxyXG4gIHdpdGhFbnRpdGllcyxcclxufSBmcm9tICdAbmduZWF0L2VsZi1lbnRpdGllcyc7XHJcbmltcG9ydCB7XHJcbiAgZGVsZXRlQWxsUGFnZXMsXHJcbiAgaGFzUGFnZSxcclxuICBQYWdpbmF0aW9uRGF0YSxcclxuICBzZWxlY3RDdXJyZW50UGFnZUVudGl0aWVzLFxyXG4gIHNlbGVjdFBhZ2luYXRpb25EYXRhLFxyXG4gIHNldEN1cnJlbnRQYWdlLFxyXG4gIHNldFBhZ2UsXHJcbiAgdXBkYXRlUGFnaW5hdGlvbkRhdGEsXHJcbiAgd2l0aFBhZ2luYXRpb24sXHJcbn0gZnJvbSAnQG5nbmVhdC9lbGYtcGFnaW5hdGlvbic7XHJcbmltcG9ydCB7XHJcbiAgc2VsZWN0UmVxdWVzdFN0YXR1cyxcclxuICBTdGF0dXNTdGF0ZSxcclxuICB1cGRhdGVSZXF1ZXN0U3RhdHVzLFxyXG4gIHdpdGhSZXF1ZXN0c0NhY2hlLFxyXG4gIHdpdGhSZXF1ZXN0c1N0YXR1cyxcclxufSBmcm9tICdAbmduZWF0L2VsZi1yZXF1ZXN0cyc7XHJcblxyXG5pbXBvcnQgeyBVc2VyIH0gZnJvbSAnQG15cm1pZG9uL2F1dGgtand0LWxvZ2luJztcclxuaW1wb3J0IHsgRGF0YVBhZ2UgfSBmcm9tICdAbXlybWlkb24vbmctdG9vbHMnO1xyXG5cclxuaW1wb3J0IHtcclxuICBBdXRoSnd0QWNjb3VudFNlcnZpY2UsXHJcbiAgVXNlckZpbHRlcixcclxufSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9hdXRoLWp3dC1hY2NvdW50LnNlcnZpY2UnO1xyXG5cclxuY29uc3QgUEFHRV9TSVpFID0gMjA7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIFVzZXJMaXN0UHJvcHMge1xyXG4gIGZpbHRlcjogVXNlckZpbHRlcjtcclxufVxyXG5cclxuQEluamVjdGFibGUoeyBwcm92aWRlZEluOiAncm9vdCcgfSlcclxuZXhwb3J0IGNsYXNzIFVzZXJMaXN0UmVwb3NpdG9yeSB7XHJcbiAgcHJpdmF0ZSBfc3RvcmU7XHJcbiAgcHJpdmF0ZSBfbGFzdFBhZ2VTaXplOiBudW1iZXI7XHJcbiAgcHJpdmF0ZSBfbG9hZGluZyQ6IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPjtcclxuICBwcml2YXRlIF9zYXZpbmckOiBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj47XHJcblxyXG4gIHB1YmxpYyBhY3RpdmVVc2VyJDogT2JzZXJ2YWJsZTxVc2VyIHwgdW5kZWZpbmVkPjtcclxuICBwdWJsaWMgZmlsdGVyJDogT2JzZXJ2YWJsZTxVc2VyRmlsdGVyPjtcclxuICBwdWJsaWMgcGFnaW5hdGlvbiQ6IE9ic2VydmFibGU8UGFnaW5hdGlvbkRhdGEgJiB7IGRhdGE6IFVzZXJbXSB9PjtcclxuICBwdWJsaWMgc3RhdHVzJDogT2JzZXJ2YWJsZTxTdGF0dXNTdGF0ZT47XHJcbiAgcHVibGljIGxvYWRpbmckOiBPYnNlcnZhYmxlPGJvb2xlYW4+O1xyXG4gIHB1YmxpYyBzYXZpbmckOiBPYnNlcnZhYmxlPGJvb2xlYW4+O1xyXG5cclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIF9hY2NTZXJ2aWNlOiBBdXRoSnd0QWNjb3VudFNlcnZpY2UpIHtcclxuICAgIC8vIGNyZWF0ZSBzdG9yZVxyXG4gICAgdGhpcy5fc3RvcmUgPSB0aGlzLmNyZWF0ZVN0b3JlKCk7XHJcbiAgICB0aGlzLl9sYXN0UGFnZVNpemUgPSBQQUdFX1NJWkU7XHJcbiAgICB0aGlzLl9sb2FkaW5nJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xyXG4gICAgdGhpcy5fc2F2aW5nJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xyXG4gICAgdGhpcy5sb2FkaW5nJCA9IHRoaXMuX2xvYWRpbmckLmFzT2JzZXJ2YWJsZSgpO1xyXG4gICAgdGhpcy5zYXZpbmckID0gdGhpcy5fc2F2aW5nJC5hc09ic2VydmFibGUoKTtcclxuICAgIC8vIGNvbWJpbmUgcGFnaW5hdGlvbiBwYXJhbWV0ZXJzIHdpdGggcGFnZSBkYXRhIGZvciBvdXIgY29uc3VtZXJzXHJcbiAgICB0aGlzLnBhZ2luYXRpb24kID0gY29tYmluZUxhdGVzdChbXHJcbiAgICAgIHRoaXMuX3N0b3JlLnBpcGUoc2VsZWN0UGFnaW5hdGlvbkRhdGEoKSksXHJcbiAgICAgIHRoaXMuX3N0b3JlLnBpcGUoc2VsZWN0Q3VycmVudFBhZ2VFbnRpdGllcygpKSxcclxuICAgIF0pLnBpcGUoXHJcbiAgICAgIG1hcCgoW3BhZ2luYXRpb24sIGRhdGFdKSA9PiAoeyAuLi5wYWdpbmF0aW9uLCBkYXRhIH0pKSxcclxuICAgICAgZGVib3VuY2VUaW1lKDApXHJcbiAgICApO1xyXG4gICAgLy8gdGhlIGFjdGl2ZSB1c2VyLCBpZiByZXF1aXJlZFxyXG4gICAgdGhpcy5hY3RpdmVVc2VyJCA9IHRoaXMuX3N0b3JlLnBpcGUoc2VsZWN0QWN0aXZlRW50aXR5KCkpO1xyXG4gICAgLy8gdGhlIGZpbHRlciwgaWYgcmVxdWlyZWRcclxuICAgIHRoaXMuZmlsdGVyJCA9IHRoaXMuX3N0b3JlLnBpcGUoc2VsZWN0KChzdGF0ZSkgPT4gc3RhdGUuZmlsdGVyKSk7XHJcbiAgICB0aGlzLmZpbHRlciQuc3Vic2NyaWJlKChmaWx0ZXIpID0+IHtcclxuICAgICAgLy8gd2hlbiBmaWx0ZXIgY2hhbmdlZCwgcmVzZXQgYW55IGV4aXN0aW5nIHBhZ2UgYW5kIG1vdmUgdG8gcGFnZSAxXHJcbiAgICAgIGNvbnN0IHBhZ2luYXRpb25EYXRhID0gdGhpcy5fc3RvcmUuZ2V0VmFsdWUoKS5wYWdpbmF0aW9uO1xyXG4gICAgICB0aGlzLl9zdG9yZS51cGRhdGUoZGVsZXRlQWxsUGFnZXMoKSk7XHJcbiAgICAgIC8vIGxvYWQgcGFnZSAxXHJcbiAgICAgIHRoaXMubG9hZFBhZ2UoMSwgcGFnaW5hdGlvbkRhdGEucGVyUGFnZSk7XHJcbiAgICB9KTtcclxuXHJcbiAgICAvLyB0aGUgcmVxdWVzdCBzdGF0dXNcclxuICAgIHRoaXMuc3RhdHVzJCA9IHRoaXMuX3N0b3JlLnBpcGUoc2VsZWN0UmVxdWVzdFN0YXR1cygndXNlci1saXN0JykpO1xyXG5cclxuICAgIC8vIGxvYWQgcGFnZSAxIGFuZCBzdWJzY3JpYmUgdG8gcGFnaW5hdGlvblxyXG4gICAgdGhpcy5sb2FkUGFnZSgxLCBQQUdFX1NJWkUpO1xyXG4gICAgdGhpcy5wYWdpbmF0aW9uJC5zdWJzY3JpYmUoY29uc29sZS5sb2cpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjcmVhdGVTdG9yZSgpOiB0eXBlb2Ygc3RvcmUge1xyXG4gICAgY29uc3Qgc3RvcmUgPSBjcmVhdGVTdG9yZShcclxuICAgICAgeyBuYW1lOiAndXNlci1saXN0JyB9LFxyXG4gICAgICB3aXRoUHJvcHM8VXNlckxpc3RQcm9wcz4oe1xyXG4gICAgICAgIGZpbHRlcjoge30sXHJcbiAgICAgIH0pLFxyXG4gICAgICB3aXRoRW50aXRpZXM8VXNlciwgJ3VzZXJOYW1lJz4oeyBpZEtleTogJ3VzZXJOYW1lJyB9KSxcclxuICAgICAgd2l0aEFjdGl2ZUlkKCksXHJcbiAgICAgIHdpdGhSZXF1ZXN0c0NhY2hlPCd1c2VyLWxpc3QnPigpLFxyXG4gICAgICB3aXRoUmVxdWVzdHNTdGF0dXMoKSxcclxuICAgICAgd2l0aFBhZ2luYXRpb24oKVxyXG4gICAgKTtcclxuXHJcbiAgICByZXR1cm4gc3RvcmU7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFkYXB0UGFnZShwYWdlOiBEYXRhUGFnZTxVc2VyPik6IFBhZ2luYXRpb25EYXRhICYgeyBkYXRhOiBVc2VyW10gfSB7XHJcbiAgICAvLyBhZGFwdCB0aGUgc2VydmVyIHBhZ2UgRGF0YVBhZ2U8VD4gdG8gRWxmIHBhZ2luYXRpb25cclxuICAgIHJldHVybiB7XHJcbiAgICAgIGN1cnJlbnRQYWdlOiBwYWdlLnBhZ2VOdW1iZXIsXHJcbiAgICAgIHBlclBhZ2U6IHBhZ2UucGFnZVNpemUsXHJcbiAgICAgIGxhc3RQYWdlOiBwYWdlLnBhZ2VDb3VudCxcclxuICAgICAgdG90YWw6IHBhZ2UudG90YWwsXHJcbiAgICAgIGRhdGE6IHBhZ2UuaXRlbXMsXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhZGRQYWdlKHJlc3BvbnNlOiBQYWdpbmF0aW9uRGF0YSAmIHsgZGF0YTogVXNlcltdIH0pOiB2b2lkIHtcclxuICAgIGNvbnN0IHsgZGF0YSwgLi4ucGFnaW5hdGlvbkRhdGEgfSA9IHJlc3BvbnNlO1xyXG4gICAgdGhpcy5fc3RvcmUudXBkYXRlKFxyXG4gICAgICB1cHNlcnRFbnRpdGllcyhkYXRhKSxcclxuICAgICAgdXBkYXRlUGFnaW5hdGlvbkRhdGEocGFnaW5hdGlvbkRhdGEpLFxyXG4gICAgICBzZXRQYWdlKFxyXG4gICAgICAgIHBhZ2luYXRpb25EYXRhLmN1cnJlbnRQYWdlLFxyXG4gICAgICAgIGRhdGEubWFwKChjKSA9PiBjLnVzZXJOYW1lKVxyXG4gICAgICApXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGxvYWRQYWdlKHBhZ2VOdW1iZXI6IG51bWJlciwgcGFnZVNpemU/OiBudW1iZXIpOiB2b2lkIHtcclxuICAgIGlmICghcGFnZVNpemUpIHtcclxuICAgICAgcGFnZVNpemUgPSBQQUdFX1NJWkU7XHJcbiAgICB9XHJcbiAgICAvLyBpZiB0aGUgcGFnZSBleGlzdHMgYW5kIHBhZ2Ugc2l6ZSBpcyB0aGUgc2FtZSwganVzdCBtb3ZlIHRvIGl0XHJcbiAgICBpZiAoXHJcbiAgICAgIHRoaXMuX3N0b3JlLnF1ZXJ5KGhhc1BhZ2UocGFnZU51bWJlcikpICYmXHJcbiAgICAgIHBhZ2VTaXplID09PSB0aGlzLl9sYXN0UGFnZVNpemVcclxuICAgICkge1xyXG4gICAgICBjb25zb2xlLmxvZygnUGFnZSBleGlzdHM6ICcgKyBwYWdlTnVtYmVyKTtcclxuICAgICAgdGhpcy5fc3RvcmUudXBkYXRlKHNldEN1cnJlbnRQYWdlKHBhZ2VOdW1iZXIpKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIHJlc2V0IGNhY2hlZCBwYWdlcyBpZiBwYWdlIHNpemUgY2hhbmdlZFxyXG4gICAgaWYgKHRoaXMuX2xhc3RQYWdlU2l6ZSAhPT0gcGFnZVNpemUpIHtcclxuICAgICAgdGhpcy5fc3RvcmUudXBkYXRlKGRlbGV0ZUFsbFBhZ2VzKCkpO1xyXG4gICAgICB0aGlzLl9sYXN0UGFnZVNpemUgPSBwYWdlU2l6ZTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBsb2FkIHBhZ2UgZnJvbSBzZXJ2ZXJcclxuICAgIHRoaXMuX3N0b3JlLnVwZGF0ZSh1cGRhdGVSZXF1ZXN0U3RhdHVzKCd1c2VyLWxpc3QnLCAncGVuZGluZycpKTtcclxuICAgIHRoaXMuX2xvYWRpbmckLm5leHQodHJ1ZSk7XHJcbiAgICB0aGlzLl9hY2NTZXJ2aWNlXHJcbiAgICAgIC5nZXRVc2Vycyh0aGlzLl9zdG9yZS5nZXRWYWx1ZSgpLmZpbHRlciwgcGFnZU51bWJlciwgcGFnZVNpemUpXHJcbiAgICAgIC5waXBlKHRha2UoMSkpXHJcbiAgICAgIC5zdWJzY3JpYmUoKHBhZ2UpID0+IHtcclxuICAgICAgICB0aGlzLl9sb2FkaW5nJC5uZXh0KGZhbHNlKTtcclxuICAgICAgICB0aGlzLmFkZFBhZ2UoeyAuLi50aGlzLmFkYXB0UGFnZShwYWdlKSwgZGF0YTogcGFnZS5pdGVtcyB9KTtcclxuICAgICAgICB0aGlzLl9zdG9yZS51cGRhdGUodXBkYXRlUmVxdWVzdFN0YXR1cygndXNlci1saXN0JywgJ3N1Y2Nlc3MnKSk7XHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldEZpbHRlcihmaWx0ZXI6IFVzZXJGaWx0ZXIpOiB2b2lkIHtcclxuICAgIHRoaXMuX3N0b3JlLnVwZGF0ZSgoc3RhdGUpID0+ICh7IC4uLnN0YXRlLCBmaWx0ZXI6IGZpbHRlciB9KSk7XHJcbiAgfVxyXG5cclxuICBjbGVhckNhY2hlKCkge1xyXG4gICAgdGhpcy5fc3RvcmUudXBkYXRlKGRlbGV0ZUFsbEVudGl0aWVzKCksIGRlbGV0ZUFsbFBhZ2VzKCkpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldEFjdGl2ZShuYW1lOiBzdHJpbmcgfCBudWxsKTogdm9pZCB7XHJcbiAgICB0aGlzLl9zdG9yZS51cGRhdGUoc2V0QWN0aXZlSWQobmFtZSkpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHVwZGF0ZUFjdGl2ZSh1c2VyOiBVc2VyKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICBjb25zdCBwcm9taXNlOiBQcm9taXNlPGJvb2xlYW4+ID0gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICB0aGlzLl9zYXZpbmckLm5leHQodHJ1ZSk7XHJcblxyXG4gICAgICB0aGlzLl9hY2NTZXJ2aWNlLnVwZGF0ZVVzZXIodXNlcikuc3Vic2NyaWJlKHtcclxuICAgICAgICBuZXh0OiAoXykgPT4ge1xyXG4gICAgICAgICAgdGhpcy5fc2F2aW5nJC5uZXh0KGZhbHNlKTtcclxuICAgICAgICAgIHRoaXMuX3N0b3JlLnVwZGF0ZSh1cHNlcnRFbnRpdGllcyh1c2VyKSk7XHJcbiAgICAgICAgICByZXNvbHZlKHRydWUpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZXJyb3I6IChlcnJvcikgPT4ge1xyXG4gICAgICAgICAgdGhpcy5fc2F2aW5nJC5uZXh0KGZhbHNlKTtcclxuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXHJcbiAgICAgICAgICAgIGBFcnJvciB1cGRhdGluZyB1c2VyICR7dXNlci51c2VyTmFtZX06IGAgK1xyXG4gICAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KGVycm9yIHx8IHt9KVxyXG4gICAgICAgICAgKTtcclxuICAgICAgICAgIHJlc29sdmUoZmFsc2UpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gcHJvbWlzZTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBkZWxldGVVc2VyKG5hbWU6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgY29uc3QgcHJvbWlzZTogUHJvbWlzZTxib29sZWFuPiA9IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgdGhpcy5fc2F2aW5nJC5uZXh0KHRydWUpO1xyXG5cclxuICAgICAgdGhpcy5fYWNjU2VydmljZS5kZWxldGVVc2VyKG5hbWUpLnN1YnNjcmliZSh7XHJcbiAgICAgICAgbmV4dDogKF8pID0+IHtcclxuICAgICAgICAgIHRoaXMuX3NhdmluZyQubmV4dChmYWxzZSk7XHJcbiAgICAgICAgICB0aGlzLmNsZWFyQ2FjaGUoKTtcclxuICAgICAgICAgIHRoaXMubG9hZFBhZ2UoMSk7XHJcbiAgICAgICAgICByZXNvbHZlKHRydWUpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZXJyb3I6IChlcnJvcikgPT4ge1xyXG4gICAgICAgICAgdGhpcy5fc2F2aW5nJC5uZXh0KGZhbHNlKTtcclxuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXHJcbiAgICAgICAgICAgIGBFcnJvciBkZWxldGluZyB1c2VyICR7bmFtZX06IGAgKyBKU09OLnN0cmluZ2lmeShlcnJvciB8fCB7fSlcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgICByZWplY3QoZXJyb3IpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gcHJvbWlzZTtcclxuICB9XHJcbn1cclxuIl19
@@ -1,112 +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/common";
7
- import * as i4 from "@angular/material/button";
8
- import * as i5 from "@angular/material/checkbox";
9
- import * as i6 from "@angular/material/icon";
10
- import * as i7 from "@angular/material/input";
11
- import * as i8 from "@angular/material/form-field";
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
- if (!user) {
54
- this.form.reset();
55
- }
56
- else {
57
- this.email.setValue(user.email);
58
- this.emailConfirmed.setValue(user.emailConfirmed);
59
- this.lockoutEnabled.setValue(user.lockoutEnabled);
60
- this.firstName.setValue(user.firstName);
61
- this.lastName.setValue(user.lastName);
62
- if (user.roles?.length > 0) {
63
- this.roles.setValue(user.roles.join(' '));
64
- }
65
- else {
66
- this.roles.setValue(null);
67
- }
68
- }
69
- }
70
- getUserFromForm() {
71
- return {
72
- userName: this._user?.userName || '',
73
- email: this.email.value,
74
- emailConfirmed: this.emailConfirmed.value,
75
- lockoutEnabled: this.lockoutEnabled.value,
76
- firstName: this.firstName.value,
77
- lastName: this.lastName.value,
78
- roles: this.roles.value
79
- ? this.roles.value.split(' ').filter((s) => s)
80
- : [],
81
- };
82
- }
83
- endLockout() {
84
- if (this.unlocked) {
85
- return;
86
- }
87
- this._user.lockoutEnd = this._authService.getUTCDate();
88
- this.unlocked = true;
89
- }
90
- close() {
91
- this.editorClose.emit();
92
- }
93
- save() {
94
- if (this.form.invalid) {
95
- return;
96
- }
97
- this.userChange.emit(this.getUserFromForm());
98
- }
99
- }
100
- UserEditorComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.1", ngImport: i0, type: UserEditorComponent, deps: [{ token: i1.UntypedFormBuilder }, { token: i2.AuthJwtService }], target: i0.ɵɵFactoryTarget.Component });
101
- UserEditorComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.1", type: UserEditorComponent, selector: "auth-jwt-user-editor", inputs: { user: "user" }, outputs: { userChange: "userChange", editorClose: "editorClose" }, ngImport: i0, template: "<form [formGroup]=\"form\" (submit)=\"save()\">\n <div class=\"form-row\">\n <!-- email -->\n <mat-form-field>\n <mat-label i18n>email</mat-label>\n <input type=\"text\" matInput [formControl]=\"email\" />\n <mat-error\n i18n\n *ngIf=\"email.hasError('required') && (email.dirty || email.touched)\"\n >\n email address required\n </mat-error>\n <mat-error\n i18n\n *ngIf=\"email.hasError('pattern') && (email.dirty || email.touched)\"\n >\n invalid email address\n </mat-error>\n </mat-form-field>\n\n <!-- emailConfirmed -->\n <mat-checkbox [formControl]=\"emailConfirmed\" i18n\n >email address confirmed</mat-checkbox\n >\n </div>\n\n <!-- lockoutEnabled -->\n <div class=\"form-row\">\n <mat-checkbox [formControl]=\"lockoutEnabled\" i18n\n >lockout enabled</mat-checkbox\n >\n <button\n mat-icon-button\n color=\"primary\"\n (click)=\"endLockout()\"\n [disabled]=\"unlocked\"\n i18n-matTooltip\n matTooltip=\"Unlock this user if locked\"\n >\n <mat-icon>lock_open</mat-icon>\n </button>\n </div>\n\n <div class=\"form-row\">\n <!-- firstName -->\n <mat-form-field>\n <mat-label i18n>first name</mat-label>\n <input type=\"text\" matInput [formControl]=\"firstName\" />\n <mat-error\n i18n\n *ngIf=\"\n firstName.hasError('required') &&\n (firstName.dirty || firstName.touched)\n \"\n >\n first name required\n </mat-error>\n <mat-error\n i18n\n *ngIf=\"\n firstName.hasError('maxlength') &&\n (firstName.dirty || firstName.touched)\n \"\n >\n first name too long\n </mat-error>\n </mat-form-field>\n\n <!-- lastName -->\n <mat-form-field>\n <mat-label i18n>last name</mat-label>\n <input type=\"text\" matInput [formControl]=\"lastName\" />\n <mat-error\n i18n\n *ngIf=\"\n lastName.hasError('required') && (lastName.dirty || lastName.touched)\n \"\n >\n last name required\n </mat-error>\n <mat-error\n i18n\n *ngIf=\"\n lastName.hasError('maxlength') && (lastName.dirty || lastName.touched)\n \"\n >\n last name too long\n </mat-error>\n </mat-form-field>\n </div>\n\n <!-- roles -->\n <div>\n <mat-form-field style=\"width: 16em\">\n <mat-label i18n>roles</mat-label>\n <input type=\"text\" matInput [formControl]=\"roles\" />\n <mat-error\n i18n\n *ngIf=\"roles.hasError('maxlength') && (roles.dirty || roles.touched)\"\n >\n too long\n </mat-error>\n <mat-hint i18n>roles (separated by space)</mat-hint>\n </mat-form-field>\n </div>\n\n <!-- buttons -->\n <br />\n <div>\n <button\n type=\"button\"\n mat-icon-button\n color=\"warn\"\n i18n-matTooltip\n matTooltip=\"Close\"\n (click)=\"close()\"\n >\n <mat-icon>cancel</mat-icon>\n </button>\n <button\n type=\"submit\"\n mat-icon-button\n color=\"primary\"\n [disabled]=\"form.invalid\"\n i18n-matTooltip\n matTooltip=\"Save user\"\n >\n <mat-icon>check_circle</mat-icon>\n </button>\n </div>\n</form>\n", styles: [".form-row{display:flex;gap:8px;align-items:center;flex-wrap:wrap}.form-row *{flex:0 0 auto}\n"], dependencies: [{ kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", 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]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: i4.MatIconButton, selector: "button[mat-icon-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i5.MatCheckbox, selector: "mat-checkbox", inputs: ["disableRipple", "color", "tabIndex"], exportAs: ["matCheckbox"] }, { kind: "component", type: i6.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i7.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i8.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i8.MatLabel, selector: "mat-label" }, { kind: "directive", type: i8.MatHint, selector: "mat-hint", inputs: ["align", "id"] }, { kind: "directive", type: i8.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "directive", type: i9.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }] });
102
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.1", ngImport: i0, type: UserEditorComponent, decorators: [{
103
- type: Component,
104
- args: [{ selector: 'auth-jwt-user-editor', template: "<form [formGroup]=\"form\" (submit)=\"save()\">\n <div class=\"form-row\">\n <!-- email -->\n <mat-form-field>\n <mat-label i18n>email</mat-label>\n <input type=\"text\" matInput [formControl]=\"email\" />\n <mat-error\n i18n\n *ngIf=\"email.hasError('required') && (email.dirty || email.touched)\"\n >\n email address required\n </mat-error>\n <mat-error\n i18n\n *ngIf=\"email.hasError('pattern') && (email.dirty || email.touched)\"\n >\n invalid email address\n </mat-error>\n </mat-form-field>\n\n <!-- emailConfirmed -->\n <mat-checkbox [formControl]=\"emailConfirmed\" i18n\n >email address confirmed</mat-checkbox\n >\n </div>\n\n <!-- lockoutEnabled -->\n <div class=\"form-row\">\n <mat-checkbox [formControl]=\"lockoutEnabled\" i18n\n >lockout enabled</mat-checkbox\n >\n <button\n mat-icon-button\n color=\"primary\"\n (click)=\"endLockout()\"\n [disabled]=\"unlocked\"\n i18n-matTooltip\n matTooltip=\"Unlock this user if locked\"\n >\n <mat-icon>lock_open</mat-icon>\n </button>\n </div>\n\n <div class=\"form-row\">\n <!-- firstName -->\n <mat-form-field>\n <mat-label i18n>first name</mat-label>\n <input type=\"text\" matInput [formControl]=\"firstName\" />\n <mat-error\n i18n\n *ngIf=\"\n firstName.hasError('required') &&\n (firstName.dirty || firstName.touched)\n \"\n >\n first name required\n </mat-error>\n <mat-error\n i18n\n *ngIf=\"\n firstName.hasError('maxlength') &&\n (firstName.dirty || firstName.touched)\n \"\n >\n first name too long\n </mat-error>\n </mat-form-field>\n\n <!-- lastName -->\n <mat-form-field>\n <mat-label i18n>last name</mat-label>\n <input type=\"text\" matInput [formControl]=\"lastName\" />\n <mat-error\n i18n\n *ngIf=\"\n lastName.hasError('required') && (lastName.dirty || lastName.touched)\n \"\n >\n last name required\n </mat-error>\n <mat-error\n i18n\n *ngIf=\"\n lastName.hasError('maxlength') && (lastName.dirty || lastName.touched)\n \"\n >\n last name too long\n </mat-error>\n </mat-form-field>\n </div>\n\n <!-- roles -->\n <div>\n <mat-form-field style=\"width: 16em\">\n <mat-label i18n>roles</mat-label>\n <input type=\"text\" matInput [formControl]=\"roles\" />\n <mat-error\n i18n\n *ngIf=\"roles.hasError('maxlength') && (roles.dirty || roles.touched)\"\n >\n too long\n </mat-error>\n <mat-hint i18n>roles (separated by space)</mat-hint>\n </mat-form-field>\n </div>\n\n <!-- buttons -->\n <br />\n <div>\n <button\n type=\"button\"\n mat-icon-button\n color=\"warn\"\n i18n-matTooltip\n matTooltip=\"Close\"\n (click)=\"close()\"\n >\n <mat-icon>cancel</mat-icon>\n </button>\n <button\n type=\"submit\"\n mat-icon-button\n color=\"primary\"\n [disabled]=\"form.invalid\"\n i18n-matTooltip\n matTooltip=\"Save user\"\n >\n <mat-icon>check_circle</mat-icon>\n </button>\n </div>\n</form>\n", styles: [".form-row{display:flex;gap:8px;align-items:center;flex-wrap:wrap}.form-row *{flex:0 0 auto}\n"] }]
105
- }], ctorParameters: function () { return [{ type: i1.UntypedFormBuilder }, { type: i2.AuthJwtService }]; }, propDecorators: { user: [{
106
- type: Input
107
- }], userChange: [{
108
- type: Output
109
- }], editorClose: [{
110
- type: Output
111
- }] } });
112
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlci1lZGl0b3IuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbXlybWlkb24vYXV0aC1qd3QtYWRtaW4vc3JjL2xpYi9jb21wb25lbnRzL3VzZXItZWRpdG9yL3VzZXItZWRpdG9yLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL215cm1pZG9uL2F1dGgtand0LWFkbWluL3NyYy9saWIvY29tcG9uZW50cy91c2VyLWVkaXRvci91c2VyLWVkaXRvci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFVLEtBQUssRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQy9FLE9BQU8sRUFJTCxVQUFVLEdBQ1gsTUFBTSxnQkFBZ0IsQ0FBQzs7Ozs7Ozs7Ozs7QUFReEIsTUFBTSxPQUFPLG1CQUFtQjtJQXdCOUIsWUFBWSxXQUErQixFQUFVLFlBQTRCO1FBQTVCLGlCQUFZLEdBQVosWUFBWSxDQUFnQjtRQUMvRSxTQUFTO1FBQ1QsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLFlBQVksRUFBUSxDQUFDO1FBQzNDLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxZQUFZLEVBQU8sQ0FBQztRQUMzQyxPQUFPO1FBQ1AsSUFBSSxDQUFDLEtBQUssR0FBRyxXQUFXLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRTtZQUNyQyxVQUFVLENBQUMsUUFBUTtZQUNuQixVQUFVLENBQUMsS0FBSztTQUNqQixDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsY0FBYyxHQUFHLFdBQVcsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDakQsSUFBSSxDQUFDLGNBQWMsR0FBRyxXQUFXLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2pELElBQUksQ0FBQyxTQUFTLEdBQUcs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Q0FBQyxDQUFTLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztnQkFDdEQsQ0FBQyxDQUFDLEVBQUU7U0FDUCxDQUFDO0lBQ0osQ0FBQztJQUVNLFVBQVU7UUFDZixJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDakIsT0FBTztTQUNSO1FBQ0QsSUFBSSxDQUFDLEtBQU0sQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUN4RCxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQztJQUN2QixDQUFDO0lBRU0sS0FBSztRQUNWLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDMUIsQ0FBQztJQUVNLElBQUk7UUFDVCxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFO1lBQ3JCLE9BQU87U0FDUjtRQUNELElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQyxDQUFDO0lBQy9DLENBQUM7O2dIQXpHVSxtQkFBbUI7b0dBQW5CLG1CQUFtQix5SkNkaEMsc3hHQW1JQTsyRkRySGEsbUJBQW1CO2tCQUwvQixTQUFTOytCQUNFLHNCQUFzQjtzSUFpQlosSUFBSTtzQkFBdkIsS0FBSztnQkFRSSxVQUFVO3NCQUFuQixNQUFNO2dCQUNHLFdBQVc7c0JBQXBCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgSW5wdXQsIE91dHB1dCwgRXZlbnRFbWl0dGVyIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICBVbnR5cGVkRm9ybUdyb3VwLFxuICBVbnR5cGVkRm9ybUNvbnRyb2wsXG4gIFVudHlwZWRGb3JtQnVpbGRlcixcbiAgVmFsaWRhdG9ycyxcbn0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgQXV0aEp3dFNlcnZpY2UsIFVzZXIgfSBmcm9tICdAbXlybWlkb24vYXV0aC1qd3QtbG9naW4nO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhdXRoLWp3dC11c2VyLWVkaXRvcicsXG4gIHRlbXBsYXRlVXJsOiAnLi91c2VyLWVkaXRvci5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3VzZXItZWRpdG9yLmNvbXBvbmVudC5jc3MnXSxcbn0pXG5leHBvcnQgY2xhc3MgVXNlckVkaXRvckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIHByaXZhdGUgX3VzZXI6IFVzZXIgfCB1bmRlZmluZWQ7XG5cbiAgcHVibGljIGVtYWlsOiBVbnR5cGVkRm9ybUNvbnRyb2w7XG4gIHB1YmxpYyBlbWFpbENvbmZpcm1lZDogVW50eXBlZEZvcm1Db250cm9sO1xuICBwdWJsaWMgbG9ja291dEVuYWJsZWQ6IFVudHlwZWRGb3JtQ29udHJvbDtcbiAgcHVibGljIGZpcnN0TmFtZTogVW50eXBlZEZvcm1Db250cm9sO1xuICBwdWJsaWMgbGFzdE5hbWU6IFVudHlwZWRGb3JtQ29udHJvbDtcbiAgcHVibGljIHJvbGVzOiBVbnR5cGVkRm9ybUNvbnRyb2w7XG4gIHB1YmxpYyBmb3JtOiBVbnR5cGVkRm9ybUdyb3VwO1xuXG4gIHB1YmxpYyB1bmxvY2tlZDogYm9vbGVhbiB8IHVuZGVmaW5lZDtcblxuICBASW5wdXQoKSBwdWJsaWMgc2V0IHVzZXIodmFsdWU6IFVzZXIgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLl91c2VyID0gdmFsdWU7XG4gICAgdGhpcy51cGRhdGVGb3JtKHZhbHVlKTtcbiAgfVxuICBwdWJsaWMgZ2V0IHVzZXIoKTogVXNlciB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX3VzZXI7XG4gIH1cblxuICBAT3V0cHV0KCkgdXNlckNoYW5nZTogRXZlbnRFbWl0dGVyPFVzZXI+O1xuICBAT3V0cHV0KCkgZWRpdG9yQ2xvc2U6IEV2ZW50RW1pdHRlcjxhbnk+O1xuXG4gIGNvbnN0cnVjdG9yKGZvcm1CdWlsZGVyOiBVbnR5cGVkRm9ybUJ1aWxkZXIsIHByaXZhdGUgX2F1dGhTZXJ2aWNlOiBBdXRoSnd0U2VydmljZSkge1xuICAgIC8vIGV2ZW50c1xuICAgIHRoaXMudXNlckNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8VXNlcj4oKTtcbiAgICB0aGlzLmVkaXRvckNsb3NlID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gICAgLy8gZm9ybVxuICAgIHRoaXMuZW1haWwgPSBmb3JtQnVpbGRlci5jb250cm9sKG51bGwsIFtcbiAgICAgIFZhbGlkYXRvcnMucmVxdWlyZWQsXG4gICAgICBWYWxpZGF0b3JzLmVtYWlsLFxuICAgIF0pO1xuICAgIHRoaXMuZW1haWxDb25maXJtZWQgPSBmb3JtQnVpbGRlci5jb250cm9sKGZhbHNlKTtcbiAgICB0aGlzLmxvY2tvdXRFbmFibGVkID0gZm9ybUJ1aWxkZXIuY29udHJvbChmYWxzZSk7XG4gICAgdGhpcy5maXJzdE5hbWUgPSBmb3JtQnVpbGRlci5jb250cm9sKG51bGwsIFtcbiAgICAgIFZhbGlkYXRvcnMucmVxdWlyZWQsXG4gICAgICBWYWxpZGF0b3JzLm1heExlbmd0aCg1MCksXG4gICAgXSk7XG4gICAgdGhpcy5sYXN0TmFtZSA9IGZvcm1CdWlsZGVyLmNvbnRyb2wobnVsbCwgW1xuICAgICAgVmFsaWRhdG9ycy5yZXF1aXJlZCxcbiAgICAgIFZhbGlkYXRvcnMubWF4TGVuZ3RoKDUwKSxcbiAgICBdKTtcbiAgICB0aGlzLnJvbGVzID0gZm9ybUJ1aWxkZXIuY29udHJvbChudWxsLCBWYWxpZGF0b3JzLm1heExlbmd0aCgyMDApKTtcblxuICAgIHRoaXMuZm9ybSA9IGZvcm1CdWlsZGVyLmdyb3VwKHtcbiAgICAgIGVtYWlsOiB0aGlzLmVtYWlsLFxuICAgICAgZW1haWxDb25maXJtZWQ6IHRoaXMuZW1haWxDb25maXJtZWQsXG4gICAgICBsb2Nrb3V0RW5hYmxlZDogdGhpcy5sb2Nrb3V0RW5hYmxlZCxcbiAgICAgIGZpcnN0TmFtZTogdGhpcy5maXJzdE5hbWUsXG4gICAgICBsYXN0TmFtZTogdGhpcy5sYXN0TmFtZSxcbiAgICAgIHJvbGVzOiB0aGlzLnJvbGVzLFxuICAgIH0pO1xuICB9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7fVxuXG4gIHByaXZhdGUgdXBkYXRlRm9ybSh1c2VyOiBVc2VyIHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gICAgaWYgKCF1c2VyKSB7XG4gICAgICB0aGlzLmZvcm0ucmVzZXQoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5lbWFpbC5zZXRWYWx1ZSh1c2VyLmVtYWlsKTtcbiAgICAgIHRoaXMuZW1haWxDb25maXJtZWQuc2V0VmFsdWUodXNlci5lbWFpbENvbmZpcm1lZCk7XG4gICAgICB0aGlzLmxvY2tvdXRFbmFibGVkLnNldFZhbHVlKHVzZXIubG9ja291dEVuYWJsZWQpO1xuICAgICAgdGhpcy5maXJzdE5hbWUuc2V0VmFsdWUodXNlci5maXJzdE5hbWUpO1xuICAgICAgdGhpcy5sYXN0TmFtZS5zZXRWYWx1ZSh1c2VyLmxhc3ROYW1lKTtcbiAgICAgIGlmICh1c2VyLnJvbGVzPy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHRoaXMucm9sZXMuc2V0VmFsdWUodXNlci5yb2xlcy5qb2luKCcgJykpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5yb2xlcy5zZXRWYWx1ZShudWxsKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGdldFVzZXJGcm9tRm9ybSgpOiBVc2VyIHtcbiAgICByZXR1cm4ge1xuICAgICAgdXNlck5hbWU6IHRoaXMuX3VzZXI/LnVzZXJOYW1lIHx8ICcnLFxuICAgICAgZW1haWw6IHRoaXMuZW1haWwudmFsdWUsXG4gICAgICBlbWFpbENvbmZpcm1lZDogdGhpcy5lbWFpbENvbmZpcm1lZC52YWx1ZSxcbiAgICAgIGxvY2tvdXRFbmFibGVkOiB0aGlzLmxvY2tvdXRFbmFibGVkLnZhbHVlLFxuICAgICAgZmlyc3ROYW1lOiB0aGlzLmZpcnN0TmFtZS52YWx1ZSxcbiAgICAgIGxhc3ROYW1lOiB0aGlzLmxhc3ROYW1lLnZhbHVlLFxuICAgICAgcm9sZXM6IHRoaXMucm9sZXMudmFsdWVcbiAgICAgICAgPyB0aGlzLnJvbGVzLnZhbHVlLnNwbGl0KCcgJykuZmlsdGVyKChzOiBzdHJpbmcpID0+IHMpXG4gICAgICAgIDogW10sXG4gICAgfTtcbiAgfVxuXG4gIHB1YmxpYyBlbmRMb2Nrb3V0KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnVubG9ja2VkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuX3VzZXIhLmxvY2tvdXRFbmQgPSB0aGlzLl9hdXRoU2VydmljZS5nZXRVVENEYXRlKCk7XG4gICAgdGhpcy51bmxvY2tlZCA9IHRydWU7XG4gIH1cblxuICBwdWJsaWMgY2xvc2UoKTogdm9pZCB7XG4gICAgdGhpcy5lZGl0b3JDbG9zZS5lbWl0KCk7XG4gIH1cblxuICBwdWJsaWMgc2F2ZSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5mb3JtLmludmFsaWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy51c2VyQ2hhbmdlLmVtaXQodGhpcy5nZXRVc2VyRnJvbUZvcm0oKSk7XG4gIH1cbn1cbiIsIjxmb3JtIFtmb3JtR3JvdXBdPVwiZm9ybVwiIChzdWJtaXQpPVwic2F2ZSgpXCI+XG4gIDxkaXYgY2xhc3M9XCJmb3JtLXJvd1wiPlxuICAgIDwhLS0gZW1haWwgLS0+XG4gICAgPG1hdC1mb3JtLWZpZWxkPlxuICAgICAgPG1hdC1sYWJlbCBpMThuPmVtYWlsPC9tYXQtbGFiZWw+XG4gICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBtYXRJbnB1dCBbZm9ybUNvbnRyb2xdPVwiZW1haWxcIiAvPlxuICAgICAgPG1hdC1lcnJvclxuICAgICAgICBpMThuXG4gICAgICAgICpuZ0lmPVwiZW1haWwuaGFzRXJyb3IoJ3JlcXVpcmVkJykgJiYgKGVtYWlsLmRpcnR5IHx8IGVtYWlsLnRvdWNoZWQpXCJcbiAgICAgID5cbiAgICAgICAgZW1haWwgYWRkcmVzcyByZXF1aXJlZFxuICAgICAgPC9tYXQtZXJyb3I+XG4gICAgICA8bWF0LWVycm9yXG4gICAgICAgIGkxOG5cbiAgICAgICAgKm5nSWY9XCJlbWFpbC5oYXNFcnJvcigncGF0dGVybicpICYmIChlbWFpbC5kaXJ0eSB8fCBlbWFpbC50b3VjaGVkKVwiXG4gICAgICA+XG4gICAgICAgIGludmFsaWQgZW1haWwgYWRkcmVzc1xuICAgICAgPC9tYXQtZXJyb3I+XG4gICAgPC9tYXQtZm9ybS1maWVsZD5cblxuICAgIDwhLS0gZW1haWxDb25maXJtZWQgLS0+XG4gICAgPG1hdC1jaGVja2JveCBbZm9ybUNvbnRyb2xdPVwiZW1haWxDb25maXJtZWRcIiBpMThuXG4gICAgICA+ZW1haWwgYWRkcmVzcyBjb25maXJtZWQ8L21hdC1jaGVja2JveFxuICAgID5cbiAgPC9kaXY+XG5cbiAgPCEtLSBsb2Nrb3V0RW5hYmxlZCAtLT5cbiAgPGRpdiBjbGFzcz1cImZvcm0tcm93XCI+XG4gICAgPG1hdC1jaGVja2JveCBbZm9ybUNvbnRyb2xdPVwibG9ja291dEVuYWJsZWRcIiBpMThuXG4gICAgICA+bG9ja291dCBlbmFibGVkPC9tYXQtY2hlY2tib3hcbiAgICA+XG4gICAgPGJ1dHRvblxuICAgICAgbWF0LWljb24tYnV0dG9uXG4gICAgICBjb2xvcj1cInByaW1hcnlcIlxuICAgICAgKGNsaWNrKT1cImVuZExvY2tvdXQoKVwiXG4gICAgICBbZGlzYWJsZWRdPVwidW5sb2NrZWRcIlxuICAgICAgaTE4bi1tYXRUb29sdGlwXG4gICAgICBtYXRUb29sdGlwPVwiVW5sb2NrIHRoaXMgdXNlciBpZiBsb2NrZWRcIlxuICAgID5cbiAgICAgIDxtYXQtaWNvbj5sb2NrX29wZW48L21hdC1pY29uPlxuICAgIDwvYnV0dG9uPlxuICA8L2Rpdj5cblxuICA8ZGl2IGNsYXNzPVwiZm9ybS1yb3dcIj5cbiAgICA8IS0tIGZpcnN0TmFtZSAtLT5cbiAgICA8bWF0LWZvcm0tZmllbGQ+XG4gICAgICA8bWF0LWxhYmVsIGkxOG4+Zmlyc3QgbmFtZTwvbWF0LWxhYmVsPlxuICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgbWF0SW5wdXQgW2Zvcm1Db250cm9sXT1cImZpcnN0TmFtZVwiIC8+XG4gICAgICA8bWF0LWVycm9yXG4gICAgICAgIGkxOG5cbiAgICAgICAgKm5nSWY9XCJcbiAgICAgICAgICBmaXJzdE5hbWUuaGFzRXJyb3IoJ3JlcXVpcmVkJykgJiZcbiAgICAgICAgICAoZmlyc3ROYW1lLmRpcnR5IHx8IGZpcnN0TmFtZS50b3VjaGVkKVxuICAgICAgICBcIlxuICAgICAgPlxuICAgICAgICBmaXJzdCBuYW1lIHJlcXVpcmVkXG4gICAgICA8L21hdC1lcnJvcj5cbiAgICAgIDxtYXQtZXJyb3JcbiAgICAgICAgaTE4blxuICAgICAgICAqbmdJZj1cIlxuICAgICAgICAgIGZpcnN0TmFtZS5oYXNFcnJvcignbWF4bGVuZ3RoJykgJiZcbiAgICAgICAgICAoZmlyc3ROYW1lLmRpcnR5IHx8IGZpcnN0TmFtZS50b3VjaGVkKVxuICAgICAgICBcIlxuICAgICAgPlxuICAgICAgICBmaXJzdCBuYW1lIHRvbyBsb25nXG4gICAgICA8L21hdC1lcnJvcj5cbiAgICA8L21hdC1mb3JtLWZpZWxkPlxuXG4gICAgPCEtLSBsYXN0TmFtZSAtLT5cbiAgICA8bWF0LWZvcm0tZmllbGQ+XG4gICAgICA8bWF0LWxhYmVsIGkxOG4+bGFzdCBuYW1lPC9tYXQtbGFiZWw+XG4gICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBtYXRJbnB1dCBbZm9ybUNvbnRyb2xdPVwibGFzdE5hbWVcIiAvPlxuICAgICAgPG1hdC1lcnJvclxuICAgICAgICBpMThuXG4gICAgICAgICpuZ0lmPVwiXG4gICAgICAgICAgbGFzdE5hbWUuaGFzRXJyb3IoJ3JlcXVpcmVkJykgJiYgKGxhc3ROYW1lLmRpcnR5IHx8IGxhc3ROYW1lLnRvdWNoZWQpXG4gICAgICAgIFwiXG4gICAgICA+XG4gICAgICAgIGxhc3QgbmFtZSByZXF1aXJlZFxuICAgICAgPC9tYXQtZXJyb3I+XG4gICAgICA8bWF0LWVycm9yXG4gICAgICAgIGkxOG5cbiAgICAgICAgKm5nSWY9XCJcbiAgICAgICAgICBsYXN0TmFtZS5oYXNFcnJvcignbWF4bGVuZ3RoJykgJiYgKGxhc3ROYW1lLmRpcnR5IHx8IGxhc3ROYW1lLnRvdWNoZWQpXG4gICAgICAgIFwiXG4gICAgICA+XG4gICAgICAgIGxhc3QgbmFtZSB0b28gbG9uZ1xuICAgICAgPC9tYXQtZXJyb3I+XG4gICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgPC9kaXY+XG5cbiAgPCEtLSByb2xlcyAtLT5cbiAgPGRpdj5cbiAgICA8bWF0LWZvcm0tZmllbGQgc3R5bGU9XCJ3aWR0aDogMTZlbVwiPlxuICAgICAgPG1hdC1sYWJlbCBpMThuPnJvbGVzPC9tYXQtbGFiZWw+XG4gICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBtYXRJbnB1dCBbZm9ybUNvbnRyb2xdPVwicm9sZXNcIiAvPlxuICAgICAgPG1hdC1lcnJvclxuICAgICAgICBpMThuXG4gICAgICAgICpuZ0lmPVwicm9sZXMuaGFzRXJyb3IoJ21heGxlbmd0aCcpICYmIChyb2xlcy5kaXJ0eSB8fCByb2xlcy50b3VjaGVkKVwiXG4gICAgICA+XG4gICAgICAgIHRvbyBsb25nXG4gICAgICA8L21hdC1lcnJvcj5cbiAgICAgIDxtYXQtaGludCBpMThuPnJvbGVzIChzZXBhcmF0ZWQgYnkgc3BhY2UpPC9tYXQtaGludD5cbiAgICA8L21hdC1mb3JtLWZpZWxkPlxuICA8L2Rpdj5cblxuICA8IS0tIGJ1dHRvbnMgLS0+XG4gIDxiciAvPlxuICA8ZGl2PlxuICAgIDxidXR0b25cbiAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgbWF0LWljb24tYnV0dG9uXG4gICAgICBjb2xvcj1cIndhcm5cIlxuICAgICAgaTE4bi1tYXRUb29sdGlwXG4gICAgICBtYXRUb29sdGlwPVwiQ2xvc2VcIlxuICAgICAgKGNsaWNrKT1cImNsb3NlKClcIlxuICAgID5cbiAgICAgIDxtYXQtaWNvbj5jYW5jZWw8L21hdC1pY29uPlxuICAgIDwvYnV0dG9uPlxuICAgIDxidXR0b25cbiAgICAgIHR5cGU9XCJzdWJtaXRcIlxuICAgICAgbWF0LWljb24tYnV0dG9uXG4gICAgICBjb2xvcj1cInByaW1hcnlcIlxuICAgICAgW2Rpc2FibGVkXT1cImZvcm0uaW52YWxpZFwiXG4gICAgICBpMThuLW1hdFRvb2x0aXBcbiAgICAgIG1hdFRvb2x0aXA9XCJTYXZlIHVzZXJcIlxuICAgID5cbiAgICAgIDxtYXQtaWNvbj5jaGVja19jaXJjbGU8L21hdC1pY29uPlxuICAgIDwvYnV0dG9uPlxuICA8L2Rpdj5cbjwvZm9ybT5cbiJdfQ==
@@ -1,55 +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/user-list.repository";
5
- import * as i3 from "@angular/material/button";
6
- import * as i4 from "@angular/material/icon";
7
- import * as i5 from "@angular/material/input";
8
- import * as i6 from "@angular/material/form-field";
9
- import * as i7 from "@angular/material/tooltip";
10
- export class UserFilterComponent {
11
- constructor(formBuilder, _repository) {
12
- this._repository = _repository;
13
- this.filter$ = _repository.filter$;
14
- // form
15
- this.name = formBuilder.control(null);
16
- this.form = formBuilder.group({
17
- name: this.name,
18
- });
19
- }
20
- ngOnInit() {
21
- this.filter$.subscribe((f) => {
22
- this.updateForm(f);
23
- });
24
- }
25
- updateForm(filter) {
26
- this.name.setValue(filter.name || null);
27
- this.form.markAsPristine();
28
- }
29
- reset() {
30
- this.form.reset();
31
- this.apply();
32
- }
33
- getFilter() {
34
- return {
35
- name: this.name.value?.trim(),
36
- };
37
- }
38
- apply() {
39
- if (this.form.invalid) {
40
- return;
41
- }
42
- const filter = this.getFilter();
43
- // update filter in state
44
- this._repository.setFilter(filter);
45
- }
46
- }
47
- UserFilterComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.1", ngImport: i0, type: UserFilterComponent, deps: [{ token: i1.FormBuilder }, { token: i2.UserListRepository }], target: i0.ɵɵFactoryTarget.Component });
48
- UserFilterComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.1", type: UserFilterComponent, selector: "auth-jwt-user-filter", inputs: { disabled: "disabled" }, ngImport: i0, template: "<form [formGroup]=\"form\" (submit)=\"apply()\" ng-disabled=\"disabled\">\n <div class=\"form-row\">\n <mat-form-field>\n <mat-label i18n>name or ID</mat-label>\n <input matInput [formControl]=\"name\" />\n <button\n mat-icon-button\n matSuffix\n type=\"button\"\n (click)=\"reset()\"\n color=\"warn\"\n i18n-matTooltip\n matTooltip=\"Reset filters\"\n [disabled]=\"disabled\"\n >\n <mat-icon>clear</mat-icon>\n </button>\n </mat-form-field>\n\n <button\n style=\"margin-top: -20px\"\n type=\"submit\"\n mat-icon-button\n color=\"primary\"\n [disabled]=\"disabled\"\n i18n-matTooltip\n matTooltip=\"Apply filters\"\n >\n <mat-icon>check_circle</mat-icon>\n </button>\n </div>\n</form>\n", styles: [".form-row{display:flex;gap:8px;align-items:center;flex-wrap:wrap}.form-row *{flex:0 0 auto}\n"], dependencies: [{ kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", 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]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: i3.MatIconButton, selector: "button[mat-icon-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i4.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i5.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i6.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i6.MatLabel, selector: "mat-label" }, { kind: "directive", type: i6.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "directive", type: i7.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }] });
49
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.1", ngImport: i0, type: UserFilterComponent, decorators: [{
50
- type: Component,
51
- args: [{ selector: 'auth-jwt-user-filter', template: "<form [formGroup]=\"form\" (submit)=\"apply()\" ng-disabled=\"disabled\">\n <div class=\"form-row\">\n <mat-form-field>\n <mat-label i18n>name or ID</mat-label>\n <input matInput [formControl]=\"name\" />\n <button\n mat-icon-button\n matSuffix\n type=\"button\"\n (click)=\"reset()\"\n color=\"warn\"\n i18n-matTooltip\n matTooltip=\"Reset filters\"\n [disabled]=\"disabled\"\n >\n <mat-icon>clear</mat-icon>\n </button>\n </mat-form-field>\n\n <button\n style=\"margin-top: -20px\"\n type=\"submit\"\n mat-icon-button\n color=\"primary\"\n [disabled]=\"disabled\"\n i18n-matTooltip\n matTooltip=\"Apply filters\"\n >\n <mat-icon>check_circle</mat-icon>\n </button>\n </div>\n</form>\n", styles: [".form-row{display:flex;gap:8px;align-items:center;flex-wrap:wrap}.form-row *{flex:0 0 auto}\n"] }]
52
- }], ctorParameters: function () { return [{ type: i1.FormBuilder }, { type: i2.UserListRepository }]; }, propDecorators: { disabled: [{
53
- type: Input
54
- }] } });
55
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlci1maWx0ZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbXlybWlkb24vYXV0aC1qd3QtYWRtaW4vc3JjL2xpYi9jb21wb25lbnRzL3VzZXItZmlsdGVyL3VzZXItZmlsdGVyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL215cm1pZG9uL2F1dGgtand0LWFkbWluL3NyYy9saWIvY29tcG9uZW50cy91c2VyLWZpbHRlci91c2VyLWZpbHRlci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBVSxNQUFNLGVBQWUsQ0FBQzs7Ozs7Ozs7O0FBWXpELE1BQU0sT0FBTyxtQkFBbUI7SUFTOUIsWUFDRSxXQUF3QixFQUNoQixXQUErQjtRQUEvQixnQkFBVyxHQUFYLFdBQVcsQ0FBb0I7UUFFdkMsSUFBSSxDQUFDLE9BQU8sR0FBRyxXQUFXLENBQUMsT0FBTyxDQUFDO1FBRW5DLE9BQU87UUFDUCxJQUFJLENBQUMsSUFBSSxHQUFHLFdBQVcsQ0FBQyxPQUFPLENBQWdCLElBQUksQ0FBQyxDQUFDO1FBQ3JELElBQUksQ0FBQyxJQUFJLEdBQUcsV0FBVyxDQUFDLEtBQUssQ0FBQztZQUM1QixJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUk7U0FDaEIsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELFFBQVE7UUFDTixJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFO1lBQzNCLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDckIsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRU8sVUFBVSxDQUFDLE1BQWtCO1FBQ25DLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLENBQUM7UUFDeEMsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztJQUM3QixDQUFDO0lBRU0sS0FBSztRQUNWLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDbEIsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQ2YsQ0FBQztJQUVPLFNBQVM7UUFDZixPQUFPO1lBQ0wsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRTtTQUM5QixDQUFDO0lBQ0osQ0FBQztJQUVNLEtBQUs7UUFDVixJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFO1lBQ3JCLE9BQU87U0FDUjtRQUNELE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUVoQyx5QkFBeUI7UUFDekIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDckMsQ0FBQzs7Z0hBcERVLG1CQUFtQjtvR0FBbkIsbUJBQW1CLDhGQ1poQyxpMEJBZ0NBOzJGRHBCYSxtQkFBbUI7a0JBTC9CLFNBQVM7K0JBQ0Usc0JBQXNCO21JQU16QixRQUFRO3NCQURkLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1CdWlsZGVyLCBGb3JtQ29udHJvbCwgRm9ybUdyb3VwIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xuXG5pbXBvcnQgeyBVc2VyRmlsdGVyIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvYXV0aC1qd3QtYWNjb3VudC5zZXJ2aWNlJztcbmltcG9ydCB7IFVzZXJMaXN0UmVwb3NpdG9yeSB9IGZyb20gJy4uL3N0YXRlL3VzZXItbGlzdC5yZXBvc2l0b3J5JztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXV0aC1qd3QtdXNlci1maWx0ZXInLFxuICB0ZW1wbGF0ZVVybDogJy4vdXNlci1maWx0ZXIuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi91c2VyLWZpbHRlci5jb21wb25lbnQuY3NzJ10sXG59KVxuZXhwb3J0IGNsYXNzIFVzZXJGaWx0ZXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICBASW5wdXQoKVxuICBwdWJsaWMgZGlzYWJsZWQ6IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG5cbiAgcHVibGljIGZpbHRlciQ6IE9ic2VydmFibGU8VXNlckZpbHRlcj47XG5cbiAgcHVibGljIG5hbWU6IEZvcm1Db250cm9sPHN0cmluZyB8IG51bGw+O1xuICBwdWJsaWMgZm9ybTogRm9ybUdyb3VwO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIGZvcm1CdWlsZGVyOiBGb3JtQnVpbGRlcixcbiAgICBwcml2YXRlIF9yZXBvc2l0b3J5OiBVc2VyTGlzdFJlcG9zaXRvcnlcbiAgKSB7XG4gICAgdGhpcy5maWx0ZXIkID0gX3JlcG9zaXRvcnkuZmlsdGVyJDtcblxuICAgIC8vIGZvcm1cbiAgICB0aGlzLm5hbWUgPSBmb3JtQnVpbGRlci5jb250cm9sPHN0cmluZyB8IG51bGw+KG51bGwpO1xuICAgIHRoaXMuZm9ybSA9IGZvcm1CdWlsZGVyLmdyb3VwKHtcbiAgICAgIG5hbWU6IHRoaXMubmFtZSxcbiAgICB9KTtcbiAgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuZmlsdGVyJC5zdWJzY3JpYmUoKGYpID0+IHtcbiAgICAgIHRoaXMudXBkYXRlRm9ybShmKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlRm9ybShmaWx0ZXI6IFVzZXJGaWx0ZXIpOiB2b2lkIHtcbiAgICB0aGlzLm5hbWUuc2V0VmFsdWUoZmlsdGVyLm5hbWUgfHwgbnVsbCk7XG4gICAgdGhpcy5mb3JtLm1hcmtBc1ByaXN0aW5lKCk7XG4gIH1cblxuICBwdWJsaWMgcmVzZXQoKTogdm9pZCB7XG4gICAgdGhpcy5mb3JtLnJlc2V0KCk7XG4gICAgdGhpcy5hcHBseSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRGaWx0ZXIoKTogVXNlckZpbHRlciB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG5hbWU6IHRoaXMubmFtZS52YWx1ZT8udHJpbSgpLFxuICAgIH07XG4gIH1cblxuICBwdWJsaWMgYXBwbHkoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZm9ybS5pbnZhbGlkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGZpbHRlciA9IHRoaXMuZ2V0RmlsdGVyKCk7XG5cbiAgICAvLyB1cGRhdGUgZmlsdGVyIGluIHN0YXRlXG4gICAgdGhpcy5fcmVwb3NpdG9yeS5zZXRGaWx0ZXIoZmlsdGVyKTtcbiAgfVxufVxuIiwiPGZvcm0gW2Zvcm1Hcm91cF09XCJmb3JtXCIgKHN1Ym1pdCk9XCJhcHBseSgpXCIgbmctZGlzYWJsZWQ9XCJkaXNhYmxlZFwiPlxuICA8ZGl2IGNsYXNzPVwiZm9ybS1yb3dcIj5cbiAgICA8bWF0LWZvcm0tZmllbGQ+XG4gICAgICA8bWF0LWxhYmVsIGkxOG4+bmFtZSBvciBJRDwvbWF0LWxhYmVsPlxuICAgICAgPGlucHV0IG1hdElucHV0IFtmb3JtQ29udHJvbF09XCJuYW1lXCIgLz5cbiAgICAgIDxidXR0b25cbiAgICAgICAgbWF0LWljb24tYnV0dG9uXG4gICAgICAgIG1hdFN1ZmZpeFxuICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgKGNsaWNrKT1cInJlc2V0KClcIlxuICAgICAgICBjb2xvcj1cIndhcm5cIlxuICAgICAgICBpMThuLW1hdFRvb2x0aXBcbiAgICAgICAgbWF0VG9vbHRpcD1cIlJlc2V0IGZpbHRlcnNcIlxuICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgICAgPlxuICAgICAgICA8bWF0LWljb24+Y2xlYXI8L21hdC1pY29uPlxuICAgICAgPC9idXR0b24+XG4gICAgPC9tYXQtZm9ybS1maWVsZD5cblxuICAgIDxidXR0b25cbiAgICAgIHN0eWxlPVwibWFyZ2luLXRvcDogLTIwcHhcIlxuICAgICAgdHlwZT1cInN1Ym1pdFwiXG4gICAgICBtYXQtaWNvbi1idXR0b25cbiAgICAgIGNvbG9yPVwicHJpbWFyeVwiXG4gICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgICAgaTE4bi1tYXRUb29sdGlwXG4gICAgICBtYXRUb29sdGlwPVwiQXBwbHkgZmlsdGVyc1wiXG4gICAgPlxuICAgICAgPG1hdC1pY29uPmNoZWNrX2NpcmNsZTwvbWF0LWljb24+XG4gICAgPC9idXR0b24+XG4gIDwvZGl2PlxuPC9mb3JtPlxuIl19
@@ -1,181 +0,0 @@
1
- import { Injectable } from '@angular/core';
2
- import { HttpParams } from '@angular/common/http';
3
- import { retry, catchError } from 'rxjs/operators';
4
- import * as i0 from "@angular/core";
5
- import * as i1 from "@angular/common/http";
6
- import * as i2 from "@myrmidon/ng-tools";
7
- export class AuthJwtAccountService {
8
- constructor(_http, _error, _env) {
9
- this._http = _http;
10
- this._error = _error;
11
- this._env = _env;
12
- }
13
- /**
14
- * Checks if the specified email address is registered on the server.
15
- * @param email email address to test.
16
- * @returns result.
17
- */
18
- isEmailRegistered(email) {
19
- return this._http.get(this._env.get('apiUrl') +
20
- 'accounts/emailexists/' +
21
- encodeURIComponent(email));
22
- }
23
- /**
24
- * Checks if the specified user's given name is registered on the server.
25
- * This name is a nickname chosen by users during registration, and is the key
26
- * used for referencing users when talking to the server.
27
- * @param name name to test.
28
- * @returns result.
29
- */
30
- isNameRegistered(name) {
31
- return this._http.get(this._env.get('apiUrl') +
32
- 'accounts/nameexists/' +
33
- encodeURIComponent(name));
34
- }
35
- /**
36
- * Register the user with the specified registration data.
37
- * @param registration The registration data.
38
- * @param confirmed True to automatically confirm the user's email address
39
- * without sending the confirmation email message.
40
- */
41
- register(registration, confirmed = false) {
42
- return this._http.post(this._env.get('apiUrl') +
43
- 'accounts/register' +
44
- (confirmed ? '?confirmed=true' : ''), registration);
45
- }
46
- /**
47
- * Resend the confirmation email to the specified address.
48
- * @param email address.
49
- */
50
- resendConfirmEmail(email) {
51
- return this._http.get(this._env.get('apiUrl') +
52
- 'accounts/resendconfirm/' +
53
- encodeURIComponent(email)
54
- // options
55
- );
56
- }
57
- /**
58
- * Request a password reset for the specified email address.
59
- * @param email Email address.
60
- */
61
- requestPasswordReset(email) {
62
- return this._http.post(this._env.get('apiUrl') + 'accounts/resetpassword/request', { email });
63
- }
64
- getAllUsers() {
65
- return this._http
66
- .get(this._env.get('apiUrl') + 'users', {
67
- params: new HttpParams().set('pageNumber', '1'),
68
- })
69
- .pipe(retry(3), catchError(this._error.handleError));
70
- }
71
- getUsers(filter, pageNumber = 1, pageSize = 20) {
72
- let httpParams = new HttpParams();
73
- httpParams = httpParams.set('pageNumber', pageNumber.toString());
74
- httpParams = httpParams.set('pageSize', pageSize.toString());
75
- if (filter.name) {
76
- httpParams = httpParams.set('name', filter.name);
77
- }
78
- return this._http
79
- .get(this._env.get('apiUrl') + 'users', {
80
- params: httpParams,
81
- })
82
- .pipe(retry(3), catchError(this._error.handleError));
83
- }
84
- /**
85
- * Get the top N users matching the specified name filter.
86
- * @param nameFilter The user name filter.
87
- * @param limit The maximum number of users to get.
88
- */
89
- getTopUsers(nameFilter, limit = 10) {
90
- let httpParams = new HttpParams();
91
- httpParams = httpParams.set('pageNumber', '1');
92
- httpParams = httpParams.set('pageSize', limit.toString());
93
- if (nameFilter) {
94
- httpParams = httpParams.set('name', nameFilter);
95
- }
96
- const options = httpParams.keys().length > 0
97
- ? {
98
- params: httpParams,
99
- }
100
- : {};
101
- return this._http
102
- .get(this._env.get('apiUrl') + 'users', options)
103
- .pipe(retry(3), catchError(this._error.handleError));
104
- }
105
- /**
106
- * Get information about all the users listed in the specified names.
107
- * @param names User(s) names.
108
- */
109
- getUsersFromNames(names) {
110
- let httpParams = new HttpParams();
111
- if (names && names.length > 0) {
112
- httpParams = httpParams.set('names', names.join(','));
113
- }
114
- const options = httpParams.keys().length > 0
115
- ? {
116
- params: httpParams,
117
- }
118
- : {};
119
- return this._http
120
- .get(this._env.get('apiUrl') + 'users-from-names', options)
121
- .pipe(retry(3), catchError(this._error.handleError));
122
- }
123
- /**
124
- * Get data about the specified user.
125
- * @param name The user name.
126
- */
127
- getUser(name) {
128
- return this._http
129
- .get(this._env.get('apiUrl') + 'users/' + name)
130
- .pipe(retry(3), catchError(this._error.handleError));
131
- }
132
- /**
133
- * Update the editable data for the specified user.
134
- * @param user The user to update.
135
- */
136
- updateUser(user) {
137
- return this._http
138
- .put(this._env.get('apiUrl') +
139
- 'users' +
140
- (user.emailConfirmed ? '?confirmed=true' : ''), user)
141
- .pipe(catchError(this._error.handleError));
142
- }
143
- /**
144
- * Request a password reset email for the specified email address.
145
- * @param email The email address to receive the reset message.
146
- */
147
- resetPassword(email) {
148
- return this._http
149
- .post(this._env.get('apiUrl') + 'accounts/resetpassword/request', {
150
- email: email,
151
- })
152
- .pipe(catchError(this._error.handleError));
153
- }
154
- /**
155
- * Change the password.
156
- * @param change The password change data.
157
- */
158
- changePassword(change) {
159
- return this._http
160
- .post(this._env.get('apiUrl') + 'accounts/changepassword', change)
161
- .pipe(catchError(this._error.handleError));
162
- }
163
- /**
164
- * Delete the user with the specified username.
165
- * @param name The user name.
166
- */
167
- deleteUser(name) {
168
- return this._http
169
- .delete(this._env.get('apiUrl') + 'accounts/' + name)
170
- .pipe(catchError(this._error.handleError));
171
- }
172
- }
173
- AuthJwtAccountService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.1", ngImport: i0, type: AuthJwtAccountService, deps: [{ token: i1.HttpClient }, { token: i2.ErrorService }, { token: i2.EnvService }], target: i0.ɵɵFactoryTarget.Injectable });
174
- AuthJwtAccountService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.1", ngImport: i0, type: AuthJwtAccountService, providedIn: 'root' });
175
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.1", ngImport: i0, type: AuthJwtAccountService, decorators: [{
176
- type: Injectable,
177
- args: [{
178
- providedIn: 'root',
179
- }]
180
- }], ctorParameters: function () { return [{ type: i1.HttpClient }, { type: i2.ErrorService }, { type: i2.EnvService }]; } });
181
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aC1qd3QtYWNjb3VudC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbXlybWlkb24vYXV0aC1qd3QtYWRtaW4vc3JjL2xpYi9zZXJ2aWNlcy9hdXRoLWp3dC1hY2NvdW50LnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQWMsVUFBVSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFFOUQsT0FBTyxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7OztBQTRDbkQsTUFBTSxPQUFPLHFCQUFxQjtJQUNoQyxZQUNVLEtBQWlCLEVBQ2pCLE1BQW9CLEVBQ3BCLElBQWdCO1FBRmhCLFVBQUssR0FBTCxLQUFLLENBQVk7UUFDakIsV0FBTSxHQUFOLE1BQU0sQ0FBYztRQUNwQixTQUFJLEdBQUosSUFBSSxDQUFZO0lBQ3ZCLENBQUM7SUFFSjs7OztPQUlHO0lBQ0ksaUJBQWlCLENBQUMsS0FBYTtRQUNwQyxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUNuQixJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUM7WUFDckIsdUJBQXVCO1lBQ3ZCLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxDQUM1QixDQUFDO0lBQ0osQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNJLGdCQUFnQixDQUFDLElBQVk7UUFDbEMsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FDbkIsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDO1lBQ3JCLHNCQUFzQjtZQUN0QixrQkFBa0IsQ0FBQyxJQUFJLENBQUMsQ0FDM0IsQ0FBQztJQUNKLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNJLFFBQVEsQ0FDYixZQUErQixFQUMvQixTQUFTLEdB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Q0FBQyxDQUFDO0lBQy9DLENBQUM7SUFFRDs7O09BR0c7SUFDSSxVQUFVLENBQUMsSUFBWTtRQUM1QixPQUFPLElBQUksQ0FBQyxLQUFLO2FBQ2QsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxHQUFHLFdBQVcsR0FBRyxJQUFJLENBQUM7YUFDcEQsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUM7SUFDL0MsQ0FBQzs7a0hBM01VLHFCQUFxQjtzSEFBckIscUJBQXFCLGNBRnBCLE1BQU07MkZBRVAscUJBQXFCO2tCQUhqQyxVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEh0dHBDbGllbnQsIEh0dHBQYXJhbXMgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyByZXRyeSwgY2F0Y2hFcnJvciB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW1wb3J0IHsgRGF0YVBhZ2UsIEVudlNlcnZpY2UsIEVycm9yU2VydmljZSB9IGZyb20gJ0BteXJtaWRvbi9uZy10b29scyc7XG5pbXBvcnQgeyBVc2VyIH0gZnJvbSAnQG15cm1pZG9uL2F1dGgtand0LWxvZ2luJztcblxuLyoqXG4gKiBVc2VyIHJlZ2lzdHJhdGlvbiBtb2RlbC4gWW91IGNhbiBleHBhbmQgdGhpcyBpbnRlcmZhY2UgdG8gYWRkIG1vcmUgZGF0YS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZWdpc3RyYXRpb25Nb2RlbCB7XG4gIGVtYWlsOiBzdHJpbmc7XG4gIG5hbWU6IHN0cmluZztcbiAgZmlyc3ROYW1lPzogc3RyaW5nO1xuICBsYXN0TmFtZT86IHN0cmluZztcbiAgcGFzc3dvcmQ6IHN0cmluZztcbn1cblxuLyoqXG4gKiBSZXN1bHQgb2YgYW4gZXhpc3RpbmcgcmVzb3VyY2UgY2hlY2suXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRXhpc3RSZXN1bHQge1xuICBlbnRyeTogc3RyaW5nO1xuICBpc0V4aXN0aW5nOiBib29sZWFuO1xufVxuXG4vKipcbiAqIFBhc3N3b3JkIGNoYW5nZSBkYXRhLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBhc3N3b3JkQ2hhbmdlIHtcbiAgZW1haWw6IHN0cmluZztcbiAgb2xkUGFzc3dvcmQ6IHN0cmluZztcbiAgbmV3UGFzc3dvcmQ6IHN0cmluZztcbiAgY29uZmlybVBhc3N3b3JkOiBzdHJpbmc7XG59XG5cbi8qKlxuICogVXNlciBmaWx0ZXIgcGFyYW1ldGVycy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBVc2VyRmlsdGVyIHtcbiAgbmFtZT86IHN0cmluZztcbn1cblxuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCcsXG59KVxuZXhwb3J0IGNsYXNzIEF1dGhKd3RBY2NvdW50U2VydmljZSB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgX2h0dHA6IEh0dHBDbGllbnQsXG4gICAgcHJpdmF0ZSBfZXJyb3I6IEVycm9yU2VydmljZSxcbiAgICBwcml2YXRlIF9lbnY6IEVudlNlcnZpY2VcbiAgKSB7fVxuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgdGhlIHNwZWNpZmllZCBlbWFpbCBhZGRyZXNzIGlzIHJlZ2lzdGVyZWQgb24gdGhlIHNlcnZlci5cbiAgICogQHBhcmFtIGVtYWlsIGVtYWlsIGFkZHJlc3MgdG8gdGVzdC5cbiAgICogQHJldHVybnMgcmVzdWx0LlxuICAgKi9cbiAgcHVibGljIGlzRW1haWxSZWdpc3RlcmVkKGVtYWlsOiBzdHJpbmcpOiBPYnNlcnZhYmxlPEV4aXN0UmVzdWx0PiB7XG4gICAgcmV0dXJuIHRoaXMuX2h0dHAuZ2V0PEV4aXN0UmVzdWx0PihcbiAgICAgIHRoaXMuX2Vudi5nZXQoJ2FwaVVybCcpICtcbiAgICAgICAgJ2FjY291bnRzL2VtYWlsZXhpc3RzLycgK1xuICAgICAgICBlbmNvZGVVUklDb21wb25lbnQoZW1haWwpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgdGhlIHNwZWNpZmllZCB1c2VyJ3MgZ2l2ZW4gbmFtZSBpcyByZWdpc3RlcmVkIG9uIHRoZSBzZXJ2ZXIuXG4gICAqIFRoaXMgbmFtZSBpcyBhIG5pY2tuYW1lIGNob3NlbiBieSB1c2VycyBkdXJpbmcgcmVnaXN0cmF0aW9uLCBhbmQgaXMgdGhlIGtleVxuICAgKiB1c2VkIGZvciByZWZlcmVuY2luZyB1c2VycyB3aGVuIHRhbGtpbmcgdG8gdGhlIHNlcnZlci5cbiAgICogQHBhcmFtIG5hbWUgbmFtZSB0byB0ZXN0LlxuICAgKiBAcmV0dXJucyByZXN1bHQuXG4gICAqL1xuICBwdWJsaWMgaXNOYW1lUmVnaXN0ZXJlZChuYW1lOiBzdHJpbmcpOiBPYnNlcnZhYmxlPEV4aXN0UmVzdWx0PiB7XG4gICAgcmV0dXJuIHRoaXMuX2h0dHAuZ2V0PEV4aXN0UmVzdWx0PihcbiAgICAgIHRoaXMuX2Vudi5nZXQoJ2FwaVVybCcpICtcbiAgICAgICAgJ2FjY291bnRzL25hbWVleGlzdHMvJyArXG4gICAgICAgIGVuY29kZVVSSUNvbXBvbmVudChuYW1lKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXIgdGhlIHVzZXIgd2l0aCB0aGUgc3BlY2lmaWVkIHJlZ2lzdHJhdGlvbiBkYXRhLlxuICAgKiBAcGFyYW0gcmVnaXN0cmF0aW9uIFRoZSByZWdpc3RyYXRpb24gZGF0YS5cbiAgICogQHBhcmFtIGNvbmZpcm1lZCBUcnVlIHRvIGF1dG9tYXRpY2FsbHkgY29uZmlybSB0aGUgdXNlcidzIGVtYWlsIGFkZHJlc3NcbiAgICogd2l0aG91dCBzZW5kaW5nIHRoZSBjb25maXJtYXRpb24gZW1haWwgbWVzc2FnZS5cbiAgICovXG4gIHB1YmxpYyByZWdpc3RlcihcbiAgICByZWdpc3RyYXRpb246IFJlZ2lzdHJhdGlvbk1vZGVsLFxuICAgIGNvbmZpcm1lZCA9IGZhbHNlXG4gICk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgcmV0dXJuIHRoaXMuX2h0dHAucG9zdChcbiAgICAgIHRoaXMuX2Vudi5nZXQoJ2FwaVVybCcpICtcbiAgICAgICAgJ2FjY291bnRzL3JlZ2lzdGVyJyArXG4gICAgICAgIChjb25maXJtZWQgPyAnP2NvbmZpcm1lZD10cnVlJyA6ICcnKSxcbiAgICAgIHJlZ2lzdHJhdGlvblxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogUmVzZW5kIHRoZSBjb25maXJtYXRpb24gZW1haWwgdG8gdGhlIHNwZWNpZmllZCBhZGRyZXNzLlxuICAgKiBAcGFyYW0gZW1haWwgYWRkcmVzcy5cbiAgICovXG4gIHB1YmxpYyByZXNlbmRDb25maXJtRW1haWwoZW1haWw6IHN0cmluZyk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgcmV0dXJuIHRoaXMuX2h0dHAuZ2V0KFxuICAgICAgdGhpcy5fZW52LmdldCgnYXBpVXJsJykgK1xuICAgICAgICAnYWNjb3VudHMvcmVzZW5kY29uZmlybS8nICtcbiAgICAgICAgZW5jb2RlVVJJQ29tcG9uZW50KGVtYWlsKVxuICAgICAgLy8gb3B0aW9uc1xuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogUmVxdWVzdCBhIHBhc3N3b3JkIHJlc2V0IGZvciB0aGUgc3BlY2lmaWVkIGVtYWlsIGFkZHJlc3MuXG4gICAqIEBwYXJhbSBlbWFpbCBFbWFpbCBhZGRyZXNzLlxuICAgKi9cbiAgcHVibGljIHJlcXVlc3RQYXNzd29yZFJlc2V0KGVtYWlsOiBzdHJpbmcpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIHJldHVybiB0aGlzLl9odHRwLnBvc3QoXG4gICAgICB0aGlzLl9lbnYuZ2V0KCdhcGlVcmwnKSArICdhY2NvdW50cy9yZXNldHBhc3N3b3JkL3JlcXVlc3QnLFxuICAgICAgeyBlbWFpbCB9XG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRBbGxVc2VycygpOiBPYnNlcnZhYmxlPERhdGFQYWdlPFVzZXI+PiB7XG4gICAgcmV0dXJuIHRoaXMuX2h0dHBcbiAgICAgIC5nZXQ8RGF0YVBhZ2U8VXNlcj4+KHRoaXMuX2Vudi5nZXQoJ2FwaVVybCcpICsgJ3VzZXJzJywge1xuICAgICAgICBwYXJhbXM6IG5ldyBIdHRwUGFyYW1zKCkuc2V0KCdwYWdlTnVtYmVyJywgJzEnKSxcbiAgICAgIH0pXG4gICAgICAucGlwZShyZXRyeSgzKSwgY2F0Y2hFcnJvcih0aGlzLl9lcnJvci5oYW5kbGVFcnJvcikpO1xuICB9XG5cbiAgcHVibGljIGdldFVzZXJzKFxuICAgIGZpbHRlcjogVXNlckZpbHRlcixcbiAgICBwYWdlTnVtYmVyID0gMSxcbiAgICBwYWdlU2l6ZSA9IDIwXG4gICk6IE9ic2VydmFibGU8RGF0YVBhZ2U8VXNlcj4+IHtcbiAgICBsZXQgaHR0cFBhcmFtcyA9IG5ldyBIdHRwUGFyYW1zKCk7XG4gICAgaHR0cFBhcmFtcyA9IGh0dHBQYXJhbXMuc2V0KCdwYWdlTnVtYmVyJywgcGFnZU51bWJlci50b1N0cmluZygpKTtcbiAgICBodHRwUGFyYW1zID0gaHR0cFBhcmFtcy5zZXQoJ3BhZ2VTaXplJywgcGFnZVNpemUudG9TdHJpbmcoKSk7XG4gICAgaWYgKGZpbHRlci5uYW1lKSB7XG4gICAgICBodHRwUGFyYW1zID0gaHR0cFBhcmFtcy5zZXQoJ25hbWUnLCBmaWx0ZXIubmFtZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuX2h0dHBcbiAgICAgIC5nZXQ8RGF0YVBhZ2U8VXNlcj4+KHRoaXMuX2Vudi5nZXQoJ2FwaVVybCcpICsgJ3VzZXJzJywge1xuICAgICAgICBwYXJhbXM6IGh0dHBQYXJhbXMsXG4gICAgICB9KVxuICAgICAgLnBpcGUocmV0cnkoMyksIGNhdGNoRXJyb3IodGhpcy5fZXJyb3IuaGFuZGxlRXJyb3IpKTtcbiAgfVxuICAvKipcbiAgICogR2V0IHRoZSB0b3AgTiB1c2VycyBtYXRjaGluZyB0aGUgc3BlY2lmaWVkIG5hbWUgZmlsdGVyLlxuICAgKiBAcGFyYW0gbmFtZUZpbHRlciBUaGUgdXNlciBuYW1lIGZpbHRlci5cbiAgICogQHBhcmFtIGxpbWl0IFRoZSBtYXhpbXVtIG51bWJlciBvZiB1c2VycyB0byBnZXQuXG4gICAqL1xuICBwdWJsaWMgZ2V0VG9wVXNlcnMobmFtZUZpbHRlcjogc3RyaW5nLCBsaW1pdCA9IDEwKTogT2JzZXJ2YWJsZTxVc2VyW10+IHtcbiAgICBsZXQgaHR0cFBhcmFtcyA9IG5ldyBIdHRwUGFyYW1zKCk7XG4gICAgaHR0cFBhcmFtcyA9IGh0dHBQYXJhbXMuc2V0KCdwYWdlTnVtYmVyJywgJzEnKTtcbiAgICBodHRwUGFyYW1zID0gaHR0cFBhcmFtcy5zZXQoJ3BhZ2VTaXplJywgbGltaXQudG9TdHJpbmcoKSk7XG4gICAgaWYgKG5hbWVGaWx0ZXIpIHtcbiAgICAgIGh0dHBQYXJhbXMgPSBodHRwUGFyYW1zLnNldCgnbmFtZScsIG5hbWVGaWx0ZXIpO1xuICAgIH1cbiAgICBjb25zdCBvcHRpb25zID1cbiAgICAgIGh0dHBQYXJhbXMua2V5cygpLmxlbmd0aCA+IDBcbiAgICAgICAgPyB7XG4gICAgICAgICAgICBwYXJhbXM6IGh0dHBQYXJhbXMsXG4gICAgICAgICAgfVxuICAgICAgICA6IHt9O1xuXG4gICAgcmV0dXJuIHRoaXMuX2h0dHBcbiAgICAgIC5nZXQ8VXNlcltdPih0aGlzLl9lbnYuZ2V0KCdhcGlVcmwnKSArICd1c2VycycsIG9wdGlvbnMpXG4gICAgICAucGlwZShyZXRyeSgzKSwgY2F0Y2hFcnJvcih0aGlzLl9lcnJvci5oYW5kbGVFcnJvcikpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBpbmZvcm1hdGlvbiBhYm91dCBhbGwgdGhlIHVzZXJzIGxpc3RlZCBpbiB0aGUgc3BlY2lmaWVkIG5hbWVzLlxuICAgKiBAcGFyYW0gbmFtZXMgVXNlcihzKSBuYW1lcy5cbiAgICovXG4gIHB1YmxpYyBnZXRVc2Vyc0Zyb21OYW1lcyhuYW1lczogc3RyaW5nW10pOiBPYnNlcnZhYmxlPFVzZXJbXT4ge1xuICAgIGxldCBodHRwUGFyYW1zID0gbmV3IEh0dHBQYXJhbXMoKTtcbiAgICBpZiAobmFtZXMgJiYgbmFtZXMubGVuZ3RoID4gMCkge1xuICAgICAgaHR0cFBhcmFtcyA9IGh0dHBQYXJhbXMuc2V0KCduYW1lcycsIG5hbWVzLmpvaW4oJywnKSk7XG4gICAgfVxuICAgIGNvbnN0IG9wdGlvbnMgPVxuICAgICAgaHR0cFBhcmFtcy5rZXlzKCkubGVuZ3RoID4gMFxuICAgICAgICA/IHtcbiAgICAgICAgICAgIHBhcmFtczogaHR0cFBhcmFtcyxcbiAgICAgICAgICB9XG4gICAgICAgIDoge307XG5cbiAgICByZXR1cm4gdGhpcy5faHR0cFxuICAgICAgLmdldDxVc2VyW10+KHRoaXMuX2Vudi5nZXQoJ2FwaVVybCcpICsgJ3VzZXJzLWZyb20tbmFtZXMnLCBvcHRpb25zKVxuICAgICAgLnBpcGUocmV0cnkoMyksIGNhdGNoRXJyb3IodGhpcy5fZXJyb3IuaGFuZGxlRXJyb3IpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgZGF0YSBhYm91dCB0aGUgc3BlY2lmaWVkIHVzZXIuXG4gICAqIEBwYXJhbSBuYW1lIFRoZSB1c2VyIG5hbWUuXG4gICAqL1xuICBwdWJsaWMgZ2V0VXNlcihuYW1lOiBzdHJpbmcpOiBPYnNlcnZhYmxlPFVzZXI+IHtcbiAgICByZXR1cm4gdGhpcy5faHR0cFxuICAgICAgLmdldDxVc2VyPih0aGlzLl9lbnYuZ2V0KCdhcGlVcmwnKSArICd1c2Vycy8nICsgbmFtZSlcbiAgICAgIC5waXBlKHJldHJ5KDMpLCBjYXRjaEVycm9yKHRoaXMuX2Vycm9yLmhhbmRsZUVycm9yKSk7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlIHRoZSBlZGl0YWJsZSBkYXRhIGZvciB0aGUgc3BlY2lmaWVkIHVzZXIuXG4gICAqIEBwYXJhbSB1c2VyIFRoZSB1c2VyIHRvIHVwZGF0ZS5cbiAgICovXG4gIHB1YmxpYyB1cGRhdGVVc2VyKHVzZXI6IFVzZXIpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIHJldHVybiB0aGlzLl9odHRwXG4gICAgICAucHV0KFxuICAgICAgICB0aGlzLl9lbnYuZ2V0KCdhcGlVcmwnKSArXG4gICAgICAgICAgJ3VzZXJzJyArXG4gICAgICAgICAgKHVzZXIuZW1haWxDb25maXJtZWQgPyAnP2NvbmZpcm1lZD10cnVlJyA6ICcnKSxcbiAgICAgICAgdXNlclxuICAgICAgKVxuICAgICAgLnBpcGUoY2F0Y2hFcnJvcih0aGlzLl9lcnJvci5oYW5kbGVFcnJvcikpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlcXVlc3QgYSBwYXNzd29yZCByZXNldCBlbWFpbCBmb3IgdGhlIHNwZWNpZmllZCBlbWFpbCBhZGRyZXNzLlxuICAgKiBAcGFyYW0gZW1haWwgVGhlIGVtYWlsIGFkZHJlc3MgdG8gcmVjZWl2ZSB0aGUgcmVzZXQgbWVzc2FnZS5cbiAgICovXG4gIHB1YmxpYyByZXNldFBhc3N3b3JkKGVtYWlsOiBzdHJpbmcpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIHJldHVybiB0aGlzLl9odHRwXG4gICAgICAucG9zdCh0aGlzLl9lbnYuZ2V0KCdhcGlVcmwnKSArICdhY2NvdW50cy9yZXNldHBhc3N3b3JkL3JlcXVlc3QnLCB7XG4gICAgICAgIGVtYWlsOiBlbWFpbCxcbiAgICAgIH0pXG4gICAgICAucGlwZShjYXRjaEVycm9yKHRoaXMuX2Vycm9yLmhhbmRsZUVycm9yKSk7XG4gIH1cblxuICAvKipcbiAgICogQ2hhbmdlIHRoZSBwYXNzd29yZC5cbiAgICogQHBhcmFtIGNoYW5nZSBUaGUgcGFzc3dvcmQgY2hhbmdlIGRhdGEuXG4gICAqL1xuICBwdWJsaWMgY2hhbmdlUGFzc3dvcmQoY2hhbmdlOiBQYXNzd29yZENoYW5nZSk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgcmV0dXJuIHRoaXMuX2h0dHBcbiAgICAgIC5wb3N0KHRoaXMuX2Vudi5nZXQoJ2FwaVVybCcpICsgJ2FjY291bnRzL2NoYW5nZXBhc3N3b3JkJywgY2hhbmdlKVxuICAgICAgLnBpcGUoY2F0Y2hFcnJvcih0aGlzLl9lcnJvci5oYW5kbGVFcnJvcikpO1xuICB9XG5cbiAgLyoqXG4gICAqIERlbGV0ZSB0aGUgdXNlciB3aXRoIHRoZSBzcGVjaWZpZWQgdXNlcm5hbWUuXG4gICAqIEBwYXJhbSBuYW1lIFRoZSB1c2VyIG5hbWUuXG4gICAqL1xuICBwdWJsaWMgZGVsZXRlVXNlcihuYW1lOiBzdHJpbmcpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIHJldHVybiB0aGlzLl9odHRwXG4gICAgICAuZGVsZXRlKHRoaXMuX2Vudi5nZXQoJ2FwaVVybCcpICsgJ2FjY291bnRzLycgKyBuYW1lKVxuICAgICAgLnBpcGUoY2F0Y2hFcnJvcih0aGlzLl9lcnJvci5oYW5kbGVFcnJvcikpO1xuICB9XG59XG4iXX0=