@c8y/ngx-components 1006.6.36 → 1006.6.40

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.
Files changed (105) hide show
  1. package/bundles/c8y-ngx-components-connectivity.umd.js +1 -1
  2. package/bundles/c8y-ngx-components-connectivity.umd.js.map +1 -1
  3. package/bundles/c8y-ngx-components-connectivity.umd.min.js +1 -1
  4. package/bundles/c8y-ngx-components-connectivity.umd.min.js.map +1 -1
  5. package/bundles/c8y-ngx-components-context-dashboard.umd.js +1 -1
  6. package/bundles/c8y-ngx-components-context-dashboard.umd.js.map +1 -1
  7. package/bundles/c8y-ngx-components-context-dashboard.umd.min.js +1 -1
  8. package/bundles/c8y-ngx-components-context-dashboard.umd.min.js.map +1 -1
  9. package/bundles/c8y-ngx-components-repository.umd.js +1 -1
  10. package/bundles/c8y-ngx-components-repository.umd.js.map +1 -1
  11. package/bundles/c8y-ngx-components-repository.umd.min.js +1 -1
  12. package/bundles/c8y-ngx-components-repository.umd.min.js.map +1 -1
  13. package/bundles/c8y-ngx-components-sensor-phone.umd.js +1 -1
  14. package/bundles/c8y-ngx-components-sensor-phone.umd.js.map +1 -1
  15. package/bundles/c8y-ngx-components-sensor-phone.umd.min.js +1 -1
  16. package/bundles/c8y-ngx-components-sensor-phone.umd.min.js.map +1 -1
  17. package/bundles/c8y-ngx-components.umd.js +400 -131
  18. package/bundles/c8y-ngx-components.umd.js.map +1 -1
  19. package/bundles/c8y-ngx-components.umd.min.js +2 -2
  20. package/bundles/c8y-ngx-components.umd.min.js.map +1 -1
  21. package/c8y-ngx-components.d.ts +90 -87
  22. package/c8y-ngx-components.metadata.json +1 -1
  23. package/connectivity/c8y-ngx-components-connectivity.metadata.json +1 -1
  24. package/context-dashboard/c8y-ngx-components-context-dashboard.metadata.json +1 -1
  25. package/core/authentication/new-password.component.d.ts +8 -6
  26. package/core/docs/guide-docs.component.d.ts +25 -3
  27. package/core/forms/validation-pattern.d.ts +1 -0
  28. package/core/i18n/force-html-translate.directive.d.ts +32 -0
  29. package/core/login/change-password.component.d.ts +1 -1
  30. package/core/login/login.service.d.ts +15 -2
  31. package/core/login/password-strength-validator.directive.d.ts +9 -0
  32. package/core/login/strength-validator-service.d.ts +7 -0
  33. package/core/user/user-edit.component.d.ts +4 -2
  34. package/esm2015/c8y-ngx-components.js +90 -87
  35. package/esm2015/connectivity/impact/impact-provider-settings.component.js +2 -2
  36. package/esm2015/context-dashboard/legacy-welcome/legacy-welcome.component.js +2 -2
  37. package/esm2015/core/authentication/new-password.component.js +15 -20
  38. package/esm2015/core/dashboard/widgets-dashboard.component.js +2 -2
  39. package/esm2015/core/docs/guide-docs.component.js +69 -4
  40. package/esm2015/core/forms/validation-pattern.js +2 -1
  41. package/esm2015/core/i18n/force-html-translate.directive.js +99 -0
  42. package/esm2015/core/i18n/i18n.module.js +5 -3
  43. package/esm2015/core/i18n/pattern-messages.data.js +2 -2
  44. package/esm2015/core/login/change-password.component.js +5 -5
  45. package/esm2015/core/login/credentials.component.js +2 -2
  46. package/esm2015/core/login/login.module.js +4 -2
  47. package/esm2015/core/login/login.service.js +40 -6
  48. package/esm2015/core/login/password-strength-validator.directive.js +32 -0
  49. package/esm2015/core/login/strength-validator-service.js +28 -0
  50. package/esm2015/core/user/user-edit.component.js +10 -5
  51. package/esm2015/repository/configuration/configuration-list.component.js +2 -2
  52. package/esm2015/sensor-phone/sensor-phone-modal.component.js +2 -2
  53. package/esm5/c8y-ngx-components.js +90 -87
  54. package/esm5/connectivity/impact/impact-provider-settings.component.js +2 -2
  55. package/esm5/context-dashboard/legacy-welcome/legacy-welcome.component.js +2 -2
  56. package/esm5/core/authentication/new-password.component.js +21 -25
  57. package/esm5/core/dashboard/widgets-dashboard.component.js +2 -2
  58. package/esm5/core/docs/guide-docs.component.js +72 -4
  59. package/esm5/core/forms/validation-pattern.js +2 -1
  60. package/esm5/core/i18n/force-html-translate.directive.js +105 -0
  61. package/esm5/core/i18n/i18n.module.js +5 -3
  62. package/esm5/core/i18n/pattern-messages.data.js +2 -2
  63. package/esm5/core/login/change-password.component.js +5 -5
  64. package/esm5/core/login/credentials.component.js +2 -2
  65. package/esm5/core/login/login.module.js +4 -2
  66. package/esm5/core/login/login.service.js +43 -6
  67. package/esm5/core/login/password-strength-validator.directive.js +38 -0
  68. package/esm5/core/login/strength-validator-service.js +29 -0
  69. package/esm5/core/user/user-edit.component.js +19 -9
  70. package/esm5/repository/configuration/configuration-list.component.js +2 -2
  71. package/esm5/sensor-phone/sensor-phone-modal.component.js +2 -2
  72. package/fesm2015/c8y-ngx-components-connectivity.js +1 -1
  73. package/fesm2015/c8y-ngx-components-connectivity.js.map +1 -1
  74. package/fesm2015/c8y-ngx-components-context-dashboard.js +1 -1
  75. package/fesm2015/c8y-ngx-components-context-dashboard.js.map +1 -1
  76. package/fesm2015/c8y-ngx-components-repository.js +1 -1
  77. package/fesm2015/c8y-ngx-components-repository.js.map +1 -1
  78. package/fesm2015/c8y-ngx-components-sensor-phone.js +1 -1
  79. package/fesm2015/c8y-ngx-components-sensor-phone.js.map +1 -1
  80. package/fesm2015/c8y-ngx-components.js +281 -40
  81. package/fesm2015/c8y-ngx-components.js.map +1 -1
  82. package/fesm5/c8y-ngx-components-connectivity.js +1 -1
  83. package/fesm5/c8y-ngx-components-connectivity.js.map +1 -1
  84. package/fesm5/c8y-ngx-components-context-dashboard.js +1 -1
  85. package/fesm5/c8y-ngx-components-context-dashboard.js.map +1 -1
  86. package/fesm5/c8y-ngx-components-repository.js +1 -1
  87. package/fesm5/c8y-ngx-components-repository.js.map +1 -1
  88. package/fesm5/c8y-ngx-components-sensor-phone.js +1 -1
  89. package/fesm5/c8y-ngx-components-sensor-phone.js.map +1 -1
  90. package/fesm5/c8y-ngx-components.js +315 -49
  91. package/fesm5/c8y-ngx-components.js.map +1 -1
  92. package/locales/de.po +71 -60
  93. package/locales/es.po +120 -85
  94. package/locales/fr.po +107 -72
  95. package/locales/ja_JP.po +89 -78
  96. package/locales/ko.po +92 -57
  97. package/locales/locales.pot +9 -9
  98. package/locales/nl.po +95 -60
  99. package/locales/pl.po +88 -53
  100. package/locales/pt_BR.po +174 -138
  101. package/locales/ru.po +120 -85
  102. package/locales/zh_CN.po +87 -52
  103. package/package.json +2 -2
  104. package/repository/c8y-ngx-components-repository.metadata.json +1 -1
  105. package/sensor-phone/c8y-ngx-components-sensor-phone.metadata.json +1 -1
@@ -1,11 +1,11 @@
1
1
  import { __spread, __extends, __decorate, __read, __awaiter, __generator, __param, __assign } from 'tslib';
2
- import { InjectionToken, Injector, ɵɵdefineInjectable, ɵɵinject, INJECTOR, Injectable, Optional, Inject, isDevMode, ViewContainerRef, Component, Pipe, LOCALE_ID, NgModule, ElementRef, Renderer2, Input, Directive, TemplateRef, ComponentFactoryResolver, EventEmitter, Output, HostBinding, APP_INITIALIZER, ViewChild, Attribute, ContentChild, ContentChildren, SecurityContext, HostListener, NgZone, ViewChildren, ChangeDetectorRef, Type, ChangeDetectionStrategy, forwardRef, Host } from '@angular/core';
2
+ import { InjectionToken, Injector, ɵɵdefineInjectable, ɵɵinject, INJECTOR, Injectable, Optional, Inject, isDevMode, ViewContainerRef, Component, Pipe, EventEmitter, ElementRef, ChangeDetectorRef, Input, Directive, LOCALE_ID, NgModule, Renderer2, TemplateRef, ComponentFactoryResolver, Output, HostBinding, APP_INITIALIZER, ViewChild, Attribute, ContentChild, ContentChildren, SecurityContext, HostListener, NgZone, ViewChildren, Type, ChangeDetectionStrategy, forwardRef, Host } from '@angular/core';
3
3
  import { NavigationEnd, Router, RouterModule as RouterModule$1, RouterLinkActive, PRIMARY_OUTLET, ActivatedRoute } from '@angular/router';
4
- import { of, defer, combineLatest, isObservable, from, race, Subject, BehaviorSubject, pipe, EMPTY, timer, merge as merge$1, fromEvent, fromEventPattern, NEVER } from 'rxjs';
4
+ import { of, defer, combineLatest, isObservable, from, race, Subject, BehaviorSubject, pipe, EMPTY, timer, merge as merge$1, fromEvent, fromEventPattern, ReplaySubject, NEVER } from 'rxjs';
5
5
  import { filter, merge, startWith, switchMap, map, distinctUntilChanged, shareReplay, scan, combineLatest as combineLatest$1, debounceTime, first, tap, catchError, take, debounce, finalize, takeUntil, mergeMap, expand, every, toArray } from 'rxjs/operators';
6
- import { flatten, isFunction, sortBy, camelCase, isUndefined, keys, matches, upperFirst, each, mapValues, mapKeys, get as get$1, assign, filter as filter$1, clone, map as map$1, isEmpty as isEmpty$1, find as find$1, includes, orderBy, flow, isNil, pick, omitBy, chunk, union, without, parseInt as parseInt$1, remove, transform, identity, forEach, cloneDeep, some, findIndex } from 'lodash-es';
6
+ import { flatten, isFunction, sortBy, camelCase, isUndefined, keys, matches, upperFirst, each, mapValues, mapKeys, get as get$1, isEqual, assign, filter as filter$1, isString, clone, map as map$1, isEmpty as isEmpty$1, find as find$1, includes, orderBy, flow, isNil, pick, omitBy, chunk, union, without, parseInt as parseInt$1, remove, transform, identity, forEach, cloneDeep, some, findIndex } from 'lodash-es';
7
7
  import { SystemOptionsService, TenantOptionsService, ApiService, DataModule } from '@c8y/ngx-components/api';
8
- import { ApplicationService, FetchClient, OperationStatus, UserService, InventoryService, BasicAuth, CookieAuth, TenantService, Realtime, TenantLoginOptionsService, Client, PasswordStrength, SystemOptionsService as SystemOptionsService$1, QueriesUtil } from '@c8y/client';
8
+ import { ApplicationService, FetchClient, OperationStatus, UserService, InventoryService, BasicAuth, CookieAuth, TenantService, Realtime, TenantLoginOptionsService, Client, PasswordStrength, QueriesUtil } from '@c8y/client';
9
9
  import { TranslateService as TranslateService$1, TranslateParser, TranslateDefaultParser, TranslateLoader, TranslateCompiler, TranslateFakeCompiler, MissingTranslationHandler, TranslateStore, USE_STORE, USE_DEFAULT_LANG, USE_EXTEND, DEFAULT_LANGUAGE, TranslateModule } from '@ngx-translate/core';
10
10
  import { get, find, negate, isUndefined as isUndefined$1, sortBy as sortBy$1, isEmpty } from 'lodash';
11
11
  import { formatDate, registerLocaleData, CommonModule as CommonModule$1, LocationStrategy } from '@angular/common';
@@ -3376,7 +3376,7 @@ var MESSAGES = {
3376
3376
  }
3377
3377
  },
3378
3378
  '^Error updating tenant! Cannot insert second configuration for Password code grant internal/Bad Request$': {
3379
- gettext: gettext('This login mode was already set by other admin, please refresh page to update data')
3379
+ gettext: gettext('This login mode was already set by another administrator. Refresh the page to update the data.')
3380
3380
  },
3381
3381
  };
3382
3382
 
@@ -3474,6 +3474,106 @@ var TranslateParserCustom = /** @class */ (function (_super) {
3474
3474
  return TranslateParserCustom;
3475
3475
  }(TranslateDefaultParser));
3476
3476
 
3477
+ /**
3478
+ * This is temporary fallback directive that is used to handle HTML blocks translation on maintenance versions
3479
+ * in version 10.9.4 and later, this is replaced by default translate directive.
3480
+ */
3481
+ var ForceHtmlTranslateDirective = /** @class */ (function () {
3482
+ function ForceHtmlTranslateDirective(translateService, element, _ref) {
3483
+ var _this = this;
3484
+ this.translateService = translateService;
3485
+ this.element = element;
3486
+ this._ref = _ref;
3487
+ /**
3488
+ * Used to trigger events when html is replaced by directive.
3489
+ */
3490
+ this.htmlUpdateEvent = new EventEmitter();
3491
+ // subscribe to onTranslationChange event, in case the translations of the current lang change
3492
+ if (!this.onTranslationChangeSub) {
3493
+ this.onTranslationChangeSub = this.translateService.onTranslationChange.subscribe(function (event) {
3494
+ if (event.lang === _this.translateService.currentLang) {
3495
+ _this.checkNodes();
3496
+ }
3497
+ });
3498
+ }
3499
+ // subscribe to onLangChange event, in case the language changes
3500
+ if (!this.onLangChangeSub) {
3501
+ this.onLangChangeSub = this.translateService.onLangChange.subscribe(function (event) {
3502
+ _this.checkNodes();
3503
+ });
3504
+ }
3505
+ // subscribe to onDefaultLangChange event, in case the default language changes
3506
+ if (!this.onDefaultLangChangeSub) {
3507
+ this.onDefaultLangChangeSub = this.translateService.onDefaultLangChange.subscribe(function (event) {
3508
+ _this.checkNodes();
3509
+ });
3510
+ }
3511
+ }
3512
+ Object.defineProperty(ForceHtmlTranslateDirective.prototype, "translateParams", {
3513
+ set: function (params) {
3514
+ if (!isEqual(this.currentParams, params)) {
3515
+ this.currentParams = params;
3516
+ this.checkNodes();
3517
+ }
3518
+ },
3519
+ enumerable: true,
3520
+ configurable: true
3521
+ });
3522
+ ForceHtmlTranslateDirective.prototype.ngAfterViewChecked = function () {
3523
+ this.checkNodes();
3524
+ };
3525
+ ForceHtmlTranslateDirective.prototype.checkNodes = function () {
3526
+ if (this.isLookupKeyMissing()) {
3527
+ this.element.nativeElement.lookupKey = this.getLookupKey();
3528
+ }
3529
+ this.translateAndUpdateHtmlContent();
3530
+ this.htmlUpdateEvent.emit();
3531
+ };
3532
+ ForceHtmlTranslateDirective.prototype.ngOnDestroy = function () {
3533
+ if (this.onLangChangeSub) {
3534
+ this.onLangChangeSub.unsubscribe();
3535
+ }
3536
+ if (this.onDefaultLangChangeSub) {
3537
+ this.onDefaultLangChangeSub.unsubscribe();
3538
+ }
3539
+ if (this.onTranslationChangeSub) {
3540
+ this.onTranslationChangeSub.unsubscribe();
3541
+ }
3542
+ this.htmlUpdateEvent.complete();
3543
+ };
3544
+ /**
3545
+ * Builds lookup key from innerHTML, removes comments (that might be added by Angular) and trims it.
3546
+ */
3547
+ ForceHtmlTranslateDirective.prototype.getLookupKey = function () {
3548
+ return this.element.nativeElement.innerHTML.replace(/<!--.*?-->/gs, '').trim();
3549
+ };
3550
+ ForceHtmlTranslateDirective.prototype.isLookupKeyMissing = function () {
3551
+ return !this.element.nativeElement.lookupKey;
3552
+ };
3553
+ ForceHtmlTranslateDirective.prototype.lookupKeyExist = function () {
3554
+ return this.element.nativeElement.lookupKey;
3555
+ };
3556
+ ForceHtmlTranslateDirective.prototype.translateAndUpdateHtmlContent = function () {
3557
+ if (this.lookupKeyExist()) {
3558
+ this.element.nativeElement.innerHTML = this.translateService.instant(this.element.nativeElement.lookupKey, this.currentParams || {});
3559
+ }
3560
+ };
3561
+ ForceHtmlTranslateDirective.ctorParameters = function () { return [
3562
+ { type: TranslateService$1 },
3563
+ { type: ElementRef },
3564
+ { type: ChangeDetectorRef }
3565
+ ]; };
3566
+ __decorate([
3567
+ Input()
3568
+ ], ForceHtmlTranslateDirective.prototype, "translateParams", null);
3569
+ ForceHtmlTranslateDirective = __decorate([
3570
+ Directive({
3571
+ selector: '[forceHtmlTranslate]'
3572
+ })
3573
+ ], ForceHtmlTranslateDirective);
3574
+ return ForceHtmlTranslateDirective;
3575
+ }());
3576
+
3477
3577
  // Load these as a side effect
3478
3578
  try {
3479
3579
  // tslint:disable:no-var-requires
@@ -3550,8 +3650,9 @@ var I18nModule = /** @class */ (function () {
3550
3650
  var I18nModule_1;
3551
3651
  I18nModule = I18nModule_1 = __decorate([
3552
3652
  NgModule({
3553
- exports: [TranslateModule],
3554
- imports: [HttpClientModule]
3653
+ exports: [TranslateModule, ForceHtmlTranslateDirective],
3654
+ imports: [HttpClientModule],
3655
+ declarations: [ForceHtmlTranslateDirective]
3555
3656
  })
3556
3657
  ], I18nModule);
3557
3658
  return I18nModule;
@@ -6761,6 +6862,7 @@ var LoginService = /** @class */ (function () {
6761
6862
  };
6762
6863
  this.passwordStrengthSetting = {
6763
6864
  enforcePasswordStrength: false,
6865
+ passwordStrengthValidity: false,
6764
6866
  greenMinLength: this.GREEN_MIN_LENGTH_DEFAULT
6765
6867
  };
6766
6868
  this.localhostRegExp = new RegExp('localhost');
@@ -6855,14 +6957,50 @@ var LoginService = /** @class */ (function () {
6855
6957
  return this.passwordStrengthSetting.greenMinLength;
6856
6958
  };
6857
6959
  /**
6858
- * Checks if password strength is enforced.
6859
- * @return true if enforced.
6960
+ * Checks if password strength is enforced for system
6961
+ * by retrieving value of `enforceStrength` property from loginOptions response
6962
+ * @return boolean value, true if enforced, false otherwise.
6860
6963
  */
6861
6964
  LoginService.prototype.getEnforcePasswordStrength = function () {
6862
6965
  var loginOption = this.getLoginOption();
6863
- this.passwordStrengthSetting.enforcePasswordStrength = get$1(loginOption, 'enforceStrength', 'false') === 'true' ? true : false;
6966
+ var enforcePasswordStrength = get$1(loginOption, 'enforceStrength');
6967
+ if (isString(enforcePasswordStrength)) {
6968
+ this.passwordStrengthSetting.enforcePasswordStrength = enforcePasswordStrength === 'true' ? true : false;
6969
+ }
6970
+ else {
6971
+ this.passwordStrengthSetting.enforcePasswordStrength = !!enforcePasswordStrength;
6972
+ }
6864
6973
  return this.passwordStrengthSetting.enforcePasswordStrength;
6865
6974
  };
6975
+ /**
6976
+ * Checks if password strength is enforced for particular tenant
6977
+ * by retrieving value of `strengthValidity` property from loginOptions response
6978
+ * @return boolean value, true if enforced, false otherwise.
6979
+ */
6980
+ LoginService.prototype.getPasswordStrengthValidity = function () {
6981
+ return __awaiter(this, void 0, void 0, function () {
6982
+ var loginOption, strengthValidity;
6983
+ return __generator(this, function (_a) {
6984
+ loginOption = this.getLoginOption();
6985
+ strengthValidity = get$1(loginOption, 'strengthValidity');
6986
+ if (isString(strengthValidity)) {
6987
+ this.passwordStrengthSetting.passwordStrengthValidity = strengthValidity === 'true' ? true : false;
6988
+ }
6989
+ else {
6990
+ this.passwordStrengthSetting.passwordStrengthValidity = !!strengthValidity;
6991
+ }
6992
+ return [2 /*return*/, this.passwordStrengthSetting.passwordStrengthValidity];
6993
+ });
6994
+ });
6995
+ };
6996
+ /**
6997
+ * Function determines if enforced strength checks should be enabled for current tenant
6998
+ * based on properties retrieved from loginOptions
6999
+ * @return boolean value, true if strength is enforced for tenant, false otherwise.
7000
+ */
7001
+ LoginService.prototype.getPasswordStrengthEnforced = function () {
7002
+ return this.getEnforcePasswordStrength() || this.getPasswordStrengthValidity();
7003
+ };
6866
7004
  /**
6867
7005
  * Clears all backend errors.
6868
7006
  */
@@ -7474,7 +7612,7 @@ var UserTotpSetupComponent = /** @class */ (function () {
7474
7612
  }());
7475
7613
 
7476
7614
  var UserEditComponent = /** @class */ (function () {
7477
- function UserEditComponent(state, translate, passwordService, modalConfirmService, bsModalService, alert, userService, tenantLoginOptionsService) {
7615
+ function UserEditComponent(state, translate, passwordService, modalConfirmService, bsModalService, alert, userService, tenantLoginOptionsService, tenantService) {
7478
7616
  this.state = state;
7479
7617
  this.translate = translate;
7480
7618
  this.passwordService = passwordService;
@@ -7483,6 +7621,7 @@ var UserEditComponent = /** @class */ (function () {
7483
7621
  this.alert = alert;
7484
7622
  this.userService = userService;
7485
7623
  this.tenantLoginOptionsService = tenantLoginOptionsService;
7624
+ this.tenantService = tenantService;
7486
7625
  this.loading = false;
7487
7626
  this.onUser = new EventEmitter();
7488
7627
  this.onLanguage = new EventEmitter();
@@ -7501,11 +7640,19 @@ var UserEditComponent = /** @class */ (function () {
7501
7640
  });
7502
7641
  UserEditComponent.prototype.ngOnInit = function () {
7503
7642
  return __awaiter(this, void 0, void 0, function () {
7504
- return __generator(this, function (_a) {
7505
- switch (_a.label) {
7506
- case 0: return [4 /*yield*/, this.initializeTotpSettings()];
7643
+ var currentTenant, _a, enabledOnSystemLevel, enabledOnTenantLevel;
7644
+ return __generator(this, function (_b) {
7645
+ switch (_b.label) {
7646
+ case 0: return [4 /*yield*/, this.tenantService.current()];
7507
7647
  case 1:
7508
- _a.sent();
7648
+ currentTenant = (_b.sent()).data;
7649
+ return [4 /*yield*/, this.tenantService.getTfaSettings(currentTenant)];
7650
+ case 2:
7651
+ _a = _b.sent(), enabledOnSystemLevel = _a.enabledOnSystemLevel, enabledOnTenantLevel = _a.enabledOnTenantLevel;
7652
+ this.isTfaEnabled = enabledOnSystemLevel || enabledOnTenantLevel;
7653
+ return [4 /*yield*/, this.initializeTotpSettings()];
7654
+ case 3:
7655
+ _b.sent();
7509
7656
  return [2 /*return*/];
7510
7657
  }
7511
7658
  });
@@ -7592,7 +7739,8 @@ var UserEditComponent = /** @class */ (function () {
7592
7739
  { type: BsModalService },
7593
7740
  { type: AlertService },
7594
7741
  { type: UserService },
7595
- { type: TenantLoginOptionsService }
7742
+ { type: TenantLoginOptionsService },
7743
+ { type: TenantService }
7596
7744
  ]; };
7597
7745
  __decorate([
7598
7746
  Input()
@@ -7615,7 +7763,7 @@ var UserEditComponent = /** @class */ (function () {
7615
7763
  UserEditComponent = __decorate([
7616
7764
  Component({
7617
7765
  selector: 'c8y-user-edit',
7618
- template: "<form #userForm=\"ngForm\" (ngSubmit)=\"userForm.form.valid && save()\">\n <div class=\"alert alert-warning\" role=\"alert\" *ngIf=\"userIsExternal\" translate>\n You cannot edit the user since it is managed via your authorization server.\n </div>\n <c8y-form-group>\n <label translate for=\"userName\">Username (e.g. email)</label>\n <input\n id=\"userName\"\n class=\"form-control\"\n [(ngModel)]=\"user.userName\"\n name=\"userName\"\n autocomplete=\"off\"\n required\n maxlength=\"254\"\n placeholder=\"{{ 'e.g. joe.doe@example.com`LOCALIZE`' | translate }}\"\n [disabled]=\"user.id\"\n c8yDefaultValidation=\"user\"\n />\n </c8y-form-group>\n\n <c8y-form-group>\n <label translate for=\"displayName\">Login alias</label>\n <input\n id=\"displayName\"\n class=\"form-control\"\n [(ngModel)]=\"user.displayName\"\n name=\"displayName\"\n autocomplete=\"off\"\n maxlength=\"254\"\n placeholder=\"{{ 'e.g. joe.doe`LOCALIZE`' | translate }}\"\n [disabled]=\"userIsExternal\"\n c8yDefaultValidation=\"loginAlias\"\n />\n </c8y-form-group>\n\n <c8y-form-group [hasWarning]=\"!user.email\">\n <label translate for=\"userEmail\">Email</label>\n <input\n id=\"userEmail\"\n class=\"form-control\"\n type=\"email\"\n name=\"email\"\n [maxlength]=\"254\"\n autocomplete=\"off\"\n placeholder=\"{{ 'e.g. joe.doe@example.com`LOCALIZE`' | translate }}\"\n [(ngModel)]=\"user.email\"\n email\n [required]=\"user.newsletter\"\n [disabled]=\"userIsExternal\"\n />\n <c8y-messages>\n <c8y-message *ngIf=\"!user.email\" translate\n >Note that email is required to reset password.</c8y-message\n >\n </c8y-messages>\n </c8y-form-group>\n\n <div class=\"row\" style=\"margin-left:-15px; margin-right:-15px\">\n <div class=\"col-sm-6\">\n <c8y-form-group>\n <label translate for=\"userFirstName\">First name</label>\n <input\n id=\"userFirstName\"\n class=\"form-control\"\n autocomplete=\"off\"\n maxlength=\"50\"\n name=\"firstName\"\n [(ngModel)]=\"user.firstName\"\n [disabled]=\"userIsExternal\"\n />\n </c8y-form-group>\n </div>\n <div class=\"col-sm-6\">\n <c8y-form-group>\n <label translate for=\"userLastName\">Last name</label>\n <input\n class=\"form-control\"\n autocomplete=\"off\"\n maxlength=\"50\"\n name=\"lastName\"\n [(ngModel)]=\"user.lastName\"\n [disabled]=\"userIsExternal\"\n />\n </c8y-form-group>\n </div>\n </div>\n\n <c8y-form-group>\n <label translate for=\"userTelephone\">Telephone</label>\n <input\n id=\"userTelephone\"\n class=\"form-control\"\n autocomplete=\"off\"\n name=\"phone\"\n maxlength=\"254\"\n [(ngModel)]=\"user.phone\"\n placeholder=\"{{ 'e.g. +49 9 876 543 210`LOCALIZE`' | translate }}\"\n c8yPhoneValidation\n c8yDefaultValidation=\"phoneNumber\"\n [required]=\"user.twoFactorAuthenticationEnabled\"\n [disabled]=\"userIsExternal\"\n />\n </c8y-form-group>\n\n <c8y-form-group>\n <label translate for=\"userLang\">Language</label>\n <div class=\"c8y-select-wrapper\">\n <select\n id=\"userLang\"\n class=\"form-control\"\n #selectLang\n name=\"lang\"\n [(ngModel)]=\"lang\"\n (change)=\"onLanguage.emit(selectLang.value)\"\n [disabled]=\"userIsExternal\"\n >\n <option *ngFor=\"let lang of langs\" [value]=\"lang\">{{\n translate.getNativeLanguage(lang)\n }}</option>\n </select>\n <span></span>\n </div>\n </c8y-form-group>\n\n <div class=\"form-group\" *ngIf=\"!userIsExternal\">\n <label class=\"control-label\">{{ 'Login options' | translate }}</label>\n <c8y-new-password (password)=\"onNewPasswordChanged($event)\"></c8y-new-password>\n <button\n title=\"{{ 'Set up two-factor authentication' | translate }}\"\n class=\"btn btn-default\"\n type=\"button\"\n (click)=\"setupTotp()\"\n translate\n *ngIf=\"userCanSetupTotp && !userHasActiveTotp\"\n >\n Set up two-factor authentication\n </button>\n </div>\n\n <c8y-form-group *ngIf=\"!!(state.state$ | async).newsletter\">\n <label translate>Newsletter</label>\n <label class=\"c8y-checkbox\">\n <input\n type=\"checkbox\"\n name=\"newsletter\"\n [(ngModel)]=\"user.newsletter\"\n [disabled]=\"userIsExternal\"\n />\n <span></span>\n {{ 'Send me information about outages, maintenance or updates.' | translate }}\n </label>\n </c8y-form-group>\n\n <div class=\"modal-footer\">\n <button\n title=\"{{ 'Cancel' | translate }}\"\n class=\"btn btn-default\"\n type=\"button\"\n (click)=\"cancel()\"\n translate\n >\n Cancel\n </button>\n <button\n title=\"{{ 'Save' | translate }}\"\n class=\"btn btn-primary\"\n type=\"submit\"\n [disabled]=\"!userForm.form.valid || userForm.form.pristine || loading || userIsExternal\"\n translate\n >\n Save\n </button>\n </div>\n</form>\n"
7766
+ template: "<form #userForm=\"ngForm\" (ngSubmit)=\"userForm.form.valid && save()\">\n <div class=\"alert alert-warning\" role=\"alert\" *ngIf=\"userIsExternal\" translate>\n You cannot edit the user since it is managed via your authorization server.\n </div>\n <c8y-form-group>\n <label translate for=\"userName\">Username (e.g. email)</label>\n <input\n id=\"userName\"\n class=\"form-control\"\n [(ngModel)]=\"user.userName\"\n name=\"userName\"\n autocomplete=\"off\"\n required\n maxlength=\"254\"\n placeholder=\"{{ 'e.g. joe.doe@example.com`LOCALIZE`' | translate }}\"\n [disabled]=\"user.id\"\n c8yDefaultValidation=\"user\"\n />\n </c8y-form-group>\n\n <c8y-form-group>\n <label translate for=\"displayName\">Login alias</label>\n <input\n id=\"displayName\"\n class=\"form-control\"\n [(ngModel)]=\"user.displayName\"\n name=\"displayName\"\n autocomplete=\"off\"\n maxlength=\"254\"\n placeholder=\"{{ 'e.g. joe.doe`LOCALIZE`' | translate }}\"\n [disabled]=\"userIsExternal\"\n c8yDefaultValidation=\"loginAlias\"\n />\n </c8y-form-group>\n\n <c8y-form-group [hasWarning]=\"!user.email\">\n <label translate for=\"userEmail\">Email</label>\n <input\n id=\"userEmail\"\n class=\"form-control\"\n type=\"email\"\n name=\"email\"\n [maxlength]=\"254\"\n autocomplete=\"off\"\n placeholder=\"{{ 'e.g. joe.doe@example.com`LOCALIZE`' | translate }}\"\n [(ngModel)]=\"user.email\"\n email\n [required]=\"user.newsletter\"\n [disabled]=\"userIsExternal\"\n />\n <c8y-messages>\n <c8y-message *ngIf=\"!user.email\" translate\n >Note that email is required to reset password.</c8y-message\n >\n </c8y-messages>\n </c8y-form-group>\n\n <div class=\"row\" style=\"margin-left:-15px; margin-right:-15px\">\n <div class=\"col-sm-6\">\n <c8y-form-group>\n <label translate for=\"userFirstName\">First name</label>\n <input\n id=\"userFirstName\"\n class=\"form-control\"\n autocomplete=\"off\"\n maxlength=\"50\"\n name=\"firstName\"\n [(ngModel)]=\"user.firstName\"\n [disabled]=\"userIsExternal\"\n />\n </c8y-form-group>\n </div>\n <div class=\"col-sm-6\">\n <c8y-form-group>\n <label translate for=\"userLastName\">Last name</label>\n <input\n class=\"form-control\"\n autocomplete=\"off\"\n maxlength=\"50\"\n name=\"lastName\"\n [(ngModel)]=\"user.lastName\"\n [disabled]=\"userIsExternal\"\n />\n </c8y-form-group>\n </div>\n </div>\n\n <c8y-form-group>\n <label translate for=\"userTelephone\">Telephone</label>\n <input\n id=\"userTelephone\"\n class=\"form-control\"\n autocomplete=\"off\"\n name=\"phone\"\n maxlength=\"254\"\n [(ngModel)]=\"user.phone\"\n placeholder=\"{{ 'e.g. +49 9 876 543 210`LOCALIZE`' | translate }}\"\n c8yPhoneValidation\n c8yDefaultValidation=\"phoneNumber\"\n [required]=\"user.twoFactorAuthenticationEnabled\"\n [disabled]=\"userIsExternal\"\n />\n </c8y-form-group>\n\n <c8y-form-group>\n <label translate for=\"userLang\">Language</label>\n <div class=\"c8y-select-wrapper\">\n <select\n id=\"userLang\"\n class=\"form-control\"\n #selectLang\n name=\"lang\"\n [(ngModel)]=\"lang\"\n (change)=\"onLanguage.emit(selectLang.value)\"\n [disabled]=\"userIsExternal\"\n >\n <option *ngFor=\"let lang of langs\" [value]=\"lang\">{{\n translate.getNativeLanguage(lang)\n }}</option>\n </select>\n <span></span>\n </div>\n </c8y-form-group>\n\n <div class=\"form-group\" *ngIf=\"!userIsExternal\">\n <label class=\"control-label\">{{ 'Login options' | translate }}</label>\n <c8y-new-password (password)=\"onNewPasswordChanged($event)\"></c8y-new-password>\n <button\n title=\"{{ 'Set up two-factor authentication' | translate }}\"\n class=\"btn btn-default\"\n type=\"button\"\n (click)=\"setupTotp()\"\n translate\n *ngIf=\"userCanSetupTotp && !userHasActiveTotp && isTfaEnabled\"\n >\n Set up two-factor authentication\n </button>\n </div>\n\n <c8y-form-group *ngIf=\"!!(state.state$ | async).newsletter\">\n <label translate>Newsletter</label>\n <label class=\"c8y-checkbox\">\n <input\n type=\"checkbox\"\n name=\"newsletter\"\n [(ngModel)]=\"user.newsletter\"\n [disabled]=\"userIsExternal\"\n />\n <span></span>\n {{ 'Send me information about outages, maintenance or updates.' | translate }}\n </label>\n </c8y-form-group>\n\n <div class=\"modal-footer\">\n <button\n title=\"{{ 'Cancel' | translate }}\"\n class=\"btn btn-default\"\n type=\"button\"\n (click)=\"cancel()\"\n translate\n >\n Cancel\n </button>\n <button\n title=\"{{ 'Save' | translate }}\"\n class=\"btn btn-primary\"\n type=\"submit\"\n [disabled]=\"!userForm.form.valid || userForm.form.pristine || loading || userIsExternal\"\n translate\n >\n Save\n </button>\n </div>\n</form>\n"
7619
7767
  })
7620
7768
  ], UserEditComponent);
7621
7769
  return UserEditComponent;
@@ -8037,15 +8185,16 @@ var PasswordStrengthComponent = /** @class */ (function () {
8037
8185
  }());
8038
8186
 
8039
8187
  var NewPasswordComponent = /** @class */ (function () {
8040
- function NewPasswordComponent(systemOptions) {
8041
- this.systemOptions = systemOptions;
8188
+ function NewPasswordComponent(loginService) {
8189
+ this.loginService = loginService;
8042
8190
  this.password = new EventEmitter();
8043
8191
  this.model = {};
8044
- this.enforcePasswordStrength = false;
8045
8192
  this.changePassword = false;
8193
+ this.passwordEnforced = false;
8046
8194
  }
8047
8195
  NewPasswordComponent.prototype.ngOnInit = function () {
8048
- this.loadEnforcePasswordStrength();
8196
+ this.loadPasswordStrengthSettings();
8197
+ this.minlength = this.loginService.getGreenMinLength();
8049
8198
  };
8050
8199
  NewPasswordComponent.prototype.newPasswordChanged = function () {
8051
8200
  this.password.emit({
@@ -8053,29 +8202,24 @@ var NewPasswordComponent = /** @class */ (function () {
8053
8202
  passwordStrength: this.model.strength
8054
8203
  });
8055
8204
  };
8056
- NewPasswordComponent.prototype.loadEnforcePasswordStrength = function () {
8205
+ NewPasswordComponent.prototype.loadPasswordStrengthSettings = function () {
8057
8206
  return __awaiter(this, void 0, void 0, function () {
8058
- var data, e_1;
8059
- return __generator(this, function (_a) {
8060
- switch (_a.label) {
8207
+ var _a;
8208
+ return __generator(this, function (_b) {
8209
+ switch (_b.label) {
8061
8210
  case 0:
8062
- _a.trys.push([0, 2, , 3]);
8063
- return [4 /*yield*/, this.systemOptions.detail({
8064
- category: 'password',
8065
- key: 'enforce.strength'
8066
- })];
8211
+ _a = this;
8212
+ return [4 /*yield*/, this.loginService.getEnforcePasswordStrength()];
8067
8213
  case 1:
8068
- data = (_a.sent()).data;
8069
- this.enforcePasswordStrength = data.value === 'true';
8070
- return [3 /*break*/, 3];
8071
- case 2:
8072
- e_1 = _a.sent();
8073
- return [3 /*break*/, 3];
8074
- case 3: return [2 /*return*/];
8214
+ _a.passwordEnforced = _b.sent();
8215
+ return [2 /*return*/];
8075
8216
  }
8076
8217
  });
8077
8218
  });
8078
8219
  };
8220
+ NewPasswordComponent.prototype.showPasswordStrength = function () {
8221
+ return this.model.newPassword && this.model.newPassword.length >= this.minlength;
8222
+ };
8079
8223
  NewPasswordComponent.prototype.toggleChangePassword = function () {
8080
8224
  this.changePassword = !this.changePassword;
8081
8225
  if (!this.changePassword) {
@@ -8084,7 +8228,7 @@ var NewPasswordComponent = /** @class */ (function () {
8084
8228
  }
8085
8229
  };
8086
8230
  NewPasswordComponent.ctorParameters = function () { return [
8087
- { type: SystemOptionsService$1 }
8231
+ { type: LoginService }
8088
8232
  ]; };
8089
8233
  __decorate([
8090
8234
  Output()
@@ -8092,7 +8236,7 @@ var NewPasswordComponent = /** @class */ (function () {
8092
8236
  NewPasswordComponent = __decorate([
8093
8237
  Component({
8094
8238
  selector: 'c8y-new-password',
8095
- template: "<div class=\"form-group\">\n <button type=\"button\" class=\"btn btn-default\" (click)=\"toggleChangePassword()\">\n <ng-container *ngIf=\"!changePassword\">\n {{ 'Change password' | translate }}\n </ng-container>\n <ng-container *ngIf=\"changePassword\">\n {{ 'Cancel password change' | translate }}\n </ng-container>\n </button>\n</div>\n\n<div *ngIf=\"changePassword\">\n <c8y-form-group>\n <label for=\"newPassword\" translate>Password</label>\n <input\n id=\"newPassword\"\n [(ngModel)]=\"model.newPassword\"\n #newPassword=\"ngModel\"\n (change)=\"newPasswordChanged()\"\n type=\"password\"\n name=\"newPassword\"\n class=\"form-control\"\n placeholder=\"{{ 'e.g. my_new_password' | translate }}\"\n required\n c8yDefaultValidation=\"password\"\n autocomplete=\"new-password\"\n />\n </c8y-form-group>\n\n <c8y-form-group>\n <label for=\"newConfirmPassword\" translate>Confirm password</label>\n <input\n id=\"newConfirmPassword\"\n [(ngModel)]=\"model.newPasswordConfirm\"\n #newPasswordConfirm=\"ngModel\"\n type=\"password\"\n name=\"newPasswordConfirm\"\n class=\"form-control\"\n placeholder=\"{{ 'e.g. my_new_password' | translate }}\"\n required\n passwordConfirm=\"newPassword\"\n autocomplete=\"new-password\"\n />\n </c8y-form-group>\n\n <c8y-password-strength\n [password]=\"model.newPassword\"\n [hidden]=\"!model.newPassword\"\n (strength)=\"model.strength = $event\"\n ></c8y-password-strength>\n\n <c8y-password-check-list\n [password]=\"model.newPassword\"\n [hidden]=\"!enforcePasswordStrength\"\n ></c8y-password-check-list>\n</div>\n",
8239
+ template: "<div class=\"form-group\">\n <button type=\"button\" class=\"btn btn-default\" (click)=\"toggleChangePassword()\">\n <ng-container *ngIf=\"!changePassword\">\n {{ 'Change password' | translate }}\n </ng-container>\n <ng-container *ngIf=\"changePassword\">\n {{ 'Cancel password change' | translate }}\n </ng-container>\n </button>\n</div>\n\n<div *ngIf=\"changePassword\">\n <c8y-form-group>\n <label for=\"newPassword\" translate>Password</label>\n <input\n id=\"newPassword\"\n [(ngModel)]=\"model.newPassword\"\n #newPassword=\"ngModel\"\n (change)=\"newPasswordChanged()\"\n type=\"password\"\n name=\"newPassword\"\n class=\"form-control\"\n placeholder=\"{{ 'e.g. my_new_password' | translate }}\"\n required\n c8yDefaultValidation=\"password\"\n autocomplete=\"new-password\"\n />\n </c8y-form-group>\n\n <c8y-form-group>\n <label for=\"newConfirmPassword\" translate>Confirm password</label>\n <input\n id=\"newConfirmPassword\"\n [(ngModel)]=\"model.newPasswordConfirm\"\n #newPasswordConfirm=\"ngModel\"\n type=\"password\"\n name=\"newPasswordConfirm\"\n class=\"form-control\"\n placeholder=\"{{ 'e.g. my_new_password' | translate }}\"\n required\n passwordConfirm=\"newPassword\"\n autocomplete=\"new-password\"\n />\n </c8y-form-group>\n\n <c8y-password-strength\n [password]=\"model.newPassword\"\n [hidden]=\"!showPasswordStrength()\"\n (strength)=\"model.strength = $event\"\n ></c8y-password-strength>\n\n <c8y-password-check-list\n [password]=\"model.newPassword\"\n [hidden]=\"!passwordEnforced\"\n ></c8y-password-check-list>\n</div>\n",
8096
8240
  viewProviders: [{ provide: ControlContainer, useExisting: NgForm }]
8097
8241
  })
8098
8242
  ], NewPasswordComponent);
@@ -8154,6 +8298,7 @@ var ValidationPattern = /** @class */ (function () {
8154
8298
  opcuaBrowsePath: gettext('Invalid OPC UA URI.'),
8155
8299
  password: gettext('Password must have at least 8 characters and no more than 32 and can only contain letters, numbers and following symbols: `~!@#$%^&*()_|+-=?;:\'",.<>{}[]\\/'),
8156
8300
  passwordConfirm: gettext('Passwords do not match.'),
8301
+ passwordStrength: gettext('Password not good enough, password must be stronger (green).'),
8157
8302
  phoneNumber: gettext('Invalid phone number format. Only digits, spaces, slashes ("/") and dashes ("-") allowed.'),
8158
8303
  required: gettext('This field is required.'),
8159
8304
  tenantId: gettext('May contain lowercase letters, digits, hyphens and underscores. ' +
@@ -10243,9 +10388,9 @@ var ChangePasswordComponent = /** @class */ (function () {
10243
10388
  tenantId: '',
10244
10389
  email: '',
10245
10390
  newPassword: '',
10246
- newPasswordConfirm: ''
10391
+ newPasswordConfirm: '',
10392
+ passwordStrengthEnforced: false
10247
10393
  };
10248
- this.enforcePasswordStrength = false;
10249
10394
  this.emailReadOnly = false;
10250
10395
  this.TOKEN_PARAM = 'token';
10251
10396
  this.EMAIL_PARAM = 'email';
@@ -10256,7 +10401,7 @@ var ChangePasswordComponent = /** @class */ (function () {
10256
10401
  this.model.tenantId = this.loginService.getTenant();
10257
10402
  this.model.email = this.options.get(this.EMAIL_PARAM, '');
10258
10403
  this.emailReadOnly = !!this.model.email;
10259
- this.enforcePasswordStrength = this.loginService.getEnforcePasswordStrength();
10404
+ this.model.passwordStrengthEnforced = this.loginService.getEnforcePasswordStrength();
10260
10405
  return [2 /*return*/];
10261
10406
  });
10262
10407
  });
@@ -10317,7 +10462,7 @@ var ChangePasswordComponent = /** @class */ (function () {
10317
10462
  ChangePasswordComponent = __decorate([
10318
10463
  Component({
10319
10464
  selector: 'c8y-change-password',
10320
- template: "<form\n role=\"form\"\n class=\"loginForm\"\n (ngSubmit)=\"changePassword()\"\n #changePasswordForm=\"ngForm\"\n novalidate\n>\n <c8y-form-group class=\"tenantField\" id=\"tenantField\" *ngIf=\"loginService.showTenant()\">\n <label translate>Tenant ID</label>\n <input\n [(ngModel)]=\"model.tenantId\"\n #tenantId=\"ngModel\"\n type=\"text\"\n name=\"tenantId\"\n autocapitalize=\"off\"\n autocorrect=\"off\"\n class=\"form-control\"\n placeholder=\"{{ 'Tenant ID' | translate }}\"\n required\n />\n </c8y-form-group>\n\n <c8y-form-group>\n <label translate>Email address</label>\n <input\n [(ngModel)]=\"model.email\"\n #email=\"ngModel\"\n type=\"text\"\n name=\"email\"\n autocapitalize=\"off\"\n autocorrect=\"off\"\n class=\"form-control\"\n placeholder=\"{{ 'Email address' | translate }}\"\n email\n required\n [readonly]=\"emailReadOnly\"\n />\n </c8y-form-group>\n\n <c8y-form-group>\n <label translate>New password</label>\n <input\n [(ngModel)]=\"model.newPassword\"\n #newPassword=\"ngModel\"\n type=\"password\"\n name=\"newPassword\"\n class=\"form-control\"\n placeholder=\"{{ 'New password' | translate }}\"\n [pattern]=\"passwordPattern\"\n autocomplete=\"new-password\"\n required\n />\n <c8y-messages>\n <c8y-message\n name=\"pattern\"\n [text]=\"loginService.ERROR_MESSAGES.pattern_newPassword\"\n ></c8y-message>\n </c8y-messages>\n </c8y-form-group>\n\n <c8y-form-group>\n <label translate>Confirm password</label>\n <input\n [(ngModel)]=\"model.newPasswordConfirm\"\n #newPasswordConfirm=\"ngModel\"\n type=\"password\"\n name=\"newPasswordConfirm\"\n class=\"form-control\"\n placeholder=\"{{ 'Confirm password' | translate }}\"\n passwordConfirm=\"newPassword\"\n autocomplete=\"new-password\"\n required\n />\n <c8y-messages>\n <c8y-message\n name=\"passwordConfirm\"\n [text]=\"loginService.ERROR_MESSAGES.passwordConfirm\"\n ></c8y-message>\n </c8y-messages>\n </c8y-form-group>\n\n <c8y-password-strength\n [password]=\"model.newPassword\"\n [hidden]=\"!model.newPassword\"\n ></c8y-password-strength>\n <c8y-password-check-list\n [password]=\"model.newPassword\"\n [hidden]=\"!model.newPassword || !enforcePasswordStrength\"\n ></c8y-password-check-list>\n\n <button\n title=\"{{ 'Set password' | translate }}\"\n [disabled]=\"!changePasswordForm.form.valid || isLoading\"\n type=\"submit\"\n class=\"btn btn-primary btn-lg btn-block form-group\"\n translate\n >\n Set password\n </button>\n</form>\n"
10465
+ template: "<form\n role=\"form\"\n class=\"loginForm\"\n (ngSubmit)=\"changePassword()\"\n #changePasswordForm=\"ngForm\"\n novalidate\n>\n\n <div\n class=\"legend form-block center\"\n translate\n >\n Change password\n </div>\n\n <c8y-form-group class=\"tenantField\" id=\"tenantField\" *ngIf=\"loginService.showTenant()\">\n <label translate>Tenant ID</label>\n <input\n [(ngModel)]=\"model.tenantId\"\n #tenantId=\"ngModel\"\n type=\"text\"\n name=\"tenantId\"\n autocapitalize=\"off\"\n autocorrect=\"off\"\n class=\"form-control\"\n placeholder=\"{{ 'Tenant ID' | translate }}\"\n required\n />\n </c8y-form-group>\n\n <c8y-form-group>\n <label translate>Email address</label>\n <input\n [(ngModel)]=\"model.email\"\n #email=\"ngModel\"\n type=\"text\"\n name=\"email\"\n autocapitalize=\"off\"\n autocorrect=\"off\"\n class=\"form-control\"\n placeholder=\"{{ 'Email address' | translate }}\"\n email\n required\n [readonly]=\"emailReadOnly\"\n />\n </c8y-form-group>\n\n <div class=\"row content-flex-50\">\n <div class=\"col-7\">\n <c8y-form-group>\n <label translate>New password</label>\n <input\n [(ngModel)]=\"model.newPassword\"\n #newPassword=\"ngModel\"\n type=\"password\"\n name=\"newPassword\"\n class=\"form-control\"\n placeholder=\"{{ 'New password' | translate }}\"\n [pattern]=\"passwordPattern\"\n autocomplete=\"new-password\"\n [passwordStrengthEnforced]=\"model.passwordStrengthEnforced\"\n required\n />\n <c8y-messages>\n <c8y-message\n name=\"pattern\"\n [text]=\"loginService.ERROR_MESSAGES.pattern_newPassword\"\n ></c8y-message>\n </c8y-messages>\n </c8y-form-group>\n\n <c8y-form-group>\n <label translate>Confirm password</label>\n <input\n [(ngModel)]=\"model.newPasswordConfirm\"\n #newPasswordConfirm=\"ngModel\"\n type=\"password\"\n name=\"newPasswordConfirm\"\n class=\"form-control\"\n placeholder=\"{{ 'Confirm password' | translate }}\"\n passwordConfirm=\"newPassword\"\n autocomplete=\"new-password\"\n required\n />\n <c8y-messages>\n <c8y-message\n name=\"passwordConfirm\"\n [text]=\"loginService.ERROR_MESSAGES.passwordConfirm\"\n ></c8y-message>\n </c8y-messages>\n </c8y-form-group>\n </div>\n <div class=\"col-5\">\n <c8y-password-strength\n [password]=\"model.newPassword\"\n [hidden]=\"!model.newPassword\"\n ></c8y-password-strength>\n <c8y-password-check-list\n class=\"m-t-32\"\n [password]=\"model.newPassword\"\n [hidden]=\"!model.newPassword || !model.passwordStrengthEnforced\"\n ></c8y-password-check-list>\n </div>\n </div>\n\n <button\n title=\"{{ 'Set password' | translate }}\"\n [disabled]=\"!changePasswordForm.form.valid || isLoading\"\n type=\"submit\"\n class=\"btn btn-primary btn-lg btn-block form-group\"\n translate\n >\n Set password\n </button>\n</form>\n"
10321
10466
  })
10322
10467
  ], ChangePasswordComponent);
10323
10468
  return ChangePasswordComponent;
@@ -10418,7 +10563,7 @@ var CredentialsComponent = /** @class */ (function () {
10418
10563
  };
10419
10564
  CredentialsComponent.prototype.handleNoPhoneNumberProvided = function () {
10420
10565
  this.onChangeView.emit({ view: LoginViews.ProvidePhoneNumber, credentials: this.model });
10421
- this.alert.warning(gettext('Two-factor authentication has been turned on for this account. Please provide your phone number above to save it in your user profile and start receiving verification codes via SMS.'));
10566
+ this.alert.warning(gettext('Two-factor authentication has been turned on for this account. Provide your phone number above to save it in your user profile and start receiving verification codes via SMS.'));
10422
10567
  };
10423
10568
  CredentialsComponent.ctorParameters = function () { return [
10424
10569
  { type: LoginService },
@@ -10703,6 +10848,61 @@ var TotpAuthComponent = /** @class */ (function () {
10703
10848
  return TotpAuthComponent;
10704
10849
  }());
10705
10850
 
10851
+ var StrengthValidatorService = /** @class */ (function () {
10852
+ function StrengthValidatorService(passwordService) {
10853
+ this.passwordService = passwordService;
10854
+ }
10855
+ StrengthValidatorService.prototype.isStrong = function (password) {
10856
+ return this.isPasswordGreen(this.passwordService.getStrengthColor(password).passwordStrength);
10857
+ };
10858
+ StrengthValidatorService.prototype.isPasswordGreen = function (strength) {
10859
+ return strength === PasswordStrength.GREEN;
10860
+ };
10861
+ StrengthValidatorService.ctorParameters = function () { return [
10862
+ { type: PasswordService }
10863
+ ]; };
10864
+ StrengthValidatorService.ngInjectableDef = ɵɵdefineInjectable({ factory: function StrengthValidatorService_Factory() { return new StrengthValidatorService(ɵɵinject(PasswordService)); }, token: StrengthValidatorService, providedIn: "root" });
10865
+ StrengthValidatorService = __decorate([
10866
+ Injectable({
10867
+ providedIn: 'root'
10868
+ })
10869
+ ], StrengthValidatorService);
10870
+ return StrengthValidatorService;
10871
+ }());
10872
+
10873
+ var PasswordStrengthValidatorDirective = /** @class */ (function () {
10874
+ function PasswordStrengthValidatorDirective(passwordService) {
10875
+ this.passwordService = passwordService;
10876
+ }
10877
+ PasswordStrengthValidatorDirective_1 = PasswordStrengthValidatorDirective;
10878
+ Object.defineProperty(PasswordStrengthValidatorDirective.prototype, "passwordStrengthEnforced", {
10879
+ set: function (value) {
10880
+ this.forced = value;
10881
+ },
10882
+ enumerable: true,
10883
+ configurable: true
10884
+ });
10885
+ PasswordStrengthValidatorDirective.prototype.validate = function (control) {
10886
+ var strengthFulfilled = this.passwordService.isStrong(control.value || '');
10887
+ var enforcementForcedAndNotFulfilled = this.forced && !strengthFulfilled;
10888
+ return enforcementForcedAndNotFulfilled ? { passwordStrength: true } : null;
10889
+ };
10890
+ var PasswordStrengthValidatorDirective_1;
10891
+ PasswordStrengthValidatorDirective.ctorParameters = function () { return [
10892
+ { type: StrengthValidatorService }
10893
+ ]; };
10894
+ __decorate([
10895
+ Input()
10896
+ ], PasswordStrengthValidatorDirective.prototype, "passwordStrengthEnforced", null);
10897
+ PasswordStrengthValidatorDirective = PasswordStrengthValidatorDirective_1 = __decorate([
10898
+ Directive({
10899
+ selector: '[passwordStrengthEnforced]',
10900
+ providers: [{ provide: NG_VALIDATORS, useExisting: PasswordStrengthValidatorDirective_1, multi: true }]
10901
+ })
10902
+ ], PasswordStrengthValidatorDirective);
10903
+ return PasswordStrengthValidatorDirective;
10904
+ }());
10905
+
10706
10906
  /**
10707
10907
  * The angular module definition for the login.
10708
10908
  * @exports LoginComponent
@@ -10728,7 +10928,8 @@ var LoginModule = /** @class */ (function () {
10728
10928
  RecoverPasswordComponent,
10729
10929
  ChangePasswordComponent,
10730
10930
  CredentialsComponent,
10731
- TotpAuthComponent
10931
+ TotpAuthComponent,
10932
+ PasswordStrengthValidatorDirective
10732
10933
  ],
10733
10934
  imports: [
10734
10935
  FormsModule$1,
@@ -14060,24 +14261,89 @@ var GuideHrefDirective = /** @class */ (function () {
14060
14261
  }());
14061
14262
 
14062
14263
  var GuideDocsComponent = /** @class */ (function () {
14063
- function GuideDocsComponent(docs) {
14264
+ function GuideDocsComponent(docs, el, renderer) {
14064
14265
  this.docs = docs;
14266
+ this.el = el;
14267
+ this.renderer = renderer;
14268
+ this.destroyed$ = new ReplaySubject(1);
14065
14269
  }
14066
14270
  GuideDocsComponent.prototype.ngOnInit = function () {
14067
14271
  this.baseUrl = this.docs.getBaseUrl();
14068
14272
  };
14273
+ /**
14274
+ * After content is initialized we subscribe for translation events, then we are able to modify
14275
+ * anchor just as C8yGuideHrefDirective does.
14276
+ */
14277
+ GuideDocsComponent.prototype.ngAfterContentInit = function () {
14278
+ var _this = this;
14279
+ if (this.translateDirective) {
14280
+ this.translateDirective.htmlUpdateEvent
14281
+ .pipe(takeUntil(this.destroyed$))
14282
+ .subscribe(function () {
14283
+ _this.replaceAnchorAttributes();
14284
+ });
14285
+ }
14286
+ else {
14287
+ this.replaceAnchorAttributes();
14288
+ }
14289
+ };
14290
+ /**
14291
+ * Find and modify anchor elements
14292
+ */
14293
+ GuideDocsComponent.prototype.replaceAnchorAttributes = function () {
14294
+ var _this = this;
14295
+ var anchors = this.findGuideAnchors(this.el.nativeElement);
14296
+ anchors.forEach(function (a) {
14297
+ var guideHref = _this.baseUrl + "/" + a.getAttribute('c8y-guide-href');
14298
+ _this.renderer.setAttribute(a, 'href', guideHref);
14299
+ if (!a.hasAttribute('target')) {
14300
+ _this.renderer.setAttribute(a, 'target', '_blank');
14301
+ }
14302
+ });
14303
+ };
14304
+ /**
14305
+ * Recursive function, returns array of Anchor elements inside HTMLElement.
14306
+ */
14307
+ GuideDocsComponent.prototype.findGuideAnchors = function (el) {
14308
+ var _this = this;
14309
+ var isAnchor = function () { return el.nodeName === 'A'; };
14310
+ var hasGuideHrefAttr = function () { return !!el.attributes.getNamedItem('c8y-guide-href'); };
14311
+ var hasChildren = function () { return el.childNodes && el.childNodes.length > 0; };
14312
+ var result = [];
14313
+ if (isAnchor() && hasGuideHrefAttr()) {
14314
+ result.push(el);
14315
+ }
14316
+ else if (hasChildren()) {
14317
+ el.childNodes.forEach(function (node) {
14318
+ var searchResult = _this.findGuideAnchors(node);
14319
+ if (searchResult) {
14320
+ result = __spread(result, searchResult);
14321
+ }
14322
+ });
14323
+ }
14324
+ return result;
14325
+ };
14069
14326
  GuideDocsComponent.prototype.ngAfterViewInit = function () {
14070
14327
  var _this = this;
14071
14328
  this.links.forEach(function (guide) {
14072
14329
  guide.baseHref = _this.baseUrl;
14073
14330
  });
14074
14331
  };
14332
+ GuideDocsComponent.prototype.ngOnDestroy = function () {
14333
+ this.destroyed$.next(true);
14334
+ this.destroyed$.complete();
14335
+ };
14075
14336
  GuideDocsComponent.ctorParameters = function () { return [
14076
- { type: DocsService }
14337
+ { type: DocsService },
14338
+ { type: ElementRef },
14339
+ { type: Renderer2 }
14077
14340
  ]; };
14078
14341
  __decorate([
14079
14342
  ContentChildren(GuideHrefDirective, { descendants: true })
14080
14343
  ], GuideDocsComponent.prototype, "links", void 0);
14344
+ __decorate([
14345
+ ContentChild(ForceHtmlTranslateDirective, { static: false })
14346
+ ], GuideDocsComponent.prototype, "translateDirective", void 0);
14081
14347
  GuideDocsComponent = __decorate([
14082
14348
  Component({
14083
14349
  selector: '[c8y-guide-docs]',
@@ -15075,7 +15341,7 @@ var WidgetsDashboardComponent = /** @class */ (function () {
15075
15341
  WidgetsDashboardComponent = __decorate([
15076
15342
  Component({
15077
15343
  selector: 'c8y-widgets-dashboard',
15078
- template: "<c8y-title *ngIf=\"!!settings.title\">\n {{ settings.title | translate }}\n</c8y-title>\n\n<c8y-action-bar-item [placement]=\"'right'\" *ngIf=\"onAddWidget.observers.length\">\n <button\n class=\"btn btn-link\"\n [disabled]=\"settings.isFrozen || settings.isDisabled\"\n (click)=\"onAddWidget.emit()\"\n >\n <i c8yIcon=\"plus-circle\"></i> {{ 'Add widget' | translate }}\n </button>\n</c8y-action-bar-item>\n\n<c8y-action-bar-item [placement]=\"'right'\" *ngIf=\"onEditDashboard.observers.length\">\n <button\n class=\"btn btn-link\"\n [disabled]=\"settings.isFrozen || settings.isDisabled\"\n (click)=\"onEditDashboard.emit()\"\n >\n <i c8yIcon=\"pencil\"></i> {{ 'Edit' | translate }}\n </button>\n</c8y-action-bar-item>\n\n<c8y-action-bar-item [placement]=\"'right'\" *ngIf=\"settings.allowFullscreen\">\n <button class=\"btn btn-link\" (click)=\"toggleFullscreen()\">\n <i [c8yIcon]=\"fullScreen() ? 'compress' : 'expand'\"></i> {{ 'Full screen' | translate }}\n </button>\n</c8y-action-bar-item>\n\n<c8y-action-bar-item\n [placement]=\"'right'\"\n itemClass=\"navbar-form\"\n *ngIf=\"onFreeze.observers.length\"\n>\n <button\n title=\"{{ 'Lock/unlock this dashboard' | translate }}\"\n class=\"btn btn-default\"\n [ngClass]=\"{ active: settings.isFrozen }\"\n (click)=\"onFreeze.emit(settings)\"\n [disabled]=\"settings.isDisabled\"\n uib-btn-checkbox\n >\n <i [c8yIcon]=\"settings.isFrozen ? 'lock' : 'unlock'\"></i>\n </button>\n</c8y-action-bar-item>\n\n<c8y-action-bar-item\n [placement]=\"'more'\"\n [priority]=\"-3000\"\n *ngIf=\"settings.canDelete && onDeleteDashboard.observers.length\"\n>\n <button (click)=\"onDeleteDashboard.emit()\" [disabled]=\"settings.isFrozen || settings.isDisabled\">\n <i c8yIcon=\"trash\"></i>&nbsp;<span translate>Delete dashboard</span>\n </button>\n</c8y-action-bar-item>\n\n<!-- empty state -->\n<div class=\"c8y-empty-state text-center\" *ngIf=\"!settings.isLoading && widgets.length === 0\">\n <h1 class=\"c8y-icon c8y-icon-device c8y-icon-duocolor\"></h1>\n <h3 translate>No widgets to display.</h3>\n <div *ngIf=\"!settings.isFrozen && onAddWidget.observers.length\">\n <p translate>Add widgets to this dashboard.</p>\n <div>\n <button\n [disabled]=\"settings.isFrozen || settings.isDisabled\"\n (click)=\"onAddWidget.emit()\"\n class=\"btn btn-primary\"\n translate\n >\n Add widget\n </button>\n </div>\n <p c8y-guide-docs>\n <small translate\n >Find out more in the\n <a c8y-guide-href=\"users-guide/cockpit/#dashboards\">User guide`KEEP_ORIGINAL`</a>.</small\n >\n </p>\n </div>\n</div>\n<!-- /.empty settings -->\n\n<div class=\"col-xs-12 text-center\" *ngIf=\"settings.isLoading\">\n <div class=\"spinner\" style=\"position: relative;\">\n <div class=\"rect1\"></div>\n <div class=\"rect2\"></div>\n <div class=\"rect3\"></div>\n <div class=\"rect4\"></div>\n <div class=\"rect5\"></div>\n </div>\n</div>\n\n<c8y-dashboard\n (dashboardChange)=\"onChangeDashboard.emit($event)\"\n #dashboard\n *ngIf=\"!settings.isLoading\"\n>\n <c8y-dashboard-child\n *ngFor=\"let widget of widgets\"\n [x]=\"widget._x\"\n [y]=\"widget._y\"\n [width]=\"widget._width || settings.defaultWidth\"\n [height]=\"widget._height || settings.defaultHeight\"\n [margin]=\"settings.widgetMargin\"\n [isFrozen]=\"settings.isFrozen || settings.isDisabled\"\n [class]=\"widget.classes\"\n [data]=\"widget\"\n [useIntersection]=\"true\"\n (changeStart)=\"onChangeStart.emit({ widget: widget, source: child, dashboard: dashboard })\"\n (changeEnd)=\"onChangeEnd.emit({ widget: widget, source: child, dashboard: dashboard })\"\n #child\n >\n <c8y-dashboard-child-title>\n <span *ngIf=\"settings.translateWidgetTitle\"> {{ widget.title | translate }}</span>\n <span *ngIf=\"!settings.translateWidgetTitle\">\n {{ widget.title }}\n </span>\n </c8y-dashboard-child-title>\n <c8y-dashboard-child-action *ngIf=\"onEditWidget.observers.length\">\n <button (click)=\"onEditWidget.emit({ widget: widget, source: child, dashboard: dashboard })\">\n <i c8yIcon=\"pencil\"></i>&nbsp;<span translate>Edit</span>\n </button>\n </c8y-dashboard-child-action>\n <c8y-dashboard-child-action *ngIf=\"onDeleteWidget.observers.length\">\n <button\n (click)=\"onDeleteWidget.emit({ widget: widget, source: child, dashboard: dashboard })\"\n >\n <i c8yIcon=\"trash\"></i>&nbsp;<span translate>Remove</span>\n </button>\n </c8y-dashboard-child-action>\n <c8y-dynamic-component\n [componentId]=\"widget.componentId || widget.name\"\n [config]=\"\n widget.templateUrl || widget.widgetComponent\n ? { child: widget, dashboard: contextDashboard, context: context }\n : widget.config\n \"\n *ngIf=\"child.intersected\"\n ></c8y-dynamic-component>\n </c8y-dashboard-child>\n</c8y-dashboard>\n",
15344
+ template: "<c8y-title *ngIf=\"!!settings.title\">\n {{ settings.title | translate }}\n</c8y-title>\n\n<c8y-action-bar-item [placement]=\"'right'\" *ngIf=\"onAddWidget.observers.length\">\n <button\n class=\"btn btn-link\"\n [disabled]=\"settings.isFrozen || settings.isDisabled\"\n (click)=\"onAddWidget.emit()\"\n >\n <i c8yIcon=\"plus-circle\"></i> {{ 'Add widget' | translate }}\n </button>\n</c8y-action-bar-item>\n\n<c8y-action-bar-item [placement]=\"'right'\" *ngIf=\"onEditDashboard.observers.length\">\n <button\n class=\"btn btn-link\"\n [disabled]=\"settings.isFrozen || settings.isDisabled\"\n (click)=\"onEditDashboard.emit()\"\n >\n <i c8yIcon=\"pencil\"></i> {{ 'Edit' | translate }}\n </button>\n</c8y-action-bar-item>\n\n<c8y-action-bar-item [placement]=\"'right'\" *ngIf=\"settings.allowFullscreen\">\n <button class=\"btn btn-link\" (click)=\"toggleFullscreen()\">\n <i [c8yIcon]=\"fullScreen() ? 'compress' : 'expand'\"></i> {{ 'Full screen' | translate }}\n </button>\n</c8y-action-bar-item>\n\n<c8y-action-bar-item\n [placement]=\"'right'\"\n itemClass=\"navbar-form\"\n *ngIf=\"onFreeze.observers.length\"\n>\n <button\n title=\"{{ 'Lock/unlock this dashboard' | translate }}\"\n class=\"btn btn-default\"\n [ngClass]=\"{ active: settings.isFrozen }\"\n (click)=\"onFreeze.emit(settings)\"\n [disabled]=\"settings.isDisabled\"\n uib-btn-checkbox\n >\n <i [c8yIcon]=\"settings.isFrozen ? 'lock' : 'unlock'\"></i>\n </button>\n</c8y-action-bar-item>\n\n<c8y-action-bar-item\n [placement]=\"'more'\"\n [priority]=\"-3000\"\n *ngIf=\"settings.canDelete && onDeleteDashboard.observers.length\"\n>\n <button (click)=\"onDeleteDashboard.emit()\" [disabled]=\"settings.isFrozen || settings.isDisabled\">\n <i c8yIcon=\"trash\"></i>&nbsp;<span translate>Delete dashboard</span>\n </button>\n</c8y-action-bar-item>\n\n<!-- empty state -->\n<div class=\"c8y-empty-state text-center\" *ngIf=\"!settings.isLoading && widgets.length === 0\">\n <h1 class=\"c8y-icon c8y-icon-device c8y-icon-duocolor\"></h1>\n <h3 translate>No widgets to display.</h3>\n <div *ngIf=\"!settings.isFrozen && onAddWidget.observers.length\">\n <p translate>Add widgets to this dashboard.</p>\n <div>\n <button\n [disabled]=\"settings.isFrozen || settings.isDisabled\"\n (click)=\"onAddWidget.emit()\"\n class=\"btn btn-primary\"\n translate\n >\n Add widget\n </button>\n </div>\n <p c8y-guide-docs>\n <small forceHtmlTranslate ngNonBindable\n >Find out more in the\n <a c8y-guide-href=\"users-guide/cockpit/#dashboards\">User guide`KEEP_ORIGINAL`</a>.</small\n >\n </p>\n </div>\n</div>\n<!-- /.empty settings -->\n\n<div class=\"col-xs-12 text-center\" *ngIf=\"settings.isLoading\">\n <div class=\"spinner\" style=\"position: relative;\">\n <div class=\"rect1\"></div>\n <div class=\"rect2\"></div>\n <div class=\"rect3\"></div>\n <div class=\"rect4\"></div>\n <div class=\"rect5\"></div>\n </div>\n</div>\n\n<c8y-dashboard\n (dashboardChange)=\"onChangeDashboard.emit($event)\"\n #dashboard\n *ngIf=\"!settings.isLoading\"\n>\n <c8y-dashboard-child\n *ngFor=\"let widget of widgets\"\n [x]=\"widget._x\"\n [y]=\"widget._y\"\n [width]=\"widget._width || settings.defaultWidth\"\n [height]=\"widget._height || settings.defaultHeight\"\n [margin]=\"settings.widgetMargin\"\n [isFrozen]=\"settings.isFrozen || settings.isDisabled\"\n [class]=\"widget.classes\"\n [data]=\"widget\"\n [useIntersection]=\"true\"\n (changeStart)=\"onChangeStart.emit({ widget: widget, source: child, dashboard: dashboard })\"\n (changeEnd)=\"onChangeEnd.emit({ widget: widget, source: child, dashboard: dashboard })\"\n #child\n >\n <c8y-dashboard-child-title>\n <span *ngIf=\"settings.translateWidgetTitle\"> {{ widget.title | translate }}</span>\n <span *ngIf=\"!settings.translateWidgetTitle\">\n {{ widget.title }}\n </span>\n </c8y-dashboard-child-title>\n <c8y-dashboard-child-action *ngIf=\"onEditWidget.observers.length\">\n <button (click)=\"onEditWidget.emit({ widget: widget, source: child, dashboard: dashboard })\">\n <i c8yIcon=\"pencil\"></i>&nbsp;<span translate>Edit</span>\n </button>\n </c8y-dashboard-child-action>\n <c8y-dashboard-child-action *ngIf=\"onDeleteWidget.observers.length\">\n <button\n (click)=\"onDeleteWidget.emit({ widget: widget, source: child, dashboard: dashboard })\"\n >\n <i c8yIcon=\"trash\"></i>&nbsp;<span translate>Remove</span>\n </button>\n </c8y-dashboard-child-action>\n <c8y-dynamic-component\n [componentId]=\"widget.componentId || widget.name\"\n [config]=\"\n widget.templateUrl || widget.widgetComponent\n ? { child: widget, dashboard: contextDashboard, context: context }\n : widget.config\n \"\n *ngIf=\"child.intersected\"\n ></c8y-dynamic-component>\n </c8y-dashboard-child>\n</c8y-dashboard>\n",
15079
15345
  host: {
15080
15346
  style: "\n display: block;\n ",
15081
15347
  class: 'dashboard c8y-grid-dashboard'
@@ -16050,5 +16316,5 @@ var CustomDeviceGridColumn = /** @class */ (function (_super) {
16050
16316
  * Generated bundle index. Do not edit.
16051
16317
  */
16052
16318
 
16053
- export { ActionBarService, ActionService, AlarmsDeviceGridColumn, AlertService, AppStateService, AuthenticationModule, BaseDeviceGridColumn, BootstrapComponent, BreadcrumbService, C8yStepper, C8yStepperButtons, CachedLocaleDictionaryService, CellRendererContext, CellRendererDefDirective, CommonModule, ConfirmModalComponent, ContextRouteComponent, CoreModule, CustomDeviceGridColumn, DashboardChildActionComponent, DashboardChildChange, DashboardChildComponent, DashboardChildTitleComponent, DashboardComponent, DashboardModule, DataGridComponent, DataGridModule, DefaultValidationDirective, DeviceGridComponent, DeviceGridModule, DeviceGridService, DeviceStatusComponent, DeviceStatusModule, DocsModule, DocsService, DropAreaComponent, DropAreaModule, DynamicComponentComponent, DynamicComponentModule, DynamicComponentService, EmptyComponent, FilteringActionType, FormGroupComponent, FormsModule, GroupDeviceGridColumn, GuideDocsComponent, GuideHrefDirective, HOOK_ACTION, HOOK_ACTION_BAR, HOOK_BREADCRUMB, HOOK_COMPONENT, HOOK_COMPONENTS, HOOK_DOCS, HOOK_NAVIGATOR_NODES, HOOK_ONCE_ROUTE, HOOK_OPTIONS, HOOK_PATTERN_MESSAGES, HOOK_SEARCH, HOOK_TABS, HeaderBarComponent, HeaderCellRendererDefDirective, HeaderModule, HeaderService, HighlightComponent, HumanizeAppNamePipe, HumanizePipe, ICON_LIST, ImeiDeviceGridColumn, InputGroupListComponent, JsonValidationPrettifierDirective, ListGroupComponent, ListGroupModule, LoginService, LoginViews, MaxValidationDirective, MessageDirective, MessagesComponent, MinValidationDirective, ModalModule, ModalService, ModelDeviceGridColumn, NameDeviceGridColumn, NavigatorIconComponent, NavigatorItemComponent, NavigatorNode, NavigatorNodeRoot, NavigatorService, NewPasswordComponent, OptionsService, PasswordCheckListComponent, PasswordConfirm, PasswordConfirmModalComponent, PasswordService, PasswordStrengthCheckerService, PasswordStrengthComponent, Permissions, PhoneValidationDirective, PopoverConfirmComponent, ProvidePhoneNumberComponent, PushStatusLabels, QuickLinkModule, RegistrationDateDeviceGridColumn, RouterModule, RouterService, SchemaFormComponent, SearchModule, SearchService, SelectComponent, SelectModule, SendStatusLabels, SerialNumberDeviceGridColumn, SmsChallengeComponent, StateService, Status, StatusDeviceGridColumn, StepperModule, SystemIdDeviceGridColumn, TabsService, TextAreaRowHeightDirective, TitleComponent, TotpChallengeComponent, TotpSetupComponent, TranslateService, TypeaheadComponent, UserMenuService, UserTotpRevokeComponent, ValidationPattern, ViewContext, WidgetsDashboardComponent, _, deviceAvailabilityIconMap, fromFactories, fromTrigger, getActivatedRoute, gettext, initializeServices, minColumnGridTrackSize, operationStatusClasses, operationStatusIcons, ratiosByColumnTypes, resolveInjectedFactories, routes, sortByPriority, stateToFactory, statusAlert, statusClasses, statusIcons, tooltips, ɵ0, ApplicationOptions as ɵa, translateLoaderFactory as ɵb, ActionOutletComponent as ɵba, ActionComponent as ɵbb, AlertModule as ɵbc, AlertOutletComponent as ɵbd, AlertComponent as ɵbe, AlertDetailsComponent as ɵbf, AlertTextComponent as ɵbg, BootstrapModule as ɵbh, CookieBannerComponent as ɵbi, TitleOutletComponent as ɵbj, AppIconComponent as ɵbk, AppSwitcherComponent as ɵbl, RightDrawerComponent as ɵbm, UserModule as ɵbn, UserMenuOutletComponent as ɵbo, UserEditComponent as ɵbp, UserEditModalComponent as ɵbq, UserMenuItemComponent as ɵbr, UserTotpSetupComponent as ɵbs, InputGroupListContainerDirective as ɵbt, RequiredInputPlaceholderDirective as ɵbu, IpRangeInputListComponent as ɵbv, FilterInputComponent as ɵbw, ModalComponent as ɵbx, SearchOutletComponent as ɵby, SearchComponent as ɵbz, localePathFactory as ɵc, BreadcrumbModule as ɵca, BreadcrumbComponent as ɵcb, BreadcrumbItemComponent as ɵcc, BreadcrumbOutletComponent as ɵcd, NavigatorModule as ɵce, NavigatorOutletComponent as ɵcf, NavigatorNodeComponent as ɵcg, LoginModule as ɵch, LoginComponent as ɵci, RecoverPasswordComponent as ɵcj, ChangePasswordComponent as ɵck, CredentialsComponent as ɵcl, TotpAuthComponent as ɵcm, TabsModule as ɵcn, TabsOutletComponent as ɵco, TabComponent as ɵcp, CellRendererComponent as ɵcq, FilteringFormRendererDefDirective as ɵcr, FilteringFormRendererComponent as ɵcs, ColumnDirective as ɵct, FilteringFormComponent as ɵcu, StatusCellRendererComponent as ɵcv, NameCellRendererComponent as ɵcw, ModelCellRendererComponent as ɵcx, SerialNumberCellRendererComponent as ɵcy, GroupCellRendererComponent as ɵcz, languagesFactory as ɵd, RegistrationDateCellRendererComponent as ɵda, AlarmsCellRendererComponent as ɵdb, ListItemComponent as ɵdc, ListItemFooterComponent as ɵdd, ListItemActionComponent as ɵde, ListItemCollapseComponent as ɵdf, ListItemIconComponent as ɵdg, ListItemBodyComponent as ɵdh, ListItemCheckboxComponent as ɵdi, ListItemRadioComponent as ɵdj, C8yStepperIcon as ɵdk, C8yStepperProgress as ɵdl, RouterTabsResolver as ɵdn, ContextRouteGuard as ɵdo, QuickLinkComponent as ɵdp, localeId as ɵe, I18nModule as ɵf, MESSAGES as ɵg, LOCALE_PATH as ɵh, LANGUAGES as ɵi, TranslateCustomLoader as ɵj, TranslateParserCustom as ɵk, MissingTranslationCustomHandler as ɵl, PatternMessagesService as ɵm, IconDirective as ɵn, ICONS as ɵo, OutletDirective as ɵp, ShortenUserNamePipe as ɵq, ForOfDirective as ɵr, LoadMoreComponent as ɵs, MapFunctionPipe as ɵt, ProgressBarComponent as ɵu, UserPreferencesService as ɵv, ActionBarModule as ɵw, ActionBarComponent as ɵx, ActionBarItemComponent as ɵy, ActionModule as ɵz };
16319
+ export { ActionBarService, ActionService, AlarmsDeviceGridColumn, AlertService, AppStateService, AuthenticationModule, BaseDeviceGridColumn, BootstrapComponent, BreadcrumbService, C8yStepper, C8yStepperButtons, CachedLocaleDictionaryService, CellRendererContext, CellRendererDefDirective, CommonModule, ConfirmModalComponent, ContextRouteComponent, CoreModule, CustomDeviceGridColumn, DashboardChildActionComponent, DashboardChildChange, DashboardChildComponent, DashboardChildTitleComponent, DashboardComponent, DashboardModule, DataGridComponent, DataGridModule, DefaultValidationDirective, DeviceGridComponent, DeviceGridModule, DeviceGridService, DeviceStatusComponent, DeviceStatusModule, DocsModule, DocsService, DropAreaComponent, DropAreaModule, DynamicComponentComponent, DynamicComponentModule, DynamicComponentService, EmptyComponent, FilteringActionType, FormGroupComponent, FormsModule, GroupDeviceGridColumn, GuideDocsComponent, GuideHrefDirective, HOOK_ACTION, HOOK_ACTION_BAR, HOOK_BREADCRUMB, HOOK_COMPONENT, HOOK_COMPONENTS, HOOK_DOCS, HOOK_NAVIGATOR_NODES, HOOK_ONCE_ROUTE, HOOK_OPTIONS, HOOK_PATTERN_MESSAGES, HOOK_SEARCH, HOOK_TABS, HeaderBarComponent, HeaderCellRendererDefDirective, HeaderModule, HeaderService, HighlightComponent, HumanizeAppNamePipe, HumanizePipe, ICON_LIST, ImeiDeviceGridColumn, InputGroupListComponent, JsonValidationPrettifierDirective, ListGroupComponent, ListGroupModule, LoginService, LoginViews, MaxValidationDirective, MessageDirective, MessagesComponent, MinValidationDirective, ModalModule, ModalService, ModelDeviceGridColumn, NameDeviceGridColumn, NavigatorIconComponent, NavigatorItemComponent, NavigatorNode, NavigatorNodeRoot, NavigatorService, NewPasswordComponent, OptionsService, PasswordCheckListComponent, PasswordConfirm, PasswordConfirmModalComponent, PasswordService, PasswordStrengthCheckerService, PasswordStrengthComponent, Permissions, PhoneValidationDirective, PopoverConfirmComponent, ProvidePhoneNumberComponent, PushStatusLabels, QuickLinkModule, RegistrationDateDeviceGridColumn, RouterModule, RouterService, SchemaFormComponent, SearchModule, SearchService, SelectComponent, SelectModule, SendStatusLabels, SerialNumberDeviceGridColumn, SmsChallengeComponent, StateService, Status, StatusDeviceGridColumn, StepperModule, SystemIdDeviceGridColumn, TabsService, TextAreaRowHeightDirective, TitleComponent, TotpChallengeComponent, TotpSetupComponent, TranslateService, TypeaheadComponent, UserMenuService, UserTotpRevokeComponent, ValidationPattern, ViewContext, WidgetsDashboardComponent, _, deviceAvailabilityIconMap, fromFactories, fromTrigger, getActivatedRoute, gettext, initializeServices, minColumnGridTrackSize, operationStatusClasses, operationStatusIcons, ratiosByColumnTypes, resolveInjectedFactories, routes, sortByPriority, stateToFactory, statusAlert, statusClasses, statusIcons, tooltips, ɵ0, ApplicationOptions as ɵa, translateLoaderFactory as ɵb, ActionModule as ɵba, ActionOutletComponent as ɵbb, ActionComponent as ɵbc, AlertModule as ɵbd, AlertOutletComponent as ɵbe, AlertComponent as ɵbf, AlertDetailsComponent as ɵbg, AlertTextComponent as ɵbh, BootstrapModule as ɵbi, CookieBannerComponent as ɵbj, TitleOutletComponent as ɵbk, AppIconComponent as ɵbl, AppSwitcherComponent as ɵbm, RightDrawerComponent as ɵbn, UserModule as ɵbo, UserMenuOutletComponent as ɵbp, UserEditComponent as ɵbq, UserEditModalComponent as ɵbr, UserMenuItemComponent as ɵbs, UserTotpSetupComponent as ɵbt, InputGroupListContainerDirective as ɵbu, RequiredInputPlaceholderDirective as ɵbv, IpRangeInputListComponent as ɵbw, FilterInputComponent as ɵbx, ModalComponent as ɵby, SearchOutletComponent as ɵbz, localePathFactory as ɵc, SearchComponent as ɵca, BreadcrumbModule as ɵcb, BreadcrumbComponent as ɵcc, BreadcrumbItemComponent as ɵcd, BreadcrumbOutletComponent as ɵce, NavigatorModule as ɵcf, NavigatorOutletComponent as ɵcg, NavigatorNodeComponent as ɵch, LoginModule as ɵci, LoginComponent as ɵcj, RecoverPasswordComponent as ɵck, ChangePasswordComponent as ɵcl, CredentialsComponent as ɵcm, TotpAuthComponent as ɵcn, PasswordStrengthValidatorDirective as ɵco, StrengthValidatorService as ɵcp, TabsModule as ɵcq, TabsOutletComponent as ɵcr, TabComponent as ɵcs, CellRendererComponent as ɵct, FilteringFormRendererDefDirective as ɵcu, FilteringFormRendererComponent as ɵcv, ColumnDirective as ɵcw, FilteringFormComponent as ɵcx, StatusCellRendererComponent as ɵcy, NameCellRendererComponent as ɵcz, languagesFactory as ɵd, ModelCellRendererComponent as ɵda, SerialNumberCellRendererComponent as ɵdb, GroupCellRendererComponent as ɵdc, RegistrationDateCellRendererComponent as ɵdd, AlarmsCellRendererComponent as ɵde, ListItemComponent as ɵdf, ListItemFooterComponent as ɵdg, ListItemActionComponent as ɵdh, ListItemCollapseComponent as ɵdi, ListItemIconComponent as ɵdj, ListItemBodyComponent as ɵdk, ListItemCheckboxComponent as ɵdl, ListItemRadioComponent as ɵdm, C8yStepperIcon as ɵdn, C8yStepperProgress as ɵdo, RouterTabsResolver as ɵdq, ContextRouteGuard as ɵdr, QuickLinkComponent as ɵds, localeId as ɵe, I18nModule as ɵf, ForceHtmlTranslateDirective as ɵg, MESSAGES as ɵh, LOCALE_PATH as ɵi, LANGUAGES as ɵj, TranslateCustomLoader as ɵk, TranslateParserCustom as ɵl, MissingTranslationCustomHandler as ɵm, PatternMessagesService as ɵn, IconDirective as ɵo, ICONS as ɵp, OutletDirective as ɵq, ShortenUserNamePipe as ɵr, ForOfDirective as ɵs, LoadMoreComponent as ɵt, MapFunctionPipe as ɵu, ProgressBarComponent as ɵv, UserPreferencesService as ɵw, ActionBarModule as ɵx, ActionBarComponent as ɵy, ActionBarItemComponent as ɵz };
16054
16320
  //# sourceMappingURL=c8y-ngx-components.js.map