@c8y/ngx-components 1021.60.0 → 1021.62.1

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 (119) hide show
  1. package/alarms/alarm-details.component.d.ts +0 -4
  2. package/alarms/alarm-details.component.d.ts.map +1 -1
  3. package/core/authentication/new-password.component.d.ts +6 -3
  4. package/core/authentication/new-password.component.d.ts.map +1 -1
  5. package/core/common/interval-based-reload.abstract.d.ts +12 -1
  6. package/core/common/interval-based-reload.abstract.d.ts.map +1 -1
  7. package/core/common/permissions.service.d.ts +2 -0
  8. package/core/common/permissions.service.d.ts.map +1 -1
  9. package/core/common/tenant-ui.service.d.ts +9 -2
  10. package/core/common/tenant-ui.service.d.ts.map +1 -1
  11. package/core/forms/phone-validation.directive.d.ts +3 -6
  12. package/core/forms/phone-validation.directive.d.ts.map +1 -1
  13. package/core/router/router.module.d.ts.map +1 -1
  14. package/device-provisioned-certificates/device-provisioned-certificates.service.d.ts.map +1 -1
  15. package/esm2022/alarms/alarm-details.component.mjs +10 -10
  16. package/esm2022/core/authentication/new-password.component.mjs +26 -5
  17. package/esm2022/core/common/interval-based-reload.abstract.mjs +50 -2
  18. package/esm2022/core/common/permissions.service.mjs +3 -1
  19. package/esm2022/core/common/tenant-ui.service.mjs +28 -6
  20. package/esm2022/core/forms/phone-validation.directive.mjs +18 -19
  21. package/esm2022/core/router/router.module.mjs +1 -5
  22. package/esm2022/core/user/user-edit.component.mjs +1 -1
  23. package/esm2022/device-provisioned-certificates/device-provisioned-certificates.service.mjs +8 -3
  24. package/esm2022/tenants/custom-properties/custom-properties.component.mjs +25 -5
  25. package/esm2022/tenants/existing-tenant.guard.mjs +18 -0
  26. package/esm2022/tenants/index.mjs +3 -1
  27. package/esm2022/tenants/support-user-access/support-user-access.component.mjs +31 -0
  28. package/esm2022/tenants/tenant-form/tenant-form-inputs-definitions.mjs +116 -0
  29. package/esm2022/tenants/tenant-form/tenant-form.component.mjs +294 -0
  30. package/esm2022/tenants/tenant-limits/tenant-limits-definitions.mjs +10 -17
  31. package/esm2022/tenants/tenant-limits/tenant-limits.component.mjs +42 -29
  32. package/esm2022/tenants/tenant-list/tenant-list.component.mjs +17 -8
  33. package/esm2022/tenants/tenants.model.mjs +30 -1
  34. package/esm2022/tenants/tenants.module.mjs +57 -22
  35. package/esm2022/translation-editor/data/translation-store.service.mjs +11 -8
  36. package/esm2022/translation-editor/index.mjs +22 -5
  37. package/esm2022/translation-editor/lazy/advanced-translation-editor/advanced-translation-editor.component.mjs +136 -0
  38. package/esm2022/translation-editor/lazy/index.mjs +2 -1
  39. package/esm2022/translation-editor/translation-editor-tab-factory.service.mjs +40 -0
  40. package/esm2022/translation-editor/translation-editor.constants.mjs +4 -0
  41. package/esm2022/upgrade/upgraded-services/index.mjs +2 -1
  42. package/esm2022/upgrade/upgraded-services/tenant-policies.service.mjs +11 -0
  43. package/esm2022/upgrade/upgraded-services/upgraded-services.module.mjs +12 -3
  44. package/esm2022/widgets/implementations/alarms/alarm-widget-alarms-reload.component.mjs +9 -7
  45. package/esm2022/widgets/implementations/datapoints-table/datapoints-table-view/datapoints-reload/datapoints-reload.component.mjs +9 -7
  46. package/fesm2022/c8y-ngx-components-alarms.mjs +5 -5
  47. package/fesm2022/c8y-ngx-components-alarms.mjs.map +1 -1
  48. package/fesm2022/c8y-ngx-components-device-provisioned-certificates.mjs +7 -2
  49. package/fesm2022/c8y-ngx-components-device-provisioned-certificates.mjs.map +1 -1
  50. package/fesm2022/c8y-ngx-components-tenants.mjs +603 -82
  51. package/fesm2022/c8y-ngx-components-tenants.mjs.map +1 -1
  52. package/fesm2022/c8y-ngx-components-translation-editor-data.mjs +9 -6
  53. package/fesm2022/c8y-ngx-components-translation-editor-data.mjs.map +1 -1
  54. package/fesm2022/c8y-ngx-components-translation-editor-lazy.mjs +127 -2
  55. package/fesm2022/c8y-ngx-components-translation-editor-lazy.mjs.map +1 -1
  56. package/fesm2022/c8y-ngx-components-translation-editor.mjs +58 -4
  57. package/fesm2022/c8y-ngx-components-translation-editor.mjs.map +1 -1
  58. package/fesm2022/c8y-ngx-components-upgrade-upgraded-services.mjs +22 -3
  59. package/fesm2022/c8y-ngx-components-upgrade-upgraded-services.mjs.map +1 -1
  60. package/fesm2022/c8y-ngx-components-widgets-implementations-alarms.mjs +8 -6
  61. package/fesm2022/c8y-ngx-components-widgets-implementations-alarms.mjs.map +1 -1
  62. package/fesm2022/c8y-ngx-components-widgets-implementations-datapoints-table.mjs +8 -6
  63. package/fesm2022/c8y-ngx-components-widgets-implementations-datapoints-table.mjs.map +1 -1
  64. package/fesm2022/c8y-ngx-components.mjs +499 -413
  65. package/fesm2022/c8y-ngx-components.mjs.map +1 -1
  66. package/locales/de.po +17 -25
  67. package/locales/es.po +17 -25
  68. package/locales/fr.po +17 -25
  69. package/locales/ja_JP.po +17 -25
  70. package/locales/ko.po +17 -25
  71. package/locales/locales.pot +34 -24
  72. package/locales/nl.po +17 -25
  73. package/locales/pl.po +17 -25
  74. package/locales/pt_BR.po +17 -25
  75. package/locales/zh_CN.po +17 -25
  76. package/locales/zh_TW.po +17 -25
  77. package/package.json +1 -1
  78. package/tenants/custom-properties/custom-properties.component.d.ts +4 -2
  79. package/tenants/custom-properties/custom-properties.component.d.ts.map +1 -1
  80. package/tenants/existing-tenant.guard.d.ts +13 -0
  81. package/tenants/existing-tenant.guard.d.ts.map +1 -0
  82. package/tenants/index.d.ts +2 -0
  83. package/tenants/index.d.ts.map +1 -1
  84. package/tenants/support-user-access/support-user-access.component.d.ts +18 -0
  85. package/tenants/support-user-access/support-user-access.component.d.ts.map +1 -0
  86. package/tenants/tenant-form/tenant-form-inputs-definitions.d.ts +113 -0
  87. package/tenants/tenant-form/tenant-form-inputs-definitions.d.ts.map +1 -0
  88. package/tenants/tenant-form/tenant-form.component.d.ts +79 -0
  89. package/tenants/tenant-form/tenant-form.component.d.ts.map +1 -0
  90. package/tenants/tenant-limits/tenant-limits-definitions.d.ts +11 -15
  91. package/tenants/tenant-limits/tenant-limits-definitions.d.ts.map +1 -1
  92. package/tenants/tenant-limits/tenant-limits.component.d.ts +9 -7
  93. package/tenants/tenant-limits/tenant-limits.component.d.ts.map +1 -1
  94. package/tenants/tenant-list/tenant-list.component.d.ts +6 -3
  95. package/tenants/tenant-list/tenant-list.component.d.ts.map +1 -1
  96. package/tenants/tenants.model.d.ts +31 -0
  97. package/tenants/tenants.model.d.ts.map +1 -1
  98. package/tenants/tenants.module.d.ts +4 -2
  99. package/tenants/tenants.module.d.ts.map +1 -1
  100. package/translation-editor/data/translation-store.service.d.ts +3 -2
  101. package/translation-editor/data/translation-store.service.d.ts.map +1 -1
  102. package/translation-editor/index.d.ts.map +1 -1
  103. package/translation-editor/lazy/advanced-translation-editor/advanced-translation-editor.component.d.ts +28 -0
  104. package/translation-editor/lazy/advanced-translation-editor/advanced-translation-editor.component.d.ts.map +1 -0
  105. package/translation-editor/lazy/index.d.ts +1 -0
  106. package/translation-editor/lazy/index.d.ts.map +1 -1
  107. package/translation-editor/translation-editor-tab-factory.service.d.ts +22 -0
  108. package/translation-editor/translation-editor-tab-factory.service.d.ts.map +1 -0
  109. package/translation-editor/translation-editor.constants.d.ts +4 -0
  110. package/translation-editor/translation-editor.constants.d.ts.map +1 -0
  111. package/upgrade/upgraded-services/index.d.ts +1 -0
  112. package/upgrade/upgraded-services/index.d.ts.map +1 -1
  113. package/upgrade/upgraded-services/tenant-policies.service.d.ts +11 -0
  114. package/upgrade/upgraded-services/tenant-policies.service.d.ts.map +1 -0
  115. package/upgrade/upgraded-services/upgraded-services.module.d.ts.map +1 -1
  116. package/widgets/implementations/alarms/alarm-widget-alarms-reload.component.d.ts +7 -2
  117. package/widgets/implementations/alarms/alarm-widget-alarms-reload.component.d.ts.map +1 -1
  118. package/widgets/implementations/datapoints-table/datapoints-table-view/datapoints-reload/datapoints-reload.component.d.ts +7 -2
  119. package/widgets/implementations/datapoints-table/datapoints-table-view/datapoints-reload/datapoints-reload.component.d.ts.map +1 -1
@@ -4,7 +4,7 @@ import * as i1$4 from 'ngx-bootstrap/dropdown';
4
4
  import { BsDropdownModule, BsDropdownDirective } from 'ngx-bootstrap/dropdown';
5
5
  import * as i3 from '@angular/cdk/a11y';
6
6
  import { A11yModule, CdkTrapFocus } from '@angular/cdk/a11y';
7
- import { castArray, flatten, uniq, sortBy, groupBy, camelCase, isEqual, isUndefined, throttle as throttle$1, keys, get, isNaN as isNaN$1, isFinite, each, mapValues, mapKeys, forEach, reduce, union, cloneDeep, uniqBy, assign, min, every, first, map as map$2, find, negate, upperFirst, memoize as memoize$1, property, some, entries, omitBy, isDate, orderBy, flatMap, isEmpty, filter as filter$2, snakeCase, matches, isString, clone, toNumber, isEqualWith, escape as escape$1, escapeRegExp, assignWith, set, omit, pick, has, transform, identity, flow, isNil, chunk, values, without, indexOf, parseInt as parseInt$1, kebabCase, forOwn } from 'lodash-es';
7
+ import { castArray, flatten, uniq, sortBy, groupBy, camelCase, isEqual, isUndefined, throttle as throttle$1, keys, get, isNaN as isNaN$1, isFinite, each, mapValues, mapKeys, forEach, reduce, union, cloneDeep, uniqBy, assign, min, every, first, map as map$2, find, negate, upperFirst, memoize as memoize$1, property, some, entries, omitBy, isDate, pick, flatMap, orderBy, isEmpty, filter as filter$2, snakeCase, matches, isString, clone, toNumber, isEqualWith, escape as escape$1, escapeRegExp, assignWith, set, omit, has, transform, identity, flow, isNil, chunk, values, without, indexOf, parseInt as parseInt$1, kebabCase, forOwn } from 'lodash-es';
8
8
  import { merge, of, defer, combineLatest, race, isObservable, from, Subject, BehaviorSubject, NEVER, Observable, firstValueFrom, map as map$1, distinctUntilChanged as distinctUntilChanged$1, fromEvent, pipe, throwError, concat, filter as filter$1, tap as tap$1, EMPTY, timer, fromEventPattern, startWith as startWith$1, switchMap as switchMap$1, takeUntil as takeUntil$1, empty, forkJoin, ReplaySubject, interval, shareReplay as shareReplay$1, mergeMap as mergeMap$1 } from 'rxjs';
9
9
  import { map, distinctUntilChanged, filter, startWith, switchMap, take, shareReplay, scan, debounceTime, share, takeUntil, tap, catchError, first as first$1, retryWhen, delay, concatMap, debounce, sample, withLatestFrom, mergeMap, every as every$1, toArray, merge as merge$1, expand, skip, mapTo, finalize, reduce as reduce$1, combineLatestWith } from 'rxjs/operators';
10
10
  import * as i1 from '@c8y/client';
@@ -6995,6 +6995,8 @@ class Permissions {
6995
6995
  static { this.ROLE_SMARTRULE_READ = 'ROLE_SMARTRULE_READ'; }
6996
6996
  static { this.ROLE_SMS_ADMIN = 'ROLE_SMS_ADMIN'; }
6997
6997
  static { this.ROLE_SMS_READ = 'ROLE_SMS_READ'; }
6998
+ static { this.ROLE_SUPPORT_ADMIN = 'ROLE_SUPPORT_ADMIN'; }
6999
+ static { this.ROLE_SUPPORT_READ = 'ROLE_SUPPORT_READ'; }
6998
7000
  static { this.ROLE_TENANT_ADMIN = 'ROLE_TENANT_ADMIN'; }
6999
7001
  static { this.ROLE_TENANT_MANAGEMENT_ADMIN = 'ROLE_TENANT_MANAGEMENT_ADMIN'; }
7000
7002
  static { this.ROLE_TENANT_MANAGEMENT_CREATE = 'ROLE_TENANT_MANAGEMENT_CREATE'; }
@@ -8818,9 +8820,10 @@ const operationStatusClasses = {
8818
8820
 
8819
8821
  /** The helper UI service for tenant related methods built upon client services. */
8820
8822
  class TenantUiService {
8821
- constructor(userService, appStateService) {
8823
+ constructor(userService, appStateService, tenantLoginOption) {
8822
8824
  this.userService = userService;
8823
8825
  this.appStateService = appStateService;
8826
+ this.tenantLoginOption = tenantLoginOption;
8824
8827
  this.MANAGEMENT = 'management';
8825
8828
  this.ROLE_TENANT_MANAGEMENT_READ = Permissions.ROLE_TENANT_MANAGEMENT_READ;
8826
8829
  }
@@ -9031,6 +9034,27 @@ class TenantUiService {
9031
9034
  .map(appRef => appRef.application)
9032
9035
  .filter(app => app.type === ApplicationType.MICROSERVICE);
9033
9036
  }
9037
+ /**
9038
+ * Gets password constraints setting from loginOptions.
9039
+ * @returns Returns Promise<PasswordStrengthSettings> with password properties.
9040
+ */
9041
+ async getPasswordStrengthSettings() {
9042
+ return this.tenantLoginOption.list({}).then(res => {
9043
+ const loginOptionWithPasswordSettings = res.data.find(({ type }) => [TenantLoginOptionType.BASIC, TenantLoginOptionType.OAUTH2_INTERNAL].includes(type));
9044
+ if (!loginOptionWithPasswordSettings) {
9045
+ return {
9046
+ enforceStrength: true,
9047
+ greenMinLength: 8,
9048
+ strengthValidity: true
9049
+ };
9050
+ }
9051
+ return pick(loginOptionWithPasswordSettings, [
9052
+ 'enforceStrength',
9053
+ 'greenMinLength',
9054
+ 'strengthValidity'
9055
+ ]);
9056
+ });
9057
+ }
9034
9058
  hasApp(apps, requiredAppName) {
9035
9059
  if (!apps?.length) {
9036
9060
  return false;
@@ -9040,13 +9064,13 @@ class TenantUiService {
9040
9064
  isManagement(currentTenant) {
9041
9065
  return currentTenant.name === this.MANAGEMENT;
9042
9066
  }
9043
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: TenantUiService, deps: [{ token: i1.UserService }, { token: AppStateService }], target: i0.ɵɵFactoryTarget.Injectable }); }
9067
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: TenantUiService, deps: [{ token: i1.UserService }, { token: AppStateService }, { token: i1.TenantLoginOptionsService }], target: i0.ɵɵFactoryTarget.Injectable }); }
9044
9068
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: TenantUiService, providedIn: 'root' }); }
9045
9069
  }
9046
9070
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: TenantUiService, decorators: [{
9047
9071
  type: Injectable,
9048
9072
  args: [{ providedIn: 'root' }]
9049
- }], ctorParameters: () => [{ type: i1.UserService }, { type: AppStateService }] });
9073
+ }], ctorParameters: () => [{ type: i1.UserService }, { type: AppStateService }, { type: i1.TenantLoginOptionsService }] });
9050
9074
 
9051
9075
  class ZipService {
9052
9076
  getEntries(zipFile) {
@@ -9388,157 +9412,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
9388
9412
  args: [{ providedIn: 'root' }]
9389
9413
  }] });
9390
9414
 
9391
- /**
9392
- * Abstract class representing an interval reload functionality.
9393
- * This class provides methods and properties for managing an interval-based reload mechanism.
9394
- */
9395
- class IntervalBasedReload {
9396
- /**
9397
- * Stops the countdown and triggers a refresh action.
9398
- * This function is responsible for halting the countdown interval component's operation.
9399
- * After stopping the countdown, it emits an `onCountdownEnded` event.
9400
- * This event is used to inform external components that the countdown has ended,
9401
- * typically prompting them to reload or refresh their data.
9402
- */
9403
- autoRefreshList() {
9404
- if (this.isIntervalRefreshToggleOn && this.isAutoRefreshEnabled) {
9405
- this.countdownIntervalComponent.stop();
9406
- }
9407
- this.onCountdownEnded.emit();
9408
- }
9409
- /**
9410
- * Manages the countdown timer's visibility and state in response to user scrolling.
9411
- *
9412
- * This method toggles the countdown timer based on the user's scrolling behavior. It uses
9413
- * the `disableCountdown` and `enableCountdown` methods for handling the countdown state.
9414
- *
9415
- * - If the user is scrolling down while the countdown is visible (`isScrolling` is true and
9416
- * `hideCountdown` is false), `disableCountdown` is called to stop and hide the countdown,
9417
- * and `isIntervalRefreshToggleOn` is set to false.
9418
- *
9419
- * - If the user has stopped scrolling, the countdown subscription is closed, and the countdown
9420
- * is hidden (`!isScrolling`, `countdownSubscription?.closed`, `hideCountdown`), `enableCountdown`
9421
- * is called to show and restart the countdown, and `isIntervalRefreshToggleOn` is set to true.
9422
- */
9423
- handleScrolling() {
9424
- // Checks if the user has scrolled down while the countdown is visible
9425
- const onUserScrollDownHide = this.isScrolling && !this.hideCountdown;
9426
- if (onUserScrollDownHide) {
9427
- this.disableCountdown();
9428
- this.isIntervalRefreshToggleOn = false;
9429
- return;
9430
- }
9431
- // Checks if the user has stopped scrolling and the countdown is currently hidden
9432
- const onUserScrollTopShow = !this.isScrolling && this.countdownSubscription?.closed && this.hideCountdown;
9433
- if (onUserScrollTopShow) {
9434
- this.isIntervalRefreshToggleOn = true;
9435
- this.enableCountdown();
9436
- }
9437
- }
9438
- /**
9439
- * Handles the toggle state of the countdown on button click.
9440
- *
9441
- * This method is triggered by a mouse event, typically a click on the countdown toggle button.
9442
- * It toggles `isIntervalRefreshToggleOn` to reflect the current state of the countdown timer.
9443
- *
9444
- * - If `isIntervalRefreshToggleOn` is set to false, indicating that the countdown should be stopped,
9445
- * `disableCountdown` is called, and `manuallyDisabledCountdown` is set to true.
9446
- *
9447
- * - If `isIntervalRefreshToggleOn` is true and the countdown subscription is closed, indicating that
9448
- * the countdown can be started, `enableCountdown` is called, and `manuallyDisabledCountdown`
9449
- * is set to false.
9450
- *
9451
- * @param $event - The MouseEvent that triggered this method.
9452
- */
9453
- onToggleCountdownButtonState($event) {
9454
- $event.preventDefault();
9455
- this.isIntervalRefreshToggleOn = !this.isRefreshDisabled && !this.isIntervalRefreshToggleOn;
9456
- this.updateCountdownButtonTooltipText();
9457
- if (!this.isIntervalRefreshToggleOn) {
9458
- this.disableCountdown();
9459
- this.manuallyDisabledCountdown = true;
9460
- return;
9461
- }
9462
- const onRefreshToggleOn = this.isIntervalRefreshToggleOn && this.countdownSubscription.closed;
9463
- if (onRefreshToggleOn) {
9464
- this.enableCountdown();
9465
- this.manuallyDisabledCountdown = false;
9466
- }
9467
- }
9468
- /**
9469
- * This function listens for changes in the `isLoading` observable, filtering out any truthy values.
9470
- * Once a falsy value is detected (indicating that loading has finished), it attempts to start the countdown.
9471
- *
9472
- * IMPORTANT: If the widget's configuration (refreshInterval, check template) is not set prior to executing countdownIntervalComponent?.start,
9473
- * the countdown interval will not start!
9474
- *
9475
- * @param injector - The injector used to provide necessary dependencies
9476
- * within the `runInInjectionContext`.
9477
- */
9478
- startCountdown() {
9479
- this.countdownSubscription = this.isLoading
9480
- .pipe(filter$1(isLoading => !Boolean(isLoading)), tap$1(() => {
9481
- this.countdownIntervalComponent?.start();
9482
- }))
9483
- .subscribe();
9484
- }
9485
- /**
9486
- * Disables and hides the countdown timer.
9487
- *
9488
- * This method stops the ongoing countdown process by
9489
- * stopping the `countdownIntervalComponent` if it exists. It then hides the countdown timer
9490
- * by setting `hideCountdown` to true. This method encapsulates the logic required to halt and
9491
- * conceal the countdown timer.
9492
- */
9493
- disableCountdown() {
9494
- this.countdownSubscription.unsubscribe();
9495
- this.countdownIntervalComponent?.stop();
9496
- this.hideCountdown = true;
9497
- }
9498
- }
9499
-
9500
- class AppSwitcherService {
9501
- constructor(ui) {
9502
- this.ui = ui;
9503
- this.visibleApplicationTypes = ['HOSTED', 'EXTERNAL'];
9504
- const { currentTenant } = this.ui;
9505
- this.appsOfCurrentUser$ = this.ui.currentAppsOfUser.pipe(map(apps => this.filterVisible(apps)), shareReplay(1));
9506
- this.oneCloudApps$ = this.appsOfCurrentUser$.pipe(map(apps => apps.filter(app => this.isCloudApp(app))), map(cloudApps => this.orderApps(cloudApps)), shareReplay(1));
9507
- const nonCloudApps$ = this.appsOfCurrentUser$.pipe(map(apps => apps.filter(app => !this.isCloudApp(app))));
9508
- this.apps$ = combineLatest([nonCloudApps$, currentTenant]).pipe(map(([apps, tenant]) => this.filterDuplicates(apps, tenant)), map(apps => this.orderApps(apps)), shareReplay(1));
9509
- this.finishedLoading$ = combineLatest([this.apps$, this.oneCloudApps$]).pipe(map(() => true), take(1), shareReplay(1));
9510
- }
9511
- filterVisible(apps) {
9512
- return apps.filter(app => this.visibleApplicationTypes.includes(app.type) &&
9513
- !app.noAppSwitcher &&
9514
- !this.isPackage(app) &&
9515
- !get(app, 'manifest.noAppSwitcher'));
9516
- }
9517
- isPackage(app) {
9518
- return !!app.manifest?.isPackage;
9519
- }
9520
- isCloudApp(app) {
9521
- return !!app.cloud;
9522
- }
9523
- filterDuplicates(apps, tenant) {
9524
- // Filter out apps that have duplicate contextpaths and are not own owned by the current tenant;
9525
- const filterFn = app => !apps.some(otherApp => app !== otherApp &&
9526
- app.contextPath &&
9527
- app.contextPath === otherApp.contextPath &&
9528
- app.owner.tenant.id !== tenant.name);
9529
- return apps.filter(filterFn);
9530
- }
9531
- orderApps(apps) {
9532
- return orderBy(apps, ({ name }) => name.toLowerCase());
9533
- }
9534
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AppSwitcherService, deps: [{ token: AppStateService }], target: i0.ɵɵFactoryTarget.Injectable }); }
9535
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AppSwitcherService, providedIn: 'root' }); }
9536
- }
9537
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AppSwitcherService, decorators: [{
9538
- type: Injectable,
9539
- args: [{ providedIn: 'root' }]
9540
- }], ctorParameters: () => [{ type: AppStateService }] });
9541
-
9542
9415
  /**
9543
9416
  * This service is handling the cookie banner and cookie preferences related logic.
9544
9417
  */
@@ -10169,6 +10042,434 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
10169
10042
  args: ['click']
10170
10043
  }] } });
10171
10044
 
10045
+ class UserEngagementsService {
10046
+ constructor(document, userPreferencesService, gainsightService) {
10047
+ this.document = document;
10048
+ this.userPreferencesService = userPreferencesService;
10049
+ this.gainsightService = gainsightService;
10050
+ this.USER_PREFERENCES_GAINSIGHT_ENGAGEMENTS_KEY = 'gainsightBotEnabled';
10051
+ this.userEngagementsEnabled$ = new BehaviorSubject(false);
10052
+ this.HIDE_GAINSIGHT_BOT_STYLE_ID = 'hide-gs-bot';
10053
+ this.ENGAGEMENTS = 'engagements';
10054
+ this.handleUserEngagements();
10055
+ }
10056
+ /**
10057
+ * Handles user engagement settings based on various conditions.
10058
+ *
10059
+ * - Waits for the Gainsight tracking to be loaded.
10060
+ * - Retrieves the engagement settings.
10061
+ * - Updates the engagement settings based on the combined observations.
10062
+ * - Finally, toggles the Gainsight engagements based on the latest `userEngagementsEnabled$` value.
10063
+ */
10064
+ handleUserEngagements() {
10065
+ this.gainsightService.trackingLoaded$
10066
+ .pipe(take(1), switchMap(() => this.getEngagementSettingsObservable()), tap((settings) => this.updateUserEngagementSettings(...settings)), switchMap(() => this.userEngagementsEnabled$.pipe(take(1))))
10067
+ .subscribe(isEnabled => this.toggleGainsightEngagements(isEnabled));
10068
+ }
10069
+ /**
10070
+ * Updates the user's preference for Gainsight Engagements.
10071
+ * @param {boolean} isEnabled - The new value for the user's engagement preference.
10072
+ */
10073
+ updateUserEngagementPreference(isEnabled) {
10074
+ this.userEngagementsEnabled$.next(isEnabled);
10075
+ this.userPreferencesService.set(this.gainsightService.USER_PREFERENCES_GAINSIGHT_ENGAGEMENTS_KEY, this.userEngagementsEnabled$.value);
10076
+ }
10077
+ /**
10078
+ * Toggles the visibility of Gainsight Engagements based on the provided flag.
10079
+ *
10080
+ * @param isEnabled - A flag indicating whether Gainsight Engagements should be visible.
10081
+ */
10082
+ toggleGainsightEngagements(isEnabled) {
10083
+ isEnabled ? this.showGainsightEngagements() : this.hideGainsightEngagements();
10084
+ }
10085
+ /**
10086
+ * Constructs an observable that emits an array of boolean values representing
10087
+ * the current engagement settings. The observable combines the latest values from:
10088
+ *
10089
+ * 1. User's preferences for Gainsight engagements.
10090
+ * 2. A flag indicating if PII data should be sent.
10091
+ * 3. A flag indicating if the platform uses custom branding.
10092
+ *
10093
+ * @returns An observable emitting an array of boolean values.
10094
+ */
10095
+ getEngagementSettingsObservable() {
10096
+ return combineLatest([
10097
+ this.userPreferencesService.observe(this.USER_PREFERENCES_GAINSIGHT_ENGAGEMENTS_KEY),
10098
+ from(this.gainsightService.shouldSendPiiData()),
10099
+ of(this.gainsightService.isCustomBranding())
10100
+ ]);
10101
+ }
10102
+ /**
10103
+ * Updates user engagement settings based on provided preferences and settings.
10104
+ *
10105
+ * Based on the received values, the method decides to:
10106
+ * 1. Disable user engagements if PII data should not be shared or certain branding/settings conditions are met.
10107
+ * 2. Update the user engagement preference if the user engagement bot setting is undefined.
10108
+ *
10109
+ * @param userEngagementBotSetting - The user's setting for the engagement bot.
10110
+ * @param shouldSendPiiData - Indicates whether PII data should be shared.
10111
+ * @param hasCustomBranding - Indicates if custom branding is applied.
10112
+ */
10113
+ updateUserEngagementSettings(userEngagementBotSetting, shouldSendPiiData, hasCustomBranding) {
10114
+ if (this.shouldDisableUserEngagementsDueToPIIData(shouldSendPiiData)) {
10115
+ this.userEngagementsEnabled$.next(false);
10116
+ }
10117
+ else if (this.isUserEngagementBotSettingUndefined(userEngagementBotSetting)) {
10118
+ /**
10119
+ * Case where the user is new (freshly created) and has not changed the user engagement settings in the user edit modal (untouched state).
10120
+ * When custom branding is not set, we will set the user engagements in the user preferences to true by default.
10121
+ */
10122
+ this.updateUserEngagementPreference(!hasCustomBranding);
10123
+ }
10124
+ else {
10125
+ this.userEngagementsEnabled$.next(userEngagementBotSetting);
10126
+ }
10127
+ }
10128
+ /**
10129
+ * Determines whether user engagements should be disabled due to PII data settings.
10130
+ *
10131
+ * If the `shouldSendPiiData` parameter is false, this indicates that the user engagements
10132
+ * should be disabled to prevent sharing personally identifiable information.
10133
+ *
10134
+ * @param {boolean} shouldSendPiiData - Indicates whether PII data is allowed to be sent.
10135
+ * @returns {boolean} Returns true if user engagements should be disabled, otherwise false.
10136
+ */
10137
+ shouldDisableUserEngagementsDueToPIIData(shouldSendPiiData) {
10138
+ return !shouldSendPiiData;
10139
+ }
10140
+ /**
10141
+ * Determines if the user engagement bot setting is undefined.
10142
+ *
10143
+ * @param {boolean | undefined} userEngagementBotSetting - The setting value to check.
10144
+ * @returns {boolean} Returns `true` if the setting is undefined; otherwise, `false`.
10145
+ *
10146
+ * This scenario occurs when a user is new and hasn't modified the bot settings in the user details UI yet.
10147
+ */
10148
+ isUserEngagementBotSettingUndefined(userEngagementBotSetting) {
10149
+ return userEngagementBotSetting === undefined;
10150
+ }
10151
+ /**
10152
+ * Enables the visibility of Gainsight engagements.
10153
+ *
10154
+ * This method removes the CSS styles that hide the Gainsight engagements
10155
+ * and updates the relevant user attribute to mark the engagements as visible.
10156
+ */
10157
+ showGainsightEngagements() {
10158
+ this.removeHidingStyle(this.HIDE_GAINSIGHT_BOT_STYLE_ID);
10159
+ this.gainsightService.updateUserAttribute(this.ENGAGEMENTS, true);
10160
+ }
10161
+ /**
10162
+ * Hides the Gainsight engagements.
10163
+ *
10164
+ * This method applies CSS styles to hide the Gainsight engagements
10165
+ * and updates the relevant user attribute to mark the engagements as hidden.
10166
+ */
10167
+ hideGainsightEngagements() {
10168
+ this.addHidingStyle(this.HIDE_GAINSIGHT_BOT_STYLE_ID, '#apt-widget { display:none }');
10169
+ this.gainsightService.updateUserAttribute(this.ENGAGEMENTS, false);
10170
+ }
10171
+ /**
10172
+ * Removes the specified CSS style from the document.
10173
+ *
10174
+ * @param {string} styleId - The ID of the CSS style element to remove.
10175
+ */
10176
+ removeHidingStyle(styleId) {
10177
+ const style = this.document.getElementById(styleId);
10178
+ style?.remove();
10179
+ }
10180
+ /**
10181
+ * Adds a new CSS style to the document.
10182
+ *
10183
+ * If the style with the specified ID already exists, the method will do nothing.
10184
+ * Otherwise, it creates a new `<style>` element with the given ID and content,
10185
+ * then appends it to the document head.
10186
+ *
10187
+ * @param {string} styleId - The ID to assign to the new style element.
10188
+ * @param {string} textContent - The CSS rules to be included in the style.
10189
+ */
10190
+ addHidingStyle(styleId, textContent) {
10191
+ if (this.document.getElementById(styleId)) {
10192
+ return;
10193
+ }
10194
+ const style = this.document.createElement('style');
10195
+ style.id = styleId;
10196
+ style.textContent = textContent;
10197
+ this.document.head.appendChild(style);
10198
+ }
10199
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: UserEngagementsService, deps: [{ token: DOCUMENT }, { token: UserPreferencesService }, { token: GainsightService }], target: i0.ɵɵFactoryTarget.Injectable }); }
10200
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: UserEngagementsService, providedIn: 'root' }); }
10201
+ }
10202
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: UserEngagementsService, decorators: [{
10203
+ type: Injectable,
10204
+ args: [{ providedIn: 'root' }]
10205
+ }], ctorParameters: () => [{ type: DOCUMENT, decorators: [{
10206
+ type: Inject,
10207
+ args: [DOCUMENT]
10208
+ }] }, { type: UserPreferencesService }, { type: GainsightService }] });
10209
+
10210
+ /**
10211
+ * This module enables an tenant to activate the product experience
10212
+ * software [Gainsight](https://www.gainsight.com/product-experience/) to help
10213
+ * and track user actions.
10214
+ */
10215
+ class ProductExperienceModule {
10216
+ constructor(appState, gainsightService, cookieBannerService,
10217
+ // Don't remove it, otherwise UserEngagementsService won't be initialized.
10218
+ userEngagementsService) {
10219
+ this.appState = appState;
10220
+ this.gainsightService = gainsightService;
10221
+ this.cookieBannerService = cookieBannerService;
10222
+ this.userEngagementsService = userEngagementsService;
10223
+ /**
10224
+ * Check if the Gainsight tracking is disabled in the application apptions. If so, exit early without processing further.
10225
+ */
10226
+ if (this.gainsightService.isTrackingDisabled()) {
10227
+ return;
10228
+ }
10229
+ this.toggleUserTrackingObservable();
10230
+ }
10231
+ /**
10232
+ * Observes several factors to determine the state of user tracking and manages the visibility of Gainsight engagements.
10233
+ * It watches for changes in the current tenant, the state of the cookie banner, and user's preferences for Gainsight engagements.
10234
+ *
10235
+ * 1. If the cookie banner is being displayed, it returns without making any changes.
10236
+ * 2. If Gainsight is disabled at the tenant level via custom properties, it returns without making any changes.
10237
+ * 3. If the conditions are met for loading the Gainsight tag, it loads the tag.
10238
+ */
10239
+ toggleUserTrackingObservable() {
10240
+ combineLatest([
10241
+ this.appState.currentTenant.pipe(filter(Boolean)),
10242
+ this.cookieBannerService.isCookieBannerShowed$
10243
+ ]).subscribe(async ([currentTenant, isCookieBannerShowed]) => {
10244
+ if (isCookieBannerShowed) {
10245
+ return;
10246
+ }
10247
+ const { customProperties } = currentTenant;
10248
+ if (this.gainsightService.isGainsightDisabledAtTenantCustomProperties(customProperties)) {
10249
+ return;
10250
+ }
10251
+ if (this.shouldLoadTag()) {
10252
+ await this.gainsightService.loadTag(currentTenant, await this.gainsightService.shouldSendPiiData());
10253
+ }
10254
+ });
10255
+ }
10256
+ /**
10257
+ * Determines if a tracking tag should be loaded based on cookie preferences.
10258
+ * @returns `true` if user cookie preferences exist, otherwise `false`.
10259
+ */
10260
+ shouldLoadTag() {
10261
+ return !!this.cookieBannerService.getUserCookiePreferences();
10262
+ }
10263
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ProductExperienceModule, deps: [{ token: AppStateService }, { token: GainsightService }, { token: CookieBannerService }, { token: UserEngagementsService }], target: i0.ɵɵFactoryTarget.NgModule }); }
10264
+ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "18.2.13", ngImport: i0, type: ProductExperienceModule, declarations: [ProductExperienceDirective], exports: [ProductExperienceDirective] }); }
10265
+ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ProductExperienceModule, providers: [GainsightService, UserEngagementsService] }); }
10266
+ }
10267
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ProductExperienceModule, decorators: [{
10268
+ type: NgModule,
10269
+ args: [{
10270
+ declarations: [ProductExperienceDirective],
10271
+ exports: [ProductExperienceDirective],
10272
+ providers: [GainsightService, UserEngagementsService]
10273
+ }]
10274
+ }], ctorParameters: () => [{ type: AppStateService }, { type: GainsightService }, { type: CookieBannerService }, { type: UserEngagementsService }] });
10275
+
10276
+ const PRODUCT_EXPERIENCE_INTERVAL_BASED_RELOAD = {
10277
+ EVENTS: {
10278
+ INTERVAL_BASED_RELOAD: 'intervalBasedReload'
10279
+ },
10280
+ COMPONENTS: {
10281
+ ALARM_WIDGET_ALARM_RELOAD: 'alarm-widget-alarms-reload',
10282
+ DATAPOINTS_RELOAD: 'datapoints-reload'
10283
+ },
10284
+ ACTIONS: {
10285
+ MANUALLY_CHANGED_COUNTDOWN_STATE: 'manuallyChangedCountdownState'
10286
+ },
10287
+ RESULT: {
10288
+ MANUALLY_PAUSED_COUNTDOWN: 'manuallyPausedCountdown',
10289
+ MANUALLY_RESUMED_COUNTDOWN: 'manuallyResumedCountdown'
10290
+ }
10291
+ };
10292
+ const WIDGET_TYPE_VALUES = {
10293
+ ALARMS: 'alarms',
10294
+ DATA_POINTS_TABLE: 'dataPointsTable'
10295
+ };
10296
+ /**
10297
+ * Abstract class representing an interval reload functionality.
10298
+ * This class provides methods and properties for managing an interval-based reload mechanism.
10299
+ */
10300
+ class IntervalBasedReload {
10301
+ constructor() {
10302
+ this.gainsightService = inject(GainsightService);
10303
+ }
10304
+ /**
10305
+ * Stops the countdown and triggers a refresh action.
10306
+ * This function is responsible for halting the countdown interval component's operation.
10307
+ * After stopping the countdown, it emits an `onCountdownEnded` event.
10308
+ * This event is used to inform external components that the countdown has ended,
10309
+ * typically prompting them to reload or refresh their data.
10310
+ */
10311
+ autoRefreshList() {
10312
+ if (this.isIntervalRefreshToggleOn && this.isAutoRefreshEnabled) {
10313
+ this.countdownIntervalComponent.stop();
10314
+ }
10315
+ this.onCountdownEnded.emit();
10316
+ }
10317
+ /**
10318
+ * Manages the countdown timer's visibility and state in response to user scrolling.
10319
+ *
10320
+ * This method toggles the countdown timer based on the user's scrolling behavior. It uses
10321
+ * the `disableCountdown` and `enableCountdown` methods for handling the countdown state.
10322
+ *
10323
+ * - If the user is scrolling down while the countdown is visible (`isScrolling` is true and
10324
+ * `hideCountdown` is false), `disableCountdown` is called to stop and hide the countdown,
10325
+ * and `isIntervalRefreshToggleOn` is set to false.
10326
+ *
10327
+ * - If the user has stopped scrolling, the countdown subscription is closed, and the countdown
10328
+ * is hidden (`!isScrolling`, `countdownSubscription?.closed`, `hideCountdown`), `enableCountdown`
10329
+ * is called to show and restart the countdown, and `isIntervalRefreshToggleOn` is set to true.
10330
+ */
10331
+ handleScrolling() {
10332
+ // Checks if the user has scrolled down while the countdown is visible
10333
+ const onUserScrollDownHide = this.isScrolling && !this.hideCountdown;
10334
+ if (onUserScrollDownHide) {
10335
+ this.disableCountdown();
10336
+ this.isIntervalRefreshToggleOn = false;
10337
+ return;
10338
+ }
10339
+ // Checks if the user has stopped scrolling and the countdown is currently hidden
10340
+ const onUserScrollTopShow = !this.isScrolling && this.countdownSubscription?.closed && this.hideCountdown;
10341
+ if (onUserScrollTopShow) {
10342
+ this.isIntervalRefreshToggleOn = true;
10343
+ this.enableCountdown();
10344
+ }
10345
+ }
10346
+ /**
10347
+ * Handles the toggle state of the countdown on button click.
10348
+ *
10349
+ * This method is triggered by a mouse event, typically a click on the countdown toggle button.
10350
+ * It toggles `isIntervalRefreshToggleOn` to reflect the current state of the countdown timer.
10351
+ *
10352
+ * - If `isIntervalRefreshToggleOn` is set to false, indicating that the countdown should be stopped,
10353
+ * `disableCountdown` is called, and `manuallyDisabledCountdown` is set to true.
10354
+ *
10355
+ * - If `isIntervalRefreshToggleOn` is true and the countdown subscription is closed, indicating that
10356
+ * the countdown can be started, `enableCountdown` is called, and `manuallyDisabledCountdown`
10357
+ * is set to false.
10358
+ *
10359
+ * @param $event - The MouseEvent that triggered this method.
10360
+ * @param widgetType - The type of the widget that triggered the event
10361
+ */
10362
+ onToggleCountdownButtonState($event, widgetType) {
10363
+ $event.preventDefault();
10364
+ this.isIntervalRefreshToggleOn = !this.isRefreshDisabled && !this.isIntervalRefreshToggleOn;
10365
+ this.updateCountdownButtonTooltipText();
10366
+ if (!this.isIntervalRefreshToggleOn) {
10367
+ this.disableCountdown();
10368
+ this.manuallyDisabledCountdown = true;
10369
+ this.triggerGainsightEvent(widgetType, PRODUCT_EXPERIENCE_INTERVAL_BASED_RELOAD.ACTIONS.MANUALLY_CHANGED_COUNTDOWN_STATE, PRODUCT_EXPERIENCE_INTERVAL_BASED_RELOAD.RESULT.MANUALLY_PAUSED_COUNTDOWN);
10370
+ return;
10371
+ }
10372
+ const onRefreshToggleOn = this.isIntervalRefreshToggleOn && this.countdownSubscription.closed;
10373
+ if (onRefreshToggleOn) {
10374
+ this.enableCountdown();
10375
+ this.manuallyDisabledCountdown = false;
10376
+ this.triggerGainsightEvent(widgetType, PRODUCT_EXPERIENCE_INTERVAL_BASED_RELOAD.ACTIONS.MANUALLY_CHANGED_COUNTDOWN_STATE, PRODUCT_EXPERIENCE_INTERVAL_BASED_RELOAD.RESULT.MANUALLY_RESUMED_COUNTDOWN);
10377
+ }
10378
+ }
10379
+ /**
10380
+ * This function listens for changes in the `isLoading` observable, filtering out any truthy values.
10381
+ * Once a falsy value is detected (indicating that loading has finished), it attempts to start the countdown.
10382
+ *
10383
+ * IMPORTANT: If the widget's configuration (refreshInterval, check template) is not set prior to executing countdownIntervalComponent?.start,
10384
+ * the countdown interval will not start!
10385
+ *
10386
+ * @param injector - The injector used to provide necessary dependencies
10387
+ * within the `runInInjectionContext`.
10388
+ */
10389
+ startCountdown() {
10390
+ this.countdownSubscription = this.isLoading
10391
+ .pipe(filter$1(isLoading => !Boolean(isLoading)), tap$1(() => {
10392
+ this.countdownIntervalComponent?.start();
10393
+ }))
10394
+ .subscribe();
10395
+ }
10396
+ /**
10397
+ * Disables and hides the countdown timer.
10398
+ *
10399
+ * This method stops the ongoing countdown process by
10400
+ * stopping the `countdownIntervalComponent` if it exists. It then hides the countdown timer
10401
+ * by setting `hideCountdown` to true. This method encapsulates the logic required to halt and
10402
+ * conceal the countdown timer.
10403
+ */
10404
+ disableCountdown() {
10405
+ this.countdownSubscription.unsubscribe();
10406
+ this.countdownIntervalComponent?.stop();
10407
+ this.hideCountdown = true;
10408
+ }
10409
+ triggerGainsightEvent(widgetType, action, result) {
10410
+ if (widgetType) {
10411
+ this.gainsightService.triggerEvent(PRODUCT_EXPERIENCE_INTERVAL_BASED_RELOAD.EVENTS.INTERVAL_BASED_RELOAD, {
10412
+ action,
10413
+ result,
10414
+ component: this.determineComponentName(widgetType),
10415
+ widget: widgetType
10416
+ });
10417
+ }
10418
+ }
10419
+ determineComponentName(widgetType) {
10420
+ switch (widgetType) {
10421
+ case WIDGET_TYPE_VALUES.ALARMS:
10422
+ return PRODUCT_EXPERIENCE_INTERVAL_BASED_RELOAD.COMPONENTS.ALARM_WIDGET_ALARM_RELOAD;
10423
+ case WIDGET_TYPE_VALUES.DATA_POINTS_TABLE:
10424
+ return PRODUCT_EXPERIENCE_INTERVAL_BASED_RELOAD.COMPONENTS.DATAPOINTS_RELOAD;
10425
+ default:
10426
+ return '';
10427
+ }
10428
+ }
10429
+ }
10430
+
10431
+ class AppSwitcherService {
10432
+ constructor(ui) {
10433
+ this.ui = ui;
10434
+ this.visibleApplicationTypes = ['HOSTED', 'EXTERNAL'];
10435
+ const { currentTenant } = this.ui;
10436
+ this.appsOfCurrentUser$ = this.ui.currentAppsOfUser.pipe(map(apps => this.filterVisible(apps)), shareReplay(1));
10437
+ this.oneCloudApps$ = this.appsOfCurrentUser$.pipe(map(apps => apps.filter(app => this.isCloudApp(app))), map(cloudApps => this.orderApps(cloudApps)), shareReplay(1));
10438
+ const nonCloudApps$ = this.appsOfCurrentUser$.pipe(map(apps => apps.filter(app => !this.isCloudApp(app))));
10439
+ this.apps$ = combineLatest([nonCloudApps$, currentTenant]).pipe(map(([apps, tenant]) => this.filterDuplicates(apps, tenant)), map(apps => this.orderApps(apps)), shareReplay(1));
10440
+ this.finishedLoading$ = combineLatest([this.apps$, this.oneCloudApps$]).pipe(map(() => true), take(1), shareReplay(1));
10441
+ }
10442
+ filterVisible(apps) {
10443
+ return apps.filter(app => this.visibleApplicationTypes.includes(app.type) &&
10444
+ !app.noAppSwitcher &&
10445
+ !this.isPackage(app) &&
10446
+ !get(app, 'manifest.noAppSwitcher'));
10447
+ }
10448
+ isPackage(app) {
10449
+ return !!app.manifest?.isPackage;
10450
+ }
10451
+ isCloudApp(app) {
10452
+ return !!app.cloud;
10453
+ }
10454
+ filterDuplicates(apps, tenant) {
10455
+ // Filter out apps that have duplicate contextpaths and are not own owned by the current tenant;
10456
+ const filterFn = app => !apps.some(otherApp => app !== otherApp &&
10457
+ app.contextPath &&
10458
+ app.contextPath === otherApp.contextPath &&
10459
+ app.owner.tenant.id !== tenant.name);
10460
+ return apps.filter(filterFn);
10461
+ }
10462
+ orderApps(apps) {
10463
+ return orderBy(apps, ({ name }) => name.toLowerCase());
10464
+ }
10465
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AppSwitcherService, deps: [{ token: AppStateService }], target: i0.ɵɵFactoryTarget.Injectable }); }
10466
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AppSwitcherService, providedIn: 'root' }); }
10467
+ }
10468
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AppSwitcherService, decorators: [{
10469
+ type: Injectable,
10470
+ args: [{ providedIn: 'root' }]
10471
+ }], ctorParameters: () => [{ type: AppStateService }] });
10472
+
10172
10473
  class AppIconComponent {
10173
10474
  constructor(options) {
10174
10475
  this.options = options;
@@ -10362,237 +10663,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
10362
10663
  args: [{ selector: 'c8y-app-switcher', template: "<div\n class=\"app-switcher-dropdown\"\n dropdown\n #appSwitcherDropdown=\"bs-dropdown\"\n [cdkTrapFocus]=\"appSwitcherDropdown.isOpen\"\n>\n <button\n class=\"main-header-button c8y-dropdown dropdown-toggle\"\n title=\"{{ 'Application switcher' | translate }}\"\n id=\"appSwitcherDropdown\"\n type=\"button\"\n dropdownToggle\n >\n <i\n class=\"icon-2x\"\n c8yIcon=\"th\"\n ></i>\n </button>\n <div\n class=\"app-switcher-dropdown-menu dropdown-menu\"\n aria-labelledby=\"appSwitcherDropdown\"\n role=\"group\"\n *dropdownMenu\n >\n <c8y-app-switcher-inline></c8y-app-switcher-inline>\n </div>\n</div>\n" }]
10363
10664
  }] });
10364
10665
 
10365
- class UserEngagementsService {
10366
- constructor(document, userPreferencesService, gainsightService) {
10367
- this.document = document;
10368
- this.userPreferencesService = userPreferencesService;
10369
- this.gainsightService = gainsightService;
10370
- this.USER_PREFERENCES_GAINSIGHT_ENGAGEMENTS_KEY = 'gainsightBotEnabled';
10371
- this.userEngagementsEnabled$ = new BehaviorSubject(false);
10372
- this.HIDE_GAINSIGHT_BOT_STYLE_ID = 'hide-gs-bot';
10373
- this.ENGAGEMENTS = 'engagements';
10374
- this.handleUserEngagements();
10375
- }
10376
- /**
10377
- * Handles user engagement settings based on various conditions.
10378
- *
10379
- * - Waits for the Gainsight tracking to be loaded.
10380
- * - Retrieves the engagement settings.
10381
- * - Updates the engagement settings based on the combined observations.
10382
- * - Finally, toggles the Gainsight engagements based on the latest `userEngagementsEnabled$` value.
10383
- */
10384
- handleUserEngagements() {
10385
- this.gainsightService.trackingLoaded$
10386
- .pipe(take(1), switchMap(() => this.getEngagementSettingsObservable()), tap((settings) => this.updateUserEngagementSettings(...settings)), switchMap(() => this.userEngagementsEnabled$.pipe(take(1))))
10387
- .subscribe(isEnabled => this.toggleGainsightEngagements(isEnabled));
10388
- }
10389
- /**
10390
- * Updates the user's preference for Gainsight Engagements.
10391
- * @param {boolean} isEnabled - The new value for the user's engagement preference.
10392
- */
10393
- updateUserEngagementPreference(isEnabled) {
10394
- this.userEngagementsEnabled$.next(isEnabled);
10395
- this.userPreferencesService.set(this.gainsightService.USER_PREFERENCES_GAINSIGHT_ENGAGEMENTS_KEY, this.userEngagementsEnabled$.value);
10396
- }
10397
- /**
10398
- * Toggles the visibility of Gainsight Engagements based on the provided flag.
10399
- *
10400
- * @param isEnabled - A flag indicating whether Gainsight Engagements should be visible.
10401
- */
10402
- toggleGainsightEngagements(isEnabled) {
10403
- isEnabled ? this.showGainsightEngagements() : this.hideGainsightEngagements();
10404
- }
10405
- /**
10406
- * Constructs an observable that emits an array of boolean values representing
10407
- * the current engagement settings. The observable combines the latest values from:
10408
- *
10409
- * 1. User's preferences for Gainsight engagements.
10410
- * 2. A flag indicating if PII data should be sent.
10411
- * 3. A flag indicating if the platform uses custom branding.
10412
- *
10413
- * @returns An observable emitting an array of boolean values.
10414
- */
10415
- getEngagementSettingsObservable() {
10416
- return combineLatest([
10417
- this.userPreferencesService.observe(this.USER_PREFERENCES_GAINSIGHT_ENGAGEMENTS_KEY),
10418
- from(this.gainsightService.shouldSendPiiData()),
10419
- of(this.gainsightService.isCustomBranding())
10420
- ]);
10421
- }
10422
- /**
10423
- * Updates user engagement settings based on provided preferences and settings.
10424
- *
10425
- * Based on the received values, the method decides to:
10426
- * 1. Disable user engagements if PII data should not be shared or certain branding/settings conditions are met.
10427
- * 2. Update the user engagement preference if the user engagement bot setting is undefined.
10428
- *
10429
- * @param userEngagementBotSetting - The user's setting for the engagement bot.
10430
- * @param shouldSendPiiData - Indicates whether PII data should be shared.
10431
- * @param hasCustomBranding - Indicates if custom branding is applied.
10432
- */
10433
- updateUserEngagementSettings(userEngagementBotSetting, shouldSendPiiData, hasCustomBranding) {
10434
- if (this.shouldDisableUserEngagementsDueToPIIData(shouldSendPiiData)) {
10435
- this.userEngagementsEnabled$.next(false);
10436
- }
10437
- else if (this.isUserEngagementBotSettingUndefined(userEngagementBotSetting)) {
10438
- /**
10439
- * Case where the user is new (freshly created) and has not changed the user engagement settings in the user edit modal (untouched state).
10440
- * When custom branding is not set, we will set the user engagements in the user preferences to true by default.
10441
- */
10442
- this.updateUserEngagementPreference(!hasCustomBranding);
10443
- }
10444
- else {
10445
- this.userEngagementsEnabled$.next(userEngagementBotSetting);
10446
- }
10447
- }
10448
- /**
10449
- * Determines whether user engagements should be disabled due to PII data settings.
10450
- *
10451
- * If the `shouldSendPiiData` parameter is false, this indicates that the user engagements
10452
- * should be disabled to prevent sharing personally identifiable information.
10453
- *
10454
- * @param {boolean} shouldSendPiiData - Indicates whether PII data is allowed to be sent.
10455
- * @returns {boolean} Returns true if user engagements should be disabled, otherwise false.
10456
- */
10457
- shouldDisableUserEngagementsDueToPIIData(shouldSendPiiData) {
10458
- return !shouldSendPiiData;
10459
- }
10460
- /**
10461
- * Determines if the user engagement bot setting is undefined.
10462
- *
10463
- * @param {boolean | undefined} userEngagementBotSetting - The setting value to check.
10464
- * @returns {boolean} Returns `true` if the setting is undefined; otherwise, `false`.
10465
- *
10466
- * This scenario occurs when a user is new and hasn't modified the bot settings in the user details UI yet.
10467
- */
10468
- isUserEngagementBotSettingUndefined(userEngagementBotSetting) {
10469
- return userEngagementBotSetting === undefined;
10470
- }
10471
- /**
10472
- * Enables the visibility of Gainsight engagements.
10473
- *
10474
- * This method removes the CSS styles that hide the Gainsight engagements
10475
- * and updates the relevant user attribute to mark the engagements as visible.
10476
- */
10477
- showGainsightEngagements() {
10478
- this.removeHidingStyle(this.HIDE_GAINSIGHT_BOT_STYLE_ID);
10479
- this.gainsightService.updateUserAttribute(this.ENGAGEMENTS, true);
10480
- }
10481
- /**
10482
- * Hides the Gainsight engagements.
10483
- *
10484
- * This method applies CSS styles to hide the Gainsight engagements
10485
- * and updates the relevant user attribute to mark the engagements as hidden.
10486
- */
10487
- hideGainsightEngagements() {
10488
- this.addHidingStyle(this.HIDE_GAINSIGHT_BOT_STYLE_ID, '#apt-widget { display:none }');
10489
- this.gainsightService.updateUserAttribute(this.ENGAGEMENTS, false);
10490
- }
10491
- /**
10492
- * Removes the specified CSS style from the document.
10493
- *
10494
- * @param {string} styleId - The ID of the CSS style element to remove.
10495
- */
10496
- removeHidingStyle(styleId) {
10497
- const style = this.document.getElementById(styleId);
10498
- style?.remove();
10499
- }
10500
- /**
10501
- * Adds a new CSS style to the document.
10502
- *
10503
- * If the style with the specified ID already exists, the method will do nothing.
10504
- * Otherwise, it creates a new `<style>` element with the given ID and content,
10505
- * then appends it to the document head.
10506
- *
10507
- * @param {string} styleId - The ID to assign to the new style element.
10508
- * @param {string} textContent - The CSS rules to be included in the style.
10509
- */
10510
- addHidingStyle(styleId, textContent) {
10511
- if (this.document.getElementById(styleId)) {
10512
- return;
10513
- }
10514
- const style = this.document.createElement('style');
10515
- style.id = styleId;
10516
- style.textContent = textContent;
10517
- this.document.head.appendChild(style);
10518
- }
10519
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: UserEngagementsService, deps: [{ token: DOCUMENT }, { token: UserPreferencesService }, { token: GainsightService }], target: i0.ɵɵFactoryTarget.Injectable }); }
10520
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: UserEngagementsService, providedIn: 'root' }); }
10521
- }
10522
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: UserEngagementsService, decorators: [{
10523
- type: Injectable,
10524
- args: [{ providedIn: 'root' }]
10525
- }], ctorParameters: () => [{ type: DOCUMENT, decorators: [{
10526
- type: Inject,
10527
- args: [DOCUMENT]
10528
- }] }, { type: UserPreferencesService }, { type: GainsightService }] });
10529
-
10530
- /**
10531
- * This module enables an tenant to activate the product experience
10532
- * software [Gainsight](https://www.gainsight.com/product-experience/) to help
10533
- * and track user actions.
10534
- */
10535
- class ProductExperienceModule {
10536
- constructor(appState, gainsightService, cookieBannerService,
10537
- // Don't remove it, otherwise UserEngagementsService won't be initialized.
10538
- userEngagementsService) {
10539
- this.appState = appState;
10540
- this.gainsightService = gainsightService;
10541
- this.cookieBannerService = cookieBannerService;
10542
- this.userEngagementsService = userEngagementsService;
10543
- /**
10544
- * Check if the Gainsight tracking is disabled in the application apptions. If so, exit early without processing further.
10545
- */
10546
- if (this.gainsightService.isTrackingDisabled()) {
10547
- return;
10548
- }
10549
- this.toggleUserTrackingObservable();
10550
- }
10551
- /**
10552
- * Observes several factors to determine the state of user tracking and manages the visibility of Gainsight engagements.
10553
- * It watches for changes in the current tenant, the state of the cookie banner, and user's preferences for Gainsight engagements.
10554
- *
10555
- * 1. If the cookie banner is being displayed, it returns without making any changes.
10556
- * 2. If Gainsight is disabled at the tenant level via custom properties, it returns without making any changes.
10557
- * 3. If the conditions are met for loading the Gainsight tag, it loads the tag.
10558
- */
10559
- toggleUserTrackingObservable() {
10560
- combineLatest([
10561
- this.appState.currentTenant.pipe(filter(Boolean)),
10562
- this.cookieBannerService.isCookieBannerShowed$
10563
- ]).subscribe(async ([currentTenant, isCookieBannerShowed]) => {
10564
- if (isCookieBannerShowed) {
10565
- return;
10566
- }
10567
- const { customProperties } = currentTenant;
10568
- if (this.gainsightService.isGainsightDisabledAtTenantCustomProperties(customProperties)) {
10569
- return;
10570
- }
10571
- if (this.shouldLoadTag()) {
10572
- await this.gainsightService.loadTag(currentTenant, await this.gainsightService.shouldSendPiiData());
10573
- }
10574
- });
10575
- }
10576
- /**
10577
- * Determines if a tracking tag should be loaded based on cookie preferences.
10578
- * @returns `true` if user cookie preferences exist, otherwise `false`.
10579
- */
10580
- shouldLoadTag() {
10581
- return !!this.cookieBannerService.getUserCookiePreferences();
10582
- }
10583
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ProductExperienceModule, deps: [{ token: AppStateService }, { token: GainsightService }, { token: CookieBannerService }, { token: UserEngagementsService }], target: i0.ɵɵFactoryTarget.NgModule }); }
10584
- static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "18.2.13", ngImport: i0, type: ProductExperienceModule, declarations: [ProductExperienceDirective], exports: [ProductExperienceDirective] }); }
10585
- static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ProductExperienceModule, providers: [GainsightService, UserEngagementsService] }); }
10586
- }
10587
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ProductExperienceModule, decorators: [{
10588
- type: NgModule,
10589
- args: [{
10590
- declarations: [ProductExperienceDirective],
10591
- exports: [ProductExperienceDirective],
10592
- providers: [GainsightService, UserEngagementsService]
10593
- }]
10594
- }], ctorParameters: () => [{ type: AppStateService }, { type: GainsightService }, { type: CookieBannerService }, { type: UserEngagementsService }] });
10595
-
10596
10666
  class ApplicationModule {
10597
10667
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ApplicationModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
10598
10668
  static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "18.2.13", ngImport: i0, type: ApplicationModule, declarations: [AppSwitcherComponent, AppSwitcherInlineComponent, AppHrefPipe, IsActiveAppPipe], imports: [CommonModule, BsDropdownModule, A11yModule, ProductExperienceModule, AppIconComponent], exports: [AppIconComponent, AppSwitcherComponent, AppSwitcherInlineComponent] }); }
@@ -14453,18 +14523,26 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
14453
14523
  }] } });
14454
14524
 
14455
14525
  class PhoneValidationDirective {
14456
- constructor() {
14457
- this.allowedCharactersPattern = /^[/\d\-+ ]*$/;
14458
- }
14459
14526
  validate(control) {
14460
- const valid = this.validateInternationalPhoneNumber(control);
14461
- return valid ? null : { internationalPhoneNumber: true };
14527
+ return validateInternationalPhoneNumber()(control);
14462
14528
  }
14463
- validateInternationalPhoneNumber(control) {
14529
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: PhoneValidationDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
14530
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.13", type: PhoneValidationDirective, selector: "[c8yPhoneValidation]", providers: [{ provide: NG_VALIDATORS, useExisting: PhoneValidationDirective, multi: true }], ngImport: i0 }); }
14531
+ }
14532
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: PhoneValidationDirective, decorators: [{
14533
+ type: Directive,
14534
+ args: [{
14535
+ selector: '[c8yPhoneValidation]',
14536
+ providers: [{ provide: NG_VALIDATORS, useExisting: PhoneValidationDirective, multi: true }]
14537
+ }]
14538
+ }] });
14539
+ function validateInternationalPhoneNumber() {
14540
+ const allowedCharactersPattern = /^[/\d\-+ ]*$/;
14541
+ return (control) => {
14464
14542
  let numberValid;
14465
14543
  try {
14466
14544
  const phoneNumber = parsePhoneNumberFromString(control.value);
14467
- numberValid = this.allowedCharactersPattern.test(control.value) && phoneNumber.isValid();
14545
+ numberValid = allowedCharactersPattern.test(control.value) && phoneNumber.isValid();
14468
14546
  if (numberValid && control.value !== phoneNumber.format('E.164')) {
14469
14547
  control.setValue(phoneNumber.format('E.164'), {
14470
14548
  emitEvent: false,
@@ -14475,18 +14553,9 @@ class PhoneValidationDirective {
14475
14553
  catch (e) {
14476
14554
  numberValid = !control.value;
14477
14555
  }
14478
- return numberValid;
14479
- }
14480
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: PhoneValidationDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
14481
- static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.13", type: PhoneValidationDirective, selector: "[c8yPhoneValidation]", providers: [{ provide: NG_VALIDATORS, useExisting: PhoneValidationDirective, multi: true }], ngImport: i0 }); }
14556
+ return numberValid ? null : { internationalPhoneNumber: true };
14557
+ };
14482
14558
  }
14483
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: PhoneValidationDirective, decorators: [{
14484
- type: Directive,
14485
- args: [{
14486
- selector: '[c8yPhoneValidation]',
14487
- providers: [{ provide: NG_VALIDATORS, useExisting: PhoneValidationDirective, multi: true }]
14488
- }]
14489
- }] });
14490
14559
 
14491
14560
  class ProvidePhoneNumberComponent {
14492
14561
  constructor(loginService, alert, userService) {
@@ -15361,6 +15430,7 @@ class NewPasswordComponent {
15361
15430
  this.loginService = loginService;
15362
15431
  this.cdRef = cdRef;
15363
15432
  this.password = new EventEmitter();
15433
+ this.showChangePasswordButton = true;
15364
15434
  this.model = {};
15365
15435
  this.changePassword = false;
15366
15436
  this.passwordEnforced = false;
@@ -15372,6 +15442,14 @@ class NewPasswordComponent {
15372
15442
  this.minlength = value;
15373
15443
  });
15374
15444
  }
15445
+ async ngOnChanges(changes) {
15446
+ if (changes.showChangePasswordButton) {
15447
+ this.changePassword = !this.showChangePasswordButton;
15448
+ }
15449
+ if (changes.requireStrongPassword?.previousValue !== changes.requireStrongPassword?.currentValue) {
15450
+ await this.loadPasswordStrengthSettings();
15451
+ }
15452
+ }
15375
15453
  newPasswordChanged() {
15376
15454
  this.password.emit({
15377
15455
  password: this.model.newPassword,
@@ -15389,7 +15467,15 @@ class NewPasswordComponent {
15389
15467
  }
15390
15468
  }
15391
15469
  async loadPasswordStrengthSettings() {
15392
- this.passwordEnforced = await this.loginService.getPasswordStrengthEnforced({ refresh: true });
15470
+ if (this.requireStrongPassword) {
15471
+ this.passwordEnforced = this.requireStrongPassword;
15472
+ }
15473
+ else {
15474
+ const passwordStrengthSettings = await this.loginService.getPasswordStrengthEnforced({
15475
+ refresh: true
15476
+ });
15477
+ this.passwordEnforced = passwordStrengthSettings;
15478
+ }
15393
15479
  }
15394
15480
  toggleChangePassword() {
15395
15481
  this.changePassword = !this.changePassword;
@@ -15399,13 +15485,17 @@ class NewPasswordComponent {
15399
15485
  }
15400
15486
  }
15401
15487
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: NewPasswordComponent, deps: [{ token: LoginService }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
15402
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: NewPasswordComponent, selector: "c8y-new-password", outputs: { password: "password" }, viewQueries: [{ propertyName: "_newPasswordModel", first: true, predicate: ["newPassword"], descendants: true }], ngImport: i0, template: "<div class=\"form-group\">\n <button\n class=\"btn btn-default\"\n type=\"button\"\n (click)=\"toggleChangePassword()\"\n >\n <ng-container *ngIf=\"!changePassword\">\n {{ 'Change password' | translate }}\n </ng-container>\n <ng-container *ngIf=\"changePassword\">\n {{ 'Cancel password change' | translate }}\n </ng-container>\n </button>\n</div>\n\n<div\n class=\"row content-flex-50\"\n *ngIf=\"changePassword\"\n>\n <div class=\"col-6\">\n <c8y-form-group>\n <label\n for=\"newPassword\"\n translate\n >\n Password\n </label>\n <c8y-password-input\n name=\"newPassword\"\n required\n [id]=\"'newPassword'\"\n #newPassword=\"ngModel\"\n [(ngModel)]=\"model.newPassword\"\n (change)=\"newPasswordChanged()\"\n (input)=\"newPasswordConfirm.control.updateValueAndValidity()\"\n c8yDefaultValidation=\"password\"\n [autocomplete]=\"'new-password'\"\n ></c8y-password-input>\n </c8y-form-group>\n\n <c8y-form-group>\n <label\n for=\"newConfirmPassword\"\n translate\n >\n Confirm password\n </label>\n <c8y-password-input\n name=\"newPasswordConfirm\"\n required\n [id]=\"'newConfirmPassword'\"\n #newPasswordConfirm=\"ngModel\"\n [(ngModel)]=\"model.newPasswordConfirm\"\n passwordConfirm=\"newPassword\"\n [autocomplete]=\"'new-password'\"\n ></c8y-password-input>\n </c8y-form-group>\n </div>\n <div class=\"col-6\">\n <c8y-password-check-list\n [password]=\"model.newPassword\"\n [strengthEnforced]=\"passwordEnforced\"\n (onRequirementsFulfilled)=\"updateValidity($event)\"\n ></c8y-password-check-list>\n </div>\n</div>\n", dependencies: [{ kind: "directive", type: DefaultValidationDirective, selector: "[c8yDefaultValidation]", inputs: ["c8yDefaultValidation"] }, { kind: "directive", type: i2$3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2$3.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i2$3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: FormGroupComponent, selector: "c8y-form-group", inputs: ["hasError", "hasWarning", "hasSuccess", "novalidation", "status"] }, { kind: "directive", type: C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: PasswordConfirm, selector: "[passwordConfirm]" }, { kind: "component", type: PasswordCheckListComponent, selector: "c8y-password-check-list", inputs: ["strengthEnforced", "password"], outputs: ["onRequirementsFulfilled"] }, { kind: "component", type: PasswordInputComponent, selector: "c8y-password-input", inputs: ["id", "autocomplete"] }, { kind: "pipe", type: C8yTranslatePipe, name: "translate" }], viewProviders: [{ provide: ControlContainer, useExisting: NgForm }] }); }
15488
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: NewPasswordComponent, selector: "c8y-new-password", inputs: { showChangePasswordButton: "showChangePasswordButton", requireStrongPassword: "requireStrongPassword" }, outputs: { password: "password" }, viewQueries: [{ propertyName: "_newPasswordModel", first: true, predicate: ["newPassword"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div *ngIf=\"showChangePasswordButton\" class=\"form-group\">\n <button\n class=\"btn btn-default\"\n type=\"button\"\n (click)=\"toggleChangePassword()\"\n data-cy=\"c8y-new-password--change-button\"\n >\n <ng-container *ngIf=\"!changePassword\">\n {{ 'Change password' | translate }}\n </ng-container>\n <ng-container *ngIf=\"changePassword\">\n {{ 'Cancel password change' | translate }}\n </ng-container>\n </button>\n</div>\n\n<div\n class=\"row content-flex-50\"\n *ngIf=\"changePassword\"\n>\n <div class=\"col-6\">\n <c8y-form-group>\n <label\n for=\"newPassword\"\n translate\n >\n Password\n </label>\n <c8y-password-input\n name=\"newPassword\"\n required\n [id]=\"'newPassword'\"\n #newPassword=\"ngModel\"\n [(ngModel)]=\"model.newPassword\"\n (change)=\"newPasswordChanged()\"\n (input)=\"newPasswordConfirm.control.updateValueAndValidity()\"\n c8yDefaultValidation=\"password\"\n [autocomplete]=\"'new-password'\"\n ></c8y-password-input>\n </c8y-form-group>\n\n <c8y-form-group>\n <label\n for=\"newConfirmPassword\"\n translate\n >\n Confirm password\n </label>\n <c8y-password-input\n name=\"newPasswordConfirm\"\n required\n [id]=\"'newConfirmPassword'\"\n #newPasswordConfirm=\"ngModel\"\n [(ngModel)]=\"model.newPasswordConfirm\"\n passwordConfirm=\"newPassword\"\n [autocomplete]=\"'new-password'\"\n ></c8y-password-input>\n </c8y-form-group>\n </div>\n <div class=\"col-6\">\n <c8y-password-check-list\n [password]=\"model.newPassword\"\n [strengthEnforced]=\"passwordEnforced\"\n (onRequirementsFulfilled)=\"updateValidity($event)\"\n ></c8y-password-check-list>\n </div>\n</div>\n", dependencies: [{ kind: "directive", type: DefaultValidationDirective, selector: "[c8yDefaultValidation]", inputs: ["c8yDefaultValidation"] }, { kind: "directive", type: i2$3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2$3.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i2$3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: FormGroupComponent, selector: "c8y-form-group", inputs: ["hasError", "hasWarning", "hasSuccess", "novalidation", "status"] }, { kind: "directive", type: C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: PasswordConfirm, selector: "[passwordConfirm]" }, { kind: "component", type: PasswordCheckListComponent, selector: "c8y-password-check-list", inputs: ["strengthEnforced", "password"], outputs: ["onRequirementsFulfilled"] }, { kind: "component", type: PasswordInputComponent, selector: "c8y-password-input", inputs: ["id", "autocomplete"] }, { kind: "pipe", type: C8yTranslatePipe, name: "translate" }], viewProviders: [{ provide: ControlContainer, useExisting: NgForm }] }); }
15403
15489
  }
15404
15490
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: NewPasswordComponent, decorators: [{
15405
15491
  type: Component,
15406
- args: [{ selector: 'c8y-new-password', viewProviders: [{ provide: ControlContainer, useExisting: NgForm }], template: "<div class=\"form-group\">\n <button\n class=\"btn btn-default\"\n type=\"button\"\n (click)=\"toggleChangePassword()\"\n >\n <ng-container *ngIf=\"!changePassword\">\n {{ 'Change password' | translate }}\n </ng-container>\n <ng-container *ngIf=\"changePassword\">\n {{ 'Cancel password change' | translate }}\n </ng-container>\n </button>\n</div>\n\n<div\n class=\"row content-flex-50\"\n *ngIf=\"changePassword\"\n>\n <div class=\"col-6\">\n <c8y-form-group>\n <label\n for=\"newPassword\"\n translate\n >\n Password\n </label>\n <c8y-password-input\n name=\"newPassword\"\n required\n [id]=\"'newPassword'\"\n #newPassword=\"ngModel\"\n [(ngModel)]=\"model.newPassword\"\n (change)=\"newPasswordChanged()\"\n (input)=\"newPasswordConfirm.control.updateValueAndValidity()\"\n c8yDefaultValidation=\"password\"\n [autocomplete]=\"'new-password'\"\n ></c8y-password-input>\n </c8y-form-group>\n\n <c8y-form-group>\n <label\n for=\"newConfirmPassword\"\n translate\n >\n Confirm password\n </label>\n <c8y-password-input\n name=\"newPasswordConfirm\"\n required\n [id]=\"'newConfirmPassword'\"\n #newPasswordConfirm=\"ngModel\"\n [(ngModel)]=\"model.newPasswordConfirm\"\n passwordConfirm=\"newPassword\"\n [autocomplete]=\"'new-password'\"\n ></c8y-password-input>\n </c8y-form-group>\n </div>\n <div class=\"col-6\">\n <c8y-password-check-list\n [password]=\"model.newPassword\"\n [strengthEnforced]=\"passwordEnforced\"\n (onRequirementsFulfilled)=\"updateValidity($event)\"\n ></c8y-password-check-list>\n </div>\n</div>\n" }]
15492
+ args: [{ selector: 'c8y-new-password', viewProviders: [{ provide: ControlContainer, useExisting: NgForm }], template: "<div *ngIf=\"showChangePasswordButton\" class=\"form-group\">\n <button\n class=\"btn btn-default\"\n type=\"button\"\n (click)=\"toggleChangePassword()\"\n data-cy=\"c8y-new-password--change-button\"\n >\n <ng-container *ngIf=\"!changePassword\">\n {{ 'Change password' | translate }}\n </ng-container>\n <ng-container *ngIf=\"changePassword\">\n {{ 'Cancel password change' | translate }}\n </ng-container>\n </button>\n</div>\n\n<div\n class=\"row content-flex-50\"\n *ngIf=\"changePassword\"\n>\n <div class=\"col-6\">\n <c8y-form-group>\n <label\n for=\"newPassword\"\n translate\n >\n Password\n </label>\n <c8y-password-input\n name=\"newPassword\"\n required\n [id]=\"'newPassword'\"\n #newPassword=\"ngModel\"\n [(ngModel)]=\"model.newPassword\"\n (change)=\"newPasswordChanged()\"\n (input)=\"newPasswordConfirm.control.updateValueAndValidity()\"\n c8yDefaultValidation=\"password\"\n [autocomplete]=\"'new-password'\"\n ></c8y-password-input>\n </c8y-form-group>\n\n <c8y-form-group>\n <label\n for=\"newConfirmPassword\"\n translate\n >\n Confirm password\n </label>\n <c8y-password-input\n name=\"newPasswordConfirm\"\n required\n [id]=\"'newConfirmPassword'\"\n #newPasswordConfirm=\"ngModel\"\n [(ngModel)]=\"model.newPasswordConfirm\"\n passwordConfirm=\"newPassword\"\n [autocomplete]=\"'new-password'\"\n ></c8y-password-input>\n </c8y-form-group>\n </div>\n <div class=\"col-6\">\n <c8y-password-check-list\n [password]=\"model.newPassword\"\n [strengthEnforced]=\"passwordEnforced\"\n (onRequirementsFulfilled)=\"updateValidity($event)\"\n ></c8y-password-check-list>\n </div>\n</div>\n" }]
15407
15493
  }], ctorParameters: () => [{ type: LoginService }, { type: i0.ChangeDetectorRef }], propDecorators: { password: [{
15408
15494
  type: Output
15495
+ }], showChangePasswordButton: [{
15496
+ type: Input
15497
+ }], requireStrongPassword: [{
15498
+ type: Input
15409
15499
  }], _newPasswordModel: [{
15410
15500
  type: ViewChild,
15411
15501
  args: ['newPassword']
@@ -21435,7 +21525,7 @@ class UserEditComponent {
21435
21525
  return loginOptions.some(({ tfaStrategy = '' }) => tfaStrategy.toLowerCase() === 'totp');
21436
21526
  }
21437
21527
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: UserEditComponent, deps: [{ token: AppStateService }, { token: TranslateService }, { token: i1$6.BsModalService }, { token: AlertService }, { token: i1.UserService }, { token: i1.TenantLoginOptionsService }, { token: i1.TenantService }], target: i0.ɵɵFactoryTarget.Component }); }
21438
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: UserEditComponent, selector: "c8y-user-edit", inputs: { loading: "loading", user: "user", showProductExperienceOptions: "showProductExperienceOptions", isUsageTrackingEnabled: "isUsageTrackingEnabled", isUserEngagementPreferenceEnabled: "isUserEngagementPreferenceEnabled" }, outputs: { onUser: "onUser", onUsageTrackingChange: "onUsageTrackingChange", onUserEngagementPreferenceChange: "onUserEngagementPreferenceChange", onCancel: "onCancel" }, ngImport: i0, template: "<form #userForm=\"ngForm\" (ngSubmit)=\"userForm.form.valid && save()\">\n <div class=\"d-block p-24 p-b-0\">\n <div class=\"alert alert-warning\" role=\"alert\" *ngIf=\"userIsExternal\" translate>\n Some of the user settings are not editable here because they are managed via your\n authorization server.\n </div>\n <c8y-form-group>\n <label translate for=\"userName\">Username</label>\n <input\n id=\"userName\"\n class=\"form-control\"\n [(ngModel)]=\"user.userName\"\n name=\"userName\"\n autocomplete=\"off\"\n required\n maxlength=\"254\"\n placeholder=\"{{ 'e.g. joe.doe@example.com`LOCALIZE`' | translate }}\"\n [disabled]=\"user.id\"\n c8yDefaultValidation=\"user\"\n />\n </c8y-form-group>\n\n <c8y-form-group>\n <label translate for=\"displayName\">Login alias</label>\n <input\n id=\"displayName\"\n class=\"form-control\"\n [(ngModel)]=\"user.displayName\"\n name=\"displayName\"\n autocomplete=\"off\"\n maxlength=\"254\"\n placeholder=\"{{ 'e.g. joe.doe`LOCALIZE`' | translate }}\"\n [disabled]=\"userIsExternal\"\n c8yDefaultValidation=\"loginAlias\"\n />\n </c8y-form-group>\n\n <c8y-form-group [hasWarning]=\"!user.email\">\n <label translate for=\"userEmail\">Email</label>\n <input\n id=\"userEmail\"\n class=\"form-control\"\n type=\"email\"\n name=\"email\"\n [maxlength]=\"254\"\n autocomplete=\"off\"\n placeholder=\"{{ 'e.g. joe.doe@example.com`LOCALIZE`' | translate }}\"\n [(ngModel)]=\"user.email\"\n email\n [required]=\"true\"\n [disabled]=\"userIsExternal\"\n />\n </c8y-form-group>\n\n <div class=\"row\">\n <div class=\"col-sm-6\">\n <c8y-form-group>\n <label translate for=\"userFirstName\">First name</label>\n <input\n id=\"userFirstName\"\n class=\"form-control\"\n autocomplete=\"off\"\n placeholder=\"{{ 'e.g. Joe`LOCALIZE`' | translate }}\"\n maxlength=\"50\"\n name=\"firstName\"\n [(ngModel)]=\"user.firstName\"\n [disabled]=\"userIsExternal\"\n />\n </c8y-form-group>\n </div>\n <div class=\"col-sm-6\">\n <c8y-form-group>\n <label translate for=\"userLastName\">Last name</label>\n <input\n id=\"userLastName\"\n class=\"form-control\"\n autocomplete=\"off\"\n placeholder=\"{{ 'e.g. Doe`LOCALIZE`' | translate }}\"\n maxlength=\"50\"\n name=\"lastName\"\n [(ngModel)]=\"user.lastName\"\n [disabled]=\"userIsExternal\"\n />\n </c8y-form-group>\n </div>\n </div>\n\n <c8y-form-group>\n <label translate for=\"userTelephone\">Telephone</label>\n <input\n id=\"userTelephone\"\n class=\"form-control\"\n autocomplete=\"off\"\n name=\"phone\"\n maxlength=\"254\"\n [(ngModel)]=\"user.phone\"\n placeholder=\"{{ 'e.g. +49 9 876 543 210`LOCALIZE`' | translate }}\"\n c8yPhoneValidation\n [required]=\"isPhoneRequired\"\n [disabled]=\"userIsExternal\"\n />\n </c8y-form-group>\n\n <c8y-form-group class=\"p-t-16 separator-top\" *ngIf=\"showProductExperienceOptions\">\n <label translate>Product experience</label>\n <label class=\"c8y-switch\" for=\"productUsageTracking\">\n <input\n id=\"productUsageTracking\"\n name=\"productUsageTracking\"\n type=\"checkbox\"\n [(ngModel)]=\"isUsageTrackingEnabled\"\n />\n <span></span>\n {{ 'Enable personalized product experience tracking' | translate }}\n </label>\n <ng-container *ngIf=\"isUsageTrackingEnabled\">\n <label class=\"c8y-switch m-l-0\" for=\"userEngagementPreference\">\n <input\n id=\"userEngagementPreference\"\n name=\"userEngagementPreference\"\n type=\"checkbox\"\n [(ngModel)]=\"isUserEngagementPreferenceEnabled\"\n />\n <span></span>\n {{ 'Enable in-product information & communication' | translate }}\n </label>\n </ng-container>\n </c8y-form-group>\n\n <div class=\"form-group p-t-16 separator-top\" *ngIf=\"!userIsExternal\">\n <label class=\"control-label\">{{ 'Login options' | translate }}</label>\n <c8y-new-password (password)=\"onNewPasswordChanged($event)\"></c8y-new-password>\n <button\n class=\"btn btn-default\"\n type=\"button\"\n title=\"{{ 'Set up two-factor authentication' | translate }}\"\n (click)=\"setupTotp()\"\n *ngIf=\"userCanSetupTotp && !userHasActiveTotp && isTfaEnabled\"\n >\n {{ 'Set up two-factor authentication' | translate }}\n </button>\n </div>\n\n <c8y-form-group *ngIf=\"!!(state.state$ | async).newsletter\">\n <label translate>Newsletter</label>\n <label\n title=\"{{ 'Send me information about outages, maintenance or updates.' | translate }}\"\n class=\"c8y-checkbox\"\n >\n <input\n type=\"checkbox\"\n name=\"newsletter\"\n [(ngModel)]=\"user.newsletter\"\n [disabled]=\"userIsExternal\"\n />\n <span></span>\n <span>\n {{ 'Send me information about outages, maintenance or updates.' | translate }}\n </span>\n </label>\n </c8y-form-group>\n </div>\n <div class=\"modal-footer separator-top bg-level-0 sticky-bottom\">\n <button\n class=\"btn btn-default\"\n type=\"button\"\n title=\"{{ 'Cancel' | translate }}\"\n (click)=\"cancel()\"\n >\n {{ 'Cancel' | translate }}\n </button>\n <button\n class=\"btn btn-primary\"\n type=\"submit\"\n title=\"{{ 'Save' | translate }}\"\n [disabled]=\"!userForm.form.valid || userForm.form.pristine || loading\"\n >\n {{ 'Save' | translate }}\n </button>\n </div>\n</form>\n", dependencies: [{ kind: "directive", type: PhoneValidationDirective, selector: "[c8yPhoneValidation]" }, { kind: "directive", type: DefaultValidationDirective, selector: "[c8yDefaultValidation]", inputs: ["c8yDefaultValidation"] }, { kind: "directive", type: i2$3.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i2$3.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: i2$3.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i2$3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2$3.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2$3.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i2$3.MaxLengthValidator, selector: "[maxlength][formControlName],[maxlength][formControl],[maxlength][ngModel]", inputs: ["maxlength"] }, { kind: "directive", type: i2$3.EmailValidator, selector: "[email][formControlName],[email][formControl],[email][ngModel]", inputs: ["email"] }, { kind: "directive", type: i2$3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i2$3.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: FormGroupComponent, selector: "c8y-form-group", inputs: ["hasError", "hasWarning", "hasSuccess", "novalidation", "status"] }, { kind: "directive", type: RequiredInputPlaceholderDirective, selector: "input[required], input[formControlName]" }, { kind: "directive", type: C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: NewPasswordComponent, selector: "c8y-new-password", outputs: ["password"] }, { kind: "pipe", type: C8yTranslatePipe, name: "translate" }, { kind: "pipe", type: i2.AsyncPipe, name: "async" }] }); }
21528
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: UserEditComponent, selector: "c8y-user-edit", inputs: { loading: "loading", user: "user", showProductExperienceOptions: "showProductExperienceOptions", isUsageTrackingEnabled: "isUsageTrackingEnabled", isUserEngagementPreferenceEnabled: "isUserEngagementPreferenceEnabled" }, outputs: { onUser: "onUser", onUsageTrackingChange: "onUsageTrackingChange", onUserEngagementPreferenceChange: "onUserEngagementPreferenceChange", onCancel: "onCancel" }, ngImport: i0, template: "<form #userForm=\"ngForm\" (ngSubmit)=\"userForm.form.valid && save()\">\n <div class=\"d-block p-24 p-b-0\">\n <div class=\"alert alert-warning\" role=\"alert\" *ngIf=\"userIsExternal\" translate>\n Some of the user settings are not editable here because they are managed via your\n authorization server.\n </div>\n <c8y-form-group>\n <label translate for=\"userName\">Username</label>\n <input\n id=\"userName\"\n class=\"form-control\"\n [(ngModel)]=\"user.userName\"\n name=\"userName\"\n autocomplete=\"off\"\n required\n maxlength=\"254\"\n placeholder=\"{{ 'e.g. joe.doe@example.com`LOCALIZE`' | translate }}\"\n [disabled]=\"user.id\"\n c8yDefaultValidation=\"user\"\n />\n </c8y-form-group>\n\n <c8y-form-group>\n <label translate for=\"displayName\">Login alias</label>\n <input\n id=\"displayName\"\n class=\"form-control\"\n [(ngModel)]=\"user.displayName\"\n name=\"displayName\"\n autocomplete=\"off\"\n maxlength=\"254\"\n placeholder=\"{{ 'e.g. joe.doe`LOCALIZE`' | translate }}\"\n [disabled]=\"userIsExternal\"\n c8yDefaultValidation=\"loginAlias\"\n />\n </c8y-form-group>\n\n <c8y-form-group [hasWarning]=\"!user.email\">\n <label translate for=\"userEmail\">Email</label>\n <input\n id=\"userEmail\"\n class=\"form-control\"\n type=\"email\"\n name=\"email\"\n [maxlength]=\"254\"\n autocomplete=\"off\"\n placeholder=\"{{ 'e.g. joe.doe@example.com`LOCALIZE`' | translate }}\"\n [(ngModel)]=\"user.email\"\n email\n [required]=\"true\"\n [disabled]=\"userIsExternal\"\n />\n </c8y-form-group>\n\n <div class=\"row\">\n <div class=\"col-sm-6\">\n <c8y-form-group>\n <label translate for=\"userFirstName\">First name</label>\n <input\n id=\"userFirstName\"\n class=\"form-control\"\n autocomplete=\"off\"\n placeholder=\"{{ 'e.g. Joe`LOCALIZE`' | translate }}\"\n maxlength=\"50\"\n name=\"firstName\"\n [(ngModel)]=\"user.firstName\"\n [disabled]=\"userIsExternal\"\n />\n </c8y-form-group>\n </div>\n <div class=\"col-sm-6\">\n <c8y-form-group>\n <label translate for=\"userLastName\">Last name</label>\n <input\n id=\"userLastName\"\n class=\"form-control\"\n autocomplete=\"off\"\n placeholder=\"{{ 'e.g. Doe`LOCALIZE`' | translate }}\"\n maxlength=\"50\"\n name=\"lastName\"\n [(ngModel)]=\"user.lastName\"\n [disabled]=\"userIsExternal\"\n />\n </c8y-form-group>\n </div>\n </div>\n\n <c8y-form-group>\n <label translate for=\"userTelephone\">Telephone</label>\n <input\n id=\"userTelephone\"\n class=\"form-control\"\n autocomplete=\"off\"\n name=\"phone\"\n maxlength=\"254\"\n [(ngModel)]=\"user.phone\"\n placeholder=\"{{ 'e.g. +49 9 876 543 210`LOCALIZE`' | translate }}\"\n c8yPhoneValidation\n [required]=\"isPhoneRequired\"\n [disabled]=\"userIsExternal\"\n />\n </c8y-form-group>\n\n <c8y-form-group class=\"p-t-16 separator-top\" *ngIf=\"showProductExperienceOptions\">\n <label translate>Product experience</label>\n <label class=\"c8y-switch\" for=\"productUsageTracking\">\n <input\n id=\"productUsageTracking\"\n name=\"productUsageTracking\"\n type=\"checkbox\"\n [(ngModel)]=\"isUsageTrackingEnabled\"\n />\n <span></span>\n {{ 'Enable personalized product experience tracking' | translate }}\n </label>\n <ng-container *ngIf=\"isUsageTrackingEnabled\">\n <label class=\"c8y-switch m-l-0\" for=\"userEngagementPreference\">\n <input\n id=\"userEngagementPreference\"\n name=\"userEngagementPreference\"\n type=\"checkbox\"\n [(ngModel)]=\"isUserEngagementPreferenceEnabled\"\n />\n <span></span>\n {{ 'Enable in-product information & communication' | translate }}\n </label>\n </ng-container>\n </c8y-form-group>\n\n <div class=\"form-group p-t-16 separator-top\" *ngIf=\"!userIsExternal\">\n <label class=\"control-label\">{{ 'Login options' | translate }}</label>\n <c8y-new-password (password)=\"onNewPasswordChanged($event)\"></c8y-new-password>\n <button\n class=\"btn btn-default\"\n type=\"button\"\n title=\"{{ 'Set up two-factor authentication' | translate }}\"\n (click)=\"setupTotp()\"\n *ngIf=\"userCanSetupTotp && !userHasActiveTotp && isTfaEnabled\"\n >\n {{ 'Set up two-factor authentication' | translate }}\n </button>\n </div>\n\n <c8y-form-group *ngIf=\"!!(state.state$ | async).newsletter\">\n <label translate>Newsletter</label>\n <label\n title=\"{{ 'Send me information about outages, maintenance or updates.' | translate }}\"\n class=\"c8y-checkbox\"\n >\n <input\n type=\"checkbox\"\n name=\"newsletter\"\n [(ngModel)]=\"user.newsletter\"\n [disabled]=\"userIsExternal\"\n />\n <span></span>\n <span>\n {{ 'Send me information about outages, maintenance or updates.' | translate }}\n </span>\n </label>\n </c8y-form-group>\n </div>\n <div class=\"modal-footer separator-top bg-level-0 sticky-bottom\">\n <button\n class=\"btn btn-default\"\n type=\"button\"\n title=\"{{ 'Cancel' | translate }}\"\n (click)=\"cancel()\"\n >\n {{ 'Cancel' | translate }}\n </button>\n <button\n class=\"btn btn-primary\"\n type=\"submit\"\n title=\"{{ 'Save' | translate }}\"\n [disabled]=\"!userForm.form.valid || userForm.form.pristine || loading\"\n >\n {{ 'Save' | translate }}\n </button>\n </div>\n</form>\n", dependencies: [{ kind: "directive", type: PhoneValidationDirective, selector: "[c8yPhoneValidation]" }, { kind: "directive", type: DefaultValidationDirective, selector: "[c8yDefaultValidation]", inputs: ["c8yDefaultValidation"] }, { kind: "directive", type: i2$3.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i2$3.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: i2$3.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i2$3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2$3.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2$3.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i2$3.MaxLengthValidator, selector: "[maxlength][formControlName],[maxlength][formControl],[maxlength][ngModel]", inputs: ["maxlength"] }, { kind: "directive", type: i2$3.EmailValidator, selector: "[email][formControlName],[email][formControl],[email][ngModel]", inputs: ["email"] }, { kind: "directive", type: i2$3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i2$3.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: FormGroupComponent, selector: "c8y-form-group", inputs: ["hasError", "hasWarning", "hasSuccess", "novalidation", "status"] }, { kind: "directive", type: RequiredInputPlaceholderDirective, selector: "input[required], input[formControlName]" }, { kind: "directive", type: C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: NewPasswordComponent, selector: "c8y-new-password", inputs: ["showChangePasswordButton", "requireStrongPassword"], outputs: ["password"] }, { kind: "pipe", type: C8yTranslatePipe, name: "translate" }, { kind: "pipe", type: i2.AsyncPipe, name: "async" }] }); }
21439
21529
  }
21440
21530
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: UserEditComponent, decorators: [{
21441
21531
  type: Component,
@@ -25068,10 +25158,6 @@ const extraRoutes = [
25068
25158
  {
25069
25159
  path: 'users/new',
25070
25160
  component: EmptyComponent
25071
- },
25072
- {
25073
- path: 'tenants/new',
25074
- component: EmptyComponent
25075
25161
  }
25076
25162
  ];
25077
25163
  const viewContextRoutes = [];
@@ -35713,5 +35799,5 @@ function colorValidator(allowedModes) {
35713
35799
  * Generated bundle index. Do not edit.
35714
35800
  */
35715
35801
 
35716
- export { ACTIONS_STEPPER, AGGREGATIONS, AGGREGATION_ICONS, AGGREGATION_LABELS, AGGREGATION_LIMITS, AGGREGATION_TEXTS, AGGREGATION_VALUES, AGGREGATION_VALUES_ARR, ARRAY_VALIDATION_PREFIX, ASSET_PATH, AbstractConfigurationStrategy, ActionBarComponent, ActionBarItemComponent, ActionBarModule, ActionBarService, ActionComponent, ActionControlsExtensionService, ActionModule, ActionOutletComponent, ActionService, AggregationPickerComponent, AggregationService, AlarmRealtimeService, AlarmWithChildrenRealtimeService, AlertComponent, AlertDetailsComponent, AlertModule, AlertOutletBase, AlertOutletComponent, AlertService, AlertTextComponent, AppIconComponent, AppStateService, AppSwitcherComponent, AppSwitcherInlineComponent, AppSwitcherService, ApplicationModule, ApplicationPluginStatus, AssetLinkPipe, AssetTypesRealtimeService, AssetTypesService, AuditLogComponent, AuditLogModule, AuthenticationModule, BackendVersionFactory, BaseColumn, BaseFilteringFormRendererComponent, BooleanFilterMapper, BootstrapComponent, BootstrapModule, BottomDrawerComponent, BottomDrawerRef, BottomDrawerService, BreadcrumbComponent, BreadcrumbItemComponent, BreadcrumbModule, BreadcrumbOutletComponent, BreadcrumbService, BuiltInActionType, BytesPipe, C8yComponentOutlet, C8yJSONSchema, C8yStepper, C8yStepperButtons, C8yStepperIcon, C8yStepperProgress, C8yTranslateDirective, C8yTranslateModule, C8yTranslatePipe, C8yValidators, CUSTOM, CachedLocaleDictionaryService, CellRendererComponent, CellRendererContext, CellRendererDefDirective, ChangePasswordComponent, ClipboardModule, ClipboardService, ColorInputComponent, ColorService, ColumnDirective, CommonModule, ConditionalTabsOutletComponent, ConfigureCustomColumnComponent, ConfirmModalComponent, ContextRouteComponent, ContextRouteGuard, ContextRouteService, CookieBannerComponent, CopyDashboardDisabledReason, CoreModule, CoreSearchModule, CountdownIntervalComponent, CountdownIntervalModule, CredentialsComponent, CurrentPasswordModalComponent, CustomColumn, DATA_GRID_CONFIGURATION_CONTEXT, DATA_GRID_CONFIGURATION_CONTEXT_PROVIDER, DATA_GRID_CONFIGURATION_STRATEGY, DEFAULT_INTERVAL_STATE, DEFAULT_INTERVAL_VALUE, DEFAULT_INTERVAL_VALUES, DRAWER_ANIMATION_TIME, DashboardChildActionComponent, DashboardChildChange, DashboardChildComponent, DashboardChildTitleComponent, DashboardComponent, DashboardModule, DataGridComponent, DataGridModule, DataGridService, DatapointLibraryValidationErrors, DateContextQueryParamNames, DateFilterMapper, DatePickerComponent, DatePickerModule, DatePipe, DateTimePickerComponent, DateTimePickerModule, DefaultValidationDirective, DeviceBootstrapRealtimeService, DeviceService, DeviceStatusComponent, DeviceStatusModule, DismissAlertStrategy, DocsModule, DocsService, DrawerModule, DrawerOutletComponent, DrawerService, DropAreaComponent, DropAreaModule, DropdownDirectionDirective, DynamicBulkDetailsResolver, DynamicBulkIIdentifiedResolver, DynamicComponentAlert, DynamicComponentAlertAggregator, DynamicComponentAlertsComponent, DynamicComponentComponent, DynamicComponentErrorStrategy, DynamicComponentModule, DynamicComponentService, DynamicDatapointsResolver, DynamicFormsModule, DynamicManagedObjectResolver, DynamicResolverService, ES_MAX_TIME_MILLISECONDS, EmailsValidatorDirective, EmptyComponent, EmptyStateComponent, EmptyStateContextDirective, EventRealtimeService, ExpandableRowDirective, ExtensionPointForPlugins, ExtensionPointWithoutStateForPlugins, ExtractArrayValidationErrorsPipe, FilePickerComponent, FilePickerFormControlComponent, FilePickerFormControlModule, FilePickerModule, FilesService, FilterInputComponent, FilterMapperFactory, FilterMapperModule, FilterMapperPipe, FilterMapperService, FilterNonArrayValidationErrorsPipe, FilteringActionType, FilteringFormRendererComponent, FilteringFormRendererContext, FilteringFormRendererDefDirective, ForOfDirective, FormGroupComponent, FormsModule, GENERIC_FILE_TYPE, GLOBAL_CONTEXT_AUTO_REFRESH, GainsightService, GenericFileIconPipe, GeoService, GetGroupIconPipe, GlobalConfigService, GridDataSource, GroupFragment, GroupService, GroupedFilterChips, GuideDocsComponent, GuideHrefDirective, HOOK_ACTION, HOOK_ACTION_BAR, HOOK_BREADCRUMB, HOOK_COMPONENTS, HOOK_DOCS, HOOK_DYNAMIC_PROVIDER_CONFIG, HOOK_NAVIGATOR_NODES, HOOK_OPTIONS, HOOK_PATTERN_MESSAGES, HOOK_ROUTE, HOOK_SEARCH, HOOK_STEPPER, HOOK_TABS, HOOK_VERSION, HOOK_WIZARD, HeaderBarComponent, HeaderCellRendererDefDirective, HeaderModule, HeaderService, HelpComponent, HelpModule, HighlightComponent, HookProviderTypes, HumanizeAppNamePipe, HumanizePipe, HumanizeValidationMessagePipe, I18nModule, INTERVAL_OPTIONS, IconDirective, IfAllowedDirective, InjectionType, InputGroupListComponent, InputGroupListContainerDirective, InterAppService, IntervalBasedReload, InventorySearchService, IpRangeInputListComponent, JsonValidationPrettifierDirective, LANGUAGES, LAST_DAY, LAST_HOUR, LAST_MINUTE, LAST_MONTH, LAST_WEEK, LOCALE_PATH, LegacyGridConfigMapperService, LegendFieldWrapper, ListDisplaySwitchComponent, ListDisplaySwitchModule, ListGroupComponent, ListGroupModule, ListItemActionComponent, ListItemBodyComponent, ListItemCheckboxComponent, ListItemCollapseComponent, ListItemComponent, ListItemDragHandleComponent, ListItemFooterComponent, ListItemIconComponent, ListItemRadioComponent, ListItemTimelineComponent, LoadMoreComponent, LoadingComponent, LoginComponent, LoginModule, LoginService, LoginViews, MAX_PAGE_SIZE, MESSAGES_CORE_I18N, ManagedObjectRealtimeService, ManagedObjectType, MapFunctionPipe, MarkdownToHtmlPipe, MaxValidationDirective, MeasurementRealtimeService, MessageBannerService, MessageDirective, MessagesComponent, MinValidationDirective, MissingTranslationCustomHandler, MoNamePipe, ModalComponent, ModalModule, ModalSelectionMode, ModalService, NEEDED_ROLE_FOR_SETUP, NEW_DASHBOARD_ROUTER_STATE_PROP, NULL_VALUE_PLACEHOLDER, NUMBER_FORMAT_REGEXP, NameTransformPipe, NavigatorBottomModule, NavigatorIconComponent, NavigatorModule, NavigatorNode, NavigatorNodeComponent, NavigatorNodeRoot, NavigatorOutletComponent, NavigatorService, NavigatorTopModule, NewPasswordComponent, NumberPipe, OperationBulkRealtimeService, OperationRealtimeService, OperationResultComponent, OptionsService, OutletDirective, PRODUCT_EXPERIENCE_EVENT_SOURCE, PX_ACTIONS, PX_EVENT_NAME, PackageType, PasswordCheckListComponent, PasswordConfirm, PasswordConfirmModalComponent, PasswordInputComponent, PasswordService, PasswordStrengthCheckerService, PasswordStrengthComponent, PasswordStrengthValidatorDirective, PatternMessagesService, Permissions, PhoneValidationDirective, PlatformDetailsService, PluginLoadedPipe, PluginsExportScopes, PluginsModule, PluginsResolveService, PluginsService, PopoverConfirmComponent, ProductExperienceDirective, ProductExperienceModule, ProgressBarComponent, PropertiesListComponent, PropertiesListModule, PropertyValueTransformService, ProvidePhoneNumberComponent, ProviderConfigurationComponent, ProviderConfigurationModule, ProviderConfigurationNodeFactory, ProviderConfigurationRouteFactory, ProviderConfigurationService, ProviderDefinitionsService, PushStatus, PushStatusLabels, QuickLinkComponent, QuickLinkModule, RESOLVING_COMPONENT_WAIT_TIME, RadioFilterMapper, RangeComponent, RangeDirective, RangeDisplayComponent, RangeDisplayModule, RealtimeButtonComponent, RealtimeControlComponent, RealtimeMessage, RealtimeModule, RealtimeService, RealtimeSubjectService, RecoverPasswordComponent, RelativeTimePipe, RequiredInputPlaceholderDirective, RouterModule, RouterService, RouterTabsResolver, SETUP_FINISHED_STEP_ID, SearchComponent, SearchFilters, SearchInputComponent, SearchOutletComponent, SearchResultEmptyComponent, SearchService, SelectComponent, SelectFilterMapper, SelectItemDirective, SelectKeyboardService, SelectLegacyComponent, SelectModalComponent, SelectModalFilterPipe, SelectModalModule, SelectModule, SelectedItemsComponent, SelectedItemsDirective, SendStatus, SendStatusLabels, ServiceRegistry, SetupCompletedComponent, SetupComponent, SetupModule, SetupService, SetupState, SetupStepperFactory, ShortenUserNamePipe, ShouldShowMoPipe, ShowIfFilterPipe, SimpleJsonPathValidatorDirective, SkipLinkDirective, SmsChallengeComponent, StandalonePluginInjector, StateService, Status, StepperModule, StepperOutletComponent, StepperService, Steppers, StrengthValidatorService, StringFilterMapper, StringifyObjectPipe, SupportedApps, TabComponent, TabsModule, TabsOutletComponent, TabsService, TabsetAriaDirective, TenantUiService, TextAreaRowHeightDirective, TextareaAutoresizeDirective, ThemeSwitcherService, TimeIntervalComponent, TimePickerComponent, TimePickerModule, TitleComponent, TitleOutletComponent, TotpAuthComponent, TotpChallengeComponent, TotpSetupComponent, TranslateParserCustom, TranslateService, TranslationLoaderService, TypeaheadComponent, TypeaheadFilterMapper, UiSettingsComponent, UiSettingsModule, UniqueInCollectionByPathValidationDirective, UserEditComponent, UserEditModalComponent, UserEngagementsService, UserMenuItemComponent, UserMenuOutletComponent, UserMenuService, UserModule, UserNameInitialsPipe, UserPreferencesConfigurationStrategy, UserPreferencesService, UserPreferencesStorageInventory, UserPreferencesStorageLocal, UserTotpRevokeComponent, UserTotpSetupComponent, VERSION_MODULE_CONFIG, ValidationPattern, VersionListComponent, VersionModule, VersionService, ViewContext, ViewContextServices, VirtualScrollWindowDirective, VirtualScrollWindowStrategy, VirtualScrollerWrapperComponent, VisibleControlsPipe, WebSDKVersionFactory, WidgetGlobalAutoRefreshService, WidgetTimeContextActionBarPriority, WidgetTimeContextComponent, WidgetTimeContextDateRangeService, WidgetsDashboardComponent, WizardBodyComponent, WizardComponent, WizardFooterComponent, WizardHeaderComponent, WizardModalService, WizardModule, WizardOutletComponent, WizardService, ZipService, _virtualScrollWindowStrategyFactory, alertOnError, allEntriesAreEqual, asyncValidateArrayElements, colorValidator, deviceAvailabilityIconMap, extraRoutes, fromFactories, fromTrigger, fromTriggerOnce, getActivatedRoute, getAngularLocalesLanguageString, getBasicInputArrayFormFieldConfig, getDictionaryWithTrimmedKeys, getInjectedHooks, globalAutoRefreshLoading, hookAction, hookActionBar, hookBreadcrumb, hookComponent, hookDataGridActionControls, hookDocs, hookDrawer, hookDynamicProviderConfig, hookFilterMapper, hookGeneric, hookNavigator, hookOptions, hookPatternMessages, hookRoute, hookSearch, hookService, hookStepper, hookTab, hookUserMenu, hookVersion, hookWidget, hookWizard, initializeServices, internalApps, isEagerDynamicComponents, isExtensionFactory, isLazyDynamicComponents, isPromise, languagesFactory, loadLocale, localeId, localePathFactory, memoize, minColumnGridTrackSize, operationStatusClasses, operationStatusIcons, ratiosByColumnTypes, removeDuplicatesIds, resolveInjectedFactories, retryWithDelay, simpleJsonPathValidator, sortByPriority, stateToFactory, statusAlert, statusClasses, statusIcons, throttle, toObservable, toObservableOfArrays, tooltips, trimTranslationKey, uniqueInCollectionByPathValidator, validateArrayElements, viewContextRoutes, wrapperLegendFieldConfig };
35802
+ export { ACTIONS_STEPPER, AGGREGATIONS, AGGREGATION_ICONS, AGGREGATION_LABELS, AGGREGATION_LIMITS, AGGREGATION_TEXTS, AGGREGATION_VALUES, AGGREGATION_VALUES_ARR, ARRAY_VALIDATION_PREFIX, ASSET_PATH, AbstractConfigurationStrategy, ActionBarComponent, ActionBarItemComponent, ActionBarModule, ActionBarService, ActionComponent, ActionControlsExtensionService, ActionModule, ActionOutletComponent, ActionService, AggregationPickerComponent, AggregationService, AlarmRealtimeService, AlarmWithChildrenRealtimeService, AlertComponent, AlertDetailsComponent, AlertModule, AlertOutletBase, AlertOutletComponent, AlertService, AlertTextComponent, AppIconComponent, AppStateService, AppSwitcherComponent, AppSwitcherInlineComponent, AppSwitcherService, ApplicationModule, ApplicationPluginStatus, AssetLinkPipe, AssetTypesRealtimeService, AssetTypesService, AuditLogComponent, AuditLogModule, AuthenticationModule, BackendVersionFactory, BaseColumn, BaseFilteringFormRendererComponent, BooleanFilterMapper, BootstrapComponent, BootstrapModule, BottomDrawerComponent, BottomDrawerRef, BottomDrawerService, BreadcrumbComponent, BreadcrumbItemComponent, BreadcrumbModule, BreadcrumbOutletComponent, BreadcrumbService, BuiltInActionType, BytesPipe, C8yComponentOutlet, C8yJSONSchema, C8yStepper, C8yStepperButtons, C8yStepperIcon, C8yStepperProgress, C8yTranslateDirective, C8yTranslateModule, C8yTranslatePipe, C8yValidators, CUSTOM, CachedLocaleDictionaryService, CellRendererComponent, CellRendererContext, CellRendererDefDirective, ChangePasswordComponent, ClipboardModule, ClipboardService, ColorInputComponent, ColorService, ColumnDirective, CommonModule, ConditionalTabsOutletComponent, ConfigureCustomColumnComponent, ConfirmModalComponent, ContextRouteComponent, ContextRouteGuard, ContextRouteService, CookieBannerComponent, CopyDashboardDisabledReason, CoreModule, CoreSearchModule, CountdownIntervalComponent, CountdownIntervalModule, CredentialsComponent, CurrentPasswordModalComponent, CustomColumn, DATA_GRID_CONFIGURATION_CONTEXT, DATA_GRID_CONFIGURATION_CONTEXT_PROVIDER, DATA_GRID_CONFIGURATION_STRATEGY, DEFAULT_INTERVAL_STATE, DEFAULT_INTERVAL_VALUE, DEFAULT_INTERVAL_VALUES, DRAWER_ANIMATION_TIME, DashboardChildActionComponent, DashboardChildChange, DashboardChildComponent, DashboardChildTitleComponent, DashboardComponent, DashboardModule, DataGridComponent, DataGridModule, DataGridService, DatapointLibraryValidationErrors, DateContextQueryParamNames, DateFilterMapper, DatePickerComponent, DatePickerModule, DatePipe, DateTimePickerComponent, DateTimePickerModule, DefaultValidationDirective, DeviceBootstrapRealtimeService, DeviceService, DeviceStatusComponent, DeviceStatusModule, DismissAlertStrategy, DocsModule, DocsService, DrawerModule, DrawerOutletComponent, DrawerService, DropAreaComponent, DropAreaModule, DropdownDirectionDirective, DynamicBulkDetailsResolver, DynamicBulkIIdentifiedResolver, DynamicComponentAlert, DynamicComponentAlertAggregator, DynamicComponentAlertsComponent, DynamicComponentComponent, DynamicComponentErrorStrategy, DynamicComponentModule, DynamicComponentService, DynamicDatapointsResolver, DynamicFormsModule, DynamicManagedObjectResolver, DynamicResolverService, ES_MAX_TIME_MILLISECONDS, EmailsValidatorDirective, EmptyComponent, EmptyStateComponent, EmptyStateContextDirective, EventRealtimeService, ExpandableRowDirective, ExtensionPointForPlugins, ExtensionPointWithoutStateForPlugins, ExtractArrayValidationErrorsPipe, FilePickerComponent, FilePickerFormControlComponent, FilePickerFormControlModule, FilePickerModule, FilesService, FilterInputComponent, FilterMapperFactory, FilterMapperModule, FilterMapperPipe, FilterMapperService, FilterNonArrayValidationErrorsPipe, FilteringActionType, FilteringFormRendererComponent, FilteringFormRendererContext, FilteringFormRendererDefDirective, ForOfDirective, FormGroupComponent, FormsModule, GENERIC_FILE_TYPE, GLOBAL_CONTEXT_AUTO_REFRESH, GainsightService, GenericFileIconPipe, GeoService, GetGroupIconPipe, GlobalConfigService, GridDataSource, GroupFragment, GroupService, GroupedFilterChips, GuideDocsComponent, GuideHrefDirective, HOOK_ACTION, HOOK_ACTION_BAR, HOOK_BREADCRUMB, HOOK_COMPONENTS, HOOK_DOCS, HOOK_DYNAMIC_PROVIDER_CONFIG, HOOK_NAVIGATOR_NODES, HOOK_OPTIONS, HOOK_PATTERN_MESSAGES, HOOK_ROUTE, HOOK_SEARCH, HOOK_STEPPER, HOOK_TABS, HOOK_VERSION, HOOK_WIZARD, HeaderBarComponent, HeaderCellRendererDefDirective, HeaderModule, HeaderService, HelpComponent, HelpModule, HighlightComponent, HookProviderTypes, HumanizeAppNamePipe, HumanizePipe, HumanizeValidationMessagePipe, I18nModule, INTERVAL_OPTIONS, IconDirective, IfAllowedDirective, InjectionType, InputGroupListComponent, InputGroupListContainerDirective, InterAppService, IntervalBasedReload, InventorySearchService, IpRangeInputListComponent, JsonValidationPrettifierDirective, LANGUAGES, LAST_DAY, LAST_HOUR, LAST_MINUTE, LAST_MONTH, LAST_WEEK, LOCALE_PATH, LegacyGridConfigMapperService, LegendFieldWrapper, ListDisplaySwitchComponent, ListDisplaySwitchModule, ListGroupComponent, ListGroupModule, ListItemActionComponent, ListItemBodyComponent, ListItemCheckboxComponent, ListItemCollapseComponent, ListItemComponent, ListItemDragHandleComponent, ListItemFooterComponent, ListItemIconComponent, ListItemRadioComponent, ListItemTimelineComponent, LoadMoreComponent, LoadingComponent, LoginComponent, LoginModule, LoginService, LoginViews, MAX_PAGE_SIZE, MESSAGES_CORE_I18N, ManagedObjectRealtimeService, ManagedObjectType, MapFunctionPipe, MarkdownToHtmlPipe, MaxValidationDirective, MeasurementRealtimeService, MessageBannerService, MessageDirective, MessagesComponent, MinValidationDirective, MissingTranslationCustomHandler, MoNamePipe, ModalComponent, ModalModule, ModalSelectionMode, ModalService, NEEDED_ROLE_FOR_SETUP, NEW_DASHBOARD_ROUTER_STATE_PROP, NULL_VALUE_PLACEHOLDER, NUMBER_FORMAT_REGEXP, NameTransformPipe, NavigatorBottomModule, NavigatorIconComponent, NavigatorModule, NavigatorNode, NavigatorNodeComponent, NavigatorNodeRoot, NavigatorOutletComponent, NavigatorService, NavigatorTopModule, NewPasswordComponent, NumberPipe, OperationBulkRealtimeService, OperationRealtimeService, OperationResultComponent, OptionsService, OutletDirective, PRODUCT_EXPERIENCE_EVENT_SOURCE, PX_ACTIONS, PX_EVENT_NAME, PackageType, PasswordCheckListComponent, PasswordConfirm, PasswordConfirmModalComponent, PasswordInputComponent, PasswordService, PasswordStrengthCheckerService, PasswordStrengthComponent, PasswordStrengthValidatorDirective, PatternMessagesService, Permissions, PhoneValidationDirective, PlatformDetailsService, PluginLoadedPipe, PluginsExportScopes, PluginsModule, PluginsResolveService, PluginsService, PopoverConfirmComponent, ProductExperienceDirective, ProductExperienceModule, ProgressBarComponent, PropertiesListComponent, PropertiesListModule, PropertyValueTransformService, ProvidePhoneNumberComponent, ProviderConfigurationComponent, ProviderConfigurationModule, ProviderConfigurationNodeFactory, ProviderConfigurationRouteFactory, ProviderConfigurationService, ProviderDefinitionsService, PushStatus, PushStatusLabels, QuickLinkComponent, QuickLinkModule, RESOLVING_COMPONENT_WAIT_TIME, RadioFilterMapper, RangeComponent, RangeDirective, RangeDisplayComponent, RangeDisplayModule, RealtimeButtonComponent, RealtimeControlComponent, RealtimeMessage, RealtimeModule, RealtimeService, RealtimeSubjectService, RecoverPasswordComponent, RelativeTimePipe, RequiredInputPlaceholderDirective, RouterModule, RouterService, RouterTabsResolver, SETUP_FINISHED_STEP_ID, SearchComponent, SearchFilters, SearchInputComponent, SearchOutletComponent, SearchResultEmptyComponent, SearchService, SelectComponent, SelectFilterMapper, SelectItemDirective, SelectKeyboardService, SelectLegacyComponent, SelectModalComponent, SelectModalFilterPipe, SelectModalModule, SelectModule, SelectedItemsComponent, SelectedItemsDirective, SendStatus, SendStatusLabels, ServiceRegistry, SetupCompletedComponent, SetupComponent, SetupModule, SetupService, SetupState, SetupStepperFactory, ShortenUserNamePipe, ShouldShowMoPipe, ShowIfFilterPipe, SimpleJsonPathValidatorDirective, SkipLinkDirective, SmsChallengeComponent, StandalonePluginInjector, StateService, Status, StepperModule, StepperOutletComponent, StepperService, Steppers, StrengthValidatorService, StringFilterMapper, StringifyObjectPipe, SupportedApps, TabComponent, TabsModule, TabsOutletComponent, TabsService, TabsetAriaDirective, TenantUiService, TextAreaRowHeightDirective, TextareaAutoresizeDirective, ThemeSwitcherService, TimeIntervalComponent, TimePickerComponent, TimePickerModule, TitleComponent, TitleOutletComponent, TotpAuthComponent, TotpChallengeComponent, TotpSetupComponent, TranslateParserCustom, TranslateService, TranslationLoaderService, TypeaheadComponent, TypeaheadFilterMapper, UiSettingsComponent, UiSettingsModule, UniqueInCollectionByPathValidationDirective, UserEditComponent, UserEditModalComponent, UserEngagementsService, UserMenuItemComponent, UserMenuOutletComponent, UserMenuService, UserModule, UserNameInitialsPipe, UserPreferencesConfigurationStrategy, UserPreferencesService, UserPreferencesStorageInventory, UserPreferencesStorageLocal, UserTotpRevokeComponent, UserTotpSetupComponent, VERSION_MODULE_CONFIG, ValidationPattern, VersionListComponent, VersionModule, VersionService, ViewContext, ViewContextServices, VirtualScrollWindowDirective, VirtualScrollWindowStrategy, VirtualScrollerWrapperComponent, VisibleControlsPipe, WIDGET_TYPE_VALUES, WebSDKVersionFactory, WidgetGlobalAutoRefreshService, WidgetTimeContextActionBarPriority, WidgetTimeContextComponent, WidgetTimeContextDateRangeService, WidgetsDashboardComponent, WizardBodyComponent, WizardComponent, WizardFooterComponent, WizardHeaderComponent, WizardModalService, WizardModule, WizardOutletComponent, WizardService, ZipService, _virtualScrollWindowStrategyFactory, alertOnError, allEntriesAreEqual, asyncValidateArrayElements, colorValidator, deviceAvailabilityIconMap, extraRoutes, fromFactories, fromTrigger, fromTriggerOnce, getActivatedRoute, getAngularLocalesLanguageString, getBasicInputArrayFormFieldConfig, getDictionaryWithTrimmedKeys, getInjectedHooks, globalAutoRefreshLoading, hookAction, hookActionBar, hookBreadcrumb, hookComponent, hookDataGridActionControls, hookDocs, hookDrawer, hookDynamicProviderConfig, hookFilterMapper, hookGeneric, hookNavigator, hookOptions, hookPatternMessages, hookRoute, hookSearch, hookService, hookStepper, hookTab, hookUserMenu, hookVersion, hookWidget, hookWizard, initializeServices, internalApps, isEagerDynamicComponents, isExtensionFactory, isLazyDynamicComponents, isPromise, languagesFactory, loadLocale, localeId, localePathFactory, memoize, minColumnGridTrackSize, operationStatusClasses, operationStatusIcons, ratiosByColumnTypes, removeDuplicatesIds, resolveInjectedFactories, retryWithDelay, simpleJsonPathValidator, sortByPriority, stateToFactory, statusAlert, statusClasses, statusIcons, throttle, toObservable, toObservableOfArrays, tooltips, trimTranslationKey, uniqueInCollectionByPathValidator, validateArrayElements, validateInternationalPhoneNumber, viewContextRoutes, wrapperLegendFieldConfig };
35717
35803
  //# sourceMappingURL=c8y-ngx-components.mjs.map