@cleavelandprice/ngx-lib 4.4.11 → 4.4.13
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/README.md +5 -5
- package/active-directory/material/components/user-chooser/user-chooser.component.d.ts +18 -18
- package/active-directory/material/components/user-form-field/user-form-field.component.d.ts +1 -1
- package/esm2022/active-directory/active-directory.api.mjs +11 -0
- package/esm2022/active-directory/active-directory.module.mjs +40 -0
- package/esm2022/active-directory/cleavelandprice-ngx-lib-active-directory.mjs +5 -0
- package/esm2022/active-directory/material/cleavelandprice-ngx-lib-active-directory-material.mjs +5 -0
- package/esm2022/active-directory/material/components/user-chooser/user-chooser.component.mjs +437 -0
- package/esm2022/active-directory/material/components/user-form-field/user-form-field.component.mjs +159 -0
- package/esm2022/active-directory/material/mat-active-directory.api.mjs +11 -0
- package/esm2022/active-directory/material/mat-active-directory.module.mjs +100 -0
- package/esm2022/active-directory/material/model/default-user-chooser-data.mjs +15 -0
- package/esm2022/active-directory/material/model/default-user-chooser-filter-options.mjs +8 -0
- package/esm2022/active-directory/material/model/selectable-group.mjs +2 -0
- package/esm2022/active-directory/material/model/selectable-user.mjs +2 -0
- package/esm2022/active-directory/material/model/user-chooser-data.mjs +2 -0
- package/esm2022/active-directory/material/model/user-chooser-filter-options.mjs +3 -0
- package/esm2022/active-directory/material/model/user-chooser-mode.mjs +6 -0
- package/esm2022/active-directory/material/model/user-chooser-pre-processing-group.mjs +3 -0
- package/esm2022/active-directory/model/active-directory-service-options-token.mjs +3 -0
- package/esm2022/active-directory/model/active-directory-service-options.mjs +2 -0
- package/esm2022/active-directory/model/ad-object-with-children.mjs +2 -0
- package/esm2022/active-directory/model/ad-object.mjs +2 -0
- package/esm2022/active-directory/model/cache-object.mjs +3 -0
- package/esm2022/active-directory/model/cleaveland-price-user.mjs +2 -0
- package/esm2022/active-directory/model/group.mjs +2 -0
- package/esm2022/active-directory/model/user-or-group.mjs +2 -0
- package/esm2022/active-directory/model/user.mjs +2 -0
- package/esm2022/active-directory/services/active-directory.service.mjs +131 -0
- package/esm2022/authentication/authentication.api.mjs +7 -0
- package/esm2022/authentication/authentication.base.module.mjs +40 -0
- package/esm2022/authentication/cleavelandprice-ngx-lib-authentication.mjs +5 -0
- package/esm2022/authentication/material/cleavelandprice-ngx-lib-authentication-material.mjs +5 -0
- package/esm2022/authentication/material/components/login/login.component.mjs +49 -0
- package/esm2022/authentication/material/components/login-form/login-form.component.mjs +82 -0
- package/esm2022/authentication/material/mat-authentication.api.mjs +8 -0
- package/esm2022/authentication/material/mat-authentication.module.mjs +84 -0
- package/esm2022/authentication/material/model/login-form-data.mjs +2 -0
- package/esm2022/authentication/material/model/mat-authentication-service-options-token.mjs +3 -0
- package/esm2022/authentication/material/model/mat-authentication-service-options.mjs +2 -0
- package/esm2022/authentication/material/services/mat-authentication.service.mjs +67 -0
- package/esm2022/authentication/model/abstract-authentication-service.mjs +2 -0
- package/esm2022/authentication/model/authenticated-user.mjs +2 -0
- package/esm2022/authentication/model/authentication-request.mjs +2 -0
- package/esm2022/authentication/model/authentication-service-options-token.mjs +3 -0
- package/esm2022/authentication/model/authentication-service-options.mjs +2 -0
- package/esm2022/authentication/object/authentication-object.api.mjs +6 -0
- package/esm2022/authentication/object/authentication-object.module.mjs +40 -0
- package/esm2022/authentication/object/cleavelandprice-ngx-lib-authentication-object.mjs +5 -0
- package/esm2022/authentication/object/services/authentication-object.service.mjs +129 -0
- package/esm2022/authentication/token/authentication-token.api.mjs +6 -0
- package/esm2022/authentication/token/authetiction-token.module.mjs +40 -0
- package/esm2022/authentication/token/cleavelandprice-ngx-lib-authentication-token.mjs +5 -0
- package/esm2022/authentication/token/model/authentication-token-service-options-token.mjs +3 -0
- package/esm2022/authentication/token/model/authentication-token-service-options.mjs +2 -0
- package/esm2022/authentication/token/model/authentication-token.mjs +2 -0
- package/esm2022/authentication/token/services/authentication-token.service.mjs +138 -0
- package/esm2022/cleavelandprice-ngx-lib.mjs +5 -0
- package/esm2022/dialog/cleavelandprice-ngx-lib-dialog.mjs +5 -0
- package/esm2022/dialog/components/base/base.component.mjs +102 -0
- package/esm2022/dialog/components/choice/choice.component.mjs +21 -0
- package/esm2022/dialog/components/confirmation/confirmation.component.mjs +21 -0
- package/esm2022/dialog/components/input/input.component.mjs +21 -0
- package/esm2022/dialog/components/message/message.component.mjs +21 -0
- package/esm2022/dialog/dialog.api.mjs +20 -0
- package/esm2022/dialog/dialog.module.mjs +73 -0
- package/esm2022/dialog/model/confirmation-dialog-mode.mjs +8 -0
- package/esm2022/dialog/model/dialog-base-data.mjs +2 -0
- package/esm2022/dialog/model/dialog-choice-data.mjs +2 -0
- package/esm2022/dialog/model/dialog-type.mjs +8 -0
- package/esm2022/lib/model/app-path-config.mjs +2 -0
- package/esm2022/lib/model/app-type.mjs +2 -0
- package/esm2022/lib/model/app.mjs +2 -0
- package/esm2022/lib/model/caching-config.mjs +2 -0
- package/esm2022/lib/model/credentials.mjs +2 -0
- package/esm2022/lib/model/logging-config.mjs +2 -0
- package/esm2022/lib/model/service-options-token.mjs +3 -0
- package/esm2022/lib/model/service-options.mjs +2 -0
- package/esm2022/lib/ngx-lib.module.mjs +37 -0
- package/esm2022/lib/services/app-path-config.service.mjs +50 -0
- package/esm2022/lib/services/service-base.mjs +26 -0
- package/esm2022/msgraph/cleavelandprice-ngx-lib-msgraph.mjs +5 -0
- package/esm2022/msgraph/model/address.mjs +2 -0
- package/esm2022/msgraph/model/attendee.mjs +2 -0
- package/esm2022/msgraph/model/bulk-calendar-events.mjs +2 -0
- package/esm2022/msgraph/model/bulk-calendar-request.mjs +2 -0
- package/esm2022/msgraph/model/calendar-event.mjs +2 -0
- package/esm2022/msgraph/model/coordinates.mjs +2 -0
- package/esm2022/msgraph/model/email-address.mjs +2 -0
- package/esm2022/msgraph/model/location.mjs +2 -0
- package/esm2022/msgraph/model/online-meeting-info.mjs +2 -0
- package/esm2022/msgraph/model/patterned-recurrence.mjs +2 -0
- package/esm2022/msgraph/model/phone.mjs +2 -0
- package/esm2022/msgraph/model/recipient.mjs +2 -0
- package/esm2022/msgraph/model/recurrence-pattern.mjs +2 -0
- package/esm2022/msgraph/model/recurrence-range.mjs +2 -0
- package/esm2022/msgraph/model/response-status.mjs +2 -0
- package/esm2022/msgraph/model/room.mjs +6 -0
- package/esm2022/msgraph/model/user.mjs +132 -0
- package/esm2022/msgraph/msgraph.api.mjs +19 -0
- package/esm2022/msgraph/msgraph.module.mjs +27 -0
- package/esm2022/public_api.mjs +15 -0
- package/esm2022/quill/cleavelandprice-ngx-lib-quill.mjs +5 -0
- package/esm2022/quill/components/editor/editor.component.mjs +282 -0
- package/esm2022/quill/components/raw/raw.component.mjs +30 -0
- package/esm2022/quill/mention/cleavelandprice-ngx-lib-quill-mention.mjs +5 -0
- package/esm2022/quill/mention/components/editor/editor.component.mjs +151 -0
- package/esm2022/quill/mention/model/dialog-data.mjs +2 -0
- package/esm2022/quill/mention/quill-mention.api.mjs +9 -0
- package/esm2022/quill/mention/quill-mention.module.mjs +65 -0
- package/esm2022/quill/model/buttons.mjs +3 -0
- package/esm2022/quill/model/config.mjs +3 -0
- package/esm2022/quill/model/default-buttons.mjs +50 -0
- package/esm2022/quill/model/default-config.mjs +28 -0
- package/esm2022/quill/model/default-icons.mjs +7 -0
- package/esm2022/quill/model/default-tooltips.mjs +53 -0
- package/esm2022/quill/model/dialog-data.mjs +2 -0
- package/esm2022/quill/model/icons.mjs +3 -0
- package/esm2022/quill/model/tooltips.mjs +3 -0
- package/esm2022/quill/quill.api.mjs +13 -0
- package/esm2022/quill/quill.module.mjs +75 -0
- package/esm2022/sharepoint/cleavelandprice-ngx-lib-sharepoint.mjs +5 -0
- package/esm2022/sharepoint/components/user-photo/user-photo.component.mjs +40 -0
- package/esm2022/sharepoint/default-credentials.mjs +6 -0
- package/esm2022/sharepoint/model/base-item.mjs +2 -0
- package/esm2022/sharepoint/model/base-request-credential.mjs +2 -0
- package/esm2022/sharepoint/model/base-request.mjs +2 -0
- package/esm2022/sharepoint/model/cache-object.mjs +3 -0
- package/esm2022/sharepoint/model/file-request.mjs +2 -0
- package/esm2022/sharepoint/model/folder-request.mjs +2 -0
- package/esm2022/sharepoint/model/list-item.mjs +2 -0
- package/esm2022/sharepoint/model/list-items-request.mjs +2 -0
- package/esm2022/sharepoint/model/photo-item.mjs +2 -0
- package/esm2022/sharepoint/model/sharepoint-service-options.mjs +3 -0
- package/esm2022/sharepoint/model/uri-request.mjs +2 -0
- package/esm2022/sharepoint/model/user-request.mjs +2 -0
- package/esm2022/sharepoint/model/user.mjs +2 -0
- package/esm2022/sharepoint/pipes/user-photo-url.pipe.mjs +37 -0
- package/esm2022/sharepoint/services/sharepoint.service.mjs +155 -0
- package/esm2022/sharepoint/sharepoint.api.mjs +17 -0
- package/esm2022/sharepoint/sharepoint.module.mjs +50 -0
- package/esm2022/table/cleavelandprice-ngx-lib-table.mjs +5 -0
- package/esm2022/table/components/table/table.component.mjs +141 -0
- package/esm2022/table/model/table-column.mjs +2 -0
- package/esm2022/table/pipes/decimalPoints.mjs +14 -0
- package/esm2022/table/pipes/roundNumber.mjs +14 -0
- package/esm2022/table/table.api.mjs +6 -0
- package/esm2022/table/table.module.mjs +78 -0
- package/esm2022/upload/cleavelandprice-ngx-lib-upload.mjs +5 -0
- package/esm2022/upload/components/upload/upload.component.mjs +32 -0
- package/esm2022/upload/components/upload-dialog/upload-dialog.component.mjs +98 -0
- package/esm2022/upload/model/database-file-info.mjs +2 -0
- package/esm2022/upload/model/file-upload-request.mjs +2 -0
- package/esm2022/upload/model/filesystem-file-info.mjs +2 -0
- package/esm2022/upload/model/msg-file-content.mjs +5 -0
- package/esm2022/upload/model/upload-service-options-token.mjs +3 -0
- package/esm2022/upload/model/upload-service-options.mjs +3 -0
- package/esm2022/upload/model/upload-status.mjs +2 -0
- package/esm2022/upload/services/upload.service.mjs +106 -0
- package/esm2022/upload/upload.api.mjs +11 -0
- package/esm2022/upload/upload.module.mjs +68 -0
- package/esm2022/url-utilities/cleavelandprice-ngx-lib-url-utilities.mjs +5 -0
- package/esm2022/url-utilities/pipes/safe-resource-url.pipe.mjs +19 -0
- package/esm2022/url-utilities/pipes/safe-url.pipe.mjs +19 -0
- package/esm2022/url-utilities/pipes/uri-scheme.pipe.mjs +106 -0
- package/esm2022/url-utilities/url-utilities.api.mjs +13 -0
- package/esm2022/url-utilities/url-utilities.module.mjs +34 -0
- package/fesm2022/cleavelandprice-ngx-lib-active-directory-material.mjs +11 -11
- package/fesm2022/cleavelandprice-ngx-lib-active-directory-material.mjs.map +1 -1
- package/fesm2022/cleavelandprice-ngx-lib-active-directory.mjs +7 -7
- package/fesm2022/cleavelandprice-ngx-lib-active-directory.mjs.map +1 -1
- package/fesm2022/cleavelandprice-ngx-lib-authentication-material.mjs +15 -15
- package/fesm2022/cleavelandprice-ngx-lib-authentication-material.mjs.map +1 -1
- package/fesm2022/cleavelandprice-ngx-lib-authentication-object.mjs +7 -7
- package/fesm2022/cleavelandprice-ngx-lib-authentication-object.mjs.map +1 -1
- package/fesm2022/cleavelandprice-ngx-lib-authentication-token.mjs +7 -7
- package/fesm2022/cleavelandprice-ngx-lib-authentication-token.mjs.map +1 -1
- package/fesm2022/cleavelandprice-ngx-lib-authentication.mjs +4 -4
- package/fesm2022/cleavelandprice-ngx-lib-authentication.mjs.map +1 -1
- package/fesm2022/cleavelandprice-ngx-lib-dialog.mjs +24 -24
- package/fesm2022/cleavelandprice-ngx-lib-dialog.mjs.map +1 -1
- package/fesm2022/cleavelandprice-ngx-lib-msgraph.mjs +4 -4
- package/fesm2022/cleavelandprice-ngx-lib-msgraph.mjs.map +1 -1
- package/fesm2022/cleavelandprice-ngx-lib-quill-mention.mjs +9 -9
- package/fesm2022/cleavelandprice-ngx-lib-quill-mention.mjs.map +1 -1
- package/fesm2022/cleavelandprice-ngx-lib-quill.mjs +13 -13
- package/fesm2022/cleavelandprice-ngx-lib-quill.mjs.map +1 -1
- package/fesm2022/cleavelandprice-ngx-lib-sharepoint.mjs +13 -13
- package/fesm2022/cleavelandprice-ngx-lib-sharepoint.mjs.map +1 -1
- package/fesm2022/cleavelandprice-ngx-lib-table.mjs +24 -17
- package/fesm2022/cleavelandprice-ngx-lib-table.mjs.map +1 -1
- package/fesm2022/cleavelandprice-ngx-lib-upload.mjs +14 -14
- package/fesm2022/cleavelandprice-ngx-lib-upload.mjs.map +1 -1
- package/fesm2022/cleavelandprice-ngx-lib-url-utilities.mjs +13 -13
- package/fesm2022/cleavelandprice-ngx-lib-url-utilities.mjs.map +1 -1
- package/fesm2022/cleavelandprice-ngx-lib.mjs +7 -7
- package/fesm2022/cleavelandprice-ngx-lib.mjs.map +1 -1
- package/package.json +35 -5
- package/table/model/table-column.d.ts +2 -0
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
import { HttpClient } from '@angular/common/http';
|
|
2
|
+
import { Inject, inject, Injectable, Optional } from '@angular/core';
|
|
3
|
+
import { DateTime } from 'luxon';
|
|
4
|
+
import { of } from 'rxjs';
|
|
5
|
+
import { NgxLibServiceBase } from '@cleavelandprice/ngx-lib';
|
|
6
|
+
import { ActiveDirectoryServiceOptionsToken } from '../model/active-directory-service-options-token';
|
|
7
|
+
import * as i0 from "@angular/core";
|
|
8
|
+
export class ActiveDirectoryService extends NgxLibServiceBase {
|
|
9
|
+
#services = {
|
|
10
|
+
http: inject(HttpClient)
|
|
11
|
+
};
|
|
12
|
+
#cache;
|
|
13
|
+
#defaultCacheLifeMinutes = 720;
|
|
14
|
+
//#region Properties
|
|
15
|
+
get #cacheExpired() {
|
|
16
|
+
if (!this.#cache) {
|
|
17
|
+
return true;
|
|
18
|
+
}
|
|
19
|
+
const expiration = this.#cache.lastUpdate.plus({ minutes: this.options.caching.lifeMinutes });
|
|
20
|
+
return DateTime.now() > expiration;
|
|
21
|
+
}
|
|
22
|
+
//#endregion
|
|
23
|
+
constructor(options) {
|
|
24
|
+
super(options);
|
|
25
|
+
this.options = options;
|
|
26
|
+
this.options = {
|
|
27
|
+
...options,
|
|
28
|
+
caching: options?.caching ?? {
|
|
29
|
+
enabled: false,
|
|
30
|
+
lifeMinutes: this.#defaultCacheLifeMinutes
|
|
31
|
+
},
|
|
32
|
+
logging: options?.logging ?? {
|
|
33
|
+
dataCached: false,
|
|
34
|
+
cachedDataReturned: false,
|
|
35
|
+
freshDataReturned: false,
|
|
36
|
+
cacheCleared: false
|
|
37
|
+
}
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
getUsers(includePhoto = false, includeDisabled = false, parentOU = '') {
|
|
41
|
+
// If caching is enabled, there will be two calls to the API if the cache is null/expired
|
|
42
|
+
// One call is to update the cache and the other is to return the data that the user requested
|
|
43
|
+
// Subsequent calls will bypass the API and returned cached data until it expires
|
|
44
|
+
const observable$ = this.#services.http.get(`${this.apiUrl}/users/${includePhoto}/${includeDisabled}/${parentOU}`);
|
|
45
|
+
if (this.options.caching.enabled) {
|
|
46
|
+
if (this.#cacheExpired) {
|
|
47
|
+
// Get the data and cache it
|
|
48
|
+
observable$.subscribe(data => {
|
|
49
|
+
this.#cache = {
|
|
50
|
+
data,
|
|
51
|
+
lastUpdate: DateTime.now()
|
|
52
|
+
};
|
|
53
|
+
if (this.options.logging.dataCached) {
|
|
54
|
+
console.log(`Data cached for ${this.options.caching.lifeMinutes} minutes`);
|
|
55
|
+
}
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
else {
|
|
59
|
+
// Cache exists and hasn't expired yet
|
|
60
|
+
if (this.options.logging.cachedDataReturned) {
|
|
61
|
+
console.log('Returning cached users');
|
|
62
|
+
}
|
|
63
|
+
return of(this.#cache.data);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
// Cache is either disabled or expired, return data from API
|
|
67
|
+
if (this.options.logging.freshDataReturned) {
|
|
68
|
+
console.log('Returning fresh users');
|
|
69
|
+
}
|
|
70
|
+
return observable$;
|
|
71
|
+
}
|
|
72
|
+
getUser(accountName, includePhoto = false) {
|
|
73
|
+
return this.#services.http.get(`${this.apiUrl}/users/name/${accountName}/${includePhoto}`);
|
|
74
|
+
}
|
|
75
|
+
clearCache() {
|
|
76
|
+
this.#cache = undefined;
|
|
77
|
+
if (this.options.logging.cacheCleared) {
|
|
78
|
+
console.log('Cache cleared');
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
getDomains() {
|
|
82
|
+
return this.#services.http.get(`${this.apiUrl}/activedirectory/domains`);
|
|
83
|
+
}
|
|
84
|
+
getOUs(parentOU = '') {
|
|
85
|
+
return this.#services.http.get(`${this.apiUrl}/activedirectory/ous/${parentOU}`);
|
|
86
|
+
}
|
|
87
|
+
getContainers(parentOU = '') {
|
|
88
|
+
return this.#services.http.get(`${this.apiUrl}/activedirectory/containers/${parentOU}`);
|
|
89
|
+
}
|
|
90
|
+
getGroups(parentOU = '') {
|
|
91
|
+
return this.#services.http.get(`${this.apiUrl}/activedirectory/groups/${parentOU}`);
|
|
92
|
+
}
|
|
93
|
+
getDistinctUserAttributeValues(attributeName) {
|
|
94
|
+
return this.#services.http.get(`${this.apiUrl}/activedirectory/distinct/${attributeName}`);
|
|
95
|
+
}
|
|
96
|
+
getDepartments() {
|
|
97
|
+
return this.#services.http.get(`${this.apiUrl}/activedirectory/departments`);
|
|
98
|
+
}
|
|
99
|
+
getTitles() {
|
|
100
|
+
return this.#services.http.get(`${this.apiUrl}/activedirectory/titles`);
|
|
101
|
+
}
|
|
102
|
+
getWorkShifts() {
|
|
103
|
+
return this.#services.http.get(`${this.apiUrl}/activedirectory/workshifts`);
|
|
104
|
+
}
|
|
105
|
+
getManagementRoles() {
|
|
106
|
+
return this.#services.http.get(`${this.apiUrl}/activedirectory/managementroles`);
|
|
107
|
+
}
|
|
108
|
+
getComputers(includeDisabled = false, parentOU = '') {
|
|
109
|
+
return this.#services.http.get(`${this.apiUrl}/activedirectory/computers/${includeDisabled}/${parentOU}`);
|
|
110
|
+
}
|
|
111
|
+
getServers(includeDisabled = false, parentOU = '') {
|
|
112
|
+
return this.#services.http.get(`${this.apiUrl}/activedirectory/servers/${includeDisabled}/${parentOU}`);
|
|
113
|
+
}
|
|
114
|
+
getWorkstations(includeDisabled = false, parentOU = '') {
|
|
115
|
+
return this.#services.http.get(`${this.apiUrl}/activedirectory/workstations/${includeDisabled}/${parentOU}`);
|
|
116
|
+
}
|
|
117
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.0", ngImport: i0, type: ActiveDirectoryService, deps: [{ token: ActiveDirectoryServiceOptionsToken, optional: true }], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
118
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.0", ngImport: i0, type: ActiveDirectoryService, providedIn: 'root' }); }
|
|
119
|
+
}
|
|
120
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.0", ngImport: i0, type: ActiveDirectoryService, decorators: [{
|
|
121
|
+
type: Injectable,
|
|
122
|
+
args: [{
|
|
123
|
+
providedIn: 'root'
|
|
124
|
+
}]
|
|
125
|
+
}], ctorParameters: () => [{ type: undefined, decorators: [{
|
|
126
|
+
type: Optional
|
|
127
|
+
}, {
|
|
128
|
+
type: Inject,
|
|
129
|
+
args: [ActiveDirectoryServiceOptionsToken]
|
|
130
|
+
}] }] });
|
|
131
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWN0aXZlLWRpcmVjdG9yeS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY2xlYXZlbGFuZHByaWNlL25neC1saWIvYWN0aXZlLWRpcmVjdG9yeS9zcmMvc2VydmljZXMvYWN0aXZlLWRpcmVjdG9yeS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNsRCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3JFLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxPQUFPLENBQUM7QUFDakMsT0FBTyxFQUFjLEVBQUUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUV0QyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUU3RCxPQUFPLEVBQUUsa0NBQWtDLEVBQUUsTUFBTSxpREFBaUQsQ0FBQzs7QUFXckcsTUFBTSxPQUFPLHNCQUF1QixTQUFRLGlCQUFpQjtJQUMzRCxTQUFTLEdBQUc7UUFDVixJQUFJLEVBQUUsTUFBTSxDQUFDLFVBQVUsQ0FBQztLQUN6QixDQUFDO0lBQ0YsTUFBTSxDQUFvQztJQUMxQyx3QkFBd0IsR0FBRyxHQUFHLENBQUM7SUFFL0Isb0JBQW9CO0lBQ3BCLElBQUksYUFBYTtRQUNmLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDakIsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO1FBRUQsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEVBQUUsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBUSxDQUFDLFdBQVcsRUFBQyxDQUFDLENBQUM7UUFFOUYsT0FBTyxRQUFRLENBQUMsR0FBRyxFQUFFLEdBQUcs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QTZCLENBQUMsQ0FBQztJQUN4RixDQUFDO0lBRUQsa0JBQWtCO1FBQ2hCLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFXLEdBQUcsSUFBSSxDQUFDLE1BQU0sa0NBQWtDLENBQUMsQ0FBQztJQUM3RixDQUFDO0lBRUQsWUFBWSxDQUFDLGVBQWUsR0FBRyxLQUFLLEVBQUUsUUFBUSxHQUFHLEVBQUU7UUFDakQsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQVMsR0FBRyxJQUFJLENBQUMsTUFBTSw4QkFBOEIsZUFBZSxJQUFJLFFBQVEsRUFBRSxDQUFDLENBQUM7SUFDcEgsQ0FBQztJQUVELFVBQVUsQ0FBQyxlQUFlLEdBQUcsS0FBSyxFQUFFLFFBQVEsR0FBRyxFQUFFO1FBQy9DLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFTLEdBQUcsSUFBSSxDQUFDLE1BQU0sNEJBQTRCLGVBQWUsSUFBSSxRQUFRLEVBQUUsQ0FBQyxDQUFDO0lBQ2xILENBQUM7SUFFRCxlQUFlLENBQUMsZUFBZSxHQUFHLEtBQUssRUFBRSxRQUFRLEdBQUcsRUFBRTtRQUNwRCxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBUyxHQUFHLElBQUksQ0FBQyxNQUFNLGlDQUFpQyxlQUFlLElBQUksUUFBUSxFQUFFLENBQUMsQ0FBQztJQUN2SCxDQUFDOzhHQXZJVSxzQkFBc0Isa0JBbUJELGtDQUFrQztrSEFuQnZELHNCQUFzQixjQUZyQixNQUFNOzsyRkFFUCxzQkFBc0I7a0JBSGxDLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25COzswQkFvQmMsUUFBUTs7MEJBQUksTUFBTTsyQkFBQyxrQ0FBa0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBIdHRwQ2xpZW50IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xyXG5pbXBvcnQgeyBJbmplY3QsIGluamVjdCwgSW5qZWN0YWJsZSwgT3B0aW9uYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgRGF0ZVRpbWUgfSBmcm9tICdsdXhvbic7XHJcbmltcG9ydCB7IE9ic2VydmFibGUsIG9mIH0gZnJvbSAncnhqcyc7XHJcblxyXG5pbXBvcnQgeyBOZ3hMaWJTZXJ2aWNlQmFzZSB9IGZyb20gJ0BjbGVhdmVsYW5kcHJpY2Uvbmd4LWxpYic7XHJcbmltcG9ydCB7IEFjdGl2ZURpcmVjdG9yeVNlcnZpY2VPcHRpb25zIH0gZnJvbSAnLi4vbW9kZWwvYWN0aXZlLWRpcmVjdG9yeS1zZXJ2aWNlLW9wdGlvbnMnO1xyXG5pbXBvcnQgeyBBY3RpdmVEaXJlY3RvcnlTZXJ2aWNlT3B0aW9uc1Rva2VuIH0gZnJvbSAnLi4vbW9kZWwvYWN0aXZlLWRpcmVjdG9yeS1zZXJ2aWNlLW9wdGlvbnMtdG9rZW4nO1xyXG5pbXBvcnQgeyBBRE9iamVjdCB9IGZyb20gJy4uL21vZGVsL2FkLW9iamVjdCc7XHJcbmltcG9ydCB7IEFET2JqZWN0V2l0aENoaWxkcmVuIH0gZnJvbSAnLi4vbW9kZWwvYWQtb2JqZWN0LXdpdGgtY2hpbGRyZW4nO1xyXG5pbXBvcnQgeyBDYWNoZU9iamVjdCB9IGZyb20gJy4uL21vZGVsL2NhY2hlLW9iamVjdCc7XHJcbmltcG9ydCB7IENsZWF2ZWxhbmRQcmljZVVzZXIgfSBmcm9tICcuLi9tb2RlbC9jbGVhdmVsYW5kLXByaWNlLXVzZXInO1xyXG5pbXBvcnQgeyBHcm91cCB9IGZyb20gJy4uL21vZGVsL2dyb3VwJztcclxuaW1wb3J0IHsgVXNlciB9IGZyb20gJy4uL21vZGVsL3VzZXInO1xyXG5cclxuQEluamVjdGFibGUoe1xyXG4gIHByb3ZpZGVkSW46ICdyb290J1xyXG59KVxyXG5leHBvcnQgY2xhc3MgQWN0aXZlRGlyZWN0b3J5U2VydmljZSBleHRlbmRzIE5neExpYlNlcnZpY2VCYXNlIHtcclxuICAjc2VydmljZXMgPSB7XHJcbiAgICBodHRwOiBpbmplY3QoSHR0cENsaWVudClcclxuICB9O1xyXG4gICNjYWNoZT86IENhY2hlT2JqZWN0PENsZWF2ZWxhbmRQcmljZVVzZXI+O1xyXG4gICNkZWZhdWx0Q2FjaGVMaWZlTWludXRlcyA9IDcyMDtcclxuXHJcbiAgLy8jcmVnaW9uIFByb3BlcnRpZXNcclxuICBnZXQgI2NhY2hlRXhwaXJlZCgpOiBib29sZWFuIHtcclxuICAgIGlmICghdGhpcy4jY2FjaGUpIHtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgZXhwaXJhdGlvbiA9IHRoaXMuI2NhY2hlLmxhc3RVcGRhdGUucGx1cyh7IG1pbnV0ZXM6IHRoaXMub3B0aW9ucy5jYWNoaW5nIS5saWZlTWludXRlc30pO1xyXG5cclxuICAgIHJldHVybiBEYXRlVGltZS5ub3coKSA+IGV4cGlyYXRpb247XHJcbiAgfVxyXG4gIC8vI2VuZHJlZ2lvblxyXG5cclxuICBjb25zdHJ1Y3RvcihAT3B0aW9uYWwoKSBASW5qZWN0KEFjdGl2ZURpcmVjdG9yeVNlcnZpY2VPcHRpb25zVG9rZW4pIHByaXZhdGUgb3B0aW9uczogQWN0aXZlRGlyZWN0b3J5U2VydmljZU9wdGlvbnMpIHtcclxuICAgIHN1cGVyKG9wdGlvbnMpO1xyXG5cclxuICAgIHRoaXMub3B0aW9ucyA9IHtcclxuICAgICAgLi4ub3B0aW9ucyxcclxuXHJcbiAgICAgIGNhY2hpbmc6IG9wdGlvbnM/LmNhY2hpbmcgPz8ge1xyXG4gICAgICAgIGVuYWJsZWQ6IGZhbHNlLFxyXG4gICAgICAgIGxpZmVNaW51dGVzOiB0aGlzLiNkZWZhdWx0Q2FjaGVMaWZlTWludXRlc1xyXG4gICAgICB9LFxyXG5cclxuICAgICAgbG9nZ2luZzogb3B0aW9ucz8ubG9nZ2luZyA/PyB7XHJcbiAgICAgICAgZGF0YUNhY2hlZDogZmFsc2UsXHJcbiAgICAgICAgY2FjaGVkRGF0YVJldHVybmVkOiBmYWxzZSxcclxuICAgICAgICBmcmVzaERhdGFSZXR1cm5lZDogZmFsc2UsXHJcbiAgICAgICAgY2FjaGVDbGVhcmVkOiBmYWxzZVxyXG4gICAgICB9XHJcbiAgICB9O1xyXG4gIH1cclxuICBcclxuICBnZXRVc2VycyhpbmNsdWRlUGhvdG8gPSBmYWxzZSwgaW5jbHVkZURpc2FibGVkID0gZmFsc2UsIHBhcmVudE9VID0gJycpOiBPYnNlcnZhYmxlPENsZWF2ZWxhbmRQcmljZVVzZXJbXT4ge1xyXG4gICAgLy8gSWYgY2FjaGluZyBpcyBlbmFibGVkLCB0aGVyZSB3aWxsIGJlIHR3byBjYWxscyB0byB0aGUgQVBJIGlmIHRoZSBjYWNoZSBpcyBudWxsL2V4cGlyZWRcclxuICAgIC8vIE9uZSBjYWxsIGlzIHRvIHVwZGF0ZSB0aGUgY2FjaGUgYW5kIHRoZSBvdGhlciBpcyB0byByZXR1cm4gdGhlIGRhdGEgdGhhdCB0aGUgdXNlciByZXF1ZXN0ZWRcclxuICAgIC8vIFN1YnNlcXVlbnQgY2FsbHMgd2lsbCBieXBhc3MgdGhlIEFQSSBhbmQgcmV0dXJuZWQgY2FjaGVkIGRhdGEgdW50aWwgaXQgZXhwaXJlc1xyXG5cclxuICAgIGNvbnN0IG9ic2VydmFibGUkID0gdGhpcy4jc2VydmljZXMuaHR0cC5nZXQ8Q2xlYXZlbGFuZFByaWNlVXNlcltdPihgJHt0aGlzLmFwaVVybH0vdXNlcnMvJHtpbmNsdWRlUGhvdG99LyR7aW5jbHVkZURpc2FibGVkfS8ke3BhcmVudE9VfWApO1xyXG5cclxuICAgIGlmICh0aGlzLm9wdGlvbnMuY2FjaGluZyEuZW5hYmxlZCkge1xyXG4gICAgICBpZiAodGhpcy4jY2FjaGVFeHBpcmVkKSB7XHJcbiAgICAgICAgLy8gR2V0IHRoZSBkYXRhIGFuZCBjYWNoZSBpdFxyXG4gICAgICAgIG9ic2VydmFibGUkLnN1YnNjcmliZShkYXRhID0+IHtcclxuICAgICAgICAgIHRoaXMuI2NhY2hlID0ge1xyXG4gICAgICAgICAgICBkYXRhLFxyXG4gICAgICAgICAgICBsYXN0VXBkYXRlOiBEYXRlVGltZS5ub3coKVxyXG4gICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmxvZ2dpbmchLmRhdGFDYWNoZWQpIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coYERhdGEgY2FjaGVkIGZvciAke3RoaXMub3B0aW9ucy5jYWNoaW5nIS5saWZlTWludXRlc30gbWludXRlc2ApO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIC8vIENhY2hlIGV4aXN0cyBhbmQgaGFzbid0IGV4cGlyZWQgeWV0XHJcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5sb2dnaW5nIS5jYWNoZWREYXRhUmV0dXJuZWQpIHtcclxuICAgICAgICAgIGNvbnNvbGUubG9nKCdSZXR1cm5pbmcgY2FjaGVkIHVzZXJzJyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gb2YodGhpcy4jY2FjaGUhLmRhdGEpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gQ2FjaGUgaXMgZWl0aGVyIGRpc2FibGVkIG9yIGV4cGlyZWQsIHJldHVybiBkYXRhIGZyb20gQVBJXHJcbiAgICBpZiAodGhpcy5vcHRpb25zLmxvZ2dpbmchLmZyZXNoRGF0YVJldHVybmVkKSB7XHJcbiAgICAgIGNvbnNvbGUubG9nKCdSZXR1cm5pbmcgZnJlc2ggdXNlcnMnKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gb2JzZXJ2YWJsZSQ7XHJcbiAgfVxyXG5cclxuICBnZXRVc2VyKGFjY291bnROYW1lOiBzdHJpbmcsIGluY2x1ZGVQaG90byA9IGZhbHNlKTogT2JzZXJ2YWJsZTxDbGVhdmVsYW5kUHJpY2VVc2VyPiB7XHJcbiAgICByZXR1cm4gdGhpcy4jc2VydmljZXMuaHR0cC5nZXQ8Q2xlYXZlbGFuZFByaWNlVXNlcj4oYCR7dGhpcy5hcGlVcmx9L3VzZXJzL25hbWUvJHthY2NvdW50TmFtZX0vJHtpbmNsdWRlUGhvdG99YCk7XHJcbiAgfVxyXG5cclxuICBjbGVhckNhY2hlKCk6IHZvaWQge1xyXG4gICAgdGhpcy4jY2FjaGUgPSB1bmRlZmluZWQ7XHJcblxyXG4gICAgaWYgKHRoaXMub3B0aW9ucy5sb2dnaW5nIS5jYWNoZUNsZWFyZWQpIHtcclxuICAgICAgY29uc29sZS5sb2coJ0NhY2hlIGNsZWFyZWQnKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldERvbWFpbnMoKTogT2JzZXJ2YWJsZTxBRE9iamVjdFtdPiB7XHJcbiAgICByZXR1cm4gdGhpcy4jc2VydmljZXMuaHR0cC5nZXQ8QURPYmplY3RbXT4oYCR7dGhpcy5hcGlVcmx9L2FjdGl2ZWRpcmVjdG9yeS9kb21haW5zYCk7XHJcbiAgfVxyXG5cclxuICBnZXRPVXMocGFyZW50T1UgPSAnJyk6IE9ic2VydmFibGU8QURPYmplY3RXaXRoQ2hpbGRyZW5bXT4ge1xyXG4gICAgcmV0dXJuIHRoaXMuI3NlcnZpY2VzLmh0dHAuZ2V0PEFET2JqZWN0V2l0aENoaWxkcmVuW10+KGAke3RoaXMuYXBpVXJsfS9hY3RpdmVkaXJlY3Rvcnkvb3VzLyR7cGFyZW50T1V9YCk7XHJcbiAgfVxyXG5cclxuICBnZXRDb250YWluZXJzKHBhcmVudE9VID0gJycpOiBPYnNlcnZhYmxlPEFET2JqZWN0V2l0aENoaWxkcmVuW10+IHtcclxuICAgIHJldHVybiB0aGlzLiNzZXJ2aWNlcy5odHRwLmdldDxBRE9iamVjdFdpdGhDaGlsZHJlbltdPihgJHt0aGlzLmFwaVVybH0vYWN0aXZlZGlyZWN0b3J5L2NvbnRhaW5lcnMvJHtwYXJlbnRPVX1gKTtcclxuICB9XHJcblxyXG4gIGdldEdyb3VwcyhwYXJlbnRPVSA9ICcnKTogT2JzZXJ2YWJsZTxHcm91cFtdPiB7XHJcbiAgICByZXR1cm4gdGhpcy4jc2VydmljZXMuaHR0cC5nZXQ8R3JvdXBbXT4oYCR7dGhpcy5hcGlVcmx9L2FjdGl2ZWRpcmVjdG9yeS9ncm91cHMvJHtwYXJlbnRPVX1gKTtcclxuICB9XHJcblxyXG4gIGdldERpc3RpbmN0VXNlckF0dHJpYnV0ZVZhbHVlcyhhdHRyaWJ1dGVOYW1lOiBzdHJpbmcpIDogT2JzZXJ2YWJsZTxhbnlbXT4ge1xyXG4gICAgcmV0dXJuIHRoaXMuI3NlcnZpY2VzLmh0dHAuZ2V0PGFueVtdPihgJHt0aGlzLmFwaVVybH0vYWN0aXZlZGlyZWN0b3J5L2Rpc3RpbmN0LyR7YXR0cmlidXRlTmFtZX1gKTtcclxuICB9XHJcblxyXG4gIGdldERlcGFydG1lbnRzKCkgOiBPYnNlcnZhYmxlPHN0cmluZ1tdPiB7XHJcbiAgICByZXR1cm4gdGhpcy4jc2VydmljZXMuaHR0cC5nZXQ8c3RyaW5nW10+KGAke3RoaXMuYXBpVXJsfS9hY3RpdmVkaXJlY3RvcnkvZGVwYXJ0bWVudHNgKTtcclxuICB9XHJcblxyXG4gIGdldFRpdGxlcygpIDogT2JzZXJ2YWJsZTxzdHJpbmdbXT4ge1xyXG4gICAgcmV0dXJuIHRoaXMuI3NlcnZpY2VzLmh0dHAuZ2V0PHN0cmluZ1tdPihgJHt0aGlzLmFwaVVybH0vYWN0aXZlZGlyZWN0b3J5L3RpdGxlc2ApO1xyXG4gIH1cclxuXHJcbiAgZ2V0V29ya1NoaWZ0cygpIDogT2JzZXJ2YWJsZTxzdHJpbmdbXT4ge1xyXG4gICAgcmV0dXJuIHRoaXMuI3NlcnZpY2VzLmh0dHAuZ2V0PHN0cmluZ1tdPihgJHt0aGlzLmFwaVVybH0vYWN0aXZlZGlyZWN0b3J5L3dvcmtzaGlmdHNgKTtcclxuICB9XHJcblxyXG4gIGdldE1hbmFnZW1lbnRSb2xlcygpIDogT2JzZXJ2YWJsZTxzdHJpbmdbXT4ge1xyXG4gICAgcmV0dXJuIHRoaXMuI3NlcnZpY2VzLmh0dHAuZ2V0PHN0cmluZ1tdPihgJHt0aGlzLmFwaVVybH0vYWN0aXZlZGlyZWN0b3J5L21hbmFnZW1lbnRyb2xlc2ApO1xyXG4gIH1cclxuXHJcbiAgZ2V0Q29tcHV0ZXJzKGluY2x1ZGVEaXNhYmxlZCA9IGZhbHNlLCBwYXJlbnRPVSA9ICcnKTogT2JzZXJ2YWJsZTxVc2VyW10+IHtcclxuICAgIHJldHVybiB0aGlzLiNzZXJ2aWNlcy5odHRwLmdldDxVc2VyW10+KGAke3RoaXMuYXBpVXJsfS9hY3RpdmVkaXJlY3RvcnkvY29tcHV0ZXJzLyR7aW5jbHVkZURpc2FibGVkfS8ke3BhcmVudE9VfWApO1xyXG4gIH1cclxuXHJcbiAgZ2V0U2VydmVycyhpbmNsdWRlRGlzYWJsZWQgPSBmYWxzZSwgcGFyZW50T1UgPSAnJyk6IE9ic2VydmFibGU8VXNlcltdPiB7XHJcbiAgICByZXR1cm4gdGhpcy4jc2VydmljZXMuaHR0cC5nZXQ8VXNlcltdPihgJHt0aGlzLmFwaVVybH0vYWN0aXZlZGlyZWN0b3J5L3NlcnZlcnMvJHtpbmNsdWRlRGlzYWJsZWR9LyR7cGFyZW50T1V9YCk7XHJcbiAgfVxyXG5cclxuICBnZXRXb3Jrc3RhdGlvbnMoaW5jbHVkZURpc2FibGVkID0gZmFsc2UsIHBhcmVudE9VID0gJycpOiBPYnNlcnZhYmxlPFVzZXJbXT4ge1xyXG4gICAgcmV0dXJuIHRoaXMuI3NlcnZpY2VzLmh0dHAuZ2V0PFVzZXJbXT4oYCR7dGhpcy5hcGlVcmx9L2FjdGl2ZWRpcmVjdG9yeS93b3Jrc3RhdGlvbnMvJHtpbmNsdWRlRGlzYWJsZWR9LyR7cGFyZW50T1V9YCk7XHJcbiAgfVxyXG59XHJcbiJdfQ==
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export * from './model/abstract-authentication-service';
|
|
2
|
+
export * from './model/authenticated-user';
|
|
3
|
+
export * from './model/authentication-request';
|
|
4
|
+
export * from './model/authentication-service-options';
|
|
5
|
+
export * from './model/authentication-service-options-token';
|
|
6
|
+
export * from './authentication.base.module';
|
|
7
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aGVudGljYXRpb24uYXBpLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY2xlYXZlbGFuZHByaWNlL25neC1saWIvYXV0aGVudGljYXRpb24vc3JjL2F1dGhlbnRpY2F0aW9uLmFwaS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLHlDQUF5QyxDQUFDO0FBQ3hELGNBQWMsNEJBQTRCLENBQUM7QUFDM0MsY0FBYyxnQ0FBZ0MsQ0FBQztBQUMvQyxjQUFjLHdDQUF3QyxDQUFDO0FBQ3ZELGNBQWMsOENBQThDLENBQUM7QUFFN0QsY0FBYyw4QkFBOEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gJy4vbW9kZWwvYWJzdHJhY3QtYXV0aGVudGljYXRpb24tc2VydmljZSc7XHJcbmV4cG9ydCAqIGZyb20gJy4vbW9kZWwvYXV0aGVudGljYXRlZC11c2VyJztcclxuZXhwb3J0ICogZnJvbSAnLi9tb2RlbC9hdXRoZW50aWNhdGlvbi1yZXF1ZXN0JztcclxuZXhwb3J0ICogZnJvbSAnLi9tb2RlbC9hdXRoZW50aWNhdGlvbi1zZXJ2aWNlLW9wdGlvbnMnO1xyXG5leHBvcnQgKiBmcm9tICcuL21vZGVsL2F1dGhlbnRpY2F0aW9uLXNlcnZpY2Utb3B0aW9ucy10b2tlbic7XHJcblxyXG5leHBvcnQgKiBmcm9tICcuL2F1dGhlbnRpY2F0aW9uLmJhc2UubW9kdWxlJztcclxuXHJcbiJdfQ==
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { CommonModule } from '@angular/common';
|
|
2
|
+
import { NgModule, Optional, SkipSelf } from '@angular/core';
|
|
3
|
+
import { AuthenticationServiceOptionsToken } from './model/authentication-service-options-token';
|
|
4
|
+
import * as i0 from "@angular/core";
|
|
5
|
+
export class AuthenticationBaseModule {
|
|
6
|
+
static forRoot(options) {
|
|
7
|
+
return {
|
|
8
|
+
ngModule: AuthenticationBaseModule,
|
|
9
|
+
providers: [
|
|
10
|
+
{
|
|
11
|
+
provide: AuthenticationServiceOptionsToken,
|
|
12
|
+
useValue: options
|
|
13
|
+
}
|
|
14
|
+
]
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
constructor(parentModule) {
|
|
18
|
+
if (parentModule) {
|
|
19
|
+
throw new Error('AuthenticationBaseModule is already loaded. Import it in the AppModule only');
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.0", ngImport: i0, type: AuthenticationBaseModule, deps: [{ token: AuthenticationBaseModule, optional: true, skipSelf: true }], target: i0.ɵɵFactoryTarget.NgModule }); }
|
|
23
|
+
static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "17.3.0", ngImport: i0, type: AuthenticationBaseModule, imports: [CommonModule] }); }
|
|
24
|
+
static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "17.3.0", ngImport: i0, type: AuthenticationBaseModule, imports: [CommonModule] }); }
|
|
25
|
+
}
|
|
26
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.0", ngImport: i0, type: AuthenticationBaseModule, decorators: [{
|
|
27
|
+
type: NgModule,
|
|
28
|
+
args: [{
|
|
29
|
+
declarations: [],
|
|
30
|
+
imports: [
|
|
31
|
+
CommonModule
|
|
32
|
+
],
|
|
33
|
+
exports: []
|
|
34
|
+
}]
|
|
35
|
+
}], ctorParameters: () => [{ type: AuthenticationBaseModule, decorators: [{
|
|
36
|
+
type: Optional
|
|
37
|
+
}, {
|
|
38
|
+
type: SkipSelf
|
|
39
|
+
}] }] });
|
|
40
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aGVudGljYXRpb24uYmFzZS5tb2R1bGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jbGVhdmVsYW5kcHJpY2Uvbmd4LWxpYi9hdXRoZW50aWNhdGlvbi9zcmMvYXV0aGVudGljYXRpb24uYmFzZS5tb2R1bGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBdUIsUUFBUSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFbEYsT0FBTyxFQUFFLGlDQUFpQyxFQUFFLE1BQU0sOENBQThDLENBQUM7O0FBU2pHLE1BQU0sT0FBTyx3QkFBd0I7SUFDbkMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxPQUFxQztRQUNsRCxPQUFPO1lBQ0wsUUFBUSxFQUFFLHdCQUF3QjtZQUNsQyxTQUFTLEVBQUU7Z0JBQ1Q7b0JBQ0UsT0FBTyxFQUFFLGlDQUFpQztvQkFDMUMsUUFBUSxFQUFFLE9BQU87aUJBQ2xCO2FBQ0Y7U0FDRixDQUFBO0lBQ0gsQ0FBQztJQUVELFlBQW9DLFlBQXNDO1FBQ3hFLElBQUksWUFBWSxFQUFFLENBQUM7WUFDakIsTUFBTSxJQUFJLEtBQUssQ0FDYiw2RUFBNkUsQ0FBQyxDQUFDO1FBQ25GLENBQUM7SUFDSCxDQUFDOzhHQWxCVSx3QkFBd0I7K0dBQXhCLHdCQUF3QixZQUpqQyxZQUFZOytHQUlILHdCQUF3QixZQUpqQyxZQUFZOzsyRkFJSCx3QkFBd0I7a0JBUHBDLFFBQVE7bUJBQUM7b0JBQ1IsWUFBWSxFQUFFLEVBQUU7b0JBQ2hCLE9BQU8sRUFBRTt3QkFDUCxZQUFZO3FCQUNiO29CQUNELE9BQU8sRUFBRSxFQUFFO2lCQUNaOzswQkFjYyxRQUFROzswQkFBSSxRQUFRIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcclxuaW1wb3J0IHsgTW9kdWxlV2l0aFByb3ZpZGVycywgTmdNb2R1bGUsIE9wdGlvbmFsLCBTa2lwU2VsZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBBdXRoZW50aWNhdGlvblNlcnZpY2VPcHRpb25zIH0gZnJvbSAnLi9tb2RlbC9hdXRoZW50aWNhdGlvbi1zZXJ2aWNlLW9wdGlvbnMnO1xyXG5pbXBvcnQgeyBBdXRoZW50aWNhdGlvblNlcnZpY2VPcHRpb25zVG9rZW4gfSBmcm9tICcuL21vZGVsL2F1dGhlbnRpY2F0aW9uLXNlcnZpY2Utb3B0aW9ucy10b2tlbic7XHJcblxyXG5ATmdNb2R1bGUoe1xyXG4gIGRlY2xhcmF0aW9uczogW10sXHJcbiAgaW1wb3J0czogW1xyXG4gICAgQ29tbW9uTW9kdWxlXHJcbiAgXSxcclxuICBleHBvcnRzOiBbXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgQXV0aGVudGljYXRpb25CYXNlTW9kdWxlIHtcclxuICBzdGF0aWMgZm9yUm9vdChvcHRpb25zOiBBdXRoZW50aWNhdGlvblNlcnZpY2VPcHRpb25zKTogTW9kdWxlV2l0aFByb3ZpZGVyczxBdXRoZW50aWNhdGlvbkJhc2VNb2R1bGU+IHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIG5nTW9kdWxlOiBBdXRoZW50aWNhdGlvbkJhc2VNb2R1bGUsXHJcbiAgICAgIHByb3ZpZGVyczogW1xyXG4gICAgICAgIHtcclxuICAgICAgICAgIHByb3ZpZGU6IEF1dGhlbnRpY2F0aW9uU2VydmljZU9wdGlvbnNUb2tlbixcclxuICAgICAgICAgIHVzZVZhbHVlOiBvcHRpb25zXHJcbiAgICAgICAgfVxyXG4gICAgICBdXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBjb25zdHJ1Y3RvcihAT3B0aW9uYWwoKSBAU2tpcFNlbGYoKSBwYXJlbnRNb2R1bGU6IEF1dGhlbnRpY2F0aW9uQmFzZU1vZHVsZSkge1xyXG4gICAgaWYgKHBhcmVudE1vZHVsZSkge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXHJcbiAgICAgICAgJ0F1dGhlbnRpY2F0aW9uQmFzZU1vZHVsZSBpcyBhbHJlYWR5IGxvYWRlZC4gSW1wb3J0IGl0IGluIHRoZSBBcHBNb2R1bGUgb25seScpO1xyXG4gICAgfVxyXG4gIH1cclxufSJdfQ==
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generated bundle index. Do not edit.
|
|
3
|
+
*/
|
|
4
|
+
export * from './authentication.api';
|
|
5
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xlYXZlbGFuZHByaWNlLW5neC1saWItYXV0aGVudGljYXRpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jbGVhdmVsYW5kcHJpY2Uvbmd4LWxpYi9hdXRoZW50aWNhdGlvbi9zcmMvY2xlYXZlbGFuZHByaWNlLW5neC1saWItYXV0aGVudGljYXRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFFSCxjQUFjLHNCQUFzQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBHZW5lcmF0ZWQgYnVuZGxlIGluZGV4LiBEbyBub3QgZWRpdC5cbiAqL1xuXG5leHBvcnQgKiBmcm9tICcuL2F1dGhlbnRpY2F0aW9uLmFwaSc7XG4iXX0=
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generated bundle index. Do not edit.
|
|
3
|
+
*/
|
|
4
|
+
export * from './mat-authentication.api';
|
|
5
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xlYXZlbGFuZHByaWNlLW5neC1saWItYXV0aGVudGljYXRpb24tbWF0ZXJpYWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jbGVhdmVsYW5kcHJpY2Uvbmd4LWxpYi9hdXRoZW50aWNhdGlvbi9tYXRlcmlhbC9zcmMvY2xlYXZlbGFuZHByaWNlLW5neC1saWItYXV0aGVudGljYXRpb24tbWF0ZXJpYWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFFSCxjQUFjLDBCQUEwQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBHZW5lcmF0ZWQgYnVuZGxlIGluZGV4LiBEbyBub3QgZWRpdC5cbiAqL1xuXG5leHBvcnQgKiBmcm9tICcuL21hdC1hdXRoZW50aWNhdGlvbi5hcGknO1xuIl19
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { Component, inject, input } from '@angular/core';
|
|
2
|
+
import { MatDialog } from '@angular/material/dialog';
|
|
3
|
+
import { ConfirmationComponent } from '@cleavelandprice/ngx-lib/dialog';
|
|
4
|
+
import { MatIcon } from '@angular/material/icon';
|
|
5
|
+
import { MatAuthenticationService } from '../../services/mat-authentication.service';
|
|
6
|
+
import { LoginFormComponent } from '../login-form/login-form.component';
|
|
7
|
+
import * as i0 from "@angular/core";
|
|
8
|
+
export class LoginComponent {
|
|
9
|
+
constructor() {
|
|
10
|
+
this.#services = {
|
|
11
|
+
dialog: inject(MatDialog)
|
|
12
|
+
};
|
|
13
|
+
this.services = {
|
|
14
|
+
authentication: inject(MatAuthenticationService)
|
|
15
|
+
};
|
|
16
|
+
//#endregion
|
|
17
|
+
this.adminGroup = input();
|
|
18
|
+
this.additionalInfo = input();
|
|
19
|
+
}
|
|
20
|
+
#services;
|
|
21
|
+
login() {
|
|
22
|
+
this.#services.dialog.open(LoginFormComponent, {
|
|
23
|
+
data: {
|
|
24
|
+
adminGroup: this.adminGroup(),
|
|
25
|
+
additionalInfo: this.additionalInfo()
|
|
26
|
+
}
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
confirmLogout() {
|
|
30
|
+
this.#services.dialog.open(ConfirmationComponent, {
|
|
31
|
+
data: { message: `Are you sure you want to logout?` }
|
|
32
|
+
})
|
|
33
|
+
.afterClosed()
|
|
34
|
+
.subscribe(result => {
|
|
35
|
+
if (result) {
|
|
36
|
+
this.services.authentication.logout();
|
|
37
|
+
}
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.0", ngImport: i0, type: LoginComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
41
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.0", type: LoginComponent, isStandalone: true, selector: "cp-login", inputs: { adminGroup: { classPropertyName: "adminGroup", publicName: "adminGroup", isSignal: true, isRequired: false, transformFunction: null }, additionalInfo: { classPropertyName: "additionalInfo", publicName: "additionalInfo", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: "<div id=\"user-id\">\r\n <!-- Logged out -->\r\n <!-- Logged in -->\r\n @if (services.authentication.authenticated) {\r\n <!-- With photo -->\r\n @if (services.authentication.authenticatedUser?.photoUrl) {\r\n <img\r\n id=\"authenticated-user-image\"\r\n [src]=\"services.authentication.authenticatedUser?.photoUrl\"\r\n matTooltip=\"Logout\"\r\n (click)=\"confirmLogout()\" />\r\n } @else {\r\n <!-- Without photo -->\r\n <mat-icon\r\n fontIcon=\"account_circle\"\r\n matTooltip=\"Logout\"\r\n (click)=\"confirmLogout()\">\r\n </mat-icon>\r\n }\r\n <!-- Name -->\r\n <div id=\"user-name\">\r\n {{ services.authentication.authenticatedUser?.displayName }}\r\n </div>\r\n } @else {\r\n <mat-icon\r\n fontIcon=\"account_circle\"\r\n matTooltip=\"Login\"\r\n (click)=\"login()\">\r\n </mat-icon>\r\n }\r\n</div>", styles: ["#user-id{display:flex;height:2em;padding:.3em;font-family:Verdana,Geneva,Tahoma,sans-serif}#user-id>div{display:flex;align-items:center;height:100%;margin-left:.75em;font-size:1.15em}mat-icon{font-size:2em!important;height:2em!important;width:2em!important}img{border-radius:100%;width:2em;height:2em}\n", ".material-icons{font-family:Material Icons;font-weight:400;font-style:normal;font-size:24px;display:inline-block;line-height:1;text-transform:none;letter-spacing:normal;word-wrap:normal;white-space:nowrap;direction:ltr;-webkit-font-smoothing:antialiased;text-rendering:optimizeLegibility;-moz-osx-font-smoothing:grayscale;font-feature-settings:\"liga\"}\n"], dependencies: [{ kind: "component", type: MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }] }); }
|
|
42
|
+
}
|
|
43
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.0", ngImport: i0, type: LoginComponent, decorators: [{
|
|
44
|
+
type: Component,
|
|
45
|
+
args: [{ selector: 'cp-login', imports: [
|
|
46
|
+
MatIcon,
|
|
47
|
+
], standalone: true, template: "<div id=\"user-id\">\r\n <!-- Logged out -->\r\n <!-- Logged in -->\r\n @if (services.authentication.authenticated) {\r\n <!-- With photo -->\r\n @if (services.authentication.authenticatedUser?.photoUrl) {\r\n <img\r\n id=\"authenticated-user-image\"\r\n [src]=\"services.authentication.authenticatedUser?.photoUrl\"\r\n matTooltip=\"Logout\"\r\n (click)=\"confirmLogout()\" />\r\n } @else {\r\n <!-- Without photo -->\r\n <mat-icon\r\n fontIcon=\"account_circle\"\r\n matTooltip=\"Logout\"\r\n (click)=\"confirmLogout()\">\r\n </mat-icon>\r\n }\r\n <!-- Name -->\r\n <div id=\"user-name\">\r\n {{ services.authentication.authenticatedUser?.displayName }}\r\n </div>\r\n } @else {\r\n <mat-icon\r\n fontIcon=\"account_circle\"\r\n matTooltip=\"Login\"\r\n (click)=\"login()\">\r\n </mat-icon>\r\n }\r\n</div>", styles: ["#user-id{display:flex;height:2em;padding:.3em;font-family:Verdana,Geneva,Tahoma,sans-serif}#user-id>div{display:flex;align-items:center;height:100%;margin-left:.75em;font-size:1.15em}mat-icon{font-size:2em!important;height:2em!important;width:2em!important}img{border-radius:100%;width:2em;height:2em}\n", ".material-icons{font-family:Material Icons;font-weight:400;font-style:normal;font-size:24px;display:inline-block;line-height:1;text-transform:none;letter-spacing:normal;word-wrap:normal;white-space:nowrap;direction:ltr;-webkit-font-smoothing:antialiased;text-rendering:optimizeLegibility;-moz-osx-font-smoothing:grayscale;font-feature-settings:\"liga\"}\n"] }]
|
|
48
|
+
}] });
|
|
49
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9naW4uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY2xlYXZlbGFuZHByaWNlL25neC1saWIvYXV0aGVudGljYXRpb24vbWF0ZXJpYWwvc3JjL2NvbXBvbmVudHMvbG9naW4vbG9naW4uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY2xlYXZlbGFuZHByaWNlL25neC1saWIvYXV0aGVudGljYXRpb24vbWF0ZXJpYWwvc3JjL2NvbXBvbmVudHMvbG9naW4vbG9naW4uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3pELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUNyRCxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUV4RSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDakQsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sMkNBQTJDLENBQUM7QUFDckYsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sb0NBQW9DLENBQUM7O0FBY3hFLE1BQU0sT0FBTyxjQUFjO0lBWjNCO1FBYUUsY0FBUyxHQUFHO1lBQ1YsTUFBTSxFQUFFLE1BQU0sQ0FBQyxTQUFTLENBQUM7U0FDMUIsQ0FBQztRQUNGLGFBQVEsR0FBRztZQUNULGNBQWMsRUFBRSxNQUFNLENBQUMsd0JBQXdCLENBQUM7U0FDakQsQ0FBQztRQUNGLFlBQVk7UUFFWixlQUFVLEdBQUcsS0FBSyxFQUFVLENBQUM7UUFDN0IsbUJBQWMsR0FBRyxLQUFLLEVBQVUsQ0FBQztLQXNCbEM7SUEvQkMsU0FBUyxDQUVQO0lBU0YsS0FBSztRQUNILElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsRUFBRTtZQUM3QyxJQUFJLEVBQUU7Z0JBQ0osVUFBVSxFQUFFLElBQUksQ0FBQyxVQUFVLEVBQUU7Z0JBQzdCLGNBQWMsRUFBRSxJQUFJLENBQUMsY0FBYyxFQUFFO2FBQ3RDO1NBQ0YsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELGFBQWE7UUFDWCxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMscUJBQXFCLEVBQUU7WUFDaEQsSUFBSSxFQUFFLEVBQUUsT0FBTyxFQUFFLGtDQUFrQyxFQUFFO1NBQ3RELENBQUM7YUFDRCxXQUFXLEVBQUU7YUFDYixTQUFTLENBQUMsTUFBTSxDQUFDLEVBQUU7WUFDbEIsSUFBSSxNQUFNLEVBQUUsQ0FBQztnQkFDWCxJQUFJLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUN4QyxDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDOzhHQS9CVSxjQUFjO2tHQUFkLGNBQWMsMFdDcEIzQixtNkJBOEJNLGd0QkRuQkUsT0FBTzs7MkZBU0YsY0FBYztrQkFaMUIsU0FBUzsrQkFDSSxVQUFVLFdBQ1g7d0JBQ0wsT0FBTztxQkFDVixjQUNXLElBQUkiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIGluamVjdCwgaW5wdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgTWF0RGlhbG9nIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGlhbG9nJztcclxuaW1wb3J0IHsgQ29uZmlybWF0aW9uQ29tcG9uZW50IH0gZnJvbSAnQGNsZWF2ZWxhbmRwcmljZS9uZ3gtbGliL2RpYWxvZyc7XHJcblxyXG5pbXBvcnQgeyBNYXRJY29uIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvaWNvbic7XHJcbmltcG9ydCB7IE1hdEF1dGhlbnRpY2F0aW9uU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL21hdC1hdXRoZW50aWNhdGlvbi5zZXJ2aWNlJztcclxuaW1wb3J0IHsgTG9naW5Gb3JtQ29tcG9uZW50IH0gZnJvbSAnLi4vbG9naW4tZm9ybS9sb2dpbi1mb3JtLmNvbXBvbmVudCc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICAgIHNlbGVjdG9yOiAnY3AtbG9naW4nLFxyXG4gICAgaW1wb3J0czogW1xyXG4gICAgICAgIE1hdEljb24sXHJcbiAgICBdLFxyXG4gICAgc3RhbmRhbG9uZTogdHJ1ZSxcclxuICAgIHRlbXBsYXRlVXJsOiAnLi9sb2dpbi5jb21wb25lbnQuaHRtbCcsXHJcbiAgICBzdHlsZVVybHM6IFtcclxuICAgICAgICAnLi9sb2dpbi5jb21wb25lbnQuc2NzcycsXHJcbiAgICAgICAgJy4uLy4uLy4uLy4uLy4uL3N0eWxlcy9tYXQtaWNvbi5zY3NzJ1xyXG4gICAgXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgTG9naW5Db21wb25lbnQge1xyXG4gICNzZXJ2aWNlcyA9IHtcclxuICAgIGRpYWxvZzogaW5qZWN0KE1hdERpYWxvZylcclxuICB9O1xyXG4gIHNlcnZpY2VzID0ge1xyXG4gICAgYXV0aGVudGljYXRpb246IGluamVjdChNYXRBdXRoZW50aWNhdGlvblNlcnZpY2UpXHJcbiAgfTtcclxuICAvLyNlbmRyZWdpb25cclxuXHJcbiAgYWRtaW5Hcm91cCA9IGlucHV0PHN0cmluZz4oKTtcclxuICBhZGRpdGlvbmFsSW5mbyA9IGlucHV0PHN0cmluZz4oKTtcclxuXHJcbiAgbG9naW4oKTogdm9pZCB7XHJcbiAgICB0aGlzLiNzZXJ2aWNlcy5kaWFsb2cub3BlbihMb2dpbkZvcm1Db21wb25lbnQsIHtcclxuICAgICAgZGF0YToge1xyXG4gICAgICAgIGFkbWluR3JvdXA6IHRoaXMuYWRtaW5Hcm91cCgpLFxyXG4gICAgICAgIGFkZGl0aW9uYWxJbmZvOiB0aGlzLmFkZGl0aW9uYWxJbmZvKClcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBjb25maXJtTG9nb3V0KCk6IHZvaWQge1xyXG4gICAgdGhpcy4jc2VydmljZXMuZGlhbG9nLm9wZW4oQ29uZmlybWF0aW9uQ29tcG9uZW50LCB7XHJcbiAgICAgIGRhdGE6IHsgbWVzc2FnZTogYEFyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBsb2dvdXQ/YCB9XHJcbiAgICB9KVxyXG4gICAgLmFmdGVyQ2xvc2VkKClcclxuICAgIC5zdWJzY3JpYmUocmVzdWx0ID0+IHtcclxuICAgICAgaWYgKHJlc3VsdCkge1xyXG4gICAgICAgIHRoaXMuc2VydmljZXMuYXV0aGVudGljYXRpb24ubG9nb3V0KCk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxufVxyXG4iLCI8ZGl2IGlkPVwidXNlci1pZFwiPlxyXG4gIDwhLS0gTG9nZ2VkIG91dCAtLT5cclxuICA8IS0tIExvZ2dlZCBpbiAtLT5cclxuICBAaWYgKHNlcnZpY2VzLmF1dGhlbnRpY2F0aW9uLmF1dGhlbnRpY2F0ZWQpIHtcclxuICAgIDwhLS0gV2l0aCBwaG90byAtLT5cclxuICAgIEBpZiAoc2VydmljZXMuYXV0aGVudGljYXRpb24uYXV0aGVudGljYXRlZFVzZXI/LnBob3RvVXJsKSB7XHJcbiAgICAgIDxpbWdcclxuICAgICAgICBpZD1cImF1dGhlbnRpY2F0ZWQtdXNlci1pbWFnZVwiXHJcbiAgICAgICAgW3NyY109XCJzZXJ2aWNlcy5hdXRoZW50aWNhdGlvbi5hdXRoZW50aWNhdGVkVXNlcj8ucGhvdG9VcmxcIlxyXG4gICAgICAgIG1hdFRvb2x0aXA9XCJMb2dvdXRcIlxyXG4gICAgICAgIChjbGljayk9XCJjb25maXJtTG9nb3V0KClcIiAvPlxyXG4gICAgfSBAZWxzZSB7XHJcbiAgICAgIDwhLS0gV2l0aG91dCBwaG90byAtLT5cclxuICAgICAgPG1hdC1pY29uXHJcbiAgICAgICAgZm9udEljb249XCJhY2NvdW50X2NpcmNsZVwiXHJcbiAgICAgICAgbWF0VG9vbHRpcD1cIkxvZ291dFwiXHJcbiAgICAgICAgKGNsaWNrKT1cImNvbmZpcm1Mb2dvdXQoKVwiPlxyXG4gICAgICA8L21hdC1pY29uPlxyXG4gICAgfVxyXG4gICAgPCEtLSBOYW1lIC0tPlxyXG4gICAgPGRpdiBpZD1cInVzZXItbmFtZVwiPlxyXG4gICAgICB7eyBzZXJ2aWNlcy5hdXRoZW50aWNhdGlvbi5hdXRoZW50aWNhdGVkVXNlcj8uZGlzcGxheU5hbWUgfX1cclxuICAgIDwvZGl2PlxyXG4gIH0gQGVsc2Uge1xyXG4gICAgPG1hdC1pY29uXHJcbiAgICAgIGZvbnRJY29uPVwiYWNjb3VudF9jaXJjbGVcIlxyXG4gICAgICBtYXRUb29sdGlwPVwiTG9naW5cIlxyXG4gICAgICAoY2xpY2spPVwibG9naW4oKVwiPlxyXG4gICAgPC9tYXQtaWNvbj5cclxuICB9XHJcbjwvZGl2PiJdfQ==
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import { Component, inject } from '@angular/core';
|
|
2
|
+
import { FormControl, FormGroup, ReactiveFormsModule, Validators } from '@angular/forms';
|
|
3
|
+
import { MAT_DIALOG_DATA, MatDialogActions, MatDialogContent, MatDialogRef } from '@angular/material/dialog';
|
|
4
|
+
import { MatButton } from '@angular/material/button';
|
|
5
|
+
import { MatFormField } from '@angular/material/form-field';
|
|
6
|
+
import { MatIcon } from '@angular/material/icon';
|
|
7
|
+
import { MatInput } from '@angular/material/input';
|
|
8
|
+
import { MatProgressSpinner } from '@angular/material/progress-spinner';
|
|
9
|
+
import { MatSlideToggle } from '@angular/material/slide-toggle';
|
|
10
|
+
import { MatAuthenticationService } from '../../services/mat-authentication.service';
|
|
11
|
+
import * as i0 from "@angular/core";
|
|
12
|
+
import * as i1 from "@angular/forms";
|
|
13
|
+
export class LoginFormComponent {
|
|
14
|
+
constructor() {
|
|
15
|
+
this.#data = inject(MAT_DIALOG_DATA);
|
|
16
|
+
this.services = {
|
|
17
|
+
dialogRef: inject((MatDialogRef)),
|
|
18
|
+
authentication: inject(MatAuthenticationService)
|
|
19
|
+
};
|
|
20
|
+
this.form = new FormGroup({
|
|
21
|
+
username: new FormControl(null, [Validators.required]),
|
|
22
|
+
password: new FormControl(null, [Validators.required]),
|
|
23
|
+
adminGroup: new FormControl(),
|
|
24
|
+
additionalInfo: new FormControl()
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
#data;
|
|
28
|
+
ngOnInit() {
|
|
29
|
+
this.form.get('adminGroup')?.setValue(this.#data.adminGroup);
|
|
30
|
+
this.form.get('additionalInfo')?.setValue(this.#data.additionalInfo);
|
|
31
|
+
this.authenticatedChangedSubscription = this.services.authentication.authenticatedChanged
|
|
32
|
+
.subscribe(this.#authChangedHandler.bind(this));
|
|
33
|
+
this.authenticationErrorSubscription = this.services.authentication.authenticationError
|
|
34
|
+
.subscribe(this.#errorHandler.bind(this));
|
|
35
|
+
}
|
|
36
|
+
ngOnDestroy() {
|
|
37
|
+
this.authenticationErrorSubscription.unsubscribe();
|
|
38
|
+
this.authenticatedChangedSubscription.unsubscribe();
|
|
39
|
+
}
|
|
40
|
+
authenticate() {
|
|
41
|
+
this.errorMessage = undefined;
|
|
42
|
+
const { username, password, adminGroup, additionalInfo } = this.form.value;
|
|
43
|
+
this.services.authentication.login(username, password, adminGroup, additionalInfo);
|
|
44
|
+
}
|
|
45
|
+
#authChangedHandler(authenticated) {
|
|
46
|
+
if (authenticated) {
|
|
47
|
+
this.services.dialogRef.close();
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
#errorHandler(err) {
|
|
51
|
+
console.log('Authentication error', err);
|
|
52
|
+
this.errorMessage = `${err.name}: ${err.statusText}`;
|
|
53
|
+
}
|
|
54
|
+
changeTokenStorageMode(checked) {
|
|
55
|
+
const keyName = 'storeTokenInSession';
|
|
56
|
+
if (checked) {
|
|
57
|
+
if (localStorage.getItem(keyName)) {
|
|
58
|
+
localStorage.removeItem(keyName);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
else {
|
|
62
|
+
localStorage.setItem(keyName, 'true');
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.0", ngImport: i0, type: LoginFormComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
66
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.0", type: LoginFormComponent, isStandalone: true, selector: "ng-component", ngImport: i0, template: "<h2 mat-dialog-title>\r\n @if (services.authentication.authenticating) {\r\n <span>Authenticating...</span>\r\n } @else {\r\n <span>Login</span>\r\n }\r\n</h2>\r\n\r\n<mat-dialog-content>\r\n @if (services.authentication.authenticating) {\r\n <div id=\"spinner\">\r\n <mat-progress-spinner color=\"primary\" mode=\"indeterminate\"/>\r\n </div>\r\n } @else if (errorMessage) {\r\n <div id=\"error\">\r\n {{ errorMessage }}\r\n </div>\r\n } @else {\r\n <form [formGroup]=\"form\">\r\n <mat-form-field>\r\n <input matInput formControlName=\"username\" placeholder=\"Username\" (keyup.enter)=\"authenticate()\">\r\n </mat-form-field>\r\n <mat-form-field>\r\n <input matInput formControlName=\"password\" type=\"password\" placeholder=\"Password\" (keyup.enter)=\"authenticate()\">\r\n </mat-form-field>\r\n @if (services.authentication.options.showRememberMeOption) {\r\n <mat-slide-toggle [checked]=\"!services.authentication.useSessionStorage\" (change)=\"changeTokenStorageMode($event.checked)\">\r\n Remember me next time\r\n </mat-slide-toggle>\r\n }\r\n </form>\r\n }\r\n</mat-dialog-content>\r\n\r\n@if (!services.authentication.authenticating) {\r\n <mat-dialog-actions>\r\n <button mat-raised-button color=\"primary\" (click)=\"authenticate()\"\r\n [disabled]=\"form.invalid\">\r\n <mat-icon fontIcon=\"done\"/>\r\n <span>OK</span>\r\n </button>\r\n <button mat-raised-button (click)=\"services.dialogRef.close()\">\r\n <mat-icon fontIcon=\"close\"/>\r\n <span>Cancel</span>\r\n </button>\r\n </mat-dialog-actions>\r\n}", styles: ["#spinner{width:100%;height:100%;display:flex;justify-content:center;align-items:center}form{display:grid;gap:1rem}mat-dialog-actions{display:grid;justify-content:center;grid-template-columns:auto auto;gap:1rem}#error{color:red}\n", ".material-icons{font-family:Material Icons;font-weight:400;font-style:normal;font-size:24px;display:inline-block;line-height:1;text-transform:none;letter-spacing:normal;word-wrap:normal;white-space:nowrap;direction:ltr;-webkit-font-smoothing:antialiased;text-rendering:optimizeLegibility;-moz-osx-font-smoothing:grayscale;font-feature-settings:\"liga\"}\n"], dependencies: [{ kind: "component", type: MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "directive", type: MatDialogActions, selector: "[mat-dialog-actions], mat-dialog-actions, [matDialogActions]", inputs: ["align"] }, { kind: "directive", type: MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { kind: "component", type: MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "component", type: MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: 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: MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }, { kind: "component", type: MatSlideToggle, selector: "mat-slide-toggle", inputs: ["name", "id", "labelPosition", "aria-label", "aria-labelledby", "aria-describedby", "required", "color", "disabled", "disableRipple", "tabIndex", "checked", "hideIcon"], outputs: ["change", "toggleChange"], exportAs: ["matSlideToggle"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { 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.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }] }); }
|
|
67
|
+
}
|
|
68
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.0", ngImport: i0, type: LoginFormComponent, decorators: [{
|
|
69
|
+
type: Component,
|
|
70
|
+
args: [{ imports: [
|
|
71
|
+
MatButton,
|
|
72
|
+
MatDialogActions,
|
|
73
|
+
MatDialogContent,
|
|
74
|
+
MatFormField,
|
|
75
|
+
MatIcon,
|
|
76
|
+
MatInput,
|
|
77
|
+
MatProgressSpinner,
|
|
78
|
+
MatSlideToggle,
|
|
79
|
+
ReactiveFormsModule
|
|
80
|
+
], standalone: true, template: "<h2 mat-dialog-title>\r\n @if (services.authentication.authenticating) {\r\n <span>Authenticating...</span>\r\n } @else {\r\n <span>Login</span>\r\n }\r\n</h2>\r\n\r\n<mat-dialog-content>\r\n @if (services.authentication.authenticating) {\r\n <div id=\"spinner\">\r\n <mat-progress-spinner color=\"primary\" mode=\"indeterminate\"/>\r\n </div>\r\n } @else if (errorMessage) {\r\n <div id=\"error\">\r\n {{ errorMessage }}\r\n </div>\r\n } @else {\r\n <form [formGroup]=\"form\">\r\n <mat-form-field>\r\n <input matInput formControlName=\"username\" placeholder=\"Username\" (keyup.enter)=\"authenticate()\">\r\n </mat-form-field>\r\n <mat-form-field>\r\n <input matInput formControlName=\"password\" type=\"password\" placeholder=\"Password\" (keyup.enter)=\"authenticate()\">\r\n </mat-form-field>\r\n @if (services.authentication.options.showRememberMeOption) {\r\n <mat-slide-toggle [checked]=\"!services.authentication.useSessionStorage\" (change)=\"changeTokenStorageMode($event.checked)\">\r\n Remember me next time\r\n </mat-slide-toggle>\r\n }\r\n </form>\r\n }\r\n</mat-dialog-content>\r\n\r\n@if (!services.authentication.authenticating) {\r\n <mat-dialog-actions>\r\n <button mat-raised-button color=\"primary\" (click)=\"authenticate()\"\r\n [disabled]=\"form.invalid\">\r\n <mat-icon fontIcon=\"done\"/>\r\n <span>OK</span>\r\n </button>\r\n <button mat-raised-button (click)=\"services.dialogRef.close()\">\r\n <mat-icon fontIcon=\"close\"/>\r\n <span>Cancel</span>\r\n </button>\r\n </mat-dialog-actions>\r\n}", styles: ["#spinner{width:100%;height:100%;display:flex;justify-content:center;align-items:center}form{display:grid;gap:1rem}mat-dialog-actions{display:grid;justify-content:center;grid-template-columns:auto auto;gap:1rem}#error{color:red}\n", ".material-icons{font-family:Material Icons;font-weight:400;font-style:normal;font-size:24px;display:inline-block;line-height:1;text-transform:none;letter-spacing:normal;word-wrap:normal;white-space:nowrap;direction:ltr;-webkit-font-smoothing:antialiased;text-rendering:optimizeLegibility;-moz-osx-font-smoothing:grayscale;font-feature-settings:\"liga\"}\n"] }]
|
|
81
|
+
}] });
|
|
82
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9naW4tZm9ybS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jbGVhdmVsYW5kcHJpY2Uvbmd4LWxpYi9hdXRoZW50aWNhdGlvbi9tYXRlcmlhbC9zcmMvY29tcG9uZW50cy9sb2dpbi1mb3JtL2xvZ2luLWZvcm0uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY2xlYXZlbGFuZHByaWNlL25neC1saWIvYXV0aGVudGljYXRpb24vbWF0ZXJpYWwvc3JjL2NvbXBvbmVudHMvbG9naW4tZm9ybS9sb2dpbi1mb3JtLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUE0QyxNQUFNLGVBQWUsQ0FBQztBQUM1RixPQUFPLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxtQkFBbUIsRUFBRSxVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN6RixPQUFPLEVBQUUsZUFBZSxFQUFFLGdCQUFnQixFQUFFLGdCQUFnQixFQUFFLFlBQVksRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBRTdHLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUNyRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDNUQsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ2pELE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUNuRCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUN4RSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFFaEUsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sMkNBQTJDLENBQUM7OztBQXFCckYsTUFBTSxPQUFPLGtCQUFrQjtJ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QUM7SUFDSCxDQUFDOzhHQTlEVSxrQkFBa0I7a0dBQWxCLGtCQUFrQix3RUNoQy9CLHlvREE4Q0Msc29CRDlCTyxTQUFTLGlMQUNULGdCQUFnQiw0SEFDaEIsZ0JBQWdCLHlHQUNoQixZQUFZLDRMQUNaLE9BQU8sMklBQ1AsUUFBUSxpVUFDUixrQkFBa0IsK0tBQ2xCLGNBQWMsa1RBQ2QsbUJBQW1COzsyRkFRZCxrQkFBa0I7a0JBbkI5QixTQUFTOzhCQUVHO3dCQUNMLFNBQVM7d0JBQ1QsZ0JBQWdCO3dCQUNoQixnQkFBZ0I7d0JBQ2hCLFlBQVk7d0JBQ1osT0FBTzt3QkFDUCxRQUFRO3dCQUNSLGtCQUFrQjt3QkFDbEIsY0FBYzt3QkFDZCxtQkFBbUI7cUJBQ3RCLGNBQ1csSUFBSSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgaW5qZWN0LCBPbkRlc3Ryb3ksIE9uSW5pdCwgT3V0cHV0UmVmU3Vic2NyaXB0aW9uIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEZvcm1Db250cm9sLCBGb3JtR3JvdXAsIFJlYWN0aXZlRm9ybXNNb2R1bGUsIFZhbGlkYXRvcnMgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IE1BVF9ESUFMT0dfREFUQSwgTWF0RGlhbG9nQWN0aW9ucywgTWF0RGlhbG9nQ29udGVudCwgTWF0RGlhbG9nUmVmIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGlhbG9nJztcclxuXHJcbmltcG9ydCB7IE1hdEJ1dHRvbiB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2J1dHRvbic7XHJcbmltcG9ydCB7IE1hdEZvcm1GaWVsZCB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2Zvcm0tZmllbGQnO1xyXG5pbXBvcnQgeyBNYXRJY29uIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvaWNvbic7XHJcbmltcG9ydCB7IE1hdElucHV0IH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvaW5wdXQnO1xyXG5pbXBvcnQgeyBNYXRQcm9ncmVzc1NwaW5uZXIgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9wcm9ncmVzcy1zcGlubmVyJztcclxuaW1wb3J0IHsgTWF0U2xpZGVUb2dnbGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9zbGlkZS10b2dnbGUnO1xyXG5pbXBvcnQgeyBMb2dpbkZvcm1EYXRhIH0gZnJvbSAnLi4vLi4vbW9kZWwvbG9naW4tZm9ybS1kYXRhJztcclxuaW1wb3J0IHsgTWF0QXV0aGVudGljYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvbWF0LWF1dGhlbnRpY2F0aW9uLnNlcnZpY2UnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgICB0ZW1wbGF0ZVVybDogJy4vbG9naW4tZm9ybS5jb21wb25lbnQuaHRtbCcsXHJcbiAgICBpbXBvcnRzOiBbXHJcbiAgICAgICAgTWF0QnV0dG9uLFxyXG4gICAgICAgIE1hdERpYWxvZ0FjdGlvbnMsXHJcbiAgICAgICAgTWF0RGlhbG9nQ29udGVudCxcclxuICAgICAgICBNYXRGb3JtRmllbGQsXHJcbiAgICAgICAgTWF0SWNvbixcclxuICAgICAgICBNYXRJbnB1dCxcclxuICAgICAgICBNYXRQcm9ncmVzc1NwaW5uZXIsXHJcbiAgICAgICAgTWF0U2xpZGVUb2dnbGUsXHJcbiAgICAgICAgUmVhY3RpdmVGb3Jtc01vZHVsZVxyXG4gICAgXSxcclxuICAgIHN0YW5kYWxvbmU6IHRydWUsXHJcbiAgICBzdHlsZVVybHM6IFtcclxuICAgICAgICAnLi9sb2dpbi1mb3JtLmNvbXBvbmVudC5zY3NzJyxcclxuICAgICAgICAnLi4vLi4vLi4vLi4vLi4vc3R5bGVzL21hdC1pY29uLnNjc3MnXHJcbiAgICBdXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBMb2dpbkZvcm1Db21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XHJcbiAgI2RhdGEgPSBpbmplY3Q8TG9naW5Gb3JtRGF0YT4oTUFUX0RJQUxPR19EQVRBKTtcclxuXHJcbiAgc2VydmljZXMgPSB7XHJcbiAgICBkaWFsb2dSZWY6IGluamVjdChNYXREaWFsb2dSZWY8TG9naW5Gb3JtQ29tcG9uZW50PiksXHJcbiAgICBhdXRoZW50aWNhdGlvbjogaW5qZWN0KE1hdEF1dGhlbnRpY2F0aW9uU2VydmljZSlcclxuICB9O1xyXG5cclxuICBlcnJvck1lc3NhZ2U/OiBzdHJpbmc7XHJcbiAgYXV0aGVudGljYXRlZENoYW5nZWRTdWJzY3JpcHRpb24hOiBPdXRwdXRSZWZTdWJzY3JpcHRpb247XHJcbiAgYXV0aGVudGljYXRpb25FcnJvclN1YnNjcmlwdGlvbiE6IE91dHB1dFJlZlN1YnNjcmlwdGlvbjtcclxuXHJcbiAgZm9ybSA9IG5ldyBGb3JtR3JvdXAoe1xyXG4gICAgdXNlcm5hbWU6IG5ldyBGb3JtQ29udHJvbChudWxsLCBbIFZhbGlkYXRvcnMucmVxdWlyZWQgXSksXHJcbiAgICBwYXNzd29yZDogbmV3IEZvcm1Db250cm9sKG51bGwsIFsgVmFsaWRhdG9ycy5yZXF1aXJlZCBdKSxcclxuICAgIGFkbWluR3JvdXA6IG5ldyBGb3JtQ29udHJvbCgpLFxyXG4gICAgYWRkaXRpb25hbEluZm86IG5ldyBGb3JtQ29udHJvbCgpXHJcbiAgfSk7XHJcblxyXG4gIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgdGhpcy5mb3JtLmdldCgnYWRtaW5Hcm91cCcpPy5zZXRWYWx1ZSh0aGlzLiNkYXRhLmFkbWluR3JvdXApO1xyXG4gICAgdGhpcy5mb3JtLmdldCgnYWRkaXRpb25hbEluZm8nKT8uc2V0VmFsdWUodGhpcy4jZGF0YS5hZGRpdGlvbmFsSW5mbyk7XHJcblxyXG4gICAgdGhpcy5hdXRoZW50aWNhdGVkQ2hhbmdlZFN1YnNjcmlwdGlvbiA9IHRoaXMuc2VydmljZXMuYXV0aGVudGljYXRpb24uYXV0aGVudGljYXRlZENoYW5nZWRcclxuICAgICAgLnN1YnNjcmliZSh0aGlzLiNhdXRoQ2hhbmdlZEhhbmRsZXIuYmluZCh0aGlzKSk7XHJcblxyXG4gICAgdGhpcy5hdXRoZW50aWNhdGlvbkVycm9yU3Vic2NyaXB0aW9uID0gdGhpcy5zZXJ2aWNlcy5hdXRoZW50aWNhdGlvbi5hdXRoZW50aWNhdGlvbkVycm9yXHJcbiAgICAgIC5zdWJzY3JpYmUodGhpcy4jZXJyb3JIYW5kbGVyLmJpbmQodGhpcykpO1xyXG4gIH1cclxuXHJcbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICB0aGlzLmF1dGhlbnRpY2F0aW9uRXJyb3JTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcclxuICAgIHRoaXMuYXV0aGVudGljYXRlZENoYW5nZWRTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcclxuICB9XHJcblxyXG4gIGF1dGhlbnRpY2F0ZSgpIHtcclxuICAgIHRoaXMuZXJyb3JNZXNzYWdlID0gdW5kZWZpbmVkO1xyXG4gICAgY29uc3QgeyB1c2VybmFtZSwgcGFzc3dvcmQsIGFkbWluR3JvdXAsIGFkZGl0aW9uYWxJbmZvIH0gPSB0aGlzLmZvcm0udmFsdWU7XHJcbiAgICB0aGlzLnNlcnZpY2VzLmF1dGhlbnRpY2F0aW9uLmxvZ2luKHVzZXJuYW1lISwgcGFzc3dvcmQhLCBhZG1pbkdyb3VwLCBhZGRpdGlvbmFsSW5mbyk7XHJcbiAgfVxyXG5cclxuICAjYXV0aENoYW5nZWRIYW5kbGVyKGF1dGhlbnRpY2F0ZWQ6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIGlmIChhdXRoZW50aWNhdGVkKSB7XHJcbiAgICAgIHRoaXMuc2VydmljZXMuZGlhbG9nUmVmLmNsb3NlKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAjZXJyb3JIYW5kbGVyKGVycjogYW55KTogdm9pZCB7XHJcbiAgICBjb25zb2xlLmxvZygnQXV0aGVudGljYXRpb24gZXJyb3InLCBlcnIpO1xyXG4gICAgdGhpcy5lcnJvck1lc3NhZ2UgPSBgJHtlcnIubmFtZX06ICR7ZXJyLnN0YXR1c1RleHR9YDtcclxuICB9XHJcblxyXG4gIGNoYW5nZVRva2VuU3RvcmFnZU1vZGUoY2hlY2tlZDogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgY29uc3Qga2V5TmFtZSA9ICdzdG9yZVRva2VuSW5TZXNzaW9uJztcclxuXHJcbiAgICBpZiAoY2hlY2tlZCkge1xyXG4gICAgICBpZiAobG9jYWxTdG9yYWdlLmdldEl0ZW0oa2V5TmFtZSkpIHtcclxuICAgICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShrZXlOYW1lKTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oa2V5TmFtZSwgJ3RydWUnKTtcclxuICAgIH1cclxuICB9XHJcbn1cclxuIiwiPGgyIG1hdC1kaWFsb2ctdGl0bGU+XHJcbiAgQGlmIChzZXJ2aWNlcy5hdXRoZW50aWNhdGlvbi5hdXRoZW50aWNhdGluZykge1xyXG4gICAgPHNwYW4+QXV0aGVudGljYXRpbmcuLi48L3NwYW4+XHJcbiAgfSBAZWxzZSB7XHJcbiAgICA8c3Bhbj5Mb2dpbjwvc3Bhbj5cclxuICB9XHJcbjwvaDI+XHJcblxyXG48bWF0LWRpYWxvZy1jb250ZW50PlxyXG4gIEBpZiAoc2VydmljZXMuYXV0aGVudGljYXRpb24uYXV0aGVudGljYXRpbmcpIHtcclxuICAgIDxkaXYgaWQ9XCJzcGlubmVyXCI+XHJcbiAgICAgIDxtYXQtcHJvZ3Jlc3Mtc3Bpbm5lciBjb2xvcj1cInByaW1hcnlcIiBtb2RlPVwiaW5kZXRlcm1pbmF0ZVwiLz5cclxuICAgIDwvZGl2PlxyXG4gIH0gQGVsc2UgaWYgKGVycm9yTWVzc2FnZSkge1xyXG4gICAgPGRpdiBpZD1cImVycm9yXCI+XHJcbiAgICAgIHt7IGVycm9yTWVzc2FnZSB9fVxyXG4gICAgPC9kaXY+XHJcbiAgfSBAZWxzZSB7XHJcbiAgICA8Zm9ybSBbZm9ybUdyb3VwXT1cImZvcm1cIj5cclxuICAgICAgPG1hdC1mb3JtLWZpZWxkPlxyXG4gICAgICAgIDxpbnB1dCBtYXRJbnB1dCBmb3JtQ29udHJvbE5hbWU9XCJ1c2VybmFtZVwiIHBsYWNlaG9sZGVyPVwiVXNlcm5hbWVcIiAoa2V5dXAuZW50ZXIpPVwiYXV0aGVudGljYXRlKClcIj5cclxuICAgICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICAgICAgPG1hdC1mb3JtLWZpZWxkPlxyXG4gICAgICAgIDxpbnB1dCBtYXRJbnB1dCBmb3JtQ29udHJvbE5hbWU9XCJwYXNzd29yZFwiIHR5cGU9XCJwYXNzd29yZFwiIHBsYWNlaG9sZGVyPVwiUGFzc3dvcmRcIiAoa2V5dXAuZW50ZXIpPVwiYXV0aGVudGljYXRlKClcIj5cclxuICAgICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICAgICAgQGlmIChzZXJ2aWNlcy5hdXRoZW50aWNhdGlvbi5vcHRpb25zLnNob3dSZW1lbWJlck1lT3B0aW9uKSB7XHJcbiAgICAgICAgPG1hdC1zbGlkZS10b2dnbGUgW2NoZWNrZWRdPVwiIXNlcnZpY2VzLmF1dGhlbnRpY2F0aW9uLnVzZVNlc3Npb25TdG9yYWdlXCIgKGNoYW5nZSk9XCJjaGFuZ2VUb2tlblN0b3JhZ2VNb2RlKCRldmVudC5jaGVja2VkKVwiPlxyXG4gICAgICAgICAgUmVtZW1iZXIgbWUgbmV4dCB0aW1lXHJcbiAgICAgICAgPC9tYXQtc2xpZGUtdG9nZ2xlPlxyXG4gICAgICB9XHJcbiAgICA8L2Zvcm0+XHJcbiAgfVxyXG48L21hdC1kaWFsb2ctY29udGVudD5cclxuXHJcbkBpZiAoIXNlcnZpY2VzLmF1dGhlbnRpY2F0aW9uLmF1dGhlbnRpY2F0aW5nKSB7XHJcbiAgPG1hdC1kaWFsb2ctYWN0aW9ucz5cclxuICAgIDxidXR0b24gbWF0LXJhaXNlZC1idXR0b24gY29sb3I9XCJwcmltYXJ5XCIgKGNsaWNrKT1cImF1dGhlbnRpY2F0ZSgpXCJcclxuICAgICAgW2Rpc2FibGVkXT1cImZvcm0uaW52YWxpZFwiPlxyXG4gICAgICA8bWF0LWljb24gZm9udEljb249XCJkb25lXCIvPlxyXG4gICAgICA8c3Bhbj5PSzwvc3Bhbj5cclxuICAgIDwvYnV0dG9uPlxyXG4gICAgPGJ1dHRvbiBtYXQtcmFpc2VkLWJ1dHRvbiAoY2xpY2spPVwic2VydmljZXMuZGlhbG9nUmVmLmNsb3NlKClcIj5cclxuICAgICAgPG1hdC1pY29uIGZvbnRJY29uPVwiY2xvc2VcIi8+XHJcbiAgICAgIDxzcGFuPkNhbmNlbDwvc3Bhbj5cclxuICAgIDwvYnV0dG9uPlxyXG4gIDwvbWF0LWRpYWxvZy1hY3Rpb25zPlxyXG59Il19
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export * from './model/login-form-data';
|
|
2
|
+
export * from './model/mat-authentication-service-options';
|
|
3
|
+
export * from './model/mat-authentication-service-options-token';
|
|
4
|
+
export * from './services/mat-authentication.service';
|
|
5
|
+
export * from './components/login-form/login-form.component';
|
|
6
|
+
export * from './components/login/login.component';
|
|
7
|
+
export * from './mat-authentication.module';
|
|
8
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWF0LWF1dGhlbnRpY2F0aW9uLmFwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NsZWF2ZWxhbmRwcmljZS9uZ3gtbGliL2F1dGhlbnRpY2F0aW9uL21hdGVyaWFsL3NyYy9tYXQtYXV0aGVudGljYXRpb24uYXBpLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWMseUJBQXlCLENBQUM7QUFDeEMsY0FBYyw0Q0FBNEMsQ0FBQztBQUMzRCxjQUFjLGtEQUFrRCxDQUFDO0FBRWpFLGNBQWMsdUNBQXVDLENBQUM7QUFFdEQsY0FBYyw4Q0FBOEMsQ0FBQztBQUM3RCxjQUFjLG9DQUFvQyxDQUFDO0FBRW5ELGNBQWMsNkJBQTZCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tICcuL21vZGVsL2xvZ2luLWZvcm0tZGF0YSc7XHJcbmV4cG9ydCAqIGZyb20gJy4vbW9kZWwvbWF0LWF1dGhlbnRpY2F0aW9uLXNlcnZpY2Utb3B0aW9ucyc7XHJcbmV4cG9ydCAqIGZyb20gJy4vbW9kZWwvbWF0LWF1dGhlbnRpY2F0aW9uLXNlcnZpY2Utb3B0aW9ucy10b2tlbic7XHJcblxyXG5leHBvcnQgKiBmcm9tICcuL3NlcnZpY2VzL21hdC1hdXRoZW50aWNhdGlvbi5zZXJ2aWNlJztcclxuXHJcbmV4cG9ydCAqIGZyb20gJy4vY29tcG9uZW50cy9sb2dpbi1mb3JtL2xvZ2luLWZvcm0uY29tcG9uZW50JztcclxuZXhwb3J0ICogZnJvbSAnLi9jb21wb25lbnRzL2xvZ2luL2xvZ2luLmNvbXBvbmVudCc7XHJcblxyXG5leHBvcnQgKiBmcm9tICcuL21hdC1hdXRoZW50aWNhdGlvbi5tb2R1bGUnO1xyXG5cclxuIl19
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { CommonModule } from '@angular/common';
|
|
2
|
+
import { NgModule, Optional, SkipSelf } from '@angular/core';
|
|
3
|
+
import { ReactiveFormsModule } from '@angular/forms';
|
|
4
|
+
import { MatButtonModule } from '@angular/material/button';
|
|
5
|
+
import { MatDialogModule } from '@angular/material/dialog';
|
|
6
|
+
import { MatFormFieldModule } from '@angular/material/form-field';
|
|
7
|
+
import { MatIconModule } from '@angular/material/icon';
|
|
8
|
+
import { MatInputModule } from '@angular/material/input';
|
|
9
|
+
import { MatProgressSpinnerModule } from '@angular/material/progress-spinner';
|
|
10
|
+
import { MatSlideToggleModule } from '@angular/material/slide-toggle';
|
|
11
|
+
import { LoginFormComponent } from './components/login-form/login-form.component';
|
|
12
|
+
import { LoginComponent } from './components/login/login.component';
|
|
13
|
+
import { MatAuthenticationServiceOptionsToken } from './model/mat-authentication-service-options-token';
|
|
14
|
+
import * as i0 from "@angular/core";
|
|
15
|
+
export class MatAuthenticationModule {
|
|
16
|
+
static forRoot(options) {
|
|
17
|
+
return {
|
|
18
|
+
ngModule: MatAuthenticationModule,
|
|
19
|
+
providers: [
|
|
20
|
+
{
|
|
21
|
+
provide: MatAuthenticationServiceOptionsToken,
|
|
22
|
+
useValue: options
|
|
23
|
+
}
|
|
24
|
+
]
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
constructor(parentModule) {
|
|
28
|
+
if (parentModule) {
|
|
29
|
+
throw new Error('MatAuthenticationModule is already loaded. Import it in the AppModule only');
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.0", ngImport: i0, type: MatAuthenticationModule, deps: [{ token: MatAuthenticationModule, optional: true, skipSelf: true }], target: i0.ɵɵFactoryTarget.NgModule }); }
|
|
33
|
+
static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "17.3.0", ngImport: i0, type: MatAuthenticationModule, imports: [CommonModule,
|
|
34
|
+
ReactiveFormsModule,
|
|
35
|
+
MatButtonModule,
|
|
36
|
+
MatDialogModule,
|
|
37
|
+
MatFormFieldModule,
|
|
38
|
+
MatIconModule,
|
|
39
|
+
MatInputModule,
|
|
40
|
+
MatProgressSpinnerModule,
|
|
41
|
+
MatSlideToggleModule,
|
|
42
|
+
LoginComponent,
|
|
43
|
+
LoginFormComponent], exports: [LoginComponent,
|
|
44
|
+
LoginFormComponent] }); }
|
|
45
|
+
static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "17.3.0", ngImport: i0, type: MatAuthenticationModule, imports: [CommonModule,
|
|
46
|
+
ReactiveFormsModule,
|
|
47
|
+
MatButtonModule,
|
|
48
|
+
MatDialogModule,
|
|
49
|
+
MatFormFieldModule,
|
|
50
|
+
MatIconModule,
|
|
51
|
+
MatInputModule,
|
|
52
|
+
MatProgressSpinnerModule,
|
|
53
|
+
MatSlideToggleModule,
|
|
54
|
+
LoginComponent,
|
|
55
|
+
LoginFormComponent] }); }
|
|
56
|
+
}
|
|
57
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.0", ngImport: i0, type: MatAuthenticationModule, decorators: [{
|
|
58
|
+
type: NgModule,
|
|
59
|
+
args: [{
|
|
60
|
+
declarations: [],
|
|
61
|
+
imports: [
|
|
62
|
+
CommonModule,
|
|
63
|
+
ReactiveFormsModule,
|
|
64
|
+
MatButtonModule,
|
|
65
|
+
MatDialogModule,
|
|
66
|
+
MatFormFieldModule,
|
|
67
|
+
MatIconModule,
|
|
68
|
+
MatInputModule,
|
|
69
|
+
MatProgressSpinnerModule,
|
|
70
|
+
MatSlideToggleModule,
|
|
71
|
+
LoginComponent,
|
|
72
|
+
LoginFormComponent
|
|
73
|
+
],
|
|
74
|
+
exports: [
|
|
75
|
+
LoginComponent,
|
|
76
|
+
LoginFormComponent
|
|
77
|
+
]
|
|
78
|
+
}]
|
|
79
|
+
}], ctorParameters: () => [{ type: MatAuthenticationModule, decorators: [{
|
|
80
|
+
type: Optional
|
|
81
|
+
}, {
|
|
82
|
+
type: SkipSelf
|
|
83
|
+
}] }] });
|
|
84
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWF0LWF1dGhlbnRpY2F0aW9uLm1vZHVsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NsZWF2ZWxhbmRwcmljZS9uZ3gtbGliL2F1dGhlbnRpY2F0aW9uL21hdGVyaWFsL3NyYy9tYXQtYXV0aGVudGljYXRpb24ubW9kdWxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQXVCLFFBQVEsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2xGLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRXJELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDM0QsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDbEUsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUM5RSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUt0RSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw4Q0FBOEMsQ0FBQztBQUNsRixPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDcEUsT0FBTyxFQUFFLG9DQUFvQyxFQUFFLE1BQU0sa0RBQWtELENBQUM7O0FBd0J4RyxNQUFNLE9BQU8sdUJBQXVCO0lBQ2xDLE1BQU0sQ0FBQyxPQUFPLENBQUMsT0FBd0M7UUFDckQsT0FBTztZQUNMLFFBQVEsRUFBRSx1QkFBdUI7WUFDakMsU0FBUyxFQUFFO2dCQUNUO29CQUNFLE9BQU8sRUFBRSxvQ0FBb0M7b0JBQzdDLFFBQVEsRUFBRSxPQUFPO2lCQUNsQjthQUNGO1NBQ0YsQ0FBQztJQUNKLENBQUM7SUFFRCxZQUFvQyxZQUFxQztRQUN2RSxJQUFJLFlBQVksRUFBRSxDQUFDO1lBQ2pCLE1BQU0sSUFBSSxLQUFLLENBQ2IsNEVBQTRFLENBQUMsQ0FBQztRQUNsRixDQUFDO0lBQ0gsQ0FBQzs4R0FsQlUsdUJBQXVCOytHQUF2Qix1QkFBdUIsWUFuQmhDLFlBQVk7WUFDWixtQkFBbUI7WUFFbkIsZUFBZTtZQUNmLGVBQWU7WUFDZixrQkFBa0I7WUFDbEIsYUFBYTtZQUNiLGNBQWM7WUFDZCx3QkFBd0I7WUFDeEIsb0JBQW9CO1lBRXBCLGNBQWM7WUFDZCxrQkFBa0IsYUFHbEIsY0FBYztZQUNkLGtCQUFrQjsrR0FHVCx1QkFBdUIsWUFuQmhDLFlBQVk7WUFDWixtQkFBbUI7WUFFbkIsZUFBZTtZQUNmLGVBQWU7WUFDZixrQkFBa0I7WUFDbEIsYUFBYTtZQUNiLGNBQWM7WUFDZCx3QkFBd0I7WUFDeEIsb0JBQW9CO1lBRXBCLGNBQWM7WUFDZCxrQkFBa0I7OzJGQU9ULHVCQUF1QjtrQkF0Qm5DLFFBQVE7bUJBQUM7b0JBQ1IsWUFBWSxFQUFFLEVBQUU7b0JBQ2hCLE9BQU8sRUFBRTt3QkFDUCxZQUFZO3dCQUNaLG1CQUFtQjt3QkFFbkIsZUFBZTt3QkFDZixlQUFlO3dCQUNmLGtCQUFrQjt3QkFDbEIsYUFBYTt3QkFDYixjQUFjO3dCQUNkLHdCQUF3Qjt3QkFDeEIsb0JBQW9CO3dCQUVwQixjQUFjO3dCQUNkLGtCQUFrQjtxQkFDbkI7b0JBQ0QsT0FBTyxFQUFFO3dCQUNQLGNBQWM7d0JBQ2Qsa0JBQWtCO3FCQUNuQjtpQkFDRjs7MEJBY2MsUUFBUTs7MEJBQUksUUFBUSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XHJcbmltcG9ydCB7IE1vZHVsZVdpdGhQcm92aWRlcnMsIE5nTW9kdWxlLCBPcHRpb25hbCwgU2tpcFNlbGYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgUmVhY3RpdmVGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuXHJcbmltcG9ydCB7IE1hdEJ1dHRvbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2J1dHRvbic7XHJcbmltcG9ydCB7IE1hdERpYWxvZ01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2RpYWxvZyc7XHJcbmltcG9ydCB7IE1hdEZvcm1GaWVsZE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2Zvcm0tZmllbGQnO1xyXG5pbXBvcnQgeyBNYXRJY29uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvaWNvbic7XHJcbmltcG9ydCB7IE1hdElucHV0TW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvaW5wdXQnO1xyXG5pbXBvcnQgeyBNYXRQcm9ncmVzc1NwaW5uZXJNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9wcm9ncmVzcy1zcGlubmVyJztcclxuaW1wb3J0IHsgTWF0U2xpZGVUb2dnbGVNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9zbGlkZS10b2dnbGUnO1xyXG5cclxuaW1wb3J0IHsgTWF0QXV0aGVudGljYXRpb25TZXJ2aWNlT3B0aW9ucyB9IGZyb20gJy4vbW9kZWwvbWF0LWF1dGhlbnRpY2F0aW9uLXNlcnZpY2Utb3B0aW9ucyc7XHJcblxyXG5cclxuaW1wb3J0IHsgTG9naW5Gb3JtQ29tcG9uZW50IH0gZnJvbSAnLi9jb21wb25lbnRzL2xvZ2luLWZvcm0vbG9naW4tZm9ybS5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBMb2dpbkNvbXBvbmVudCB9IGZyb20gJy4vY29tcG9uZW50cy9sb2dpbi9sb2dpbi5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBNYXRBdXRoZW50aWNhdGlvblNlcnZpY2VPcHRpb25zVG9rZW4gfSBmcm9tICcuL21vZGVsL21hdC1hdXRoZW50aWNhdGlvbi1zZXJ2aWNlLW9wdGlvbnMtdG9rZW4nO1xyXG5cclxuQE5nTW9kdWxlKHtcclxuICBkZWNsYXJhdGlvbnM6IFtdLFxyXG4gIGltcG9ydHM6IFtcclxuICAgIENvbW1vbk1vZHVsZSxcclxuICAgIFJlYWN0aXZlRm9ybXNNb2R1bGUsXHJcbiAgICBcclxuICAgIE1hdEJ1dHRvbk1vZHVsZSxcclxuICAgIE1hdERpYWxvZ01vZHVsZSxcclxuICAgIE1hdEZvcm1GaWVsZE1vZHVsZSxcclxuICAgIE1hdEljb25Nb2R1bGUsXHJcbiAgICBNYXRJbnB1dE1vZHVsZSxcclxuICAgIE1hdFByb2dyZXNzU3Bpbm5lck1vZHVsZSxcclxuICAgIE1hdFNsaWRlVG9nZ2xlTW9kdWxlLFxyXG5cclxuICAgIExvZ2luQ29tcG9uZW50LFxyXG4gICAgTG9naW5Gb3JtQ29tcG9uZW50XHJcbiAgXSxcclxuICBleHBvcnRzOiBbXHJcbiAgICBMb2dpbkNvbXBvbmVudCxcclxuICAgIExvZ2luRm9ybUNvbXBvbmVudFxyXG4gIF1cclxufSlcclxuZXhwb3J0IGNsYXNzIE1hdEF1dGhlbnRpY2F0aW9uTW9kdWxlIHtcclxuICBzdGF0aWMgZm9yUm9vdChvcHRpb25zOiBNYXRBdXRoZW50aWNhdGlvblNlcnZpY2VPcHRpb25zKTogTW9kdWxlV2l0aFByb3ZpZGVyczxNYXRBdXRoZW50aWNhdGlvbk1vZHVsZT4ge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgbmdNb2R1bGU6IE1hdEF1dGhlbnRpY2F0aW9uTW9kdWxlLFxyXG4gICAgICBwcm92aWRlcnM6IFtcclxuICAgICAgICB7XHJcbiAgICAgICAgICBwcm92aWRlOiBNYXRBdXRoZW50aWNhdGlvblNlcnZpY2VPcHRpb25zVG9rZW4sXHJcbiAgICAgICAgICB1c2VWYWx1ZTogb3B0aW9uc1xyXG4gICAgICAgIH1cclxuICAgICAgXVxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIGNvbnN0cnVjdG9yKEBPcHRpb25hbCgpIEBTa2lwU2VsZigpIHBhcmVudE1vZHVsZTogTWF0QXV0aGVudGljYXRpb25Nb2R1bGUpIHtcclxuICAgIGlmIChwYXJlbnRNb2R1bGUpIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKFxyXG4gICAgICAgICdNYXRBdXRoZW50aWNhdGlvbk1vZHVsZSBpcyBhbHJlYWR5IGxvYWRlZC4gSW1wb3J0IGl0IGluIHRoZSBBcHBNb2R1bGUgb25seScpO1xyXG4gICAgfVxyXG4gIH1cclxufSJdfQ==
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export {};
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9naW4tZm9ybS1kYXRhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY2xlYXZlbGFuZHByaWNlL25neC1saWIvYXV0aGVudGljYXRpb24vbWF0ZXJpYWwvc3JjL21vZGVsL2xvZ2luLWZvcm0tZGF0YS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGludGVyZmFjZSBMb2dpbkZvcm1EYXRhIHtcclxuICAgIGFkbWluR3JvdXA6IHN0cmluZztcclxuICAgIGFkZGl0aW9uYWxJbmZvOiBzdHJpbmc7XHJcbn1cclxuIl19
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import { InjectionToken } from "@angular/core";
|
|
2
|
+
export const MatAuthenticationServiceOptionsToken = new InjectionToken('');
|
|
3
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWF0LWF1dGhlbnRpY2F0aW9uLXNlcnZpY2Utb3B0aW9ucy10b2tlbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NsZWF2ZWxhbmRwcmljZS9uZ3gtbGliL2F1dGhlbnRpY2F0aW9uL21hdGVyaWFsL3NyYy9tb2RlbC9tYXQtYXV0aGVudGljYXRpb24tc2VydmljZS1vcHRpb25zLXRva2VuLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFHL0MsTUFBTSxDQUFDLE1BQU0sb0NBQW9DLEdBQUcsSUFBSSxjQUFjLENBQWtDLEVBQUUsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0aW9uVG9rZW4gfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5pbXBvcnQgeyBNYXRBdXRoZW50aWNhdGlvblNlcnZpY2VPcHRpb25zIH0gZnJvbSBcIi4vbWF0LWF1dGhlbnRpY2F0aW9uLXNlcnZpY2Utb3B0aW9uc1wiO1xyXG5cclxuZXhwb3J0IGNvbnN0IE1hdEF1dGhlbnRpY2F0aW9uU2VydmljZU9wdGlvbnNUb2tlbiA9IG5ldyBJbmplY3Rpb25Ub2tlbjxNYXRBdXRoZW50aWNhdGlvblNlcnZpY2VPcHRpb25zPignJyk7Il19
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export {};
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWF0LWF1dGhlbnRpY2F0aW9uLXNlcnZpY2Utb3B0aW9ucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NsZWF2ZWxhbmRwcmljZS9uZ3gtbGliL2F1dGhlbnRpY2F0aW9uL21hdGVyaWFsL3NyYy9tb2RlbC9tYXQtYXV0aGVudGljYXRpb24tc2VydmljZS1vcHRpb25zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBdXRoZW50aWNhdGlvblRva2VuU2VydmljZU9wdGlvbnMgfSBmcm9tICdAY2xlYXZlbGFuZHByaWNlL25neC1saWIvYXV0aGVudGljYXRpb24vdG9rZW4nO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBNYXRBdXRoZW50aWNhdGlvblNlcnZpY2VPcHRpb25zIGV4dGVuZHMgQXV0aGVudGljYXRpb25Ub2tlblNlcnZpY2VPcHRpb25zIHtcclxuICAgIHNob3dSZW1lbWJlck1lT3B0aW9uPzogYm9vbGVhbjtcclxufSJdfQ==
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { Inject, inject, Injectable, Optional } from '@angular/core';
|
|
2
|
+
import { JwtHelperService } from '@auth0/angular-jwt';
|
|
3
|
+
import { SharePointService } from '@cleavelandprice/ngx-lib/sharepoint';
|
|
4
|
+
import { AuthenticationTokenService } from '@cleavelandprice/ngx-lib/authentication/token';
|
|
5
|
+
import { MatAuthenticationServiceOptionsToken } from '../model/mat-authentication-service-options-token';
|
|
6
|
+
import * as i0 from "@angular/core";
|
|
7
|
+
export class MatAuthenticationService extends AuthenticationTokenService {
|
|
8
|
+
#sharePointService = inject(SharePointService);
|
|
9
|
+
//#region Lifecycle
|
|
10
|
+
constructor(constructorOptions) {
|
|
11
|
+
super({ ...constructorOptions, deferTokenValidation: true });
|
|
12
|
+
// When super() was called, the parent class defined the 'options' object with all of the other properties
|
|
13
|
+
this.options = { ...this.options, ...constructorOptions };
|
|
14
|
+
this.checkForExistingToken();
|
|
15
|
+
}
|
|
16
|
+
//#endregion
|
|
17
|
+
//#region Utilities
|
|
18
|
+
validateUser(token) {
|
|
19
|
+
const jwtHelper = new JwtHelperService();
|
|
20
|
+
const decoded = jwtHelper.decodeToken(token);
|
|
21
|
+
if (jwtHelper.isTokenExpired(token)) {
|
|
22
|
+
this.logout();
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
this.authenticatedUser = {
|
|
26
|
+
admin: decoded.role === 'Admin',
|
|
27
|
+
displayName: decoded.displayName,
|
|
28
|
+
accountName: decoded.winaccountname,
|
|
29
|
+
distinguishedName: decoded.distinguishedName,
|
|
30
|
+
employeeNumber: decoded.employeeNumber,
|
|
31
|
+
memberOf: decoded.memberOf
|
|
32
|
+
};
|
|
33
|
+
this.storage.setItem(this.options.tokenName, token);
|
|
34
|
+
this.#getPhoto();
|
|
35
|
+
this.authenticated = true;
|
|
36
|
+
this.authenticatedChanged.emit(this.authenticated);
|
|
37
|
+
this.authenticating = false;
|
|
38
|
+
this.authenticatingChanged.emit(this.authenticating);
|
|
39
|
+
}
|
|
40
|
+
#getPhoto() {
|
|
41
|
+
this.#sharePointService.getPhotos()
|
|
42
|
+
.subscribe(photos => {
|
|
43
|
+
// The user may have been logged out by the time the photos came back
|
|
44
|
+
if (!this.authenticatedUser?.employeeNumber) {
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
const photo = photos.find(pic => pic.employeeNumber === +this.authenticatedUser.employeeNumber);
|
|
48
|
+
if (photo) {
|
|
49
|
+
this.authenticatedUser.photoUrl = photo.encodedAbsUrl;
|
|
50
|
+
}
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.0", ngImport: i0, type: MatAuthenticationService, deps: [{ token: MatAuthenticationServiceOptionsToken, optional: true }], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
54
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.0", ngImport: i0, type: MatAuthenticationService, providedIn: 'root' }); }
|
|
55
|
+
}
|
|
56
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.0", ngImport: i0, type: MatAuthenticationService, decorators: [{
|
|
57
|
+
type: Injectable,
|
|
58
|
+
args: [{
|
|
59
|
+
providedIn: 'root'
|
|
60
|
+
}]
|
|
61
|
+
}], ctorParameters: () => [{ type: undefined, decorators: [{
|
|
62
|
+
type: Optional
|
|
63
|
+
}, {
|
|
64
|
+
type: Inject,
|
|
65
|
+
args: [MatAuthenticationServiceOptionsToken]
|
|
66
|
+
}] }] });
|
|
67
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWF0LWF1dGhlbnRpY2F0aW9uLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jbGVhdmVsYW5kcHJpY2Uvbmd4LWxpYi9hdXRoZW50aWNhdGlvbi9tYXRlcmlhbC9zcmMvc2VydmljZXMvbWF0LWF1dGhlbnRpY2F0aW9uLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNyRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUV0RCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUV4RSxPQUFPLEVBRUwsMEJBQTBCLEVBQzNCLE1BQU0sK0NBQStDLENBQUM7QUFFdkQsT0FBTyxFQUFFLG9DQUFvQyxFQUFFLE1BQU0sbURBQW1ELENBQUM7O0FBS3pHLE1BQU0sT0FBTyx3QkFBeUIsU0FBUSwwQkFBMEI7SUFDdEUsa0JBQWtCLEdBQUcsTUFBTSxDQUFDLGlCQUFpQixDQUFDLENBQUM7SUFJL0MsbUJBQW1CO0lBQ25CLFlBQXNFLGtCQUFtRDtRQUN2SCxLQUFLLENBQUMsRUFBQyxHQUFHLGtCQUFrQixFQUFFLG9CQUFvQixFQUFFLElBQUksRUFBQyxDQUFDLENBQUM7UUFFM0QsMEdBQTBHO1FBQzFHLElBQUksQ0FBQyxPQUFPLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxPQUFPLEVBQUUsR0FBRyxrQkFBa0IsRUFBRSxDQUFDO1FBQzFELElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO0lBQy9CLENBQUM7SUFDRCxZQUFZO0lBRVosbUJBQW1CO0lBQ1YsWUFBWSxDQUFDLEtBQWE7UUFDakMsTUFBTSxTQUFTLEdBQUcsSUFBSSxnQkFBZ0IsRUFBRSxDQUFDO1FBQ3pDLE1BQU0sT0FBTyxHQUFHLFNBQVMsQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUF3QixDQUFDO1FBRXBFLElBQUksU0FBUyxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ3BDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNkLE9BQU87UUFDVCxDQUFDO1FBRUQsSUFBSSxDQUFDLGlCQUFpQixHQUFHO1lBQ3ZCLEtBQUssRUFBRSxPQUFPLENBQUMsSUFBSSxLQUFLLE9BQU87WUFDL0IsV0FBVyxFQUFFLE9BQU8sQ0FBQyxXQUFXO1lBQ2hDLFdBQVcsRUFBRSxPQUFPLENBQUMsY0FBYztZQUNuQyxpQkFBaUIsRUFBRSxPQUFPLENBQUMsaUJBQWlCO1lBQzVDLGNBQWMsRUFBRSxPQUFPLENBQUMsY0FBYztZQUN0QyxRQUFRLEVBQUUsT0FBTyxDQUFDLFFBQVE7U0FDM0IsQ0FBQztRQUVGLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBVSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBRXJELElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUVqQixJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQztRQUMxQixJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUVuRCxJQUFJLENBQUMsY0FBYyxHQUFHLEtBQUssQ0FBQztRQUM1QixJQUFJLENBQUMscUJBQXFCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQztJQUN2RCxDQUFDO0lBRUQsU0FBUztRQUNQLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxTQUFTLEVBQUU7YUFDaEMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxFQUFFO1lBQ2xCLHFFQUFxRTtZQUNyRSxJQUFJLENBQUMsSUFBSSxDQUFDLGlCQUFpQixFQUFFLGNBQWMsRUFBRSxDQUFDO2dCQUM1QyxPQUFPO1lBQ1QsQ0FBQztZQUVELE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsY0FBYyxLQUFLLENBQUMsSUFBSSxDQUFDLGlCQUFrQixDQUFDLGNBQWMsQ0FBQyxDQUFDO1lBRWpHLElBQUksS0FBSyxFQUFFLENBQUM7Z0JBQ1YsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUMsYUFBYSxDQUFDO1lBQ3hELENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7OEdBM0RVLHdCQUF3QixrQkFNSCxvQ0FBb0M7a0hBTnpELHdCQUF3QixjQUZ2QixNQUFNOzsyRkFFUCx3QkFBd0I7a0JBSHBDLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25COzswQkFPYyxRQUFROzswQkFBSSxNQUFNOzJCQUFDLG9DQUFvQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdCwgaW5qZWN0LCBJbmplY3RhYmxlLCBPcHRpb25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBKd3RIZWxwZXJTZXJ2aWNlIH0gZnJvbSAnQGF1dGgwL2FuZ3VsYXItand0JztcclxuXHJcbmltcG9ydCB7IFNoYXJlUG9pbnRTZXJ2aWNlIH0gZnJvbSAnQGNsZWF2ZWxhbmRwcmljZS9uZ3gtbGliL3NoYXJlcG9pbnQnO1xyXG5cclxuaW1wb3J0IHtcclxuICBBdXRoZW50aWNhdGlvblRva2VuLFxyXG4gIEF1dGhlbnRpY2F0aW9uVG9rZW5TZXJ2aWNlXHJcbn0gZnJvbSAnQGNsZWF2ZWxhbmRwcmljZS9uZ3gtbGliL2F1dGhlbnRpY2F0aW9uL3Rva2VuJztcclxuaW1wb3J0IHsgTWF0QXV0aGVudGljYXRpb25TZXJ2aWNlT3B0aW9ucyB9IGZyb20gJy4uL21vZGVsL21hdC1hdXRoZW50aWNhdGlvbi1zZXJ2aWNlLW9wdGlvbnMnO1xyXG5pbXBvcnQgeyBNYXRBdXRoZW50aWNhdGlvblNlcnZpY2VPcHRpb25zVG9rZW4gfSBmcm9tICcuLi9tb2RlbC9tYXQtYXV0aGVudGljYXRpb24tc2VydmljZS1vcHRpb25zLXRva2VuJztcclxuXHJcbkBJbmplY3RhYmxlKHtcclxuICBwcm92aWRlZEluOiAncm9vdCdcclxufSlcclxuZXhwb3J0IGNsYXNzIE1hdEF1dGhlbnRpY2F0aW9uU2VydmljZSBleHRlbmRzIEF1dGhlbnRpY2F0aW9uVG9rZW5TZXJ2aWNlIHtcclxuICAjc2hhcmVQb2ludFNlcnZpY2UgPSBpbmplY3QoU2hhcmVQb2ludFNlcnZpY2UpO1xyXG5cclxuICBvdmVycmlkZSBvcHRpb25zITogTWF0QXV0aGVudGljYXRpb25TZXJ2aWNlT3B0aW9ucztcclxuXHJcbiAgLy8jcmVnaW9uIExpZmVjeWNsZVxyXG4gIGNvbnN0cnVjdG9yKEBPcHRpb25hbCgpIEBJbmplY3QoTWF0QXV0aGVudGljYXRpb25TZXJ2aWNlT3B0aW9uc1Rva2VuKSBjb25zdHJ1Y3Rvck9wdGlvbnM6IE1hdEF1dGhlbnRpY2F0aW9uU2VydmljZU9wdGlvbnMpIHtcclxuICAgIHN1cGVyKHsuLi5jb25zdHJ1Y3Rvck9wdGlvbnMsIGRlZmVyVG9rZW5WYWxpZGF0aW9uOiB0cnVlfSk7XHJcblxyXG4gICAgLy8gV2hlbiBzdXBlcigpIHdhcyBjYWxsZWQsIHRoZSBwYXJlbnQgY2xhc3MgZGVmaW5lZCB0aGUgJ29wdGlvbnMnIG9iamVjdCB3aXRoIGFsbCBvZiB0aGUgb3RoZXIgcHJvcGVydGllc1xyXG4gICAgdGhpcy5vcHRpb25zID0geyAuLi50aGlzLm9wdGlvbnMsIC4uLmNvbnN0cnVjdG9yT3B0aW9ucyB9O1xyXG4gICAgdGhpcy5jaGVja0ZvckV4aXN0aW5nVG9rZW4oKTtcclxuICB9XHJcbiAgLy8jZW5kcmVnaW9uXHJcblxyXG4gIC8vI3JlZ2lvbiBVdGlsaXRpZXNcclxuICBvdmVycmlkZSB2YWxpZGF0ZVVzZXIodG9rZW46IHN0cmluZyk6IHZvaWQge1xyXG4gICAgY29uc3Qgand0SGVscGVyID0gbmV3IEp3dEhlbHBlclNlcnZpY2UoKTtcclxuICAgIGNvbnN0IGRlY29kZWQgPSBqd3RIZWxwZXIuZGVjb2RlVG9rZW4odG9rZW4pIGFzIEF1dGhlbnRpY2F0aW9uVG9rZW47XHJcblxyXG4gICAgaWYgKGp3dEhlbHBlci5pc1Rva2VuRXhwaXJlZCh0b2tlbikpIHtcclxuICAgICAgdGhpcy5sb2dvdXQoKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuYXV0aGVudGljYXRlZFVzZXIgPSB7XHJcbiAgICAgIGFkbWluOiBkZWNvZGVkLnJvbGUgPT09ICdBZG1pbicsXHJcbiAgICAgIGRpc3BsYXlOYW1lOiBkZWNvZGVkLmRpc3BsYXlOYW1lLFxyXG4gICAgICBhY2NvdW50TmFtZTogZGVjb2RlZC53aW5hY2NvdW50bmFtZSxcclxuICAgICAgZGlzdGluZ3Vpc2hlZE5hbWU6IGRlY29kZWQuZGlzdGluZ3Vpc2hlZE5hbWUsXHJcbiAgICAgIGVtcGxveWVlTnVtYmVyOiBkZWNvZGVkLmVtcGxveWVlTnVtYmVyLFxyXG4gICAgICBtZW1iZXJPZjogZGVjb2RlZC5tZW1iZXJPZlxyXG4gICAgfTtcclxuXHJcbiAgICB0aGlzLnN0b3JhZ2Uuc2V0SXRlbSh0aGlzLm9wdGlvbnMudG9rZW5OYW1lISwgdG9rZW4pO1xyXG5cclxuICAgIHRoaXMuI2dldFBob3RvKCk7XHJcbiAgICBcclxuICAgIHRoaXMuYXV0aGVudGljYXRlZCA9IHRydWU7XHJcbiAgICB0aGlzLmF1dGhlbnRpY2F0ZWRDaGFuZ2VkLmVtaXQodGhpcy5hdXRoZW50aWNhdGVkKTtcclxuXHJcbiAgICB0aGlzLmF1dGhlbnRpY2F0aW5nID0gZmFsc2U7XHJcbiAgICB0aGlzLmF1dGhlbnRpY2F0aW5nQ2hhbmdlZC5lbWl0KHRoaXMuYXV0aGVudGljYXRpbmcpO1xyXG4gIH1cclxuXHJcbiAgI2dldFBob3RvKCk6IHZvaWQge1xyXG4gICAgdGhpcy4jc2hhcmVQb2ludFNlcnZpY2UuZ2V0UGhvdG9zKClcclxuICAgICAgLnN1YnNjcmliZShwaG90b3MgPT4ge1xyXG4gICAgICAgIC8vIFRoZSB1c2VyIG1heSBoYXZlIGJlZW4gbG9nZ2VkIG91dCBieSB0aGUgdGltZSB0aGUgcGhvdG9zIGNhbWUgYmFja1xyXG4gICAgICAgIGlmICghdGhpcy5hdXRoZW50aWNhdGVkVXNlcj8uZW1wbG95ZWVOdW1iZXIpIHtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IHBob3RvID0gcGhvdG9zLmZpbmQocGljID0+IHBpYy5lbXBsb3llZU51bWJlciA9PT0gK3RoaXMuYXV0aGVudGljYXRlZFVzZXIhLmVtcGxveWVlTnVtYmVyKTtcclxuXHJcbiAgICAgICAgaWYgKHBob3RvKSB7XHJcbiAgICAgICAgICB0aGlzLmF1dGhlbnRpY2F0ZWRVc2VyLnBob3RvVXJsID0gcGhvdG8uZW5jb2RlZEFic1VybDtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gIH1cclxuICAvLyNlbmRyZWdpb25cclxufSJdfQ==
|