@cleavelandprice/ngx-lib 4.4.0 → 4.4.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +5 -5
- package/active-directory/material/components/user-chooser/user-chooser.component.d.ts +18 -18
- package/authentication/model/abstract-authentication-service.d.ts +4 -4
- package/authentication/object/services/authentication-object.service.d.ts +4 -3
- package/authentication/token/services/authentication-token.service.d.ts +4 -3
- package/fesm2022/cleavelandprice-ngx-lib-active-directory-material.mjs +13 -13
- package/fesm2022/cleavelandprice-ngx-lib-active-directory-material.mjs.map +1 -1
- package/fesm2022/cleavelandprice-ngx-lib-active-directory.mjs +7 -7
- package/fesm2022/cleavelandprice-ngx-lib-active-directory.mjs.map +1 -1
- package/fesm2022/cleavelandprice-ngx-lib-authentication-material.mjs +17 -17
- package/fesm2022/cleavelandprice-ngx-lib-authentication-material.mjs.map +1 -1
- package/fesm2022/cleavelandprice-ngx-lib-authentication-object.mjs +22 -12
- package/fesm2022/cleavelandprice-ngx-lib-authentication-object.mjs.map +1 -1
- package/fesm2022/cleavelandprice-ngx-lib-authentication-token.mjs +22 -12
- package/fesm2022/cleavelandprice-ngx-lib-authentication-token.mjs.map +1 -1
- package/fesm2022/cleavelandprice-ngx-lib-authentication.mjs +4 -4
- package/fesm2022/cleavelandprice-ngx-lib-authentication.mjs.map +1 -1
- package/fesm2022/cleavelandprice-ngx-lib-dialog.mjs +25 -25
- package/fesm2022/cleavelandprice-ngx-lib-dialog.mjs.map +1 -1
- package/fesm2022/cleavelandprice-ngx-lib-msgraph.mjs +4 -4
- package/fesm2022/cleavelandprice-ngx-lib-msgraph.mjs.map +1 -1
- package/fesm2022/cleavelandprice-ngx-lib-quill-mention.mjs +10 -10
- package/fesm2022/cleavelandprice-ngx-lib-quill-mention.mjs.map +1 -1
- package/fesm2022/cleavelandprice-ngx-lib-quill.mjs +15 -15
- package/fesm2022/cleavelandprice-ngx-lib-quill.mjs.map +1 -1
- package/fesm2022/cleavelandprice-ngx-lib-sharepoint.mjs +14 -14
- package/fesm2022/cleavelandprice-ngx-lib-sharepoint.mjs.map +1 -1
- package/fesm2022/cleavelandprice-ngx-lib-table.mjs +14 -14
- package/fesm2022/cleavelandprice-ngx-lib-table.mjs.map +1 -1
- package/fesm2022/cleavelandprice-ngx-lib-upload.mjs +15 -16
- package/fesm2022/cleavelandprice-ngx-lib-upload.mjs.map +1 -1
- package/fesm2022/cleavelandprice-ngx-lib-url-utilities.mjs +13 -13
- package/fesm2022/cleavelandprice-ngx-lib-url-utilities.mjs.map +1 -1
- package/fesm2022/cleavelandprice-ngx-lib.mjs +7 -7
- package/fesm2022/cleavelandprice-ngx-lib.mjs.map +1 -1
- package/package.json +3 -33
- package/esm2022/active-directory/active-directory.api.mjs +0 -11
- package/esm2022/active-directory/active-directory.module.mjs +0 -40
- package/esm2022/active-directory/cleavelandprice-ngx-lib-active-directory.mjs +0 -5
- package/esm2022/active-directory/material/cleavelandprice-ngx-lib-active-directory-material.mjs +0 -5
- package/esm2022/active-directory/material/components/user-chooser/user-chooser.component.mjs +0 -437
- package/esm2022/active-directory/material/components/user-form-field/user-form-field.component.mjs +0 -159
- package/esm2022/active-directory/material/mat-active-directory.api.mjs +0 -11
- package/esm2022/active-directory/material/mat-active-directory.module.mjs +0 -100
- package/esm2022/active-directory/material/model/default-user-chooser-data.mjs +0 -15
- package/esm2022/active-directory/material/model/default-user-chooser-filter-options.mjs +0 -8
- package/esm2022/active-directory/material/model/selectable-group.mjs +0 -2
- package/esm2022/active-directory/material/model/selectable-user.mjs +0 -2
- package/esm2022/active-directory/material/model/user-chooser-data.mjs +0 -2
- package/esm2022/active-directory/material/model/user-chooser-filter-options.mjs +0 -3
- package/esm2022/active-directory/material/model/user-chooser-mode.mjs +0 -6
- package/esm2022/active-directory/material/model/user-chooser-pre-processing-group.mjs +0 -3
- package/esm2022/active-directory/model/active-directory-service-options-token.mjs +0 -3
- package/esm2022/active-directory/model/active-directory-service-options.mjs +0 -2
- package/esm2022/active-directory/model/ad-object-with-children.mjs +0 -2
- package/esm2022/active-directory/model/ad-object.mjs +0 -2
- package/esm2022/active-directory/model/cache-object.mjs +0 -3
- package/esm2022/active-directory/model/cleaveland-price-user.mjs +0 -2
- package/esm2022/active-directory/model/group.mjs +0 -2
- package/esm2022/active-directory/model/user-or-group.mjs +0 -2
- package/esm2022/active-directory/model/user.mjs +0 -2
- package/esm2022/active-directory/services/active-directory.service.mjs +0 -125
- package/esm2022/authentication/authentication.api.mjs +0 -7
- package/esm2022/authentication/authentication.base.module.mjs +0 -40
- package/esm2022/authentication/cleavelandprice-ngx-lib-authentication.mjs +0 -5
- package/esm2022/authentication/material/cleavelandprice-ngx-lib-authentication-material.mjs +0 -5
- package/esm2022/authentication/material/components/login/login.component.mjs +0 -49
- package/esm2022/authentication/material/components/login-form/login-form.component.mjs +0 -82
- package/esm2022/authentication/material/mat-authentication.api.mjs +0 -8
- package/esm2022/authentication/material/mat-authentication.module.mjs +0 -84
- package/esm2022/authentication/material/model/login-form-data.mjs +0 -2
- package/esm2022/authentication/material/model/mat-authentication-service-options-token.mjs +0 -3
- package/esm2022/authentication/material/model/mat-authentication-service-options.mjs +0 -2
- package/esm2022/authentication/material/services/mat-authentication.service.mjs +0 -67
- package/esm2022/authentication/model/abstract-authentication-service.mjs +0 -2
- package/esm2022/authentication/model/authenticated-user.mjs +0 -2
- package/esm2022/authentication/model/authentication-request.mjs +0 -2
- package/esm2022/authentication/model/authentication-service-options-token.mjs +0 -3
- package/esm2022/authentication/model/authentication-service-options.mjs +0 -2
- package/esm2022/authentication/object/authentication-object.api.mjs +0 -6
- package/esm2022/authentication/object/authentication-object.module.mjs +0 -40
- package/esm2022/authentication/object/cleavelandprice-ngx-lib-authentication-object.mjs +0 -5
- package/esm2022/authentication/object/services/authentication-object.service.mjs +0 -119
- package/esm2022/authentication/token/authentication-token.api.mjs +0 -6
- package/esm2022/authentication/token/authetiction-token.module.mjs +0 -40
- package/esm2022/authentication/token/cleavelandprice-ngx-lib-authentication-token.mjs +0 -5
- package/esm2022/authentication/token/model/authentication-token-service-options-token.mjs +0 -3
- package/esm2022/authentication/token/model/authentication-token-service-options.mjs +0 -2
- package/esm2022/authentication/token/model/authentication-token.mjs +0 -2
- package/esm2022/authentication/token/services/authentication-token.service.mjs +0 -128
- package/esm2022/cleavelandprice-ngx-lib.mjs +0 -5
- package/esm2022/dialog/cleavelandprice-ngx-lib-dialog.mjs +0 -5
- package/esm2022/dialog/components/base/base.component.mjs +0 -102
- package/esm2022/dialog/components/choice/choice.component.mjs +0 -21
- package/esm2022/dialog/components/confirmation/confirmation.component.mjs +0 -21
- package/esm2022/dialog/components/input/input.component.mjs +0 -21
- package/esm2022/dialog/components/message/message.component.mjs +0 -21
- package/esm2022/dialog/dialog.api.mjs +0 -20
- package/esm2022/dialog/dialog.module.mjs +0 -73
- package/esm2022/dialog/model/confirmation-dialog-mode.mjs +0 -8
- package/esm2022/dialog/model/dialog-base-data.mjs +0 -2
- package/esm2022/dialog/model/dialog-choice-data.mjs +0 -2
- package/esm2022/dialog/model/dialog-type.mjs +0 -8
- package/esm2022/lib/model/app-path-config.mjs +0 -2
- package/esm2022/lib/model/app-type.mjs +0 -2
- package/esm2022/lib/model/app.mjs +0 -2
- package/esm2022/lib/model/caching-config.mjs +0 -2
- package/esm2022/lib/model/credentials.mjs +0 -2
- package/esm2022/lib/model/logging-config.mjs +0 -2
- package/esm2022/lib/model/service-options-token.mjs +0 -3
- package/esm2022/lib/model/service-options.mjs +0 -2
- package/esm2022/lib/ngx-lib.module.mjs +0 -37
- package/esm2022/lib/services/app-path-config.service.mjs +0 -50
- package/esm2022/lib/services/service-base.mjs +0 -26
- package/esm2022/msgraph/cleavelandprice-ngx-lib-msgraph.mjs +0 -5
- package/esm2022/msgraph/model/address.mjs +0 -2
- package/esm2022/msgraph/model/attendee.mjs +0 -2
- package/esm2022/msgraph/model/bulk-calendar-events.mjs +0 -2
- package/esm2022/msgraph/model/bulk-calendar-request.mjs +0 -2
- package/esm2022/msgraph/model/calendar-event.mjs +0 -2
- package/esm2022/msgraph/model/coordinates.mjs +0 -2
- package/esm2022/msgraph/model/email-address.mjs +0 -2
- package/esm2022/msgraph/model/location.mjs +0 -2
- package/esm2022/msgraph/model/online-meeting-info.mjs +0 -2
- package/esm2022/msgraph/model/patterned-recurrence.mjs +0 -2
- package/esm2022/msgraph/model/phone.mjs +0 -2
- package/esm2022/msgraph/model/recipient.mjs +0 -2
- package/esm2022/msgraph/model/recurrence-pattern.mjs +0 -2
- package/esm2022/msgraph/model/recurrence-range.mjs +0 -2
- package/esm2022/msgraph/model/response-status.mjs +0 -2
- package/esm2022/msgraph/model/room.mjs +0 -6
- package/esm2022/msgraph/model/user.mjs +0 -132
- package/esm2022/msgraph/msgraph.api.mjs +0 -19
- package/esm2022/msgraph/msgraph.module.mjs +0 -27
- package/esm2022/public_api.mjs +0 -15
- package/esm2022/quill/cleavelandprice-ngx-lib-quill.mjs +0 -5
- package/esm2022/quill/components/editor/editor.component.mjs +0 -282
- package/esm2022/quill/components/raw/raw.component.mjs +0 -30
- package/esm2022/quill/mention/cleavelandprice-ngx-lib-quill-mention.mjs +0 -5
- package/esm2022/quill/mention/components/editor/editor.component.mjs +0 -151
- package/esm2022/quill/mention/model/dialog-data.mjs +0 -2
- package/esm2022/quill/mention/quill-mention.api.mjs +0 -9
- package/esm2022/quill/mention/quill-mention.module.mjs +0 -65
- package/esm2022/quill/model/buttons.mjs +0 -3
- package/esm2022/quill/model/config.mjs +0 -3
- package/esm2022/quill/model/default-buttons.mjs +0 -50
- package/esm2022/quill/model/default-config.mjs +0 -28
- package/esm2022/quill/model/default-icons.mjs +0 -7
- package/esm2022/quill/model/default-tooltips.mjs +0 -53
- package/esm2022/quill/model/dialog-data.mjs +0 -2
- package/esm2022/quill/model/icons.mjs +0 -3
- package/esm2022/quill/model/tooltips.mjs +0 -3
- package/esm2022/quill/quill.api.mjs +0 -13
- package/esm2022/quill/quill.module.mjs +0 -75
- package/esm2022/sharepoint/cleavelandprice-ngx-lib-sharepoint.mjs +0 -5
- package/esm2022/sharepoint/components/user-photo/user-photo.component.mjs +0 -40
- package/esm2022/sharepoint/default-credentials.mjs +0 -6
- package/esm2022/sharepoint/model/base-item.mjs +0 -2
- package/esm2022/sharepoint/model/base-request-credential.mjs +0 -2
- package/esm2022/sharepoint/model/base-request.mjs +0 -2
- package/esm2022/sharepoint/model/cache-object.mjs +0 -3
- package/esm2022/sharepoint/model/file-request.mjs +0 -2
- package/esm2022/sharepoint/model/folder-request.mjs +0 -2
- package/esm2022/sharepoint/model/list-item.mjs +0 -2
- package/esm2022/sharepoint/model/list-items-request.mjs +0 -2
- package/esm2022/sharepoint/model/photo-item.mjs +0 -2
- package/esm2022/sharepoint/model/sharepoint-service-options.mjs +0 -3
- package/esm2022/sharepoint/model/uri-request.mjs +0 -2
- package/esm2022/sharepoint/model/user-request.mjs +0 -2
- package/esm2022/sharepoint/model/user.mjs +0 -2
- package/esm2022/sharepoint/pipes/user-photo-url.pipe.mjs +0 -37
- package/esm2022/sharepoint/services/sharepoint.service.mjs +0 -155
- package/esm2022/sharepoint/sharepoint.api.mjs +0 -17
- package/esm2022/sharepoint/sharepoint.module.mjs +0 -50
- package/esm2022/table/cleavelandprice-ngx-lib-table.mjs +0 -5
- package/esm2022/table/components/table/table.component.mjs +0 -120
- package/esm2022/table/model/table-column.mjs +0 -2
- package/esm2022/table/pipes/decimalPoints.mjs +0 -14
- package/esm2022/table/pipes/roundNumber.mjs +0 -14
- package/esm2022/table/table.api.mjs +0 -6
- package/esm2022/table/table.module.mjs +0 -78
- package/esm2022/upload/cleavelandprice-ngx-lib-upload.mjs +0 -5
- package/esm2022/upload/components/upload/upload.component.mjs +0 -32
- package/esm2022/upload/components/upload-dialog/upload-dialog.component.mjs +0 -98
- package/esm2022/upload/model/database-file-info.mjs +0 -2
- package/esm2022/upload/model/file-upload-request.mjs +0 -2
- package/esm2022/upload/model/filesystem-file-info.mjs +0 -2
- package/esm2022/upload/model/msg-file-content.mjs +0 -5
- package/esm2022/upload/model/upload-service-options-token.mjs +0 -3
- package/esm2022/upload/model/upload-service-options.mjs +0 -3
- package/esm2022/upload/model/upload-status.mjs +0 -2
- package/esm2022/upload/services/upload.service.mjs +0 -106
- package/esm2022/upload/upload.api.mjs +0 -11
- package/esm2022/upload/upload.module.mjs +0 -68
- package/esm2022/url-utilities/cleavelandprice-ngx-lib-url-utilities.mjs +0 -5
- package/esm2022/url-utilities/pipes/safe-resource-url.pipe.mjs +0 -19
- package/esm2022/url-utilities/pipes/safe-url.pipe.mjs +0 -19
- package/esm2022/url-utilities/pipes/uri-scheme.pipe.mjs +0 -106
- package/esm2022/url-utilities/url-utilities.api.mjs +0 -13
- package/esm2022/url-utilities/url-utilities.module.mjs +0 -34
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
# NgxLib
|
|
2
|
-
|
|
3
|
-
## Description
|
|
4
|
-
**NgxLib** is an Angular library that contains standard functionality utilized in Cleaveland/Price applications.
|
|
5
|
-
|
|
1
|
+
# NgxLib
|
|
2
|
+
|
|
3
|
+
## Description
|
|
4
|
+
**NgxLib** is an Angular library that contains standard functionality utilized in Cleaveland/Price applications.
|
|
5
|
+
|
|
6
6
|
All documentation can be found at the project's [Github repository](https://github.com/cleavelandprice/ngx-lib).
|
|
@@ -10,24 +10,24 @@ import * as i0 from "@angular/core";
|
|
|
10
10
|
export declare class UserChooserComponent implements OnInit {
|
|
11
11
|
#private;
|
|
12
12
|
_data: {
|
|
13
|
-
closeWhenSelectionMade?: boolean
|
|
14
|
-
allowCloseWithoutSelections?: boolean
|
|
15
|
-
includeDisabledUsers?: boolean
|
|
16
|
-
parentOu?: string
|
|
17
|
-
returnUserObjects?: boolean
|
|
18
|
-
showGroupMembershipTooltips?: boolean
|
|
19
|
-
showPhone?: boolean
|
|
20
|
-
title?: string
|
|
21
|
-
mode?: UserChooserMode
|
|
22
|
-
objectTypes?: "users" | "groups" | "*"
|
|
23
|
-
filterOptions?: import("@cleavelandprice/ngx-lib/active-directory/material").UserChooserFilterOptions
|
|
24
|
-
exclusions?: import("@cleavelandprice/ngx-lib/active-directory/material").UserChooserPreProcessingGroup
|
|
25
|
-
inclusions?: import("@cleavelandprice/ngx-lib/active-directory/material").UserChooserPreProcessingGroup
|
|
26
|
-
preSelections?: import("@cleavelandprice/ngx-lib/active-directory/material").UserChooserPreProcessingGroup
|
|
27
|
-
users?: import("@cleavelandprice/ngx-lib/active-directory").User[]
|
|
28
|
-
groups?: import("@cleavelandprice/ngx-lib/active-directory").Group[]
|
|
29
|
-
photos?: PhotoItem[]
|
|
30
|
-
selectableGroupNames?: string[]
|
|
13
|
+
closeWhenSelectionMade?: boolean;
|
|
14
|
+
allowCloseWithoutSelections?: boolean;
|
|
15
|
+
includeDisabledUsers?: boolean;
|
|
16
|
+
parentOu?: string;
|
|
17
|
+
returnUserObjects?: boolean;
|
|
18
|
+
showGroupMembershipTooltips?: boolean;
|
|
19
|
+
showPhone?: boolean;
|
|
20
|
+
title?: string;
|
|
21
|
+
mode?: UserChooserMode;
|
|
22
|
+
objectTypes?: "users" | "groups" | "*";
|
|
23
|
+
filterOptions?: import("@cleavelandprice/ngx-lib/active-directory/material").UserChooserFilterOptions;
|
|
24
|
+
exclusions?: import("@cleavelandprice/ngx-lib/active-directory/material").UserChooserPreProcessingGroup;
|
|
25
|
+
inclusions?: import("@cleavelandprice/ngx-lib/active-directory/material").UserChooserPreProcessingGroup;
|
|
26
|
+
preSelections?: import("@cleavelandprice/ngx-lib/active-directory/material").UserChooserPreProcessingGroup;
|
|
27
|
+
users?: import("@cleavelandprice/ngx-lib/active-directory").User[];
|
|
28
|
+
groups?: import("@cleavelandprice/ngx-lib/active-directory").Group[];
|
|
29
|
+
photos?: PhotoItem[];
|
|
30
|
+
selectableGroupNames?: string[];
|
|
31
31
|
};
|
|
32
32
|
selectionList: import("@angular/core").Signal<MatSelectionList | undefined>;
|
|
33
33
|
set filterInput(elRef: ElementRef<HTMLInputElement>);
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { EventEmitter } from "@angular/core";
|
|
2
2
|
import { AuthenticatedUser } from "./authenticated-user";
|
|
3
3
|
export interface AbstractAuthenticationService {
|
|
4
|
-
authenticatedChanged:
|
|
5
|
-
authenticatingChanged:
|
|
6
|
-
authenticationError:
|
|
4
|
+
authenticatedChanged: EventEmitter<boolean>;
|
|
5
|
+
authenticatingChanged: EventEmitter<boolean>;
|
|
6
|
+
authenticationError: EventEmitter<any>;
|
|
7
7
|
authenticating: boolean;
|
|
8
8
|
authenticated: boolean;
|
|
9
9
|
authenticatedUser?: AuthenticatedUser;
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { EventEmitter } from '@angular/core';
|
|
1
2
|
import { User } from '@cleavelandprice/ngx-lib/active-directory';
|
|
2
3
|
import { AbstractAuthenticationService, AuthenticatedUser, AuthenticationServiceOptions } from '@cleavelandprice/ngx-lib/authentication';
|
|
3
4
|
import { NgxLibServiceBase } from '@cleavelandprice/ngx-lib';
|
|
@@ -5,12 +6,12 @@ import * as i0 from "@angular/core";
|
|
|
5
6
|
export declare class AuthenticationObjectService extends NgxLibServiceBase implements AbstractAuthenticationService {
|
|
6
7
|
#private;
|
|
7
8
|
private options;
|
|
8
|
-
authenticatedChanged: import("@angular/core").OutputEmitterRef<boolean>;
|
|
9
|
-
authenticatingChanged: import("@angular/core").OutputEmitterRef<boolean>;
|
|
10
|
-
authenticationError: import("@angular/core").OutputEmitterRef<void>;
|
|
11
9
|
authenticating: boolean;
|
|
12
10
|
authenticated: boolean;
|
|
13
11
|
authenticatedUser?: AuthenticatedUser;
|
|
12
|
+
authenticatedChanged: EventEmitter<boolean>;
|
|
13
|
+
authenticatingChanged: EventEmitter<boolean>;
|
|
14
|
+
authenticationError: EventEmitter<any>;
|
|
14
15
|
get useSessionStorage(): boolean;
|
|
15
16
|
get storage(): Storage;
|
|
16
17
|
constructor(options: AuthenticationServiceOptions);
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { EventEmitter } from '@angular/core';
|
|
1
2
|
import { AbstractAuthenticationService, AuthenticatedUser } from '@cleavelandprice/ngx-lib/authentication';
|
|
2
3
|
import { NgxLibServiceBase } from '@cleavelandprice/ngx-lib';
|
|
3
4
|
import { AuthenticationTokenServiceOptions } from '../model/authentication-token-service-options';
|
|
@@ -5,12 +6,12 @@ import * as i0 from "@angular/core";
|
|
|
5
6
|
export declare class AuthenticationTokenService extends NgxLibServiceBase implements AbstractAuthenticationService {
|
|
6
7
|
#private;
|
|
7
8
|
protected options: AuthenticationTokenServiceOptions;
|
|
8
|
-
authenticatedChanged: import("@angular/core").OutputEmitterRef<boolean>;
|
|
9
|
-
authenticatingChanged: import("@angular/core").OutputEmitterRef<boolean>;
|
|
10
|
-
authenticationError: import("@angular/core").OutputEmitterRef<void>;
|
|
11
9
|
authenticating: boolean;
|
|
12
10
|
authenticated: boolean;
|
|
13
11
|
authenticatedUser?: AuthenticatedUser;
|
|
12
|
+
authenticatedChanged: EventEmitter<boolean>;
|
|
13
|
+
authenticatingChanged: EventEmitter<boolean>;
|
|
14
|
+
authenticationError: EventEmitter<any>;
|
|
14
15
|
get useSessionStorage(): boolean;
|
|
15
16
|
get storage(): Storage;
|
|
16
17
|
constructor(options: AuthenticationTokenServiceOptions);
|
|
@@ -441,12 +441,12 @@ class UserChooserComponent {
|
|
|
441
441
|
.join('\n') :
|
|
442
442
|
'';
|
|
443
443
|
}
|
|
444
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
445
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "
|
|
444
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.0", ngImport: i0, type: UserChooserComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
445
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.0.0", 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 id=\"dialog-title\">\r\n <h2 mat-dialog-title>{{ _data.title }}</h2>\r\n\r\n <div id=\"num-selected\">\r\n {{ selectedOptions.length }} selected\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>", 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}#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: "component", type: MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "directive", type: MatDialogActions, selector: "[mat-dialog-actions], mat-dialog-actions, [matDialogActions]", inputs: ["align"] }, { kind: "directive", type: MatDialogClose, selector: "[mat-dialog-close], [matDialogClose]", inputs: ["aria-label", "type", "mat-dialog-close", "matDialogClose"], exportAs: ["matDialogClose"] }, { kind: "directive", type: MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { kind: "component", type: MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "component", type: MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { 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", "checkboxPosition", "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", "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"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }] }); }
|
|
446
446
|
}
|
|
447
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
447
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.0", ngImport: i0, type: UserChooserComponent, decorators: [{
|
|
448
448
|
type: Component,
|
|
449
|
-
args: [{
|
|
449
|
+
args: [{ imports: [
|
|
450
450
|
MatButton,
|
|
451
451
|
MatDialogActions,
|
|
452
452
|
MatDialogClose,
|
|
@@ -595,12 +595,12 @@ class UserFormFieldComponent {
|
|
|
595
595
|
p.displayName?.toLowerCase() === (user.displayName ?? user.name).toLowerCase() ||
|
|
596
596
|
p.title?.toLowerCase() === (user.displayName ?? user.name).toLowerCase())?.encodedAbsUrl;
|
|
597
597
|
}
|
|
598
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
599
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "
|
|
598
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.0", ngImport: i0, type: UserFormFieldComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
599
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.0.0", type: UserFormFieldComponent, isStandalone: true, selector: "cp-user-field", inputs: { placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, clickable: { classPropertyName: "clickable", publicName: "clickable", isSignal: true, isRequired: false, transformFunction: null }, userChooserData: { classPropertyName: "userChooserData", publicName: "userChooserData", isSignal: true, isRequired: true, transformFunction: null } }, outputs: { usersSelected: "usersSelected", userUnSelected: "userUnSelected" }, ngImport: i0, template: "\n<!-- In Microsoft Edge, selectUser() never gets called if the input fields are disabled\nSo... I'm dynamically setting the disabled property based on whether or not the browser is Edge.\nIt's definitely a better experience if the field IS disabled.\nOtherwise, it's confusing - especially because Edge is SO SLOW to display the resulting dialog window.\n-->\n<!-- Update 8/24/2023:\nThe above problem also exists in Chrome now.\nSo instead of dynamically setting [disabled] based on browser type,\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/\n-->\n\n@if (users && photos) {\n <div (click)=\"selectUser()\" [class.clickable]=\"clickable()\">\n @if (accountNames?.length) {\n <div [ngClass]=\"class\">\n @for (accountName of accountNames; track accountName; let i = $index) {\n <div class=\"user\">\n <!--<img *ngIf=\"accountName && empUtils.getEmployee(accountName)\" alt=\"\" [src]=\"empUtils.getEmployee(accountName) | employeePhotoUrl:cacheService.photos\">-->\n @if (getPhoto(accountName)) {\n <img matListItemAvatar alt=\"\" [src]=\"getPhoto(accountName)\">\n }\n @if (getGroup(accountName)) {\n <mat-icon>group</mat-icon>\n }\n <mat-form-field>\n <!-- [disabled]=\"!isEdge\" -->\n <input matInput disabled [placeholder]=\"i === 0 ? placeholder() : ''\"\n [value]=\"getUser(accountName)?.displayName ?? getGroup(accountName)?.displayName ?? accountName\">\n <button matSuffix mat-icon-button aria-label=\"Clear\" (click)=\"$event.stopPropagation(); unSelectUser(accountName)\">\n <mat-icon fontIcon=\"close\"/>\n </button>\n </mat-form-field>\n </div>\n }\n </div>\n } @else {\n <mat-form-field>\n <input matInput disabled [placeholder]=\"placeholder()\"> <!-- [disabled]=\"!isEdge\" -->\n </mat-form-field>\n }\n </div>\n} @else {\n <mat-progress-bar mode=\"indeterminate\"/>\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]", exportAs: ["matButton"] }, { 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"] }] }); }
|
|
600
600
|
}
|
|
601
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
601
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.0", ngImport: i0, type: UserFormFieldComponent, decorators: [{
|
|
602
602
|
type: Component,
|
|
603
|
-
args: [{ selector: 'cp-user-field',
|
|
603
|
+
args: [{ selector: 'cp-user-field', imports: [
|
|
604
604
|
MatButton,
|
|
605
605
|
MatFormField,
|
|
606
606
|
MatIcon,
|
|
@@ -609,7 +609,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.0", ngImpor
|
|
|
609
609
|
MatProgressBar,
|
|
610
610
|
MatSuffix,
|
|
611
611
|
NgClass
|
|
612
|
-
], template: "\
|
|
612
|
+
], template: "\n<!-- In Microsoft Edge, selectUser() never gets called if the input fields are disabled\nSo... I'm dynamically setting the disabled property based on whether or not the browser is Edge.\nIt's definitely a better experience if the field IS disabled.\nOtherwise, it's confusing - especially because Edge is SO SLOW to display the resulting dialog window.\n-->\n<!-- Update 8/24/2023:\nThe above problem also exists in Chrome now.\nSo instead of dynamically setting [disabled] based on browser type,\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/\n-->\n\n@if (users && photos) {\n <div (click)=\"selectUser()\" [class.clickable]=\"clickable()\">\n @if (accountNames?.length) {\n <div [ngClass]=\"class\">\n @for (accountName of accountNames; track accountName; let i = $index) {\n <div class=\"user\">\n <!--<img *ngIf=\"accountName && empUtils.getEmployee(accountName)\" alt=\"\" [src]=\"empUtils.getEmployee(accountName) | employeePhotoUrl:cacheService.photos\">-->\n @if (getPhoto(accountName)) {\n <img matListItemAvatar alt=\"\" [src]=\"getPhoto(accountName)\">\n }\n @if (getGroup(accountName)) {\n <mat-icon>group</mat-icon>\n }\n <mat-form-field>\n <!-- [disabled]=\"!isEdge\" -->\n <input matInput disabled [placeholder]=\"i === 0 ? placeholder() : ''\"\n [value]=\"getUser(accountName)?.displayName ?? getGroup(accountName)?.displayName ?? accountName\">\n <button matSuffix mat-icon-button aria-label=\"Clear\" (click)=\"$event.stopPropagation(); unSelectUser(accountName)\">\n <mat-icon fontIcon=\"close\"/>\n </button>\n </mat-form-field>\n </div>\n }\n </div>\n } @else {\n <mat-form-field>\n <input matInput disabled [placeholder]=\"placeholder()\"> <!-- [disabled]=\"!isEdge\" -->\n </mat-form-field>\n }\n </div>\n} @else {\n <mat-progress-bar mode=\"indeterminate\"/>\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"] }]
|
|
613
613
|
}] });
|
|
614
614
|
|
|
615
615
|
class MatActiveDirectoryModule {
|
|
@@ -629,8 +629,8 @@ class MatActiveDirectoryModule {
|
|
|
629
629
|
throw new Error('MatActiveDirectoryModule is already loaded. Import it in the AppModule only');
|
|
630
630
|
}
|
|
631
631
|
}
|
|
632
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
633
|
-
static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "
|
|
632
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.0", ngImport: i0, type: MatActiveDirectoryModule, deps: [{ token: MatActiveDirectoryModule, optional: true, skipSelf: true }], target: i0.ɵɵFactoryTarget.NgModule }); }
|
|
633
|
+
static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "19.0.0", ngImport: i0, type: MatActiveDirectoryModule, imports: [CommonModule,
|
|
634
634
|
ReactiveFormsModule,
|
|
635
635
|
MatButtonModule,
|
|
636
636
|
MatDialogModule,
|
|
@@ -646,7 +646,7 @@ class MatActiveDirectoryModule {
|
|
|
646
646
|
UserChooserComponent,
|
|
647
647
|
UserFormFieldComponent], exports: [UserChooserComponent,
|
|
648
648
|
UserFormFieldComponent] }); }
|
|
649
|
-
static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "
|
|
649
|
+
static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "19.0.0", ngImport: i0, type: MatActiveDirectoryModule, imports: [CommonModule,
|
|
650
650
|
ReactiveFormsModule,
|
|
651
651
|
MatButtonModule,
|
|
652
652
|
MatDialogModule,
|
|
@@ -662,7 +662,7 @@ class MatActiveDirectoryModule {
|
|
|
662
662
|
UserChooserComponent,
|
|
663
663
|
UserFormFieldComponent] }); }
|
|
664
664
|
}
|
|
665
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
665
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.0", ngImport: i0, type: MatActiveDirectoryModule, decorators: [{
|
|
666
666
|
type: NgModule,
|
|
667
667
|
args: [{
|
|
668
668
|
declarations: [],
|
|
@@ -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 { Component, ElementRef, inject, OnInit, ViewChild, viewChild } from '@angular/core';\r\nimport { FormControl, FormGroup, ReactiveFormsModule } from '@angular/forms';\r\nimport { MAT_DIALOG_DATA, MatDialogActions, MatDialogClose, MatDialogContent, MatDialogRef } from '@angular/material/dialog';\r\nimport { MatListItemAvatar, MatListOption, MatSelectionList } from '@angular/material/list';\r\nimport { MatTableDataSource } from '@angular/material/table';\r\nimport { debounceTime, forkJoin, Observable, of } from 'rxjs';\r\n\r\nimport { ActiveDirectoryService } from '@cleavelandprice/ngx-lib/active-directory';\r\nimport { PhotoItem, SharePointService } from '@cleavelandprice/ngx-lib/sharepoint';\r\n\r\nimport { MatButton, MatIconButton } from '@angular/material/button';\r\nimport { MatFormField } from '@angular/material/form-field';\r\nimport { MatIcon } from '@angular/material/icon';\r\nimport { MatInput } from '@angular/material/input';\r\nimport { MatProgressSpinner } from '@angular/material/progress-spinner';\r\nimport { MatSlideToggle } from '@angular/material/slide-toggle';\r\nimport { MatTooltip } from '@angular/material/tooltip';\r\nimport { DefaultUserChooserData } from '../../model/default-user-chooser-data';\r\nimport { SelectableGroup } from '../../model/selectable-group';\r\nimport { SelectableUser } from '../../model/selectable-user';\r\nimport { UserChooserData } from '../../model/user-chooser-data';\r\nimport { UserChooserMode } from '../../model/user-chooser-mode';\r\n\r\n@Component({\r\n standalone: true,\r\n templateUrl: './user-chooser.component.html',\r\n imports: [\r\n MatButton,\r\n MatDialogActions,\r\n MatDialogClose,\r\n MatDialogContent,\r\n MatFormField,\r\n MatIcon,\r\n MatIconButton,\r\n MatInput,\r\n MatListItemAvatar,\r\n MatListOption,\r\n MatProgressSpinner,\r\n MatSelectionList,\r\n MatSlideToggle,\r\n MatTooltip,\r\n ReactiveFormsModule,\r\n ],\r\n styleUrls: [\r\n './user-chooser.component.scss',\r\n '../../../../../styles/mat-icon.scss'\r\n ]\r\n})\r\nexport class UserChooserComponent implements OnInit {\r\n #services = {\r\n dialogRef: inject(MatDialogRef<UserChooserComponent>),\r\n activeDirectory: inject(ActiveDirectoryService),\r\n sharePoint: inject(SharePointService),\r\n data: inject<UserChooserData>(MAT_DIALOG_DATA)\r\n };\r\n _data = {...DefaultUserChooserData, ...this.#services.data};\r\n \r\n //#region Fields\r\n \r\n //@ViewChild(MatSelectionList) selectionList?: MatSelectionList;\r\n selectionList = viewChild(MatSelectionList);\r\n\r\n @ViewChild('filterInput') set filterInput(elRef: ElementRef<HTMLInputElement>) {\r\n if (elRef) {\r\n elRef.nativeElement.focus();\r\n }\r\n };\r\n //filterInput = viewChild<ElementRef>('filterInput');\r\n\r\n filterForm = new FormGroup({\r\n filter: new FormControl()\r\n });\r\n\r\n dataSource?: MatTableDataSource<SelectableUser | SelectableGroup>;\r\n photos?: PhotoItem[];\r\n groups?: SelectableGroup[]; // May or may not get populated, depending on config data sent in\r\n //#endregion\r\n\r\n //#region Properties\r\n get isMultiMode(): boolean {\r\n return this._data.mode === UserChooserMode.Multiple;\r\n }\r\n\r\n get selectedOptions(): MatListOption[] {\r\n return this.selectionList()?.options.filter(o => o.selected) ?? [];\r\n }\r\n\r\n get selectedUsers(): (SelectableUser | SelectableGroup)[] {\r\n return this.dataSource?.data?.filter(d => d.selected) ?? [];\r\n }\r\n\r\n get filterValue(): string {\r\n return this.filterForm.value.filter;\r\n }\r\n\r\n get adGroupsNeeded(): boolean {\r\n // If any are these are true, then we need to pull AD groups for use later\r\n return (this._data.showGroupMembershipTooltips ?? false) ||\r\n (this._data.exclusions?.groups?.length ?? 0) > 0 ||\r\n (this._data.inclusions?.groups?.length ?? 0) > 0 ||\r\n (this._data.preSelections?.groups?.length ?? 0) > 0 ||\r\n this._data.filterOptions?.groupMembership ||\r\n (this._data.selectableGroupNames?.length ?? 0) > 0 ||\r\n (this._data.groups?.length ?? 0) > 0;\r\n }\r\n //#endregion\r\n\r\n //#region Lifecycle\r\n ngOnInit(): void {\r\n this.#getData();\r\n this.#listenForFilterChanges();\r\n }\r\n //#endregion\r\n\r\n //#region Events\r\n listSelectionChanged(options: MatListOption[]): void {\r\n if (this._data.mode === UserChooserMode.Single &&\r\n this.selectedOptions.length &&\r\n this._data.closeWhenSelectionMade\r\n ) {\r\n this.close();\r\n }\r\n }\r\n\r\n optionSelectionChanged(option: MatListOption): void {\r\n const user = this.dataSource?.data\r\n .find(u => u.sAMAccountName.toLocaleLowerCase() === (option.value as SelectableUser).sAMAccountName.toLowerCase());\r\n\r\n if (user) {\r\n // If we are in single user selection mode, deselect any existing selections first\r\n if (!this.isMultiMode && option.selected) {\r\n this.dataSource?.data\r\n .filter(u => u.sAMAccountName.toLowerCase() !== (option.value as SelectableUser).sAMAccountName.toLowerCase())\r\n .forEach(u => u.selected = false);\r\n }\r\n\r\n user.selected = option.selected;\r\n }\r\n }\r\n\r\n hideUnselectedChanged(selected: boolean): void {\r\n this.filterForm.get('filter')?.setValue(selected ? '{selected:true}' : null);\r\n }\r\n\r\n selectAll(): void {\r\n this.selectionList()?.selectAll();\r\n\r\n if (this.selectionList()?.options) {\r\n this.listSelectionChanged(this.selectionList()!.options.toArray());\r\n }\r\n }\r\n\r\n deselectAll(): void {\r\n this.selectionList()?.deselectAll();\r\n }\r\n //#endregion\r\n\r\n //#region Utilities\r\n isUser(userOrGroup: SelectableUser | SelectableGroup): boolean {\r\n return 'title' in userOrGroup;\r\n }\r\n castUser(userOrGroup: SelectableUser | SelectableGroup): SelectableUser {\r\n return userOrGroup as SelectableUser;\r\n }\r\n\r\n #getData(): void {\r\n const observables$: Observable<any>[] = [\r\n this._data.users?.length ?\r\n // Users were passed in\r\n of(this._data.users) :\r\n // Users need to be retrieved\r\n this.#services.activeDirectory.getUsers(false, this._data.includeDisabledUsers, this._data.parentOu),\r\n\r\n this._data.photos?.length ?\r\n // Photos were passed in\r\n of(this._data.photos) :\r\n // Photos need to be retrieved\r\n this.#services.sharePoint.getPhotos()\r\n ];\r\n\r\n // Do we need AD groups?\r\n if (this.adGroupsNeeded) {\r\n observables$.push(\r\n this._data.groups?.length ?\r\n // Groups were passed in\r\n of(this._data.groups) :\r\n // Groups need to be retrieved\r\n this.#services.activeDirectory.getGroups()\r\n );\r\n }\r\n\r\n forkJoin(observables$)\r\n //.subscribe(([users, photos]) => {\r\n .subscribe(data => {\r\n // Need groups in place before we handle exclusions/inclusions/pre-selections\r\n this.groups = this.adGroupsNeeded ?\r\n data[2] :\r\n null;\r\n\r\n let users = data[0] as SelectableUser[];\r\n users.forEach(u => u.selected = false); // In case existing data was re-used\r\n users = this.#includeUsersByAccountName(users);\r\n users = this.#includeUsersByGroupName(users);\r\n users = this.#includeUsersByDepartment(users);\r\n users = this.#includeUsersByTitle(users);\r\n\r\n users = this.#excludeUsersByAccountName(users);\r\n users = this.#excludeUsersByGroupName(users);\r\n users = this.#excludeUsersByDepartment(users);\r\n users = this.#excludeUsersByTitle(users);\r\n\r\n users = this.#preSelectUsersByAccountName(users);\r\n users = this.#preSelectUsersByGroupName(users);\r\n users = this.#preSelectUsersByDepartment(users);\r\n users = this.#preSelectUsersByTitle(users);\r\n\r\n this.#preSelectGroupsByAccountName();\r\n\r\n const usersAndGroups: (SelectableUser | SelectableGroup)[] = [];\r\n\r\n // Should we allow users to be selected?\r\n if (['users', '*'].includes(this._data.objectTypes!)) {\r\n usersAndGroups.push(...users);\r\n }\r\n\r\n // Should we allow groups to be selected\r\n\r\n if (['groups', '*'].includes(this._data.objectTypes!)) {\r\n if (this._data.selectableGroupNames?.length) {\r\n if (this._data.selectableGroupNames.includes('*')) {\r\n usersAndGroups.push(...this.groups!);\r\n } else {\r\n this._data.selectableGroupNames\r\n .forEach(groupName => {\r\n const group = this.groups!.find(g => g.displayName === groupName);\r\n \r\n if (group) {\r\n usersAndGroups.push({\r\n ...group,\r\n selected: group.selected\r\n });\r\n }\r\n });\r\n }\r\n }\r\n }\r\n\r\n this.dataSource = new MatTableDataSource(usersAndGroups);\r\n \r\n this.photos = data[1];\r\n\r\n this.#setFilterPredicate();\r\n });\r\n }\r\n\r\n close(): void {\r\n if (!this.selectedUsers?.length) {\r\n this.#services.dialogRef.close(this._data.allowCloseWithoutSelections ? [] : undefined);\r\n return;\r\n }\r\n const value = this.selectedUsers\r\n .map(u => this._data.returnUserObjects ? u : u.sAMAccountName);\r\n\r\n this.#services.dialogRef.close(this._data.mode === UserChooserMode.Multiple ?\r\n value :\r\n value[0]\r\n );\r\n }\r\n\r\n getPhoto(user: SelectableUser | SelectableGroup): string | undefined {\r\n if (!this.isUser(user)) { return; }\r\n\r\n return this.photos?.find(p =>\r\n (p.employeeNumber && p.employeeNumber.toString() === (user as SelectableUser).employeeNumber) ||\r\n p.accountName?.toLowerCase() === user.sAMAccountName.toLowerCase() ||\r\n p.displayName?.toLowerCase() === (user.displayName ?? user.name).toLowerCase() ||\r\n p.title?.toLowerCase() === (user.displayName ?? user.name).toLowerCase()\r\n )?.encodedAbsUrl;\r\n }\r\n\r\n //#region Exclusions - won't be included in the dataSource at all\r\n #excludeUsersByAccountName(users: SelectableUser[]): SelectableUser[] {\r\n this._data.exclusions?.accountNames\r\n ?.forEach(accountName => {\r\n const index = users.findIndex(u => u.sAMAccountName.toLowerCase() === accountName.toLowerCase());\r\n if (index === -1) { return; }\r\n\r\n users.splice(index, 1);\r\n });\r\n\r\n return users;\r\n }\r\n\r\n #excludeUsersByGroupName(users: SelectableUser[]): SelectableUser[] {\r\n this._data.exclusions?.groups\r\n ?.forEach(groupName => {\r\n const group = this.groups?.find(g => g.name.toLowerCase() === groupName.toLowerCase());\r\n if (!group) { return; }\r\n \r\n group.member.forEach(groupMemberDn => {\r\n const index = users.findIndex(u => u.distinguishedName === groupMemberDn);\r\n if (index === -1) { return; }\r\n\r\n users.splice(index, 1);\r\n });\r\n });\r\n\r\n return users;\r\n }\r\n\r\n #excludeUsersByDepartment(users: SelectableUser[]): SelectableUser[] {\r\n this._data.exclusions?.departments\r\n ?.forEach(department => {\r\n const excludedUsers = users.filter(u => u.department?.toLowerCase() === department.toLowerCase());\r\n\r\n excludedUsers.forEach(user => {\r\n const index = users.indexOf(user);\r\n users.splice(index, 1);\r\n });\r\n });\r\n\r\n return users;\r\n }\r\n\r\n #excludeUsersByTitle(users: SelectableUser[]): SelectableUser[] {\r\n this._data.exclusions?.titles\r\n ?.forEach(title => {\r\n const excludedUsers = users.filter(u => u.title?.toLowerCase() === title.toLowerCase());\r\n \r\n excludedUsers.forEach(user => {\r\n const index = users.indexOf(user);\r\n users.splice(index, 1);\r\n });\r\n });\r\n\r\n return users;\r\n }\r\n //#endregion\r\n\r\n //#region Inclusions - only these will be included in the dataSource\r\n #includeUsersByAccountName(users: SelectableUser[]): SelectableUser[] {\r\n return users.filter(user =>\r\n !this._data.inclusions?.accountNames?.length || // No account inclusions specified\r\n\r\n this._data.inclusions.accountNames.find(accountName =>\r\n accountName.toLowerCase() === user.sAMAccountName.toLowerCase()\r\n ));\r\n }\r\n\r\n #includeUsersByDepartment(users: SelectableUser[]): SelectableUser[] {\r\n return users.filter(user =>\r\n !this._data.inclusions?.departments?.length || // No department inclusions specified\r\n\r\n this._data.inclusions.departments.find(department =>\r\n department.toLowerCase() === user.department?.toLowerCase()\r\n ));\r\n }\r\n\r\n #includeUsersByTitle(users: SelectableUser[]): SelectableUser[] {\r\n return users.filter(user =>\r\n !this._data.inclusions?.titles?.length || // No title inclusions specified\r\n\r\n this._data.inclusions.titles.find(title =>\r\n title.toLowerCase() === user.title?.toLowerCase()\r\n ));\r\n }\r\n\r\n #includeUsersByGroupName(users: SelectableUser[]): SelectableUser[] {\r\n if (!this._data.inclusions?.groups?.length) {\r\n return users; // No group inclusions specified\r\n }\r\n\r\n // Cheating a bit and leveraging the 'selected' property to keep track of who should be included\r\n // Since inclusions happen befor pre-selections, we can do that, as long as we set 'selected' back to false when we're done\r\n this._data.inclusions.groups\r\n .forEach(groupName => {\r\n const group = this.groups?.find(g => g.name.toLowerCase() === groupName.toLowerCase());\r\n if (!group) { return; }\r\n\r\n users\r\n .filter(user =>\r\n group.member.find(groupMemberDn => groupMemberDn === user.distinguishedName)\r\n )\r\n .forEach(user => user.selected = true);\r\n });\r\n \r\n // At this point, all of the appropriate users should have 'selected' set to true\r\n const selectedUsers = users.filter(user => user.selected); // Subset of the original list\r\n // Reset 'selected' to false, and return\r\n selectedUsers.forEach(user => user.selected = false);\r\n return selectedUsers;\r\n }\r\n //#endregion\r\n\r\n //#region Pre-Selections\r\n #preSelectUsersByAccountName(users: SelectableUser[]): SelectableUser[] {\r\n this._data.preSelections?.accountNames\r\n ?.forEach(accountName => {\r\n const user = users.find(u => u.sAMAccountName.toLowerCase() === accountName.toLowerCase());\r\n if (!user) { return; }\r\n\r\n user.selected = true;\r\n });\r\n\r\n return users;\r\n }\r\n\r\n #preSelectGroupsByAccountName(): void {\r\n this._data.preSelections?.accountNames\r\n ?.forEach(accountName => {\r\n const group = this.groups?.find(g => g.sAMAccountName.toLowerCase() === accountName.toLowerCase());\r\n if (!group) { return; }\r\n\r\n group.selected = true;\r\n });;\r\n }\r\n\r\n #preSelectUsersByDepartment(users: SelectableUser[]): SelectableUser[] {\r\n this._data.preSelections?.departments\r\n ?.forEach(department =>\r\n users\r\n .filter(u => u.department?.toLowerCase() === department.toLowerCase())\r\n .forEach(user => user.selected = true)\r\n );\r\n\r\n return users;\r\n }\r\n\r\n #preSelectUsersByTitle(users: SelectableUser[]): SelectableUser[] {\r\n this._data.preSelections?.titles\r\n ?.forEach(title =>\r\n users\r\n .filter(u => u.title?.toLowerCase() === title.toLowerCase())\r\n .forEach(user => user.selected = true)\r\n );\r\n\r\n return users;\r\n }\r\n\r\n #preSelectUsersByGroupName(users: SelectableUser[]): SelectableUser[] {\r\n this._data.preSelections?.groups\r\n ?.forEach(groupName => {\r\n const group = this.groups?.find(g => g.name.toLowerCase() === groupName.toLowerCase());\r\n if (!group) { return; }\r\n\r\n group.member.forEach(groupMemberDn => {\r\n const user = users.find(u => u.distinguishedName === groupMemberDn);\r\n if (!user) { return; }\r\n\r\n user.selected = true;\r\n });\r\n });\r\n\r\n return users;\r\n }\r\n //#endregion\r\n \r\n #setFilterPredicate(): void {\r\n if (!this.dataSource) {\r\n return;\r\n }\r\n\r\n this.dataSource.filterPredicate = (user: (SelectableUser | SelectableGroup), filter: string) => {\r\n if (filter === '{selected:true}') {\r\n return user.selected;\r\n } else {\r\n const regex = new RegExp(filter, 'i'); // Case-insensitive\r\n let match = false; // The end result - whether or not a employee matches the filter\r\n\r\n const filterProperties = [ 'displayName' ];\r\n if (this._data.filterOptions?.accountName) {\r\n filterProperties.push('sAMAccountName')\r\n }\r\n if (this._data.filterOptions?.title) {\r\n filterProperties.push('title');\r\n }\r\n if (this._data.filterOptions?.department) {\r\n filterProperties.push('department');\r\n }\r\n if (this._data.filterOptions?.phoneNumber) {\r\n filterProperties.push('telephoneNumber');\r\n }\r\n \r\n // Match on the properties configured above\r\n filterProperties\r\n .forEach(field => {\r\n // @ts-ignore\r\n if (user[field] && user[field].match(regex)) {\r\n match = true;\r\n }\r\n });\r\n \r\n // Match on group membership (group name)\r\n if (this._data.filterOptions?.groupMembership) {\r\n user.memberOf.forEach(groupDn => {\r\n const group = this.groups?.find(group => group.distinguishedName === groupDn && group.name.match(regex));\r\n \r\n if (group) {\r\n match = true;\r\n }\r\n });\r\n }\r\n\r\n return match;\r\n }\r\n };\r\n }\r\n\r\n #listenForFilterChanges(): void {\r\n this.filterForm.get('filter')?.valueChanges\r\n .pipe(\r\n debounceTime(250)\r\n )\r\n .subscribe(() => this.dataSource!.filter = this.filterForm.value.filter?.trim().toLowerCase());\r\n }\r\n\r\n tooltip(user: SelectableUser | SelectableGroup): string {\r\n return this._data.showGroupMembershipTooltips ?\r\n user.memberOf\r\n .map(groupDn =>\r\n this.groups\r\n ?.find(group =>\r\n group.distinguishedName === groupDn\r\n )?.name\r\n )\r\n .sort((a, b) => a! > b! ? 1 : -1)\r\n .join('\\n') :\r\n '';\r\n }\r\n //#endregion\r\n}","<div id=\"dialog-title\">\r\n <h2 mat-dialog-title>{{ _data.title }}</h2>\r\n\r\n <div id=\"num-selected\">\r\n {{ selectedOptions.length }} selected\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 { Component, inject, input, OnInit, output } from '@angular/core';\r\nimport { MatDialog } from '@angular/material/dialog';\r\nimport { forkJoin, of } from 'rxjs';\r\n\r\nimport { ActiveDirectoryService, User, UserOrGroup } from '@cleavelandprice/ngx-lib/active-directory';\r\nimport { PhotoItem, SharePointService } from '@cleavelandprice/ngx-lib/sharepoint';\r\n\r\nimport { DefaultUserChooserData } from '../../model/default-user-chooser-data';\r\nimport { UserChooserData } from '../../model/user-chooser-data';\r\n\r\nimport { NgClass } from '@angular/common';\r\nimport { MatButton, MatIconButton } from '@angular/material/button';\r\nimport { MatFormField, MatSuffix } from '@angular/material/form-field';\r\nimport { MatIcon } from '@angular/material/icon';\r\nimport { MatInput } from '@angular/material/input';\r\nimport { MatProgressBar } from '@angular/material/progress-bar';\r\nimport { UserChooserMode } from '../../mat-active-directory.api';\r\nimport { UserChooserComponent } from '../user-chooser/user-chooser.component';\r\n\r\n@Component({\r\n selector: 'cp-user-field',\r\n standalone: true,\r\n imports: [\r\n MatButton,\r\n MatFormField,\r\n MatIcon,\r\n MatIconButton,\r\n MatInput,\r\n MatProgressBar,\r\n MatSuffix,\r\n NgClass\r\n ],\r\n templateUrl: './user-form-field.component.html',\r\n styleUrl: './user-form-field.component.scss'\r\n})\r\nexport class UserFormFieldComponent implements OnInit {\r\n //#region Fields\r\n #services = {\r\n dialog: inject(MatDialog),\r\n activeDirectory: inject(ActiveDirectoryService),\r\n sharePoint: inject(SharePointService)\r\n };\r\n usersSelected = output<string | string[] | UserOrGroup | UserOrGroup[]>(); // string for Single mode, string[] for multi\r\n userUnSelected = output<string>();\r\n placeholder = input('Select User(s)');\r\n clickable = input(true);\r\n userChooserData = input.required<UserChooserData>();\r\n _userChooserData!: UserChooserData;\r\n\r\n accountNames?: string[];\r\n\r\n users?: User[];\r\n groups?: UserOrGroup[];\r\n photos?: PhotoItem[];\r\n //#endregion\r\n\r\n //#region Properties\r\n /*get isEdge(): boolean {\r\n return window.navigator.userAgent.indexOf('Edge') > -1;\r\n }*/\r\n get class(): string {\r\n return this._userChooserData?.mode === UserChooserMode.Single ? '' :\r\n (this.accountNames?.length ?? 0) > 4 ? 'grid five' :\r\n (this.accountNames?.length ?? 0) > 3 ? 'grid four' :\r\n (this.accountNames?.length ?? 0) > 2 ? 'grid three' :\r\n (this.accountNames?.length ?? 0) > 1 ? 'grid two' :\r\n '';\r\n }\r\n //#endregion\r\n \r\n //#region Lifecycle\r\n ngOnInit(): void {\r\n this._userChooserData = {\r\n ...DefaultUserChooserData,\r\n ...this.userChooserData()\r\n }\r\n\r\n // If users have been pre-selected in the config, store those in accountNames, which drives the UI of this component\r\n this.accountNames = this._userChooserData.preSelections?.accountNames;\r\n\r\n this.#getData();\r\n }\r\n //#endregion\r\n\r\n //#region Events\r\n selectUser(): void {\r\n if (!this.clickable()) { return; }\r\n\r\n const data: UserChooserData = {\r\n ...this._userChooserData,\r\n\r\n users: this.users,\r\n photos: this.photos,\r\n };\r\n\r\n this.#services.dialog.open(UserChooserComponent, {\r\n data: data\r\n })\r\n .afterClosed()\r\n .subscribe((selected: string | string[] | UserOrGroup | UserOrGroup[]) => {\r\n if (!selected) { return; }\r\n \r\n this.accountNames = Array.isArray(selected) ?\r\n selected.map(s => typeof(s) === 'string' ? s : s.sAMAccountName) :\r\n [ selected ].map(s => typeof(s) === 'string' ? s : s.sAMAccountName);\r\n\r\n // Overwrite what may have been passed in, for subsequent launches of UserChooserComponent - otherwise it just keeps getting fed stale data\r\n if (this._userChooserData.preSelections) {\r\n this._userChooserData.preSelections.accountNames = this.accountNames;\r\n }\r\n\r\n this.usersSelected.emit(selected);\r\n });\r\n }\r\n\r\n unSelectUser(accountName: string): void {\r\n const index = this.accountNames?.findIndex(a => a === accountName);\r\n this.accountNames?.splice(index ?? -1, 1);\r\n\r\n if (this._userChooserData.preSelections) {\r\n this._userChooserData.preSelections.accountNames = this.accountNames;\r\n }\r\n\r\n this.userUnSelected.emit(accountName);\r\n }\r\n //#endregion\r\n\r\n //#region Utilities\r\n #getData(): void {\r\n forkJoin([\r\n this._userChooserData!.users ?\r\n // Users were passed in\r\n of(this._userChooserData!.users) :\r\n // Users need to be retrieved\r\n this.#services.activeDirectory.getUsers(false, this._userChooserData!.includeDisabledUsers, this._userChooserData!.parentOu),\r\n\r\n this._userChooserData!.groups ?\r\n // Groups were passed in\r\n of(this._userChooserData!.groups) :\r\n // Groups need to be retrieved\r\n this.#services.activeDirectory.getGroups(this._userChooserData!.parentOu),\r\n\r\n this._userChooserData!.photos ?\r\n // Photos were passed in\r\n of(this._userChooserData!.photos) :\r\n // Photos need to be retrieved\r\n this.#services.sharePoint.getPhotos()\r\n ])\r\n .subscribe(([users, groups, photos]) => {\r\n this.users = users;\r\n this.groups = groups;\r\n this.photos = photos;\r\n });\r\n }\r\n\r\n getUser(user: string | User | undefined): User | undefined {\r\n user = typeof(user) === 'string' ?\r\n this.users?.find(u => u.sAMAccountName.toLowerCase() === user?.toString().toLowerCase()) :\r\n user;\r\n\r\n return !user ? undefined :\r\n 'groupType' in user ? undefined : user;\r\n }\r\n\r\n getGroup(group: string | UserOrGroup | undefined): UserOrGroup | undefined {\r\n group = typeof(group) === 'string' ?\r\n this.groups?.find(g => g.sAMAccountName.toLowerCase() === group?.toString().toLowerCase()) :\r\n group;\r\n\r\n return !group ? undefined :\r\n 'groupType' in group ? group : undefined;\r\n }\r\n\r\n getPhoto(accountName: string): string | undefined {\r\n const user = this.getUser(accountName);\r\n if (!user) { return undefined; }\r\n\r\n return this.photos?.find(p =>\r\n (p.employeeNumber && p.employeeNumber.toString() === user.employeeNumber) ||\r\n p.accountName?.toLowerCase() === user.sAMAccountName.toLowerCase() ||\r\n p.displayName?.toLowerCase() === (user.displayName ?? user.name).toLowerCase() ||\r\n p.title?.toLowerCase() === (user.displayName ?? user.name).toLowerCase()\r\n )?.encodedAbsUrl;\r\n }\r\n //#endregion\r\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 && photos) {\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';\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 { MatListModule } from '@angular/material/list';\r\nimport { MatProgressBarModule } from '@angular/material/progress-bar';\r\nimport { MatProgressSpinnerModule } from '@angular/material/progress-spinner';\r\nimport { MatSlideToggleModule } from '@angular/material/slide-toggle';\r\nimport { MatTableModule } from '@angular/material/table';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\n\r\nimport { ActiveDirectoryServiceOptions, ActiveDirectoryServiceOptionsToken } from '@cleavelandprice/ngx-lib/active-directory';\r\n\r\nimport { UserChooserComponent } from './components/user-chooser/user-chooser.component';\r\nimport { UserFormFieldComponent } from './components/user-form-field/user-form-field.component';\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 MatListModule,\r\n MatProgressBarModule,\r\n MatProgressSpinnerModule,\r\n MatSlideToggleModule,\r\n MatTableModule,\r\n MatTooltipModule,\r\n\r\n UserChooserComponent,\r\n UserFormFieldComponent\r\n ],\r\n exports: [\r\n UserChooserComponent,\r\n UserFormFieldComponent\r\n ]\r\n})\r\nexport class MatActiveDirectoryModule {\r\n static forRoot(config: ActiveDirectoryServiceOptions): ModuleWithProviders<MatActiveDirectoryModule> {\r\n return {\r\n ngModule: MatActiveDirectoryModule,\r\n providers: [\r\n {\r\n provide: ActiveDirectoryServiceOptionsToken,\r\n useValue: config\r\n }\r\n ]\r\n };\r\n }\r\n\r\n constructor(@Optional() @SkipSelf() parentModule: MatActiveDirectoryModule) {\r\n if (parentModule) {\r\n throw new Error(\r\n 'MatActiveDirectoryModule 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-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, viewChild } from '@angular/core';\r\nimport { FormControl, FormGroup, ReactiveFormsModule } from '@angular/forms';\r\nimport { MAT_DIALOG_DATA, MatDialogActions, MatDialogClose, MatDialogContent, MatDialogRef } from '@angular/material/dialog';\r\nimport { MatListItemAvatar, MatListOption, MatSelectionList } from '@angular/material/list';\r\nimport { MatTableDataSource } from '@angular/material/table';\r\nimport { debounceTime, forkJoin, Observable, of } from 'rxjs';\r\n\r\nimport { ActiveDirectoryService } from '@cleavelandprice/ngx-lib/active-directory';\r\nimport { PhotoItem, SharePointService } from '@cleavelandprice/ngx-lib/sharepoint';\r\n\r\nimport { MatButton, MatIconButton } from '@angular/material/button';\r\nimport { MatFormField } from '@angular/material/form-field';\r\nimport { MatIcon } from '@angular/material/icon';\r\nimport { MatInput } from '@angular/material/input';\r\nimport { MatProgressSpinner } from '@angular/material/progress-spinner';\r\nimport { MatSlideToggle } from '@angular/material/slide-toggle';\r\nimport { MatTooltip } from '@angular/material/tooltip';\r\nimport { DefaultUserChooserData } from '../../model/default-user-chooser-data';\r\nimport { SelectableGroup } from '../../model/selectable-group';\r\nimport { SelectableUser } from '../../model/selectable-user';\r\nimport { UserChooserData } from '../../model/user-chooser-data';\r\nimport { UserChooserMode } from '../../model/user-chooser-mode';\r\n\r\n@Component({\n templateUrl: './user-chooser.component.html',\n imports: [\n MatButton,\n MatDialogActions,\n MatDialogClose,\n MatDialogContent,\n MatFormField,\n MatIcon,\n MatIconButton,\n MatInput,\n MatListItemAvatar,\n MatListOption,\n MatProgressSpinner,\n MatSelectionList,\n MatSlideToggle,\n MatTooltip,\n ReactiveFormsModule,\n ],\n styleUrls: [\n './user-chooser.component.scss',\n '../../../../../styles/mat-icon.scss'\n ]\n})\r\nexport class UserChooserComponent implements OnInit {\r\n #services = {\r\n dialogRef: inject(MatDialogRef<UserChooserComponent>),\r\n activeDirectory: inject(ActiveDirectoryService),\r\n sharePoint: inject(SharePointService),\r\n data: inject<UserChooserData>(MAT_DIALOG_DATA)\r\n };\r\n _data = {...DefaultUserChooserData, ...this.#services.data};\r\n \r\n //#region Fields\r\n \r\n //@ViewChild(MatSelectionList) selectionList?: MatSelectionList;\r\n selectionList = viewChild(MatSelectionList);\r\n\r\n @ViewChild('filterInput') set filterInput(elRef: ElementRef<HTMLInputElement>) {\r\n if (elRef) {\r\n elRef.nativeElement.focus();\r\n }\r\n };\r\n //filterInput = viewChild<ElementRef>('filterInput');\r\n\r\n filterForm = new FormGroup({\r\n filter: new FormControl()\r\n });\r\n\r\n dataSource?: MatTableDataSource<SelectableUser | SelectableGroup>;\r\n photos?: PhotoItem[];\r\n groups?: SelectableGroup[]; // May or may not get populated, depending on config data sent in\r\n //#endregion\r\n\r\n //#region Properties\r\n get isMultiMode(): boolean {\r\n return this._data.mode === UserChooserMode.Multiple;\r\n }\r\n\r\n get selectedOptions(): MatListOption[] {\r\n return this.selectionList()?.options.filter(o => o.selected) ?? [];\r\n }\r\n\r\n get selectedUsers(): (SelectableUser | SelectableGroup)[] {\r\n return this.dataSource?.data?.filter(d => d.selected) ?? [];\r\n }\r\n\r\n get filterValue(): string {\r\n return this.filterForm.value.filter;\r\n }\r\n\r\n get adGroupsNeeded(): boolean {\r\n // If any are these are true, then we need to pull AD groups for use later\r\n return (this._data.showGroupMembershipTooltips ?? false) ||\r\n (this._data.exclusions?.groups?.length ?? 0) > 0 ||\r\n (this._data.inclusions?.groups?.length ?? 0) > 0 ||\r\n (this._data.preSelections?.groups?.length ?? 0) > 0 ||\r\n this._data.filterOptions?.groupMembership ||\r\n (this._data.selectableGroupNames?.length ?? 0) > 0 ||\r\n (this._data.groups?.length ?? 0) > 0;\r\n }\r\n //#endregion\r\n\r\n //#region Lifecycle\r\n ngOnInit(): void {\r\n this.#getData();\r\n this.#listenForFilterChanges();\r\n }\r\n //#endregion\r\n\r\n //#region Events\r\n listSelectionChanged(options: MatListOption[]): void {\r\n if (this._data.mode === UserChooserMode.Single &&\r\n this.selectedOptions.length &&\r\n this._data.closeWhenSelectionMade\r\n ) {\r\n this.close();\r\n }\r\n }\r\n\r\n optionSelectionChanged(option: MatListOption): void {\r\n const user = this.dataSource?.data\r\n .find(u => u.sAMAccountName.toLocaleLowerCase() === (option.value as SelectableUser).sAMAccountName.toLowerCase());\r\n\r\n if (user) {\r\n // If we are in single user selection mode, deselect any existing selections first\r\n if (!this.isMultiMode && option.selected) {\r\n this.dataSource?.data\r\n .filter(u => u.sAMAccountName.toLowerCase() !== (option.value as SelectableUser).sAMAccountName.toLowerCase())\r\n .forEach(u => u.selected = false);\r\n }\r\n\r\n user.selected = option.selected;\r\n }\r\n }\r\n\r\n hideUnselectedChanged(selected: boolean): void {\r\n this.filterForm.get('filter')?.setValue(selected ? '{selected:true}' : null);\r\n }\r\n\r\n selectAll(): void {\r\n this.selectionList()?.selectAll();\r\n\r\n if (this.selectionList()?.options) {\r\n this.listSelectionChanged(this.selectionList()!.options.toArray());\r\n }\r\n }\r\n\r\n deselectAll(): void {\r\n this.selectionList()?.deselectAll();\r\n }\r\n //#endregion\r\n\r\n //#region Utilities\r\n isUser(userOrGroup: SelectableUser | SelectableGroup): boolean {\r\n return 'title' in userOrGroup;\r\n }\r\n castUser(userOrGroup: SelectableUser | SelectableGroup): SelectableUser {\r\n return userOrGroup as SelectableUser;\r\n }\r\n\r\n #getData(): void {\r\n const observables$: Observable<any>[] = [\r\n this._data.users?.length ?\r\n // Users were passed in\r\n of(this._data.users) :\r\n // Users need to be retrieved\r\n this.#services.activeDirectory.getUsers(false, this._data.includeDisabledUsers, this._data.parentOu),\r\n\r\n this._data.photos?.length ?\r\n // Photos were passed in\r\n of(this._data.photos) :\r\n // Photos need to be retrieved\r\n this.#services.sharePoint.getPhotos()\r\n ];\r\n\r\n // Do we need AD groups?\r\n if (this.adGroupsNeeded) {\r\n observables$.push(\r\n this._data.groups?.length ?\r\n // Groups were passed in\r\n of(this._data.groups) :\r\n // Groups need to be retrieved\r\n this.#services.activeDirectory.getGroups()\r\n );\r\n }\r\n\r\n forkJoin(observables$)\r\n //.subscribe(([users, photos]) => {\r\n .subscribe(data => {\r\n // Need groups in place before we handle exclusions/inclusions/pre-selections\r\n this.groups = this.adGroupsNeeded ?\r\n data[2] :\r\n null;\r\n\r\n let users = data[0] as SelectableUser[];\r\n users.forEach(u => u.selected = false); // In case existing data was re-used\r\n users = this.#includeUsersByAccountName(users);\r\n users = this.#includeUsersByGroupName(users);\r\n users = this.#includeUsersByDepartment(users);\r\n users = this.#includeUsersByTitle(users);\r\n\r\n users = this.#excludeUsersByAccountName(users);\r\n users = this.#excludeUsersByGroupName(users);\r\n users = this.#excludeUsersByDepartment(users);\r\n users = this.#excludeUsersByTitle(users);\r\n\r\n users = this.#preSelectUsersByAccountName(users);\r\n users = this.#preSelectUsersByGroupName(users);\r\n users = this.#preSelectUsersByDepartment(users);\r\n users = this.#preSelectUsersByTitle(users);\r\n\r\n this.#preSelectGroupsByAccountName();\r\n\r\n const usersAndGroups: (SelectableUser | SelectableGroup)[] = [];\r\n\r\n // Should we allow users to be selected?\r\n if (['users', '*'].includes(this._data.objectTypes!)) {\r\n usersAndGroups.push(...users);\r\n }\r\n\r\n // Should we allow groups to be selected\r\n\r\n if (['groups', '*'].includes(this._data.objectTypes!)) {\r\n if (this._data.selectableGroupNames?.length) {\r\n if (this._data.selectableGroupNames.includes('*')) {\r\n usersAndGroups.push(...this.groups!);\r\n } else {\r\n this._data.selectableGroupNames\r\n .forEach(groupName => {\r\n const group = this.groups!.find(g => g.displayName === groupName);\r\n \r\n if (group) {\r\n usersAndGroups.push({\r\n ...group,\r\n selected: group.selected\r\n });\r\n }\r\n });\r\n }\r\n }\r\n }\r\n\r\n this.dataSource = new MatTableDataSource(usersAndGroups);\r\n \r\n this.photos = data[1];\r\n\r\n this.#setFilterPredicate();\r\n });\r\n }\r\n\r\n close(): void {\r\n if (!this.selectedUsers?.length) {\r\n this.#services.dialogRef.close(this._data.allowCloseWithoutSelections ? [] : undefined);\r\n return;\r\n }\r\n const value = this.selectedUsers\r\n .map(u => this._data.returnUserObjects ? u : u.sAMAccountName);\r\n\r\n this.#services.dialogRef.close(this._data.mode === UserChooserMode.Multiple ?\r\n value :\r\n value[0]\r\n );\r\n }\r\n\r\n getPhoto(user: SelectableUser | SelectableGroup): string | undefined {\r\n if (!this.isUser(user)) { return; }\r\n\r\n return this.photos?.find(p =>\r\n (p.employeeNumber && p.employeeNumber.toString() === (user as SelectableUser).employeeNumber) ||\r\n p.accountName?.toLowerCase() === user.sAMAccountName.toLowerCase() ||\r\n p.displayName?.toLowerCase() === (user.displayName ?? user.name).toLowerCase() ||\r\n p.title?.toLowerCase() === (user.displayName ?? user.name).toLowerCase()\r\n )?.encodedAbsUrl;\r\n }\r\n\r\n //#region Exclusions - won't be included in the dataSource at all\r\n #excludeUsersByAccountName(users: SelectableUser[]): SelectableUser[] {\r\n this._data.exclusions?.accountNames\r\n ?.forEach(accountName => {\r\n const index = users.findIndex(u => u.sAMAccountName.toLowerCase() === accountName.toLowerCase());\r\n if (index === -1) { return; }\r\n\r\n users.splice(index, 1);\r\n });\r\n\r\n return users;\r\n }\r\n\r\n #excludeUsersByGroupName(users: SelectableUser[]): SelectableUser[] {\r\n this._data.exclusions?.groups\r\n ?.forEach(groupName => {\r\n const group = this.groups?.find(g => g.name.toLowerCase() === groupName.toLowerCase());\r\n if (!group) { return; }\r\n \r\n group.member.forEach(groupMemberDn => {\r\n const index = users.findIndex(u => u.distinguishedName === groupMemberDn);\r\n if (index === -1) { return; }\r\n\r\n users.splice(index, 1);\r\n });\r\n });\r\n\r\n return users;\r\n }\r\n\r\n #excludeUsersByDepartment(users: SelectableUser[]): SelectableUser[] {\r\n this._data.exclusions?.departments\r\n ?.forEach(department => {\r\n const excludedUsers = users.filter(u => u.department?.toLowerCase() === department.toLowerCase());\r\n\r\n excludedUsers.forEach(user => {\r\n const index = users.indexOf(user);\r\n users.splice(index, 1);\r\n });\r\n });\r\n\r\n return users;\r\n }\r\n\r\n #excludeUsersByTitle(users: SelectableUser[]): SelectableUser[] {\r\n this._data.exclusions?.titles\r\n ?.forEach(title => {\r\n const excludedUsers = users.filter(u => u.title?.toLowerCase() === title.toLowerCase());\r\n \r\n excludedUsers.forEach(user => {\r\n const index = users.indexOf(user);\r\n users.splice(index, 1);\r\n });\r\n });\r\n\r\n return users;\r\n }\r\n //#endregion\r\n\r\n //#region Inclusions - only these will be included in the dataSource\r\n #includeUsersByAccountName(users: SelectableUser[]): SelectableUser[] {\r\n return users.filter(user =>\r\n !this._data.inclusions?.accountNames?.length || // No account inclusions specified\r\n\r\n this._data.inclusions.accountNames.find(accountName =>\r\n accountName.toLowerCase() === user.sAMAccountName.toLowerCase()\r\n ));\r\n }\r\n\r\n #includeUsersByDepartment(users: SelectableUser[]): SelectableUser[] {\r\n return users.filter(user =>\r\n !this._data.inclusions?.departments?.length || // No department inclusions specified\r\n\r\n this._data.inclusions.departments.find(department =>\r\n department.toLowerCase() === user.department?.toLowerCase()\r\n ));\r\n }\r\n\r\n #includeUsersByTitle(users: SelectableUser[]): SelectableUser[] {\r\n return users.filter(user =>\r\n !this._data.inclusions?.titles?.length || // No title inclusions specified\r\n\r\n this._data.inclusions.titles.find(title =>\r\n title.toLowerCase() === user.title?.toLowerCase()\r\n ));\r\n }\r\n\r\n #includeUsersByGroupName(users: SelectableUser[]): SelectableUser[] {\r\n if (!this._data.inclusions?.groups?.length) {\r\n return users; // No group inclusions specified\r\n }\r\n\r\n // Cheating a bit and leveraging the 'selected' property to keep track of who should be included\r\n // Since inclusions happen befor pre-selections, we can do that, as long as we set 'selected' back to false when we're done\r\n this._data.inclusions.groups\r\n .forEach(groupName => {\r\n const group = this.groups?.find(g => g.name.toLowerCase() === groupName.toLowerCase());\r\n if (!group) { return; }\r\n\r\n users\r\n .filter(user =>\r\n group.member.find(groupMemberDn => groupMemberDn === user.distinguishedName)\r\n )\r\n .forEach(user => user.selected = true);\r\n });\r\n \r\n // At this point, all of the appropriate users should have 'selected' set to true\r\n const selectedUsers = users.filter(user => user.selected); // Subset of the original list\r\n // Reset 'selected' to false, and return\r\n selectedUsers.forEach(user => user.selected = false);\r\n return selectedUsers;\r\n }\r\n //#endregion\r\n\r\n //#region Pre-Selections\r\n #preSelectUsersByAccountName(users: SelectableUser[]): SelectableUser[] {\r\n this._data.preSelections?.accountNames\r\n ?.forEach(accountName => {\r\n const user = users.find(u => u.sAMAccountName.toLowerCase() === accountName.toLowerCase());\r\n if (!user) { return; }\r\n\r\n user.selected = true;\r\n });\r\n\r\n return users;\r\n }\r\n\r\n #preSelectGroupsByAccountName(): void {\r\n this._data.preSelections?.accountNames\r\n ?.forEach(accountName => {\r\n const group = this.groups?.find(g => g.sAMAccountName.toLowerCase() === accountName.toLowerCase());\r\n if (!group) { return; }\r\n\r\n group.selected = true;\r\n });;\r\n }\r\n\r\n #preSelectUsersByDepartment(users: SelectableUser[]): SelectableUser[] {\r\n this._data.preSelections?.departments\r\n ?.forEach(department =>\r\n users\r\n .filter(u => u.department?.toLowerCase() === department.toLowerCase())\r\n .forEach(user => user.selected = true)\r\n );\r\n\r\n return users;\r\n }\r\n\r\n #preSelectUsersByTitle(users: SelectableUser[]): SelectableUser[] {\r\n this._data.preSelections?.titles\r\n ?.forEach(title =>\r\n users\r\n .filter(u => u.title?.toLowerCase() === title.toLowerCase())\r\n .forEach(user => user.selected = true)\r\n );\r\n\r\n return users;\r\n }\r\n\r\n #preSelectUsersByGroupName(users: SelectableUser[]): SelectableUser[] {\r\n this._data.preSelections?.groups\r\n ?.forEach(groupName => {\r\n const group = this.groups?.find(g => g.name.toLowerCase() === groupName.toLowerCase());\r\n if (!group) { return; }\r\n\r\n group.member.forEach(groupMemberDn => {\r\n const user = users.find(u => u.distinguishedName === groupMemberDn);\r\n if (!user) { return; }\r\n\r\n user.selected = true;\r\n });\r\n });\r\n\r\n return users;\r\n }\r\n //#endregion\r\n \r\n #setFilterPredicate(): void {\r\n if (!this.dataSource) {\r\n return;\r\n }\r\n\r\n this.dataSource.filterPredicate = (user: (SelectableUser | SelectableGroup), filter: string) => {\r\n if (filter === '{selected:true}') {\r\n return user.selected;\r\n } else {\r\n const regex = new RegExp(filter, 'i'); // Case-insensitive\r\n let match = false; // The end result - whether or not a employee matches the filter\r\n\r\n const filterProperties = [ 'displayName' ];\r\n if (this._data.filterOptions?.accountName) {\r\n filterProperties.push('sAMAccountName')\r\n }\r\n if (this._data.filterOptions?.title) {\r\n filterProperties.push('title');\r\n }\r\n if (this._data.filterOptions?.department) {\r\n filterProperties.push('department');\r\n }\r\n if (this._data.filterOptions?.phoneNumber) {\r\n filterProperties.push('telephoneNumber');\r\n }\r\n \r\n // Match on the properties configured above\r\n filterProperties\r\n .forEach(field => {\r\n // @ts-ignore\r\n if (user[field] && user[field].match(regex)) {\r\n match = true;\r\n }\r\n });\r\n \r\n // Match on group membership (group name)\r\n if (this._data.filterOptions?.groupMembership) {\r\n user.memberOf.forEach(groupDn => {\r\n const group = this.groups?.find(group => group.distinguishedName === groupDn && group.name.match(regex));\r\n \r\n if (group) {\r\n match = true;\r\n }\r\n });\r\n }\r\n\r\n return match;\r\n }\r\n };\r\n }\r\n\r\n #listenForFilterChanges(): void {\r\n this.filterForm.get('filter')?.valueChanges\r\n .pipe(\r\n debounceTime(250)\r\n )\r\n .subscribe(() => this.dataSource!.filter = this.filterForm.value.filter?.trim().toLowerCase());\r\n }\r\n\r\n tooltip(user: SelectableUser | SelectableGroup): string {\r\n return this._data.showGroupMembershipTooltips ?\r\n user.memberOf\r\n .map(groupDn =>\r\n this.groups\r\n ?.find(group =>\r\n group.distinguishedName === groupDn\r\n )?.name\r\n )\r\n .sort((a, b) => a! > b! ? 1 : -1)\r\n .join('\\n') :\r\n '';\r\n }\r\n //#endregion\r\n}","<div id=\"dialog-title\">\r\n <h2 mat-dialog-title>{{ _data.title }}</h2>\r\n\r\n <div id=\"num-selected\">\r\n {{ selectedOptions.length }} selected\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 { Component, inject, input, OnInit, output } from '@angular/core';\r\nimport { MatDialog } from '@angular/material/dialog';\r\nimport { forkJoin, of } from 'rxjs';\r\n\r\nimport { ActiveDirectoryService, User, UserOrGroup } from '@cleavelandprice/ngx-lib/active-directory';\r\nimport { PhotoItem, SharePointService } from '@cleavelandprice/ngx-lib/sharepoint';\r\n\r\nimport { DefaultUserChooserData } from '../../model/default-user-chooser-data';\r\nimport { UserChooserData } from '../../model/user-chooser-data';\r\n\r\nimport { NgClass } from '@angular/common';\r\nimport { MatButton, MatIconButton } from '@angular/material/button';\r\nimport { MatFormField, MatSuffix } from '@angular/material/form-field';\r\nimport { MatIcon } from '@angular/material/icon';\r\nimport { MatInput } from '@angular/material/input';\r\nimport { MatProgressBar } from '@angular/material/progress-bar';\r\nimport { UserChooserMode } from '../../mat-active-directory.api';\r\nimport { UserChooserComponent } from '../user-chooser/user-chooser.component';\r\n\r\n@Component({\n selector: 'cp-user-field',\n imports: [\n MatButton,\n MatFormField,\n MatIcon,\n MatIconButton,\n MatInput,\n MatProgressBar,\n MatSuffix,\n NgClass\n ],\n templateUrl: './user-form-field.component.html',\n styleUrl: './user-form-field.component.scss'\n})\r\nexport class UserFormFieldComponent implements OnInit {\r\n //#region Fields\r\n #services = {\r\n dialog: inject(MatDialog),\r\n activeDirectory: inject(ActiveDirectoryService),\r\n sharePoint: inject(SharePointService)\r\n };\r\n usersSelected = output<string | string[] | UserOrGroup | UserOrGroup[]>(); // string for Single mode, string[] for multi\r\n userUnSelected = output<string>();\r\n placeholder = input('Select User(s)');\r\n clickable = input(true);\r\n userChooserData = input.required<UserChooserData>();\r\n _userChooserData!: UserChooserData;\r\n\r\n accountNames?: string[];\r\n\r\n users?: User[];\r\n groups?: UserOrGroup[];\r\n photos?: PhotoItem[];\r\n //#endregion\r\n\r\n //#region Properties\r\n /*get isEdge(): boolean {\r\n return window.navigator.userAgent.indexOf('Edge') > -1;\r\n }*/\r\n get class(): string {\r\n return this._userChooserData?.mode === UserChooserMode.Single ? '' :\r\n (this.accountNames?.length ?? 0) > 4 ? 'grid five' :\r\n (this.accountNames?.length ?? 0) > 3 ? 'grid four' :\r\n (this.accountNames?.length ?? 0) > 2 ? 'grid three' :\r\n (this.accountNames?.length ?? 0) > 1 ? 'grid two' :\r\n '';\r\n }\r\n //#endregion\r\n \r\n //#region Lifecycle\r\n ngOnInit(): void {\r\n this._userChooserData = {\r\n ...DefaultUserChooserData,\r\n ...this.userChooserData()\r\n }\r\n\r\n // If users have been pre-selected in the config, store those in accountNames, which drives the UI of this component\r\n this.accountNames = this._userChooserData.preSelections?.accountNames;\r\n\r\n this.#getData();\r\n }\r\n //#endregion\r\n\r\n //#region Events\r\n selectUser(): void {\r\n if (!this.clickable()) { return; }\r\n\r\n const data: UserChooserData = {\r\n ...this._userChooserData,\r\n\r\n users: this.users,\r\n photos: this.photos,\r\n };\r\n\r\n this.#services.dialog.open(UserChooserComponent, {\r\n data: data\r\n })\r\n .afterClosed()\r\n .subscribe((selected: string | string[] | UserOrGroup | UserOrGroup[]) => {\r\n if (!selected) { return; }\r\n \r\n this.accountNames = Array.isArray(selected) ?\r\n selected.map(s => typeof(s) === 'string' ? s : s.sAMAccountName) :\r\n [ selected ].map(s => typeof(s) === 'string' ? s : s.sAMAccountName);\r\n\r\n // Overwrite what may have been passed in, for subsequent launches of UserChooserComponent - otherwise it just keeps getting fed stale data\r\n if (this._userChooserData.preSelections) {\r\n this._userChooserData.preSelections.accountNames = this.accountNames;\r\n }\r\n\r\n this.usersSelected.emit(selected);\r\n });\r\n }\r\n\r\n unSelectUser(accountName: string): void {\r\n const index = this.accountNames?.findIndex(a => a === accountName);\r\n this.accountNames?.splice(index ?? -1, 1);\r\n\r\n if (this._userChooserData.preSelections) {\r\n this._userChooserData.preSelections.accountNames = this.accountNames;\r\n }\r\n\r\n this.userUnSelected.emit(accountName);\r\n }\r\n //#endregion\r\n\r\n //#region Utilities\r\n #getData(): void {\r\n forkJoin([\r\n this._userChooserData!.users ?\r\n // Users were passed in\r\n of(this._userChooserData!.users) :\r\n // Users need to be retrieved\r\n this.#services.activeDirectory.getUsers(false, this._userChooserData!.includeDisabledUsers, this._userChooserData!.parentOu),\r\n\r\n this._userChooserData!.groups ?\r\n // Groups were passed in\r\n of(this._userChooserData!.groups) :\r\n // Groups need to be retrieved\r\n this.#services.activeDirectory.getGroups(this._userChooserData!.parentOu),\r\n\r\n this._userChooserData!.photos ?\r\n // Photos were passed in\r\n of(this._userChooserData!.photos) :\r\n // Photos need to be retrieved\r\n this.#services.sharePoint.getPhotos()\r\n ])\r\n .subscribe(([users, groups, photos]) => {\r\n this.users = users;\r\n this.groups = groups;\r\n this.photos = photos;\r\n });\r\n }\r\n\r\n getUser(user: string | User | undefined): User | undefined {\r\n user = typeof(user) === 'string' ?\r\n this.users?.find(u => u.sAMAccountName.toLowerCase() === user?.toString().toLowerCase()) :\r\n user;\r\n\r\n return !user ? undefined :\r\n 'groupType' in user ? undefined : user;\r\n }\r\n\r\n getGroup(group: string | UserOrGroup | undefined): UserOrGroup | undefined {\r\n group = typeof(group) === 'string' ?\r\n this.groups?.find(g => g.sAMAccountName.toLowerCase() === group?.toString().toLowerCase()) :\r\n group;\r\n\r\n return !group ? undefined :\r\n 'groupType' in group ? group : undefined;\r\n }\r\n\r\n getPhoto(accountName: string): string | undefined {\r\n const user = this.getUser(accountName);\r\n if (!user) { return undefined; }\r\n\r\n return this.photos?.find(p =>\r\n (p.employeeNumber && p.employeeNumber.toString() === user.employeeNumber) ||\r\n p.accountName?.toLowerCase() === user.sAMAccountName.toLowerCase() ||\r\n p.displayName?.toLowerCase() === (user.displayName ?? user.name).toLowerCase() ||\r\n p.title?.toLowerCase() === (user.displayName ?? user.name).toLowerCase()\r\n )?.encodedAbsUrl;\r\n }\r\n //#endregion\r\n}","\n<!-- In Microsoft Edge, selectUser() never gets called if the input fields are disabled\nSo... I'm dynamically setting the disabled property based on whether or not the browser is Edge.\nIt's definitely a better experience if the field IS disabled.\nOtherwise, it's confusing - especially because Edge is SO SLOW to display the resulting dialog window.\n-->\n<!-- Update 8/24/2023:\nThe above problem also exists in Chrome now.\nSo instead of dynamically setting [disabled] based on browser type,\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/\n-->\n\n@if (users && photos) {\n <div (click)=\"selectUser()\" [class.clickable]=\"clickable()\">\n @if (accountNames?.length) {\n <div [ngClass]=\"class\">\n @for (accountName of accountNames; track accountName; let i = $index) {\n <div class=\"user\">\n <!--<img *ngIf=\"accountName && empUtils.getEmployee(accountName)\" alt=\"\" [src]=\"empUtils.getEmployee(accountName) | employeePhotoUrl:cacheService.photos\">-->\n @if (getPhoto(accountName)) {\n <img matListItemAvatar alt=\"\" [src]=\"getPhoto(accountName)\">\n }\n @if (getGroup(accountName)) {\n <mat-icon>group</mat-icon>\n }\n <mat-form-field>\n <!-- [disabled]=\"!isEdge\" -->\n <input matInput disabled [placeholder]=\"i === 0 ? placeholder() : ''\"\n [value]=\"getUser(accountName)?.displayName ?? getGroup(accountName)?.displayName ?? accountName\">\n <button matSuffix mat-icon-button aria-label=\"Clear\" (click)=\"$event.stopPropagation(); unSelectUser(accountName)\">\n <mat-icon fontIcon=\"close\"/>\n </button>\n </mat-form-field>\n </div>\n }\n </div>\n } @else {\n <mat-form-field>\n <input matInput disabled [placeholder]=\"placeholder()\"> <!-- [disabled]=\"!isEdge\" -->\n </mat-form-field>\n }\n </div>\n} @else {\n <mat-progress-bar mode=\"indeterminate\"/>\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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"}
|