From 7921162d337d82a31a93cc8d6e017f90e670bcee Mon Sep 17 00:00:00 2001 From: Maksym Tsymbarov Date: Wed, 26 Nov 2025 15:52:06 +0200 Subject: [PATCH] cleanup --- .../login/create-password.component.html | 2 +- .../pages/login/create-password.component.ts | 37 ++++++------------- .../pages/login/reset-password.component.html | 2 +- .../pages/login/reset-password.component.ts | 35 ++++++------------ .../src/app/shared/models/password.models.ts | 24 ++---------- .../assets/locale/locale.constant-en_US.json | 6 --- 6 files changed, 30 insertions(+), 76 deletions(-) diff --git a/ui-ngx/src/app/modules/login/pages/login/create-password.component.html b/ui-ngx/src/app/modules/login/pages/login/create-password.component.html index 79b601d099..e3e43b6d29 100644 --- a/ui-ngx/src/app/modules/login/pages/login/create-password.component.html +++ b/ui-ngx/src/app/modules/login/pages/login/create-password.component.html @@ -42,7 +42,7 @@ formControlName="newPassword"/> lock - + {{ 'security.password-requirement.password-not-meet-requirements' | translate }} diff --git a/ui-ngx/src/app/modules/login/pages/login/create-password.component.ts b/ui-ngx/src/app/modules/login/pages/login/create-password.component.ts index e7aa68cba0..ec8a0efa0c 100644 --- a/ui-ngx/src/app/modules/login/pages/login/create-password.component.ts +++ b/ui-ngx/src/app/modules/login/pages/login/create-password.component.ts @@ -16,15 +16,11 @@ import { Component } from '@angular/core'; import { AuthService } from '@core/auth/auth.service'; -import { Store } from '@ngrx/store'; -import { AppState } from '@core/core.state'; import { PageComponent } from '@shared/components/page.component'; -import { UntypedFormBuilder, UntypedFormGroup, Validators } from '@angular/forms'; -import { TranslateService } from '@ngx-translate/core'; +import { FormBuilder, FormGroup, Validators } from '@angular/forms'; import { ActivatedRoute } from '@angular/router'; import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; import { UserPasswordPolicy } from '@shared/models/settings.models'; -import { combineLatest } from 'rxjs'; import { passwordsMatchValidator, passwordStrengthValidator @@ -37,26 +33,21 @@ import { }) export class CreatePasswordComponent extends PageComponent { - activateToken = ''; - createPassword: UntypedFormGroup; passwordPolicy: UserPasswordPolicy; + createPassword: FormGroup; - constructor(protected store: Store, - private route: ActivatedRoute, + private activateToken: string; + + constructor(private route: ActivatedRoute, private authService: AuthService, - private translate: TranslateService, - private fb: UntypedFormBuilder) { - super(store); + private fb: FormBuilder) { + super(); + + this.activateToken = this.route.snapshot.queryParams['activateToken'] || ''; - combineLatest([ - this.route.queryParams, - this.route.data - ]) + this.route.data .pipe(takeUntilDestroyed()) - .subscribe(([params, data]) => { - this.activateToken = params['activateToken'] || ''; - this.passwordPolicy = data['passwordPolicy']; - }); + .subscribe((data) => this.passwordPolicy = data['passwordPolicy']); this.buildCreatePasswordForm(); } @@ -72,17 +63,13 @@ export class CreatePasswordComponent extends PageComponent { }); } - get passwordErrorsLength(): number { - return Object.keys(this.createPassword.get('newPassword')?.errors ?? {}).length; - } - onCreatePassword() { if (this.createPassword.invalid) { this.createPassword.markAllAsTouched(); } else { this.authService.activate( this.activateToken, - this.createPassword.get('password').value, true).subscribe(); + this.createPassword.get('newPassword').value, true).subscribe(); } } } diff --git a/ui-ngx/src/app/modules/login/pages/login/reset-password.component.html b/ui-ngx/src/app/modules/login/pages/login/reset-password.component.html index b4be2ecc9d..95584f9a75 100644 --- a/ui-ngx/src/app/modules/login/pages/login/reset-password.component.html +++ b/ui-ngx/src/app/modules/login/pages/login/reset-password.component.html @@ -45,7 +45,7 @@ formControlName="newPassword"/> lock - + {{ 'security.password-requirement.password-not-meet-requirements' | translate }} diff --git a/ui-ngx/src/app/modules/login/pages/login/reset-password.component.ts b/ui-ngx/src/app/modules/login/pages/login/reset-password.component.ts index 4a2c0bc75d..bfc8986625 100644 --- a/ui-ngx/src/app/modules/login/pages/login/reset-password.component.ts +++ b/ui-ngx/src/app/modules/login/pages/login/reset-password.component.ts @@ -16,13 +16,9 @@ import { Component } from '@angular/core'; import { AuthService } from '@core/auth/auth.service'; -import { Store } from '@ngrx/store'; -import { AppState } from '@core/core.state'; import { PageComponent } from '@shared/components/page.component'; -import { UntypedFormBuilder, UntypedFormGroup, Validators } from '@angular/forms'; -import { TranslateService } from '@ngx-translate/core'; +import { FormBuilder, FormGroup, Validators } from '@angular/forms'; import { ActivatedRoute, Router } from '@angular/router'; -import { combineLatest } from 'rxjs'; import { UserPasswordPolicy } from '@shared/models/settings.models'; import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; import { @@ -39,25 +35,22 @@ export class ResetPasswordComponent extends PageComponent { isExpiredPassword: boolean; - resetToken = ''; - - resetPassword: UntypedFormGroup; + resetPassword: FormGroup; passwordPolicy: UserPasswordPolicy; - constructor(protected store: Store, - private route: ActivatedRoute, + private resetToken: string; + + constructor(private route: ActivatedRoute, private router: Router, private authService: AuthService, - private translate: TranslateService, - private fb: UntypedFormBuilder) { - super(store); - combineLatest([ - this.route.queryParams, - this.route.data - ]) + private fb: FormBuilder) { + super(); + + this.resetToken = this.route.snapshot.queryParams['resetToken'] || ''; + + this.route.data .pipe(takeUntilDestroyed()) - .subscribe(([params, data]) => { - this.resetToken = params['resetToken'] || ''; + .subscribe((data) => { this.passwordPolicy = data['passwordPolicy']; this.isExpiredPassword = data['expiredPassword'] ?? false; }); @@ -76,10 +69,6 @@ export class ResetPasswordComponent extends PageComponent { }); } - get passwordErrorsLength(): number { - return Object.keys(this.resetPassword.get('newPassword')?.errors ?? {}).length; - } - onResetPassword() { if (this.resetPassword.invalid) { this.resetPassword.markAllAsTouched(); diff --git a/ui-ngx/src/app/shared/models/password.models.ts b/ui-ngx/src/app/shared/models/password.models.ts index 4bba3d6737..dbffb35e92 100644 --- a/ui-ngx/src/app/shared/models/password.models.ts +++ b/ui-ngx/src/app/shared/models/password.models.ts @@ -18,24 +18,14 @@ import { UserPasswordPolicy } from '@shared/models/settings.models'; import { AbstractControl, ValidationErrors, ValidatorFn } from '@angular/forms'; import { isEqual } from '@core/utils'; -export enum PasswordErrorMessageKey { - minLength = 'security.password-requirement.password-min-length', - maxLength = 'security.password-requirement.password-max-length', - notUpperCase = 'security.password-requirement.password-uppercase', - notLowerCase = 'security.password-requirement.password-lowercase', - notNumeric = 'security.password-requirement.password-digit', - notSpecial = 'security.password-requirement.password-special-characters', - hasWhitespaces = 'security.password-requirement.password-should-not-contain-spaces', - default = 'security.password-requirement.password-not-meet-requirements' -} - export enum TooltipPasswordErrorMessageKey { minLength = 'security.password-requirement.password-tooltip-min-length', maxLength = 'security.password-requirement.password-tooltip-max-length', notUpperCase = 'security.password-requirement.password-tooltip-uppercase', notLowerCase = 'security.password-requirement.password-tooltip-lowercase', notNumeric = 'security.password-requirement.password-tooltip-digit', - notSpecial = 'security.password-requirement.password-tooltip-special-characters' + notSpecial = 'security.password-requirement.password-tooltip-special-characters', + hasWhitespaces = 'security.password-requirement.password-should-not-contain-spaces' } export const passwordErrorRules = [ @@ -45,6 +35,7 @@ export const passwordErrorRules = [ { key: 'notNumeric', policyProp: 'minimumDigits', translation: TooltipPasswordErrorMessageKey.notNumeric }, { key: 'notSpecial', policyProp: 'minimumSpecialCharacters', translation: TooltipPasswordErrorMessageKey.notSpecial }, { key: 'maxLength', policyProp: 'maximumLength', translation: TooltipPasswordErrorMessageKey.maxLength }, + { key: 'hasWhitespaces', policyProp: 'hasWhitespaces', translation: TooltipPasswordErrorMessageKey.hasWhitespaces }, ]; export const passwordsMatchValidator = (firstControlName: string, secondControlName: string): ValidatorFn =>{ @@ -59,14 +50,7 @@ export const passwordsMatchValidator = (firstControlName: string, secondControlN const newPass = newPassControl.value ?? ''; const confirm = confirmControl.value ?? ''; - const userInteracted = - confirmControl.touched || confirmControl.dirty || group.touched; - - if (!userInteracted) { - return null; - } - - if (newPass && confirm !== newPass) { + if ((newPass || confirm) && confirm !== newPass) { confirmControl.setErrors({ passwordsNotMatch: true }); return { passwordsNotMatch: true }; } else { diff --git a/ui-ngx/src/assets/locale/locale.constant-en_US.json b/ui-ngx/src/assets/locale/locale.constant-en_US.json index 8f3ef7e3d8..ad8d0aa54f 100644 --- a/ui-ngx/src/assets/locale/locale.constant-en_US.json +++ b/ui-ngx/src/assets/locale/locale.constant-en_US.json @@ -4418,12 +4418,6 @@ "password-tooltip-lowercase": "{{minimumLowercaseLetters}} lowercase character", "password-tooltip-digit": "{{minimumDigits}} number", "password-tooltip-special-characters": "{{minimumSpecialCharacters}} special character", - "password-min-length": "Password must be {{minimumLength}} or more characters in length", - "password-max-length": "Password should be less than {{maximumLength}}", - "password-uppercase": "Password must contain {{minimumUppercaseLetters}} or more uppercase characters", - "password-lowercase": "Password must contain {{minimumLowercaseLetters}} or more lowercase characters", - "password-digit": "Password must contain {{minimumDigits}} or more digit characters", - "password-special-characters": "Password must contain {{minimumSpecialCharacters}} or more special characters", "incorrect-password-try-again": "Incorrect password. Try again", "lowercase-letter": "{ count, plural, =1 {1 lowercase letter} other {# lowercase letters} }", "new-passwords-not-match": "New password didn't match",