diff --git a/dmp-backend/pom.xml b/dmp-backend/pom.xml index 0da532fe2..35642d025 100644 --- a/dmp-backend/pom.xml +++ b/dmp-backend/pom.xml @@ -1,202 +1,207 @@ - - 4.0.0 - dmp-backend - dmp-backend - 0.0.1-SNAPSHOT + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + + 4.0.0 + dmp-backend + dmp-backend + 0.0.1-SNAPSHOT - - org.springframework.boot - spring-boot-starter-parent - 1.5.9.RELEASE - - - 1.19.0 - 1.19.0 - - 0.0.1-SNAPSHOT - 4.3.8.RELEASE - - 4.2.3.RELEASE - 1.19.1 - 7.0.35 - 2.8.4 - - 5.2.11.Final - - 1.9 - 4.11 - 1.2.17 - 1.7.12 - 9.0.7.v20131107 - 1.1.1 - 1 - 3.0.1 - - + + org.springframework.boot + spring-boot-starter-parent + 1.5.9.RELEASE + + + 1.19.0 + 1.19.0 + + 0.0.1-SNAPSHOT + 4.3.8.RELEASE + + 4.2.3.RELEASE + 1.19.1 + 7.0.35 + 2.8.4 + + 5.2.11.Final + + 1.9 + 4.11 + 1.2.17 + 1.7.12 + 9.0.7.v20131107 + + 1.1.1 + 1 + 3.0.1 + + - + - - - - - - + + + + + + - - - - org.json - json - 20160810 - + + + + org.json + json + 20160810 + - - org.springframework.boot - spring-boot-devtools - - - org.hibernate - hibernate-core - ${hibernate.version} - - - - org.hibernate - hibernate-c3p0 - ${hibernate.version} - + + org.springframework.boot + spring-boot-devtools + + + org.hibernate + hibernate-core + ${hibernate.version} + - - - com.google.api-client - google-api-client - 1.23.0 - - - - com.jayway.jsonpath - json-path - 2.4.0 - + + org.hibernate + hibernate-c3p0 + ${hibernate.version} + + + + + com.google.api-client + google-api-client + 1.23.0 + + + + com.jayway.jsonpath + json-path + 2.4.0 + - - - com.fasterxml.jackson.dataformat - jackson-dataformat-xml - 2.9.3 - - - org.springframework.security - spring-security-web - 4.2.3.RELEASE - + + + com.fasterxml.jackson.dataformat + jackson-dataformat-xml + 2.9.3 + + + org.springframework.security + spring-security-web + 4.2.3.RELEASE + - - + + - - org.springframework.boot - spring-boot-starter-web - - - - - com.fasterxml.jackson.core - jackson-databind - - - com.fasterxml.jackson.core - jackson-annotations - - - + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.boot + spring-boot-starter-mail + + + + + com.fasterxml.jackson.core + jackson-databind + + + com.fasterxml.jackson.core + jackson-annotations + + + - - com.fasterxml.jackson.core - jackson-annotations - 2.9.0 - + + com.fasterxml.jackson.core + jackson-annotations + 2.9.0 + - - - org.springframework - spring-context - 4.3.10.RELEASE - + + + org.springframework + spring-context + 4.3.10.RELEASE + - - - com.google.guava - guava - 23.0 - - - - org.springframework - spring-context-support - 4.0.0.RELEASE - + + + com.google.guava + guava + 23.0 + + + + org.springframework + spring-context-support + 4.0.0.RELEASE + - - org.springframework.boot - spring-boot-starter-data-jpa - - - - junit - junit - 4.12 - test - + + org.springframework.boot + spring-boot-starter-data-jpa + + + + junit + junit + 4.12 + test + - - postgresql - postgresql - 9.1-901.jdbc4 - - - - io.springfox - springfox-swagger-ui - 2.7.0 - - - - - - org.apache.commons - commons-lang3 - 3.5 - - - - + + postgresql + postgresql + 9.1-901.jdbc4 + - - + + io.springfox + springfox-swagger-ui + 2.7.0 + - - org.springframework.boot - spring-boot-maven-plugin - - - org.apache.maven.plugins - maven-compiler-plugin - - 1.8 - 1.8 - - - - - ${project.artifactId} - - + + + org.apache.commons + commons-lang3 + 3.5 + + + + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + org.apache.maven.plugins + maven-compiler-plugin + + 1.8 + 1.8 + + + + + + ${project.artifactId} + + \ No newline at end of file diff --git a/dmp-backend/src/main/java/eu/eudat/controllers/UserInvitationController.java b/dmp-backend/src/main/java/eu/eudat/controllers/UserInvitationController.java index f7742fcf9..5577d65f8 100644 --- a/dmp-backend/src/main/java/eu/eudat/controllers/UserInvitationController.java +++ b/dmp-backend/src/main/java/eu/eudat/controllers/UserInvitationController.java @@ -3,10 +3,13 @@ package eu.eudat.controllers; import eu.eudat.managers.InvitationsManager; import eu.eudat.models.helpers.responses.ResponseItem; import eu.eudat.models.invitation.Invitation; +import eu.eudat.models.security.Principal; import eu.eudat.models.userinfo.UserInfoInvitationModel; import eu.eudat.models.userinfo.UserInfoRequestItem; import eu.eudat.services.ApiContext; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.transaction.annotation.Transactional; import org.springframework.web.bind.annotation.*; import java.util.List; @@ -24,12 +27,14 @@ public class UserInvitationController extends BaseController{ super(apiContext); } + @Transactional @RequestMapping(method = RequestMethod.POST, value = { "/users" }, consumes = "application/json", produces="application/json") - public @ResponseBody ResponseItem users(@RequestBody Invitation invitation) { + public @ResponseBody ResponseItem users(@RequestBody Invitation invitation, Principal principal) { try { - InvitationsManager.inviteUsers(this.getApiContext(),invitation); - return new ResponseItem().message("Users have beeen invited"); + InvitationsManager.inviteUsers(this.getApiContext(),invitation,principal); + return new ResponseItem().status(HttpStatus.OK).message("Users have beeen invited"); } catch (Exception e) { + e.printStackTrace(); return new ResponseItem().message(e.getMessage()); } } @@ -38,9 +43,10 @@ public class UserInvitationController extends BaseController{ public @ResponseBody ResponseItem> getUsers(@RequestBody UserInfoRequestItem userInfoRequestItem) { try { List users = InvitationsManager.getUsers(this.getApiContext(),userInfoRequestItem); - return new ResponseItem>().payload(users); + return new ResponseItem>().status(HttpStatus.OK).payload(users); } catch (Exception e) { - return new ResponseItem>().message(e.getMessage()); + e.printStackTrace(); + return new ResponseItem>().status(HttpStatus.BAD_REQUEST).message(e.getMessage()); } } } diff --git a/dmp-backend/src/main/java/eu/eudat/entities/Invitation.java b/dmp-backend/src/main/java/eu/eudat/entities/Invitation.java index 0aff7df91..1b265d40d 100644 --- a/dmp-backend/src/main/java/eu/eudat/entities/Invitation.java +++ b/dmp-backend/src/main/java/eu/eudat/entities/Invitation.java @@ -1,5 +1,6 @@ package eu.eudat.entities; +import org.hibernate.annotations.GenericGenerator; import org.hibernate.annotations.Type; import javax.persistence.*; @@ -14,6 +15,8 @@ import java.util.UUID; public class Invitation implements DataEntity{ @Id + @GeneratedValue + @GenericGenerator(name = "uuid2", strategy = "uuid2") @Column(name = "\"Id\"", updatable = false, nullable = false) private UUID id; @@ -31,6 +34,9 @@ public class Invitation implements DataEntity{ @Column(name = "\"Token\"", updatable = false, nullable = false, columnDefinition = "BINARY(16)") private UUID token; + @Column(name = "\"AcceptedInvitation\"", nullable = false) + private boolean acceptedInvitation; + @Type(type="eu.eudat.typedefinition.XMLType") @Column(name = "\"Properties\"", columnDefinition = "xml", nullable = true) private String properties; @@ -83,6 +89,14 @@ public class Invitation implements DataEntity{ this.properties = properties; } + public boolean getAcceptedInvitation() { + return acceptedInvitation; + } + + public void setAcceptedInvitation(boolean acceptedInvitation) { + this.acceptedInvitation = acceptedInvitation; + } + @Override public void update(Invitation entity) { diff --git a/dmp-backend/src/main/java/eu/eudat/entities/UserInfo.java b/dmp-backend/src/main/java/eu/eudat/entities/UserInfo.java index bdd0684a6..2c58d0769 100644 --- a/dmp-backend/src/main/java/eu/eudat/entities/UserInfo.java +++ b/dmp-backend/src/main/java/eu/eudat/entities/UserInfo.java @@ -165,6 +165,6 @@ public class UserInfo implements Serializable,DataEntity{ @Override public Object[] getKeys() { - return new Object[0]; + return new UUID[]{this.id == null ? null : this.id}; } } diff --git a/dmp-backend/src/main/java/eu/eudat/entities/xmlmodels/datasetprofiledefinition/FieldSet.java b/dmp-backend/src/main/java/eu/eudat/entities/xmlmodels/datasetprofiledefinition/FieldSet.java index 914f7ccba..672901f8c 100644 --- a/dmp-backend/src/main/java/eu/eudat/entities/xmlmodels/datasetprofiledefinition/FieldSet.java +++ b/dmp-backend/src/main/java/eu/eudat/entities/xmlmodels/datasetprofiledefinition/FieldSet.java @@ -20,6 +20,7 @@ public class FieldSet implements DatabaseViewStyleDefinition,XmlSerializable getFields() { return fields; } @@ -76,12 +77,20 @@ public class FieldSet implements DatabaseViewStyleDefinition,XmlSerializable alreadySignedInUsers = invitation.getUsers().stream().filter(item -> item.getId() != null).collect(Collectors.toList()); List alreadySignedInUsersEntities = new DomainModelConverter().toDataModel(alreadySignedInUsers); DMP dataManagementPlan = apiContext.getDatabaseRepository().getDmpDao().find(invitation.getDataManagementPlan()); - apiContext.getInvitationService().createInvitations(apiContext.getDatabaseRepository().getInvitationDao(),new DomainModelConverter().toDataModel(invitation.getUsers()),dataManagementPlan); + apiContext.getInvitationService().createInvitations(apiContext.getDatabaseRepository().getInvitationDao(),new DomainModelConverter().toDataModel(invitation.getUsers()),dataManagementPlan,principalUser); apiContext.getInvitationService().assignToDmp(apiContext.getDatabaseRepository().getDmpDao(), alreadySignedInUsersEntities, dataManagementPlan); apiContext.getInvitationService().sendInvitations(invitation.getUsers()); } diff --git a/dmp-backend/src/main/java/eu/eudat/models/admin/components/datasetprofile/FieldSet.java b/dmp-backend/src/main/java/eu/eudat/models/admin/components/datasetprofile/FieldSet.java index 9a783165d..d829b925b 100644 --- a/dmp-backend/src/main/java/eu/eudat/models/admin/components/datasetprofile/FieldSet.java +++ b/dmp-backend/src/main/java/eu/eudat/models/admin/components/datasetprofile/FieldSet.java @@ -16,7 +16,7 @@ public class FieldSet implements Comparable, ViewStyleDefinition fields; public List getFields() { @@ -79,6 +79,14 @@ public class FieldSet implements Comparable, ViewStyleDefinition fields; private List
multiplicityItems; + private boolean hasCommentField; public List getFields() { Collections.sort(this.fields); return fields; @@ -92,6 +93,13 @@ public class FieldSet implements Comparable,PropertiesModelBuilder, ViewStyleDef this.ordinal = ordinal; } + public boolean getHasCommentField() { + return hasCommentField; + } + + public void setHasCommentField(boolean hasCommentField) { + this.hasCommentField = hasCommentField; + } @Override public eu.eudat.entities.xmlmodels.datasetprofiledefinition.FieldSet toDatabaseDefinition(eu.eudat.entities.xmlmodels.datasetprofiledefinition.FieldSet item) { @@ -99,6 +107,8 @@ public class FieldSet implements Comparable,PropertiesModelBuilder, ViewStyleDef item.setFields(viewStylefields); item.setId(this.id); item.setOrdinal(this.ordinal); + item.setHasCommentField(this.hasCommentField); + item.setMultiplicity(this.multiplicity); return item; } @@ -110,6 +120,8 @@ public class FieldSet implements Comparable,PropertiesModelBuilder, ViewStyleDef this.title = item.getTitle(); this.description = item.getDescription(); this.extendedDescription = item.getExtendedDescription(); + this.hasCommentField = item.getHasCommentField(); + this.multiplicity = item.getMultiplicity(); } @Override diff --git a/dmp-backend/src/main/java/eu/eudat/services/ApiContext.java b/dmp-backend/src/main/java/eu/eudat/services/ApiContext.java index b46f7abd6..5f7cc8c78 100644 --- a/dmp-backend/src/main/java/eu/eudat/services/ApiContext.java +++ b/dmp-backend/src/main/java/eu/eudat/services/ApiContext.java @@ -11,4 +11,5 @@ public interface ApiContext { ApplicationContext getApplicationContext(); InvitationService getInvitationService(); RemoteFetcher getRemoteFetcher(); + MailService getMailService(); } diff --git a/dmp-backend/src/main/java/eu/eudat/services/ApiContextImpl.java b/dmp-backend/src/main/java/eu/eudat/services/ApiContextImpl.java index 1f73b93da..429b71b74 100644 --- a/dmp-backend/src/main/java/eu/eudat/services/ApiContextImpl.java +++ b/dmp-backend/src/main/java/eu/eudat/services/ApiContextImpl.java @@ -15,6 +15,7 @@ public class ApiContextImpl implements ApiContext{ private ApplicationContext applicationContext; private RemoteFetcher remoteFetcher; private InvitationService invitationService; + private MailService mailService; @Autowired public void setDatabaseRepository(DatabaseRepository databaseRepository) { @@ -55,4 +56,14 @@ public class ApiContextImpl implements ApiContext{ public void setInvitationService(InvitationService invitationService) { this.invitationService = invitationService; } + + @Override + public MailService getMailService() { + return mailService; + } + + @Autowired + public void setMailService(MailService mailService) { + this.mailService = mailService; + } } diff --git a/dmp-backend/src/main/java/eu/eudat/services/InvitationService.java b/dmp-backend/src/main/java/eu/eudat/services/InvitationService.java index bfaab8a1d..ea028569c 100644 --- a/dmp-backend/src/main/java/eu/eudat/services/InvitationService.java +++ b/dmp-backend/src/main/java/eu/eudat/services/InvitationService.java @@ -18,7 +18,7 @@ public interface InvitationService { void assignToDmp(DMPDao dmpDao, eu.eudat.entities.UserInfo user, DMP dmp); - void createInvitations(InvitationDao invitationDao, List users, DMP dmp); + void createInvitations(InvitationDao invitationDao, List users, DMP dmp, eu.eudat.entities.UserInfo creator); void sendInvitations(List users); } diff --git a/dmp-backend/src/main/java/eu/eudat/services/InvitationServiceImpl.java b/dmp-backend/src/main/java/eu/eudat/services/InvitationServiceImpl.java index 005786eec..9ff7ae75f 100644 --- a/dmp-backend/src/main/java/eu/eudat/services/InvitationServiceImpl.java +++ b/dmp-backend/src/main/java/eu/eudat/services/InvitationServiceImpl.java @@ -31,13 +31,14 @@ public class InvitationServiceImpl implements InvitationService { } @Override - public void createInvitations(InvitationDao invitationDao, List users, DMP dmp) { + public void createInvitations(InvitationDao invitationDao, List users, DMP dmp, eu.eudat.entities.UserInfo creator) { for(eu.eudat.entities.UserInfo userInfo : users){ Invitation invitation = new Invitation(); invitation.setDmp(dmp); invitation.setInvitationEmail(userInfo.getEmail()); - invitation.setUser(userInfo); + invitation.setUser(creator); invitation.setToken(UUID.randomUUID()); + invitation.setAcceptedInvitation(userInfo.getId()!=null); invitationDao.createOrUpdate(invitation); } } diff --git a/dmp-backend/src/main/java/eu/eudat/services/MailService.java b/dmp-backend/src/main/java/eu/eudat/services/MailService.java new file mode 100644 index 000000000..552371493 --- /dev/null +++ b/dmp-backend/src/main/java/eu/eudat/services/MailService.java @@ -0,0 +1,10 @@ +package eu.eudat.services; + +import eu.eudat.models.mail.SimpleMail; + +/** + * Created by ikalyvas on 1/5/2018. + */ +public interface MailService { + void sendSimpleMail(SimpleMail mail); +} diff --git a/dmp-backend/src/main/java/eu/eudat/services/MailServiceImpl.java b/dmp-backend/src/main/java/eu/eudat/services/MailServiceImpl.java new file mode 100644 index 000000000..737ea9fc5 --- /dev/null +++ b/dmp-backend/src/main/java/eu/eudat/services/MailServiceImpl.java @@ -0,0 +1,27 @@ +package eu.eudat.services; + +import eu.eudat.models.mail.SimpleMail; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.mail.SimpleMailMessage; +import org.springframework.mail.javamail.JavaMailSender; +import org.springframework.stereotype.Service; + +/** + * Created by ikalyvas on 1/5/2018. + */ +@Service("mailService") +public class MailServiceImpl implements MailService{ + + @Autowired + private JavaMailSender emailSender; + + @Override + public void sendSimpleMail(SimpleMail mail) { + SimpleMailMessage message = new SimpleMailMessage(); + message.setSubject(mail.getSubject()); + message.setText(mail.getContent()); + message.setTo(mail.getTo()); + message.setFrom(mail.getFrom()); + this.emailSender.send(message); + } +} diff --git a/dmp-frontend/src/app/app-routing.module.ts b/dmp-frontend/src/app/app-routing.module.ts index d07dd3a5a..cd6d6ff6f 100644 --- a/dmp-frontend/src/app/app-routing.module.ts +++ b/dmp-frontend/src/app/app-routing.module.ts @@ -1,3 +1,4 @@ +import { InvitationComponent } from './invitation/invitation.component'; import { UnauthorizedComponent } from './unauthorized/unauthorized.component'; import { NgModule } from '@angular/core'; import { RouterModule, Routes } from '@angular/router'; @@ -29,7 +30,7 @@ const appRoutes: Routes = [ { path: 'dataset/new', component: DatasetWizardComponent, canActivate: [AuthGuard] }, { path: 'dataset/:id', component: DatasetWizardComponent, canActivate: [AuthGuard] }, { path: 'datasets/new', component: DatasetWizardComponent, canActivate: [AuthGuard] }, - + { path: 'invite/:id', component: InvitationComponent, canActivate: [AuthGuard] }, { path: 'login', component: LoginComponent }, { path: "unauthorized", loadChildren: './unauthorized/unauthorized.module#UnauthorizedModule' }, { path: 'welcome', component: HomepageComponent, canActivate: [AuthGuard] }, diff --git a/dmp-frontend/src/app/app.module.ts b/dmp-frontend/src/app/app.module.ts index aa30e6215..2ddc09d39 100644 --- a/dmp-frontend/src/app/app.module.ts +++ b/dmp-frontend/src/app/app.module.ts @@ -1,3 +1,4 @@ +import { InvitationComponent } from './invitation/invitation.component'; import { UnauthorizedComponent } from './unauthorized/unauthorized.component'; import { PaginationService } from './form/pagination/pagination-service'; import { TableOfContentsFieldComponent } from './form/tableOfContents/table-of-content-field/table-of-content-field.component'; @@ -81,6 +82,7 @@ import { AutocompleteComponent } from './shared/components/autocomplete/autocomp DynamicFieldCheckBoxComponent, ProjectEditorComponent, DataManagementPlanEditorComponent, + InvitationComponent, DatasetWizardComponent, FigurecardComponent, DatasetEditorComponent, diff --git a/dmp-frontend/src/app/dmps/dmp-listing.component.html b/dmp-frontend/src/app/dmps/dmp-listing.component.html index 585e0d16b..60aeda3a6 100644 --- a/dmp-frontend/src/app/dmps/dmp-listing.component.html +++ b/dmp-frontend/src/app/dmps/dmp-listing.component.html @@ -7,6 +7,7 @@ + {{'DMP-LISTING.COLUMNS.NAME' | translate}} @@ -43,8 +44,21 @@ {{row.version}} + + {{'DMP-LISTING.COLUMNS.ACTIONS' | translate}} + + + + + + + + + - + diff --git a/dmp-frontend/src/app/dmps/dmp-listing.component.ts b/dmp-frontend/src/app/dmps/dmp-listing.component.ts index e42c7877f..04fe948be 100644 --- a/dmp-frontend/src/app/dmps/dmp-listing.component.ts +++ b/dmp-frontend/src/app/dmps/dmp-listing.component.ts @@ -1,15 +1,16 @@ +import { InvitationComponent } from '../invitation/invitation.component'; import { Component, ViewChild, OnInit, AfterViewInit } from "@angular/core"; -import { MatPaginator, MatSort, MatSnackBar } from "@angular/material"; +import { MatPaginator, MatSort, MatSnackBar, MatDialog } from "@angular/material"; import { Router } from "@angular/router"; import { TranslateService } from "@ngx-translate/core"; import { DataSource } from "@angular/cdk/table"; import { Observable } from "rxjs/Observable"; -import { DataTableRequest } from "@app/models/data-table/DataTableRequest"; import { SnackBarNotificationComponent } from "../shared/components/notificaiton/snack-bar-notification.component"; import { DataManagementPlanService } from "../services/data-management-plan/data-management-plan.service"; import { DataManagementPlanCriteriaComponent } from "../shared/components/criteria/data-management-plan/dmp-criteria.component"; import { DataManagementPlanCriteria } from "../models/criteria/data-management-plan/DataManagementPlanCriteria"; import { DataManagementPlanListingModel } from "../models/data-managemnt-plans/DataManagementPlanListingModel"; +import { DataTableRequest } from '../models/data-table/DataTableRequest'; @@ -26,13 +27,14 @@ export class DataManagementPlanListingComponent implements OnInit { @ViewChild(DataManagementPlanCriteriaComponent) criteria: DataManagementPlanCriteriaComponent; dataSource: DataManagementPlanDataSource | null; - displayedColumns: String[] = ['name', 'project', 'profile', 'researchers', 'organisations', 'version']; + displayedColumns: String[] = ['name', 'project', 'profile', 'researchers', 'organisations', 'version','actions']; constructor( private dataManagementPlanService: DataManagementPlanService, private router: Router, private languageService: TranslateService, public snackBar: MatSnackBar, + public dialog: MatDialog ) { } @@ -55,6 +57,16 @@ export class DataManagementPlanListingComponent implements OnInit { const defaultCriteria = new DataManagementPlanCriteria(); return defaultCriteria; } + + openShareDialog(rowId: any) { + let dialogRef = this.dialog.open(InvitationComponent, { + height: '200px', + width: '700px', + data: { + dmpId: rowId + } + }); + } } export class DataManagementPlanDataSource extends DataSource { @@ -71,23 +83,13 @@ export class DataManagementPlanDataSource extends DataSource { - // this.store.dispatch(new LoadPhotosRequestAction(pageEvent.pageIndex, pageEvent.pageSize)) - //}) } connect(): Observable { const displayDataChanges = [ this._paginator.page - //this._sort.matSortChange ]; - // If the user changes the sort order, reset back to the first page. - //this._sort.matSortChange.subscribe(() => { - // this._paginator.pageIndex = 0; - //}) - return Observable.merge(...displayDataChanges) .startWith(null) .switchMap(() => { @@ -105,7 +107,6 @@ export class DataManagementPlanDataSource extends DataSource { @@ -122,6 +123,5 @@ export class DataManagementPlanDataSource extends DataSource + diff --git a/dmp-frontend/src/app/dmps/editor/dmp-editor.component.ts b/dmp-frontend/src/app/dmps/editor/dmp-editor.component.ts index 8fe54498a..82b3e8049 100644 --- a/dmp-frontend/src/app/dmps/editor/dmp-editor.component.ts +++ b/dmp-frontend/src/app/dmps/editor/dmp-editor.component.ts @@ -123,6 +123,10 @@ export class DataManagementPlanEditorComponent implements AfterViewInit { this.router.navigate(['/dmps']); } + public invite(): void { + this.router.navigate(['/invite/'+this.dataManagementPlan.id]); + } + filterOrganisations(value: string): void { this.filteredOrganisations = undefined; diff --git a/dmp-frontend/src/app/invitation/invitation.component.html b/dmp-frontend/src/app/invitation/invitation.component.html index e69de29bb..5d07c3d72 100644 --- a/dmp-frontend/src/app/invitation/invitation.component.html +++ b/dmp-frontend/src/app/invitation/invitation.component.html @@ -0,0 +1,18 @@ +
+
+ + +
{{chip.name.substring(0, 1).toUpperCase()}}
+ {{chip.name}} +
+ +
+ {{option.name}} +
+
+ +
+ +
+
\ No newline at end of file diff --git a/dmp-frontend/src/app/invitation/invitation.component.ts b/dmp-frontend/src/app/invitation/invitation.component.ts index 26c94324a..32527c36f 100644 --- a/dmp-frontend/src/app/invitation/invitation.component.ts +++ b/dmp-frontend/src/app/invitation/invitation.component.ts @@ -1,8 +1,62 @@ -import { Component } from "@angular/core"; +import { JsonSerializer } from '../utilities/JsonSerializer'; +import { UserInvitationCriteria } from '../models/criteria/invitation/UserInvitationCriteria'; +import { RequestItem } from '../models/criteria/RequestItem'; +import { Invitation } from '../models/invitation/Invitation'; +import { InvitationService } from '../services/invitation/invitation.service'; +import { User } from '../models/invitation/User'; +import { Component, OnInit, Inject } from "@angular/core"; +import { FormGroup } from '@angular/forms'; +import { Params, ActivatedRoute, Router } from '@angular/router'; +import { MAT_DIALOG_DATA } from '@angular/material'; @Component({ selector: 'app-invitation-component', templateUrl: 'invitation.component.html', - }) - export class InvitationComponent { - } \ No newline at end of file + providers: [InvitationService] + +}) +export class InvitationComponent implements OnInit { + + private formGroup: FormGroup; + + private filteredUsersAsync: boolean = false; + + private filteredUsers: User[]; + + constructor( + private invitationService: InvitationService, + private route: ActivatedRoute, + public router: Router, + @Inject(MAT_DIALOG_DATA) public data: any + ) { } + + ngOnInit(): void { + let invitation = new Invitation(); + invitation.dataManagementPlan = this.data.dmpId; + this.formGroup = invitation.buildForm(); + } + + + send(value: any) { + this.invitationService.inviteUsers(this.formGroup.value).subscribe(); + } + + filterUsers(value: string): void { + this.filteredUsers = undefined; + if (value) { + this.filteredUsersAsync = true; + let request = new RequestItem(); + request.criteria = { like: value } + this.invitationService.getUsers(request).subscribe(items => { + this.filteredUsers = JsonSerializer.fromJSONArray(items, User); + if (!this.filteredUsers || this.filteredUsers.length == 0) { + let user = new User(); + user.email = value; + user.name = value; + this.filteredUsers.push(user) + } + this.filteredUsersAsync = false; + }); + } + } +} \ No newline at end of file diff --git a/dmp-frontend/src/app/models/criteria/invitation/UserInvitationCriteria.ts b/dmp-frontend/src/app/models/criteria/invitation/UserInvitationCriteria.ts new file mode 100644 index 000000000..077ea7f43 --- /dev/null +++ b/dmp-frontend/src/app/models/criteria/invitation/UserInvitationCriteria.ts @@ -0,0 +1,4 @@ +import { BaseCriteria } from '../BaseCriteria'; +export class UserInvitationCriteria extends BaseCriteria{ + +} \ No newline at end of file diff --git a/dmp-frontend/src/app/models/invitation/Invitation.ts b/dmp-frontend/src/app/models/invitation/Invitation.ts new file mode 100644 index 000000000..49bc99485 --- /dev/null +++ b/dmp-frontend/src/app/models/invitation/Invitation.ts @@ -0,0 +1,17 @@ +import { FormGenerator } from '../interfaces/FormGenerator'; +import { User } from './User'; +import { FormGroup, FormBuilder } from '@angular/forms'; +export class Invitation implements FormGenerator{ + + public dataManagementPlan: string; + public users = new Array(); + + buildForm(): FormGroup { + let formGroup = new FormBuilder().group({ + dataManagementPlan:[this.dataManagementPlan], + users:[this.users] + }) + + return formGroup; + } +} \ No newline at end of file diff --git a/dmp-frontend/src/app/models/invitation/User.ts b/dmp-frontend/src/app/models/invitation/User.ts new file mode 100644 index 000000000..94818636d --- /dev/null +++ b/dmp-frontend/src/app/models/invitation/User.ts @@ -0,0 +1,25 @@ +import { FormGenerator } from '../interfaces/FormGenerator'; +import { Serializable } from '../interfaces/Serializable'; +import { FormGroup, FormBuilder } from '@angular/forms'; +export class User implements Serializable, FormGenerator{ + + public id: string; + public email:string; + public name:string; + + fromJSONObject(item: any): User { + this.id = item.id; + this.email = item.email; + this.name = item.name; + return this; + } + + buildForm(): FormGroup { + return new FormBuilder().group({ + id:[this.id], + email:[this.email], + name:[this.name] + }) + } + +} \ No newline at end of file diff --git a/dmp-frontend/src/app/services/invitation/invitation.service.ts b/dmp-frontend/src/app/services/invitation/invitation.service.ts new file mode 100644 index 000000000..f4c7cd108 --- /dev/null +++ b/dmp-frontend/src/app/services/invitation/invitation.service.ts @@ -0,0 +1,33 @@ +import { Invitation } from '../../models/invitation/Invitation'; +import { UserInvitationCriteria } from '../../models/criteria/invitation/UserInvitationCriteria'; +import { User } from '../../models/invitation/User'; +import { HostConfiguration } from '../../app.constants'; +import { BaseHttpService } from '../../utilities/cite-http-service-module/base-http.service'; +import { Injectable } from "@angular/core"; +import { HttpHeaders } from '@angular/common/http'; +import { Observable } from 'rxjs/Observable'; +import { RequestItem } from '../../models/criteria/RequestItem'; + +@Injectable() +export class InvitationService { + + private actionUrl: string; + private headers: HttpHeaders; + + constructor(private http: BaseHttpService) { + + this.actionUrl = HostConfiguration.Server + 'invite/'; + + this.headers = new HttpHeaders(); + this.headers = this.headers.set('Content-Type', 'application/json'); + this.headers = this.headers.set('Accept', 'application/json'); + } + + public inviteUsers(invitation: Invitation): Observable { + return this.http.post(this.actionUrl + "users", invitation, { headers: this.headers }); + } + + public getUsers(usersInvitationRequestItem: RequestItem): Observable { + return this.http.post(this.actionUrl + "getUsers", usersInvitationRequestItem, { headers: this.headers }); + } +} \ No newline at end of file diff --git a/dmp-frontend/src/app/shared/material/material.module.ts b/dmp-frontend/src/app/shared/material/material.module.ts index d8e9dfdea..8ad5b2e9b 100644 --- a/dmp-frontend/src/app/shared/material/material.module.ts +++ b/dmp-frontend/src/app/shared/material/material.module.ts @@ -25,7 +25,8 @@ import { MatCheckboxModule, MatTabsModule, MatStepperModule, - MatRadioModule + MatRadioModule, + MatMenuModule } from '@angular/material'; import { CdkTableModule } from '@angular/cdk/table'; import { SnackBarNotificationComponent } from '../components/notificaiton/snack-bar-notification.component'; @@ -64,7 +65,8 @@ import { CovalentLayoutModule, CovalentChipsModule, CovalentDialogsModule } from CovalentChipsModule, CovalentDialogsModule, MatStepperModule, - MatRadioModule + MatRadioModule, + MatMenuModule ], providers: [ diff --git a/dmp-frontend/src/assets/lang/en.json b/dmp-frontend/src/assets/lang/en.json index 04f59362e..439eb9518 100644 --- a/dmp-frontend/src/assets/lang/en.json +++ b/dmp-frontend/src/assets/lang/en.json @@ -41,7 +41,12 @@ "PROFILE": "Profile", "RESEARCHERS": "Researchers", "ORGANISATIONS": "Organisations", - "VERSION": "Version" + "VERSION": "Version", + "ACTIONS":"Actions" + }, + "ACTIONS":{ + "EDIT":"Edit", + "INVITE":"Invite" } }, "DATASET-WIZARD": { @@ -152,5 +157,12 @@ "CANCEL": "Cancel", "DELETE": "Delete" } + }, + "INVITATION-EDITOR": { + "TITLE": "User/Email", + "ACTIONS": { + "SEND-INVITATION": "Send Invitations", + "CANCEL": "Cancel" + } } } \ No newline at end of file