@c8y/ngx-components 1018.0.176 → 1018.0.183
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/date-time-picker/close-date-picker.directive.d.ts +14 -0
- package/core/date-time-picker/date-time-picker.component.d.ts +7 -2
- package/core/date-time-picker/date-time-picker.module.d.ts +8 -7
- 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/user/user-edit-modal.component.d.ts +33 -6
- package/core/user/user-edit.component.d.ts +6 -11
- package/esm2020/context-dashboard/widget-config.component.mjs +3 -3
- package/esm2020/core/bootstrap/cookie-banner/cookie-banner.service.mjs +2 -2
- package/esm2020/core/common/ApplicationOptions.mjs +1 -1
- package/esm2020/core/date-time-picker/close-date-picker.directive.mjs +36 -0
- package/esm2020/core/date-time-picker/date-time-picker.component.mjs +28 -8
- package/esm2020/core/date-time-picker/date-time-picker.module.mjs +4 -3
- package/esm2020/core/product-experience/gainsight.service.mjs +170 -81
- 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/user/user-edit-modal.component.mjs +68 -33
- package/esm2020/core/user/user-edit.component.mjs +30 -39
- package/esm2020/datapoint-selector/datapoint-attributes-form/datapoint-attributes-form.component.mjs +3 -3
- package/fesm2015/c8y-ngx-components-context-dashboard.mjs +2 -2
- package/fesm2015/c8y-ngx-components-context-dashboard.mjs.map +1 -1
- package/fesm2015/c8y-ngx-components-datapoint-selector.mjs +2 -2
- package/fesm2015/c8y-ngx-components-datapoint-selector.mjs.map +1 -1
- package/fesm2015/c8y-ngx-components.mjs +516 -167
- package/fesm2015/c8y-ngx-components.mjs.map +1 -1
- package/fesm2020/c8y-ngx-components-context-dashboard.mjs +2 -2
- package/fesm2020/c8y-ngx-components-context-dashboard.mjs.map +1 -1
- package/fesm2020/c8y-ngx-components-datapoint-selector.mjs +2 -2
- package/fesm2020/c8y-ngx-components-datapoint-selector.mjs.map +1 -1
- package/fesm2020/c8y-ngx-components.mjs +511 -161
- package/fesm2020/c8y-ngx-components.mjs.map +1 -1
- package/locales/locales.pot +2 -2
- package/package.json +1 -1
|
@@ -23,7 +23,7 @@ import { satisfies, compare, coerce } from 'semver';
|
|
|
23
23
|
import * as i1$1 from '@c8y/client';
|
|
24
24
|
import { OperationStatus, TenantLoginOptionType, UserManagementSource, GrantType, ApplicationType, ApplicationAvailability, FetchClient, Client, PasswordStrength, QueriesUtil, InventoryService, UserService, ApplicationService, TenantService, Service } from '@c8y/client';
|
|
25
25
|
import * as i6 from 'ngx-bootstrap/datepicker';
|
|
26
|
-
import { BsDatepickerModule } from 'ngx-bootstrap/datepicker';
|
|
26
|
+
import { BsDatepickerModule, BsDatepickerDirective } from 'ngx-bootstrap/datepicker';
|
|
27
27
|
import { defineLocale, enGbLocale, zhCnLocale, ruLocale, ptBrLocale, plLocale, nlLocale, koLocale, jaLocale, frLocale, esLocale, deLocale } from 'ngx-bootstrap/chronos';
|
|
28
28
|
import { coerceNumberProperty } from '@angular/cdk/coercion';
|
|
29
29
|
import * as i1$4 from '@angular/platform-browser';
|
|
@@ -7142,7 +7142,7 @@ class CookieBannerService {
|
|
|
7142
7142
|
return JSON.parse(localStorage.getItem(this.STORAGE_KEY));
|
|
7143
7143
|
}
|
|
7144
7144
|
/**
|
|
7145
|
-
* Verifies that cookie preferences configuration is defined.
|
|
7145
|
+
* Verifies that cookie preferences configuration is defined in the application options.
|
|
7146
7146
|
* @returns {boolean} Returns if the cookie preferences configuration is defined.
|
|
7147
7147
|
*/
|
|
7148
7148
|
isConfigCookiePreferencesDefined() {
|
|
@@ -7210,8 +7210,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.6", ngImpor
|
|
|
7210
7210
|
* tag and
|
|
7211
7211
|
*/
|
|
7212
7212
|
class GainsightService {
|
|
7213
|
-
constructor(
|
|
7214
|
-
this.document = document;
|
|
7213
|
+
constructor(appState, options, cookieBannerService, userPreferencesService, translateService) {
|
|
7215
7214
|
this.appState = appState;
|
|
7216
7215
|
this.options = options;
|
|
7217
7216
|
this.cookieBannerService = cookieBannerService;
|
|
@@ -7221,6 +7220,11 @@ class GainsightService {
|
|
|
7221
7220
|
* A subject that emits the tag function as soon as a new tag is set.
|
|
7222
7221
|
*/
|
|
7223
7222
|
this.tagFunction$ = new BehaviorSubject(null);
|
|
7223
|
+
this.trackingLoaded$ = new Subject();
|
|
7224
|
+
/**
|
|
7225
|
+
* 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.
|
|
7226
|
+
* Otherwise, only the required data is transmitted during the identity step execution.
|
|
7227
|
+
*/
|
|
7224
7228
|
this.USER_PREFERENCES_GAINSIGHT_KEY = 'gainsightEnabled';
|
|
7225
7229
|
/**
|
|
7226
7230
|
* The name of the key remained unchanged, but applies to all engagements.
|
|
@@ -7232,15 +7236,23 @@ class GainsightService {
|
|
|
7232
7236
|
this.SCRIPT_EXECUTION_WAIT_TIME = 500;
|
|
7233
7237
|
this.OPTIONS_KEY_CATEGORY = 'gainsight';
|
|
7234
7238
|
this.OPTIONS_KEY_NAME = 'api.key';
|
|
7235
|
-
this.ENGAGEMENTS = 'engagements';
|
|
7236
7239
|
this.isScriptLoaded = false;
|
|
7237
7240
|
}
|
|
7241
|
+
/**
|
|
7242
|
+
* Checks if the specified Gainsight preference is disabled in user preferences.
|
|
7243
|
+
* @param preferenceName - Name of the Gainsight preference.
|
|
7244
|
+
* @returns A promise that resolves to `true` if the preference is disabled, otherwise `false`.
|
|
7245
|
+
*/
|
|
7238
7246
|
isGainsightPreferenceDisabledInUserPreferences(preferenceName) {
|
|
7239
7247
|
return __awaiter(this, void 0, void 0, function* () {
|
|
7240
7248
|
const userGainsightPref = yield this.userPreferencesService.get(preferenceName).toPromise();
|
|
7241
7249
|
return userGainsightPref === false;
|
|
7242
7250
|
});
|
|
7243
7251
|
}
|
|
7252
|
+
/**
|
|
7253
|
+
* Sets the state of the functional cookie.
|
|
7254
|
+
* @param value - A boolean value to indicate whether the functional cookie should be enabled (`true`) or disabled (`false`).
|
|
7255
|
+
*/
|
|
7244
7256
|
setFunctionalCookie(value) {
|
|
7245
7257
|
const cookies = this.cookieBannerService.getUserCookiePreferences();
|
|
7246
7258
|
if (cookies) {
|
|
@@ -7271,58 +7283,114 @@ class GainsightService {
|
|
|
7271
7283
|
/**
|
|
7272
7284
|
* Load the script tag and calls the identify function to start the tracking.
|
|
7273
7285
|
* @param currentTenant The current tenant.
|
|
7274
|
-
* @param
|
|
7286
|
+
* @param sendPiiData Flag for sending personally identifiable information (PII) during identification in Gainsight.
|
|
7275
7287
|
*/
|
|
7276
|
-
loadTag(currentTenant,
|
|
7288
|
+
loadTag(currentTenant, sendPiiData) {
|
|
7277
7289
|
return __awaiter(this, void 0, void 0, function* () {
|
|
7278
7290
|
const scriptTag = document.createElement('script');
|
|
7279
7291
|
const key = yield this.getGainsightKey();
|
|
7280
7292
|
if (key && !this.isScriptLoaded) {
|
|
7281
7293
|
this.loadScriptTag(scriptTag, key);
|
|
7282
|
-
|
|
7294
|
+
const currentUserStream = this.appState.currentUser;
|
|
7295
|
+
const scriptLoadStream = fromEvent(scriptTag, 'load');
|
|
7296
|
+
const versionStream = this.appState.state$.pipe(filter(({ versions }) => versions.backend), map(({ versions }) => versions), take(1));
|
|
7297
|
+
const sourceStreams = sendPiiData
|
|
7298
|
+
? [currentUserStream, scriptLoadStream, versionStream]
|
|
7299
|
+
: [currentUserStream, scriptLoadStream];
|
|
7300
|
+
combineLatest(sourceStreams)
|
|
7283
7301
|
.pipe(delay(this.SCRIPT_EXECUTION_WAIT_TIME), filter(([user, scriptEvent]) => !!(scriptEvent && user)))
|
|
7284
|
-
.subscribe(
|
|
7302
|
+
.subscribe(args => {
|
|
7303
|
+
const [user, , versions] = args;
|
|
7304
|
+
this.setGlobalContext();
|
|
7285
7305
|
const instanceId = this.getInstanceIdFromUrl();
|
|
7286
|
-
if (
|
|
7287
|
-
|
|
7288
|
-
|
|
7306
|
+
if (sendPiiData) {
|
|
7307
|
+
const versionUI = versions.ui.ngx;
|
|
7308
|
+
const versionBE = versions.backend;
|
|
7309
|
+
const extendedIdentifyData = {
|
|
7310
|
+
user,
|
|
7311
|
+
currentTenant,
|
|
7312
|
+
instanceId,
|
|
7313
|
+
versionUI,
|
|
7314
|
+
versionBE
|
|
7315
|
+
};
|
|
7316
|
+
this.identify(sendPiiData, extendedIdentifyData);
|
|
7317
|
+
}
|
|
7318
|
+
else {
|
|
7319
|
+
const requiredIdentifyData = { user, currentTenant, instanceId };
|
|
7320
|
+
this.identify(sendPiiData, requiredIdentifyData);
|
|
7289
7321
|
}
|
|
7290
7322
|
this.isScriptLoaded = true;
|
|
7291
7323
|
this.tagFunction$.next(this.tagFunction);
|
|
7324
|
+
this.trackingLoaded$.next(true);
|
|
7292
7325
|
});
|
|
7293
7326
|
}
|
|
7294
7327
|
});
|
|
7295
7328
|
}
|
|
7296
7329
|
/**
|
|
7297
7330
|
* Identifies the user/account at Gainsight.
|
|
7298
|
-
* @param
|
|
7299
|
-
* @param
|
|
7300
|
-
* @param versionUI The UI version used.
|
|
7301
|
-
* @param versionBE The BE version used.
|
|
7331
|
+
* @param sendPiiData Flag for sending personally identifiable information.
|
|
7332
|
+
* @param identifyData Object containing identification data.
|
|
7302
7333
|
*/
|
|
7303
|
-
identify(
|
|
7334
|
+
identify(sendPiiData, identifyData) {
|
|
7304
7335
|
const windowRef = window;
|
|
7305
|
-
const { id: userId, email
|
|
7306
|
-
const { name
|
|
7307
|
-
const {
|
|
7308
|
-
|
|
7309
|
-
|
|
7310
|
-
|
|
7311
|
-
|
|
7312
|
-
|
|
7313
|
-
|
|
7314
|
-
|
|
7315
|
-
|
|
7316
|
-
|
|
7317
|
-
|
|
7318
|
-
|
|
7319
|
-
|
|
7320
|
-
|
|
7321
|
-
|
|
7322
|
-
|
|
7323
|
-
|
|
7324
|
-
|
|
7336
|
+
const { id: userId, email } = identifyData.user;
|
|
7337
|
+
const { name: tenantID } = identifyData.currentTenant;
|
|
7338
|
+
const { instanceId } = identifyData;
|
|
7339
|
+
/**
|
|
7340
|
+
* Passing ID is a minimum required data to make an identify call to Gainsight.
|
|
7341
|
+
* isUserCreatedAfterAnonymizationWasActivated parameter is passed to later distinguish between users created before and after data anonymization done by Gainsight.
|
|
7342
|
+
* tenantID Used to distinguish between tenants when same email is used for different tenants.
|
|
7343
|
+
*
|
|
7344
|
+
* Due to GS limitations (GS does not allow clearing user attr/preferences via the GS tag!),
|
|
7345
|
+
* we always need to initialize fields related to PII to prevent leaking this data to GS when the user has disabled functional cookies.
|
|
7346
|
+
*/
|
|
7347
|
+
const requiredIdentify = {
|
|
7348
|
+
/**
|
|
7349
|
+
* Email was not mandatory form field until 10.14
|
|
7350
|
+
*/
|
|
7351
|
+
id: email ? email : `${userId}_${tenantID}_${instanceId}`,
|
|
7352
|
+
isUserCreatedAfterAnonymizationWasActivated: true,
|
|
7353
|
+
tenantID: tenantID,
|
|
7354
|
+
email: '--',
|
|
7355
|
+
userName: '',
|
|
7356
|
+
firstName: '',
|
|
7357
|
+
lastName: '',
|
|
7358
|
+
domainName: '',
|
|
7359
|
+
versionUI: '',
|
|
7360
|
+
versionBE: '',
|
|
7361
|
+
userLanguage: '',
|
|
7362
|
+
instanceId: '',
|
|
7363
|
+
externalReference: '',
|
|
7364
|
+
userRoles: '',
|
|
7365
|
+
customBranding: this.isCustomBranding(),
|
|
7366
|
+
fullTracking: sendPiiData
|
|
7367
|
+
};
|
|
7368
|
+
if (sendPiiData) {
|
|
7369
|
+
const { userName, firstName, lastName, roles } = identifyData.user;
|
|
7370
|
+
const { customProperties, domainName } = identifyData.currentTenant;
|
|
7371
|
+
const { versionUI, versionBE } = identifyData;
|
|
7372
|
+
const extendedIdentify = Object.assign(Object.assign({}, requiredIdentify), { email,
|
|
7373
|
+
userName,
|
|
7374
|
+
firstName,
|
|
7375
|
+
lastName,
|
|
7376
|
+
domainName,
|
|
7377
|
+
versionUI,
|
|
7378
|
+
versionBE, userLanguage: this.translateService.currentLang, instanceId, externalReference: customProperties === null || customProperties === void 0 ? void 0 : customProperties.externalReference, userRoles: this.transformUserRolesToStr(roles === null || roles === void 0 ? void 0 : roles.references) });
|
|
7379
|
+
windowRef[this.GAINSIGHT_GLOBAL_SCOPE]('identify', extendedIdentify, {
|
|
7380
|
+
id: `${tenantID}_${instanceId}`,
|
|
7381
|
+
instanceId
|
|
7382
|
+
});
|
|
7383
|
+
return;
|
|
7384
|
+
}
|
|
7385
|
+
windowRef[this.GAINSIGHT_GLOBAL_SCOPE]('identify', requiredIdentify);
|
|
7325
7386
|
}
|
|
7387
|
+
/**
|
|
7388
|
+
* Triggers an event to be recorded by Gainsight PX.
|
|
7389
|
+
* This method calls the Gainsight PX's tracking mechanism to log a specific event
|
|
7390
|
+
* along with its associated properties.
|
|
7391
|
+
* @param eventName - Name of the event to be triggered.
|
|
7392
|
+
* @param props - Optional properties associated with the event.
|
|
7393
|
+
*/
|
|
7326
7394
|
triggerEvent(eventName, props) {
|
|
7327
7395
|
if (this.tagFunction && eventName) {
|
|
7328
7396
|
eventName = this.prepareEventName(eventName);
|
|
@@ -7344,41 +7412,56 @@ class GainsightService {
|
|
|
7344
7412
|
return this.getEnTranslation(textToTranslate, this.cachedRevertedTranslations);
|
|
7345
7413
|
}
|
|
7346
7414
|
/**
|
|
7347
|
-
*
|
|
7348
|
-
* The decision to
|
|
7349
|
-
*
|
|
7415
|
+
* Determines whether personally identifiable information (PII) should be sent while loading a tag.
|
|
7416
|
+
* The decision to activate Gainsight and send PII relies on whether the cookiePreferences option is defined in the application settings,
|
|
7417
|
+
* if the functional cookie is enabled, and if the user grants permission.
|
|
7350
7418
|
*/
|
|
7351
|
-
|
|
7352
|
-
return (this
|
|
7353
|
-
this.cookieBannerService.
|
|
7354
|
-
|
|
7355
|
-
|
|
7419
|
+
shouldSendPiiData() {
|
|
7420
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
7421
|
+
return (this.cookieBannerService.isConfigCookiePreferencesDefined() &&
|
|
7422
|
+
this.cookieBannerService.isFunctionalCookieEnabled() &&
|
|
7423
|
+
!(yield this.isGainsightPreferenceDisabledInUserPreferences(this.USER_PREFERENCES_GAINSIGHT_KEY)));
|
|
7424
|
+
});
|
|
7356
7425
|
}
|
|
7426
|
+
/**
|
|
7427
|
+
* Updates a specific user attribute in the Gainsight global scope.
|
|
7428
|
+
* This method interfaces with the Gainsight global object to set a user's specific attribute with a provided value.
|
|
7429
|
+
* @param name - Name of the user attribute to be updated.
|
|
7430
|
+
* @param value - Value to set for the specified user attribute.
|
|
7431
|
+
*/
|
|
7357
7432
|
updateUserAttribute(name, value) {
|
|
7358
7433
|
var _a;
|
|
7359
7434
|
(_a = window[this.GAINSIGHT_GLOBAL_SCOPE]) === null || _a === void 0 ? void 0 : _a.call(window, 'set', 'user', { [name]: value });
|
|
7360
7435
|
}
|
|
7436
|
+
/**
|
|
7437
|
+
* Determines if the current user has the capability to modify Gainsight PX settings.
|
|
7438
|
+
*
|
|
7439
|
+
* This method checks multiple conditions:
|
|
7440
|
+
* 1. Whether tracking has been disabled globally via application options.
|
|
7441
|
+
* 2. Whether Gainsight is disabled at the tenant level through custom properties.
|
|
7442
|
+
* 3. Whether a Gainsight key is available, either currently loaded or fetched asynchronously.
|
|
7443
|
+
* 4. Whether cookie preferences are defined and available for the user.
|
|
7444
|
+
*
|
|
7445
|
+
* @returns Promise that resolves to a boolean. True indicates the user can edit product experience settings, and false otherwise.
|
|
7446
|
+
*/
|
|
7361
7447
|
canEditProductExperienceSettings() {
|
|
7362
7448
|
return __awaiter(this, void 0, void 0, function* () {
|
|
7363
7449
|
const currentTenant = this.appState.currentTenant.value;
|
|
7364
7450
|
const { customProperties } = currentTenant;
|
|
7451
|
+
if (this.isTrackingDisabled() ||
|
|
7452
|
+
this.isGainsightDisabledAtTenantCustomProperties(customProperties)) {
|
|
7453
|
+
return false;
|
|
7454
|
+
}
|
|
7365
7455
|
const gainsightKey = !!this.gainsightKey || !!(yield this.getGainsightKey());
|
|
7366
7456
|
return (gainsightKey &&
|
|
7367
7457
|
this.cookieBannerService.isConfigCookiePreferencesDefined() &&
|
|
7368
|
-
|
|
7369
|
-
!!this.cookieBannerService.getUserCookiePreferences() &&
|
|
7370
|
-
!this.isCustomBranding());
|
|
7458
|
+
!!this.cookieBannerService.getUserCookiePreferences());
|
|
7371
7459
|
});
|
|
7372
7460
|
}
|
|
7373
|
-
|
|
7374
|
-
|
|
7375
|
-
|
|
7376
|
-
|
|
7377
|
-
return;
|
|
7378
|
-
}
|
|
7379
|
-
this.addHidingStyle(this.HIDE_GAINSIGHT_BOT_STYLE_ID, '#apt-widget { display:none }');
|
|
7380
|
-
this.updateUserAttribute(this.ENGAGEMENTS, false);
|
|
7381
|
-
}
|
|
7461
|
+
/**
|
|
7462
|
+
* Sets the global context for Gainsight with the current application name.
|
|
7463
|
+
* The global context can be utilized by Gainsight for various purposes, such as segmenting users.
|
|
7464
|
+
*/
|
|
7382
7465
|
setGlobalContext() {
|
|
7383
7466
|
var _a;
|
|
7384
7467
|
const currentAppState = this.appState.state$.value;
|
|
@@ -7391,18 +7474,31 @@ class GainsightService {
|
|
|
7391
7474
|
}
|
|
7392
7475
|
return flatMap(userRoles, (userRole) => userRole.role.name).join();
|
|
7393
7476
|
}
|
|
7394
|
-
|
|
7395
|
-
|
|
7396
|
-
|
|
7397
|
-
|
|
7398
|
-
|
|
7399
|
-
|
|
7400
|
-
|
|
7401
|
-
|
|
7477
|
+
/**
|
|
7478
|
+
* Checks if Gainsight is disabled based on tenant custom properties.
|
|
7479
|
+
*
|
|
7480
|
+
* @param customProperties - The custom properties of the tenant.
|
|
7481
|
+
* @returns {boolean} - True if Gainsight is disabled, false otherwise.
|
|
7482
|
+
*/
|
|
7483
|
+
isGainsightDisabledAtTenantCustomProperties(customProperties) {
|
|
7484
|
+
const gainsightEnabled = customProperties && customProperties.gainsightEnabled;
|
|
7485
|
+
return gainsightEnabled === false;
|
|
7402
7486
|
}
|
|
7403
|
-
|
|
7404
|
-
|
|
7405
|
-
|
|
7487
|
+
/**
|
|
7488
|
+
* Determines if custom branding is enabled based on the presence of a brand logo.
|
|
7489
|
+
*
|
|
7490
|
+
* @returns {boolean} - True if custom branding is applied, false otherwise.
|
|
7491
|
+
*/
|
|
7492
|
+
isCustomBranding() {
|
|
7493
|
+
const brandingCssVars = this.options.get('brandingCssVars') || {};
|
|
7494
|
+
return !!brandingCssVars['brand-logo-img'];
|
|
7495
|
+
}
|
|
7496
|
+
/**
|
|
7497
|
+
* Determines if tracking is disabled based on the application options.
|
|
7498
|
+
* @returns `true` if tracking is disabled, otherwise `false`.
|
|
7499
|
+
*/
|
|
7500
|
+
isTrackingDisabled() {
|
|
7501
|
+
return this.options.disableTracking === true;
|
|
7406
7502
|
}
|
|
7407
7503
|
prepareEventName(baseEventName) {
|
|
7408
7504
|
return baseEventName
|
|
@@ -7413,14 +7509,6 @@ class GainsightService {
|
|
|
7413
7509
|
return eventNamePart.replace(/`[\w\W]*`/g, '');
|
|
7414
7510
|
}
|
|
7415
7511
|
}
|
|
7416
|
-
isGainsightDisabled(customProperties) {
|
|
7417
|
-
const gainsightEnabled = customProperties && customProperties.gainsightEnabled;
|
|
7418
|
-
return gainsightEnabled === false;
|
|
7419
|
-
}
|
|
7420
|
-
isCustomBranding() {
|
|
7421
|
-
const brandingCssVars = this.options.get('brandingCssVars') || {};
|
|
7422
|
-
return !!brandingCssVars['brand-logo-img'];
|
|
7423
|
-
}
|
|
7424
7512
|
loadScriptTag(scriptTag, key) {
|
|
7425
7513
|
try {
|
|
7426
7514
|
const windowRef = window;
|
|
@@ -7483,19 +7571,14 @@ class GainsightService {
|
|
|
7483
7571
|
return enTranslation;
|
|
7484
7572
|
}
|
|
7485
7573
|
}
|
|
7486
|
-
GainsightService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: GainsightService, deps: [{ token:
|
|
7574
|
+
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$2.TranslateService }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
7487
7575
|
GainsightService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: GainsightService, providedIn: 'root' });
|
|
7488
7576
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: GainsightService, decorators: [{
|
|
7489
7577
|
type: Injectable,
|
|
7490
7578
|
args: [{
|
|
7491
7579
|
providedIn: 'root'
|
|
7492
7580
|
}]
|
|
7493
|
-
}], ctorParameters: function () {
|
|
7494
|
-
return [{ type: DOCUMENT, decorators: [{
|
|
7495
|
-
type: Inject,
|
|
7496
|
-
args: [DOCUMENT]
|
|
7497
|
-
}] }, { type: AppStateService }, { type: OptionsService }, { type: CookieBannerService }, { type: UserPreferencesService }, { type: i1$2.TranslateService }];
|
|
7498
|
-
} });
|
|
7581
|
+
}], ctorParameters: function () { return [{ type: AppStateService }, { type: OptionsService }, { type: CookieBannerService }, { type: UserPreferencesService }, { type: i1$2.TranslateService }]; } });
|
|
7499
7582
|
|
|
7500
7583
|
class ProductExperienceDirective {
|
|
7501
7584
|
constructor(component, parentEventSource, gainsightService) {
|
|
@@ -7727,53 +7810,238 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.6", ngImpor
|
|
|
7727
7810
|
args: [{ selector: 'c8y-app-switcher', template: "<div\n class=\"app-switcher-dropdown\"\n dropdown\n #appSwitcherDropdown=\"bs-dropdown\"\n [cdkTrapFocus]=\"appSwitcherDropdown.isOpen\"\n>\n <button\n class=\"main-header-button c8y-dropdown dropdown-toggle\"\n type=\"button\"\n title=\"{{ 'Application switcher' | translate }}\"\n id=\"appSwitcherDropdown\"\n dropdownToggle\n >\n <i c8yIcon=\"th\" class=\"icon-2x\"></i>\n </button>\n <div\n *dropdownMenu\n class=\"app-switcher-dropdown-menu dropdown-menu\"\n aria-labelledby=\"appSwitcherDropdown\"\n role=\"group\"\n >\n <div\n *ngIf=\"!(switcherService.finishedLoading$ | async)\"\n class=\"d-flex a-i-center j-c-center p-4\"\n >\n <c8y-loading></c8y-loading>\n </div>\n <ng-container *ngIf=\"switcherService.oneCloudApps$ | async as oneCloudApps\">\n <div class=\"app-switcher-sagcloud\" *ngIf=\"oneCloudApps.length > 0\">\n <a\n title=\"{{ app.name | humanizeAppName | async }}\"\n class=\"appLink\"\n *ngFor=\"let app of oneCloudApps\"\n [href]=\"app | appHref\"\n c8yProductExperience\n [actionName]=\"'appSwitched'\"\n [actionData]=\"{ applicationName: app && app.name }\"\n >\n <c8y-app-icon\n [app]=\"app\"\n [name]=\"app.name\"\n [contextPath]=\"app.contextPath\"\n ></c8y-app-icon>\n <span class=\"text-truncate-wrap\">{{ app | humanizeAppName | async }}</span>\n </a>\n </div>\n </ng-container>\n <div class=\"app-switcher\" *ngIf=\"switcherService.apps$ | async as apps\">\n <a\n title=\"{{ app.name | humanizeAppName | async }}\"\n class=\"appLink\"\n [ngClass]=\"(app | isActiveApp | async) ? 'active' : ''\"\n *ngFor=\"let app of apps\"\n [href]=\"app | appHref\"\n [rel]=\"app.type === 'EXTERNAL' ? 'noopener noreferrer' : ''\"\n c8yProductExperience\n [actionName]=\"'appSwitched'\"\n [actionData]=\"{ applicationName: app && app.name }\"\n >\n <c8y-app-icon [app]=\"app\" [name]=\"app.name\" [contextPath]=\"app.contextPath\"></c8y-app-icon>\n <span class=\"text-truncate-wrap\">{{ app | humanizeAppName | async }}</span>\n </a>\n </div>\n </div>\n</div>\n" }]
|
|
7728
7811
|
}], ctorParameters: function () { return [{ type: AppSwitcherService }]; } });
|
|
7729
7812
|
|
|
7813
|
+
class UserEngagementsService {
|
|
7814
|
+
constructor(document, userPreferencesService, gainsightService) {
|
|
7815
|
+
this.document = document;
|
|
7816
|
+
this.userPreferencesService = userPreferencesService;
|
|
7817
|
+
this.gainsightService = gainsightService;
|
|
7818
|
+
this.USER_PREFERENCES_GAINSIGHT_ENGAGEMENTS_KEY = 'gainsightBotEnabled';
|
|
7819
|
+
this.userEngagementsEnabled$ = new BehaviorSubject(false);
|
|
7820
|
+
this.HIDE_GAINSIGHT_BOT_STYLE_ID = 'hide-gs-bot';
|
|
7821
|
+
this.ENGAGEMENTS = 'engagements';
|
|
7822
|
+
this.handleUserEngagements();
|
|
7823
|
+
}
|
|
7824
|
+
/**
|
|
7825
|
+
* Handles user engagement settings based on various conditions.
|
|
7826
|
+
*
|
|
7827
|
+
* - Waits for the Gainsight tracking to be loaded.
|
|
7828
|
+
* - Retrieves the engagement settings.
|
|
7829
|
+
* - Updates the engagement settings based on the combined observations.
|
|
7830
|
+
* - Finally, toggles the Gainsight engagements based on the latest `userEngagementsEnabled$` value.
|
|
7831
|
+
*/
|
|
7832
|
+
handleUserEngagements() {
|
|
7833
|
+
this.gainsightService.trackingLoaded$
|
|
7834
|
+
.pipe(take(1), switchMap(() => this.getEngagementSettingsObservable()), tap((settings) => this.updateUserEngagementSettings(...settings)), switchMap(() => this.userEngagementsEnabled$.pipe(take(1))))
|
|
7835
|
+
.subscribe(isEnabled => this.toggleGainsightEngagements(isEnabled));
|
|
7836
|
+
}
|
|
7837
|
+
/**
|
|
7838
|
+
* Updates the user's preference for Gainsight Engagements.
|
|
7839
|
+
* @param {boolean} isEnabled - The new value for the user's engagement preference.
|
|
7840
|
+
*/
|
|
7841
|
+
updateUserEngagementPreference(isEnabled) {
|
|
7842
|
+
this.userEngagementsEnabled$.next(isEnabled);
|
|
7843
|
+
this.userPreferencesService.set(this.gainsightService.USER_PREFERENCES_GAINSIGHT_ENGAGEMENTS_KEY, this.userEngagementsEnabled$.value);
|
|
7844
|
+
}
|
|
7845
|
+
/**
|
|
7846
|
+
* Toggles the visibility of Gainsight Engagements based on the provided flag.
|
|
7847
|
+
*
|
|
7848
|
+
* @param isEnabled - A flag indicating whether Gainsight Engagements should be visible.
|
|
7849
|
+
*/
|
|
7850
|
+
toggleGainsightEngagements(isEnabled) {
|
|
7851
|
+
isEnabled ? this.showGainsightEngagements() : this.hideGainsightEngagements();
|
|
7852
|
+
}
|
|
7853
|
+
/**
|
|
7854
|
+
* Constructs an observable that emits an array of boolean values representing
|
|
7855
|
+
* the current engagement settings. The observable combines the latest values from:
|
|
7856
|
+
*
|
|
7857
|
+
* 1. User's preferences for Gainsight engagements.
|
|
7858
|
+
* 2. A flag indicating if PII data should be sent.
|
|
7859
|
+
* 3. A flag indicating if the platform uses custom branding.
|
|
7860
|
+
*
|
|
7861
|
+
* @returns An observable emitting an array of boolean values.
|
|
7862
|
+
*/
|
|
7863
|
+
getEngagementSettingsObservable() {
|
|
7864
|
+
return combineLatest([
|
|
7865
|
+
this.userPreferencesService.observe(this.USER_PREFERENCES_GAINSIGHT_ENGAGEMENTS_KEY),
|
|
7866
|
+
from(this.gainsightService.shouldSendPiiData()),
|
|
7867
|
+
of(this.gainsightService.isCustomBranding())
|
|
7868
|
+
]);
|
|
7869
|
+
}
|
|
7870
|
+
/**
|
|
7871
|
+
* Updates user engagement settings based on provided preferences and settings.
|
|
7872
|
+
*
|
|
7873
|
+
* Based on the received values, the method decides to:
|
|
7874
|
+
* 1. Disable user engagements if PII data should not be shared or certain branding/settings conditions are met.
|
|
7875
|
+
* 2. Update the user engagement preference if the user engagement bot setting is undefined.
|
|
7876
|
+
*
|
|
7877
|
+
* @param userEngagementBotSetting - The user's setting for the engagement bot.
|
|
7878
|
+
* @param shouldSendPiiData - Indicates whether PII data should be shared.
|
|
7879
|
+
* @param hasCustomBranding - Indicates if custom branding is applied.
|
|
7880
|
+
*/
|
|
7881
|
+
updateUserEngagementSettings(userEngagementBotSetting, shouldSendPiiData, hasCustomBranding) {
|
|
7882
|
+
if (this.shouldDisableUserEngagementsDueToPIIData(shouldSendPiiData)) {
|
|
7883
|
+
this.userEngagementsEnabled$.next(false);
|
|
7884
|
+
}
|
|
7885
|
+
else if (this.isUserEngagementBotSettingUndefined(userEngagementBotSetting)) {
|
|
7886
|
+
/**
|
|
7887
|
+
* Case where the user is new (freshly created) and has not changed the user engagement settings in the user edit modal (untouched state).
|
|
7888
|
+
* When custom branding is not set, we will set the user engagements in the user preferences to true by default.
|
|
7889
|
+
*/
|
|
7890
|
+
this.updateUserEngagementPreference(!hasCustomBranding);
|
|
7891
|
+
}
|
|
7892
|
+
else {
|
|
7893
|
+
this.userEngagementsEnabled$.next(userEngagementBotSetting);
|
|
7894
|
+
}
|
|
7895
|
+
}
|
|
7896
|
+
/**
|
|
7897
|
+
* Determines whether user engagements should be disabled due to PII data settings.
|
|
7898
|
+
*
|
|
7899
|
+
* If the `shouldSendPiiData` parameter is false, this indicates that the user engagements
|
|
7900
|
+
* should be disabled to prevent sharing personally identifiable information.
|
|
7901
|
+
*
|
|
7902
|
+
* @param {boolean} shouldSendPiiData - Indicates whether PII data is allowed to be sent.
|
|
7903
|
+
* @returns {boolean} Returns true if user engagements should be disabled, otherwise false.
|
|
7904
|
+
*/
|
|
7905
|
+
shouldDisableUserEngagementsDueToPIIData(shouldSendPiiData) {
|
|
7906
|
+
return !shouldSendPiiData;
|
|
7907
|
+
}
|
|
7908
|
+
/**
|
|
7909
|
+
* Determines if the user engagement bot setting is undefined.
|
|
7910
|
+
*
|
|
7911
|
+
* @param {boolean | undefined} userEngagementBotSetting - The setting value to check.
|
|
7912
|
+
* @returns {boolean} Returns `true` if the setting is undefined; otherwise, `false`.
|
|
7913
|
+
*
|
|
7914
|
+
* This scenario occurs when a user is new and hasn't modified the bot settings in the user details UI yet.
|
|
7915
|
+
*/
|
|
7916
|
+
isUserEngagementBotSettingUndefined(userEngagementBotSetting) {
|
|
7917
|
+
return userEngagementBotSetting === undefined;
|
|
7918
|
+
}
|
|
7919
|
+
/**
|
|
7920
|
+
* Enables the visibility of Gainsight engagements.
|
|
7921
|
+
*
|
|
7922
|
+
* This method removes the CSS styles that hide the Gainsight engagements
|
|
7923
|
+
* and updates the relevant user attribute to mark the engagements as visible.
|
|
7924
|
+
*/
|
|
7925
|
+
showGainsightEngagements() {
|
|
7926
|
+
this.removeHidingStyle(this.HIDE_GAINSIGHT_BOT_STYLE_ID);
|
|
7927
|
+
this.gainsightService.updateUserAttribute(this.ENGAGEMENTS, true);
|
|
7928
|
+
}
|
|
7929
|
+
/**
|
|
7930
|
+
* Hides the Gainsight engagements.
|
|
7931
|
+
*
|
|
7932
|
+
* This method applies CSS styles to hide the Gainsight engagements
|
|
7933
|
+
* and updates the relevant user attribute to mark the engagements as hidden.
|
|
7934
|
+
*/
|
|
7935
|
+
hideGainsightEngagements() {
|
|
7936
|
+
this.addHidingStyle(this.HIDE_GAINSIGHT_BOT_STYLE_ID, '#apt-widget { display:none }');
|
|
7937
|
+
this.gainsightService.updateUserAttribute(this.ENGAGEMENTS, false);
|
|
7938
|
+
}
|
|
7939
|
+
/**
|
|
7940
|
+
* Removes the specified CSS style from the document.
|
|
7941
|
+
*
|
|
7942
|
+
* @param {string} styleId - The ID of the CSS style element to remove.
|
|
7943
|
+
*/
|
|
7944
|
+
removeHidingStyle(styleId) {
|
|
7945
|
+
const style = this.document.getElementById(styleId);
|
|
7946
|
+
style === null || style === void 0 ? void 0 : style.remove();
|
|
7947
|
+
}
|
|
7948
|
+
/**
|
|
7949
|
+
* Adds a new CSS style to the document.
|
|
7950
|
+
*
|
|
7951
|
+
* If the style with the specified ID already exists, the method will do nothing.
|
|
7952
|
+
* Otherwise, it creates a new `<style>` element with the given ID and content,
|
|
7953
|
+
* then appends it to the document head.
|
|
7954
|
+
*
|
|
7955
|
+
* @param {string} styleId - The ID to assign to the new style element.
|
|
7956
|
+
* @param {string} textContent - The CSS rules to be included in the style.
|
|
7957
|
+
*/
|
|
7958
|
+
addHidingStyle(styleId, textContent) {
|
|
7959
|
+
if (this.document.getElementById(styleId)) {
|
|
7960
|
+
return;
|
|
7961
|
+
}
|
|
7962
|
+
const style = this.document.createElement('style');
|
|
7963
|
+
style.id = styleId;
|
|
7964
|
+
style.textContent = textContent;
|
|
7965
|
+
this.document.head.appendChild(style);
|
|
7966
|
+
}
|
|
7967
|
+
}
|
|
7968
|
+
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 });
|
|
7969
|
+
UserEngagementsService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: UserEngagementsService, providedIn: 'root' });
|
|
7970
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: UserEngagementsService, decorators: [{
|
|
7971
|
+
type: Injectable,
|
|
7972
|
+
args: [{ providedIn: 'root' }]
|
|
7973
|
+
}], ctorParameters: function () {
|
|
7974
|
+
return [{ type: DOCUMENT, decorators: [{
|
|
7975
|
+
type: Inject,
|
|
7976
|
+
args: [DOCUMENT]
|
|
7977
|
+
}] }, { type: UserPreferencesService }, { type: GainsightService }];
|
|
7978
|
+
} });
|
|
7979
|
+
|
|
7730
7980
|
/**
|
|
7731
7981
|
* This module enables an tenant to activate the product experience
|
|
7732
7982
|
* software [Gainsight](https://www.gainsight.com/product-experience/) to help
|
|
7733
|
-
* and track user actions.
|
|
7734
|
-
* property `gainsightEnabled` is set to true.
|
|
7983
|
+
* and track user actions.
|
|
7735
7984
|
*/
|
|
7736
7985
|
class ProductExperienceModule {
|
|
7737
|
-
constructor(appState, gainsightService, cookieBannerService,
|
|
7986
|
+
constructor(appState, gainsightService, cookieBannerService,
|
|
7987
|
+
// Don't remove it, otherwise UserEngagementsService won't be initialized.
|
|
7988
|
+
userEngagementsService) {
|
|
7738
7989
|
this.appState = appState;
|
|
7739
7990
|
this.gainsightService = gainsightService;
|
|
7740
7991
|
this.cookieBannerService = cookieBannerService;
|
|
7741
|
-
this.
|
|
7992
|
+
this.userEngagementsService = userEngagementsService;
|
|
7993
|
+
/**
|
|
7994
|
+
* Check if the Gainsight tracking is disabled in the application apptions. If so, exit early without processing further.
|
|
7995
|
+
*/
|
|
7996
|
+
if (this.gainsightService.isTrackingDisabled()) {
|
|
7997
|
+
return;
|
|
7998
|
+
}
|
|
7999
|
+
this.toggleUserTrackingObservable();
|
|
8000
|
+
}
|
|
8001
|
+
/**
|
|
8002
|
+
* Observes several factors to determine the state of user tracking and manages the visibility of Gainsight engagements.
|
|
8003
|
+
* It watches for changes in the current tenant, the state of the cookie banner, and user's preferences for Gainsight engagements.
|
|
8004
|
+
*
|
|
8005
|
+
* 1. If the cookie banner is being displayed, it returns without making any changes.
|
|
8006
|
+
* 2. If Gainsight is disabled at the tenant level via custom properties, it returns without making any changes.
|
|
8007
|
+
* 3. If the conditions are met for loading the Gainsight tag, it loads the tag.
|
|
8008
|
+
*/
|
|
8009
|
+
toggleUserTrackingObservable() {
|
|
7742
8010
|
combineLatest([
|
|
7743
8011
|
this.appState.currentTenant.pipe(filter(Boolean)),
|
|
7744
|
-
this.cookieBannerService.isCookieBannerShowed
|
|
7745
|
-
|
|
7746
|
-
]).subscribe(([currentTenant, isCookieBannerShowed, showGainsightEngagements]) => __awaiter(this, void 0, void 0, function* () {
|
|
8012
|
+
this.cookieBannerService.isCookieBannerShowed$
|
|
8013
|
+
]).subscribe(([currentTenant, isCookieBannerShowed]) => __awaiter(this, void 0, void 0, function* () {
|
|
7747
8014
|
if (isCookieBannerShowed) {
|
|
7748
8015
|
return;
|
|
7749
8016
|
}
|
|
7750
8017
|
const { customProperties } = currentTenant;
|
|
7751
|
-
if (this.gainsightService.
|
|
7752
|
-
|
|
7753
|
-
this.gainsightService.loadTag(currentTenant);
|
|
8018
|
+
if (this.gainsightService.isGainsightDisabledAtTenantCustomProperties(customProperties)) {
|
|
8019
|
+
return;
|
|
7754
8020
|
}
|
|
7755
|
-
|
|
7756
|
-
|
|
7757
|
-
*/
|
|
7758
|
-
if (showGainsightEngagements === undefined) {
|
|
7759
|
-
showGainsightEngagements = true;
|
|
7760
|
-
userPreferencesService.set(this.gainsightService.USER_PREFERENCES_GAINSIGHT_ENGAGEMENTS_KEY, showGainsightEngagements);
|
|
8021
|
+
if (this.shouldLoadTag()) {
|
|
8022
|
+
yield this.gainsightService.loadTag(currentTenant, yield this.gainsightService.shouldSendPiiData());
|
|
7761
8023
|
}
|
|
7762
|
-
this.gainsightService.switchGainsightEngagementsVisibility(showGainsightEngagements);
|
|
7763
8024
|
}));
|
|
7764
8025
|
}
|
|
8026
|
+
/**
|
|
8027
|
+
* Determines if a tracking tag should be loaded based on cookie preferences.
|
|
8028
|
+
* @returns `true` if user cookie preferences exist, otherwise `false`.
|
|
8029
|
+
*/
|
|
8030
|
+
shouldLoadTag() {
|
|
8031
|
+
return !!this.cookieBannerService.getUserCookiePreferences();
|
|
8032
|
+
}
|
|
7765
8033
|
}
|
|
7766
|
-
ProductExperienceModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: ProductExperienceModule, deps: [{ token: AppStateService }, { token: GainsightService }, { token: CookieBannerService }, { token:
|
|
8034
|
+
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 });
|
|
7767
8035
|
ProductExperienceModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "14.0.6", ngImport: i0, type: ProductExperienceModule, declarations: [ProductExperienceDirective], exports: [ProductExperienceDirective] });
|
|
7768
|
-
ProductExperienceModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: ProductExperienceModule, providers: [GainsightService] });
|
|
8036
|
+
ProductExperienceModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: ProductExperienceModule, providers: [GainsightService, UserEngagementsService] });
|
|
7769
8037
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: ProductExperienceModule, decorators: [{
|
|
7770
8038
|
type: NgModule,
|
|
7771
8039
|
args: [{
|
|
7772
8040
|
declarations: [ProductExperienceDirective],
|
|
7773
8041
|
exports: [ProductExperienceDirective],
|
|
7774
|
-
providers: [GainsightService]
|
|
8042
|
+
providers: [GainsightService, UserEngagementsService]
|
|
7775
8043
|
}]
|
|
7776
|
-
}], ctorParameters: function () { return [{ type: AppStateService }, { type: GainsightService }, { type: CookieBannerService }, { type:
|
|
8044
|
+
}], ctorParameters: function () { return [{ type: AppStateService }, { type: GainsightService }, { type: CookieBannerService }, { type: UserEngagementsService }]; } });
|
|
7777
8045
|
|
|
7778
8046
|
class ApplicationModule {
|
|
7779
8047
|
}
|
|
@@ -18038,7 +18306,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.6", ngImpor
|
|
|
18038
18306
|
}], ctorParameters: function () { return [{ type: i1$1.UserService }, { type: ModalService }, { type: i1$8.BsModalRef }, { type: LoginService }]; } });
|
|
18039
18307
|
|
|
18040
18308
|
class UserEditComponent {
|
|
18041
|
-
constructor(state, translate, bsModalService, alert, userService, tenantLoginOptionsService, tenantService
|
|
18309
|
+
constructor(state, translate, bsModalService, alert, userService, tenantLoginOptionsService, tenantService) {
|
|
18042
18310
|
this.state = state;
|
|
18043
18311
|
this.translate = translate;
|
|
18044
18312
|
this.bsModalService = bsModalService;
|
|
@@ -18046,15 +18314,13 @@ class UserEditComponent {
|
|
|
18046
18314
|
this.userService = userService;
|
|
18047
18315
|
this.tenantLoginOptionsService = tenantLoginOptionsService;
|
|
18048
18316
|
this.tenantService = tenantService;
|
|
18049
|
-
this.userPreferencesService = userPreferencesService;
|
|
18050
|
-
this.gainsightService = gainsightService;
|
|
18051
18317
|
this.loading = false;
|
|
18052
|
-
this.
|
|
18318
|
+
this.showProductExperienceOptions = false;
|
|
18053
18319
|
this.isUsageTrackingEnabled = true;
|
|
18054
|
-
this.
|
|
18320
|
+
this.isUserEngagementPreferenceEnabled = true;
|
|
18055
18321
|
this.onUser = new EventEmitter();
|
|
18056
|
-
this.
|
|
18057
|
-
this.
|
|
18322
|
+
this.onUsageTrackingChange = new EventEmitter();
|
|
18323
|
+
this.onUserEngagementPreferenceChange = new EventEmitter();
|
|
18058
18324
|
this.onCancel = new EventEmitter();
|
|
18059
18325
|
this.userHasActiveTotp = false;
|
|
18060
18326
|
this.userCanSetupTotp = false;
|
|
@@ -18081,15 +18347,6 @@ class UserEditComponent {
|
|
|
18081
18347
|
}
|
|
18082
18348
|
});
|
|
18083
18349
|
}
|
|
18084
|
-
onEnablingProductUsageTracking(isUsageTrackingEnabled) {
|
|
18085
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
18086
|
-
if (isUsageTrackingEnabled && this.isGainsightEngagementsEnabled === undefined) {
|
|
18087
|
-
this.isGainsightEngagementsEnabled = yield this.userPreferencesService
|
|
18088
|
-
.get(this.gainsightService.USER_PREFERENCES_GAINSIGHT_ENGAGEMENTS_KEY)
|
|
18089
|
-
.toPromise();
|
|
18090
|
-
}
|
|
18091
|
-
});
|
|
18092
|
-
}
|
|
18093
18350
|
setupTotp() {
|
|
18094
18351
|
this.bsModalService.show(UserTotpSetupComponent, {
|
|
18095
18352
|
class: 'modal-sm',
|
|
@@ -18106,9 +18363,13 @@ class UserEditComponent {
|
|
|
18106
18363
|
if (this.loading) {
|
|
18107
18364
|
return;
|
|
18108
18365
|
}
|
|
18109
|
-
if (this.
|
|
18110
|
-
this.
|
|
18111
|
-
|
|
18366
|
+
if (this.showProductExperienceOptions) {
|
|
18367
|
+
this.onUsageTrackingChange.emit(this.isUsageTrackingEnabled);
|
|
18368
|
+
/**
|
|
18369
|
+
* Emits a user engagement preference change event.
|
|
18370
|
+
* If usage tracking is disabled, it emits `false`. Otherwise, it emits the current state of the user engagement preference.
|
|
18371
|
+
*/
|
|
18372
|
+
this.onUserEngagementPreferenceChange.emit(this.isUsageTrackingEnabled === false ? false : this.isUserEngagementPreferenceEnabled);
|
|
18112
18373
|
}
|
|
18113
18374
|
this.onUser.emit(this._user);
|
|
18114
18375
|
});
|
|
@@ -18138,33 +18399,33 @@ class UserEditComponent {
|
|
|
18138
18399
|
});
|
|
18139
18400
|
}
|
|
18140
18401
|
}
|
|
18141
|
-
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$1.UserService }, { token: i1$1.TenantLoginOptionsService }, { token: i1$1.TenantService }
|
|
18142
|
-
UserEditComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.0.6", type: UserEditComponent, selector: "c8y-user-edit", inputs: { loading: "loading", user: "user",
|
|
18402
|
+
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$1.UserService }, { token: i1$1.TenantLoginOptionsService }, { token: i1$1.TenantService }], target: i0.ɵɵFactoryTarget.Component });
|
|
18403
|
+
UserEditComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.0.6", type: UserEditComponent, selector: "c8y-user-edit", inputs: { loading: "loading", user: "user", showProductExperienceOptions: "showProductExperienceOptions", isUsageTrackingEnabled: "isUsageTrackingEnabled", isUserEngagementPreferenceEnabled: "isUserEngagementPreferenceEnabled" }, outputs: { onUser: "onUser", onUsageTrackingChange: "onUsageTrackingChange", onUserEngagementPreferenceChange: "onUserEngagementPreferenceChange", onCancel: "onCancel" }, ngImport: i0, template: "<form #userForm=\"ngForm\" (ngSubmit)=\"userForm.form.valid && save()\">\n <div class=\"d-block p-24 p-b-0\">\n <div class=\"alert alert-warning\" role=\"alert\" *ngIf=\"userIsExternal\" translate>\n Some of the user settings are not editable here because they are managed via your\n authorization server.\n </div>\n <c8y-form-group>\n <label translate for=\"userName\">Username</label>\n <input\n id=\"userName\"\n class=\"form-control\"\n [(ngModel)]=\"user.userName\"\n name=\"userName\"\n autocomplete=\"off\"\n required\n maxlength=\"254\"\n placeholder=\"{{ 'e.g. joe.doe@example.com`LOCALIZE`' | translate }}\"\n [disabled]=\"user.id\"\n c8yDefaultValidation=\"user\"\n />\n </c8y-form-group>\n\n <c8y-form-group>\n <label translate for=\"displayName\">Login alias</label>\n <input\n id=\"displayName\"\n class=\"form-control\"\n [(ngModel)]=\"user.displayName\"\n name=\"displayName\"\n autocomplete=\"off\"\n maxlength=\"254\"\n placeholder=\"{{ 'e.g. joe.doe`LOCALIZE`' | translate }}\"\n [disabled]=\"userIsExternal\"\n c8yDefaultValidation=\"loginAlias\"\n />\n </c8y-form-group>\n\n <c8y-form-group [hasWarning]=\"!user.email\">\n <label translate for=\"userEmail\">Email</label>\n <input\n id=\"userEmail\"\n class=\"form-control\"\n type=\"email\"\n name=\"email\"\n [maxlength]=\"254\"\n autocomplete=\"off\"\n placeholder=\"{{ 'e.g. joe.doe@example.com`LOCALIZE`' | translate }}\"\n [(ngModel)]=\"user.email\"\n email\n [required]=\"true\"\n [disabled]=\"userIsExternal\"\n />\n </c8y-form-group>\n\n <div class=\"row\">\n <div class=\"col-sm-6\">\n <c8y-form-group>\n <label translate for=\"userFirstName\">First name</label>\n <input\n id=\"userFirstName\"\n class=\"form-control\"\n autocomplete=\"off\"\n placeholder=\"{{ 'e.g. Joe`LOCALIZE`' | translate }}\"\n maxlength=\"50\"\n name=\"firstName\"\n [(ngModel)]=\"user.firstName\"\n [disabled]=\"userIsExternal\"\n />\n </c8y-form-group>\n </div>\n <div class=\"col-sm-6\">\n <c8y-form-group>\n <label translate for=\"userLastName\">Last name</label>\n <input\n id=\"userLastName\"\n class=\"form-control\"\n autocomplete=\"off\"\n placeholder=\"{{ 'e.g. Doe`LOCALIZE`' | translate }}\"\n maxlength=\"50\"\n name=\"lastName\"\n [(ngModel)]=\"user.lastName\"\n [disabled]=\"userIsExternal\"\n />\n </c8y-form-group>\n </div>\n </div>\n\n <c8y-form-group>\n <label translate for=\"userTelephone\">Telephone</label>\n <input\n id=\"userTelephone\"\n class=\"form-control\"\n autocomplete=\"off\"\n name=\"phone\"\n maxlength=\"254\"\n [(ngModel)]=\"user.phone\"\n placeholder=\"{{ 'e.g. +49 9 876 543 210`LOCALIZE`' | translate }}\"\n c8yPhoneValidation\n [required]=\"isPhoneRequired\"\n [disabled]=\"userIsExternal\"\n />\n </c8y-form-group>\n\n <c8y-form-group class=\"p-t-16 separator-top\" *ngIf=\"showProductExperienceOptions\">\n <label translate>Product experience</label>\n <label class=\"c8y-switch\" for=\"productUsageTracking\">\n <input\n id=\"productUsageTracking\"\n name=\"productUsageTracking\"\n type=\"checkbox\"\n [(ngModel)]=\"isUsageTrackingEnabled\"\n />\n <span></span>\n {{ 'Enable personalized product experience tracking' | translate }}\n </label>\n <ng-container *ngIf=\"isUsageTrackingEnabled\">\n <label class=\"c8y-switch m-l-0\" for=\"userEngagementPreference\">\n <input\n id=\"userEngagementPreference\"\n name=\"userEngagementPreference\"\n type=\"checkbox\"\n [(ngModel)]=\"isUserEngagementPreferenceEnabled\"\n />\n <span></span>\n {{ 'Enable in-product information & communication' | translate }}\n </label>\n </ng-container>\n </c8y-form-group>\n\n <div class=\"form-group p-t-16 separator-top\" *ngIf=\"!userIsExternal\">\n <label class=\"control-label\">{{ 'Login options' | translate }}</label>\n <c8y-new-password (password)=\"onNewPasswordChanged($event)\"></c8y-new-password>\n <button\n class=\"btn btn-default\"\n type=\"button\"\n title=\"{{ 'Set up two-factor authentication' | translate }}\"\n (click)=\"setupTotp()\"\n *ngIf=\"userCanSetupTotp && !userHasActiveTotp && isTfaEnabled\"\n >\n {{ 'Set up two-factor authentication' | translate }}\n </button>\n </div>\n\n <c8y-form-group *ngIf=\"!!(state.state$ | async).newsletter\">\n <label translate>Newsletter</label>\n <label\n title=\"{{ 'Send me information about outages, maintenance or updates.' | translate }}\"\n class=\"c8y-checkbox\"\n >\n <input\n type=\"checkbox\"\n name=\"newsletter\"\n [(ngModel)]=\"user.newsletter\"\n [disabled]=\"userIsExternal\"\n />\n <span></span>\n <span>\n {{ 'Send me information about outages, maintenance or updates.' | translate }}\n </span>\n </label>\n </c8y-form-group>\n </div>\n <div class=\"modal-footer separator-top bg-level-0 sticky-bottom\">\n <button\n class=\"btn btn-default\"\n type=\"button\"\n title=\"{{ 'Cancel' | translate }}\"\n (click)=\"cancel()\"\n >\n {{ 'Cancel' | translate }}\n </button>\n <button\n class=\"btn btn-primary\"\n type=\"submit\"\n title=\"{{ 'Save' | translate }}\"\n [disabled]=\"!userForm.form.valid || userForm.form.pristine || loading\"\n >\n {{ 'Save' | translate }}\n </button>\n </div>\n</form>\n", dependencies: [{ kind: "directive", type: PhoneValidationDirective, selector: "[c8yPhoneValidation]" }, { kind: "directive", type: DefaultValidationDirective, selector: "[c8yDefaultValidation]", inputs: ["c8yDefaultValidation"] }, { kind: "directive", type: i5.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i5.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: i5.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i5.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i5.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i5.MaxLengthValidator, selector: "[maxlength][formControlName],[maxlength][formControl],[maxlength][ngModel]", inputs: ["maxlength"] }, { kind: "directive", type: i5.EmailValidator, selector: "[email][formControlName],[email][formControl],[email][ngModel]", inputs: ["email"] }, { kind: "directive", type: i5.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i5.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: i3.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: i3.AsyncPipe, name: "async" }] });
|
|
18143
18404
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: UserEditComponent, decorators: [{
|
|
18144
18405
|
type: Component,
|
|
18145
|
-
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</label>\n <input\n id=\"userName\"\n class=\"form-control\"\n [(ngModel)]=\"user.userName\"\n name=\"userName\"\n autocomplete=\"off\"\n required\n maxlength=\"254\"\n placeholder=\"{{ 'e.g. joe.doe@example.com`LOCALIZE`' | translate }}\"\n [disabled]=\"user.id\"\n c8yDefaultValidation=\"user\"\n />\n </c8y-form-group>\n\n <c8y-form-group>\n <label translate for=\"displayName\">Login alias</label>\n <input\n id=\"displayName\"\n class=\"form-control\"\n [(ngModel)]=\"user.displayName\"\n name=\"displayName\"\n autocomplete=\"off\"\n maxlength=\"254\"\n placeholder=\"{{ 'e.g. joe.doe`LOCALIZE`' | translate }}\"\n [disabled]=\"userIsExternal\"\n c8yDefaultValidation=\"loginAlias\"\n />\n </c8y-form-group>\n\n <c8y-form-group [hasWarning]=\"!user.email\">\n <label translate for=\"userEmail\">Email</label>\n <input\n id=\"userEmail\"\n class=\"form-control\"\n type=\"email\"\n name=\"email\"\n [maxlength]=\"254\"\n autocomplete=\"off\"\n placeholder=\"{{ 'e.g. joe.doe@example.com`LOCALIZE`' | translate }}\"\n [(ngModel)]=\"user.email\"\n email\n [required]=\"true\"\n [disabled]=\"userIsExternal\"\n />\n </c8y-form-group>\n\n <div class=\"row\">\n <div class=\"col-sm-6\">\n <c8y-form-group>\n <label translate for=\"userFirstName\">First name</label>\n <input\n id=\"userFirstName\"\n class=\"form-control\"\n autocomplete=\"off\"\n placeholder=\"{{ 'e.g. Joe`LOCALIZE`' | translate }}\"\n maxlength=\"50\"\n name=\"firstName\"\n [(ngModel)]=\"user.firstName\"\n [disabled]=\"userIsExternal\"\n />\n </c8y-form-group>\n </div>\n <div class=\"col-sm-6\">\n <c8y-form-group>\n <label translate for=\"userLastName\">Last name</label>\n <input\n id=\"userLastName\"\n class=\"form-control\"\n autocomplete=\"off\"\n placeholder=\"{{ 'e.g. Doe`LOCALIZE`' | translate }}\"\n maxlength=\"50\"\n name=\"lastName\"\n [(ngModel)]=\"user.lastName\"\n [disabled]=\"userIsExternal\"\n />\n </c8y-form-group>\n </div>\n </div>\n\n <c8y-form-group>\n <label translate for=\"userTelephone\">Telephone</label>\n <input\n id=\"userTelephone\"\n class=\"form-control\"\n autocomplete=\"off\"\n name=\"phone\"\n maxlength=\"254\"\n [(ngModel)]=\"user.phone\"\n placeholder=\"{{ 'e.g. +49 9 876 543 210`LOCALIZE`' | translate }}\"\n c8yPhoneValidation\n [required]=\"isPhoneRequired\"\n [disabled]=\"userIsExternal\"\n />\n </c8y-form-group>\n\n <c8y-form-group class=\"p-t-16 separator-top\" *ngIf=\"
|
|
18146
|
-
}], ctorParameters: function () { return [{ type: AppStateService }, { type: TranslateService }, { type: i1$8.BsModalService }, { type: AlertService }, { type: i1$1.UserService }, { type: i1$1.TenantLoginOptionsService }, { type: i1$1.TenantService }
|
|
18406
|
+
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</label>\n <input\n id=\"userName\"\n class=\"form-control\"\n [(ngModel)]=\"user.userName\"\n name=\"userName\"\n autocomplete=\"off\"\n required\n maxlength=\"254\"\n placeholder=\"{{ 'e.g. joe.doe@example.com`LOCALIZE`' | translate }}\"\n [disabled]=\"user.id\"\n c8yDefaultValidation=\"user\"\n />\n </c8y-form-group>\n\n <c8y-form-group>\n <label translate for=\"displayName\">Login alias</label>\n <input\n id=\"displayName\"\n class=\"form-control\"\n [(ngModel)]=\"user.displayName\"\n name=\"displayName\"\n autocomplete=\"off\"\n maxlength=\"254\"\n placeholder=\"{{ 'e.g. joe.doe`LOCALIZE`' | translate }}\"\n [disabled]=\"userIsExternal\"\n c8yDefaultValidation=\"loginAlias\"\n />\n </c8y-form-group>\n\n <c8y-form-group [hasWarning]=\"!user.email\">\n <label translate for=\"userEmail\">Email</label>\n <input\n id=\"userEmail\"\n class=\"form-control\"\n type=\"email\"\n name=\"email\"\n [maxlength]=\"254\"\n autocomplete=\"off\"\n placeholder=\"{{ 'e.g. joe.doe@example.com`LOCALIZE`' | translate }}\"\n [(ngModel)]=\"user.email\"\n email\n [required]=\"true\"\n [disabled]=\"userIsExternal\"\n />\n </c8y-form-group>\n\n <div class=\"row\">\n <div class=\"col-sm-6\">\n <c8y-form-group>\n <label translate for=\"userFirstName\">First name</label>\n <input\n id=\"userFirstName\"\n class=\"form-control\"\n autocomplete=\"off\"\n placeholder=\"{{ 'e.g. Joe`LOCALIZE`' | translate }}\"\n maxlength=\"50\"\n name=\"firstName\"\n [(ngModel)]=\"user.firstName\"\n [disabled]=\"userIsExternal\"\n />\n </c8y-form-group>\n </div>\n <div class=\"col-sm-6\">\n <c8y-form-group>\n <label translate for=\"userLastName\">Last name</label>\n <input\n id=\"userLastName\"\n class=\"form-control\"\n autocomplete=\"off\"\n placeholder=\"{{ 'e.g. Doe`LOCALIZE`' | translate }}\"\n maxlength=\"50\"\n name=\"lastName\"\n [(ngModel)]=\"user.lastName\"\n [disabled]=\"userIsExternal\"\n />\n </c8y-form-group>\n </div>\n </div>\n\n <c8y-form-group>\n <label translate for=\"userTelephone\">Telephone</label>\n <input\n id=\"userTelephone\"\n class=\"form-control\"\n autocomplete=\"off\"\n name=\"phone\"\n maxlength=\"254\"\n [(ngModel)]=\"user.phone\"\n placeholder=\"{{ 'e.g. +49 9 876 543 210`LOCALIZE`' | translate }}\"\n c8yPhoneValidation\n [required]=\"isPhoneRequired\"\n [disabled]=\"userIsExternal\"\n />\n </c8y-form-group>\n\n <c8y-form-group class=\"p-t-16 separator-top\" *ngIf=\"showProductExperienceOptions\">\n <label translate>Product experience</label>\n <label class=\"c8y-switch\" for=\"productUsageTracking\">\n <input\n id=\"productUsageTracking\"\n name=\"productUsageTracking\"\n type=\"checkbox\"\n [(ngModel)]=\"isUsageTrackingEnabled\"\n />\n <span></span>\n {{ 'Enable personalized product experience tracking' | translate }}\n </label>\n <ng-container *ngIf=\"isUsageTrackingEnabled\">\n <label class=\"c8y-switch m-l-0\" for=\"userEngagementPreference\">\n <input\n id=\"userEngagementPreference\"\n name=\"userEngagementPreference\"\n type=\"checkbox\"\n [(ngModel)]=\"isUserEngagementPreferenceEnabled\"\n />\n <span></span>\n {{ 'Enable in-product information & communication' | translate }}\n </label>\n </ng-container>\n </c8y-form-group>\n\n <div class=\"form-group p-t-16 separator-top\" *ngIf=\"!userIsExternal\">\n <label class=\"control-label\">{{ 'Login options' | translate }}</label>\n <c8y-new-password (password)=\"onNewPasswordChanged($event)\"></c8y-new-password>\n <button\n class=\"btn btn-default\"\n type=\"button\"\n title=\"{{ 'Set up two-factor authentication' | translate }}\"\n (click)=\"setupTotp()\"\n *ngIf=\"userCanSetupTotp && !userHasActiveTotp && isTfaEnabled\"\n >\n {{ 'Set up two-factor authentication' | translate }}\n </button>\n </div>\n\n <c8y-form-group *ngIf=\"!!(state.state$ | async).newsletter\">\n <label translate>Newsletter</label>\n <label\n title=\"{{ 'Send me information about outages, maintenance or updates.' | translate }}\"\n class=\"c8y-checkbox\"\n >\n <input\n type=\"checkbox\"\n name=\"newsletter\"\n [(ngModel)]=\"user.newsletter\"\n [disabled]=\"userIsExternal\"\n />\n <span></span>\n <span>\n {{ 'Send me information about outages, maintenance or updates.' | translate }}\n </span>\n </label>\n </c8y-form-group>\n </div>\n <div class=\"modal-footer separator-top bg-level-0 sticky-bottom\">\n <button\n class=\"btn btn-default\"\n type=\"button\"\n title=\"{{ 'Cancel' | translate }}\"\n (click)=\"cancel()\"\n >\n {{ 'Cancel' | translate }}\n </button>\n <button\n class=\"btn btn-primary\"\n type=\"submit\"\n title=\"{{ 'Save' | translate }}\"\n [disabled]=\"!userForm.form.valid || userForm.form.pristine || loading\"\n >\n {{ 'Save' | translate }}\n </button>\n </div>\n</form>\n" }]
|
|
18407
|
+
}], ctorParameters: function () { return [{ type: AppStateService }, { type: TranslateService }, { type: i1$8.BsModalService }, { type: AlertService }, { type: i1$1.UserService }, { type: i1$1.TenantLoginOptionsService }, { type: i1$1.TenantService }]; }, propDecorators: { loading: [{
|
|
18147
18408
|
type: Input
|
|
18148
18409
|
}], user: [{
|
|
18149
18410
|
type: Input
|
|
18150
|
-
}],
|
|
18411
|
+
}], showProductExperienceOptions: [{
|
|
18151
18412
|
type: Input
|
|
18152
18413
|
}], isUsageTrackingEnabled: [{
|
|
18153
18414
|
type: Input
|
|
18154
|
-
}],
|
|
18415
|
+
}], isUserEngagementPreferenceEnabled: [{
|
|
18155
18416
|
type: Input
|
|
18156
18417
|
}], onUser: [{
|
|
18157
18418
|
type: Output
|
|
18158
|
-
}],
|
|
18419
|
+
}], onUsageTrackingChange: [{
|
|
18159
18420
|
type: Output
|
|
18160
|
-
}],
|
|
18421
|
+
}], onUserEngagementPreferenceChange: [{
|
|
18161
18422
|
type: Output
|
|
18162
18423
|
}], onCancel: [{
|
|
18163
18424
|
type: Output
|
|
18164
18425
|
}] } });
|
|
18165
18426
|
|
|
18166
18427
|
class UserEditModalComponent {
|
|
18167
|
-
constructor(modal, user, ui, auth, client, alert, userPreferences, c8yModalService, gainsightService, cookieBannerService, loginService, passwordService) {
|
|
18428
|
+
constructor(modal, user, ui, auth, client, alert, userPreferences, c8yModalService, gainsightService, cookieBannerService, loginService, passwordService, userEngagementsService) {
|
|
18168
18429
|
this.modal = modal;
|
|
18169
18430
|
this.user = user;
|
|
18170
18431
|
this.ui = ui;
|
|
@@ -18177,20 +18438,36 @@ class UserEditModalComponent {
|
|
|
18177
18438
|
this.cookieBannerService = cookieBannerService;
|
|
18178
18439
|
this.loginService = loginService;
|
|
18179
18440
|
this.passwordService = passwordService;
|
|
18441
|
+
this.userEngagementsService = userEngagementsService;
|
|
18180
18442
|
this.loading = false;
|
|
18181
|
-
this.
|
|
18443
|
+
this.showProductExperienceOptions = false;
|
|
18182
18444
|
}
|
|
18183
18445
|
ngOnInit() {
|
|
18184
18446
|
return __awaiter(this, void 0, void 0, function* () {
|
|
18185
18447
|
this.updateUserInAppState();
|
|
18186
|
-
|
|
18187
|
-
|
|
18188
|
-
|
|
18189
|
-
|
|
18190
|
-
|
|
18191
|
-
|
|
18192
|
-
|
|
18193
|
-
|
|
18448
|
+
yield this.setInitialProductExperienceOptions();
|
|
18449
|
+
});
|
|
18450
|
+
}
|
|
18451
|
+
/**
|
|
18452
|
+
* Initializes product experience options for the user.
|
|
18453
|
+
*
|
|
18454
|
+
* This function performs the following operations:
|
|
18455
|
+
* - Determines if the user has the permission to edit product experience options.
|
|
18456
|
+
* - If the user has the permission and functional cookies are enabled:
|
|
18457
|
+
* - Checks whether personalized product experience tracking is active.
|
|
18458
|
+
* - Checks whether in-product information and communication is active.
|
|
18459
|
+
*/
|
|
18460
|
+
setInitialProductExperienceOptions() {
|
|
18461
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
18462
|
+
this.showProductExperienceOptions =
|
|
18463
|
+
yield this.gainsightService.canEditProductExperienceSettings();
|
|
18464
|
+
if (this.showProductExperienceOptions && this.cookieBannerService.isFunctionalCookieEnabled()) {
|
|
18465
|
+
// Enable personalized product experience tracking option
|
|
18466
|
+
this.currentUsageTrackingState =
|
|
18467
|
+
!(yield this.gainsightService.isGainsightPreferenceDisabledInUserPreferences(this.gainsightService.USER_PREFERENCES_GAINSIGHT_KEY));
|
|
18468
|
+
// Enable in-product information & communication option
|
|
18469
|
+
this.currentUserEngagementPreferenceInitialState =
|
|
18470
|
+
this.userEngagementsService.userEngagementsEnabled$.value;
|
|
18194
18471
|
}
|
|
18195
18472
|
});
|
|
18196
18473
|
}
|
|
@@ -18199,11 +18476,11 @@ class UserEditModalComponent {
|
|
|
18199
18476
|
this.modal.hide();
|
|
18200
18477
|
});
|
|
18201
18478
|
}
|
|
18202
|
-
|
|
18203
|
-
this.usageTrackingState =
|
|
18479
|
+
onUsageTrackingChange(isEnabled) {
|
|
18480
|
+
this.usageTrackingState = isEnabled;
|
|
18204
18481
|
}
|
|
18205
|
-
|
|
18206
|
-
this.
|
|
18482
|
+
onUserEngagementPreferenceChange(isEnabled) {
|
|
18483
|
+
this.userEngagementPreferenceNewState = isEnabled;
|
|
18207
18484
|
}
|
|
18208
18485
|
updateAndClose(user) {
|
|
18209
18486
|
return __awaiter(this, void 0, void 0, function* () {
|
|
@@ -18222,16 +18499,7 @@ class UserEditModalComponent {
|
|
|
18222
18499
|
this.updateCredentials(user.password);
|
|
18223
18500
|
}
|
|
18224
18501
|
}
|
|
18225
|
-
|
|
18226
|
-
yield this.userPreferences.set(this.gainsightService.USER_PREFERENCES_GAINSIGHT_ENGAGEMENTS_KEY, this.gainsightEngagementsState);
|
|
18227
|
-
}
|
|
18228
|
-
if (this.currentUsageTrackingState !== this.usageTrackingState) {
|
|
18229
|
-
yield this.userPreferences.set(this.gainsightService.USER_PREFERENCES_GAINSIGHT_KEY, this.usageTrackingState);
|
|
18230
|
-
this.gainsightService.setFunctionalCookie(this.usageTrackingState);
|
|
18231
|
-
this.usageTrackingState
|
|
18232
|
-
? yield this.gainsightService.loadTag(this.client.tenant)
|
|
18233
|
-
: yield this.gainsightTrackingAppReload();
|
|
18234
|
-
}
|
|
18502
|
+
yield this.updateProductExperienceOptions();
|
|
18235
18503
|
if (user.customProperties.userOrigin !== 'OAUTH2') {
|
|
18236
18504
|
yield this.user.updateCurrent(omit(user, 'password'));
|
|
18237
18505
|
yield this.updateUserInAppState();
|
|
@@ -18263,6 +18531,38 @@ class UserEditModalComponent {
|
|
|
18263
18531
|
}
|
|
18264
18532
|
});
|
|
18265
18533
|
}
|
|
18534
|
+
updateProductExperienceOptions() {
|
|
18535
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
18536
|
+
this.updateUserEngagementsPreference();
|
|
18537
|
+
yield this.updateTrackingOption();
|
|
18538
|
+
});
|
|
18539
|
+
}
|
|
18540
|
+
/**
|
|
18541
|
+
* Updates the user engagement preference if it has changed from the initial state.
|
|
18542
|
+
* Calls the user engagements service to update the preference.
|
|
18543
|
+
*
|
|
18544
|
+
* The update only occurs if the current preference differs from the new state.
|
|
18545
|
+
*/
|
|
18546
|
+
updateUserEngagementsPreference() {
|
|
18547
|
+
if (this.currentUserEngagementPreferenceInitialState !== this.userEngagementPreferenceNewState) {
|
|
18548
|
+
this.userEngagementsService.updateUserEngagementPreference(this.userEngagementPreferenceNewState);
|
|
18549
|
+
}
|
|
18550
|
+
}
|
|
18551
|
+
/**
|
|
18552
|
+
* Asynchronously updates the tracking option for user preferences.
|
|
18553
|
+
* If the current usage tracking state differs from the new state,
|
|
18554
|
+
* it updates the Gainsight preferences and sets a functional cookie
|
|
18555
|
+
* before triggering a reload of the application.
|
|
18556
|
+
*/
|
|
18557
|
+
updateTrackingOption() {
|
|
18558
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
18559
|
+
if (this.currentUsageTrackingState !== this.usageTrackingState) {
|
|
18560
|
+
yield this.userPreferences.set(this.gainsightService.USER_PREFERENCES_GAINSIGHT_KEY, this.usageTrackingState);
|
|
18561
|
+
this.gainsightService.setFunctionalCookie(this.usageTrackingState);
|
|
18562
|
+
yield this.gainsightTrackingAppReload();
|
|
18563
|
+
}
|
|
18564
|
+
});
|
|
18565
|
+
}
|
|
18266
18566
|
updateUserInAppState() {
|
|
18267
18567
|
return __awaiter(this, void 0, void 0, function* () {
|
|
18268
18568
|
const currentUserResult = yield this.user.current();
|
|
@@ -18278,12 +18578,12 @@ class UserEditModalComponent {
|
|
|
18278
18578
|
this.auth.updateCredentials(newCredentials);
|
|
18279
18579
|
}
|
|
18280
18580
|
}
|
|
18281
|
-
UserEditModalComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: UserEditModalComponent, deps: [{ token: i1$8.BsModalRef }, { token: i1$1.UserService }, { token: AppStateService }, { token: i1$1.BasicAuth }, { token: i1$1.FetchClient }, { token: AlertService }, { token: UserPreferencesService }, { token: ModalService }, { token: GainsightService }, { token: CookieBannerService }, { token: LoginService }, { token: PasswordService }], target: i0.ɵɵFactoryTarget.Component });
|
|
18282
|
-
UserEditModalComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.0.6", type: UserEditModalComponent, selector: "c8y-user-edit-modal", ngImport: i0, template: "<c8y-modal
|
|
18581
|
+
UserEditModalComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: UserEditModalComponent, deps: [{ token: i1$8.BsModalRef }, { token: i1$1.UserService }, { token: AppStateService }, { token: i1$1.BasicAuth }, { token: i1$1.FetchClient }, { token: AlertService }, { token: UserPreferencesService }, { token: ModalService }, { token: GainsightService }, { token: CookieBannerService }, { token: LoginService }, { token: PasswordService }, { token: UserEngagementsService }], target: i0.ɵɵFactoryTarget.Component });
|
|
18582
|
+
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 [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 ></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: ["loading", "user", "showProductExperienceOptions", "isUsageTrackingEnabled", "isUserEngagementPreferenceEnabled"], outputs: ["onUser", "onUsageTrackingChange", "onUserEngagementPreferenceChange", "onCancel"] }, { kind: "pipe", type: C8yTranslatePipe, name: "translate" }, { kind: "pipe", type: i3.AsyncPipe, name: "async" }] });
|
|
18283
18583
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: UserEditModalComponent, decorators: [{
|
|
18284
18584
|
type: Component,
|
|
18285
|
-
args: [{ selector: 'c8y-user-edit-modal', template: "<c8y-modal
|
|
18286
|
-
}], ctorParameters: function () { return [{ type: i1$8.BsModalRef }, { type: i1$1.UserService }, { type: AppStateService }, { type: i1$1.BasicAuth }, { type: i1$1.FetchClient }, { type: AlertService }, { type: UserPreferencesService }, { type: ModalService }, { type: GainsightService }, { type: CookieBannerService }, { type: LoginService }, { type: PasswordService }]; } });
|
|
18585
|
+
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 [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 ></c8y-user-edit>\n</c8y-modal>\n" }]
|
|
18586
|
+
}], ctorParameters: function () { return [{ type: i1$8.BsModalRef }, { type: i1$1.UserService }, { type: AppStateService }, { type: i1$1.BasicAuth }, { type: i1$1.FetchClient }, { type: AlertService }, { type: UserPreferencesService }, { type: ModalService }, { type: GainsightService }, { type: CookieBannerService }, { type: LoginService }, { type: PasswordService }, { type: UserEngagementsService }]; } });
|
|
18287
18587
|
|
|
18288
18588
|
class UserMenuOutletComponent {
|
|
18289
18589
|
constructor(ui, bsModalService, modalService, loginService, translateService, tenantService, alertService, user, optionsService, userMenu, headerService) {
|
|
@@ -22063,8 +22363,40 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.6", ngImpor
|
|
|
22063
22363
|
type: Output
|
|
22064
22364
|
}] } });
|
|
22065
22365
|
|
|
22366
|
+
class CloseDatePickerDirective {
|
|
22367
|
+
constructor(el) {
|
|
22368
|
+
this.el = el;
|
|
22369
|
+
this.destroy$ = new Subject();
|
|
22370
|
+
}
|
|
22371
|
+
ngOnInit() {
|
|
22372
|
+
const element = this.el.nativeElement.closest('.dropdown-menu');
|
|
22373
|
+
const clickEvent$ = element
|
|
22374
|
+
? merge(fromEvent(element, 'click'), fromEvent(document, 'click'))
|
|
22375
|
+
: fromEvent(document, 'click');
|
|
22376
|
+
clickEvent$
|
|
22377
|
+
.pipe(map((event) => event.target), filter(target => !this.el.nativeElement.contains(target)), // i.e. anything which is not inside this `c8y-date-time-picker`
|
|
22378
|
+
takeUntil(this.destroy$))
|
|
22379
|
+
.subscribe(() => this.closeDatepicker.hide());
|
|
22380
|
+
}
|
|
22381
|
+
ngOnDestroy() {
|
|
22382
|
+
this.destroy$.next();
|
|
22383
|
+
this.destroy$.complete();
|
|
22384
|
+
}
|
|
22385
|
+
}
|
|
22386
|
+
CloseDatePickerDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: CloseDatePickerDirective, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Directive });
|
|
22387
|
+
CloseDatePickerDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "14.0.6", type: CloseDatePickerDirective, selector: "[closeDatepicker]", inputs: { closeDatepicker: "closeDatepicker" }, ngImport: i0 });
|
|
22388
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: CloseDatePickerDirective, decorators: [{
|
|
22389
|
+
type: Directive,
|
|
22390
|
+
args: [{
|
|
22391
|
+
selector: '[closeDatepicker]'
|
|
22392
|
+
}]
|
|
22393
|
+
}], ctorParameters: function () { return [{ type: i0.ElementRef }]; }, propDecorators: { closeDatepicker: [{
|
|
22394
|
+
type: Input
|
|
22395
|
+
}] } });
|
|
22396
|
+
|
|
22066
22397
|
class DateTimePickerComponent {
|
|
22067
|
-
constructor() {
|
|
22398
|
+
constructor(cd) {
|
|
22399
|
+
this.cd = cd;
|
|
22068
22400
|
this.defaultPlaceholder = gettext('Select a date…');
|
|
22069
22401
|
this.destroy$ = new Subject();
|
|
22070
22402
|
this.form = new FormGroup({});
|
|
@@ -22091,6 +22423,9 @@ class DateTimePickerComponent {
|
|
|
22091
22423
|
this.destroy$.next();
|
|
22092
22424
|
this.destroy$.complete();
|
|
22093
22425
|
}
|
|
22426
|
+
ngAfterViewInit() {
|
|
22427
|
+
this.cd.detectChanges();
|
|
22428
|
+
}
|
|
22094
22429
|
/**
|
|
22095
22430
|
* Control Value Accessor - If form value changes by external factor, update date property and internal form with new value.
|
|
22096
22431
|
*/
|
|
@@ -22135,12 +22470,23 @@ class DateTimePickerComponent {
|
|
|
22135
22470
|
}
|
|
22136
22471
|
}
|
|
22137
22472
|
previousDay() {
|
|
22473
|
+
const isOpen = this.datepicker.isOpen;
|
|
22138
22474
|
this.date.setDate(this.date.getDate() - 1);
|
|
22139
22475
|
this.setDatetime({ date: this.date, time: this.form.get('time').value });
|
|
22476
|
+
if (isOpen) {
|
|
22477
|
+
this.datepicker.show();
|
|
22478
|
+
}
|
|
22140
22479
|
}
|
|
22141
22480
|
nextDay() {
|
|
22481
|
+
const isOpen = this.datepicker.isOpen;
|
|
22142
22482
|
this.date.setDate(this.date.getDate() + 1);
|
|
22143
22483
|
this.setDatetime({ date: this.date, time: this.form.get('time').value });
|
|
22484
|
+
if (isOpen) {
|
|
22485
|
+
this.datepicker.show();
|
|
22486
|
+
}
|
|
22487
|
+
}
|
|
22488
|
+
hide() {
|
|
22489
|
+
this.datepicker.hide();
|
|
22144
22490
|
}
|
|
22145
22491
|
/**
|
|
22146
22492
|
* If internal form changes its value, then combine date and time into one Date and pass its ISO string value to onChange method
|
|
@@ -22169,7 +22515,7 @@ class DateTimePickerComponent {
|
|
|
22169
22515
|
this.onChange(this.date.toISOString());
|
|
22170
22516
|
}
|
|
22171
22517
|
}
|
|
22172
|
-
DateTimePickerComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: DateTimePickerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
22518
|
+
DateTimePickerComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: DateTimePickerComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
|
|
22173
22519
|
DateTimePickerComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.0.6", type: DateTimePickerComponent, selector: "c8y-date-time-picker", inputs: { _minDate: ["minDate", "_minDate"], _maxDate: ["maxDate", "_maxDate"], placeholder: "placeholder" }, providers: [
|
|
22174
22520
|
{
|
|
22175
22521
|
provide: NG_VALUE_ACCESSOR,
|
|
@@ -22181,7 +22527,7 @@ DateTimePickerComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0"
|
|
|
22181
22527
|
useExisting: forwardRef(() => DateTimePickerComponent),
|
|
22182
22528
|
multi: true
|
|
22183
22529
|
}
|
|
22184
|
-
], ngImport: i0, template: "<div class=\"datetime-picker\">\n <div class=\"form-group datepicker\">\n <input\n class=\"form-control\"\n [placeholder]=\"placeholder || defaultPlaceholder | translate\"\n bsDatepicker\n [bsConfig]=\"{ customTodayClass: 'today', dateInputFormat: 'YYYY-MM-DD' }\"\n [formControl]=\"form.get('date')\"\n (blur)=\"onTouched()\"\n [minDate]=\"minDate\"\n [maxDate]=\"maxDate\"\n />\n </div>\n <c8y-time-picker\n [formControl]=\"form.get('time')\"\n (dayBackward)=\"previousDay()\"\n (dayForward)=\"nextDay()\"\n ></c8y-time-picker>\n</div>\n", dependencies: [{ kind: "directive", type: i5.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: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i5.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i6.BsDatepickerDirective, selector: "[bsDatepicker]", inputs: ["placement", "triggers", "outsideClick", "container", "outsideEsc", "isDisabled", "minDate", "maxDate", "minMode", "daysDisabled", "datesDisabled", "datesEnabled", "dateCustomClasses", "dateTooltipTexts", "isOpen", "bsValue", "bsConfig"], outputs: ["onShown", "onHidden", "bsValueChange"], exportAs: ["bsDatepicker"] }, { kind: "directive", type: i6.BsDatepickerInputDirective, selector: "input[bsDatepicker]" }, { kind: "component", type: TimePickerComponent, selector: "c8y-time-picker", inputs: ["minDate", "maxDate", "placeholder"], outputs: ["dayForward", "dayBackward"] }, { kind: "pipe", type: C8yTranslatePipe, name: "translate" }] });
|
|
22530
|
+
], viewQueries: [{ propertyName: "datepicker", first: true, predicate: BsDatepickerDirective, descendants: true }], ngImport: i0, template: "<div class=\"datetime-picker\" [closeDatepicker]=\"datepicker\">\n <div class=\"form-group datepicker\">\n <input\n class=\"form-control\"\n [placeholder]=\"placeholder || defaultPlaceholder | translate\"\n bsDatepicker\n [outsideClick]=\"false\"\n [bsConfig]=\"{ customTodayClass: 'today', dateInputFormat: 'YYYY-MM-DD' }\"\n [formControl]=\"form.get('date')\"\n (blur)=\"onTouched()\"\n [minDate]=\"minDate\"\n [maxDate]=\"maxDate\"\n />\n </div>\n <c8y-time-picker\n [formControl]=\"form.get('time')\"\n (dayBackward)=\"previousDay()\"\n (dayForward)=\"nextDay()\"\n ></c8y-time-picker>\n</div>\n", dependencies: [{ kind: "directive", type: i5.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: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i5.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i6.BsDatepickerDirective, selector: "[bsDatepicker]", inputs: ["placement", "triggers", "outsideClick", "container", "outsideEsc", "isDisabled", "minDate", "maxDate", "minMode", "daysDisabled", "datesDisabled", "datesEnabled", "dateCustomClasses", "dateTooltipTexts", "isOpen", "bsValue", "bsConfig"], outputs: ["onShown", "onHidden", "bsValueChange"], exportAs: ["bsDatepicker"] }, { kind: "directive", type: i6.BsDatepickerInputDirective, selector: "input[bsDatepicker]" }, { kind: "component", type: TimePickerComponent, selector: "c8y-time-picker", inputs: ["minDate", "maxDate", "placeholder"], outputs: ["dayForward", "dayBackward"] }, { kind: "directive", type: CloseDatePickerDirective, selector: "[closeDatepicker]", inputs: ["closeDatepicker"] }, { kind: "pipe", type: C8yTranslatePipe, name: "translate" }] });
|
|
22185
22531
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: DateTimePickerComponent, decorators: [{
|
|
22186
22532
|
type: Component,
|
|
22187
22533
|
args: [{ selector: 'c8y-date-time-picker', providers: [
|
|
@@ -22195,8 +22541,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.6", ngImpor
|
|
|
22195
22541
|
useExisting: forwardRef(() => DateTimePickerComponent),
|
|
22196
22542
|
multi: true
|
|
22197
22543
|
}
|
|
22198
|
-
], template: "<div class=\"datetime-picker\">\n <div class=\"form-group datepicker\">\n <input\n class=\"form-control\"\n [placeholder]=\"placeholder || defaultPlaceholder | translate\"\n bsDatepicker\n [bsConfig]=\"{ customTodayClass: 'today', dateInputFormat: 'YYYY-MM-DD' }\"\n [formControl]=\"form.get('date')\"\n (blur)=\"onTouched()\"\n [minDate]=\"minDate\"\n [maxDate]=\"maxDate\"\n />\n </div>\n <c8y-time-picker\n [formControl]=\"form.get('time')\"\n (dayBackward)=\"previousDay()\"\n (dayForward)=\"nextDay()\"\n ></c8y-time-picker>\n</div>\n" }]
|
|
22199
|
-
}], ctorParameters: function () { return []; }, propDecorators: { _minDate: [{
|
|
22544
|
+
], template: "<div class=\"datetime-picker\" [closeDatepicker]=\"datepicker\">\n <div class=\"form-group datepicker\">\n <input\n class=\"form-control\"\n [placeholder]=\"placeholder || defaultPlaceholder | translate\"\n bsDatepicker\n [outsideClick]=\"false\"\n [bsConfig]=\"{ customTodayClass: 'today', dateInputFormat: 'YYYY-MM-DD' }\"\n [formControl]=\"form.get('date')\"\n (blur)=\"onTouched()\"\n [minDate]=\"minDate\"\n [maxDate]=\"maxDate\"\n />\n </div>\n <c8y-time-picker\n [formControl]=\"form.get('time')\"\n (dayBackward)=\"previousDay()\"\n (dayForward)=\"nextDay()\"\n ></c8y-time-picker>\n</div>\n" }]
|
|
22545
|
+
}], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }]; }, propDecorators: { _minDate: [{
|
|
22200
22546
|
type: Input,
|
|
22201
22547
|
args: ['minDate']
|
|
22202
22548
|
}], _maxDate: [{
|
|
@@ -22204,6 +22550,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.6", ngImpor
|
|
|
22204
22550
|
args: ['maxDate']
|
|
22205
22551
|
}], placeholder: [{
|
|
22206
22552
|
type: Input
|
|
22553
|
+
}], datepicker: [{
|
|
22554
|
+
type: ViewChild,
|
|
22555
|
+
args: [BsDatepickerDirective]
|
|
22207
22556
|
}] } });
|
|
22208
22557
|
|
|
22209
22558
|
class FieldDateTime extends FieldType {
|
|
@@ -22263,7 +22612,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.6", ngImpor
|
|
|
22263
22612
|
class DateTimePickerModule {
|
|
22264
22613
|
}
|
|
22265
22614
|
DateTimePickerModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: DateTimePickerModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
|
|
22266
|
-
DateTimePickerModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "14.0.6", ngImport: i0, type: DateTimePickerModule, declarations: [DateTimePickerComponent], imports: [FormsModule,
|
|
22615
|
+
DateTimePickerModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "14.0.6", ngImport: i0, type: DateTimePickerModule, declarations: [DateTimePickerComponent, CloseDatePickerDirective], imports: [FormsModule,
|
|
22267
22616
|
CommonModule$1,
|
|
22268
22617
|
FormsModule$1,
|
|
22269
22618
|
ReactiveFormsModule, i6.BsDatepickerModule, CommonModule,
|
|
@@ -22288,7 +22637,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.6", ngImpor
|
|
|
22288
22637
|
TimePickerModule
|
|
22289
22638
|
],
|
|
22290
22639
|
exports: [DateTimePickerComponent],
|
|
22291
|
-
declarations: [DateTimePickerComponent]
|
|
22640
|
+
declarations: [DateTimePickerComponent, CloseDatePickerDirective]
|
|
22292
22641
|
}]
|
|
22293
22642
|
}] });
|
|
22294
22643
|
|
|
@@ -29013,5 +29362,5 @@ class RealtimeMessage {
|
|
|
29013
29362
|
* Generated bundle index. Do not edit.
|
|
29014
29363
|
*/
|
|
29015
29364
|
|
|
29016
|
-
export { ACTIONS, ARRAY_VALIDATION_PREFIX, AbstractConfigurationStrategy, ActionBarComponent, ActionBarItemComponent, ActionBarModule, ActionBarService, ActionComponent, ActionModule, ActionOutletComponent, ActionService, AlarmRealtimeService, AlertComponent, AlertDetailsComponent, AlertModule, AlertOutletBase, AlertOutletComponent, AlertService, AlertTextComponent, AppIconComponent, AppStateService, AppSwitcherComponent, AppSwitcherService, ApplicationModule, 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, DrawerModule, DrawerOutletComponent, DrawerService, DropAreaComponent, DropAreaModule, DropdownDirectionDirective, DynamicBulkDetailsResolver, DynamicBulkIIdentifiedResolver, DynamicComponentAlert, DynamicComponentAlertAggregator, DynamicComponentComponent, DynamicComponentErrorStrategy, DynamicComponentModule, DynamicComponentService, DynamicDatapointsResolver, DynamicFormsModule, DynamicManagedObjectResolver, DynamicResolverService, ES_MAX_TIME_MILLISECONDS, EmailsValidatorDirective, EmptyComponent, EmptyStateComponent, EventRealtimeService, ExtensionPointForPlugins, ExtensionPointWithoutStateForPlugins, ExtractArrayValidationErrorsPipe, FilePickerComponent, FilePickerModule, FilePickerNewComponent, FilePickerNewModule, FilesService, FilterInputComponent, FilterNonArrayValidationErrorsPipe, FilteringActionType, FilteringFormRendererComponent, FilteringFormRendererContext, FilteringFormRendererDefDirective, ForOfDirective, FormGroupComponent, FormsModule, GENERIC_FILE_TYPE, GainsightService, GenericFileIconPipe, 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, HumanizeValidationMessagePipe, 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, MoNamePipe, ModalComponent, ModalModule, ModalSelectionMode, ModalService, NEEDED_ROLE_FOR_SETUP, NUMBER_FORMAT_REGEXP, NavigatorBottomModule, NavigatorIconComponent, NavigatorModule, NavigatorNode, NavigatorNodeComponent, NavigatorNodeRoot, NavigatorOutletComponent, NavigatorService, NavigatorTopModule, NewPasswordComponent, NumberPipe, OperationBulkRealtimeService, OperationRealtimeService, OperationResultComponent, OptionsService, OutletDirective, PRODUCT_EXPERIENCE_EVENT_SOURCE, PX_ACTIONS, PX_EVENT_NAME, PackageType, PasswordCheckListComponent, PasswordConfirm, PasswordConfirmModalComponent, 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, 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, UiSettingsComponent, UiSettingsModule, 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, asyncValidateArrayElements, deviceAvailabilityIconMap, extraRoutes, fromFactories, fromTrigger, fromTriggerOnce, getActivatedRoute, getAngularLocalesLanguageString, getBasicInputArrayFormFieldConfig, getInjectedHooks, gettext, hookAction, hookActionBar, hookBreadcrumb, hookComponent, hookDocs, hookDrawer, 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, removeDuplicatesIds, resolveInjectedFactories, retryWithDelay, simpleJsonPathValidator, sortByPriority, stateToFactory, statusAlert, statusClasses, statusIcons, throttle, toObservable, toObservableOfArrays, tooltips, translateLoaderFactory, trimTranslationKey, uniqueInCollectionByPathValidator, validateArrayElements };
|
|
29365
|
+
export { ACTIONS, ARRAY_VALIDATION_PREFIX, AbstractConfigurationStrategy, ActionBarComponent, ActionBarItemComponent, ActionBarModule, ActionBarService, ActionComponent, ActionModule, ActionOutletComponent, ActionService, AlarmRealtimeService, AlertComponent, AlertDetailsComponent, AlertModule, AlertOutletBase, AlertOutletComponent, AlertService, AlertTextComponent, AppIconComponent, AppStateService, AppSwitcherComponent, AppSwitcherService, ApplicationModule, 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, DrawerModule, DrawerOutletComponent, DrawerService, DropAreaComponent, DropAreaModule, DropdownDirectionDirective, DynamicBulkDetailsResolver, DynamicBulkIIdentifiedResolver, DynamicComponentAlert, DynamicComponentAlertAggregator, DynamicComponentComponent, DynamicComponentErrorStrategy, DynamicComponentModule, DynamicComponentService, DynamicDatapointsResolver, DynamicFormsModule, DynamicManagedObjectResolver, DynamicResolverService, ES_MAX_TIME_MILLISECONDS, EmailsValidatorDirective, EmptyComponent, EmptyStateComponent, EventRealtimeService, ExtensionPointForPlugins, ExtensionPointWithoutStateForPlugins, ExtractArrayValidationErrorsPipe, FilePickerComponent, FilePickerModule, FilePickerNewComponent, FilePickerNewModule, FilesService, FilterInputComponent, FilterNonArrayValidationErrorsPipe, FilteringActionType, FilteringFormRendererComponent, FilteringFormRendererContext, FilteringFormRendererDefDirective, ForOfDirective, FormGroupComponent, FormsModule, GENERIC_FILE_TYPE, GainsightService, GenericFileIconPipe, 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, HumanizeValidationMessagePipe, 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, MoNamePipe, ModalComponent, ModalModule, ModalSelectionMode, ModalService, NEEDED_ROLE_FOR_SETUP, NUMBER_FORMAT_REGEXP, NavigatorBottomModule, NavigatorIconComponent, NavigatorModule, NavigatorNode, NavigatorNodeComponent, NavigatorNodeRoot, NavigatorOutletComponent, NavigatorService, NavigatorTopModule, NewPasswordComponent, NumberPipe, OperationBulkRealtimeService, OperationRealtimeService, OperationResultComponent, OptionsService, OutletDirective, PRODUCT_EXPERIENCE_EVENT_SOURCE, PX_ACTIONS, PX_EVENT_NAME, PackageType, PasswordCheckListComponent, PasswordConfirm, PasswordConfirmModalComponent, 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, 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, UiSettingsComponent, UiSettingsModule, 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, asyncValidateArrayElements, deviceAvailabilityIconMap, extraRoutes, fromFactories, fromTrigger, fromTriggerOnce, getActivatedRoute, getAngularLocalesLanguageString, getBasicInputArrayFormFieldConfig, getInjectedHooks, gettext, hookAction, hookActionBar, hookBreadcrumb, hookComponent, hookDocs, hookDrawer, 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, removeDuplicatesIds, resolveInjectedFactories, retryWithDelay, simpleJsonPathValidator, sortByPriority, stateToFactory, statusAlert, statusClasses, statusIcons, throttle, toObservable, toObservableOfArrays, tooltips, translateLoaderFactory, trimTranslationKey, uniqueInCollectionByPathValidator, validateArrayElements };
|
|
29017
29366
|
//# sourceMappingURL=c8y-ngx-components.mjs.map
|