From 0ae55ba59018a186f0cbe249301cca1e42a98e9f Mon Sep 17 00:00:00 2001 From: arditdomi <32884230+arditdomi@users.noreply.github.com> Date: Tue, 28 Jan 2020 15:05:26 +0000 Subject: [PATCH] =?UTF-8?q?[AAE-1602][AAE-1594]=20Fix=20duplicated=20users?= =?UTF-8?q?=20issue=20when=20validation=20enabl=E2=80=A6=20(#5413)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * [AAE-1602][AAE-1594] Fix duplicated users issue when validation enabled, fix partial username should not return a valid user * [AAE-1602][AAE-1594] Fix removing incorrect invalid user/group when name or id matches --- .../group/components/group-cloud.component.ts | 20 +++++--- .../components/people-cloud.component.spec.ts | 4 +- .../components/people-cloud.component.ts | 51 +++++++++---------- 3 files changed, 40 insertions(+), 35 deletions(-) diff --git a/lib/process-services-cloud/src/lib/group/components/group-cloud.component.ts b/lib/process-services-cloud/src/lib/group/components/group-cloud.component.ts index 90289a5cf5..a6b82176a8 100644 --- a/lib/process-services-cloud/src/lib/group/components/group-cloud.component.ts +++ b/lib/process-services-cloud/src/lib/group/components/group-cloud.component.ts @@ -345,22 +345,28 @@ export class GroupCloudComponent implements OnInit, OnChanges, OnDestroy { onRemove(groupToRemove: IdentityGroupModel) { this.removeGroup.emit(groupToRemove); - const indexToRemove = this.selectedGroups.findIndex((group: IdentityGroupModel) => { - return group.id === groupToRemove.id; - }); - this.selectedGroups.splice(indexToRemove, 1); + this.removeGroupFromSelected(groupToRemove); this.changedGroups.emit(this.selectedGroups); this.searchGroupsControl.markAsDirty(); if (this.isValidationEnabled()) { - this.removeGroupFromValidation(groupToRemove.name); + this.removeGroupFromValidation(groupToRemove); this.checkPreselectValidationErrors(); } } - private removeGroupFromValidation(groupName: string) { + private removeGroupFromSelected(groupToRemove: IdentityGroupModel) { + const indexToRemove = this.selectedGroups.findIndex((selectedGroup: IdentityGroupModel) => { + return selectedGroup.id === groupToRemove.id && selectedGroup.name === groupToRemove.name; + }); + if (indexToRemove !== -1) { + this.selectedGroups.splice(indexToRemove, 1); + } + } + + private removeGroupFromValidation(groupToRemove: IdentityGroupModel) { const indexToRemove = this.invalidGroups.findIndex((invalidGroup) => { - return invalidGroup.name === groupName; + return invalidGroup.name === groupToRemove.name && invalidGroup.id === groupToRemove.id; }); if (indexToRemove !== -1) { diff --git a/lib/process-services-cloud/src/lib/people/components/people-cloud.component.spec.ts b/lib/process-services-cloud/src/lib/people/components/people-cloud.component.spec.ts index a2218f6ae1..04e200295f 100644 --- a/lib/process-services-cloud/src/lib/people/components/people-cloud.component.spec.ts +++ b/lib/process-services-cloud/src/lib/people/components/people-cloud.component.spec.ts @@ -133,7 +133,7 @@ describe('PeopleCloudComponent', () => { it('should selectedUser and changedUsers emit, update selected users when a user is selected', (done) => { const user = { username: 'username' }; fixture.detectChanges(); - spyOn(component, 'hasUserDetails').and.returnValue(true); + spyOn(component, 'isPreselectedUserValid').and.returnValue(true); const selectEmitSpy = spyOn(component.selectUser, 'emit'); const changedUsersSpy = spyOn(component.changedUsers, 'emit'); component.onSelect(user); @@ -514,7 +514,7 @@ describe('PeopleCloudComponent', () => { it('should check validation only for the first user and emit warning when user is invalid - single mode', (done) => { spyOn(identityService, 'findUserById').and.returnValue(Promise.resolve([])); - spyOn(component, 'hasUserDetails').and.returnValue(false); + spyOn(component, 'isPreselectedUserValid').and.returnValue(false); const expectedWarning = { message: 'INVALID_PRESELECTED_USERS', diff --git a/lib/process-services-cloud/src/lib/people/components/people-cloud.component.ts b/lib/process-services-cloud/src/lib/people/components/people-cloud.component.ts index 8ce3bb74f0..048278a2cd 100644 --- a/lib/process-services-cloud/src/lib/people/components/people-cloud.component.ts +++ b/lib/process-services-cloud/src/lib/people/components/people-cloud.component.ts @@ -298,11 +298,12 @@ export class PeopleCloudComponent implements OnInit, OnChanges, OnDestroy { await Promise.all(preselectedUsersToValidate.map(async (user: IdentityUserModel) => { try { - const validationResult = await this.searchUser(user); - if (!this.hasUserDetails(validationResult)) { - this.invalidUsers.push(user); - } else { + const validationResult: IdentityUserModel = await this.searchUser(user); + if (this.isPreselectedUserValid(user, validationResult)) { + validationResult.readonly = user.readonly; validUsers.push(validationResult); + } else { + this.invalidUsers.push(user); } } catch (error) { this.invalidUsers.push(user); @@ -310,20 +311,16 @@ export class PeopleCloudComponent implements OnInit, OnChanges, OnDestroy { } })); this.checkPreselectValidationErrors(); - this.alignUsersAfterValidation(validUsers); + this.selectedUsers = validUsers.concat(this.invalidUsers); this.isLoading = false; } - private alignUsersAfterValidation(validatedUsers: IdentityUserModel[]) { - this.selectedUsers.forEach((selectedUser, index) => { - validatedUsers.forEach(validatedUser => { - if ((selectedUser.id === validatedUser.id) || (selectedUser.username === validatedUser.username) - || (selectedUser.email === validatedUser.email)) { - validatedUser.readonly = selectedUser.readonly; - this.selectedUsers[index] = validatedUser; - } - }); - }); + isPreselectedUserValid(preselectedUser: IdentityUserModel, validatedUser: IdentityUserModel) { + if (validatedUser && (validatedUser.id !== undefined || validatedUser.username !== undefined || validatedUser.email !== undefined)) { + return preselectedUser.id === validatedUser.id || preselectedUser.username === validatedUser.username || preselectedUser.email === validatedUser.email; + } else { + return false; + } } async searchUser(user: IdentityUserModel) { @@ -390,22 +387,28 @@ export class PeopleCloudComponent implements OnInit, OnChanges, OnDestroy { onRemove(userToRemove: IdentityUserModel) { this.removeUser.emit(userToRemove); - const indexToRemove = this.selectedUsers.findIndex((selectedUser: IdentityUserModel) => { - return selectedUser.id === userToRemove.id; - }); - this.selectedUsers.splice(indexToRemove, 1); + this.removeUserFromSelected(userToRemove); this.changedUsers.emit(this.selectedUsers); this.searchUserCtrl.markAsDirty(); if (this.isValidationEnabled()) { - this.removeUserFromValidation(userToRemove.username); + this.removeUserFromValidation(userToRemove); this.checkPreselectValidationErrors(); } } - private removeUserFromValidation(username: string) { + private removeUserFromSelected(userToRemove: IdentityUserModel) { + const indexToRemove = this.selectedUsers.findIndex((selectedUser: IdentityUserModel) => { + return selectedUser.id === userToRemove.id && selectedUser.username === userToRemove.username && selectedUser.email === userToRemove.email; + }); + if (indexToRemove !== -1) { + this.selectedUsers.splice(indexToRemove, 1); + } + } + + private removeUserFromValidation(userToRemove: IdentityUserModel) { const indexToRemove = this.invalidUsers.findIndex((invalidUser) => { - return invalidUser.username === username; + return invalidUser.username === userToRemove.username && invalidUser.id === userToRemove.id && invalidUser.email === userToRemove.email; }); if (indexToRemove !== -1) { @@ -413,10 +416,6 @@ export class PeopleCloudComponent implements OnInit, OnChanges, OnDestroy { } } - hasUserDetails(user: IdentityUserModel): boolean { - return user && (user.id !== undefined || user.username !== undefined || user.email !== undefined); - } - generateInvalidUsersMessage() { this.validateUsersMessage = '';