diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DataManagementPlanManager.java b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DataManagementPlanManager.java index 5b6d640a2..bb659dcd6 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DataManagementPlanManager.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DataManagementPlanManager.java @@ -155,6 +155,7 @@ public class DataManagementPlanManager { if (fieldsGroup.equals("listing")) { if (!dataManagementPlanTableRequest.getCriteria().isOnlyPublic()) { itemsFuture = pagedItems.withHint(HintedModelFactory.getHint(DataManagementPlanListingModel.class)) + .distinct() .selectAsync(item -> { item.setDataset( item.getDataset().stream() @@ -168,6 +169,7 @@ public class DataManagementPlanManager { .whenComplete((resultList, throwable) -> dataTable.setData(resultList)); } else { itemsFuture = pagedItems.withHint(HintedModelFactory.getHint(DataManagementPlanListingModel.class)) + .distinct() .selectAsync(item -> { item.setDataset( item.getDataset().stream() @@ -178,10 +180,12 @@ public class DataManagementPlanManager { } } else if (fieldsGroup.equals("autocomplete")) { itemsFuture = pagedItems + .distinct() .selectAsync(item -> new DataManagementPlanListingModel().fromDataModelAutoComplete(item)) .whenComplete((resultList, throwable) -> dataTable.setData(resultList)); } else { itemsFuture = pagedItems + .distinct() .selectAsync(item -> new DataManagementPlanListingModel().fromDataModelAssociatedProfiles(item)) .whenComplete((resultList, throwable) -> dataTable.setData(resultList)); } diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/InvitationsManager.java b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/InvitationsManager.java index 7a367f70f..7781f4e0a 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/InvitationsManager.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/InvitationsManager.java @@ -82,7 +82,7 @@ public class InvitationsManager { Unmarshaller unmarshaller = context.createUnmarshaller(); Properties properties = (Properties) unmarshaller.unmarshal(new StringReader(invitation.getProperties())); UserInfo invitedUser = apiContext.getOperationsContext().getDatabaseRepository().getUserInfoDao().find(principal.getId()); - QueryableList userDMPQueryableList = apiContext.getOperationsContext().getDatabaseRepository().getUserDmpDao().asQueryable().where(((builder, root) -> builder.and(builder.equal(root.get("dmp").get("id"), invitation.getDmp().getId()), builder.equal(root.get("user").get("id"), invitation.getUser().getId())))); + QueryableList userDMPQueryableList = apiContext.getOperationsContext().getDatabaseRepository().getUserDmpDao().asQueryable().where(((builder, root) -> builder.and(builder.equal(root.get("dmp").get("id"), invitation.getDmp().getId()), builder.equal(root.get("user").get("id"), invitedUser.getId())))); UserDMP existingUserDMP = userDMPQueryableList.getSingleOrDefault(); if (existingUserDMP != null) { if (properties.getRole() != null && existingUserDMP.getRole() > properties.getRole()) { diff --git a/dmp-frontend/src/app/ui/dmp/invitation/dmp-invitation.component.html b/dmp-frontend/src/app/ui/dmp/invitation/dmp-invitation.component.html index e6b43c548..33a63c1b8 100644 --- a/dmp-frontend/src/app/ui/dmp/invitation/dmp-invitation.component.html +++ b/dmp-frontend/src/app/ui/dmp/invitation/dmp-invitation.component.html @@ -14,7 +14,15 @@ [configuration]="usersAutoCompleteConfiguration"> -
+
+ + {{'DMP-LISTING.MEMBER' | translate}} + + + {{ roleName.value }} + + +
diff --git a/dmp-frontend/src/app/ui/dmp/invitation/dmp-invitation.component.scss b/dmp-frontend/src/app/ui/dmp/invitation/dmp-invitation.component.scss index 996466d32..315ec3063 100644 --- a/dmp-frontend/src/app/ui/dmp/invitation/dmp-invitation.component.scss +++ b/dmp-frontend/src/app/ui/dmp/invitation/dmp-invitation.component.scss @@ -28,6 +28,10 @@ border-radius: 4px; } +::ng-deep .mat-dialog-container { + border-radius: 8px; +} + ::ng-deep .mat-form-field-underline { display: none; } @@ -56,3 +60,12 @@ margin-bottom: 0.25em; } +.select-role { + width: 16% !important; + font-size: 14px; + color: #848484; + height: min-content; + margin-right: 2.5rem; + border: none; + background-color: transparent; +} diff --git a/dmp-frontend/src/app/ui/dmp/invitation/dmp-invitation.component.ts b/dmp-frontend/src/app/ui/dmp/invitation/dmp-invitation.component.ts index ddce6723f..d8ad3c94e 100644 --- a/dmp-frontend/src/app/ui/dmp/invitation/dmp-invitation.component.ts +++ b/dmp-frontend/src/app/ui/dmp/invitation/dmp-invitation.component.ts @@ -14,6 +14,7 @@ import { MultipleAutoCompleteConfiguration } from '@app/library/auto-complete/mu import { BaseComponent } from '@common/base/base.component'; import { Observable } from 'rxjs'; import { map, takeUntil } from 'rxjs/operators'; +import { Role } from '@app/core/common/enum/role'; @Component({ selector: 'app-invitation-component', @@ -26,6 +27,8 @@ export class DmpInvitationDialogComponent extends BaseComponent implements OnIni public filteredUsersAsync = false; public filteredUsers: DmpInvitationUser[]; public emails: string[] = []; + public roles = Role; + public roleNames: string[]; visible = true; selectable = true; @@ -33,13 +36,29 @@ export class DmpInvitationDialogComponent extends BaseComponent implements OnIni addOnBlur = true; readonly separatorKeysCodes: number[] = [ENTER, COMMA]; + constructor( + public invitationService: DmpInvitationService, + public route: ActivatedRoute, + public router: Router, + public dialogRef: MatDialogRef, + @Inject(MAT_DIALOG_DATA) public data: any + ) { + super(); + this.roleNames = Object.keys(this.roles).filter(key => key.length > 1); + } + + ngOnInit(): void { + const invitation = new DmpInvitation(); + invitation.dataManagementPlan = this.data.dmpId; + this.formGroup = invitation.buildForm(); + } + usersAutoCompleteConfiguration: MultipleAutoCompleteConfiguration = { filterFn: this.filterUsers.bind(this), initialItems: (excludedItems: any[]) => this.filterUsers('').pipe(map(result => result.filter(resultItem => (excludedItems || []).map(x => x.id).indexOf(resultItem.id) === -1))), displayFn: (item) => typeof(item) === 'string' ? item : item.name, titleFn: (item) => typeof(item) === 'string' ? item : item.name, valueAssign: (item) => { - const result = typeof(item) === 'string' ? item : item.email; console.log(result); return result; @@ -64,30 +83,13 @@ export class DmpInvitationDialogComponent extends BaseComponent implements OnIni } } - - constructor( - public invitationService: DmpInvitationService, - public route: ActivatedRoute, - public router: Router, - public dialogRef: MatDialogRef, - @Inject(MAT_DIALOG_DATA) public data: any - ) { super(); } - - ngOnInit(): void { - const invitation = new DmpInvitation(); - invitation.dataManagementPlan = this.data.dmpId; - this.formGroup = invitation.buildForm(); - } - - send(value: any) { let invitationObject: any = {}; invitationObject.dataManagementPlan = this.data.dmpId; + invitationObject.role = this.formGroup.get('role').value; invitationObject.users = []; - console.log(this.formGroup.get('users').value); invitationObject.users.push(...(this.formGroup.get('users').value).filter(user => typeof(user) === 'string').map(email => ({ email: email, name: email }))); invitationObject.users.push(...(this.formGroup.get('users').value).filter(user => typeof(user) !== 'string')); - console.log(invitationObject.users); //invitationObject.users.push(...this.formGroup.get('users').value); this.emails.forEach(email => { invitationObject.users.push({ email: email, name: email });