diff --git a/dmp-backend/data/src/main/java/eu/eudat/data/dao/criteria/ProjectCriteria.java b/dmp-backend/data/src/main/java/eu/eudat/data/dao/criteria/ProjectCriteria.java index aa2d835a0..d8a71b7ab 100644 --- a/dmp-backend/data/src/main/java/eu/eudat/data/dao/criteria/ProjectCriteria.java +++ b/dmp-backend/data/src/main/java/eu/eudat/data/dao/criteria/ProjectCriteria.java @@ -1,6 +1,7 @@ package eu.eudat.data.dao.criteria; import eu.eudat.data.entities.Project; +import eu.eudat.types.project.ProjectStateType; import java.util.Date; @@ -8,6 +9,7 @@ public class ProjectCriteria extends Criteria { private Date periodStart; private Date periodEnd; private String reference; + private Integer projectStateType; public Date getPeriodStart() { return periodStart; @@ -32,4 +34,12 @@ public class ProjectCriteria extends Criteria { public void setReference(String reference) { this.reference = reference; } + + public Integer getProjectStateType() { + return projectStateType; + } + + public void setProjectStateType(Integer projectStateType) { + this.projectStateType = projectStateType; + } } diff --git a/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/ProjectDaoImpl.java b/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/ProjectDaoImpl.java index cbd98f97e..6f4cc4665 100644 --- a/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/ProjectDaoImpl.java +++ b/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/ProjectDaoImpl.java @@ -6,10 +6,12 @@ import eu.eudat.data.dao.databaselayer.service.DatabaseService; import eu.eudat.data.entities.Project; import eu.eudat.data.entities.UserInfo; import eu.eudat.queryable.QueryableList; +import eu.eudat.types.project.ProjectStateType; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import javax.persistence.criteria.JoinType; +import java.util.Date; import java.util.UUID; import java.util.concurrent.CompletableFuture; @@ -32,6 +34,14 @@ public class ProjectDaoImpl extends DatabaseAccess implements ProjectDa query.where((builder, root) -> builder.greaterThan(root.get("startdate"), criteria.getPeriodStart())); if (criteria.getReference() != null) query.where((builder, root) -> builder.equal(root.get("reference"), criteria.getReference())); + if (criteria.getProjectStateType() != null) { + if (criteria.getProjectStateType().equals(ProjectStateType.FINISHED.getValue())) + query.where((builder, root) -> builder.lessThan(root.get("enddate"), new Date())); + if (criteria.getProjectStateType().equals(ProjectStateType.ONGOING.getValue())) + query.where((builder, root) -> + builder.or(builder.greaterThan(root.get("enddate"), new Date()) + , builder.isNull(root.get("enddate")))); + } query.where((builder, root) -> builder.notEqual(root.get("status"), Project.Status.DELETED.getValue())); return query; } diff --git a/dmp-backend/data/src/main/java/eu/eudat/types/project/ProjectStateType.java b/dmp-backend/data/src/main/java/eu/eudat/types/project/ProjectStateType.java new file mode 100644 index 000000000..a2d0497f0 --- /dev/null +++ b/dmp-backend/data/src/main/java/eu/eudat/types/project/ProjectStateType.java @@ -0,0 +1,29 @@ +package eu.eudat.types.project; + +/** + * Created by ikalyvas on 8/24/2018. + */ +public enum ProjectStateType { + ONGOING(0), FINISHED(1); + + private Integer value; + + private ProjectStateType(Integer value) { + this.value = value; + } + + public Integer getValue() { + return value; + } + + public static ProjectStateType fromInteger(Integer value) { + switch (value) { + case 0: + return ONGOING; + case 1: + return FINISHED; + default: + throw new RuntimeException("Unsupported Project State Type"); + } + } +} diff --git a/dmp-backend/web/src/main/java/eu/eudat/controllers/DMPs.java b/dmp-backend/web/src/main/java/eu/eudat/controllers/DMPs.java index fceb66f96..31f6b0520 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/controllers/DMPs.java +++ b/dmp-backend/web/src/main/java/eu/eudat/controllers/DMPs.java @@ -111,7 +111,7 @@ public class DMPs extends BaseController { public @ResponseBody ResponseEntity>> getWithCriteria(@RequestBody DataManagementPlanCriteriaRequest dataManagementPlanCriteria, Principal principal) { try { - List dataTable = new DataManagementPlanManager().getWithCriteria(this.getApiContext().getOperationsContext().getDatabaseRepository().getDmpDao(), dataManagementPlanCriteria); + List dataTable = new DataManagementPlanManager().getWithCriteria(this.getApiContext().getOperationsContext().getDatabaseRepository().getDmpDao(), dataManagementPlanCriteria, principal); return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem>().status(ApiMessageCode.NO_MESSAGE).payload(dataTable)); } catch (Exception ex) { ex.printStackTrace(); diff --git a/dmp-backend/web/src/main/java/eu/eudat/controllers/DashBoardController.java b/dmp-backend/web/src/main/java/eu/eudat/controllers/DashBoardController.java index 4155b4082..b534e1a2a 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/controllers/DashBoardController.java +++ b/dmp-backend/web/src/main/java/eu/eudat/controllers/DashBoardController.java @@ -2,6 +2,7 @@ package eu.eudat.controllers; import eu.eudat.logic.managers.DashBoardManager; import eu.eudat.models.data.dashboard.recent.RecentActivity; +import eu.eudat.models.data.dashboard.searchbar.SearchBarItem; import eu.eudat.models.data.dashboard.statistics.DashBoardStatistics; import eu.eudat.models.data.helpers.responses.ResponseItem; import eu.eudat.models.data.security.Principal; @@ -12,6 +13,8 @@ import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; +import java.util.List; + @RestController @CrossOrigin @RequestMapping(value = {"/api"}) @@ -57,4 +60,16 @@ public class DashBoardController extends BaseController { return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(new ResponseItem().status(ApiMessageCode.DEFAULT_ERROR_MESSAGE).message(ex.getMessage())); } } + + @RequestMapping(method = RequestMethod.GET, value = {"/dashboard/search"}, produces = "application/json") + public ResponseEntity>> search(@RequestParam(name = "like") String like, Principal principal) { + try { + List searchBarItemList = new DashBoardManager().searchUserData(like,this.getApiContext(), this.getApiContext().getOperationsContext().getDatabaseRepository().getDatasetDao(), this.getApiContext().getOperationsContext().getDatabaseRepository().getDmpDao() + , this.getApiContext().getOperationsContext().getDatabaseRepository().getProjectDao(), principal); + return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem>().status(ApiMessageCode.NO_MESSAGE).payload(searchBarItemList)); + } catch (Exception ex) { + ex.printStackTrace(); + return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(new ResponseItem>().status(ApiMessageCode.DEFAULT_ERROR_MESSAGE).message(ex.getMessage())); + } + } } diff --git a/dmp-backend/web/src/main/java/eu/eudat/controllers/Users.java b/dmp-backend/web/src/main/java/eu/eudat/controllers/Users.java index 3bd2dcc57..36c84eac6 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/controllers/Users.java +++ b/dmp-backend/web/src/main/java/eu/eudat/controllers/Users.java @@ -8,6 +8,7 @@ import eu.eudat.data.query.items.table.userinfo.UserInfoTableRequestItem; import eu.eudat.models.data.userinfo.UserListingModel; import eu.eudat.logic.security.claims.ClaimedAuthorities; import eu.eudat.logic.services.ApiContext; +import eu.eudat.models.data.userinfo.UserProfile; import eu.eudat.types.ApiMessageCode; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; @@ -17,6 +18,8 @@ import org.springframework.web.bind.annotation.*; import javax.validation.Valid; +import java.util.UUID; + import static eu.eudat.types.Authorities.ADMIN; @@ -54,6 +57,19 @@ public class Users extends BaseController { return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(new ResponseItem().status(ApiMessageCode.DEFAULT_ERROR_MESSAGE).message(ex.getMessage())); } } + + @RequestMapping(method = RequestMethod.GET, value = {"/{id}"}, produces = "application/json") + public @ResponseBody + ResponseEntity> get(@PathVariable String id, Principal principal) { + try { + UUID userId = id.equals("me") ? principal.getId() : UUID.fromString(id); + UserProfile user = UserManager.getSingle(this.getApiContext(), userId); + return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem().payload(user).status(ApiMessageCode.NO_MESSAGE)); + } catch (Exception ex) { + ex.printStackTrace(); + return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(new ResponseItem().status(ApiMessageCode.DEFAULT_ERROR_MESSAGE).message(ex.getMessage())); + } + } } diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/handlers/PrincipalArgumentResolver.java b/dmp-backend/web/src/main/java/eu/eudat/logic/handlers/PrincipalArgumentResolver.java index 22b7f1c8d..47c2798e6 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/handlers/PrincipalArgumentResolver.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/handlers/PrincipalArgumentResolver.java @@ -32,6 +32,7 @@ public final class PrincipalArgumentResolver implements HandlerMethodArgumentRes String token = nativeWebRequest.getHeader("AuthToken"); Optional claimsAnnotation = Arrays.stream(methodParameter.getParameterAnnotations()).filter(annotation -> annotation.annotationType().equals(ClaimedAuthorities.class)).findAny(); List claimList = claimsAnnotation.map(annotation -> Arrays.asList(((ClaimedAuthorities) annotation).claims())).orElse(Authorities.all()); + if(claimList.size() == 0 && claimList.get(0).equals(Authorities.ANONYMOUS)) return new Principal(); if (token == null) throw new UnauthorisedException("Authentication Information Is Missing"); UUID authToken; try { diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DashBoardManager.java b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DashBoardManager.java index 46432fbff..9c9ce99ea 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DashBoardManager.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DashBoardManager.java @@ -1,18 +1,21 @@ package eu.eudat.logic.managers; -import eu.eudat.logic.builders.model.models.RecentActivityDataBuilder; +import eu.eudat.data.dao.criteria.DataManagementPlanCriteria; +import eu.eudat.data.dao.criteria.DatasetCriteria; import eu.eudat.data.dao.entities.DMPDao; import eu.eudat.data.dao.entities.DatasetDao; import eu.eudat.data.dao.entities.ProjectDao; import eu.eudat.data.entities.UserInfo; -import eu.eudat.data.dao.criteria.DataManagementPlanCriteria; -import eu.eudat.data.dao.criteria.DatasetCriteria; +import eu.eudat.logic.builders.model.models.RecentActivityDataBuilder; +import eu.eudat.logic.services.ApiContext; import eu.eudat.models.data.dashboard.recent.RecentActivity; import eu.eudat.models.data.dashboard.recent.RecentActivityData; +import eu.eudat.models.data.dashboard.searchbar.SearchBarItem; import eu.eudat.models.data.dashboard.statistics.DashBoardStatistics; import eu.eudat.models.data.security.Principal; -import eu.eudat.logic.services.ApiContext; +import eu.eudat.types.searchbar.SearchBarItemType; +import java.util.LinkedList; import java.util.List; import java.util.concurrent.CompletableFuture; @@ -87,4 +90,35 @@ public class DashBoardManager { return activity; } + public List searchUserData(String like, ApiContext apiContext, DatasetDao datasetRepository, DMPDao dataManagementPlanRepository, ProjectDao projectRepository, Principal principal) { + RecentActivity activity = new RecentActivity(); + UserInfo user = new UserInfo(); + user.setId(principal.getId()); + + List searchBarItems = new LinkedList<>(); + CompletableFuture> dmps = dataManagementPlanRepository.getAuthenticated(dataManagementPlanRepository.asQueryable(), user) + .withHint("dmpRecentActivity") + .where((builder, root) -> builder.like(root.get("label"), "%" + like + "%")) + .orderBy((builder, root) -> builder.desc(root.get("modified"))) + .selectAsync(item -> new SearchBarItem(item.getId().toString(), item.getLabel(), SearchBarItemType.DMP.getValue())) + .whenComplete((dmpItems, throwable) -> searchBarItems.addAll(dmpItems)); + + CompletableFuture> datasets = datasetRepository.getAuthenticated(datasetRepository.asQueryable(), user) + .withHint("datasetRecentActivity") + .where((builder, root) -> builder.like(root.get("label"), "%" + like + "%")) + .orderBy((builder, root) -> builder.desc(root.get("modified"))) + .selectAsync(item -> new SearchBarItem(item.getId().toString(), item.getLabel(), SearchBarItemType.DATASET.getValue())) + .whenComplete((dataSetItems, throwable) -> searchBarItems.addAll(dataSetItems)); + + CompletableFuture> projects = projectRepository.getAuthenticated(projectRepository.asQueryable(), user) + .withHint("projectRecentActivity") + .where((builder, root) -> builder.like(root.get("label"), "%" + like + "%")) + .orderBy((builder, root) -> builder.desc(root.get("modified"))) + .selectAsync(item -> new SearchBarItem(item.getId().toString(), item.getLabel(), SearchBarItemType.PROJECT.getValue())) + .whenComplete((projectItems, throwable) -> searchBarItems.addAll(projectItems)); + + CompletableFuture.allOf(projects, dmps, datasets).join(); + return searchBarItems; + } + } 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 a7c0cc317..c91d5409d 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 @@ -88,9 +88,12 @@ public class DataManagementPlanManager { return datamanagementPlan; } - public List getWithCriteria(DMPDao dmpsRepository, DataManagementPlanCriteriaRequest dataManagementPlanCriteria) throws IllegalAccessException, InstantiationException { - QueryableList items = dmpsRepository.getWithCriteria(dataManagementPlanCriteria.getCriteria()); - List datamanagementPlans = items.select(item -> new DataManagementPlan().fromDataModel(item)); + public List getWithCriteria(DMPDao dmpsRepository, DataManagementPlanCriteriaRequest dataManagementPlanCriteria, Principal principal) throws IllegalAccessException, InstantiationException { + UserInfo userInfo = new UserInfo(); + userInfo.setId(principal.getId()); + QueryableList items = dmpsRepository.getWithCriteria(dataManagementPlanCriteria.getCriteria()).withHint(HintedModelFactory.getHint(DataManagementPlan.class)); + QueryableList authenticatedItems = dmpsRepository.getAuthenticated(items, userInfo); + List datamanagementPlans = authenticatedItems.select(item -> new DataManagementPlan().fromDataModel(item)); return datamanagementPlans; } diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/UserManager.java b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/UserManager.java index cf9359ac2..7e8e58777 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/UserManager.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/UserManager.java @@ -4,11 +4,13 @@ import eu.eudat.logic.builders.entity.UserRoleBuilder; import eu.eudat.logic.builders.model.models.DataTableDataBuilder; import eu.eudat.data.entities.UserRole; import eu.eudat.exceptions.security.UnauthorisedException; +import eu.eudat.models.data.dmp.DataManagementPlan; import eu.eudat.models.data.helpers.common.DataTableData; import eu.eudat.models.data.login.Credentials; import eu.eudat.models.data.security.Principal; import eu.eudat.data.query.items.table.userinfo.UserInfoTableRequestItem; import eu.eudat.models.data.userinfo.UserListingModel; +import eu.eudat.models.data.userinfo.UserProfile; import eu.eudat.queryable.QueryableList; import eu.eudat.logic.services.ApiContext; import eu.eudat.logic.services.operations.AuthenticationServiceImpl; @@ -17,6 +19,8 @@ import org.w3c.dom.Document; import org.w3c.dom.Element; import java.util.List; +import java.util.UUID; +import java.util.stream.Collectors; public class UserManager { public static eu.eudat.models.data.user.composite.DatasetProfile generateDatasetProfileModel(eu.eudat.data.entities.DatasetProfile profile) { @@ -38,6 +42,13 @@ public class UserManager { return apiContext.getOperationsContext().getBuilderFactory().getBuilder(DataTableDataBuilder.class).totalCount(users.count()).data(modelUsers).build(); } + public static UserProfile getSingle(ApiContext apiContext, UUID userId) throws Exception { + eu.eudat.data.entities.UserInfo user = apiContext.getOperationsContext().getDatabaseRepository().getUserInfoDao().find(userId); + UserProfile profile = new UserProfile().fromDataModel(user); + profile.setAssociatedDmps(user.getDmps().stream().map(x-> new DataManagementPlan().fromDataModel(x)).collect(Collectors.toList())); + return profile; + } + public static void editRoles(ApiContext apiContext, UserListingModel user) { eu.eudat.data.entities.UserInfo userInfo = apiContext.getOperationsContext().getDatabaseRepository().getUserInfoDao().find(user.getId()); userInfo.getUserRoles().stream().forEach(item -> apiContext.getOperationsContext().getDatabaseRepository().getUserRoleDao().delete(item)); diff --git a/dmp-backend/web/src/main/java/eu/eudat/models/data/dashboard/searchbar/SearchBarItem.java b/dmp-backend/web/src/main/java/eu/eudat/models/data/dashboard/searchbar/SearchBarItem.java new file mode 100644 index 000000000..57ada987d --- /dev/null +++ b/dmp-backend/web/src/main/java/eu/eudat/models/data/dashboard/searchbar/SearchBarItem.java @@ -0,0 +1,40 @@ +package eu.eudat.models.data.dashboard.searchbar; + +/** + * Created by ikalyvas on 7/26/2018. + */ +public class SearchBarItem { + private String id; + private String label; + private int type; + + public SearchBarItem(String id, String label, int type) { + this.id = id; + this.label = label; + this.type = type; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getLabel() { + return label; + } + + public void setLabel(String label) { + this.label = label; + } + + public int getType() { + return type; + } + + public void setType(int type) { + this.type = type; + } +} diff --git a/dmp-backend/web/src/main/java/eu/eudat/models/data/datasetwizard/DatasetWizardModel.java b/dmp-backend/web/src/main/java/eu/eudat/models/data/datasetwizard/DatasetWizardModel.java index 24c11a629..595705435 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/models/data/datasetwizard/DatasetWizardModel.java +++ b/dmp-backend/web/src/main/java/eu/eudat/models/data/datasetwizard/DatasetWizardModel.java @@ -198,7 +198,9 @@ public class DatasetWizardModel implements DataModel { dataManagementPlanEntity.setProperties(this.properties != null ? JSONObject.toJSONString(this.properties) : null); dataManagementPlanEntity.setGroupId(this.groupId != null ? this.groupId : UUID.randomUUID()); dataManagementPlanEntity.setCreated(this.created != null ? this.created : new Date()); - dataManagementPlanEntity.setDmpProperties(JSONObject.toJSONString(this.dynamicFields.stream().filter(item -> item.getValue() != null).collect(Collectors.toMap(DynamicFieldWithValue::getId, DynamicFieldWithValue::getValue)))); - dataManagementPlanEntity.setDmpProperties(JSONObject.toJSONString(this.dynamicFields.stream().filter(item -> item.getValue() != null).collect(Collectors.toMap(DynamicFieldWithValue::getId, DynamicFieldWithValue::getValue)))); + if (this.dynamicFields != null) + dataManagementPlanEntity.setDmpProperties(JSONObject.toJSONString(this.dynamicFields.stream().filter(item -> item.getValue() != null).collect(Collectors.toMap(DynamicFieldWithValue::getId, DynamicFieldWithValue::getValue)))); dataManagementPlanEntity.setUsers(new HashSet<>(this.associatedUsers.stream().map(item -> item.toDataModel()).collect(Collectors.toList()))); return dataManagementPlanEntity; } @Override public String getHint() { - return null; + return "fullyDetailed"; } } diff --git a/dmp-backend/web/src/main/java/eu/eudat/models/data/userinfo/UserProfile.java b/dmp-backend/web/src/main/java/eu/eudat/models/data/userinfo/UserProfile.java new file mode 100644 index 000000000..0276ac5f3 --- /dev/null +++ b/dmp-backend/web/src/main/java/eu/eudat/models/data/userinfo/UserProfile.java @@ -0,0 +1,102 @@ +package eu.eudat.models.data.userinfo; + +import eu.eudat.data.entities.*; +import eu.eudat.data.entities.UserInfo; +import eu.eudat.models.DataModel; +import eu.eudat.models.data.dmp.DataManagementPlan; + +import java.util.Date; +import java.util.List; +import java.util.UUID; +import java.util.stream.Collectors; + +/** + * Created by ikalyvas on 8/24/2018. + */ +public class UserProfile implements DataModel { + + private UUID id; + private String email; + private Short usertype; + private String name; + private Date lastloggedin; + private String additionalinfo; + private List associatedDmps; + + public UUID getId() { + return id; + } + + public void setId(UUID id) { + this.id = id; + } + + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } + + public Short getUsertype() { + return usertype; + } + + public void setUsertype(Short usertype) { + this.usertype = usertype; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Date getLastloggedin() { + return lastloggedin; + } + + public void setLastloggedin(Date lastloggedin) { + this.lastloggedin = lastloggedin; + } + + public String getAdditionalinfo() { + return additionalinfo; + } + + public void setAdditionalinfo(String additionalinfo) { + this.additionalinfo = additionalinfo; + } + + public List getAssociatedDmps() { + return associatedDmps; + } + + public void setAssociatedDmps(List associatedDmps) { + this.associatedDmps = associatedDmps; + } + + @Override + public UserProfile fromDataModel(UserInfo entity) { + this.id = entity.getId(); + this.email = entity.getEmail(); + this.usertype = entity.getUsertype(); + this.name = entity.getName(); + this.lastloggedin = entity.getLastloggedin(); + this.additionalinfo = entity.getAdditionalinfo(); + return this; + } + + @Override + public UserInfo toDataModel() throws Exception { + return null; + } + + @Override + public String getHint() { + return null; + } +} diff --git a/dmp-backend/web/src/main/java/eu/eudat/types/Authorities.java b/dmp-backend/web/src/main/java/eu/eudat/types/Authorities.java index d3f3f7af0..129db641a 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/types/Authorities.java +++ b/dmp-backend/web/src/main/java/eu/eudat/types/Authorities.java @@ -5,7 +5,7 @@ import java.util.List; public enum Authorities { - USER(0), MANAGER(1), ADMIN(2); + USER(0), MANAGER(1), ADMIN(2), ANONYMOUS(99); private Integer value; @@ -25,6 +25,8 @@ public enum Authorities { return MANAGER; case 2: return ADMIN; + case 99: + return ANONYMOUS; default: throw new RuntimeException("Unsupported Authority Type"); } diff --git a/dmp-backend/web/src/main/java/eu/eudat/types/searchbar/SearchBarItemType.java b/dmp-backend/web/src/main/java/eu/eudat/types/searchbar/SearchBarItemType.java new file mode 100644 index 000000000..e5dccf5cb --- /dev/null +++ b/dmp-backend/web/src/main/java/eu/eudat/types/searchbar/SearchBarItemType.java @@ -0,0 +1,32 @@ +package eu.eudat.types.searchbar; + +/** + * Created by ikalyvas on 7/26/2018. + */ +public enum SearchBarItemType { + DATASET(0), DMP(1), PROJECT(2); + + private Integer value; + + private SearchBarItemType(Integer value) { + this.value = value; + } + + public Integer getValue() { + return value; + } + + public static SearchBarItemType fromInteger(Integer value) { + switch (value) { + case 0: + return DATASET; + case 1: + return DMP; + case 2: + return PROJECT; + default: + throw new RuntimeException("Unsupported Search bar item Code"); + } + } + +} diff --git a/dmp-backend/web/src/main/resources/application.properties b/dmp-backend/web/src/main/resources/application.properties index ac7cd7360..100a05014 100644 --- a/dmp-backend/web/src/main/resources/application.properties +++ b/dmp-backend/web/src/main/resources/application.properties @@ -71,5 +71,5 @@ http-logger.initial-delay = 0 http-logger.delay = 10 http-logger.server-address = http://logstash:31311 #############################Elastic Search###################################### -elasticsearch.host = elasticsearch-dmp -elasticsearch.port = 9200 +elasticsearch.host = localhost +elasticsearch.port = 9201 diff --git a/dmp-frontend/src/app/app.component.html b/dmp-frontend/src/app/app.component.html index cbb177565..8cb5a9933 100644 --- a/dmp-frontend/src/app/app.component.html +++ b/dmp-frontend/src/app/app.component.html @@ -1,6 +1,6 @@ - + -
+
diff --git a/dmp-frontend/src/app/datasets/dataset-wizard/dataset-wizard.component.html b/dmp-frontend/src/app/datasets/dataset-wizard/dataset-wizard.component.html index 15e5a871a..bc0f0d055 100644 --- a/dmp-frontend/src/app/datasets/dataset-wizard/dataset-wizard.component.html +++ b/dmp-frontend/src/app/datasets/dataset-wizard/dataset-wizard.component.html @@ -1,6 +1,6 @@

New Dataset

-

{{datasetWizardModel.label}} Dataset

+

{{datasetWizardModel?.label}} Dataset

- - - +
+
+ + + + +
diff --git a/dmp-frontend/src/app/dmps/editor/dmp-editor.component.scss b/dmp-frontend/src/app/dmps/editor/dmp-editor.component.scss index f767e8175..894ac9779 100644 --- a/dmp-frontend/src/app/dmps/editor/dmp-editor.component.scss +++ b/dmp-frontend/src/app/dmps/editor/dmp-editor.component.scss @@ -18,6 +18,9 @@ } .left-button { float: left; + } + .right-button { + float: right; } .description-area { height: 100px; diff --git a/dmp-frontend/src/app/dmps/listing/dmp-listing.component.ts b/dmp-frontend/src/app/dmps/listing/dmp-listing.component.ts index dc6b1c3c3..ff1c333f9 100644 --- a/dmp-frontend/src/app/dmps/listing/dmp-listing.component.ts +++ b/dmp-frontend/src/app/dmps/listing/dmp-listing.component.ts @@ -158,7 +158,7 @@ export class DataManagementPlanDataSource extends DataSource = new Array() if (this._sort.active) fields = this._sort.direction === "asc" ? ["+" + this._sort.active] : ["-" + this._sort.active]; const request = new DataTableRequest(startIndex, this._paginator.pageSize, { fields: fields }); - request.criteria = this._criteria.criteria; + request.criteria = this._criteria.formGroup.value; if (this.itemId) { request.criteria.groupIds = [this.itemId]; request.criteria.allVersions = true; diff --git a/dmp-frontend/src/app/dmps/wizard/editor/dmp-wizard-editor.component.ts b/dmp-frontend/src/app/dmps/wizard/editor/dmp-wizard-editor.component.ts index 244c58994..fcc3e5f21 100644 --- a/dmp-frontend/src/app/dmps/wizard/editor/dmp-wizard-editor.component.ts +++ b/dmp-frontend/src/app/dmps/wizard/editor/dmp-wizard-editor.component.ts @@ -30,7 +30,7 @@ import { MultipleAutoCompleteConfiguration } from '../../../shared/components/au styleUrls: ['./dmp-wizard-editor.component.scss'], encapsulation: ViewEncapsulation.None }) -export class DataManagementPlanWizardEditorComponent implements AfterViewInit { +export class DataManagementPlanWizardEditorComponent implements OnInit { isNew = true; diff --git a/dmp-frontend/src/app/homepage/homepage.component.html b/dmp-frontend/src/app/homepage/homepage.component.html index de0bcf94d..7eef0750c 100644 --- a/dmp-frontend/src/app/homepage/homepage.component.html +++ b/dmp-frontend/src/app/homepage/homepage.component.html @@ -1,32 +1,88 @@
-
+

{{ 'HOMEPAGE.OPEN-DMPS.STATS' | translate }}

{{ 'HOMEPAGE.MY-DMPS.STATS' | translate }}

-
-
- - -
-
- - -
-
- - -
+ +
+
+
+ + + + + + {{'RECENT-ACTIVITY.MY-TITLE-DMP' | translate}} + + + + + +

+ {{activity.label}} +

+

+ {{activity.timestamp | date:'shortDate'}} +

+
+
+
+
-
-
- -
+
+ + + + + + {{'RECENT-ACTIVITY.MY-TITLE-PROJECT' | translate}} + + + + + +

+ {{activity.label}} +

+

+ {{activity.timestamp | date:'shortDate'}} +

+
+
+
+
+
+
+ + + + + + {{'RECENT-ACTIVITY.MY-TITLE-DATASET' | translate}} + + + + + +

+ {{activity.label}} +

+

+ {{activity.timestamp | date:'shortDate'}} +

+
+
+
+
diff --git a/dmp-frontend/src/app/homepage/homepage.component.css b/dmp-frontend/src/app/homepage/homepage.component.scss similarity index 70% rename from dmp-frontend/src/app/homepage/homepage.component.css rename to dmp-frontend/src/app/homepage/homepage.component.scss index 4aff42e90..38c6a62df 100644 --- a/dmp-frontend/src/app/homepage/homepage.component.css +++ b/dmp-frontend/src/app/homepage/homepage.component.scss @@ -54,21 +54,6 @@ box-shadow: 0 10px 30px -12px rgba(0, 0, 0, 0.42), 0 4px 25px 0px rgba(0, 0, 0, 0.12), 0 8px 10px -5px rgba(0, 0, 0, 0.2); } - @media screen and (max-width: 990px) { - #sidebar, - #nav-right, - #nav-left-button { - display: none; - } - #menu { - display: inline; - } - #main-panel { - padding-left: 0; - -webkit-transition: all 400ms; - -moz-transition: all 400ms; - -ms-transition: all 400ms; - -o-transition: all 400ms; - transition: all 400ms; - } - } \ No newline at end of file + .full-width { + width: 100%; + } diff --git a/dmp-frontend/src/app/homepage/homepage.component.ts b/dmp-frontend/src/app/homepage/homepage.component.ts index f8835c0bc..a6b87c8f6 100644 --- a/dmp-frontend/src/app/homepage/homepage.component.ts +++ b/dmp-frontend/src/app/homepage/homepage.component.ts @@ -4,22 +4,45 @@ import { DashboardService } from '../../app/services/dashboard/dashboard.service import { DashboardStatisticsModel } from '../models/dashboard/DashboardStatisticsModel'; import { JsonSerializer } from '../utilities/JsonSerializer'; import { AuthService } from '../services/auth/auth.service'; +import { FormControl } from '@angular/forms'; +import { RequestItem } from '../models/criteria/RequestItem'; +import { ProjectCriteria } from '../models/criteria/project/ProjectCriteria'; +import { ProjectService } from '../services/project/project.service'; +import { SingleAutoCompleteConfiguration } from '../shared/components/autocompletes/single/single-auto-complete-configuration'; +import { UserReferenceService } from '../services/user-reference/user-reference-data.service'; +import { RecentActivityTypes } from '../users/activity/RecentActivityTypes'; +import { Observable } from 'rxjs/internal/Observable'; +import { SearchBarItem } from '../models/dashboard/SearchBarItem'; +import { SearchBarType } from '../shared/components/search-bar/types/search-bar-type'; @Component({ selector: 'homepage', templateUrl: './homepage.component.html', - styleUrls: ['./homepage.component.css'], + styleUrls: ['./homepage.component.scss'], + providers: [ProjectService, UserReferenceService] }) export class HomepageComponent implements OnInit { public userInfo: any; + datasetActivities: any[]; + projectActivities: any[]; + dmpActivities: any[]; public dashboardStatisticsData: DashboardStatisticsModel = new DashboardStatisticsModel(); + public formControl = new FormControl(); + projectAutoCompleteConfiguration: SingleAutoCompleteConfiguration; + public searchControl = new FormControl(); + filteredOptions: Observable; + RecentActivityTypes = RecentActivityTypes + public search = false; constructor( private route: ActivatedRoute, private router: Router, + private projectService: ProjectService, private dashBoardService: DashboardService, - private authentication: AuthService + private authentication: AuthService, + private userReferenceService: UserReferenceService + ) { this.dashboardStatisticsData.totalDataManagementPlanCount = 0; this.dashboardStatisticsData.totalDataSetCount = 0; @@ -29,6 +52,21 @@ export class HomepageComponent implements OnInit { ngOnInit() { + this.userReferenceService.getRecentActivity().subscribe(response => { + this.datasetActivities = response["recentDatasetActivities"]; + this.dmpActivities = response["recentDmpActivities"]; + this.projectActivities = response["recentProjectActivities"]; + }) + + this.projectAutoCompleteConfiguration = { + filterFn: this.searchProject.bind(this), + items: this.searchProject(''), + displayFn: (item) => item["label"], + titleFn: (item) => item["label"], + //mapFn: (item) => new JsonSerializer().fromJSONArray(item, ProjectReference).map(item => item.toDropdownList()), + loadDataOnStart: true + }; + if (!this.isAuthenticated()) { this.dashBoardService.getStatistics().subscribe(results => { //let data = results['payload']; @@ -40,6 +78,9 @@ export class HomepageComponent implements OnInit { }) } + this.filteredOptions = this.searchControl.valueChanges.flatMap(x => { + return this.dashBoardService.searchUserItems(x); + }) } @@ -47,4 +88,36 @@ export class HomepageComponent implements OnInit { return !(!this.authentication.current()) } + searchProject(query: string) { + let projectRequestItem: RequestItem = new RequestItem(); + projectRequestItem.criteria = new ProjectCriteria(); + projectRequestItem.criteria.like = query; + return this.projectService.getWithExternal(projectRequestItem); + } + + redirect(id: string, type: RecentActivityTypes) { + switch (type) { + case RecentActivityTypes.PROJECT: { + this.router.navigate(["projects/edit/" + id]); + return; + } + case RecentActivityTypes.DATASET: { + this.router.navigate(["datasets/edit/" + id]); + return; + } + case RecentActivityTypes.DMP: { + this.router.navigate(["dmps/edit/" + id]); + return; + } + default: throw new Error("Unsupported Activity Type ") + } + + } + + onOptionSelected(event: any) { + let selectedSearchBarItem = event.option.value; + if (selectedSearchBarItem.type == SearchBarType.DATASET) this.router.navigate(["datasets/edit/" + selectedSearchBarItem.id]) + if (selectedSearchBarItem.type == SearchBarType.PROJECT) this.router.navigate(["projects/edit/" + selectedSearchBarItem.id]) + if (selectedSearchBarItem.type == SearchBarType.DATAMANAGEMENTPLAN) this.router.navigate(["dmps/edit/" + selectedSearchBarItem.id]) + } } diff --git a/dmp-frontend/src/app/models/criteria/project/ProjectCriteria.ts b/dmp-frontend/src/app/models/criteria/project/ProjectCriteria.ts index 4ae9e5616..cc9422d5b 100644 --- a/dmp-frontend/src/app/models/criteria/project/ProjectCriteria.ts +++ b/dmp-frontend/src/app/models/criteria/project/ProjectCriteria.ts @@ -1,6 +1,8 @@ import { BaseCriteria } from "../BaseCriteria"; +import { ProjectStateType } from "../../projects/ProjectStateType"; export class ProjectCriteria extends BaseCriteria { public periodStart: Date; - public periodEnd: Date; + public periodEnd: Date; + public projectStateType: ProjectStateType } diff --git a/dmp-frontend/src/app/models/dashboard/SearchBarItem.ts b/dmp-frontend/src/app/models/dashboard/SearchBarItem.ts new file mode 100644 index 000000000..68c938171 --- /dev/null +++ b/dmp-frontend/src/app/models/dashboard/SearchBarItem.ts @@ -0,0 +1,4 @@ +export class SearchBarItem { + public id: string; + public label: string; +} diff --git a/dmp-frontend/src/app/models/projects/ProjectStateType.ts b/dmp-frontend/src/app/models/projects/ProjectStateType.ts new file mode 100644 index 000000000..08a08724b --- /dev/null +++ b/dmp-frontend/src/app/models/projects/ProjectStateType.ts @@ -0,0 +1,4 @@ +export enum ProjectStateType { + OnGoing = 0, + Finished = 1 +} diff --git a/dmp-frontend/src/app/projects/editor/project-editor.component.html b/dmp-frontend/src/app/projects/editor/project-editor.component.html index d42b296f5..4f7fd6d50 100644 --- a/dmp-frontend/src/app/projects/editor/project-editor.component.html +++ b/dmp-frontend/src/app/projects/editor/project-editor.component.html @@ -4,6 +4,18 @@ + + + + + +
+ + + + + +
-
+
-
+
diff --git a/dmp-frontend/src/app/projects/editor/project-editor.component.scss b/dmp-frontend/src/app/projects/editor/project-editor.component.scss index 9994fbf37..0845cd529 100644 --- a/dmp-frontend/src/app/projects/editor/project-editor.component.scss +++ b/dmp-frontend/src/app/projects/editor/project-editor.component.scss @@ -42,3 +42,8 @@ h3{ margin-top: 0px; } + + +.hidden { + display: none !important; +} \ No newline at end of file diff --git a/dmp-frontend/src/app/projects/editor/project-editor.component.ts b/dmp-frontend/src/app/projects/editor/project-editor.component.ts index 922005b98..05e48a389 100644 --- a/dmp-frontend/src/app/projects/editor/project-editor.component.ts +++ b/dmp-frontend/src/app/projects/editor/project-editor.component.ts @@ -185,4 +185,19 @@ export class ProjectEditorComponent implements OnInit, IBreadCrumbComponent { public isExternalProject() { return this.project.type === ProjectType.External; } + + public previewImage(event): void { + let fileList: FileList | File = event.target.files; + + let formdata: FormData = new FormData(); + + if (fileList instanceof FileList) { + for (let i: number = 0; i < fileList.length; i++) { + formdata.append('file', fileList[i]); + } + } else { + formdata.append('file', fileList); + } + this.uploaderService.uploadFile(formdata).subscribe(files => this.formGroup.get('files').patchValue(files)); + } } diff --git a/dmp-frontend/src/app/projects/listing/project-listing.component.ts b/dmp-frontend/src/app/projects/listing/project-listing.component.ts index 7f4c575ca..e3414b269 100644 --- a/dmp-frontend/src/app/projects/listing/project-listing.component.ts +++ b/dmp-frontend/src/app/projects/listing/project-listing.component.ts @@ -14,6 +14,7 @@ import { LanguageService } from '../../services/language/language.service'; import { LanguageResolverService } from '../../services/language-resolver/language-resolver.service'; import { BreadcrumbItem } from '../../shared/components/breadcrumb/definition/breadcrumb-item'; import { IBreadCrumbComponent } from '../../shared/components/breadcrumb/definition/IBreadCrumbComponent'; +import { ProjectStateType } from '../../models/projects/ProjectStateType'; @Component({ selector: 'app-project-listing-component', @@ -61,6 +62,7 @@ export class ProjectListingComponent implements OnInit, IBreadCrumbComponent { getDefaultCriteria(): ProjectCriteria { const defaultCriteria = new ProjectCriteria(); + defaultCriteria.projectStateType = ProjectStateType.OnGoing; return defaultCriteria; } } diff --git a/dmp-frontend/src/app/services/dashboard/dashboard.service.ts b/dmp-frontend/src/app/services/dashboard/dashboard.service.ts index d6c35a00b..8a987093a 100644 --- a/dmp-frontend/src/app/services/dashboard/dashboard.service.ts +++ b/dmp-frontend/src/app/services/dashboard/dashboard.service.ts @@ -5,6 +5,7 @@ import { HostConfiguration } from './../../app.constants'; import { BaseHttpService } from '../../utilities/cite-http-service-module/base-http.service'; import { Observable } from 'rxjs/Observable'; import { DashboardStatisticsModel } from '../../models/dashboard/DashboardStatisticsModel'; +import { SearchBarItem } from '../../models/dashboard/SearchBarItem'; @@ -12,24 +13,28 @@ import { DashboardStatisticsModel } from '../../models/dashboard/DashboardStatis @Injectable() export class DashboardService { - private actionUrl: string; - private headers: HttpHeaders; + private actionUrl: string; + private headers: HttpHeaders; - constructor(private http: BaseHttpService) { + constructor(private http: BaseHttpService) { - this.actionUrl = HostConfiguration.Server + 'dashboard/'; + this.actionUrl = HostConfiguration.Server + 'dashboard/'; - this.headers = new HttpHeaders(); - this.headers = this.headers.set('Content-Type', 'application/json'); - this.headers = this.headers.set('Accept', 'application/json'); - } + this.headers = new HttpHeaders(); + this.headers = this.headers.set('Content-Type', 'application/json'); + this.headers = this.headers.set('Accept', 'application/json'); + } - getStatistics(): Observable { - return this.http.get(this.actionUrl + 'getStatistics', { headers: this.headers }); - } + getStatistics(): Observable { + return this.http.get(this.actionUrl + 'getStatistics', { headers: this.headers }); + } - getStatisticsSpecificuser(): Observable { - return this.http.get(this.actionUrl + 'me/getStatistics', { headers: this.headers }); - } + getStatisticsSpecificuser(): Observable { + return this.http.get(this.actionUrl + 'me/getStatistics', { headers: this.headers }); + } + + searchUserItems(like: string): Observable { + return this.http.get(this.actionUrl + 'search?like=' + like, { headers: this.headers }); + } } diff --git a/dmp-frontend/src/app/services/data-management-plan/data-management-plan.service.ts b/dmp-frontend/src/app/services/data-management-plan/data-management-plan.service.ts index 21abe62af..48c086fa5 100644 --- a/dmp-frontend/src/app/services/data-management-plan/data-management-plan.service.ts +++ b/dmp-frontend/src/app/services/data-management-plan/data-management-plan.service.ts @@ -17,51 +17,55 @@ import { DatasetProfileModel } from '../../models/datasets/DatasetProfileModel'; @Injectable() export class DataManagementPlanService { - private actionUrl: string; - private headers: HttpHeaders; + private actionUrl: string; + private headers: HttpHeaders; - constructor(private http: BaseHttpService) { + constructor(private http: BaseHttpService) { - this.actionUrl = HostConfiguration.Server + 'dmps/'; + this.actionUrl = HostConfiguration.Server + 'dmps/'; - this.headers = new HttpHeaders(); - this.headers = this.headers.set('Content-Type', 'application/json'); - this.headers = this.headers.set('Accept', 'application/json'); - } + this.headers = new HttpHeaders(); + this.headers = this.headers.set('Content-Type', 'application/json'); + this.headers = this.headers.set('Accept', 'application/json'); + } - getPaged(dataTableRequest: DataTableRequest): Observable> { - return this.http.post>(this.actionUrl + 'getPaged', dataTableRequest, { headers: this.headers }); - } + getPaged(dataTableRequest: DataTableRequest): Observable> { + return this.http.post>(this.actionUrl + 'getPaged', dataTableRequest, { headers: this.headers }); + } - getSingle(id: String): Observable { - return this.http.get(this.actionUrl + 'getSingle/' + id, { headers: this.headers }); - } + getSingle(id: String): Observable { + return this.http.get(this.actionUrl + 'getSingle/' + id, { headers: this.headers }); + } - createDataManagementPlan(dataManagementPlanModel: DataManagementPlanModel): Observable { - return this.http.post(this.actionUrl + 'createOrUpdate', dataManagementPlanModel, { headers: this.headers }); - } + createDataManagementPlan(dataManagementPlanModel: DataManagementPlanModel): Observable { + return this.http.post(this.actionUrl + 'createOrUpdate', dataManagementPlanModel, { headers: this.headers }); + } - inactivate(id: String): Observable { - return this.http.delete(this.actionUrl + 'inactivate/' + id, { headers: this.headers }); - } + inactivate(id: String): Observable { + return this.http.delete(this.actionUrl + 'inactivate/' + id, { headers: this.headers }); + } - searchDMPProfiles(dataSetProfileRequest: RequestItem): Observable { - return this.http.post(this.actionUrl + "datasetprofiles/get", dataSetProfileRequest, { headers: this.headers }); - } + searchDMPProfiles(dataSetProfileRequest: RequestItem): Observable { + return this.http.post(this.actionUrl + "datasetprofiles/get", dataSetProfileRequest, { headers: this.headers }); + } - newVersion(dataManagementPlanModel: DataManagementPlanModel, id: String): Observable { - return this.http.post(this.actionUrl + 'new/' + id, dataManagementPlanModel, { headers: this.headers }); - } + newVersion(dataManagementPlanModel: DataManagementPlanModel, id: String): Observable { + return this.http.post(this.actionUrl + 'new/' + id, dataManagementPlanModel, { headers: this.headers }); + } - clone(dataManagementPlanModel: DataManagementPlanModel, id: String): Observable { - return this.http.post(this.actionUrl + 'clone/' + id, dataManagementPlanModel, { headers: this.headers }); - } + clone(dataManagementPlanModel: DataManagementPlanModel, id: String): Observable { + return this.http.post(this.actionUrl + 'clone/' + id, dataManagementPlanModel, { headers: this.headers }); + } - delete(id: String): Observable { - return this.http.delete(this.actionUrl + 'delete/' + id, { headers: this.headers }); - } + delete(id: String): Observable { + return this.http.delete(this.actionUrl + 'delete/' + id, { headers: this.headers }); + } - getDynamicField(requestItem: RequestItem): any { - return this.http.post(this.actionUrl + "dynamic", requestItem, { headers: this.headers }) - } + getDynamicField(requestItem: RequestItem): any { + return this.http.post(this.actionUrl + "dynamic", requestItem, { headers: this.headers }) + } + + get(requestItem: RequestItem): Observable { + return this.http.post(this.actionUrl + 'get', requestItem, { headers: this.headers }); + } } diff --git a/dmp-frontend/src/app/services/user-reference/user-reference-data.service.ts b/dmp-frontend/src/app/services/user-reference/user-reference-data.service.ts index e064c19e8..e06c5f423 100644 --- a/dmp-frontend/src/app/services/user-reference/user-reference-data.service.ts +++ b/dmp-frontend/src/app/services/user-reference/user-reference-data.service.ts @@ -36,6 +36,10 @@ export class UserReferenceService { return this.http.post>(this.actionUrl + 'getPaged', JSON.stringify(dataTableRequest), { headers: this.headers }); } + getUser(id: String): Observable { + return this.http.get(this.actionUrl + id, { headers: this.headers }); + } + updateRoles(itemToUpdate: UserListingModel): Observable { return this.http.post(this.actionUrl + 'updateRoles', JSON.stringify(itemToUpdate), { headers: this.headers }); } diff --git a/dmp-frontend/src/app/shared/components/autocompletes/multiple/multiple-auto-complete.component.html b/dmp-frontend/src/app/shared/components/autocompletes/multiple/multiple-auto-complete.component.html index b277251ea..77541fb39 100644 --- a/dmp-frontend/src/app/shared/components/autocompletes/multiple/multiple-auto-complete.component.html +++ b/dmp-frontend/src/app/shared/components/autocompletes/multiple/multiple-auto-complete.component.html @@ -1,5 +1,5 @@ - + {{this._displayFn(selectedItem)}} cancel diff --git a/dmp-frontend/src/app/shared/components/autocompletes/multiple/multiple-auto-complete.component.ts b/dmp-frontend/src/app/shared/components/autocompletes/multiple/multiple-auto-complete.component.ts index 7aa74d16d..e33c9e693 100644 --- a/dmp-frontend/src/app/shared/components/autocompletes/multiple/multiple-auto-complete.component.ts +++ b/dmp-frontend/src/app/shared/components/autocompletes/multiple/multiple-auto-complete.component.ts @@ -22,7 +22,7 @@ export class MultipleAutoCompleteComponent implements OnInit { @Input() placeholder: string; @Input() validationErrorString: string; @Input() configuration: MultipleAutoCompleteConfiguration; - + @Input() required: boolean; // Selected Option Event @Output() optionSelected: EventEmitter = new EventEmitter(); @@ -135,9 +135,11 @@ export class MultipleAutoCompleteComponent implements OnInit { } _removeSelectedItem(item: any): void { - const index = this.reactiveFormControl.value.indexOf(item); + let autocompleteValue = this.reactiveFormControl.value; + const index = autocompleteValue.indexOf(item); if (index >= 0) { - this.reactiveFormControl.value.splice(index, 1); + autocompleteValue.splice(index, 1); + this.reactiveFormControl.patchValue(autocompleteValue) } } diff --git a/dmp-frontend/src/app/shared/components/autocompletes/single/single-auto-complete.component.html b/dmp-frontend/src/app/shared/components/autocompletes/single/single-auto-complete.component.html index 9d86691be..c84cd5d6b 100644 --- a/dmp-frontend/src/app/shared/components/autocompletes/single/single-auto-complete.component.html +++ b/dmp-frontend/src/app/shared/components/autocompletes/single/single-auto-complete.component.html @@ -1,5 +1,5 @@ - + {{validationErrorString}} {{'GENERAL.VALIDATION.REQUIRED' | translate}} {{'GENERAL.VALIDATION.INVALID-JSON' | translate}} diff --git a/dmp-frontend/src/app/shared/components/autocompletes/single/single-auto-complete.component.ts b/dmp-frontend/src/app/shared/components/autocompletes/single/single-auto-complete.component.ts index 29e1cf0f0..39273fe8d 100644 --- a/dmp-frontend/src/app/shared/components/autocompletes/single/single-auto-complete.component.ts +++ b/dmp-frontend/src/app/shared/components/autocompletes/single/single-auto-complete.component.ts @@ -16,7 +16,7 @@ export class SingleAutoCompleteComponent implements OnInit { @Input() reactiveFormControl: FormControl; @Input() placeholder: string; @Input() validationErrorString: string; - + @Input() required: boolean; @Input() configuration: SingleAutoCompleteConfiguration; // Selected Option Event diff --git a/dmp-frontend/src/app/shared/components/available-profiles/available-profiles.component.html b/dmp-frontend/src/app/shared/components/available-profiles/available-profiles.component.html index 4efca5868..a1ce7b4e4 100644 --- a/dmp-frontend/src/app/shared/components/available-profiles/available-profiles.component.html +++ b/dmp-frontend/src/app/shared/components/available-profiles/available-profiles.component.html @@ -1,5 +1,5 @@ - - + + {{profile.label}} diff --git a/dmp-frontend/src/app/shared/components/available-profiles/available-profiles.component.ts b/dmp-frontend/src/app/shared/components/available-profiles/available-profiles.component.ts index 402e211fc..004a1bd62 100644 --- a/dmp-frontend/src/app/shared/components/available-profiles/available-profiles.component.ts +++ b/dmp-frontend/src/app/shared/components/available-profiles/available-profiles.component.ts @@ -18,7 +18,7 @@ export class AvailableProfilesComponent implements OnInit { public formGroup: FormGroup; public profiles: DatasetProfileModel[] = []; public selectedProfiles: DatasetProfileModel[] = []; - + public selectedOptions: any constructor( private datasetService: DatasetService, private route: ActivatedRoute, @@ -27,20 +27,14 @@ export class AvailableProfilesComponent implements OnInit { @Inject(MAT_DIALOG_DATA) public data: any ) { } - ngOnInit(): void { - + ngOnInit(): void { this.formGroup = this.data["profiles"]; this.datasetService.getDatasetProfiles().subscribe(data => { this.profiles = JsonSerializer.fromJSONArray(data, DatasetProfileModel) - } - ) + }) } addProfiles(profiles) { - // profiles.selectedOptions.forEach(element => { - // selectedProfiles.push(element.value) - // }); - profiles.selectedOptions.selected.forEach(element => { let selectedElement = new DatasetProfileModel(); selectedElement.id = element.value.id; @@ -50,4 +44,8 @@ export class AvailableProfilesComponent implements OnInit { this.formGroup.setValue(this.selectedProfiles) this.dialogRef.close(); } + + isOptionSelected(profile: any){ + return this.formGroup.value.map(x=> x.id).indexOf(profile.id) !== -1 + } } diff --git a/dmp-frontend/src/app/shared/components/criteria/data-management-plan/dmp-criteria.component.html b/dmp-frontend/src/app/shared/components/criteria/data-management-plan/dmp-criteria.component.html index 34a3f3df4..4969c6817 100644 --- a/dmp-frontend/src/app/shared/components/criteria/data-management-plan/dmp-criteria.component.html +++ b/dmp-frontend/src/app/shared/components/criteria/data-management-plan/dmp-criteria.component.html @@ -8,24 +8,14 @@
- + {{baseErrorModel['Criteria.like']}}
- - -
{{chip.label.substring(0, 1).toUpperCase()}}
- {{chip.label}} -
- -
- {{option.label}} -
-
- -
+ +
diff --git a/dmp-frontend/src/app/shared/components/criteria/data-management-plan/dmp-criteria.component.ts b/dmp-frontend/src/app/shared/components/criteria/data-management-plan/dmp-criteria.component.ts index b4a21b435..9c97e857e 100644 --- a/dmp-frontend/src/app/shared/components/criteria/data-management-plan/dmp-criteria.component.ts +++ b/dmp-frontend/src/app/shared/components/criteria/data-management-plan/dmp-criteria.component.ts @@ -11,6 +11,7 @@ import { ProjectService } from '../../../../services/project/project.service'; import { ProjectCriteria } from '../../../../models/criteria/project/ProjectCriteria'; import { RequestItem } from '../../../../models/criteria/RequestItem'; import { create } from 'domain'; +import { MultipleAutoCompleteConfiguration } from '../../autocompletes/multiple/multiple-auto-complete-configuration'; @Component({ selector: 'app-dmp-criteria-component', @@ -22,9 +23,13 @@ export class DataManagementPlanCriteriaComponent extends BaseCriteriaComponent i @Input() showProject: boolean; - public criteria: DataManagementPlanCriteria = new DataManagementPlanCriteria(); filteringProjectsAsync: boolean = false; filteredProjects: ProjectModel[]; + projectAutoCompleteConfiguration: MultipleAutoCompleteConfiguration; + public formGroup = new FormBuilder().group({ + like: new FormControl(), + projects: new FormControl() + }); constructor( public language: TranslateService, @@ -36,11 +41,24 @@ export class DataManagementPlanCriteriaComponent extends BaseCriteriaComponent i ngOnInit() { super.ngOnInit(); - if (this.criteria == null) { this.criteria = new DataManagementPlanCriteria(); } + + this.projectAutoCompleteConfiguration = { + filterFn: this.filterProject.bind(this), + initialItems: (excludedItems: any[]) => this.filterProject('').map(result => result.filter(x => excludedItems.map(x => x.id).indexOf(x.id) == -1)), + displayFn: (item) => item["label"], + titleFn: (item) => item["label"], + //mapFn: (item) => new JsonSerializer().fromJSONArray(item, ProjectReference).map(item => item.toDropdownList()), + loadDataOnStart: true + }; + + this.formGroup.get('projects').valueChanges.subscribe(x => this.controlModified()) + this.formGroup.get('like').valueChanges.subscribe(x => this.controlModified()) + //if (this.criteria == null) { this.criteria = new DataManagementPlanCriteria(); } } setCriteria(criteria: DataManagementPlanCriteria): void { - this.criteria = criteria; + this.formGroup.get('like').patchValue(criteria.like) + this.formGroup.get('projects').patchValue(criteria.projects) } onCallbackError(error: any) { @@ -50,26 +68,16 @@ export class DataManagementPlanCriteriaComponent extends BaseCriteriaComponent i controlModified(): void { this.clearErrorModel(); if (this.refreshCallback != null && - (this.criteria.like == null || this.criteria.like.length == 0 || this.criteria.like.length > 2) + (this.formGroup.get('like').value == null || this.formGroup.get('like').value.length == 0 || this.formGroup.get('like').value.length > 2) ) { this.refreshCallback(); } } - filterProjects(value: string): void { - - this.filteredProjects = undefined; - if (value) { - this.filteringProjectsAsync = true; - - let requestItem: RequestItem = new RequestItem(); - let criteria: ProjectCriteria = new ProjectCriteria(); - criteria.like = value; - requestItem.criteria = criteria; - this.projectService.get(requestItem).subscribe(items => { - this.filteredProjects = items; - this.filteringProjectsAsync = false; - }); - } + filterProject(query: string) { + let projectRequestItem: RequestItem = new RequestItem(); + projectRequestItem.criteria = new ProjectCriteria(); + projectRequestItem.criteria.like = query; + return this.projectService.getWithExternal(projectRequestItem); } } diff --git a/dmp-frontend/src/app/shared/components/criteria/projects/projects-criteria.component.html b/dmp-frontend/src/app/shared/components/criteria/projects/projects-criteria.component.html index 45ccb7de4..dd4ce2c54 100644 --- a/dmp-frontend/src/app/shared/components/criteria/projects/projects-criteria.component.html +++ b/dmp-frontend/src/app/shared/components/criteria/projects/projects-criteria.component.html @@ -1,11 +1,11 @@
- + {{baseErrorModel['criteria.like']}} - + @@ -13,11 +13,22 @@ {{baseErrorModel['criteria.periodStart']}} - + {{baseErrorModel['criteria.periodEnd']}} + + + + + {{ 'CRITERIA.PROJECTS.TYPES.ON-GOING' | translate}} + + + {{ 'CRITERIA.PROJECTS.TYPES.FINISHED' | translate}} + + +
diff --git a/dmp-frontend/src/app/shared/components/criteria/projects/projects-criteria.component.ts b/dmp-frontend/src/app/shared/components/criteria/projects/projects-criteria.component.ts index 6be83ea46..cea6985e9 100644 --- a/dmp-frontend/src/app/shared/components/criteria/projects/projects-criteria.component.ts +++ b/dmp-frontend/src/app/shared/components/criteria/projects/projects-criteria.component.ts @@ -7,6 +7,7 @@ import { BackendErrorValidator } from '../../../../utilities/validators/BackendE import { ProjectCriteria } from '../../../../models/criteria/project/ProjectCriteria'; import { ProjectCriteriaErrorModel } from '../../../../models/criteria/project/ProjectCriteriaErrorModel'; import { LanguageResolverService } from '../../../../services/language-resolver/language-resolver.service'; +import { ProjectStateType } from '../../../../models/projects/ProjectStateType'; @Component({ selector: 'app-projects-criteria-component', @@ -19,7 +20,7 @@ import { LanguageResolverService } from '../../../../services/language-resolver/ export class ProjectCriteriaComponent extends BaseCriteriaComponent implements OnInit { // public form: ProjectType; - // public formStatus: ProjectStatus; + public ProjectStateType = ProjectStateType; public criteria: ProjectCriteria = new ProjectCriteria(); constructor( diff --git a/dmp-frontend/src/app/shared/components/external-items/external-item-listing/external-item-listing.component.html b/dmp-frontend/src/app/shared/components/external-items/external-item-listing/external-item-listing.component.html index 1d14236cb..0d367c29e 100644 --- a/dmp-frontend/src/app/shared/components/external-items/external-item-listing/external-item-listing.component.html +++ b/dmp-frontend/src/app/shared/components/external-items/external-item-listing/external-item-listing.component.html @@ -1,17 +1,21 @@
-
-
- - - - {{ option.label }} - - - - - +
+
+
+ + + + {{ option.label }} + + + +
+
+ + +
diff --git a/dmp-frontend/src/app/shared/components/figurecard/figurecard.component.css b/dmp-frontend/src/app/shared/components/figurecard/figurecard.component.css index 35783ded9..ff0859704 100644 --- a/dmp-frontend/src/app/shared/components/figurecard/figurecard.component.css +++ b/dmp-frontend/src/app/shared/components/figurecard/figurecard.component.css @@ -3,11 +3,10 @@ position: relative; width: 100%; margin: 25px 0; - cursor: pointer; } .card-content { - text-align: right; + text-align: center; padding: 15px 20px 13px 20px; } @@ -20,6 +19,7 @@ border-radius: 3px; padding: 15px; position: relative; + cursor: pointer; } .card-header i { @@ -62,4 +62,4 @@ border-radius: 6px; color: rgba(0, 0, 0, 0.87); background: #fff; -} \ No newline at end of file +} diff --git a/dmp-frontend/src/app/shared/components/figurecard/figurecard.component.html b/dmp-frontend/src/app/shared/components/figurecard/figurecard.component.html index d8c46b0e9..7475dee05 100644 --- a/dmp-frontend/src/app/shared/components/figurecard/figurecard.component.html +++ b/dmp-frontend/src/app/shared/components/figurecard/figurecard.component.html @@ -1,10 +1,11 @@ -
-
+
+
{{ headerIcon }}

{{ category | translate }}

{{ title }}

+
diff --git a/dmp-frontend/src/app/shared/components/figurecard/figurecard.component.ts b/dmp-frontend/src/app/shared/components/figurecard/figurecard.component.ts index 63ff70ed9..710697b4d 100644 --- a/dmp-frontend/src/app/shared/components/figurecard/figurecard.component.ts +++ b/dmp-frontend/src/app/shared/components/figurecard/figurecard.component.ts @@ -16,6 +16,8 @@ export class FigurecardComponent implements OnInit { @Input() boxShadow: string; @Input() routelLink: string; @Input() hasFootContent = true; + @Input() buttonTitle: string; + @Input() buttonRedirectLink: string; constructor(private router: Router) { } @@ -24,7 +26,10 @@ export class FigurecardComponent implements OnInit { navigateToUrl() { this.router.navigate([this.routelLink]); + } - } + createNew(){ + this.router.navigate([this.buttonRedirectLink]); + } } diff --git a/dmp-frontend/src/app/shared/components/navigation/navigation.component.html b/dmp-frontend/src/app/shared/components/navigation/navigation.component.html index 003ab15ad..90131b637 100644 --- a/dmp-frontend/src/app/shared/components/navigation/navigation.component.html +++ b/dmp-frontend/src/app/shared/components/navigation/navigation.component.html @@ -1,5 +1,5 @@ -
@@ -13,15 +13,33 @@ -
- - {{this.getPrincipalName()}} - - - +
+ + + + + {{option.label}} + + +
+
+
+ +
+ +
+ +
+
+ +
+
+ + + +
+
+
+ {{'USER-DIALOG.EXIT' | translate}} + +
+
+ diff --git a/dmp-frontend/src/app/shared/components/user-dialog/user-dialog.component.scss b/dmp-frontend/src/app/shared/components/user-dialog/user-dialog.component.scss new file mode 100644 index 000000000..e69de29bb diff --git a/dmp-frontend/src/app/shared/components/user-dialog/user-dialog.component.ts b/dmp-frontend/src/app/shared/components/user-dialog/user-dialog.component.ts new file mode 100644 index 000000000..890b782a7 --- /dev/null +++ b/dmp-frontend/src/app/shared/components/user-dialog/user-dialog.component.ts @@ -0,0 +1,54 @@ +import { JsonSerializer } from '../../../utilities/JsonSerializer'; +import { RequestItem } from '../../../models/criteria/RequestItem'; +import { Component, OnInit, Inject } from "@angular/core"; +import { FormGroup } from '@angular/forms'; +import { Params, ActivatedRoute, Router } from '@angular/router'; +import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material'; +import { ResearcherModel } from '../../../models/researcher/ResearcherModel'; +import { ResearcherService } from '../../../services/researchers/researchers.service'; +import { AuthService } from '../../../services/auth/auth.service'; +import { Principal } from '../../../models/login/Principal'; + +@Component({ + selector: 'user-dialog-component', + templateUrl: 'user-dialog.component.html', + +}) +export class UserDialogComponent implements OnInit { + + public formGroup: FormGroup; + + constructor( + private route: ActivatedRoute, + private authentication: AuthService, + public router: Router, + public dialogRef: MatDialogRef, + @Inject(MAT_DIALOG_DATA) public data: any + ) { } + + ngOnInit(): void { + } + + public logout(): void { + this.dialogRef.close(); + this.authentication.logout(); + } + + public getPrincipalName(): string { + const principal: Principal = this.authentication.current(); + if (principal) { return principal.name; } + return ''; + } + + public principalHasAvatar(): boolean { + return this.authentication.current().avatarUrl != null; + } + + public getPrincipalAvatar(): string { + return this.authentication.current().avatarUrl; + } + + public navigateToProfile() { + this.router.navigate(["/users/" + this.authentication.current().id]); + } +} diff --git a/dmp-frontend/src/app/shared/material/material.module.ts b/dmp-frontend/src/app/shared/material/material.module.ts index 7456dd2eb..3789899d6 100644 --- a/dmp-frontend/src/app/shared/material/material.module.ts +++ b/dmp-frontend/src/app/shared/material/material.module.ts @@ -28,7 +28,8 @@ import { MatRadioModule, MatMenuModule, MatListModule, - MatChipsModule + MatChipsModule, + MatBadgeModule } from '@angular/material'; import { CdkTableModule } from '@angular/cdk/table'; import { SnackBarNotificationComponent } from '../components/notificaiton/snack-bar-notification.component'; @@ -71,7 +72,8 @@ import { CovalentLayoutModule, CovalentChipsModule, CovalentDialogsModule, Coval MatRadioModule, MatMenuModule, MatListModule, - MatChipsModule + MatChipsModule, + MatBadgeModule ], providers: [ diff --git a/dmp-frontend/src/app/shared/shared.module.ts b/dmp-frontend/src/app/shared/shared.module.ts index eb2fb3526..879260398 100644 --- a/dmp-frontend/src/app/shared/shared.module.ts +++ b/dmp-frontend/src/app/shared/shared.module.ts @@ -23,6 +23,7 @@ import { ExternalItemComponent } from './components/external-items/external-item import { BreadcrumbComponent } from './components/breadcrumb/breadcrumb.component'; import { SingleAutoCompleteComponent } from './components/autocompletes/single/single-auto-complete.component'; import { MultipleAutoCompleteComponent } from './components/autocompletes/multiple/multiple-auto-complete.component'; +import { UserDialogComponent } from './components/user-dialog/user-dialog.component'; @NgModule({ imports: [ @@ -52,7 +53,8 @@ import { MultipleAutoCompleteComponent } from './components/autocompletes/multip ExternalItemComponent, BreadcrumbComponent, SingleAutoCompleteComponent, - MultipleAutoCompleteComponent + MultipleAutoCompleteComponent, + UserDialogComponent ], exports: [ @@ -75,9 +77,11 @@ import { MultipleAutoCompleteComponent } from './components/autocompletes/multip ExternalItemComponent, BreadcrumbComponent, SingleAutoCompleteComponent, - MultipleAutoCompleteComponent + MultipleAutoCompleteComponent, + UserDialogComponent ], entryComponents: [ + UserDialogComponent ] }) diff --git a/dmp-frontend/src/app/users/activity/recent-activity.component.html b/dmp-frontend/src/app/users/activity/recent-activity.component.html index 2398aba7d..27206f25a 100644 --- a/dmp-frontend/src/app/users/activity/recent-activity.component.html +++ b/dmp-frontend/src/app/users/activity/recent-activity.component.html @@ -1,27 +1,4 @@
-
- - - - {{'RECENT-ACTIVITY.MY-TITLE-PROJECT' | translate}} - - - - - -

- {{activity.label}} -

-

- {{activity.timestamp | date:'shortDate'}} -

-
-
-
- -
- -
@@ -43,6 +20,28 @@
+
+ + + + {{'RECENT-ACTIVITY.MY-TITLE-PROJECT' | translate}} + + + + + +

+ {{activity.label}} +

+

+ {{activity.timestamp | date:'shortDate'}} +

+
+
+
+ +
+
diff --git a/dmp-frontend/src/app/users/profile/user-profile.component.html b/dmp-frontend/src/app/users/profile/user-profile.component.html new file mode 100644 index 000000000..133c453e3 --- /dev/null +++ b/dmp-frontend/src/app/users/profile/user-profile.component.html @@ -0,0 +1,37 @@ +
+ + +
+
+ +
+ {{userProfile.name}} + {{userProfile.email}} +
+
+
+ + +
+
+

{{ 'USER-PROFILE.ASSOCIATED-DMPS' | translate}}

+
+
+ {{userProfile.associatedDmps}} +
+
+
+
+ + +
+
+

{{ 'USER-PROFILE.SETTINGS' | translate}}

+
+
+
+
+
+ + Loading stuff... + diff --git a/dmp-frontend/src/app/users/profile/user-profile.component.scss b/dmp-frontend/src/app/users/profile/user-profile.component.scss new file mode 100644 index 000000000..e69de29bb diff --git a/dmp-frontend/src/app/users/profile/user-profile.component.ts b/dmp-frontend/src/app/users/profile/user-profile.component.ts new file mode 100644 index 000000000..d33d0fbbf --- /dev/null +++ b/dmp-frontend/src/app/users/profile/user-profile.component.ts @@ -0,0 +1,46 @@ +import { DataTableRequest } from '../../models/data-table/DataTableRequest'; +import { UserErrorModel } from '../../models/users/UserErrorModel'; +import { UserReferenceService } from '../../services/user-reference/user-reference-data.service'; +import { UserListingModel } from '../../models/users/UserListingModel'; +import { SnackBarNotificationComponent } from '../../shared/components/notificaiton/snack-bar-notification.component'; +import { UserCriteria } from '../../models/criteria/users/UserCriteria'; +import { UserCriteriaErrorModel } from '../../models/criteria/users/UserCriteriaErrorModel'; +import { Observable } from 'rxjs/Rx'; +import { Component, OnInit, AfterViewInit, ViewChild } from '@angular/core'; +import { UsersCriteriaComponent } from '../../shared/components/criteria/users/users-criteria.component'; +import { Router, ActivatedRoute, Params } from '@angular/router'; +import { Principal } from '../../models/login/Principal'; +import { MatPaginator, MatSort, MatSnackBar } from '@angular/material'; +import { TranslateService } from '@ngx-translate/core'; +import { DataSource } from '@angular/cdk/table'; +import { RecentActivityTypes } from '../../users/activity/RecentActivityTypes'; +import { AuthService } from '../../services/auth/auth.service'; + + +@Component({ + selector: 'app-user-profile', + templateUrl: './user-profile.component.html', + styleUrls: ['./user-profile.component.scss'], + providers: [ + UserReferenceService + ] +}) +export class UserProfileComponent implements OnInit { + + user: Observable; + + constructor( + private userReferenceService: UserReferenceService, + private route: ActivatedRoute, + private authService: AuthService + ) { } + + ngOnInit() { + this.route.params.subscribe((params: Params) => { + let userId = params['id'] === this.authService.current().id ? 'me' : params['id'] + this.user = this.userReferenceService.getUser(userId).map(result => { result["additionalinfo"] = JSON.parse(result["additionalinfo"]); return result }) + }) +} + + +} diff --git a/dmp-frontend/src/app/users/users.module.ts b/dmp-frontend/src/app/users/users.module.ts index ddd98f732..8862eaf61 100644 --- a/dmp-frontend/src/app/users/users.module.ts +++ b/dmp-frontend/src/app/users/users.module.ts @@ -16,6 +16,7 @@ import { RouterModule } from '@angular/router'; import { UsersRoutes } from './users.routes'; import { BaseHttpModule } from '../utilities/cite-http-service-module/cite-http.module'; import { BaseHttpService } from '../utilities/cite-http-service-module/base-http.service'; +import { UserProfileComponent } from './profile/user-profile.component'; @NgModule({ imports: [ @@ -39,6 +40,7 @@ import { BaseHttpService } from '../utilities/cite-http-service-module/base-http UsersComponent, UsersCriteriaComponent, UserRoleEditorComponent, + UserProfileComponent ], providers: [ BaseHttpService, diff --git a/dmp-frontend/src/app/users/users.routes.ts b/dmp-frontend/src/app/users/users.routes.ts index 01a43cff8..1babd1d4f 100644 --- a/dmp-frontend/src/app/users/users.routes.ts +++ b/dmp-frontend/src/app/users/users.routes.ts @@ -1,6 +1,8 @@ import { RouterModule, Routes } from '@angular/router'; import { UsersComponent } from './components/users.component'; +import { UserProfileComponent } from './profile/user-profile.component'; export const UsersRoutes: Routes = [ - { path: '', component: UsersComponent } + { path: '', component: UsersComponent }, + { path: ':id', component: UserProfileComponent } ]; diff --git a/dmp-frontend/src/assets/lang/en.json b/dmp-frontend/src/assets/lang/en.json index c177c2384..fa7de2634 100644 --- a/dmp-frontend/src/assets/lang/en.json +++ b/dmp-frontend/src/assets/lang/en.json @@ -40,7 +40,7 @@ "START": "Start", "END": "End", "ACTIONS": "Actions", - "DMPS": "Dmps" + "DMPS": "DMPs" } }, "DMP-LISTING": { @@ -160,7 +160,7 @@ "DESCRIPTION": "Description", "ORGANISATIONS": "Organisations", "RESEARCHERS": "Researchers", - "PROFILES": "Available Profiles", + "PROFILES": "Available Dataset Profiles", "PROFILE": "DMP Profile", "GRANT": "Grant", "FUNDER": "Funder" @@ -178,7 +178,12 @@ "PROJECTS": { "LIKE": "Search", "PERIOD-FROM": "Project Start", - "PERIOD-TO": "Project End" + "PERIOD-TO": "Project End", + "PROJECT-STATE-TYPE": "Project Status", + "TYPES": { + "ON-GOING": "OnGoing", + "FINISHED": "Finished" + } }, "DATA-SETS": { "LIKE": "Search", @@ -281,7 +286,7 @@ }, "RECENT-ACTIVITY": { "MY-TITLE-PROJECT": "My Recent Project Activity", - "MY-TITLE-DMP": "My Recent Dmp Activity", + "MY-TITLE-DMP": "My Recent DMP Activity", "MY-TITLE-DATASET": "My Recent Dataset Activity" }, "FILE-UPLOADER": { @@ -311,6 +316,15 @@ "MY-DMPS": "My DMPs", "DMPS": "DMPs", "MY-DATASETS": "My Datasets", - "DATASETS": "Datasets" + "DATASETS": "Datasets", + "SEARCH": "Search" + }, + "USER-DIALOG": { + "USER-PROFILE": "My Profile", + "EXIT": "Exit " + }, + "USER-PROFILE": { + "SETTINGS": "Settings", + "ASSOCIATED-DMPS": "Associated DMPs" } }