@c8y/ngx-components 1021.60.1 → 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.
- package/core/authentication/new-password.component.d.ts +6 -3
- package/core/authentication/new-password.component.d.ts.map +1 -1
- package/core/common/interval-based-reload.abstract.d.ts +12 -1
- package/core/common/interval-based-reload.abstract.d.ts.map +1 -1
- package/core/common/permissions.service.d.ts +2 -0
- package/core/common/permissions.service.d.ts.map +1 -1
- package/core/common/tenant-ui.service.d.ts +9 -2
- package/core/common/tenant-ui.service.d.ts.map +1 -1
- package/core/forms/phone-validation.directive.d.ts +3 -6
- package/core/forms/phone-validation.directive.d.ts.map +1 -1
- package/core/router/router.module.d.ts.map +1 -1
- package/device-provisioned-certificates/device-provisioned-certificates.service.d.ts.map +1 -1
- package/esm2022/core/authentication/new-password.component.mjs +26 -5
- package/esm2022/core/common/interval-based-reload.abstract.mjs +50 -2
- package/esm2022/core/common/permissions.service.mjs +3 -1
- package/esm2022/core/common/tenant-ui.service.mjs +28 -6
- package/esm2022/core/forms/phone-validation.directive.mjs +18 -19
- package/esm2022/core/router/router.module.mjs +1 -5
- package/esm2022/core/user/user-edit.component.mjs +1 -1
- package/esm2022/device-provisioned-certificates/device-provisioned-certificates.service.mjs +8 -3
- package/esm2022/tenants/custom-properties/custom-properties.component.mjs +25 -5
- package/esm2022/tenants/existing-tenant.guard.mjs +18 -0
- package/esm2022/tenants/index.mjs +3 -1
- package/esm2022/tenants/support-user-access/support-user-access.component.mjs +31 -0
- package/esm2022/tenants/tenant-form/tenant-form-inputs-definitions.mjs +116 -0
- package/esm2022/tenants/tenant-form/tenant-form.component.mjs +294 -0
- package/esm2022/tenants/tenant-limits/tenant-limits-definitions.mjs +10 -17
- package/esm2022/tenants/tenant-limits/tenant-limits.component.mjs +42 -29
- package/esm2022/tenants/tenant-list/tenant-list.component.mjs +17 -8
- package/esm2022/tenants/tenants.model.mjs +30 -1
- package/esm2022/tenants/tenants.module.mjs +57 -22
- package/esm2022/translation-editor/data/translation-store.service.mjs +11 -8
- package/esm2022/translation-editor/index.mjs +22 -5
- package/esm2022/translation-editor/lazy/advanced-translation-editor/advanced-translation-editor.component.mjs +136 -0
- package/esm2022/translation-editor/lazy/index.mjs +2 -1
- package/esm2022/translation-editor/translation-editor-tab-factory.service.mjs +40 -0
- package/esm2022/translation-editor/translation-editor.constants.mjs +4 -0
- package/esm2022/upgrade/upgraded-services/index.mjs +2 -1
- package/esm2022/upgrade/upgraded-services/tenant-policies.service.mjs +11 -0
- package/esm2022/upgrade/upgraded-services/upgraded-services.module.mjs +12 -3
- package/esm2022/widgets/implementations/alarms/alarm-widget-alarms-reload.component.mjs +9 -7
- package/esm2022/widgets/implementations/datapoints-table/datapoints-table-view/datapoints-reload/datapoints-reload.component.mjs +9 -7
- package/fesm2022/c8y-ngx-components-device-provisioned-certificates.mjs +7 -2
- package/fesm2022/c8y-ngx-components-device-provisioned-certificates.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-tenants.mjs +603 -82
- package/fesm2022/c8y-ngx-components-tenants.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-translation-editor-data.mjs +9 -6
- package/fesm2022/c8y-ngx-components-translation-editor-data.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-translation-editor-lazy.mjs +127 -2
- package/fesm2022/c8y-ngx-components-translation-editor-lazy.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-translation-editor.mjs +58 -4
- package/fesm2022/c8y-ngx-components-translation-editor.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-upgrade-upgraded-services.mjs +22 -3
- package/fesm2022/c8y-ngx-components-upgrade-upgraded-services.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-implementations-alarms.mjs +8 -6
- package/fesm2022/c8y-ngx-components-widgets-implementations-alarms.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-implementations-datapoints-table.mjs +8 -6
- package/fesm2022/c8y-ngx-components-widgets-implementations-datapoints-table.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components.mjs +499 -413
- package/fesm2022/c8y-ngx-components.mjs.map +1 -1
- package/locales/de.po +17 -25
- package/locales/es.po +17 -25
- package/locales/fr.po +17 -25
- package/locales/ja_JP.po +17 -25
- package/locales/ko.po +17 -25
- package/locales/locales.pot +25 -24
- package/locales/nl.po +17 -25
- package/locales/pl.po +17 -25
- package/locales/pt_BR.po +17 -25
- package/locales/zh_CN.po +17 -25
- package/locales/zh_TW.po +17 -25
- package/package.json +1 -1
- package/tenants/custom-properties/custom-properties.component.d.ts +4 -2
- package/tenants/custom-properties/custom-properties.component.d.ts.map +1 -1
- package/tenants/existing-tenant.guard.d.ts +13 -0
- package/tenants/existing-tenant.guard.d.ts.map +1 -0
- package/tenants/index.d.ts +2 -0
- package/tenants/index.d.ts.map +1 -1
- package/tenants/support-user-access/support-user-access.component.d.ts +18 -0
- package/tenants/support-user-access/support-user-access.component.d.ts.map +1 -0
- package/tenants/tenant-form/tenant-form-inputs-definitions.d.ts +113 -0
- package/tenants/tenant-form/tenant-form-inputs-definitions.d.ts.map +1 -0
- package/tenants/tenant-form/tenant-form.component.d.ts +79 -0
- package/tenants/tenant-form/tenant-form.component.d.ts.map +1 -0
- package/tenants/tenant-limits/tenant-limits-definitions.d.ts +11 -15
- package/tenants/tenant-limits/tenant-limits-definitions.d.ts.map +1 -1
- package/tenants/tenant-limits/tenant-limits.component.d.ts +9 -7
- package/tenants/tenant-limits/tenant-limits.component.d.ts.map +1 -1
- package/tenants/tenant-list/tenant-list.component.d.ts +6 -3
- package/tenants/tenant-list/tenant-list.component.d.ts.map +1 -1
- package/tenants/tenants.model.d.ts +31 -0
- package/tenants/tenants.model.d.ts.map +1 -1
- package/tenants/tenants.module.d.ts +4 -2
- package/tenants/tenants.module.d.ts.map +1 -1
- package/translation-editor/data/translation-store.service.d.ts +3 -2
- package/translation-editor/data/translation-store.service.d.ts.map +1 -1
- package/translation-editor/index.d.ts.map +1 -1
- package/translation-editor/lazy/advanced-translation-editor/advanced-translation-editor.component.d.ts +28 -0
- package/translation-editor/lazy/advanced-translation-editor/advanced-translation-editor.component.d.ts.map +1 -0
- package/translation-editor/lazy/index.d.ts +1 -0
- package/translation-editor/lazy/index.d.ts.map +1 -1
- package/translation-editor/translation-editor-tab-factory.service.d.ts +22 -0
- package/translation-editor/translation-editor-tab-factory.service.d.ts.map +1 -0
- package/translation-editor/translation-editor.constants.d.ts +4 -0
- package/translation-editor/translation-editor.constants.d.ts.map +1 -0
- package/upgrade/upgraded-services/index.d.ts +1 -0
- package/upgrade/upgraded-services/index.d.ts.map +1 -1
- package/upgrade/upgraded-services/tenant-policies.service.d.ts +11 -0
- package/upgrade/upgraded-services/tenant-policies.service.d.ts.map +1 -0
- package/upgrade/upgraded-services/upgraded-services.module.d.ts.map +1 -1
- package/widgets/implementations/alarms/alarm-widget-alarms-reload.component.d.ts +7 -2
- package/widgets/implementations/alarms/alarm-widget-alarms-reload.component.d.ts.map +1 -1
- package/widgets/implementations/datapoints-table/datapoints-table-view/datapoints-reload/datapoints-reload.component.d.ts +7 -2
- 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,
|
|
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
|
-
|
|
14461
|
-
return valid ? null : { internationalPhoneNumber: true };
|
|
14527
|
+
return validateInternationalPhoneNumber()(control);
|
|
14462
14528
|
}
|
|
14463
|
-
|
|
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 =
|
|
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.
|
|
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
|