From b4593807d24c881ab245531e1c6471670f8ad174 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adina=20=C8=9Aeudan?= Date: Tue, 12 Jul 2022 17:18:36 +0300 Subject: [PATCH] RED-4595: Fixed users role assignment --- .../user-details/user-details.component.ts | 35 ++++++++++--------- apps/red-ui/src/app/services/user.service.ts | 2 +- 2 files changed, 19 insertions(+), 18 deletions(-) diff --git a/apps/red-ui/src/app/modules/admin/dialogs/add-edit-user-dialog/user-details/user-details.component.ts b/apps/red-ui/src/app/modules/admin/dialogs/add-edit-user-dialog/user-details/user-details.component.ts index 23bbbcd12..d2e70fda3 100644 --- a/apps/red-ui/src/app/modules/admin/dialogs/add-edit-user-dialog/user-details/user-details.component.ts +++ b/apps/red-ui/src/app/modules/admin/dialogs/add-edit-user-dialog/user-details/user-details.component.ts @@ -24,6 +24,8 @@ export class UserDetailsComponent extends BaseFormComponent implements OnChanges readonly ROLES = ['RED_USER', 'RED_MANAGER', 'RED_USER_ADMIN', 'RED_ADMIN']; readonly translations = rolesTranslations; + + /** e.g. a RED_ADMIN is automatically a RED_USER_ADMIN => can't disable RED_USER_ADMIN as long as RED_ADMIN is checked */ private readonly _ROLE_REQUIREMENTS = { RED_MANAGER: 'RED_USER', RED_ADMIN: 'RED_USER_ADMIN' }; constructor( @@ -66,15 +68,14 @@ export class UserDetailsComponent extends BaseFormComponent implements OnChanges } shouldBeDisabled(role: string): boolean { - if (!this.user) { - return false; - } - - const isCurrentAdminUser = this.user.isAdmin && this.user.id === this.userService.currentUser.id; + const isCurrentAdminUser = this.user && this.user.isAdmin && this.user.id === this.userService.currentUser.id; return ( + // RED_ADMIN can't remove own RED_ADMIN role (role === 'RED_ADMIN' && isCurrentAdminUser) || + // only RED_ADMINs can edit RED_ADMIN roles + (role === 'RED_ADMIN' && !this.userService.currentUser.isAdmin) || Object.keys(this._ROLE_REQUIREMENTS).reduce( - (value, key) => value || (role === this._ROLE_REQUIREMENTS[key] && this.user.roles.includes(key)), + (value, key) => value || (role === this._ROLE_REQUIREMENTS[key] && this.user?.roles.includes(key)), false, ) ); @@ -107,6 +108,17 @@ export class UserDetailsComponent extends BaseFormComponent implements OnChanges this._dialogService.deleteUsers([this.user.id], null, () => this.closeDialog.emit(true)); } + setRolesRequirements(checked: boolean, role: string): void { + if (Object.keys(this._ROLE_REQUIREMENTS).includes(role)) { + if (checked) { + this.form.patchValue({ [this._ROLE_REQUIREMENTS[role]]: true }); + this.form.controls[this._ROLE_REQUIREMENTS[role]].disable(); + } else { + this.form.controls[this._ROLE_REQUIREMENTS[role]].enable(); + } + } + } + private _getForm(): UntypedFormGroup { return this._formBuilder.group({ firstName: [this.user?.firstName, Validators.required], @@ -121,15 +133,4 @@ export class UserDetailsComponent extends BaseFormComponent implements OnChanges ...this._rolesControls, }); } - - setRolesRequirements(checked: boolean, role: string): void { - if (Object.keys(this._ROLE_REQUIREMENTS).includes(role)) { - if (checked) { - this.form.patchValue({ [this._ROLE_REQUIREMENTS[role]]: true }); - this.form.controls[this._ROLE_REQUIREMENTS[role]].disable(); - } else { - this.form.controls[this._ROLE_REQUIREMENTS[role]].enable(); - } - } - } } diff --git a/apps/red-ui/src/app/services/user.service.ts b/apps/red-ui/src/app/services/user.service.ts index 33f6265f5..70ff5e3a8 100644 --- a/apps/red-ui/src/app/services/user.service.ts +++ b/apps/red-ui/src/app/services/user.service.ts @@ -90,7 +90,7 @@ export class UserService extends EntitiesService { return true; } - getUsers(onlyRed = false, refreshCache = false): Observable { + getUsers(onlyRed = false, refreshCache = true): Observable { const url = onlyRed ? `${this._defaultModelPath}/red` : this._defaultModelPath; return super.getAll(url, [{ key: 'refreshCache', value: refreshCache }]); }