@c8y/ngx-components 1017.0.510 → 1017.0.512
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 +86 -28
- 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 +33 -6
- package/core/user/user-edit.component.d.ts +8 -13
- 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/header/right-drawer/right-drawer.component.mjs +5 -3
- package/esm2020/core/product-experience/gainsight.service.mjs +157 -76
- 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 +68 -33
- package/esm2020/core/user/user-edit.component.mjs +36 -45
- 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 +481 -167
- 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 +472 -161
- package/fesm2020/c8y-ngx-components.mjs.map +1 -1
- package/locales/locales.pot +2 -2
- 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
|
@@ -6878,6 +6878,21 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.6", ngImpor
|
|
|
6878
6878
|
}]
|
|
6879
6879
|
}], ctorParameters: function () { return []; } });
|
|
6880
6880
|
|
|
6881
|
+
const PRODUCT_EXPERIENCE = {
|
|
6882
|
+
ACTION_BAR: {
|
|
6883
|
+
EVENTS: { ACTION_BAR_ITEM: 'actionBarItem' },
|
|
6884
|
+
COMPONENTS: { ACTION_BAR_COMPONENT: 'action-bar' },
|
|
6885
|
+
ACTIONS: {},
|
|
6886
|
+
RESULTS: {}
|
|
6887
|
+
},
|
|
6888
|
+
QUICK_LINKS: {
|
|
6889
|
+
EVENTS: { QUICK_LINK_RIGHT_DRAWER: 'quickLinkRightDrawer' },
|
|
6890
|
+
COMPONENTS: { RIGHT_DRAWER_COMPONENT: 'right-drawer' },
|
|
6891
|
+
ACTIONS: {},
|
|
6892
|
+
RESULTS: {}
|
|
6893
|
+
}
|
|
6894
|
+
};
|
|
6895
|
+
|
|
6881
6896
|
/**
|
|
6882
6897
|
* This service is handling the cookie banner and cookie preferences related logic.
|
|
6883
6898
|
*/
|
|
@@ -6949,7 +6964,7 @@ class CookieBannerService {
|
|
|
6949
6964
|
return JSON.parse(localStorage.getItem(this.STORAGE_KEY));
|
|
6950
6965
|
}
|
|
6951
6966
|
/**
|
|
6952
|
-
* Verifies that cookie preferences configuration is defined.
|
|
6967
|
+
* Verifies that cookie preferences configuration is defined in the application options.
|
|
6953
6968
|
* @returns {boolean} Returns if the cookie preferences configuration is defined.
|
|
6954
6969
|
*/
|
|
6955
6970
|
isConfigCookiePreferencesDefined() {
|
|
@@ -7016,8 +7031,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.6", ngImpor
|
|
|
7016
7031
|
* tag and
|
|
7017
7032
|
*/
|
|
7018
7033
|
class GainsightService {
|
|
7019
|
-
constructor(
|
|
7020
|
-
this.document = document;
|
|
7034
|
+
constructor(appState, options, cookieBannerService, userPreferencesService, translateService) {
|
|
7021
7035
|
this.appState = appState;
|
|
7022
7036
|
this.options = options;
|
|
7023
7037
|
this.cookieBannerService = cookieBannerService;
|
|
@@ -7027,6 +7041,11 @@ class GainsightService {
|
|
|
7027
7041
|
* A subject that emits the tag function as soon as a new tag is set.
|
|
7028
7042
|
*/
|
|
7029
7043
|
this.tagFunction$ = new BehaviorSubject(null);
|
|
7044
|
+
this.trackingLoaded$ = new Subject();
|
|
7045
|
+
/**
|
|
7046
|
+
* 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.
|
|
7047
|
+
* Otherwise, only the required data is transmitted during the identity step execution.
|
|
7048
|
+
*/
|
|
7030
7049
|
this.USER_PREFERENCES_GAINSIGHT_KEY = 'gainsightEnabled';
|
|
7031
7050
|
/**
|
|
7032
7051
|
* The name of the key remained unchanged, but applies to all engagements.
|
|
@@ -7038,15 +7057,23 @@ class GainsightService {
|
|
|
7038
7057
|
this.SCRIPT_EXECUTION_WAIT_TIME = 500;
|
|
7039
7058
|
this.OPTIONS_KEY_CATEGORY = 'gainsight';
|
|
7040
7059
|
this.OPTIONS_KEY_NAME = 'api.key';
|
|
7041
|
-
this.ENGAGEMENTS = 'engagements';
|
|
7042
7060
|
this.isScriptLoaded = false;
|
|
7043
7061
|
}
|
|
7062
|
+
/**
|
|
7063
|
+
* Checks if the specified Gainsight preference is disabled in user preferences.
|
|
7064
|
+
* @param preferenceName - Name of the Gainsight preference.
|
|
7065
|
+
* @returns A promise that resolves to `true` if the preference is disabled, otherwise `false`.
|
|
7066
|
+
*/
|
|
7044
7067
|
isGainsightPreferenceDisabledInUserPreferences(preferenceName) {
|
|
7045
7068
|
return __awaiter(this, void 0, void 0, function* () {
|
|
7046
7069
|
const userGainsightPref = yield this.userPreferencesService.get(preferenceName).toPromise();
|
|
7047
7070
|
return userGainsightPref === false;
|
|
7048
7071
|
});
|
|
7049
7072
|
}
|
|
7073
|
+
/**
|
|
7074
|
+
* Sets the state of the functional cookie.
|
|
7075
|
+
* @param value - A boolean value to indicate whether the functional cookie should be enabled (`true`) or disabled (`false`).
|
|
7076
|
+
*/
|
|
7050
7077
|
setFunctionalCookie(value) {
|
|
7051
7078
|
const cookies = this.cookieBannerService.getUserCookiePreferences();
|
|
7052
7079
|
if (cookies) {
|
|
@@ -7077,58 +7104,110 @@ class GainsightService {
|
|
|
7077
7104
|
/**
|
|
7078
7105
|
* Load the script tag and calls the identify function to start the tracking.
|
|
7079
7106
|
* @param currentTenant The current tenant.
|
|
7080
|
-
* @param
|
|
7107
|
+
* @param sendPiiData Flag for sending personally identifiable information (PII) during identification in Gainsight.
|
|
7081
7108
|
*/
|
|
7082
|
-
loadTag(currentTenant,
|
|
7109
|
+
loadTag(currentTenant, sendPiiData) {
|
|
7083
7110
|
return __awaiter(this, void 0, void 0, function* () {
|
|
7084
7111
|
const scriptTag = document.createElement('script');
|
|
7085
7112
|
const key = yield this.getGainsightKey();
|
|
7086
7113
|
if (key && !this.isScriptLoaded) {
|
|
7087
7114
|
this.loadScriptTag(scriptTag, key);
|
|
7088
|
-
|
|
7115
|
+
const currentUserStream = this.appState.currentUser;
|
|
7116
|
+
const scriptLoadStream = fromEvent(scriptTag, 'load');
|
|
7117
|
+
const versionStream = this.appState.state$.pipe(filter(({ versions }) => versions.backend), map(({ versions }) => versions), take(1));
|
|
7118
|
+
const sourceStreams = sendPiiData
|
|
7119
|
+
? [currentUserStream, scriptLoadStream, versionStream]
|
|
7120
|
+
: [currentUserStream, scriptLoadStream];
|
|
7121
|
+
combineLatest(sourceStreams)
|
|
7089
7122
|
.pipe(delay(this.SCRIPT_EXECUTION_WAIT_TIME), filter(([user, scriptEvent]) => !!(scriptEvent && user)))
|
|
7090
|
-
.subscribe(
|
|
7123
|
+
.subscribe(args => {
|
|
7124
|
+
const [user, , versions] = args;
|
|
7125
|
+
this.setGlobalContext();
|
|
7091
7126
|
const instanceId = this.getInstanceIdFromUrl();
|
|
7092
|
-
if (
|
|
7093
|
-
|
|
7094
|
-
|
|
7127
|
+
if (sendPiiData) {
|
|
7128
|
+
const versionUI = versions.ui.ngx;
|
|
7129
|
+
const versionBE = versions.backend;
|
|
7130
|
+
const extendedIdentifyData = {
|
|
7131
|
+
user,
|
|
7132
|
+
currentTenant,
|
|
7133
|
+
instanceId,
|
|
7134
|
+
versionUI,
|
|
7135
|
+
versionBE
|
|
7136
|
+
};
|
|
7137
|
+
this.identify(sendPiiData, extendedIdentifyData);
|
|
7138
|
+
}
|
|
7139
|
+
else {
|
|
7140
|
+
const requiredIdentifyData = { user, currentTenant, instanceId };
|
|
7141
|
+
this.identify(sendPiiData, requiredIdentifyData);
|
|
7095
7142
|
}
|
|
7096
7143
|
this.isScriptLoaded = true;
|
|
7097
7144
|
this.tagFunction$.next(this.tagFunction);
|
|
7145
|
+
this.trackingLoaded$.next(true);
|
|
7098
7146
|
});
|
|
7099
7147
|
}
|
|
7100
7148
|
});
|
|
7101
7149
|
}
|
|
7102
7150
|
/**
|
|
7103
7151
|
* Identifies the user/account at Gainsight.
|
|
7104
|
-
* @param
|
|
7105
|
-
* @param
|
|
7106
|
-
* @param versionUI The UI version used.
|
|
7107
|
-
* @param versionBE The BE version used.
|
|
7152
|
+
* @param sendPiiData Flag for sending personally identifiable information.
|
|
7153
|
+
* @param identifyData Object containing identification data.
|
|
7108
7154
|
*/
|
|
7109
|
-
identify(
|
|
7155
|
+
identify(sendPiiData, identifyData) {
|
|
7110
7156
|
const windowRef = window;
|
|
7111
|
-
const { id: userId, email,
|
|
7112
|
-
const { name, customProperties, domainName } =
|
|
7113
|
-
const {
|
|
7114
|
-
|
|
7115
|
-
|
|
7116
|
-
|
|
7117
|
-
|
|
7118
|
-
|
|
7119
|
-
|
|
7157
|
+
const { id: userId, email, roles } = identifyData.user;
|
|
7158
|
+
const { name: tenantID, customProperties, domainName } = identifyData.currentTenant;
|
|
7159
|
+
const { instanceId, versionUI, versionBE } = identifyData;
|
|
7160
|
+
/**
|
|
7161
|
+
* Passing ID is a minimum required data to make an identify call to Gainsight.
|
|
7162
|
+
* isUserCreatedAfterAnonymizationWasActivated parameter is passed to later distinguish between users created before and after data anonymization done by Gainsight.
|
|
7163
|
+
* tenantID Used to distinguish between tenants when same email is used for different tenants.
|
|
7164
|
+
*
|
|
7165
|
+
* Due to GS limitations (GS does not allow clearing user attr/preferences via the GS tag!),
|
|
7166
|
+
* we always need to initialize fields related to PII to prevent leaking this data to GS when the user has disabled functional cookies.
|
|
7167
|
+
*/
|
|
7168
|
+
const requiredIdentify = {
|
|
7169
|
+
/**
|
|
7170
|
+
* Email was not mandatory form field until 10.14
|
|
7171
|
+
*/
|
|
7172
|
+
id: email ? email : `${userId}_${tenantID}_${instanceId}`,
|
|
7173
|
+
isUserCreatedAfterAnonymizationWasActivated: true,
|
|
7174
|
+
tenantID: tenantID,
|
|
7175
|
+
email: '--',
|
|
7176
|
+
userName: '--',
|
|
7177
|
+
firstName: '--',
|
|
7178
|
+
lastName: '--',
|
|
7120
7179
|
domainName,
|
|
7121
7180
|
versionUI,
|
|
7122
7181
|
versionBE,
|
|
7123
7182
|
userLanguage: this.translateService.currentLang,
|
|
7183
|
+
browserLanguage: this.translateService.getBrowserLang(),
|
|
7124
7184
|
instanceId,
|
|
7125
|
-
externalReference,
|
|
7126
|
-
userRoles: this.transformUserRolesToStr(roles === null || roles === void 0 ? void 0 : roles.references)
|
|
7127
|
-
|
|
7128
|
-
|
|
7129
|
-
|
|
7130
|
-
|
|
7185
|
+
externalReference: customProperties === null || customProperties === void 0 ? void 0 : customProperties.externalReference,
|
|
7186
|
+
userRoles: this.transformUserRolesToStr(roles === null || roles === void 0 ? void 0 : roles.references),
|
|
7187
|
+
customBranding: this.isCustomBranding(),
|
|
7188
|
+
fullTracking: sendPiiData
|
|
7189
|
+
};
|
|
7190
|
+
if (sendPiiData) {
|
|
7191
|
+
const { userName, firstName, lastName } = identifyData.user;
|
|
7192
|
+
const extendedIdentify = Object.assign(Object.assign({}, requiredIdentify), { email,
|
|
7193
|
+
userName,
|
|
7194
|
+
firstName,
|
|
7195
|
+
lastName });
|
|
7196
|
+
windowRef[this.GAINSIGHT_GLOBAL_SCOPE]('identify', extendedIdentify, {
|
|
7197
|
+
id: `${tenantID}_${instanceId}`,
|
|
7198
|
+
instanceId
|
|
7199
|
+
});
|
|
7200
|
+
return;
|
|
7201
|
+
}
|
|
7202
|
+
windowRef[this.GAINSIGHT_GLOBAL_SCOPE]('identify', requiredIdentify);
|
|
7131
7203
|
}
|
|
7204
|
+
/**
|
|
7205
|
+
* Triggers an event to be recorded by Gainsight PX.
|
|
7206
|
+
* This method calls the Gainsight PX's tracking mechanism to log a specific event
|
|
7207
|
+
* along with its associated properties.
|
|
7208
|
+
* @param eventName - Name of the event to be triggered.
|
|
7209
|
+
* @param props - Optional properties associated with the event.
|
|
7210
|
+
*/
|
|
7132
7211
|
triggerEvent(eventName, props) {
|
|
7133
7212
|
if (this.tagFunction && eventName) {
|
|
7134
7213
|
eventName = this.prepareEventName(eventName);
|
|
@@ -7150,41 +7229,56 @@ class GainsightService {
|
|
|
7150
7229
|
return this.getEnTranslation(textToTranslate, this.cachedRevertedTranslations);
|
|
7151
7230
|
}
|
|
7152
7231
|
/**
|
|
7153
|
-
*
|
|
7154
|
-
* The decision to
|
|
7155
|
-
*
|
|
7232
|
+
* Determines whether personally identifiable information (PII) should be sent while loading a tag.
|
|
7233
|
+
* The decision to activate Gainsight and send PII relies on whether the cookiePreferences option is defined in the application settings,
|
|
7234
|
+
* if the functional cookie is enabled, and if the user grants permission.
|
|
7156
7235
|
*/
|
|
7157
|
-
|
|
7158
|
-
return (this
|
|
7159
|
-
this.cookieBannerService.
|
|
7160
|
-
|
|
7161
|
-
|
|
7236
|
+
shouldSendPiiData() {
|
|
7237
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
7238
|
+
return (this.cookieBannerService.isConfigCookiePreferencesDefined() &&
|
|
7239
|
+
this.cookieBannerService.isFunctionalCookieEnabled() &&
|
|
7240
|
+
!(yield this.isGainsightPreferenceDisabledInUserPreferences(this.USER_PREFERENCES_GAINSIGHT_KEY)));
|
|
7241
|
+
});
|
|
7162
7242
|
}
|
|
7243
|
+
/**
|
|
7244
|
+
* Updates a specific user attribute in the Gainsight global scope.
|
|
7245
|
+
* This method interfaces with the Gainsight global object to set a user's specific attribute with a provided value.
|
|
7246
|
+
* @param name - Name of the user attribute to be updated.
|
|
7247
|
+
* @param value - Value to set for the specified user attribute.
|
|
7248
|
+
*/
|
|
7163
7249
|
updateUserAttribute(name, value) {
|
|
7164
7250
|
var _a;
|
|
7165
7251
|
(_a = window[this.GAINSIGHT_GLOBAL_SCOPE]) === null || _a === void 0 ? void 0 : _a.call(window, 'set', 'user', { [name]: value });
|
|
7166
7252
|
}
|
|
7253
|
+
/**
|
|
7254
|
+
* Determines if the current user has the capability to modify Gainsight PX settings.
|
|
7255
|
+
*
|
|
7256
|
+
* This method checks multiple conditions:
|
|
7257
|
+
* 1. Whether tracking has been disabled globally via application options.
|
|
7258
|
+
* 2. Whether Gainsight is disabled at the tenant level through custom properties.
|
|
7259
|
+
* 3. Whether a Gainsight key is available, either currently loaded or fetched asynchronously.
|
|
7260
|
+
* 4. Whether cookie preferences are defined and available for the user.
|
|
7261
|
+
*
|
|
7262
|
+
* @returns Promise that resolves to a boolean. True indicates the user can edit product experience settings, and false otherwise.
|
|
7263
|
+
*/
|
|
7167
7264
|
canEditProductExperienceSettings() {
|
|
7168
7265
|
return __awaiter(this, void 0, void 0, function* () {
|
|
7169
7266
|
const currentTenant = this.appState.currentTenant.value;
|
|
7170
7267
|
const { customProperties } = currentTenant;
|
|
7268
|
+
if (this.isTrackingDisabled() ||
|
|
7269
|
+
this.isGainsightDisabledAtTenantCustomProperties(customProperties)) {
|
|
7270
|
+
return false;
|
|
7271
|
+
}
|
|
7171
7272
|
const gainsightKey = !!this.gainsightKey || !!(yield this.getGainsightKey());
|
|
7172
7273
|
return (gainsightKey &&
|
|
7173
7274
|
this.cookieBannerService.isConfigCookiePreferencesDefined() &&
|
|
7174
|
-
|
|
7175
|
-
!!this.cookieBannerService.getUserCookiePreferences() &&
|
|
7176
|
-
!this.isCustomBranding());
|
|
7275
|
+
!!this.cookieBannerService.getUserCookiePreferences());
|
|
7177
7276
|
});
|
|
7178
7277
|
}
|
|
7179
|
-
|
|
7180
|
-
|
|
7181
|
-
|
|
7182
|
-
|
|
7183
|
-
return;
|
|
7184
|
-
}
|
|
7185
|
-
this.addHidingStyle(this.HIDE_GAINSIGHT_BOT_STYLE_ID, '#apt-widget { display:none }');
|
|
7186
|
-
this.updateUserAttribute(this.ENGAGEMENTS, false);
|
|
7187
|
-
}
|
|
7278
|
+
/**
|
|
7279
|
+
* Sets the global context for Gainsight with the current application name.
|
|
7280
|
+
* The global context can be utilized by Gainsight for various purposes, such as segmenting users.
|
|
7281
|
+
*/
|
|
7188
7282
|
setGlobalContext() {
|
|
7189
7283
|
var _a;
|
|
7190
7284
|
const currentAppState = this.appState.state$.value;
|
|
@@ -7197,18 +7291,31 @@ class GainsightService {
|
|
|
7197
7291
|
}
|
|
7198
7292
|
return flatMap(userRoles, (userRole) => userRole.role.name).join();
|
|
7199
7293
|
}
|
|
7200
|
-
|
|
7201
|
-
|
|
7202
|
-
|
|
7203
|
-
|
|
7204
|
-
|
|
7205
|
-
|
|
7206
|
-
|
|
7207
|
-
|
|
7294
|
+
/**
|
|
7295
|
+
* Checks if Gainsight is disabled based on tenant custom properties.
|
|
7296
|
+
*
|
|
7297
|
+
* @param customProperties - The custom properties of the tenant.
|
|
7298
|
+
* @returns {boolean} - True if Gainsight is disabled, false otherwise.
|
|
7299
|
+
*/
|
|
7300
|
+
isGainsightDisabledAtTenantCustomProperties(customProperties) {
|
|
7301
|
+
const gainsightEnabled = customProperties && customProperties.gainsightEnabled;
|
|
7302
|
+
return gainsightEnabled === false;
|
|
7208
7303
|
}
|
|
7209
|
-
|
|
7210
|
-
|
|
7211
|
-
|
|
7304
|
+
/**
|
|
7305
|
+
* Determines if custom branding is enabled based on the presence of a brand logo.
|
|
7306
|
+
*
|
|
7307
|
+
* @returns {boolean} - True if custom branding is applied, false otherwise.
|
|
7308
|
+
*/
|
|
7309
|
+
isCustomBranding() {
|
|
7310
|
+
const brandingCssVars = this.options.get('brandingCssVars') || {};
|
|
7311
|
+
return !!brandingCssVars['brand-logo-img'];
|
|
7312
|
+
}
|
|
7313
|
+
/**
|
|
7314
|
+
* Determines if tracking is disabled based on the application options.
|
|
7315
|
+
* @returns `true` if tracking is disabled, otherwise `false`.
|
|
7316
|
+
*/
|
|
7317
|
+
isTrackingDisabled() {
|
|
7318
|
+
return this.options.disableTracking === true;
|
|
7212
7319
|
}
|
|
7213
7320
|
prepareEventName(baseEventName) {
|
|
7214
7321
|
return baseEventName
|
|
@@ -7219,14 +7326,6 @@ class GainsightService {
|
|
|
7219
7326
|
return eventNamePart.replace(/`[\w\W]*`/g, '');
|
|
7220
7327
|
}
|
|
7221
7328
|
}
|
|
7222
|
-
isGainsightDisabled(customProperties) {
|
|
7223
|
-
const gainsightEnabled = customProperties && customProperties.gainsightEnabled;
|
|
7224
|
-
return gainsightEnabled === false;
|
|
7225
|
-
}
|
|
7226
|
-
isCustomBranding() {
|
|
7227
|
-
const brandingCssVars = this.options.get('brandingCssVars') || {};
|
|
7228
|
-
return !!brandingCssVars['brand-logo-img'];
|
|
7229
|
-
}
|
|
7230
7329
|
loadScriptTag(scriptTag, key) {
|
|
7231
7330
|
try {
|
|
7232
7331
|
const windowRef = window;
|
|
@@ -7289,19 +7388,14 @@ class GainsightService {
|
|
|
7289
7388
|
return enTranslation;
|
|
7290
7389
|
}
|
|
7291
7390
|
}
|
|
7292
|
-
GainsightService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: GainsightService, deps: [{ token:
|
|
7391
|
+
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 });
|
|
7293
7392
|
GainsightService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: GainsightService, providedIn: 'root' });
|
|
7294
7393
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: GainsightService, decorators: [{
|
|
7295
7394
|
type: Injectable,
|
|
7296
7395
|
args: [{
|
|
7297
7396
|
providedIn: 'root'
|
|
7298
7397
|
}]
|
|
7299
|
-
}], ctorParameters: function () {
|
|
7300
|
-
return [{ type: DOCUMENT, decorators: [{
|
|
7301
|
-
type: Inject,
|
|
7302
|
-
args: [DOCUMENT]
|
|
7303
|
-
}] }, { type: AppStateService }, { type: OptionsService }, { type: CookieBannerService }, { type: UserPreferencesService }, { type: i1$3.TranslateService }];
|
|
7304
|
-
} });
|
|
7398
|
+
}], ctorParameters: function () { return [{ type: AppStateService }, { type: OptionsService }, { type: CookieBannerService }, { type: UserPreferencesService }, { type: i1$3.TranslateService }]; } });
|
|
7305
7399
|
|
|
7306
7400
|
/**
|
|
7307
7401
|
* This component is used as the outlet to show the action bars.
|
|
@@ -7364,15 +7458,17 @@ class ActionBarComponent {
|
|
|
7364
7458
|
return;
|
|
7365
7459
|
}
|
|
7366
7460
|
const element = event.closest('[px-event]') || event.closest('[title]') || event.closest('[uib-tooltip]');
|
|
7367
|
-
if (!element) {
|
|
7461
|
+
if (!element || element.getAttribute('disabled')) {
|
|
7368
7462
|
return;
|
|
7369
7463
|
}
|
|
7370
|
-
const
|
|
7464
|
+
const itemName = element.getAttribute('px-event') ||
|
|
7371
7465
|
element.getAttribute('title') ||
|
|
7372
7466
|
element.getAttribute('uib-tooltip');
|
|
7373
|
-
const
|
|
7374
|
-
this.gainsightService.triggerEvent(
|
|
7375
|
-
|
|
7467
|
+
const translatedItemName = this.gainsightService.translateToEnglish(itemName);
|
|
7468
|
+
this.gainsightService.triggerEvent(PRODUCT_EXPERIENCE.ACTION_BAR.EVENTS.ACTION_BAR_ITEM, {
|
|
7469
|
+
component: PRODUCT_EXPERIENCE.ACTION_BAR.COMPONENTS.ACTION_BAR_COMPONENT,
|
|
7470
|
+
action: `${translatedItemName}`,
|
|
7471
|
+
url: location.href
|
|
7376
7472
|
});
|
|
7377
7473
|
}
|
|
7378
7474
|
ngOnInit() {
|
|
@@ -12333,6 +12429,173 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.6", ngImpor
|
|
|
12333
12429
|
type: Injectable
|
|
12334
12430
|
}], ctorParameters: function () { return [{ type: i1$8.BsModalService }]; } });
|
|
12335
12431
|
|
|
12432
|
+
class UserEngagementsService {
|
|
12433
|
+
constructor(document, userPreferencesService, gainsightService) {
|
|
12434
|
+
this.document = document;
|
|
12435
|
+
this.userPreferencesService = userPreferencesService;
|
|
12436
|
+
this.gainsightService = gainsightService;
|
|
12437
|
+
this.USER_PREFERENCES_GAINSIGHT_ENGAGEMENTS_KEY = 'gainsightBotEnabled';
|
|
12438
|
+
this.userEngagementsEnabled$ = new BehaviorSubject(false);
|
|
12439
|
+
this.HIDE_GAINSIGHT_BOT_STYLE_ID = 'hide-gs-bot';
|
|
12440
|
+
this.ENGAGEMENTS = 'engagements';
|
|
12441
|
+
this.handleUserEngagements();
|
|
12442
|
+
}
|
|
12443
|
+
/**
|
|
12444
|
+
* Handles user engagement settings based on various conditions.
|
|
12445
|
+
*
|
|
12446
|
+
* - Waits for the Gainsight tracking to be loaded.
|
|
12447
|
+
* - Retrieves the engagement settings.
|
|
12448
|
+
* - Updates the engagement settings based on the combined observations.
|
|
12449
|
+
* - Finally, toggles the Gainsight engagements based on the latest `userEngagementsEnabled$` value.
|
|
12450
|
+
*/
|
|
12451
|
+
handleUserEngagements() {
|
|
12452
|
+
this.gainsightService.trackingLoaded$
|
|
12453
|
+
.pipe(take(1), switchMap(() => this.getEngagementSettingsObservable()), tap((settings) => this.updateUserEngagementSettings(...settings)), switchMap(() => this.userEngagementsEnabled$.pipe(take(1))))
|
|
12454
|
+
.subscribe(isEnabled => this.toggleGainsightEngagements(isEnabled));
|
|
12455
|
+
}
|
|
12456
|
+
/**
|
|
12457
|
+
* Updates the user's preference for Gainsight Engagements.
|
|
12458
|
+
* @param {boolean} isEnabled - The new value for the user's engagement preference.
|
|
12459
|
+
*/
|
|
12460
|
+
updateUserEngagementPreference(isEnabled) {
|
|
12461
|
+
this.userEngagementsEnabled$.next(isEnabled);
|
|
12462
|
+
this.userPreferencesService.set(this.gainsightService.USER_PREFERENCES_GAINSIGHT_ENGAGEMENTS_KEY, this.userEngagementsEnabled$.value);
|
|
12463
|
+
}
|
|
12464
|
+
/**
|
|
12465
|
+
* Toggles the visibility of Gainsight Engagements based on the provided flag.
|
|
12466
|
+
*
|
|
12467
|
+
* @param isEnabled - A flag indicating whether Gainsight Engagements should be visible.
|
|
12468
|
+
*/
|
|
12469
|
+
toggleGainsightEngagements(isEnabled) {
|
|
12470
|
+
isEnabled ? this.showGainsightEngagements() : this.hideGainsightEngagements();
|
|
12471
|
+
}
|
|
12472
|
+
/**
|
|
12473
|
+
* Constructs an observable that emits an array of boolean values representing
|
|
12474
|
+
* the current engagement settings. The observable combines the latest values from:
|
|
12475
|
+
*
|
|
12476
|
+
* 1. User's preferences for Gainsight engagements.
|
|
12477
|
+
* 2. A flag indicating if PII data should be sent.
|
|
12478
|
+
* 3. A flag indicating if the platform uses custom branding.
|
|
12479
|
+
*
|
|
12480
|
+
* @returns An observable emitting an array of boolean values.
|
|
12481
|
+
*/
|
|
12482
|
+
getEngagementSettingsObservable() {
|
|
12483
|
+
return combineLatest([
|
|
12484
|
+
this.userPreferencesService.observe(this.USER_PREFERENCES_GAINSIGHT_ENGAGEMENTS_KEY),
|
|
12485
|
+
from(this.gainsightService.shouldSendPiiData()),
|
|
12486
|
+
of(this.gainsightService.isCustomBranding())
|
|
12487
|
+
]);
|
|
12488
|
+
}
|
|
12489
|
+
/**
|
|
12490
|
+
* Updates user engagement settings based on provided preferences and settings.
|
|
12491
|
+
*
|
|
12492
|
+
* Based on the received values, the method decides to:
|
|
12493
|
+
* 1. Disable user engagements if PII data should not be shared or certain branding/settings conditions are met.
|
|
12494
|
+
* 2. Update the user engagement preference if the user engagement bot setting is undefined.
|
|
12495
|
+
*
|
|
12496
|
+
* @param userEngagementBotSetting - The user's setting for the engagement bot.
|
|
12497
|
+
* @param shouldSendPiiData - Indicates whether PII data should be shared.
|
|
12498
|
+
* @param hasCustomBranding - Indicates if custom branding is applied.
|
|
12499
|
+
*/
|
|
12500
|
+
updateUserEngagementSettings(userEngagementBotSetting, shouldSendPiiData, hasCustomBranding) {
|
|
12501
|
+
if (this.shouldDisableUserEngagementsDueToPIIData(shouldSendPiiData)) {
|
|
12502
|
+
this.userEngagementsEnabled$.next(false);
|
|
12503
|
+
}
|
|
12504
|
+
else if (this.isUserEngagementBotSettingUndefined(userEngagementBotSetting)) {
|
|
12505
|
+
/**
|
|
12506
|
+
* Case where the user is new (freshly created) and has not changed the user engagement settings in the user edit modal (untouched state).
|
|
12507
|
+
* When custom branding is not set, we will set the user engagements in the user preferences to true by default.
|
|
12508
|
+
*/
|
|
12509
|
+
this.updateUserEngagementPreference(!hasCustomBranding);
|
|
12510
|
+
}
|
|
12511
|
+
else {
|
|
12512
|
+
this.userEngagementsEnabled$.next(userEngagementBotSetting);
|
|
12513
|
+
}
|
|
12514
|
+
}
|
|
12515
|
+
/**
|
|
12516
|
+
* Determines whether user engagements should be disabled due to PII data settings.
|
|
12517
|
+
*
|
|
12518
|
+
* If the `shouldSendPiiData` parameter is false, this indicates that the user engagements
|
|
12519
|
+
* should be disabled to prevent sharing personally identifiable information.
|
|
12520
|
+
*
|
|
12521
|
+
* @param {boolean} shouldSendPiiData - Indicates whether PII data is allowed to be sent.
|
|
12522
|
+
* @returns {boolean} Returns true if user engagements should be disabled, otherwise false.
|
|
12523
|
+
*/
|
|
12524
|
+
shouldDisableUserEngagementsDueToPIIData(shouldSendPiiData) {
|
|
12525
|
+
return !shouldSendPiiData;
|
|
12526
|
+
}
|
|
12527
|
+
/**
|
|
12528
|
+
* Determines if the user engagement bot setting is undefined.
|
|
12529
|
+
*
|
|
12530
|
+
* @param {boolean | undefined} userEngagementBotSetting - The setting value to check.
|
|
12531
|
+
* @returns {boolean} Returns `true` if the setting is undefined; otherwise, `false`.
|
|
12532
|
+
*
|
|
12533
|
+
* This scenario occurs when a user is new and hasn't modified the bot settings in the user details UI yet.
|
|
12534
|
+
*/
|
|
12535
|
+
isUserEngagementBotSettingUndefined(userEngagementBotSetting) {
|
|
12536
|
+
return userEngagementBotSetting === undefined;
|
|
12537
|
+
}
|
|
12538
|
+
/**
|
|
12539
|
+
* Enables the visibility of Gainsight engagements.
|
|
12540
|
+
*
|
|
12541
|
+
* This method removes the CSS styles that hide the Gainsight engagements
|
|
12542
|
+
* and updates the relevant user attribute to mark the engagements as visible.
|
|
12543
|
+
*/
|
|
12544
|
+
showGainsightEngagements() {
|
|
12545
|
+
this.removeHidingStyle(this.HIDE_GAINSIGHT_BOT_STYLE_ID);
|
|
12546
|
+
this.gainsightService.updateUserAttribute(this.ENGAGEMENTS, true);
|
|
12547
|
+
}
|
|
12548
|
+
/**
|
|
12549
|
+
* Hides the Gainsight engagements.
|
|
12550
|
+
*
|
|
12551
|
+
* This method applies CSS styles to hide the Gainsight engagements
|
|
12552
|
+
* and updates the relevant user attribute to mark the engagements as hidden.
|
|
12553
|
+
*/
|
|
12554
|
+
hideGainsightEngagements() {
|
|
12555
|
+
this.addHidingStyle(this.HIDE_GAINSIGHT_BOT_STYLE_ID, '#apt-widget { display:none }');
|
|
12556
|
+
this.gainsightService.updateUserAttribute(this.ENGAGEMENTS, false);
|
|
12557
|
+
}
|
|
12558
|
+
/**
|
|
12559
|
+
* Removes the specified CSS style from the document.
|
|
12560
|
+
*
|
|
12561
|
+
* @param {string} styleId - The ID of the CSS style element to remove.
|
|
12562
|
+
*/
|
|
12563
|
+
removeHidingStyle(styleId) {
|
|
12564
|
+
const style = this.document.getElementById(styleId);
|
|
12565
|
+
style === null || style === void 0 ? void 0 : style.remove();
|
|
12566
|
+
}
|
|
12567
|
+
/**
|
|
12568
|
+
* Adds a new CSS style to the document.
|
|
12569
|
+
*
|
|
12570
|
+
* If the style with the specified ID already exists, the method will do nothing.
|
|
12571
|
+
* Otherwise, it creates a new `<style>` element with the given ID and content,
|
|
12572
|
+
* then appends it to the document head.
|
|
12573
|
+
*
|
|
12574
|
+
* @param {string} styleId - The ID to assign to the new style element.
|
|
12575
|
+
* @param {string} textContent - The CSS rules to be included in the style.
|
|
12576
|
+
*/
|
|
12577
|
+
addHidingStyle(styleId, textContent) {
|
|
12578
|
+
if (this.document.getElementById(styleId)) {
|
|
12579
|
+
return;
|
|
12580
|
+
}
|
|
12581
|
+
const style = this.document.createElement('style');
|
|
12582
|
+
style.id = styleId;
|
|
12583
|
+
style.textContent = textContent;
|
|
12584
|
+
this.document.head.appendChild(style);
|
|
12585
|
+
}
|
|
12586
|
+
}
|
|
12587
|
+
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 });
|
|
12588
|
+
UserEngagementsService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: UserEngagementsService, providedIn: 'root' });
|
|
12589
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: UserEngagementsService, decorators: [{
|
|
12590
|
+
type: Injectable,
|
|
12591
|
+
args: [{ providedIn: 'root' }]
|
|
12592
|
+
}], ctorParameters: function () {
|
|
12593
|
+
return [{ type: DOCUMENT, decorators: [{
|
|
12594
|
+
type: Inject,
|
|
12595
|
+
args: [DOCUMENT]
|
|
12596
|
+
}] }, { type: UserPreferencesService }, { type: GainsightService }];
|
|
12597
|
+
} });
|
|
12598
|
+
|
|
12336
12599
|
class TotpChallengeComponent {
|
|
12337
12600
|
constructor(loginService, users, alert) {
|
|
12338
12601
|
this.loginService = loginService;
|
|
@@ -12731,7 +12994,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.6", ngImpor
|
|
|
12731
12994
|
}] } });
|
|
12732
12995
|
|
|
12733
12996
|
class UserEditComponent {
|
|
12734
|
-
constructor(state, translate, bsModalService, alert, userService, tenantLoginOptionsService, tenantService
|
|
12997
|
+
constructor(state, translate, bsModalService, alert, userService, tenantLoginOptionsService, tenantService) {
|
|
12735
12998
|
this.state = state;
|
|
12736
12999
|
this.translate = translate;
|
|
12737
13000
|
this.bsModalService = bsModalService;
|
|
@@ -12739,17 +13002,15 @@ class UserEditComponent {
|
|
|
12739
13002
|
this.userService = userService;
|
|
12740
13003
|
this.tenantLoginOptionsService = tenantLoginOptionsService;
|
|
12741
13004
|
this.tenantService = tenantService;
|
|
12742
|
-
this.userPreferencesService = userPreferencesService;
|
|
12743
|
-
this.gainsightService = gainsightService;
|
|
12744
13005
|
this.loading = false;
|
|
12745
|
-
this.
|
|
13006
|
+
this.showProductExperienceOptions = false;
|
|
12746
13007
|
this.isUsageTrackingEnabled = true;
|
|
12747
|
-
this.
|
|
13008
|
+
this.isUserEngagementPreferenceEnabled = true;
|
|
12748
13009
|
this.onUser = new EventEmitter();
|
|
12749
|
-
this.
|
|
12750
|
-
this.
|
|
12751
|
-
this.onGainsightEngagements = new EventEmitter();
|
|
13010
|
+
this.onUsageTrackingChange = new EventEmitter();
|
|
13011
|
+
this.onUserEngagementPreferenceChange = new EventEmitter();
|
|
12752
13012
|
this.onCancel = new EventEmitter();
|
|
13013
|
+
this.onLanguage = new EventEmitter();
|
|
12753
13014
|
this.userHasActiveTotp = false;
|
|
12754
13015
|
this.userCanSetupTotp = false;
|
|
12755
13016
|
this.isPhoneRequired = false;
|
|
@@ -12775,18 +13036,6 @@ class UserEditComponent {
|
|
|
12775
13036
|
}
|
|
12776
13037
|
});
|
|
12777
13038
|
}
|
|
12778
|
-
onEnablingProductUsageTracking(isUsageTrackingEnabled) {
|
|
12779
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
12780
|
-
if (isUsageTrackingEnabled && this.isGainsightEngagementsEnabled === undefined) {
|
|
12781
|
-
this.isGainsightEngagementsEnabled = yield this.userPreferencesService
|
|
12782
|
-
.get(this.gainsightService.USER_PREFERENCES_GAINSIGHT_ENGAGEMENTS_KEY)
|
|
12783
|
-
.toPromise();
|
|
12784
|
-
}
|
|
12785
|
-
});
|
|
12786
|
-
}
|
|
12787
|
-
get langs() {
|
|
12788
|
-
return this.state.state.langs;
|
|
12789
|
-
}
|
|
12790
13039
|
setupTotp() {
|
|
12791
13040
|
this.bsModalService.show(UserTotpSetupComponent, {
|
|
12792
13041
|
class: 'modal-sm',
|
|
@@ -12803,9 +13052,13 @@ class UserEditComponent {
|
|
|
12803
13052
|
if (this.loading) {
|
|
12804
13053
|
return;
|
|
12805
13054
|
}
|
|
12806
|
-
if (this.
|
|
12807
|
-
this.
|
|
12808
|
-
|
|
13055
|
+
if (this.showProductExperienceOptions) {
|
|
13056
|
+
this.onUsageTrackingChange.emit(this.isUsageTrackingEnabled);
|
|
13057
|
+
/**
|
|
13058
|
+
* Emits a user engagement preference change event.
|
|
13059
|
+
* If usage tracking is disabled, it emits `false`. Otherwise, it emits the current state of the user engagement preference.
|
|
13060
|
+
*/
|
|
13061
|
+
this.onUserEngagementPreferenceChange.emit(this.isUsageTrackingEnabled === false ? false : this.isUserEngagementPreferenceEnabled);
|
|
12809
13062
|
}
|
|
12810
13063
|
this.onUser.emit(this._user);
|
|
12811
13064
|
});
|
|
@@ -12813,6 +13066,9 @@ class UserEditComponent {
|
|
|
12813
13066
|
onNewPasswordChanged(newPassword) {
|
|
12814
13067
|
this._user.password = newPassword.password;
|
|
12815
13068
|
}
|
|
13069
|
+
get langs() {
|
|
13070
|
+
return this.state.state.langs;
|
|
13071
|
+
}
|
|
12816
13072
|
initializeTotpSettings() {
|
|
12817
13073
|
return __awaiter(this, void 0, void 0, function* () {
|
|
12818
13074
|
try {
|
|
@@ -12835,37 +13091,37 @@ class UserEditComponent {
|
|
|
12835
13091
|
});
|
|
12836
13092
|
}
|
|
12837
13093
|
}
|
|
12838
|
-
UserEditComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: UserEditComponent, deps: [{ token: AppStateService }, { token: TranslateService }, { token: i1$8.BsModalService }, { token: AlertService }, { token: i1$2.UserService }, { token: i1$2.TenantLoginOptionsService }, { token: i1$2.TenantService }
|
|
12839
|
-
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", isGainsightEngagementsEnabled: "isGainsightEngagementsEnabled" }, outputs: { onUser: "onUser", onLanguage: "onLanguage", onProductExperience: "onProductExperience", onGainsightEngagements: "onGainsightEngagements", 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 [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=\"showProductUsageSetting\">\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 (change)=\"onEnablingProductUsageTracking(isUsageTrackingEnabled)\"\n [(ngModel)]=\"isUsageTrackingEnabled\"\n />\n <span></span>\n {{ 'Enable tracking to enhance the product experience' | translate }}\n </label>\n <ng-container *ngIf=\"isUsageTrackingEnabled\">\n <label class=\"c8y-switch m-l-0\" for=\"gainsightEngagements\">\n <input\n id=\"gainsightEngagements\"\n name=\"gainsightEngagements\"\n type=\"checkbox\"\n [(ngModel)]=\"isGainsightEngagementsEnabled\"\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-level-0 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$2.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i2$2.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i2$2.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i2$2.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$2.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i2$2.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i2$2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2$2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2$2.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i2$2.MaxLengthValidator, selector: "[maxlength][formControlName],[maxlength][formControl],[maxlength][ngModel]", inputs: ["maxlength"] }, { kind: "directive", type: i2$2.EmailValidator, selector: "[email][formControlName],[email][formControl],[email][ngModel]", inputs: ["email"] }, { kind: "directive", type: i2$2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i2$2.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.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: NewPasswordComponent, selector: "c8y-new-password", outputs: ["password"] }, { kind: "pipe", type: C8yTranslatePipe, name: "translate" }, { kind: "pipe", type: i2.AsyncPipe, name: "async" }] });
|
|
13094
|
+
UserEditComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: UserEditComponent, deps: [{ token: AppStateService }, { token: TranslateService }, { token: i1$8.BsModalService }, { token: AlertService }, { token: i1$2.UserService }, { token: i1$2.TenantLoginOptionsService }, { token: i1$2.TenantService }], target: i0.ɵɵFactoryTarget.Component });
|
|
13095
|
+
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", onUsageTrackingChange: "onUsageTrackingChange", onUserEngagementPreferenceChange: "onUserEngagementPreferenceChange", onCancel: "onCancel", onLanguage: "onLanguage" }, 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 [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-level-0 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$2.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i2$2.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i2$2.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i2$2.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$2.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i2$2.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i2$2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2$2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2$2.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i2$2.MaxLengthValidator, selector: "[maxlength][formControlName],[maxlength][formControl],[maxlength][ngModel]", inputs: ["maxlength"] }, { kind: "directive", type: i2$2.EmailValidator, selector: "[email][formControlName],[email][formControl],[email][ngModel]", inputs: ["email"] }, { kind: "directive", type: i2$2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i2$2.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.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: NewPasswordComponent, selector: "c8y-new-password", outputs: ["password"] }, { kind: "pipe", type: C8yTranslatePipe, name: "translate" }, { kind: "pipe", type: i2.AsyncPipe, name: "async" }] });
|
|
12840
13096
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: UserEditComponent, decorators: [{
|
|
12841
13097
|
type: Component,
|
|
12842
|
-
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 [required]=\"isPhoneRequired\"\n [disabled]=\"userIsExternal\"\n />\n </c8y-form-group>\n\n
|
|
12843
|
-
}], ctorParameters: function () { return [{ type: AppStateService }, { type: TranslateService }, { type: i1$8.BsModalService }, { type: AlertService }, { type: i1$2.UserService }, { type: i1$2.TenantLoginOptionsService }, { type: i1$2.TenantService }
|
|
13098
|
+
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 [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-level-0 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" }]
|
|
13099
|
+
}], ctorParameters: function () { return [{ type: AppStateService }, { type: TranslateService }, { type: i1$8.BsModalService }, { type: AlertService }, { type: i1$2.UserService }, { type: i1$2.TenantLoginOptionsService }, { type: i1$2.TenantService }]; }, propDecorators: { lang: [{
|
|
12844
13100
|
type: Input
|
|
12845
13101
|
}], loading: [{
|
|
12846
13102
|
type: Input
|
|
12847
13103
|
}], user: [{
|
|
12848
13104
|
type: Input
|
|
12849
|
-
}],
|
|
13105
|
+
}], showProductExperienceOptions: [{
|
|
12850
13106
|
type: Input
|
|
12851
13107
|
}], isUsageTrackingEnabled: [{
|
|
12852
13108
|
type: Input
|
|
12853
|
-
}],
|
|
13109
|
+
}], isUserEngagementPreferenceEnabled: [{
|
|
12854
13110
|
type: Input
|
|
12855
13111
|
}], onUser: [{
|
|
12856
13112
|
type: Output
|
|
12857
|
-
}],
|
|
12858
|
-
type: Output
|
|
12859
|
-
}], onProductExperience: [{
|
|
13113
|
+
}], onUsageTrackingChange: [{
|
|
12860
13114
|
type: Output
|
|
12861
|
-
}],
|
|
13115
|
+
}], onUserEngagementPreferenceChange: [{
|
|
12862
13116
|
type: Output
|
|
12863
13117
|
}], onCancel: [{
|
|
12864
13118
|
type: Output
|
|
13119
|
+
}], onLanguage: [{
|
|
13120
|
+
type: Output
|
|
12865
13121
|
}] } });
|
|
12866
13122
|
|
|
12867
13123
|
class UserEditModalComponent {
|
|
12868
|
-
constructor(modal, user, ui, auth, client, alert, translate, userPreferences, c8yModalService, gainsightService, cookieBannerService, loginService, passwordService) {
|
|
13124
|
+
constructor(modal, user, ui, auth, client, alert, translate, userPreferences, c8yModalService, gainsightService, cookieBannerService, loginService, passwordService, userEngagementsService) {
|
|
12869
13125
|
this.modal = modal;
|
|
12870
13126
|
this.user = user;
|
|
12871
13127
|
this.ui = ui;
|
|
@@ -12879,21 +13135,37 @@ class UserEditModalComponent {
|
|
|
12879
13135
|
this.cookieBannerService = cookieBannerService;
|
|
12880
13136
|
this.loginService = loginService;
|
|
12881
13137
|
this.passwordService = passwordService;
|
|
13138
|
+
this.userEngagementsService = userEngagementsService;
|
|
12882
13139
|
this.loading = false;
|
|
12883
|
-
this.
|
|
13140
|
+
this.showProductExperienceOptions = false;
|
|
12884
13141
|
this.lang = this.ui.state.lang;
|
|
12885
13142
|
}
|
|
12886
13143
|
ngOnInit() {
|
|
12887
13144
|
return __awaiter(this, void 0, void 0, function* () {
|
|
12888
13145
|
this.updateUserInAppState();
|
|
12889
|
-
|
|
12890
|
-
|
|
12891
|
-
|
|
12892
|
-
|
|
12893
|
-
|
|
12894
|
-
|
|
12895
|
-
|
|
12896
|
-
|
|
13146
|
+
yield this.setInitialProductExperienceOptions();
|
|
13147
|
+
});
|
|
13148
|
+
}
|
|
13149
|
+
/**
|
|
13150
|
+
* Initializes product experience options for the user.
|
|
13151
|
+
*
|
|
13152
|
+
* This function performs the following operations:
|
|
13153
|
+
* - Determines if the user has the permission to edit product experience options.
|
|
13154
|
+
* - If the user has the permission and functional cookies are enabled:
|
|
13155
|
+
* - Checks whether personalized product experience tracking is active.
|
|
13156
|
+
* - Checks whether in-product information and communication is active.
|
|
13157
|
+
*/
|
|
13158
|
+
setInitialProductExperienceOptions() {
|
|
13159
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
13160
|
+
this.showProductExperienceOptions =
|
|
13161
|
+
yield this.gainsightService.canEditProductExperienceSettings();
|
|
13162
|
+
if (this.showProductExperienceOptions && this.cookieBannerService.isFunctionalCookieEnabled()) {
|
|
13163
|
+
// Enable personalized product experience tracking option
|
|
13164
|
+
this.currentUsageTrackingState =
|
|
13165
|
+
!(yield this.gainsightService.isGainsightPreferenceDisabledInUserPreferences(this.gainsightService.USER_PREFERENCES_GAINSIGHT_KEY));
|
|
13166
|
+
// Enable in-product information & communication option
|
|
13167
|
+
this.currentUserEngagementPreferenceInitialState =
|
|
13168
|
+
this.userEngagementsService.userEngagementsEnabled$.value;
|
|
12897
13169
|
}
|
|
12898
13170
|
});
|
|
12899
13171
|
}
|
|
@@ -12911,11 +13183,11 @@ class UserEditModalComponent {
|
|
|
12911
13183
|
yield this.translate.switchToLanguage(this.changedLang);
|
|
12912
13184
|
});
|
|
12913
13185
|
}
|
|
12914
|
-
|
|
12915
|
-
this.usageTrackingState =
|
|
13186
|
+
onUsageTrackingChange(isEnabled) {
|
|
13187
|
+
this.usageTrackingState = isEnabled;
|
|
12916
13188
|
}
|
|
12917
|
-
|
|
12918
|
-
this.
|
|
13189
|
+
onUserEngagementPreferenceChange(isEnabled) {
|
|
13190
|
+
this.userEngagementPreferenceNewState = isEnabled;
|
|
12919
13191
|
}
|
|
12920
13192
|
updateAndClose(user) {
|
|
12921
13193
|
return __awaiter(this, void 0, void 0, function* () {
|
|
@@ -12938,16 +13210,7 @@ class UserEditModalComponent {
|
|
|
12938
13210
|
if (this.changedLang && this.changedLang !== this.lang) {
|
|
12939
13211
|
reloadRequired = yield this.persistLanguage(this.changedLang);
|
|
12940
13212
|
}
|
|
12941
|
-
|
|
12942
|
-
yield this.userPreferences.set(this.gainsightService.USER_PREFERENCES_GAINSIGHT_ENGAGEMENTS_KEY, this.gainsightEngagementsState);
|
|
12943
|
-
}
|
|
12944
|
-
if (this.currentUsageTrackingState !== this.usageTrackingState) {
|
|
12945
|
-
yield this.userPreferences.set(this.gainsightService.USER_PREFERENCES_GAINSIGHT_KEY, this.usageTrackingState);
|
|
12946
|
-
this.gainsightService.setFunctionalCookie(this.usageTrackingState);
|
|
12947
|
-
this.usageTrackingState
|
|
12948
|
-
? yield this.gainsightService.loadTag(this.client.tenant)
|
|
12949
|
-
: yield this.gainsightTrackingAppReload();
|
|
12950
|
-
}
|
|
13213
|
+
yield this.updateProductExperienceOptions();
|
|
12951
13214
|
if (user.customProperties.userOrigin !== 'OAUTH2') {
|
|
12952
13215
|
yield this.user.updateCurrent(omit(user, 'password'));
|
|
12953
13216
|
yield this.updateUserInAppState();
|
|
@@ -13004,6 +13267,38 @@ class UserEditModalComponent {
|
|
|
13004
13267
|
}
|
|
13005
13268
|
});
|
|
13006
13269
|
}
|
|
13270
|
+
updateProductExperienceOptions() {
|
|
13271
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
13272
|
+
this.updateUserEngagementsPreference();
|
|
13273
|
+
yield this.updateTrackingOption();
|
|
13274
|
+
});
|
|
13275
|
+
}
|
|
13276
|
+
/**
|
|
13277
|
+
* Updates the user engagement preference if it has changed from the initial state.
|
|
13278
|
+
* Calls the user engagements service to update the preference.
|
|
13279
|
+
*
|
|
13280
|
+
* The update only occurs if the current preference differs from the new state.
|
|
13281
|
+
*/
|
|
13282
|
+
updateUserEngagementsPreference() {
|
|
13283
|
+
if (this.currentUserEngagementPreferenceInitialState !== this.userEngagementPreferenceNewState) {
|
|
13284
|
+
this.userEngagementsService.updateUserEngagementPreference(this.userEngagementPreferenceNewState);
|
|
13285
|
+
}
|
|
13286
|
+
}
|
|
13287
|
+
/**
|
|
13288
|
+
* Asynchronously updates the tracking option for user preferences.
|
|
13289
|
+
* If the current usage tracking state differs from the new state,
|
|
13290
|
+
* it updates the Gainsight preferences and sets a functional cookie
|
|
13291
|
+
* before triggering a reload of the application.
|
|
13292
|
+
*/
|
|
13293
|
+
updateTrackingOption() {
|
|
13294
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
13295
|
+
if (this.currentUsageTrackingState !== this.usageTrackingState) {
|
|
13296
|
+
yield this.userPreferences.set(this.gainsightService.USER_PREFERENCES_GAINSIGHT_KEY, this.usageTrackingState);
|
|
13297
|
+
this.gainsightService.setFunctionalCookie(this.usageTrackingState);
|
|
13298
|
+
yield this.gainsightTrackingAppReload();
|
|
13299
|
+
}
|
|
13300
|
+
});
|
|
13301
|
+
}
|
|
13007
13302
|
updateUserInAppState() {
|
|
13008
13303
|
return __awaiter(this, void 0, void 0, function* () {
|
|
13009
13304
|
const currentUserResult = yield this.user.current();
|
|
@@ -13019,12 +13314,12 @@ class UserEditModalComponent {
|
|
|
13019
13314
|
this.auth.updateCredentials(newCredentials);
|
|
13020
13315
|
}
|
|
13021
13316
|
}
|
|
13022
|
-
UserEditModalComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: UserEditModalComponent, deps: [{ token: i1$8.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 }], target: i0.ɵɵFactoryTarget.Component });
|
|
13023
|
-
UserEditModalComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.0.6", type: UserEditModalComponent, selector: "c8y-user-edit-modal", ngImport: i0, template: "<c8y-modal
|
|
13317
|
+
UserEditModalComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: UserEditModalComponent, deps: [{ token: i1$8.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 });
|
|
13318
|
+
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", "onUsageTrackingChange", "onUserEngagementPreferenceChange", "onCancel", "onLanguage"] }, { kind: "pipe", type: C8yTranslatePipe, name: "translate" }, { kind: "pipe", type: i2.AsyncPipe, name: "async" }] });
|
|
13024
13319
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: UserEditModalComponent, decorators: [{
|
|
13025
13320
|
type: Component,
|
|
13026
|
-
args: [{ selector: 'c8y-user-edit-modal', template: "<c8y-modal
|
|
13027
|
-
}], ctorParameters: function () { return [{ type: i1$8.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 }]; } });
|
|
13321
|
+
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" }]
|
|
13322
|
+
}], ctorParameters: function () { return [{ type: i1$8.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 }]; } });
|
|
13028
13323
|
|
|
13029
13324
|
class UserMenuItemComponent {
|
|
13030
13325
|
constructor(userService) {
|
|
@@ -13549,6 +13844,7 @@ class RightDrawerComponent {
|
|
|
13549
13844
|
this.appState = appState;
|
|
13550
13845
|
this.userMenuService = userMenuService;
|
|
13551
13846
|
this.options = options;
|
|
13847
|
+
this.PRODUCT_EXPERIENCE = PRODUCT_EXPERIENCE;
|
|
13552
13848
|
this.closeDrawer = new EventEmitter();
|
|
13553
13849
|
this.quickLinks = [];
|
|
13554
13850
|
this.helpAndSupport = [];
|
|
@@ -13578,10 +13874,10 @@ class RightDrawerComponent {
|
|
|
13578
13874
|
}
|
|
13579
13875
|
}
|
|
13580
13876
|
RightDrawerComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: RightDrawerComponent, deps: [{ token: AppStateService }, { token: UserMenuService }, { token: OptionsService }], target: i0.ɵɵFactoryTarget.Component });
|
|
13581
|
-
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" }, outputs: { closeDrawer: "closeDrawer" }, ngImport: i0, template: "<aside class=\"c8y-right-drawer\" [cdkTrapFocus]=\"drawerOpen\">\n<!-- drawer header -->\n <div class=\"c8y-right-drawer__header separator-bottom\">\n <button type=\"button\" class=\"close\" title=\"{{'Close' | translate}}\" (click)=\"close()\">×</button>\n <div class=\"d-flex a-i-center\">\n <div class=\"user-dot\"> {{appState.currentUser | async | userNameInitials}}</div>\n <div class=\"min-width-0\">\n <p\n *ngIf=\"appState.currentUser | async\"\n class=\"text-truncate text-medium text-16\"\n title=\"{{appState.currentUser | async | shortenUserName}}\"\n >\n {{appState.currentUser | async | shortenUserName}}\n </p>\n <small *ngIf=\"appState.currentUser | async | userRolesList as userRoles\" [title]=\"userRoles\" class=\"text-truncate\">{{ userRoles }}</small>\n </div>\n </div>\n </div>\n\n <!-- user menu -->\n <c8y-user-menu-outlet\n [items]=\"(userMenuService.items$ | async)\"\n class=\"c8y-right-drawer__container\"\n ></c8y-user-menu-outlet>\n\n <!-- Version list -->\n <c8y-version-list *ngIf=\"showPlatformInformation\"></c8y-version-list>\n\n<!-- quicklinks > bookmarks -->\n <div *ngIf=\"(appState$ | async).showRightDrawer && quickLinks.length\"\n class=\"separator-top p-t-8 p-b-8\">\n <div class=\"c8y-right-drawer__item sticky-top\">\n <i c8yIcon=\"bookmark\"></i>\n <span class=\"text-bold\">{{ 'Quick links' | translate }}</span>\n </div>\n\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 title=\"{{ quickLink.label | translate }}\"\n type=\"button\"\n class=\"c8y-right-drawer__link\"\n [href]=\"quickLink.url || '#'\"\n (click)=\"quickLink.click && $event.preventDefault(); quickLink.click && quickLink.click()\"\n c8yProductExperience\n [actionName]=\"
|
|
13877
|
+
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" }, outputs: { closeDrawer: "closeDrawer" }, ngImport: i0, template: "<aside class=\"c8y-right-drawer\" [cdkTrapFocus]=\"drawerOpen\">\n<!-- drawer header -->\n <div class=\"c8y-right-drawer__header separator-bottom\">\n <button type=\"button\" class=\"close\" title=\"{{'Close' | translate}}\" (click)=\"close()\">×</button>\n <div class=\"d-flex a-i-center\">\n <div class=\"user-dot\"> {{appState.currentUser | async | userNameInitials}}</div>\n <div class=\"min-width-0\">\n <p\n *ngIf=\"appState.currentUser | async\"\n class=\"text-truncate text-medium text-16\"\n title=\"{{appState.currentUser | async | shortenUserName}}\"\n >\n {{appState.currentUser | async | shortenUserName}}\n </p>\n <small *ngIf=\"appState.currentUser | async | userRolesList as userRoles\" [title]=\"userRoles\" class=\"text-truncate\">{{ userRoles }}</small>\n </div>\n </div>\n </div>\n\n <!-- user menu -->\n <c8y-user-menu-outlet\n [items]=\"(userMenuService.items$ | async)\"\n class=\"c8y-right-drawer__container\"\n ></c8y-user-menu-outlet>\n\n <!-- Version list -->\n <c8y-version-list *ngIf=\"showPlatformInformation\"></c8y-version-list>\n\n<!-- quicklinks > bookmarks -->\n <div *ngIf=\"(appState$ | async).showRightDrawer && quickLinks.length\"\n class=\"separator-top p-t-8 p-b-8\">\n <div class=\"c8y-right-drawer__item sticky-top\">\n <i c8yIcon=\"bookmark\"></i>\n <span class=\"text-bold\">{{ 'Quick links' | translate }}</span>\n </div>\n\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 title=\"{{ quickLink.label | translate }}\"\n type=\"button\"\n class=\"c8y-right-drawer__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 tabindex=\"{{ drawerOpen ? '0' : '-1' }}\"\n >\n <i *ngIf=\"quickLink.icon\" class=\"{{ quickLink.icon }} c8y-icon-duocolor\"></i>\n <img\n *ngIf=\"quickLink.iconSrc\"\n [src]=\"quickLink.iconSrc\"\n style=\"max-width: 20px\"\n class=\"img-responsive\"\n onerror=\"this.style.display = 'none'\"\n />\n <span>{{ quickLink.label | translate }}</span>\n </a>\n </ng-container>\n\n </div>\n\n <div *ngIf=\"(appState$ | async).showRightDrawer && helpAndSupport.length\"\n class=\"separator-top p-t-8 p-b-8\">\n <button type=\"button\" class=\"c8y-right-drawer__link sticky-top\" (click)=\"documentationOpen = !documentationOpen\"\n [attr.aria-expanded]=\"!documentationCol.isCollapsed\" [attr.aria-controls]=\"'collapseDocs'\">\n <i c8yIcon=\"book-shelf\"></i>\n <span class=\"text-bold\">{{ 'Documentation' | translate }}</span>\n <i c8yIcon=\"angle-down\" class=\"m-l-auto\" [ngClass]=\"{'icon-rotate-180': documentationOpen }\"></i>\n </button>\n <div class=\"collapse\" id=\"collapseDocs\" [collapse]=\"!documentationOpen\" [isAnimated]=\"true\" #documentationCol=\"bs-collapse\">\n <ng-container *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 title=\"{{ link.label | translate }}\"\n type=\"button\"\n class=\"c8y-right-drawer__link\"\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 tabindex=\"{{ drawerOpen ? '0' : '-1' }}\"\n >\n <span title=\"{{ link.label | translate }}\" class=\"text-truncate text-12\">\n {{ link.label | translate }}\n </span>\n </a>\n </ng-container>\n </div>\n </div>\n\n <!-- TODO: move legal notices here -->\n <!-- <div class=\"separator-top p-t-8 m-t-auto\">\n <a href=\"#\" class=\"c8y-right-drawer__link\">\n <small>Legal notices</small>\n </a>\n </div> -->\n</aside>\n", dependencies: [{ kind: "directive", type: i4.CdkTrapFocus, selector: "[cdkTrapFocus]", inputs: ["cdkTrapFocus", "cdkTrapFocusAutoCapture"], exportAs: ["cdkTrapFocus"] }, { kind: "component", type: UserMenuOutletComponent, selector: "c8y-user-menu-outlet", inputs: ["items"] }, { kind: "directive", type: IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgComponentOutlet, selector: "[ngComponentOutlet]", inputs: ["ngComponentOutlet", "ngComponentOutletInjector", "ngComponentOutletContent", "ngComponentOutletNgModule", "ngComponentOutletNgModuleFactory"] }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: VersionListComponent, selector: "c8y-version-list" }, { kind: "directive", type: i1$9.CollapseDirective, selector: "[collapse]", inputs: ["display", "isAnimated", "collapse"], outputs: ["collapsed", "collapses", "expanded", "expands"], exportAs: ["bs-collapse"] }, { kind: "directive", type: ProductExperienceDirective, selector: "[c8yProductExperience]", inputs: ["actionName", "actionData", "inherit"] }, { kind: "pipe", type: C8yTranslatePipe, name: "translate" }, { kind: "pipe", type: i2.AsyncPipe, name: "async" }, { kind: "pipe", type: ShortenUserNamePipe, name: "shortenUserName" }, { kind: "pipe", type: UserNameInitialsPipe, name: "userNameInitials" }, { kind: "pipe", type: UserRolesListPipe, name: "userRolesList" }] });
|
|
13582
13878
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: RightDrawerComponent, decorators: [{
|
|
13583
13879
|
type: Component,
|
|
13584
|
-
args: [{ selector: 'c8y-right-drawer', template: "<aside class=\"c8y-right-drawer\" [cdkTrapFocus]=\"drawerOpen\">\n<!-- drawer header -->\n <div class=\"c8y-right-drawer__header separator-bottom\">\n <button type=\"button\" class=\"close\" title=\"{{'Close' | translate}}\" (click)=\"close()\">×</button>\n <div class=\"d-flex a-i-center\">\n <div class=\"user-dot\"> {{appState.currentUser | async | userNameInitials}}</div>\n <div class=\"min-width-0\">\n <p\n *ngIf=\"appState.currentUser | async\"\n class=\"text-truncate text-medium text-16\"\n title=\"{{appState.currentUser | async | shortenUserName}}\"\n >\n {{appState.currentUser | async | shortenUserName}}\n </p>\n <small *ngIf=\"appState.currentUser | async | userRolesList as userRoles\" [title]=\"userRoles\" class=\"text-truncate\">{{ userRoles }}</small>\n </div>\n </div>\n </div>\n\n <!-- user menu -->\n <c8y-user-menu-outlet\n [items]=\"(userMenuService.items$ | async)\"\n class=\"c8y-right-drawer__container\"\n ></c8y-user-menu-outlet>\n\n <!-- Version list -->\n <c8y-version-list *ngIf=\"showPlatformInformation\"></c8y-version-list>\n\n<!-- quicklinks > bookmarks -->\n <div *ngIf=\"(appState$ | async).showRightDrawer && quickLinks.length\"\n class=\"separator-top p-t-8 p-b-8\">\n <div class=\"c8y-right-drawer__item sticky-top\">\n <i c8yIcon=\"bookmark\"></i>\n <span class=\"text-bold\">{{ 'Quick links' | translate }}</span>\n </div>\n\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 title=\"{{ quickLink.label | translate }}\"\n type=\"button\"\n class=\"c8y-right-drawer__link\"\n [href]=\"quickLink.url || '#'\"\n (click)=\"quickLink.click && $event.preventDefault(); quickLink.click && quickLink.click()\"\n c8yProductExperience\n [actionName]=\"
|
|
13880
|
+
args: [{ selector: 'c8y-right-drawer', template: "<aside class=\"c8y-right-drawer\" [cdkTrapFocus]=\"drawerOpen\">\n<!-- drawer header -->\n <div class=\"c8y-right-drawer__header separator-bottom\">\n <button type=\"button\" class=\"close\" title=\"{{'Close' | translate}}\" (click)=\"close()\">×</button>\n <div class=\"d-flex a-i-center\">\n <div class=\"user-dot\"> {{appState.currentUser | async | userNameInitials}}</div>\n <div class=\"min-width-0\">\n <p\n *ngIf=\"appState.currentUser | async\"\n class=\"text-truncate text-medium text-16\"\n title=\"{{appState.currentUser | async | shortenUserName}}\"\n >\n {{appState.currentUser | async | shortenUserName}}\n </p>\n <small *ngIf=\"appState.currentUser | async | userRolesList as userRoles\" [title]=\"userRoles\" class=\"text-truncate\">{{ userRoles }}</small>\n </div>\n </div>\n </div>\n\n <!-- user menu -->\n <c8y-user-menu-outlet\n [items]=\"(userMenuService.items$ | async)\"\n class=\"c8y-right-drawer__container\"\n ></c8y-user-menu-outlet>\n\n <!-- Version list -->\n <c8y-version-list *ngIf=\"showPlatformInformation\"></c8y-version-list>\n\n<!-- quicklinks > bookmarks -->\n <div *ngIf=\"(appState$ | async).showRightDrawer && quickLinks.length\"\n class=\"separator-top p-t-8 p-b-8\">\n <div class=\"c8y-right-drawer__item sticky-top\">\n <i c8yIcon=\"bookmark\"></i>\n <span class=\"text-bold\">{{ 'Quick links' | translate }}</span>\n </div>\n\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 title=\"{{ quickLink.label | translate }}\"\n type=\"button\"\n class=\"c8y-right-drawer__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 tabindex=\"{{ drawerOpen ? '0' : '-1' }}\"\n >\n <i *ngIf=\"quickLink.icon\" class=\"{{ quickLink.icon }} c8y-icon-duocolor\"></i>\n <img\n *ngIf=\"quickLink.iconSrc\"\n [src]=\"quickLink.iconSrc\"\n style=\"max-width: 20px\"\n class=\"img-responsive\"\n onerror=\"this.style.display = 'none'\"\n />\n <span>{{ quickLink.label | translate }}</span>\n </a>\n </ng-container>\n\n </div>\n\n <div *ngIf=\"(appState$ | async).showRightDrawer && helpAndSupport.length\"\n class=\"separator-top p-t-8 p-b-8\">\n <button type=\"button\" class=\"c8y-right-drawer__link sticky-top\" (click)=\"documentationOpen = !documentationOpen\"\n [attr.aria-expanded]=\"!documentationCol.isCollapsed\" [attr.aria-controls]=\"'collapseDocs'\">\n <i c8yIcon=\"book-shelf\"></i>\n <span class=\"text-bold\">{{ 'Documentation' | translate }}</span>\n <i c8yIcon=\"angle-down\" class=\"m-l-auto\" [ngClass]=\"{'icon-rotate-180': documentationOpen }\"></i>\n </button>\n <div class=\"collapse\" id=\"collapseDocs\" [collapse]=\"!documentationOpen\" [isAnimated]=\"true\" #documentationCol=\"bs-collapse\">\n <ng-container *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 title=\"{{ link.label | translate }}\"\n type=\"button\"\n class=\"c8y-right-drawer__link\"\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 tabindex=\"{{ drawerOpen ? '0' : '-1' }}\"\n >\n <span title=\"{{ link.label | translate }}\" class=\"text-truncate text-12\">\n {{ link.label | translate }}\n </span>\n </a>\n </ng-container>\n </div>\n </div>\n\n <!-- TODO: move legal notices here -->\n <!-- <div class=\"separator-top p-t-8 m-t-auto\">\n <a href=\"#\" class=\"c8y-right-drawer__link\">\n <small>Legal notices</small>\n </a>\n </div> -->\n</aside>\n" }]
|
|
13585
13881
|
}], ctorParameters: function () { return [{ type: AppStateService }, { type: UserMenuService }, { type: OptionsService }]; }, propDecorators: { _quickLinks: [{
|
|
13586
13882
|
type: Input,
|
|
13587
13883
|
args: ['quickLinks']
|
|
@@ -16736,50 +17032,68 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.6", ngImpor
|
|
|
16736
17032
|
/**
|
|
16737
17033
|
* This module enables an tenant to activate the product experience
|
|
16738
17034
|
* software [Gainsight](https://www.gainsight.com/product-experience/) to help
|
|
16739
|
-
* and track user actions.
|
|
16740
|
-
* property `gainsightEnabled` is set to true.
|
|
17035
|
+
* and track user actions.
|
|
16741
17036
|
*/
|
|
16742
17037
|
class ProductExperienceModule {
|
|
16743
|
-
constructor(appState, gainsightService, cookieBannerService,
|
|
17038
|
+
constructor(appState, gainsightService, cookieBannerService,
|
|
17039
|
+
// Don't remove it, otherwise UserEngagementsService won't be initialized.
|
|
17040
|
+
userEngagementsService) {
|
|
16744
17041
|
this.appState = appState;
|
|
16745
17042
|
this.gainsightService = gainsightService;
|
|
16746
17043
|
this.cookieBannerService = cookieBannerService;
|
|
16747
|
-
this.
|
|
17044
|
+
this.userEngagementsService = userEngagementsService;
|
|
17045
|
+
/**
|
|
17046
|
+
* Check if the Gainsight tracking is disabled in the application apptions. If so, exit early without processing further.
|
|
17047
|
+
*/
|
|
17048
|
+
if (this.gainsightService.isTrackingDisabled()) {
|
|
17049
|
+
return;
|
|
17050
|
+
}
|
|
17051
|
+
this.toggleUserTrackingObservable();
|
|
17052
|
+
}
|
|
17053
|
+
/**
|
|
17054
|
+
* Observes several factors to determine the state of user tracking and manages the visibility of Gainsight engagements.
|
|
17055
|
+
* It watches for changes in the current tenant, the state of the cookie banner, and user's preferences for Gainsight engagements.
|
|
17056
|
+
*
|
|
17057
|
+
* 1. If the cookie banner is being displayed, it returns without making any changes.
|
|
17058
|
+
* 2. If Gainsight is disabled at the tenant level via custom properties, it returns without making any changes.
|
|
17059
|
+
* 3. If the conditions are met for loading the Gainsight tag, it loads the tag.
|
|
17060
|
+
*/
|
|
17061
|
+
toggleUserTrackingObservable() {
|
|
16748
17062
|
combineLatest([
|
|
16749
17063
|
this.appState.currentTenant.pipe(filter(Boolean)),
|
|
16750
|
-
this.cookieBannerService.isCookieBannerShowed
|
|
16751
|
-
|
|
16752
|
-
]).subscribe(([currentTenant, isCookieBannerShowed, showGainsightEngagements]) => __awaiter(this, void 0, void 0, function* () {
|
|
17064
|
+
this.cookieBannerService.isCookieBannerShowed$
|
|
17065
|
+
]).subscribe(([currentTenant, isCookieBannerShowed]) => __awaiter(this, void 0, void 0, function* () {
|
|
16753
17066
|
if (isCookieBannerShowed) {
|
|
16754
17067
|
return;
|
|
16755
17068
|
}
|
|
16756
17069
|
const { customProperties } = currentTenant;
|
|
16757
|
-
if (this.gainsightService.
|
|
16758
|
-
|
|
16759
|
-
this.gainsightService.loadTag(currentTenant);
|
|
17070
|
+
if (this.gainsightService.isGainsightDisabledAtTenantCustomProperties(customProperties)) {
|
|
17071
|
+
return;
|
|
16760
17072
|
}
|
|
16761
|
-
|
|
16762
|
-
|
|
16763
|
-
*/
|
|
16764
|
-
if (showGainsightEngagements === undefined) {
|
|
16765
|
-
showGainsightEngagements = true;
|
|
16766
|
-
userPreferencesService.set(this.gainsightService.USER_PREFERENCES_GAINSIGHT_ENGAGEMENTS_KEY, showGainsightEngagements);
|
|
17073
|
+
if (this.shouldLoadTag()) {
|
|
17074
|
+
yield this.gainsightService.loadTag(currentTenant, yield this.gainsightService.shouldSendPiiData());
|
|
16767
17075
|
}
|
|
16768
|
-
this.gainsightService.switchGainsightEngagementsVisibility(showGainsightEngagements);
|
|
16769
17076
|
}));
|
|
16770
17077
|
}
|
|
17078
|
+
/**
|
|
17079
|
+
* Determines if a tracking tag should be loaded based on cookie preferences.
|
|
17080
|
+
* @returns `true` if user cookie preferences exist, otherwise `false`.
|
|
17081
|
+
*/
|
|
17082
|
+
shouldLoadTag() {
|
|
17083
|
+
return !!this.cookieBannerService.getUserCookiePreferences();
|
|
17084
|
+
}
|
|
16771
17085
|
}
|
|
16772
|
-
ProductExperienceModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: ProductExperienceModule, deps: [{ token: AppStateService }, { token: GainsightService }, { token: CookieBannerService }, { token:
|
|
17086
|
+
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 });
|
|
16773
17087
|
ProductExperienceModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "14.0.6", ngImport: i0, type: ProductExperienceModule, declarations: [ProductExperienceDirective], exports: [ProductExperienceDirective] });
|
|
16774
|
-
ProductExperienceModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: ProductExperienceModule, providers: [GainsightService] });
|
|
17088
|
+
ProductExperienceModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: ProductExperienceModule, providers: [GainsightService, UserEngagementsService] });
|
|
16775
17089
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: ProductExperienceModule, decorators: [{
|
|
16776
17090
|
type: NgModule,
|
|
16777
17091
|
args: [{
|
|
16778
17092
|
declarations: [ProductExperienceDirective],
|
|
16779
17093
|
exports: [ProductExperienceDirective],
|
|
16780
|
-
providers: [GainsightService]
|
|
17094
|
+
providers: [GainsightService, UserEngagementsService]
|
|
16781
17095
|
}]
|
|
16782
|
-
}], ctorParameters: function () { return [{ type: AppStateService }, { type: GainsightService }, { type: CookieBannerService }, { type:
|
|
17096
|
+
}], ctorParameters: function () { return [{ type: AppStateService }, { type: GainsightService }, { type: CookieBannerService }, { type: UserEngagementsService }]; } });
|
|
16783
17097
|
|
|
16784
17098
|
class SearchComponent {
|
|
16785
17099
|
constructor(searchService) {
|
|
@@ -27698,5 +28012,5 @@ class RealtimeMessage {
|
|
|
27698
28012
|
* Generated bundle index. Do not edit.
|
|
27699
28013
|
*/
|
|
27700
28014
|
|
|
27701
|
-
export { ACTIONS, AbstractConfigurationStrategy, ActionBarComponent, ActionBarItemComponent, ActionBarModule, ActionBarService, ActionComponent, ActionModule, ActionOutletComponent, ActionService, AlarmRealtimeService, AlertComponent, AlertDetailsComponent, AlertModule, AlertOutletBase, AlertOutletComponent, AlertService, AlertTextComponent, AppIconComponent, AppStateService, AppSwitcherComponent, AppSwitcherService, ApplicationOptions, ApplicationPluginStatus, AssetTypesModule, AssetTypesService, AuditLogComponent, AuditLogModule, AuthenticationModule, BackendVersionFactory, 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_VERSION, HOOK_WIZARD, HeaderBarComponent, HeaderCellRendererDefDirective, HeaderModule, HeaderService, HelpComponent, HelpModule, HighlightComponent, HookProviderTypes, 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, MarkdownToHtmlPipe, 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, PX_ACTIONS, PX_EVENT_NAME, PasswordCheckListComponent, PasswordConfirm, PasswordConfirmModalComponent, PasswordService, PasswordStrengthCheckerService, PasswordStrengthComponent, PasswordStrengthValidatorDirective, PatternMessagesService, Permissions, PhoneValidationDirective, PlatformDetailsService, 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$1 as SelectComponent, SelectModalComponent, SelectModalFilterPipe, SelectModalModule, SelectModule, SendStatus, SendStatusLabels, SetupCompletedComponent, SetupComponent, SetupModule, SetupService, SetupState, SetupStepperFactory, ShortenUserNamePipe, ShouldShowMoPipe, ShowIfFilterPipe, SimpleJsonPathValidatorDirective, SkipLinkDirective, SmsChallengeComponent, StateService, Status, StepperModule, StepperOutletComponent, StepperService, Steppers, StrengthValidatorService, StringifyObjectPipe, TabComponent, TabsModule, TabsOutletComponent, TabsService, TabsetAriaDirective, TenantUiService, TextAreaRowHeightDirective, TextareaAutoresizeDirective, TitleComponent, TitleOutletComponent, TotpAuthComponent, TotpChallengeComponent, TotpSetupComponent, TranslateCustomLoader, TranslateParserCustom, TranslateService, TypeaheadComponent, UniqueInCollectionByPathValidationDirective, UserEditComponent, UserEditModalComponent, UserMenuItemComponent, UserMenuOutletComponent, UserMenuService, UserModule, UserNameInitialsPipe, UserPreferencesConfigurationStrategy, UserPreferencesService, UserPreferencesStorageInventory, UserPreferencesStorageLocal, UserTotpRevokeComponent, UserTotpSetupComponent, VERSION_MODULE_CONFIG, ValidationPattern, VersionDetailsModalComponent, VersionListComponent, VersionModule, VersionService, ViewContext, ViewContextServices, VirtualScrollWindowDirective, VirtualScrollWindowStrategy, VirtualScrollerWrapperComponent, WebSDKVersionFactory, WidgetTimeContextComponent, WidgetsDashboardComponent, WizardBodyComponent, WizardComponent, WizardFooterComponent, WizardHeaderComponent, WizardModalService, WizardModule, WizardOutletComponent, WizardService, ZipService, _, _virtualScrollWindowStrategyFactory, allEntriesAreEqual, deviceAvailabilityIconMap, extraRoutes, fromFactories, fromTrigger, fromTriggerOnce, getActivatedRoute, getAngularLocalesLanguageString, getBasicInputArrayFormFieldConfig, getInjectedHooks, gettext, hookAction, hookActionBar, hookBreadcrumb, hookComponent, hookDocs, hookDynamicProviderConfig, hookGeneric, hookNavigator, hookOptions, hookPatternMessages, hookRoute, hookSearch, hookStepper, hookTab, hookVersion, hookWizard, initializeServices, isEagerDynamicComponents, isExtensionFactory, 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 };
|
|
28015
|
+
export { ACTIONS, AbstractConfigurationStrategy, ActionBarComponent, ActionBarItemComponent, ActionBarModule, ActionBarService, ActionComponent, ActionModule, ActionOutletComponent, ActionService, AlarmRealtimeService, AlertComponent, AlertDetailsComponent, AlertModule, AlertOutletBase, AlertOutletComponent, AlertService, AlertTextComponent, AppIconComponent, AppStateService, AppSwitcherComponent, AppSwitcherService, ApplicationOptions, ApplicationPluginStatus, AssetTypesModule, AssetTypesService, AuditLogComponent, AuditLogModule, AuthenticationModule, BackendVersionFactory, 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_VERSION, HOOK_WIZARD, HeaderBarComponent, HeaderCellRendererDefDirective, HeaderModule, HeaderService, HelpComponent, HelpModule, HighlightComponent, HookProviderTypes, 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, MarkdownToHtmlPipe, 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, PX_ACTIONS, PX_EVENT_NAME, PasswordCheckListComponent, PasswordConfirm, PasswordConfirmModalComponent, PasswordService, PasswordStrengthCheckerService, PasswordStrengthComponent, PasswordStrengthValidatorDirective, PatternMessagesService, Permissions, PhoneValidationDirective, PlatformDetailsService, 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$1 as SelectComponent, SelectModalComponent, SelectModalFilterPipe, SelectModalModule, SelectModule, SendStatus, SendStatusLabels, SetupCompletedComponent, SetupComponent, SetupModule, SetupService, SetupState, SetupStepperFactory, ShortenUserNamePipe, ShouldShowMoPipe, ShowIfFilterPipe, SimpleJsonPathValidatorDirective, SkipLinkDirective, SmsChallengeComponent, StateService, Status, StepperModule, StepperOutletComponent, StepperService, Steppers, StrengthValidatorService, StringifyObjectPipe, TabComponent, TabsModule, TabsOutletComponent, TabsService, TabsetAriaDirective, TenantUiService, TextAreaRowHeightDirective, TextareaAutoresizeDirective, TitleComponent, TitleOutletComponent, TotpAuthComponent, TotpChallengeComponent, TotpSetupComponent, TranslateCustomLoader, TranslateParserCustom, TranslateService, TypeaheadComponent, UniqueInCollectionByPathValidationDirective, UserEditComponent, UserEditModalComponent, UserEngagementsService, UserMenuItemComponent, UserMenuOutletComponent, UserMenuService, UserModule, UserNameInitialsPipe, UserPreferencesConfigurationStrategy, UserPreferencesService, UserPreferencesStorageInventory, UserPreferencesStorageLocal, UserTotpRevokeComponent, UserTotpSetupComponent, VERSION_MODULE_CONFIG, ValidationPattern, VersionDetailsModalComponent, VersionListComponent, VersionModule, VersionService, ViewContext, ViewContextServices, VirtualScrollWindowDirective, VirtualScrollWindowStrategy, VirtualScrollerWrapperComponent, WebSDKVersionFactory, WidgetTimeContextComponent, WidgetsDashboardComponent, WizardBodyComponent, WizardComponent, WizardFooterComponent, WizardHeaderComponent, WizardModalService, WizardModule, WizardOutletComponent, WizardService, ZipService, _, _virtualScrollWindowStrategyFactory, allEntriesAreEqual, deviceAvailabilityIconMap, extraRoutes, fromFactories, fromTrigger, fromTriggerOnce, getActivatedRoute, getAngularLocalesLanguageString, getBasicInputArrayFormFieldConfig, getInjectedHooks, gettext, hookAction, hookActionBar, hookBreadcrumb, hookComponent, hookDocs, hookDynamicProviderConfig, hookGeneric, hookNavigator, hookOptions, hookPatternMessages, hookRoute, hookSearch, hookStepper, hookTab, hookVersion, hookWizard, initializeServices, isEagerDynamicComponents, isExtensionFactory, 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 };
|
|
27702
28016
|
//# sourceMappingURL=c8y-ngx-components.mjs.map
|