@cleavelandprice/ngx-lib 3.11.0 → 3.11.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.
Files changed (69) hide show
  1. package/active-directory/gui/components/user-chooser/user-chooser.component.d.ts +4 -6
  2. package/active-directory/gui/components/user-form-field/user-form-field.component.d.ts +2 -4
  3. package/active-directory/services/active-directory.service.d.ts +1 -4
  4. package/authentication/object/services/authentication.service.d.ts +2 -4
  5. package/authentication/token/gui/components/login/login.component.d.ts +0 -2
  6. package/authentication/token/gui/components/login-form/login-form.component.d.ts +4 -4
  7. package/authentication/token/gui/services/authentication.service.d.ts +2 -3
  8. package/authentication/token/services/authentication.service.d.ts +1 -1
  9. package/dialog/components/choice/choice.component.d.ts +1 -2
  10. package/dialog/components/confirmation/confirmation.component.d.ts +1 -2
  11. package/dialog/components/input/input.component.d.ts +1 -2
  12. package/dialog/components/message/message.component.d.ts +1 -2
  13. package/esm2022/active-directory/gui/components/user-chooser/user-chooser.component.mjs +30 -28
  14. package/esm2022/active-directory/gui/components/user-form-field/user-form-field.component.mjs +28 -26
  15. package/esm2022/active-directory/services/active-directory.service.mjs +29 -34
  16. package/esm2022/authentication/object/services/authentication.service.mjs +20 -18
  17. package/esm2022/authentication/token/gui/components/login/login.component.mjs +13 -12
  18. package/esm2022/authentication/token/gui/components/login-form/login-form.component.mjs +21 -20
  19. package/esm2022/authentication/token/gui/services/authentication.service.mjs +9 -7
  20. package/esm2022/authentication/token/services/authentication.service.mjs +12 -8
  21. package/esm2022/dialog/components/choice/choice.component.mjs +12 -14
  22. package/esm2022/dialog/components/confirmation/confirmation.component.mjs +12 -14
  23. package/esm2022/dialog/components/input/input.component.mjs +12 -14
  24. package/esm2022/dialog/components/message/message.component.mjs +12 -14
  25. package/esm2022/lib/services/app-path-config.service.mjs +9 -12
  26. package/esm2022/quill/components/editor/editor.component.mjs +2 -2
  27. package/esm2022/quill/components/raw/raw.component.mjs +6 -9
  28. package/esm2022/sharepoint/components/employee-photo/employee-photo.component.mjs +10 -10
  29. package/esm2022/sharepoint/pipes/employee-photo-url.pipe.mjs +8 -8
  30. package/esm2022/sharepoint/services/sharepoint.service.mjs +41 -40
  31. package/esm2022/upload/components/upload/upload.component.mjs +13 -11
  32. package/esm2022/upload/components/upload-dialog/upload-dialog.component.mjs +16 -14
  33. package/esm2022/upload/services/upload.service.mjs +10 -13
  34. package/esm2022/url-utilities/pipes/safe-resource-url.pipe.mjs +7 -7
  35. package/esm2022/url-utilities/pipes/safe-url.pipe.mjs +7 -7
  36. package/fesm2022/cleavelandprice-ngx-lib-active-directory-gui.mjs +44 -41
  37. package/fesm2022/cleavelandprice-ngx-lib-active-directory-gui.mjs.map +1 -1
  38. package/fesm2022/cleavelandprice-ngx-lib-active-directory.mjs +28 -32
  39. package/fesm2022/cleavelandprice-ngx-lib-active-directory.mjs.map +1 -1
  40. package/fesm2022/cleavelandprice-ngx-lib-authentication-object.mjs +19 -16
  41. package/fesm2022/cleavelandprice-ngx-lib-authentication-object.mjs.map +1 -1
  42. package/fesm2022/cleavelandprice-ngx-lib-authentication-token-gui.mjs +33 -29
  43. package/fesm2022/cleavelandprice-ngx-lib-authentication-token-gui.mjs.map +1 -1
  44. package/fesm2022/cleavelandprice-ngx-lib-authentication-token.mjs +11 -7
  45. package/fesm2022/cleavelandprice-ngx-lib-authentication-token.mjs.map +1 -1
  46. package/fesm2022/cleavelandprice-ngx-lib-dialog.mjs +32 -36
  47. package/fesm2022/cleavelandprice-ngx-lib-dialog.mjs.map +1 -1
  48. package/fesm2022/cleavelandprice-ngx-lib-quill.mjs +5 -8
  49. package/fesm2022/cleavelandprice-ngx-lib-quill.mjs.map +1 -1
  50. package/fesm2022/cleavelandprice-ngx-lib-sharepoint.mjs +50 -48
  51. package/fesm2022/cleavelandprice-ngx-lib-sharepoint.mjs.map +1 -1
  52. package/fesm2022/cleavelandprice-ngx-lib-upload.mjs +30 -29
  53. package/fesm2022/cleavelandprice-ngx-lib-upload.mjs.map +1 -1
  54. package/fesm2022/cleavelandprice-ngx-lib-url-utilities.mjs +10 -10
  55. package/fesm2022/cleavelandprice-ngx-lib-url-utilities.mjs.map +1 -1
  56. package/fesm2022/cleavelandprice-ngx-lib.mjs +8 -10
  57. package/fesm2022/cleavelandprice-ngx-lib.mjs.map +1 -1
  58. package/lib/services/app-path-config.service.d.ts +2 -4
  59. package/package.json +7 -7
  60. package/quill/components/editor/editor.component.d.ts +1 -1
  61. package/quill/components/raw/raw.component.d.ts +0 -1
  62. package/sharepoint/components/employee-photo/employee-photo.component.d.ts +1 -2
  63. package/sharepoint/pipes/employee-photo-url.pipe.d.ts +0 -2
  64. package/sharepoint/services/sharepoint.service.d.ts +3 -5
  65. package/upload/components/upload/upload.component.d.ts +1 -2
  66. package/upload/components/upload-dialog/upload-dialog.component.d.ts +1 -2
  67. package/upload/services/upload.service.d.ts +2 -4
  68. package/url-utilities/pipes/safe-resource-url.pipe.d.ts +1 -2
  69. package/url-utilities/pipes/safe-url.pipe.d.ts +1 -2
@@ -1 +1 @@
1
- {"version":3,"file":"cleavelandprice-ngx-lib-active-directory-gui.mjs","sources":["../../../../projects/cleavelandprice/ngx-lib/active-directory/gui/src/model/user-chooser-filter-options.ts","../../../../projects/cleavelandprice/ngx-lib/active-directory/gui/src/model/user-chooser-mode.ts","../../../../projects/cleavelandprice/ngx-lib/active-directory/gui/src/model/user-chooser-pre-processing-group.ts","../../../../projects/cleavelandprice/ngx-lib/active-directory/gui/src/model/user-chooser-data.ts","../../../../projects/cleavelandprice/ngx-lib/active-directory/gui/src/components/user-chooser/user-chooser.component.ts","../../../../projects/cleavelandprice/ngx-lib/active-directory/gui/src/components/user-chooser/user-chooser.component.html","../../../../projects/cleavelandprice/ngx-lib/active-directory/gui/src/components/user-form-field/user-form-field.component.ts","../../../../projects/cleavelandprice/ngx-lib/active-directory/gui/src/components/user-form-field/user-form-field.component.html","../../../../projects/cleavelandprice/ngx-lib/active-directory/gui/src/gui.module.ts","../../../../projects/cleavelandprice/ngx-lib/active-directory/gui/src/cleavelandprice-ngx-lib-active-directory-gui.ts"],"sourcesContent":["export class 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}","export class UserChooserPreProcessingGroup {\r\n accountNames: string[] = [];\r\n departments: string[] = [];\r\n groups: string[] = [];\r\n titles: string[] = [];\r\n}","import { User, Group, UserOrGroup } from \"@cleavelandprice/ngx-lib/active-directory\";\r\nimport { PhotoItem } from \"@cleavelandprice/ngx-lib/sharepoint\";\r\n\r\nimport { UserChooserFilterOptions } from \"./user-chooser-filter-options\";\r\nimport { UserChooserMode } from \"./user-chooser-mode\";\r\nimport { UserChooserPreProcessingGroup } from \"./user-chooser-pre-processing-group\";\r\n\r\nexport class UserChooserData {\r\n // Should the dialog close automatically when the user chooses an item?\r\n // Applies to single-user mode only\r\n closeWhenSelectionMade = false;\r\n\r\n // If the component is tasked with pulling Active Directory users (default setting),\r\n // should that include disabled users?\r\n includeDisabledUsers = false;\r\n\r\n // If the component is tasked with pulling Active Directory users (default setting),\r\n // should that search begin at a particular Organization Unit?\r\n parentOu: string | undefined;\r\n\r\n // If true, the component will return an array of Active Directory User objects.\r\n // If false (default), the component will return an array of user account names.\r\n returnUserObjects = false;\r\n\r\n // Should the dialog include hover tooptips for each user that displays their group membership\r\n // You probably don't want this, which is why the default is false\r\n showGroupMembershipTooltips = false;\r\n\r\n // Should the user phone number be displayed next to their name in the dialog\r\n showPhone = true;\r\n\r\n // Title displayed in the dialog\r\n title = 'Select User(s)';\r\n\r\n // Single or Multi mode\r\n mode = UserChooserMode.Single;\r\n \r\n // As the user types into the filter field, the list of users is filtered.\r\n // The filterOptions determine which user properties are taken into consideration for that filter.\r\n // Note, displayName is always included (hard-coded), and is therefore not a filter option.\r\n filterOptions = new UserChooserFilterOptions();\r\n\r\n exclusions = new UserChooserPreProcessingGroup();\r\n inclusions = new UserChooserPreProcessingGroup();\r\n preSelections = new UserChooserPreProcessingGroup();\r\n\r\n // By default, the component will pull a fresh list of Active Directory users/groups and SharePoint photos.\r\n // But if the parent component already has them, you can pass them in via these properties.\r\n users?: User[];\r\n groups?: Group[];\r\n photos?: PhotoItem[];\r\n\r\n // debug\r\n selectableGroupNames?: string[];\r\n}","import { Component, Inject, OnInit, ViewChild, AfterViewChecked, ElementRef } from '@angular/core';\nimport { FormControl, FormGroup } from '@angular/forms';\nimport { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog';\nimport { MatListOption, MatSelectionList } from '@angular/material/list';\nimport { MatTableDataSource } from '@angular/material/table';\nimport { debounceTime, forkJoin, Observable, of } from 'rxjs';\n\nimport { ActiveDirectoryService, Group } from '@cleavelandprice/ngx-lib/active-directory';\nimport { SharePointService, PhotoItem } from '@cleavelandprice/ngx-lib/sharepoint';\n\nimport { SelectableGroup } from '../../model/selectable-group';\nimport { SelectableUser } from '../../model/selectable-user';\nimport { UserChooserData } from '../../model/user-chooser-data';\nimport { UserChooserMode } from '../../public_api';\n\n@Component({\n templateUrl: './user-chooser.component.html',\n styleUrls: [\n './user-chooser.component.css',\n '../../../../../styles/mat-icon.css'\n ]\n})\nexport class UserChooserComponent implements OnInit, AfterViewChecked {\n //#region Fields\n @ViewChild(MatSelectionList) selectionList: MatSelectionList | undefined;\n @ViewChild('filterInput') filterInput: ElementRef | undefined;\n filterInputFocused = false;\n\n filterForm = new FormGroup({\n filter: new FormControl()\n });\n\n dataSource: MatTableDataSource<SelectableUser | SelectableGroup> | undefined;\n photos: PhotoItem[] | undefined;\n groups: Group[] | undefined; // May or may not get populated, depending on config data sent in\n //#endregion\n\n //#region Properties\n get isMultiMode(): boolean {\n return this.data.mode === UserChooserMode.Multiple;\n }\n\n get selectedOptions(): MatListOption[] {\n return this.selectionList?.options.filter(o => o.selected) ?? [];\n }\n\n get selectedUsers(): (SelectableUser | SelectableGroup)[] {\n return this.dataSource?.data?.filter(d => d.selected) ?? [];\n }\n\n get filterValue(): string {\n return this.filterForm.value.filter;\n }\n\n get adGroupsNeeded(): boolean {\n // If any are these are true, then we need to pull AD groups for use later\n return this.data.showGroupMembershipTooltips ||\n this.data.exclusions.groups.length > 0 ||\n this.data.inclusions.groups.length > 0 ||\n this.data.preSelections.groups.length > 0 ||\n this.data.filterOptions.groupMembership ||\n (this.data.selectableGroupNames?.length ?? 0) > 0; // debug\n }\n //#endregion\n\n //#region Lifecycle\n constructor(@Inject(MAT_DIALOG_DATA) public data: UserChooserData,\n private dialogRef: MatDialogRef<UserChooserComponent>,\n private activeDirectoryService: ActiveDirectoryService,\n private sharePointService: SharePointService) {\n\n this.data = {\n ...new UserChooserData(),\n ...data\n }\n }\n\n ngOnInit(): void {\n this.getData();\n this.listenForFilterChanges();\n }\n\n ngAfterViewChecked(): void {\n if (this.filterInputFocused || !this.filterInput) {\n // Control not ready yet, or it has already been given focus\n return;\n }\n\n this.filterInputFocused = true;\n this.filterInput?.nativeElement.focus();\n }\n //#endregion\n\n //#region Events\n listSelectionChanged(options: MatListOption[]): void {\n if (this.data.mode === UserChooserMode.Single &&\n this.selectedOptions.length &&\n this.data.closeWhenSelectionMade\n ) {\n this.close();\n }\n }\n\n optionSelectionChanged(option: MatListOption): void {\n const user = this.dataSource?.data\n .find(u => u.sAMAccountName.toLocaleLowerCase() === (option.value as SelectableUser).sAMAccountName.toLowerCase());\n\n if (user) {\n user.selected = option.selected;\n }\n }\n\n hideUnselectedChanged(selected: boolean): void {\n this.filterForm.get('filter')?.setValue(selected ? '{selected:true}' : null);\n }\n\n selectAll(): void {\n this.selectionList?.selectAll();\n\n if (this.selectionList?.options) {\n this.listSelectionChanged(this.selectionList?.options.toArray());\n }\n }\n\n deselectAll(): void {\n this.selectionList?.deselectAll();\n }\n //#endregion\n\n //#region Utilities\n isUser(userOrGroup: SelectableUser | SelectableGroup): boolean {\n return 'title' in userOrGroup;\n }\n castUser(userOrGroup: SelectableUser | SelectableGroup): SelectableUser {\n return userOrGroup as SelectableUser;\n }\n\n private getData(): void {\n const dataObservables: Observable<any>[] = [\n this.data.users ?\n // Users were passed in\n of(this.data.users) :\n // Users need to be retrieved\n this.activeDirectoryService.getUsers(false, this.data.includeDisabledUsers, this.data.parentOu),\n\n this.data.photos ?\n // Photos were passed in\n of(this.data.photos) :\n // Photos need to be retrieved\n this.sharePointService.getPhotos()\n ];\n\n // Do we need AD groups?\n if (this.adGroupsNeeded) {\n this.data.groups ?\n // Groups were passed in\n of(this.data.groups) :\n // Groups need to be retrieved\n dataObservables.push(this.activeDirectoryService.getGroups());\n }\n\n\n forkJoin(dataObservables)\n //.subscribe(([users, photos]) => {\n .subscribe(data => {\n // Need groups in place before we handle exclusions/inclusions/pre-selections\n this.groups = this.adGroupsNeeded ? data[2] : null;\n\n let users = data[0] as SelectableUser[];\n users.forEach(u => u.selected = false); // In case existing data was re-used\n users = this.includeUsersByAccountName(users);\n users = this.includeUsersByGroupName(users);\n users = this.includeUsersByDepartment(users);\n users = this.includeUsersByTitle(users);\n\n users = this.excludeUsersByAccountName(users);\n users = this.excludeUsersByGroupName(users);\n users = this.excludeUsersByDepartment(users);\n users = this.excludeUsersByTitle(users);\n\n users = this.preSelectUsersByAccountName(users);\n users = this.preSelectUsersByGroupName(users);\n users = this.preSelectUsersByDepartment(users);\n users = this.preSelectUsersByTitle(users);\n\n // debug\n const usersAndGroups: (SelectableUser | SelectableGroup)[] = [\n ...users\n ];\n\n if (this.data.selectableGroupNames?.length) {\n this.data.selectableGroupNames\n .forEach(groupName => {\n const group = this.groups!.find(g => g.displayName === groupName);\n\n if (group) {\n usersAndGroups.push({\n ...group,\n selected: false\n });\n }\n });\n }\n\n this.dataSource = new MatTableDataSource(usersAndGroups);\n \n this.photos = data[1];\n\n this.setFilterPredicate();\n });\n }\n\n close(): void {\n if (!this.selectedUsers) {\n this.dialogRef.close();\n return;\n }\n const value = this.selectedUsers\n .map(u => this.data.returnUserObjects ? u : u.sAMAccountName);\n\n this.dialogRef.close(this.data.mode === UserChooserMode.Multiple ?\n value :\n value[0]\n );\n }\n\n getPhoto(user: SelectableUser | SelectableGroup): string | undefined {\n if (!this.isUser(user)) { return; }\n \n return this.photos?.find(p =>\n (p.employeeNumber && p.employeeNumber.toString() === (user as SelectableUser).employeeNumber) ||\n p.accountName?.toLowerCase() === user.sAMAccountName.toLowerCase() ||\n p.displayName?.toLowerCase() === user.displayName.toLowerCase() ||\n p.title?.toLowerCase() === user.displayName.toLowerCase()\n )?.encodedAbsUrl;\n }\n\n //#region Exclusions - won't be included in the dataSource at all\n private excludeUsersByAccountName(users: SelectableUser[]): SelectableUser[] {\n this.data.exclusions.accountNames\n .forEach(accountName => {\n const index = users.findIndex(u => u.sAMAccountName.toLowerCase() === accountName.toLowerCase());\n if (index === -1) { return; }\n\n users.splice(index, 1);\n });\n\n return users;\n }\n\n private excludeUsersByGroupName(users: SelectableUser[]): SelectableUser[] {\n this.data.exclusions.groups\n .forEach(groupName => {\n const group = this.groups?.find(g => g.name.toLowerCase() === groupName.toLowerCase());\n if (!group) { return; }\n \n group.member.forEach(groupMemberDn => {\n const index = users.findIndex(u => u.distinguishedName === groupMemberDn);\n if (index === -1) { return; }\n\n users.splice(index, 1);\n });\n });\n\n return users;\n }\n\n private excludeUsersByDepartment(users: SelectableUser[]): SelectableUser[] {\n this.data.exclusions.departments\n .forEach(department => {\n const excludedUsers = users.filter(u => u.department?.toLowerCase() === department.toLowerCase());\n\n excludedUsers.forEach(user => {\n const index = users.indexOf(user);\n users.splice(index, 1);\n });\n });\n\n return users;\n }\n\n private excludeUsersByTitle(users: SelectableUser[]): SelectableUser[] {\n this.data.exclusions.titles\n .forEach(title => {\n const excludedUsers = users.filter(u => u.title?.toLowerCase() === title.toLowerCase());\n \n excludedUsers.forEach(user => {\n const index = users.indexOf(user);\n users.splice(index, 1);\n });\n });\n\n return users;\n }\n //#endregion\n\n //#region Inclusions - only these will be included in the dataSource\n private includeUsersByAccountName(users: SelectableUser[]): SelectableUser[] {\n return users.filter(user =>\n this.data.inclusions.accountNames.length === 0 || // No account inclusions specified\n\n this.data.inclusions.accountNames.find(accountName =>\n accountName.toLowerCase() === user.sAMAccountName.toLowerCase()\n ));\n }\n\n private includeUsersByDepartment(users: SelectableUser[]): SelectableUser[] {\n return users.filter(user =>\n this.data.inclusions.departments.length === 0 || // No department inclusions specified\n\n this.data.inclusions.departments.find(department =>\n department.toLowerCase() === user.department?.toLowerCase()\n ));\n }\n\n private includeUsersByTitle(users: SelectableUser[]): SelectableUser[] {\n return users.filter(user =>\n this.data.inclusions.titles.length === 0 || // No title inclusions specified\n\n this.data.inclusions.titles.find(title =>\n title.toLowerCase() === user.title?.toLowerCase()\n ));\n }\n\n private includeUsersByGroupName(users: SelectableUser[]): SelectableUser[] {\n if (!this.data.inclusions.groups.length) {\n return users; // No group inclusions specified\n }\n\n // Cheating a bit and leveraging the 'selected' property to keep track of who should be included\n // Since inclusions happen befor pre-selections, we can do that, as long as we set 'selected' back to false when we're done\n this.data.inclusions.groups\n .forEach(groupName => {\n const group = this.groups?.find(g => g.name.toLowerCase() === groupName.toLowerCase());\n if (!group) { return; }\n\n users\n .filter(user =>\n group.member.find(groupMemberDn => groupMemberDn === user.distinguishedName)\n )\n .forEach(user => user.selected = true);\n });\n \n // At this point, all of the appropriate users should have 'selected' set to true\n const selectedUsers = users.filter(user => user.selected); // Subset of the original list\n // Reset 'selected' to false, and return\n selectedUsers.forEach(user => user.selected = false);\n return selectedUsers;\n }\n //#endregion\n\n //#region Pre-Selections\n private preSelectUsersByAccountName(users: SelectableUser[]): SelectableUser[] {\n this.data.preSelections.accountNames\n .forEach(accountName => {\n const user = users.find(u => u.sAMAccountName.toLowerCase() === accountName.toLowerCase());\n if (!user) { return; }\n\n user.selected = true;\n });\n\n return users;\n }\n\n private preSelectUsersByDepartment(users: SelectableUser[]): SelectableUser[] {\n this.data.preSelections.departments\n .forEach(department =>\n users\n .filter(u => u.department?.toLowerCase() === department.toLowerCase())\n .forEach(user => user.selected = true)\n );\n\n return users;\n }\n\n private preSelectUsersByTitle(users: SelectableUser[]): SelectableUser[] {\n this.data.preSelections.titles\n .forEach(title =>\n users\n .filter(u => u.title?.toLowerCase() === title.toLowerCase())\n .forEach(user => user.selected = true)\n );\n\n return users;\n }\n\n private preSelectUsersByGroupName(users: SelectableUser[]): SelectableUser[] {\n this.data.preSelections.groups\n .forEach(groupName => {\n const group = this.groups?.find(g => g.name.toLowerCase() === groupName.toLowerCase());\n if (!group) { return; }\n\n group.member.forEach(groupMemberDn => {\n const user = users.find(u => u.distinguishedName === groupMemberDn);\n if (!user) { return; }\n\n user.selected = true;\n });\n });\n\n return users;\n }\n //#endregion\n \n private setFilterPredicate(): void {\n if (!this.dataSource) {\n return;\n }\n\n this.dataSource.filterPredicate = (user: (SelectableUser | SelectableGroup), filter: string) => {\n if (filter === '{selected:true}') {\n return user.selected;\n } else {\n const regex = new RegExp(filter, 'i'); // Case-insensitive\n let match = false; // The end result - whether or not a employee matches the filter\n\n const filterProperties = [ 'displayName' ];\n if (this.data.filterOptions.accountName) {\n filterProperties.push('sAMAccountName')\n }\n if (this.data.filterOptions.title) {\n filterProperties.push('title');\n }\n if (this.data.filterOptions.department) {\n filterProperties.push('department');\n }\n if (this.data.filterOptions.phoneNumber) {\n filterProperties.push('telephoneNumber');\n }\n \n // Match on the properties configured above\n filterProperties\n .forEach(field => {\n // @ts-ignore\n if (user[field] && user[field].match(regex)) {\n match = true;\n }\n });\n \n // Match on group membership (group name)\n if (this.data.filterOptions.groupMembership) {\n user.memberOf.forEach(groupDn => {\n const group = this.groups?.find(group => group.distinguishedName === groupDn && group.name.match(regex));\n \n if (group) {\n match = true;\n }\n });\n }\n\n return match;\n }\n };\n }\n\n private listenForFilterChanges(): void {\n this.filterForm.get('filter')?.valueChanges\n .pipe(\n debounceTime(250)\n )\n .subscribe(() => this.dataSource!.filter = this.filterForm.value.filter?.trim().toLowerCase());\n }\n\n tooltip(user: SelectableUser | SelectableGroup): string {\n return this.data.showGroupMembershipTooltips ?\n user.memberOf\n .map(groupDn =>\n this.groups\n ?.find(group =>\n group.distinguishedName === groupDn\n )?.name\n )\n .sort((a, b) => a! > b! ? 1 : -1)\n .join('\\n') :\n '';\n }\n //#endregion\n}\n","<div id=\"dialog-title\">\n <h2 mat-dialog-title>{{ data.title }}</h2>\n\n <div id=\"num-selected\">\n {{ selectedOptions.length }} selected\n </div>\n</div>\n\n<mat-dialog-content>\n @if (!(dataSource && photos)) {\n <div>\n <mat-spinner [diameter]=\"50\"></mat-spinner>\n <h2 id=\"spinner-message\">Getting users and photos...</h2>\n </div>\n }\n\n @if (dataSource && photos) {\n <form [formGroup]=\"filterForm\">\n @if (dataSource) {\n <mat-form-field>\n <input matInput placeholder=\"Search\" formControlName=\"filter\" #filterInput>\n @if (filterForm.value.filter) {\n <button matSuffix mat-icon-button aria-label=\"Clear\" (click)=\"filterForm.get('filter')?.setValue('')\">\n <mat-icon fontIcon=\"close\"></mat-icon>\n </button>\n }\n </mat-form-field>\n }\n </form>\n <mat-selection-list [multiple]=\"isMultiMode\"\n (selectionChange)=\"listSelectionChanged($event.options)\">\n @for (user of dataSource?.filteredData; track user) {\n <mat-list-option [value]=\"user\" [selected]=\"user.selected\"\n (selectedChange)=\"optionSelectionChanged(option)\" #option>\n @if (getPhoto(user)) {\n <img matListItemAvatar alt=\"\" [src]=\"getPhoto(user)\">\n }\n @if (!getPhoto(user)) {\n <mat-icon matListItemAvatar class=\"no-photo\"\n [fontIcon]=\"isUser(user) ? 'account_circle' : 'group'\">\n </mat-icon>\n }\n <div class=\"user\">\n <div [matTooltip]=\"tooltip(user)\" class=\"user-name\">\n {{ user.displayName }}\n @if (isUser(user) && data.showPhone && castUser(user).telephoneNumber) {\n <div>{{ castUser(user).telephoneNumber }}</div>\n }\n </div>\n @if (isUser(user)) {\n <div>{{ castUser(user).department }}</div>\n <div class=\"title\">{{ castUser(user).title }}</div>\n }\n </div>\n </mat-list-option>\n }\n </mat-selection-list>\n }\n</mat-dialog-content>\n\n<mat-dialog-actions>\n @if (dataSource && photos) {\n @if (selectedOptions.length) {\n <mat-slide-toggle (change)=\"hideUnselectedChanged($event.checked)\">\n Hide Unselected\n </mat-slide-toggle>\n }\n @if (isMultiMode) {\n <button mat-raised-button color=\"primary\" (click)=\"selectAll()\"\n >\n <mat-icon fontIcon=\"select_all\"></mat-icon>\n <span class=\"hide-mobile\">Select All</span>\n </button>\n }\n @if (isMultiMode && selectedOptions.length) {\n <button mat-raised-button color=\"primary\" (click)=\"deselectAll()\"\n >\n <mat-icon fontIcon=\"clear_all\"></mat-icon>\n <span class=\"hide-mobile\">Clear All</span>\n </button>\n }\n @if (isMultiMode || !data.closeWhenSelectionMade) {\n <button mat-raised-button color=\"primary\" (click)=\"close()\" matTooltip=\"Accept your selection\"\n [disabled]=\"!selectedOptions.length\">\n <mat-icon fontIcon=\"check\"></mat-icon>\n <span class=\"hide-mobile\">Ok</span>\n </button>\n }\n }\n\n <button mat-raised-button color=\"warn\" mat-dialog-close matTooltip=\"Close this window\">\n <mat-icon fontIcon=\"close\"></mat-icon>\n <span class=\"hide-mobile\">Cancel</span>\n </button>\n</mat-dialog-actions>","import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core';\nimport { MatDialog } from '@angular/material/dialog';\nimport { forkJoin, of } from 'rxjs';\n\nimport { ActiveDirectoryService, User, UserOrGroup } from '@cleavelandprice/ngx-lib/active-directory';\nimport { PhotoItem, SharePointService } from '@cleavelandprice/ngx-lib/sharepoint';\n\nimport { UserChooserData } from '../../model/user-chooser-data';\n\nimport { UserChooserComponent } from '../user-chooser/user-chooser.component';\n\n@Component({\n selector: 'cp-user-field',\n templateUrl: './user-form-field.component.html',\n styleUrls: ['./user-form-field.component.css']\n})\nexport class UserFormFieldComponent implements OnInit {\n //#region Fields\n @Output() usersSelected = new EventEmitter<string | string[]>(); // string for Single mode, string[] for multi\n @Output() userUnSelected = new EventEmitter<string>();\n @Input() placeholder = 'Select User(s)';\n @Input() clickable = true;\n\n @Input() userChooserData!: UserChooserData;\n\n accountNames: string[] = [];\n\n users: User[] | undefined = undefined;\n groups: UserOrGroup[] | undefined = undefined;\n photos: PhotoItem[] | undefined = undefined;\n //#endregion\n\n //#region Properties\n /*get isEdge(): boolean {\n return window.navigator.userAgent.indexOf('Edge') > -1;\n }*/\n //#endregion\n \n //#region Lifecycle\n constructor(private dialog: MatDialog,\n private activeDirectoryService: ActiveDirectoryService,\n private sharePointService: SharePointService) { }\n\n ngOnInit(): void {\n this.userChooserData = {\n ...new UserChooserData(),\n ...this.userChooserData\n }\n\n // If users have been pre-selected in the config, store those in accountNames, which drives the UI of this component\n this.accountNames = this.userChooserData.preSelections.accountNames;\n\n this.getData();\n }\n //#endregion\n\n //#region Events\n selectUser(): void {\n if (!this.clickable) { return; }\n\n const data: UserChooserData = {\n ...this.userChooserData,\n\n users: this.users,\n photos: this.photos,\n };\n\n this.dialog.open(UserChooserComponent, {\n data: data\n })\n .afterClosed()\n .subscribe((selected: string | string[]) => {\n if (!selected) { return; }\n \n this.accountNames = Array.isArray(selected) ?\n selected :\n [ selected ];\n\n // Overwrite what may have been passed in, for subsequent launches of UserChooserComponent - otherwise it just keeps getting fed stale data\n this.userChooserData.preSelections.accountNames = this.accountNames;\n\n this.usersSelected.emit(selected);\n });\n }\n\n unSelectUser(accountName: string): void {\n const index = this.accountNames.findIndex(a => a === accountName);\n this.accountNames.splice(index, 1);\n\n this.userChooserData.preSelections.accountNames = this.accountNames;\n\n this.userUnSelected.emit(accountName);\n }\n //#endregion\n\n //#region Utilities\n private getData(): void {\n forkJoin([\n this.userChooserData!.users ?\n // Users were passed in\n of(this.userChooserData!.users) :\n // Users need to be retrieved\n this.activeDirectoryService.getUsers(false, this.userChooserData!.includeDisabledUsers, this.userChooserData!.parentOu),\n\n this.userChooserData!.groups ?\n // Groups were passed in\n of(this.userChooserData!.groups) :\n // Groups need to be retrieved\n this.activeDirectoryService.getGroups(this.userChooserData!.parentOu),\n\n this.userChooserData!.photos ?\n // Photos were passed in\n of(this.userChooserData!.photos) :\n // Photos need to be retrieved\n this.sharePointService.getPhotos()\n ])\n .subscribe(([users, groups, photos]) => {\n this.users = users;\n this.groups = groups;\n this.photos = photos;\n });\n }\n\n getUser(accountName: string): User | undefined {\n return this.users?.find(u => u.sAMAccountName.toLowerCase() === accountName.toLowerCase());\n }\n\n getGroup(accountName: string): UserOrGroup | undefined {\n return this.groups?.find(g => g.sAMAccountName.toLowerCase() === accountName.toLowerCase());\n }\n\n getPhoto(accountName: string): string | undefined {\n const user = this.getUser(accountName);\n if (!user) { return undefined; }\n\n return this.photos?.find(p =>\n (p.employeeNumber && p.employeeNumber.toString() === user.employeeNumber) ||\n p.accountName?.toLowerCase() === user.sAMAccountName.toLowerCase() ||\n p.displayName?.toLowerCase() === user.displayName.toLowerCase() ||\n p.title?.toLowerCase() === user.displayName.toLowerCase()\n )?.encodedAbsUrl;\n }\n //#endregion\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 <mat-progress-bar mode=\"indeterminate\"></mat-progress-bar>\n}\n\n@if (users && photos) {\n <div (click)=\"selectUser()\" [class.clickable]=\"clickable\">\n @if (!accountNames?.length) {\n <mat-form-field>\n <input matInput disabled [placeholder]=\"placeholder\"> <!-- [disabled]=\"!isEdge\" -->\n </mat-form-field>\n }\n @if (accountNames?.length) {\n <div\n [class.grid]=\"accountNames.length > 1\"\n [class.three]=\"accountNames.length > 2\"\n [class.four]=\"accountNames.length > 3\"\n [class.five]=\"accountNames.length > 4\">\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) ? getUser(accountName)?.displayName : getGroup(accountName) ? getGroup(accountName)?.displayName : accountName\">\n <button matSuffix mat-icon-button aria-label=\"Clear\" (click)=\"$event.stopPropagation(); unSelectUser(accountName)\">\n <mat-icon fontIcon=\"close\"></mat-icon>\n </button>\n </mat-form-field>\n </div>\n }\n </div>\n }\n </div>\n}","import { ModuleWithProviders, NgModule, Optional, SkipSelf } from '@angular/core';\nimport { CommonModule } from '@angular/common';\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 { ServiceConfig, ActiveDirectoryService } 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 UserChooserComponent,\n UserFormFieldComponent\n ],\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 exports: [\n UserChooserComponent,\n UserFormFieldComponent\n ]\n})\nexport class GuiModule {\n static forRoot(config: ServiceConfig): ModuleWithProviders<GuiModule> {\n return {\n ngModule: GuiModule,\n providers: [\n ActiveDirectoryService,\n { provide: ServiceConfig, useValue: config }\n ]\n };\n }\n\n constructor(@Optional() @SkipSelf() parentModule: GuiModule) {\n if (parentModule) {\n throw new Error(\n 'ActiveDirectoryGuiModule is already loaded. Import it in the AppModule only');\n }\n }\n}","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":["i4","i5","i6","i7","i8","i9"],"mappings":"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"}
1
+ {"version":3,"file":"cleavelandprice-ngx-lib-active-directory-gui.mjs","sources":["../../../../projects/cleavelandprice/ngx-lib/active-directory/gui/src/model/user-chooser-filter-options.ts","../../../../projects/cleavelandprice/ngx-lib/active-directory/gui/src/model/user-chooser-mode.ts","../../../../projects/cleavelandprice/ngx-lib/active-directory/gui/src/model/user-chooser-pre-processing-group.ts","../../../../projects/cleavelandprice/ngx-lib/active-directory/gui/src/model/user-chooser-data.ts","../../../../projects/cleavelandprice/ngx-lib/active-directory/gui/src/components/user-chooser/user-chooser.component.ts","../../../../projects/cleavelandprice/ngx-lib/active-directory/gui/src/components/user-chooser/user-chooser.component.html","../../../../projects/cleavelandprice/ngx-lib/active-directory/gui/src/components/user-form-field/user-form-field.component.ts","../../../../projects/cleavelandprice/ngx-lib/active-directory/gui/src/components/user-form-field/user-form-field.component.html","../../../../projects/cleavelandprice/ngx-lib/active-directory/gui/src/gui.module.ts","../../../../projects/cleavelandprice/ngx-lib/active-directory/gui/src/cleavelandprice-ngx-lib-active-directory-gui.ts"],"sourcesContent":["export class 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}","export class UserChooserPreProcessingGroup {\r\n accountNames: string[] = [];\r\n departments: string[] = [];\r\n groups: string[] = [];\r\n titles: string[] = [];\r\n}","import { User, Group, UserOrGroup } from \"@cleavelandprice/ngx-lib/active-directory\";\r\nimport { PhotoItem } from \"@cleavelandprice/ngx-lib/sharepoint\";\r\n\r\nimport { UserChooserFilterOptions } from \"./user-chooser-filter-options\";\r\nimport { UserChooserMode } from \"./user-chooser-mode\";\r\nimport { UserChooserPreProcessingGroup } from \"./user-chooser-pre-processing-group\";\r\n\r\nexport class UserChooserData {\r\n // Should the dialog close automatically when the user chooses an item?\r\n // Applies to single-user mode only\r\n closeWhenSelectionMade = false;\r\n\r\n // If the component is tasked with pulling Active Directory users (default setting),\r\n // should that include disabled users?\r\n includeDisabledUsers = false;\r\n\r\n // If the component is tasked with pulling Active Directory users (default setting),\r\n // should that search begin at a particular Organization Unit?\r\n parentOu: string | undefined;\r\n\r\n // If true, the component will return an array of Active Directory User objects.\r\n // If false (default), the component will return an array of user account names.\r\n returnUserObjects = false;\r\n\r\n // Should the dialog include hover tooptips for each user that displays their group membership\r\n // You probably don't want this, which is why the default is false\r\n showGroupMembershipTooltips = false;\r\n\r\n // Should the user phone number be displayed next to their name in the dialog\r\n showPhone = true;\r\n\r\n // Title displayed in the dialog\r\n title = 'Select User(s)';\r\n\r\n // Single or Multi mode\r\n mode = UserChooserMode.Single;\r\n \r\n // As the user types into the filter field, the list of users is filtered.\r\n // The filterOptions determine which user properties are taken into consideration for that filter.\r\n // Note, displayName is always included (hard-coded), and is therefore not a filter option.\r\n filterOptions = new UserChooserFilterOptions();\r\n\r\n exclusions = new UserChooserPreProcessingGroup();\r\n inclusions = new UserChooserPreProcessingGroup();\r\n preSelections = new UserChooserPreProcessingGroup();\r\n\r\n // By default, the component will pull a fresh list of Active Directory users/groups and SharePoint photos.\r\n // But if the parent component already has them, you can pass them in via these properties.\r\n users?: User[];\r\n groups?: Group[];\r\n photos?: PhotoItem[];\r\n\r\n // debug\r\n selectableGroupNames?: string[];\r\n}","import { AfterViewChecked, Component, ElementRef, Inject, inject, OnInit, ViewChild } from '@angular/core';\nimport { FormControl, FormGroup } from '@angular/forms';\nimport { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog';\nimport { MatListOption, MatSelectionList } from '@angular/material/list';\nimport { MatTableDataSource } from '@angular/material/table';\nimport { debounceTime, forkJoin, Observable, of } from 'rxjs';\n\nimport { ActiveDirectoryService, Group } from '@cleavelandprice/ngx-lib/active-directory';\nimport { PhotoItem, SharePointService } from '@cleavelandprice/ngx-lib/sharepoint';\n\nimport { SelectableGroup } from '../../model/selectable-group';\nimport { SelectableUser } from '../../model/selectable-user';\nimport { UserChooserData } from '../../model/user-chooser-data';\nimport { UserChooserMode } from '../../public_api';\n\n@Component({\n templateUrl: './user-chooser.component.html',\n styleUrls: [\n './user-chooser.component.css',\n '../../../../../styles/mat-icon.css'\n ]\n})\nexport class UserChooserComponent implements OnInit, AfterViewChecked {\n //#region Fields\n //#region Services\n private dialogRef = inject(MatDialogRef<UserChooserComponent>);\n private activeDirectoryService = inject(ActiveDirectoryService);\n private sharePointService = inject(SharePointService);\n //#endregion\n @ViewChild(MatSelectionList) selectionList: MatSelectionList | undefined;\n @ViewChild('filterInput') filterInput: ElementRef | undefined;\n ////filterInputFocused = false;\n\n filterForm = new FormGroup({\n filter: new FormControl()\n });\n\n dataSource: MatTableDataSource<SelectableUser | SelectableGroup> | undefined;\n photos: PhotoItem[] | undefined;\n groups: Group[] | undefined; // May or may not get populated, depending on config data sent in\n //#endregion\n\n //#region Properties\n get isMultiMode(): boolean {\n return this.data.mode === UserChooserMode.Multiple;\n }\n\n get selectedOptions(): MatListOption[] {\n return this.selectionList?.options.filter(o => o.selected) ?? [];\n }\n\n get selectedUsers(): (SelectableUser | SelectableGroup)[] {\n return this.dataSource?.data?.filter(d => d.selected) ?? [];\n }\n\n get filterValue(): string {\n return this.filterForm.value.filter;\n }\n\n get adGroupsNeeded(): boolean {\n // If any are these are true, then we need to pull AD groups for use later\n return this.data.showGroupMembershipTooltips ||\n this.data.exclusions.groups.length > 0 ||\n this.data.inclusions.groups.length > 0 ||\n this.data.preSelections.groups.length > 0 ||\n this.data.filterOptions.groupMembership ||\n (this.data.selectableGroupNames?.length ?? 0) > 0; // debug\n }\n //#endregion\n\n //#region Lifecycle\n constructor(@Inject(MAT_DIALOG_DATA) public data: UserChooserData) {\n\n this.data = {\n ...new UserChooserData(),\n ...data\n }\n }\n\n ngOnInit(): void {\n this.getData();\n this.listenForFilterChanges();\n }\n\n ngAfterViewChecked(): void {\n if (/*this.filterInputFocused || */!this.filterInput) {\n // Control not ready yet, or it has already been given focus\n return;\n }\n\n ////this.filterInputFocused = true;\n this.filterInput?.nativeElement.focus();\n }\n //#endregion\n\n //#region Events\n listSelectionChanged(options: MatListOption[]): void {\n if (this.data.mode === UserChooserMode.Single &&\n this.selectedOptions.length &&\n this.data.closeWhenSelectionMade\n ) {\n this.close();\n }\n }\n\n optionSelectionChanged(option: MatListOption): void {\n const user = this.dataSource?.data\n .find(u => u.sAMAccountName.toLocaleLowerCase() === (option.value as SelectableUser).sAMAccountName.toLowerCase());\n\n if (user) {\n user.selected = option.selected;\n }\n }\n\n hideUnselectedChanged(selected: boolean): void {\n this.filterForm.get('filter')?.setValue(selected ? '{selected:true}' : null);\n }\n\n selectAll(): void {\n this.selectionList?.selectAll();\n\n if (this.selectionList?.options) {\n this.listSelectionChanged(this.selectionList?.options.toArray());\n }\n }\n\n deselectAll(): void {\n this.selectionList?.deselectAll();\n }\n //#endregion\n\n //#region Utilities\n isUser(userOrGroup: SelectableUser | SelectableGroup): boolean {\n return 'title' in userOrGroup;\n }\n castUser(userOrGroup: SelectableUser | SelectableGroup): SelectableUser {\n return userOrGroup as SelectableUser;\n }\n\n private getData(): void {\n const dataObservables: Observable<any>[] = [\n this.data.users ?\n // Users were passed in\n of(this.data.users) :\n // Users need to be retrieved\n this.activeDirectoryService.getUsers(false, this.data.includeDisabledUsers, this.data.parentOu),\n\n this.data.photos ?\n // Photos were passed in\n of(this.data.photos) :\n // Photos need to be retrieved\n this.sharePointService.getPhotos()\n ];\n\n // Do we need AD groups?\n if (this.adGroupsNeeded) {\n this.data.groups ?\n // Groups were passed in\n of(this.data.groups) :\n // Groups need to be retrieved\n dataObservables.push(this.activeDirectoryService.getGroups());\n }\n\n\n forkJoin(dataObservables)\n //.subscribe(([users, photos]) => {\n .subscribe(data => {\n // Need groups in place before we handle exclusions/inclusions/pre-selections\n this.groups = this.adGroupsNeeded ? data[2] : null;\n\n let users = data[0] as SelectableUser[];\n users.forEach(u => u.selected = false); // In case existing data was re-used\n users = this.includeUsersByAccountName(users);\n users = this.includeUsersByGroupName(users);\n users = this.includeUsersByDepartment(users);\n users = this.includeUsersByTitle(users);\n\n users = this.excludeUsersByAccountName(users);\n users = this.excludeUsersByGroupName(users);\n users = this.excludeUsersByDepartment(users);\n users = this.excludeUsersByTitle(users);\n\n users = this.preSelectUsersByAccountName(users);\n users = this.preSelectUsersByGroupName(users);\n users = this.preSelectUsersByDepartment(users);\n users = this.preSelectUsersByTitle(users);\n\n // debug\n const usersAndGroups: (SelectableUser | SelectableGroup)[] = [\n ...users\n ];\n\n if (this.data.selectableGroupNames?.length) {\n this.data.selectableGroupNames\n .forEach(groupName => {\n const group = this.groups!.find(g => g.displayName === groupName);\n\n if (group) {\n usersAndGroups.push({\n ...group,\n selected: false\n });\n }\n });\n }\n\n this.dataSource = new MatTableDataSource(usersAndGroups);\n \n this.photos = data[1];\n\n this.setFilterPredicate();\n });\n }\n\n close(): void {\n if (!this.selectedUsers) {\n this.dialogRef.close();\n return;\n }\n const value = this.selectedUsers\n .map(u => this.data.returnUserObjects ? u : u.sAMAccountName);\n\n this.dialogRef.close(this.data.mode === UserChooserMode.Multiple ?\n value :\n value[0]\n );\n }\n\n getPhoto(user: SelectableUser | SelectableGroup): string | undefined {\n if (!this.isUser(user)) { return; }\n \n return this.photos?.find(p =>\n (p.employeeNumber && p.employeeNumber.toString() === (user as SelectableUser).employeeNumber) ||\n p.accountName?.toLowerCase() === user.sAMAccountName.toLowerCase() ||\n p.displayName?.toLowerCase() === user.displayName.toLowerCase() ||\n p.title?.toLowerCase() === user.displayName.toLowerCase()\n )?.encodedAbsUrl;\n }\n\n //#region Exclusions - won't be included in the dataSource at all\n private excludeUsersByAccountName(users: SelectableUser[]): SelectableUser[] {\n this.data.exclusions.accountNames\n .forEach(accountName => {\n const index = users.findIndex(u => u.sAMAccountName.toLowerCase() === accountName.toLowerCase());\n if (index === -1) { return; }\n\n users.splice(index, 1);\n });\n\n return users;\n }\n\n private excludeUsersByGroupName(users: SelectableUser[]): SelectableUser[] {\n this.data.exclusions.groups\n .forEach(groupName => {\n const group = this.groups?.find(g => g.name.toLowerCase() === groupName.toLowerCase());\n if (!group) { return; }\n \n group.member.forEach(groupMemberDn => {\n const index = users.findIndex(u => u.distinguishedName === groupMemberDn);\n if (index === -1) { return; }\n\n users.splice(index, 1);\n });\n });\n\n return users;\n }\n\n private excludeUsersByDepartment(users: SelectableUser[]): SelectableUser[] {\n this.data.exclusions.departments\n .forEach(department => {\n const excludedUsers = users.filter(u => u.department?.toLowerCase() === department.toLowerCase());\n\n excludedUsers.forEach(user => {\n const index = users.indexOf(user);\n users.splice(index, 1);\n });\n });\n\n return users;\n }\n\n private excludeUsersByTitle(users: SelectableUser[]): SelectableUser[] {\n this.data.exclusions.titles\n .forEach(title => {\n const excludedUsers = users.filter(u => u.title?.toLowerCase() === title.toLowerCase());\n \n excludedUsers.forEach(user => {\n const index = users.indexOf(user);\n users.splice(index, 1);\n });\n });\n\n return users;\n }\n //#endregion\n\n //#region Inclusions - only these will be included in the dataSource\n private includeUsersByAccountName(users: SelectableUser[]): SelectableUser[] {\n return users.filter(user =>\n this.data.inclusions.accountNames.length === 0 || // No account inclusions specified\n\n this.data.inclusions.accountNames.find(accountName =>\n accountName.toLowerCase() === user.sAMAccountName.toLowerCase()\n ));\n }\n\n private includeUsersByDepartment(users: SelectableUser[]): SelectableUser[] {\n return users.filter(user =>\n this.data.inclusions.departments.length === 0 || // No department inclusions specified\n\n this.data.inclusions.departments.find(department =>\n department.toLowerCase() === user.department?.toLowerCase()\n ));\n }\n\n private includeUsersByTitle(users: SelectableUser[]): SelectableUser[] {\n return users.filter(user =>\n this.data.inclusions.titles.length === 0 || // No title inclusions specified\n\n this.data.inclusions.titles.find(title =>\n title.toLowerCase() === user.title?.toLowerCase()\n ));\n }\n\n private includeUsersByGroupName(users: SelectableUser[]): SelectableUser[] {\n if (!this.data.inclusions.groups.length) {\n return users; // No group inclusions specified\n }\n\n // Cheating a bit and leveraging the 'selected' property to keep track of who should be included\n // Since inclusions happen befor pre-selections, we can do that, as long as we set 'selected' back to false when we're done\n this.data.inclusions.groups\n .forEach(groupName => {\n const group = this.groups?.find(g => g.name.toLowerCase() === groupName.toLowerCase());\n if (!group) { return; }\n\n users\n .filter(user =>\n group.member.find(groupMemberDn => groupMemberDn === user.distinguishedName)\n )\n .forEach(user => user.selected = true);\n });\n \n // At this point, all of the appropriate users should have 'selected' set to true\n const selectedUsers = users.filter(user => user.selected); // Subset of the original list\n // Reset 'selected' to false, and return\n selectedUsers.forEach(user => user.selected = false);\n return selectedUsers;\n }\n //#endregion\n\n //#region Pre-Selections\n private preSelectUsersByAccountName(users: SelectableUser[]): SelectableUser[] {\n this.data.preSelections.accountNames\n .forEach(accountName => {\n const user = users.find(u => u.sAMAccountName.toLowerCase() === accountName.toLowerCase());\n if (!user) { return; }\n\n user.selected = true;\n });\n\n return users;\n }\n\n private preSelectUsersByDepartment(users: SelectableUser[]): SelectableUser[] {\n this.data.preSelections.departments\n .forEach(department =>\n users\n .filter(u => u.department?.toLowerCase() === department.toLowerCase())\n .forEach(user => user.selected = true)\n );\n\n return users;\n }\n\n private preSelectUsersByTitle(users: SelectableUser[]): SelectableUser[] {\n this.data.preSelections.titles\n .forEach(title =>\n users\n .filter(u => u.title?.toLowerCase() === title.toLowerCase())\n .forEach(user => user.selected = true)\n );\n\n return users;\n }\n\n private preSelectUsersByGroupName(users: SelectableUser[]): SelectableUser[] {\n this.data.preSelections.groups\n .forEach(groupName => {\n const group = this.groups?.find(g => g.name.toLowerCase() === groupName.toLowerCase());\n if (!group) { return; }\n\n group.member.forEach(groupMemberDn => {\n const user = users.find(u => u.distinguishedName === groupMemberDn);\n if (!user) { return; }\n\n user.selected = true;\n });\n });\n\n return users;\n }\n //#endregion\n \n private setFilterPredicate(): void {\n if (!this.dataSource) {\n return;\n }\n\n this.dataSource.filterPredicate = (user: (SelectableUser | SelectableGroup), filter: string) => {\n if (filter === '{selected:true}') {\n return user.selected;\n } else {\n const regex = new RegExp(filter, 'i'); // Case-insensitive\n let match = false; // The end result - whether or not a employee matches the filter\n\n const filterProperties = [ 'displayName' ];\n if (this.data.filterOptions.accountName) {\n filterProperties.push('sAMAccountName')\n }\n if (this.data.filterOptions.title) {\n filterProperties.push('title');\n }\n if (this.data.filterOptions.department) {\n filterProperties.push('department');\n }\n if (this.data.filterOptions.phoneNumber) {\n filterProperties.push('telephoneNumber');\n }\n \n // Match on the properties configured above\n filterProperties\n .forEach(field => {\n // @ts-ignore\n if (user[field] && user[field].match(regex)) {\n match = true;\n }\n });\n \n // Match on group membership (group name)\n if (this.data.filterOptions.groupMembership) {\n user.memberOf.forEach(groupDn => {\n const group = this.groups?.find(group => group.distinguishedName === groupDn && group.name.match(regex));\n \n if (group) {\n match = true;\n }\n });\n }\n\n return match;\n }\n };\n }\n\n private listenForFilterChanges(): void {\n this.filterForm.get('filter')?.valueChanges\n .pipe(\n debounceTime(250)\n )\n .subscribe(() => this.dataSource!.filter = this.filterForm.value.filter?.trim().toLowerCase());\n }\n\n tooltip(user: SelectableUser | SelectableGroup): string {\n return this.data.showGroupMembershipTooltips ?\n user.memberOf\n .map(groupDn =>\n this.groups\n ?.find(group =>\n group.distinguishedName === groupDn\n )?.name\n )\n .sort((a, b) => a! > b! ? 1 : -1)\n .join('\\n') :\n '';\n }\n //#endregion\n}\n","<div id=\"dialog-title\">\n <h2 mat-dialog-title>{{ data.title }}</h2>\n\n <div id=\"num-selected\">\n {{ selectedOptions.length }} selected\n </div>\n</div>\n\n<mat-dialog-content>\n @if (dataSource && photos) {\n <form [formGroup]=\"filterForm\">\n @if (dataSource) {\n <mat-form-field>\n <input matInput placeholder=\"Search\" formControlName=\"filter\" #filterInput>\n @if (filterForm.value.filter) {\n <button matSuffix mat-icon-button aria-label=\"Clear\" (click)=\"filterForm.get('filter')?.setValue('')\">\n <mat-icon fontIcon=\"close\"></mat-icon>\n </button>\n }\n </mat-form-field>\n }\n </form>\n <mat-selection-list [multiple]=\"isMultiMode\"\n (selectionChange)=\"listSelectionChanged($event.options)\">\n @for (user of dataSource?.filteredData; track user) {\n <mat-list-option [value]=\"user\" [selected]=\"user.selected\"\n (selectedChange)=\"optionSelectionChanged(option)\" #option>\n @if (getPhoto(user)) {\n <img matListItemAvatar alt=\"\" [src]=\"getPhoto(user)\">\n } @else {\n <mat-icon matListItemAvatar class=\"no-photo\"\n [fontIcon]=\"isUser(user) ? 'account_circle' : 'group'\">\n </mat-icon>\n }\n <div class=\"user\">\n <div [matTooltip]=\"tooltip(user)\" class=\"user-name\">\n {{ user.displayName }}\n @if (isUser(user) && data.showPhone && castUser(user).telephoneNumber) {\n <div>{{ castUser(user).telephoneNumber }}</div>\n }\n </div>\n @if (isUser(user)) {\n <div>{{ castUser(user).department }}</div>\n <div class=\"title\">{{ castUser(user).title }}</div>\n }\n </div>\n </mat-list-option>\n }\n </mat-selection-list>\n } @else {\n <div>\n <mat-spinner [diameter]=\"50\"></mat-spinner>\n <h2 id=\"spinner-message\">Getting users and photos...</h2>\n </div>\n }\n</mat-dialog-content>\n\n<mat-dialog-actions>\n @if (dataSource && photos) {\n @if (selectedOptions.length) {\n <mat-slide-toggle (change)=\"hideUnselectedChanged($event.checked)\">\n Hide Unselected\n </mat-slide-toggle>\n }\n @if (isMultiMode) {\n <button mat-raised-button color=\"primary\" (click)=\"selectAll()\"\n >\n <mat-icon fontIcon=\"select_all\"></mat-icon>\n <span class=\"hide-mobile\">Select All</span>\n </button>\n }\n @if (isMultiMode && selectedOptions.length) {\n <button mat-raised-button color=\"primary\" (click)=\"deselectAll()\"\n >\n <mat-icon fontIcon=\"clear_all\"></mat-icon>\n <span class=\"hide-mobile\">Clear All</span>\n </button>\n }\n @if (isMultiMode || !data.closeWhenSelectionMade) {\n <button mat-raised-button color=\"primary\" (click)=\"close()\" matTooltip=\"Accept your selection\"\n [disabled]=\"!selectedOptions.length\">\n <mat-icon fontIcon=\"check\"></mat-icon>\n <span class=\"hide-mobile\">Ok</span>\n </button>\n }\n }\n\n <button mat-raised-button color=\"warn\" mat-dialog-close matTooltip=\"Close this window\">\n <mat-icon fontIcon=\"close\"></mat-icon>\n <span class=\"hide-mobile\">Cancel</span>\n </button>\n</mat-dialog-actions>","import { Component, EventEmitter, inject, Input, OnInit, Output } from '@angular/core';\nimport { MatDialog } from '@angular/material/dialog';\nimport { forkJoin, of } from 'rxjs';\n\nimport { ActiveDirectoryService, User, UserOrGroup } from '@cleavelandprice/ngx-lib/active-directory';\nimport { PhotoItem, SharePointService } from '@cleavelandprice/ngx-lib/sharepoint';\n\nimport { UserChooserData } from '../../model/user-chooser-data';\n\nimport { UserChooserComponent } from '../user-chooser/user-chooser.component';\n\n@Component({\n selector: 'cp-user-field',\n templateUrl: './user-form-field.component.html',\n styleUrls: ['./user-form-field.component.css']\n})\nexport class UserFormFieldComponent implements OnInit {\n //#region Fields\n //#region Services\n private dialog = inject(MatDialog);\n private activeDirectoryService = inject(ActiveDirectoryService);\n private sharePointService = inject(SharePointService);\n //#endregion\n @Output() usersSelected = new EventEmitter<string | string[]>(); // string for Single mode, string[] for multi\n @Output() userUnSelected = new EventEmitter<string>();\n @Input() placeholder = 'Select User(s)';\n @Input() clickable = true;\n\n @Input() userChooserData!: UserChooserData;\n\n accountNames: string[] = [];\n\n users: User[] | undefined = undefined;\n groups: UserOrGroup[] | undefined = undefined;\n photos: PhotoItem[] | undefined = undefined;\n //#endregion\n\n //#region Properties\n /*get isEdge(): boolean {\n return window.navigator.userAgent.indexOf('Edge') > -1;\n }*/\n //#endregion\n \n //#region Lifecycle\n ngOnInit(): void {\n this.userChooserData = {\n ...new UserChooserData(),\n ...this.userChooserData\n }\n\n // If users have been pre-selected in the config, store those in accountNames, which drives the UI of this component\n this.accountNames = this.userChooserData.preSelections.accountNames;\n\n this.getData();\n }\n //#endregion\n\n //#region Events\n selectUser(): void {\n if (!this.clickable) { return; }\n\n const data: UserChooserData = {\n ...this.userChooserData,\n\n users: this.users,\n photos: this.photos,\n };\n\n this.dialog.open(UserChooserComponent, {\n data: data\n })\n .afterClosed()\n .subscribe((selected: string | string[]) => {\n if (!selected) { return; }\n \n this.accountNames = Array.isArray(selected) ?\n selected :\n [ selected ];\n\n // Overwrite what may have been passed in, for subsequent launches of UserChooserComponent - otherwise it just keeps getting fed stale data\n this.userChooserData.preSelections.accountNames = this.accountNames;\n\n this.usersSelected.emit(selected);\n });\n }\n\n unSelectUser(accountName: string): void {\n const index = this.accountNames.findIndex(a => a === accountName);\n this.accountNames.splice(index, 1);\n\n this.userChooserData.preSelections.accountNames = this.accountNames;\n\n this.userUnSelected.emit(accountName);\n }\n //#endregion\n\n //#region Utilities\n private getData(): void {\n forkJoin([\n this.userChooserData!.users ?\n // Users were passed in\n of(this.userChooserData!.users) :\n // Users need to be retrieved\n this.activeDirectoryService.getUsers(false, this.userChooserData!.includeDisabledUsers, this.userChooserData!.parentOu),\n\n this.userChooserData!.groups ?\n // Groups were passed in\n of(this.userChooserData!.groups) :\n // Groups need to be retrieved\n this.activeDirectoryService.getGroups(this.userChooserData!.parentOu),\n\n this.userChooserData!.photos ?\n // Photos were passed in\n of(this.userChooserData!.photos) :\n // Photos need to be retrieved\n this.sharePointService.getPhotos()\n ])\n .subscribe(([users, groups, photos]) => {\n this.users = users;\n this.groups = groups;\n this.photos = photos;\n });\n }\n\n getUser(accountName: string): User | undefined {\n return this.users?.find(u => u.sAMAccountName.toLowerCase() === accountName.toLowerCase());\n }\n\n getGroup(accountName: string): UserOrGroup | undefined {\n return this.groups?.find(g => g.sAMAccountName.toLowerCase() === accountName.toLowerCase());\n }\n\n getPhoto(accountName: string): string | undefined {\n const user = this.getUser(accountName);\n if (!user) { return undefined; }\n\n return this.photos?.find(p =>\n (p.employeeNumber && p.employeeNumber.toString() === user.employeeNumber) ||\n p.accountName?.toLowerCase() === user.sAMAccountName.toLowerCase() ||\n p.displayName?.toLowerCase() === user.displayName.toLowerCase() ||\n p.title?.toLowerCase() === user.displayName.toLowerCase()\n )?.encodedAbsUrl;\n }\n //#endregion\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\n [class.grid]=\"accountNames.length > 1\"\n [class.three]=\"accountNames.length > 2\"\n [class.four]=\"accountNames.length > 3\"\n [class.five]=\"accountNames.length > 4\">\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) ? getUser(accountName)?.displayName : getGroup(accountName) ? getGroup(accountName)?.displayName : accountName\">\n <button matSuffix mat-icon-button aria-label=\"Clear\" (click)=\"$event.stopPropagation(); unSelectUser(accountName)\">\n <mat-icon fontIcon=\"close\"></mat-icon>\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\"></mat-progress-bar>\n}","import { ModuleWithProviders, NgModule, Optional, SkipSelf } from '@angular/core';\nimport { CommonModule } from '@angular/common';\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 { ServiceConfig, ActiveDirectoryService } 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 UserChooserComponent,\n UserFormFieldComponent\n ],\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 exports: [\n UserChooserComponent,\n UserFormFieldComponent\n ]\n})\nexport class GuiModule {\n static forRoot(config: ServiceConfig): ModuleWithProviders<GuiModule> {\n return {\n ngModule: GuiModule,\n providers: [\n ActiveDirectoryService,\n { provide: ServiceConfig, useValue: config }\n ]\n };\n }\n\n constructor(@Optional() @SkipSelf() parentModule: GuiModule) {\n if (parentModule) {\n throw new Error(\n 'ActiveDirectoryGuiModule is already loaded. Import it in the AppModule only');\n }\n }\n}","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":["i1","i2","i3","i4","i5","i6"],"mappings":"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"}
@@ -1,9 +1,9 @@
1
1
  import { ServiceConfig as ServiceConfig$1 } from '@cleavelandprice/ngx-lib';
2
+ import { HttpClient } from '@angular/common/http';
2
3
  import * as i0 from '@angular/core';
3
- import { Injectable, Optional, NgModule, SkipSelf } from '@angular/core';
4
- import { of } from 'rxjs';
4
+ import { inject, Injectable, NgModule, Optional, SkipSelf } from '@angular/core';
5
5
  import { DateTime } from 'luxon';
6
- import * as i2 from '@angular/common/http';
6
+ import { of } from 'rxjs';
7
7
  import { CommonModule } from '@angular/common';
8
8
 
9
9
  class CachingConfig {
@@ -32,30 +32,28 @@ class ServiceConfig extends ServiceConfig$1 {
32
32
  }
33
33
 
34
34
  class ActiveDirectoryService {
35
+ constructor() {
36
+ //#region Services
37
+ this.config = inject(ServiceConfig, { optional: true }) ?? new ServiceConfig();
38
+ this.http = inject(HttpClient);
39
+ this.defaultCacheLifeMinutes = 720;
40
+ }
35
41
  //#region Properties
36
42
  get cacheExpired() {
37
43
  if (!this.cache) {
38
44
  return true;
39
45
  }
40
- const lifeMinutes = this.config.caching?.lifeMinutes ?? this.defaultCacheLifeMinutes;
46
+ const lifeMinutes = this.config?.caching?.lifeMinutes ?? this.defaultCacheLifeMinutes;
41
47
  const expiration = this.cache.lastUpdate.plus({ minutes: lifeMinutes });
42
48
  return DateTime.now() > expiration;
43
49
  }
44
50
  //#endregion
45
- //#region Initialization
46
- constructor(config, http) {
47
- this.config = config;
48
- this.http = http;
49
- this.defaultCacheLifeMinutes = 720;
50
- this.config = this.config ?? new ServiceConfig();
51
- }
52
- //#endregion
53
51
  getUsers(includePhoto = false, includeDisabled = false, parentOU = '') {
54
52
  // If caching is enabled, there will be two calls to the API if the cache is null/expired
55
53
  // One call is to update the cache and the other is to return the data that the user requested
56
54
  // Subsequent calls will bypass the API and returned cached data until it expires
57
- const observable$ = this.http.get(`${this.config.apiUrl}/users/${includePhoto}/${includeDisabled}/${parentOU}`);
58
- if (this.config.caching?.enabled) {
55
+ const observable$ = this.http.get(`${this.config?.apiUrl}/users/${includePhoto}/${includeDisabled}/${parentOU}`);
56
+ if (this.config?.caching?.enabled) {
59
57
  if (this.cacheExpired) {
60
58
  // Get the data and cache it
61
59
  observable$.subscribe(data => {
@@ -63,7 +61,7 @@ class ActiveDirectoryService {
63
61
  data,
64
62
  lastUpdate: DateTime.now()
65
63
  };
66
- if (this.config.logging?.dataCached) {
64
+ if (this.config?.logging?.dataCached) {
67
65
  const lifeMinutes = this.config.caching?.lifeMinutes ?? this.defaultCacheLifeMinutes;
68
66
  console.log(`Data cached for ${lifeMinutes} minutes`);
69
67
  }
@@ -78,51 +76,51 @@ class ActiveDirectoryService {
78
76
  }
79
77
  }
80
78
  // Cache is either disabled or expired, return data from API
81
- if (this.config.logging?.freshDataReturned) {
79
+ if (this.config?.logging?.freshDataReturned) {
82
80
  console.log('Returning fresh users');
83
81
  }
84
82
  return observable$;
85
83
  }
86
84
  getUser(accountName, includePhoto = false) {
87
- return this.http.get(`${this.config.apiUrl}/users/name/${accountName}/${includePhoto}`);
85
+ return this.http.get(`${this.config?.apiUrl}/users/name/${accountName}/${includePhoto}`);
88
86
  }
89
87
  clearCache() {
90
88
  this.cache = undefined;
91
- if (this.config.logging?.cacheCleared) {
89
+ if (this.config?.logging?.cacheCleared) {
92
90
  console.log('Cache cleared');
93
91
  }
94
92
  }
95
93
  getDomains() {
96
- return this.http.get(`${this.config.apiUrl}/activedirectory/domains`);
94
+ return this.http.get(`${this.config?.apiUrl}/activedirectory/domains`);
97
95
  }
98
96
  getOUs(parentOU = '') {
99
- return this.http.get(`${this.config.apiUrl}/activedirectory/ous/${parentOU}`);
97
+ return this.http.get(`${this.config?.apiUrl}/activedirectory/ous/${parentOU}`);
100
98
  }
101
99
  getContainers(parentOU = '') {
102
- return this.http.get(`${this.config.apiUrl}/activedirectory/containers/${parentOU}`);
100
+ return this.http.get(`${this.config?.apiUrl}/activedirectory/containers/${parentOU}`);
103
101
  }
104
102
  getGroups(parentOU = '') {
105
- return this.http.get(`${this.config.apiUrl}/activedirectory/groups/${parentOU}`);
103
+ return this.http.get(`${this.config?.apiUrl}/activedirectory/groups/${parentOU}`);
106
104
  }
107
105
  getDistinctUserAttributeValues(attributeName) {
108
- return this.http.get(`${this.config.apiUrl}/activedirectory/distinct/${attributeName}`);
106
+ return this.http.get(`${this.config?.apiUrl}/activedirectory/distinct/${attributeName}`);
109
107
  }
110
108
  getDepartments() {
111
- return this.http.get(`${this.config.apiUrl}/activedirectory/departments`);
109
+ return this.http.get(`${this.config?.apiUrl}/activedirectory/departments`);
112
110
  }
113
111
  getTitles() {
114
- return this.http.get(`${this.config.apiUrl}/activedirectory/titles`);
112
+ return this.http.get(`${this.config?.apiUrl}/activedirectory/titles`);
115
113
  }
116
114
  getComputers(includeDisabled = false, parentOU = '') {
117
- return this.http.get(`${this.config.apiUrl}/activedirectory/computers/${includeDisabled}/${parentOU}`);
115
+ return this.http.get(`${this.config?.apiUrl}/activedirectory/computers/${includeDisabled}/${parentOU}`);
118
116
  }
119
117
  getServers(includeDisabled = false, parentOU = '') {
120
- return this.http.get(`${this.config.apiUrl}/activedirectory/servers/${includeDisabled}/${parentOU}`);
118
+ return this.http.get(`${this.config?.apiUrl}/activedirectory/servers/${includeDisabled}/${parentOU}`);
121
119
  }
122
120
  getWorkstations(includeDisabled = false, parentOU = '') {
123
- return this.http.get(`${this.config.apiUrl}/activedirectory/workstations/${includeDisabled}/${parentOU}`);
121
+ return this.http.get(`${this.config?.apiUrl}/activedirectory/workstations/${includeDisabled}/${parentOU}`);
124
122
  }
125
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.1.2", ngImport: i0, type: ActiveDirectoryService, deps: [{ token: ServiceConfig, optional: true }, { token: i2.HttpClient }], target: i0.ɵɵFactoryTarget.Injectable }); }
123
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.1.2", ngImport: i0, type: ActiveDirectoryService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
126
124
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.1.2", ngImport: i0, type: ActiveDirectoryService, providedIn: 'root' }); }
127
125
  }
128
126
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.1.2", ngImport: i0, type: ActiveDirectoryService, decorators: [{
@@ -130,9 +128,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.1.2", ngImpor
130
128
  args: [{
131
129
  providedIn: 'root'
132
130
  }]
133
- }], ctorParameters: () => [{ type: ServiceConfig, decorators: [{
134
- type: Optional
135
- }] }, { type: i2.HttpClient }] });
131
+ }] });
136
132
 
137
133
  class ActiveDirectoryModule {
138
134
  static forRoot(config) {
@@ -1 +1 @@
1
- {"version":3,"file":"cleavelandprice-ngx-lib-active-directory.mjs","sources":["../../../../projects/cleavelandprice/ngx-lib/active-directory/src/model/caching-config.ts","../../../../projects/cleavelandprice/ngx-lib/active-directory/src/model/logging-config.ts","../../../../projects/cleavelandprice/ngx-lib/active-directory/src/model/service-config.ts","../../../../projects/cleavelandprice/ngx-lib/active-directory/src/services/active-directory.service.ts","../../../../projects/cleavelandprice/ngx-lib/active-directory/src/active-directory.module.ts","../../../../projects/cleavelandprice/ngx-lib/active-directory/src/cleavelandprice-ngx-lib-active-directory.ts"],"sourcesContent":["export class CachingConfig {\r\n enabled = false;\r\n lifeMinutes = 720;\r\n }","export class LoggingConfig {\r\n dataCached = false;\r\n cachedDataReturned = false;\r\n freshDataReturned = false;\r\n cacheCleared = false;\r\n }","import { ServiceConfig as NgxLibServiceConfig } from '@cleavelandprice/ngx-lib';\r\nimport { CachingConfig } from './caching-config';\r\nimport { LoggingConfig } from './logging-config';\r\n\r\nexport class ServiceConfig extends NgxLibServiceConfig {\r\n caching = new CachingConfig();\r\n logging = new LoggingConfig();\r\n\r\n // See the comment in the library's main service-config.ts file for an explanation\r\n constructor(useSsl_or_customApiUrl: boolean | string = false) {\r\n super(useSsl_or_customApiUrl);\r\n }\r\n}\r\n","import { Injectable, Optional } from '@angular/core';\r\nimport { HttpClient } from '@angular/common/http';\r\nimport { Observable, of } from 'rxjs';\r\nimport { DateTime } from 'luxon';\r\n\r\nimport { ADObject } from '../model/ad-object';\r\nimport { ADObjectWithChildren } from '../model/ad-object-with-children';\r\nimport { CacheObject } from '../model/cache-object';\r\nimport { CleavelandPriceUser } from '../model/cleaveland-price-user';\r\nimport { Group } from '../model/group';\r\nimport { ServiceConfig } from '../model/service-config';\r\nimport { User } from '../model/user';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class ActiveDirectoryService {\r\n private cache: CacheObject<CleavelandPriceUser> | undefined;\r\n private defaultCacheLifeMinutes = 720;\r\n\r\n //#region Properties\r\n private get cacheExpired(): boolean {\r\n if (!this.cache) {\r\n return true;\r\n }\r\n\r\n const lifeMinutes = this.config.caching?.lifeMinutes ?? this.defaultCacheLifeMinutes;\r\n const expiration = this.cache.lastUpdate.plus({ minutes: lifeMinutes});\r\n\r\n return DateTime.now() > expiration;\r\n }\r\n //#endregion\r\n\r\n //#region Initialization\r\n constructor(@Optional() private config: ServiceConfig,\r\n private http: HttpClient) {\r\n\r\n this.config = this.config ?? new ServiceConfig();\r\n }\r\n //#endregion\r\n\r\n getUsers(includePhoto = false, includeDisabled = false, parentOU = ''): Observable<CleavelandPriceUser[]> {\r\n // If caching is enabled, there will be two calls to the API if the cache is null/expired\r\n // One call is to update the cache and the other is to return the data that the user requested\r\n // Subsequent calls will bypass the API and returned cached data until it expires\r\n\r\n const observable$ = this.http.get<CleavelandPriceUser[]>(`${this.config.apiUrl}/users/${includePhoto}/${includeDisabled}/${parentOU}`);\r\n\r\n if (this.config.caching?.enabled) {\r\n if (this.cacheExpired) {\r\n // Get the data and cache it\r\n observable$.subscribe(data => {\r\n this.cache = {\r\n data,\r\n lastUpdate: DateTime.now()\r\n };\r\n\r\n if (this.config.logging?.dataCached) {\r\n const lifeMinutes = this.config.caching?.lifeMinutes ?? this.defaultCacheLifeMinutes;\r\n console.log(`Data cached for ${lifeMinutes} minutes`);\r\n }\r\n });\r\n } else {\r\n // Cache exists and hasn't expired yet\r\n if (this.config.logging?.cachedDataReturned) {\r\n console.log('Returning cached users');\r\n }\r\n\r\n return of(this.cache!.data);\r\n }\r\n }\r\n\r\n // Cache is either disabled or expired, return data from API\r\n if (this.config.logging?.freshDataReturned) {\r\n console.log('Returning fresh users');\r\n }\r\n\r\n return observable$;\r\n }\r\n\r\n getUser(accountName: string, includePhoto = false): Observable<CleavelandPriceUser> {\r\n return this.http.get<CleavelandPriceUser>(`${this.config.apiUrl}/users/name/${accountName}/${includePhoto}`);\r\n }\r\n\r\n clearCache(): void {\r\n this.cache = undefined;\r\n\r\n if (this.config.logging?.cacheCleared) {\r\n console.log('Cache cleared');\r\n }\r\n }\r\n\r\n getDomains(): Observable<ADObject[]> {\r\n return this.http.get<ADObject[]>(`${this.config.apiUrl}/activedirectory/domains`);\r\n }\r\n\r\n getOUs(parentOU = ''): Observable<ADObjectWithChildren[]> {\r\n return this.http.get<ADObjectWithChildren[]>(`${this.config.apiUrl}/activedirectory/ous/${parentOU}`);\r\n }\r\n\r\n getContainers(parentOU = ''): Observable<ADObjectWithChildren[]> {\r\n return this.http.get<ADObjectWithChildren[]>(`${this.config.apiUrl}/activedirectory/containers/${parentOU}`);\r\n }\r\n\r\n getGroups(parentOU = ''): Observable<Group[]> {\r\n return this.http.get<Group[]>(`${this.config.apiUrl}/activedirectory/groups/${parentOU}`);\r\n }\r\n\r\n getDistinctUserAttributeValues(attributeName: string) : Observable<any[]> {\r\n return this.http.get<any[]>(`${this.config.apiUrl}/activedirectory/distinct/${attributeName}`);\r\n }\r\n\r\n getDepartments() : Observable<string[]> {\r\n return this.http.get<string[]>(`${this.config.apiUrl}/activedirectory/departments`);\r\n }\r\n\r\n getTitles() : Observable<string[]> {\r\n return this.http.get<string[]>(`${this.config.apiUrl}/activedirectory/titles`);\r\n }\r\n\r\n getComputers(includeDisabled = false, parentOU = ''): Observable<User[]> {\r\n return this.http.get<User[]>(`${this.config.apiUrl}/activedirectory/computers/${includeDisabled}/${parentOU}`);\r\n }\r\n\r\n getServers(includeDisabled = false, parentOU = ''): Observable<User[]> {\r\n return this.http.get<User[]>(`${this.config.apiUrl}/activedirectory/servers/${includeDisabled}/${parentOU}`);\r\n }\r\n\r\n getWorkstations(includeDisabled = false, parentOU = ''): Observable<User[]> {\r\n return this.http.get<User[]>(`${this.config.apiUrl}/activedirectory/workstations/${includeDisabled}/${parentOU}`);\r\n }\r\n}\r\n","import { ModuleWithProviders, NgModule, Optional, SkipSelf } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\n\r\nimport { ServiceConfig } from './model/service-config';\r\n\r\nimport { ActiveDirectoryService } from './services/active-directory.service';\r\n\r\n@NgModule({\r\n declarations: [],\r\n imports: [\r\n CommonModule\r\n ],\r\n exports: []\r\n})\r\nexport class ActiveDirectoryModule {\r\n static forRoot(config: ServiceConfig): ModuleWithProviders<ActiveDirectoryModule> {\r\n return {\r\n ngModule: ActiveDirectoryModule,\r\n providers: [\r\n ActiveDirectoryService,\r\n { provide: ServiceConfig, useValue: config }\r\n ]\r\n };\r\n }\r\n\r\n constructor(@Optional() @SkipSelf() parentModule: ActiveDirectoryModule) {\r\n if (parentModule) {\r\n throw new Error(\r\n 'ActiveDirectoryModule is already loaded. Import it in the AppModule only');\r\n }\r\n }\r\n}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":["NgxLibServiceConfig","i1.ServiceConfig"],"mappings":"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"}
1
+ {"version":3,"file":"cleavelandprice-ngx-lib-active-directory.mjs","sources":["../../../../projects/cleavelandprice/ngx-lib/active-directory/src/model/caching-config.ts","../../../../projects/cleavelandprice/ngx-lib/active-directory/src/model/logging-config.ts","../../../../projects/cleavelandprice/ngx-lib/active-directory/src/model/service-config.ts","../../../../projects/cleavelandprice/ngx-lib/active-directory/src/services/active-directory.service.ts","../../../../projects/cleavelandprice/ngx-lib/active-directory/src/active-directory.module.ts","../../../../projects/cleavelandprice/ngx-lib/active-directory/src/cleavelandprice-ngx-lib-active-directory.ts"],"sourcesContent":["export class CachingConfig {\r\n enabled = false;\r\n lifeMinutes = 720;\r\n }","export class LoggingConfig {\r\n dataCached = false;\r\n cachedDataReturned = false;\r\n freshDataReturned = false;\r\n cacheCleared = false;\r\n }","import { ServiceConfig as NgxLibServiceConfig } from '@cleavelandprice/ngx-lib';\r\nimport { CachingConfig } from './caching-config';\r\nimport { LoggingConfig } from './logging-config';\r\n\r\nexport class ServiceConfig extends NgxLibServiceConfig {\r\n caching = new CachingConfig();\r\n logging = new LoggingConfig();\r\n\r\n // See the comment in the library's main service-config.ts file for an explanation\r\n constructor(useSsl_or_customApiUrl: boolean | string = false) {\r\n super(useSsl_or_customApiUrl);\r\n }\r\n}\r\n","import { HttpClient } from '@angular/common/http';\r\nimport { inject, Injectable } from '@angular/core';\r\nimport { DateTime } from 'luxon';\r\nimport { Observable, of } from 'rxjs';\r\n\r\nimport { ADObject } from '../model/ad-object';\r\nimport { ADObjectWithChildren } from '../model/ad-object-with-children';\r\nimport { CacheObject } from '../model/cache-object';\r\nimport { CleavelandPriceUser } from '../model/cleaveland-price-user';\r\nimport { Group } from '../model/group';\r\nimport { ServiceConfig } from '../model/service-config';\r\nimport { User } from '../model/user';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class ActiveDirectoryService {\r\n //#region Services\r\n private config = inject(ServiceConfig, { optional: true }) ?? new ServiceConfig();\r\n private http = inject(HttpClient);\r\n //#endregion\r\n private cache: CacheObject<CleavelandPriceUser> | undefined;\r\n private defaultCacheLifeMinutes = 720;\r\n\r\n //#region Properties\r\n private get cacheExpired(): boolean {\r\n if (!this.cache) {\r\n return true;\r\n }\r\n\r\n const lifeMinutes = this.config?.caching?.lifeMinutes ?? this.defaultCacheLifeMinutes;\r\n const expiration = this.cache.lastUpdate.plus({ minutes: lifeMinutes});\r\n\r\n return DateTime.now() > expiration;\r\n }\r\n //#endregion\r\n\r\n getUsers(includePhoto = false, includeDisabled = false, parentOU = ''): Observable<CleavelandPriceUser[]> {\r\n // If caching is enabled, there will be two calls to the API if the cache is null/expired\r\n // One call is to update the cache and the other is to return the data that the user requested\r\n // Subsequent calls will bypass the API and returned cached data until it expires\r\n\r\n const observable$ = this.http.get<CleavelandPriceUser[]>(`${this.config?.apiUrl}/users/${includePhoto}/${includeDisabled}/${parentOU}`);\r\n\r\n if (this.config?.caching?.enabled) {\r\n if (this.cacheExpired) {\r\n // Get the data and cache it\r\n observable$.subscribe(data => {\r\n this.cache = {\r\n data,\r\n lastUpdate: DateTime.now()\r\n };\r\n\r\n if (this.config?.logging?.dataCached) {\r\n const lifeMinutes = this.config.caching?.lifeMinutes ?? this.defaultCacheLifeMinutes;\r\n console.log(`Data cached for ${lifeMinutes} minutes`);\r\n }\r\n });\r\n } else {\r\n // Cache exists and hasn't expired yet\r\n if (this.config.logging?.cachedDataReturned) {\r\n console.log('Returning cached users');\r\n }\r\n\r\n return of(this.cache!.data);\r\n }\r\n }\r\n\r\n // Cache is either disabled or expired, return data from API\r\n if (this.config?.logging?.freshDataReturned) {\r\n console.log('Returning fresh users');\r\n }\r\n\r\n return observable$;\r\n }\r\n\r\n getUser(accountName: string, includePhoto = false): Observable<CleavelandPriceUser> {\r\n return this.http.get<CleavelandPriceUser>(`${this.config?.apiUrl}/users/name/${accountName}/${includePhoto}`);\r\n }\r\n\r\n clearCache(): void {\r\n this.cache = undefined;\r\n\r\n if (this.config?.logging?.cacheCleared) {\r\n console.log('Cache cleared');\r\n }\r\n }\r\n\r\n getDomains(): Observable<ADObject[]> {\r\n return this.http.get<ADObject[]>(`${this.config?.apiUrl}/activedirectory/domains`);\r\n }\r\n\r\n getOUs(parentOU = ''): Observable<ADObjectWithChildren[]> {\r\n return this.http.get<ADObjectWithChildren[]>(`${this.config?.apiUrl}/activedirectory/ous/${parentOU}`);\r\n }\r\n\r\n getContainers(parentOU = ''): Observable<ADObjectWithChildren[]> {\r\n return this.http.get<ADObjectWithChildren[]>(`${this.config?.apiUrl}/activedirectory/containers/${parentOU}`);\r\n }\r\n\r\n getGroups(parentOU = ''): Observable<Group[]> {\r\n return this.http.get<Group[]>(`${this.config?.apiUrl}/activedirectory/groups/${parentOU}`);\r\n }\r\n\r\n getDistinctUserAttributeValues(attributeName: string) : Observable<any[]> {\r\n return this.http.get<any[]>(`${this.config?.apiUrl}/activedirectory/distinct/${attributeName}`);\r\n }\r\n\r\n getDepartments() : Observable<string[]> {\r\n return this.http.get<string[]>(`${this.config?.apiUrl}/activedirectory/departments`);\r\n }\r\n\r\n getTitles() : Observable<string[]> {\r\n return this.http.get<string[]>(`${this.config?.apiUrl}/activedirectory/titles`);\r\n }\r\n\r\n getComputers(includeDisabled = false, parentOU = ''): Observable<User[]> {\r\n return this.http.get<User[]>(`${this.config?.apiUrl}/activedirectory/computers/${includeDisabled}/${parentOU}`);\r\n }\r\n\r\n getServers(includeDisabled = false, parentOU = ''): Observable<User[]> {\r\n return this.http.get<User[]>(`${this.config?.apiUrl}/activedirectory/servers/${includeDisabled}/${parentOU}`);\r\n }\r\n\r\n getWorkstations(includeDisabled = false, parentOU = ''): Observable<User[]> {\r\n return this.http.get<User[]>(`${this.config?.apiUrl}/activedirectory/workstations/${includeDisabled}/${parentOU}`);\r\n }\r\n}\r\n","import { ModuleWithProviders, NgModule, Optional, SkipSelf } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\n\r\nimport { ServiceConfig } from './model/service-config';\r\n\r\nimport { ActiveDirectoryService } from './services/active-directory.service';\r\n\r\n@NgModule({\r\n declarations: [],\r\n imports: [\r\n CommonModule\r\n ],\r\n exports: []\r\n})\r\nexport class ActiveDirectoryModule {\r\n static forRoot(config: ServiceConfig): ModuleWithProviders<ActiveDirectoryModule> {\r\n return {\r\n ngModule: ActiveDirectoryModule,\r\n providers: [\r\n ActiveDirectoryService,\r\n { provide: ServiceConfig, useValue: config }\r\n ]\r\n };\r\n }\r\n\r\n constructor(@Optional() @SkipSelf() parentModule: ActiveDirectoryModule) {\r\n if (parentModule) {\r\n throw new Error(\r\n 'ActiveDirectoryModule is already loaded. Import it in the AppModule only');\r\n }\r\n }\r\n}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":["NgxLibServiceConfig"],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  import { ServiceConfig as ServiceConfig$1 } from '@cleavelandprice/ngx-lib/authentication';
2
+ import { HttpClient } from '@angular/common/http';
2
3
  import * as i0 from '@angular/core';
3
- import { EventEmitter, Injectable, Optional, Output, NgModule, SkipSelf } from '@angular/core';
4
- import * as i2 from '@angular/common/http';
4
+ import { inject, EventEmitter, Injectable, Output, NgModule, Optional, SkipSelf } from '@angular/core';
5
5
  import { CommonModule } from '@angular/common';
6
6
 
7
7
  //import { ServiceConfig as NgxLibServiceConfig } from '@cleavelandprice/ngx-lib';
@@ -25,16 +25,17 @@ class AuthenticationService {
25
25
  }
26
26
  //#endregion
27
27
  //#region Lifecycle
28
- constructor(config, http) {
29
- this.config = config;
30
- this.http = http;
28
+ constructor() {
31
29
  //#region Fields
30
+ //#region Services
31
+ this.config = inject(ServiceConfig, { optional: true }) ?? new ServiceConfig();
32
+ this.http = inject(HttpClient);
33
+ //#endregion
32
34
  this.authenticatedChanged = new EventEmitter();
33
35
  this.authenticatingChanged = new EventEmitter();
34
36
  this.authenticationError = new EventEmitter();
35
37
  this.authenticating = false; // Flag set to true while the service is attempting to authenticate the user
36
38
  this.authenticated = false; // Flag set to true when the user is successfully authenticated
37
- this.config = this.config ?? new ServiceConfig();
38
39
  this.checkForExistingToken();
39
40
  }
40
41
  //#endregion
@@ -46,11 +47,11 @@ class AuthenticationService {
46
47
  password,
47
48
  adminGroup,
48
49
  additionalInfo,
49
- appName: this.config.appName
50
+ appName: this.config?.appName
50
51
  };
51
52
  this.authenticating = true;
52
53
  this.authenticatingChanged.emit(this.authenticating);
53
- this.http.post(`${this.config.apiUrl}${this.config.authenticateEndpoint}`, request)
54
+ this.http.post(`${this.config?.apiUrl}${this.config?.authenticateEndpoint}`, request)
54
55
  .subscribe({
55
56
  next: (user) => {
56
57
  if (user) {
@@ -85,19 +86,23 @@ class AuthenticationService {
85
86
  employeeNumber: token.employeeNumber,
86
87
  memberOf: token.memberOf.join(',')
87
88
  };
88
- this.storage.setItem(this.config.tokenName, JSON.stringify(token));
89
+ if (this.config?.tokenName) {
90
+ this.storage.setItem(this.config.tokenName, JSON.stringify(token));
91
+ }
89
92
  this.authenticated = true;
90
93
  this.authenticatedChanged.emit(this.authenticated);
91
94
  this.authenticating = false;
92
95
  this.authenticatingChanged.emit(this.authenticating);
93
96
  }
94
97
  checkForExistingToken() {
95
- const token = this.storage.getItem(this.config.tokenName);
96
- if (token) {
97
- this.validateUser(JSON.parse(token));
98
+ if (this.config?.tokenName) {
99
+ const token = this.storage.getItem(this.config.tokenName);
100
+ if (token) {
101
+ this.validateUser(JSON.parse(token));
102
+ }
98
103
  }
99
104
  }
100
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.1.2", ngImport: i0, type: AuthenticationService, deps: [{ token: ServiceConfig, optional: true }, { token: i2.HttpClient }], target: i0.ɵɵFactoryTarget.Injectable }); }
105
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.1.2", ngImport: i0, type: AuthenticationService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
101
106
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.1.2", ngImport: i0, type: AuthenticationService, providedIn: 'root' }); }
102
107
  }
103
108
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.1.2", ngImport: i0, type: AuthenticationService, decorators: [{
@@ -105,9 +110,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.1.2", ngImpor
105
110
  args: [{
106
111
  providedIn: 'root'
107
112
  }]
108
- }], ctorParameters: () => [{ type: ServiceConfig, decorators: [{
109
- type: Optional
110
- }] }, { type: i2.HttpClient }], propDecorators: { authenticatedChanged: [{
113
+ }], ctorParameters: () => [], propDecorators: { authenticatedChanged: [{
111
114
  type: Output
112
115
  }], authenticatingChanged: [{
113
116
  type: Output