@c8y/ngx-components 1018.0.176 → 1018.0.186
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/dashboard/widget-time-context.component.mjs +3 -3
- 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/esm2020/ecosystem/packages/package-details/package-details.component.mjs +2 -1
- 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-ecosystem.mjs +1 -0
- package/fesm2015/c8y-ngx-components-ecosystem.mjs.map +1 -1
- package/fesm2015/c8y-ngx-components.mjs +518 -169
- 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-ecosystem.mjs +1 -0
- package/fesm2020/c8y-ngx-components-ecosystem.mjs.map +1 -1
- package/fesm2020/c8y-ngx-components.mjs +513 -163
- 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 * as i1$1 from '@c8y/client';
|
|
|
23
23
|
import { OperationStatus, TenantLoginOptionType, UserManagementSource, GrantType, ApplicationType, ApplicationAvailability, FetchClient, Client, PasswordStrength, QueriesUtil, InventoryService, UserService, ApplicationService, TenantService, Service } from '@c8y/client';
|
|
24
24
|
import { satisfies, compare, coerce } from 'semver';
|
|
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';
|
|
@@ -7159,7 +7159,7 @@ class CookieBannerService {
|
|
|
7159
7159
|
return JSON.parse(localStorage.getItem(this.STORAGE_KEY));
|
|
7160
7160
|
}
|
|
7161
7161
|
/**
|
|
7162
|
-
* Verifies that cookie preferences configuration is defined.
|
|
7162
|
+
* Verifies that cookie preferences configuration is defined in the application options.
|
|
7163
7163
|
* @returns {boolean} Returns if the cookie preferences configuration is defined.
|
|
7164
7164
|
*/
|
|
7165
7165
|
isConfigCookiePreferencesDefined() {
|
|
@@ -7227,8 +7227,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.6", ngImpor
|
|
|
7227
7227
|
* tag and
|
|
7228
7228
|
*/
|
|
7229
7229
|
class GainsightService {
|
|
7230
|
-
constructor(
|
|
7231
|
-
this.document = document;
|
|
7230
|
+
constructor(appState, options, cookieBannerService, userPreferencesService, translateService) {
|
|
7232
7231
|
this.appState = appState;
|
|
7233
7232
|
this.options = options;
|
|
7234
7233
|
this.cookieBannerService = cookieBannerService;
|
|
@@ -7238,6 +7237,11 @@ class GainsightService {
|
|
|
7238
7237
|
* A subject that emits the tag function as soon as a new tag is set.
|
|
7239
7238
|
*/
|
|
7240
7239
|
this.tagFunction$ = new BehaviorSubject(null);
|
|
7240
|
+
this.trackingLoaded$ = new Subject();
|
|
7241
|
+
/**
|
|
7242
|
+
* 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.
|
|
7243
|
+
* Otherwise, only the required data is transmitted during the identity step execution.
|
|
7244
|
+
*/
|
|
7241
7245
|
this.USER_PREFERENCES_GAINSIGHT_KEY = 'gainsightEnabled';
|
|
7242
7246
|
/**
|
|
7243
7247
|
* The name of the key remained unchanged, but applies to all engagements.
|
|
@@ -7249,13 +7253,21 @@ class GainsightService {
|
|
|
7249
7253
|
this.SCRIPT_EXECUTION_WAIT_TIME = 500;
|
|
7250
7254
|
this.OPTIONS_KEY_CATEGORY = 'gainsight';
|
|
7251
7255
|
this.OPTIONS_KEY_NAME = 'api.key';
|
|
7252
|
-
this.ENGAGEMENTS = 'engagements';
|
|
7253
7256
|
this.isScriptLoaded = false;
|
|
7254
7257
|
}
|
|
7258
|
+
/**
|
|
7259
|
+
* Checks if the specified Gainsight preference is disabled in user preferences.
|
|
7260
|
+
* @param preferenceName - Name of the Gainsight preference.
|
|
7261
|
+
* @returns A promise that resolves to `true` if the preference is disabled, otherwise `false`.
|
|
7262
|
+
*/
|
|
7255
7263
|
async isGainsightPreferenceDisabledInUserPreferences(preferenceName) {
|
|
7256
7264
|
const userGainsightPref = await this.userPreferencesService.get(preferenceName).toPromise();
|
|
7257
7265
|
return userGainsightPref === false;
|
|
7258
7266
|
}
|
|
7267
|
+
/**
|
|
7268
|
+
* Sets the state of the functional cookie.
|
|
7269
|
+
* @param value - A boolean value to indicate whether the functional cookie should be enabled (`true`) or disabled (`false`).
|
|
7270
|
+
*/
|
|
7259
7271
|
setFunctionalCookie(value) {
|
|
7260
7272
|
const cookies = this.cookieBannerService.getUserCookiePreferences();
|
|
7261
7273
|
if (cookies) {
|
|
@@ -7284,56 +7296,119 @@ class GainsightService {
|
|
|
7284
7296
|
/**
|
|
7285
7297
|
* Load the script tag and calls the identify function to start the tracking.
|
|
7286
7298
|
* @param currentTenant The current tenant.
|
|
7287
|
-
* @param
|
|
7299
|
+
* @param sendPiiData Flag for sending personally identifiable information (PII) during identification in Gainsight.
|
|
7288
7300
|
*/
|
|
7289
|
-
async loadTag(currentTenant,
|
|
7301
|
+
async loadTag(currentTenant, sendPiiData) {
|
|
7290
7302
|
const scriptTag = document.createElement('script');
|
|
7291
7303
|
const key = await this.getGainsightKey();
|
|
7292
7304
|
if (key && !this.isScriptLoaded) {
|
|
7293
7305
|
this.loadScriptTag(scriptTag, key);
|
|
7294
|
-
|
|
7306
|
+
const currentUserStream = this.appState.currentUser;
|
|
7307
|
+
const scriptLoadStream = fromEvent(scriptTag, 'load');
|
|
7308
|
+
const versionStream = this.appState.state$.pipe(filter(({ versions }) => versions.backend), map(({ versions }) => versions), take(1));
|
|
7309
|
+
const sourceStreams = sendPiiData
|
|
7310
|
+
? [currentUserStream, scriptLoadStream, versionStream]
|
|
7311
|
+
: [currentUserStream, scriptLoadStream];
|
|
7312
|
+
combineLatest(sourceStreams)
|
|
7295
7313
|
.pipe(delay(this.SCRIPT_EXECUTION_WAIT_TIME), filter(([user, scriptEvent]) => !!(scriptEvent && user)))
|
|
7296
|
-
.subscribe(
|
|
7314
|
+
.subscribe(args => {
|
|
7315
|
+
const [user, , versions] = args;
|
|
7316
|
+
this.setGlobalContext();
|
|
7297
7317
|
const instanceId = this.getInstanceIdFromUrl();
|
|
7298
|
-
if (
|
|
7299
|
-
|
|
7300
|
-
|
|
7318
|
+
if (sendPiiData) {
|
|
7319
|
+
const versionUI = versions.ui.ngx;
|
|
7320
|
+
const versionBE = versions.backend;
|
|
7321
|
+
const extendedIdentifyData = {
|
|
7322
|
+
user,
|
|
7323
|
+
currentTenant,
|
|
7324
|
+
instanceId,
|
|
7325
|
+
versionUI,
|
|
7326
|
+
versionBE
|
|
7327
|
+
};
|
|
7328
|
+
this.identify(sendPiiData, extendedIdentifyData);
|
|
7329
|
+
}
|
|
7330
|
+
else {
|
|
7331
|
+
const requiredIdentifyData = { user, currentTenant, instanceId };
|
|
7332
|
+
this.identify(sendPiiData, requiredIdentifyData);
|
|
7301
7333
|
}
|
|
7302
7334
|
this.isScriptLoaded = true;
|
|
7303
7335
|
this.tagFunction$.next(this.tagFunction);
|
|
7336
|
+
this.trackingLoaded$.next(true);
|
|
7304
7337
|
});
|
|
7305
7338
|
}
|
|
7306
7339
|
}
|
|
7307
7340
|
/**
|
|
7308
7341
|
* Identifies the user/account at Gainsight.
|
|
7309
|
-
* @param
|
|
7310
|
-
* @param
|
|
7311
|
-
* @param versionUI The UI version used.
|
|
7312
|
-
* @param versionBE The BE version used.
|
|
7342
|
+
* @param sendPiiData Flag for sending personally identifiable information.
|
|
7343
|
+
* @param identifyData Object containing identification data.
|
|
7313
7344
|
*/
|
|
7314
|
-
identify(
|
|
7345
|
+
identify(sendPiiData, identifyData) {
|
|
7315
7346
|
const windowRef = window;
|
|
7316
|
-
const { id: userId, email
|
|
7317
|
-
const { name
|
|
7318
|
-
const {
|
|
7319
|
-
|
|
7320
|
-
|
|
7321
|
-
|
|
7322
|
-
|
|
7323
|
-
|
|
7324
|
-
|
|
7325
|
-
|
|
7326
|
-
|
|
7327
|
-
|
|
7328
|
-
|
|
7329
|
-
|
|
7330
|
-
|
|
7331
|
-
|
|
7332
|
-
|
|
7333
|
-
|
|
7334
|
-
|
|
7335
|
-
|
|
7347
|
+
const { id: userId, email } = identifyData.user;
|
|
7348
|
+
const { name: tenantID } = identifyData.currentTenant;
|
|
7349
|
+
const { instanceId } = identifyData;
|
|
7350
|
+
/**
|
|
7351
|
+
* Passing ID is a minimum required data to make an identify call to Gainsight.
|
|
7352
|
+
* isUserCreatedAfterAnonymizationWasActivated parameter is passed to later distinguish between users created before and after data anonymization done by Gainsight.
|
|
7353
|
+
* tenantID Used to distinguish between tenants when same email is used for different tenants.
|
|
7354
|
+
*
|
|
7355
|
+
* Due to GS limitations (GS does not allow clearing user attr/preferences via the GS tag!),
|
|
7356
|
+
* we always need to initialize fields related to PII to prevent leaking this data to GS when the user has disabled functional cookies.
|
|
7357
|
+
*/
|
|
7358
|
+
const requiredIdentify = {
|
|
7359
|
+
/**
|
|
7360
|
+
* Email was not mandatory form field until 10.14
|
|
7361
|
+
*/
|
|
7362
|
+
id: email ? email : `${userId}_${tenantID}_${instanceId}`,
|
|
7363
|
+
isUserCreatedAfterAnonymizationWasActivated: true,
|
|
7364
|
+
tenantID: tenantID,
|
|
7365
|
+
email: '--',
|
|
7366
|
+
userName: '',
|
|
7367
|
+
firstName: '',
|
|
7368
|
+
lastName: '',
|
|
7369
|
+
domainName: '',
|
|
7370
|
+
versionUI: '',
|
|
7371
|
+
versionBE: '',
|
|
7372
|
+
userLanguage: '',
|
|
7373
|
+
instanceId: '',
|
|
7374
|
+
externalReference: '',
|
|
7375
|
+
userRoles: '',
|
|
7376
|
+
customBranding: this.isCustomBranding(),
|
|
7377
|
+
fullTracking: sendPiiData
|
|
7378
|
+
};
|
|
7379
|
+
if (sendPiiData) {
|
|
7380
|
+
const { userName, firstName, lastName, roles } = identifyData.user;
|
|
7381
|
+
const { customProperties, domainName } = identifyData.currentTenant;
|
|
7382
|
+
const { versionUI, versionBE } = identifyData;
|
|
7383
|
+
const extendedIdentify = {
|
|
7384
|
+
...requiredIdentify,
|
|
7385
|
+
email,
|
|
7386
|
+
userName,
|
|
7387
|
+
firstName,
|
|
7388
|
+
lastName,
|
|
7389
|
+
domainName,
|
|
7390
|
+
versionUI,
|
|
7391
|
+
versionBE,
|
|
7392
|
+
userLanguage: this.translateService.currentLang,
|
|
7393
|
+
instanceId,
|
|
7394
|
+
externalReference: customProperties?.externalReference,
|
|
7395
|
+
userRoles: this.transformUserRolesToStr(roles?.references)
|
|
7396
|
+
};
|
|
7397
|
+
windowRef[this.GAINSIGHT_GLOBAL_SCOPE]('identify', extendedIdentify, {
|
|
7398
|
+
id: `${tenantID}_${instanceId}`,
|
|
7399
|
+
instanceId
|
|
7400
|
+
});
|
|
7401
|
+
return;
|
|
7402
|
+
}
|
|
7403
|
+
windowRef[this.GAINSIGHT_GLOBAL_SCOPE]('identify', requiredIdentify);
|
|
7336
7404
|
}
|
|
7405
|
+
/**
|
|
7406
|
+
* Triggers an event to be recorded by Gainsight PX.
|
|
7407
|
+
* This method calls the Gainsight PX's tracking mechanism to log a specific event
|
|
7408
|
+
* along with its associated properties.
|
|
7409
|
+
* @param eventName - Name of the event to be triggered.
|
|
7410
|
+
* @param props - Optional properties associated with the event.
|
|
7411
|
+
*/
|
|
7337
7412
|
triggerEvent(eventName, props) {
|
|
7338
7413
|
if (this.tagFunction && eventName) {
|
|
7339
7414
|
eventName = this.prepareEventName(eventName);
|
|
@@ -7355,38 +7430,51 @@ class GainsightService {
|
|
|
7355
7430
|
return this.getEnTranslation(textToTranslate, this.cachedRevertedTranslations);
|
|
7356
7431
|
}
|
|
7357
7432
|
/**
|
|
7358
|
-
*
|
|
7359
|
-
* The decision to
|
|
7360
|
-
*
|
|
7433
|
+
* Determines whether personally identifiable information (PII) should be sent while loading a tag.
|
|
7434
|
+
* The decision to activate Gainsight and send PII relies on whether the cookiePreferences option is defined in the application settings,
|
|
7435
|
+
* if the functional cookie is enabled, and if the user grants permission.
|
|
7361
7436
|
*/
|
|
7362
|
-
|
|
7437
|
+
async shouldSendPiiData() {
|
|
7363
7438
|
return (this.cookieBannerService.isConfigCookiePreferencesDefined() &&
|
|
7364
7439
|
this.cookieBannerService.isFunctionalCookieEnabled() &&
|
|
7365
|
-
!this.
|
|
7366
|
-
!this.isCustomBranding());
|
|
7440
|
+
!(await this.isGainsightPreferenceDisabledInUserPreferences(this.USER_PREFERENCES_GAINSIGHT_KEY)));
|
|
7367
7441
|
}
|
|
7442
|
+
/**
|
|
7443
|
+
* Updates a specific user attribute in the Gainsight global scope.
|
|
7444
|
+
* This method interfaces with the Gainsight global object to set a user's specific attribute with a provided value.
|
|
7445
|
+
* @param name - Name of the user attribute to be updated.
|
|
7446
|
+
* @param value - Value to set for the specified user attribute.
|
|
7447
|
+
*/
|
|
7368
7448
|
updateUserAttribute(name, value) {
|
|
7369
7449
|
window[this.GAINSIGHT_GLOBAL_SCOPE]?.('set', 'user', { [name]: value });
|
|
7370
7450
|
}
|
|
7451
|
+
/**
|
|
7452
|
+
* Determines if the current user has the capability to modify Gainsight PX settings.
|
|
7453
|
+
*
|
|
7454
|
+
* This method checks multiple conditions:
|
|
7455
|
+
* 1. Whether tracking has been disabled globally via application options.
|
|
7456
|
+
* 2. Whether Gainsight is disabled at the tenant level through custom properties.
|
|
7457
|
+
* 3. Whether a Gainsight key is available, either currently loaded or fetched asynchronously.
|
|
7458
|
+
* 4. Whether cookie preferences are defined and available for the user.
|
|
7459
|
+
*
|
|
7460
|
+
* @returns Promise that resolves to a boolean. True indicates the user can edit product experience settings, and false otherwise.
|
|
7461
|
+
*/
|
|
7371
7462
|
async canEditProductExperienceSettings() {
|
|
7372
7463
|
const currentTenant = this.appState.currentTenant.value;
|
|
7373
7464
|
const { customProperties } = currentTenant;
|
|
7465
|
+
if (this.isTrackingDisabled() ||
|
|
7466
|
+
this.isGainsightDisabledAtTenantCustomProperties(customProperties)) {
|
|
7467
|
+
return false;
|
|
7468
|
+
}
|
|
7374
7469
|
const gainsightKey = !!this.gainsightKey || !!(await this.getGainsightKey());
|
|
7375
7470
|
return (gainsightKey &&
|
|
7376
7471
|
this.cookieBannerService.isConfigCookiePreferencesDefined() &&
|
|
7377
|
-
|
|
7378
|
-
!!this.cookieBannerService.getUserCookiePreferences() &&
|
|
7379
|
-
!this.isCustomBranding());
|
|
7380
|
-
}
|
|
7381
|
-
switchGainsightEngagementsVisibility(showGainsightEngagements) {
|
|
7382
|
-
if (showGainsightEngagements) {
|
|
7383
|
-
this.removeHidingStyle(this.HIDE_GAINSIGHT_BOT_STYLE_ID);
|
|
7384
|
-
this.updateUserAttribute(this.ENGAGEMENTS, true);
|
|
7385
|
-
return;
|
|
7386
|
-
}
|
|
7387
|
-
this.addHidingStyle(this.HIDE_GAINSIGHT_BOT_STYLE_ID, '#apt-widget { display:none }');
|
|
7388
|
-
this.updateUserAttribute(this.ENGAGEMENTS, false);
|
|
7472
|
+
!!this.cookieBannerService.getUserCookiePreferences());
|
|
7389
7473
|
}
|
|
7474
|
+
/**
|
|
7475
|
+
* Sets the global context for Gainsight with the current application name.
|
|
7476
|
+
* The global context can be utilized by Gainsight for various purposes, such as segmenting users.
|
|
7477
|
+
*/
|
|
7390
7478
|
setGlobalContext() {
|
|
7391
7479
|
const currentAppState = this.appState.state$.value;
|
|
7392
7480
|
const currentAppName = currentAppState.app.name;
|
|
@@ -7398,18 +7486,31 @@ class GainsightService {
|
|
|
7398
7486
|
}
|
|
7399
7487
|
return flatMap(userRoles, (userRole) => userRole.role.name).join();
|
|
7400
7488
|
}
|
|
7401
|
-
|
|
7402
|
-
|
|
7403
|
-
|
|
7404
|
-
|
|
7405
|
-
|
|
7406
|
-
|
|
7407
|
-
|
|
7408
|
-
|
|
7489
|
+
/**
|
|
7490
|
+
* Checks if Gainsight is disabled based on tenant custom properties.
|
|
7491
|
+
*
|
|
7492
|
+
* @param customProperties - The custom properties of the tenant.
|
|
7493
|
+
* @returns {boolean} - True if Gainsight is disabled, false otherwise.
|
|
7494
|
+
*/
|
|
7495
|
+
isGainsightDisabledAtTenantCustomProperties(customProperties) {
|
|
7496
|
+
const gainsightEnabled = customProperties && customProperties.gainsightEnabled;
|
|
7497
|
+
return gainsightEnabled === false;
|
|
7409
7498
|
}
|
|
7410
|
-
|
|
7411
|
-
|
|
7412
|
-
|
|
7499
|
+
/**
|
|
7500
|
+
* Determines if custom branding is enabled based on the presence of a brand logo.
|
|
7501
|
+
*
|
|
7502
|
+
* @returns {boolean} - True if custom branding is applied, false otherwise.
|
|
7503
|
+
*/
|
|
7504
|
+
isCustomBranding() {
|
|
7505
|
+
const brandingCssVars = this.options.get('brandingCssVars') || {};
|
|
7506
|
+
return !!brandingCssVars['brand-logo-img'];
|
|
7507
|
+
}
|
|
7508
|
+
/**
|
|
7509
|
+
* Determines if tracking is disabled based on the application options.
|
|
7510
|
+
* @returns `true` if tracking is disabled, otherwise `false`.
|
|
7511
|
+
*/
|
|
7512
|
+
isTrackingDisabled() {
|
|
7513
|
+
return this.options.disableTracking === true;
|
|
7413
7514
|
}
|
|
7414
7515
|
prepareEventName(baseEventName) {
|
|
7415
7516
|
return baseEventName
|
|
@@ -7420,14 +7521,6 @@ class GainsightService {
|
|
|
7420
7521
|
return eventNamePart.replace(/`[\w\W]*`/g, '');
|
|
7421
7522
|
}
|
|
7422
7523
|
}
|
|
7423
|
-
isGainsightDisabled(customProperties) {
|
|
7424
|
-
const gainsightEnabled = customProperties && customProperties.gainsightEnabled;
|
|
7425
|
-
return gainsightEnabled === false;
|
|
7426
|
-
}
|
|
7427
|
-
isCustomBranding() {
|
|
7428
|
-
const brandingCssVars = this.options.get('brandingCssVars') || {};
|
|
7429
|
-
return !!brandingCssVars['brand-logo-img'];
|
|
7430
|
-
}
|
|
7431
7524
|
loadScriptTag(scriptTag, key) {
|
|
7432
7525
|
try {
|
|
7433
7526
|
const windowRef = window;
|
|
@@ -7490,17 +7583,14 @@ class GainsightService {
|
|
|
7490
7583
|
return enTranslation;
|
|
7491
7584
|
}
|
|
7492
7585
|
}
|
|
7493
|
-
GainsightService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: GainsightService, deps: [{ token:
|
|
7586
|
+
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 });
|
|
7494
7587
|
GainsightService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: GainsightService, providedIn: 'root' });
|
|
7495
7588
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: GainsightService, decorators: [{
|
|
7496
7589
|
type: Injectable,
|
|
7497
7590
|
args: [{
|
|
7498
7591
|
providedIn: 'root'
|
|
7499
7592
|
}]
|
|
7500
|
-
}], ctorParameters: function () { return [{ type:
|
|
7501
|
-
type: Inject,
|
|
7502
|
-
args: [DOCUMENT]
|
|
7503
|
-
}] }, { type: AppStateService }, { type: OptionsService }, { type: CookieBannerService }, { type: UserPreferencesService }, { type: i1$2.TranslateService }]; } });
|
|
7593
|
+
}], ctorParameters: function () { return [{ type: AppStateService }, { type: OptionsService }, { type: CookieBannerService }, { type: UserPreferencesService }, { type: i1$2.TranslateService }]; } });
|
|
7504
7594
|
|
|
7505
7595
|
/**
|
|
7506
7596
|
* Use this token for components that can provide product experience events.
|
|
@@ -7733,53 +7823,236 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.6", ngImpor
|
|
|
7733
7823
|
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" }]
|
|
7734
7824
|
}], ctorParameters: function () { return [{ type: AppSwitcherService }]; } });
|
|
7735
7825
|
|
|
7826
|
+
class UserEngagementsService {
|
|
7827
|
+
constructor(document, userPreferencesService, gainsightService) {
|
|
7828
|
+
this.document = document;
|
|
7829
|
+
this.userPreferencesService = userPreferencesService;
|
|
7830
|
+
this.gainsightService = gainsightService;
|
|
7831
|
+
this.USER_PREFERENCES_GAINSIGHT_ENGAGEMENTS_KEY = 'gainsightBotEnabled';
|
|
7832
|
+
this.userEngagementsEnabled$ = new BehaviorSubject(false);
|
|
7833
|
+
this.HIDE_GAINSIGHT_BOT_STYLE_ID = 'hide-gs-bot';
|
|
7834
|
+
this.ENGAGEMENTS = 'engagements';
|
|
7835
|
+
this.handleUserEngagements();
|
|
7836
|
+
}
|
|
7837
|
+
/**
|
|
7838
|
+
* Handles user engagement settings based on various conditions.
|
|
7839
|
+
*
|
|
7840
|
+
* - Waits for the Gainsight tracking to be loaded.
|
|
7841
|
+
* - Retrieves the engagement settings.
|
|
7842
|
+
* - Updates the engagement settings based on the combined observations.
|
|
7843
|
+
* - Finally, toggles the Gainsight engagements based on the latest `userEngagementsEnabled$` value.
|
|
7844
|
+
*/
|
|
7845
|
+
handleUserEngagements() {
|
|
7846
|
+
this.gainsightService.trackingLoaded$
|
|
7847
|
+
.pipe(take(1), switchMap(() => this.getEngagementSettingsObservable()), tap((settings) => this.updateUserEngagementSettings(...settings)), switchMap(() => this.userEngagementsEnabled$.pipe(take(1))))
|
|
7848
|
+
.subscribe(isEnabled => this.toggleGainsightEngagements(isEnabled));
|
|
7849
|
+
}
|
|
7850
|
+
/**
|
|
7851
|
+
* Updates the user's preference for Gainsight Engagements.
|
|
7852
|
+
* @param {boolean} isEnabled - The new value for the user's engagement preference.
|
|
7853
|
+
*/
|
|
7854
|
+
updateUserEngagementPreference(isEnabled) {
|
|
7855
|
+
this.userEngagementsEnabled$.next(isEnabled);
|
|
7856
|
+
this.userPreferencesService.set(this.gainsightService.USER_PREFERENCES_GAINSIGHT_ENGAGEMENTS_KEY, this.userEngagementsEnabled$.value);
|
|
7857
|
+
}
|
|
7858
|
+
/**
|
|
7859
|
+
* Toggles the visibility of Gainsight Engagements based on the provided flag.
|
|
7860
|
+
*
|
|
7861
|
+
* @param isEnabled - A flag indicating whether Gainsight Engagements should be visible.
|
|
7862
|
+
*/
|
|
7863
|
+
toggleGainsightEngagements(isEnabled) {
|
|
7864
|
+
isEnabled ? this.showGainsightEngagements() : this.hideGainsightEngagements();
|
|
7865
|
+
}
|
|
7866
|
+
/**
|
|
7867
|
+
* Constructs an observable that emits an array of boolean values representing
|
|
7868
|
+
* the current engagement settings. The observable combines the latest values from:
|
|
7869
|
+
*
|
|
7870
|
+
* 1. User's preferences for Gainsight engagements.
|
|
7871
|
+
* 2. A flag indicating if PII data should be sent.
|
|
7872
|
+
* 3. A flag indicating if the platform uses custom branding.
|
|
7873
|
+
*
|
|
7874
|
+
* @returns An observable emitting an array of boolean values.
|
|
7875
|
+
*/
|
|
7876
|
+
getEngagementSettingsObservable() {
|
|
7877
|
+
return combineLatest([
|
|
7878
|
+
this.userPreferencesService.observe(this.USER_PREFERENCES_GAINSIGHT_ENGAGEMENTS_KEY),
|
|
7879
|
+
from(this.gainsightService.shouldSendPiiData()),
|
|
7880
|
+
of(this.gainsightService.isCustomBranding())
|
|
7881
|
+
]);
|
|
7882
|
+
}
|
|
7883
|
+
/**
|
|
7884
|
+
* Updates user engagement settings based on provided preferences and settings.
|
|
7885
|
+
*
|
|
7886
|
+
* Based on the received values, the method decides to:
|
|
7887
|
+
* 1. Disable user engagements if PII data should not be shared or certain branding/settings conditions are met.
|
|
7888
|
+
* 2. Update the user engagement preference if the user engagement bot setting is undefined.
|
|
7889
|
+
*
|
|
7890
|
+
* @param userEngagementBotSetting - The user's setting for the engagement bot.
|
|
7891
|
+
* @param shouldSendPiiData - Indicates whether PII data should be shared.
|
|
7892
|
+
* @param hasCustomBranding - Indicates if custom branding is applied.
|
|
7893
|
+
*/
|
|
7894
|
+
updateUserEngagementSettings(userEngagementBotSetting, shouldSendPiiData, hasCustomBranding) {
|
|
7895
|
+
if (this.shouldDisableUserEngagementsDueToPIIData(shouldSendPiiData)) {
|
|
7896
|
+
this.userEngagementsEnabled$.next(false);
|
|
7897
|
+
}
|
|
7898
|
+
else if (this.isUserEngagementBotSettingUndefined(userEngagementBotSetting)) {
|
|
7899
|
+
/**
|
|
7900
|
+
* Case where the user is new (freshly created) and has not changed the user engagement settings in the user edit modal (untouched state).
|
|
7901
|
+
* When custom branding is not set, we will set the user engagements in the user preferences to true by default.
|
|
7902
|
+
*/
|
|
7903
|
+
this.updateUserEngagementPreference(!hasCustomBranding);
|
|
7904
|
+
}
|
|
7905
|
+
else {
|
|
7906
|
+
this.userEngagementsEnabled$.next(userEngagementBotSetting);
|
|
7907
|
+
}
|
|
7908
|
+
}
|
|
7909
|
+
/**
|
|
7910
|
+
* Determines whether user engagements should be disabled due to PII data settings.
|
|
7911
|
+
*
|
|
7912
|
+
* If the `shouldSendPiiData` parameter is false, this indicates that the user engagements
|
|
7913
|
+
* should be disabled to prevent sharing personally identifiable information.
|
|
7914
|
+
*
|
|
7915
|
+
* @param {boolean} shouldSendPiiData - Indicates whether PII data is allowed to be sent.
|
|
7916
|
+
* @returns {boolean} Returns true if user engagements should be disabled, otherwise false.
|
|
7917
|
+
*/
|
|
7918
|
+
shouldDisableUserEngagementsDueToPIIData(shouldSendPiiData) {
|
|
7919
|
+
return !shouldSendPiiData;
|
|
7920
|
+
}
|
|
7921
|
+
/**
|
|
7922
|
+
* Determines if the user engagement bot setting is undefined.
|
|
7923
|
+
*
|
|
7924
|
+
* @param {boolean | undefined} userEngagementBotSetting - The setting value to check.
|
|
7925
|
+
* @returns {boolean} Returns `true` if the setting is undefined; otherwise, `false`.
|
|
7926
|
+
*
|
|
7927
|
+
* This scenario occurs when a user is new and hasn't modified the bot settings in the user details UI yet.
|
|
7928
|
+
*/
|
|
7929
|
+
isUserEngagementBotSettingUndefined(userEngagementBotSetting) {
|
|
7930
|
+
return userEngagementBotSetting === undefined;
|
|
7931
|
+
}
|
|
7932
|
+
/**
|
|
7933
|
+
* Enables the visibility of Gainsight engagements.
|
|
7934
|
+
*
|
|
7935
|
+
* This method removes the CSS styles that hide the Gainsight engagements
|
|
7936
|
+
* and updates the relevant user attribute to mark the engagements as visible.
|
|
7937
|
+
*/
|
|
7938
|
+
showGainsightEngagements() {
|
|
7939
|
+
this.removeHidingStyle(this.HIDE_GAINSIGHT_BOT_STYLE_ID);
|
|
7940
|
+
this.gainsightService.updateUserAttribute(this.ENGAGEMENTS, true);
|
|
7941
|
+
}
|
|
7942
|
+
/**
|
|
7943
|
+
* Hides the Gainsight engagements.
|
|
7944
|
+
*
|
|
7945
|
+
* This method applies CSS styles to hide the Gainsight engagements
|
|
7946
|
+
* and updates the relevant user attribute to mark the engagements as hidden.
|
|
7947
|
+
*/
|
|
7948
|
+
hideGainsightEngagements() {
|
|
7949
|
+
this.addHidingStyle(this.HIDE_GAINSIGHT_BOT_STYLE_ID, '#apt-widget { display:none }');
|
|
7950
|
+
this.gainsightService.updateUserAttribute(this.ENGAGEMENTS, false);
|
|
7951
|
+
}
|
|
7952
|
+
/**
|
|
7953
|
+
* Removes the specified CSS style from the document.
|
|
7954
|
+
*
|
|
7955
|
+
* @param {string} styleId - The ID of the CSS style element to remove.
|
|
7956
|
+
*/
|
|
7957
|
+
removeHidingStyle(styleId) {
|
|
7958
|
+
const style = this.document.getElementById(styleId);
|
|
7959
|
+
style?.remove();
|
|
7960
|
+
}
|
|
7961
|
+
/**
|
|
7962
|
+
* Adds a new CSS style to the document.
|
|
7963
|
+
*
|
|
7964
|
+
* If the style with the specified ID already exists, the method will do nothing.
|
|
7965
|
+
* Otherwise, it creates a new `<style>` element with the given ID and content,
|
|
7966
|
+
* then appends it to the document head.
|
|
7967
|
+
*
|
|
7968
|
+
* @param {string} styleId - The ID to assign to the new style element.
|
|
7969
|
+
* @param {string} textContent - The CSS rules to be included in the style.
|
|
7970
|
+
*/
|
|
7971
|
+
addHidingStyle(styleId, textContent) {
|
|
7972
|
+
if (this.document.getElementById(styleId)) {
|
|
7973
|
+
return;
|
|
7974
|
+
}
|
|
7975
|
+
const style = this.document.createElement('style');
|
|
7976
|
+
style.id = styleId;
|
|
7977
|
+
style.textContent = textContent;
|
|
7978
|
+
this.document.head.appendChild(style);
|
|
7979
|
+
}
|
|
7980
|
+
}
|
|
7981
|
+
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 });
|
|
7982
|
+
UserEngagementsService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: UserEngagementsService, providedIn: 'root' });
|
|
7983
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: UserEngagementsService, decorators: [{
|
|
7984
|
+
type: Injectable,
|
|
7985
|
+
args: [{ providedIn: 'root' }]
|
|
7986
|
+
}], ctorParameters: function () { return [{ type: DOCUMENT, decorators: [{
|
|
7987
|
+
type: Inject,
|
|
7988
|
+
args: [DOCUMENT]
|
|
7989
|
+
}] }, { type: UserPreferencesService }, { type: GainsightService }]; } });
|
|
7990
|
+
|
|
7736
7991
|
/**
|
|
7737
7992
|
* This module enables an tenant to activate the product experience
|
|
7738
7993
|
* software [Gainsight](https://www.gainsight.com/product-experience/) to help
|
|
7739
|
-
* and track user actions.
|
|
7740
|
-
* property `gainsightEnabled` is set to true.
|
|
7994
|
+
* and track user actions.
|
|
7741
7995
|
*/
|
|
7742
7996
|
class ProductExperienceModule {
|
|
7743
|
-
constructor(appState, gainsightService, cookieBannerService,
|
|
7997
|
+
constructor(appState, gainsightService, cookieBannerService,
|
|
7998
|
+
// Don't remove it, otherwise UserEngagementsService won't be initialized.
|
|
7999
|
+
userEngagementsService) {
|
|
7744
8000
|
this.appState = appState;
|
|
7745
8001
|
this.gainsightService = gainsightService;
|
|
7746
8002
|
this.cookieBannerService = cookieBannerService;
|
|
7747
|
-
this.
|
|
8003
|
+
this.userEngagementsService = userEngagementsService;
|
|
8004
|
+
/**
|
|
8005
|
+
* Check if the Gainsight tracking is disabled in the application apptions. If so, exit early without processing further.
|
|
8006
|
+
*/
|
|
8007
|
+
if (this.gainsightService.isTrackingDisabled()) {
|
|
8008
|
+
return;
|
|
8009
|
+
}
|
|
8010
|
+
this.toggleUserTrackingObservable();
|
|
8011
|
+
}
|
|
8012
|
+
/**
|
|
8013
|
+
* Observes several factors to determine the state of user tracking and manages the visibility of Gainsight engagements.
|
|
8014
|
+
* It watches for changes in the current tenant, the state of the cookie banner, and user's preferences for Gainsight engagements.
|
|
8015
|
+
*
|
|
8016
|
+
* 1. If the cookie banner is being displayed, it returns without making any changes.
|
|
8017
|
+
* 2. If Gainsight is disabled at the tenant level via custom properties, it returns without making any changes.
|
|
8018
|
+
* 3. If the conditions are met for loading the Gainsight tag, it loads the tag.
|
|
8019
|
+
*/
|
|
8020
|
+
toggleUserTrackingObservable() {
|
|
7748
8021
|
combineLatest([
|
|
7749
8022
|
this.appState.currentTenant.pipe(filter(Boolean)),
|
|
7750
|
-
this.cookieBannerService.isCookieBannerShowed
|
|
7751
|
-
|
|
7752
|
-
]).subscribe(async ([currentTenant, isCookieBannerShowed, showGainsightEngagements]) => {
|
|
8023
|
+
this.cookieBannerService.isCookieBannerShowed$
|
|
8024
|
+
]).subscribe(async ([currentTenant, isCookieBannerShowed]) => {
|
|
7753
8025
|
if (isCookieBannerShowed) {
|
|
7754
8026
|
return;
|
|
7755
8027
|
}
|
|
7756
8028
|
const { customProperties } = currentTenant;
|
|
7757
|
-
if (this.gainsightService.
|
|
7758
|
-
|
|
7759
|
-
this.gainsightService.loadTag(currentTenant);
|
|
8029
|
+
if (this.gainsightService.isGainsightDisabledAtTenantCustomProperties(customProperties)) {
|
|
8030
|
+
return;
|
|
7760
8031
|
}
|
|
7761
|
-
|
|
7762
|
-
|
|
7763
|
-
*/
|
|
7764
|
-
if (showGainsightEngagements === undefined) {
|
|
7765
|
-
showGainsightEngagements = true;
|
|
7766
|
-
userPreferencesService.set(this.gainsightService.USER_PREFERENCES_GAINSIGHT_ENGAGEMENTS_KEY, showGainsightEngagements);
|
|
8032
|
+
if (this.shouldLoadTag()) {
|
|
8033
|
+
await this.gainsightService.loadTag(currentTenant, await this.gainsightService.shouldSendPiiData());
|
|
7767
8034
|
}
|
|
7768
|
-
this.gainsightService.switchGainsightEngagementsVisibility(showGainsightEngagements);
|
|
7769
8035
|
});
|
|
7770
8036
|
}
|
|
8037
|
+
/**
|
|
8038
|
+
* Determines if a tracking tag should be loaded based on cookie preferences.
|
|
8039
|
+
* @returns `true` if user cookie preferences exist, otherwise `false`.
|
|
8040
|
+
*/
|
|
8041
|
+
shouldLoadTag() {
|
|
8042
|
+
return !!this.cookieBannerService.getUserCookiePreferences();
|
|
8043
|
+
}
|
|
7771
8044
|
}
|
|
7772
|
-
ProductExperienceModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: ProductExperienceModule, deps: [{ token: AppStateService }, { token: GainsightService }, { token: CookieBannerService }, { token:
|
|
8045
|
+
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 });
|
|
7773
8046
|
ProductExperienceModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "14.0.6", ngImport: i0, type: ProductExperienceModule, declarations: [ProductExperienceDirective], exports: [ProductExperienceDirective] });
|
|
7774
|
-
ProductExperienceModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: ProductExperienceModule, providers: [GainsightService] });
|
|
8047
|
+
ProductExperienceModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: ProductExperienceModule, providers: [GainsightService, UserEngagementsService] });
|
|
7775
8048
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: ProductExperienceModule, decorators: [{
|
|
7776
8049
|
type: NgModule,
|
|
7777
8050
|
args: [{
|
|
7778
8051
|
declarations: [ProductExperienceDirective],
|
|
7779
8052
|
exports: [ProductExperienceDirective],
|
|
7780
|
-
providers: [GainsightService]
|
|
8053
|
+
providers: [GainsightService, UserEngagementsService]
|
|
7781
8054
|
}]
|
|
7782
|
-
}], ctorParameters: function () { return [{ type: AppStateService }, { type: GainsightService }, { type: CookieBannerService }, { type:
|
|
8055
|
+
}], ctorParameters: function () { return [{ type: AppStateService }, { type: GainsightService }, { type: CookieBannerService }, { type: UserEngagementsService }]; } });
|
|
7783
8056
|
|
|
7784
8057
|
class ApplicationModule {
|
|
7785
8058
|
}
|
|
@@ -17921,7 +18194,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.6", ngImpor
|
|
|
17921
18194
|
}], ctorParameters: function () { return [{ type: i1$1.UserService }, { type: ModalService }, { type: i1$8.BsModalRef }, { type: LoginService }]; } });
|
|
17922
18195
|
|
|
17923
18196
|
class UserEditComponent {
|
|
17924
|
-
constructor(state, translate, bsModalService, alert, userService, tenantLoginOptionsService, tenantService
|
|
18197
|
+
constructor(state, translate, bsModalService, alert, userService, tenantLoginOptionsService, tenantService) {
|
|
17925
18198
|
this.state = state;
|
|
17926
18199
|
this.translate = translate;
|
|
17927
18200
|
this.bsModalService = bsModalService;
|
|
@@ -17929,15 +18202,13 @@ class UserEditComponent {
|
|
|
17929
18202
|
this.userService = userService;
|
|
17930
18203
|
this.tenantLoginOptionsService = tenantLoginOptionsService;
|
|
17931
18204
|
this.tenantService = tenantService;
|
|
17932
|
-
this.userPreferencesService = userPreferencesService;
|
|
17933
|
-
this.gainsightService = gainsightService;
|
|
17934
18205
|
this.loading = false;
|
|
17935
|
-
this.
|
|
18206
|
+
this.showProductExperienceOptions = false;
|
|
17936
18207
|
this.isUsageTrackingEnabled = true;
|
|
17937
|
-
this.
|
|
18208
|
+
this.isUserEngagementPreferenceEnabled = true;
|
|
17938
18209
|
this.onUser = new EventEmitter();
|
|
17939
|
-
this.
|
|
17940
|
-
this.
|
|
18210
|
+
this.onUsageTrackingChange = new EventEmitter();
|
|
18211
|
+
this.onUserEngagementPreferenceChange = new EventEmitter();
|
|
17941
18212
|
this.onCancel = new EventEmitter();
|
|
17942
18213
|
this.userHasActiveTotp = false;
|
|
17943
18214
|
this.userCanSetupTotp = false;
|
|
@@ -17962,13 +18233,6 @@ class UserEditComponent {
|
|
|
17962
18233
|
this.isPhoneRequired = true;
|
|
17963
18234
|
}
|
|
17964
18235
|
}
|
|
17965
|
-
async onEnablingProductUsageTracking(isUsageTrackingEnabled) {
|
|
17966
|
-
if (isUsageTrackingEnabled && this.isGainsightEngagementsEnabled === undefined) {
|
|
17967
|
-
this.isGainsightEngagementsEnabled = await this.userPreferencesService
|
|
17968
|
-
.get(this.gainsightService.USER_PREFERENCES_GAINSIGHT_ENGAGEMENTS_KEY)
|
|
17969
|
-
.toPromise();
|
|
17970
|
-
}
|
|
17971
|
-
}
|
|
17972
18236
|
setupTotp() {
|
|
17973
18237
|
this.bsModalService.show(UserTotpSetupComponent, {
|
|
17974
18238
|
class: 'modal-sm',
|
|
@@ -17984,9 +18248,13 @@ class UserEditComponent {
|
|
|
17984
18248
|
if (this.loading) {
|
|
17985
18249
|
return;
|
|
17986
18250
|
}
|
|
17987
|
-
if (this.
|
|
17988
|
-
this.
|
|
17989
|
-
|
|
18251
|
+
if (this.showProductExperienceOptions) {
|
|
18252
|
+
this.onUsageTrackingChange.emit(this.isUsageTrackingEnabled);
|
|
18253
|
+
/**
|
|
18254
|
+
* Emits a user engagement preference change event.
|
|
18255
|
+
* If usage tracking is disabled, it emits `false`. Otherwise, it emits the current state of the user engagement preference.
|
|
18256
|
+
*/
|
|
18257
|
+
this.onUserEngagementPreferenceChange.emit(this.isUsageTrackingEnabled === false ? false : this.isUserEngagementPreferenceEnabled);
|
|
17990
18258
|
}
|
|
17991
18259
|
this.onUser.emit(this._user);
|
|
17992
18260
|
}
|
|
@@ -18011,33 +18279,33 @@ class UserEditComponent {
|
|
|
18011
18279
|
return loginOptions.some(({ tfaStrategy = '' }) => tfaStrategy.toLowerCase() === 'totp');
|
|
18012
18280
|
}
|
|
18013
18281
|
}
|
|
18014
|
-
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 }
|
|
18015
|
-
UserEditComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.0.6", type: UserEditComponent, selector: "c8y-user-edit", inputs: { loading: "loading", user: "user",
|
|
18282
|
+
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 });
|
|
18283
|
+
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" }] });
|
|
18016
18284
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: UserEditComponent, decorators: [{
|
|
18017
18285
|
type: Component,
|
|
18018
|
-
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=\"
|
|
18019
|
-
}], 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 }
|
|
18286
|
+
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" }]
|
|
18287
|
+
}], 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: [{
|
|
18020
18288
|
type: Input
|
|
18021
18289
|
}], user: [{
|
|
18022
18290
|
type: Input
|
|
18023
|
-
}],
|
|
18291
|
+
}], showProductExperienceOptions: [{
|
|
18024
18292
|
type: Input
|
|
18025
18293
|
}], isUsageTrackingEnabled: [{
|
|
18026
18294
|
type: Input
|
|
18027
|
-
}],
|
|
18295
|
+
}], isUserEngagementPreferenceEnabled: [{
|
|
18028
18296
|
type: Input
|
|
18029
18297
|
}], onUser: [{
|
|
18030
18298
|
type: Output
|
|
18031
|
-
}],
|
|
18299
|
+
}], onUsageTrackingChange: [{
|
|
18032
18300
|
type: Output
|
|
18033
|
-
}],
|
|
18301
|
+
}], onUserEngagementPreferenceChange: [{
|
|
18034
18302
|
type: Output
|
|
18035
18303
|
}], onCancel: [{
|
|
18036
18304
|
type: Output
|
|
18037
18305
|
}] } });
|
|
18038
18306
|
|
|
18039
18307
|
class UserEditModalComponent {
|
|
18040
|
-
constructor(modal, user, ui, auth, client, alert, userPreferences, c8yModalService, gainsightService, cookieBannerService, loginService, passwordService) {
|
|
18308
|
+
constructor(modal, user, ui, auth, client, alert, userPreferences, c8yModalService, gainsightService, cookieBannerService, loginService, passwordService, userEngagementsService) {
|
|
18041
18309
|
this.modal = modal;
|
|
18042
18310
|
this.user = user;
|
|
18043
18311
|
this.ui = ui;
|
|
@@ -18050,29 +18318,43 @@ class UserEditModalComponent {
|
|
|
18050
18318
|
this.cookieBannerService = cookieBannerService;
|
|
18051
18319
|
this.loginService = loginService;
|
|
18052
18320
|
this.passwordService = passwordService;
|
|
18321
|
+
this.userEngagementsService = userEngagementsService;
|
|
18053
18322
|
this.loading = false;
|
|
18054
|
-
this.
|
|
18323
|
+
this.showProductExperienceOptions = false;
|
|
18055
18324
|
}
|
|
18056
18325
|
async ngOnInit() {
|
|
18057
18326
|
this.updateUserInAppState();
|
|
18058
|
-
|
|
18059
|
-
|
|
18060
|
-
|
|
18061
|
-
|
|
18062
|
-
|
|
18063
|
-
|
|
18064
|
-
|
|
18065
|
-
|
|
18327
|
+
await this.setInitialProductExperienceOptions();
|
|
18328
|
+
}
|
|
18329
|
+
/**
|
|
18330
|
+
* Initializes product experience options for the user.
|
|
18331
|
+
*
|
|
18332
|
+
* This function performs the following operations:
|
|
18333
|
+
* - Determines if the user has the permission to edit product experience options.
|
|
18334
|
+
* - If the user has the permission and functional cookies are enabled:
|
|
18335
|
+
* - Checks whether personalized product experience tracking is active.
|
|
18336
|
+
* - Checks whether in-product information and communication is active.
|
|
18337
|
+
*/
|
|
18338
|
+
async setInitialProductExperienceOptions() {
|
|
18339
|
+
this.showProductExperienceOptions =
|
|
18340
|
+
await this.gainsightService.canEditProductExperienceSettings();
|
|
18341
|
+
if (this.showProductExperienceOptions && this.cookieBannerService.isFunctionalCookieEnabled()) {
|
|
18342
|
+
// Enable personalized product experience tracking option
|
|
18343
|
+
this.currentUsageTrackingState =
|
|
18344
|
+
!(await this.gainsightService.isGainsightPreferenceDisabledInUserPreferences(this.gainsightService.USER_PREFERENCES_GAINSIGHT_KEY));
|
|
18345
|
+
// Enable in-product information & communication option
|
|
18346
|
+
this.currentUserEngagementPreferenceInitialState =
|
|
18347
|
+
this.userEngagementsService.userEngagementsEnabled$.value;
|
|
18066
18348
|
}
|
|
18067
18349
|
}
|
|
18068
18350
|
async onDismiss() {
|
|
18069
18351
|
this.modal.hide();
|
|
18070
18352
|
}
|
|
18071
|
-
|
|
18072
|
-
this.usageTrackingState =
|
|
18353
|
+
onUsageTrackingChange(isEnabled) {
|
|
18354
|
+
this.usageTrackingState = isEnabled;
|
|
18073
18355
|
}
|
|
18074
|
-
|
|
18075
|
-
this.
|
|
18356
|
+
onUserEngagementPreferenceChange(isEnabled) {
|
|
18357
|
+
this.userEngagementPreferenceNewState = isEnabled;
|
|
18076
18358
|
}
|
|
18077
18359
|
async updateAndClose(user) {
|
|
18078
18360
|
this.loading = true;
|
|
@@ -18090,16 +18372,7 @@ class UserEditModalComponent {
|
|
|
18090
18372
|
this.updateCredentials(user.password);
|
|
18091
18373
|
}
|
|
18092
18374
|
}
|
|
18093
|
-
|
|
18094
|
-
await this.userPreferences.set(this.gainsightService.USER_PREFERENCES_GAINSIGHT_ENGAGEMENTS_KEY, this.gainsightEngagementsState);
|
|
18095
|
-
}
|
|
18096
|
-
if (this.currentUsageTrackingState !== this.usageTrackingState) {
|
|
18097
|
-
await this.userPreferences.set(this.gainsightService.USER_PREFERENCES_GAINSIGHT_KEY, this.usageTrackingState);
|
|
18098
|
-
this.gainsightService.setFunctionalCookie(this.usageTrackingState);
|
|
18099
|
-
this.usageTrackingState
|
|
18100
|
-
? await this.gainsightService.loadTag(this.client.tenant)
|
|
18101
|
-
: await this.gainsightTrackingAppReload();
|
|
18102
|
-
}
|
|
18375
|
+
await this.updateProductExperienceOptions();
|
|
18103
18376
|
if (user.customProperties.userOrigin !== 'OAUTH2') {
|
|
18104
18377
|
await this.user.updateCurrent(omit(user, 'password'));
|
|
18105
18378
|
await this.updateUserInAppState();
|
|
@@ -18128,6 +18401,34 @@ class UserEditModalComponent {
|
|
|
18128
18401
|
// do nothing
|
|
18129
18402
|
}
|
|
18130
18403
|
}
|
|
18404
|
+
async updateProductExperienceOptions() {
|
|
18405
|
+
this.updateUserEngagementsPreference();
|
|
18406
|
+
await this.updateTrackingOption();
|
|
18407
|
+
}
|
|
18408
|
+
/**
|
|
18409
|
+
* Updates the user engagement preference if it has changed from the initial state.
|
|
18410
|
+
* Calls the user engagements service to update the preference.
|
|
18411
|
+
*
|
|
18412
|
+
* The update only occurs if the current preference differs from the new state.
|
|
18413
|
+
*/
|
|
18414
|
+
updateUserEngagementsPreference() {
|
|
18415
|
+
if (this.currentUserEngagementPreferenceInitialState !== this.userEngagementPreferenceNewState) {
|
|
18416
|
+
this.userEngagementsService.updateUserEngagementPreference(this.userEngagementPreferenceNewState);
|
|
18417
|
+
}
|
|
18418
|
+
}
|
|
18419
|
+
/**
|
|
18420
|
+
* Asynchronously updates the tracking option for user preferences.
|
|
18421
|
+
* If the current usage tracking state differs from the new state,
|
|
18422
|
+
* it updates the Gainsight preferences and sets a functional cookie
|
|
18423
|
+
* before triggering a reload of the application.
|
|
18424
|
+
*/
|
|
18425
|
+
async updateTrackingOption() {
|
|
18426
|
+
if (this.currentUsageTrackingState !== this.usageTrackingState) {
|
|
18427
|
+
await this.userPreferences.set(this.gainsightService.USER_PREFERENCES_GAINSIGHT_KEY, this.usageTrackingState);
|
|
18428
|
+
this.gainsightService.setFunctionalCookie(this.usageTrackingState);
|
|
18429
|
+
await this.gainsightTrackingAppReload();
|
|
18430
|
+
}
|
|
18431
|
+
}
|
|
18131
18432
|
async updateUserInAppState() {
|
|
18132
18433
|
const currentUserResult = await this.user.current();
|
|
18133
18434
|
this.ui.currentUser.next(currentUserResult.data);
|
|
@@ -18141,12 +18442,12 @@ class UserEditModalComponent {
|
|
|
18141
18442
|
this.auth.updateCredentials(newCredentials);
|
|
18142
18443
|
}
|
|
18143
18444
|
}
|
|
18144
|
-
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 });
|
|
18145
|
-
UserEditModalComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.0.6", type: UserEditModalComponent, selector: "c8y-user-edit-modal", ngImport: i0, template: "<c8y-modal
|
|
18445
|
+
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 });
|
|
18446
|
+
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" }] });
|
|
18146
18447
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: UserEditModalComponent, decorators: [{
|
|
18147
18448
|
type: Component,
|
|
18148
|
-
args: [{ selector: 'c8y-user-edit-modal', template: "<c8y-modal
|
|
18149
|
-
}], 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 }]; } });
|
|
18449
|
+
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" }]
|
|
18450
|
+
}], 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 }]; } });
|
|
18150
18451
|
|
|
18151
18452
|
class UserMenuOutletComponent {
|
|
18152
18453
|
constructor(ui, bsModalService, modalService, loginService, translateService, tenantService, alertService, user, optionsService, userMenu, headerService) {
|
|
@@ -21885,8 +22186,40 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.6", ngImpor
|
|
|
21885
22186
|
type: Output
|
|
21886
22187
|
}] } });
|
|
21887
22188
|
|
|
22189
|
+
class CloseDatePickerDirective {
|
|
22190
|
+
constructor(el) {
|
|
22191
|
+
this.el = el;
|
|
22192
|
+
this.destroy$ = new Subject();
|
|
22193
|
+
}
|
|
22194
|
+
ngOnInit() {
|
|
22195
|
+
const element = this.el.nativeElement.closest('.dropdown-menu');
|
|
22196
|
+
const clickEvent$ = element
|
|
22197
|
+
? merge(fromEvent(element, 'click'), fromEvent(document, 'click'))
|
|
22198
|
+
: fromEvent(document, 'click');
|
|
22199
|
+
clickEvent$
|
|
22200
|
+
.pipe(map((event) => event.target), filter(target => !this.el.nativeElement.contains(target)), // i.e. anything which is not inside this `c8y-date-time-picker`
|
|
22201
|
+
takeUntil(this.destroy$))
|
|
22202
|
+
.subscribe(() => this.closeDatepicker.hide());
|
|
22203
|
+
}
|
|
22204
|
+
ngOnDestroy() {
|
|
22205
|
+
this.destroy$.next();
|
|
22206
|
+
this.destroy$.complete();
|
|
22207
|
+
}
|
|
22208
|
+
}
|
|
22209
|
+
CloseDatePickerDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: CloseDatePickerDirective, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Directive });
|
|
22210
|
+
CloseDatePickerDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "14.0.6", type: CloseDatePickerDirective, selector: "[closeDatepicker]", inputs: { closeDatepicker: "closeDatepicker" }, ngImport: i0 });
|
|
22211
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: CloseDatePickerDirective, decorators: [{
|
|
22212
|
+
type: Directive,
|
|
22213
|
+
args: [{
|
|
22214
|
+
selector: '[closeDatepicker]'
|
|
22215
|
+
}]
|
|
22216
|
+
}], ctorParameters: function () { return [{ type: i0.ElementRef }]; }, propDecorators: { closeDatepicker: [{
|
|
22217
|
+
type: Input
|
|
22218
|
+
}] } });
|
|
22219
|
+
|
|
21888
22220
|
class DateTimePickerComponent {
|
|
21889
|
-
constructor() {
|
|
22221
|
+
constructor(cd) {
|
|
22222
|
+
this.cd = cd;
|
|
21890
22223
|
this.defaultPlaceholder = gettext('Select a date…');
|
|
21891
22224
|
this.destroy$ = new Subject();
|
|
21892
22225
|
this.form = new FormGroup({});
|
|
@@ -21913,6 +22246,9 @@ class DateTimePickerComponent {
|
|
|
21913
22246
|
this.destroy$.next();
|
|
21914
22247
|
this.destroy$.complete();
|
|
21915
22248
|
}
|
|
22249
|
+
ngAfterViewInit() {
|
|
22250
|
+
this.cd.detectChanges();
|
|
22251
|
+
}
|
|
21916
22252
|
/**
|
|
21917
22253
|
* Control Value Accessor - If form value changes by external factor, update date property and internal form with new value.
|
|
21918
22254
|
*/
|
|
@@ -21956,12 +22292,23 @@ class DateTimePickerComponent {
|
|
|
21956
22292
|
}
|
|
21957
22293
|
}
|
|
21958
22294
|
previousDay() {
|
|
22295
|
+
const isOpen = this.datepicker.isOpen;
|
|
21959
22296
|
this.date.setDate(this.date.getDate() - 1);
|
|
21960
22297
|
this.setDatetime({ date: this.date, time: this.form.get('time').value });
|
|
22298
|
+
if (isOpen) {
|
|
22299
|
+
this.datepicker.show();
|
|
22300
|
+
}
|
|
21961
22301
|
}
|
|
21962
22302
|
nextDay() {
|
|
22303
|
+
const isOpen = this.datepicker.isOpen;
|
|
21963
22304
|
this.date.setDate(this.date.getDate() + 1);
|
|
21964
22305
|
this.setDatetime({ date: this.date, time: this.form.get('time').value });
|
|
22306
|
+
if (isOpen) {
|
|
22307
|
+
this.datepicker.show();
|
|
22308
|
+
}
|
|
22309
|
+
}
|
|
22310
|
+
hide() {
|
|
22311
|
+
this.datepicker.hide();
|
|
21965
22312
|
}
|
|
21966
22313
|
/**
|
|
21967
22314
|
* If internal form changes its value, then combine date and time into one Date and pass its ISO string value to onChange method
|
|
@@ -21989,7 +22336,7 @@ class DateTimePickerComponent {
|
|
|
21989
22336
|
this.onChange(this.date.toISOString());
|
|
21990
22337
|
}
|
|
21991
22338
|
}
|
|
21992
|
-
DateTimePickerComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: DateTimePickerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
22339
|
+
DateTimePickerComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: DateTimePickerComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
|
|
21993
22340
|
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: [
|
|
21994
22341
|
{
|
|
21995
22342
|
provide: NG_VALUE_ACCESSOR,
|
|
@@ -22001,7 +22348,7 @@ DateTimePickerComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0"
|
|
|
22001
22348
|
useExisting: forwardRef(() => DateTimePickerComponent),
|
|
22002
22349
|
multi: true
|
|
22003
22350
|
}
|
|
22004
|
-
], 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" }] });
|
|
22351
|
+
], 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" }] });
|
|
22005
22352
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: DateTimePickerComponent, decorators: [{
|
|
22006
22353
|
type: Component,
|
|
22007
22354
|
args: [{ selector: 'c8y-date-time-picker', providers: [
|
|
@@ -22015,8 +22362,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.6", ngImpor
|
|
|
22015
22362
|
useExisting: forwardRef(() => DateTimePickerComponent),
|
|
22016
22363
|
multi: true
|
|
22017
22364
|
}
|
|
22018
|
-
], 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" }]
|
|
22019
|
-
}], ctorParameters: function () { return []; }, propDecorators: { _minDate: [{
|
|
22365
|
+
], 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" }]
|
|
22366
|
+
}], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }]; }, propDecorators: { _minDate: [{
|
|
22020
22367
|
type: Input,
|
|
22021
22368
|
args: ['minDate']
|
|
22022
22369
|
}], _maxDate: [{
|
|
@@ -22024,6 +22371,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.6", ngImpor
|
|
|
22024
22371
|
args: ['maxDate']
|
|
22025
22372
|
}], placeholder: [{
|
|
22026
22373
|
type: Input
|
|
22374
|
+
}], datepicker: [{
|
|
22375
|
+
type: ViewChild,
|
|
22376
|
+
args: [BsDatepickerDirective]
|
|
22027
22377
|
}] } });
|
|
22028
22378
|
|
|
22029
22379
|
class FieldDateTime extends FieldType {
|
|
@@ -22083,7 +22433,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.6", ngImpor
|
|
|
22083
22433
|
class DateTimePickerModule {
|
|
22084
22434
|
}
|
|
22085
22435
|
DateTimePickerModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: DateTimePickerModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
|
|
22086
|
-
DateTimePickerModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "14.0.6", ngImport: i0, type: DateTimePickerModule, declarations: [DateTimePickerComponent], imports: [FormsModule,
|
|
22436
|
+
DateTimePickerModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "14.0.6", ngImport: i0, type: DateTimePickerModule, declarations: [DateTimePickerComponent, CloseDatePickerDirective], imports: [FormsModule,
|
|
22087
22437
|
CommonModule$1,
|
|
22088
22438
|
FormsModule$1,
|
|
22089
22439
|
ReactiveFormsModule, i6.BsDatepickerModule, CommonModule,
|
|
@@ -22108,7 +22458,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.6", ngImpor
|
|
|
22108
22458
|
TimePickerModule
|
|
22109
22459
|
],
|
|
22110
22460
|
exports: [DateTimePickerComponent],
|
|
22111
|
-
declarations: [DateTimePickerComponent]
|
|
22461
|
+
declarations: [DateTimePickerComponent, CloseDatePickerDirective]
|
|
22112
22462
|
}]
|
|
22113
22463
|
}] });
|
|
22114
22464
|
|
|
@@ -24442,10 +24792,10 @@ class WidgetTimeContextComponent {
|
|
|
24442
24792
|
}
|
|
24443
24793
|
}
|
|
24444
24794
|
WidgetTimeContextComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: WidgetTimeContextComponent, deps: [{ token: WidgetsDashboardEventService }, { token: DashboardChildComponent }, { token: i1$6.Router }, { token: i1$6.ActivatedRoute }], target: i0.ɵɵFactoryTarget.Component });
|
|
24445
|
-
WidgetTimeContextComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.0.6", type: WidgetTimeContextComponent, selector: "c8y-widget-time-context", inputs: { canDecouple: "canDecouple" }, outputs: { dateContextChange: "dateContextChange" }, host: { classAttribute: "d-flex a-i-center gap-4" }, viewQueries: [{ propertyName: "action", first: true, predicate: DashboardChildActionComponent, descendants: true }], ngImport: i0, template: "<c8y-action-bar-item\n *ngIf=\"isCoupled\"\n [groupId]=\"'timecontext'\"\n [placement]=\"'left'\"\n itemClass=\"navbar-form\"\n>\n <ng-container\n [ngTemplateOutlet]=\"dateTimePicker\"\n [ngTemplateOutletContext]=\"{ date: globalDate }\"\n ></ng-container>\n</c8y-action-bar-item>\n\n<ng-container\n *ngIf=\"!isCoupled\"\n [ngTemplateOutlet]=\"dateTimePicker\"\n [ngTemplateOutletContext]=\"{ date: localDate }\"\n></ng-container>\n\n<ng-template #dateTimePicker let-date=\"date\">\n <label>{{ 'Time range' | translate }}</label>\n <div\n class=\"dropdown m-r-4\"\n dropdown\n #dropdown=\"bs-dropdown\"\n container=\"body\"\n [insideClick]=\"true\"\n >\n <button\n class=\"dropdown-toggle form-control l-h-1 d-flex a-i-center\"\n dropdownToggle\n title=\"{{ date[0] | c8yDate: 'short' }} \u2014 {{ date[1] | c8yDate: 'short' }}\"\n aria-haspopup=\"true\"\n >\n <span>{{ date[0] | c8yDate: 'shortDate' }} \u2014 {{ date[1] | c8yDate: 'shortDate' }}</span>\n <span class=\"caret m-r-8 m-l-4\"></span>\n </button>\n\n <div *dropdownMenu class=\"dropdown-menu dropdown-menu--date-range\">\n <div class=\"p-16\">\n <formly-form [form]=\"form\" [fields]=\"fields\" [model]=\"model\"></formly-form>\n </div>\n <div class=\"p-16 d-flex gap-8 separator-top\">\n <button\n class=\"btn btn-default btn-sm flex-grow\"\n (click)=\"reset(); dropdown.isOpen = false\"\n title=\"{{ 'Reset' | translate }}\"\n type=\"button\"\n translate\n >\n Reset\n </button>\n\n <button\n class=\"btn btn-primary btn-sm flex-grow\"\n (click)=\"applyDatetimeContext(); dropdown.isOpen = false\"\n [disabled]=\"(form.pristine && form.untouched) || form.invalid\"\n title=\"{{ 'Apply' | translate }}\"\n type=\"button\"\n translate\n >\n Apply\n </button>\n </div>\n </div>\n </div>\n\n <div class=\"c8y-select-wrapper\">\n <select\n class=\"form-control\"\n [attr.aria-label]=\"'Range' | translate\"\n [ngModel]=\"currentPredefinedTimeSpan\"\n (ngModelChange)=\"predefinedDateFromSelected($event)\"\n >\n <option value=\"undefined\" disabled=\"true\">{{ 'Custom range`time`' | translate }}</option>\n <option *ngFor=\"let dateFrom of predefinedTimeSpanList\" [ngValue]=\"dateFrom\">\n {{ dateFrom.title }}\n </option>\n </select>\n <span></span>\n </div>\n</ng-template>\n\n<c8y-dashboard-child-action>\n <button (click)=\"toggleDecoupling();\" type=\"button\">\n <i [c8yIcon]=\"isCoupled ? 'schedule1' : 'today'\"></i>\n <span class=\"m-l-4\">\n {{ (isCoupled ? decoupleTimeContextLabel : coupleTimeContextLabel) | translate }}\n </span>\n </button>\n</c8y-dashboard-child-action>\n", dependencies: [{ kind: "directive", type: IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "directive", type: C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: ActionBarItemComponent, selector: "c8y-action-bar-item", inputs: ["placement", "priority", "itemClass", "injector", "groupId"] }, { kind: "directive", type: i1$5.BsDropdownMenuDirective, selector: "[bsDropdownMenu],[dropdownMenu]", exportAs: ["bs-dropdown-menu"] }, { kind: "directive", type: i1$5.BsDropdownToggleDirective, selector: "[bsDropdownToggle],[dropdownToggle]", exportAs: ["bs-dropdown-toggle"] }, { kind: "directive", type: i1$5.BsDropdownDirective, selector: "[bsDropdown], [dropdown]", inputs: ["placement", "triggers", "container", "dropup", "autoClose", "isAnimated", "insideClick", "isDisabled", "isOpen"], outputs: ["isOpenChange", "onShown", "onHidden"], exportAs: ["bs-dropdown"] }, { kind: "directive", type: i5.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i5.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i5.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i5.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i4.FormlyForm, selector: "formly-form", inputs: ["form", "model", "fields", "options"], outputs: ["modelChange"] }, { kind: "component", type: DashboardChildActionComponent, selector: "c8y-dashboard-child-action" }, { kind: "pipe", type: C8yTranslatePipe, name: "translate" }, { kind: "pipe", type: DatePipe, name: "c8yDate" }] });
|
|
24795
|
+
WidgetTimeContextComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.0.6", type: WidgetTimeContextComponent, selector: "c8y-widget-time-context", inputs: { canDecouple: "canDecouple" }, outputs: { dateContextChange: "dateContextChange" }, host: { classAttribute: "d-flex a-i-center gap-4" }, viewQueries: [{ propertyName: "action", first: true, predicate: DashboardChildActionComponent, descendants: true }], ngImport: i0, template: "<c8y-action-bar-item\n *ngIf=\"isCoupled\"\n [groupId]=\"'timecontext'\"\n [placement]=\"'left'\"\n itemClass=\"navbar-form\"\n>\n <ng-container\n [ngTemplateOutlet]=\"dateTimePicker\"\n [ngTemplateOutletContext]=\"{ date: globalDate }\"\n ></ng-container>\n</c8y-action-bar-item>\n\n<ng-container\n *ngIf=\"!isCoupled\"\n [ngTemplateOutlet]=\"dateTimePicker\"\n [ngTemplateOutletContext]=\"{ date: localDate }\"\n></ng-container>\n\n<ng-template #dateTimePicker let-date=\"date\">\n <label>{{ 'Time range' | translate }}</label>\n <div\n class=\"dropdown m-r-4\"\n dropdown\n #dropdown=\"bs-dropdown\"\n container=\"body\"\n [insideClick]=\"true\"\n >\n <button\n class=\"dropdown-toggle form-control l-h-1 d-flex a-i-center\"\n dropdownToggle\n title=\"{{ date[0] | c8yDate: 'short' }} \u2014 {{ date[1] | c8yDate: 'short' }}\"\n aria-haspopup=\"true\"\n >\n <span>{{ date[0] | c8yDate: 'shortDate' }} \u2014 {{ date[1] | c8yDate: 'shortDate' }}</span>\n <span class=\"caret m-r-8 m-l-4\"></span>\n </button>\n\n <div *dropdownMenu class=\"dropdown-menu dropdown-menu--date-range\">\n <div class=\"p-16\">\n <formly-form [form]=\"form\" [fields]=\"fields\" [model]=\"model\"></formly-form>\n </div>\n <div class=\"p-16 d-flex gap-8 separator-top\">\n <button\n class=\"btn btn-default btn-sm flex-grow\"\n (click)=\"reset(); dropdown.isOpen = false\"\n title=\"{{ 'Reset' | translate }}\"\n type=\"button\"\n translate\n >\n Reset\n </button>\n\n <button\n class=\"btn btn-primary btn-sm flex-grow\"\n (click)=\"applyDatetimeContext(); dropdown.isOpen = false\"\n [disabled]=\"(form.pristine && form.untouched) || form.invalid\"\n title=\"{{ 'Apply' | translate }}\"\n type=\"button\"\n translate\n >\n Apply\n </button>\n </div>\n </div>\n </div>\n\n <div class=\"c8y-select-wrapper\">\n <select\n class=\"form-control\"\n [attr.aria-label]=\"'Range' | translate\"\n [ngModel]=\"currentPredefinedTimeSpan\"\n (ngModelChange)=\"predefinedDateFromSelected($event)\"\n >\n <option value=\"undefined\" disabled=\"true\">{{ 'Custom range`time`' | translate }}</option>\n <option *ngFor=\"let dateFrom of predefinedTimeSpanList\" [ngValue]=\"dateFrom\">\n {{ dateFrom.title | translate }}\n </option>\n </select>\n <span></span>\n </div>\n</ng-template>\n\n<c8y-dashboard-child-action>\n <button (click)=\"toggleDecoupling();\" type=\"button\">\n <i [c8yIcon]=\"isCoupled ? 'schedule1' : 'today'\"></i>\n <span class=\"m-l-4\">\n {{ (isCoupled ? decoupleTimeContextLabel : coupleTimeContextLabel) | translate }}\n </span>\n </button>\n</c8y-dashboard-child-action>\n", dependencies: [{ kind: "directive", type: IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "directive", type: C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: ActionBarItemComponent, selector: "c8y-action-bar-item", inputs: ["placement", "priority", "itemClass", "injector", "groupId"] }, { kind: "directive", type: i1$5.BsDropdownMenuDirective, selector: "[bsDropdownMenu],[dropdownMenu]", exportAs: ["bs-dropdown-menu"] }, { kind: "directive", type: i1$5.BsDropdownToggleDirective, selector: "[bsDropdownToggle],[dropdownToggle]", exportAs: ["bs-dropdown-toggle"] }, { kind: "directive", type: i1$5.BsDropdownDirective, selector: "[bsDropdown], [dropdown]", inputs: ["placement", "triggers", "container", "dropup", "autoClose", "isAnimated", "insideClick", "isDisabled", "isOpen"], outputs: ["isOpenChange", "onShown", "onHidden"], exportAs: ["bs-dropdown"] }, { kind: "directive", type: i5.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i5.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i5.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i5.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i4.FormlyForm, selector: "formly-form", inputs: ["form", "model", "fields", "options"], outputs: ["modelChange"] }, { kind: "component", type: DashboardChildActionComponent, selector: "c8y-dashboard-child-action" }, { kind: "pipe", type: C8yTranslatePipe, name: "translate" }, { kind: "pipe", type: DatePipe, name: "c8yDate" }] });
|
|
24446
24796
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: WidgetTimeContextComponent, decorators: [{
|
|
24447
24797
|
type: Component,
|
|
24448
|
-
args: [{ selector: 'c8y-widget-time-context', host: { class: 'd-flex a-i-center gap-4' }, template: "<c8y-action-bar-item\n *ngIf=\"isCoupled\"\n [groupId]=\"'timecontext'\"\n [placement]=\"'left'\"\n itemClass=\"navbar-form\"\n>\n <ng-container\n [ngTemplateOutlet]=\"dateTimePicker\"\n [ngTemplateOutletContext]=\"{ date: globalDate }\"\n ></ng-container>\n</c8y-action-bar-item>\n\n<ng-container\n *ngIf=\"!isCoupled\"\n [ngTemplateOutlet]=\"dateTimePicker\"\n [ngTemplateOutletContext]=\"{ date: localDate }\"\n></ng-container>\n\n<ng-template #dateTimePicker let-date=\"date\">\n <label>{{ 'Time range' | translate }}</label>\n <div\n class=\"dropdown m-r-4\"\n dropdown\n #dropdown=\"bs-dropdown\"\n container=\"body\"\n [insideClick]=\"true\"\n >\n <button\n class=\"dropdown-toggle form-control l-h-1 d-flex a-i-center\"\n dropdownToggle\n title=\"{{ date[0] | c8yDate: 'short' }} \u2014 {{ date[1] | c8yDate: 'short' }}\"\n aria-haspopup=\"true\"\n >\n <span>{{ date[0] | c8yDate: 'shortDate' }} \u2014 {{ date[1] | c8yDate: 'shortDate' }}</span>\n <span class=\"caret m-r-8 m-l-4\"></span>\n </button>\n\n <div *dropdownMenu class=\"dropdown-menu dropdown-menu--date-range\">\n <div class=\"p-16\">\n <formly-form [form]=\"form\" [fields]=\"fields\" [model]=\"model\"></formly-form>\n </div>\n <div class=\"p-16 d-flex gap-8 separator-top\">\n <button\n class=\"btn btn-default btn-sm flex-grow\"\n (click)=\"reset(); dropdown.isOpen = false\"\n title=\"{{ 'Reset' | translate }}\"\n type=\"button\"\n translate\n >\n Reset\n </button>\n\n <button\n class=\"btn btn-primary btn-sm flex-grow\"\n (click)=\"applyDatetimeContext(); dropdown.isOpen = false\"\n [disabled]=\"(form.pristine && form.untouched) || form.invalid\"\n title=\"{{ 'Apply' | translate }}\"\n type=\"button\"\n translate\n >\n Apply\n </button>\n </div>\n </div>\n </div>\n\n <div class=\"c8y-select-wrapper\">\n <select\n class=\"form-control\"\n [attr.aria-label]=\"'Range' | translate\"\n [ngModel]=\"currentPredefinedTimeSpan\"\n (ngModelChange)=\"predefinedDateFromSelected($event)\"\n >\n <option value=\"undefined\" disabled=\"true\">{{ 'Custom range`time`' | translate }}</option>\n <option *ngFor=\"let dateFrom of predefinedTimeSpanList\" [ngValue]=\"dateFrom\">\n {{ dateFrom.title }}\n </option>\n </select>\n <span></span>\n </div>\n</ng-template>\n\n<c8y-dashboard-child-action>\n <button (click)=\"toggleDecoupling();\" type=\"button\">\n <i [c8yIcon]=\"isCoupled ? 'schedule1' : 'today'\"></i>\n <span class=\"m-l-4\">\n {{ (isCoupled ? decoupleTimeContextLabel : coupleTimeContextLabel) | translate }}\n </span>\n </button>\n</c8y-dashboard-child-action>\n" }]
|
|
24798
|
+
args: [{ selector: 'c8y-widget-time-context', host: { class: 'd-flex a-i-center gap-4' }, template: "<c8y-action-bar-item\n *ngIf=\"isCoupled\"\n [groupId]=\"'timecontext'\"\n [placement]=\"'left'\"\n itemClass=\"navbar-form\"\n>\n <ng-container\n [ngTemplateOutlet]=\"dateTimePicker\"\n [ngTemplateOutletContext]=\"{ date: globalDate }\"\n ></ng-container>\n</c8y-action-bar-item>\n\n<ng-container\n *ngIf=\"!isCoupled\"\n [ngTemplateOutlet]=\"dateTimePicker\"\n [ngTemplateOutletContext]=\"{ date: localDate }\"\n></ng-container>\n\n<ng-template #dateTimePicker let-date=\"date\">\n <label>{{ 'Time range' | translate }}</label>\n <div\n class=\"dropdown m-r-4\"\n dropdown\n #dropdown=\"bs-dropdown\"\n container=\"body\"\n [insideClick]=\"true\"\n >\n <button\n class=\"dropdown-toggle form-control l-h-1 d-flex a-i-center\"\n dropdownToggle\n title=\"{{ date[0] | c8yDate: 'short' }} \u2014 {{ date[1] | c8yDate: 'short' }}\"\n aria-haspopup=\"true\"\n >\n <span>{{ date[0] | c8yDate: 'shortDate' }} \u2014 {{ date[1] | c8yDate: 'shortDate' }}</span>\n <span class=\"caret m-r-8 m-l-4\"></span>\n </button>\n\n <div *dropdownMenu class=\"dropdown-menu dropdown-menu--date-range\">\n <div class=\"p-16\">\n <formly-form [form]=\"form\" [fields]=\"fields\" [model]=\"model\"></formly-form>\n </div>\n <div class=\"p-16 d-flex gap-8 separator-top\">\n <button\n class=\"btn btn-default btn-sm flex-grow\"\n (click)=\"reset(); dropdown.isOpen = false\"\n title=\"{{ 'Reset' | translate }}\"\n type=\"button\"\n translate\n >\n Reset\n </button>\n\n <button\n class=\"btn btn-primary btn-sm flex-grow\"\n (click)=\"applyDatetimeContext(); dropdown.isOpen = false\"\n [disabled]=\"(form.pristine && form.untouched) || form.invalid\"\n title=\"{{ 'Apply' | translate }}\"\n type=\"button\"\n translate\n >\n Apply\n </button>\n </div>\n </div>\n </div>\n\n <div class=\"c8y-select-wrapper\">\n <select\n class=\"form-control\"\n [attr.aria-label]=\"'Range' | translate\"\n [ngModel]=\"currentPredefinedTimeSpan\"\n (ngModelChange)=\"predefinedDateFromSelected($event)\"\n >\n <option value=\"undefined\" disabled=\"true\">{{ 'Custom range`time`' | translate }}</option>\n <option *ngFor=\"let dateFrom of predefinedTimeSpanList\" [ngValue]=\"dateFrom\">\n {{ dateFrom.title | translate }}\n </option>\n </select>\n <span></span>\n </div>\n</ng-template>\n\n<c8y-dashboard-child-action>\n <button (click)=\"toggleDecoupling();\" type=\"button\">\n <i [c8yIcon]=\"isCoupled ? 'schedule1' : 'today'\"></i>\n <span class=\"m-l-4\">\n {{ (isCoupled ? decoupleTimeContextLabel : coupleTimeContextLabel) | translate }}\n </span>\n </button>\n</c8y-dashboard-child-action>\n" }]
|
|
24449
24799
|
}], ctorParameters: function () { return [{ type: WidgetsDashboardEventService }, { type: DashboardChildComponent }, { type: i1$6.Router }, { type: i1$6.ActivatedRoute }]; }, propDecorators: { canDecouple: [{
|
|
24450
24800
|
type: Input
|
|
24451
24801
|
}], dateContextChange: [{
|
|
@@ -28788,5 +29138,5 @@ class RealtimeMessage {
|
|
|
28788
29138
|
* Generated bundle index. Do not edit.
|
|
28789
29139
|
*/
|
|
28790
29140
|
|
|
28791
|
-
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 };
|
|
29141
|
+
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 };
|
|
28792
29142
|
//# sourceMappingURL=c8y-ngx-components.mjs.map
|