@c8y/ngx-components 1016.0.476 → 1016.0.483
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/bootstrap/cookie-banner/cookie-banner.service.d.ts +1 -1
- package/core/common/ApplicationOptions.d.ts +2 -0
- package/core/header/right-drawer/right-drawer.component.d.ts +22 -0
- package/core/product-experience/gainsight.service.d.ts +96 -22
- package/core/product-experience/index.d.ts +1 -0
- package/core/product-experience/product-experience.module.d.ts +18 -5
- package/core/product-experience/user-engagements.service.d.ts +109 -0
- package/core/shared/core.model.d.ts +22 -0
- package/core/user/user-edit-modal.component.d.ts +36 -10
- package/core/user/user-edit.component.d.ts +7 -12
- package/device-grid/device-grid.service.d.ts +3 -4
- package/esm2020/core/action-bar/action-bar.component.mjs +10 -7
- package/esm2020/core/bootstrap/cookie-banner/cookie-banner.service.mjs +2 -2
- package/esm2020/core/common/ApplicationOptions.mjs +1 -1
- package/esm2020/core/dynamic-forms/validation/validation-config.factory.mjs +2 -2
- package/esm2020/core/header/right-drawer/right-drawer.component.mjs +5 -3
- package/esm2020/core/product-experience/gainsight.service.mjs +174 -71
- package/esm2020/core/product-experience/index.mjs +2 -1
- package/esm2020/core/product-experience/product-experience.module.mjs +42 -24
- package/esm2020/core/product-experience/user-engagements.service.mjs +174 -0
- package/esm2020/core/shared/core.model.mjs +15 -0
- package/esm2020/core/user/user-edit-modal.component.mjs +73 -45
- package/esm2020/core/user/user-edit.component.mjs +38 -43
- package/esm2020/device-grid/device-grid.service.mjs +6 -15
- package/esm2020/sensor-phone/sensor-phone-modal.component.mjs +26 -15
- package/esm2020/sensor-phone/sensor-phone.model.mjs +13 -0
- package/esm2020/sensor-phone/sensor-phone.service.mjs +5 -7
- package/esm2020/sub-assets/delete-assets-modal/delete-assets-modal.component.mjs +13 -3
- package/esm2020/sub-assets/shared/sub-assets.model.mjs +11 -0
- package/fesm2015/c8y-ngx-components-device-grid.mjs +4 -15
- package/fesm2015/c8y-ngx-components-device-grid.mjs.map +1 -1
- package/fesm2015/c8y-ngx-components-sensor-phone.mjs +40 -19
- package/fesm2015/c8y-ngx-components-sensor-phone.mjs.map +1 -1
- package/fesm2015/c8y-ngx-components-sub-assets.mjs +22 -2
- package/fesm2015/c8y-ngx-components-sub-assets.mjs.map +1 -1
- package/fesm2015/c8y-ngx-components.mjs +513 -173
- package/fesm2015/c8y-ngx-components.mjs.map +1 -1
- package/fesm2020/c8y-ngx-components-device-grid.mjs +4 -13
- package/fesm2020/c8y-ngx-components-device-grid.mjs.map +1 -1
- package/fesm2020/c8y-ngx-components-sensor-phone.mjs +40 -19
- package/fesm2020/c8y-ngx-components-sensor-phone.mjs.map +1 -1
- package/fesm2020/c8y-ngx-components-sub-assets.mjs +22 -2
- package/fesm2020/c8y-ngx-components-sub-assets.mjs.map +1 -1
- package/fesm2020/c8y-ngx-components.mjs +497 -166
- package/fesm2020/c8y-ngx-components.mjs.map +1 -1
- package/locales/locales.pot +4 -4
- package/package.json +2 -2
- package/sensor-phone/sensor-phone.model.d.ts +18 -0
- package/sensor-phone/sensor-phone.service.d.ts +2 -3
- package/sub-assets/delete-assets-modal/delete-assets-modal.component.d.ts +1 -0
- package/sub-assets/shared/sub-assets.model.d.ts +15 -0
|
@@ -4,7 +4,7 @@ import * as i1 from '@angular/router';
|
|
|
4
4
|
import { NavigationEnd, RouterModule as RouterModule$1, PRIMARY_OUTLET, ROUTES, RouterLinkActive, ROUTER_CONFIGURATION } from '@angular/router';
|
|
5
5
|
import { merge, of, defer, combineLatest, race, isObservable, from, Subject, BehaviorSubject, NEVER, fromEvent, pipe, concat, Observable, throwError, timer, EMPTY, fromEventPattern, empty, ReplaySubject, forkJoin } from 'rxjs';
|
|
6
6
|
import { filter, startWith, switchMap, map, distinctUntilChanged, shareReplay, scan, tap, catchError, takeUntil, debounceTime, first as first$1, concatMap, take, delay, retryWhen, combineLatest as combineLatest$1, mergeMap, every as every$1, toArray, merge as merge$1, debounce, share, expand, withLatestFrom, finalize } from 'rxjs/operators';
|
|
7
|
-
import { castArray, flatten, isFunction, uniq, sortBy, groupBy, camelCase, isUndefined, throttle as throttle$1, keys, get, each, mapValues, mapKeys, isString, isNaN as isNaN$1, isFinite, forEach, every, first, map as map$1, assign, find, negate, upperFirst, some, memoize as memoize$1, property, entries, omitBy, isDate, filter as filter$1, isEqual, snakeCase, matches, reduce, union, isEmpty, clone, omit, includes, orderBy, isEqualWith, escape as escape$1, escapeRegExp, assignWith, set as set$1, findIndex, cloneDeep, uniqBy, pick, transform, identity, flow, isNil, chunk, without, indexOf, parseInt as parseInt$1, kebabCase, forOwn } from 'lodash-es';
|
|
7
|
+
import { castArray, flatten, isFunction, uniq, sortBy, groupBy, camelCase, isUndefined, throttle as throttle$1, keys, get, each, mapValues, mapKeys, isString, isNaN as isNaN$1, isFinite, forEach, every, first, map as map$1, assign, find, negate, upperFirst, some, memoize as memoize$1, property, entries, omitBy, isDate, flatMap, filter as filter$1, isEqual, snakeCase, matches, reduce, union, isEmpty, clone, omit, includes, orderBy, isEqualWith, escape as escape$1, escapeRegExp, assignWith, set as set$1, findIndex, cloneDeep, uniqBy, pick, transform, identity, flow, isNil, chunk, without, indexOf, parseInt as parseInt$1, kebabCase, forOwn } from 'lodash-es';
|
|
8
8
|
import * as i3$1 from 'ngx-bootstrap/collapse';
|
|
9
9
|
import { CollapseModule } from 'ngx-bootstrap/collapse';
|
|
10
10
|
import * as i1$5 from 'ngx-bootstrap/dropdown';
|
|
@@ -6599,6 +6599,21 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.6", ngImpor
|
|
|
6599
6599
|
}]
|
|
6600
6600
|
}] });
|
|
6601
6601
|
|
|
6602
|
+
const PRODUCT_EXPERIENCE = {
|
|
6603
|
+
ACTION_BAR: {
|
|
6604
|
+
EVENTS: { ACTION_BAR_ITEM: 'actionBarItem' },
|
|
6605
|
+
COMPONENTS: { ACTION_BAR_COMPONENT: 'action-bar' },
|
|
6606
|
+
ACTIONS: {},
|
|
6607
|
+
RESULTS: {}
|
|
6608
|
+
},
|
|
6609
|
+
QUICK_LINKS: {
|
|
6610
|
+
EVENTS: { QUICK_LINK_RIGHT_DRAWER: 'quickLinkRightDrawer' },
|
|
6611
|
+
COMPONENTS: { RIGHT_DRAWER_COMPONENT: 'right-drawer' },
|
|
6612
|
+
ACTIONS: {},
|
|
6613
|
+
RESULTS: {}
|
|
6614
|
+
}
|
|
6615
|
+
};
|
|
6616
|
+
|
|
6602
6617
|
/**
|
|
6603
6618
|
* This service is handling the cookie banner and cookie preferences related logic.
|
|
6604
6619
|
*/
|
|
@@ -6670,7 +6685,7 @@ class CookieBannerService {
|
|
|
6670
6685
|
return JSON.parse(localStorage.getItem(this.STORAGE_KEY));
|
|
6671
6686
|
}
|
|
6672
6687
|
/**
|
|
6673
|
-
* Verifies that cookie preferences configuration is defined.
|
|
6688
|
+
* Verifies that cookie preferences configuration is defined in the application options.
|
|
6674
6689
|
* @returns {boolean} Returns if the cookie preferences configuration is defined.
|
|
6675
6690
|
*/
|
|
6676
6691
|
isConfigCookiePreferencesDefined() {
|
|
@@ -6737,8 +6752,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.6", ngImpor
|
|
|
6737
6752
|
* tag and
|
|
6738
6753
|
*/
|
|
6739
6754
|
class GainsightService {
|
|
6740
|
-
constructor(
|
|
6741
|
-
this.document = document;
|
|
6755
|
+
constructor(appState, options, cookieBannerService, userPreferencesService, translateService) {
|
|
6742
6756
|
this.appState = appState;
|
|
6743
6757
|
this.options = options;
|
|
6744
6758
|
this.cookieBannerService = cookieBannerService;
|
|
@@ -6748,8 +6762,16 @@ class GainsightService {
|
|
|
6748
6762
|
* A subject that emits the tag function as soon as a new tag is set.
|
|
6749
6763
|
*/
|
|
6750
6764
|
this.tagFunction$ = new BehaviorSubject(null);
|
|
6765
|
+
this.trackingLoaded$ = new Subject();
|
|
6766
|
+
/**
|
|
6767
|
+
* Gainsight is activated only when the cookie banner is present. If functional cookies are enabled, both personally identifiable information (PII) and required data are sent.
|
|
6768
|
+
* Otherwise, only the required data is transmitted during the identity step execution.
|
|
6769
|
+
*/
|
|
6751
6770
|
this.USER_PREFERENCES_GAINSIGHT_KEY = 'gainsightEnabled';
|
|
6752
|
-
|
|
6771
|
+
/**
|
|
6772
|
+
* The name of the key remained unchanged, but applies to all engagements.
|
|
6773
|
+
*/
|
|
6774
|
+
this.USER_PREFERENCES_GAINSIGHT_ENGAGEMENTS_KEY = 'gainsightBotEnabled';
|
|
6753
6775
|
this.HIDE_GAINSIGHT_BOT_STYLE_ID = 'hide-gs-bot';
|
|
6754
6776
|
this.GAINSIGHT_URL = 'web-sdk.aptrinsic.com/api/aptrinsic.js?a=';
|
|
6755
6777
|
this.GAINSIGHT_GLOBAL_SCOPE = 'aptrinsic';
|
|
@@ -6758,10 +6780,19 @@ class GainsightService {
|
|
|
6758
6780
|
this.OPTIONS_KEY_NAME = 'api.key';
|
|
6759
6781
|
this.isScriptLoaded = false;
|
|
6760
6782
|
}
|
|
6783
|
+
/**
|
|
6784
|
+
* Checks if the specified Gainsight preference is disabled in user preferences.
|
|
6785
|
+
* @param preferenceName - Name of the Gainsight preference.
|
|
6786
|
+
* @returns A promise that resolves to `true` if the preference is disabled, otherwise `false`.
|
|
6787
|
+
*/
|
|
6761
6788
|
async isGainsightPreferenceDisabledInUserPreferences(preferenceName) {
|
|
6762
6789
|
const userGainsightPref = await this.userPreferencesService.get(preferenceName).toPromise();
|
|
6763
6790
|
return userGainsightPref === false;
|
|
6764
6791
|
}
|
|
6792
|
+
/**
|
|
6793
|
+
* Sets the state of the functional cookie.
|
|
6794
|
+
* @param value - A boolean value to indicate whether the functional cookie should be enabled (`true`) or disabled (`false`).
|
|
6795
|
+
*/
|
|
6765
6796
|
setFunctionalCookie(value) {
|
|
6766
6797
|
const cookies = this.cookieBannerService.getUserCookiePreferences();
|
|
6767
6798
|
if (cookies) {
|
|
@@ -6790,54 +6821,111 @@ class GainsightService {
|
|
|
6790
6821
|
/**
|
|
6791
6822
|
* Load the script tag and calls the identify function to start the tracking.
|
|
6792
6823
|
* @param currentTenant The current tenant.
|
|
6793
|
-
* @param
|
|
6824
|
+
* @param sendPiiData Flag for sending personally identifiable information (PII) during identification in Gainsight.
|
|
6794
6825
|
*/
|
|
6795
|
-
async loadTag(currentTenant,
|
|
6826
|
+
async loadTag(currentTenant, sendPiiData) {
|
|
6796
6827
|
const scriptTag = document.createElement('script');
|
|
6797
6828
|
const key = await this.getGainsightKey();
|
|
6798
6829
|
if (key && !this.isScriptLoaded) {
|
|
6799
6830
|
this.loadScriptTag(scriptTag, key);
|
|
6800
|
-
|
|
6831
|
+
const currentUserStream = this.appState.currentUser;
|
|
6832
|
+
const scriptLoadStream = fromEvent(scriptTag, 'load');
|
|
6833
|
+
const versionStream = this.appState.state$.pipe(filter(({ versions }) => versions.backend), map(({ versions }) => versions), take(1));
|
|
6834
|
+
const sourceStreams = sendPiiData
|
|
6835
|
+
? [currentUserStream, scriptLoadStream, versionStream]
|
|
6836
|
+
: [currentUserStream, scriptLoadStream];
|
|
6837
|
+
combineLatest(sourceStreams)
|
|
6801
6838
|
.pipe(delay(this.SCRIPT_EXECUTION_WAIT_TIME), filter(([user, scriptEvent]) => !!(scriptEvent && user)))
|
|
6802
|
-
.subscribe(
|
|
6839
|
+
.subscribe(args => {
|
|
6840
|
+
const [user, , versions] = args;
|
|
6841
|
+
this.setGlobalContext();
|
|
6803
6842
|
const instanceId = this.getInstanceIdFromUrl();
|
|
6804
|
-
if (
|
|
6805
|
-
|
|
6843
|
+
if (sendPiiData) {
|
|
6844
|
+
const versionUI = versions.ui.ngx;
|
|
6845
|
+
const versionBE = versions.backend;
|
|
6846
|
+
const extendedIdentifyData = {
|
|
6847
|
+
user,
|
|
6848
|
+
currentTenant,
|
|
6849
|
+
instanceId,
|
|
6850
|
+
versionUI,
|
|
6851
|
+
versionBE
|
|
6852
|
+
};
|
|
6853
|
+
this.identify(sendPiiData, extendedIdentifyData);
|
|
6854
|
+
}
|
|
6855
|
+
else {
|
|
6856
|
+
const requiredIdentifyData = { user, currentTenant, instanceId };
|
|
6857
|
+
this.identify(sendPiiData, requiredIdentifyData);
|
|
6806
6858
|
}
|
|
6807
6859
|
this.isScriptLoaded = true;
|
|
6808
6860
|
this.tagFunction$.next(this.tagFunction);
|
|
6861
|
+
this.trackingLoaded$.next(true);
|
|
6809
6862
|
});
|
|
6810
6863
|
}
|
|
6811
6864
|
}
|
|
6812
6865
|
/**
|
|
6813
6866
|
* Identifies the user/account at Gainsight.
|
|
6814
|
-
* @param
|
|
6815
|
-
* @param
|
|
6816
|
-
* @param versionUI The UI version used.
|
|
6817
|
-
* @param versionBE The BE version used.
|
|
6867
|
+
* @param sendPiiData Flag for sending personally identifiable information.
|
|
6868
|
+
* @param identifyData Object containing identification data.
|
|
6818
6869
|
*/
|
|
6819
|
-
identify(
|
|
6870
|
+
identify(sendPiiData, identifyData) {
|
|
6820
6871
|
const windowRef = window;
|
|
6821
|
-
const { id: userId, email,
|
|
6822
|
-
const { name, customProperties, domainName } =
|
|
6823
|
-
const {
|
|
6824
|
-
|
|
6825
|
-
|
|
6826
|
-
|
|
6827
|
-
|
|
6828
|
-
|
|
6829
|
-
|
|
6872
|
+
const { id: userId, email, roles } = identifyData.user;
|
|
6873
|
+
const { name: tenantID, customProperties, domainName } = identifyData.currentTenant;
|
|
6874
|
+
const { instanceId, versionUI, versionBE } = identifyData;
|
|
6875
|
+
/**
|
|
6876
|
+
* Passing ID is a minimum required data to make an identify call to Gainsight.
|
|
6877
|
+
* isUserCreatedAfterAnonymizationWasActivated parameter is passed to later distinguish between users created before and after data anonymization done by Gainsight.
|
|
6878
|
+
* tenantID Used to distinguish between tenants when same email is used for different tenants.
|
|
6879
|
+
*
|
|
6880
|
+
* Due to GS limitations (GS does not allow clearing user attr/preferences via the GS tag!),
|
|
6881
|
+
* we always need to initialize fields related to PII to prevent leaking this data to GS when the user has disabled functional cookies.
|
|
6882
|
+
*/
|
|
6883
|
+
const requiredIdentify = {
|
|
6884
|
+
/**
|
|
6885
|
+
* Email was not mandatory form field until 10.14
|
|
6886
|
+
*/
|
|
6887
|
+
id: email ? email : `${userId}_${tenantID}_${instanceId}`,
|
|
6888
|
+
isUserCreatedAfterAnonymizationWasActivated: true,
|
|
6889
|
+
tenantID: tenantID,
|
|
6890
|
+
email: '--',
|
|
6891
|
+
userName: '--',
|
|
6892
|
+
firstName: '--',
|
|
6893
|
+
lastName: '--',
|
|
6830
6894
|
domainName,
|
|
6831
6895
|
versionUI,
|
|
6832
6896
|
versionBE,
|
|
6833
6897
|
userLanguage: this.translateService.currentLang,
|
|
6898
|
+
browserLanguage: this.translateService.getBrowserLang(),
|
|
6834
6899
|
instanceId,
|
|
6835
|
-
externalReference
|
|
6836
|
-
|
|
6837
|
-
|
|
6838
|
-
|
|
6839
|
-
}
|
|
6900
|
+
externalReference: customProperties?.externalReference,
|
|
6901
|
+
userRoles: this.transformUserRolesToStr(roles?.references),
|
|
6902
|
+
customBranding: this.isCustomBranding(),
|
|
6903
|
+
fullTracking: sendPiiData
|
|
6904
|
+
};
|
|
6905
|
+
if (sendPiiData) {
|
|
6906
|
+
const { userName, firstName, lastName } = identifyData.user;
|
|
6907
|
+
const extendedIdentify = {
|
|
6908
|
+
...requiredIdentify,
|
|
6909
|
+
email,
|
|
6910
|
+
userName,
|
|
6911
|
+
firstName,
|
|
6912
|
+
lastName
|
|
6913
|
+
};
|
|
6914
|
+
windowRef[this.GAINSIGHT_GLOBAL_SCOPE]('identify', extendedIdentify, {
|
|
6915
|
+
id: `${tenantID}_${instanceId}`,
|
|
6916
|
+
instanceId
|
|
6917
|
+
});
|
|
6918
|
+
return;
|
|
6919
|
+
}
|
|
6920
|
+
windowRef[this.GAINSIGHT_GLOBAL_SCOPE]('identify', requiredIdentify);
|
|
6840
6921
|
}
|
|
6922
|
+
/**
|
|
6923
|
+
* Triggers an event to be recorded by Gainsight PX.
|
|
6924
|
+
* This method calls the Gainsight PX's tracking mechanism to log a specific event
|
|
6925
|
+
* along with its associated properties.
|
|
6926
|
+
* @param eventName - Name of the event to be triggered.
|
|
6927
|
+
* @param props - Optional properties associated with the event.
|
|
6928
|
+
*/
|
|
6841
6929
|
triggerEvent(eventName, props) {
|
|
6842
6930
|
if (this.tagFunction && eventName) {
|
|
6843
6931
|
eventName = this.prepareEventName(eventName);
|
|
@@ -6859,45 +6947,87 @@ class GainsightService {
|
|
|
6859
6947
|
return this.getEnTranslation(textToTranslate, this.cachedRevertedTranslations);
|
|
6860
6948
|
}
|
|
6861
6949
|
/**
|
|
6862
|
-
*
|
|
6863
|
-
* The decision to
|
|
6864
|
-
*
|
|
6950
|
+
* Determines whether personally identifiable information (PII) should be sent while loading a tag.
|
|
6951
|
+
* The decision to activate Gainsight and send PII relies on whether the cookiePreferences option is defined in the application settings,
|
|
6952
|
+
* if the functional cookie is enabled, and if the user grants permission.
|
|
6865
6953
|
*/
|
|
6866
|
-
|
|
6954
|
+
async shouldSendPiiData() {
|
|
6867
6955
|
return (this.cookieBannerService.isConfigCookiePreferencesDefined() &&
|
|
6868
6956
|
this.cookieBannerService.isFunctionalCookieEnabled() &&
|
|
6869
|
-
!this.
|
|
6870
|
-
|
|
6957
|
+
!(await this.isGainsightPreferenceDisabledInUserPreferences(this.USER_PREFERENCES_GAINSIGHT_KEY)));
|
|
6958
|
+
}
|
|
6959
|
+
/**
|
|
6960
|
+
* Updates a specific user attribute in the Gainsight global scope.
|
|
6961
|
+
* This method interfaces with the Gainsight global object to set a user's specific attribute with a provided value.
|
|
6962
|
+
* @param name - Name of the user attribute to be updated.
|
|
6963
|
+
* @param value - Value to set for the specified user attribute.
|
|
6964
|
+
*/
|
|
6965
|
+
updateUserAttribute(name, value) {
|
|
6966
|
+
window[this.GAINSIGHT_GLOBAL_SCOPE]?.('set', 'user', { [name]: value });
|
|
6871
6967
|
}
|
|
6968
|
+
/**
|
|
6969
|
+
* Determines if the current user has the capability to modify Gainsight PX settings.
|
|
6970
|
+
*
|
|
6971
|
+
* This method checks multiple conditions:
|
|
6972
|
+
* 1. Whether tracking has been disabled globally via application options.
|
|
6973
|
+
* 2. Whether Gainsight is disabled at the tenant level through custom properties.
|
|
6974
|
+
* 3. Whether a Gainsight key is available, either currently loaded or fetched asynchronously.
|
|
6975
|
+
* 4. Whether cookie preferences are defined and available for the user.
|
|
6976
|
+
*
|
|
6977
|
+
* @returns Promise that resolves to a boolean. True indicates the user can edit product experience settings, and false otherwise.
|
|
6978
|
+
*/
|
|
6872
6979
|
async canEditProductExperienceSettings() {
|
|
6873
6980
|
const currentTenant = this.appState.currentTenant.value;
|
|
6874
6981
|
const { customProperties } = currentTenant;
|
|
6982
|
+
if (this.isTrackingDisabled() ||
|
|
6983
|
+
this.isGainsightDisabledAtTenantCustomProperties(customProperties)) {
|
|
6984
|
+
return false;
|
|
6985
|
+
}
|
|
6875
6986
|
const gainsightKey = !!this.gainsightKey || !!(await this.getGainsightKey());
|
|
6876
6987
|
return (gainsightKey &&
|
|
6877
6988
|
this.cookieBannerService.isConfigCookiePreferencesDefined() &&
|
|
6878
|
-
|
|
6879
|
-
!!this.cookieBannerService.getUserCookiePreferences() &&
|
|
6880
|
-
!this.isCustomBranding());
|
|
6989
|
+
!!this.cookieBannerService.getUserCookiePreferences());
|
|
6881
6990
|
}
|
|
6882
|
-
|
|
6883
|
-
|
|
6884
|
-
|
|
6885
|
-
|
|
6886
|
-
|
|
6887
|
-
this.
|
|
6991
|
+
/**
|
|
6992
|
+
* Sets the global context for Gainsight with the current application name.
|
|
6993
|
+
* The global context can be utilized by Gainsight for various purposes, such as segmenting users.
|
|
6994
|
+
*/
|
|
6995
|
+
setGlobalContext() {
|
|
6996
|
+
const currentAppState = this.appState.state$.value;
|
|
6997
|
+
const currentAppName = currentAppState.app.name;
|
|
6998
|
+
window[this.GAINSIGHT_GLOBAL_SCOPE]?.('set', 'globalContext', { projectName: currentAppName });
|
|
6888
6999
|
}
|
|
6889
|
-
|
|
6890
|
-
if (
|
|
6891
|
-
return;
|
|
7000
|
+
transformUserRolesToStr(userRoles) {
|
|
7001
|
+
if (!userRoles) {
|
|
7002
|
+
return '';
|
|
6892
7003
|
}
|
|
6893
|
-
|
|
6894
|
-
style.id = styleId;
|
|
6895
|
-
style.textContent = '#apt-widget { display:none }';
|
|
6896
|
-
this.document.head.appendChild(style);
|
|
7004
|
+
return flatMap(userRoles, (userRole) => userRole.role.name).join();
|
|
6897
7005
|
}
|
|
6898
|
-
|
|
6899
|
-
|
|
6900
|
-
|
|
7006
|
+
/**
|
|
7007
|
+
* Checks if Gainsight is disabled based on tenant custom properties.
|
|
7008
|
+
*
|
|
7009
|
+
* @param customProperties - The custom properties of the tenant.
|
|
7010
|
+
* @returns {boolean} - True if Gainsight is disabled, false otherwise.
|
|
7011
|
+
*/
|
|
7012
|
+
isGainsightDisabledAtTenantCustomProperties(customProperties) {
|
|
7013
|
+
const gainsightEnabled = customProperties && customProperties.gainsightEnabled;
|
|
7014
|
+
return gainsightEnabled === false;
|
|
7015
|
+
}
|
|
7016
|
+
/**
|
|
7017
|
+
* Determines if custom branding is enabled based on the presence of a brand logo.
|
|
7018
|
+
*
|
|
7019
|
+
* @returns {boolean} - True if custom branding is applied, false otherwise.
|
|
7020
|
+
*/
|
|
7021
|
+
isCustomBranding() {
|
|
7022
|
+
const brandingCssVars = this.options.get('brandingCssVars') || {};
|
|
7023
|
+
return !!brandingCssVars['brand-logo-img'];
|
|
7024
|
+
}
|
|
7025
|
+
/**
|
|
7026
|
+
* Determines if tracking is disabled based on the application options.
|
|
7027
|
+
* @returns `true` if tracking is disabled, otherwise `false`.
|
|
7028
|
+
*/
|
|
7029
|
+
isTrackingDisabled() {
|
|
7030
|
+
return this.options.disableTracking === true;
|
|
6901
7031
|
}
|
|
6902
7032
|
prepareEventName(baseEventName) {
|
|
6903
7033
|
return baseEventName
|
|
@@ -6908,14 +7038,6 @@ class GainsightService {
|
|
|
6908
7038
|
return eventNamePart.replace(/`[\w\W]*`/g, '');
|
|
6909
7039
|
}
|
|
6910
7040
|
}
|
|
6911
|
-
isGainsightDisabled(customProperties) {
|
|
6912
|
-
const gainsightEnabled = customProperties && customProperties.gainsightEnabled;
|
|
6913
|
-
return gainsightEnabled === false;
|
|
6914
|
-
}
|
|
6915
|
-
isCustomBranding() {
|
|
6916
|
-
const brandingCssVars = this.options.get('brandingCssVars') || {};
|
|
6917
|
-
return !!brandingCssVars['brand-logo-img'];
|
|
6918
|
-
}
|
|
6919
7041
|
loadScriptTag(scriptTag, key) {
|
|
6920
7042
|
try {
|
|
6921
7043
|
const windowRef = window;
|
|
@@ -6978,17 +7100,14 @@ class GainsightService {
|
|
|
6978
7100
|
return enTranslation;
|
|
6979
7101
|
}
|
|
6980
7102
|
}
|
|
6981
|
-
GainsightService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: GainsightService, deps: [{ token:
|
|
7103
|
+
GainsightService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: GainsightService, deps: [{ token: AppStateService }, { token: OptionsService }, { token: CookieBannerService }, { token: UserPreferencesService }, { token: i1$3.TranslateService }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
6982
7104
|
GainsightService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: GainsightService, providedIn: 'root' });
|
|
6983
7105
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: GainsightService, decorators: [{
|
|
6984
7106
|
type: Injectable,
|
|
6985
7107
|
args: [{
|
|
6986
7108
|
providedIn: 'root'
|
|
6987
7109
|
}]
|
|
6988
|
-
}], ctorParameters: function () { return [{ type:
|
|
6989
|
-
type: Inject,
|
|
6990
|
-
args: [DOCUMENT]
|
|
6991
|
-
}] }, { type: AppStateService }, { type: OptionsService }, { type: CookieBannerService }, { type: UserPreferencesService }, { type: i1$3.TranslateService }]; } });
|
|
7110
|
+
}], ctorParameters: function () { return [{ type: AppStateService }, { type: OptionsService }, { type: CookieBannerService }, { type: UserPreferencesService }, { type: i1$3.TranslateService }]; } });
|
|
6992
7111
|
|
|
6993
7112
|
/**
|
|
6994
7113
|
* This component is used as the outlet to show the action bars.
|
|
@@ -7051,15 +7170,17 @@ class ActionBarComponent {
|
|
|
7051
7170
|
return;
|
|
7052
7171
|
}
|
|
7053
7172
|
const element = event.closest('[px-event]') || event.closest('[title]') || event.closest('[uib-tooltip]');
|
|
7054
|
-
if (!element) {
|
|
7173
|
+
if (!element || element.getAttribute('disabled')) {
|
|
7055
7174
|
return;
|
|
7056
7175
|
}
|
|
7057
|
-
const
|
|
7176
|
+
const itemName = element.getAttribute('px-event') ||
|
|
7058
7177
|
element.getAttribute('title') ||
|
|
7059
7178
|
element.getAttribute('uib-tooltip');
|
|
7060
|
-
const
|
|
7061
|
-
this.gainsightService.triggerEvent(
|
|
7062
|
-
|
|
7179
|
+
const translatedItemName = this.gainsightService.translateToEnglish(itemName);
|
|
7180
|
+
this.gainsightService.triggerEvent(PRODUCT_EXPERIENCE.ACTION_BAR.EVENTS.ACTION_BAR_ITEM, {
|
|
7181
|
+
component: PRODUCT_EXPERIENCE.ACTION_BAR.COMPONENTS.ACTION_BAR_COMPONENT,
|
|
7182
|
+
action: translatedItemName,
|
|
7183
|
+
url: location.href
|
|
7063
7184
|
});
|
|
7064
7185
|
}
|
|
7065
7186
|
ngOnInit() {
|
|
@@ -11359,6 +11480,171 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.6", ngImpor
|
|
|
11359
11480
|
type: Injectable
|
|
11360
11481
|
}], ctorParameters: function () { return [{ type: i1$6.BsModalService }]; } });
|
|
11361
11482
|
|
|
11483
|
+
class UserEngagementsService {
|
|
11484
|
+
constructor(document, userPreferencesService, gainsightService) {
|
|
11485
|
+
this.document = document;
|
|
11486
|
+
this.userPreferencesService = userPreferencesService;
|
|
11487
|
+
this.gainsightService = gainsightService;
|
|
11488
|
+
this.USER_PREFERENCES_GAINSIGHT_ENGAGEMENTS_KEY = 'gainsightBotEnabled';
|
|
11489
|
+
this.userEngagementsEnabled$ = new BehaviorSubject(false);
|
|
11490
|
+
this.HIDE_GAINSIGHT_BOT_STYLE_ID = 'hide-gs-bot';
|
|
11491
|
+
this.ENGAGEMENTS = 'engagements';
|
|
11492
|
+
this.handleUserEngagements();
|
|
11493
|
+
}
|
|
11494
|
+
/**
|
|
11495
|
+
* Handles user engagement settings based on various conditions.
|
|
11496
|
+
*
|
|
11497
|
+
* - Waits for the Gainsight tracking to be loaded.
|
|
11498
|
+
* - Retrieves the engagement settings.
|
|
11499
|
+
* - Updates the engagement settings based on the combined observations.
|
|
11500
|
+
* - Finally, toggles the Gainsight engagements based on the latest `userEngagementsEnabled$` value.
|
|
11501
|
+
*/
|
|
11502
|
+
handleUserEngagements() {
|
|
11503
|
+
this.gainsightService.trackingLoaded$
|
|
11504
|
+
.pipe(take(1), switchMap(() => this.getEngagementSettingsObservable()), tap((settings) => this.updateUserEngagementSettings(...settings)), switchMap(() => this.userEngagementsEnabled$.pipe(take(1))))
|
|
11505
|
+
.subscribe(isEnabled => this.toggleGainsightEngagements(isEnabled));
|
|
11506
|
+
}
|
|
11507
|
+
/**
|
|
11508
|
+
* Updates the user's preference for Gainsight Engagements.
|
|
11509
|
+
* @param {boolean} isEnabled - The new value for the user's engagement preference.
|
|
11510
|
+
*/
|
|
11511
|
+
updateUserEngagementPreference(isEnabled) {
|
|
11512
|
+
this.userEngagementsEnabled$.next(isEnabled);
|
|
11513
|
+
this.userPreferencesService.set(this.gainsightService.USER_PREFERENCES_GAINSIGHT_ENGAGEMENTS_KEY, this.userEngagementsEnabled$.value);
|
|
11514
|
+
}
|
|
11515
|
+
/**
|
|
11516
|
+
* Toggles the visibility of Gainsight Engagements based on the provided flag.
|
|
11517
|
+
*
|
|
11518
|
+
* @param isEnabled - A flag indicating whether Gainsight Engagements should be visible.
|
|
11519
|
+
*/
|
|
11520
|
+
toggleGainsightEngagements(isEnabled) {
|
|
11521
|
+
isEnabled ? this.showGainsightEngagements() : this.hideGainsightEngagements();
|
|
11522
|
+
}
|
|
11523
|
+
/**
|
|
11524
|
+
* Constructs an observable that emits an array of boolean values representing
|
|
11525
|
+
* the current engagement settings. The observable combines the latest values from:
|
|
11526
|
+
*
|
|
11527
|
+
* 1. User's preferences for Gainsight engagements.
|
|
11528
|
+
* 2. A flag indicating if PII data should be sent.
|
|
11529
|
+
* 3. A flag indicating if the platform uses custom branding.
|
|
11530
|
+
*
|
|
11531
|
+
* @returns An observable emitting an array of boolean values.
|
|
11532
|
+
*/
|
|
11533
|
+
getEngagementSettingsObservable() {
|
|
11534
|
+
return combineLatest([
|
|
11535
|
+
this.userPreferencesService.observe(this.USER_PREFERENCES_GAINSIGHT_ENGAGEMENTS_KEY),
|
|
11536
|
+
from(this.gainsightService.shouldSendPiiData()),
|
|
11537
|
+
of(this.gainsightService.isCustomBranding())
|
|
11538
|
+
]);
|
|
11539
|
+
}
|
|
11540
|
+
/**
|
|
11541
|
+
* Updates user engagement settings based on provided preferences and settings.
|
|
11542
|
+
*
|
|
11543
|
+
* Based on the received values, the method decides to:
|
|
11544
|
+
* 1. Disable user engagements if PII data should not be shared or certain branding/settings conditions are met.
|
|
11545
|
+
* 2. Update the user engagement preference if the user engagement bot setting is undefined.
|
|
11546
|
+
*
|
|
11547
|
+
* @param userEngagementBotSetting - The user's setting for the engagement bot.
|
|
11548
|
+
* @param shouldSendPiiData - Indicates whether PII data should be shared.
|
|
11549
|
+
* @param hasCustomBranding - Indicates if custom branding is applied.
|
|
11550
|
+
*/
|
|
11551
|
+
updateUserEngagementSettings(userEngagementBotSetting, shouldSendPiiData, hasCustomBranding) {
|
|
11552
|
+
if (this.shouldDisableUserEngagementsDueToPIIData(shouldSendPiiData)) {
|
|
11553
|
+
this.userEngagementsEnabled$.next(false);
|
|
11554
|
+
}
|
|
11555
|
+
else if (this.isUserEngagementBotSettingUndefined(userEngagementBotSetting)) {
|
|
11556
|
+
/**
|
|
11557
|
+
* Case where the user is new (freshly created) and has not changed the user engagement settings in the user edit modal (untouched state).
|
|
11558
|
+
* When custom branding is not set, we will set the user engagements in the user preferences to true by default.
|
|
11559
|
+
*/
|
|
11560
|
+
this.updateUserEngagementPreference(!hasCustomBranding);
|
|
11561
|
+
}
|
|
11562
|
+
else {
|
|
11563
|
+
this.userEngagementsEnabled$.next(userEngagementBotSetting);
|
|
11564
|
+
}
|
|
11565
|
+
}
|
|
11566
|
+
/**
|
|
11567
|
+
* Determines whether user engagements should be disabled due to PII data settings.
|
|
11568
|
+
*
|
|
11569
|
+
* If the `shouldSendPiiData` parameter is false, this indicates that the user engagements
|
|
11570
|
+
* should be disabled to prevent sharing personally identifiable information.
|
|
11571
|
+
*
|
|
11572
|
+
* @param {boolean} shouldSendPiiData - Indicates whether PII data is allowed to be sent.
|
|
11573
|
+
* @returns {boolean} Returns true if user engagements should be disabled, otherwise false.
|
|
11574
|
+
*/
|
|
11575
|
+
shouldDisableUserEngagementsDueToPIIData(shouldSendPiiData) {
|
|
11576
|
+
return !shouldSendPiiData;
|
|
11577
|
+
}
|
|
11578
|
+
/**
|
|
11579
|
+
* Determines if the user engagement bot setting is undefined.
|
|
11580
|
+
*
|
|
11581
|
+
* @param {boolean | undefined} userEngagementBotSetting - The setting value to check.
|
|
11582
|
+
* @returns {boolean} Returns `true` if the setting is undefined; otherwise, `false`.
|
|
11583
|
+
*
|
|
11584
|
+
* This scenario occurs when a user is new and hasn't modified the bot settings in the user details UI yet.
|
|
11585
|
+
*/
|
|
11586
|
+
isUserEngagementBotSettingUndefined(userEngagementBotSetting) {
|
|
11587
|
+
return userEngagementBotSetting === undefined;
|
|
11588
|
+
}
|
|
11589
|
+
/**
|
|
11590
|
+
* Enables the visibility of Gainsight engagements.
|
|
11591
|
+
*
|
|
11592
|
+
* This method removes the CSS styles that hide the Gainsight engagements
|
|
11593
|
+
* and updates the relevant user attribute to mark the engagements as visible.
|
|
11594
|
+
*/
|
|
11595
|
+
showGainsightEngagements() {
|
|
11596
|
+
this.removeHidingStyle(this.HIDE_GAINSIGHT_BOT_STYLE_ID);
|
|
11597
|
+
this.gainsightService.updateUserAttribute(this.ENGAGEMENTS, true);
|
|
11598
|
+
}
|
|
11599
|
+
/**
|
|
11600
|
+
* Hides the Gainsight engagements.
|
|
11601
|
+
*
|
|
11602
|
+
* This method applies CSS styles to hide the Gainsight engagements
|
|
11603
|
+
* and updates the relevant user attribute to mark the engagements as hidden.
|
|
11604
|
+
*/
|
|
11605
|
+
hideGainsightEngagements() {
|
|
11606
|
+
this.addHidingStyle(this.HIDE_GAINSIGHT_BOT_STYLE_ID, '#apt-widget { display:none }');
|
|
11607
|
+
this.gainsightService.updateUserAttribute(this.ENGAGEMENTS, false);
|
|
11608
|
+
}
|
|
11609
|
+
/**
|
|
11610
|
+
* Removes the specified CSS style from the document.
|
|
11611
|
+
*
|
|
11612
|
+
* @param {string} styleId - The ID of the CSS style element to remove.
|
|
11613
|
+
*/
|
|
11614
|
+
removeHidingStyle(styleId) {
|
|
11615
|
+
const style = this.document.getElementById(styleId);
|
|
11616
|
+
style?.remove();
|
|
11617
|
+
}
|
|
11618
|
+
/**
|
|
11619
|
+
* Adds a new CSS style to the document.
|
|
11620
|
+
*
|
|
11621
|
+
* If the style with the specified ID already exists, the method will do nothing.
|
|
11622
|
+
* Otherwise, it creates a new `<style>` element with the given ID and content,
|
|
11623
|
+
* then appends it to the document head.
|
|
11624
|
+
*
|
|
11625
|
+
* @param {string} styleId - The ID to assign to the new style element.
|
|
11626
|
+
* @param {string} textContent - The CSS rules to be included in the style.
|
|
11627
|
+
*/
|
|
11628
|
+
addHidingStyle(styleId, textContent) {
|
|
11629
|
+
if (this.document.getElementById(styleId)) {
|
|
11630
|
+
return;
|
|
11631
|
+
}
|
|
11632
|
+
const style = this.document.createElement('style');
|
|
11633
|
+
style.id = styleId;
|
|
11634
|
+
style.textContent = textContent;
|
|
11635
|
+
this.document.head.appendChild(style);
|
|
11636
|
+
}
|
|
11637
|
+
}
|
|
11638
|
+
UserEngagementsService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: UserEngagementsService, deps: [{ token: DOCUMENT }, { token: UserPreferencesService }, { token: GainsightService }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
11639
|
+
UserEngagementsService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: UserEngagementsService, providedIn: 'root' });
|
|
11640
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: UserEngagementsService, decorators: [{
|
|
11641
|
+
type: Injectable,
|
|
11642
|
+
args: [{ providedIn: 'root' }]
|
|
11643
|
+
}], ctorParameters: function () { return [{ type: DOCUMENT, decorators: [{
|
|
11644
|
+
type: Inject,
|
|
11645
|
+
args: [DOCUMENT]
|
|
11646
|
+
}] }, { type: UserPreferencesService }, { type: GainsightService }]; } });
|
|
11647
|
+
|
|
11362
11648
|
class TotpChallengeComponent {
|
|
11363
11649
|
constructor(loginService, users, alert) {
|
|
11364
11650
|
this.loginService = loginService;
|
|
@@ -11742,7 +12028,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.6", ngImpor
|
|
|
11742
12028
|
}] } });
|
|
11743
12029
|
|
|
11744
12030
|
class UserEditComponent {
|
|
11745
|
-
constructor(state, translate, bsModalService, alert, userService, tenantLoginOptionsService, tenantService
|
|
12031
|
+
constructor(state, translate, bsModalService, alert, userService, tenantLoginOptionsService, tenantService) {
|
|
11746
12032
|
this.state = state;
|
|
11747
12033
|
this.translate = translate;
|
|
11748
12034
|
this.bsModalService = bsModalService;
|
|
@@ -11750,16 +12036,14 @@ class UserEditComponent {
|
|
|
11750
12036
|
this.userService = userService;
|
|
11751
12037
|
this.tenantLoginOptionsService = tenantLoginOptionsService;
|
|
11752
12038
|
this.tenantService = tenantService;
|
|
11753
|
-
this.userPreferencesService = userPreferencesService;
|
|
11754
|
-
this.gainsightService = gainsightService;
|
|
11755
12039
|
this.loading = false;
|
|
11756
|
-
this.
|
|
12040
|
+
this.showProductExperienceOptions = false;
|
|
11757
12041
|
this.isUsageTrackingEnabled = true;
|
|
11758
|
-
this.
|
|
12042
|
+
this.isUserEngagementPreferenceEnabled = true;
|
|
11759
12043
|
this.onUser = new EventEmitter();
|
|
11760
12044
|
this.onLanguage = new EventEmitter();
|
|
11761
|
-
this.
|
|
11762
|
-
this.
|
|
12045
|
+
this.onUsageTrackingChange = new EventEmitter();
|
|
12046
|
+
this.onUserEngagementPreferenceChange = new EventEmitter();
|
|
11763
12047
|
this.onCancel = new EventEmitter();
|
|
11764
12048
|
this.userHasActiveTotp = false;
|
|
11765
12049
|
this.userCanSetupTotp = false;
|
|
@@ -11784,18 +12068,12 @@ class UserEditComponent {
|
|
|
11784
12068
|
this.isPhoneRequired = true;
|
|
11785
12069
|
}
|
|
11786
12070
|
}
|
|
11787
|
-
async onEnablingProductUsageTracking(isUsageTrackingEnabled) {
|
|
11788
|
-
if (isUsageTrackingEnabled && this.isGainsightBotEnabled === undefined) {
|
|
11789
|
-
this.isGainsightBotEnabled = await this.userPreferencesService
|
|
11790
|
-
.get(this.gainsightService.USER_PREFERENCES_GAINSIGHT_BOT_KEY)
|
|
11791
|
-
.toPromise();
|
|
11792
|
-
}
|
|
11793
|
-
}
|
|
11794
|
-
get langs() {
|
|
11795
|
-
return this.state.state.langs;
|
|
11796
|
-
}
|
|
11797
12071
|
setupTotp() {
|
|
11798
|
-
this.bsModalService.show(UserTotpSetupComponent, {
|
|
12072
|
+
this.bsModalService.show(UserTotpSetupComponent, {
|
|
12073
|
+
class: 'modal-sm',
|
|
12074
|
+
ariaDescribedby: 'modal-body',
|
|
12075
|
+
ariaLabelledBy: 'modal-title'
|
|
12076
|
+
});
|
|
11799
12077
|
this.cancel(); // to close the user edit modal and prevent console errors on logout
|
|
11800
12078
|
}
|
|
11801
12079
|
cancel() {
|
|
@@ -11805,15 +12083,22 @@ class UserEditComponent {
|
|
|
11805
12083
|
if (this.loading) {
|
|
11806
12084
|
return;
|
|
11807
12085
|
}
|
|
11808
|
-
if (this.
|
|
11809
|
-
this.
|
|
11810
|
-
|
|
12086
|
+
if (this.showProductExperienceOptions) {
|
|
12087
|
+
this.onUsageTrackingChange.emit(this.isUsageTrackingEnabled);
|
|
12088
|
+
/**
|
|
12089
|
+
* Emits a user engagement preference change event.
|
|
12090
|
+
* If usage tracking is disabled, it emits `false`. Otherwise, it emits the current state of the user engagement preference.
|
|
12091
|
+
*/
|
|
12092
|
+
this.onUserEngagementPreferenceChange.emit(this.isUsageTrackingEnabled === false ? false : this.isUserEngagementPreferenceEnabled);
|
|
11811
12093
|
}
|
|
11812
12094
|
this.onUser.emit(this._user);
|
|
11813
12095
|
}
|
|
11814
12096
|
onNewPasswordChanged(newPassword) {
|
|
11815
12097
|
this._user.password = newPassword.password;
|
|
11816
12098
|
}
|
|
12099
|
+
get langs() {
|
|
12100
|
+
return this.state.state.langs;
|
|
12101
|
+
}
|
|
11817
12102
|
async initializeTotpSettings() {
|
|
11818
12103
|
try {
|
|
11819
12104
|
this.userCanSetupTotp = await this.canUserSetupTotp();
|
|
@@ -11832,37 +12117,37 @@ class UserEditComponent {
|
|
|
11832
12117
|
return loginOptions.some(({ tfaStrategy = '' }) => tfaStrategy.toLowerCase() === 'totp');
|
|
11833
12118
|
}
|
|
11834
12119
|
}
|
|
11835
|
-
UserEditComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: UserEditComponent, deps: [{ token: AppStateService }, { token: TranslateService }, { token: i1$6.BsModalService }, { token: AlertService }, { token: i1$2.UserService }, { token: i1$2.TenantLoginOptionsService }, { token: i1$2.TenantService }
|
|
11836
|
-
UserEditComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.0.6", type: UserEditComponent, selector: "c8y-user-edit", inputs: { lang: "lang", loading: "loading", user: "user", showProductUsageSetting: "showProductUsageSetting", isUsageTrackingEnabled: "isUsageTrackingEnabled", isGainsightBotEnabled: "isGainsightBotEnabled" }, outputs: { onUser: "onUser", onLanguage: "onLanguage", onProductExperience: "onProductExperience", onGainsightBot: "onGainsightBot", 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 (for example, email)</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 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 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 c8yDefaultValidation=\"phoneNumber\"\n [required]=\"isPhoneRequired\"\n [disabled]=\"userIsExternal\"\n />\n </c8y-form-group>\n\n <c8y-form-group>\n <label translate for=\"userLang\">Language</label>\n <div class=\"c8y-select-wrapper\">\n <select\n id=\"userLang\"\n class=\"form-control\"\n #selectLang\n name=\"lang\"\n [(ngModel)]=\"lang\"\n (change)=\"onLanguage.emit(selectLang.value)\"\n >\n <option *ngFor=\"let lang of langs\" [value]=\"lang\">\n {{ translate.getNativeLanguage(lang) }}\n </option>\n </select>\n <span></span>\n </div>\n </c8y-form-group>\n\n <c8y-form-group class=\"p-t-8 p-b-8 separator-top\" *ngIf=\"showProductUsageSetting\">\n <strong translate>Product experience</strong>\n <label class=\"c8y-switch\" for=\"productUsageTracking\">\n <input\n id=\"productUsageTracking\"\n name=\"productUsageTracking\"\n type=\"checkbox\"\n (change)=\"onEnablingProductUsageTracking(isUsageTrackingEnabled)\"\n [(ngModel)]=\"isUsageTrackingEnabled\"\n />\n <span></span>\n {{ 'Enable anonymous tracking to enhance the product experience' | translate }}\n </label>\n <ng-container *ngIf=\"isUsageTrackingEnabled\">\n <label class=\"c8y-switch m-l-0\" for=\"knowledgeHubBot\">\n <input\n id=\"knowledgeHubBot\"\n name=\"knowledgeHubBot\"\n type=\"checkbox\"\n [(ngModel)]=\"isGainsightBotEnabled\"\n />\n <span></span>\n {{ 'Enable Knowledge Hub' | translate }}\n </label>\n </ng-container>\n </c8y-form-group>\n\n <div class=\"form-group\" *ngIf=\"!userIsExternal\">\n <label class=\"control-label\">{{ 'Login options' | translate }}</label>\n <c8y-new-password (password)=\"onNewPasswordChanged($event)\"></c8y-new-password>\n <button\n title=\"{{ 'Set up two-factor authentication' | translate }}\"\n class=\"btn btn-default\"\n type=\"button\"\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-white sticky-bottom\">\n <button\n title=\"{{ 'Cancel' | translate }}\"\n class=\"btn btn-default\"\n type=\"button\"\n (click)=\"cancel()\"\n >\n {{ 'Cancel' | translate }}\n </button>\n <button\n title=\"{{ 'Save' | translate }}\"\n class=\"btn btn-primary\"\n type=\"submit\"\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.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i2$3.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { 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.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { 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$1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2$1.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$1.AsyncPipe, name: "async" }] });
|
|
12120
|
+
UserEditComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: UserEditComponent, deps: [{ token: AppStateService }, { token: TranslateService }, { token: i1$6.BsModalService }, { token: AlertService }, { token: i1$2.UserService }, { token: i1$2.TenantLoginOptionsService }, { token: i1$2.TenantService }], target: i0.ɵɵFactoryTarget.Component });
|
|
12121
|
+
UserEditComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.0.6", type: UserEditComponent, selector: "c8y-user-edit", inputs: { lang: "lang", loading: "loading", user: "user", showProductExperienceOptions: "showProductExperienceOptions", isUsageTrackingEnabled: "isUsageTrackingEnabled", isUserEngagementPreferenceEnabled: "isUserEngagementPreferenceEnabled" }, outputs: { onUser: "onUser", onLanguage: "onLanguage", 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 (for example, email)</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 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 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 c8yDefaultValidation=\"phoneNumber\"\n [required]=\"isPhoneRequired\"\n [disabled]=\"userIsExternal\"\n />\n </c8y-form-group>\n\n <c8y-form-group>\n <label translate for=\"userLang\">Language</label>\n <div class=\"c8y-select-wrapper\">\n <select\n id=\"userLang\"\n class=\"form-control\"\n #selectLang\n name=\"lang\"\n [(ngModel)]=\"lang\"\n (change)=\"onLanguage.emit(selectLang.value)\"\n >\n <option *ngFor=\"let lang of langs\" [value]=\"lang\">\n {{ translate.getNativeLanguage(lang) }}\n </option>\n </select>\n <span></span>\n </div>\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 title=\"{{ 'Set up two-factor authentication' | translate }}\"\n class=\"btn btn-default\"\n type=\"button\"\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-white sticky-bottom\">\n <button\n title=\"{{ 'Cancel' | translate }}\"\n class=\"btn btn-default\"\n type=\"button\"\n (click)=\"cancel()\"\n >\n {{ 'Cancel' | translate }}\n </button>\n <button\n title=\"{{ 'Save' | translate }}\"\n class=\"btn btn-primary\"\n type=\"submit\"\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.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i2$3.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { 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.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { 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$1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2$1.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$1.AsyncPipe, name: "async" }] });
|
|
11837
12122
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: UserEditComponent, decorators: [{
|
|
11838
12123
|
type: Component,
|
|
11839
|
-
args: [{ selector: 'c8y-user-edit', 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 (for example, email)</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 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 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 c8yDefaultValidation=\"phoneNumber\"\n [required]=\"isPhoneRequired\"\n [disabled]=\"userIsExternal\"\n />\n </c8y-form-group>\n\n <c8y-form-group>\n <label translate for=\"userLang\">Language</label>\n <div class=\"c8y-select-wrapper\">\n <select\n id=\"userLang\"\n class=\"form-control\"\n #selectLang\n name=\"lang\"\n [(ngModel)]=\"lang\"\n (change)=\"onLanguage.emit(selectLang.value)\"\n >\n <option *ngFor=\"let lang of langs\" [value]=\"lang\">\n {{ translate.getNativeLanguage(lang) }}\n </option>\n </select>\n <span></span>\n </div>\n </c8y-form-group>\n\n <c8y-form-group class=\"p-t-
|
|
11840
|
-
}], ctorParameters: function () { return [{ type: AppStateService }, { type: TranslateService }, { type: i1$6.BsModalService }, { type: AlertService }, { type: i1$2.UserService }, { type: i1$2.TenantLoginOptionsService }, { type: i1$2.TenantService }
|
|
12124
|
+
args: [{ selector: 'c8y-user-edit', 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 (for example, email)</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 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 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 c8yDefaultValidation=\"phoneNumber\"\n [required]=\"isPhoneRequired\"\n [disabled]=\"userIsExternal\"\n />\n </c8y-form-group>\n\n <c8y-form-group>\n <label translate for=\"userLang\">Language</label>\n <div class=\"c8y-select-wrapper\">\n <select\n id=\"userLang\"\n class=\"form-control\"\n #selectLang\n name=\"lang\"\n [(ngModel)]=\"lang\"\n (change)=\"onLanguage.emit(selectLang.value)\"\n >\n <option *ngFor=\"let lang of langs\" [value]=\"lang\">\n {{ translate.getNativeLanguage(lang) }}\n </option>\n </select>\n <span></span>\n </div>\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 title=\"{{ 'Set up two-factor authentication' | translate }}\"\n class=\"btn btn-default\"\n type=\"button\"\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-white sticky-bottom\">\n <button\n title=\"{{ 'Cancel' | translate }}\"\n class=\"btn btn-default\"\n type=\"button\"\n (click)=\"cancel()\"\n >\n {{ 'Cancel' | translate }}\n </button>\n <button\n title=\"{{ 'Save' | translate }}\"\n class=\"btn btn-primary\"\n type=\"submit\"\n [disabled]=\"!userForm.form.valid || userForm.form.pristine || loading\"\n >\n {{ 'Save' | translate }}\n </button>\n </div>\n</form>\n" }]
|
|
12125
|
+
}], ctorParameters: function () { return [{ type: AppStateService }, { type: TranslateService }, { type: i1$6.BsModalService }, { type: AlertService }, { type: i1$2.UserService }, { type: i1$2.TenantLoginOptionsService }, { type: i1$2.TenantService }]; }, propDecorators: { lang: [{
|
|
11841
12126
|
type: Input
|
|
11842
12127
|
}], loading: [{
|
|
11843
12128
|
type: Input
|
|
11844
12129
|
}], user: [{
|
|
11845
12130
|
type: Input
|
|
11846
|
-
}],
|
|
12131
|
+
}], showProductExperienceOptions: [{
|
|
11847
12132
|
type: Input
|
|
11848
12133
|
}], isUsageTrackingEnabled: [{
|
|
11849
12134
|
type: Input
|
|
11850
|
-
}],
|
|
12135
|
+
}], isUserEngagementPreferenceEnabled: [{
|
|
11851
12136
|
type: Input
|
|
11852
12137
|
}], onUser: [{
|
|
11853
12138
|
type: Output
|
|
11854
12139
|
}], onLanguage: [{
|
|
11855
12140
|
type: Output
|
|
11856
|
-
}],
|
|
12141
|
+
}], onUsageTrackingChange: [{
|
|
11857
12142
|
type: Output
|
|
11858
|
-
}],
|
|
12143
|
+
}], onUserEngagementPreferenceChange: [{
|
|
11859
12144
|
type: Output
|
|
11860
12145
|
}], onCancel: [{
|
|
11861
12146
|
type: Output
|
|
11862
12147
|
}] } });
|
|
11863
12148
|
|
|
11864
12149
|
class UserEditModalComponent {
|
|
11865
|
-
constructor(modal, user, ui, auth, client, alert, translate, userPreferences,
|
|
12150
|
+
constructor(modal, user, ui, auth, client, alert, translate, userPreferences, c8yModalService, gainsightService, cookieBannerService, loginService, passwordService, userEngagementsService) {
|
|
11866
12151
|
this.modal = modal;
|
|
11867
12152
|
this.user = user;
|
|
11868
12153
|
this.ui = ui;
|
|
@@ -11871,48 +12156,56 @@ class UserEditModalComponent {
|
|
|
11871
12156
|
this.alert = alert;
|
|
11872
12157
|
this.translate = translate;
|
|
11873
12158
|
this.userPreferences = userPreferences;
|
|
11874
|
-
this.modalService = modalService;
|
|
11875
12159
|
this.c8yModalService = c8yModalService;
|
|
11876
12160
|
this.gainsightService = gainsightService;
|
|
11877
12161
|
this.cookieBannerService = cookieBannerService;
|
|
11878
12162
|
this.loginService = loginService;
|
|
11879
12163
|
this.passwordService = passwordService;
|
|
12164
|
+
this.userEngagementsService = userEngagementsService;
|
|
11880
12165
|
this.loading = false;
|
|
11881
|
-
this.
|
|
12166
|
+
this.showProductExperienceOptions = false;
|
|
11882
12167
|
this.lang = this.ui.state.lang;
|
|
11883
|
-
this.modalService.onHide.pipe(take(1)).subscribe((reason) => {
|
|
11884
|
-
if (reason !== null && this.changedLang !== undefined) {
|
|
11885
|
-
this.translate.switchToLanguage(this.lang);
|
|
11886
|
-
}
|
|
11887
|
-
});
|
|
11888
12168
|
}
|
|
11889
12169
|
async ngOnInit() {
|
|
11890
12170
|
this.updateUserInAppState();
|
|
11891
|
-
|
|
11892
|
-
if (this.showProductUsageSetting) {
|
|
11893
|
-
if (this.cookieBannerService.isFunctionalCookieEnabled()) {
|
|
11894
|
-
this.currentUsageTrackingState =
|
|
11895
|
-
!(await this.gainsightService.isGainsightPreferenceDisabledInUserPreferences(this.gainsightService.USER_PREFERENCES_GAINSIGHT_KEY));
|
|
11896
|
-
this.currentGainsightBotState =
|
|
11897
|
-
!(await this.gainsightService.isGainsightPreferenceDisabledInUserPreferences(this.gainsightService.USER_PREFERENCES_GAINSIGHT_BOT_KEY));
|
|
11898
|
-
}
|
|
11899
|
-
}
|
|
12171
|
+
await this.setInitialProductExperienceOptions();
|
|
11900
12172
|
}
|
|
11901
|
-
|
|
12173
|
+
/**
|
|
12174
|
+
* Initializes product experience options for the user.
|
|
12175
|
+
*
|
|
12176
|
+
* This function performs the following operations:
|
|
12177
|
+
* - Determines if the user has the permission to edit product experience options.
|
|
12178
|
+
* - If the user has the permission and functional cookies are enabled:
|
|
12179
|
+
* - Checks whether personalized product experience tracking is active.
|
|
12180
|
+
* - Checks whether in-product information and communication is active.
|
|
12181
|
+
*/
|
|
12182
|
+
async setInitialProductExperienceOptions() {
|
|
12183
|
+
this.showProductExperienceOptions =
|
|
12184
|
+
await this.gainsightService.canEditProductExperienceSettings();
|
|
12185
|
+
if (this.showProductExperienceOptions && this.cookieBannerService.isFunctionalCookieEnabled()) {
|
|
12186
|
+
// Enable personalized product experience tracking option
|
|
12187
|
+
this.currentUsageTrackingState =
|
|
12188
|
+
!(await this.gainsightService.isGainsightPreferenceDisabledInUserPreferences(this.gainsightService.USER_PREFERENCES_GAINSIGHT_KEY));
|
|
12189
|
+
// Enable in-product information & communication option
|
|
12190
|
+
this.currentUserEngagementPreferenceInitialState =
|
|
12191
|
+
this.userEngagementsService.userEngagementsEnabled$.value;
|
|
12192
|
+
}
|
|
12193
|
+
}
|
|
12194
|
+
async onDismiss() {
|
|
11902
12195
|
if (this.changedLang !== undefined) {
|
|
11903
|
-
this.translate.switchToLanguage(this.lang);
|
|
12196
|
+
await this.translate.switchToLanguage(this.lang);
|
|
11904
12197
|
}
|
|
11905
12198
|
this.modal.hide();
|
|
11906
12199
|
}
|
|
11907
|
-
onLanguage(lang) {
|
|
12200
|
+
async onLanguage(lang) {
|
|
11908
12201
|
this.changedLang = lang;
|
|
11909
|
-
this.translate.switchToLanguage(this.changedLang);
|
|
12202
|
+
await this.translate.switchToLanguage(this.changedLang);
|
|
11910
12203
|
}
|
|
11911
|
-
|
|
11912
|
-
this.usageTrackingState =
|
|
12204
|
+
onUsageTrackingChange(isEnabled) {
|
|
12205
|
+
this.usageTrackingState = isEnabled;
|
|
11913
12206
|
}
|
|
11914
|
-
|
|
11915
|
-
this.
|
|
12207
|
+
onUserEngagementPreferenceChange(isEnabled) {
|
|
12208
|
+
this.userEngagementPreferenceNewState = isEnabled;
|
|
11916
12209
|
}
|
|
11917
12210
|
async updateAndClose(user) {
|
|
11918
12211
|
this.loading = true;
|
|
@@ -11934,16 +12227,7 @@ class UserEditModalComponent {
|
|
|
11934
12227
|
if (this.changedLang && this.changedLang !== this.lang) {
|
|
11935
12228
|
reloadRequired = await this.persistLanguage(this.changedLang);
|
|
11936
12229
|
}
|
|
11937
|
-
|
|
11938
|
-
await this.userPreferences.set(this.gainsightService.USER_PREFERENCES_GAINSIGHT_BOT_KEY, this.gainsightBotState);
|
|
11939
|
-
}
|
|
11940
|
-
if (this.currentUsageTrackingState !== this.usageTrackingState) {
|
|
11941
|
-
await this.userPreferences.set(this.gainsightService.USER_PREFERENCES_GAINSIGHT_KEY, this.usageTrackingState);
|
|
11942
|
-
this.gainsightService.setFunctionalCookie(this.usageTrackingState);
|
|
11943
|
-
this.usageTrackingState
|
|
11944
|
-
? await this.gainsightService.loadTag(this.client.tenant)
|
|
11945
|
-
: await this.gainsightTrackingAppReload();
|
|
11946
|
-
}
|
|
12230
|
+
await this.updateProductExperienceOptions();
|
|
11947
12231
|
if (user.customProperties.userOrigin !== 'OAUTH2') {
|
|
11948
12232
|
await this.user.updateCurrent(omit(user, 'password'));
|
|
11949
12233
|
await this.updateUserInAppState();
|
|
@@ -11995,6 +12279,34 @@ class UserEditModalComponent {
|
|
|
11995
12279
|
// do nothing
|
|
11996
12280
|
}
|
|
11997
12281
|
}
|
|
12282
|
+
async updateProductExperienceOptions() {
|
|
12283
|
+
this.updateUserEngagementsPreference();
|
|
12284
|
+
await this.updateTrackingOption();
|
|
12285
|
+
}
|
|
12286
|
+
/**
|
|
12287
|
+
* Updates the user engagement preference if it has changed from the initial state.
|
|
12288
|
+
* Calls the user engagements service to update the preference.
|
|
12289
|
+
*
|
|
12290
|
+
* The update only occurs if the current preference differs from the new state.
|
|
12291
|
+
*/
|
|
12292
|
+
updateUserEngagementsPreference() {
|
|
12293
|
+
if (this.currentUserEngagementPreferenceInitialState !== this.userEngagementPreferenceNewState) {
|
|
12294
|
+
this.userEngagementsService.updateUserEngagementPreference(this.userEngagementPreferenceNewState);
|
|
12295
|
+
}
|
|
12296
|
+
}
|
|
12297
|
+
/**
|
|
12298
|
+
* Asynchronously updates the tracking option for user preferences.
|
|
12299
|
+
* If the current usage tracking state differs from the new state,
|
|
12300
|
+
* it updates the Gainsight preferences and sets a functional cookie
|
|
12301
|
+
* before triggering a reload of the application.
|
|
12302
|
+
*/
|
|
12303
|
+
async updateTrackingOption() {
|
|
12304
|
+
if (this.currentUsageTrackingState !== this.usageTrackingState) {
|
|
12305
|
+
await this.userPreferences.set(this.gainsightService.USER_PREFERENCES_GAINSIGHT_KEY, this.usageTrackingState);
|
|
12306
|
+
this.gainsightService.setFunctionalCookie(this.usageTrackingState);
|
|
12307
|
+
await this.gainsightTrackingAppReload();
|
|
12308
|
+
}
|
|
12309
|
+
}
|
|
11998
12310
|
async updateUserInAppState() {
|
|
11999
12311
|
const currentUserResult = await this.user.current();
|
|
12000
12312
|
this.ui.currentUser.next(currentUserResult.data);
|
|
@@ -12008,12 +12320,12 @@ class UserEditModalComponent {
|
|
|
12008
12320
|
this.auth.updateCredentials(newCredentials);
|
|
12009
12321
|
}
|
|
12010
12322
|
}
|
|
12011
|
-
UserEditModalComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: UserEditModalComponent, deps: [{ token: i1$6.BsModalRef }, { token: i1$2.UserService }, { token: AppStateService }, { token: i1$2.BasicAuth }, { token: i1$2.FetchClient }, { token: AlertService }, { token: TranslateService }, { token: UserPreferencesService }, { token:
|
|
12012
|
-
UserEditModalComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.0.6", type: UserEditModalComponent, selector: "c8y-user-edit-modal", ngImport: i0, template: "<c8y-modal
|
|
12323
|
+
UserEditModalComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: UserEditModalComponent, deps: [{ token: i1$6.BsModalRef }, { token: i1$2.UserService }, { token: AppStateService }, { token: i1$2.BasicAuth }, { token: i1$2.FetchClient }, { token: AlertService }, { token: TranslateService }, { token: UserPreferencesService }, { token: ModalService }, { token: GainsightService }, { token: CookieBannerService }, { token: LoginService }, { token: PasswordService }, { token: UserEngagementsService }], target: i0.ɵɵFactoryTarget.Component });
|
|
12324
|
+
UserEditModalComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.0.6", type: UserEditModalComponent, selector: "c8y-user-edit-modal", ngImport: i0, template: "<c8y-modal\n [title]=\"'Edit user' | translate\"\n [customFooter]=\"true\"\n (onDismiss)=\"onDismiss()\"\n>\n <c8y-user-edit\n [lang]=\"lang\"\n [user]=\"ui.currentUser | async\"\n [loading]=\"loading\"\n [isUsageTrackingEnabled]=\"currentUsageTrackingState\"\n [isUserEngagementPreferenceEnabled]=\"currentUserEngagementPreferenceInitialState\"\n [showProductExperienceOptions]=\"showProductExperienceOptions\"\n (onUsageTrackingChange)=\"onUsageTrackingChange($event)\"\n (onUserEngagementPreferenceChange)=\"onUserEngagementPreferenceChange($event)\"\n (onUser)=\"updateAndClose($event)\"\n (onCancel)=\"onDismiss()\"\n (onLanguage)=\"onLanguage($event)\"\n ></c8y-user-edit>\n</c8y-modal>\n", dependencies: [{ kind: "component", type: ModalComponent, selector: "c8y-modal", inputs: ["disabled", "close", "dismiss", "title", "body", "customFooter", "headerClasses", "labels"], outputs: ["onDismiss", "onClose"] }, { kind: "component", type: UserEditComponent, selector: "c8y-user-edit", inputs: ["lang", "loading", "user", "showProductExperienceOptions", "isUsageTrackingEnabled", "isUserEngagementPreferenceEnabled"], outputs: ["onUser", "onLanguage", "onUsageTrackingChange", "onUserEngagementPreferenceChange", "onCancel"] }, { kind: "pipe", type: C8yTranslatePipe, name: "translate" }, { kind: "pipe", type: i2$1.AsyncPipe, name: "async" }] });
|
|
12013
12325
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: UserEditModalComponent, decorators: [{
|
|
12014
12326
|
type: Component,
|
|
12015
|
-
args: [{ selector: 'c8y-user-edit-modal', template: "<c8y-modal
|
|
12016
|
-
}], ctorParameters: function () { return [{ type: i1$6.BsModalRef }, { type: i1$2.UserService }, { type: AppStateService }, { type: i1$2.BasicAuth }, { type: i1$2.FetchClient }, { type: AlertService }, { type: TranslateService }, { type: UserPreferencesService }, { type:
|
|
12327
|
+
args: [{ selector: 'c8y-user-edit-modal', template: "<c8y-modal\n [title]=\"'Edit user' | translate\"\n [customFooter]=\"true\"\n (onDismiss)=\"onDismiss()\"\n>\n <c8y-user-edit\n [lang]=\"lang\"\n [user]=\"ui.currentUser | async\"\n [loading]=\"loading\"\n [isUsageTrackingEnabled]=\"currentUsageTrackingState\"\n [isUserEngagementPreferenceEnabled]=\"currentUserEngagementPreferenceInitialState\"\n [showProductExperienceOptions]=\"showProductExperienceOptions\"\n (onUsageTrackingChange)=\"onUsageTrackingChange($event)\"\n (onUserEngagementPreferenceChange)=\"onUserEngagementPreferenceChange($event)\"\n (onUser)=\"updateAndClose($event)\"\n (onCancel)=\"onDismiss()\"\n (onLanguage)=\"onLanguage($event)\"\n ></c8y-user-edit>\n</c8y-modal>\n" }]
|
|
12328
|
+
}], ctorParameters: function () { return [{ type: i1$6.BsModalRef }, { type: i1$2.UserService }, { type: AppStateService }, { type: i1$2.BasicAuth }, { type: i1$2.FetchClient }, { type: AlertService }, { type: TranslateService }, { type: UserPreferencesService }, { type: ModalService }, { type: GainsightService }, { type: CookieBannerService }, { type: LoginService }, { type: PasswordService }, { type: UserEngagementsService }]; } });
|
|
12017
12329
|
|
|
12018
12330
|
class ClipboardService {
|
|
12019
12331
|
constructor(alertService) {
|
|
@@ -12462,6 +12774,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.6", ngImpor
|
|
|
12462
12774
|
|
|
12463
12775
|
class RightDrawerComponent {
|
|
12464
12776
|
constructor() {
|
|
12777
|
+
this.PRODUCT_EXPERIENCE = PRODUCT_EXPERIENCE;
|
|
12465
12778
|
this.quickLinks = [];
|
|
12466
12779
|
this.helpAndSupport = [];
|
|
12467
12780
|
}
|
|
@@ -12477,10 +12790,10 @@ class RightDrawerComponent {
|
|
|
12477
12790
|
}
|
|
12478
12791
|
}
|
|
12479
12792
|
RightDrawerComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: RightDrawerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
12480
|
-
RightDrawerComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.0.6", type: RightDrawerComponent, selector: "c8y-right-drawer", inputs: { _quickLinks: ["quickLinks", "_quickLinks"], _helpAndSupport: ["helpAndSupport", "_helpAndSupport"], app: "app", drawerOpen: "drawerOpen" }, ngImport: i0, template: "<div class=\"c8y-right-drawer\">\n <div class=\"summary\">\n <h4 class=\"text-light\"
|
|
12793
|
+
RightDrawerComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.0.6", type: RightDrawerComponent, selector: "c8y-right-drawer", inputs: { _quickLinks: ["quickLinks", "_quickLinks"], _helpAndSupport: ["helpAndSupport", "_helpAndSupport"], app: "app", drawerOpen: "drawerOpen" }, ngImport: i0, template: "<div class=\"c8y-right-drawer\">\n <div class=\"summary\">\n <h4 class=\"text-light\">{{ 'Welcome to' | translate }} {{ app | humanizeAppName | async }}</h4>\n </div>\n\n <div *ngIf=\"quickLinks.length\">\n <div class=\"legend form-block\" translate>Quick links</div>\n <div class=\"quick-links-drawer\">\n <ng-container *ngFor=\"let quickLink of quickLinks\">\n <ng-container *ngIf=\"quickLink.component\">\n <ng-container\n *ngComponentOutlet=\"quickLink.component; injector: quickLink.injector\"\n ></ng-container>\n </ng-container>\n <a\n *ngIf=\"!quickLink.component\"\n class=\"quick-link\"\n [href]=\"quickLink.url || '#'\"\n (click)=\"quickLink.click && $event.preventDefault(); quickLink.click && quickLink.click()\"\n c8yProductExperience\n [actionName]=\"PRODUCT_EXPERIENCE.QUICK_LINKS.EVENTS.QUICK_LINK_RIGHT_DRAWER\"\n [actionData]=\"{\n component: PRODUCT_EXPERIENCE.QUICK_LINKS.COMPONENTS.RIGHT_DRAWER_COMPONENT,\n action: quickLink.label\n }\"\n >\n <h2 *ngIf=\"quickLink.icon\"><i class=\"{{ quickLink.icon }}\"></i></h2>\n <img\n *ngIf=\"quickLink.iconSrc\"\n [src]=\"quickLink.iconSrc\"\n style=\"max-width: 50px\"\n class=\"img-responsive center-block\"\n onerror=\"this.style.display = 'none'\"\n />\n {{ quickLink.label | translate }}\n </a>\n </ng-container>\n </div>\n </div>\n\n <div *ngIf=\"helpAndSupport.length\">\n <div class=\"legend form-block m-t-24\" translate>Help & support</div>\n <div class=\"help-support\" *ngFor=\"let link of helpAndSupport\">\n <ng-container *ngIf=\"link.component\">\n <ng-container *ngComponentOutlet=\"link.component; injector: link.injector\"></ng-container>\n </ng-container>\n <a\n *ngIf=\"!link.component\"\n class=\"help-and-support-link text-truncate\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n [href]=\"link.url\"\n c8yProductExperience\n [actionName]=\"PRODUCT_EXPERIENCE.QUICK_LINKS.EVENTS.QUICK_LINK_RIGHT_DRAWER\"\n [actionData]=\"{\n component: PRODUCT_EXPERIENCE.QUICK_LINKS.COMPONENTS.RIGHT_DRAWER_COMPONENT,\n action: link.label\n }\"\n >\n <i [c8yIcon]=\"link.icon\"></i>\n <span title=\"{{ link.label | translate }}\" class=\"d-inline\">\n {{ link.label | translate }}\n </span>\n </a>\n </div>\n </div>\n</div>\n", dependencies: [{ kind: "directive", type: IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "directive", type: C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "directive", type: i2$1.NgComponentOutlet, selector: "[ngComponentOutlet]", inputs: ["ngComponentOutlet", "ngComponentOutletInjector", "ngComponentOutletContent", "ngComponentOutletNgModule", "ngComponentOutletNgModuleFactory"] }, { kind: "directive", type: i2$1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: ProductExperienceDirective, selector: "[c8yProductExperience]", inputs: ["actionName", "actionData"] }, { kind: "pipe", type: C8yTranslatePipe, name: "translate" }, { kind: "pipe", type: i2$1.AsyncPipe, name: "async" }, { kind: "pipe", type: HumanizeAppNamePipe, name: "humanizeAppName" }] });
|
|
12481
12794
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: RightDrawerComponent, decorators: [{
|
|
12482
12795
|
type: Component,
|
|
12483
|
-
args: [{ selector: 'c8y-right-drawer', template: "<div class=\"c8y-right-drawer\">\n <div class=\"summary\">\n <h4 class=\"text-light\"
|
|
12796
|
+
args: [{ selector: 'c8y-right-drawer', template: "<div class=\"c8y-right-drawer\">\n <div class=\"summary\">\n <h4 class=\"text-light\">{{ 'Welcome to' | translate }} {{ app | humanizeAppName | async }}</h4>\n </div>\n\n <div *ngIf=\"quickLinks.length\">\n <div class=\"legend form-block\" translate>Quick links</div>\n <div class=\"quick-links-drawer\">\n <ng-container *ngFor=\"let quickLink of quickLinks\">\n <ng-container *ngIf=\"quickLink.component\">\n <ng-container\n *ngComponentOutlet=\"quickLink.component; injector: quickLink.injector\"\n ></ng-container>\n </ng-container>\n <a\n *ngIf=\"!quickLink.component\"\n class=\"quick-link\"\n [href]=\"quickLink.url || '#'\"\n (click)=\"quickLink.click && $event.preventDefault(); quickLink.click && quickLink.click()\"\n c8yProductExperience\n [actionName]=\"PRODUCT_EXPERIENCE.QUICK_LINKS.EVENTS.QUICK_LINK_RIGHT_DRAWER\"\n [actionData]=\"{\n component: PRODUCT_EXPERIENCE.QUICK_LINKS.COMPONENTS.RIGHT_DRAWER_COMPONENT,\n action: quickLink.label\n }\"\n >\n <h2 *ngIf=\"quickLink.icon\"><i class=\"{{ quickLink.icon }}\"></i></h2>\n <img\n *ngIf=\"quickLink.iconSrc\"\n [src]=\"quickLink.iconSrc\"\n style=\"max-width: 50px\"\n class=\"img-responsive center-block\"\n onerror=\"this.style.display = 'none'\"\n />\n {{ quickLink.label | translate }}\n </a>\n </ng-container>\n </div>\n </div>\n\n <div *ngIf=\"helpAndSupport.length\">\n <div class=\"legend form-block m-t-24\" translate>Help & support</div>\n <div class=\"help-support\" *ngFor=\"let link of helpAndSupport\">\n <ng-container *ngIf=\"link.component\">\n <ng-container *ngComponentOutlet=\"link.component; injector: link.injector\"></ng-container>\n </ng-container>\n <a\n *ngIf=\"!link.component\"\n class=\"help-and-support-link text-truncate\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n [href]=\"link.url\"\n c8yProductExperience\n [actionName]=\"PRODUCT_EXPERIENCE.QUICK_LINKS.EVENTS.QUICK_LINK_RIGHT_DRAWER\"\n [actionData]=\"{\n component: PRODUCT_EXPERIENCE.QUICK_LINKS.COMPONENTS.RIGHT_DRAWER_COMPONENT,\n action: link.label\n }\"\n >\n <i [c8yIcon]=\"link.icon\"></i>\n <span title=\"{{ link.label | translate }}\" class=\"d-inline\">\n {{ link.label | translate }}\n </span>\n </a>\n </div>\n </div>\n</div>\n" }]
|
|
12484
12797
|
}], propDecorators: { _quickLinks: [{
|
|
12485
12798
|
type: Input,
|
|
12486
12799
|
args: ['quickLinks']
|
|
@@ -15572,50 +15885,68 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.6", ngImpor
|
|
|
15572
15885
|
/**
|
|
15573
15886
|
* This module enables an tenant to activate the product experience
|
|
15574
15887
|
* software [Gainsight](https://www.gainsight.com/product-experience/) to help
|
|
15575
|
-
* and track user actions.
|
|
15576
|
-
* property `gainsightEnabled` is set to true.
|
|
15888
|
+
* and track user actions.
|
|
15577
15889
|
*/
|
|
15578
15890
|
class ProductExperienceModule {
|
|
15579
|
-
constructor(appState, gainsightService, cookieBannerService,
|
|
15891
|
+
constructor(appState, gainsightService, cookieBannerService,
|
|
15892
|
+
// Don't remove it, otherwise UserEngagementsService won't be initialized.
|
|
15893
|
+
userEngagementsService) {
|
|
15580
15894
|
this.appState = appState;
|
|
15581
15895
|
this.gainsightService = gainsightService;
|
|
15582
15896
|
this.cookieBannerService = cookieBannerService;
|
|
15583
|
-
this.
|
|
15897
|
+
this.userEngagementsService = userEngagementsService;
|
|
15898
|
+
/**
|
|
15899
|
+
* Check if the Gainsight tracking is disabled in the application apptions. If so, exit early without processing further.
|
|
15900
|
+
*/
|
|
15901
|
+
if (this.gainsightService.isTrackingDisabled()) {
|
|
15902
|
+
return;
|
|
15903
|
+
}
|
|
15904
|
+
this.toggleUserTrackingObservable();
|
|
15905
|
+
}
|
|
15906
|
+
/**
|
|
15907
|
+
* Observes several factors to determine the state of user tracking and manages the visibility of Gainsight engagements.
|
|
15908
|
+
* It watches for changes in the current tenant, the state of the cookie banner, and user's preferences for Gainsight engagements.
|
|
15909
|
+
*
|
|
15910
|
+
* 1. If the cookie banner is being displayed, it returns without making any changes.
|
|
15911
|
+
* 2. If Gainsight is disabled at the tenant level via custom properties, it returns without making any changes.
|
|
15912
|
+
* 3. If the conditions are met for loading the Gainsight tag, it loads the tag.
|
|
15913
|
+
*/
|
|
15914
|
+
toggleUserTrackingObservable() {
|
|
15584
15915
|
combineLatest([
|
|
15585
15916
|
this.appState.currentTenant.pipe(filter(Boolean)),
|
|
15586
|
-
this.cookieBannerService.isCookieBannerShowed
|
|
15587
|
-
|
|
15588
|
-
]).subscribe(async ([currentTenant, isCookieBannerShowed, showGainsightBot]) => {
|
|
15917
|
+
this.cookieBannerService.isCookieBannerShowed$
|
|
15918
|
+
]).subscribe(async ([currentTenant, isCookieBannerShowed]) => {
|
|
15589
15919
|
if (isCookieBannerShowed) {
|
|
15590
15920
|
return;
|
|
15591
15921
|
}
|
|
15592
15922
|
const { customProperties } = currentTenant;
|
|
15593
|
-
if (this.gainsightService.
|
|
15594
|
-
|
|
15595
|
-
this.gainsightService.loadTag(currentTenant);
|
|
15923
|
+
if (this.gainsightService.isGainsightDisabledAtTenantCustomProperties(customProperties)) {
|
|
15924
|
+
return;
|
|
15596
15925
|
}
|
|
15597
|
-
|
|
15598
|
-
|
|
15599
|
-
*/
|
|
15600
|
-
if (showGainsightBot === undefined) {
|
|
15601
|
-
showGainsightBot = true;
|
|
15602
|
-
userPreferencesService.set(this.gainsightService.USER_PREFERENCES_GAINSIGHT_BOT_KEY, showGainsightBot);
|
|
15926
|
+
if (this.shouldLoadTag()) {
|
|
15927
|
+
await this.gainsightService.loadTag(currentTenant, await this.gainsightService.shouldSendPiiData());
|
|
15603
15928
|
}
|
|
15604
|
-
this.gainsightService.switchKnowledgeHubBotVisibility(showGainsightBot);
|
|
15605
15929
|
});
|
|
15606
15930
|
}
|
|
15931
|
+
/**
|
|
15932
|
+
* Determines if a tracking tag should be loaded based on cookie preferences.
|
|
15933
|
+
* @returns `true` if user cookie preferences exist, otherwise `false`.
|
|
15934
|
+
*/
|
|
15935
|
+
shouldLoadTag() {
|
|
15936
|
+
return !!this.cookieBannerService.getUserCookiePreferences();
|
|
15937
|
+
}
|
|
15607
15938
|
}
|
|
15608
|
-
ProductExperienceModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: ProductExperienceModule, deps: [{ token: AppStateService }, { token: GainsightService }, { token: CookieBannerService }, { token:
|
|
15939
|
+
ProductExperienceModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: ProductExperienceModule, deps: [{ token: AppStateService }, { token: GainsightService }, { token: CookieBannerService }, { token: UserEngagementsService }], target: i0.ɵɵFactoryTarget.NgModule });
|
|
15609
15940
|
ProductExperienceModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "14.0.6", ngImport: i0, type: ProductExperienceModule, declarations: [ProductExperienceDirective], exports: [ProductExperienceDirective] });
|
|
15610
|
-
ProductExperienceModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: ProductExperienceModule, providers: [GainsightService] });
|
|
15941
|
+
ProductExperienceModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: ProductExperienceModule, providers: [GainsightService, UserEngagementsService] });
|
|
15611
15942
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: ProductExperienceModule, decorators: [{
|
|
15612
15943
|
type: NgModule,
|
|
15613
15944
|
args: [{
|
|
15614
15945
|
declarations: [ProductExperienceDirective],
|
|
15615
15946
|
exports: [ProductExperienceDirective],
|
|
15616
|
-
providers: [GainsightService]
|
|
15947
|
+
providers: [GainsightService, UserEngagementsService]
|
|
15617
15948
|
}]
|
|
15618
|
-
}], ctorParameters: function () { return [{ type: AppStateService }, { type: GainsightService }, { type: CookieBannerService }, { type:
|
|
15949
|
+
}], ctorParameters: function () { return [{ type: AppStateService }, { type: GainsightService }, { type: CookieBannerService }, { type: UserEngagementsService }]; } });
|
|
15619
15950
|
|
|
15620
15951
|
class SearchComponent {
|
|
15621
15952
|
constructor(searchService) {
|
|
@@ -20333,7 +20664,7 @@ function c8yValidationConfigFactory(translate) {
|
|
|
20333
20664
|
}
|
|
20334
20665
|
},
|
|
20335
20666
|
{
|
|
20336
|
-
name: '
|
|
20667
|
+
name: 'minLength',
|
|
20337
20668
|
message(_error, field) {
|
|
20338
20669
|
return translate.stream(ValidationPattern.messages.minLength, field.templateOptions);
|
|
20339
20670
|
}
|
|
@@ -25961,5 +26292,5 @@ class RealtimeMessage {
|
|
|
25961
26292
|
* Generated bundle index. Do not edit.
|
|
25962
26293
|
*/
|
|
25963
26294
|
|
|
25964
|
-
export { ACTIONS, ActionBarComponent, ActionBarItemComponent, ActionBarModule, ActionBarService, ActionComponent, ActionModule, ActionOutletComponent, ActionService, AlarmRealtimeService, AlertComponent, AlertDetailsComponent, AlertModule, AlertOutletComponent, AlertService, AlertTextComponent, AppIconComponent, AppStateService, AppSwitcherComponent, ApplicationOptions, AssetTypesModule, AssetTypesService, AuditLogComponent, AuditLogModule, AuthenticationModule, BaseColumn, BaseFilteringFormRendererComponent, BootstrapComponent, BootstrapModule, BreadcrumbComponent, BreadcrumbItemComponent, BreadcrumbModule, BreadcrumbOutletComponent, BreadcrumbService, BytesPipe, C8yJSONSchema, C8yStepper, C8yStepperButtons, C8yStepperIcon, C8yStepperProgress, C8yTranslateDirective, C8yTranslateModule, C8yTranslatePipe, C8yValidators, CachedLocaleDictionaryService, CellRendererComponent, CellRendererContext, CellRendererDefDirective, ChangePasswordComponent, ClipboardModule, ClipboardService, ColorService, ColumnDirective, CommonModule, ConditionalTabsOutletComponent, ConfigureCustomColumnComponent, ConfirmModalComponent, ContextRouteComponent, ContextRouteGuard, ContextRouteService, CookieBannerComponent, CoreModule, CredentialsComponent, CurrentPasswordModalComponent, CustomColumn, DATA_GRID_CONFIGURATION_CONTEXT, DATA_GRID_CONFIGURATION_CONTEXT_PROVIDER, DATA_GRID_CONFIGURATION_STRATEGY, DashboardChildActionComponent, DashboardChildChange, DashboardChildComponent, DashboardChildTitleComponent, DashboardComponent, DashboardModule, DataGridComponent, DataGridModule, DataGridService, DatapointLibraryValidationErrors, DatePickerComponent, DatePickerModule, DatePipe, DateTimePickerComponent, DateTimePickerModule, DefaultValidationDirective, DeviceBootstrapRealtimeService, DeviceService, DeviceStatusComponent, DeviceStatusModule, DismissAlertStrategy, DocsModule, DocsService, DropAreaComponent, DropAreaModule, DropdownDirectionDirective, DynamicBulkDetailsResolver, DynamicBulkIIdentifiedResolver, DynamicComponentAlert, DynamicComponentAlertAggregator, DynamicComponentComponent, DynamicComponentErrorStrategy, DynamicComponentModule, DynamicComponentService, DynamicDatapointsResolver, DynamicFormsModule, DynamicManagedObjectResolver, DynamicResolverService, ES_MAX_TIME_MILLISECONDS, EmailsValidatorDirective, EmptyComponent, EmptyStateComponent, EventRealtimeService, FilePickerComponent, FilePickerModule, FilesService, FilterInputComponent, FilteringActionType, FilteringFormRendererComponent, FilteringFormRendererContext, FilteringFormRendererDefDirective, ForOfDirective, FormGroupComponent, FormsModule, GENERIC_FILE_TYPE, GainsightService, GetGroupIconPipe, GridDataSource, GroupFragment, GroupService, 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_WIZARD, HeaderBarComponent, HeaderCellRendererDefDirective, HeaderModule, HeaderService, HelpComponent, HelpModule, HighlightComponent, HumanizeAppNamePipe, HumanizePipe, I18nModule$1 as I18nModule, ICONS, ICON_LIST, IconDirective, IfAllowedDirective, InjectionType, InputGroupListComponent, InputGroupListContainerDirective, InventorySearchService, IpRangeInputListComponent, IsControlVisiblePipe, JsonValidationPrettifierDirective, LANGUAGES, LOCALE_PATH, LegacyGridConfigMapperService, ListDisplaySwitchComponent, ListDisplaySwitchModule, ListGroupComponent, ListGroupModule, ListItemActionComponent, ListItemBodyComponent, ListItemCheckboxComponent, ListItemCollapseComponent, ListItemComponent, ListItemDragHandleComponent, ListItemFooterComponent, ListItemIconComponent, ListItemRadioComponent, ListItemTimelineComponent, LoadMoreComponent, LoadingComponent, LoginComponent, LoginModule, LoginService, LoginViews, MAX_PAGE_SIZE, MESSAGES, ManagedObjectRealtimeService, ManagedObjectType, MapFunctionPipe, MaxValidationDirective, MeasurementRealtimeService, MessageDirective, MessagesComponent, MinValidationDirective, MissingTranslationCustomHandler, ModalComponent, ModalModule, ModalSelectionMode, ModalService, NEEDED_ROLE_FOR_SETUP, NUMBER_FORMAT_REGEXP, NavigatorIconComponent, NavigatorModule, NavigatorNode, NavigatorNodeComponent, NavigatorNodeRoot, NavigatorOutletComponent, NavigatorService, NewPasswordComponent, NumberPipe, OperationBulkRealtimeService, OperationRealtimeService, OperationResultComponent, OptionsService, OutletDirective, PRODUCT_EXPERIENCE_EVENT_SOURCE, PasswordCheckListComponent, PasswordConfirm, PasswordConfirmModalComponent, PasswordService, PasswordStrengthCheckerService, PasswordStrengthComponent, PasswordStrengthValidatorDirective, PatternMessagesService, Permissions, PhoneValidationDirective, PluginsModule, PluginsResolveService, PluginsService, PopoverConfirmComponent, ProductExperienceDirective, ProductExperienceModule, ProgressBarComponent, PropertiesListComponent, PropertiesListModule, ProvidePhoneNumberComponent, ProviderConfigurationComponent, ProviderConfigurationModule, ProviderConfigurationNodeFactory, ProviderConfigurationRouteFactory, ProviderConfigurationService, ProviderDefinitionsService, PushStatus, PushStatusLabels, QuickLinkComponent, QuickLinkModule, RESOLVING_COMPONENT_WAIT_TIME, RangeComponent, RangeDirective, RangeDisplayComponent, RangeDisplayModule, RealtimeButtonComponent, RealtimeMessage, RealtimeModule, RealtimeService, RealtimeSubjectService, RecoverPasswordComponent, RequiredInputPlaceholderDirective, RightDrawerComponent, RouterModule, RouterService, RouterTabsResolver, SETUP_FINISHED_STEP_ID, SearchComponent, SearchFilters, SearchInputComponent, SearchModule, SearchOutletComponent, SearchResultEmptyComponent, SearchService, SelectComponent, SelectModalComponent, SelectModalFilterPipe, SelectModalModule, SelectModule, SendStatus, SendStatusLabels, SetupCompletedComponent, SetupComponent, SetupModule, SetupService, SetupState, SetupStepperFactory, ShortenUserNamePipe, ShouldShowMoPipe, ShowIfFilterPipe, SimpleJsonPathValidatorDirective, SmsChallengeComponent, StateService, Status, StepperModule, StepperOutletComponent, StepperService, Steppers, StrengthValidatorService, StringifyObjectPipe, TabComponent, TabsModule, TabsOutletComponent, TabsService, TenantUiService, TextAreaRowHeightDirective, TextareaAutoresizeDirective, TitleComponent, TitleOutletComponent, TotpAuthComponent, TotpChallengeComponent, TotpSetupComponent, TranslateCustomLoader, TranslateParserCustom, TranslateService, TypeaheadComponent, UniqueInCollectionByPathValidationDirective, UserEditComponent, UserEditModalComponent, UserMenuItemComponent, UserMenuOutletComponent, UserMenuService, UserModule, UserPreferencesConfigurationStrategy, UserPreferencesService, UserPreferencesStorageInventory, UserPreferencesStorageLocal, UserTotpRevokeComponent, UserTotpSetupComponent, ValidationPattern, ViewContext, ViewContextServices, VirtualScrollWindowDirective, VirtualScrollWindowStrategy, VirtualScrollerWrapperComponent, WidgetTimeContextComponent, WidgetsDashboardComponent, WizardBodyComponent, WizardComponent, WizardFooterComponent, WizardHeaderComponent, WizardModalService, WizardModule, WizardOutletComponent, WizardService, ZipService, _, _virtualScrollWindowStrategyFactory, allEntriesAreEqual, deviceAvailabilityIconMap, extraRoutes, fromFactories, fromTrigger, fromTriggerOnce, getActivatedRoute, getAngularLocalesLanguageString, getBasicInputArrayFormFieldConfig, getInjectedHooks, gettext, initializeServices, isEagerDynamicComponents, isLazyDynamicComponents, isPromise, languagesFactory, loadLocale, localeId, localePathFactory, memoize, minColumnGridTrackSize, operationStatusClasses, operationStatusIcons, ratiosByColumnTypes, resolveInjectedFactories, retryWithDelay, simpleJsonPathValidator, sortByPriority, stateToFactory, statusAlert, statusClasses, statusIcons, throttle, toObservable, toObservableOfArrays, tooltips, translateLoaderFactory, trimTranslationKey, uniqueInCollectionByPathValidator };
|
|
26295
|
+
export { ACTIONS, ActionBarComponent, ActionBarItemComponent, ActionBarModule, ActionBarService, ActionComponent, ActionModule, ActionOutletComponent, ActionService, AlarmRealtimeService, AlertComponent, AlertDetailsComponent, AlertModule, AlertOutletComponent, AlertService, AlertTextComponent, AppIconComponent, AppStateService, AppSwitcherComponent, ApplicationOptions, AssetTypesModule, AssetTypesService, AuditLogComponent, AuditLogModule, AuthenticationModule, BaseColumn, BaseFilteringFormRendererComponent, BootstrapComponent, BootstrapModule, BreadcrumbComponent, BreadcrumbItemComponent, BreadcrumbModule, BreadcrumbOutletComponent, BreadcrumbService, BytesPipe, C8yJSONSchema, C8yStepper, C8yStepperButtons, C8yStepperIcon, C8yStepperProgress, C8yTranslateDirective, C8yTranslateModule, C8yTranslatePipe, C8yValidators, CachedLocaleDictionaryService, CellRendererComponent, CellRendererContext, CellRendererDefDirective, ChangePasswordComponent, ClipboardModule, ClipboardService, ColorService, ColumnDirective, CommonModule, ConditionalTabsOutletComponent, ConfigureCustomColumnComponent, ConfirmModalComponent, ContextRouteComponent, ContextRouteGuard, ContextRouteService, CookieBannerComponent, CoreModule, CredentialsComponent, CurrentPasswordModalComponent, CustomColumn, DATA_GRID_CONFIGURATION_CONTEXT, DATA_GRID_CONFIGURATION_CONTEXT_PROVIDER, DATA_GRID_CONFIGURATION_STRATEGY, DashboardChildActionComponent, DashboardChildChange, DashboardChildComponent, DashboardChildTitleComponent, DashboardComponent, DashboardModule, DataGridComponent, DataGridModule, DataGridService, DatapointLibraryValidationErrors, DatePickerComponent, DatePickerModule, DatePipe, DateTimePickerComponent, DateTimePickerModule, DefaultValidationDirective, DeviceBootstrapRealtimeService, DeviceService, DeviceStatusComponent, DeviceStatusModule, DismissAlertStrategy, DocsModule, DocsService, DropAreaComponent, DropAreaModule, DropdownDirectionDirective, DynamicBulkDetailsResolver, DynamicBulkIIdentifiedResolver, DynamicComponentAlert, DynamicComponentAlertAggregator, DynamicComponentComponent, DynamicComponentErrorStrategy, DynamicComponentModule, DynamicComponentService, DynamicDatapointsResolver, DynamicFormsModule, DynamicManagedObjectResolver, DynamicResolverService, ES_MAX_TIME_MILLISECONDS, EmailsValidatorDirective, EmptyComponent, EmptyStateComponent, EventRealtimeService, FilePickerComponent, FilePickerModule, FilesService, FilterInputComponent, FilteringActionType, FilteringFormRendererComponent, FilteringFormRendererContext, FilteringFormRendererDefDirective, ForOfDirective, FormGroupComponent, FormsModule, GENERIC_FILE_TYPE, GainsightService, GetGroupIconPipe, GridDataSource, GroupFragment, GroupService, 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_WIZARD, HeaderBarComponent, HeaderCellRendererDefDirective, HeaderModule, HeaderService, HelpComponent, HelpModule, HighlightComponent, HumanizeAppNamePipe, HumanizePipe, I18nModule$1 as I18nModule, ICONS, ICON_LIST, IconDirective, IfAllowedDirective, InjectionType, InputGroupListComponent, InputGroupListContainerDirective, InventorySearchService, IpRangeInputListComponent, IsControlVisiblePipe, JsonValidationPrettifierDirective, LANGUAGES, LOCALE_PATH, LegacyGridConfigMapperService, ListDisplaySwitchComponent, ListDisplaySwitchModule, ListGroupComponent, ListGroupModule, ListItemActionComponent, ListItemBodyComponent, ListItemCheckboxComponent, ListItemCollapseComponent, ListItemComponent, ListItemDragHandleComponent, ListItemFooterComponent, ListItemIconComponent, ListItemRadioComponent, ListItemTimelineComponent, LoadMoreComponent, LoadingComponent, LoginComponent, LoginModule, LoginService, LoginViews, MAX_PAGE_SIZE, MESSAGES, ManagedObjectRealtimeService, ManagedObjectType, MapFunctionPipe, MaxValidationDirective, MeasurementRealtimeService, MessageDirective, MessagesComponent, MinValidationDirective, MissingTranslationCustomHandler, ModalComponent, ModalModule, ModalSelectionMode, ModalService, NEEDED_ROLE_FOR_SETUP, NUMBER_FORMAT_REGEXP, NavigatorIconComponent, NavigatorModule, NavigatorNode, NavigatorNodeComponent, NavigatorNodeRoot, NavigatorOutletComponent, NavigatorService, NewPasswordComponent, NumberPipe, OperationBulkRealtimeService, OperationRealtimeService, OperationResultComponent, OptionsService, OutletDirective, PRODUCT_EXPERIENCE_EVENT_SOURCE, PasswordCheckListComponent, PasswordConfirm, PasswordConfirmModalComponent, PasswordService, PasswordStrengthCheckerService, PasswordStrengthComponent, PasswordStrengthValidatorDirective, PatternMessagesService, Permissions, PhoneValidationDirective, PluginsModule, PluginsResolveService, PluginsService, PopoverConfirmComponent, ProductExperienceDirective, ProductExperienceModule, ProgressBarComponent, PropertiesListComponent, PropertiesListModule, ProvidePhoneNumberComponent, ProviderConfigurationComponent, ProviderConfigurationModule, ProviderConfigurationNodeFactory, ProviderConfigurationRouteFactory, ProviderConfigurationService, ProviderDefinitionsService, PushStatus, PushStatusLabels, QuickLinkComponent, QuickLinkModule, RESOLVING_COMPONENT_WAIT_TIME, RangeComponent, RangeDirective, RangeDisplayComponent, RangeDisplayModule, RealtimeButtonComponent, RealtimeMessage, RealtimeModule, RealtimeService, RealtimeSubjectService, RecoverPasswordComponent, RequiredInputPlaceholderDirective, RightDrawerComponent, RouterModule, RouterService, RouterTabsResolver, SETUP_FINISHED_STEP_ID, SearchComponent, SearchFilters, SearchInputComponent, SearchModule, SearchOutletComponent, SearchResultEmptyComponent, SearchService, SelectComponent, SelectModalComponent, SelectModalFilterPipe, SelectModalModule, SelectModule, SendStatus, SendStatusLabels, SetupCompletedComponent, SetupComponent, SetupModule, SetupService, SetupState, SetupStepperFactory, ShortenUserNamePipe, ShouldShowMoPipe, ShowIfFilterPipe, SimpleJsonPathValidatorDirective, SmsChallengeComponent, StateService, Status, StepperModule, StepperOutletComponent, StepperService, Steppers, StrengthValidatorService, StringifyObjectPipe, TabComponent, TabsModule, TabsOutletComponent, TabsService, TenantUiService, TextAreaRowHeightDirective, TextareaAutoresizeDirective, TitleComponent, TitleOutletComponent, TotpAuthComponent, TotpChallengeComponent, TotpSetupComponent, TranslateCustomLoader, TranslateParserCustom, TranslateService, TypeaheadComponent, UniqueInCollectionByPathValidationDirective, UserEditComponent, UserEditModalComponent, UserEngagementsService, UserMenuItemComponent, UserMenuOutletComponent, UserMenuService, UserModule, UserPreferencesConfigurationStrategy, UserPreferencesService, UserPreferencesStorageInventory, UserPreferencesStorageLocal, UserTotpRevokeComponent, UserTotpSetupComponent, ValidationPattern, ViewContext, ViewContextServices, VirtualScrollWindowDirective, VirtualScrollWindowStrategy, VirtualScrollerWrapperComponent, WidgetTimeContextComponent, WidgetsDashboardComponent, WizardBodyComponent, WizardComponent, WizardFooterComponent, WizardHeaderComponent, WizardModalService, WizardModule, WizardOutletComponent, WizardService, ZipService, _, _virtualScrollWindowStrategyFactory, allEntriesAreEqual, deviceAvailabilityIconMap, extraRoutes, fromFactories, fromTrigger, fromTriggerOnce, getActivatedRoute, getAngularLocalesLanguageString, getBasicInputArrayFormFieldConfig, getInjectedHooks, gettext, initializeServices, isEagerDynamicComponents, isLazyDynamicComponents, isPromise, languagesFactory, loadLocale, localeId, localePathFactory, memoize, minColumnGridTrackSize, operationStatusClasses, operationStatusIcons, ratiosByColumnTypes, resolveInjectedFactories, retryWithDelay, simpleJsonPathValidator, sortByPriority, stateToFactory, statusAlert, statusClasses, statusIcons, throttle, toObservable, toObservableOfArrays, tooltips, translateLoaderFactory, trimTranslationKey, uniqueInCollectionByPathValidator };
|
|
25965
26296
|
//# sourceMappingURL=c8y-ngx-components.mjs.map
|