@c8y/ngx-components 1023.14.156 → 1023.14.159

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.
@@ -17959,7 +17959,8 @@ class ValidationPattern {
17959
17959
  maxlength: gettext$1('Should have at most {{ requiredLength }} characters.'),
17960
17960
  pattern: gettext$1('Does not match pattern {{ requiredPattern }}.'),
17961
17961
  opcuaBrowsePath: gettext$1('Invalid OPC UA URI.'),
17962
- password: gettext$1('Password must have at least 8 characters and no more than 32 and can only contain letters, numbers and following symbols: `~!@#$%^&*()_|+-=?;:\'",.<>{}[]\\/'),
17962
+ password: gettext$1('Password must have at least {{ minLength }} characters and no more than {{ maxLength }} and can only contain letters, numbers and following symbols: {{ allowedCharactersList }}'),
17963
+ passwordSimple: gettext$1('Password must have at least {{ minLength }} characters and no more than {{ maxLength }}.'),
17963
17964
  passwordConfirm: gettext$1('Passwords do not match.'),
17964
17965
  passwordStrength: gettext$1('Password is not strong enough, use a stronger password.'),
17965
17966
  passwordStrengthChecklist: gettext$1('Password is not strong enough, use a stronger password. Check the requirements listed on the right.'),
@@ -18003,6 +18004,8 @@ class ValidationPattern {
18003
18004
  pattern: /^(opc.tcp|http|https):\/\/[^ "]+$/
18004
18005
  },
18005
18006
  password: {
18007
+ // Note: min length {8} is a fallback default. Actual password validation uses
18008
+ // PasswordValidationService with dynamically configured min length.
18006
18009
  pattern: /^[a-zA-Z0-9`~!@#$%^&*()_|+\-=?;:'",.<>{}[\]\\/]{8,32}$/
18007
18010
  },
18008
18011
  tenantId: {
@@ -18215,6 +18218,7 @@ class MessagesComponent {
18215
18218
  this.defaults = ValidationPattern.messages;
18216
18219
  this.helpMessage = '';
18217
18220
  this.messages = [];
18221
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
18218
18222
  this.messageMap = {};
18219
18223
  }
18220
18224
  ngAfterContentInit() {
@@ -18239,7 +18243,10 @@ class MessagesComponent {
18239
18243
  }
18240
18244
  }
18241
18245
  toMessage(key, value) {
18242
- let message = this.messageMap[key];
18246
+ // First check customMessages directly for the most up-to-date text
18247
+ // (handles async binding updates that occur after ngAfterContentInit)
18248
+ const customMessage = this.customMessages?.find(({ name }) => name === key);
18249
+ let message = customMessage?.text || this.messageMap[key];
18243
18250
  if ((!message || message === ValidationPattern.messages.pattern) &&
18244
18251
  key === 'pattern' &&
18245
18252
  typeof value?.requiredPattern === 'string') {
@@ -18247,7 +18254,8 @@ class MessagesComponent {
18247
18254
  const foundPattern = Object.keys(ValidationPattern.rules).find(tmp => ValidationPattern.rules[tmp].pattern?.source === pattern);
18248
18255
  if (foundPattern) {
18249
18256
  key = foundPattern;
18250
- message = this.messageMap[key];
18257
+ const foundCustomMessage = this.customMessages?.find(({ name }) => name === key);
18258
+ message = foundCustomMessage?.text || this.messageMap[key];
18251
18259
  }
18252
18260
  }
18253
18261
  if (!message) {
@@ -18256,11 +18264,11 @@ class MessagesComponent {
18256
18264
  return this.translateService.instant(message, value);
18257
18265
  }
18258
18266
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.19", ngImport: i0, type: MessagesComponent, deps: [{ token: i1$1.TranslateService }], target: i0.ɵɵFactoryTarget.Component }); }
18259
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.19", type: MessagesComponent, isStandalone: true, selector: "c8y-messages", inputs: { show: "show", defaults: "defaults", helpMessage: "helpMessage" }, queries: [{ propertyName: "customMessages", predicate: MessageDirective }], usesOnChanges: true, ngImport: i0, template: "<small class=\"form-control-feedback-message\">\n <div\n class=\"d-block\"\n *ngFor=\"let msg of messages\"\n >\n {{ msg | translate }}\n </div>\n <div\n class=\"help-block\"\n *ngIf=\"!messages.length && helpMessage\"\n >\n {{ helpMessage | translate }}\n </div>\n <ng-content></ng-content>\n</small>\n", dependencies: [{ kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: NgFor, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "pipe", type: C8yTranslatePipe, name: "translate" }] }); }
18267
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.19", type: MessagesComponent, isStandalone: true, selector: "c8y-messages", inputs: { show: "show", defaults: "defaults", helpMessage: "helpMessage" }, queries: [{ propertyName: "customMessages", predicate: MessageDirective }], usesOnChanges: true, ngImport: i0, template: "<small class=\"form-control-feedback-message\">\n @for (msg of messages; track msg) {\n <div class=\"d-block\">\n {{ msg | translate }}\n </div>\n }\n @if (!messages.length && helpMessage) {\n <div class=\"help-block\">\n {{ helpMessage | translate }}\n </div>\n }\n <ng-content></ng-content>\n</small>\n", dependencies: [{ kind: "pipe", type: C8yTranslatePipe, name: "translate" }] }); }
18260
18268
  }
18261
18269
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.19", ngImport: i0, type: MessagesComponent, decorators: [{
18262
18270
  type: Component,
18263
- args: [{ selector: 'c8y-messages', standalone: true, imports: [NgIf, NgFor, C8yTranslatePipe], template: "<small class=\"form-control-feedback-message\">\n <div\n class=\"d-block\"\n *ngFor=\"let msg of messages\"\n >\n {{ msg | translate }}\n </div>\n <div\n class=\"help-block\"\n *ngIf=\"!messages.length && helpMessage\"\n >\n {{ helpMessage | translate }}\n </div>\n <ng-content></ng-content>\n</small>\n" }]
18271
+ args: [{ selector: 'c8y-messages', standalone: true, imports: [C8yTranslatePipe], template: "<small class=\"form-control-feedback-message\">\n @for (msg of messages; track msg) {\n <div class=\"d-block\">\n {{ msg | translate }}\n </div>\n }\n @if (!messages.length && helpMessage) {\n <div class=\"help-block\">\n {{ helpMessage | translate }}\n </div>\n }\n <ng-content></ng-content>\n</small>\n" }]
18264
18272
  }], ctorParameters: () => [{ type: i1$1.TranslateService }], propDecorators: { show: [{
18265
18273
  type: Input
18266
18274
  }], defaults: [{
@@ -20365,7 +20373,9 @@ class PasswordService {
20365
20373
  return password.search(/[0-9]/) !== -1;
20366
20374
  }
20367
20375
  hasSpecialChars(password) {
20368
- return password.search(/[^0-9a-zA-Z]+/) !== -1;
20376
+ // Only match ALLOWED symbols, not any non-alphanumeric character
20377
+ // Allowed: `~!@#$%^&*()_|+-=?;:'",.<>{}[]\\/
20378
+ return password.search(/[`~!@#$%^&*()_|+\-=?;:'",.<>{}\[\]\\/]/) !== -1;
20369
20379
  }
20370
20380
  getStrengthColor(password) {
20371
20381
  const passwordStrength = filter$2([
@@ -20606,6 +20616,110 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.19", ngImpo
20606
20616
  type: Input
20607
20617
  }] } });
20608
20618
 
20619
+ /**
20620
+ * Shared password validation service for Angular and AngularJS.
20621
+ *
20622
+ * Validation logic:
20623
+ * - Invalid characters → error with full message (allowed symbols)
20624
+ * - Too long (>32) → error
20625
+ * - Too short when NOT enforced → simple error (length only)
20626
+ * - Too short when enforced → valid (checklist handles it)
20627
+ */
20628
+ class PasswordValidationService {
20629
+ constructor() {
20630
+ this.DEFAULT_MIN_LENGTH = 8;
20631
+ this.MAX_LENGTH = 32;
20632
+ this.ALLOWED_SYMBOLS = '`~!@#$%^&*()_|+-=?;:\'",.<>{}[]\\/';
20633
+ this.VALID_CHARS_PATTERN = /^[a-zA-Z0-9`~!@#$%^&*()_|+\-=?;:'",.<>{}[\]\\/]*$/;
20634
+ }
20635
+ /**
20636
+ * @param password The password to validate.
20637
+ * @param strengthEnforced Whether password strength enforcement is enabled.
20638
+ * @param minGreenLength Minimum length to be considered strong/green.
20639
+ * When strength is enforced, this is the green minimum from tenant settings.
20640
+ * Defaults to DEFAULT_MIN_LENGTH.
20641
+ */
20642
+ validate(password, strengthEnforced, minGreenLength) {
20643
+ const min = minGreenLength ?? this.DEFAULT_MIN_LENGTH;
20644
+ if (!password) {
20645
+ return { valid: true, errorKey: null };
20646
+ }
20647
+ // Invalid characters - always show full message with allowed symbols
20648
+ if (!this.hasValidCharsOnly(password)) {
20649
+ return { valid: false, errorKey: 'password' };
20650
+ }
20651
+ // Too long - always validate
20652
+ if (password.length > this.MAX_LENGTH) {
20653
+ return { valid: false, errorKey: strengthEnforced ? 'password' : 'passwordSimple' };
20654
+ }
20655
+ // Shorter than absolute minimum - always invalid regardless of enforcement
20656
+ if (password.length < this.DEFAULT_MIN_LENGTH) {
20657
+ return { valid: false, errorKey: 'passwordSimple' };
20658
+ }
20659
+ // Too short for configured min - only validate when strength is NOT enforced (checklist handles it otherwise)
20660
+ if (!strengthEnforced && password.length < min) {
20661
+ return { valid: false, errorKey: 'passwordSimple' };
20662
+ }
20663
+ return { valid: true, errorKey: null };
20664
+ }
20665
+ hasValidCharsOnly(password) {
20666
+ return this.VALID_CHARS_PATTERN.test(password);
20667
+ }
20668
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.19", ngImport: i0, type: PasswordValidationService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
20669
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.19", ngImport: i0, type: PasswordValidationService, providedIn: 'root' }); }
20670
+ }
20671
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.19", ngImport: i0, type: PasswordValidationService, decorators: [{
20672
+ type: Injectable,
20673
+ args: [{ providedIn: 'root' }]
20674
+ }] });
20675
+
20676
+ /**
20677
+ * Password validation directive using shared PasswordValidationService.
20678
+ *
20679
+ * Returns `{ password: { minLength, maxLength, allowedCharactersList } }` for full message (with allowed symbols)
20680
+ * or `{ passwordSimple: { minLength, maxLength, allowedCharactersList } }` for simple message (length only).
20681
+ */
20682
+ class PasswordValidationDirective {
20683
+ constructor() {
20684
+ this.validationService = inject(PasswordValidationService);
20685
+ }
20686
+ validate(control) {
20687
+ const password = control.value;
20688
+ if (!password) {
20689
+ return null;
20690
+ }
20691
+ const strengthEnforced = this.passwordStrengthEnforced === true;
20692
+ const min = strengthEnforced
20693
+ ? (this.minLength ?? this.validationService.DEFAULT_MIN_LENGTH)
20694
+ : this.validationService.DEFAULT_MIN_LENGTH;
20695
+ const result = this.validationService.validate(password, strengthEnforced, min);
20696
+ if (result.valid) {
20697
+ return null;
20698
+ }
20699
+ return {
20700
+ [result.errorKey]: {
20701
+ minLength: min,
20702
+ maxLength: this.validationService.MAX_LENGTH,
20703
+ allowedCharactersList: this.validationService.ALLOWED_SYMBOLS
20704
+ }
20705
+ };
20706
+ }
20707
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.19", ngImport: i0, type: PasswordValidationDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
20708
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "20.3.19", type: PasswordValidationDirective, isStandalone: true, selector: "[c8yPasswordValidation]", inputs: { passwordStrengthEnforced: "passwordStrengthEnforced", minLength: "minLength" }, providers: [{ provide: NG_VALIDATORS, useExisting: PasswordValidationDirective, multi: true }], ngImport: i0 }); }
20709
+ }
20710
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.19", ngImport: i0, type: PasswordValidationDirective, decorators: [{
20711
+ type: Directive,
20712
+ args: [{
20713
+ selector: '[c8yPasswordValidation]',
20714
+ providers: [{ provide: NG_VALIDATORS, useExisting: PasswordValidationDirective, multi: true }],
20715
+ standalone: true
20716
+ }]
20717
+ }], propDecorators: { passwordStrengthEnforced: [{
20718
+ type: Input
20719
+ }], minLength: [{
20720
+ type: Input
20721
+ }] } });
20722
+
20609
20723
  class PasswordConfirm {
20610
20724
  constructor(passwordConfirm) {
20611
20725
  this.passwordConfirm = passwordConfirm;
@@ -20656,7 +20770,7 @@ class PasswordStrengthService {
20656
20770
  };
20657
20771
  }
20658
20772
  /**
20659
- * Gets the minimal number of characters that a password should have to be considered a green strong one.
20773
+ * Gets the minimal number of characters that a password should have to be considered a "green" strong one.
20660
20774
  * @return The min length for password or default value.
20661
20775
  */
20662
20776
  async getGreenMinLength() {
@@ -20740,43 +20854,38 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.19", ngImpo
20740
20854
  }], ctorParameters: () => [{ type: AppStateService }] });
20741
20855
 
20742
20856
  class PasswordCheckListComponent {
20743
- set password(password) {
20744
- if (typeof password === 'string') {
20745
- this.onPasswordChange(password);
20746
- }
20747
- }
20748
- constructor(passwordStrength, passwordStrengthChecker, passwordService) {
20857
+ constructor(passwordStrength, passwordService) {
20749
20858
  this.passwordStrength = passwordStrength;
20750
- this.passwordStrengthChecker = passwordStrengthChecker;
20751
20859
  this.passwordService = passwordService;
20752
20860
  this.strengthEnforced = false;
20861
+ this.password = '';
20753
20862
  this.onRequirementsFulfilled = new EventEmitter();
20754
20863
  this.minGreenLength = 8;
20755
20864
  this.enhancedStrengthCheckList = [
20756
20865
  {
20757
20866
  label: gettext$1('Include lowercase characters (for example, abcdef)'),
20758
- check: this.passwordStrengthChecker.hasLowerCase,
20867
+ check: this.passwordService.hasLowerCase,
20759
20868
  icon: '',
20760
20869
  contextualColor: '',
20761
20870
  textColor: ''
20762
20871
  },
20763
20872
  {
20764
20873
  label: gettext$1('Include uppercase characters (for example, ABCDEF)'),
20765
- check: this.passwordStrengthChecker.hasUpperCase,
20874
+ check: this.passwordService.hasUpperCase,
20766
20875
  icon: '',
20767
20876
  contextualColor: '',
20768
20877
  textColor: ''
20769
20878
  },
20770
20879
  {
20771
20880
  label: gettext$1('Include numbers (for example, 123456)'),
20772
- check: this.passwordStrengthChecker.hasNumbers,
20881
+ check: this.passwordService.hasNumbers,
20773
20882
  icon: '',
20774
20883
  contextualColor: '',
20775
20884
  textColor: ''
20776
20885
  },
20777
20886
  {
20778
20887
  label: gettext$1('Include symbols (for example, !@#$%^)'),
20779
- check: this.passwordStrengthChecker.hasSpecialChars,
20888
+ check: this.passwordService.hasSpecialChars,
20780
20889
  icon: '',
20781
20890
  contextualColor: '',
20782
20891
  textColor: ''
@@ -20785,7 +20894,7 @@ class PasswordCheckListComponent {
20785
20894
  this.basicChecklist = [
20786
20895
  {
20787
20896
  label: gettext$1('Must have at least {{length}} characters'),
20788
- check: password => password.length >= this.minGreenLength,
20897
+ check: (password) => password.length >= this.minGreenLength,
20789
20898
  icon: '',
20790
20899
  contextualColor: '',
20791
20900
  textColor: ''
@@ -20794,15 +20903,26 @@ class PasswordCheckListComponent {
20794
20903
  this.combinedChecklist = [];
20795
20904
  }
20796
20905
  async ngOnInit() {
20797
- this.minGreenLength = await this.passwordStrength.getGreenMinLength();
20798
- if (!this.minGreenLength) {
20799
- this.minGreenLength = this.passwordService.getDefaultPasswordMinLength();
20906
+ this.defaultMinLength = this.passwordService.getDefaultPasswordMinLength();
20907
+ if (!this.greenMinLength) {
20908
+ this.greenMinLength = await this.passwordStrength.getGreenMinLength();
20909
+ }
20910
+ this.updateMinGreenLength();
20911
+ this.onPasswordChange(this.password);
20912
+ }
20913
+ ngOnChanges(changes) {
20914
+ if ((changes.strengthEnforced && !changes.strengthEnforced.firstChange) ||
20915
+ (changes.greenMinLength && !changes.greenMinLength.firstChange)) {
20916
+ this.updateMinGreenLength();
20917
+ }
20918
+ if (changes.password || changes.strengthEnforced || changes.greenMinLength) {
20919
+ this.onPasswordChange(this.password);
20800
20920
  }
20801
- this.onPasswordChange('');
20802
20921
  }
20803
20922
  get translateParams() {
20804
20923
  return {
20805
- length: this.minGreenLength
20924
+ length: this.minGreenLength,
20925
+ recommendedLength: this.recommendedMinLength
20806
20926
  };
20807
20927
  }
20808
20928
  checkRequirement(requirement, password) {
@@ -20815,12 +20935,16 @@ class PasswordCheckListComponent {
20815
20935
  return requirement;
20816
20936
  }
20817
20937
  onPasswordChange(password) {
20938
+ const pwd = typeof password === 'string' ? password : '';
20818
20939
  this.basicChecklist.forEach(requirement => {
20819
- this.checkRequirement(requirement, password);
20940
+ this.checkRequirement(requirement, pwd);
20820
20941
  });
20821
20942
  this.enhancedStrengthCheckList.forEach(requirement => {
20822
- this.checkRequirement(requirement, password);
20943
+ this.checkRequirement(requirement, pwd);
20823
20944
  });
20945
+ if (this.recommendedMinLengthCheck) {
20946
+ this.checkRequirement(this.recommendedMinLengthCheck, pwd);
20947
+ }
20824
20948
  this.combinedChecklist = [...this.basicChecklist, ...this.enhancedStrengthCheckList];
20825
20949
  this.onRequirementsFulfilled.emit(this.isPasswordValid());
20826
20950
  }
@@ -20828,30 +20952,61 @@ class PasswordCheckListComponent {
20828
20952
  const checklist = this.strengthEnforced ? this.combinedChecklist : this.basicChecklist;
20829
20953
  return checklist.every(requirement => requirement.icon !== 'radio-button-unchecked');
20830
20954
  }
20831
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.19", ngImport: i0, type: PasswordCheckListComponent, deps: [{ token: PasswordStrengthService }, { token: PasswordService }, { token: PasswordService }], target: i0.ɵɵFactoryTarget.Component }); }
20832
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.19", type: PasswordCheckListComponent, isStandalone: true, selector: "c8y-password-check-list", inputs: { strengthEnforced: "strengthEnforced", password: "password" }, outputs: { onRequirementsFulfilled: "onRequirementsFulfilled" }, ngImport: i0, template: "<div *ngIf=\"strengthEnforced\">\n <div class=\"m-b-8\">{{ 'Password must meet the requirements below:' | translate }}</div>\n <ul class=\"list-unstyled\">\n <li\n class=\"small d-flex\"\n *ngFor=\"let requirement of combinedChecklist\"\n >\n <i\n class=\"{{ requirement.contextualColor }}\"\n [c8yIcon]=\"requirement.icon\"\n ></i>\n <span\n class=\"m-l-4 small {{ requirement.textColor }}\"\n [translate]=\"requirement.label\"\n [translateParams]=\"this.translateParams\"\n ></span>\n </li>\n </ul>\n</div>\n\n<div *ngIf=\"!strengthEnforced\">\n <div class=\"m-b-8\">{{ 'Password must meet the requirements below:' | translate }}</div>\n <ul class=\"list-unstyled\">\n <li\n class=\"small d-flex\"\n *ngFor=\"let requirement of basicChecklist\"\n >\n <i\n class=\"{{ requirement.contextualColor }}\"\n [c8yIcon]=\"requirement.icon\"\n ></i>\n <span\n class=\"m-l-4 small {{ requirement.textColor }}\"\n [translate]=\"requirement.label\"\n [translateParams]=\"this.translateParams\"\n ></span>\n </li>\n </ul>\n\n <div class=\"m-b-8\">\n {{ 'We recommend you to meet these conditions for a stronger password:' | translate }}\n </div>\n <ul class=\"list-unstyled\">\n <li\n class=\"small d-flex\"\n *ngFor=\"let requirement of enhancedStrengthCheckList\"\n >\n <i\n class=\"{{ requirement.contextualColor }}\"\n [c8yIcon]=\"requirement.icon\"\n ></i>\n <span\n class=\"m-l-4 small {{ requirement.textColor }}\"\n [translate]=\"requirement.label\"\n [translateParams]=\"this.translateParams\"\n ></span>\n </li>\n </ul>\n</div>\n", dependencies: [{ kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: NgFor, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "directive", type: C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "pipe", type: C8yTranslatePipe, name: "translate" }] }); }
20955
+ updateMinGreenLength() {
20956
+ this.minGreenLength = this.strengthEnforced
20957
+ ? this.greenMinLength || this.defaultMinLength
20958
+ : this.defaultMinLength;
20959
+ if (!this.strengthEnforced && this.greenMinLength > this.defaultMinLength) {
20960
+ this.recommendedMinLength = this.greenMinLength;
20961
+ this.recommendedMinLengthCheck = {
20962
+ label: gettext$1('Have at least {{recommendedLength}} characters'),
20963
+ check: (password) => password.length >= this.recommendedMinLength,
20964
+ icon: '',
20965
+ contextualColor: '',
20966
+ textColor: ''
20967
+ };
20968
+ }
20969
+ else {
20970
+ this.recommendedMinLength = undefined;
20971
+ this.recommendedMinLengthCheck = undefined;
20972
+ }
20973
+ }
20974
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.19", ngImport: i0, type: PasswordCheckListComponent, deps: [{ token: PasswordStrengthService }, { token: PasswordService }], target: i0.ɵɵFactoryTarget.Component }); }
20975
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.19", type: PasswordCheckListComponent, isStandalone: true, selector: "c8y-password-check-list", inputs: { strengthEnforced: "strengthEnforced", password: "password", greenMinLength: "greenMinLength" }, outputs: { onRequirementsFulfilled: "onRequirementsFulfilled" }, usesOnChanges: true, ngImport: i0, template: "@if (strengthEnforced) {\n <div class=\"m-b-8\">{{ 'Password must meet the requirements below:' | translate }}</div>\n <ul class=\"list-unstyled\">\n @for (requirement of combinedChecklist; track requirement.label) {\n <li class=\"small d-flex\">\n <i\n class=\"{{ requirement.contextualColor }}\"\n [c8yIcon]=\"requirement.icon\"\n ></i>\n <span\n class=\"m-l-4 small {{ requirement.textColor }}\"\n [translate]=\"requirement.label\"\n [translateParams]=\"this.translateParams\"\n ></span>\n </li>\n }\n </ul>\n} @else {\n <div class=\"m-b-8\">{{ 'Password must meet the requirements below:' | translate }}</div>\n <ul class=\"list-unstyled\">\n @for (requirement of basicChecklist; track requirement.label) {\n <li class=\"small d-flex\">\n <i\n class=\"{{ requirement.contextualColor }}\"\n [c8yIcon]=\"requirement.icon\"\n ></i>\n <span\n class=\"m-l-4 small {{ requirement.textColor }}\"\n [translate]=\"requirement.label\"\n [translateParams]=\"this.translateParams\"\n ></span>\n </li>\n }\n </ul>\n\n <div class=\"m-b-8\">\n {{ 'We recommend you to meet these conditions for a stronger password:' | translate }}\n </div>\n <ul class=\"list-unstyled\">\n @if (recommendedMinLengthCheck) {\n <li class=\"small d-flex\">\n <i\n class=\"{{ recommendedMinLengthCheck.contextualColor }}\"\n [c8yIcon]=\"recommendedMinLengthCheck.icon\"\n ></i>\n <span\n class=\"m-l-4 small {{ recommendedMinLengthCheck.textColor }}\"\n [translate]=\"recommendedMinLengthCheck.label\"\n [translateParams]=\"this.translateParams\"\n ></span>\n </li>\n }\n @for (requirement of enhancedStrengthCheckList; track requirement.label) {\n <li class=\"small d-flex\">\n <i\n class=\"{{ requirement.contextualColor }}\"\n [c8yIcon]=\"requirement.icon\"\n ></i>\n <span\n class=\"m-l-4 small {{ requirement.textColor }}\"\n [translate]=\"requirement.label\"\n [translateParams]=\"this.translateParams\"\n ></span>\n </li>\n }\n </ul>\n}\n", dependencies: [{ kind: "directive", type: IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "directive", type: C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "pipe", type: C8yTranslatePipe, name: "translate" }] }); }
20833
20976
  }
20834
20977
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.19", ngImport: i0, type: PasswordCheckListComponent, decorators: [{
20835
20978
  type: Component,
20836
- args: [{ selector: 'c8y-password-check-list', standalone: true, imports: [NgIf, NgFor, IconDirective, C8yTranslateDirective, C8yTranslatePipe], template: "<div *ngIf=\"strengthEnforced\">\n <div class=\"m-b-8\">{{ 'Password must meet the requirements below:' | translate }}</div>\n <ul class=\"list-unstyled\">\n <li\n class=\"small d-flex\"\n *ngFor=\"let requirement of combinedChecklist\"\n >\n <i\n class=\"{{ requirement.contextualColor }}\"\n [c8yIcon]=\"requirement.icon\"\n ></i>\n <span\n class=\"m-l-4 small {{ requirement.textColor }}\"\n [translate]=\"requirement.label\"\n [translateParams]=\"this.translateParams\"\n ></span>\n </li>\n </ul>\n</div>\n\n<div *ngIf=\"!strengthEnforced\">\n <div class=\"m-b-8\">{{ 'Password must meet the requirements below:' | translate }}</div>\n <ul class=\"list-unstyled\">\n <li\n class=\"small d-flex\"\n *ngFor=\"let requirement of basicChecklist\"\n >\n <i\n class=\"{{ requirement.contextualColor }}\"\n [c8yIcon]=\"requirement.icon\"\n ></i>\n <span\n class=\"m-l-4 small {{ requirement.textColor }}\"\n [translate]=\"requirement.label\"\n [translateParams]=\"this.translateParams\"\n ></span>\n </li>\n </ul>\n\n <div class=\"m-b-8\">\n {{ 'We recommend you to meet these conditions for a stronger password:' | translate }}\n </div>\n <ul class=\"list-unstyled\">\n <li\n class=\"small d-flex\"\n *ngFor=\"let requirement of enhancedStrengthCheckList\"\n >\n <i\n class=\"{{ requirement.contextualColor }}\"\n [c8yIcon]=\"requirement.icon\"\n ></i>\n <span\n class=\"m-l-4 small {{ requirement.textColor }}\"\n [translate]=\"requirement.label\"\n [translateParams]=\"this.translateParams\"\n ></span>\n </li>\n </ul>\n</div>\n" }]
20837
- }], ctorParameters: () => [{ type: PasswordStrengthService }, { type: PasswordService }, { type: PasswordService }], propDecorators: { strengthEnforced: [{
20979
+ args: [{ selector: 'c8y-password-check-list', standalone: true, imports: [IconDirective, C8yTranslateDirective, C8yTranslatePipe], template: "@if (strengthEnforced) {\n <div class=\"m-b-8\">{{ 'Password must meet the requirements below:' | translate }}</div>\n <ul class=\"list-unstyled\">\n @for (requirement of combinedChecklist; track requirement.label) {\n <li class=\"small d-flex\">\n <i\n class=\"{{ requirement.contextualColor }}\"\n [c8yIcon]=\"requirement.icon\"\n ></i>\n <span\n class=\"m-l-4 small {{ requirement.textColor }}\"\n [translate]=\"requirement.label\"\n [translateParams]=\"this.translateParams\"\n ></span>\n </li>\n }\n </ul>\n} @else {\n <div class=\"m-b-8\">{{ 'Password must meet the requirements below:' | translate }}</div>\n <ul class=\"list-unstyled\">\n @for (requirement of basicChecklist; track requirement.label) {\n <li class=\"small d-flex\">\n <i\n class=\"{{ requirement.contextualColor }}\"\n [c8yIcon]=\"requirement.icon\"\n ></i>\n <span\n class=\"m-l-4 small {{ requirement.textColor }}\"\n [translate]=\"requirement.label\"\n [translateParams]=\"this.translateParams\"\n ></span>\n </li>\n }\n </ul>\n\n <div class=\"m-b-8\">\n {{ 'We recommend you to meet these conditions for a stronger password:' | translate }}\n </div>\n <ul class=\"list-unstyled\">\n @if (recommendedMinLengthCheck) {\n <li class=\"small d-flex\">\n <i\n class=\"{{ recommendedMinLengthCheck.contextualColor }}\"\n [c8yIcon]=\"recommendedMinLengthCheck.icon\"\n ></i>\n <span\n class=\"m-l-4 small {{ recommendedMinLengthCheck.textColor }}\"\n [translate]=\"recommendedMinLengthCheck.label\"\n [translateParams]=\"this.translateParams\"\n ></span>\n </li>\n }\n @for (requirement of enhancedStrengthCheckList; track requirement.label) {\n <li class=\"small d-flex\">\n <i\n class=\"{{ requirement.contextualColor }}\"\n [c8yIcon]=\"requirement.icon\"\n ></i>\n <span\n class=\"m-l-4 small {{ requirement.textColor }}\"\n [translate]=\"requirement.label\"\n [translateParams]=\"this.translateParams\"\n ></span>\n </li>\n }\n </ul>\n}\n" }]
20980
+ }], ctorParameters: () => [{ type: PasswordStrengthService }, { type: PasswordService }], propDecorators: { strengthEnforced: [{
20838
20981
  type: Input
20839
20982
  }], password: [{
20840
- type: Input,
20841
- args: ['password']
20983
+ type: Input
20984
+ }], greenMinLength: [{
20985
+ type: Input
20842
20986
  }], onRequirementsFulfilled: [{
20843
20987
  type: Output
20844
20988
  }] } });
20845
20989
 
20846
20990
  class NewPasswordComponent {
20991
+ /**
20992
+ * Returns effective min length for validation:
20993
+ * - When enforceStrength=true: use greenMinLength (or default 8)
20994
+ * - When enforceStrength=false: always use default 8
20995
+ */
20996
+ get effectiveMinLength() {
20997
+ return this.passwordEnforced
20998
+ ? this.minlength || this.DEFAULT_MIN_LENGTH
20999
+ : this.DEFAULT_MIN_LENGTH;
21000
+ }
20847
21001
  set _newPasswordModel(ngModel) {
20848
21002
  if (ngModel) {
20849
21003
  this.newPasswordModel = ngModel;
20850
21004
  ngModel.control.addValidators(this.passwordChecklistValidator);
20851
21005
  }
20852
21006
  }
20853
- constructor(passwordStrength, cdRef, elementRef) {
21007
+ constructor(passwordStrength, passwordValidation, cdRef, elementRef) {
20854
21008
  this.passwordStrength = passwordStrength;
21009
+ this.passwordValidation = passwordValidation;
20855
21010
  this.cdRef = cdRef;
20856
21011
  this.elementRef = elementRef;
20857
21012
  this.password = new EventEmitter();
@@ -20859,13 +21014,22 @@ class NewPasswordComponent {
20859
21014
  this.model = {};
20860
21015
  this.changePassword = false;
20861
21016
  this.passwordEnforced = false;
20862
- this.passwordChecklistValidator = () => this.requirementsFulfilled ? null : { passwordStrengthChecklist: true };
21017
+ this.DEFAULT_MIN_LENGTH = 8;
21018
+ // Only enforce checklist validation when password strength is enforced.
21019
+ // When not enforced, checklist is just informational/recommendations.
21020
+ this.passwordChecklistValidator = control => !this.passwordEnforced || this.requirementsFulfilled || !control.value
21021
+ ? null
21022
+ : { passwordStrengthChecklist: true };
20863
21023
  }
20864
- ngOnInit() {
20865
- this.loadPasswordStrengthSettings();
20866
- this.passwordStrength.getGreenMinLength().then(value => {
20867
- this.minlength = value;
20868
- });
21024
+ async ngOnInit() {
21025
+ try {
21026
+ await this.loadPasswordStrengthSettings();
21027
+ this.minlength = await this.passwordStrength.getGreenMinLength();
21028
+ }
21029
+ catch (e) {
21030
+ this.passwordEnforced = false;
21031
+ this.minlength = this.DEFAULT_MIN_LENGTH;
21032
+ }
20869
21033
  }
20870
21034
  async ngOnChanges(changes) {
20871
21035
  if (changes.showChangePasswordButton) {
@@ -20884,12 +21048,29 @@ class NewPasswordComponent {
20884
21048
  updateValidity(requirementsFulfilled) {
20885
21049
  this.requirementsFulfilled = requirementsFulfilled;
20886
21050
  this.cdRef.detectChanges();
21051
+ if (!this.newPasswordModel) {
21052
+ return;
21053
+ }
20887
21054
  this.newPasswordModel.control.updateValueAndValidity();
20888
- // There are two validators checking password validity, but we only want to show one of these errors at a time,
20889
- // where checklist validator takes priority.
20890
- if (!this.requirementsFulfilled) {
20891
- delete this.newPasswordModel.control.errors['password'];
21055
+ const errors = this.newPasswordModel.control.errors;
21056
+ if (!errors || !this.passwordEnforced) {
21057
+ return;
21058
+ }
21059
+ // Check if password has invalid characters (pattern error should take priority)
21060
+ const password = this.model.newPassword || '';
21061
+ const hasInvalidChars = password && !this.passwordValidation.hasValidCharsOnly(password);
21062
+ const filteredErrors = { ...errors };
21063
+ if (!this.requirementsFulfilled && !hasInvalidChars) {
21064
+ // Checklist not fulfilled AND no invalid chars - show checklist error, hide pattern errors
21065
+ delete filteredErrors['password'];
21066
+ delete filteredErrors['passwordSimple'];
21067
+ }
21068
+ else if (filteredErrors['password'] || filteredErrors['passwordSimple']) {
21069
+ // Pattern error (invalid chars or checklist fulfilled) - show pattern error, hide checklist
21070
+ delete filteredErrors['passwordStrengthChecklist'];
20892
21071
  }
21072
+ const remaining = Object.keys(filteredErrors).length ? filteredErrors : null;
21073
+ this.newPasswordModel.control.setErrors(remaining);
20893
21074
  }
20894
21075
  async loadPasswordStrengthSettings() {
20895
21076
  if (this.requireStrongPassword) {
@@ -20909,23 +21090,22 @@ class NewPasswordComponent {
20909
21090
  this.model = {};
20910
21091
  }
20911
21092
  }
20912
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.19", ngImport: i0, type: NewPasswordComponent, deps: [{ token: PasswordStrengthService }, { token: i0.ChangeDetectorRef }, { token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component }); }
20913
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.19", type: NewPasswordComponent, isStandalone: true, selector: "c8y-new-password", inputs: { showChangePasswordButton: "showChangePasswordButton", requireStrongPassword: "requireStrongPassword" }, outputs: { password: "password" }, viewQueries: [{ propertyName: "_newPasswordModel", first: true, predicate: ["newPassword"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div *ngIf=\"showChangePasswordButton\" class=\"form-group\">\n <button\n class=\"btn btn-default\"\n type=\"button\"\n (click)=\"toggleChangePassword()\"\n data-cy=\"c8y-new-password--change-button\"\n >\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\n class=\"row content-flex-50\"\n *ngIf=\"changePassword\"\n>\n <div class=\"col-6\">\n <c8y-form-group>\n <label\n for=\"newPassword\"\n translate\n >\n Password\n </label>\n <c8y-password-input\n name=\"newPassword\"\n required\n [id]=\"'newPassword'\"\n #newPassword=\"ngModel\"\n [(ngModel)]=\"model.newPassword\"\n (change)=\"newPasswordChanged()\"\n (input)=\"newPasswordConfirm.control.updateValueAndValidity()\"\n c8yDefaultValidation=\"password\"\n [autocomplete]=\"'new-password'\"\n ></c8y-password-input>\n </c8y-form-group>\n\n <c8y-form-group>\n <label\n for=\"newConfirmPassword\"\n translate\n >\n Confirm password\n </label>\n <c8y-password-input\n name=\"newPasswordConfirm\"\n required\n [id]=\"'newConfirmPassword'\"\n #newPasswordConfirm=\"ngModel\"\n [(ngModel)]=\"model.newPasswordConfirm\"\n passwordConfirm=\"newPassword\"\n [autocomplete]=\"'new-password'\"\n ></c8y-password-input>\n </c8y-form-group>\n </div>\n <div class=\"col-6\">\n <c8y-password-check-list\n [password]=\"model.newPassword\"\n [strengthEnforced]=\"passwordEnforced\"\n (onRequirementsFulfilled)=\"updateValidity($event)\"\n ></c8y-password-check-list>\n </div>\n</div>\n", dependencies: [{ kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: FormGroupComponent, selector: "c8y-form-group", inputs: ["hasError", "hasWarning", "hasSuccess", "novalidation", "status"] }, { kind: "directive", type: C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "component", type: PasswordInputComponent, selector: "c8y-password-input", inputs: ["id", "autocomplete", "large"] }, { kind: "ngmodule", type: FormsModule$1 }, { kind: "directive", type: i1$8.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$8.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i1$8.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: DefaultValidationDirective, selector: "[c8yDefaultValidation]", inputs: ["c8yDefaultValidation"] }, { kind: "directive", type: PasswordConfirm, selector: "[passwordConfirm]" }, { kind: "component", type: PasswordCheckListComponent, selector: "c8y-password-check-list", inputs: ["strengthEnforced", "password"], outputs: ["onRequirementsFulfilled"] }, { kind: "pipe", type: C8yTranslatePipe, name: "translate" }], viewProviders: [{ provide: ControlContainer, useExisting: NgForm }] }); }
21093
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.19", ngImport: i0, type: NewPasswordComponent, deps: [{ token: PasswordStrengthService }, { token: PasswordValidationService }, { token: i0.ChangeDetectorRef }, { token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component }); }
21094
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.19", type: NewPasswordComponent, isStandalone: true, selector: "c8y-new-password", inputs: { showChangePasswordButton: "showChangePasswordButton", requireStrongPassword: "requireStrongPassword" }, outputs: { password: "password" }, viewQueries: [{ propertyName: "_newPasswordModel", first: true, predicate: ["newPassword"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "@if (showChangePasswordButton) {\n <div class=\"form-group\">\n <button\n class=\"btn btn-default\"\n type=\"button\"\n (click)=\"toggleChangePassword()\"\n data-cy=\"c8y-new-password--change-button\"\n >\n @if (!changePassword) {\n {{ 'Change password' | translate }}\n } @else {\n {{ 'Cancel password change' | translate }}\n }\n </button>\n </div>\n}\n\n@if (changePassword) {\n <div class=\"row content-flex-50\">\n <div class=\"col-6\">\n <c8y-form-group>\n <label\n for=\"newPassword\"\n translate\n >\n Password\n </label>\n <c8y-password-input\n name=\"newPassword\"\n required\n [id]=\"'newPassword'\"\n #newPassword=\"ngModel\"\n [(ngModel)]=\"model.newPassword\"\n (change)=\"newPasswordChanged()\"\n (input)=\"newPasswordConfirm.control.updateValueAndValidity()\"\n c8yPasswordValidation\n [passwordStrengthEnforced]=\"passwordEnforced\"\n [minLength]=\"effectiveMinLength\"\n [autocomplete]=\"'new-password'\"\n ></c8y-password-input>\n </c8y-form-group>\n\n <c8y-form-group>\n <label\n for=\"newConfirmPassword\"\n translate\n >\n Confirm password\n </label>\n <c8y-password-input\n name=\"newPasswordConfirm\"\n required\n [id]=\"'newConfirmPassword'\"\n #newPasswordConfirm=\"ngModel\"\n [(ngModel)]=\"model.newPasswordConfirm\"\n passwordConfirm=\"newPassword\"\n [autocomplete]=\"'new-password'\"\n ></c8y-password-input>\n </c8y-form-group>\n </div>\n <div class=\"col-6\">\n <c8y-password-check-list\n [password]=\"model.newPassword\"\n [strengthEnforced]=\"passwordEnforced\"\n (onRequirementsFulfilled)=\"updateValidity($event)\"\n ></c8y-password-check-list>\n </div>\n </div>\n}\n", dependencies: [{ kind: "component", type: FormGroupComponent, selector: "c8y-form-group", inputs: ["hasError", "hasWarning", "hasSuccess", "novalidation", "status"] }, { kind: "directive", type: C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "component", type: PasswordInputComponent, selector: "c8y-password-input", inputs: ["id", "autocomplete", "large"] }, { kind: "ngmodule", type: FormsModule$1 }, { kind: "directive", type: i1$8.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$8.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i1$8.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: PasswordValidationDirective, selector: "[c8yPasswordValidation]", inputs: ["passwordStrengthEnforced", "minLength"] }, { kind: "directive", type: PasswordConfirm, selector: "[passwordConfirm]" }, { kind: "component", type: PasswordCheckListComponent, selector: "c8y-password-check-list", inputs: ["strengthEnforced", "password", "greenMinLength"], outputs: ["onRequirementsFulfilled"] }, { kind: "pipe", type: C8yTranslatePipe, name: "translate" }], viewProviders: [{ provide: ControlContainer, useExisting: NgForm }] }); }
20914
21095
  }
20915
21096
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.19", ngImport: i0, type: NewPasswordComponent, decorators: [{
20916
21097
  type: Component,
20917
21098
  args: [{ selector: 'c8y-new-password', viewProviders: [{ provide: ControlContainer, useExisting: NgForm }], standalone: true, imports: [
20918
- NgIf,
20919
21099
  FormGroupComponent,
20920
21100
  C8yTranslateDirective,
20921
21101
  PasswordInputComponent,
20922
21102
  FormsModule$1,
20923
- DefaultValidationDirective,
21103
+ PasswordValidationDirective,
20924
21104
  PasswordConfirm,
20925
21105
  PasswordCheckListComponent,
20926
21106
  C8yTranslatePipe
20927
- ], template: "<div *ngIf=\"showChangePasswordButton\" class=\"form-group\">\n <button\n class=\"btn btn-default\"\n type=\"button\"\n (click)=\"toggleChangePassword()\"\n data-cy=\"c8y-new-password--change-button\"\n >\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\n class=\"row content-flex-50\"\n *ngIf=\"changePassword\"\n>\n <div class=\"col-6\">\n <c8y-form-group>\n <label\n for=\"newPassword\"\n translate\n >\n Password\n </label>\n <c8y-password-input\n name=\"newPassword\"\n required\n [id]=\"'newPassword'\"\n #newPassword=\"ngModel\"\n [(ngModel)]=\"model.newPassword\"\n (change)=\"newPasswordChanged()\"\n (input)=\"newPasswordConfirm.control.updateValueAndValidity()\"\n c8yDefaultValidation=\"password\"\n [autocomplete]=\"'new-password'\"\n ></c8y-password-input>\n </c8y-form-group>\n\n <c8y-form-group>\n <label\n for=\"newConfirmPassword\"\n translate\n >\n Confirm password\n </label>\n <c8y-password-input\n name=\"newPasswordConfirm\"\n required\n [id]=\"'newConfirmPassword'\"\n #newPasswordConfirm=\"ngModel\"\n [(ngModel)]=\"model.newPasswordConfirm\"\n passwordConfirm=\"newPassword\"\n [autocomplete]=\"'new-password'\"\n ></c8y-password-input>\n </c8y-form-group>\n </div>\n <div class=\"col-6\">\n <c8y-password-check-list\n [password]=\"model.newPassword\"\n [strengthEnforced]=\"passwordEnforced\"\n (onRequirementsFulfilled)=\"updateValidity($event)\"\n ></c8y-password-check-list>\n </div>\n</div>\n" }]
20928
- }], ctorParameters: () => [{ type: PasswordStrengthService }, { type: i0.ChangeDetectorRef }, { type: i0.ElementRef }], propDecorators: { password: [{
21107
+ ], template: "@if (showChangePasswordButton) {\n <div class=\"form-group\">\n <button\n class=\"btn btn-default\"\n type=\"button\"\n (click)=\"toggleChangePassword()\"\n data-cy=\"c8y-new-password--change-button\"\n >\n @if (!changePassword) {\n {{ 'Change password' | translate }}\n } @else {\n {{ 'Cancel password change' | translate }}\n }\n </button>\n </div>\n}\n\n@if (changePassword) {\n <div class=\"row content-flex-50\">\n <div class=\"col-6\">\n <c8y-form-group>\n <label\n for=\"newPassword\"\n translate\n >\n Password\n </label>\n <c8y-password-input\n name=\"newPassword\"\n required\n [id]=\"'newPassword'\"\n #newPassword=\"ngModel\"\n [(ngModel)]=\"model.newPassword\"\n (change)=\"newPasswordChanged()\"\n (input)=\"newPasswordConfirm.control.updateValueAndValidity()\"\n c8yPasswordValidation\n [passwordStrengthEnforced]=\"passwordEnforced\"\n [minLength]=\"effectiveMinLength\"\n [autocomplete]=\"'new-password'\"\n ></c8y-password-input>\n </c8y-form-group>\n\n <c8y-form-group>\n <label\n for=\"newConfirmPassword\"\n translate\n >\n Confirm password\n </label>\n <c8y-password-input\n name=\"newPasswordConfirm\"\n required\n [id]=\"'newConfirmPassword'\"\n #newPasswordConfirm=\"ngModel\"\n [(ngModel)]=\"model.newPasswordConfirm\"\n passwordConfirm=\"newPassword\"\n [autocomplete]=\"'new-password'\"\n ></c8y-password-input>\n </c8y-form-group>\n </div>\n <div class=\"col-6\">\n <c8y-password-check-list\n [password]=\"model.newPassword\"\n [strengthEnforced]=\"passwordEnforced\"\n (onRequirementsFulfilled)=\"updateValidity($event)\"\n ></c8y-password-check-list>\n </div>\n </div>\n}\n" }]
21108
+ }], ctorParameters: () => [{ type: PasswordStrengthService }, { type: PasswordValidationService }, { type: i0.ChangeDetectorRef }, { type: i0.ElementRef }], propDecorators: { password: [{
20929
21109
  type: Output
20930
21110
  }], showChangePasswordButton: [{
20931
21111
  type: Input
@@ -23408,7 +23588,9 @@ class PasswordStrengthCheckerService {
23408
23588
  return password.search(/[0-9]/) !== -1;
23409
23589
  }
23410
23590
  hasSpecialChars(password) {
23411
- return password.search(/[^0-9a-zA-Z]+/) !== -1;
23591
+ // Only match ALLOWED symbols, not any non-alphanumeric character
23592
+ // Allowed: `~!@#$%^&*()_|+-=?;:'",.<>{}[]\\/
23593
+ return password.search(/[`~!@#$%^&*()_|+\-=?;:'",.<>{}\[\]\\/]/) !== -1;
23412
23594
  }
23413
23595
  getStrengthColor(password) {
23414
23596
  const passwordStrength = filter$2([
@@ -38212,5 +38394,5 @@ function colorValidator(allowedModes) {
38212
38394
  * Generated bundle index. Do not edit.
38213
38395
  */
38214
38396
 
38215
- export { ACTIONS_STEPPER, AGGREGATIONS, AGGREGATION_ICONS, AGGREGATION_LABELS, AGGREGATION_LIMITS, AGGREGATION_TEXTS, AGGREGATION_VALUES, AGGREGATION_VALUES_ARR, ARRAY_VALIDATION_PREFIX, ASSET_PATH, AbstractConfigurationStrategy, ActionBarComponent, ActionBarItemComponent, ActionBarModule, ActionBarService, ActionComponent, ActionControlsExtensionService, ActionModule, ActionOutletComponent, ActionService, AggregationPickerComponent, AggregationService, AlarmRealtimeService, AlarmWithChildrenRealtimeService, AlertComponent, AlertDetailsComponent, AlertModule, AlertOutletBase, AlertOutletComponent, AlertService, AlertTextComponent, AppHrefPipe, AppIconComponent, AppStateService, AppSwitcherComponent, AppSwitcherInlineComponent, AppSwitcherService, ApplicationModule, ApplicationPluginStatus, AssetLinkPipe, AssetPropertyService, AssetTypesRealtimeService, AssetTypesService, AuditLogComponent, AuditLogModule, AuthenticationModule, BackendVersionFactory, BaseColumn, BaseFilteringFormRendererComponent, BooleanFilterMapper, BootstrapComponent, BootstrapModule, BottomDrawerComponent, BottomDrawerRef, BottomDrawerService, BreadcrumbComponent, BreadcrumbItemComponent, BreadcrumbModule, BreadcrumbOutletComponent, BreadcrumbService, BuiltInActionType, BytesPipe, C8Y_PLUGIN_CONTEXT_PATH, C8Y_PLUGIN_NAME, C8yComponentOutlet, C8yJSONSchema, C8yStepper, C8yStepperButtons, C8yStepperIcon, C8yStepperProgress, C8yTranslateDirective, C8yTranslateModule, C8yTranslatePipe, C8yTranslationCache, C8yTranslationLoader, C8yValidators, CUSTOM, CachedLocaleDictionaryService, CellRendererComponent, CellRendererContext, CellRendererDefDirective, ChangeCurrentUserPasswordService, ChangeIconComponent, ClipboardModule, ClipboardService, ColorInputComponent, ColorService, ColumnDirective, CommonModule, ConditionalTabsOutletComponent, ConfigureCustomColumnComponent, ConfirmModalComponent, ContextRouteComponent, ContextRouteGuard, ContextRouteService, CookieBannerComponent, CopyDashboardDisabledReason, CoreModule, CoreSearchModule, CountdownIntervalComponent, CountdownIntervalModule, CurrentPasswordModalComponent, CustomColumn, CustomTranslateService, CustomTranslateStore, DATA_GRID_CONFIGURATION_CONTEXT, DATA_GRID_CONFIGURATION_CONTEXT_PROVIDER, DATA_GRID_CONFIGURATION_STRATEGY, DEFAULT_INTERVAL_STATE, DEFAULT_INTERVAL_VALUE, DEFAULT_INTERVAL_VALUES, DRAWER_ANIMATION_TIME, DashboardChildActionComponent, DashboardChildChange, DashboardChildComponent, DashboardChildTitleComponent, DashboardComponent, DashboardModule, DataGridComponent, DataGridModule, DataGridService, DatapointLibraryValidationErrors, DatapointSyncService, DateContextQueryParamNames, DateFilterMapper, DateFormatService, DatePickerComponent, DatePickerModule, DatePipe, DateTimePickerComponent, DateTimePickerModule, DefaultValidationDirective, DeviceBootstrapRealtimeService, DeviceService, DeviceStatusComponent, DeviceStatusModule, DismissAlertStrategy, DocsModule, DocsService, DrawerModule, DrawerOutletComponent, DrawerService, DropAreaComponent, DropAreaModule, DropdownDirectionDirective, DynamicBulkDetailsResolver, DynamicBulkIIdentifiedResolver, DynamicComponentAlert, DynamicComponentAlertAggregator, DynamicComponentAlertsComponent, DynamicComponentComponent, DynamicComponentErrorStrategy, DynamicComponentModule, DynamicComponentService, DynamicDatapointsResolver, DynamicFormsModule, DynamicManagedObjectResolver, DynamicResolverService, ES_MAX_TIME_MILLISECONDS, EmailsValidatorDirective, EmptyComponent, EmptyStateComponent, EmptyStateContextDirective, EventRealtimeService, ExpandableRowDirective, ExtensionPointForPlugins, ExtensionPointWithoutStateForPlugins, ExtractArrayValidationErrorsPipe, FeatureCacheService, FeedbackFormComponent, FilePickerComponent, FilePickerFormControlComponent, FilePickerFormControlModule, FilePickerModule, FilesService, FilterByPipe, FilterInputComponent, FilterMapperFactory, FilterMapperModule, FilterMapperPipe, FilterMapperService, FilterNonArrayValidationErrorsPipe, FilteringActionType, FilteringFormRendererComponent, FilteringFormRendererContext, FilteringFormRendererDefDirective, ForOfDirective, FormGroupComponent, FormsModule, GENERIC_FILE_TYPE, GLOBAL_CONTEXT_AUTO_REFRESH, GainsightService, GenericFileIconPipe, GeoService, GetGroupIconPipe, GlobalConfigService, GridDataSource, GroupFragment, GroupService, GroupedFilterChips, GuideDocsComponent, GuideHrefDirective, HOOK_ACTION, HOOK_ACTION_BAR, HOOK_BREADCRUMB, HOOK_COMPONENTS, HOOK_CURRENT_APPLICATION, HOOK_CURRENT_TENANT, HOOK_CURRENT_USER, HOOK_DOCS, HOOK_DYNAMIC_PROVIDER_CONFIG, HOOK_NAVIGATOR_NODES, HOOK_OPTIONS, HOOK_PATTERN_MESSAGES, HOOK_PLUGIN, HOOK_PREVIEW, HOOK_QUERY_PARAM, HOOK_QUERY_PARAM_BOTTOM_DRAWER, HOOK_QUERY_PARAM_MODAL, HOOK_ROUTE, HOOK_SEARCH, HOOK_STEPPER, HOOK_TABS, HOOK_VERSION, HOOK_WIZARD, HeaderBarComponent, HeaderCellRendererDefDirective, HeaderModule, HeaderService, HelpComponent, HelpModule, HighlightComponent, HookProviderTypes, HumanizeAppNamePipe, HumanizePipe, HumanizeValidationMessagePipe, I18nModule, INTERVAL_OPTIONS, IconDirective, IfAllowedDirective, InjectionType, InputGroupListComponent, InputGroupListContainerDirective, InterAppService, IntervalBasedReload, InventorySearchService, IpRangeInputListComponent, JsonValidationPrettifierDirective, LANGUAGES, LAST_DAY, LAST_HOUR, LAST_MINUTE, LAST_MONTH, LAST_WEEK, LOCALE_PATH, LegacyGridConfigMapperService, LegendFieldWrapper, ListDisplaySwitchComponent, ListDisplaySwitchModule, ListGroupComponent, ListGroupModule, ListItemActionComponent, ListItemBodyComponent, ListItemCheckboxComponent, ListItemCollapseComponent, ListItemComponent, ListItemDragHandleComponent, ListItemFooterComponent, ListItemIconComponent, ListItemRadioComponent, ListItemTimelineComponent, LoadMoreComponent, LoadingComponent, MAX_PAGE_SIZE, MESSAGES_CORE_I18N, MOChunkLoaderService, ManagedObjectRealtimeService, ManagedObjectType, MapFunctionPipe, MarkdownToHtmlPipe, MaxValidationDirective, MeasurementRealtimeService, MessageBannerService, MessageDirective, MessagesComponent, MinValidationDirective, MissingTranslationCustomHandler, MoNamePipe, ModalComponent, ModalModule, ModalSelectionMode, ModalService, NEEDED_ROLE_FOR_SETUP, NEW_DASHBOARD_ROUTER_STATE_PROP, NULL_VALUE_PLACEHOLDER, NUMBER_FORMAT_REGEXP, NameTransformPipe, NavigatorBottomModule, NavigatorIconComponent, NavigatorModule, NavigatorNode, NavigatorNodeComponent, NavigatorNodeRoot, NavigatorOutletComponent, NavigatorService, NavigatorTopModule, NewPasswordComponent, NumberPipe, OperationBulkRealtimeService, OperationRealtimeService, OperationResultComponent, OptionsService, OutletDirective, PREVIEW_FEATURE_PROVIDERS, PRODUCT_EXPERIENCE_EVENT_SOURCE, PX_ACTIONS, PX_EVENT_NAME, PackageType, PasswordCheckListComponent, PasswordConfirm, PasswordConfirmModalComponent, PasswordInputComponent, PasswordService, PasswordStrengthCheckerService, PasswordStrengthComponent, PasswordStrengthService, PatternMessagesService, Permissions, PhoneValidationDirective, PlatformDetailsService, PluginLoadedPipe, PluginsExportScopes, PluginsLoaderService, PluginsModule, PluginsResolveService, PluginsService, PopoverConfirmComponent, PreviewFeatureButtonComponent, PreviewFeatureShowNotification, PreviewService, ProductExperienceDirective, ProductExperienceModule, ProgressBarComponent, PropertiesListComponent, PropertiesListModule, PropertyValueTransformService, ProviderConfigurationComponent, ProviderConfigurationModule, ProviderConfigurationNodeFactory, ProviderConfigurationRouteFactory, ProviderConfigurationService, ProviderDefinitionsService, PushStatus, PushStatusLabels, QUERY_PARAM_HANDLER_PROVIDERS, QueryParamBottomDrawerFactory, QueryParamBottomDrawerStateService, QueryParamHandlerService, QueryParamModalFactory, QueryParamModalStateService, QuickLinkComponent, QuickLinkModule, RESOLVING_COMPONENT_WAIT_TIME, RadioFilterMapper, RangeComponent, RangeDirective, RangeDisplayComponent, RangeDisplayModule, RealtimeButtonComponent, RealtimeControlComponent, RealtimeMessage, RealtimeModule, RealtimeService, RealtimeSubjectService, RelativeTimePipe, RequiredInputPlaceholderDirective, ResizableGridComponent, ResolverServerError, RouterModule, RouterService, RouterTabsResolver, SETUP_FINISHED_STEP_ID, SHOW_PREVIEW_FEATURES, SearchComponent, SearchFilters, SearchInputComponent, SearchOutletComponent, SearchResultEmptyComponent, SearchService, SelectComponent, SelectFilterMapper, SelectItemDirective, SelectKeyboardService, SelectLegacyComponent, SelectModalComponent, SelectModalFilterPipe, SelectModalModule, SelectModule, SelectedItemsComponent, SelectedItemsDirective, SendStatus, SendStatusLabels, ServiceRegistry, SetupCompletedComponent, SetupComponent, SetupModule, SetupService, SetupState, SetupStepperFactory, ShortenUserNamePipe, ShouldShowMoPipe, ShowIfFilterPipe, SimpleJsonPathValidatorDirective, SimplifiedAuthService, SkipLinkDirective, StateService, Status, StepperModule, StepperOutletComponent, StepperService, Steppers, StringFilterMapper, StringifyObjectPipe, SupportedApps, TabComponent, TabsModule, TabsOutletComponent, TabsService, TabsetAriaDirective, TenantUiService, TextAreaRowHeightDirective, TextareaAutoresizeDirective, ThemeSwitcherService, TimeIntervalComponent, TimePickerComponent, TimePickerModule, TitleComponent, TitleOutletComponent, TotpChallengeComponent, TotpSetupComponent, TranslateService, TreeNodeCellRendererComponent, TreeNodeColumn, TreeNodeHeaderCellRendererComponent, TypeaheadComponent, TypeaheadFilterMapper, UiSettingsComponent, UiSettingsModule, UniqueInCollectionByPathValidationDirective, UserEditComponent, UserEditModalComponent, UserEngagementsService, UserMenuItemComponent, UserMenuOutletComponent, UserMenuService, UserModule, UserNameInitialsPipe, UserPreferencesConfigurationStrategy, UserPreferencesService, UserPreferencesStorageInventory, UserPreferencesStorageLocal, UserTotpRevokeComponent, UserTotpSetupComponent, VERSION_MODULE_CONFIG, ValidationPattern, VersionListComponent, VersionModule, VersionService, ViewContext, ViewContextServices, VirtualScrollWindowDirective, VirtualScrollWindowStrategy, VirtualScrollerWrapperComponent, VisibleControlsPipe, WIDGET_CONFIGURATION_GRID_SIZE, WIDGET_TYPE_VALUES, WILDCARD_SEARCH_FEATURE_KEY, WebSDKVersionFactory, WidgetGlobalAutoRefreshService, WidgetTimeContextActionBarPriority, WidgetTimeContextComponent, WidgetTimeContextDateRangeService, WidgetTimeContextMediatorService, WidgetsDashboardComponent, WidgetsDashboardEventService, WizardBodyComponent, WizardComponent, WizardFooterComponent, WizardHeaderComponent, WizardModalService, WizardModule, WizardOutletComponent, WizardService, ZipService, _virtualScrollWindowStrategyFactory, alertOnError, allEntriesAreEqual, asyncValidateArrayElements, colorValidator, deviceAvailabilityIconMap, extraRoutes, fromFactories, fromTrigger, fromTriggerOnce, getActivatedRoute, getAngularLocalesLanguageString, getBasicInputArrayFormFieldConfig, getDictionaryWithTrimmedKeys, getInjectedHooks, gettext, globalAutoRefreshLoading, hookAction, hookActionBar, hookBreadcrumb, hookComponent, hookCurrentApplication, hookCurrentTenant, hookCurrentUser, hookDataGridActionControls, hookDocs, hookDrawer, hookDynamicProviderConfig, hookFilterMapper, hookGeneric, hookNavigator, hookOptions, hookPatternMessages, hookPlugin, hookPreview, hookQueryParam, hookQueryParamBottomDrawer, hookQueryParamModal, hookRoute, hookSearch, hookService, hookStepper, hookTab, hookUserMenu, hookVersion, hookWidget, hookWizard, internalApps, isEagerDynamicComponents, isExtensionFactory, isLazyDynamicComponents, isPromise, languagesFactory, loadLocale, localeId, localePathFactory, memoize, minColumnGridTrackSize, operationStatusClasses, operationStatusIcons, provideBootstrapMetadata, provideCommonPipes, provideCommonServices, provideDefaultOptionsAppInitializer, provideI18n, provideLanguageSelectorAppInitializer, providePluginsLoaderServiceAppInitializer, provideTranslationServiceInstance, ratiosByColumnTypes, removeContextIndicators, removeDuplicatesIds, resolveInjectedFactories, retryWithDelay, simpleJsonPathValidator, sortByPriority, stateToFactory, statusAlert, statusClasses, statusIcons, throttle, toObservable, toObservableOfArrays, tooltips, trimTranslationKey, uniqueInCollectionByPathValidator, validateArrayElements, validateInternationalPhoneNumber, viewContextRoutes, wrapperLegendFieldConfig };
38397
+ export { ACTIONS_STEPPER, AGGREGATIONS, AGGREGATION_ICONS, AGGREGATION_LABELS, AGGREGATION_LIMITS, AGGREGATION_TEXTS, AGGREGATION_VALUES, AGGREGATION_VALUES_ARR, ARRAY_VALIDATION_PREFIX, ASSET_PATH, AbstractConfigurationStrategy, ActionBarComponent, ActionBarItemComponent, ActionBarModule, ActionBarService, ActionComponent, ActionControlsExtensionService, ActionModule, ActionOutletComponent, ActionService, AggregationPickerComponent, AggregationService, AlarmRealtimeService, AlarmWithChildrenRealtimeService, AlertComponent, AlertDetailsComponent, AlertModule, AlertOutletBase, AlertOutletComponent, AlertService, AlertTextComponent, AppHrefPipe, AppIconComponent, AppStateService, AppSwitcherComponent, AppSwitcherInlineComponent, AppSwitcherService, ApplicationModule, ApplicationPluginStatus, AssetLinkPipe, AssetPropertyService, AssetTypesRealtimeService, AssetTypesService, AuditLogComponent, AuditLogModule, AuthenticationModule, BackendVersionFactory, BaseColumn, BaseFilteringFormRendererComponent, BooleanFilterMapper, BootstrapComponent, BootstrapModule, BottomDrawerComponent, BottomDrawerRef, BottomDrawerService, BreadcrumbComponent, BreadcrumbItemComponent, BreadcrumbModule, BreadcrumbOutletComponent, BreadcrumbService, BuiltInActionType, BytesPipe, C8Y_PLUGIN_CONTEXT_PATH, C8Y_PLUGIN_NAME, C8yComponentOutlet, C8yJSONSchema, C8yStepper, C8yStepperButtons, C8yStepperIcon, C8yStepperProgress, C8yTranslateDirective, C8yTranslateModule, C8yTranslatePipe, C8yTranslationCache, C8yTranslationLoader, C8yValidators, CUSTOM, CachedLocaleDictionaryService, CellRendererComponent, CellRendererContext, CellRendererDefDirective, ChangeCurrentUserPasswordService, ChangeIconComponent, ClipboardModule, ClipboardService, ColorInputComponent, ColorService, ColumnDirective, CommonModule, ConditionalTabsOutletComponent, ConfigureCustomColumnComponent, ConfirmModalComponent, ContextRouteComponent, ContextRouteGuard, ContextRouteService, CookieBannerComponent, CopyDashboardDisabledReason, CoreModule, CoreSearchModule, CountdownIntervalComponent, CountdownIntervalModule, CurrentPasswordModalComponent, CustomColumn, CustomTranslateService, CustomTranslateStore, DATA_GRID_CONFIGURATION_CONTEXT, DATA_GRID_CONFIGURATION_CONTEXT_PROVIDER, DATA_GRID_CONFIGURATION_STRATEGY, DEFAULT_INTERVAL_STATE, DEFAULT_INTERVAL_VALUE, DEFAULT_INTERVAL_VALUES, DRAWER_ANIMATION_TIME, DashboardChildActionComponent, DashboardChildChange, DashboardChildComponent, DashboardChildTitleComponent, DashboardComponent, DashboardModule, DataGridComponent, DataGridModule, DataGridService, DatapointLibraryValidationErrors, DatapointSyncService, DateContextQueryParamNames, DateFilterMapper, DateFormatService, DatePickerComponent, DatePickerModule, DatePipe, DateTimePickerComponent, DateTimePickerModule, DefaultValidationDirective, DeviceBootstrapRealtimeService, DeviceService, DeviceStatusComponent, DeviceStatusModule, DismissAlertStrategy, DocsModule, DocsService, DrawerModule, DrawerOutletComponent, DrawerService, DropAreaComponent, DropAreaModule, DropdownDirectionDirective, DynamicBulkDetailsResolver, DynamicBulkIIdentifiedResolver, DynamicComponentAlert, DynamicComponentAlertAggregator, DynamicComponentAlertsComponent, DynamicComponentComponent, DynamicComponentErrorStrategy, DynamicComponentModule, DynamicComponentService, DynamicDatapointsResolver, DynamicFormsModule, DynamicManagedObjectResolver, DynamicResolverService, ES_MAX_TIME_MILLISECONDS, EmailsValidatorDirective, EmptyComponent, EmptyStateComponent, EmptyStateContextDirective, EventRealtimeService, ExpandableRowDirective, ExtensionPointForPlugins, ExtensionPointWithoutStateForPlugins, ExtractArrayValidationErrorsPipe, FeatureCacheService, FeedbackFormComponent, FilePickerComponent, FilePickerFormControlComponent, FilePickerFormControlModule, FilePickerModule, FilesService, FilterByPipe, FilterInputComponent, FilterMapperFactory, FilterMapperModule, FilterMapperPipe, FilterMapperService, FilterNonArrayValidationErrorsPipe, FilteringActionType, FilteringFormRendererComponent, FilteringFormRendererContext, FilteringFormRendererDefDirective, ForOfDirective, FormGroupComponent, FormsModule, GENERIC_FILE_TYPE, GLOBAL_CONTEXT_AUTO_REFRESH, GainsightService, GenericFileIconPipe, GeoService, GetGroupIconPipe, GlobalConfigService, GridDataSource, GroupFragment, GroupService, GroupedFilterChips, GuideDocsComponent, GuideHrefDirective, HOOK_ACTION, HOOK_ACTION_BAR, HOOK_BREADCRUMB, HOOK_COMPONENTS, HOOK_CURRENT_APPLICATION, HOOK_CURRENT_TENANT, HOOK_CURRENT_USER, HOOK_DOCS, HOOK_DYNAMIC_PROVIDER_CONFIG, HOOK_NAVIGATOR_NODES, HOOK_OPTIONS, HOOK_PATTERN_MESSAGES, HOOK_PLUGIN, HOOK_PREVIEW, HOOK_QUERY_PARAM, HOOK_QUERY_PARAM_BOTTOM_DRAWER, HOOK_QUERY_PARAM_MODAL, HOOK_ROUTE, HOOK_SEARCH, HOOK_STEPPER, HOOK_TABS, HOOK_VERSION, HOOK_WIZARD, HeaderBarComponent, HeaderCellRendererDefDirective, HeaderModule, HeaderService, HelpComponent, HelpModule, HighlightComponent, HookProviderTypes, HumanizeAppNamePipe, HumanizePipe, HumanizeValidationMessagePipe, I18nModule, INTERVAL_OPTIONS, IconDirective, IfAllowedDirective, InjectionType, InputGroupListComponent, InputGroupListContainerDirective, InterAppService, IntervalBasedReload, InventorySearchService, IpRangeInputListComponent, JsonValidationPrettifierDirective, LANGUAGES, LAST_DAY, LAST_HOUR, LAST_MINUTE, LAST_MONTH, LAST_WEEK, LOCALE_PATH, LegacyGridConfigMapperService, LegendFieldWrapper, ListDisplaySwitchComponent, ListDisplaySwitchModule, ListGroupComponent, ListGroupModule, ListItemActionComponent, ListItemBodyComponent, ListItemCheckboxComponent, ListItemCollapseComponent, ListItemComponent, ListItemDragHandleComponent, ListItemFooterComponent, ListItemIconComponent, ListItemRadioComponent, ListItemTimelineComponent, LoadMoreComponent, LoadingComponent, MAX_PAGE_SIZE, MESSAGES_CORE_I18N, MOChunkLoaderService, ManagedObjectRealtimeService, ManagedObjectType, MapFunctionPipe, MarkdownToHtmlPipe, MaxValidationDirective, MeasurementRealtimeService, MessageBannerService, MessageDirective, MessagesComponent, MinValidationDirective, MissingTranslationCustomHandler, MoNamePipe, ModalComponent, ModalModule, ModalSelectionMode, ModalService, NEEDED_ROLE_FOR_SETUP, NEW_DASHBOARD_ROUTER_STATE_PROP, NULL_VALUE_PLACEHOLDER, NUMBER_FORMAT_REGEXP, NameTransformPipe, NavigatorBottomModule, NavigatorIconComponent, NavigatorModule, NavigatorNode, NavigatorNodeComponent, NavigatorNodeRoot, NavigatorOutletComponent, NavigatorService, NavigatorTopModule, NewPasswordComponent, NumberPipe, OperationBulkRealtimeService, OperationRealtimeService, OperationResultComponent, OptionsService, OutletDirective, PREVIEW_FEATURE_PROVIDERS, PRODUCT_EXPERIENCE_EVENT_SOURCE, PX_ACTIONS, PX_EVENT_NAME, PackageType, PasswordCheckListComponent, PasswordConfirm, PasswordConfirmModalComponent, PasswordInputComponent, PasswordService, PasswordStrengthCheckerService, PasswordStrengthComponent, PasswordStrengthService, PasswordValidationDirective, PasswordValidationService, PatternMessagesService, Permissions, PhoneValidationDirective, PlatformDetailsService, PluginLoadedPipe, PluginsExportScopes, PluginsLoaderService, PluginsModule, PluginsResolveService, PluginsService, PopoverConfirmComponent, PreviewFeatureButtonComponent, PreviewFeatureShowNotification, PreviewService, ProductExperienceDirective, ProductExperienceModule, ProgressBarComponent, PropertiesListComponent, PropertiesListModule, PropertyValueTransformService, ProviderConfigurationComponent, ProviderConfigurationModule, ProviderConfigurationNodeFactory, ProviderConfigurationRouteFactory, ProviderConfigurationService, ProviderDefinitionsService, PushStatus, PushStatusLabels, QUERY_PARAM_HANDLER_PROVIDERS, QueryParamBottomDrawerFactory, QueryParamBottomDrawerStateService, QueryParamHandlerService, QueryParamModalFactory, QueryParamModalStateService, QuickLinkComponent, QuickLinkModule, RESOLVING_COMPONENT_WAIT_TIME, RadioFilterMapper, RangeComponent, RangeDirective, RangeDisplayComponent, RangeDisplayModule, RealtimeButtonComponent, RealtimeControlComponent, RealtimeMessage, RealtimeModule, RealtimeService, RealtimeSubjectService, RelativeTimePipe, RequiredInputPlaceholderDirective, ResizableGridComponent, ResolverServerError, RouterModule, RouterService, RouterTabsResolver, SETUP_FINISHED_STEP_ID, SHOW_PREVIEW_FEATURES, SearchComponent, SearchFilters, SearchInputComponent, SearchOutletComponent, SearchResultEmptyComponent, SearchService, SelectComponent, SelectFilterMapper, SelectItemDirective, SelectKeyboardService, SelectLegacyComponent, SelectModalComponent, SelectModalFilterPipe, SelectModalModule, SelectModule, SelectedItemsComponent, SelectedItemsDirective, SendStatus, SendStatusLabels, ServiceRegistry, SetupCompletedComponent, SetupComponent, SetupModule, SetupService, SetupState, SetupStepperFactory, ShortenUserNamePipe, ShouldShowMoPipe, ShowIfFilterPipe, SimpleJsonPathValidatorDirective, SimplifiedAuthService, SkipLinkDirective, StateService, Status, StepperModule, StepperOutletComponent, StepperService, Steppers, StringFilterMapper, StringifyObjectPipe, SupportedApps, TabComponent, TabsModule, TabsOutletComponent, TabsService, TabsetAriaDirective, TenantUiService, TextAreaRowHeightDirective, TextareaAutoresizeDirective, ThemeSwitcherService, TimeIntervalComponent, TimePickerComponent, TimePickerModule, TitleComponent, TitleOutletComponent, TotpChallengeComponent, TotpSetupComponent, TranslateService, TreeNodeCellRendererComponent, TreeNodeColumn, TreeNodeHeaderCellRendererComponent, TypeaheadComponent, TypeaheadFilterMapper, UiSettingsComponent, UiSettingsModule, UniqueInCollectionByPathValidationDirective, UserEditComponent, UserEditModalComponent, UserEngagementsService, UserMenuItemComponent, UserMenuOutletComponent, UserMenuService, UserModule, UserNameInitialsPipe, UserPreferencesConfigurationStrategy, UserPreferencesService, UserPreferencesStorageInventory, UserPreferencesStorageLocal, UserTotpRevokeComponent, UserTotpSetupComponent, VERSION_MODULE_CONFIG, ValidationPattern, VersionListComponent, VersionModule, VersionService, ViewContext, ViewContextServices, VirtualScrollWindowDirective, VirtualScrollWindowStrategy, VirtualScrollerWrapperComponent, VisibleControlsPipe, WIDGET_CONFIGURATION_GRID_SIZE, WIDGET_TYPE_VALUES, WILDCARD_SEARCH_FEATURE_KEY, WebSDKVersionFactory, WidgetGlobalAutoRefreshService, WidgetTimeContextActionBarPriority, WidgetTimeContextComponent, WidgetTimeContextDateRangeService, WidgetTimeContextMediatorService, WidgetsDashboardComponent, WidgetsDashboardEventService, WizardBodyComponent, WizardComponent, WizardFooterComponent, WizardHeaderComponent, WizardModalService, WizardModule, WizardOutletComponent, WizardService, ZipService, _virtualScrollWindowStrategyFactory, alertOnError, allEntriesAreEqual, asyncValidateArrayElements, colorValidator, deviceAvailabilityIconMap, extraRoutes, fromFactories, fromTrigger, fromTriggerOnce, getActivatedRoute, getAngularLocalesLanguageString, getBasicInputArrayFormFieldConfig, getDictionaryWithTrimmedKeys, getInjectedHooks, gettext, globalAutoRefreshLoading, hookAction, hookActionBar, hookBreadcrumb, hookComponent, hookCurrentApplication, hookCurrentTenant, hookCurrentUser, hookDataGridActionControls, hookDocs, hookDrawer, hookDynamicProviderConfig, hookFilterMapper, hookGeneric, hookNavigator, hookOptions, hookPatternMessages, hookPlugin, hookPreview, hookQueryParam, hookQueryParamBottomDrawer, hookQueryParamModal, hookRoute, hookSearch, hookService, hookStepper, hookTab, hookUserMenu, hookVersion, hookWidget, hookWizard, internalApps, isEagerDynamicComponents, isExtensionFactory, isLazyDynamicComponents, isPromise, languagesFactory, loadLocale, localeId, localePathFactory, memoize, minColumnGridTrackSize, operationStatusClasses, operationStatusIcons, provideBootstrapMetadata, provideCommonPipes, provideCommonServices, provideDefaultOptionsAppInitializer, provideI18n, provideLanguageSelectorAppInitializer, providePluginsLoaderServiceAppInitializer, provideTranslationServiceInstance, ratiosByColumnTypes, removeContextIndicators, removeDuplicatesIds, resolveInjectedFactories, retryWithDelay, simpleJsonPathValidator, sortByPriority, stateToFactory, statusAlert, statusClasses, statusIcons, throttle, toObservable, toObservableOfArrays, tooltips, trimTranslationKey, uniqueInCollectionByPathValidator, validateArrayElements, validateInternationalPhoneNumber, viewContextRoutes, wrapperLegendFieldConfig };
38216
38398
  //# sourceMappingURL=c8y-ngx-components.mjs.map