@cleavelandprice/ngx-lib 4.8.15 → 4.8.17
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/fesm2022/cleavelandprice-ngx-lib-active-directory-material.mjs +93 -96
- package/fesm2022/cleavelandprice-ngx-lib-active-directory-material.mjs.map +1 -1
- package/fesm2022/cleavelandprice-ngx-lib-authentication-material.mjs +2 -2
- package/fesm2022/cleavelandprice-ngx-lib-authentication-material.mjs.map +1 -1
- package/package.json +1 -1
- package/types/cleavelandprice-ngx-lib-active-directory-material.d.ts +16 -15
|
@@ -1,24 +1,25 @@
|
|
|
1
1
|
import { ActiveDirectoryService, ActiveDirectoryServiceOptionsToken } from '@cleavelandprice/ngx-lib/active-directory';
|
|
2
2
|
export * from '@cleavelandprice/ngx-lib/active-directory';
|
|
3
3
|
import * as i0 from '@angular/core';
|
|
4
|
-
import { inject, viewChild,
|
|
5
|
-
import
|
|
6
|
-
import { FormGroup, FormControl, ReactiveFormsModule, NG_VALUE_ACCESSOR } from '@angular/forms';
|
|
4
|
+
import { inject, viewChild, signal, afterRenderEffect, effect, ChangeDetectionStrategy, Component, output, input, forwardRef, Optional, SkipSelf, NgModule } from '@angular/core';
|
|
5
|
+
import { schema, required, debounce, form, apply, FormField } from '@angular/forms/signals';
|
|
7
6
|
import * as i1 from '@angular/material/dialog';
|
|
8
7
|
import { MAT_DIALOG_DATA, MatDialogRef, MatDialogModule, MatDialog } from '@angular/material/dialog';
|
|
9
8
|
import { MatSelectionList, MatListItemAvatar, MatListOption, MatListModule } from '@angular/material/list';
|
|
10
9
|
import { MatTableDataSource, MatTableModule } from '@angular/material/table';
|
|
11
|
-
import { of, forkJoin, debounceTime } from 'rxjs';
|
|
12
|
-
import { SharePointService } from '@cleavelandprice/ngx-lib/sharepoint';
|
|
13
10
|
import { MatButton, MatIconButton, MatButtonModule } from '@angular/material/button';
|
|
14
|
-
import
|
|
11
|
+
import * as i2 from '@angular/material/form-field';
|
|
12
|
+
import { MatFormFieldModule, MatFormField, MatSuffix } from '@angular/material/form-field';
|
|
15
13
|
import { MatIcon, MatIconModule } from '@angular/material/icon';
|
|
16
14
|
import { MatInput, MatInputModule } from '@angular/material/input';
|
|
17
15
|
import { MatProgressSpinner, MatProgressSpinnerModule } from '@angular/material/progress-spinner';
|
|
18
16
|
import { MatSlideToggle, MatSlideToggleModule } from '@angular/material/slide-toggle';
|
|
19
17
|
import { MatTooltip, MatTooltipModule } from '@angular/material/tooltip';
|
|
18
|
+
import { of, forkJoin } from 'rxjs';
|
|
19
|
+
import { SharePointService } from '@cleavelandprice/ngx-lib/sharepoint';
|
|
20
20
|
import { NgClass, CommonModule } from '@angular/common';
|
|
21
21
|
import { MatProgressBar, MatProgressBarModule } from '@angular/material/progress-bar';
|
|
22
|
+
import { NG_VALUE_ACCESSOR, ReactiveFormsModule } from '@angular/forms';
|
|
22
23
|
|
|
23
24
|
const DefaultUserChooserFilterOptions = {
|
|
24
25
|
accountName: true,
|
|
@@ -52,43 +53,13 @@ const DefaultUserChooserData = {
|
|
|
52
53
|
;
|
|
53
54
|
|
|
54
55
|
class UserChooserComponent {
|
|
55
|
-
constructor() {
|
|
56
|
-
this.#services = {
|
|
57
|
-
dialogRef: inject((MatDialogRef)),
|
|
58
|
-
activeDirectory: inject(ActiveDirectoryService),
|
|
59
|
-
sharePoint: inject(SharePointService),
|
|
60
|
-
data: inject(MAT_DIALOG_DATA),
|
|
61
|
-
};
|
|
62
|
-
this._data = { ...DefaultUserChooserData, ...this.#services.data };
|
|
63
|
-
//#region Fields
|
|
64
|
-
//@ViewChild(MatSelectionList) selectionList?: MatSelectionList;
|
|
65
|
-
this.selectionList = viewChild(MatSelectionList, /* @ts-ignore */
|
|
66
|
-
...(ngDevMode ? [{ debugName: "selectionList" }] : /* istanbul ignore next */ []));
|
|
67
|
-
//filterInput = viewChild<ElementRef>('filterInput');
|
|
68
|
-
this.filterForm = new FormGroup({
|
|
69
|
-
filter: new FormControl(),
|
|
70
|
-
});
|
|
71
|
-
}
|
|
72
56
|
#services;
|
|
73
|
-
|
|
74
|
-
if (elRef) {
|
|
75
|
-
elRef.nativeElement.focus();
|
|
76
|
-
}
|
|
77
|
-
}
|
|
57
|
+
#filterFormSchema;
|
|
78
58
|
//#endregion
|
|
79
59
|
//#region Properties
|
|
80
60
|
get isMultiMode() {
|
|
81
61
|
return this._data.mode === UserChooserMode.Multiple;
|
|
82
62
|
}
|
|
83
|
-
get selectedOptions() {
|
|
84
|
-
return this.selectionList()?.options.filter((o) => o.selected) ?? [];
|
|
85
|
-
}
|
|
86
|
-
get selectedUsers() {
|
|
87
|
-
return this.dataSource?.data?.filter((d) => d.selected) ?? [];
|
|
88
|
-
}
|
|
89
|
-
get filterValue() {
|
|
90
|
-
return this.filterForm.value.filter;
|
|
91
|
-
}
|
|
92
63
|
get adGroupsNeeded() {
|
|
93
64
|
// If any are these are true, then we need to pull AD groups for use later
|
|
94
65
|
return ((this._data.showGroupMembershipTooltips ?? false) ||
|
|
@@ -101,43 +72,78 @@ class UserChooserComponent {
|
|
|
101
72
|
}
|
|
102
73
|
//#endregion
|
|
103
74
|
//#region Lifecycle
|
|
75
|
+
constructor() {
|
|
76
|
+
this.#services = {
|
|
77
|
+
dialogRef: inject((MatDialogRef)),
|
|
78
|
+
activeDirectory: inject(ActiveDirectoryService),
|
|
79
|
+
sharePoint: inject(SharePointService),
|
|
80
|
+
data: inject(MAT_DIALOG_DATA),
|
|
81
|
+
};
|
|
82
|
+
this._data = { ...DefaultUserChooserData, ...this.#services.data };
|
|
83
|
+
//#region Fields
|
|
84
|
+
this.selectionList = viewChild(MatSelectionList, /* @ts-ignore */
|
|
85
|
+
...(ngDevMode ? [{ debugName: "selectionList" }] : /* istanbul ignore next */ []));
|
|
86
|
+
this.filterInput = viewChild('filterInput', /* @ts-ignore */
|
|
87
|
+
...(ngDevMode ? [{ debugName: "filterInput" }] : /* istanbul ignore next */ []));
|
|
88
|
+
this.filterFormModel = signal({ filter: '' }, /* @ts-ignore */
|
|
89
|
+
...(ngDevMode ? [{ debugName: "filterFormModel" }] : /* istanbul ignore next */ []));
|
|
90
|
+
this.#filterFormSchema = schema((schemaPath) => {
|
|
91
|
+
required(schemaPath.filter);
|
|
92
|
+
debounce(schemaPath.filter, 500);
|
|
93
|
+
});
|
|
94
|
+
this.filterForm = form(this.filterFormModel, (path) => apply(path, this.#filterFormSchema));
|
|
95
|
+
this.dataSource = signal(undefined, /* @ts-ignore */
|
|
96
|
+
...(ngDevMode ? [{ debugName: "dataSource" }] : /* istanbul ignore next */ []));
|
|
97
|
+
this.photos = signal([], /* @ts-ignore */
|
|
98
|
+
...(ngDevMode ? [{ debugName: "photos" }] : /* istanbul ignore next */ []));
|
|
99
|
+
this.groups = signal([], /* @ts-ignore */
|
|
100
|
+
...(ngDevMode ? [{ debugName: "groups" }] : /* istanbul ignore next */ [])); // May or may not get populated, depending on config data sent in
|
|
101
|
+
this.selectedUsersOrGroups = signal([], /* @ts-ignore */
|
|
102
|
+
...(ngDevMode ? [{ debugName: "selectedUsersOrGroups" }] : /* istanbul ignore next */ []));
|
|
103
|
+
afterRenderEffect(() => {
|
|
104
|
+
this.filterInput()?.nativeElement.focus();
|
|
105
|
+
});
|
|
106
|
+
effect(() => {
|
|
107
|
+
if (this.dataSource()) {
|
|
108
|
+
this.dataSource().filter = this.filterForm().value().filter.toLowerCase();
|
|
109
|
+
}
|
|
110
|
+
});
|
|
111
|
+
}
|
|
104
112
|
ngOnInit() {
|
|
105
113
|
this.#getData();
|
|
106
|
-
this.#listenForFilterChanges();
|
|
107
114
|
}
|
|
108
115
|
//#endregion
|
|
109
116
|
//#region Events
|
|
110
|
-
|
|
117
|
+
closeIfSingleSelection( /* event: MatSelectionListChange */) {
|
|
111
118
|
if (this._data.mode === UserChooserMode.Single &&
|
|
112
|
-
this.
|
|
119
|
+
this.selectedUsersOrGroups().length &&
|
|
113
120
|
this._data.closeWhenSelectionMade) {
|
|
114
121
|
this.close();
|
|
115
122
|
}
|
|
116
123
|
}
|
|
117
124
|
optionSelectionChanged(option) {
|
|
118
|
-
const
|
|
125
|
+
const userOrGroup = this.dataSource()?.data.find((u) => u.sAMAccountName.toLocaleLowerCase() ===
|
|
119
126
|
option.value.sAMAccountName.toLowerCase());
|
|
120
|
-
if (
|
|
127
|
+
if (userOrGroup) {
|
|
121
128
|
// If we are in single user selection mode, deselect any existing selections first
|
|
122
129
|
if (!this.isMultiMode && option.selected) {
|
|
123
|
-
this.dataSource?.data
|
|
130
|
+
this.dataSource()?.data
|
|
124
131
|
.filter((u) => u.sAMAccountName.toLowerCase() !==
|
|
125
132
|
option.value.sAMAccountName.toLowerCase())
|
|
126
133
|
.forEach((u) => (u.selected = false));
|
|
127
134
|
}
|
|
128
|
-
|
|
135
|
+
userOrGroup.selected = option.selected;
|
|
129
136
|
}
|
|
137
|
+
this.selectedUsersOrGroups.set(this.dataSource()?.data.filter(u => u.selected) ?? []);
|
|
130
138
|
}
|
|
131
139
|
hideUnselectedChanged(selected) {
|
|
132
|
-
this.filterForm
|
|
133
|
-
.get('filter')
|
|
134
|
-
?.setValue(selected ? '{selected:true}' : null);
|
|
140
|
+
this.filterForm().value.set({ filter: selected ? '{selected:true}' : '' });
|
|
135
141
|
}
|
|
136
142
|
selectAll() {
|
|
137
143
|
this.selectionList()?.selectAll();
|
|
138
|
-
if (this.selectionList()?.options) {
|
|
139
|
-
|
|
140
|
-
}
|
|
144
|
+
/*if (this.selectionList()?.options) {
|
|
145
|
+
this.closeIfSingleSelection();
|
|
146
|
+
}*/
|
|
141
147
|
}
|
|
142
148
|
deselectAll() {
|
|
143
149
|
this.selectionList()?.deselectAll();
|
|
@@ -175,7 +181,7 @@ class UserChooserComponent {
|
|
|
175
181
|
//.subscribe(([users, photos]) => {
|
|
176
182
|
.subscribe((data) => {
|
|
177
183
|
// Need groups in place before we handle exclusions/inclusions/pre-selections
|
|
178
|
-
this.groups
|
|
184
|
+
this.groups.set(this.adGroupsNeeded ? data[2] : []);
|
|
179
185
|
let users = data[0];
|
|
180
186
|
users.forEach((u) => (u.selected = false)); // In case existing data was re-used
|
|
181
187
|
users = this.#includeUsersByAccountName(users);
|
|
@@ -200,11 +206,11 @@ class UserChooserComponent {
|
|
|
200
206
|
if (['groups', '*'].includes(this._data.objectTypes)) {
|
|
201
207
|
if (this._data.selectableGroupNames?.length) {
|
|
202
208
|
if (this._data.selectableGroupNames.includes('*')) {
|
|
203
|
-
usersAndGroups.push(...this.groups);
|
|
209
|
+
usersAndGroups.push(...this.groups());
|
|
204
210
|
}
|
|
205
211
|
else {
|
|
206
212
|
this._data.selectableGroupNames.forEach((groupName) => {
|
|
207
|
-
const group = this.groups.find((g) => g.displayName === groupName);
|
|
213
|
+
const group = this.groups().find((g) => g.displayName === groupName);
|
|
208
214
|
if (group) {
|
|
209
215
|
usersAndGroups.push({
|
|
210
216
|
...group,
|
|
@@ -215,24 +221,24 @@ class UserChooserComponent {
|
|
|
215
221
|
}
|
|
216
222
|
}
|
|
217
223
|
}
|
|
218
|
-
this.dataSource
|
|
219
|
-
this.photos
|
|
224
|
+
this.dataSource.set(new MatTableDataSource(usersAndGroups));
|
|
225
|
+
this.photos.set(data[1]);
|
|
220
226
|
this.#setFilterPredicate();
|
|
221
227
|
});
|
|
222
228
|
}
|
|
223
229
|
close() {
|
|
224
|
-
if (!this.
|
|
230
|
+
if (!this.selectedUsersOrGroups().length) {
|
|
225
231
|
this.#services.dialogRef.close(this._data.allowCloseWithoutSelections ? [] : undefined);
|
|
226
232
|
return;
|
|
227
233
|
}
|
|
228
|
-
const value = this.
|
|
234
|
+
const value = this.selectedUsersOrGroups().map((u) => this._data.returnUserObjects ? u : u.sAMAccountName);
|
|
229
235
|
this.#services.dialogRef.close(this._data.mode === UserChooserMode.Multiple ? value : value[0]);
|
|
230
236
|
}
|
|
231
237
|
getPhoto(user) {
|
|
232
238
|
if (!this.isUser(user)) {
|
|
233
239
|
return;
|
|
234
240
|
}
|
|
235
|
-
return this.photos
|
|
241
|
+
return this.photos().find((p) => (p.employeeNumber &&
|
|
236
242
|
p.employeeNumber.toString() ===
|
|
237
243
|
user.employeeNumber) ||
|
|
238
244
|
p.accountName?.toLowerCase() === user.sAMAccountName.toLowerCase() ||
|
|
@@ -254,7 +260,7 @@ class UserChooserComponent {
|
|
|
254
260
|
}
|
|
255
261
|
#excludeUsersByGroupName(users) {
|
|
256
262
|
this._data.exclusions?.groups?.forEach((groupName) => {
|
|
257
|
-
const group = this.groups
|
|
263
|
+
const group = this.groups().find((g) => g.name.toLowerCase() === groupName.toLowerCase());
|
|
258
264
|
if (!group) {
|
|
259
265
|
return;
|
|
260
266
|
}
|
|
@@ -309,7 +315,7 @@ class UserChooserComponent {
|
|
|
309
315
|
// Cheating a bit and leveraging the 'selected' property to keep track of who should be included
|
|
310
316
|
// Since inclusions happen befor pre-selections, we can do that, as long as we set 'selected' back to false when we're done
|
|
311
317
|
this._data.inclusions.groups.forEach((groupName) => {
|
|
312
|
-
const group = this.groups
|
|
318
|
+
const group = this.groups().find((g) => g.name.toLowerCase() === groupName.toLowerCase());
|
|
313
319
|
if (!group) {
|
|
314
320
|
return;
|
|
315
321
|
}
|
|
@@ -337,7 +343,7 @@ class UserChooserComponent {
|
|
|
337
343
|
}
|
|
338
344
|
#preSelectGroupsByAccountName() {
|
|
339
345
|
this._data.preSelections?.accountNames?.forEach((accountName) => {
|
|
340
|
-
const group = this.groups
|
|
346
|
+
const group = this.groups().find((g) => g.sAMAccountName.toLowerCase() === accountName.toLowerCase());
|
|
341
347
|
if (!group) {
|
|
342
348
|
return;
|
|
343
349
|
}
|
|
@@ -358,7 +364,7 @@ class UserChooserComponent {
|
|
|
358
364
|
}
|
|
359
365
|
#preSelectUsersByGroupName(users) {
|
|
360
366
|
this._data.preSelections?.groups?.forEach((groupName) => {
|
|
361
|
-
const group = this.groups
|
|
367
|
+
const group = this.groups().find((g) => g.name.toLowerCase() === groupName.toLowerCase());
|
|
362
368
|
if (!group) {
|
|
363
369
|
return;
|
|
364
370
|
}
|
|
@@ -374,10 +380,10 @@ class UserChooserComponent {
|
|
|
374
380
|
}
|
|
375
381
|
//#endregion
|
|
376
382
|
#setFilterPredicate() {
|
|
377
|
-
if (!this.dataSource) {
|
|
383
|
+
if (!this.dataSource()) {
|
|
378
384
|
return;
|
|
379
385
|
}
|
|
380
|
-
this.dataSource.filterPredicate = (user, filter) => {
|
|
386
|
+
this.dataSource().filterPredicate = (user, filter) => {
|
|
381
387
|
if (filter === '{selected:true}') {
|
|
382
388
|
return user.selected;
|
|
383
389
|
}
|
|
@@ -407,7 +413,7 @@ class UserChooserComponent {
|
|
|
407
413
|
// Match on group membership (group name)
|
|
408
414
|
if (this._data.filterOptions?.groupMembership) {
|
|
409
415
|
user.memberOf.forEach((groupDn) => {
|
|
410
|
-
const group = this.groups
|
|
416
|
+
const group = this.groups().find((group) => group.distinguishedName === groupDn && group.name.match(regex));
|
|
411
417
|
if (group) {
|
|
412
418
|
match = true;
|
|
413
419
|
}
|
|
@@ -417,32 +423,25 @@ class UserChooserComponent {
|
|
|
417
423
|
}
|
|
418
424
|
};
|
|
419
425
|
}
|
|
420
|
-
#listenForFilterChanges() {
|
|
421
|
-
this.filterForm
|
|
422
|
-
.get('filter')
|
|
423
|
-
?.valueChanges.pipe(debounceTime(250))
|
|
424
|
-
.subscribe(() => (this.dataSource.filter = this.filterForm.value.filter
|
|
425
|
-
?.trim()
|
|
426
|
-
.toLowerCase()));
|
|
427
|
-
}
|
|
428
426
|
tooltip(user) {
|
|
429
427
|
return this._data.showGroupMembershipTooltips
|
|
430
428
|
? user.memberOf
|
|
431
|
-
.map((groupDn) => this.groups
|
|
429
|
+
.map((groupDn) => this.groups().find((group) => group.distinguishedName === groupDn)
|
|
432
430
|
?.name)
|
|
433
431
|
.sort((a, b) => (a > b ? 1 : -1))
|
|
434
432
|
.join('\n')
|
|
435
433
|
: '';
|
|
436
434
|
}
|
|
437
435
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.1", ngImport: i0, type: UserChooserComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
438
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.1", type: UserChooserComponent, isStandalone: true, selector: "ng-component", viewQueries: [{ propertyName: "selectionList", first: true, predicate: MatSelectionList, descendants: true, isSignal: true }, { propertyName: "filterInput", first: true, predicate: ["filterInput"], descendants: true }], ngImport: i0, template: "<div mat-dialog-title>\r\n <div id=\"dialog-title\">\r\n <h2>{{ _data.title }}</h2>\r\n \r\n <div id=\"num-selected\">\r\n {{
|
|
436
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.1", type: UserChooserComponent, isStandalone: true, selector: "ng-component", viewQueries: [{ propertyName: "selectionList", first: true, predicate: MatSelectionList, descendants: true, isSignal: true }, { propertyName: "filterInput", first: true, predicate: ["filterInput"], descendants: true, isSignal: true }], ngImport: i0, template: "<div mat-dialog-title>\r\n <div id=\"dialog-title\">\r\n <h2>{{ _data.title }}</h2>\r\n \r\n <div id=\"num-selected\">\r\n {{ selectedUsersOrGroups().length }} selected\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<mat-dialog-content>\r\n @if (dataSource() && photos().length) {\r\n <form>\r\n @if (dataSource()) {\r\n <mat-form-field>\r\n <input matInput placeholder=\"Search\" [formField]=\"filterForm.filter\" #filterInput>\r\n @if (filterForm().value().filter) {\r\n <button type=\"button\" matSuffix mat-icon-button aria-label=\"Clear\" (click)=\"filterFormModel.set({filter: ''})\">\r\n <mat-icon fontIcon=\"close\"/>\r\n </button>\r\n }\r\n </mat-form-field>\r\n }\r\n </form>\r\n\r\n <mat-selection-list [multiple]=\"isMultiMode\" (selectionChange)=\"closeIfSingleSelection()\">\r\n @for (user of dataSource()!.filteredData; track user) {\r\n <mat-list-option [value]=\"user\" [selected]=\"user.selected\"\r\n (selectedChange)=\"optionSelectionChanged(option)\" #option>\r\n @if (getPhoto(user)) {\r\n <img matListItemAvatar alt=\"\" [src]=\"getPhoto(user)\">\r\n } @else {\r\n <mat-icon matListItemAvatar class=\"no-photo\"\r\n [fontIcon]=\"isUser(user) ? 'account_circle' : 'group'\"/>\r\n }\r\n <div class=\"user\">\r\n <div [matTooltip]=\"tooltip(user)\" class=\"user-name\">\r\n {{ user.displayName ?? user.name }}\r\n @if (isUser(user) && _data.showPhone && castUser(user).telephoneNumber) {\r\n <div>{{ castUser(user).telephoneNumber }}</div>\r\n }\r\n </div>\r\n @if (isUser(user)) {\r\n <div>{{ castUser(user).department }}</div>\r\n <div class=\"title\">{{ castUser(user).title }}</div>\r\n }\r\n </div>\r\n </mat-list-option>\r\n }\r\n </mat-selection-list>\r\n } @else {\r\n <div>\r\n <mat-spinner [diameter]=\"50\"/>\r\n <h2 id=\"spinner-message\">Getting users and photos...</h2>\r\n </div>\r\n }\r\n</mat-dialog-content>\r\n\r\n<mat-dialog-actions>\r\n @if (dataSource() && photos().length) {\r\n @if (selectedUsersOrGroups().length) {\r\n <mat-slide-toggle (change)=\"hideUnselectedChanged($event.checked)\">\r\n Hide Unselected\r\n </mat-slide-toggle>\r\n }\r\n @if (isMultiMode) {\r\n <button mat-raised-button color=\"primary\" (click)=\"selectAll()\"\r\n >\r\n <mat-icon fontIcon=\"select_all\"/>\r\n <span class=\"hide-mobile\">Select All</span>\r\n </button>\r\n }\r\n @if (isMultiMode && selectedUsersOrGroups().length) {\r\n <button mat-raised-button color=\"primary\" (click)=\"deselectAll()\"\r\n >\r\n <mat-icon fontIcon=\"clear_all\"/>\r\n <span class=\"hide-mobile\">Clear All</span>\r\n </button>\r\n }\r\n @if (isMultiMode || !_data.closeWhenSelectionMade) {\r\n <button mat-raised-button color=\"primary\" (click)=\"close()\" matTooltip=\"Accept your selection\"\r\n [disabled]=\"!_data.allowCloseWithoutSelections && !selectedUsersOrGroups().length\">\r\n <mat-icon fontIcon=\"check\"/>\r\n <span class=\"hide-mobile\">Ok</span>\r\n </button>\r\n }\r\n }\r\n\r\n <button mat-raised-button color=\"warn\" mat-dialog-close matTooltip=\"Close this window\">\r\n <mat-icon fontIcon=\"close\"/>\r\n <span class=\"hide-mobile\">Cancel</span>\r\n </button>\r\n</mat-dialog-actions>", styles: ["::ng-deep .mat-tooltip{font-size:1em!important;white-space:pre-line}mat-dialog-content{min-width:50vw}#dialog-title{display:flex;justify-content:space-between}.mat-mdc-dialog-title:before{display:none!important}#num-selected{margin:1em 1em 0 0}mat-spinner{margin:0 auto}#spinner-message{text-align:center;padding:.5em}mat-form-field{width:100%}.title{font-style:italic;color:#757575}img,.no-photo{width:2rem;height:2rem;font-size:2.3rem!important;border-radius:100%}.hide-mobile{display:none}mat-dialog-actions{display:grid;grid-auto-flow:column;grid-gap:1em;justify-content:center}.user-name{display:flex;justify-content:space-between}.user-name>div:last-child{margin-right:10rem;font-weight:400;font-style:italic;color:#757575}@media(min-width:801px){.user{display:grid;grid-template-columns:1fr 1fr 1fr}.user>div:first-child{font-weight:700}.hide-mobile{display:initial}}\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: "directive", type: FormField, selector: "[formField]", inputs: ["formField"], exportAs: ["formField"] }, { kind: "component", type: MatButton, selector: " button[matButton], a[matButton], button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button], a[mat-button], a[mat-raised-button], a[mat-flat-button], a[mat-stroked-button] ", inputs: ["matButton"], exportAs: ["matButton", "matAnchor"] }, { kind: "ngmodule", type: MatDialogModule }, { kind: "directive", type: i1.MatDialogClose, selector: "[mat-dialog-close], [matDialogClose]", inputs: ["aria-label", "type", "mat-dialog-close", "matDialogClose"], exportAs: ["matDialogClose"] }, { kind: "directive", type: i1.MatDialogTitle, selector: "[mat-dialog-title], [matDialogTitle]", inputs: ["id"], exportAs: ["matDialogTitle"] }, { kind: "directive", type: i1.MatDialogActions, selector: "[mat-dialog-actions], mat-dialog-actions, [matDialogActions]", inputs: ["align"] }, { kind: "directive", type: i1.MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i2.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i2.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "component", type: MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: MatIconButton, selector: "button[mat-icon-button], a[mat-icon-button], button[matIconButton], a[matIconButton]", exportAs: ["matButton", "matAnchor"] }, { 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", "disabledInteractive"], exportAs: ["matInput"] }, { kind: "directive", type: MatListItemAvatar, selector: "[matListItemAvatar]" }, { kind: "component", type: MatListOption, selector: "mat-list-option", inputs: ["togglePosition", "color", "value", "selected"], outputs: ["selectedChange"], exportAs: ["matListOption"] }, { kind: "component", type: MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }, { kind: "component", type: MatSelectionList, selector: "mat-selection-list", inputs: ["color", "compareWith", "multiple", "hideSingleSelectionIndicator", "disabled"], outputs: ["selectionChange"], exportAs: ["matSelectionList"] }, { kind: "component", type: MatSlideToggle, selector: "mat-slide-toggle", inputs: ["name", "id", "labelPosition", "aria-label", "aria-labelledby", "aria-describedby", "required", "color", "disabled", "fullWidth", "disableRipple", "tabIndex", "checked", "hideIcon", "disabledInteractive"], outputs: ["change", "toggleChange"], exportAs: ["matSlideToggle"] }, { kind: "directive", type: MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }], changeDetection: i0.ChangeDetectionStrategy.Eager }); }
|
|
439
437
|
}
|
|
440
438
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.1", ngImport: i0, type: UserChooserComponent, decorators: [{
|
|
441
439
|
type: Component,
|
|
442
440
|
args: [{ imports: [
|
|
441
|
+
FormField,
|
|
443
442
|
MatButton,
|
|
444
443
|
MatDialogModule,
|
|
445
|
-
|
|
444
|
+
MatFormFieldModule,
|
|
446
445
|
MatIcon,
|
|
447
446
|
MatIconButton,
|
|
448
447
|
MatInput,
|
|
@@ -451,13 +450,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.1", ngImpor
|
|
|
451
450
|
MatProgressSpinner,
|
|
452
451
|
MatSelectionList,
|
|
453
452
|
MatSlideToggle,
|
|
454
|
-
MatTooltip
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
}], propDecorators: { selectionList: [{ type: i0.ViewChild, args: [i0.forwardRef(() => MatSelectionList), { isSignal: true }] }], filterInput: [{
|
|
458
|
-
type: ViewChild,
|
|
459
|
-
args: ['filterInput']
|
|
460
|
-
}] } });
|
|
453
|
+
MatTooltip
|
|
454
|
+
], standalone: true, changeDetection: ChangeDetectionStrategy.Eager, template: "<div mat-dialog-title>\r\n <div id=\"dialog-title\">\r\n <h2>{{ _data.title }}</h2>\r\n \r\n <div id=\"num-selected\">\r\n {{ selectedUsersOrGroups().length }} selected\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<mat-dialog-content>\r\n @if (dataSource() && photos().length) {\r\n <form>\r\n @if (dataSource()) {\r\n <mat-form-field>\r\n <input matInput placeholder=\"Search\" [formField]=\"filterForm.filter\" #filterInput>\r\n @if (filterForm().value().filter) {\r\n <button type=\"button\" matSuffix mat-icon-button aria-label=\"Clear\" (click)=\"filterFormModel.set({filter: ''})\">\r\n <mat-icon fontIcon=\"close\"/>\r\n </button>\r\n }\r\n </mat-form-field>\r\n }\r\n </form>\r\n\r\n <mat-selection-list [multiple]=\"isMultiMode\" (selectionChange)=\"closeIfSingleSelection()\">\r\n @for (user of dataSource()!.filteredData; track user) {\r\n <mat-list-option [value]=\"user\" [selected]=\"user.selected\"\r\n (selectedChange)=\"optionSelectionChanged(option)\" #option>\r\n @if (getPhoto(user)) {\r\n <img matListItemAvatar alt=\"\" [src]=\"getPhoto(user)\">\r\n } @else {\r\n <mat-icon matListItemAvatar class=\"no-photo\"\r\n [fontIcon]=\"isUser(user) ? 'account_circle' : 'group'\"/>\r\n }\r\n <div class=\"user\">\r\n <div [matTooltip]=\"tooltip(user)\" class=\"user-name\">\r\n {{ user.displayName ?? user.name }}\r\n @if (isUser(user) && _data.showPhone && castUser(user).telephoneNumber) {\r\n <div>{{ castUser(user).telephoneNumber }}</div>\r\n }\r\n </div>\r\n @if (isUser(user)) {\r\n <div>{{ castUser(user).department }}</div>\r\n <div class=\"title\">{{ castUser(user).title }}</div>\r\n }\r\n </div>\r\n </mat-list-option>\r\n }\r\n </mat-selection-list>\r\n } @else {\r\n <div>\r\n <mat-spinner [diameter]=\"50\"/>\r\n <h2 id=\"spinner-message\">Getting users and photos...</h2>\r\n </div>\r\n }\r\n</mat-dialog-content>\r\n\r\n<mat-dialog-actions>\r\n @if (dataSource() && photos().length) {\r\n @if (selectedUsersOrGroups().length) {\r\n <mat-slide-toggle (change)=\"hideUnselectedChanged($event.checked)\">\r\n Hide Unselected\r\n </mat-slide-toggle>\r\n }\r\n @if (isMultiMode) {\r\n <button mat-raised-button color=\"primary\" (click)=\"selectAll()\"\r\n >\r\n <mat-icon fontIcon=\"select_all\"/>\r\n <span class=\"hide-mobile\">Select All</span>\r\n </button>\r\n }\r\n @if (isMultiMode && selectedUsersOrGroups().length) {\r\n <button mat-raised-button color=\"primary\" (click)=\"deselectAll()\"\r\n >\r\n <mat-icon fontIcon=\"clear_all\"/>\r\n <span class=\"hide-mobile\">Clear All</span>\r\n </button>\r\n }\r\n @if (isMultiMode || !_data.closeWhenSelectionMade) {\r\n <button mat-raised-button color=\"primary\" (click)=\"close()\" matTooltip=\"Accept your selection\"\r\n [disabled]=\"!_data.allowCloseWithoutSelections && !selectedUsersOrGroups().length\">\r\n <mat-icon fontIcon=\"check\"/>\r\n <span class=\"hide-mobile\">Ok</span>\r\n </button>\r\n }\r\n }\r\n\r\n <button mat-raised-button color=\"warn\" mat-dialog-close matTooltip=\"Close this window\">\r\n <mat-icon fontIcon=\"close\"/>\r\n <span class=\"hide-mobile\">Cancel</span>\r\n </button>\r\n</mat-dialog-actions>", styles: ["::ng-deep .mat-tooltip{font-size:1em!important;white-space:pre-line}mat-dialog-content{min-width:50vw}#dialog-title{display:flex;justify-content:space-between}.mat-mdc-dialog-title:before{display:none!important}#num-selected{margin:1em 1em 0 0}mat-spinner{margin:0 auto}#spinner-message{text-align:center;padding:.5em}mat-form-field{width:100%}.title{font-style:italic;color:#757575}img,.no-photo{width:2rem;height:2rem;font-size:2.3rem!important;border-radius:100%}.hide-mobile{display:none}mat-dialog-actions{display:grid;grid-auto-flow:column;grid-gap:1em;justify-content:center}.user-name{display:flex;justify-content:space-between}.user-name>div:last-child{margin-right:10rem;font-weight:400;font-style:italic;color:#757575}@media(min-width:801px){.user{display:grid;grid-template-columns:1fr 1fr 1fr}.user>div:first-child{font-weight:700}.hide-mobile{display:initial}}\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"] }]
|
|
455
|
+
}], ctorParameters: () => [], propDecorators: { selectionList: [{ type: i0.ViewChild, args: [i0.forwardRef(() => MatSelectionList), { isSignal: true }] }], filterInput: [{ type: i0.ViewChild, args: ['filterInput', { isSignal: true }] }] } });
|
|
461
456
|
|
|
462
457
|
class UserFormFieldComponent {
|
|
463
458
|
constructor() {
|
|
@@ -475,6 +470,8 @@ class UserFormFieldComponent {
|
|
|
475
470
|
...(ngDevMode ? [{ debugName: "clickable" }] : /* istanbul ignore next */ []));
|
|
476
471
|
this.userChooserData = input.required(/* @ts-ignore */
|
|
477
472
|
...(ngDevMode ? [{ debugName: "userChooserData" }] : /* istanbul ignore next */ []));
|
|
473
|
+
this.accountNames = signal([], /* @ts-ignore */
|
|
474
|
+
...(ngDevMode ? [{ debugName: "accountNames" }] : /* istanbul ignore next */ []));
|
|
478
475
|
this.users = signal([], /* @ts-ignore */
|
|
479
476
|
...(ngDevMode ? [{ debugName: "users" }] : /* istanbul ignore next */ []));
|
|
480
477
|
this.groups = signal([], /* @ts-ignore */
|
|
@@ -495,13 +492,13 @@ class UserFormFieldComponent {
|
|
|
495
492
|
get class() {
|
|
496
493
|
return this._userChooserData?.mode === UserChooserMode.Single
|
|
497
494
|
? ''
|
|
498
|
-
: (this.accountNames
|
|
495
|
+
: (this.accountNames().length) > 4
|
|
499
496
|
? 'grid five'
|
|
500
|
-
: (this.accountNames
|
|
497
|
+
: (this.accountNames().length) > 3
|
|
501
498
|
? 'grid four'
|
|
502
|
-
: (this.accountNames
|
|
499
|
+
: (this.accountNames().length) > 2
|
|
503
500
|
? 'grid three'
|
|
504
|
-
: (this.accountNames
|
|
501
|
+
: (this.accountNames().length) > 1
|
|
505
502
|
? 'grid two'
|
|
506
503
|
: '';
|
|
507
504
|
}
|
|
@@ -513,7 +510,7 @@ class UserFormFieldComponent {
|
|
|
513
510
|
...this.userChooserData(),
|
|
514
511
|
};
|
|
515
512
|
// If users have been pre-selected in the config, store those in accountNames, which drives the UI of this component
|
|
516
|
-
this.accountNames
|
|
513
|
+
this.accountNames.set(this._userChooserData.preSelections?.accountNames ?? []);
|
|
517
514
|
this.#getData();
|
|
518
515
|
}
|
|
519
516
|
//#endregion
|
|
@@ -536,22 +533,22 @@ class UserFormFieldComponent {
|
|
|
536
533
|
if (!selected) {
|
|
537
534
|
return;
|
|
538
535
|
}
|
|
539
|
-
this.accountNames
|
|
536
|
+
this.accountNames.set(Array.isArray(selected)
|
|
540
537
|
? selected.map((s) => typeof s === 'string' ? s : s.sAMAccountName)
|
|
541
|
-
: [selected].map((s) => typeof s === 'string' ? s : s.sAMAccountName);
|
|
538
|
+
: [selected].map((s) => typeof s === 'string' ? s : s.sAMAccountName));
|
|
542
539
|
// Overwrite what may have been passed in, for subsequent launches of UserChooserComponent - otherwise it just keeps getting fed stale data
|
|
543
540
|
if (this._userChooserData.preSelections) {
|
|
544
541
|
this._userChooserData.preSelections.accountNames =
|
|
545
|
-
this.accountNames;
|
|
542
|
+
this.accountNames();
|
|
546
543
|
}
|
|
547
544
|
this.usersSelected.emit(selected);
|
|
548
545
|
});
|
|
549
546
|
}
|
|
550
547
|
unSelectUser(accountName) {
|
|
551
|
-
const index = this.accountNames
|
|
552
|
-
this.accountNames
|
|
548
|
+
const index = this.accountNames().findIndex((a) => a === accountName);
|
|
549
|
+
this.accountNames().splice(index ?? -1, 1);
|
|
553
550
|
if (this._userChooserData.preSelections) {
|
|
554
|
-
this._userChooserData.preSelections.accountNames = this.accountNames;
|
|
551
|
+
this._userChooserData.preSelections.accountNames = this.accountNames();
|
|
555
552
|
}
|
|
556
553
|
this.userUnSelected.emit(accountName);
|
|
557
554
|
}
|
|
@@ -635,7 +632,7 @@ class UserFormFieldComponent {
|
|
|
635
632
|
useExisting: forwardRef(() => UserFormFieldComponent),
|
|
636
633
|
multi: true,
|
|
637
634
|
},
|
|
638
|
-
], ngImport: i0, template: "\r\n<!-- In Microsoft Edge, selectUser() never gets called if the input fields are disabled\r\nSo... I'm dynamically setting the disabled property based on whether or not the browser is Edge.\r\nIt's definitely a better experience if the field IS disabled.\r\nOtherwise, it's confusing - especially because Edge is SO SLOW to display the resulting dialog window.\r\n-->\r\n<!-- Update 8/24/2023:\r\nThe above problem also exists in Chrome now.\r\nSo instead of dynamically setting [disabled] based on browser type,\r\nI'm applying CSS to suppress mouse events on the input - thus making it bubble up to the parent control, which responds the way we want/\r\n-->\r\n\r\n@if (users().length && photos().length) {\r\n <div (click)=\"selectUser()\" [class.clickable]=\"clickable()\">\r\n @if (accountNames
|
|
635
|
+
], ngImport: i0, template: "\r\n<!-- In Microsoft Edge, selectUser() never gets called if the input fields are disabled\r\nSo... I'm dynamically setting the disabled property based on whether or not the browser is Edge.\r\nIt's definitely a better experience if the field IS disabled.\r\nOtherwise, it's confusing - especially because Edge is SO SLOW to display the resulting dialog window.\r\n-->\r\n<!-- Update 8/24/2023:\r\nThe above problem also exists in Chrome now.\r\nSo instead of dynamically setting [disabled] based on browser type,\r\nI'm applying CSS to suppress mouse events on the input - thus making it bubble up to the parent control, which responds the way we want/\r\n-->\r\n\r\n@if (users().length && photos().length) {\r\n <div (click)=\"selectUser()\" [class.clickable]=\"clickable()\">\r\n @if (accountNames().length) {\r\n <div [ngClass]=\"class\">\r\n @for (accountName of accountNames(); track accountName; let i = $index) {\r\n <div class=\"user\">\r\n <!--<img *ngIf=\"accountName && empUtils.getEmployee(accountName)\" alt=\"\" [src]=\"empUtils.getEmployee(accountName) | employeePhotoUrl:cacheService.photos\">-->\r\n @if (getPhoto(accountName)) {\r\n <img matListItemAvatar alt=\"\" [src]=\"getPhoto(accountName)\">\r\n }\r\n @if (getGroup(accountName)) {\r\n <mat-icon>group</mat-icon>\r\n }\r\n <mat-form-field>\r\n <!-- [disabled]=\"!isEdge\" -->\r\n <input matInput disabled [placeholder]=\"i === 0 ? placeholder() : ''\"\r\n [value]=\"getUser(accountName)?.displayName ?? getGroup(accountName)?.displayName ?? accountName\">\r\n <button matSuffix mat-icon-button aria-label=\"Clear\" (click)=\"$event.stopPropagation(); unSelectUser(accountName)\">\r\n <mat-icon fontIcon=\"close\"/>\r\n </button>\r\n </mat-form-field>\r\n </div>\r\n }\r\n </div>\r\n } @else {\r\n <mat-form-field>\r\n <input matInput disabled [placeholder]=\"placeholder()\"> <!-- [disabled]=\"!isEdge\" -->\r\n </mat-form-field>\r\n }\r\n </div>\r\n} @else {\r\n <mat-progress-bar mode=\"indeterminate\"/>\r\n}", styles: [".user{display:grid;grid-template-columns:auto 1fr;grid-gap:.5em;align-items:center}.clickable,.clickable input{cursor:pointer!important}img{width:2em;height:2em;border-radius:100%}@media(min-width:801px){.grid{display:grid;grid-template-columns:repeat(2,1fr);grid-gap:1em}.three{grid-template-columns:repeat(3,1fr)}.four{grid-template-columns:repeat(4,1fr)}.five{grid-template-columns:repeat(5,1fr)}::ng-deep .grid mat-form-field{width:15vw}}input[disabled]{pointer-events:none}\n"], dependencies: [{ 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: "component", type: MatIconButton, selector: "button[mat-icon-button], a[mat-icon-button], button[matIconButton], a[matIconButton]", exportAs: ["matButton", "matAnchor"] }, { 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", "disabledInteractive"], exportAs: ["matInput"] }, { kind: "component", type: MatProgressBar, selector: "mat-progress-bar", inputs: ["color", "value", "bufferValue", "mode"], outputs: ["animationEnd"], exportAs: ["matProgressBar"] }, { kind: "directive", type: MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }], changeDetection: i0.ChangeDetectionStrategy.Eager }); }
|
|
639
636
|
}
|
|
640
637
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.1", ngImport: i0, type: UserFormFieldComponent, decorators: [{
|
|
641
638
|
type: Component,
|
|
@@ -653,7 +650,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.1", ngImpor
|
|
|
653
650
|
useExisting: forwardRef(() => UserFormFieldComponent),
|
|
654
651
|
multi: true,
|
|
655
652
|
},
|
|
656
|
-
], standalone: true, changeDetection: ChangeDetectionStrategy.Eager, template: "\r\n<!-- In Microsoft Edge, selectUser() never gets called if the input fields are disabled\r\nSo... I'm dynamically setting the disabled property based on whether or not the browser is Edge.\r\nIt's definitely a better experience if the field IS disabled.\r\nOtherwise, it's confusing - especially because Edge is SO SLOW to display the resulting dialog window.\r\n-->\r\n<!-- Update 8/24/2023:\r\nThe above problem also exists in Chrome now.\r\nSo instead of dynamically setting [disabled] based on browser type,\r\nI'm applying CSS to suppress mouse events on the input - thus making it bubble up to the parent control, which responds the way we want/\r\n-->\r\n\r\n@if (users().length && photos().length) {\r\n <div (click)=\"selectUser()\" [class.clickable]=\"clickable()\">\r\n @if (accountNames
|
|
653
|
+
], standalone: true, changeDetection: ChangeDetectionStrategy.Eager, template: "\r\n<!-- In Microsoft Edge, selectUser() never gets called if the input fields are disabled\r\nSo... I'm dynamically setting the disabled property based on whether or not the browser is Edge.\r\nIt's definitely a better experience if the field IS disabled.\r\nOtherwise, it's confusing - especially because Edge is SO SLOW to display the resulting dialog window.\r\n-->\r\n<!-- Update 8/24/2023:\r\nThe above problem also exists in Chrome now.\r\nSo instead of dynamically setting [disabled] based on browser type,\r\nI'm applying CSS to suppress mouse events on the input - thus making it bubble up to the parent control, which responds the way we want/\r\n-->\r\n\r\n@if (users().length && photos().length) {\r\n <div (click)=\"selectUser()\" [class.clickable]=\"clickable()\">\r\n @if (accountNames().length) {\r\n <div [ngClass]=\"class\">\r\n @for (accountName of accountNames(); track accountName; let i = $index) {\r\n <div class=\"user\">\r\n <!--<img *ngIf=\"accountName && empUtils.getEmployee(accountName)\" alt=\"\" [src]=\"empUtils.getEmployee(accountName) | employeePhotoUrl:cacheService.photos\">-->\r\n @if (getPhoto(accountName)) {\r\n <img matListItemAvatar alt=\"\" [src]=\"getPhoto(accountName)\">\r\n }\r\n @if (getGroup(accountName)) {\r\n <mat-icon>group</mat-icon>\r\n }\r\n <mat-form-field>\r\n <!-- [disabled]=\"!isEdge\" -->\r\n <input matInput disabled [placeholder]=\"i === 0 ? placeholder() : ''\"\r\n [value]=\"getUser(accountName)?.displayName ?? getGroup(accountName)?.displayName ?? accountName\">\r\n <button matSuffix mat-icon-button aria-label=\"Clear\" (click)=\"$event.stopPropagation(); unSelectUser(accountName)\">\r\n <mat-icon fontIcon=\"close\"/>\r\n </button>\r\n </mat-form-field>\r\n </div>\r\n }\r\n </div>\r\n } @else {\r\n <mat-form-field>\r\n <input matInput disabled [placeholder]=\"placeholder()\"> <!-- [disabled]=\"!isEdge\" -->\r\n </mat-form-field>\r\n }\r\n </div>\r\n} @else {\r\n <mat-progress-bar mode=\"indeterminate\"/>\r\n}", styles: [".user{display:grid;grid-template-columns:auto 1fr;grid-gap:.5em;align-items:center}.clickable,.clickable input{cursor:pointer!important}img{width:2em;height:2em;border-radius:100%}@media(min-width:801px){.grid{display:grid;grid-template-columns:repeat(2,1fr);grid-gap:1em}.three{grid-template-columns:repeat(3,1fr)}.four{grid-template-columns:repeat(4,1fr)}.five{grid-template-columns:repeat(5,1fr)}::ng-deep .grid mat-form-field{width:15vw}}input[disabled]{pointer-events:none}\n"] }]
|
|
657
654
|
}], propDecorators: { usersSelected: [{ type: i0.Output, args: ["usersSelected"] }], userUnSelected: [{ type: i0.Output, args: ["userUnSelected"] }], placeholder: [{ type: i0.Input, args: [{ isSignal: true, alias: "placeholder", required: false }] }], clickable: [{ type: i0.Input, args: [{ isSignal: true, alias: "clickable", required: false }] }], userChooserData: [{ type: i0.Input, args: [{ isSignal: true, alias: "userChooserData", required: true }] }] } });
|
|
658
655
|
|
|
659
656
|
class MatActiveDirectoryModule {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cleavelandprice-ngx-lib-active-directory-material.mjs","sources":["../../../../projects/cleavelandprice/ngx-lib/active-directory/material/src/model/default-user-chooser-filter-options.ts","../../../../projects/cleavelandprice/ngx-lib/active-directory/material/src/model/user-chooser-mode.ts","../../../../projects/cleavelandprice/ngx-lib/active-directory/material/src/model/default-user-chooser-data.ts","../../../../projects/cleavelandprice/ngx-lib/active-directory/material/src/model/user-chooser-filter-options.ts","../../../../projects/cleavelandprice/ngx-lib/active-directory/material/src/model/user-chooser-pre-processing-group.ts","../../../../projects/cleavelandprice/ngx-lib/active-directory/material/src/components/user-chooser/user-chooser.component.ts","../../../../projects/cleavelandprice/ngx-lib/active-directory/material/src/components/user-chooser/user-chooser.component.html","../../../../projects/cleavelandprice/ngx-lib/active-directory/material/src/components/user-form-field/user-form-field.component.ts","../../../../projects/cleavelandprice/ngx-lib/active-directory/material/src/components/user-form-field/user-form-field.component.html","../../../../projects/cleavelandprice/ngx-lib/active-directory/material/src/mat-active-directory.module.ts","../../../../projects/cleavelandprice/ngx-lib/active-directory/material/src/cleavelandprice-ngx-lib-active-directory-material.ts"],"sourcesContent":["import { UserChooserFilterOptions } from \"./user-chooser-filter-options\";\r\n\r\nexport const DefaultUserChooserFilterOptions: UserChooserFilterOptions = {\r\n accountName: true,\r\n department: true,\r\n groupMembership: false,\r\n phoneNumber: true,\r\n title: true\r\n};","export enum UserChooserMode {\r\n Single,\r\n Multiple\r\n}","import { DefaultUserChooserFilterOptions } from \"./default-user-chooser-filter-options\";\r\nimport { UserChooserData } from \"./user-chooser-data\";\r\nimport { UserChooserMode } from \"./user-chooser-mode\";\r\n\r\nexport const DefaultUserChooserData: UserChooserData = {\r\n closeWhenSelectionMade: false,\r\n allowCloseWithoutSelections: false,\r\n includeDisabledUsers: false,\r\n returnUserObjects: false,\r\n showGroupMembershipTooltips: false,\r\n showPhone: true,\r\n title: 'Select User(s)',\r\n mode: UserChooserMode.Single,\r\n objectTypes: '*',\r\n filterOptions: DefaultUserChooserFilterOptions\r\n};","export interface UserChooserFilterOptions {\r\n accountName?: boolean;\r\n department?: boolean;\r\n groupMembership?: boolean;\r\n phoneNumber?: boolean;\r\n title?: boolean;\r\n};","export interface UserChooserPreProcessingGroup {\r\n accountNames?: string[];\r\n departments?: string[];\r\n groups?: string[];\r\n titles?: string[];\r\n};","import {\n Component,\n ElementRef,\n inject,\n OnInit,\n ViewChild,\n viewChild,\n ChangeDetectionStrategy,\n} from '@angular/core';\nimport { FormControl, FormGroup, ReactiveFormsModule } from '@angular/forms';\nimport {\n MAT_DIALOG_DATA,\n MatDialogModule,\n MatDialogRef,\n} from '@angular/material/dialog';\nimport {\n MatListItemAvatar,\n MatListOption,\n MatSelectionList,\n} from '@angular/material/list';\nimport { MatTableDataSource } from '@angular/material/table';\nimport { debounceTime, forkJoin, Observable, of } from 'rxjs';\n\nimport { ActiveDirectoryService } from '@cleavelandprice/ngx-lib/active-directory';\nimport {\n PhotoItem,\n SharePointService,\n} from '@cleavelandprice/ngx-lib/sharepoint';\n\nimport { MatButton, MatIconButton } from '@angular/material/button';\nimport { MatFormField } from '@angular/material/form-field';\nimport { MatIcon } from '@angular/material/icon';\nimport { MatInput } from '@angular/material/input';\nimport { MatProgressSpinner } from '@angular/material/progress-spinner';\nimport { MatSlideToggle } from '@angular/material/slide-toggle';\nimport { MatTooltip } from '@angular/material/tooltip';\nimport { DefaultUserChooserData } from '../../model/default-user-chooser-data';\nimport { SelectableGroup } from '../../model/selectable-group';\nimport { SelectableUser } from '../../model/selectable-user';\nimport { UserChooserData } from '../../model/user-chooser-data';\nimport { UserChooserMode } from '../../model/user-chooser-mode';\n\n@Component({\n templateUrl: './user-chooser.component.html',\n imports: [\n MatButton,\n MatDialogModule,\n MatFormField,\n MatIcon,\n MatIconButton,\n MatInput,\n MatListItemAvatar,\n MatListOption,\n MatProgressSpinner,\n MatSelectionList,\n MatSlideToggle,\n MatTooltip,\n ReactiveFormsModule,\n ],\n standalone: true,\n changeDetection: ChangeDetectionStrategy.Eager,\n styleUrls: [\n './user-chooser.component.scss',\n '../../../../../styles/mat-icon.scss',\n ],\n})\nexport class UserChooserComponent implements OnInit {\n #services = {\n dialogRef: inject(MatDialogRef<UserChooserComponent>),\n activeDirectory: inject(ActiveDirectoryService),\n sharePoint: inject(SharePointService),\n data: inject<UserChooserData>(MAT_DIALOG_DATA),\n };\n _data = { ...DefaultUserChooserData, ...this.#services.data };\n\n //#region Fields\n\n //@ViewChild(MatSelectionList) selectionList?: MatSelectionList;\n selectionList = viewChild(MatSelectionList);\n\n @ViewChild('filterInput') set filterInput(\n elRef: ElementRef<HTMLInputElement>,\n ) {\n if (elRef) {\n elRef.nativeElement.focus();\n }\n }\n //filterInput = viewChild<ElementRef>('filterInput');\n\n filterForm = new FormGroup({\n filter: new FormControl(),\n });\n\n dataSource?: MatTableDataSource<SelectableUser | SelectableGroup>;\n photos?: PhotoItem[];\n groups?: SelectableGroup[]; // May or may not get populated, depending on config data sent in\n //#endregion\n\n //#region Properties\n get isMultiMode(): boolean {\n return this._data.mode === UserChooserMode.Multiple;\n }\n\n get selectedOptions(): MatListOption[] {\n return this.selectionList()?.options.filter((o) => o.selected) ?? [];\n }\n\n get selectedUsers(): (SelectableUser | SelectableGroup)[] {\n return this.dataSource?.data?.filter((d) => d.selected) ?? [];\n }\n\n get filterValue(): string {\n return this.filterForm.value.filter;\n }\n\n get adGroupsNeeded(): boolean {\n // If any are these are true, then we need to pull AD groups for use later\n return (\n (this._data.showGroupMembershipTooltips ?? false) ||\n (this._data.exclusions?.groups?.length ?? 0) > 0 ||\n (this._data.inclusions?.groups?.length ?? 0) > 0 ||\n (this._data.preSelections?.groups?.length ?? 0) > 0 ||\n this._data.filterOptions?.groupMembership ||\n (this._data.selectableGroupNames?.length ?? 0) > 0 ||\n (this._data.groups?.length ?? 0) > 0\n );\n }\n //#endregion\n\n //#region Lifecycle\n ngOnInit(): void {\n this.#getData();\n this.#listenForFilterChanges();\n }\n //#endregion\n\n //#region Events\n listSelectionChanged(options: MatListOption[]): void {\n if (\n this._data.mode === UserChooserMode.Single &&\n this.selectedOptions.length &&\n this._data.closeWhenSelectionMade\n ) {\n this.close();\n }\n }\n\n optionSelectionChanged(option: MatListOption): void {\n const user = this.dataSource?.data.find(\n (u) =>\n u.sAMAccountName.toLocaleLowerCase() ===\n (option.value as SelectableUser).sAMAccountName.toLowerCase(),\n );\n\n if (user) {\n // If we are in single user selection mode, deselect any existing selections first\n if (!this.isMultiMode && option.selected) {\n this.dataSource?.data\n .filter(\n (u) =>\n u.sAMAccountName.toLowerCase() !==\n (option.value as SelectableUser).sAMAccountName.toLowerCase(),\n )\n .forEach((u) => (u.selected = false));\n }\n\n user.selected = option.selected;\n }\n }\n\n hideUnselectedChanged(selected: boolean): void {\n this.filterForm\n .get('filter')\n ?.setValue(selected ? '{selected:true}' : null);\n }\n\n selectAll(): void {\n this.selectionList()?.selectAll();\n\n if (this.selectionList()?.options) {\n this.listSelectionChanged(this.selectionList()!.options.toArray());\n }\n }\n\n deselectAll(): void {\n this.selectionList()?.deselectAll();\n }\n //#endregion\n\n //#region Utilities\n isUser(userOrGroup: SelectableUser | SelectableGroup): boolean {\n return 'title' in userOrGroup;\n }\n castUser(userOrGroup: SelectableUser | SelectableGroup): SelectableUser {\n return userOrGroup as SelectableUser;\n }\n\n #getData(): void {\n const observables$: Observable<any>[] = [\n this._data.users?.length\n ? // Users were passed in\n of(this._data.users)\n : // Users need to be retrieved\n this.#services.activeDirectory.getUsers(\n this._data.appName ?? 'ngxlibADUserChooser',\n this._data.includeDisabledUsers,\n this._data.parentOu,\n ),\n\n this._data.photos?.length\n ? // Photos were passed in\n of(this._data.photos)\n : // Photos need to be retrieved\n this.#services.sharePoint.getPhotos(),\n ];\n\n // Do we need AD groups?\n if (this.adGroupsNeeded) {\n observables$.push(\n this._data.groups?.length\n ? // Groups were passed in\n of(this._data.groups)\n : // Groups need to be retrieved\n this.#services.activeDirectory.getGroups(),\n );\n }\n\n forkJoin(observables$)\n //.subscribe(([users, photos]) => {\n .subscribe((data) => {\n // Need groups in place before we handle exclusions/inclusions/pre-selections\n this.groups = this.adGroupsNeeded ? data[2] : null;\n\n let users = data[0] as SelectableUser[];\n users.forEach((u) => (u.selected = false)); // In case existing data was re-used\n users = this.#includeUsersByAccountName(users);\n users = this.#includeUsersByGroupName(users);\n users = this.#includeUsersByDepartment(users);\n users = this.#includeUsersByTitle(users);\n\n users = this.#excludeUsersByAccountName(users);\n users = this.#excludeUsersByGroupName(users);\n users = this.#excludeUsersByDepartment(users);\n users = this.#excludeUsersByTitle(users);\n\n users = this.#preSelectUsersByAccountName(users);\n users = this.#preSelectUsersByGroupName(users);\n users = this.#preSelectUsersByDepartment(users);\n users = this.#preSelectUsersByTitle(users);\n\n this.#preSelectGroupsByAccountName();\n\n const usersAndGroups: (SelectableUser | SelectableGroup)[] = [];\n\n // Should we allow users to be selected?\n if (['users', '*'].includes(this._data.objectTypes!)) {\n usersAndGroups.push(...users);\n }\n\n // Should we allow groups to be selected\n\n if (['groups', '*'].includes(this._data.objectTypes!)) {\n if (this._data.selectableGroupNames?.length) {\n if (this._data.selectableGroupNames.includes('*')) {\n usersAndGroups.push(...this.groups!);\n } else {\n this._data.selectableGroupNames.forEach((groupName) => {\n const group = this.groups!.find(\n (g) => g.displayName === groupName,\n );\n\n if (group) {\n usersAndGroups.push({\n ...group,\n selected: group.selected,\n });\n }\n });\n }\n }\n }\n\n this.dataSource = new MatTableDataSource(usersAndGroups);\n\n this.photos = data[1];\n\n this.#setFilterPredicate();\n });\n }\n\n close(): void {\n if (!this.selectedUsers?.length) {\n this.#services.dialogRef.close(\n this._data.allowCloseWithoutSelections ? [] : undefined,\n );\n return;\n }\n const value = this.selectedUsers.map((u) =>\n this._data.returnUserObjects ? u : u.sAMAccountName,\n );\n\n this.#services.dialogRef.close(\n this._data.mode === UserChooserMode.Multiple ? value : value[0],\n );\n }\n\n getPhoto(user: SelectableUser | SelectableGroup): string | undefined {\n if (!this.isUser(user)) {\n return;\n }\n\n return this.photos?.find(\n (p) =>\n (p.employeeNumber &&\n p.employeeNumber.toString() ===\n (user as SelectableUser).employeeNumber) ||\n p.accountName?.toLowerCase() === user.sAMAccountName.toLowerCase() ||\n p.displayName?.toLowerCase() ===\n (user.displayName ?? user.name).toLowerCase() ||\n p.title?.toLowerCase() ===\n (user.displayName ?? user.name).toLowerCase(),\n )?.encodedAbsUrl;\n }\n\n //#region Exclusions - won't be included in the dataSource at all\n #excludeUsersByAccountName(users: SelectableUser[]): SelectableUser[] {\n this._data.exclusions?.accountNames?.forEach((accountName) => {\n const index = users.findIndex(\n (u) => u.sAMAccountName.toLowerCase() === accountName.toLowerCase(),\n );\n if (index === -1) {\n return;\n }\n\n users.splice(index, 1);\n });\n\n return users;\n }\n\n #excludeUsersByGroupName(users: SelectableUser[]): SelectableUser[] {\n this._data.exclusions?.groups?.forEach((groupName) => {\n const group = this.groups?.find(\n (g) => g.name.toLowerCase() === groupName.toLowerCase(),\n );\n if (!group) {\n return;\n }\n\n group.member.forEach((groupMemberDn) => {\n const index = users.findIndex(\n (u) => u.distinguishedName === groupMemberDn,\n );\n if (index === -1) {\n return;\n }\n\n users.splice(index, 1);\n });\n });\n\n return users;\n }\n\n #excludeUsersByDepartment(users: SelectableUser[]): SelectableUser[] {\n this._data.exclusions?.departments?.forEach((department) => {\n const excludedUsers = users.filter(\n (u) => u.department?.toLowerCase() === department.toLowerCase(),\n );\n\n excludedUsers.forEach((user) => {\n const index = users.indexOf(user);\n users.splice(index, 1);\n });\n });\n\n return users;\n }\n\n #excludeUsersByTitle(users: SelectableUser[]): SelectableUser[] {\n this._data.exclusions?.titles?.forEach((title) => {\n const excludedUsers = users.filter(\n (u) => u.title?.toLowerCase() === title.toLowerCase(),\n );\n\n excludedUsers.forEach((user) => {\n const index = users.indexOf(user);\n users.splice(index, 1);\n });\n });\n\n return users;\n }\n //#endregion\n\n //#region Inclusions - only these will be included in the dataSource\n #includeUsersByAccountName(users: SelectableUser[]): SelectableUser[] {\n return users.filter(\n (user) =>\n !this._data.inclusions?.accountNames?.length || // No account inclusions specified\n this._data.inclusions.accountNames.find(\n (accountName) =>\n accountName.toLowerCase() === user.sAMAccountName.toLowerCase(),\n ),\n );\n }\n\n #includeUsersByDepartment(users: SelectableUser[]): SelectableUser[] {\n return users.filter(\n (user) =>\n !this._data.inclusions?.departments?.length || // No department inclusions specified\n this._data.inclusions.departments.find(\n (department) =>\n department.toLowerCase() === user.department?.toLowerCase(),\n ),\n );\n }\n\n #includeUsersByTitle(users: SelectableUser[]): SelectableUser[] {\n return users.filter(\n (user) =>\n !this._data.inclusions?.titles?.length || // No title inclusions specified\n this._data.inclusions.titles.find(\n (title) => title.toLowerCase() === user.title?.toLowerCase(),\n ),\n );\n }\n\n #includeUsersByGroupName(users: SelectableUser[]): SelectableUser[] {\n if (!this._data.inclusions?.groups?.length) {\n return users; // No group inclusions specified\n }\n\n // Cheating a bit and leveraging the 'selected' property to keep track of who should be included\n // Since inclusions happen befor pre-selections, we can do that, as long as we set 'selected' back to false when we're done\n this._data.inclusions.groups.forEach((groupName) => {\n const group = this.groups?.find(\n (g) => g.name.toLowerCase() === groupName.toLowerCase(),\n );\n if (!group) {\n return;\n }\n\n users\n .filter((user) =>\n group.member.find(\n (groupMemberDn) => groupMemberDn === user.distinguishedName,\n ),\n )\n .forEach((user) => (user.selected = true));\n });\n\n // At this point, all of the appropriate users should have 'selected' set to true\n const selectedUsers = users.filter((user) => user.selected); // Subset of the original list\n // Reset 'selected' to false, and return\n selectedUsers.forEach((user) => (user.selected = false));\n return selectedUsers;\n }\n //#endregion\n\n //#region Pre-Selections\n #preSelectUsersByAccountName(users: SelectableUser[]): SelectableUser[] {\n this._data.preSelections?.accountNames?.forEach((accountName) => {\n const user = users.find(\n (u) => u.sAMAccountName.toLowerCase() === accountName.toLowerCase(),\n );\n if (!user) {\n return;\n }\n\n user.selected = true;\n });\n\n return users;\n }\n\n #preSelectGroupsByAccountName(): void {\n this._data.preSelections?.accountNames?.forEach((accountName) => {\n const group = this.groups?.find(\n (g) => g.sAMAccountName.toLowerCase() === accountName.toLowerCase(),\n );\n if (!group) {\n return;\n }\n\n group.selected = true;\n });\n }\n\n #preSelectUsersByDepartment(users: SelectableUser[]): SelectableUser[] {\n this._data.preSelections?.departments?.forEach((department) =>\n users\n .filter((u) => u.department?.toLowerCase() === department.toLowerCase())\n .forEach((user) => (user.selected = true)),\n );\n\n return users;\n }\n\n #preSelectUsersByTitle(users: SelectableUser[]): SelectableUser[] {\n this._data.preSelections?.titles?.forEach((title) =>\n users\n .filter((u) => u.title?.toLowerCase() === title.toLowerCase())\n .forEach((user) => (user.selected = true)),\n );\n\n return users;\n }\n\n #preSelectUsersByGroupName(users: SelectableUser[]): SelectableUser[] {\n this._data.preSelections?.groups?.forEach((groupName) => {\n const group = this.groups?.find(\n (g) => g.name.toLowerCase() === groupName.toLowerCase(),\n );\n if (!group) {\n return;\n }\n\n group.member.forEach((groupMemberDn) => {\n const user = users.find((u) => u.distinguishedName === groupMemberDn);\n if (!user) {\n return;\n }\n\n user.selected = true;\n });\n });\n\n return users;\n }\n //#endregion\n\n #setFilterPredicate(): void {\n if (!this.dataSource) {\n return;\n }\n\n this.dataSource.filterPredicate = (\n user: SelectableUser | SelectableGroup,\n filter: string,\n ) => {\n if (filter === '{selected:true}') {\n return user.selected;\n } else {\n const regex = new RegExp(filter, 'i'); // Case-insensitive\n let match = false; // The end result - whether or not a employee matches the filter\n\n const filterProperties = ['displayName'];\n if (this._data.filterOptions?.accountName) {\n filterProperties.push('sAMAccountName');\n }\n if (this._data.filterOptions?.title) {\n filterProperties.push('title');\n }\n if (this._data.filterOptions?.department) {\n filterProperties.push('department');\n }\n if (this._data.filterOptions?.phoneNumber) {\n filterProperties.push('telephoneNumber');\n }\n\n // Match on the properties configured above\n filterProperties.forEach((field) => {\n // @ts-ignore\n if (user[field] && user[field].match(regex)) {\n match = true;\n }\n });\n\n // Match on group membership (group name)\n if (this._data.filterOptions?.groupMembership) {\n user.memberOf.forEach((groupDn) => {\n const group = this.groups?.find(\n (group) =>\n group.distinguishedName === groupDn && group.name.match(regex),\n );\n\n if (group) {\n match = true;\n }\n });\n }\n\n return match;\n }\n };\n }\n\n #listenForFilterChanges(): void {\n this.filterForm\n .get('filter')\n ?.valueChanges.pipe(debounceTime(250))\n .subscribe(\n () =>\n (this.dataSource!.filter = this.filterForm.value.filter\n ?.trim()\n .toLowerCase()),\n );\n }\n\n tooltip(user: SelectableUser | SelectableGroup): string {\n return this._data.showGroupMembershipTooltips\n ? user.memberOf\n .map(\n (groupDn) =>\n this.groups?.find((group) => group.distinguishedName === groupDn)\n ?.name,\n )\n .sort((a, b) => (a! > b! ? 1 : -1))\n .join('\\n')\n : '';\n }\n //#endregion\n}\n","<div mat-dialog-title>\r\n <div id=\"dialog-title\">\r\n <h2>{{ _data.title }}</h2>\r\n \r\n <div id=\"num-selected\">\r\n {{ selectedOptions.length }} selected\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<mat-dialog-content>\r\n @if (dataSource && photos) {\r\n <form [formGroup]=\"filterForm\">\r\n @if (dataSource) {\r\n <mat-form-field>\r\n <input matInput placeholder=\"Search\" formControlName=\"filter\" #filterInput>\r\n @if (filterForm.value.filter) {\r\n <button matSuffix mat-icon-button aria-label=\"Clear\" (click)=\"filterForm.get('filter')?.setValue('')\">\r\n <mat-icon fontIcon=\"close\"/>\r\n </button>\r\n }\r\n </mat-form-field>\r\n }\r\n </form>\r\n <mat-selection-list [multiple]=\"isMultiMode\"\r\n (selectionChange)=\"listSelectionChanged($event.options)\">\r\n @for (user of dataSource.filteredData; track user) {\r\n <mat-list-option [value]=\"user\" [selected]=\"user.selected\"\r\n (selectedChange)=\"optionSelectionChanged(option)\" #option>\r\n @if (getPhoto(user)) {\r\n <img matListItemAvatar alt=\"\" [src]=\"getPhoto(user)\">\r\n } @else {\r\n <mat-icon matListItemAvatar class=\"no-photo\"\r\n [fontIcon]=\"isUser(user) ? 'account_circle' : 'group'\"/>\r\n }\r\n <div class=\"user\">\r\n <div [matTooltip]=\"tooltip(user)\" class=\"user-name\">\r\n {{ user.displayName ?? user.name }}\r\n @if (isUser(user) && _data.showPhone && castUser(user).telephoneNumber) {\r\n <div>{{ castUser(user).telephoneNumber }}</div>\r\n }\r\n </div>\r\n @if (isUser(user)) {\r\n <div>{{ castUser(user).department }}</div>\r\n <div class=\"title\">{{ castUser(user).title }}</div>\r\n }\r\n </div>\r\n </mat-list-option>\r\n }\r\n </mat-selection-list>\r\n } @else {\r\n <div>\r\n <mat-spinner [diameter]=\"50\"/>\r\n <h2 id=\"spinner-message\">Getting users and photos...</h2>\r\n </div>\r\n }\r\n</mat-dialog-content>\r\n\r\n<mat-dialog-actions>\r\n @if (dataSource && photos) {\r\n @if (selectedOptions.length) {\r\n <mat-slide-toggle (change)=\"hideUnselectedChanged($event.checked)\">\r\n Hide Unselected\r\n </mat-slide-toggle>\r\n }\r\n @if (isMultiMode) {\r\n <button mat-raised-button color=\"primary\" (click)=\"selectAll()\"\r\n >\r\n <mat-icon fontIcon=\"select_all\"/>\r\n <span class=\"hide-mobile\">Select All</span>\r\n </button>\r\n }\r\n @if (isMultiMode && selectedOptions.length) {\r\n <button mat-raised-button color=\"primary\" (click)=\"deselectAll()\"\r\n >\r\n <mat-icon fontIcon=\"clear_all\"/>\r\n <span class=\"hide-mobile\">Clear All</span>\r\n </button>\r\n }\r\n @if (isMultiMode || !_data.closeWhenSelectionMade) {\r\n <button mat-raised-button color=\"primary\" (click)=\"close()\" matTooltip=\"Accept your selection\"\r\n [disabled]=\"!_data.allowCloseWithoutSelections && !selectedOptions.length\">\r\n <mat-icon fontIcon=\"check\"/>\r\n <span class=\"hide-mobile\">Ok</span>\r\n </button>\r\n }\r\n }\r\n\r\n <button mat-raised-button color=\"warn\" mat-dialog-close matTooltip=\"Close this window\">\r\n <mat-icon fontIcon=\"close\"/>\r\n <span class=\"hide-mobile\">Cancel</span>\r\n </button>\r\n</mat-dialog-actions>","import {\n Component,\n forwardRef,\n inject,\n input,\n OnInit,\n output,\n ChangeDetectionStrategy,\n signal,\n} from '@angular/core';\nimport { MatDialog } from '@angular/material/dialog';\nimport { forkJoin, of } from 'rxjs';\n\nimport {\n ActiveDirectoryService,\n User,\n UserOrGroup,\n} from '@cleavelandprice/ngx-lib/active-directory';\nimport {\n PhotoItem,\n SharePointService,\n} from '@cleavelandprice/ngx-lib/sharepoint';\n\nimport { DefaultUserChooserData } from '../../model/default-user-chooser-data';\nimport { UserChooserData } from '../../model/user-chooser-data';\n\nimport { NgClass } from '@angular/common';\nimport { MatIconButton } from '@angular/material/button';\nimport { MatFormField, MatSuffix } from '@angular/material/form-field';\nimport { MatIcon } from '@angular/material/icon';\nimport { MatInput } from '@angular/material/input';\nimport { MatProgressBar } from '@angular/material/progress-bar';\nimport { UserChooserMode } from '../../mat-active-directory.api';\nimport { UserChooserComponent } from '../user-chooser/user-chooser.component';\nimport { NG_VALUE_ACCESSOR } from '@angular/forms';\n\n@Component({\n selector: 'cp-user-field',\n imports: [\n MatFormField,\n MatIcon,\n MatIconButton,\n MatInput,\n MatProgressBar,\n MatSuffix,\n NgClass,\n ],\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => UserFormFieldComponent),\n multi: true,\n },\n ],\n standalone: true,\n templateUrl: './user-form-field.component.html',\n changeDetection: ChangeDetectionStrategy.Eager,\n styleUrl: './user-form-field.component.scss',\n})\nexport class UserFormFieldComponent implements OnInit {\n //#region Fields\n #services = {\n dialog: inject(MatDialog),\n activeDirectory: inject(ActiveDirectoryService),\n sharePoint: inject(SharePointService),\n };\n usersSelected = output<string | string[] | UserOrGroup | UserOrGroup[]>(); // string for Single mode, string[] for multi\n userUnSelected = output<string>();\n placeholder = input('Select User(s)');\n clickable = input(true);\n userChooserData = input.required<UserChooserData>();\n _userChooserData!: UserChooserData;\n\n accountNames?: string[];\n\n users = signal<User[]>([]);\n groups = signal<UserOrGroup[]>([]);\n photos = signal<PhotoItem[]>([]);\n\n //#region ControlValueAccessor stuff\n // https://stackoverflow.com/questions/50618050/how-to-create-custom-input-component-with-ngmodel-working-in-angular-6\n value: any; // string\n onChange: (_: any) => void = (_: any) => {}; // Invoked when the model has been changed\n onTouched: () => void = () => {}; // Invoked when the model has been touched\n //#endregion\n //#endregion\n\n //#region Properties\n /*get isEdge(): boolean {\n return window.navigator.userAgent.indexOf('Edge') > -1;\n }*/\n get class(): string {\n return this._userChooserData?.mode === UserChooserMode.Single\n ? ''\n : (this.accountNames?.length ?? 0) > 4\n ? 'grid five'\n : (this.accountNames?.length ?? 0) > 3\n ? 'grid four'\n : (this.accountNames?.length ?? 0) > 2\n ? 'grid three'\n : (this.accountNames?.length ?? 0) > 1\n ? 'grid two'\n : '';\n }\n //#endregion\n\n //#region Lifecycle\n ngOnInit(): void {\n this._userChooserData = {\n ...DefaultUserChooserData,\n ...this.userChooserData(),\n };\n\n // If users have been pre-selected in the config, store those in accountNames, which drives the UI of this component\n this.accountNames = this._userChooserData.preSelections?.accountNames;\n\n this.#getData();\n }\n //#endregion\n\n //#region Events\n selectUser(): void {\n if (!this.clickable()) {\n return;\n }\n\n const data: UserChooserData = {\n ...this._userChooserData,\n\n users: this.users(),\n photos: this.photos(),\n };\n\n this.#services.dialog\n .open(UserChooserComponent, {\n data: data,\n })\n .afterClosed()\n .subscribe(\n (selected: string | string[] | UserOrGroup | UserOrGroup[]) => {\n if (!selected) {\n return;\n }\n\n this.accountNames = Array.isArray(selected)\n ? selected.map((s) =>\n typeof s === 'string' ? s : s.sAMAccountName,\n )\n : [selected].map((s) =>\n typeof s === 'string' ? s : s.sAMAccountName,\n );\n\n // Overwrite what may have been passed in, for subsequent launches of UserChooserComponent - otherwise it just keeps getting fed stale data\n if (this._userChooserData.preSelections) {\n this._userChooserData.preSelections.accountNames =\n this.accountNames;\n }\n\n this.usersSelected.emit(selected);\n },\n );\n }\n\n unSelectUser(accountName: string): void {\n const index = this.accountNames?.findIndex((a) => a === accountName);\n this.accountNames?.splice(index ?? -1, 1);\n\n if (this._userChooserData.preSelections) {\n this._userChooserData.preSelections.accountNames = this.accountNames;\n }\n\n this.userUnSelected.emit(accountName);\n }\n //#endregion\n\n //#region Utilities\n #getData(): void {\n forkJoin([\n this._userChooserData!.users\n ? // Users were passed in\n of(this._userChooserData!.users)\n : // Users need to be retrieved\n this.#services.activeDirectory.getUsers(\n this._userChooserData.appName ?? 'ngxlibADUserFormField',\n this._userChooserData!.includeDisabledUsers,\n this._userChooserData!.parentOu,\n ),\n\n this._userChooserData!.groups\n ? // Groups were passed in\n of(this._userChooserData!.groups)\n : // Groups need to be retrieved\n this.#services.activeDirectory.getGroups(\n this._userChooserData!.parentOu,\n ),\n\n this._userChooserData!.photos\n ? // Photos were passed in\n of(this._userChooserData!.photos)\n : // Photos need to be retrieved\n this.#services.sharePoint.getPhotos(),\n ]).subscribe(([users, groups, photos]) => {\n this.users.set(users);\n this.groups.set(groups);\n this.photos.set(photos);\n });\n }\n\n getUser(user: string | User | undefined): User | undefined {\n user =\n typeof user === 'string'\n ? this.users()?.find(\n (u) =>\n u.sAMAccountName.toLowerCase() === user?.toString().toLowerCase(),\n )\n : user;\n\n return !user ? undefined : 'groupType' in user ? undefined : user;\n }\n\n getGroup(group: string | UserOrGroup | undefined): UserOrGroup | undefined {\n group =\n typeof group === 'string'\n ? this.groups()?.find(\n (g) =>\n g.sAMAccountName.toLowerCase() ===\n group?.toString().toLowerCase(),\n )\n : group;\n\n return !group ? undefined : 'groupType' in group ? group : undefined;\n }\n\n getPhoto(accountName: string): string | undefined {\n const user = this.getUser(accountName);\n if (!user) {\n return undefined;\n }\n\n return this.photos()?.find(\n (p) =>\n (p.employeeNumber &&\n p.employeeNumber.toString() === user.employeeNumber) ||\n p.accountName?.toLowerCase() === user.sAMAccountName.toLowerCase() ||\n p.displayName?.toLowerCase() ===\n (user.displayName ?? user.name).toLowerCase() ||\n p.title?.toLowerCase() ===\n (user.displayName ?? user.name).toLowerCase(),\n )?.encodedAbsUrl;\n }\n //#endregion\n\n //#region ControlValueAccessor methods\n // Method that is invoked on an update of a model.\n updateChanges() {\n this.onChange(this.value);\n }\n\n //#region ControlValueAccessor Overrides\n\n // Writes a new item to the element.\n writeValue(value: any): void {\n this.value = value;\n this.updateChanges();\n }\n\n // Registers a callback function that should be called when the control's value changes in the UI.\n registerOnChange(fn: any): void {\n this.onChange = fn;\n }\n\n // Registers a callback function that should be called when the control receives a blur event.\n registerOnTouched(fn: any): void {\n this.onTouched = fn;\n }\n\n //#endregion\n\n //#endregion\n}\n","\r\n<!-- In Microsoft Edge, selectUser() never gets called if the input fields are disabled\r\nSo... I'm dynamically setting the disabled property based on whether or not the browser is Edge.\r\nIt's definitely a better experience if the field IS disabled.\r\nOtherwise, it's confusing - especially because Edge is SO SLOW to display the resulting dialog window.\r\n-->\r\n<!-- Update 8/24/2023:\r\nThe above problem also exists in Chrome now.\r\nSo instead of dynamically setting [disabled] based on browser type,\r\nI'm applying CSS to suppress mouse events on the input - thus making it bubble up to the parent control, which responds the way we want/\r\n-->\r\n\r\n@if (users().length && photos().length) {\r\n <div (click)=\"selectUser()\" [class.clickable]=\"clickable()\">\r\n @if (accountNames?.length) {\r\n <div [ngClass]=\"class\">\r\n @for (accountName of accountNames; track accountName; let i = $index) {\r\n <div class=\"user\">\r\n <!--<img *ngIf=\"accountName && empUtils.getEmployee(accountName)\" alt=\"\" [src]=\"empUtils.getEmployee(accountName) | employeePhotoUrl:cacheService.photos\">-->\r\n @if (getPhoto(accountName)) {\r\n <img matListItemAvatar alt=\"\" [src]=\"getPhoto(accountName)\">\r\n }\r\n @if (getGroup(accountName)) {\r\n <mat-icon>group</mat-icon>\r\n }\r\n <mat-form-field>\r\n <!-- [disabled]=\"!isEdge\" -->\r\n <input matInput disabled [placeholder]=\"i === 0 ? placeholder() : ''\"\r\n [value]=\"getUser(accountName)?.displayName ?? getGroup(accountName)?.displayName ?? accountName\">\r\n <button matSuffix mat-icon-button aria-label=\"Clear\" (click)=\"$event.stopPropagation(); unSelectUser(accountName)\">\r\n <mat-icon fontIcon=\"close\"/>\r\n </button>\r\n </mat-form-field>\r\n </div>\r\n }\r\n </div>\r\n } @else {\r\n <mat-form-field>\r\n <input matInput disabled [placeholder]=\"placeholder()\"> <!-- [disabled]=\"!isEdge\" -->\r\n </mat-form-field>\r\n }\r\n </div>\r\n} @else {\r\n <mat-progress-bar mode=\"indeterminate\"/>\r\n}","import { CommonModule } from '@angular/common';\nimport { ModuleWithProviders, NgModule, Optional, SkipSelf } from '@angular/core';\nimport { ReactiveFormsModule } from '@angular/forms';\n\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatDialogModule } from '@angular/material/dialog';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatListModule } from '@angular/material/list';\nimport { MatProgressBarModule } from '@angular/material/progress-bar';\nimport { MatProgressSpinnerModule } from '@angular/material/progress-spinner';\nimport { MatSlideToggleModule } from '@angular/material/slide-toggle';\nimport { MatTableModule } from '@angular/material/table';\nimport { MatTooltipModule } from '@angular/material/tooltip';\n\nimport { ActiveDirectoryServiceOptions, ActiveDirectoryServiceOptionsToken } from '@cleavelandprice/ngx-lib/active-directory';\n\nimport { UserChooserComponent } from './components/user-chooser/user-chooser.component';\nimport { UserFormFieldComponent } from './components/user-form-field/user-form-field.component';\n\n@NgModule({\n declarations: [],\n imports: [\n CommonModule,\n ReactiveFormsModule,\n\n MatButtonModule,\n MatDialogModule,\n MatFormFieldModule,\n MatIconModule,\n MatInputModule,\n MatListModule,\n MatProgressBarModule,\n MatProgressSpinnerModule,\n MatSlideToggleModule,\n MatTableModule,\n MatTooltipModule,\n\n UserChooserComponent,\n UserFormFieldComponent\n ],\n exports: [\n UserChooserComponent,\n UserFormFieldComponent\n ]\n})\nexport class MatActiveDirectoryModule {\n static forRoot(config: ActiveDirectoryServiceOptions): ModuleWithProviders<MatActiveDirectoryModule> {\n return {\n ngModule: MatActiveDirectoryModule,\n providers: [\n {\n provide: ActiveDirectoryServiceOptionsToken,\n useValue: config\n }\n ]\n };\n }\n\n constructor(@Optional() @SkipSelf() parentModule: MatActiveDirectoryModule) {\n if (parentModule) {\n throw new Error(\n 'MatActiveDirectoryModule is already loaded. Import it in the AppModule only');\n }\n }\n}","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './mat-active-directory.api';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"cleavelandprice-ngx-lib-active-directory-material.mjs","sources":["../../../../projects/cleavelandprice/ngx-lib/active-directory/material/src/model/default-user-chooser-filter-options.ts","../../../../projects/cleavelandprice/ngx-lib/active-directory/material/src/model/user-chooser-mode.ts","../../../../projects/cleavelandprice/ngx-lib/active-directory/material/src/model/default-user-chooser-data.ts","../../../../projects/cleavelandprice/ngx-lib/active-directory/material/src/model/user-chooser-filter-options.ts","../../../../projects/cleavelandprice/ngx-lib/active-directory/material/src/model/user-chooser-pre-processing-group.ts","../../../../projects/cleavelandprice/ngx-lib/active-directory/material/src/components/user-chooser/user-chooser.component.ts","../../../../projects/cleavelandprice/ngx-lib/active-directory/material/src/components/user-chooser/user-chooser.component.html","../../../../projects/cleavelandprice/ngx-lib/active-directory/material/src/components/user-form-field/user-form-field.component.ts","../../../../projects/cleavelandprice/ngx-lib/active-directory/material/src/components/user-form-field/user-form-field.component.html","../../../../projects/cleavelandprice/ngx-lib/active-directory/material/src/mat-active-directory.module.ts","../../../../projects/cleavelandprice/ngx-lib/active-directory/material/src/cleavelandprice-ngx-lib-active-directory-material.ts"],"sourcesContent":["import { UserChooserFilterOptions } from \"./user-chooser-filter-options\";\r\n\r\nexport const DefaultUserChooserFilterOptions: UserChooserFilterOptions = {\r\n accountName: true,\r\n department: true,\r\n groupMembership: false,\r\n phoneNumber: true,\r\n title: true\r\n};","export enum UserChooserMode {\r\n Single,\r\n Multiple\r\n}","import { DefaultUserChooserFilterOptions } from \"./default-user-chooser-filter-options\";\r\nimport { UserChooserData } from \"./user-chooser-data\";\r\nimport { UserChooserMode } from \"./user-chooser-mode\";\r\n\r\nexport const DefaultUserChooserData: UserChooserData = {\r\n closeWhenSelectionMade: false,\r\n allowCloseWithoutSelections: false,\r\n includeDisabledUsers: false,\r\n returnUserObjects: false,\r\n showGroupMembershipTooltips: false,\r\n showPhone: true,\r\n title: 'Select User(s)',\r\n mode: UserChooserMode.Single,\r\n objectTypes: '*',\r\n filterOptions: DefaultUserChooserFilterOptions\r\n};","export interface UserChooserFilterOptions {\r\n accountName?: boolean;\r\n department?: boolean;\r\n groupMembership?: boolean;\r\n phoneNumber?: boolean;\r\n title?: boolean;\r\n};","export interface UserChooserPreProcessingGroup {\r\n accountNames?: string[];\r\n departments?: string[];\r\n groups?: string[];\r\n titles?: string[];\r\n};","import { Component, ElementRef, inject, OnInit, viewChild, ChangeDetectionStrategy, afterRenderEffect, signal, WritableSignal, effect } from '@angular/core';\nimport { apply, debounce, form, PathKind, required, schema, SchemaPathTree, FormField } from '@angular/forms/signals';\n\nimport { MAT_DIALOG_DATA, MatDialogModule, MatDialogRef } from '@angular/material/dialog';\nimport { MatListItemAvatar, MatListOption, MatSelectionList } from '@angular/material/list';\nimport { MatTableDataSource } from '@angular/material/table';\nimport { MatButton, MatIconButton } from '@angular/material/button';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatIcon } from '@angular/material/icon';\nimport { MatInput } from '@angular/material/input';\nimport { MatProgressSpinner } from '@angular/material/progress-spinner';\nimport { MatSlideToggle } from '@angular/material/slide-toggle';\nimport { MatTooltip } from '@angular/material/tooltip';\n\nimport { forkJoin, Observable, of } from 'rxjs';\n\nimport { ActiveDirectoryService } from '@cleavelandprice/ngx-lib/active-directory';\nimport { PhotoItem, SharePointService, } from '@cleavelandprice/ngx-lib/sharepoint';\n\nimport { DefaultUserChooserData } from '../../model/default-user-chooser-data';\nimport { SelectableGroup } from '../../model/selectable-group';\nimport { SelectableUser } from '../../model/selectable-user';\nimport { UserChooserData } from '../../model/user-chooser-data';\nimport { UserChooserMode } from '../../model/user-chooser-mode';\n\n@Component({\n templateUrl: './user-chooser.component.html',\n imports: [\n FormField,\n MatButton,\n MatDialogModule,\n MatFormFieldModule,\n MatIcon,\n MatIconButton,\n MatInput,\n MatListItemAvatar,\n MatListOption,\n MatProgressSpinner,\n MatSelectionList,\n MatSlideToggle,\n MatTooltip\n ],\n standalone: true,\n changeDetection: ChangeDetectionStrategy.Eager,\n styleUrls: [\n './user-chooser.component.scss',\n '../../../../../styles/mat-icon.scss',\n ],\n})\nexport class UserChooserComponent implements OnInit {\n #services = {\n dialogRef: inject(MatDialogRef<UserChooserComponent>),\n activeDirectory: inject(ActiveDirectoryService),\n sharePoint: inject(SharePointService),\n data: inject<UserChooserData>(MAT_DIALOG_DATA),\n };\n _data = { ...DefaultUserChooserData, ...this.#services.data };\n\n //#region Fields\n selectionList = viewChild(MatSelectionList);\n filterInput = viewChild<ElementRef<HTMLInputElement>>('filterInput');\n \n filterFormModel = signal<IFilterFormModel>({filter: ''});\n #filterFormSchema = schema((schemaPath: SchemaPathTree<IFilterFormModel, PathKind.Root>) => {\n required(schemaPath.filter);\n debounce(schemaPath.filter, 500);\n });\n filterForm = form(this.filterFormModel, (path) => apply(path, this.#filterFormSchema));\n\n dataSource: WritableSignal<MatTableDataSource<SelectableUser | SelectableGroup> | undefined> = signal(undefined);\n photos = signal<PhotoItem[]>([]);\n groups = signal<SelectableGroup[]>([]); // May or may not get populated, depending on config data sent in\n //#endregion\n\n //#region Properties\n get isMultiMode(): boolean {\n return this._data.mode === UserChooserMode.Multiple;\n }\n\n selectedUsersOrGroups = signal<(SelectableUser | SelectableGroup)[]>([]);\n\n get adGroupsNeeded(): boolean {\n // If any are these are true, then we need to pull AD groups for use later\n return (\n (this._data.showGroupMembershipTooltips ?? false) ||\n (this._data.exclusions?.groups?.length ?? 0) > 0 ||\n (this._data.inclusions?.groups?.length ?? 0) > 0 ||\n (this._data.preSelections?.groups?.length ?? 0) > 0 ||\n this._data.filterOptions?.groupMembership ||\n (this._data.selectableGroupNames?.length ?? 0) > 0 ||\n (this._data.groups?.length ?? 0) > 0\n );\n }\n //#endregion\n\n //#region Lifecycle\n constructor() {\n afterRenderEffect(() => {\n this.filterInput()?.nativeElement.focus();\n });\n\n effect(() => {\n if (this.dataSource()) {\n this.dataSource()!.filter = this.filterForm().value().filter.toLowerCase();\n }\n });\n }\n \n ngOnInit(): void {\n this.#getData();\n }\n //#endregion\n\n //#region Events\n closeIfSingleSelection(/* event: MatSelectionListChange */): void {\n if (this._data.mode === UserChooserMode.Single &&\n this.selectedUsersOrGroups().length &&\n this._data.closeWhenSelectionMade) {\n this.close();\n }\n }\n\n optionSelectionChanged(option: MatListOption): void {\n const userOrGroup = this.dataSource()?.data.find(\n (u) =>\n u.sAMAccountName.toLocaleLowerCase() ===\n (option.value as SelectableUser).sAMAccountName.toLowerCase(),\n );\n\n if (userOrGroup) {\n // If we are in single user selection mode, deselect any existing selections first\n if (!this.isMultiMode && option.selected) {\n this.dataSource()?.data\n .filter(\n (u) =>\n u.sAMAccountName.toLowerCase() !==\n (option.value as SelectableUser).sAMAccountName.toLowerCase(),\n )\n .forEach((u) => (u.selected = false));\n }\n\n userOrGroup.selected = option.selected;\n }\n\n this.selectedUsersOrGroups.set(this.dataSource()?.data.filter(u => u.selected) ?? []);\n }\n\n hideUnselectedChanged(selected: boolean): void {\n this.filterForm().value.set({filter: selected ? '{selected:true}' : ''});\n }\n\n selectAll(): void {\n this.selectionList()?.selectAll();\n\n /*if (this.selectionList()?.options) {\n this.closeIfSingleSelection();\n }*/\n }\n\n deselectAll(): void {\n this.selectionList()?.deselectAll();\n }\n //#endregion\n\n //#region Utilities\n isUser(userOrGroup: SelectableUser | SelectableGroup): boolean {\n return 'title' in userOrGroup;\n }\n castUser(userOrGroup: SelectableUser | SelectableGroup): SelectableUser {\n return userOrGroup as SelectableUser;\n }\n\n #getData(): void {\n const observables$: Observable<any>[] = [\n this._data.users?.length\n ? // Users were passed in\n of(this._data.users)\n : // Users need to be retrieved\n this.#services.activeDirectory.getUsers(\n this._data.appName ?? 'ngxlibADUserChooser',\n this._data.includeDisabledUsers,\n this._data.parentOu,\n ),\n\n this._data.photos?.length\n ? // Photos were passed in\n of(this._data.photos)\n : // Photos need to be retrieved\n this.#services.sharePoint.getPhotos(),\n ];\n\n // Do we need AD groups?\n if (this.adGroupsNeeded) {\n observables$.push(\n this._data.groups?.length\n ? // Groups were passed in\n of(this._data.groups)\n : // Groups need to be retrieved\n this.#services.activeDirectory.getGroups(),\n );\n }\n\n forkJoin(observables$)\n //.subscribe(([users, photos]) => {\n .subscribe((data) => {\n // Need groups in place before we handle exclusions/inclusions/pre-selections\n this.groups.set(this.adGroupsNeeded ? data[2] : []);\n\n let users = data[0] as SelectableUser[];\n users.forEach((u) => (u.selected = false)); // In case existing data was re-used\n users = this.#includeUsersByAccountName(users);\n users = this.#includeUsersByGroupName(users);\n users = this.#includeUsersByDepartment(users);\n users = this.#includeUsersByTitle(users);\n\n users = this.#excludeUsersByAccountName(users);\n users = this.#excludeUsersByGroupName(users);\n users = this.#excludeUsersByDepartment(users);\n users = this.#excludeUsersByTitle(users);\n\n users = this.#preSelectUsersByAccountName(users);\n users = this.#preSelectUsersByGroupName(users);\n users = this.#preSelectUsersByDepartment(users);\n users = this.#preSelectUsersByTitle(users);\n\n this.#preSelectGroupsByAccountName();\n\n const usersAndGroups: (SelectableUser | SelectableGroup)[] = [];\n\n // Should we allow users to be selected?\n if (['users', '*'].includes(this._data.objectTypes!)) {\n usersAndGroups.push(...users);\n }\n\n // Should we allow groups to be selected\n\n if (['groups', '*'].includes(this._data.objectTypes!)) {\n if (this._data.selectableGroupNames?.length) {\n if (this._data.selectableGroupNames.includes('*')) {\n usersAndGroups.push(...this.groups());\n } else {\n this._data.selectableGroupNames.forEach((groupName) => {\n const group = this.groups().find(\n (g) => g.displayName === groupName,\n );\n\n if (group) {\n usersAndGroups.push({\n ...group,\n selected: group.selected,\n });\n }\n });\n }\n }\n }\n\n this.dataSource.set(new MatTableDataSource(usersAndGroups));\n\n this.photos.set(data[1]);\n\n this.#setFilterPredicate();\n });\n }\n\n close(): void {\n if (!this.selectedUsersOrGroups().length) {\n this.#services.dialogRef.close(\n this._data.allowCloseWithoutSelections ? [] : undefined,\n );\n return;\n }\n const value = this.selectedUsersOrGroups().map((u) =>\n this._data.returnUserObjects ? u : u.sAMAccountName,\n );\n\n this.#services.dialogRef.close(\n this._data.mode === UserChooserMode.Multiple ? value : value[0],\n );\n }\n\n getPhoto(user: SelectableUser | SelectableGroup): string | undefined {\n if (!this.isUser(user)) {\n return;\n }\n\n return this.photos().find(\n (p) =>\n (p.employeeNumber &&\n p.employeeNumber.toString() ===\n (user as SelectableUser).employeeNumber) ||\n p.accountName?.toLowerCase() === user.sAMAccountName.toLowerCase() ||\n p.displayName?.toLowerCase() ===\n (user.displayName ?? user.name).toLowerCase() ||\n p.title?.toLowerCase() ===\n (user.displayName ?? user.name).toLowerCase(),\n )?.encodedAbsUrl;\n }\n\n //#region Exclusions - won't be included in the dataSource at all\n #excludeUsersByAccountName(users: SelectableUser[]): SelectableUser[] {\n this._data.exclusions?.accountNames?.forEach((accountName) => {\n const index = users.findIndex(\n (u) => u.sAMAccountName.toLowerCase() === accountName.toLowerCase(),\n );\n if (index === -1) {\n return;\n }\n\n users.splice(index, 1);\n });\n\n return users;\n }\n\n #excludeUsersByGroupName(users: SelectableUser[]): SelectableUser[] {\n this._data.exclusions?.groups?.forEach((groupName) => {\n const group = this.groups().find(\n (g) => g.name.toLowerCase() === groupName.toLowerCase(),\n );\n if (!group) {\n return;\n }\n\n group.member.forEach((groupMemberDn) => {\n const index = users.findIndex(\n (u) => u.distinguishedName === groupMemberDn,\n );\n if (index === -1) {\n return;\n }\n\n users.splice(index, 1);\n });\n });\n\n return users;\n }\n\n #excludeUsersByDepartment(users: SelectableUser[]): SelectableUser[] {\n this._data.exclusions?.departments?.forEach((department) => {\n const excludedUsers = users.filter(\n (u) => u.department?.toLowerCase() === department.toLowerCase(),\n );\n\n excludedUsers.forEach((user) => {\n const index = users.indexOf(user);\n users.splice(index, 1);\n });\n });\n\n return users;\n }\n\n #excludeUsersByTitle(users: SelectableUser[]): SelectableUser[] {\n this._data.exclusions?.titles?.forEach((title) => {\n const excludedUsers = users.filter(\n (u) => u.title?.toLowerCase() === title.toLowerCase(),\n );\n\n excludedUsers.forEach((user) => {\n const index = users.indexOf(user);\n users.splice(index, 1);\n });\n });\n\n return users;\n }\n //#endregion\n\n //#region Inclusions - only these will be included in the dataSource\n #includeUsersByAccountName(users: SelectableUser[]): SelectableUser[] {\n return users.filter(\n (user) =>\n !this._data.inclusions?.accountNames?.length || // No account inclusions specified\n this._data.inclusions.accountNames.find(\n (accountName) =>\n accountName.toLowerCase() === user.sAMAccountName.toLowerCase(),\n ),\n );\n }\n\n #includeUsersByDepartment(users: SelectableUser[]): SelectableUser[] {\n return users.filter(\n (user) =>\n !this._data.inclusions?.departments?.length || // No department inclusions specified\n this._data.inclusions.departments.find(\n (department) =>\n department.toLowerCase() === user.department?.toLowerCase(),\n ),\n );\n }\n\n #includeUsersByTitle(users: SelectableUser[]): SelectableUser[] {\n return users.filter(\n (user) =>\n !this._data.inclusions?.titles?.length || // No title inclusions specified\n this._data.inclusions.titles.find(\n (title) => title.toLowerCase() === user.title?.toLowerCase(),\n ),\n );\n }\n\n #includeUsersByGroupName(users: SelectableUser[]): SelectableUser[] {\n if (!this._data.inclusions?.groups?.length) {\n return users; // No group inclusions specified\n }\n\n // Cheating a bit and leveraging the 'selected' property to keep track of who should be included\n // Since inclusions happen befor pre-selections, we can do that, as long as we set 'selected' back to false when we're done\n this._data.inclusions.groups.forEach((groupName) => {\n const group = this.groups().find(\n (g) => g.name.toLowerCase() === groupName.toLowerCase(),\n );\n if (!group) {\n return;\n }\n\n users\n .filter((user) =>\n group.member.find(\n (groupMemberDn) => groupMemberDn === user.distinguishedName,\n ),\n )\n .forEach((user) => (user.selected = true));\n });\n\n // At this point, all of the appropriate users should have 'selected' set to true\n const selectedUsers = users.filter((user) => user.selected); // Subset of the original list\n // Reset 'selected' to false, and return\n selectedUsers.forEach((user) => (user.selected = false));\n return selectedUsers;\n }\n //#endregion\n\n //#region Pre-Selections\n #preSelectUsersByAccountName(users: SelectableUser[]): SelectableUser[] {\n this._data.preSelections?.accountNames?.forEach((accountName) => {\n const user = users.find(\n (u) => u.sAMAccountName.toLowerCase() === accountName.toLowerCase(),\n );\n if (!user) {\n return;\n }\n\n user.selected = true;\n });\n\n return users;\n }\n\n #preSelectGroupsByAccountName(): void {\n this._data.preSelections?.accountNames?.forEach((accountName) => {\n const group = this.groups().find(\n (g) => g.sAMAccountName.toLowerCase() === accountName.toLowerCase(),\n );\n if (!group) {\n return;\n }\n\n group.selected = true;\n });\n }\n\n #preSelectUsersByDepartment(users: SelectableUser[]): SelectableUser[] {\n this._data.preSelections?.departments?.forEach((department) =>\n users\n .filter((u) => u.department?.toLowerCase() === department.toLowerCase())\n .forEach((user) => (user.selected = true)),\n );\n\n return users;\n }\n\n #preSelectUsersByTitle(users: SelectableUser[]): SelectableUser[] {\n this._data.preSelections?.titles?.forEach((title) =>\n users\n .filter((u) => u.title?.toLowerCase() === title.toLowerCase())\n .forEach((user) => (user.selected = true)),\n );\n\n return users;\n }\n\n #preSelectUsersByGroupName(users: SelectableUser[]): SelectableUser[] {\n this._data.preSelections?.groups?.forEach((groupName) => {\n const group = this.groups().find(\n (g) => g.name.toLowerCase() === groupName.toLowerCase(),\n );\n if (!group) {\n return;\n }\n\n group.member.forEach((groupMemberDn) => {\n const user = users.find((u) => u.distinguishedName === groupMemberDn);\n if (!user) {\n return;\n }\n\n user.selected = true;\n });\n });\n\n return users;\n }\n //#endregion\n\n #setFilterPredicate(): void {\n if (!this.dataSource()) {\n return;\n }\n\n this.dataSource()!.filterPredicate = (\n user: SelectableUser | SelectableGroup,\n filter: string,\n ) => {\n if (filter === '{selected:true}') {\n return user.selected;\n } else {\n const regex = new RegExp(filter, 'i'); // Case-insensitive\n let match = false; // The end result - whether or not a employee matches the filter\n\n const filterProperties = ['displayName'];\n if (this._data.filterOptions?.accountName) {\n filterProperties.push('sAMAccountName');\n }\n if (this._data.filterOptions?.title) {\n filterProperties.push('title');\n }\n if (this._data.filterOptions?.department) {\n filterProperties.push('department');\n }\n if (this._data.filterOptions?.phoneNumber) {\n filterProperties.push('telephoneNumber');\n }\n\n // Match on the properties configured above\n filterProperties.forEach((field) => {\n // @ts-ignore\n if (user[field] && user[field].match(regex)) {\n match = true;\n }\n });\n\n // Match on group membership (group name)\n if (this._data.filterOptions?.groupMembership) {\n user.memberOf.forEach((groupDn) => {\n const group = this.groups().find(\n (group) =>\n group.distinguishedName === groupDn && group.name.match(regex),\n );\n\n if (group) {\n match = true;\n }\n });\n }\n\n return match;\n }\n };\n }\n\n tooltip(user: SelectableUser | SelectableGroup): string {\n return this._data.showGroupMembershipTooltips\n ? user.memberOf\n .map(\n (groupDn) =>\n this.groups().find((group) => group.distinguishedName === groupDn)\n ?.name,\n )\n .sort((a, b) => (a! > b! ? 1 : -1))\n .join('\\n')\n : '';\n }\n //#endregion\n}\n\ninterface IFilterFormModel {\n filter: string;\n}\n","<div mat-dialog-title>\r\n <div id=\"dialog-title\">\r\n <h2>{{ _data.title }}</h2>\r\n \r\n <div id=\"num-selected\">\r\n {{ selectedUsersOrGroups().length }} selected\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<mat-dialog-content>\r\n @if (dataSource() && photos().length) {\r\n <form>\r\n @if (dataSource()) {\r\n <mat-form-field>\r\n <input matInput placeholder=\"Search\" [formField]=\"filterForm.filter\" #filterInput>\r\n @if (filterForm().value().filter) {\r\n <button type=\"button\" matSuffix mat-icon-button aria-label=\"Clear\" (click)=\"filterFormModel.set({filter: ''})\">\r\n <mat-icon fontIcon=\"close\"/>\r\n </button>\r\n }\r\n </mat-form-field>\r\n }\r\n </form>\r\n\r\n <mat-selection-list [multiple]=\"isMultiMode\" (selectionChange)=\"closeIfSingleSelection()\">\r\n @for (user of dataSource()!.filteredData; track user) {\r\n <mat-list-option [value]=\"user\" [selected]=\"user.selected\"\r\n (selectedChange)=\"optionSelectionChanged(option)\" #option>\r\n @if (getPhoto(user)) {\r\n <img matListItemAvatar alt=\"\" [src]=\"getPhoto(user)\">\r\n } @else {\r\n <mat-icon matListItemAvatar class=\"no-photo\"\r\n [fontIcon]=\"isUser(user) ? 'account_circle' : 'group'\"/>\r\n }\r\n <div class=\"user\">\r\n <div [matTooltip]=\"tooltip(user)\" class=\"user-name\">\r\n {{ user.displayName ?? user.name }}\r\n @if (isUser(user) && _data.showPhone && castUser(user).telephoneNumber) {\r\n <div>{{ castUser(user).telephoneNumber }}</div>\r\n }\r\n </div>\r\n @if (isUser(user)) {\r\n <div>{{ castUser(user).department }}</div>\r\n <div class=\"title\">{{ castUser(user).title }}</div>\r\n }\r\n </div>\r\n </mat-list-option>\r\n }\r\n </mat-selection-list>\r\n } @else {\r\n <div>\r\n <mat-spinner [diameter]=\"50\"/>\r\n <h2 id=\"spinner-message\">Getting users and photos...</h2>\r\n </div>\r\n }\r\n</mat-dialog-content>\r\n\r\n<mat-dialog-actions>\r\n @if (dataSource() && photos().length) {\r\n @if (selectedUsersOrGroups().length) {\r\n <mat-slide-toggle (change)=\"hideUnselectedChanged($event.checked)\">\r\n Hide Unselected\r\n </mat-slide-toggle>\r\n }\r\n @if (isMultiMode) {\r\n <button mat-raised-button color=\"primary\" (click)=\"selectAll()\"\r\n >\r\n <mat-icon fontIcon=\"select_all\"/>\r\n <span class=\"hide-mobile\">Select All</span>\r\n </button>\r\n }\r\n @if (isMultiMode && selectedUsersOrGroups().length) {\r\n <button mat-raised-button color=\"primary\" (click)=\"deselectAll()\"\r\n >\r\n <mat-icon fontIcon=\"clear_all\"/>\r\n <span class=\"hide-mobile\">Clear All</span>\r\n </button>\r\n }\r\n @if (isMultiMode || !_data.closeWhenSelectionMade) {\r\n <button mat-raised-button color=\"primary\" (click)=\"close()\" matTooltip=\"Accept your selection\"\r\n [disabled]=\"!_data.allowCloseWithoutSelections && !selectedUsersOrGroups().length\">\r\n <mat-icon fontIcon=\"check\"/>\r\n <span class=\"hide-mobile\">Ok</span>\r\n </button>\r\n }\r\n }\r\n\r\n <button mat-raised-button color=\"warn\" mat-dialog-close matTooltip=\"Close this window\">\r\n <mat-icon fontIcon=\"close\"/>\r\n <span class=\"hide-mobile\">Cancel</span>\r\n </button>\r\n</mat-dialog-actions>","import {\n Component,\n forwardRef,\n inject,\n input,\n OnInit,\n output,\n ChangeDetectionStrategy,\n signal,\n} from '@angular/core';\nimport { MatDialog } from '@angular/material/dialog';\nimport { forkJoin, of } from 'rxjs';\n\nimport {\n ActiveDirectoryService,\n User,\n UserOrGroup,\n} from '@cleavelandprice/ngx-lib/active-directory';\nimport {\n PhotoItem,\n SharePointService,\n} from '@cleavelandprice/ngx-lib/sharepoint';\n\nimport { DefaultUserChooserData } from '../../model/default-user-chooser-data';\nimport { UserChooserData } from '../../model/user-chooser-data';\n\nimport { NgClass } from '@angular/common';\nimport { MatIconButton } from '@angular/material/button';\nimport { MatFormField, MatSuffix } from '@angular/material/form-field';\nimport { MatIcon } from '@angular/material/icon';\nimport { MatInput } from '@angular/material/input';\nimport { MatProgressBar } from '@angular/material/progress-bar';\nimport { UserChooserMode } from '../../mat-active-directory.api';\nimport { UserChooserComponent } from '../user-chooser/user-chooser.component';\nimport { NG_VALUE_ACCESSOR } from '@angular/forms';\n\n@Component({\n selector: 'cp-user-field',\n imports: [\n MatFormField,\n MatIcon,\n MatIconButton,\n MatInput,\n MatProgressBar,\n MatSuffix,\n NgClass,\n ],\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => UserFormFieldComponent),\n multi: true,\n },\n ],\n standalone: true,\n templateUrl: './user-form-field.component.html',\n changeDetection: ChangeDetectionStrategy.Eager,\n styleUrl: './user-form-field.component.scss',\n})\nexport class UserFormFieldComponent implements OnInit {\n //#region Fields\n #services = {\n dialog: inject(MatDialog),\n activeDirectory: inject(ActiveDirectoryService),\n sharePoint: inject(SharePointService),\n };\n usersSelected = output<string | string[] | UserOrGroup | UserOrGroup[]>(); // string for Single mode, string[] for multi\n userUnSelected = output<string>();\n placeholder = input('Select User(s)');\n clickable = input(true);\n userChooserData = input.required<UserChooserData>();\n _userChooserData!: UserChooserData;\n\n accountNames = signal<string[]>([]);\n\n users = signal<User[]>([]);\n groups = signal<UserOrGroup[]>([]);\n photos = signal<PhotoItem[]>([]);\n\n //#region ControlValueAccessor stuff\n // https://stackoverflow.com/questions/50618050/how-to-create-custom-input-component-with-ngmodel-working-in-angular-6\n value: any; // string\n onChange: (_: any) => void = (_: any) => {}; // Invoked when the model has been changed\n onTouched: () => void = () => {}; // Invoked when the model has been touched\n //#endregion\n //#endregion\n\n //#region Properties\n /*get isEdge(): boolean {\n return window.navigator.userAgent.indexOf('Edge') > -1;\n }*/\n get class(): string {\n return this._userChooserData?.mode === UserChooserMode.Single\n ? ''\n : (this.accountNames().length) > 4\n ? 'grid five'\n : (this.accountNames().length) > 3\n ? 'grid four'\n : (this.accountNames().length) > 2\n ? 'grid three'\n : (this.accountNames().length) > 1\n ? 'grid two'\n : '';\n }\n //#endregion\n\n //#region Lifecycle\n ngOnInit(): void {\n this._userChooserData = {\n ...DefaultUserChooserData,\n ...this.userChooserData(),\n };\n\n // If users have been pre-selected in the config, store those in accountNames, which drives the UI of this component\n this.accountNames.set(this._userChooserData.preSelections?.accountNames ?? []);\n\n this.#getData();\n }\n //#endregion\n\n //#region Events\n selectUser(): void {\n if (!this.clickable()) {\n return;\n }\n\n const data: UserChooserData = {\n ...this._userChooserData,\n\n users: this.users(),\n photos: this.photos(),\n };\n\n this.#services.dialog\n .open(UserChooserComponent, {\n data: data,\n })\n .afterClosed()\n .subscribe(\n (selected: string | string[] | UserOrGroup | UserOrGroup[]) => {\n if (!selected) {\n return;\n }\n\n this.accountNames.set(Array.isArray(selected)\n ? selected.map((s) =>\n typeof s === 'string' ? s : s.sAMAccountName,\n )\n : [selected].map((s) =>\n typeof s === 'string' ? s : s.sAMAccountName,\n ));\n\n // Overwrite what may have been passed in, for subsequent launches of UserChooserComponent - otherwise it just keeps getting fed stale data\n if (this._userChooserData.preSelections) {\n this._userChooserData.preSelections.accountNames =\n this.accountNames();\n }\n\n this.usersSelected.emit(selected);\n },\n );\n }\n\n unSelectUser(accountName: string): void {\n const index = this.accountNames().findIndex((a) => a === accountName);\n this.accountNames().splice(index ?? -1, 1);\n\n if (this._userChooserData.preSelections) {\n this._userChooserData.preSelections.accountNames = this.accountNames();\n }\n\n this.userUnSelected.emit(accountName);\n }\n //#endregion\n\n //#region Utilities\n #getData(): void {\n forkJoin([\n this._userChooserData!.users\n ? // Users were passed in\n of(this._userChooserData!.users)\n : // Users need to be retrieved\n this.#services.activeDirectory.getUsers(\n this._userChooserData.appName ?? 'ngxlibADUserFormField',\n this._userChooserData!.includeDisabledUsers,\n this._userChooserData!.parentOu,\n ),\n\n this._userChooserData!.groups\n ? // Groups were passed in\n of(this._userChooserData!.groups)\n : // Groups need to be retrieved\n this.#services.activeDirectory.getGroups(\n this._userChooserData!.parentOu,\n ),\n\n this._userChooserData!.photos\n ? // Photos were passed in\n of(this._userChooserData!.photos)\n : // Photos need to be retrieved\n this.#services.sharePoint.getPhotos(),\n ]).subscribe(([users, groups, photos]) => {\n this.users.set(users);\n this.groups.set(groups);\n this.photos.set(photos);\n });\n }\n\n getUser(user: string | User | undefined): User | undefined {\n user =\n typeof user === 'string'\n ? this.users()?.find(\n (u) =>\n u.sAMAccountName.toLowerCase() === user?.toString().toLowerCase(),\n )\n : user;\n\n return !user ? undefined : 'groupType' in user ? undefined : user;\n }\n\n getGroup(group: string | UserOrGroup | undefined): UserOrGroup | undefined {\n group =\n typeof group === 'string'\n ? this.groups()?.find(\n (g) =>\n g.sAMAccountName.toLowerCase() ===\n group?.toString().toLowerCase(),\n )\n : group;\n\n return !group ? undefined : 'groupType' in group ? group : undefined;\n }\n\n getPhoto(accountName: string): string | undefined {\n const user = this.getUser(accountName);\n if (!user) {\n return undefined;\n }\n\n return this.photos()?.find(\n (p) =>\n (p.employeeNumber &&\n p.employeeNumber.toString() === user.employeeNumber) ||\n p.accountName?.toLowerCase() === user.sAMAccountName.toLowerCase() ||\n p.displayName?.toLowerCase() ===\n (user.displayName ?? user.name).toLowerCase() ||\n p.title?.toLowerCase() ===\n (user.displayName ?? user.name).toLowerCase(),\n )?.encodedAbsUrl;\n }\n //#endregion\n\n //#region ControlValueAccessor methods\n // Method that is invoked on an update of a model.\n updateChanges() {\n this.onChange(this.value);\n }\n\n //#region ControlValueAccessor Overrides\n\n // Writes a new item to the element.\n writeValue(value: any): void {\n this.value = value;\n this.updateChanges();\n }\n\n // Registers a callback function that should be called when the control's value changes in the UI.\n registerOnChange(fn: any): void {\n this.onChange = fn;\n }\n\n // Registers a callback function that should be called when the control receives a blur event.\n registerOnTouched(fn: any): void {\n this.onTouched = fn;\n }\n\n //#endregion\n\n //#endregion\n}\n","\r\n<!-- In Microsoft Edge, selectUser() never gets called if the input fields are disabled\r\nSo... I'm dynamically setting the disabled property based on whether or not the browser is Edge.\r\nIt's definitely a better experience if the field IS disabled.\r\nOtherwise, it's confusing - especially because Edge is SO SLOW to display the resulting dialog window.\r\n-->\r\n<!-- Update 8/24/2023:\r\nThe above problem also exists in Chrome now.\r\nSo instead of dynamically setting [disabled] based on browser type,\r\nI'm applying CSS to suppress mouse events on the input - thus making it bubble up to the parent control, which responds the way we want/\r\n-->\r\n\r\n@if (users().length && photos().length) {\r\n <div (click)=\"selectUser()\" [class.clickable]=\"clickable()\">\r\n @if (accountNames().length) {\r\n <div [ngClass]=\"class\">\r\n @for (accountName of accountNames(); track accountName; let i = $index) {\r\n <div class=\"user\">\r\n <!--<img *ngIf=\"accountName && empUtils.getEmployee(accountName)\" alt=\"\" [src]=\"empUtils.getEmployee(accountName) | employeePhotoUrl:cacheService.photos\">-->\r\n @if (getPhoto(accountName)) {\r\n <img matListItemAvatar alt=\"\" [src]=\"getPhoto(accountName)\">\r\n }\r\n @if (getGroup(accountName)) {\r\n <mat-icon>group</mat-icon>\r\n }\r\n <mat-form-field>\r\n <!-- [disabled]=\"!isEdge\" -->\r\n <input matInput disabled [placeholder]=\"i === 0 ? placeholder() : ''\"\r\n [value]=\"getUser(accountName)?.displayName ?? getGroup(accountName)?.displayName ?? accountName\">\r\n <button matSuffix mat-icon-button aria-label=\"Clear\" (click)=\"$event.stopPropagation(); unSelectUser(accountName)\">\r\n <mat-icon fontIcon=\"close\"/>\r\n </button>\r\n </mat-form-field>\r\n </div>\r\n }\r\n </div>\r\n } @else {\r\n <mat-form-field>\r\n <input matInput disabled [placeholder]=\"placeholder()\"> <!-- [disabled]=\"!isEdge\" -->\r\n </mat-form-field>\r\n }\r\n </div>\r\n} @else {\r\n <mat-progress-bar mode=\"indeterminate\"/>\r\n}","import { CommonModule } from '@angular/common';\nimport { ModuleWithProviders, NgModule, Optional, SkipSelf } from '@angular/core';\nimport { ReactiveFormsModule } from '@angular/forms';\n\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatDialogModule } from '@angular/material/dialog';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatListModule } from '@angular/material/list';\nimport { MatProgressBarModule } from '@angular/material/progress-bar';\nimport { MatProgressSpinnerModule } from '@angular/material/progress-spinner';\nimport { MatSlideToggleModule } from '@angular/material/slide-toggle';\nimport { MatTableModule } from '@angular/material/table';\nimport { MatTooltipModule } from '@angular/material/tooltip';\n\nimport { ActiveDirectoryServiceOptions, ActiveDirectoryServiceOptionsToken } from '@cleavelandprice/ngx-lib/active-directory';\n\nimport { UserChooserComponent } from './components/user-chooser/user-chooser.component';\nimport { UserFormFieldComponent } from './components/user-form-field/user-form-field.component';\n\n@NgModule({\n declarations: [],\n imports: [\n CommonModule,\n ReactiveFormsModule,\n\n MatButtonModule,\n MatDialogModule,\n MatFormFieldModule,\n MatIconModule,\n MatInputModule,\n MatListModule,\n MatProgressBarModule,\n MatProgressSpinnerModule,\n MatSlideToggleModule,\n MatTableModule,\n MatTooltipModule,\n\n UserChooserComponent,\n UserFormFieldComponent\n ],\n exports: [\n UserChooserComponent,\n UserFormFieldComponent\n ]\n})\nexport class MatActiveDirectoryModule {\n static forRoot(config: ActiveDirectoryServiceOptions): ModuleWithProviders<MatActiveDirectoryModule> {\n return {\n ngModule: MatActiveDirectoryModule,\n providers: [\n {\n provide: ActiveDirectoryServiceOptionsToken,\n useValue: config\n }\n ]\n };\n }\n\n constructor(@Optional() @SkipSelf() parentModule: MatActiveDirectoryModule) {\n if (parentModule) {\n throw new Error(\n 'MatActiveDirectoryModule is already loaded. Import it in the AppModule only');\n }\n }\n}","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './mat-active-directory.api';\n"],"names":[],"mappings":"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"}
|
|
@@ -246,7 +246,7 @@ class LoginFormComponent {
|
|
|
246
246
|
.some(u => u.toLowerCase() === username.toLowerCase());
|
|
247
247
|
}
|
|
248
248
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.1", ngImport: i0, type: LoginFormComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
249
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.1", type: LoginFormComponent, isStandalone: true, selector: "ng-component", viewQueries: [{ propertyName: "usernameInput", first: true, predicate: ["usernameInput"], descendants: true, isSignal: true }], ngImport: i0, template: "<h2 mat-dialog-title>\n @if (services.authentication.authenticating()) {\n <span>Authenticating...</span>\n } @else {\n <span>Login</span>\n }\n</h2>\n\n<mat-dialog-content>\n @if (services.authentication.authenticating() || gettingUsers()) {\n <div id=\"spinner\">\n <mat-progress-spinner color=\"primary\" mode=\"indeterminate\"/>\n </div>\n } @else if (error()) {\n <div id=\"error\">\n {{ error() }}\n </div>\n } @else {\n\n <form>\n <mat-form-field>\n <input #usernameInput matInput [formField]=\"form.username\" placeholder=\"Username\" (keyup.enter)=\"authenticate()\">\n\n @if (form.username().value() && form.username().errors().length) {\n @for (error of form.username().errors(); track $index) {\n <mat-error>{{ error.message }}</mat-error>\n }\n }\n\n @if (userLabel()) {\n <mat-hint [innerHTML]=\"userLabel()\" />\n }\n </mat-form-field>\n\n <mat-form-field>\n <input matInput [formField]=\"form.password\"\n [type]=\"showPassword() ? 'text' : 'password'\"\n placeholder=\"Password\" (keyup.enter)=\"authenticate()\">\n\n <mat-icon matSuffix \n [matTooltip]=\"showPassword() ? 'Hide password' : 'Show password'\"\n aria-label=\"Show password\"\n (pointerdown)=\"$event.preventDefault(); showPassword.set(true)\"\n (pointerup)=\"showPassword.set(false)\"\n (pointercancel)=\"showPassword.set(false)\"\n (pointerleave)=\"showPassword.set(false)\">\n {{ showPassword() ? 'visibility_off' : 'visibility' }}\n </mat-icon>\n </mat-form-field>\n\n @if (services.authentication.options.showRememberMeOption) {\n <mat-slide-toggle [checked]=\"!services.authentication.useSessionStorage\" (change)=\"changeTokenStorageMode($event.checked)\">\n Remember me next time\n </mat-slide-toggle>\n }\n </form>\n }\n</mat-dialog-content>\n\n@if (!services.authentication.authenticating()) {\n <mat-dialog-actions>\n <button mat-raised-button color=\"primary\" (click)=\"authenticate()\"\n [disabled]=\"form().invalid()\">\n <mat-icon fontIcon=\"done\"/>\n <span>OK</span>\n </button>\n \n <button mat-raised-button (click)=\"services.dialogRef.close()\">\n <mat-icon fontIcon=\"close\"/>\n <span>Cancel</span>\n </button>\n </mat-dialog-actions>\n}", styles: ["#spinner{width:100%;height:100%;display:flex;justify-content:center;align-items:center}form{display:grid;gap:1rem}mat-form-field{width:500px}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[matButton], a[matButton], button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button], a[mat-button], a[mat-raised-button], a[mat-flat-button], a[mat-stroked-button] ", inputs: ["matButton"], exportAs: ["matButton", "matAnchor"] }, { kind: "ngmodule", type: MatDialogModule }, { kind: "directive", type: i1.MatDialogTitle, selector: "[mat-dialog-title], [matDialogTitle]", inputs: ["id"], exportAs: ["matDialogTitle"] }, { kind: "directive", type: i1.MatDialogActions, selector: "[mat-dialog-actions], mat-dialog-actions, [matDialogActions]", inputs: ["align"] }, { kind: "directive", type: i1.MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i2.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i2.MatHint, selector: "mat-hint", inputs: ["align", "id"] }, { kind: "directive", type: i2.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "directive", type: i2.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i3.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", "disabledInteractive"], 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", "fullWidth", "disableRipple", "tabIndex", "checked", "hideIcon", "disabledInteractive"], outputs: ["change", "toggleChange"], exportAs: ["matSlideToggle"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i4.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "directive", type: FormField, selector: "[formField]", inputs: ["formField"], exportAs: ["formField"] }], changeDetection: i0.ChangeDetectionStrategy.Eager }); }
|
|
249
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.1", type: LoginFormComponent, isStandalone: true, selector: "ng-component", viewQueries: [{ propertyName: "usernameInput", first: true, predicate: ["usernameInput"], descendants: true, isSignal: true }], ngImport: i0, template: "<h2 mat-dialog-title>\n @if (services.authentication.authenticating()) {\n <span>Authenticating...</span>\n } @else {\n <span>Login</span>\n }\n</h2>\n\n<mat-dialog-content>\n @if (services.authentication.authenticating() || gettingUsers()) {\n <div id=\"spinner\">\n <mat-progress-spinner color=\"primary\" mode=\"indeterminate\"/>\n </div>\n } @else if (error()) {\n <div id=\"error\">\n {{ error() }}\n </div>\n } @else {\n\n <form>\n <mat-form-field>\n <input #usernameInput matInput [formField]=\"form.username\" placeholder=\"Username or Employee ID\" (keyup.enter)=\"authenticate()\">\n\n @if (form.username().value() && form.username().errors().length) {\n @for (error of form.username().errors(); track $index) {\n <mat-error>{{ error.message }}</mat-error>\n }\n }\n\n @if (userLabel()) {\n <mat-hint [innerHTML]=\"userLabel()\" />\n }\n </mat-form-field>\n\n <mat-form-field>\n <input matInput [formField]=\"form.password\"\n [type]=\"showPassword() ? 'text' : 'password'\"\n placeholder=\"Password\" (keyup.enter)=\"authenticate()\">\n\n <mat-icon matSuffix \n [matTooltip]=\"showPassword() ? 'Hide password' : 'Show password'\"\n aria-label=\"Show password\"\n (pointerdown)=\"$event.preventDefault(); showPassword.set(true)\"\n (pointerup)=\"showPassword.set(false)\"\n (pointercancel)=\"showPassword.set(false)\"\n (pointerleave)=\"showPassword.set(false)\">\n {{ showPassword() ? 'visibility_off' : 'visibility' }}\n </mat-icon>\n </mat-form-field>\n\n @if (services.authentication.options.showRememberMeOption) {\n <mat-slide-toggle [checked]=\"!services.authentication.useSessionStorage\" (change)=\"changeTokenStorageMode($event.checked)\">\n Remember me next time\n </mat-slide-toggle>\n }\n </form>\n }\n</mat-dialog-content>\n\n@if (!services.authentication.authenticating()) {\n <mat-dialog-actions>\n <button mat-raised-button color=\"primary\" (click)=\"authenticate()\"\n [disabled]=\"form().invalid()\">\n <mat-icon fontIcon=\"done\"/>\n <span>OK</span>\n </button>\n \n <button mat-raised-button (click)=\"services.dialogRef.close()\">\n <mat-icon fontIcon=\"close\"/>\n <span>Cancel</span>\n </button>\n </mat-dialog-actions>\n}", styles: ["#spinner{width:100%;height:100%;display:flex;justify-content:center;align-items:center}form{display:grid;gap:1rem}mat-form-field{width:500px}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[matButton], a[matButton], button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button], a[mat-button], a[mat-raised-button], a[mat-flat-button], a[mat-stroked-button] ", inputs: ["matButton"], exportAs: ["matButton", "matAnchor"] }, { kind: "ngmodule", type: MatDialogModule }, { kind: "directive", type: i1.MatDialogTitle, selector: "[mat-dialog-title], [matDialogTitle]", inputs: ["id"], exportAs: ["matDialogTitle"] }, { kind: "directive", type: i1.MatDialogActions, selector: "[mat-dialog-actions], mat-dialog-actions, [matDialogActions]", inputs: ["align"] }, { kind: "directive", type: i1.MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i2.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i2.MatHint, selector: "mat-hint", inputs: ["align", "id"] }, { kind: "directive", type: i2.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "directive", type: i2.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i3.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", "disabledInteractive"], 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", "fullWidth", "disableRipple", "tabIndex", "checked", "hideIcon", "disabledInteractive"], outputs: ["change", "toggleChange"], exportAs: ["matSlideToggle"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i4.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "directive", type: FormField, selector: "[formField]", inputs: ["formField"], exportAs: ["formField"] }], changeDetection: i0.ChangeDetectionStrategy.Eager }); }
|
|
250
250
|
}
|
|
251
251
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.1", ngImport: i0, type: LoginFormComponent, decorators: [{
|
|
252
252
|
type: Component,
|
|
@@ -260,7 +260,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.1", ngImpor
|
|
|
260
260
|
MatSlideToggle,
|
|
261
261
|
MatTooltipModule,
|
|
262
262
|
FormField
|
|
263
|
-
], standalone: true, changeDetection: ChangeDetectionStrategy.Eager, template: "<h2 mat-dialog-title>\n @if (services.authentication.authenticating()) {\n <span>Authenticating...</span>\n } @else {\n <span>Login</span>\n }\n</h2>\n\n<mat-dialog-content>\n @if (services.authentication.authenticating() || gettingUsers()) {\n <div id=\"spinner\">\n <mat-progress-spinner color=\"primary\" mode=\"indeterminate\"/>\n </div>\n } @else if (error()) {\n <div id=\"error\">\n {{ error() }}\n </div>\n } @else {\n\n <form>\n <mat-form-field>\n <input #usernameInput matInput [formField]=\"form.username\" placeholder=\"Username\" (keyup.enter)=\"authenticate()\">\n\n @if (form.username().value() && form.username().errors().length) {\n @for (error of form.username().errors(); track $index) {\n <mat-error>{{ error.message }}</mat-error>\n }\n }\n\n @if (userLabel()) {\n <mat-hint [innerHTML]=\"userLabel()\" />\n }\n </mat-form-field>\n\n <mat-form-field>\n <input matInput [formField]=\"form.password\"\n [type]=\"showPassword() ? 'text' : 'password'\"\n placeholder=\"Password\" (keyup.enter)=\"authenticate()\">\n\n <mat-icon matSuffix \n [matTooltip]=\"showPassword() ? 'Hide password' : 'Show password'\"\n aria-label=\"Show password\"\n (pointerdown)=\"$event.preventDefault(); showPassword.set(true)\"\n (pointerup)=\"showPassword.set(false)\"\n (pointercancel)=\"showPassword.set(false)\"\n (pointerleave)=\"showPassword.set(false)\">\n {{ showPassword() ? 'visibility_off' : 'visibility' }}\n </mat-icon>\n </mat-form-field>\n\n @if (services.authentication.options.showRememberMeOption) {\n <mat-slide-toggle [checked]=\"!services.authentication.useSessionStorage\" (change)=\"changeTokenStorageMode($event.checked)\">\n Remember me next time\n </mat-slide-toggle>\n }\n </form>\n }\n</mat-dialog-content>\n\n@if (!services.authentication.authenticating()) {\n <mat-dialog-actions>\n <button mat-raised-button color=\"primary\" (click)=\"authenticate()\"\n [disabled]=\"form().invalid()\">\n <mat-icon fontIcon=\"done\"/>\n <span>OK</span>\n </button>\n \n <button mat-raised-button (click)=\"services.dialogRef.close()\">\n <mat-icon fontIcon=\"close\"/>\n <span>Cancel</span>\n </button>\n </mat-dialog-actions>\n}", styles: ["#spinner{width:100%;height:100%;display:flex;justify-content:center;align-items:center}form{display:grid;gap:1rem}mat-form-field{width:500px}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"] }]
|
|
263
|
+
], standalone: true, changeDetection: ChangeDetectionStrategy.Eager, template: "<h2 mat-dialog-title>\n @if (services.authentication.authenticating()) {\n <span>Authenticating...</span>\n } @else {\n <span>Login</span>\n }\n</h2>\n\n<mat-dialog-content>\n @if (services.authentication.authenticating() || gettingUsers()) {\n <div id=\"spinner\">\n <mat-progress-spinner color=\"primary\" mode=\"indeterminate\"/>\n </div>\n } @else if (error()) {\n <div id=\"error\">\n {{ error() }}\n </div>\n } @else {\n\n <form>\n <mat-form-field>\n <input #usernameInput matInput [formField]=\"form.username\" placeholder=\"Username or Employee ID\" (keyup.enter)=\"authenticate()\">\n\n @if (form.username().value() && form.username().errors().length) {\n @for (error of form.username().errors(); track $index) {\n <mat-error>{{ error.message }}</mat-error>\n }\n }\n\n @if (userLabel()) {\n <mat-hint [innerHTML]=\"userLabel()\" />\n }\n </mat-form-field>\n\n <mat-form-field>\n <input matInput [formField]=\"form.password\"\n [type]=\"showPassword() ? 'text' : 'password'\"\n placeholder=\"Password\" (keyup.enter)=\"authenticate()\">\n\n <mat-icon matSuffix \n [matTooltip]=\"showPassword() ? 'Hide password' : 'Show password'\"\n aria-label=\"Show password\"\n (pointerdown)=\"$event.preventDefault(); showPassword.set(true)\"\n (pointerup)=\"showPassword.set(false)\"\n (pointercancel)=\"showPassword.set(false)\"\n (pointerleave)=\"showPassword.set(false)\">\n {{ showPassword() ? 'visibility_off' : 'visibility' }}\n </mat-icon>\n </mat-form-field>\n\n @if (services.authentication.options.showRememberMeOption) {\n <mat-slide-toggle [checked]=\"!services.authentication.useSessionStorage\" (change)=\"changeTokenStorageMode($event.checked)\">\n Remember me next time\n </mat-slide-toggle>\n }\n </form>\n }\n</mat-dialog-content>\n\n@if (!services.authentication.authenticating()) {\n <mat-dialog-actions>\n <button mat-raised-button color=\"primary\" (click)=\"authenticate()\"\n [disabled]=\"form().invalid()\">\n <mat-icon fontIcon=\"done\"/>\n <span>OK</span>\n </button>\n \n <button mat-raised-button (click)=\"services.dialogRef.close()\">\n <mat-icon fontIcon=\"close\"/>\n <span>Cancel</span>\n </button>\n </mat-dialog-actions>\n}", styles: ["#spinner{width:100%;height:100%;display:flex;justify-content:center;align-items:center}form{display:grid;gap:1rem}mat-form-field{width:500px}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"] }]
|
|
264
264
|
}], ctorParameters: () => [], propDecorators: { usernameInput: [{ type: i0.ViewChild, args: ['usernameInput', { isSignal: true }] }] } });
|
|
265
265
|
|
|
266
266
|
class LoginComponent {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cleavelandprice-ngx-lib-authentication-material.mjs","sources":["../../../../projects/cleavelandprice/ngx-lib/authentication/material/src/model/mat-authentication-service-options-token.ts","../../../../projects/cleavelandprice/ngx-lib/authentication/material/src/services/mat-authentication.service.ts","../../../../projects/cleavelandprice/ngx-lib/authentication/material/src/components/login-form/login-form.component.ts","../../../../projects/cleavelandprice/ngx-lib/authentication/material/src/components/login-form/login-form.component.html","../../../../projects/cleavelandprice/ngx-lib/authentication/material/src/components/login/login.component.ts","../../../../projects/cleavelandprice/ngx-lib/authentication/material/src/components/login/login.component.html","../../../../projects/cleavelandprice/ngx-lib/authentication/material/src/mat-authentication.module.ts","../../../../projects/cleavelandprice/ngx-lib/authentication/material/src/cleavelandprice-ngx-lib-authentication-material.ts"],"sourcesContent":["import { InjectionToken } from \"@angular/core\";\r\nimport { MatAuthenticationServiceOptions } from \"./mat-authentication-service-options\";\r\n\r\nexport const MatAuthenticationServiceOptionsToken = new InjectionToken<MatAuthenticationServiceOptions>('');","import { Inject, inject, Injectable, Optional } from '@angular/core';\r\nimport { JwtHelperService } from '@auth0/angular-jwt';\r\n\r\nimport { SharePointService } from '@cleavelandprice/ngx-lib/sharepoint';\r\n\r\nimport {\r\n AuthenticationToken,\r\n AuthenticationTokenService\r\n} from '@cleavelandprice/ngx-lib/authentication/token';\r\nimport { MatAuthenticationServiceOptions } from '../model/mat-authentication-service-options';\r\nimport { MatAuthenticationServiceOptionsToken } from '../model/mat-authentication-service-options-token';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class MatAuthenticationService extends AuthenticationTokenService {\r\n #sharePointService = inject(SharePointService);\r\n\r\n override options!: MatAuthenticationServiceOptions;\r\n\r\n //#region Lifecycle\r\n constructor(@Optional() @Inject(MatAuthenticationServiceOptionsToken) constructorOptions: MatAuthenticationServiceOptions) {\r\n super({...constructorOptions, deferTokenValidation: true});\r\n\r\n // When super() was called, the parent class defined the 'options' object with all of the other properties\r\n this.options = { ...this.options, ...constructorOptions };\r\n this.checkForExistingToken();\r\n }\r\n //#endregion\r\n\r\n //#region Utilities\r\n override validateUser(token: string): void {\r\n const jwtHelper = new JwtHelperService();\r\n const decoded = jwtHelper.decodeToken(token) as AuthenticationToken;\r\n\r\n if (jwtHelper.isTokenExpired(token)) {\r\n this.logout();\r\n return;\r\n }\r\n\r\n this.authenticatedUser.set({\r\n accountName: decoded.winaccountname,\r\n admin: decoded.role === 'Admin',\r\n department: decoded.department,\r\n displayName: decoded.displayName,\r\n distinguishedName: decoded.distinguishedName,\r\n email: decoded.email,\r\n employeeNumber: decoded.employeeNumber,\r\n firstName: decoded.firstName,\r\n hireDate: decoded.hireDate,\r\n lastName: decoded.lastName,\r\n manager: decoded.manager,\r\n memberOf: decoded.memberOf,\r\n phone: decoded.phone,\r\n photoUrl: undefined,\r\n sid: decoded.sid,\r\n title: decoded.title,\r\n workShift: decoded.workShift\r\n });\r\n\r\n this.storage.setItem(this.options.tokenName!, token);\r\n\r\n this.#getPhoto();\r\n \r\n this.authenticated.set(true);\r\n this.authenticatedChanged.emit(this.authenticated());\r\n\r\n this.authenticating.set(false);\r\n this.authenticatingChanged.emit(this.authenticating());\r\n }\r\n\r\n #getPhoto(): void {\r\n this.#sharePointService.getPhotos()\r\n .subscribe(photos => {\r\n // The user may have been logged out by the time the photos came back\r\n if (!this.authenticatedUser()?.employeeNumber) {\r\n return;\r\n }\r\n\r\n const photo = this.authenticatedUser()!.employeeNumber && photos.find(pic => pic.employeeNumber === +this.authenticatedUser()!.employeeNumber!);\r\n\r\n if (photo) {\r\n this.authenticatedUser.update(current => ({\r\n ...current!,\r\n photoUrl: photo.encodedAbsUrl\r\n }));\r\n }\r\n });\r\n }\r\n //#endregion\r\n}","import { Component, inject, OnDestroy, OnInit, OutputRefSubscription, ChangeDetectionStrategy, signal, afterNextRender, computed, viewChild, ElementRef, afterRenderEffect } from '@angular/core';\nimport { apply, debounce, form, PathKind, required, schema, SchemaPathTree, validate, FormField } from '@angular/forms/signals';\nimport { MAT_DIALOG_DATA, MatDialogModule, MatDialogRef } from '@angular/material/dialog';\nimport { MatButton } from '@angular/material/button';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatInput } from '@angular/material/input';\nimport { MatProgressSpinner } from '@angular/material/progress-spinner';\nimport { MatSlideToggle } from '@angular/material/slide-toggle';\nimport { MatTooltipModule } from '@angular/material/tooltip';\n\nimport { CleavelandPriceUser, ActiveDirectoryService } from '@cleavelandprice/ngx-lib/active-directory';\n\nimport { LoginFormData } from '../../model/login-form-data';\nimport { MatAuthenticationService } from '../../services/mat-authentication.service';\n\n@Component({\n templateUrl: './login-form.component.html',\n imports: [\n MatButton,\n MatDialogModule,\n MatFormFieldModule,\n MatIconModule,\n MatInput,\n MatProgressSpinner,\n MatSlideToggle,\n MatTooltipModule,\n FormField\n],\n standalone: true,\n changeDetection: ChangeDetectionStrategy.Eager,\n styleUrls: [\n './login-form.component.scss',\n '../../../../../styles/mat-icon.scss',\n ],\n})\nexport class LoginFormComponent implements OnInit, OnDestroy {\n #data = inject<LoginFormData>(MAT_DIALOG_DATA);\n\n services = {\n dialogRef: inject(MatDialogRef<LoginFormComponent>),\n authentication: inject(MatAuthenticationService),\n activeDirectory: inject(ActiveDirectoryService),\n };\n\n authenticatedChangedSubscription!: OutputRefSubscription;\n authenticationErrorSubscription!: OutputRefSubscription;\n\n usernameInput = viewChild<ElementRef<HTMLInputElement>>('usernameInput');\n\n showPassword = signal(false);\n\n #credentialsModel = signal<ICredentialsModel>({\n username: '',\n password: ''\n });\n\n #formSchema = schema((schemaPath: SchemaPathTree<ICredentialsModel, PathKind.Root>) => {\n required(schemaPath.username);\n required(schemaPath.password);\n\n debounce(schemaPath.username, 500);\n debounce(schemaPath.password, 500);\n\n //#region Custom Validation\n validate(schemaPath.username, ({ value, valueOf }) => {\n \n if (!this.form().dirty()) { return null; }\n\n const username = value();\n\n if (!username) {\n return { \n kind: 'required', \n message: 'Username is required' \n };\n }\n\n if (username.includes(' ')) {\n return { \n kind: 'noSpaces', \n message: 'Username cannot contain spaces' \n };\n }\n\n if (!this.user()) {\n return { \n kind: 'invalidUsername', \n message: 'User not found' \n };\n }\n\n return null; // valid\n });\n //#endregion\n });\n\n form = form(this.#credentialsModel, (path) => apply(path, this.#formSchema));\n\n users = signal<CleavelandPriceUser[]>([]);\n gettingUsers = signal(false);\n error = signal<string | null>(null);\n\n constructor() {\n this.users.set(this.#data.users ?? []);\n\n afterNextRender(() => {\n if (!(this.users().length)) {\n this.gettingUsers.set(true);\n\n this.services.activeDirectory.getUsers(this.#data.additionalInfo ?? 'ngxLibLoginComponent')\n .subscribe({\n next: (users) => {\n this.users.set(users);\n this.gettingUsers.set(false);\n },\n error: (error) => {\n console.log('Error while getting users', error);\n this.error.set('Error while getting users');\n this.gettingUsers.set(false);\n }\n });\n }\n });\n\n afterRenderEffect(() => {\n this.usernameInput()?.nativeElement.focus();\n });\n }\n\n ngOnInit(): void {\n //this.form.get('adminGroup')?.setValue(this.#data.adminGroup);\n //this.form.get('additionalInfo')?.setValue(this.#data.additionalInfo);\n\n this.authenticatedChangedSubscription =\n this.services.authentication.authenticatedChanged.subscribe(\n this.#authChangedHandler.bind(this),\n );\n\n this.authenticationErrorSubscription =\n this.services.authentication.authenticationError.subscribe(\n this.#errorHandler.bind(this),\n );\n }\n\n ngOnDestroy(): void {\n this.authenticationErrorSubscription.unsubscribe();\n this.authenticatedChangedSubscription.unsubscribe();\n }\n\n authenticate() {\n this.error.set(null);\n \n //const { username, password, adminGroup, additionalInfo } = this.form.value;\n const { username, password } = this.form().value();\n\n this.services.authentication.login(\n username!,\n password!,\n this.#data.adminGroup,\n this.#data.additionalInfo,\n );\n }\n\n #authChangedHandler(authenticated: boolean): void {\n if (authenticated) {\n this.services.dialogRef.close();\n }\n }\n\n #errorHandler(err: any): void {\n console.log('Authentication error', err);\n this.error.set(`${err.name}: ${err.statusText}`);\n }\n\n changeTokenStorageMode(checked: boolean): void {\n const keyName = 'storeTokenInSession';\n\n if (checked) {\n if (localStorage.getItem(keyName)) {\n localStorage.removeItem(keyName);\n }\n } else {\n localStorage.setItem(keyName, 'true');\n }\n }\n\n #usernameExists(username: string): boolean {\n return this.users()\n .map(u => u.sAMAccountName.toLowerCase())\n .some(u => u.toLowerCase() === username.toLowerCase());\n }\n\n user = computed<CleavelandPriceUser | undefined>(() => {\n return this.form().value().username.trim() ?\n this.users()\n .find(u =>\n u.sAMAccountName.toLowerCase() === this.form().value().username.toLowerCase() ||\n u.employeeNumber === this.form().value().username ||\n (\n u.mail &&\n (u.mail.toLowerCase() ?? '') === this.form().value().username.toLowerCase()\n )\n ) :\n undefined; // username is blank\n });\n\n userLabel = computed<string | undefined>(() => {\n const user = this.user();\n \n return user?.department ?\n // Valid user with a department\n `<b>${user.displayName ?? user.sAMAccountName}</b>: ${user.department}` :\n user ?\n // Valid user, no department\n (user.displayName ?? user.sAMAccountName) :\n // No valid user\n undefined;\n });\n}\n\ninterface ICredentialsModel {\n username: string;\n password: string;\n}","<h2 mat-dialog-title>\n @if (services.authentication.authenticating()) {\n <span>Authenticating...</span>\n } @else {\n <span>Login</span>\n }\n</h2>\n\n<mat-dialog-content>\n @if (services.authentication.authenticating() || gettingUsers()) {\n <div id=\"spinner\">\n <mat-progress-spinner color=\"primary\" mode=\"indeterminate\"/>\n </div>\n } @else if (error()) {\n <div id=\"error\">\n {{ error() }}\n </div>\n } @else {\n\n <form>\n <mat-form-field>\n <input #usernameInput matInput [formField]=\"form.username\" placeholder=\"Username\" (keyup.enter)=\"authenticate()\">\n\n @if (form.username().value() && form.username().errors().length) {\n @for (error of form.username().errors(); track $index) {\n <mat-error>{{ error.message }}</mat-error>\n }\n }\n\n @if (userLabel()) {\n <mat-hint [innerHTML]=\"userLabel()\" />\n }\n </mat-form-field>\n\n <mat-form-field>\n <input matInput [formField]=\"form.password\"\n [type]=\"showPassword() ? 'text' : 'password'\"\n placeholder=\"Password\" (keyup.enter)=\"authenticate()\">\n\n <mat-icon matSuffix \n [matTooltip]=\"showPassword() ? 'Hide password' : 'Show password'\"\n aria-label=\"Show password\"\n (pointerdown)=\"$event.preventDefault(); showPassword.set(true)\"\n (pointerup)=\"showPassword.set(false)\"\n (pointercancel)=\"showPassword.set(false)\"\n (pointerleave)=\"showPassword.set(false)\">\n {{ showPassword() ? 'visibility_off' : 'visibility' }}\n </mat-icon>\n </mat-form-field>\n\n @if (services.authentication.options.showRememberMeOption) {\n <mat-slide-toggle [checked]=\"!services.authentication.useSessionStorage\" (change)=\"changeTokenStorageMode($event.checked)\">\n Remember me next time\n </mat-slide-toggle>\n }\n </form>\n }\n</mat-dialog-content>\n\n@if (!services.authentication.authenticating()) {\n <mat-dialog-actions>\n <button mat-raised-button color=\"primary\" (click)=\"authenticate()\"\n [disabled]=\"form().invalid()\">\n <mat-icon fontIcon=\"done\"/>\n <span>OK</span>\n </button>\n \n <button mat-raised-button (click)=\"services.dialogRef.close()\">\n <mat-icon fontIcon=\"close\"/>\n <span>Cancel</span>\n </button>\n </mat-dialog-actions>\n}","import { Component, inject, input, ChangeDetectionStrategy } from '@angular/core';\nimport { MatDialog } from '@angular/material/dialog';\nimport { MatIcon } from '@angular/material/icon';\n\nimport { ConfirmationComponent } from '@cleavelandprice/ngx-lib/dialog';\nimport { CleavelandPriceUser } from '@cleavelandprice/ngx-lib/active-directory';\n\nimport { MatAuthenticationService } from '../../services/mat-authentication.service';\nimport { LoginFormComponent } from '../login-form/login-form.component';\n\n@Component({\n selector: 'cp-login',\n imports: [MatIcon],\n standalone: true,\n templateUrl: './login.component.html',\n changeDetection: ChangeDetectionStrategy.Eager,\n styleUrls: ['./login.component.scss', '../../../../../styles/mat-icon.scss'],\n})\nexport class LoginComponent {\n #services = {\n dialog: inject(MatDialog),\n };\n \n services = {\n authentication: inject(MatAuthenticationService),\n };\n //#endregion\n\n adminGroup = input<string>();\n additionalInfo = input<string>();\n\n users = input<CleavelandPriceUser[]>([]);\n \n login(): void {\n this.#services.dialog.open(LoginFormComponent, {\n data: {\n adminGroup: this.adminGroup(),\n additionalInfo: this.additionalInfo(),\n users: this.users()\n },\n });\n }\n\n confirmLogout(): void {\n this.#services.dialog\n .open(ConfirmationComponent, {\n data: { message: `Are you sure you want to logout?` },\n })\n .afterClosed()\n .subscribe((result) => {\n if (result) {\n this.services.authentication.logout();\n }\n });\n }\n}\n","<div id=\"user-id\">\n <!-- Logged out -->\n <!-- Logged in -->\n @if (services.authentication.authenticated()) {\n <!-- With photo -->\n @if (services.authentication.authenticatedUser()?.photoUrl) {\n <img\n id=\"authenticated-user-image\"\n [src]=\"\n $safeNavigationMigration(\n services.authentication.authenticatedUser()?.photoUrl\n )\n \"\n matTooltip=\"Logout\"\n (click)=\"confirmLogout()\"\n />\n } @else {\n <!-- Without photo -->\n <mat-icon\n fontIcon=\"account_circle\"\n matTooltip=\"Logout\"\n (click)=\"confirmLogout()\"\n >\n </mat-icon>\n }\n <!-- Name -->\n <div id=\"user-name\">\n {{ services.authentication.authenticatedUser()?.displayName }}\n </div>\n } @else {\n <mat-icon fontIcon=\"account_circle\" matTooltip=\"Login\" (click)=\"login()\">\n </mat-icon>\n }\n</div>\n","import { CommonModule } from '@angular/common';\r\nimport { ModuleWithProviders, NgModule, Optional, SkipSelf } from '@angular/core';\r\nimport { ReactiveFormsModule } from '@angular/forms';\r\n\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatDialogModule } from '@angular/material/dialog';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { MatProgressSpinnerModule } from '@angular/material/progress-spinner';\r\nimport { MatSlideToggleModule } from '@angular/material/slide-toggle';\r\n\r\nimport { MatAuthenticationServiceOptions } from './model/mat-authentication-service-options';\r\n\r\n\r\nimport { LoginFormComponent } from './components/login-form/login-form.component';\r\nimport { LoginComponent } from './components/login/login.component';\r\nimport { MatAuthenticationServiceOptionsToken } from './model/mat-authentication-service-options-token';\r\n\r\n@NgModule({\r\n declarations: [],\r\n imports: [\r\n CommonModule,\r\n ReactiveFormsModule,\r\n \r\n MatButtonModule,\r\n MatDialogModule,\r\n MatFormFieldModule,\r\n MatIconModule,\r\n MatInputModule,\r\n MatProgressSpinnerModule,\r\n MatSlideToggleModule,\r\n\r\n LoginComponent,\r\n LoginFormComponent\r\n ],\r\n exports: [\r\n LoginComponent,\r\n LoginFormComponent\r\n ]\r\n})\r\nexport class MatAuthenticationModule {\r\n static forRoot(options: MatAuthenticationServiceOptions): ModuleWithProviders<MatAuthenticationModule> {\r\n return {\r\n ngModule: MatAuthenticationModule,\r\n providers: [\r\n {\r\n provide: MatAuthenticationServiceOptionsToken,\r\n useValue: options\r\n }\r\n ]\r\n };\r\n }\r\n\r\n constructor(@Optional() @SkipSelf() parentModule: MatAuthenticationModule) {\r\n if (parentModule) {\r\n throw new Error(\r\n 'MatAuthenticationModule is already loaded. Import it in the AppModule only');\r\n }\r\n }\r\n}","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './mat-authentication.api';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"cleavelandprice-ngx-lib-authentication-material.mjs","sources":["../../../../projects/cleavelandprice/ngx-lib/authentication/material/src/model/mat-authentication-service-options-token.ts","../../../../projects/cleavelandprice/ngx-lib/authentication/material/src/services/mat-authentication.service.ts","../../../../projects/cleavelandprice/ngx-lib/authentication/material/src/components/login-form/login-form.component.ts","../../../../projects/cleavelandprice/ngx-lib/authentication/material/src/components/login-form/login-form.component.html","../../../../projects/cleavelandprice/ngx-lib/authentication/material/src/components/login/login.component.ts","../../../../projects/cleavelandprice/ngx-lib/authentication/material/src/components/login/login.component.html","../../../../projects/cleavelandprice/ngx-lib/authentication/material/src/mat-authentication.module.ts","../../../../projects/cleavelandprice/ngx-lib/authentication/material/src/cleavelandprice-ngx-lib-authentication-material.ts"],"sourcesContent":["import { InjectionToken } from \"@angular/core\";\r\nimport { MatAuthenticationServiceOptions } from \"./mat-authentication-service-options\";\r\n\r\nexport const MatAuthenticationServiceOptionsToken = new InjectionToken<MatAuthenticationServiceOptions>('');","import { Inject, inject, Injectable, Optional } from '@angular/core';\r\nimport { JwtHelperService } from '@auth0/angular-jwt';\r\n\r\nimport { SharePointService } from '@cleavelandprice/ngx-lib/sharepoint';\r\n\r\nimport {\r\n AuthenticationToken,\r\n AuthenticationTokenService\r\n} from '@cleavelandprice/ngx-lib/authentication/token';\r\nimport { MatAuthenticationServiceOptions } from '../model/mat-authentication-service-options';\r\nimport { MatAuthenticationServiceOptionsToken } from '../model/mat-authentication-service-options-token';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class MatAuthenticationService extends AuthenticationTokenService {\r\n #sharePointService = inject(SharePointService);\r\n\r\n override options!: MatAuthenticationServiceOptions;\r\n\r\n //#region Lifecycle\r\n constructor(@Optional() @Inject(MatAuthenticationServiceOptionsToken) constructorOptions: MatAuthenticationServiceOptions) {\r\n super({...constructorOptions, deferTokenValidation: true});\r\n\r\n // When super() was called, the parent class defined the 'options' object with all of the other properties\r\n this.options = { ...this.options, ...constructorOptions };\r\n this.checkForExistingToken();\r\n }\r\n //#endregion\r\n\r\n //#region Utilities\r\n override validateUser(token: string): void {\r\n const jwtHelper = new JwtHelperService();\r\n const decoded = jwtHelper.decodeToken(token) as AuthenticationToken;\r\n\r\n if (jwtHelper.isTokenExpired(token)) {\r\n this.logout();\r\n return;\r\n }\r\n\r\n this.authenticatedUser.set({\r\n accountName: decoded.winaccountname,\r\n admin: decoded.role === 'Admin',\r\n department: decoded.department,\r\n displayName: decoded.displayName,\r\n distinguishedName: decoded.distinguishedName,\r\n email: decoded.email,\r\n employeeNumber: decoded.employeeNumber,\r\n firstName: decoded.firstName,\r\n hireDate: decoded.hireDate,\r\n lastName: decoded.lastName,\r\n manager: decoded.manager,\r\n memberOf: decoded.memberOf,\r\n phone: decoded.phone,\r\n photoUrl: undefined,\r\n sid: decoded.sid,\r\n title: decoded.title,\r\n workShift: decoded.workShift\r\n });\r\n\r\n this.storage.setItem(this.options.tokenName!, token);\r\n\r\n this.#getPhoto();\r\n \r\n this.authenticated.set(true);\r\n this.authenticatedChanged.emit(this.authenticated());\r\n\r\n this.authenticating.set(false);\r\n this.authenticatingChanged.emit(this.authenticating());\r\n }\r\n\r\n #getPhoto(): void {\r\n this.#sharePointService.getPhotos()\r\n .subscribe(photos => {\r\n // The user may have been logged out by the time the photos came back\r\n if (!this.authenticatedUser()?.employeeNumber) {\r\n return;\r\n }\r\n\r\n const photo = this.authenticatedUser()!.employeeNumber && photos.find(pic => pic.employeeNumber === +this.authenticatedUser()!.employeeNumber!);\r\n\r\n if (photo) {\r\n this.authenticatedUser.update(current => ({\r\n ...current!,\r\n photoUrl: photo.encodedAbsUrl\r\n }));\r\n }\r\n });\r\n }\r\n //#endregion\r\n}","import { Component, inject, OnDestroy, OnInit, OutputRefSubscription, ChangeDetectionStrategy, signal, afterNextRender, computed, viewChild, ElementRef, afterRenderEffect } from '@angular/core';\nimport { apply, debounce, form, PathKind, required, schema, SchemaPathTree, validate, FormField } from '@angular/forms/signals';\nimport { MAT_DIALOG_DATA, MatDialogModule, MatDialogRef } from '@angular/material/dialog';\nimport { MatButton } from '@angular/material/button';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatInput } from '@angular/material/input';\nimport { MatProgressSpinner } from '@angular/material/progress-spinner';\nimport { MatSlideToggle } from '@angular/material/slide-toggle';\nimport { MatTooltipModule } from '@angular/material/tooltip';\n\nimport { CleavelandPriceUser, ActiveDirectoryService } from '@cleavelandprice/ngx-lib/active-directory';\n\nimport { LoginFormData } from '../../model/login-form-data';\nimport { MatAuthenticationService } from '../../services/mat-authentication.service';\n\n@Component({\n templateUrl: './login-form.component.html',\n imports: [\n MatButton,\n MatDialogModule,\n MatFormFieldModule,\n MatIconModule,\n MatInput,\n MatProgressSpinner,\n MatSlideToggle,\n MatTooltipModule,\n FormField\n],\n standalone: true,\n changeDetection: ChangeDetectionStrategy.Eager,\n styleUrls: [\n './login-form.component.scss',\n '../../../../../styles/mat-icon.scss',\n ],\n})\nexport class LoginFormComponent implements OnInit, OnDestroy {\n #data = inject<LoginFormData>(MAT_DIALOG_DATA);\n\n services = {\n dialogRef: inject(MatDialogRef<LoginFormComponent>),\n authentication: inject(MatAuthenticationService),\n activeDirectory: inject(ActiveDirectoryService),\n };\n\n authenticatedChangedSubscription!: OutputRefSubscription;\n authenticationErrorSubscription!: OutputRefSubscription;\n\n usernameInput = viewChild<ElementRef<HTMLInputElement>>('usernameInput');\n\n showPassword = signal(false);\n\n #credentialsModel = signal<ICredentialsModel>({\n username: '',\n password: ''\n });\n\n #formSchema = schema((schemaPath: SchemaPathTree<ICredentialsModel, PathKind.Root>) => {\n required(schemaPath.username);\n required(schemaPath.password);\n\n debounce(schemaPath.username, 500);\n debounce(schemaPath.password, 500);\n\n //#region Custom Validation\n validate(schemaPath.username, ({ value, valueOf }) => {\n \n if (!this.form().dirty()) { return null; }\n\n const username = value();\n\n if (!username) {\n return { \n kind: 'required', \n message: 'Username is required' \n };\n }\n\n if (username.includes(' ')) {\n return { \n kind: 'noSpaces', \n message: 'Username cannot contain spaces' \n };\n }\n\n if (!this.user()) {\n return { \n kind: 'invalidUsername', \n message: 'User not found' \n };\n }\n\n return null; // valid\n });\n //#endregion\n });\n\n form = form(this.#credentialsModel, (path) => apply(path, this.#formSchema));\n\n users = signal<CleavelandPriceUser[]>([]);\n gettingUsers = signal(false);\n error = signal<string | null>(null);\n\n constructor() {\n this.users.set(this.#data.users ?? []);\n\n afterNextRender(() => {\n if (!(this.users().length)) {\n this.gettingUsers.set(true);\n\n this.services.activeDirectory.getUsers(this.#data.additionalInfo ?? 'ngxLibLoginComponent')\n .subscribe({\n next: (users) => {\n this.users.set(users);\n this.gettingUsers.set(false);\n },\n error: (error) => {\n console.log('Error while getting users', error);\n this.error.set('Error while getting users');\n this.gettingUsers.set(false);\n }\n });\n }\n });\n\n afterRenderEffect(() => {\n this.usernameInput()?.nativeElement.focus();\n });\n }\n\n ngOnInit(): void {\n //this.form.get('adminGroup')?.setValue(this.#data.adminGroup);\n //this.form.get('additionalInfo')?.setValue(this.#data.additionalInfo);\n\n this.authenticatedChangedSubscription =\n this.services.authentication.authenticatedChanged.subscribe(\n this.#authChangedHandler.bind(this),\n );\n\n this.authenticationErrorSubscription =\n this.services.authentication.authenticationError.subscribe(\n this.#errorHandler.bind(this),\n );\n }\n\n ngOnDestroy(): void {\n this.authenticationErrorSubscription.unsubscribe();\n this.authenticatedChangedSubscription.unsubscribe();\n }\n\n authenticate() {\n this.error.set(null);\n \n //const { username, password, adminGroup, additionalInfo } = this.form.value;\n const { username, password } = this.form().value();\n\n this.services.authentication.login(\n username!,\n password!,\n this.#data.adminGroup,\n this.#data.additionalInfo,\n );\n }\n\n #authChangedHandler(authenticated: boolean): void {\n if (authenticated) {\n this.services.dialogRef.close();\n }\n }\n\n #errorHandler(err: any): void {\n console.log('Authentication error', err);\n this.error.set(`${err.name}: ${err.statusText}`);\n }\n\n changeTokenStorageMode(checked: boolean): void {\n const keyName = 'storeTokenInSession';\n\n if (checked) {\n if (localStorage.getItem(keyName)) {\n localStorage.removeItem(keyName);\n }\n } else {\n localStorage.setItem(keyName, 'true');\n }\n }\n\n #usernameExists(username: string): boolean {\n return this.users()\n .map(u => u.sAMAccountName.toLowerCase())\n .some(u => u.toLowerCase() === username.toLowerCase());\n }\n\n user = computed<CleavelandPriceUser | undefined>(() => {\n return this.form().value().username.trim() ?\n this.users()\n .find(u =>\n u.sAMAccountName.toLowerCase() === this.form().value().username.toLowerCase() ||\n u.employeeNumber === this.form().value().username ||\n (\n u.mail &&\n (u.mail.toLowerCase() ?? '') === this.form().value().username.toLowerCase()\n )\n ) :\n undefined; // username is blank\n });\n\n userLabel = computed<string | undefined>(() => {\n const user = this.user();\n \n return user?.department ?\n // Valid user with a department\n `<b>${user.displayName ?? user.sAMAccountName}</b>: ${user.department}` :\n user ?\n // Valid user, no department\n (user.displayName ?? user.sAMAccountName) :\n // No valid user\n undefined;\n });\n}\n\ninterface ICredentialsModel {\n username: string;\n password: string;\n}","<h2 mat-dialog-title>\n @if (services.authentication.authenticating()) {\n <span>Authenticating...</span>\n } @else {\n <span>Login</span>\n }\n</h2>\n\n<mat-dialog-content>\n @if (services.authentication.authenticating() || gettingUsers()) {\n <div id=\"spinner\">\n <mat-progress-spinner color=\"primary\" mode=\"indeterminate\"/>\n </div>\n } @else if (error()) {\n <div id=\"error\">\n {{ error() }}\n </div>\n } @else {\n\n <form>\n <mat-form-field>\n <input #usernameInput matInput [formField]=\"form.username\" placeholder=\"Username or Employee ID\" (keyup.enter)=\"authenticate()\">\n\n @if (form.username().value() && form.username().errors().length) {\n @for (error of form.username().errors(); track $index) {\n <mat-error>{{ error.message }}</mat-error>\n }\n }\n\n @if (userLabel()) {\n <mat-hint [innerHTML]=\"userLabel()\" />\n }\n </mat-form-field>\n\n <mat-form-field>\n <input matInput [formField]=\"form.password\"\n [type]=\"showPassword() ? 'text' : 'password'\"\n placeholder=\"Password\" (keyup.enter)=\"authenticate()\">\n\n <mat-icon matSuffix \n [matTooltip]=\"showPassword() ? 'Hide password' : 'Show password'\"\n aria-label=\"Show password\"\n (pointerdown)=\"$event.preventDefault(); showPassword.set(true)\"\n (pointerup)=\"showPassword.set(false)\"\n (pointercancel)=\"showPassword.set(false)\"\n (pointerleave)=\"showPassword.set(false)\">\n {{ showPassword() ? 'visibility_off' : 'visibility' }}\n </mat-icon>\n </mat-form-field>\n\n @if (services.authentication.options.showRememberMeOption) {\n <mat-slide-toggle [checked]=\"!services.authentication.useSessionStorage\" (change)=\"changeTokenStorageMode($event.checked)\">\n Remember me next time\n </mat-slide-toggle>\n }\n </form>\n }\n</mat-dialog-content>\n\n@if (!services.authentication.authenticating()) {\n <mat-dialog-actions>\n <button mat-raised-button color=\"primary\" (click)=\"authenticate()\"\n [disabled]=\"form().invalid()\">\n <mat-icon fontIcon=\"done\"/>\n <span>OK</span>\n </button>\n \n <button mat-raised-button (click)=\"services.dialogRef.close()\">\n <mat-icon fontIcon=\"close\"/>\n <span>Cancel</span>\n </button>\n </mat-dialog-actions>\n}","import { Component, inject, input, ChangeDetectionStrategy } from '@angular/core';\nimport { MatDialog } from '@angular/material/dialog';\nimport { MatIcon } from '@angular/material/icon';\n\nimport { ConfirmationComponent } from '@cleavelandprice/ngx-lib/dialog';\nimport { CleavelandPriceUser } from '@cleavelandprice/ngx-lib/active-directory';\n\nimport { MatAuthenticationService } from '../../services/mat-authentication.service';\nimport { LoginFormComponent } from '../login-form/login-form.component';\n\n@Component({\n selector: 'cp-login',\n imports: [MatIcon],\n standalone: true,\n templateUrl: './login.component.html',\n changeDetection: ChangeDetectionStrategy.Eager,\n styleUrls: ['./login.component.scss', '../../../../../styles/mat-icon.scss'],\n})\nexport class LoginComponent {\n #services = {\n dialog: inject(MatDialog),\n };\n \n services = {\n authentication: inject(MatAuthenticationService),\n };\n //#endregion\n\n adminGroup = input<string>();\n additionalInfo = input<string>();\n\n users = input<CleavelandPriceUser[]>([]);\n \n login(): void {\n this.#services.dialog.open(LoginFormComponent, {\n data: {\n adminGroup: this.adminGroup(),\n additionalInfo: this.additionalInfo(),\n users: this.users()\n },\n });\n }\n\n confirmLogout(): void {\n this.#services.dialog\n .open(ConfirmationComponent, {\n data: { message: `Are you sure you want to logout?` },\n })\n .afterClosed()\n .subscribe((result) => {\n if (result) {\n this.services.authentication.logout();\n }\n });\n }\n}\n","<div id=\"user-id\">\n <!-- Logged out -->\n <!-- Logged in -->\n @if (services.authentication.authenticated()) {\n <!-- With photo -->\n @if (services.authentication.authenticatedUser()?.photoUrl) {\n <img\n id=\"authenticated-user-image\"\n [src]=\"\n $safeNavigationMigration(\n services.authentication.authenticatedUser()?.photoUrl\n )\n \"\n matTooltip=\"Logout\"\n (click)=\"confirmLogout()\"\n />\n } @else {\n <!-- Without photo -->\n <mat-icon\n fontIcon=\"account_circle\"\n matTooltip=\"Logout\"\n (click)=\"confirmLogout()\"\n >\n </mat-icon>\n }\n <!-- Name -->\n <div id=\"user-name\">\n {{ services.authentication.authenticatedUser()?.displayName }}\n </div>\n } @else {\n <mat-icon fontIcon=\"account_circle\" matTooltip=\"Login\" (click)=\"login()\">\n </mat-icon>\n }\n</div>\n","import { CommonModule } from '@angular/common';\r\nimport { ModuleWithProviders, NgModule, Optional, SkipSelf } from '@angular/core';\r\nimport { ReactiveFormsModule } from '@angular/forms';\r\n\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatDialogModule } from '@angular/material/dialog';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { MatProgressSpinnerModule } from '@angular/material/progress-spinner';\r\nimport { MatSlideToggleModule } from '@angular/material/slide-toggle';\r\n\r\nimport { MatAuthenticationServiceOptions } from './model/mat-authentication-service-options';\r\n\r\n\r\nimport { LoginFormComponent } from './components/login-form/login-form.component';\r\nimport { LoginComponent } from './components/login/login.component';\r\nimport { MatAuthenticationServiceOptionsToken } from './model/mat-authentication-service-options-token';\r\n\r\n@NgModule({\r\n declarations: [],\r\n imports: [\r\n CommonModule,\r\n ReactiveFormsModule,\r\n \r\n MatButtonModule,\r\n MatDialogModule,\r\n MatFormFieldModule,\r\n MatIconModule,\r\n MatInputModule,\r\n MatProgressSpinnerModule,\r\n MatSlideToggleModule,\r\n\r\n LoginComponent,\r\n LoginFormComponent\r\n ],\r\n exports: [\r\n LoginComponent,\r\n LoginFormComponent\r\n ]\r\n})\r\nexport class MatAuthenticationModule {\r\n static forRoot(options: MatAuthenticationServiceOptions): ModuleWithProviders<MatAuthenticationModule> {\r\n return {\r\n ngModule: MatAuthenticationModule,\r\n providers: [\r\n {\r\n provide: MatAuthenticationServiceOptionsToken,\r\n useValue: options\r\n }\r\n ]\r\n };\r\n }\r\n\r\n constructor(@Optional() @SkipSelf() parentModule: MatAuthenticationModule) {\r\n if (parentModule) {\r\n throw new Error(\r\n 'MatAuthenticationModule is already loaded. Import it in the AppModule only');\r\n }\r\n }\r\n}","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './mat-authentication.api';\n"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"comment": "NGX-LIB primary entry point package.json",
|
|
3
3
|
"name": "@cleavelandprice/ngx-lib",
|
|
4
|
-
"version": "4.8.
|
|
4
|
+
"version": "4.8.17",
|
|
5
5
|
"description": "Angular library providing foundational functionality to Cleaveland-Price applications",
|
|
6
6
|
"peerDependencies": {
|
|
7
7
|
"@angular/common": "^22.1.1",
|
|
@@ -2,16 +2,16 @@ import * as _cleavelandprice_ngx_lib_active_directory from '@cleavelandprice/ngx
|
|
|
2
2
|
import { User, Group, UserOrGroup, ActiveDirectoryServiceOptions } from '@cleavelandprice/ngx-lib/active-directory';
|
|
3
3
|
export * from '@cleavelandprice/ngx-lib/active-directory';
|
|
4
4
|
import { PhotoItem } from '@cleavelandprice/ngx-lib/sharepoint';
|
|
5
|
+
import * as _angular_forms_signals from '@angular/forms/signals';
|
|
5
6
|
import * as _angular_core from '@angular/core';
|
|
6
|
-
import { OnInit, ElementRef, ModuleWithProviders } from '@angular/core';
|
|
7
|
+
import { OnInit, ElementRef, WritableSignal, ModuleWithProviders } from '@angular/core';
|
|
7
8
|
import * as _cleavelandprice_ngx_lib_active_directory_material from '@cleavelandprice/ngx-lib/active-directory/material';
|
|
8
|
-
import * as i2 from '@angular/forms';
|
|
9
|
-
import { FormGroup, FormControl } from '@angular/forms';
|
|
10
9
|
import * as i8 from '@angular/material/list';
|
|
11
10
|
import { MatSelectionList, MatListOption } from '@angular/material/list';
|
|
12
11
|
import * as i12 from '@angular/material/table';
|
|
13
12
|
import { MatTableDataSource } from '@angular/material/table';
|
|
14
13
|
import * as i1 from '@angular/common';
|
|
14
|
+
import * as i2 from '@angular/forms';
|
|
15
15
|
import * as i3 from '@angular/material/button';
|
|
16
16
|
import * as i4 from '@angular/material/dialog';
|
|
17
17
|
import * as i5 from '@angular/material/form-field';
|
|
@@ -101,20 +101,18 @@ declare class UserChooserComponent implements OnInit {
|
|
|
101
101
|
selectableGroupNames?: string[];
|
|
102
102
|
};
|
|
103
103
|
selectionList: _angular_core.Signal<MatSelectionList | undefined>;
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
groups?: SelectableGroup[];
|
|
104
|
+
filterInput: _angular_core.Signal<ElementRef<HTMLInputElement> | undefined>;
|
|
105
|
+
filterFormModel: WritableSignal<IFilterFormModel>;
|
|
106
|
+
filterForm: _angular_forms_signals.FieldTree<IFilterFormModel, string | number, "writable">;
|
|
107
|
+
dataSource: WritableSignal<MatTableDataSource<SelectableUser | SelectableGroup> | undefined>;
|
|
108
|
+
photos: WritableSignal<PhotoItem[]>;
|
|
109
|
+
groups: WritableSignal<SelectableGroup[]>;
|
|
111
110
|
get isMultiMode(): boolean;
|
|
112
|
-
|
|
113
|
-
get selectedUsers(): (SelectableUser | SelectableGroup)[];
|
|
114
|
-
get filterValue(): string;
|
|
111
|
+
selectedUsersOrGroups: WritableSignal<(SelectableGroup | SelectableUser)[]>;
|
|
115
112
|
get adGroupsNeeded(): boolean;
|
|
113
|
+
constructor();
|
|
116
114
|
ngOnInit(): void;
|
|
117
|
-
|
|
115
|
+
closeIfSingleSelection(): void;
|
|
118
116
|
optionSelectionChanged(option: MatListOption): void;
|
|
119
117
|
hideUnselectedChanged(selected: boolean): void;
|
|
120
118
|
selectAll(): void;
|
|
@@ -127,6 +125,9 @@ declare class UserChooserComponent implements OnInit {
|
|
|
127
125
|
static ɵfac: _angular_core.ɵɵFactoryDeclaration<UserChooserComponent, never>;
|
|
128
126
|
static ɵcmp: _angular_core.ɵɵComponentDeclaration<UserChooserComponent, "ng-component", never, {}, {}, never, never, true, never>;
|
|
129
127
|
}
|
|
128
|
+
interface IFilterFormModel {
|
|
129
|
+
filter: string;
|
|
130
|
+
}
|
|
130
131
|
|
|
131
132
|
declare class UserFormFieldComponent implements OnInit {
|
|
132
133
|
#private;
|
|
@@ -136,7 +137,7 @@ declare class UserFormFieldComponent implements OnInit {
|
|
|
136
137
|
clickable: _angular_core.InputSignal<boolean>;
|
|
137
138
|
userChooserData: _angular_core.InputSignal<UserChooserData>;
|
|
138
139
|
_userChooserData: UserChooserData;
|
|
139
|
-
accountNames
|
|
140
|
+
accountNames: _angular_core.WritableSignal<string[]>;
|
|
140
141
|
users: _angular_core.WritableSignal<User[]>;
|
|
141
142
|
groups: _angular_core.WritableSignal<UserOrGroup[]>;
|
|
142
143
|
photos: _angular_core.WritableSignal<PhotoItem[]>;
|