From 79d258b0cf1d7acdcdaa98ab3a095dd2d716036f Mon Sep 17 00:00:00 2001
From: Mazdak Gibran <141390141+mazdakgibran@users.noreply.github.com>
Date: Tue, 27 Jan 2026 15:27:12 +0500
Subject: [PATCH] Enhance reset password flow and add permission control
Replaced user ID input with a dropdown in the reset password form and loaded users dynamically. Added 'resetPasswordButton' permission to side menu and conditionally displayed the reset password button
---
src/app/app.config.ts | 2 +-
.../change-password.component.ts | 20 ---------
.../reset-password-modal.component.html | 4 +-
.../reset-password.component.html | 17 +++----
.../reset-password.component.ts | 45 +++++++++++++++----
.../setup-user/setup-user.component.html | 2 +-
src/assets/data/sideMenu.json | 6 +++
src/assets/i18n/Arabic.json | 3 +-
src/assets/i18n/English.json | 3 +-
9 files changed, 57 insertions(+), 45 deletions(-)
diff --git a/src/app/app.config.ts b/src/app/app.config.ts
index 7b8eabc..7ad4705 100644
--- a/src/app/app.config.ts
+++ b/src/app/app.config.ts
@@ -12,7 +12,7 @@ import { provideAnimations } from '@angular/platform-browser/animations';
import { LoadingInterceptor } from './shared/interceptors/loading.interceptor';
export function HttpLoaderFactory(http: HttpClient) {
- return new TranslateHttpLoader(http, './assets/i18n/', '.json');
+ return new TranslateHttpLoader(http, '/assets/i18n/', '.json');
}
export const appConfig: ApplicationConfig = {
diff --git a/src/app/user-management/change-password/change-password.component.ts b/src/app/user-management/change-password/change-password.component.ts
index 1519114..a8d3ce3 100644
--- a/src/app/user-management/change-password/change-password.component.ts
+++ b/src/app/user-management/change-password/change-password.component.ts
@@ -156,19 +156,6 @@ constructor(
} else {
this.changeRegularPassword();
}
- const payload = this.getFormPayload();
-
- this.httpURIService.requestPOST(URIKey.CHANGE_PASSWORD_URI, payload)
- .subscribe({
- next: (response) => {
- if (!(response instanceof HttpErrorResponse)) {
- this.i18nService.success(SuccessMessages.CHANGE_PASSWORD_SUCCESS, []);
- this.router.navigate(['/dashboard']);
- }
- }
- });
-
-
}
changeFirstTimePassword() {
@@ -230,13 +217,6 @@ constructor(
this.i18nService.success(SuccessMessages.CHANGE_PASSWORD_SUCCESS, []);
this.router.navigate(['/home/dashboard']);
}
- },
- error: (error) => {
-
- console.error('Password change failed:', error);
- if (error.status === 401) {
- this.authService.logout();
- }
}
});
}
diff --git a/src/app/user-management/reset-password-modal/reset-password-modal.component.html b/src/app/user-management/reset-password-modal/reset-password-modal.component.html
index 75546b7..1492dec 100644
--- a/src/app/user-management/reset-password-modal/reset-password-modal.component.html
+++ b/src/app/user-management/reset-password-modal/reset-password-modal.component.html
@@ -21,7 +21,7 @@
diff --git a/src/app/user-management/reset-password/reset-password.component.ts b/src/app/user-management/reset-password/reset-password.component.ts
index f82b82f..d2c72f6 100644
--- a/src/app/user-management/reset-password/reset-password.component.ts
+++ b/src/app/user-management/reset-password/reset-password.component.ts
@@ -8,12 +8,15 @@ import { HttpURIService } from '../../app.http.uri.service';
import { StorageService } from '../../shared/services/storage.service';
import { I18NService } from '../../services/i18n.service';
import { ErrorMessages, SuccessMessages } from '../../utils/enums';
-import { HttpErrorResponse } from '@angular/common/http';
+import { HttpErrorResponse, HttpParams } from '@angular/common/http';
import { Router } from '@angular/router';
+import { NgSelectComponent } from "@ng-select/ng-select";
+import { SetupUser } from '../../models/user';
+import { error } from 'console';
@Component({
selector: 'app-reset-password',
- imports: [TranslateModule, PasswordHideShowComponent, CommonModule, ReactiveFormsModule],
+ imports: [TranslateModule, PasswordHideShowComponent, CommonModule, ReactiveFormsModule, NgSelectComponent],
templateUrl: './reset-password.component.html',
styleUrl: './reset-password.component.scss'
})
@@ -21,16 +24,20 @@ export class ResetPasswordComponent implements OnInit{
resetPasswordForm!: FormGroup
passwordType1: string = 'password';
passwordType2: string = 'password';
+ isLoading: boolean = false;
+ allUsersDropdown: SetupUser[] = [];
+ selectedUserId: string | null = null;
+
@ViewChild('psh1') passwordHideShow1?: PasswordHideShowComponent;
@ViewChild('psh2') passwordHideShow2?: PasswordHideShowComponent;
- constructor(private fb: FormBuilder, private httpURIService: HttpURIService, private storageService: StorageService, private i18nService: I18NService, private router: Router){}
+ constructor(private fb: FormBuilder, private httpService: HttpURIService, private httpURIService: HttpURIService, private storageService: StorageService, private i18nService: I18NService, private router: Router){}
ngOnInit(): void {
- const userIdValue = this.storageService.getItem('USER_ID')
+ const userIdValue = this.storageService.getItem('USER_ID') || null;
this.resetPasswordForm = this.fb.group({
- userId: [userIdValue],
+ userId: [null],
newPassword: ['', [
Validators.required,
Validators.minLength(8),
@@ -55,7 +62,7 @@ export class ResetPasswordComponent implements OnInit{
this.resetPasswordForm.get('confirmPassword')?.updateValueAndValidity();
});
-
+ this.loadUsersForDropdown();
}
togglePasswordType1() {
this.passwordType1 = this.passwordHideShow1?.showPassword ? 'password' : 'text';
@@ -83,12 +90,14 @@ export class ResetPasswordComponent implements OnInit{
onSubmit() {
if (this.resetPasswordForm.invalid) return;
-
+ const selectedId = this.resetPasswordForm.get('userId')?.value;
+ console.log("userid.....", selectedId)
const payload = {
- userId: this.resetPasswordForm.get('userId')?.value,
+ userId: selectedId,
newPassword: this.resetPasswordForm.get('newPassword')?.value,
porOrgaCode: this.storageService.getItem('POR_ORGACODE')
};
+
this.httpURIService.requestPOST(URIKey.RESET_PASSWORD_URI, payload)
.subscribe({
next: (response) => {
@@ -100,6 +109,26 @@ export class ResetPasswordComponent implements OnInit{
});
}
+ loadUsersForDropdown(): void{
+ this.isLoading = true;
+ let params = new HttpParams().set('page', '0').set('size', '1000')
+
+
+ this.httpService.requestGET(URIKey.GET_ALL_USER_URI, params).subscribe({
+ next: (response)=>{
+ this.allUsersDropdown = response;
+ this.isLoading = false
+ },
+ error:(err)=>{
+ console.error('Error fetching users:', err);
+ this.allUsersDropdown = [];
+ this.isLoading = false;
+ }
+ })
+
+
+
+ }
}
diff --git a/src/app/user-management/setup-user/setup-user.component.html b/src/app/user-management/setup-user/setup-user.component.html
index 171dadf..857b21d 100644
--- a/src/app/user-management/setup-user/setup-user.component.html
+++ b/src/app/user-management/setup-user/setup-user.component.html
@@ -253,7 +253,7 @@
-