@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.
- package/esm2022/lib/auth-jwt-admin.module.mjs +120 -0
- package/esm2022/lib/components/auth-jwt-registration/auth-jwt-registration.component.mjs +165 -0
- package/esm2022/lib/components/confirm-dialog/confirm-dialog.component.mjs +30 -0
- package/esm2022/lib/components/password-strength-bar/password-strength-bar.component.mjs +81 -0
- package/esm2022/lib/components/state/user-list.repository.mjs +145 -0
- package/esm2022/lib/components/user-editor/user-editor.component.mjs +113 -0
- package/esm2022/lib/components/user-filter/user-filter.component.mjs +56 -0
- package/{esm2020 → esm2022}/lib/components/user-list/user-list.component.mjs +71 -70
- package/esm2022/lib/services/auth-jwt-account.service.mjs +182 -0
- package/esm2022/lib/services/dialog.service.mjs +38 -0
- package/{esm2020 → esm2022}/lib/validators/password.validators.mjs +48 -48
- package/{esm2020 → esm2022}/myrmidon-auth-jwt-admin.mjs +4 -4
- package/{esm2020 → esm2022}/public-api.mjs +11 -11
- package/{fesm2020 → fesm2022}/myrmidon-auth-jwt-admin.mjs +919 -919
- package/{fesm2020 → fesm2022}/myrmidon-auth-jwt-admin.mjs.map +1 -1
- package/index.d.ts +5 -5
- package/lib/auth-jwt-admin.module.d.ts +30 -30
- package/lib/components/auth-jwt-registration/auth-jwt-registration.component.d.ts +37 -37
- package/lib/components/confirm-dialog/confirm-dialog.component.d.ts +15 -15
- package/lib/components/password-strength-bar/password-strength-bar.component.d.ts +17 -17
- package/lib/components/state/user-list.repository.d.ts +36 -36
- package/lib/components/user-editor/user-editor.component.d.ts +29 -29
- package/lib/components/user-filter/user-filter.component.d.ts +21 -21
- package/lib/components/user-list/user-list.component.d.ts +29 -29
- package/lib/services/auth-jwt-account.service.d.ts +114 -114
- package/lib/services/dialog.service.d.ts +19 -19
- package/lib/validators/password.validators.d.ts +6 -6
- package/package.json +24 -17
- package/public-api.d.ts +8 -8
- package/esm2020/lib/auth-jwt-admin.module.mjs +0 -119
- package/esm2020/lib/components/auth-jwt-registration/auth-jwt-registration.component.mjs +0 -164
- package/esm2020/lib/components/confirm-dialog/confirm-dialog.component.mjs +0 -29
- package/esm2020/lib/components/password-strength-bar/password-strength-bar.component.mjs +0 -80
- package/esm2020/lib/components/state/user-list.repository.mjs +0 -144
- package/esm2020/lib/components/user-editor/user-editor.component.mjs +0 -112
- package/esm2020/lib/components/user-filter/user-filter.component.mjs +0 -55
- package/esm2020/lib/services/auth-jwt-account.service.mjs +0 -181
- package/esm2020/lib/services/dialog.service.mjs +0 -37
- package/fesm2015/myrmidon-auth-jwt-admin.mjs +0 -998
- 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=
|