@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
@@ -3553,7 +3553,7 @@
3553
3553
  }
3554
3554
  },
3555
3555
  '^Error updating tenant! Cannot insert second configuration for Password code grant internal/Bad Request$': {
3556
- gettext: gettext('This login mode was already set by other admin, please refresh page to update data')
3556
+ gettext: gettext('This login mode was already set by another administrator. Refresh the page to update the data.')
3557
3557
  },
3558
3558
  };
3559
3559
 
@@ -3651,6 +3651,106 @@
3651
3651
  return TranslateParserCustom;
3652
3652
  }(core$1.TranslateDefaultParser));
3653
3653
 
3654
+ /**
3655
+ * This is temporary fallback directive that is used to handle HTML blocks translation on maintenance versions
3656
+ * in version 10.9.4 and later, this is replaced by default translate directive.
3657
+ */
3658
+ var ForceHtmlTranslateDirective = /** @class */ (function () {
3659
+ function ForceHtmlTranslateDirective(translateService, element, _ref) {
3660
+ var _this = this;
3661
+ this.translateService = translateService;
3662
+ this.element = element;
3663
+ this._ref = _ref;
3664
+ /**
3665
+ * Used to trigger events when html is replaced by directive.
3666
+ */
3667
+ this.htmlUpdateEvent = new core.EventEmitter();
3668
+ // subscribe to onTranslationChange event, in case the translations of the current lang change
3669
+ if (!this.onTranslationChangeSub) {
3670
+ this.onTranslationChangeSub = this.translateService.onTranslationChange.subscribe(function (event) {
3671
+ if (event.lang === _this.translateService.currentLang) {
3672
+ _this.checkNodes();
3673
+ }
3674
+ });
3675
+ }
3676
+ // subscribe to onLangChange event, in case the language changes
3677
+ if (!this.onLangChangeSub) {
3678
+ this.onLangChangeSub = this.translateService.onLangChange.subscribe(function (event) {
3679
+ _this.checkNodes();
3680
+ });
3681
+ }
3682
+ // subscribe to onDefaultLangChange event, in case the default language changes
3683
+ if (!this.onDefaultLangChangeSub) {
3684
+ this.onDefaultLangChangeSub = this.translateService.onDefaultLangChange.subscribe(function (event) {
3685
+ _this.checkNodes();
3686
+ });
3687
+ }
3688
+ }
3689
+ Object.defineProperty(ForceHtmlTranslateDirective.prototype, "translateParams", {
3690
+ set: function (params) {
3691
+ if (!lodashEs.isEqual(this.currentParams, params)) {
3692
+ this.currentParams = params;
3693
+ this.checkNodes();
3694
+ }
3695
+ },
3696
+ enumerable: true,
3697
+ configurable: true
3698
+ });
3699
+ ForceHtmlTranslateDirective.prototype.ngAfterViewChecked = function () {
3700
+ this.checkNodes();
3701
+ };
3702
+ ForceHtmlTranslateDirective.prototype.checkNodes = function () {
3703
+ if (this.isLookupKeyMissing()) {
3704
+ this.element.nativeElement.lookupKey = this.getLookupKey();
3705
+ }
3706
+ this.translateAndUpdateHtmlContent();
3707
+ this.htmlUpdateEvent.emit();
3708
+ };
3709
+ ForceHtmlTranslateDirective.prototype.ngOnDestroy = function () {
3710
+ if (this.onLangChangeSub) {
3711
+ this.onLangChangeSub.unsubscribe();
3712
+ }
3713
+ if (this.onDefaultLangChangeSub) {
3714
+ this.onDefaultLangChangeSub.unsubscribe();
3715
+ }
3716
+ if (this.onTranslationChangeSub) {
3717
+ this.onTranslationChangeSub.unsubscribe();
3718
+ }
3719
+ this.htmlUpdateEvent.complete();
3720
+ };
3721
+ /**
3722
+ * Builds lookup key from innerHTML, removes comments (that might be added by Angular) and trims it.
3723
+ */
3724
+ ForceHtmlTranslateDirective.prototype.getLookupKey = function () {
3725
+ return this.element.nativeElement.innerHTML.replace(/<!--.*?-->/gs, '').trim();
3726
+ };
3727
+ ForceHtmlTranslateDirective.prototype.isLookupKeyMissing = function () {
3728
+ return !this.element.nativeElement.lookupKey;
3729
+ };
3730
+ ForceHtmlTranslateDirective.prototype.lookupKeyExist = function () {
3731
+ return this.element.nativeElement.lookupKey;
3732
+ };
3733
+ ForceHtmlTranslateDirective.prototype.translateAndUpdateHtmlContent = function () {
3734
+ if (this.lookupKeyExist()) {
3735
+ this.element.nativeElement.innerHTML = this.translateService.instant(this.element.nativeElement.lookupKey, this.currentParams || {});
3736
+ }
3737
+ };
3738
+ ForceHtmlTranslateDirective.ctorParameters = function () { return [
3739
+ { type: core$1.TranslateService },
3740
+ { type: core.ElementRef },
3741
+ { type: core.ChangeDetectorRef }
3742
+ ]; };
3743
+ __decorate([
3744
+ core.Input()
3745
+ ], ForceHtmlTranslateDirective.prototype, "translateParams", null);
3746
+ ForceHtmlTranslateDirective = __decorate([
3747
+ core.Directive({
3748
+ selector: '[forceHtmlTranslate]'
3749
+ })
3750
+ ], ForceHtmlTranslateDirective);
3751
+ return ForceHtmlTranslateDirective;
3752
+ }());
3753
+
3654
3754
  // Load these as a side effect
3655
3755
  try {
3656
3756
  // tslint:disable:no-var-requires
@@ -3727,8 +3827,9 @@
3727
3827
  var I18nModule_1;
3728
3828
  I18nModule = I18nModule_1 = __decorate([
3729
3829
  core.NgModule({
3730
- exports: [core$1.TranslateModule],
3731
- imports: [http.HttpClientModule]
3830
+ exports: [core$1.TranslateModule, ForceHtmlTranslateDirective],
3831
+ imports: [http.HttpClientModule],
3832
+ declarations: [ForceHtmlTranslateDirective]
3732
3833
  })
3733
3834
  ], I18nModule);
3734
3835
  return I18nModule;
@@ -6938,6 +7039,7 @@
6938
7039
  };
6939
7040
  this.passwordStrengthSetting = {
6940
7041
  enforcePasswordStrength: false,
7042
+ passwordStrengthValidity: false,
6941
7043
  greenMinLength: this.GREEN_MIN_LENGTH_DEFAULT
6942
7044
  };
6943
7045
  this.localhostRegExp = new RegExp('localhost');
@@ -7032,14 +7134,50 @@
7032
7134
  return this.passwordStrengthSetting.greenMinLength;
7033
7135
  };
7034
7136
  /**
7035
- * Checks if password strength is enforced.
7036
- * @return true if enforced.
7137
+ * Checks if password strength is enforced for system
7138
+ * by retrieving value of `enforceStrength` property from loginOptions response
7139
+ * @return boolean value, true if enforced, false otherwise.
7037
7140
  */
7038
7141
  LoginService.prototype.getEnforcePasswordStrength = function () {
7039
7142
  var loginOption = this.getLoginOption();
7040
- this.passwordStrengthSetting.enforcePasswordStrength = lodashEs.get(loginOption, 'enforceStrength', 'false') === 'true' ? true : false;
7143
+ var enforcePasswordStrength = lodashEs.get(loginOption, 'enforceStrength');
7144
+ if (lodashEs.isString(enforcePasswordStrength)) {
7145
+ this.passwordStrengthSetting.enforcePasswordStrength = enforcePasswordStrength === 'true' ? true : false;
7146
+ }
7147
+ else {
7148
+ this.passwordStrengthSetting.enforcePasswordStrength = !!enforcePasswordStrength;
7149
+ }
7041
7150
  return this.passwordStrengthSetting.enforcePasswordStrength;
7042
7151
  };
7152
+ /**
7153
+ * Checks if password strength is enforced for particular tenant
7154
+ * by retrieving value of `strengthValidity` property from loginOptions response
7155
+ * @return boolean value, true if enforced, false otherwise.
7156
+ */
7157
+ LoginService.prototype.getPasswordStrengthValidity = function () {
7158
+ return __awaiter(this, void 0, void 0, function () {
7159
+ var loginOption, strengthValidity;
7160
+ return __generator(this, function (_a) {
7161
+ loginOption = this.getLoginOption();
7162
+ strengthValidity = lodashEs.get(loginOption, 'strengthValidity');
7163
+ if (lodashEs.isString(strengthValidity)) {
7164
+ this.passwordStrengthSetting.passwordStrengthValidity = strengthValidity === 'true' ? true : false;
7165
+ }
7166
+ else {
7167
+ this.passwordStrengthSetting.passwordStrengthValidity = !!strengthValidity;
7168
+ }
7169
+ return [2 /*return*/, this.passwordStrengthSetting.passwordStrengthValidity];
7170
+ });
7171
+ });
7172
+ };
7173
+ /**
7174
+ * Function determines if enforced strength checks should be enabled for current tenant
7175
+ * based on properties retrieved from loginOptions
7176
+ * @return boolean value, true if strength is enforced for tenant, false otherwise.
7177
+ */
7178
+ LoginService.prototype.getPasswordStrengthEnforced = function () {
7179
+ return this.getEnforcePasswordStrength() || this.getPasswordStrengthValidity();
7180
+ };
7043
7181
  /**
7044
7182
  * Clears all backend errors.
7045
7183
  */
@@ -7651,7 +7789,7 @@
7651
7789
  }());
7652
7790
 
7653
7791
  var UserEditComponent = /** @class */ (function () {
7654
- function UserEditComponent(state, translate, passwordService, modalConfirmService, bsModalService, alert, userService, tenantLoginOptionsService) {
7792
+ function UserEditComponent(state, translate, passwordService, modalConfirmService, bsModalService, alert, userService, tenantLoginOptionsService, tenantService) {
7655
7793
  this.state = state;
7656
7794
  this.translate = translate;
7657
7795
  this.passwordService = passwordService;
@@ -7660,6 +7798,7 @@
7660
7798
  this.alert = alert;
7661
7799
  this.userService = userService;
7662
7800
  this.tenantLoginOptionsService = tenantLoginOptionsService;
7801
+ this.tenantService = tenantService;
7663
7802
  this.loading = false;
7664
7803
  this.onUser = new core.EventEmitter();
7665
7804
  this.onLanguage = new core.EventEmitter();
@@ -7678,11 +7817,19 @@
7678
7817
  });
7679
7818
  UserEditComponent.prototype.ngOnInit = function () {
7680
7819
  return __awaiter(this, void 0, void 0, function () {
7681
- return __generator(this, function (_a) {
7682
- switch (_a.label) {
7683
- case 0: return [4 /*yield*/, this.initializeTotpSettings()];
7820
+ var currentTenant, _a, enabledOnSystemLevel, enabledOnTenantLevel;
7821
+ return __generator(this, function (_b) {
7822
+ switch (_b.label) {
7823
+ case 0: return [4 /*yield*/, this.tenantService.current()];
7684
7824
  case 1:
7685
- _a.sent();
7825
+ currentTenant = (_b.sent()).data;
7826
+ return [4 /*yield*/, this.tenantService.getTfaSettings(currentTenant)];
7827
+ case 2:
7828
+ _a = _b.sent(), enabledOnSystemLevel = _a.enabledOnSystemLevel, enabledOnTenantLevel = _a.enabledOnTenantLevel;
7829
+ this.isTfaEnabled = enabledOnSystemLevel || enabledOnTenantLevel;
7830
+ return [4 /*yield*/, this.initializeTotpSettings()];
7831
+ case 3:
7832
+ _b.sent();
7686
7833
  return [2 /*return*/];
7687
7834
  }
7688
7835
  });
@@ -7769,7 +7916,8 @@
7769
7916
  { type: modal.BsModalService },
7770
7917
  { type: AlertService },
7771
7918
  { type: client.UserService },
7772
- { type: client.TenantLoginOptionsService }
7919
+ { type: client.TenantLoginOptionsService },
7920
+ { type: client.TenantService }
7773
7921
  ]; };
7774
7922
  __decorate([
7775
7923
  core.Input()
@@ -7792,7 +7940,7 @@
7792
7940
  UserEditComponent = __decorate([
7793
7941
  core.Component({
7794
7942
  selector: 'c8y-user-edit',
7795
- 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"
7943
+ 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"
7796
7944
  })
7797
7945
  ], UserEditComponent);
7798
7946
  return UserEditComponent;
@@ -8214,15 +8362,16 @@
8214
8362
  }());
8215
8363
 
8216
8364
  var NewPasswordComponent = /** @class */ (function () {
8217
- function NewPasswordComponent(systemOptions) {
8218
- this.systemOptions = systemOptions;
8365
+ function NewPasswordComponent(loginService) {
8366
+ this.loginService = loginService;
8219
8367
  this.password = new core.EventEmitter();
8220
8368
  this.model = {};
8221
- this.enforcePasswordStrength = false;
8222
8369
  this.changePassword = false;
8370
+ this.passwordEnforced = false;
8223
8371
  }
8224
8372
  NewPasswordComponent.prototype.ngOnInit = function () {
8225
- this.loadEnforcePasswordStrength();
8373
+ this.loadPasswordStrengthSettings();
8374
+ this.minlength = this.loginService.getGreenMinLength();
8226
8375
  };
8227
8376
  NewPasswordComponent.prototype.newPasswordChanged = function () {
8228
8377
  this.password.emit({
@@ -8230,29 +8379,24 @@
8230
8379
  passwordStrength: this.model.strength
8231
8380
  });
8232
8381
  };
8233
- NewPasswordComponent.prototype.loadEnforcePasswordStrength = function () {
8382
+ NewPasswordComponent.prototype.loadPasswordStrengthSettings = function () {
8234
8383
  return __awaiter(this, void 0, void 0, function () {
8235
- var data, e_1;
8236
- return __generator(this, function (_a) {
8237
- switch (_a.label) {
8384
+ var _a;
8385
+ return __generator(this, function (_b) {
8386
+ switch (_b.label) {
8238
8387
  case 0:
8239
- _a.trys.push([0, 2, , 3]);
8240
- return [4 /*yield*/, this.systemOptions.detail({
8241
- category: 'password',
8242
- key: 'enforce.strength'
8243
- })];
8388
+ _a = this;
8389
+ return [4 /*yield*/, this.loginService.getEnforcePasswordStrength()];
8244
8390
  case 1:
8245
- data = (_a.sent()).data;
8246
- this.enforcePasswordStrength = data.value === 'true';
8247
- return [3 /*break*/, 3];
8248
- case 2:
8249
- e_1 = _a.sent();
8250
- return [3 /*break*/, 3];
8251
- case 3: return [2 /*return*/];
8391
+ _a.passwordEnforced = _b.sent();
8392
+ return [2 /*return*/];
8252
8393
  }
8253
8394
  });
8254
8395
  });
8255
8396
  };
8397
+ NewPasswordComponent.prototype.showPasswordStrength = function () {
8398
+ return this.model.newPassword && this.model.newPassword.length >= this.minlength;
8399
+ };
8256
8400
  NewPasswordComponent.prototype.toggleChangePassword = function () {
8257
8401
  this.changePassword = !this.changePassword;
8258
8402
  if (!this.changePassword) {
@@ -8261,7 +8405,7 @@
8261
8405
  }
8262
8406
  };
8263
8407
  NewPasswordComponent.ctorParameters = function () { return [
8264
- { type: client.SystemOptionsService }
8408
+ { type: LoginService }
8265
8409
  ]; };
8266
8410
  __decorate([
8267
8411
  core.Output()
@@ -8269,7 +8413,7 @@
8269
8413
  NewPasswordComponent = __decorate([
8270
8414
  core.Component({
8271
8415
  selector: 'c8y-new-password',
8272
- 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",
8416
+ 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",
8273
8417
  viewProviders: [{ provide: forms.ControlContainer, useExisting: forms.NgForm }]
8274
8418
  })
8275
8419
  ], NewPasswordComponent);
@@ -8331,6 +8475,7 @@
8331
8475
  opcuaBrowsePath: gettext('Invalid OPC UA URI.'),
8332
8476
  password: gettext('Password must have at least 8 characters and no more than 32 and can only contain letters, numbers and following symbols: `~!@#$%^&*()_|+-=?;:\'",.<>{}[]\\/'),
8333
8477
  passwordConfirm: gettext('Passwords do not match.'),
8478
+ passwordStrength: gettext('Password not good enough, password must be stronger (green).'),
8334
8479
  phoneNumber: gettext('Invalid phone number format. Only digits, spaces, slashes ("/") and dashes ("-") allowed.'),
8335
8480
  required: gettext('This field is required.'),
8336
8481
  tenantId: gettext('May contain lowercase letters, digits, hyphens and underscores. ' +
@@ -10420,9 +10565,9 @@
10420
10565
  tenantId: '',
10421
10566
  email: '',
10422
10567
  newPassword: '',
10423
- newPasswordConfirm: ''
10568
+ newPasswordConfirm: '',
10569
+ passwordStrengthEnforced: false
10424
10570
  };
10425
- this.enforcePasswordStrength = false;
10426
10571
  this.emailReadOnly = false;
10427
10572
  this.TOKEN_PARAM = 'token';
10428
10573
  this.EMAIL_PARAM = 'email';
@@ -10433,7 +10578,7 @@
10433
10578
  this.model.tenantId = this.loginService.getTenant();
10434
10579
  this.model.email = this.options.get(this.EMAIL_PARAM, '');
10435
10580
  this.emailReadOnly = !!this.model.email;
10436
- this.enforcePasswordStrength = this.loginService.getEnforcePasswordStrength();
10581
+ this.model.passwordStrengthEnforced = this.loginService.getEnforcePasswordStrength();
10437
10582
  return [2 /*return*/];
10438
10583
  });
10439
10584
  });
@@ -10494,7 +10639,7 @@
10494
10639
  ChangePasswordComponent = __decorate([
10495
10640
  core.Component({
10496
10641
  selector: 'c8y-change-password',
10497
- 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"
10642
+ 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"
10498
10643
  })
10499
10644
  ], ChangePasswordComponent);
10500
10645
  return ChangePasswordComponent;
@@ -10595,7 +10740,7 @@
10595
10740
  };
10596
10741
  CredentialsComponent.prototype.handleNoPhoneNumberProvided = function () {
10597
10742
  this.onChangeView.emit({ view: exports.LoginViews.ProvidePhoneNumber, credentials: this.model });
10598
- 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.'));
10743
+ 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.'));
10599
10744
  };
10600
10745
  CredentialsComponent.ctorParameters = function () { return [
10601
10746
  { type: LoginService },
@@ -10880,6 +11025,61 @@
10880
11025
  return TotpAuthComponent;
10881
11026
  }());
10882
11027
 
11028
+ var StrengthValidatorService = /** @class */ (function () {
11029
+ function StrengthValidatorService(passwordService) {
11030
+ this.passwordService = passwordService;
11031
+ }
11032
+ StrengthValidatorService.prototype.isStrong = function (password) {
11033
+ return this.isPasswordGreen(this.passwordService.getStrengthColor(password).passwordStrength);
11034
+ };
11035
+ StrengthValidatorService.prototype.isPasswordGreen = function (strength) {
11036
+ return strength === client.PasswordStrength.GREEN;
11037
+ };
11038
+ StrengthValidatorService.ctorParameters = function () { return [
11039
+ { type: PasswordService }
11040
+ ]; };
11041
+ StrengthValidatorService.ngInjectableDef = core.ɵɵdefineInjectable({ factory: function StrengthValidatorService_Factory() { return new StrengthValidatorService(core.ɵɵinject(PasswordService)); }, token: StrengthValidatorService, providedIn: "root" });
11042
+ StrengthValidatorService = __decorate([
11043
+ core.Injectable({
11044
+ providedIn: 'root'
11045
+ })
11046
+ ], StrengthValidatorService);
11047
+ return StrengthValidatorService;
11048
+ }());
11049
+
11050
+ var PasswordStrengthValidatorDirective = /** @class */ (function () {
11051
+ function PasswordStrengthValidatorDirective(passwordService) {
11052
+ this.passwordService = passwordService;
11053
+ }
11054
+ PasswordStrengthValidatorDirective_1 = PasswordStrengthValidatorDirective;
11055
+ Object.defineProperty(PasswordStrengthValidatorDirective.prototype, "passwordStrengthEnforced", {
11056
+ set: function (value) {
11057
+ this.forced = value;
11058
+ },
11059
+ enumerable: true,
11060
+ configurable: true
11061
+ });
11062
+ PasswordStrengthValidatorDirective.prototype.validate = function (control) {
11063
+ var strengthFulfilled = this.passwordService.isStrong(control.value || '');
11064
+ var enforcementForcedAndNotFulfilled = this.forced && !strengthFulfilled;
11065
+ return enforcementForcedAndNotFulfilled ? { passwordStrength: true } : null;
11066
+ };
11067
+ var PasswordStrengthValidatorDirective_1;
11068
+ PasswordStrengthValidatorDirective.ctorParameters = function () { return [
11069
+ { type: StrengthValidatorService }
11070
+ ]; };
11071
+ __decorate([
11072
+ core.Input()
11073
+ ], PasswordStrengthValidatorDirective.prototype, "passwordStrengthEnforced", null);
11074
+ PasswordStrengthValidatorDirective = PasswordStrengthValidatorDirective_1 = __decorate([
11075
+ core.Directive({
11076
+ selector: '[passwordStrengthEnforced]',
11077
+ providers: [{ provide: forms.NG_VALIDATORS, useExisting: PasswordStrengthValidatorDirective_1, multi: true }]
11078
+ })
11079
+ ], PasswordStrengthValidatorDirective);
11080
+ return PasswordStrengthValidatorDirective;
11081
+ }());
11082
+
10883
11083
  /**
10884
11084
  * The angular module definition for the login.
10885
11085
  * @exports LoginComponent
@@ -10905,7 +11105,8 @@
10905
11105
  RecoverPasswordComponent,
10906
11106
  ChangePasswordComponent,
10907
11107
  CredentialsComponent,
10908
- TotpAuthComponent
11108
+ TotpAuthComponent,
11109
+ PasswordStrengthValidatorDirective
10909
11110
  ],
10910
11111
  imports: [
10911
11112
  forms.FormsModule,
@@ -14237,24 +14438,89 @@
14237
14438
  }());
14238
14439
 
14239
14440
  var GuideDocsComponent = /** @class */ (function () {
14240
- function GuideDocsComponent(docs) {
14441
+ function GuideDocsComponent(docs, el, renderer) {
14241
14442
  this.docs = docs;
14443
+ this.el = el;
14444
+ this.renderer = renderer;
14445
+ this.destroyed$ = new rxjs.ReplaySubject(1);
14242
14446
  }
14243
14447
  GuideDocsComponent.prototype.ngOnInit = function () {
14244
14448
  this.baseUrl = this.docs.getBaseUrl();
14245
14449
  };
14450
+ /**
14451
+ * After content is initialized we subscribe for translation events, then we are able to modify
14452
+ * anchor just as C8yGuideHrefDirective does.
14453
+ */
14454
+ GuideDocsComponent.prototype.ngAfterContentInit = function () {
14455
+ var _this = this;
14456
+ if (this.translateDirective) {
14457
+ this.translateDirective.htmlUpdateEvent
14458
+ .pipe(operators.takeUntil(this.destroyed$))
14459
+ .subscribe(function () {
14460
+ _this.replaceAnchorAttributes();
14461
+ });
14462
+ }
14463
+ else {
14464
+ this.replaceAnchorAttributes();
14465
+ }
14466
+ };
14467
+ /**
14468
+ * Find and modify anchor elements
14469
+ */
14470
+ GuideDocsComponent.prototype.replaceAnchorAttributes = function () {
14471
+ var _this = this;
14472
+ var anchors = this.findGuideAnchors(this.el.nativeElement);
14473
+ anchors.forEach(function (a) {
14474
+ var guideHref = _this.baseUrl + "/" + a.getAttribute('c8y-guide-href');
14475
+ _this.renderer.setAttribute(a, 'href', guideHref);
14476
+ if (!a.hasAttribute('target')) {
14477
+ _this.renderer.setAttribute(a, 'target', '_blank');
14478
+ }
14479
+ });
14480
+ };
14481
+ /**
14482
+ * Recursive function, returns array of Anchor elements inside HTMLElement.
14483
+ */
14484
+ GuideDocsComponent.prototype.findGuideAnchors = function (el) {
14485
+ var _this = this;
14486
+ var isAnchor = function () { return el.nodeName === 'A'; };
14487
+ var hasGuideHrefAttr = function () { return !!el.attributes.getNamedItem('c8y-guide-href'); };
14488
+ var hasChildren = function () { return el.childNodes && el.childNodes.length > 0; };
14489
+ var result = [];
14490
+ if (isAnchor() && hasGuideHrefAttr()) {
14491
+ result.push(el);
14492
+ }
14493
+ else if (hasChildren()) {
14494
+ el.childNodes.forEach(function (node) {
14495
+ var searchResult = _this.findGuideAnchors(node);
14496
+ if (searchResult) {
14497
+ result = __spread(result, searchResult);
14498
+ }
14499
+ });
14500
+ }
14501
+ return result;
14502
+ };
14246
14503
  GuideDocsComponent.prototype.ngAfterViewInit = function () {
14247
14504
  var _this = this;
14248
14505
  this.links.forEach(function (guide) {
14249
14506
  guide.baseHref = _this.baseUrl;
14250
14507
  });
14251
14508
  };
14509
+ GuideDocsComponent.prototype.ngOnDestroy = function () {
14510
+ this.destroyed$.next(true);
14511
+ this.destroyed$.complete();
14512
+ };
14252
14513
  GuideDocsComponent.ctorParameters = function () { return [
14253
- { type: DocsService }
14514
+ { type: DocsService },
14515
+ { type: core.ElementRef },
14516
+ { type: core.Renderer2 }
14254
14517
  ]; };
14255
14518
  __decorate([
14256
14519
  core.ContentChildren(GuideHrefDirective, { descendants: true })
14257
14520
  ], GuideDocsComponent.prototype, "links", void 0);
14521
+ __decorate([
14522
+ core.ContentChild(ForceHtmlTranslateDirective, { static: false })
14523
+ ], GuideDocsComponent.prototype, "translateDirective", void 0);
14258
14524
  GuideDocsComponent = __decorate([
14259
14525
  core.Component({
14260
14526
  selector: '[c8y-guide-docs]',
@@ -15252,7 +15518,7 @@
15252
15518
  WidgetsDashboardComponent = __decorate([
15253
15519
  core.Component({
15254
15520
  selector: 'c8y-widgets-dashboard',
15255
- 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",
15521
+ 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",
15256
15522
  host: {
15257
15523
  style: "\n display: block;\n ",
15258
15524
  class: 'dashboard c8y-grid-dashboard'
@@ -16364,97 +16630,100 @@
16364
16630
  exports.ɵ0 = ɵ0;
16365
16631
  exports.ɵa = ApplicationOptions;
16366
16632
  exports.ɵb = translateLoaderFactory;
16367
- exports.ɵba = ActionOutletComponent;
16368
- exports.ɵbb = ActionComponent;
16369
- exports.ɵbc = AlertModule;
16370
- exports.ɵbd = AlertOutletComponent;
16371
- exports.ɵbe = AlertComponent;
16372
- exports.ɵbf = AlertDetailsComponent;
16373
- exports.ɵbg = AlertTextComponent;
16374
- exports.ɵbh = BootstrapModule;
16375
- exports.ɵbi = CookieBannerComponent;
16376
- exports.ɵbj = TitleOutletComponent;
16377
- exports.ɵbk = AppIconComponent;
16378
- exports.ɵbl = AppSwitcherComponent;
16379
- exports.ɵbm = RightDrawerComponent;
16380
- exports.ɵbn = UserModule;
16381
- exports.ɵbo = UserMenuOutletComponent;
16382
- exports.ɵbp = UserEditComponent;
16383
- exports.ɵbq = UserEditModalComponent;
16384
- exports.ɵbr = UserMenuItemComponent;
16385
- exports.ɵbs = UserTotpSetupComponent;
16386
- exports.ɵbt = InputGroupListContainerDirective;
16387
- exports.ɵbu = RequiredInputPlaceholderDirective;
16388
- exports.ɵbv = IpRangeInputListComponent;
16389
- exports.ɵbw = FilterInputComponent;
16390
- exports.ɵbx = ModalComponent;
16391
- exports.ɵby = SearchOutletComponent;
16392
- exports.ɵbz = SearchComponent;
16633
+ exports.ɵba = ActionModule;
16634
+ exports.ɵbb = ActionOutletComponent;
16635
+ exports.ɵbc = ActionComponent;
16636
+ exports.ɵbd = AlertModule;
16637
+ exports.ɵbe = AlertOutletComponent;
16638
+ exports.ɵbf = AlertComponent;
16639
+ exports.ɵbg = AlertDetailsComponent;
16640
+ exports.ɵbh = AlertTextComponent;
16641
+ exports.ɵbi = BootstrapModule;
16642
+ exports.ɵbj = CookieBannerComponent;
16643
+ exports.ɵbk = TitleOutletComponent;
16644
+ exports.ɵbl = AppIconComponent;
16645
+ exports.ɵbm = AppSwitcherComponent;
16646
+ exports.ɵbn = RightDrawerComponent;
16647
+ exports.ɵbo = UserModule;
16648
+ exports.ɵbp = UserMenuOutletComponent;
16649
+ exports.ɵbq = UserEditComponent;
16650
+ exports.ɵbr = UserEditModalComponent;
16651
+ exports.ɵbs = UserMenuItemComponent;
16652
+ exports.ɵbt = UserTotpSetupComponent;
16653
+ exports.ɵbu = InputGroupListContainerDirective;
16654
+ exports.ɵbv = RequiredInputPlaceholderDirective;
16655
+ exports.ɵbw = IpRangeInputListComponent;
16656
+ exports.ɵbx = FilterInputComponent;
16657
+ exports.ɵby = ModalComponent;
16658
+ exports.ɵbz = SearchOutletComponent;
16393
16659
  exports.ɵc = localePathFactory;
16394
- exports.ɵca = BreadcrumbModule;
16395
- exports.ɵcb = BreadcrumbComponent;
16396
- exports.ɵcc = BreadcrumbItemComponent;
16397
- exports.ɵcd = BreadcrumbOutletComponent;
16398
- exports.ɵce = NavigatorModule;
16399
- exports.ɵcf = NavigatorOutletComponent;
16400
- exports.ɵcg = NavigatorNodeComponent;
16401
- exports.ɵch = LoginModule;
16402
- exports.ɵci = LoginComponent;
16403
- exports.ɵcj = RecoverPasswordComponent;
16404
- exports.ɵck = ChangePasswordComponent;
16405
- exports.ɵcl = CredentialsComponent;
16406
- exports.ɵcm = TotpAuthComponent;
16407
- exports.ɵcn = TabsModule;
16408
- exports.ɵco = TabsOutletComponent;
16409
- exports.ɵcp = TabComponent;
16410
- exports.ɵcq = CellRendererComponent;
16411
- exports.ɵcr = FilteringFormRendererDefDirective;
16412
- exports.ɵcs = FilteringFormRendererComponent;
16413
- exports.ɵct = ColumnDirective;
16414
- exports.ɵcu = FilteringFormComponent;
16415
- exports.ɵcv = StatusCellRendererComponent;
16416
- exports.ɵcw = NameCellRendererComponent;
16417
- exports.ɵcx = ModelCellRendererComponent;
16418
- exports.ɵcy = SerialNumberCellRendererComponent;
16419
- exports.ɵcz = GroupCellRendererComponent;
16660
+ exports.ɵca = SearchComponent;
16661
+ exports.ɵcb = BreadcrumbModule;
16662
+ exports.ɵcc = BreadcrumbComponent;
16663
+ exports.ɵcd = BreadcrumbItemComponent;
16664
+ exports.ɵce = BreadcrumbOutletComponent;
16665
+ exports.ɵcf = NavigatorModule;
16666
+ exports.ɵcg = NavigatorOutletComponent;
16667
+ exports.ɵch = NavigatorNodeComponent;
16668
+ exports.ɵci = LoginModule;
16669
+ exports.ɵcj = LoginComponent;
16670
+ exports.ɵck = RecoverPasswordComponent;
16671
+ exports.ɵcl = ChangePasswordComponent;
16672
+ exports.ɵcm = CredentialsComponent;
16673
+ exports.ɵcn = TotpAuthComponent;
16674
+ exports.ɵco = PasswordStrengthValidatorDirective;
16675
+ exports.ɵcp = StrengthValidatorService;
16676
+ exports.ɵcq = TabsModule;
16677
+ exports.ɵcr = TabsOutletComponent;
16678
+ exports.ɵcs = TabComponent;
16679
+ exports.ɵct = CellRendererComponent;
16680
+ exports.ɵcu = FilteringFormRendererDefDirective;
16681
+ exports.ɵcv = FilteringFormRendererComponent;
16682
+ exports.ɵcw = ColumnDirective;
16683
+ exports.ɵcx = FilteringFormComponent;
16684
+ exports.ɵcy = StatusCellRendererComponent;
16685
+ exports.ɵcz = NameCellRendererComponent;
16420
16686
  exports.ɵd = languagesFactory;
16421
- exports.ɵda = RegistrationDateCellRendererComponent;
16422
- exports.ɵdb = AlarmsCellRendererComponent;
16423
- exports.ɵdc = ListItemComponent;
16424
- exports.ɵdd = ListItemFooterComponent;
16425
- exports.ɵde = ListItemActionComponent;
16426
- exports.ɵdf = ListItemCollapseComponent;
16427
- exports.ɵdg = ListItemIconComponent;
16428
- exports.ɵdh = ListItemBodyComponent;
16429
- exports.ɵdi = ListItemCheckboxComponent;
16430
- exports.ɵdj = ListItemRadioComponent;
16431
- exports.ɵdk = C8yStepperIcon;
16432
- exports.ɵdl = C8yStepperProgress;
16433
- exports.ɵdn = RouterTabsResolver;
16434
- exports.ɵdo = ContextRouteGuard;
16435
- exports.ɵdp = QuickLinkComponent;
16687
+ exports.ɵda = ModelCellRendererComponent;
16688
+ exports.ɵdb = SerialNumberCellRendererComponent;
16689
+ exports.ɵdc = GroupCellRendererComponent;
16690
+ exports.ɵdd = RegistrationDateCellRendererComponent;
16691
+ exports.ɵde = AlarmsCellRendererComponent;
16692
+ exports.ɵdf = ListItemComponent;
16693
+ exports.ɵdg = ListItemFooterComponent;
16694
+ exports.ɵdh = ListItemActionComponent;
16695
+ exports.ɵdi = ListItemCollapseComponent;
16696
+ exports.ɵdj = ListItemIconComponent;
16697
+ exports.ɵdk = ListItemBodyComponent;
16698
+ exports.ɵdl = ListItemCheckboxComponent;
16699
+ exports.ɵdm = ListItemRadioComponent;
16700
+ exports.ɵdn = C8yStepperIcon;
16701
+ exports.ɵdo = C8yStepperProgress;
16702
+ exports.ɵdq = RouterTabsResolver;
16703
+ exports.ɵdr = ContextRouteGuard;
16704
+ exports.ɵds = QuickLinkComponent;
16436
16705
  exports.ɵe = localeId;
16437
16706
  exports.ɵf = I18nModule;
16438
- exports.ɵg = MESSAGES;
16439
- exports.ɵh = LOCALE_PATH;
16440
- exports.ɵi = LANGUAGES;
16441
- exports.ɵj = TranslateCustomLoader;
16442
- exports.ɵk = TranslateParserCustom;
16443
- exports.ɵl = MissingTranslationCustomHandler;
16444
- exports.ɵm = PatternMessagesService;
16445
- exports.ɵn = IconDirective;
16446
- exports.ɵo = ICONS;
16447
- exports.ɵp = OutletDirective;
16448
- exports.ɵq = ShortenUserNamePipe;
16449
- exports.ɵr = ForOfDirective;
16450
- exports.ɵs = LoadMoreComponent;
16451
- exports.ɵt = MapFunctionPipe;
16452
- exports.ɵu = ProgressBarComponent;
16453
- exports.ɵv = UserPreferencesService;
16454
- exports.ɵw = ActionBarModule;
16455
- exports.ɵx = ActionBarComponent;
16456
- exports.ɵy = ActionBarItemComponent;
16457
- exports.ɵz = ActionModule;
16707
+ exports.ɵg = ForceHtmlTranslateDirective;
16708
+ exports.ɵh = MESSAGES;
16709
+ exports.ɵi = LOCALE_PATH;
16710
+ exports.ɵj = LANGUAGES;
16711
+ exports.ɵk = TranslateCustomLoader;
16712
+ exports.ɵl = TranslateParserCustom;
16713
+ exports.ɵm = MissingTranslationCustomHandler;
16714
+ exports.ɵn = PatternMessagesService;
16715
+ exports.ɵo = IconDirective;
16716
+ exports.ɵp = ICONS;
16717
+ exports.ɵq = OutletDirective;
16718
+ exports.ɵr = ShortenUserNamePipe;
16719
+ exports.ɵs = ForOfDirective;
16720
+ exports.ɵt = LoadMoreComponent;
16721
+ exports.ɵu = MapFunctionPipe;
16722
+ exports.ɵv = ProgressBarComponent;
16723
+ exports.ɵw = UserPreferencesService;
16724
+ exports.ɵx = ActionBarModule;
16725
+ exports.ɵy = ActionBarComponent;
16726
+ exports.ɵz = ActionBarItemComponent;
16458
16727
 
16459
16728
  Object.defineProperty(exports, '__esModule', { value: true });
16460
16729