@cleavelandprice/ngx-lib 4.6.0 → 4.6.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.
@@ -1,9 +1,9 @@
1
1
  import { ActiveDirectoryService, ActiveDirectoryServiceOptionsToken } from '@cleavelandprice/ngx-lib/active-directory';
2
2
  export * from '@cleavelandprice/ngx-lib/active-directory';
3
3
  import * as i0 from '@angular/core';
4
- import { inject, viewChild, ViewChild, Component, output, input, Optional, SkipSelf, NgModule } from '@angular/core';
4
+ import { inject, viewChild, ViewChild, Component, output, input, forwardRef, Optional, SkipSelf, NgModule } from '@angular/core';
5
5
  import * as i1 from '@angular/forms';
6
- import { FormGroup, FormControl, ReactiveFormsModule } from '@angular/forms';
6
+ import { FormGroup, FormControl, ReactiveFormsModule, NG_VALUE_ACCESSOR } from '@angular/forms';
7
7
  import { MAT_DIALOG_DATA, MatDialogRef, MatDialogActions, MatDialogClose, MatDialogContent, MatDialog, MatDialogModule } from '@angular/material/dialog';
8
8
  import { MatSelectionList, MatListItemAvatar, MatListOption, MatListModule } from '@angular/material/list';
9
9
  import { MatTableDataSource, MatTableModule } from '@angular/material/table';
@@ -441,10 +441,10 @@ class UserChooserComponent {
441
441
  .join('\n') :
442
442
  '';
443
443
  }
444
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.0", ngImport: i0, type: UserChooserComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
445
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.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[matButton], a[matButton], button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button], a[mat-button], a[mat-raised-button], a[mat-flat-button], a[mat-stroked-button] ", inputs: ["matButton"], exportAs: ["matButton", "matAnchor"] }, { kind: "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], a[mat-icon-button], button[matIconButton], a[matIconButton]", exportAs: ["matButton", "matAnchor"] }, { kind: "directive", type: MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly", "disabledInteractive"], exportAs: ["matInput"] }, { kind: "directive", type: MatListItemAvatar, selector: "[matListItemAvatar]" }, { kind: "component", type: MatListOption, selector: "mat-list-option", inputs: ["togglePosition", "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],[formArray],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"] }] }); }
444
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.1", ngImport: i0, type: UserChooserComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
445
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.1", type: UserChooserComponent, isStandalone: true, selector: "ng-component", viewQueries: [{ propertyName: "selectionList", first: true, predicate: MatSelectionList, descendants: true, isSignal: true }, { propertyName: "filterInput", first: true, predicate: ["filterInput"], descendants: true }], ngImport: i0, template: "<div 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[matButton], a[matButton], button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button], a[mat-button], a[mat-raised-button], a[mat-flat-button], a[mat-stroked-button] ", inputs: ["matButton"], exportAs: ["matButton", "matAnchor"] }, { kind: "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], a[mat-icon-button], button[matIconButton], a[matIconButton]", exportAs: ["matButton", "matAnchor"] }, { kind: "directive", type: MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly", "disabledInteractive"], exportAs: ["matInput"] }, { kind: "directive", type: MatListItemAvatar, selector: "[matListItemAvatar]" }, { kind: "component", type: MatListOption, selector: "mat-list-option", inputs: ["togglePosition", "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],[formArray],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: "21.0.0", ngImport: i0, type: UserChooserComponent, decorators: [{
447
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.1", ngImport: i0, type: UserChooserComponent, decorators: [{
448
448
  type: Component,
449
449
  args: [{ imports: [
450
450
  MatButton,
@@ -481,10 +481,13 @@ class UserFormFieldComponent {
481
481
  this.placeholder = input('Select User(s)', ...(ngDevMode ? [{ debugName: "placeholder" }] : []));
482
482
  this.clickable = input(true, ...(ngDevMode ? [{ debugName: "clickable" }] : []));
483
483
  this.userChooserData = input.required(...(ngDevMode ? [{ debugName: "userChooserData" }] : []));
484
+ this.onChange = (_) => { }; // Invoked when the model has been changed
485
+ this.onTouched = () => { }; // Invoked when the model has been touched
484
486
  }
485
487
  //#region Fields
486
488
  #services;
487
489
  //#endregion
490
+ //#endregion
488
491
  //#region Properties
489
492
  /*get isEdge(): boolean {
490
493
  return window.navigator.userAgent.indexOf('Edge') > -1;
@@ -595,13 +598,36 @@ class UserFormFieldComponent {
595
598
  p.displayName?.toLowerCase() === (user.displayName ?? user.name).toLowerCase() ||
596
599
  p.title?.toLowerCase() === (user.displayName ?? user.name).toLowerCase())?.encodedAbsUrl;
597
600
  }
598
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.0", ngImport: i0, type: UserFormFieldComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
599
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.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], a[mat-icon-button], button[matIconButton], a[matIconButton]", exportAs: ["matButton", "matAnchor"] }, { kind: "directive", type: MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly", "disabledInteractive"], exportAs: ["matInput"] }, { kind: "component", type: MatProgressBar, selector: "mat-progress-bar", inputs: ["color", "value", "bufferValue", "mode"], outputs: ["animationEnd"], exportAs: ["matProgressBar"] }, { kind: "directive", type: MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }] }); }
601
+ //#endregion
602
+ //#region ControlValueAccessor methods
603
+ // Method that is invoked on an update of a model.
604
+ updateChanges() {
605
+ this.onChange(this.value);
606
+ }
607
+ //#region ControlValueAccessor Overrides
608
+ // Writes a new item to the element.
609
+ writeValue(value) {
610
+ this.value = value;
611
+ this.updateChanges();
612
+ }
613
+ // Registers a callback function that should be called when the control's value changes in the UI.
614
+ registerOnChange(fn) {
615
+ this.onChange = fn;
616
+ }
617
+ // Registers a callback function that should be called when the control receives a blur event.
618
+ registerOnTouched(fn) {
619
+ this.onTouched = fn;
620
+ }
621
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.1", ngImport: i0, type: UserFormFieldComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
622
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.1", 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" }, providers: [{
623
+ provide: NG_VALUE_ACCESSOR,
624
+ useExisting: forwardRef(() => UserFormFieldComponent),
625
+ multi: true
626
+ }], ngImport: i0, template: "\r\n<!-- In Microsoft Edge, selectUser() never gets called if the input fields are disabled\r\nSo... I'm dynamically setting the disabled property based on whether or not the browser is Edge.\r\nIt's definitely a better experience if the field IS disabled.\r\nOtherwise, it's confusing - especially because Edge is SO SLOW to display the resulting dialog window.\r\n-->\r\n<!-- Update 8/24/2023:\r\nThe above problem also exists in Chrome now.\r\nSo instead of dynamically setting [disabled] based on browser type,\r\nI'm applying CSS to suppress mouse events on the input - thus making it bubble up to the parent control, which responds the way we want/\r\n-->\r\n\r\n@if (users && 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}", styles: [".user{display:grid;grid-template-columns:auto 1fr;grid-gap:.5em;align-items:center}.clickable,.clickable input{cursor:pointer!important}img{width:2em;height:2em;border-radius:100%}@media(min-width:801px){.grid{display:grid;grid-template-columns:repeat(2,1fr);grid-gap:1em}.three{grid-template-columns:repeat(3,1fr)}.four{grid-template-columns:repeat(4,1fr)}.five{grid-template-columns:repeat(5,1fr)}::ng-deep .grid mat-form-field{width:15vw}}input[disabled]{pointer-events:none}\n"], dependencies: [{ kind: "component", type: MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "component", type: MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: MatIconButton, selector: "button[mat-icon-button], a[mat-icon-button], button[matIconButton], a[matIconButton]", exportAs: ["matButton", "matAnchor"] }, { kind: "directive", type: MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly", "disabledInteractive"], exportAs: ["matInput"] }, { kind: "component", type: MatProgressBar, selector: "mat-progress-bar", inputs: ["color", "value", "bufferValue", "mode"], outputs: ["animationEnd"], exportAs: ["matProgressBar"] }, { kind: "directive", type: MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }] }); }
600
627
  }
601
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.0", ngImport: i0, type: UserFormFieldComponent, decorators: [{
628
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.1", ngImport: i0, type: UserFormFieldComponent, decorators: [{
602
629
  type: Component,
603
630
  args: [{ selector: 'cp-user-field', imports: [
604
- MatButton,
605
631
  MatFormField,
606
632
  MatIcon,
607
633
  MatIconButton,
@@ -609,7 +635,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.0", ngImpor
609
635
  MatProgressBar,
610
636
  MatSuffix,
611
637
  NgClass
612
- ], standalone: true, 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"] }]
638
+ ], providers: [{
639
+ provide: NG_VALUE_ACCESSOR,
640
+ useExisting: forwardRef(() => UserFormFieldComponent),
641
+ multi: true
642
+ }], standalone: true, template: "\r\n<!-- In Microsoft Edge, selectUser() never gets called if the input fields are disabled\r\nSo... I'm dynamically setting the disabled property based on whether or not the browser is Edge.\r\nIt's definitely a better experience if the field IS disabled.\r\nOtherwise, it's confusing - especially because Edge is SO SLOW to display the resulting dialog window.\r\n-->\r\n<!-- Update 8/24/2023:\r\nThe above problem also exists in Chrome now.\r\nSo instead of dynamically setting [disabled] based on browser type,\r\nI'm applying CSS to suppress mouse events on the input - thus making it bubble up to the parent control, which responds the way we want/\r\n-->\r\n\r\n@if (users && 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}", 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
643
  }], propDecorators: { usersSelected: [{ type: i0.Output, args: ["usersSelected"] }], userUnSelected: [{ type: i0.Output, args: ["userUnSelected"] }], placeholder: [{ type: i0.Input, args: [{ isSignal: true, alias: "placeholder", required: false }] }], clickable: [{ type: i0.Input, args: [{ isSignal: true, alias: "clickable", required: false }] }], userChooserData: [{ type: i0.Input, args: [{ isSignal: true, alias: "userChooserData", required: true }] }] } });
614
644
 
615
645
  class MatActiveDirectoryModule {
@@ -629,8 +659,8 @@ class MatActiveDirectoryModule {
629
659
  throw new Error('MatActiveDirectoryModule is already loaded. Import it in the AppModule only');
630
660
  }
631
661
  }
632
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.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: "21.0.0", ngImport: i0, type: MatActiveDirectoryModule, imports: [CommonModule,
662
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.1", ngImport: i0, type: MatActiveDirectoryModule, deps: [{ token: MatActiveDirectoryModule, optional: true, skipSelf: true }], target: i0.ɵɵFactoryTarget.NgModule }); }
663
+ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "21.1.1", ngImport: i0, type: MatActiveDirectoryModule, imports: [CommonModule,
634
664
  ReactiveFormsModule,
635
665
  MatButtonModule,
636
666
  MatDialogModule,
@@ -646,7 +676,7 @@ class MatActiveDirectoryModule {
646
676
  UserChooserComponent,
647
677
  UserFormFieldComponent], exports: [UserChooserComponent,
648
678
  UserFormFieldComponent] }); }
649
- static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "21.0.0", ngImport: i0, type: MatActiveDirectoryModule, imports: [CommonModule,
679
+ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "21.1.1", ngImport: i0, type: MatActiveDirectoryModule, imports: [CommonModule,
650
680
  ReactiveFormsModule,
651
681
  MatButtonModule,
652
682
  MatDialogModule,
@@ -662,7 +692,7 @@ class MatActiveDirectoryModule {
662
692
  UserChooserComponent,
663
693
  UserFormFieldComponent] }); }
664
694
  }
665
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.0", ngImport: i0, type: MatActiveDirectoryModule, decorators: [{
695
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.1", ngImport: i0, type: MatActiveDirectoryModule, decorators: [{
666
696
  type: NgModule,
667
697
  args: [{
668
698
  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 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 standalone: true,\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}\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 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 standalone: true,\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","\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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"}
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 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 standalone: true,\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}\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, forwardRef, 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 { 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\nimport { NG_VALUE_ACCESSOR } from '@angular/forms';\r\n\r\n@Component({\r\n selector: 'cp-user-field',\r\n imports: [\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 providers: [{\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => UserFormFieldComponent),\r\n multi: true\r\n }],\r\n standalone: true,\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\r\n //#region ControlValueAccessor stuff\r\n // https://stackoverflow.com/questions/50618050/how-to-create-custom-input-component-with-ngmodel-working-in-angular-6\r\n value: any; // string\r\n onChange: (_: any) => void = (_: any) => {}; // Invoked when the model has been changed\r\n onTouched: () => void = () => {}; // Invoked when the model has been touched\r\n //#endregion\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 //#region ControlValueAccessor methods\r\n // Method that is invoked on an update of a model.\r\n updateChanges() {\r\n this.onChange(this.value);\r\n }\r\n\r\n //#region ControlValueAccessor Overrides\r\n\r\n // Writes a new item to the element.\r\n writeValue(value: any): void {\r\n this.value = value;\r\n this.updateChanges();\r\n }\r\n\r\n // Registers a callback function that should be called when the control's value changes in the UI.\r\n registerOnChange(fn: any): void {\r\n this.onChange = fn;\r\n }\r\n\r\n // Registers a callback function that should be called when the control receives a blur event.\r\n registerOnTouched(fn: any): void {\r\n this.onTouched = fn;\r\n }\r\n\r\n //#endregion\r\n\r\n //#endregion\r\n\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';\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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"}
@@ -117,10 +117,10 @@ class ActiveDirectoryService extends NgxLibServiceBase {
117
117
  getWorkstations(includeDisabled = false, parentOU = '') {
118
118
  return this.#services.http.get(`${this.apiUrl}/activedirectory/workstations/${includeDisabled}/${parentOU}`);
119
119
  }
120
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.0", ngImport: i0, type: ActiveDirectoryService, deps: [{ token: ActiveDirectoryServiceOptionsToken, optional: true }], target: i0.ɵɵFactoryTarget.Injectable }); }
121
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.0.0", ngImport: i0, type: ActiveDirectoryService, providedIn: 'root' }); }
120
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.1", ngImport: i0, type: ActiveDirectoryService, deps: [{ token: ActiveDirectoryServiceOptionsToken, optional: true }], target: i0.ɵɵFactoryTarget.Injectable }); }
121
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.1.1", ngImport: i0, type: ActiveDirectoryService, providedIn: 'root' }); }
122
122
  }
123
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.0", ngImport: i0, type: ActiveDirectoryService, decorators: [{
123
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.1", ngImport: i0, type: ActiveDirectoryService, decorators: [{
124
124
  type: Injectable,
125
125
  args: [{
126
126
  providedIn: 'root'
@@ -149,11 +149,11 @@ class ActiveDirectoryModule {
149
149
  throw new Error('ActiveDirectoryModule is already loaded. Import it in the AppModule only');
150
150
  }
151
151
  }
152
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.0", ngImport: i0, type: ActiveDirectoryModule, deps: [{ token: ActiveDirectoryModule, optional: true, skipSelf: true }], target: i0.ɵɵFactoryTarget.NgModule }); }
153
- static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "21.0.0", ngImport: i0, type: ActiveDirectoryModule, imports: [CommonModule] }); }
154
- static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "21.0.0", ngImport: i0, type: ActiveDirectoryModule, imports: [CommonModule] }); }
152
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.1", ngImport: i0, type: ActiveDirectoryModule, deps: [{ token: ActiveDirectoryModule, optional: true, skipSelf: true }], target: i0.ɵɵFactoryTarget.NgModule }); }
153
+ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "21.1.1", ngImport: i0, type: ActiveDirectoryModule, imports: [CommonModule] }); }
154
+ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "21.1.1", ngImport: i0, type: ActiveDirectoryModule, imports: [CommonModule] }); }
155
155
  }
156
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.0", ngImport: i0, type: ActiveDirectoryModule, decorators: [{
156
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.1", ngImport: i0, type: ActiveDirectoryModule, decorators: [{
157
157
  type: NgModule,
158
158
  args: [{
159
159
  declarations: [],