@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 { merge, of, defer, combineLatest, race, isObservable, from, Subject, Beh
|
|
|
4
4
|
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, finalize, withLatestFrom } from 'rxjs/operators';
|
|
5
5
|
import * as i1 from '@angular/router';
|
|
6
6
|
import { NavigationEnd, RouterModule as RouterModule$1, PRIMARY_OUTLET, ROUTES, RouterLinkActive, ROUTER_CONFIGURATION } from '@angular/router';
|
|
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, flow, isNil, chunk, transform, identity, 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, flow, isNil, chunk, transform, identity, 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';
|
|
@@ -6566,6 +6566,21 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.6", ngImpor
|
|
|
6566
6566
|
}]
|
|
6567
6567
|
}] });
|
|
6568
6568
|
|
|
6569
|
+
const PRODUCT_EXPERIENCE = {
|
|
6570
|
+
ACTION_BAR: {
|
|
6571
|
+
EVENTS: { ACTION_BAR_ITEM: 'actionBarItem' },
|
|
6572
|
+
COMPONENTS: { ACTION_BAR_COMPONENT: 'action-bar' },
|
|
6573
|
+
ACTIONS: {},
|
|
6574
|
+
RESULTS: {}
|
|
6575
|
+
},
|
|
6576
|
+
QUICK_LINKS: {
|
|
6577
|
+
EVENTS: { QUICK_LINK_RIGHT_DRAWER: 'quickLinkRightDrawer' },
|
|
6578
|
+
COMPONENTS: { RIGHT_DRAWER_COMPONENT: 'right-drawer' },
|
|
6579
|
+
ACTIONS: {},
|
|
6580
|
+
RESULTS: {}
|
|
6581
|
+
}
|
|
6582
|
+
};
|
|
6583
|
+
|
|
6569
6584
|
/**
|
|
6570
6585
|
* This service is handling the cookie banner and cookie preferences related logic.
|
|
6571
6586
|
*/
|
|
@@ -6637,7 +6652,7 @@ class CookieBannerService {
|
|
|
6637
6652
|
return JSON.parse(localStorage.getItem(this.STORAGE_KEY));
|
|
6638
6653
|
}
|
|
6639
6654
|
/**
|
|
6640
|
-
* Verifies that cookie preferences configuration is defined.
|
|
6655
|
+
* Verifies that cookie preferences configuration is defined in the application options.
|
|
6641
6656
|
* @returns {boolean} Returns if the cookie preferences configuration is defined.
|
|
6642
6657
|
*/
|
|
6643
6658
|
isConfigCookiePreferencesDefined() {
|
|
@@ -6704,8 +6719,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.6", ngImpor
|
|
|
6704
6719
|
* tag and
|
|
6705
6720
|
*/
|
|
6706
6721
|
class GainsightService {
|
|
6707
|
-
constructor(
|
|
6708
|
-
this.document = document;
|
|
6722
|
+
constructor(appState, options, cookieBannerService, userPreferencesService, translateService) {
|
|
6709
6723
|
this.appState = appState;
|
|
6710
6724
|
this.options = options;
|
|
6711
6725
|
this.cookieBannerService = cookieBannerService;
|
|
@@ -6715,8 +6729,16 @@ class GainsightService {
|
|
|
6715
6729
|
* A subject that emits the tag function as soon as a new tag is set.
|
|
6716
6730
|
*/
|
|
6717
6731
|
this.tagFunction$ = new BehaviorSubject(null);
|
|
6732
|
+
this.trackingLoaded$ = new Subject();
|
|
6733
|
+
/**
|
|
6734
|
+
* 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.
|
|
6735
|
+
* Otherwise, only the required data is transmitted during the identity step execution.
|
|
6736
|
+
*/
|
|
6718
6737
|
this.USER_PREFERENCES_GAINSIGHT_KEY = 'gainsightEnabled';
|
|
6719
|
-
|
|
6738
|
+
/**
|
|
6739
|
+
* The name of the key remained unchanged, but applies to all engagements.
|
|
6740
|
+
*/
|
|
6741
|
+
this.USER_PREFERENCES_GAINSIGHT_ENGAGEMENTS_KEY = 'gainsightBotEnabled';
|
|
6720
6742
|
this.HIDE_GAINSIGHT_BOT_STYLE_ID = 'hide-gs-bot';
|
|
6721
6743
|
this.GAINSIGHT_URL = 'web-sdk.aptrinsic.com/api/aptrinsic.js?a=';
|
|
6722
6744
|
this.GAINSIGHT_GLOBAL_SCOPE = 'aptrinsic';
|
|
@@ -6725,12 +6747,21 @@ class GainsightService {
|
|
|
6725
6747
|
this.OPTIONS_KEY_NAME = 'api.key';
|
|
6726
6748
|
this.isScriptLoaded = false;
|
|
6727
6749
|
}
|
|
6750
|
+
/**
|
|
6751
|
+
* Checks if the specified Gainsight preference is disabled in user preferences.
|
|
6752
|
+
* @param preferenceName - Name of the Gainsight preference.
|
|
6753
|
+
* @returns A promise that resolves to `true` if the preference is disabled, otherwise `false`.
|
|
6754
|
+
*/
|
|
6728
6755
|
isGainsightPreferenceDisabledInUserPreferences(preferenceName) {
|
|
6729
6756
|
return __awaiter(this, void 0, void 0, function* () {
|
|
6730
6757
|
const userGainsightPref = yield this.userPreferencesService.get(preferenceName).toPromise();
|
|
6731
6758
|
return userGainsightPref === false;
|
|
6732
6759
|
});
|
|
6733
6760
|
}
|
|
6761
|
+
/**
|
|
6762
|
+
* Sets the state of the functional cookie.
|
|
6763
|
+
* @param value - A boolean value to indicate whether the functional cookie should be enabled (`true`) or disabled (`false`).
|
|
6764
|
+
*/
|
|
6734
6765
|
setFunctionalCookie(value) {
|
|
6735
6766
|
const cookies = this.cookieBannerService.getUserCookiePreferences();
|
|
6736
6767
|
if (cookies) {
|
|
@@ -6761,56 +6792,110 @@ class GainsightService {
|
|
|
6761
6792
|
/**
|
|
6762
6793
|
* Load the script tag and calls the identify function to start the tracking.
|
|
6763
6794
|
* @param currentTenant The current tenant.
|
|
6764
|
-
* @param
|
|
6795
|
+
* @param sendPiiData Flag for sending personally identifiable information (PII) during identification in Gainsight.
|
|
6765
6796
|
*/
|
|
6766
|
-
loadTag(currentTenant,
|
|
6797
|
+
loadTag(currentTenant, sendPiiData) {
|
|
6767
6798
|
return __awaiter(this, void 0, void 0, function* () {
|
|
6768
6799
|
const scriptTag = document.createElement('script');
|
|
6769
6800
|
const key = yield this.getGainsightKey();
|
|
6770
6801
|
if (key && !this.isScriptLoaded) {
|
|
6771
6802
|
this.loadScriptTag(scriptTag, key);
|
|
6772
|
-
|
|
6803
|
+
const currentUserStream = this.appState.currentUser;
|
|
6804
|
+
const scriptLoadStream = fromEvent(scriptTag, 'load');
|
|
6805
|
+
const versionStream = this.appState.state$.pipe(filter(({ versions }) => versions.backend), map(({ versions }) => versions), take(1));
|
|
6806
|
+
const sourceStreams = sendPiiData
|
|
6807
|
+
? [currentUserStream, scriptLoadStream, versionStream]
|
|
6808
|
+
: [currentUserStream, scriptLoadStream];
|
|
6809
|
+
combineLatest(sourceStreams)
|
|
6773
6810
|
.pipe(delay(this.SCRIPT_EXECUTION_WAIT_TIME), filter(([user, scriptEvent]) => !!(scriptEvent && user)))
|
|
6774
|
-
.subscribe(
|
|
6811
|
+
.subscribe(args => {
|
|
6812
|
+
const [user, , versions] = args;
|
|
6813
|
+
this.setGlobalContext();
|
|
6775
6814
|
const instanceId = this.getInstanceIdFromUrl();
|
|
6776
|
-
if (
|
|
6777
|
-
|
|
6815
|
+
if (sendPiiData) {
|
|
6816
|
+
const versionUI = versions.ui.ngx;
|
|
6817
|
+
const versionBE = versions.backend;
|
|
6818
|
+
const extendedIdentifyData = {
|
|
6819
|
+
user,
|
|
6820
|
+
currentTenant,
|
|
6821
|
+
instanceId,
|
|
6822
|
+
versionUI,
|
|
6823
|
+
versionBE
|
|
6824
|
+
};
|
|
6825
|
+
this.identify(sendPiiData, extendedIdentifyData);
|
|
6826
|
+
}
|
|
6827
|
+
else {
|
|
6828
|
+
const requiredIdentifyData = { user, currentTenant, instanceId };
|
|
6829
|
+
this.identify(sendPiiData, requiredIdentifyData);
|
|
6778
6830
|
}
|
|
6779
6831
|
this.isScriptLoaded = true;
|
|
6780
6832
|
this.tagFunction$.next(this.tagFunction);
|
|
6833
|
+
this.trackingLoaded$.next(true);
|
|
6781
6834
|
});
|
|
6782
6835
|
}
|
|
6783
6836
|
});
|
|
6784
6837
|
}
|
|
6785
6838
|
/**
|
|
6786
6839
|
* Identifies the user/account at Gainsight.
|
|
6787
|
-
* @param
|
|
6788
|
-
* @param
|
|
6789
|
-
* @param versionUI The UI version used.
|
|
6790
|
-
* @param versionBE The BE version used.
|
|
6840
|
+
* @param sendPiiData Flag for sending personally identifiable information.
|
|
6841
|
+
* @param identifyData Object containing identification data.
|
|
6791
6842
|
*/
|
|
6792
|
-
identify(
|
|
6843
|
+
identify(sendPiiData, identifyData) {
|
|
6793
6844
|
const windowRef = window;
|
|
6794
|
-
const { id: userId, email,
|
|
6795
|
-
const { name, customProperties, domainName } =
|
|
6796
|
-
const {
|
|
6797
|
-
|
|
6798
|
-
|
|
6799
|
-
|
|
6800
|
-
|
|
6801
|
-
|
|
6802
|
-
|
|
6845
|
+
const { id: userId, email, roles } = identifyData.user;
|
|
6846
|
+
const { name: tenantID, customProperties, domainName } = identifyData.currentTenant;
|
|
6847
|
+
const { instanceId, versionUI, versionBE } = identifyData;
|
|
6848
|
+
/**
|
|
6849
|
+
* Passing ID is a minimum required data to make an identify call to Gainsight.
|
|
6850
|
+
* isUserCreatedAfterAnonymizationWasActivated parameter is passed to later distinguish between users created before and after data anonymization done by Gainsight.
|
|
6851
|
+
* tenantID Used to distinguish between tenants when same email is used for different tenants.
|
|
6852
|
+
*
|
|
6853
|
+
* Due to GS limitations (GS does not allow clearing user attr/preferences via the GS tag!),
|
|
6854
|
+
* we always need to initialize fields related to PII to prevent leaking this data to GS when the user has disabled functional cookies.
|
|
6855
|
+
*/
|
|
6856
|
+
const requiredIdentify = {
|
|
6857
|
+
/**
|
|
6858
|
+
* Email was not mandatory form field until 10.14
|
|
6859
|
+
*/
|
|
6860
|
+
id: email ? email : `${userId}_${tenantID}_${instanceId}`,
|
|
6861
|
+
isUserCreatedAfterAnonymizationWasActivated: true,
|
|
6862
|
+
tenantID: tenantID,
|
|
6863
|
+
email: '--',
|
|
6864
|
+
userName: '--',
|
|
6865
|
+
firstName: '--',
|
|
6866
|
+
lastName: '--',
|
|
6803
6867
|
domainName,
|
|
6804
6868
|
versionUI,
|
|
6805
6869
|
versionBE,
|
|
6806
6870
|
userLanguage: this.translateService.currentLang,
|
|
6871
|
+
browserLanguage: this.translateService.getBrowserLang(),
|
|
6807
6872
|
instanceId,
|
|
6808
|
-
externalReference
|
|
6809
|
-
|
|
6810
|
-
|
|
6811
|
-
|
|
6812
|
-
}
|
|
6873
|
+
externalReference: customProperties === null || customProperties === void 0 ? void 0 : customProperties.externalReference,
|
|
6874
|
+
userRoles: this.transformUserRolesToStr(roles === null || roles === void 0 ? void 0 : roles.references),
|
|
6875
|
+
customBranding: this.isCustomBranding(),
|
|
6876
|
+
fullTracking: sendPiiData
|
|
6877
|
+
};
|
|
6878
|
+
if (sendPiiData) {
|
|
6879
|
+
const { userName, firstName, lastName } = identifyData.user;
|
|
6880
|
+
const extendedIdentify = Object.assign(Object.assign({}, requiredIdentify), { email,
|
|
6881
|
+
userName,
|
|
6882
|
+
firstName,
|
|
6883
|
+
lastName });
|
|
6884
|
+
windowRef[this.GAINSIGHT_GLOBAL_SCOPE]('identify', extendedIdentify, {
|
|
6885
|
+
id: `${tenantID}_${instanceId}`,
|
|
6886
|
+
instanceId
|
|
6887
|
+
});
|
|
6888
|
+
return;
|
|
6889
|
+
}
|
|
6890
|
+
windowRef[this.GAINSIGHT_GLOBAL_SCOPE]('identify', requiredIdentify);
|
|
6813
6891
|
}
|
|
6892
|
+
/**
|
|
6893
|
+
* Triggers an event to be recorded by Gainsight PX.
|
|
6894
|
+
* This method calls the Gainsight PX's tracking mechanism to log a specific event
|
|
6895
|
+
* along with its associated properties.
|
|
6896
|
+
* @param eventName - Name of the event to be triggered.
|
|
6897
|
+
* @param props - Optional properties associated with the event.
|
|
6898
|
+
*/
|
|
6814
6899
|
triggerEvent(eventName, props) {
|
|
6815
6900
|
if (this.tagFunction && eventName) {
|
|
6816
6901
|
eventName = this.prepareEventName(eventName);
|
|
@@ -6832,47 +6917,93 @@ class GainsightService {
|
|
|
6832
6917
|
return this.getEnTranslation(textToTranslate, this.cachedRevertedTranslations);
|
|
6833
6918
|
}
|
|
6834
6919
|
/**
|
|
6835
|
-
*
|
|
6836
|
-
* The decision to
|
|
6837
|
-
*
|
|
6920
|
+
* Determines whether personally identifiable information (PII) should be sent while loading a tag.
|
|
6921
|
+
* The decision to activate Gainsight and send PII relies on whether the cookiePreferences option is defined in the application settings,
|
|
6922
|
+
* if the functional cookie is enabled, and if the user grants permission.
|
|
6838
6923
|
*/
|
|
6839
|
-
|
|
6840
|
-
return (this
|
|
6841
|
-
this.cookieBannerService.
|
|
6842
|
-
|
|
6843
|
-
|
|
6924
|
+
shouldSendPiiData() {
|
|
6925
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
6926
|
+
return (this.cookieBannerService.isConfigCookiePreferencesDefined() &&
|
|
6927
|
+
this.cookieBannerService.isFunctionalCookieEnabled() &&
|
|
6928
|
+
!(yield this.isGainsightPreferenceDisabledInUserPreferences(this.USER_PREFERENCES_GAINSIGHT_KEY)));
|
|
6929
|
+
});
|
|
6844
6930
|
}
|
|
6931
|
+
/**
|
|
6932
|
+
* Updates a specific user attribute in the Gainsight global scope.
|
|
6933
|
+
* This method interfaces with the Gainsight global object to set a user's specific attribute with a provided value.
|
|
6934
|
+
* @param name - Name of the user attribute to be updated.
|
|
6935
|
+
* @param value - Value to set for the specified user attribute.
|
|
6936
|
+
*/
|
|
6937
|
+
updateUserAttribute(name, value) {
|
|
6938
|
+
var _a;
|
|
6939
|
+
(_a = window[this.GAINSIGHT_GLOBAL_SCOPE]) === null || _a === void 0 ? void 0 : _a.call(window, 'set', 'user', { [name]: value });
|
|
6940
|
+
}
|
|
6941
|
+
/**
|
|
6942
|
+
* Determines if the current user has the capability to modify Gainsight PX settings.
|
|
6943
|
+
*
|
|
6944
|
+
* This method checks multiple conditions:
|
|
6945
|
+
* 1. Whether tracking has been disabled globally via application options.
|
|
6946
|
+
* 2. Whether Gainsight is disabled at the tenant level through custom properties.
|
|
6947
|
+
* 3. Whether a Gainsight key is available, either currently loaded or fetched asynchronously.
|
|
6948
|
+
* 4. Whether cookie preferences are defined and available for the user.
|
|
6949
|
+
*
|
|
6950
|
+
* @returns Promise that resolves to a boolean. True indicates the user can edit product experience settings, and false otherwise.
|
|
6951
|
+
*/
|
|
6845
6952
|
canEditProductExperienceSettings() {
|
|
6846
6953
|
return __awaiter(this, void 0, void 0, function* () {
|
|
6847
6954
|
const currentTenant = this.appState.currentTenant.value;
|
|
6848
6955
|
const { customProperties } = currentTenant;
|
|
6956
|
+
if (this.isTrackingDisabled() ||
|
|
6957
|
+
this.isGainsightDisabledAtTenantCustomProperties(customProperties)) {
|
|
6958
|
+
return false;
|
|
6959
|
+
}
|
|
6849
6960
|
const gainsightKey = !!this.gainsightKey || !!(yield this.getGainsightKey());
|
|
6850
6961
|
return (gainsightKey &&
|
|
6851
6962
|
this.cookieBannerService.isConfigCookiePreferencesDefined() &&
|
|
6852
|
-
|
|
6853
|
-
!!this.cookieBannerService.getUserCookiePreferences() &&
|
|
6854
|
-
!this.isCustomBranding());
|
|
6963
|
+
!!this.cookieBannerService.getUserCookiePreferences());
|
|
6855
6964
|
});
|
|
6856
6965
|
}
|
|
6857
|
-
|
|
6858
|
-
|
|
6859
|
-
|
|
6860
|
-
|
|
6861
|
-
|
|
6862
|
-
|
|
6966
|
+
/**
|
|
6967
|
+
* Sets the global context for Gainsight with the current application name.
|
|
6968
|
+
* The global context can be utilized by Gainsight for various purposes, such as segmenting users.
|
|
6969
|
+
*/
|
|
6970
|
+
setGlobalContext() {
|
|
6971
|
+
var _a;
|
|
6972
|
+
const currentAppState = this.appState.state$.value;
|
|
6973
|
+
const currentAppName = currentAppState.app.name;
|
|
6974
|
+
(_a = window[this.GAINSIGHT_GLOBAL_SCOPE]) === null || _a === void 0 ? void 0 : _a.call(window, 'set', 'globalContext', { projectName: currentAppName });
|
|
6863
6975
|
}
|
|
6864
|
-
|
|
6865
|
-
if (
|
|
6866
|
-
return;
|
|
6976
|
+
transformUserRolesToStr(userRoles) {
|
|
6977
|
+
if (!userRoles) {
|
|
6978
|
+
return '';
|
|
6867
6979
|
}
|
|
6868
|
-
|
|
6869
|
-
style.id = styleId;
|
|
6870
|
-
style.textContent = '#apt-widget { display:none }';
|
|
6871
|
-
this.document.head.appendChild(style);
|
|
6980
|
+
return flatMap(userRoles, (userRole) => userRole.role.name).join();
|
|
6872
6981
|
}
|
|
6873
|
-
|
|
6874
|
-
|
|
6875
|
-
|
|
6982
|
+
/**
|
|
6983
|
+
* Checks if Gainsight is disabled based on tenant custom properties.
|
|
6984
|
+
*
|
|
6985
|
+
* @param customProperties - The custom properties of the tenant.
|
|
6986
|
+
* @returns {boolean} - True if Gainsight is disabled, false otherwise.
|
|
6987
|
+
*/
|
|
6988
|
+
isGainsightDisabledAtTenantCustomProperties(customProperties) {
|
|
6989
|
+
const gainsightEnabled = customProperties && customProperties.gainsightEnabled;
|
|
6990
|
+
return gainsightEnabled === false;
|
|
6991
|
+
}
|
|
6992
|
+
/**
|
|
6993
|
+
* Determines if custom branding is enabled based on the presence of a brand logo.
|
|
6994
|
+
*
|
|
6995
|
+
* @returns {boolean} - True if custom branding is applied, false otherwise.
|
|
6996
|
+
*/
|
|
6997
|
+
isCustomBranding() {
|
|
6998
|
+
const brandingCssVars = this.options.get('brandingCssVars') || {};
|
|
6999
|
+
return !!brandingCssVars['brand-logo-img'];
|
|
7000
|
+
}
|
|
7001
|
+
/**
|
|
7002
|
+
* Determines if tracking is disabled based on the application options.
|
|
7003
|
+
* @returns `true` if tracking is disabled, otherwise `false`.
|
|
7004
|
+
*/
|
|
7005
|
+
isTrackingDisabled() {
|
|
7006
|
+
return this.options.disableTracking === true;
|
|
6876
7007
|
}
|
|
6877
7008
|
prepareEventName(baseEventName) {
|
|
6878
7009
|
return baseEventName
|
|
@@ -6883,14 +7014,6 @@ class GainsightService {
|
|
|
6883
7014
|
return eventNamePart.replace(/`[\w\W]*`/g, '');
|
|
6884
7015
|
}
|
|
6885
7016
|
}
|
|
6886
|
-
isGainsightDisabled(customProperties) {
|
|
6887
|
-
const gainsightEnabled = customProperties && customProperties.gainsightEnabled;
|
|
6888
|
-
return gainsightEnabled === false;
|
|
6889
|
-
}
|
|
6890
|
-
isCustomBranding() {
|
|
6891
|
-
const brandingCssVars = this.options.get('brandingCssVars') || {};
|
|
6892
|
-
return !!brandingCssVars['brand-logo-img'];
|
|
6893
|
-
}
|
|
6894
7017
|
loadScriptTag(scriptTag, key) {
|
|
6895
7018
|
try {
|
|
6896
7019
|
const windowRef = window;
|
|
@@ -6953,19 +7076,14 @@ class GainsightService {
|
|
|
6953
7076
|
return enTranslation;
|
|
6954
7077
|
}
|
|
6955
7078
|
}
|
|
6956
|
-
GainsightService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: GainsightService, deps: [{ token:
|
|
7079
|
+
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 });
|
|
6957
7080
|
GainsightService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: GainsightService, providedIn: 'root' });
|
|
6958
7081
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: GainsightService, decorators: [{
|
|
6959
7082
|
type: Injectable,
|
|
6960
7083
|
args: [{
|
|
6961
7084
|
providedIn: 'root'
|
|
6962
7085
|
}]
|
|
6963
|
-
}], ctorParameters: function () {
|
|
6964
|
-
return [{ type: DOCUMENT, decorators: [{
|
|
6965
|
-
type: Inject,
|
|
6966
|
-
args: [DOCUMENT]
|
|
6967
|
-
}] }, { type: AppStateService }, { type: OptionsService }, { type: CookieBannerService }, { type: UserPreferencesService }, { type: i1$3.TranslateService }];
|
|
6968
|
-
} });
|
|
7086
|
+
}], ctorParameters: function () { return [{ type: AppStateService }, { type: OptionsService }, { type: CookieBannerService }, { type: UserPreferencesService }, { type: i1$3.TranslateService }]; } });
|
|
6969
7087
|
|
|
6970
7088
|
/**
|
|
6971
7089
|
* This component is used as the outlet to show the action bars.
|
|
@@ -7028,15 +7146,17 @@ class ActionBarComponent {
|
|
|
7028
7146
|
return;
|
|
7029
7147
|
}
|
|
7030
7148
|
const element = event.closest('[px-event]') || event.closest('[title]') || event.closest('[uib-tooltip]');
|
|
7031
|
-
if (!element) {
|
|
7149
|
+
if (!element || element.getAttribute('disabled')) {
|
|
7032
7150
|
return;
|
|
7033
7151
|
}
|
|
7034
|
-
const
|
|
7152
|
+
const itemName = element.getAttribute('px-event') ||
|
|
7035
7153
|
element.getAttribute('title') ||
|
|
7036
7154
|
element.getAttribute('uib-tooltip');
|
|
7037
|
-
const
|
|
7038
|
-
this.gainsightService.triggerEvent(
|
|
7039
|
-
|
|
7155
|
+
const translatedItemName = this.gainsightService.translateToEnglish(itemName);
|
|
7156
|
+
this.gainsightService.triggerEvent(PRODUCT_EXPERIENCE.ACTION_BAR.EVENTS.ACTION_BAR_ITEM, {
|
|
7157
|
+
component: PRODUCT_EXPERIENCE.ACTION_BAR.COMPONENTS.ACTION_BAR_COMPONENT,
|
|
7158
|
+
action: translatedItemName,
|
|
7159
|
+
url: location.href
|
|
7040
7160
|
});
|
|
7041
7161
|
}
|
|
7042
7162
|
ngOnInit() {
|
|
@@ -11403,6 +11523,173 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.6", ngImpor
|
|
|
11403
11523
|
type: Injectable
|
|
11404
11524
|
}], ctorParameters: function () { return [{ type: i1$6.BsModalService }]; } });
|
|
11405
11525
|
|
|
11526
|
+
class UserEngagementsService {
|
|
11527
|
+
constructor(document, userPreferencesService, gainsightService) {
|
|
11528
|
+
this.document = document;
|
|
11529
|
+
this.userPreferencesService = userPreferencesService;
|
|
11530
|
+
this.gainsightService = gainsightService;
|
|
11531
|
+
this.USER_PREFERENCES_GAINSIGHT_ENGAGEMENTS_KEY = 'gainsightBotEnabled';
|
|
11532
|
+
this.userEngagementsEnabled$ = new BehaviorSubject(false);
|
|
11533
|
+
this.HIDE_GAINSIGHT_BOT_STYLE_ID = 'hide-gs-bot';
|
|
11534
|
+
this.ENGAGEMENTS = 'engagements';
|
|
11535
|
+
this.handleUserEngagements();
|
|
11536
|
+
}
|
|
11537
|
+
/**
|
|
11538
|
+
* Handles user engagement settings based on various conditions.
|
|
11539
|
+
*
|
|
11540
|
+
* - Waits for the Gainsight tracking to be loaded.
|
|
11541
|
+
* - Retrieves the engagement settings.
|
|
11542
|
+
* - Updates the engagement settings based on the combined observations.
|
|
11543
|
+
* - Finally, toggles the Gainsight engagements based on the latest `userEngagementsEnabled$` value.
|
|
11544
|
+
*/
|
|
11545
|
+
handleUserEngagements() {
|
|
11546
|
+
this.gainsightService.trackingLoaded$
|
|
11547
|
+
.pipe(take(1), switchMap(() => this.getEngagementSettingsObservable()), tap((settings) => this.updateUserEngagementSettings(...settings)), switchMap(() => this.userEngagementsEnabled$.pipe(take(1))))
|
|
11548
|
+
.subscribe(isEnabled => this.toggleGainsightEngagements(isEnabled));
|
|
11549
|
+
}
|
|
11550
|
+
/**
|
|
11551
|
+
* Updates the user's preference for Gainsight Engagements.
|
|
11552
|
+
* @param {boolean} isEnabled - The new value for the user's engagement preference.
|
|
11553
|
+
*/
|
|
11554
|
+
updateUserEngagementPreference(isEnabled) {
|
|
11555
|
+
this.userEngagementsEnabled$.next(isEnabled);
|
|
11556
|
+
this.userPreferencesService.set(this.gainsightService.USER_PREFERENCES_GAINSIGHT_ENGAGEMENTS_KEY, this.userEngagementsEnabled$.value);
|
|
11557
|
+
}
|
|
11558
|
+
/**
|
|
11559
|
+
* Toggles the visibility of Gainsight Engagements based on the provided flag.
|
|
11560
|
+
*
|
|
11561
|
+
* @param isEnabled - A flag indicating whether Gainsight Engagements should be visible.
|
|
11562
|
+
*/
|
|
11563
|
+
toggleGainsightEngagements(isEnabled) {
|
|
11564
|
+
isEnabled ? this.showGainsightEngagements() : this.hideGainsightEngagements();
|
|
11565
|
+
}
|
|
11566
|
+
/**
|
|
11567
|
+
* Constructs an observable that emits an array of boolean values representing
|
|
11568
|
+
* the current engagement settings. The observable combines the latest values from:
|
|
11569
|
+
*
|
|
11570
|
+
* 1. User's preferences for Gainsight engagements.
|
|
11571
|
+
* 2. A flag indicating if PII data should be sent.
|
|
11572
|
+
* 3. A flag indicating if the platform uses custom branding.
|
|
11573
|
+
*
|
|
11574
|
+
* @returns An observable emitting an array of boolean values.
|
|
11575
|
+
*/
|
|
11576
|
+
getEngagementSettingsObservable() {
|
|
11577
|
+
return combineLatest([
|
|
11578
|
+
this.userPreferencesService.observe(this.USER_PREFERENCES_GAINSIGHT_ENGAGEMENTS_KEY),
|
|
11579
|
+
from(this.gainsightService.shouldSendPiiData()),
|
|
11580
|
+
of(this.gainsightService.isCustomBranding())
|
|
11581
|
+
]);
|
|
11582
|
+
}
|
|
11583
|
+
/**
|
|
11584
|
+
* Updates user engagement settings based on provided preferences and settings.
|
|
11585
|
+
*
|
|
11586
|
+
* Based on the received values, the method decides to:
|
|
11587
|
+
* 1. Disable user engagements if PII data should not be shared or certain branding/settings conditions are met.
|
|
11588
|
+
* 2. Update the user engagement preference if the user engagement bot setting is undefined.
|
|
11589
|
+
*
|
|
11590
|
+
* @param userEngagementBotSetting - The user's setting for the engagement bot.
|
|
11591
|
+
* @param shouldSendPiiData - Indicates whether PII data should be shared.
|
|
11592
|
+
* @param hasCustomBranding - Indicates if custom branding is applied.
|
|
11593
|
+
*/
|
|
11594
|
+
updateUserEngagementSettings(userEngagementBotSetting, shouldSendPiiData, hasCustomBranding) {
|
|
11595
|
+
if (this.shouldDisableUserEngagementsDueToPIIData(shouldSendPiiData)) {
|
|
11596
|
+
this.userEngagementsEnabled$.next(false);
|
|
11597
|
+
}
|
|
11598
|
+
else if (this.isUserEngagementBotSettingUndefined(userEngagementBotSetting)) {
|
|
11599
|
+
/**
|
|
11600
|
+
* Case where the user is new (freshly created) and has not changed the user engagement settings in the user edit modal (untouched state).
|
|
11601
|
+
* When custom branding is not set, we will set the user engagements in the user preferences to true by default.
|
|
11602
|
+
*/
|
|
11603
|
+
this.updateUserEngagementPreference(!hasCustomBranding);
|
|
11604
|
+
}
|
|
11605
|
+
else {
|
|
11606
|
+
this.userEngagementsEnabled$.next(userEngagementBotSetting);
|
|
11607
|
+
}
|
|
11608
|
+
}
|
|
11609
|
+
/**
|
|
11610
|
+
* Determines whether user engagements should be disabled due to PII data settings.
|
|
11611
|
+
*
|
|
11612
|
+
* If the `shouldSendPiiData` parameter is false, this indicates that the user engagements
|
|
11613
|
+
* should be disabled to prevent sharing personally identifiable information.
|
|
11614
|
+
*
|
|
11615
|
+
* @param {boolean} shouldSendPiiData - Indicates whether PII data is allowed to be sent.
|
|
11616
|
+
* @returns {boolean} Returns true if user engagements should be disabled, otherwise false.
|
|
11617
|
+
*/
|
|
11618
|
+
shouldDisableUserEngagementsDueToPIIData(shouldSendPiiData) {
|
|
11619
|
+
return !shouldSendPiiData;
|
|
11620
|
+
}
|
|
11621
|
+
/**
|
|
11622
|
+
* Determines if the user engagement bot setting is undefined.
|
|
11623
|
+
*
|
|
11624
|
+
* @param {boolean | undefined} userEngagementBotSetting - The setting value to check.
|
|
11625
|
+
* @returns {boolean} Returns `true` if the setting is undefined; otherwise, `false`.
|
|
11626
|
+
*
|
|
11627
|
+
* This scenario occurs when a user is new and hasn't modified the bot settings in the user details UI yet.
|
|
11628
|
+
*/
|
|
11629
|
+
isUserEngagementBotSettingUndefined(userEngagementBotSetting) {
|
|
11630
|
+
return userEngagementBotSetting === undefined;
|
|
11631
|
+
}
|
|
11632
|
+
/**
|
|
11633
|
+
* Enables the visibility of Gainsight engagements.
|
|
11634
|
+
*
|
|
11635
|
+
* This method removes the CSS styles that hide the Gainsight engagements
|
|
11636
|
+
* and updates the relevant user attribute to mark the engagements as visible.
|
|
11637
|
+
*/
|
|
11638
|
+
showGainsightEngagements() {
|
|
11639
|
+
this.removeHidingStyle(this.HIDE_GAINSIGHT_BOT_STYLE_ID);
|
|
11640
|
+
this.gainsightService.updateUserAttribute(this.ENGAGEMENTS, true);
|
|
11641
|
+
}
|
|
11642
|
+
/**
|
|
11643
|
+
* Hides the Gainsight engagements.
|
|
11644
|
+
*
|
|
11645
|
+
* This method applies CSS styles to hide the Gainsight engagements
|
|
11646
|
+
* and updates the relevant user attribute to mark the engagements as hidden.
|
|
11647
|
+
*/
|
|
11648
|
+
hideGainsightEngagements() {
|
|
11649
|
+
this.addHidingStyle(this.HIDE_GAINSIGHT_BOT_STYLE_ID, '#apt-widget { display:none }');
|
|
11650
|
+
this.gainsightService.updateUserAttribute(this.ENGAGEMENTS, false);
|
|
11651
|
+
}
|
|
11652
|
+
/**
|
|
11653
|
+
* Removes the specified CSS style from the document.
|
|
11654
|
+
*
|
|
11655
|
+
* @param {string} styleId - The ID of the CSS style element to remove.
|
|
11656
|
+
*/
|
|
11657
|
+
removeHidingStyle(styleId) {
|
|
11658
|
+
const style = this.document.getElementById(styleId);
|
|
11659
|
+
style === null || style === void 0 ? void 0 : style.remove();
|
|
11660
|
+
}
|
|
11661
|
+
/**
|
|
11662
|
+
* Adds a new CSS style to the document.
|
|
11663
|
+
*
|
|
11664
|
+
* If the style with the specified ID already exists, the method will do nothing.
|
|
11665
|
+
* Otherwise, it creates a new `<style>` element with the given ID and content,
|
|
11666
|
+
* then appends it to the document head.
|
|
11667
|
+
*
|
|
11668
|
+
* @param {string} styleId - The ID to assign to the new style element.
|
|
11669
|
+
* @param {string} textContent - The CSS rules to be included in the style.
|
|
11670
|
+
*/
|
|
11671
|
+
addHidingStyle(styleId, textContent) {
|
|
11672
|
+
if (this.document.getElementById(styleId)) {
|
|
11673
|
+
return;
|
|
11674
|
+
}
|
|
11675
|
+
const style = this.document.createElement('style');
|
|
11676
|
+
style.id = styleId;
|
|
11677
|
+
style.textContent = textContent;
|
|
11678
|
+
this.document.head.appendChild(style);
|
|
11679
|
+
}
|
|
11680
|
+
}
|
|
11681
|
+
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 });
|
|
11682
|
+
UserEngagementsService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: UserEngagementsService, providedIn: 'root' });
|
|
11683
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: UserEngagementsService, decorators: [{
|
|
11684
|
+
type: Injectable,
|
|
11685
|
+
args: [{ providedIn: 'root' }]
|
|
11686
|
+
}], ctorParameters: function () {
|
|
11687
|
+
return [{ type: DOCUMENT, decorators: [{
|
|
11688
|
+
type: Inject,
|
|
11689
|
+
args: [DOCUMENT]
|
|
11690
|
+
}] }, { type: UserPreferencesService }, { type: GainsightService }];
|
|
11691
|
+
} });
|
|
11692
|
+
|
|
11406
11693
|
class TotpChallengeComponent {
|
|
11407
11694
|
constructor(loginService, users, alert) {
|
|
11408
11695
|
this.loginService = loginService;
|
|
@@ -11798,7 +12085,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.6", ngImpor
|
|
|
11798
12085
|
}] } });
|
|
11799
12086
|
|
|
11800
12087
|
class UserEditComponent {
|
|
11801
|
-
constructor(state, translate, bsModalService, alert, userService, tenantLoginOptionsService, tenantService
|
|
12088
|
+
constructor(state, translate, bsModalService, alert, userService, tenantLoginOptionsService, tenantService) {
|
|
11802
12089
|
this.state = state;
|
|
11803
12090
|
this.translate = translate;
|
|
11804
12091
|
this.bsModalService = bsModalService;
|
|
@@ -11806,16 +12093,14 @@ class UserEditComponent {
|
|
|
11806
12093
|
this.userService = userService;
|
|
11807
12094
|
this.tenantLoginOptionsService = tenantLoginOptionsService;
|
|
11808
12095
|
this.tenantService = tenantService;
|
|
11809
|
-
this.userPreferencesService = userPreferencesService;
|
|
11810
|
-
this.gainsightService = gainsightService;
|
|
11811
12096
|
this.loading = false;
|
|
11812
|
-
this.
|
|
12097
|
+
this.showProductExperienceOptions = false;
|
|
11813
12098
|
this.isUsageTrackingEnabled = true;
|
|
11814
|
-
this.
|
|
12099
|
+
this.isUserEngagementPreferenceEnabled = true;
|
|
11815
12100
|
this.onUser = new EventEmitter();
|
|
11816
12101
|
this.onLanguage = new EventEmitter();
|
|
11817
|
-
this.
|
|
11818
|
-
this.
|
|
12102
|
+
this.onUsageTrackingChange = new EventEmitter();
|
|
12103
|
+
this.onUserEngagementPreferenceChange = new EventEmitter();
|
|
11819
12104
|
this.onCancel = new EventEmitter();
|
|
11820
12105
|
this.userHasActiveTotp = false;
|
|
11821
12106
|
this.userCanSetupTotp = false;
|
|
@@ -11842,20 +12127,12 @@ class UserEditComponent {
|
|
|
11842
12127
|
}
|
|
11843
12128
|
});
|
|
11844
12129
|
}
|
|
11845
|
-
onEnablingProductUsageTracking(isUsageTrackingEnabled) {
|
|
11846
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
11847
|
-
if (isUsageTrackingEnabled && this.isGainsightBotEnabled === undefined) {
|
|
11848
|
-
this.isGainsightBotEnabled = yield this.userPreferencesService
|
|
11849
|
-
.get(this.gainsightService.USER_PREFERENCES_GAINSIGHT_BOT_KEY)
|
|
11850
|
-
.toPromise();
|
|
11851
|
-
}
|
|
11852
|
-
});
|
|
11853
|
-
}
|
|
11854
|
-
get langs() {
|
|
11855
|
-
return this.state.state.langs;
|
|
11856
|
-
}
|
|
11857
12130
|
setupTotp() {
|
|
11858
|
-
this.bsModalService.show(UserTotpSetupComponent, {
|
|
12131
|
+
this.bsModalService.show(UserTotpSetupComponent, {
|
|
12132
|
+
class: 'modal-sm',
|
|
12133
|
+
ariaDescribedby: 'modal-body',
|
|
12134
|
+
ariaLabelledBy: 'modal-title'
|
|
12135
|
+
});
|
|
11859
12136
|
this.cancel(); // to close the user edit modal and prevent console errors on logout
|
|
11860
12137
|
}
|
|
11861
12138
|
cancel() {
|
|
@@ -11866,9 +12143,13 @@ class UserEditComponent {
|
|
|
11866
12143
|
if (this.loading) {
|
|
11867
12144
|
return;
|
|
11868
12145
|
}
|
|
11869
|
-
if (this.
|
|
11870
|
-
this.
|
|
11871
|
-
|
|
12146
|
+
if (this.showProductExperienceOptions) {
|
|
12147
|
+
this.onUsageTrackingChange.emit(this.isUsageTrackingEnabled);
|
|
12148
|
+
/**
|
|
12149
|
+
* Emits a user engagement preference change event.
|
|
12150
|
+
* If usage tracking is disabled, it emits `false`. Otherwise, it emits the current state of the user engagement preference.
|
|
12151
|
+
*/
|
|
12152
|
+
this.onUserEngagementPreferenceChange.emit(this.isUsageTrackingEnabled === false ? false : this.isUserEngagementPreferenceEnabled);
|
|
11872
12153
|
}
|
|
11873
12154
|
this.onUser.emit(this._user);
|
|
11874
12155
|
});
|
|
@@ -11876,6 +12157,9 @@ class UserEditComponent {
|
|
|
11876
12157
|
onNewPasswordChanged(newPassword) {
|
|
11877
12158
|
this._user.password = newPassword.password;
|
|
11878
12159
|
}
|
|
12160
|
+
get langs() {
|
|
12161
|
+
return this.state.state.langs;
|
|
12162
|
+
}
|
|
11879
12163
|
initializeTotpSettings() {
|
|
11880
12164
|
return __awaiter(this, void 0, void 0, function* () {
|
|
11881
12165
|
try {
|
|
@@ -11898,37 +12182,37 @@ class UserEditComponent {
|
|
|
11898
12182
|
});
|
|
11899
12183
|
}
|
|
11900
12184
|
}
|
|
11901
|
-
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 }
|
|
11902
|
-
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" }] });
|
|
12185
|
+
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 });
|
|
12186
|
+
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" }] });
|
|
11903
12187
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: UserEditComponent, decorators: [{
|
|
11904
12188
|
type: Component,
|
|
11905
|
-
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-
|
|
11906
|
-
}], 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 }
|
|
12189
|
+
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" }]
|
|
12190
|
+
}], 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: [{
|
|
11907
12191
|
type: Input
|
|
11908
12192
|
}], loading: [{
|
|
11909
12193
|
type: Input
|
|
11910
12194
|
}], user: [{
|
|
11911
12195
|
type: Input
|
|
11912
|
-
}],
|
|
12196
|
+
}], showProductExperienceOptions: [{
|
|
11913
12197
|
type: Input
|
|
11914
12198
|
}], isUsageTrackingEnabled: [{
|
|
11915
12199
|
type: Input
|
|
11916
|
-
}],
|
|
12200
|
+
}], isUserEngagementPreferenceEnabled: [{
|
|
11917
12201
|
type: Input
|
|
11918
12202
|
}], onUser: [{
|
|
11919
12203
|
type: Output
|
|
11920
12204
|
}], onLanguage: [{
|
|
11921
12205
|
type: Output
|
|
11922
|
-
}],
|
|
12206
|
+
}], onUsageTrackingChange: [{
|
|
11923
12207
|
type: Output
|
|
11924
|
-
}],
|
|
12208
|
+
}], onUserEngagementPreferenceChange: [{
|
|
11925
12209
|
type: Output
|
|
11926
12210
|
}], onCancel: [{
|
|
11927
12211
|
type: Output
|
|
11928
12212
|
}] } });
|
|
11929
12213
|
|
|
11930
12214
|
class UserEditModalComponent {
|
|
11931
|
-
constructor(modal, user, ui, auth, client, alert, translate, userPreferences,
|
|
12215
|
+
constructor(modal, user, ui, auth, client, alert, translate, userPreferences, c8yModalService, gainsightService, cookieBannerService, loginService, passwordService, userEngagementsService) {
|
|
11932
12216
|
this.modal = modal;
|
|
11933
12217
|
this.user = user;
|
|
11934
12218
|
this.ui = ui;
|
|
@@ -11937,50 +12221,64 @@ class UserEditModalComponent {
|
|
|
11937
12221
|
this.alert = alert;
|
|
11938
12222
|
this.translate = translate;
|
|
11939
12223
|
this.userPreferences = userPreferences;
|
|
11940
|
-
this.modalService = modalService;
|
|
11941
12224
|
this.c8yModalService = c8yModalService;
|
|
11942
12225
|
this.gainsightService = gainsightService;
|
|
11943
12226
|
this.cookieBannerService = cookieBannerService;
|
|
11944
12227
|
this.loginService = loginService;
|
|
11945
12228
|
this.passwordService = passwordService;
|
|
12229
|
+
this.userEngagementsService = userEngagementsService;
|
|
11946
12230
|
this.loading = false;
|
|
11947
|
-
this.
|
|
12231
|
+
this.showProductExperienceOptions = false;
|
|
11948
12232
|
this.lang = this.ui.state.lang;
|
|
11949
|
-
this.modalService.onHide.pipe(take(1)).subscribe((reason) => {
|
|
11950
|
-
if (reason !== null && this.changedLang !== undefined) {
|
|
11951
|
-
this.translate.switchToLanguage(this.lang);
|
|
11952
|
-
}
|
|
11953
|
-
});
|
|
11954
12233
|
}
|
|
11955
12234
|
ngOnInit() {
|
|
11956
12235
|
return __awaiter(this, void 0, void 0, function* () {
|
|
11957
12236
|
this.updateUserInAppState();
|
|
11958
|
-
|
|
11959
|
-
|
|
11960
|
-
|
|
11961
|
-
|
|
11962
|
-
|
|
11963
|
-
|
|
11964
|
-
|
|
11965
|
-
|
|
12237
|
+
yield this.setInitialProductExperienceOptions();
|
|
12238
|
+
});
|
|
12239
|
+
}
|
|
12240
|
+
/**
|
|
12241
|
+
* Initializes product experience options for the user.
|
|
12242
|
+
*
|
|
12243
|
+
* This function performs the following operations:
|
|
12244
|
+
* - Determines if the user has the permission to edit product experience options.
|
|
12245
|
+
* - If the user has the permission and functional cookies are enabled:
|
|
12246
|
+
* - Checks whether personalized product experience tracking is active.
|
|
12247
|
+
* - Checks whether in-product information and communication is active.
|
|
12248
|
+
*/
|
|
12249
|
+
setInitialProductExperienceOptions() {
|
|
12250
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
12251
|
+
this.showProductExperienceOptions =
|
|
12252
|
+
yield this.gainsightService.canEditProductExperienceSettings();
|
|
12253
|
+
if (this.showProductExperienceOptions && this.cookieBannerService.isFunctionalCookieEnabled()) {
|
|
12254
|
+
// Enable personalized product experience tracking option
|
|
12255
|
+
this.currentUsageTrackingState =
|
|
12256
|
+
!(yield this.gainsightService.isGainsightPreferenceDisabledInUserPreferences(this.gainsightService.USER_PREFERENCES_GAINSIGHT_KEY));
|
|
12257
|
+
// Enable in-product information & communication option
|
|
12258
|
+
this.currentUserEngagementPreferenceInitialState =
|
|
12259
|
+
this.userEngagementsService.userEngagementsEnabled$.value;
|
|
11966
12260
|
}
|
|
11967
12261
|
});
|
|
11968
12262
|
}
|
|
11969
12263
|
onDismiss() {
|
|
11970
|
-
|
|
11971
|
-
|
|
11972
|
-
|
|
11973
|
-
|
|
12264
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
12265
|
+
if (this.changedLang !== undefined) {
|
|
12266
|
+
yield this.translate.switchToLanguage(this.lang);
|
|
12267
|
+
}
|
|
12268
|
+
this.modal.hide();
|
|
12269
|
+
});
|
|
11974
12270
|
}
|
|
11975
12271
|
onLanguage(lang) {
|
|
11976
|
-
this
|
|
11977
|
-
|
|
12272
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
12273
|
+
this.changedLang = lang;
|
|
12274
|
+
yield this.translate.switchToLanguage(this.changedLang);
|
|
12275
|
+
});
|
|
11978
12276
|
}
|
|
11979
|
-
|
|
11980
|
-
this.usageTrackingState =
|
|
12277
|
+
onUsageTrackingChange(isEnabled) {
|
|
12278
|
+
this.usageTrackingState = isEnabled;
|
|
11981
12279
|
}
|
|
11982
|
-
|
|
11983
|
-
this.
|
|
12280
|
+
onUserEngagementPreferenceChange(isEnabled) {
|
|
12281
|
+
this.userEngagementPreferenceNewState = isEnabled;
|
|
11984
12282
|
}
|
|
11985
12283
|
updateAndClose(user) {
|
|
11986
12284
|
return __awaiter(this, void 0, void 0, function* () {
|
|
@@ -12003,16 +12301,7 @@ class UserEditModalComponent {
|
|
|
12003
12301
|
if (this.changedLang && this.changedLang !== this.lang) {
|
|
12004
12302
|
reloadRequired = yield this.persistLanguage(this.changedLang);
|
|
12005
12303
|
}
|
|
12006
|
-
|
|
12007
|
-
yield this.userPreferences.set(this.gainsightService.USER_PREFERENCES_GAINSIGHT_BOT_KEY, this.gainsightBotState);
|
|
12008
|
-
}
|
|
12009
|
-
if (this.currentUsageTrackingState !== this.usageTrackingState) {
|
|
12010
|
-
yield this.userPreferences.set(this.gainsightService.USER_PREFERENCES_GAINSIGHT_KEY, this.usageTrackingState);
|
|
12011
|
-
this.gainsightService.setFunctionalCookie(this.usageTrackingState);
|
|
12012
|
-
this.usageTrackingState
|
|
12013
|
-
? yield this.gainsightService.loadTag(this.client.tenant)
|
|
12014
|
-
: yield this.gainsightTrackingAppReload();
|
|
12015
|
-
}
|
|
12304
|
+
yield this.updateProductExperienceOptions();
|
|
12016
12305
|
if (user.customProperties.userOrigin !== 'OAUTH2') {
|
|
12017
12306
|
yield this.user.updateCurrent(omit(user, 'password'));
|
|
12018
12307
|
yield this.updateUserInAppState();
|
|
@@ -12069,6 +12358,38 @@ class UserEditModalComponent {
|
|
|
12069
12358
|
}
|
|
12070
12359
|
});
|
|
12071
12360
|
}
|
|
12361
|
+
updateProductExperienceOptions() {
|
|
12362
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
12363
|
+
this.updateUserEngagementsPreference();
|
|
12364
|
+
yield this.updateTrackingOption();
|
|
12365
|
+
});
|
|
12366
|
+
}
|
|
12367
|
+
/**
|
|
12368
|
+
* Updates the user engagement preference if it has changed from the initial state.
|
|
12369
|
+
* Calls the user engagements service to update the preference.
|
|
12370
|
+
*
|
|
12371
|
+
* The update only occurs if the current preference differs from the new state.
|
|
12372
|
+
*/
|
|
12373
|
+
updateUserEngagementsPreference() {
|
|
12374
|
+
if (this.currentUserEngagementPreferenceInitialState !== this.userEngagementPreferenceNewState) {
|
|
12375
|
+
this.userEngagementsService.updateUserEngagementPreference(this.userEngagementPreferenceNewState);
|
|
12376
|
+
}
|
|
12377
|
+
}
|
|
12378
|
+
/**
|
|
12379
|
+
* Asynchronously updates the tracking option for user preferences.
|
|
12380
|
+
* If the current usage tracking state differs from the new state,
|
|
12381
|
+
* it updates the Gainsight preferences and sets a functional cookie
|
|
12382
|
+
* before triggering a reload of the application.
|
|
12383
|
+
*/
|
|
12384
|
+
updateTrackingOption() {
|
|
12385
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
12386
|
+
if (this.currentUsageTrackingState !== this.usageTrackingState) {
|
|
12387
|
+
yield this.userPreferences.set(this.gainsightService.USER_PREFERENCES_GAINSIGHT_KEY, this.usageTrackingState);
|
|
12388
|
+
this.gainsightService.setFunctionalCookie(this.usageTrackingState);
|
|
12389
|
+
yield this.gainsightTrackingAppReload();
|
|
12390
|
+
}
|
|
12391
|
+
});
|
|
12392
|
+
}
|
|
12072
12393
|
updateUserInAppState() {
|
|
12073
12394
|
return __awaiter(this, void 0, void 0, function* () {
|
|
12074
12395
|
const currentUserResult = yield this.user.current();
|
|
@@ -12084,12 +12405,12 @@ class UserEditModalComponent {
|
|
|
12084
12405
|
this.auth.updateCredentials(newCredentials);
|
|
12085
12406
|
}
|
|
12086
12407
|
}
|
|
12087
|
-
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:
|
|
12088
|
-
UserEditModalComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.0.6", type: UserEditModalComponent, selector: "c8y-user-edit-modal", ngImport: i0, template: "<c8y-modal
|
|
12408
|
+
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 });
|
|
12409
|
+
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" }] });
|
|
12089
12410
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: UserEditModalComponent, decorators: [{
|
|
12090
12411
|
type: Component,
|
|
12091
|
-
args: [{ selector: 'c8y-user-edit-modal', template: "<c8y-modal
|
|
12092
|
-
}], 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:
|
|
12412
|
+
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" }]
|
|
12413
|
+
}], 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 }]; } });
|
|
12093
12414
|
|
|
12094
12415
|
class ClipboardService {
|
|
12095
12416
|
constructor(alertService) {
|
|
@@ -12556,6 +12877,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.6", ngImpor
|
|
|
12556
12877
|
|
|
12557
12878
|
class RightDrawerComponent {
|
|
12558
12879
|
constructor() {
|
|
12880
|
+
this.PRODUCT_EXPERIENCE = PRODUCT_EXPERIENCE;
|
|
12559
12881
|
this.quickLinks = [];
|
|
12560
12882
|
this.helpAndSupport = [];
|
|
12561
12883
|
}
|
|
@@ -12571,10 +12893,10 @@ class RightDrawerComponent {
|
|
|
12571
12893
|
}
|
|
12572
12894
|
}
|
|
12573
12895
|
RightDrawerComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: RightDrawerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
12574
|
-
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\"
|
|
12896
|
+
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" }] });
|
|
12575
12897
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: RightDrawerComponent, decorators: [{
|
|
12576
12898
|
type: Component,
|
|
12577
|
-
args: [{ selector: 'c8y-right-drawer', template: "<div class=\"c8y-right-drawer\">\n <div class=\"summary\">\n <h4 class=\"text-light\"
|
|
12899
|
+
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" }]
|
|
12578
12900
|
}], propDecorators: { _quickLinks: [{
|
|
12579
12901
|
type: Input,
|
|
12580
12902
|
args: ['quickLinks']
|
|
@@ -15707,50 +16029,68 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.6", ngImpor
|
|
|
15707
16029
|
/**
|
|
15708
16030
|
* This module enables an tenant to activate the product experience
|
|
15709
16031
|
* software [Gainsight](https://www.gainsight.com/product-experience/) to help
|
|
15710
|
-
* and track user actions.
|
|
15711
|
-
* property `gainsightEnabled` is set to true.
|
|
16032
|
+
* and track user actions.
|
|
15712
16033
|
*/
|
|
15713
16034
|
class ProductExperienceModule {
|
|
15714
|
-
constructor(appState, gainsightService, cookieBannerService,
|
|
16035
|
+
constructor(appState, gainsightService, cookieBannerService,
|
|
16036
|
+
// Don't remove it, otherwise UserEngagementsService won't be initialized.
|
|
16037
|
+
userEngagementsService) {
|
|
15715
16038
|
this.appState = appState;
|
|
15716
16039
|
this.gainsightService = gainsightService;
|
|
15717
16040
|
this.cookieBannerService = cookieBannerService;
|
|
15718
|
-
this.
|
|
16041
|
+
this.userEngagementsService = userEngagementsService;
|
|
16042
|
+
/**
|
|
16043
|
+
* Check if the Gainsight tracking is disabled in the application apptions. If so, exit early without processing further.
|
|
16044
|
+
*/
|
|
16045
|
+
if (this.gainsightService.isTrackingDisabled()) {
|
|
16046
|
+
return;
|
|
16047
|
+
}
|
|
16048
|
+
this.toggleUserTrackingObservable();
|
|
16049
|
+
}
|
|
16050
|
+
/**
|
|
16051
|
+
* Observes several factors to determine the state of user tracking and manages the visibility of Gainsight engagements.
|
|
16052
|
+
* It watches for changes in the current tenant, the state of the cookie banner, and user's preferences for Gainsight engagements.
|
|
16053
|
+
*
|
|
16054
|
+
* 1. If the cookie banner is being displayed, it returns without making any changes.
|
|
16055
|
+
* 2. If Gainsight is disabled at the tenant level via custom properties, it returns without making any changes.
|
|
16056
|
+
* 3. If the conditions are met for loading the Gainsight tag, it loads the tag.
|
|
16057
|
+
*/
|
|
16058
|
+
toggleUserTrackingObservable() {
|
|
15719
16059
|
combineLatest([
|
|
15720
16060
|
this.appState.currentTenant.pipe(filter(Boolean)),
|
|
15721
|
-
this.cookieBannerService.isCookieBannerShowed
|
|
15722
|
-
|
|
15723
|
-
]).subscribe(([currentTenant, isCookieBannerShowed, showGainsightBot]) => __awaiter(this, void 0, void 0, function* () {
|
|
16061
|
+
this.cookieBannerService.isCookieBannerShowed$
|
|
16062
|
+
]).subscribe(([currentTenant, isCookieBannerShowed]) => __awaiter(this, void 0, void 0, function* () {
|
|
15724
16063
|
if (isCookieBannerShowed) {
|
|
15725
16064
|
return;
|
|
15726
16065
|
}
|
|
15727
16066
|
const { customProperties } = currentTenant;
|
|
15728
|
-
if (this.gainsightService.
|
|
15729
|
-
|
|
15730
|
-
this.gainsightService.loadTag(currentTenant);
|
|
16067
|
+
if (this.gainsightService.isGainsightDisabledAtTenantCustomProperties(customProperties)) {
|
|
16068
|
+
return;
|
|
15731
16069
|
}
|
|
15732
|
-
|
|
15733
|
-
|
|
15734
|
-
*/
|
|
15735
|
-
if (showGainsightBot === undefined) {
|
|
15736
|
-
showGainsightBot = true;
|
|
15737
|
-
userPreferencesService.set(this.gainsightService.USER_PREFERENCES_GAINSIGHT_BOT_KEY, showGainsightBot);
|
|
16070
|
+
if (this.shouldLoadTag()) {
|
|
16071
|
+
yield this.gainsightService.loadTag(currentTenant, yield this.gainsightService.shouldSendPiiData());
|
|
15738
16072
|
}
|
|
15739
|
-
this.gainsightService.switchKnowledgeHubBotVisibility(showGainsightBot);
|
|
15740
16073
|
}));
|
|
15741
16074
|
}
|
|
16075
|
+
/**
|
|
16076
|
+
* Determines if a tracking tag should be loaded based on cookie preferences.
|
|
16077
|
+
* @returns `true` if user cookie preferences exist, otherwise `false`.
|
|
16078
|
+
*/
|
|
16079
|
+
shouldLoadTag() {
|
|
16080
|
+
return !!this.cookieBannerService.getUserCookiePreferences();
|
|
16081
|
+
}
|
|
15742
16082
|
}
|
|
15743
|
-
ProductExperienceModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: ProductExperienceModule, deps: [{ token: AppStateService }, { token: GainsightService }, { token: CookieBannerService }, { token:
|
|
16083
|
+
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 });
|
|
15744
16084
|
ProductExperienceModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "14.0.6", ngImport: i0, type: ProductExperienceModule, declarations: [ProductExperienceDirective], exports: [ProductExperienceDirective] });
|
|
15745
|
-
ProductExperienceModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: ProductExperienceModule, providers: [GainsightService] });
|
|
16085
|
+
ProductExperienceModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: ProductExperienceModule, providers: [GainsightService, UserEngagementsService] });
|
|
15746
16086
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: ProductExperienceModule, decorators: [{
|
|
15747
16087
|
type: NgModule,
|
|
15748
16088
|
args: [{
|
|
15749
16089
|
declarations: [ProductExperienceDirective],
|
|
15750
16090
|
exports: [ProductExperienceDirective],
|
|
15751
|
-
providers: [GainsightService]
|
|
16091
|
+
providers: [GainsightService, UserEngagementsService]
|
|
15752
16092
|
}]
|
|
15753
|
-
}], ctorParameters: function () { return [{ type: AppStateService }, { type: GainsightService }, { type: CookieBannerService }, { type:
|
|
16093
|
+
}], ctorParameters: function () { return [{ type: AppStateService }, { type: GainsightService }, { type: CookieBannerService }, { type: UserEngagementsService }]; } });
|
|
15754
16094
|
|
|
15755
16095
|
class SearchComponent {
|
|
15756
16096
|
constructor(searchService) {
|
|
@@ -20458,7 +20798,7 @@ function c8yValidationConfigFactory(translate) {
|
|
|
20458
20798
|
}
|
|
20459
20799
|
},
|
|
20460
20800
|
{
|
|
20461
|
-
name: '
|
|
20801
|
+
name: 'minLength',
|
|
20462
20802
|
message(_error, field) {
|
|
20463
20803
|
return translate.stream(ValidationPattern.messages.minLength, field.templateOptions);
|
|
20464
20804
|
}
|
|
@@ -26180,5 +26520,5 @@ class RealtimeMessage {
|
|
|
26180
26520
|
* Generated bundle index. Do not edit.
|
|
26181
26521
|
*/
|
|
26182
26522
|
|
|
26183
|
-
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 };
|
|
26523
|
+
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 };
|
|
26184
26524
|
//# sourceMappingURL=c8y-ngx-components.mjs.map
|