Compare commits
90 Commits
Author | SHA1 | Date |
---|---|---|
Diamantis Tziotzios | e8aef281d4 | |
Diamantis Tziotzios | 00c6978594 | |
Diamantis Tziotzios | 3adb518e61 | |
Konstantina Galouni | eb74ef86b9 | |
Diamantis Tziotzios | a1ee9c82bc | |
Diamantis Tziotzios | 5e5bd39313 | |
Diamantis Tziotzios | 5e99cef60e | |
Diamantis Tziotzios | cc7edc2f49 | |
Diamantis Tziotzios | a1849c64ca | |
Diamantis Tziotzios | 192220161b | |
George Kalampokis | 87758c3e9a | |
Diamantis Tziotzios | 83342f5afa | |
Diamantis Tziotzios | 65cdb3b6ea | |
Diamantis Tziotzios | 536ba9b900 | |
Alexandros Mandilaras | 6bd3302788 | |
Diamantis Tziotzios | 4970f5812f | |
Diamantis Tziotzios | 9fed92dbcb | |
Diamantis Tziotzios | 44dab9c19a | |
Alexandros Mandilaras | 54f911d826 | |
Diamantis Tziotzios | 9879050eab | |
Diamantis Tziotzios | 8a41a7dcd9 | |
Diamantis Tziotzios | d60cc144d5 | |
Georgios Kakaletris | 9c37e5a073 | |
Georgios Kakaletris | 444c1aacb1 | |
Diamantis Tziotzios | 59d7383947 | |
Diamantis Tziotzios | 6caa1af134 | |
George Kalampokis | 74a6019a72 | |
George Kalampokis | 5c903c0f48 | |
George Kalampokis | ec8f6a6d48 | |
Bernaldo Mihasi | ecd86f413a | |
Bernaldo Mihasi | c238615b50 | |
Bernaldo Mihasi | 10d0f1fb0e | |
Bernaldo Mihasi | 846405435c | |
Bernaldo Mihasi | dfc9e14003 | |
Bernaldo Mihasi | bc1894586b | |
Diamantis Tziotzios | 50c96ef821 | |
Konstantina Galouni | 0adc7044ab | |
Konstantina Galouni | 13e62fd409 | |
Diamantis Tziotzios | 7185b5d117 | |
George Kalampokis | 5f131b9823 | |
Diamantis Tziotzios | 93320f7c94 | |
Diamantis Tziotzios | 876d99ce38 | |
George Kalampokis | 7a71110033 | |
Diamantis Tziotzios | 14c267c97e | |
Diamantis Tziotzios | b04b35d62b | |
Diamantis Tziotzios | 7a8375b988 | |
Diamantis Tziotzios | 895dbcf098 | |
Diamantis Tziotzios | bd15b1e2c7 | |
George Kalampokis | faabd343a9 | |
George Kalampokis | e5a929f259 | |
George Kalampokis | d1fc10854c | |
George Kalampokis | 2537923dc0 | |
George Kalampokis | c1adbe283a | |
George Kalampokis | 1c365a191e | |
Kristian Ntavidi | 82c5586067 | |
George Kalampokis | 04f230dff1 | |
George Kalampokis | 72d88d9db4 | |
George Kalampokis | 143a4c0214 | |
George Kalampokis | e7e5ed02b3 | |
George Kalampokis | b5fcc5971e | |
Diamantis Tziotzios | c16c35225f | |
Diamantis Tziotzios | f5d266554b | |
Diamantis Tziotzios | db31597fc0 | |
Diamantis Tziotzios | 9f5054668e | |
George Kalampokis | 38986ef67b | |
Diamantis Tziotzios | bff260b85b | |
George Kalampokis | 9519300dc4 | |
George Kalampokis | 9373d3e038 | |
dtziotzios | d971f02a94 | |
Georgios Kakaletris | d3915e26e7 | |
George Kalampokis | c028aad615 | |
Diamantis Tziotzios | 4ee39074a3 | |
Diamantis Tziotzios | 1b4952a909 | |
Diamantis Tziotzios | 3ada5a0d3d | |
Diamantis Tziotzios | 63ee865dd9 | |
Diamantis Tziotzios | 2a52138124 | |
Diamantis Tziotzios | 7cf64c18f2 | |
Diamantis Tziotzios | 71d317bab7 | |
Ioannis Kalyvas | cd8b3448f5 | |
Ioannis Kalyvas | c3d4cb6fdd | |
Ioannis Kalyvas | b0ccac191f | |
Ioannis Kalyvas | 3b1f37ef22 | |
Ioannis Kalyvas | b8e040ee94 | |
Ioannis Kalyvas | 50444a0b73 | |
Diamantis Tziotzios | 85bdb7fad1 | |
annabakouli | b2e49fbb8a | |
Diamantis Tziotzios | bfc6b63067 | |
Nikolaos Laskaris | 9941c96dc2 | |
Nikolaos Laskaris | 06272c79da | |
Nikolaos Laskaris | a00eec68d8 |
|
@ -48,3 +48,4 @@ bin/
|
|||
*.classpath
|
||||
openDMP/dmp-backend/uploads/
|
||||
openDMP/dmp-backend/tmp/
|
||||
dmp-frontend/.angular/
|
||||
|
|
|
@ -1,3 +1,9 @@
|
|||
|
||||
**Important note: The deployment, troubleshooting, maintenance and operation of on-premises / self-served OpenDMP instances for development, testing or production use, shall be the sole responsibility of the adopter. No support is guaranteed by OpenDMP implentation team for issues that may be encountered during deployment, extension or operation of such installations.**
|
||||
|
||||
**Documentation is provided on a best-effort basis for the code and processes around the development, deployment and operation of OpenDMP. If you find any misalignment of the actual processes with the related documentation, please let us know so that the misalignment is addressed for the benefit of future adopters.**
|
||||
|
||||
|
||||
# Using Docker Compose with Argos
|
||||
|
||||
ARGOS is an open extensible service that simplifies the management, validation, monitoring and maintenance and of Data Management Plans. It allows actors (researchers, managers, supervisors etc) to create actionable DMPs that may be freely exchanged among infrastructures for carrying out specific aspects of the Data management process in accordance with the intentions and commitment of Data owners.
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
package eu.eudat.data.dao.criteria;
|
||||
|
||||
import eu.eudat.data.entities.DMP;
|
||||
import eu.eudat.data.entities.DMPProfile;
|
||||
import eu.eudat.data.entities.Grant;
|
||||
|
||||
import java.util.Date;
|
||||
|
@ -10,6 +11,7 @@ import java.util.UUID;
|
|||
public class DataManagementPlanCriteria extends Criteria<DMP> {
|
||||
private Date periodStart;
|
||||
private Date periodEnd;
|
||||
private DMPProfile profile;
|
||||
private List<eu.eudat.data.entities.Grant> grants;
|
||||
private boolean allVersions;
|
||||
private List<UUID> groupIds;
|
||||
|
@ -37,6 +39,13 @@ public class DataManagementPlanCriteria extends Criteria<DMP> {
|
|||
this.periodEnd = periodEnd;
|
||||
}
|
||||
|
||||
public DMPProfile getProfile() {
|
||||
return profile;
|
||||
}
|
||||
public void setProfile(DMPProfile profile) {
|
||||
this.profile = profile;
|
||||
}
|
||||
|
||||
public List<Grant> getGrants() {
|
||||
return grants;
|
||||
}
|
||||
|
|
|
@ -42,6 +42,8 @@ public class DMPDaoImpl extends DatabaseAccess<DMP> implements DMPDao {
|
|||
query.where((builder, root) -> builder.lessThan(root.get("created"), criteria.getPeriodEnd()));
|
||||
if (criteria.getPeriodStart() != null)
|
||||
query.where((builder, root) -> builder.greaterThan(root.get("created"), criteria.getPeriodStart()));
|
||||
if (criteria.getProfile() != null)
|
||||
query.where((builder, root) -> builder.equal(root.get("profile"), criteria.getProfile()));
|
||||
if (criteria.getGrants() != null && !criteria.getGrants().isEmpty())
|
||||
query.where(((builder, root) -> root.get("grant").in(criteria.getGrants())));
|
||||
if (!criteria.getAllVersions())
|
||||
|
@ -75,7 +77,7 @@ public class DMPDaoImpl extends DatabaseAccess<DMP> implements DMPDao {
|
|||
query.where((builder, root) -> root.join("users", JoinType.LEFT).join("user", JoinType.LEFT).get("id").in(criteria.getCollaborators()));
|
||||
}
|
||||
if (criteria.getDatasetTemplates() != null && !criteria.getDatasetTemplates().isEmpty()) {
|
||||
query.where((builder, root) -> root.join("associatedDmps", JoinType.LEFT).get("id").in(criteria.getDatasetTemplates()));
|
||||
query.where((builder, root) -> root.join("associatedDmps", JoinType.LEFT).get("datasetprofile").get("id").in(criteria.getDatasetTemplates()));
|
||||
}
|
||||
if (criteria.getGrantStatus() != null) {
|
||||
if (criteria.getGrantStatus().equals(GrantStateType.FINISHED.getValue().shortValue()))
|
||||
|
|
|
@ -15,6 +15,8 @@ public class DataManagementPlanBlueprintTableRequest extends TableQuery<DataMana
|
|||
QueryableList<DMPProfile> query = this.getQuery();
|
||||
if (this.getCriteria().getLike() != null && !this.getCriteria().getLike().isEmpty())
|
||||
query.where((builder, root) -> builder.like(root.get("label"), "%" + this.getCriteria().getLike() + "%"));
|
||||
if (this.getCriteria().getStatus() != null)
|
||||
query.where((builder, root) -> builder.equal(root.get("status"), this.getCriteria().getStatus()));
|
||||
return query;
|
||||
}
|
||||
|
||||
|
|
|
@ -46,6 +46,10 @@
|
|||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-mail</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-webflux</artifactId>
|
||||
</dependency>
|
||||
<!-- https://mvnrepository.com/artifact/com.googlecode.json-simple/json-simple -->
|
||||
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
|
||||
|
||||
|
@ -222,6 +226,7 @@
|
|||
<plugin>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-maven-plugin</artifactId>
|
||||
<version>1.5.9.RELEASE</version>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
|
|
|
@ -5,6 +5,7 @@ import eu.eudat.data.entities.DMPProfile;
|
|||
import eu.eudat.data.entities.DescriptionTemplate;
|
||||
import eu.eudat.data.query.items.dmpblueprint.DataManagementPlanBlueprintTableRequest;
|
||||
import eu.eudat.data.query.items.table.dmpprofile.DataManagementPlanProfileTableRequest;
|
||||
import eu.eudat.exceptions.dmpblueprint.DmpBlueprintUsedException;
|
||||
import eu.eudat.logic.managers.DataManagementProfileManager;
|
||||
import eu.eudat.logic.security.claims.ClaimedAuthorities;
|
||||
import eu.eudat.logic.services.ApiContext;
|
||||
|
@ -29,6 +30,7 @@ import java.io.IOException;
|
|||
import java.util.List;
|
||||
|
||||
import static eu.eudat.types.Authorities.ADMIN;
|
||||
import static eu.eudat.types.Authorities.DATASET_PROFILE_MANAGER;
|
||||
|
||||
/**
|
||||
* Created by ikalyvas on 3/21/2018.
|
||||
|
@ -71,7 +73,7 @@ public class DMPProfileController extends BaseController {
|
|||
|
||||
@RequestMapping(method = RequestMethod.GET, value = {"/getSingleBlueprint/{id}"}, produces = "application/json")
|
||||
public @ResponseBody
|
||||
ResponseEntity<ResponseItem<DataManagementPlanBlueprintListingModel>> getSingleBlueprint(@PathVariable String id, Principal principal) throws IllegalAccessException, InstantiationException {
|
||||
ResponseEntity<ResponseItem<DataManagementPlanBlueprintListingModel>> getSingleBlueprint(@PathVariable String id, Principal principal) {
|
||||
DataManagementPlanBlueprintListingModel dataManagementPlanBlueprintListingModel = this.dataManagementProfileManager.getSingleBlueprint(id, principal);
|
||||
return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem<DataManagementPlanBlueprintListingModel>().status(ApiMessageCode.NO_MESSAGE).payload(dataManagementPlanBlueprintListingModel));
|
||||
}
|
||||
|
@ -90,6 +92,26 @@ public class DMPProfileController extends BaseController {
|
|||
return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem<DataTableData<DataManagementPlanBlueprintListingModel>>().status(ApiMessageCode.NO_MESSAGE).payload(dataTable));
|
||||
}
|
||||
|
||||
@Transactional
|
||||
@RequestMapping(method = RequestMethod.POST, value = {"/clone/{id}"}, consumes = "application/json", produces = "application/json")
|
||||
public ResponseEntity<ResponseItem<DataManagementPlanBlueprintListingModel>> clone(@PathVariable String id, @ClaimedAuthorities(claims = {ADMIN}) Principal principal) {
|
||||
DataManagementPlanBlueprintListingModel dmpBlueprint = this.dataManagementProfileManager.getSingleBlueprint(id, principal);
|
||||
dmpBlueprint.setLabel(dmpBlueprint.getLabel() + " new ");
|
||||
return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem<DataManagementPlanBlueprintListingModel>().payload(dmpBlueprint));
|
||||
}
|
||||
|
||||
@Transactional
|
||||
@RequestMapping(method = RequestMethod.DELETE, value = {"{id}"}, consumes = "application/json", produces = "application/json")
|
||||
public @ResponseBody
|
||||
ResponseEntity<ResponseItem<Void>> inactivate(@PathVariable String id, @ClaimedAuthorities(claims = {ADMIN}) Principal principal) {
|
||||
try {
|
||||
this.dataManagementProfileManager.inactivate(id);
|
||||
return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem<Void>().status(ApiMessageCode.SUCCESS_MESSAGE));
|
||||
} catch (DmpBlueprintUsedException exception) {
|
||||
return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(new ResponseItem<Void>().status(ApiMessageCode.UNSUCCESS_DELETE).message(exception.getMessage()));
|
||||
}
|
||||
}
|
||||
|
||||
@RequestMapping(method = RequestMethod.GET, value = {"/getXml/{id}"}, produces = "application/json")
|
||||
public @ResponseBody
|
||||
ResponseEntity getXml( @RequestHeader("Content-Type") String contentType, @PathVariable String id, Principal principal) throws IOException {
|
||||
|
|
|
@ -6,6 +6,7 @@ import eu.eudat.logic.managers.DatasetProfileManager;
|
|||
import eu.eudat.logic.services.ApiContext;
|
||||
import eu.eudat.models.data.datasetprofile.DatasetProfileAutocompleteItem;
|
||||
import eu.eudat.models.data.datasetprofile.DatasetProfileListingModel;
|
||||
import eu.eudat.models.data.datasetprofile.DatasetProfileWithPrefillingPropertyModel;
|
||||
import eu.eudat.models.data.helpers.responses.ResponseItem;
|
||||
import eu.eudat.types.ApiMessageCode;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
|
@ -42,5 +43,12 @@ public class DatasetProfiles extends BaseController {
|
|||
List<DatasetProfileListingModel> datasetProfileTableData = this.datasetProfileManager.getAll(tableRequestItem);
|
||||
return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem<List<DatasetProfileListingModel>>().status(ApiMessageCode.NO_MESSAGE).payload(datasetProfileTableData));
|
||||
}
|
||||
|
||||
@RequestMapping(method = RequestMethod.POST, value = {"/datasetprofiles/getAllWithPrefilling"}, produces = "application/json")
|
||||
public @ResponseBody
|
||||
ResponseEntity<ResponseItem<List<DatasetProfileWithPrefillingPropertyModel>>> getAllWithPrefilling(@RequestBody DatasetProfileTableRequestItem tableRequestItem) {
|
||||
List<DatasetProfileWithPrefillingPropertyModel> datasetProfileTableData = this.datasetProfileManager.getAllWithPrefilling(tableRequestItem);
|
||||
return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem<List<DatasetProfileWithPrefillingPropertyModel>>().status(ApiMessageCode.NO_MESSAGE).payload(datasetProfileTableData));
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -0,0 +1,18 @@
|
|||
package eu.eudat.exceptions.dmpblueprint;
|
||||
|
||||
public class DmpBlueprintUsedException extends RuntimeException {
|
||||
public DmpBlueprintUsedException() {
|
||||
}
|
||||
|
||||
public DmpBlueprintUsedException(String message) {
|
||||
super(message);
|
||||
}
|
||||
|
||||
public DmpBlueprintUsedException(String message, Throwable cause) {
|
||||
super(message, cause);
|
||||
}
|
||||
|
||||
public DmpBlueprintUsedException(Throwable cause) {
|
||||
super(cause);
|
||||
}
|
||||
}
|
|
@ -21,6 +21,7 @@ public class AdminManager {
|
|||
|
||||
public static DescriptionTemplate generateViewStyleDefinition(DatasetProfile profile, ApiContext apiContext) throws Exception {
|
||||
ViewStyleModel viewStyleModel = new ViewStyleModel();
|
||||
viewStyleModel.setEnablePrefilling(profile.isEnablePrefilling());
|
||||
viewStyleModel.setSections(new ModelBuilder().toViewStyleDefinition(profile.getSections(), eu.eudat.models.data.entities.xmlmodels.datasetprofiledefinition.Section.class));
|
||||
viewStyleModel.setPages(new ModelBuilder().toViewStyleDefinition(profile.getPages(), eu.eudat.models.data.entities.xmlmodels.datasetprofiledefinition.Page.class));
|
||||
Document viewStyleDoc = XmlBuilder.getDocument();
|
||||
|
|
|
@ -202,14 +202,14 @@ public class DashBoardManager {
|
|||
.selectAsync(item -> recentActivityDataBuilder.label(item.getLabel()).timestamp(item.getModified()).id(item.getId().toString()).build())
|
||||
.whenComplete((datasetActivities, throwable) -> activity.setRecentDatasetActivities(datasetActivities));
|
||||
|
||||
CompletableFuture<List<RecentActivityData>> grants = grantRepository.getAuthenticated(grantRepository.getWithCriteria(grantCriteria), user)
|
||||
/*CompletableFuture<List<RecentActivityData>> grants = grantRepository.getAuthenticated(grantRepository.getWithCriteria(grantCriteria), user)
|
||||
.withHint("grantRecentActivity")
|
||||
.orderBy((builder, root) -> builder.desc(root.get("modified")))
|
||||
.take(numberofactivities)
|
||||
.selectAsync(item -> recentActivityDataBuilder.label(item.getLabel()).timestamp(item.getModified()).id(item.getId().toString()).build())
|
||||
.whenComplete((grantActivities, throwable) -> activity.setRecentGrantActivities(grantActivities));
|
||||
.whenComplete((grantActivities, throwable) -> activity.setRecentGrantActivities(grantActivities));*/
|
||||
|
||||
CompletableFuture.allOf(grants, dmps, datasets).join();
|
||||
CompletableFuture.allOf(/*grants, */dmps, datasets).join();
|
||||
return activity;
|
||||
}
|
||||
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
package eu.eudat.logic.managers;
|
||||
|
||||
import com.fasterxml.jackson.core.JsonProcessingException;
|
||||
import com.fasterxml.jackson.core.type.TypeReference;
|
||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||
import eu.eudat.configurations.dynamicgrant.DynamicGrantConfiguration;
|
||||
|
@ -67,6 +68,7 @@ import eu.eudat.models.data.userinfo.UserListingModel;
|
|||
import eu.eudat.queryable.QueryableList;
|
||||
import eu.eudat.types.Authorities;
|
||||
import eu.eudat.types.MetricNames;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.apache.poi.xwpf.usermodel.XWPFDocument;
|
||||
import org.apache.poi.xwpf.usermodel.XWPFParagraph;
|
||||
import org.apache.poi.xwpf.usermodel.XWPFRun;
|
||||
|
@ -144,6 +146,7 @@ public class DataManagementPlanManager {
|
|||
public DataTableData<DataManagementPlanListingModel> getPaged(DataManagementPlanTableRequest dataManagementPlanTableRequest, Principal principal, String fieldsGroup) throws Exception {
|
||||
UUID principalID = principal.getId();
|
||||
List<Dmp> dmps = null;
|
||||
|
||||
QueryableList<DMP> items = null;
|
||||
QueryableList<DMP> authItems = null;
|
||||
Long totalData = 0L;
|
||||
|
@ -481,7 +484,7 @@ public class DataManagementPlanManager {
|
|||
|
||||
DMP newDmp = dataManagementPlan.toDataModel();
|
||||
if(dataManagementPlan.getProfile() != null){
|
||||
DMPProfile dmpProfile = apiContext.getOperationsContext().getDatabaseRepository().getDmpProfileDao().find(dataManagementPlan.getProfile().getId());
|
||||
DMPProfile dmpProfile = apiContext.getOperationsContext().getDatabaseRepository().getDmpProfileDao().find(dataManagementPlan.getProfile());
|
||||
newDmp.setProfile(dmpProfile);
|
||||
}
|
||||
if (newDmp.getStatus() == (int) DMP.DMPStatus.FINALISED.getValue()) {
|
||||
|
@ -528,7 +531,7 @@ public class DataManagementPlanManager {
|
|||
}
|
||||
|
||||
if(this.dataManagementProfileManager.fieldInBlueprint(newDmp.getProfile(), SystemFieldType.GRANT, principal)) {
|
||||
if (newDmp.getGrant().getType().equals(Grant.GrantType.INTERNAL.getValue())) {
|
||||
if (newDmp.getGrant() != null && newDmp.getGrant().getType().equals(Grant.GrantType.INTERNAL.getValue())) {
|
||||
checkIfUserCanEditGrant(newDmp, user);
|
||||
}
|
||||
assignGrandUserIfInternal(newDmp, user);
|
||||
|
@ -541,14 +544,24 @@ public class DataManagementPlanManager {
|
|||
}
|
||||
|
||||
if(newDmp.getId() != null){
|
||||
UUID dmpId = newDmp.getId();
|
||||
List<DMPDatasetProfile> dmpDatasetProfiles = apiContext.getOperationsContext().getDatabaseRepository().getDmpDatasetProfileDao().asQueryable()
|
||||
.where((builder, root) -> builder.equal(root.get("dmp").get("id"), dmpId)).toList();
|
||||
for (DMPDatasetProfile dmpDatasetProfile : dmpDatasetProfiles) {
|
||||
if (newDmp.getAssociatedDmps().stream().filter(dmpDatasetProfile1 -> dmpDatasetProfile1.getId() != null).noneMatch(dmpDatasetProfile1 -> dmpDatasetProfile1.getId().equals(dmpDatasetProfile.getId()))) {
|
||||
apiContext.getOperationsContext().getDatabaseRepository().getDmpDatasetProfileDao().delete(dmpDatasetProfile);
|
||||
}
|
||||
}
|
||||
for(DMPDatasetProfile dmpDatasetProfile : newDmp.getAssociatedDmps()){
|
||||
apiContext.getOperationsContext().getDatabaseRepository().getDmpDatasetProfileDao().createOrUpdate(dmpDatasetProfile);
|
||||
}
|
||||
}
|
||||
|
||||
if(this.dataManagementProfileManager.fieldInBlueprint(newDmp.getProfile(), SystemFieldType.GRANT, principal)) {
|
||||
if (newDmp.getGrant() != null) {
|
||||
apiContext.getOperationsContext().getDatabaseRepository().getGrantDao().createOrUpdate(newDmp.getGrant());
|
||||
}
|
||||
}
|
||||
newDmp = apiContext.getOperationsContext().getDatabaseRepository().getDmpDao().createOrUpdate(newDmp);
|
||||
|
||||
for(DMPDatasetProfile dmpDatasetProfile : newDmp.getAssociatedDmps()){
|
||||
|
@ -717,7 +730,7 @@ public class DataManagementPlanManager {
|
|||
newDmp.setId(null);
|
||||
|
||||
if(this.dataManagementProfileManager.fieldInBlueprint(newDmp.getProfile(), SystemFieldType.GRANT, principal)) {
|
||||
if (newDmp.getGrant().getType().equals(Grant.GrantType.INTERNAL.getValue())) {
|
||||
if (newDmp.getGrant() != null && newDmp.getGrant().getType().equals(Grant.GrantType.INTERNAL.getValue())) {
|
||||
checkIfUserCanEditGrant(newDmp, user);
|
||||
}
|
||||
assignGrandUserIfInternal(newDmp, user);
|
||||
|
@ -729,6 +742,7 @@ public class DataManagementPlanManager {
|
|||
assignProjectUserIfInternal(newDmp, user);
|
||||
}
|
||||
if(this.dataManagementProfileManager.fieldInBlueprint(newDmp.getProfile(), SystemFieldType.GRANT, principal)) {
|
||||
if (newDmp.getGrant() != null) {
|
||||
if (newDmp.getGrant().getStartdate() == null) {
|
||||
newDmp.getGrant().setStartdate(new Date());
|
||||
}
|
||||
|
@ -737,6 +751,7 @@ public class DataManagementPlanManager {
|
|||
}
|
||||
databaseRepository.getGrantDao().createOrUpdate(newDmp.getGrant());
|
||||
}
|
||||
}
|
||||
DMP tempDmp = databaseRepository.getDmpDao().createOrUpdate(newDmp);
|
||||
newDmp.setId(tempDmp.getId());
|
||||
for(DMPDatasetProfile dmpDatasetProfile : newDmp.getAssociatedDmps()){
|
||||
|
@ -804,7 +819,7 @@ public class DataManagementPlanManager {
|
|||
newDmp.setId(null);
|
||||
|
||||
if(this.dataManagementProfileManager.fieldInBlueprint(newDmp.getProfile(), SystemFieldType.GRANT, principal)) {
|
||||
if (newDmp.getGrant().getType().equals(Grant.GrantType.INTERNAL.getValue())) {
|
||||
if (newDmp.getGrant() != null && newDmp.getGrant().getType().equals(Grant.GrantType.INTERNAL.getValue())) {
|
||||
checkIfUserCanEditGrant(newDmp, user);
|
||||
}
|
||||
assignGrandUserIfInternal(newDmp, user);
|
||||
|
@ -816,8 +831,10 @@ public class DataManagementPlanManager {
|
|||
assignProjectUserIfInternal(newDmp, user);
|
||||
}
|
||||
if(this.dataManagementProfileManager.fieldInBlueprint(newDmp.getProfile(), SystemFieldType.GRANT, principal)) {
|
||||
if (newDmp.getGrant() != null) {
|
||||
databaseRepository.getGrantDao().createOrUpdate(newDmp.getGrant());
|
||||
}
|
||||
}
|
||||
DMP tempDmp = databaseRepository.getDmpDao().createOrUpdate(newDmp);
|
||||
newDmp.setId(tempDmp.getId());
|
||||
for(DMPDatasetProfile dmpDatasetProfile : newDmp.getAssociatedDmps()){
|
||||
|
@ -1354,103 +1371,104 @@ public class DataManagementPlanManager {
|
|||
dmpBlueprintModel.fromDataModel(dmpProfile);
|
||||
DataManagementPlanBlueprint dmpBlueprint = dmpBlueprintModel.getDefinition();
|
||||
for(Section section: dmpBlueprint.getSections()) {
|
||||
wordBuilder.addParagraphContent("Section " + section.getOrdinal(), document, ParagraphStyle.HEADER1, BigInteger.ZERO, 0);
|
||||
XWPFParagraph sectionInfoParagraph = document.createParagraph();
|
||||
sectionInfoParagraph.setSpacingBetween(1.0);
|
||||
XWPFRun runSectionTitle = sectionInfoParagraph.createRun();
|
||||
runSectionTitle.setText("Title: ");
|
||||
runSectionTitle.setColor("000000");
|
||||
XWPFRun runSectionTitleText = sectionInfoParagraph.createRun();
|
||||
runSectionTitleText.setText(section.getLabel());
|
||||
runSectionTitleText.setColor("116a78");
|
||||
XWPFParagraph sectionDescriptionParagraph = document.createParagraph();
|
||||
XWPFRun runSectionDescription = sectionDescriptionParagraph.createRun();
|
||||
runSectionDescription.setText("Description: ");
|
||||
runSectionDescription.setColor("000000");
|
||||
XWPFRun runSectionDescriptionText = sectionDescriptionParagraph.createRun();
|
||||
runSectionDescriptionText.setText(section.getDescription());
|
||||
runSectionDescriptionText.setColor("116a78");
|
||||
wordBuilder.addParagraphContent(section.getOrdinal() + ". " + section.getLabel(), document, ParagraphStyle.HEADER1, BigInteger.ZERO, 0);
|
||||
// XWPFParagraph sectionInfoParagraph = document.createParagraph();
|
||||
// sectionInfoParagraph.setSpacingBetween(1.0);
|
||||
// XWPFRun runSectionTitle = sectionInfoParagraph.createRun();
|
||||
// runSectionTitle.setText("Title: ");
|
||||
// runSectionTitle.setColor("000000");
|
||||
// XWPFRun runSectionTitleText = sectionInfoParagraph.createRun();
|
||||
// runSectionTitleText.setText(section.getLabel());
|
||||
// runSectionTitleText.setColor("116a78");
|
||||
// XWPFParagraph sectionDescriptionParagraph = document.createParagraph();
|
||||
// XWPFRun runSectionDescription = sectionDescriptionParagraph.createRun();
|
||||
// runSectionDescription.setText("Description: ");
|
||||
// runSectionDescription.setColor("000000");
|
||||
// XWPFRun runSectionDescriptionText = sectionDescriptionParagraph.createRun();
|
||||
// runSectionDescriptionText.setText(section.getDescription());
|
||||
// runSectionDescriptionText.setColor("116a78");
|
||||
|
||||
wordBuilder.addParagraphContent("Section Fields", document, ParagraphStyle.HEADER2, BigInteger.ZERO, 0);
|
||||
//wordBuilder.addParagraphContent("Section Fields", document, ParagraphStyle.HEADER2, BigInteger.ZERO, 0);
|
||||
section.getFields().sort(Comparator.comparingInt(FieldModel::getOrdinal));
|
||||
for (FieldModel field : section.getFields()) {
|
||||
if (field.getCategory() == FieldCategory.SYSTEM) {
|
||||
SystemField systemField = field.toSystemField();
|
||||
if (systemField.getType() == SystemFieldType.LANGUAGE) continue;
|
||||
XWPFParagraph systemFieldParagraph = document.createParagraph();
|
||||
systemFieldParagraph.setSpacingBetween(1.0);
|
||||
// systemFieldParagraph.setSpacingBetween(1.0);
|
||||
XWPFRun runSyStemFieldTitle = systemFieldParagraph.createRun();
|
||||
runSyStemFieldTitle.setText("Title: ");
|
||||
runSyStemFieldTitle.setText(systemField.getLabel() + ": ");
|
||||
runSyStemFieldTitle.setColor("000000");
|
||||
XWPFRun runSystemFieldTitleText = systemFieldParagraph.createRun();
|
||||
runSystemFieldTitleText.setText(systemField.getLabel());
|
||||
runSystemFieldTitleText.setColor("116a78");
|
||||
if(systemField.getDescription() != null && !systemField.getDescription().isEmpty()){
|
||||
XWPFParagraph systemFieldDescription = document.createParagraph();
|
||||
systemFieldDescription.setSpacingBetween(1.0);
|
||||
XWPFRun runSyStemFieldDescription = systemFieldDescription.createRun();
|
||||
runSyStemFieldDescription.setText("Description: ");
|
||||
runSyStemFieldDescription.setColor("000000");
|
||||
XWPFRun runSystemFieldDescriptionText = systemFieldDescription.createRun();
|
||||
runSystemFieldDescriptionText.setText(systemField.getDescription());
|
||||
runSystemFieldDescriptionText.setColor("116a78");
|
||||
}
|
||||
XWPFParagraph systemFieldInput = document.createParagraph();
|
||||
systemFieldInput.setSpacingBetween(1.0);
|
||||
XWPFRun runInput = systemFieldInput.createRun();
|
||||
runInput.setText("Input: ");
|
||||
runInput.setColor("000000");
|
||||
// XWPFRun runSystemFieldTitleText = systemFieldParagraph.createRun();
|
||||
// runSystemFieldTitleText.setText(systemField.getLabel());
|
||||
// runSystemFieldTitleText.setColor("116a78");
|
||||
// if(systemField.getDescription() != null && !systemField.getDescription().isEmpty()){
|
||||
// XWPFParagraph systemFieldDescription = document.createParagraph();
|
||||
// systemFieldDescription.setSpacingBetween(1.0);
|
||||
// XWPFRun runSyStemFieldDescription = systemFieldDescription.createRun();
|
||||
// runSyStemFieldDescription.setText("Description: ");
|
||||
// runSyStemFieldDescription.setColor("000000");
|
||||
// XWPFRun runSystemFieldDescriptionText = systemFieldDescription.createRun();
|
||||
// runSystemFieldDescriptionText.setText(systemField.getDescription());
|
||||
// runSystemFieldDescriptionText.setColor("116a78");
|
||||
// }
|
||||
// XWPFParagraph systemFieldInput = document.createParagraph();
|
||||
// systemFieldInput.setSpacingBetween(1.0);
|
||||
// XWPFRun runInput = systemFieldInput.createRun();
|
||||
// runInput.setText("Input: ");
|
||||
// runInput.setColor("000000");
|
||||
switch (systemField.getType()) {
|
||||
case TEXT:
|
||||
XWPFRun runTitle = systemFieldInput.createRun();
|
||||
XWPFRun runTitle = systemFieldParagraph.createRun();
|
||||
runTitle.setText(dmpEntity.getLabel());
|
||||
runTitle.setColor("116a78");
|
||||
break;
|
||||
case HTML_TEXT:
|
||||
XWPFRun runDescription = systemFieldInput.createRun();
|
||||
runDescription.setText(dmpEntity.getDescription());
|
||||
runDescription.setColor("116a78");
|
||||
wordBuilder.addParagraphContent(dmpEntity.getDescription(), document, ParagraphStyle.HTML, BigInteger.ZERO, 0);
|
||||
break;
|
||||
case RESEARCHERS:
|
||||
for (Researcher researcher : dmpEntity.getResearchers()) {
|
||||
XWPFRun runResearcher = systemFieldInput.createRun();
|
||||
runResearcher.setText("• " + researcher.getLabel());
|
||||
XWPFRun runResearcher = systemFieldParagraph.createRun();
|
||||
runResearcher.addBreak();
|
||||
runResearcher.setText(researcher.getLabel());
|
||||
runResearcher.setColor("116a78");
|
||||
}
|
||||
break;
|
||||
case ORGANIZATIONS:
|
||||
for (Organisation organisation : dmpEntity.getOrganisations()) {
|
||||
XWPFRun runOrganisation = systemFieldInput.createRun();
|
||||
runOrganisation.setText("• " + organisation.getLabel());
|
||||
XWPFRun runOrganisation = systemFieldParagraph.createRun();
|
||||
runOrganisation.addBreak();
|
||||
runOrganisation.setText(organisation.getLabel());
|
||||
runOrganisation.setColor("116a78");
|
||||
}
|
||||
break;
|
||||
case LANGUAGE:
|
||||
XWPFRun runLanguage = systemFieldInput.createRun();
|
||||
runLanguage.setText(objectMapper.readValue(dmpEntity.getExtraProperties(), HashMap.class).get("language").toString());
|
||||
runLanguage.setColor("116a78");
|
||||
break;
|
||||
// case LANGUAGE:
|
||||
// XWPFRun runLanguage = systemFieldParagraph.createRun();
|
||||
// runLanguage.setText(objectMapper.readValue(dmpEntity.getExtraProperties(), HashMap.class).get("language").toString());
|
||||
// runLanguage.setColor("116a78");
|
||||
// break;
|
||||
case CONTACT:
|
||||
XWPFRun runContact = systemFieldInput.createRun();
|
||||
runContact.setText(dmpEntity.getCreator().getName());
|
||||
XWPFRun runContact = systemFieldParagraph.createRun();
|
||||
runContact.setText(dmpEntity.getCreator() == null ? "" : dmpEntity.getCreator().getName());
|
||||
runContact.setColor("116a78");
|
||||
break;
|
||||
case FUNDER:
|
||||
if (dmpEntity.getGrant() != null && dmpEntity.getGrant().getFunder() != null) {
|
||||
XWPFRun runFunder = systemFieldInput.createRun();
|
||||
XWPFRun runFunder = systemFieldParagraph.createRun();
|
||||
runFunder.setText(dmpEntity.getGrant().getFunder().getLabel());
|
||||
runFunder.setColor("116a78");
|
||||
}
|
||||
break;
|
||||
case GRANT:
|
||||
if (dmpEntity.getGrant() != null) {
|
||||
XWPFRun runGrant = systemFieldInput.createRun();
|
||||
XWPFRun runGrant = systemFieldParagraph.createRun();
|
||||
runGrant.setText(dmpEntity.getGrant().getLabel());
|
||||
runGrant.setColor("116a78");
|
||||
}
|
||||
break;
|
||||
case PROJECT:
|
||||
if (dmpEntity.getProject() != null) {
|
||||
XWPFRun runProject = systemFieldInput.createRun();
|
||||
XWPFRun runProject = systemFieldParagraph.createRun();
|
||||
runProject.setText(dmpEntity.getProject().getLabel());
|
||||
runProject.setColor("116a78");
|
||||
}
|
||||
|
@ -1458,62 +1476,79 @@ public class DataManagementPlanManager {
|
|||
case LICENSE:
|
||||
Map extraProperties = objectMapper.readValue(dmpEntity.getExtraProperties(), HashMap.class);
|
||||
if (extraProperties.containsKey("license")) {
|
||||
XWPFRun runLicense = systemFieldInput.createRun();
|
||||
runLicense.setText(extraProperties.get("license").toString());
|
||||
Map<String, String> license = ((Map<String, String>) extraProperties.get("license"));
|
||||
if (license != null && !StringUtils.isEmpty(license.get("pid"))) {
|
||||
XWPFRun runLicense = systemFieldParagraph.createRun();
|
||||
runLicense.setText(license.get("pid").toString());
|
||||
runLicense.setColor("116a78");
|
||||
}
|
||||
}
|
||||
break;
|
||||
case ACCESS_RIGHTS:
|
||||
Map extraPropertiesMap = objectMapper.readValue(dmpEntity.getExtraProperties(), HashMap.class);
|
||||
if (extraPropertiesMap.containsKey("visible")) {
|
||||
XWPFRun runAccessRights = systemFieldInput.createRun();
|
||||
runAccessRights.setText(extraPropertiesMap.get("visible").toString());
|
||||
XWPFRun runAccessRights = systemFieldParagraph.createRun();
|
||||
runAccessRights.setText(Boolean.valueOf(extraPropertiesMap.get("visible").toString()) ? "Public" : "Restricted");
|
||||
runAccessRights.setColor("116a78");
|
||||
}
|
||||
break;
|
||||
}
|
||||
document.createParagraph();
|
||||
}
|
||||
else if(field.getCategory() == FieldCategory.EXTRA){
|
||||
//document.createParagraph();
|
||||
} else if (field.getCategory() == FieldCategory.EXTRA) {
|
||||
|
||||
Map dmpProperties = objectMapper.readValue(dmpEntity.getProperties(), HashMap.class);
|
||||
if (dmpProperties != null && (!dmpProperties.containsKey(field.getId().toString()) || StringUtils.isEmpty((String) dmpProperties.get(field.getId().toString()))))
|
||||
continue;
|
||||
ExtraField extraField = field.toExtraField();
|
||||
XWPFParagraph extraFieldParagraph = document.createParagraph();
|
||||
extraFieldParagraph.setSpacingBetween(1.0);
|
||||
XWPFRun runExtraFieldLabel = extraFieldParagraph.createRun();
|
||||
runExtraFieldLabel.setText(extraField.getLabel());
|
||||
runExtraFieldLabel.setColor("116a78");
|
||||
if(extraField.getDescription() != null && !extraField.getDescription().isEmpty()){
|
||||
XWPFRun runExtraFieldDescription = extraFieldParagraph.createRun();
|
||||
runExtraFieldDescription.setText(extraField.getDescription());
|
||||
runExtraFieldDescription.setColor("116a78");
|
||||
}
|
||||
runExtraFieldLabel.setText(extraField.getLabel() + ": ");
|
||||
runExtraFieldLabel.setColor("000000");
|
||||
// if(extraField.getDescription() != null && !extraField.getDescription().isEmpty()){
|
||||
// XWPFRun runExtraFieldDescription = extraFieldParagraph.createRun();
|
||||
// runExtraFieldDescription.setText(extraField.getDescription());
|
||||
// runExtraFieldDescription.setColor("116a78");
|
||||
// }
|
||||
XWPFRun runExtraFieldInput = extraFieldParagraph.createRun();
|
||||
Map dmpProperties = objectMapper.readValue(dmpEntity.getProperties(), HashMap.class);
|
||||
if (dmpProperties.containsKey(field.getId()) && dmpProperties.get(field.getId()) != null) {
|
||||
runExtraFieldInput.setText((String) dmpProperties.get(field.getId()));
|
||||
}
|
||||
switch (extraField.getType()) {
|
||||
case TEXT:
|
||||
runExtraFieldInput.setText((String) dmpProperties.get(field.getId().toString()));
|
||||
runExtraFieldInput.setColor("116a78");
|
||||
break;
|
||||
case RICH_TEXT:
|
||||
wordBuilder.addParagraphContent(dmpProperties.get(field.getId().toString()), document, ParagraphStyle.HTML, BigInteger.ZERO, 0);
|
||||
// runExtraFieldInput.setText((String) dmpProperties.get(field.getId().toString()));
|
||||
// runExtraFieldInput.setColor("116a78");
|
||||
break;
|
||||
case DATE:
|
||||
runExtraFieldInput.setText((String) dmpProperties.get(field.getId().toString()));
|
||||
runExtraFieldInput.setColor("116a78");
|
||||
break;
|
||||
case NUMBER:
|
||||
runExtraFieldInput.setText((String) dmpProperties.get(field.getId().toString()));
|
||||
runExtraFieldInput.setColor("116a78");
|
||||
break;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
if(!section.getDescriptionTemplates().isEmpty()){
|
||||
wordBuilder.addParagraphContent("Section descriptions", document, ParagraphStyle.HEADER2, BigInteger.ZERO, 0);
|
||||
wordBuilder.addParagraphContent("Description Templates", document, ParagraphStyle.HEADER4, BigInteger.ZERO, 0);
|
||||
for(eu.eudat.models.data.entities.xmlmodels.dmpprofiledefinition.DescriptionTemplate descriptionTemplate: section.getDescriptionTemplates()){
|
||||
XWPFParagraph templateParagraph = document.createParagraph();
|
||||
XWPFRun runTemplateLabel = templateParagraph.createRun();
|
||||
runTemplateLabel.setText("• " + descriptionTemplate.getLabel());
|
||||
runTemplateLabel.setColor("116a78");
|
||||
}
|
||||
|
||||
//if(!section.getDescriptionTemplates().isEmpty()){
|
||||
final Boolean isFinalized = dmpEntity.getStatus() == DMP.DMPStatus.FINALISED.getValue();
|
||||
final Boolean isPublic = dmpEntity.isPublic();
|
||||
dmpEntity.getDataset().stream()
|
||||
List<Dataset> datasets = dmpEntity.getDataset().stream()
|
||||
.filter(item -> item.getStatus() != Dataset.Status.CANCELED.getValue())
|
||||
.filter(item -> item.getStatus() != Dataset.Status.DELETED.getValue())
|
||||
.filter(item -> !isPublic && !isFinalized || item.getStatus() == Dataset.Status.FINALISED.getValue())
|
||||
.filter(item -> item.getDmpSectionIndex().equals(section.getOrdinal() - 1))
|
||||
.sorted(Comparator.comparing(Dataset::getCreated))
|
||||
.forEach(datasetEntity -> {
|
||||
.sorted(Comparator.comparing(Dataset::getCreated)).collect(Collectors.toList());
|
||||
|
||||
if (datasets.size() > 0)
|
||||
wordBuilder.addParagraphContent("Descriptions", document, ParagraphStyle.HEADER2, BigInteger.ZERO, 0);
|
||||
for (Dataset datasetEntity : datasets) {
|
||||
|
||||
|
||||
Map<String, Object> properties = new HashMap<>();
|
||||
if (datasetEntity.getProperties() != null) {
|
||||
//ObjectMapper objectMapper = new ObjectMapper();
|
||||
|
@ -1532,7 +1567,7 @@ public class DataManagementPlanManager {
|
|||
datasetDescriptionParagraph.setStyle("Heading4");
|
||||
datasetDescriptionParagraph.setSpacingBetween(1.5);
|
||||
XWPFRun datasetDescriptionRun = datasetDescriptionParagraph.createRun();
|
||||
datasetDescriptionRun.setText("Dataset Description");
|
||||
datasetDescriptionRun.setText(datasetEntity.getLabel());
|
||||
//datasetDescriptionRun.setColor("2E75B6");
|
||||
//datasetDescriptionRun.setBold(true);
|
||||
datasetDescriptionRun.setFontSize(15);
|
||||
|
@ -1540,20 +1575,26 @@ public class DataManagementPlanManager {
|
|||
|
||||
// Custom style for the Dataset title.
|
||||
//wordBuilder.addParagraphContent("Title: " + datasetEntity.getLabel(), document, ParagraphStyle.HEADER1, BigInteger.ZERO);
|
||||
XWPFParagraph datasetLabelParagraph = document.createParagraph();
|
||||
// datasetLabelParagraph.setStyle("Heading2");
|
||||
datasetLabelParagraph.setSpacingBetween(1.0);
|
||||
XWPFRun runDatasetTitle1 = datasetLabelParagraph.createRun();
|
||||
runDatasetTitle1.setText("Title: ");
|
||||
runDatasetTitle1.setColor("000000");
|
||||
//runDatasetTitle1.setBold(true);
|
||||
//runDatasetTitle1.setFontSize(12);
|
||||
XWPFRun runDatasetTitle = datasetLabelParagraph.createRun();
|
||||
runDatasetTitle.setText(datasetEntity.getLabel());
|
||||
runDatasetTitle.setColor("116a78");
|
||||
// XWPFParagraph datasetLabelParagraph = document.createParagraph();
|
||||
//// datasetLabelParagraph.setStyle("Heading2");
|
||||
// datasetLabelParagraph.setSpacingBetween(1.0);
|
||||
// XWPFRun runDatasetTitle1 = datasetLabelParagraph.createRun();
|
||||
// runDatasetTitle1.setText("Title: ");
|
||||
// runDatasetTitle1.setColor("000000");
|
||||
// //runDatasetTitle1.setBold(true);
|
||||
// //runDatasetTitle1.setFontSize(12);
|
||||
// XWPFRun runDatasetTitle = datasetLabelParagraph.createRun();
|
||||
// runDatasetTitle.setText(datasetEntity.getLabel());
|
||||
// runDatasetTitle.setColor("116a78");
|
||||
//runDatasetTitle.setBold(true);
|
||||
//runDatasetTitle.setFontSize(12);
|
||||
|
||||
XWPFParagraph descriptionParagraph = document.createParagraph();
|
||||
// XWPFRun descriptionParagraphRun = descriptionParagraph.createRun();
|
||||
// descriptionParagraphRun.setText("Description: ");
|
||||
// descriptionParagraphRun.setColor("000000");
|
||||
wordBuilder.addParagraphContent(datasetEntity.getDescription(), document, ParagraphStyle.HTML, BigInteger.ZERO, 0);
|
||||
|
||||
XWPFParagraph datasetTemplateParagraph = document.createParagraph();
|
||||
// datasetTemplateParagraph.setStyle("Heading3");
|
||||
XWPFRun runDatasetTemplate1 = datasetTemplateParagraph.createRun();
|
||||
|
@ -1605,10 +1646,10 @@ public class DataManagementPlanManager {
|
|||
|
||||
XWPFParagraph datasetDescParagraph = document.createParagraph();
|
||||
XWPFRun runDatasetDescription1 = datasetDescParagraph.createRun();
|
||||
runDatasetDescription1.setText("Description: ");
|
||||
runDatasetDescription1.setText("Type: ");
|
||||
runDatasetDescription1.setColor("000000");
|
||||
XWPFRun runDatasetDescription = datasetDescParagraph.createRun();
|
||||
runDatasetDescription.setText(datasetEntity.getProfile().getLabel());
|
||||
runDatasetDescription.setText(datasetEntity.getProfile().getType().getName());
|
||||
runDatasetDescription.setColor("116a78");
|
||||
//wordBuilder.addParagraphContent(datasetEntity.getDescription(), document, ParagraphStyle.HTML, BigInteger.ZERO, 0);
|
||||
|
||||
|
@ -1625,8 +1666,8 @@ public class DataManagementPlanManager {
|
|||
// Page break at the end of the Dataset.
|
||||
XWPFParagraph parBreakDataset = document.createParagraph();
|
||||
parBreakDataset.setPageBreak(true);
|
||||
});
|
||||
}
|
||||
//}
|
||||
}
|
||||
|
||||
// // Removes the top empty headings.
|
||||
|
@ -1766,7 +1807,7 @@ public class DataManagementPlanManager {
|
|||
|
||||
// Funder.
|
||||
Element funder = xmlDoc.createElement("funder");
|
||||
if (this.dataManagementProfileManager.fieldInBlueprint(dmp.getProfile(), SystemFieldType.GRANT, principal) && this.dataManagementProfileManager.fieldInBlueprint(dmp.getProfile(), SystemFieldType.FUNDER, principal)) {
|
||||
if (this.dataManagementProfileManager.fieldInBlueprint(dmp.getProfile(), SystemFieldType.GRANT, principal) && this.dataManagementProfileManager.fieldInBlueprint(dmp.getProfile(), SystemFieldType.FUNDER, principal) && dmp.getGrant() != null) {
|
||||
Element funderLabel = xmlDoc.createElement("label");
|
||||
Element funderId = xmlDoc.createElement("id");
|
||||
funderLabel.setTextContent(dmp.getGrant().getFunder().getLabel());
|
||||
|
@ -1784,7 +1825,7 @@ public class DataManagementPlanManager {
|
|||
dmpElement.appendChild(funder);
|
||||
// Grant.
|
||||
Element grant = xmlDoc.createElement("grant");
|
||||
if (this.dataManagementProfileManager.fieldInBlueprint(dmp.getProfile(), SystemFieldType.GRANT, principal)) {
|
||||
if (this.dataManagementProfileManager.fieldInBlueprint(dmp.getProfile(), SystemFieldType.GRANT, principal) && dmp.getGrant() != null) {
|
||||
Element grantLabel = xmlDoc.createElement("label");
|
||||
Element grantId = xmlDoc.createElement("id");
|
||||
grantLabel.setTextContent(dmp.getGrant().getLabel());
|
||||
|
@ -1802,7 +1843,7 @@ public class DataManagementPlanManager {
|
|||
dmpElement.appendChild(grant);
|
||||
// Project.
|
||||
Element project = xmlDoc.createElement("project");
|
||||
if (this.dataManagementProfileManager.fieldInBlueprint(dmp.getProfile(), SystemFieldType.PROJECT, principal)) {
|
||||
if (this.dataManagementProfileManager.fieldInBlueprint(dmp.getProfile(), SystemFieldType.PROJECT, principal) && dmp.getProject() != null) {
|
||||
Element projectId = xmlDoc.createElement("id");
|
||||
Element projectLabel = xmlDoc.createElement("label");
|
||||
Element projectDescription = xmlDoc.createElement("description");
|
||||
|
@ -2044,16 +2085,14 @@ public class DataManagementPlanManager {
|
|||
DataManagementPlanEditorModel dm = new DataManagementPlanEditorModel();
|
||||
|
||||
DmpProfileImportModel dmpProfileImportModel = dataManagementPlans.get(0).getDmpProfile();
|
||||
Tuple<UUID, String> tupleProfile = new Tuple<>();
|
||||
UUID profileId = null;
|
||||
if (dmpProfileImportModel != null) {
|
||||
tupleProfile.setId(dmpProfileImportModel.getDmpProfileId());
|
||||
tupleProfile.setLabel(dmpProfileImportModel.getDmpProfileName());
|
||||
profileId = dmpProfileImportModel.getDmpProfileId();
|
||||
}
|
||||
else {
|
||||
tupleProfile.setId(UUID.fromString("86635178-36a6-484f-9057-a934e4eeecd5"));
|
||||
tupleProfile.setLabel("Dmp Default Blueprint");
|
||||
profileId = UUID.fromString("86635178-36a6-484f-9057-a934e4eeecd5");
|
||||
}
|
||||
dm.setProfile(tupleProfile);
|
||||
dm.setProfile(profileId);
|
||||
|
||||
|
||||
Map<String, Object> dmpPropertiesMap = new HashMap<>();
|
||||
|
@ -2247,6 +2286,11 @@ public class DataManagementPlanManager {
|
|||
dmp.setUsers(new HashSet<>(apiContext.getOperationsContext().getDatabaseRepository().getUserDmpDao().asQueryable().where((builder, root) -> builder.equal(root.get("dmp").get("id"), dmpId)).toList()));
|
||||
this.updateIndex(dmp);
|
||||
}
|
||||
for(DMPDatasetProfile dmpDatasetProfile : dmp.getAssociatedDmps()){
|
||||
dmpDatasetProfile.setDmp(dmp);
|
||||
apiContext.getOperationsContext().getDatabaseRepository().getDmpDatasetProfileDao().createOrUpdate(dmpDatasetProfile);
|
||||
}
|
||||
|
||||
dmp.getDataset().forEach(dataset -> {
|
||||
dataset.setStatus(Dataset.Status.SAVED.getValue());
|
||||
dataset.setCreated(new Date());
|
||||
|
@ -2306,19 +2350,19 @@ public class DataManagementPlanManager {
|
|||
}
|
||||
|
||||
private void assignGrandUserIfInternal(DMP dmp, UserInfo user) {
|
||||
if (dmp.getGrant().getCreationUser() == null && (dmp.getGrant().getReference() != null && dmp.getGrant().getReference().startsWith("dmp:"))) {
|
||||
if (dmp.getGrant() != null && dmp.getGrant().getCreationUser() == null && (dmp.getGrant().getReference() != null && dmp.getGrant().getReference().startsWith("dmp:"))) {
|
||||
dmp.getGrant().setCreationUser(user);
|
||||
}
|
||||
}
|
||||
|
||||
private void assignFunderUserIfInternal(DMP dmp, UserInfo user) {
|
||||
if (dmp.getGrant().getFunder().getCreationUser() == null && ( dmp.getGrant().getFunder().getReference() != null && dmp.getGrant().getFunder().getReference().startsWith("dmp:"))) {
|
||||
if (dmp.getGrant() != null && dmp.getGrant().getFunder() != null && dmp.getGrant().getFunder().getCreationUser() == null && ( dmp.getGrant().getFunder().getReference() != null && dmp.getGrant().getFunder().getReference().startsWith("dmp:"))) {
|
||||
dmp.getGrant().getFunder().setCreationUser(user);
|
||||
}
|
||||
}
|
||||
|
||||
private void assignProjectUserIfInternal(DMP dmp, UserInfo user) {
|
||||
if (dmp.getProject().getCreationUser() == null && (dmp.getProject().getReference() != null && dmp.getProject().getReference().startsWith("dmp:"))) {
|
||||
if (dmp.getProject() != null && dmp.getProject().getCreationUser() == null && (dmp.getProject().getReference() != null && dmp.getProject().getReference().startsWith("dmp:"))) {
|
||||
dmp.getProject().setCreationUser(user);
|
||||
}
|
||||
}
|
||||
|
@ -2398,7 +2442,7 @@ public class DataManagementPlanManager {
|
|||
* */
|
||||
|
||||
private void checkIfUserCanEditGrant(DMP dmp, UserInfo user) throws Exception{
|
||||
if (dmp.getGrant().getId() != null) {
|
||||
if (dmp.getGrant() != null && dmp.getGrant().getId() != null) {
|
||||
Grant grant = apiContext.getOperationsContext().getDatabaseRepository().getGrantDao().find(dmp.getGrant().getId());
|
||||
if (grant.getFunder() != null && dmp.getGrant().getFunder() != null
|
||||
&& !grant.getFunder().getId().equals(dmp.getGrant().getFunder().getId())) {
|
||||
|
|
|
@ -2,11 +2,17 @@ package eu.eudat.logic.managers;
|
|||
|
||||
import com.jayway.jsonpath.DocumentContext;
|
||||
import com.jayway.jsonpath.JsonPath;
|
||||
import eu.eudat.data.dao.criteria.DataManagementPlanCriteria;
|
||||
import eu.eudat.data.dao.criteria.RequestItem;
|
||||
import eu.eudat.data.dao.entities.DatasetDao;
|
||||
import eu.eudat.data.dao.entities.DatasetProfileDao;
|
||||
import eu.eudat.data.entities.DMPProfile;
|
||||
import eu.eudat.data.entities.DescriptionTemplate;
|
||||
import eu.eudat.data.query.items.dmpblueprint.DataManagementPlanBlueprintTableRequest;
|
||||
import eu.eudat.data.query.items.item.dmpprofile.DataManagementPlanProfileCriteriaRequest;
|
||||
import eu.eudat.data.query.items.table.dmpprofile.DataManagementPlanProfileTableRequest;
|
||||
import eu.eudat.exceptions.datasetprofile.DatasetProfileWithDatasetsExeption;
|
||||
import eu.eudat.exceptions.dmpblueprint.DmpBlueprintUsedException;
|
||||
import eu.eudat.logic.services.operations.DatabaseRepository;
|
||||
import eu.eudat.logic.utilities.builders.XmlBuilder;
|
||||
import eu.eudat.logic.utilities.documents.helpers.FileEnvelope;
|
||||
|
@ -129,6 +135,17 @@ public class DataManagementProfileManager {
|
|||
return false;
|
||||
}
|
||||
|
||||
public List<Integer> sectionIndexesForDescriptionTemplate(DMPProfile dmpProfile, UUID descriptionTemplateId) {
|
||||
DataManagementPlanBlueprintListingModel dmpBlueprint = new DataManagementPlanBlueprintListingModel();
|
||||
dmpBlueprint.fromDataModel(dmpProfile);
|
||||
List<Integer> sectionIndexes = new ArrayList<>();
|
||||
for(int i = 0; i < dmpBlueprint.getDefinition().getSections().size(); i++) {
|
||||
Section section = dmpBlueprint.getDefinition().getSections().get(i);
|
||||
if(section.getHasTemplates() && section.getDescriptionTemplates().stream().anyMatch(x -> x.getDescriptionTemplateId().equals(descriptionTemplateId))) sectionIndexes.add(i);
|
||||
}
|
||||
return sectionIndexes;
|
||||
}
|
||||
|
||||
public List<DataManagementPlanProfileListingModel> getWithCriteria(DataManagementPlanProfileCriteriaRequest dataManagementPlanProfileCriteriaRequest) throws IllegalAccessException, InstantiationException {
|
||||
QueryableList<DMPProfile> items = databaseRepository.getDmpProfileDao().getWithCriteria(dataManagementPlanProfileCriteriaRequest.getCriteria());
|
||||
List<DataManagementPlanProfileListingModel> datamanagementPlans = items.select(item -> new DataManagementPlanProfileListingModel().fromDataModel(item));
|
||||
|
@ -145,6 +162,18 @@ public class DataManagementProfileManager {
|
|||
apiContext.getOperationsContext().getDatabaseRepository().getDmpProfileDao().createOrUpdate(dmpProfile);
|
||||
}
|
||||
|
||||
public void inactivate(String id) {
|
||||
DMPProfile dmpProfile = databaseRepository.getDmpProfileDao().find(UUID.fromString(id));
|
||||
DataManagementPlanCriteria dataManagementPlanCriteria = new DataManagementPlanCriteria();
|
||||
dataManagementPlanCriteria.setProfile(dmpProfile);
|
||||
if (dmpProfile.getStatus() == DMPProfile.Status.SAVED.getValue() || databaseRepository.getDmpDao().getWithCriteria(dataManagementPlanCriteria).count() == 0) {
|
||||
dmpProfile.setStatus(DMPProfile.Status.DELETED.getValue());
|
||||
databaseRepository.getDmpProfileDao().createOrUpdate(dmpProfile);
|
||||
} else {
|
||||
throw new DmpBlueprintUsedException("This blueprint can not deleted, because DMPs are associated with it");
|
||||
}
|
||||
}
|
||||
|
||||
public ResponseEntity<byte[]> getDocument(DataManagementPlanBlueprintListingModel dmpProfile) throws IOException {
|
||||
FileEnvelope envelope = getXmlDocument(dmpProfile);
|
||||
InputStream resource = new FileInputStream(envelope.getFile());
|
||||
|
|
|
@ -1,7 +1,5 @@
|
|||
package eu.eudat.logic.managers;
|
||||
|
||||
import com.jayway.jsonpath.DocumentContext;
|
||||
import com.jayway.jsonpath.JsonPath;
|
||||
import eu.eudat.data.dao.criteria.DatasetProfileCriteria;
|
||||
import eu.eudat.data.entities.DescriptionTemplate;
|
||||
import eu.eudat.data.entities.UserDatasetProfile;
|
||||
|
@ -10,17 +8,21 @@ import eu.eudat.data.query.items.item.datasetprofile.DatasetProfileAutocompleteR
|
|||
import eu.eudat.data.query.items.table.datasetprofile.DatasetProfileTableRequestItem;
|
||||
import eu.eudat.exceptions.datasetprofile.DatasetProfileNewVersionException;
|
||||
import eu.eudat.logic.builders.model.models.DataTableDataBuilder;
|
||||
import eu.eudat.logic.proxy.config.Semantic;
|
||||
import eu.eudat.logic.proxy.config.*;
|
||||
import eu.eudat.logic.proxy.config.configloaders.ConfigLoader;
|
||||
import eu.eudat.logic.proxy.config.entities.GeneralUrls;
|
||||
import eu.eudat.logic.proxy.fetching.RemoteFetcher;
|
||||
import eu.eudat.logic.services.ApiContext;
|
||||
import eu.eudat.logic.services.operations.DatabaseRepository;
|
||||
import eu.eudat.logic.utilities.builders.XmlBuilder;
|
||||
import eu.eudat.logic.utilities.documents.helpers.FileEnvelope;
|
||||
import eu.eudat.logic.utilities.documents.xml.datasetProfileXml.ExportXmlBuilderDatasetProfile;
|
||||
import eu.eudat.logic.utilities.documents.xml.datasetProfileXml.ImportXmlBuilderDatasetProfile;
|
||||
import eu.eudat.models.data.admin.composite.DatasetProfile;
|
||||
import eu.eudat.models.data.components.commons.datafield.AutoCompleteData;
|
||||
import eu.eudat.models.data.datasetprofile.DatasetProfileAutocompleteItem;
|
||||
import eu.eudat.models.data.datasetprofile.DatasetProfileListingModel;
|
||||
import eu.eudat.models.data.datasetprofile.DatasetProfileWithPrefillingPropertyModel;
|
||||
import eu.eudat.models.data.entities.xmlmodels.datasetprofiledefinition.Field;
|
||||
import eu.eudat.models.data.externaldataset.ExternalAutocompleteFieldModel;
|
||||
import eu.eudat.models.data.helpers.common.DataTableData;
|
||||
|
@ -34,10 +36,11 @@ import org.slf4j.Logger;
|
|||
import org.slf4j.LoggerFactory;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.core.env.Environment;
|
||||
import org.springframework.http.*;
|
||||
import org.springframework.http.client.SimpleClientHttpRequestFactory;
|
||||
import org.springframework.http.HttpHeaders;
|
||||
import org.springframework.http.HttpStatus;
|
||||
import org.springframework.http.MediaType;
|
||||
import org.springframework.http.ResponseEntity;
|
||||
import org.springframework.stereotype.Component;
|
||||
import org.springframework.web.client.RestTemplate;
|
||||
import org.springframework.web.multipart.MultipartFile;
|
||||
import org.w3c.dom.Document;
|
||||
import org.w3c.dom.Element;
|
||||
|
@ -54,6 +57,8 @@ import javax.xml.transform.dom.DOMSource;
|
|||
import javax.xml.transform.stream.StreamResult;
|
||||
import javax.xml.xpath.*;
|
||||
import java.io.*;
|
||||
import java.net.URI;
|
||||
import java.net.URISyntaxException;
|
||||
import java.nio.file.Files;
|
||||
import java.util.*;
|
||||
import java.util.stream.Collectors;
|
||||
|
@ -64,20 +69,20 @@ public class DatasetProfileManager {
|
|||
private static final Logger logger = LoggerFactory.getLogger(DatasetProfileManager.class);
|
||||
private static final List<String> cache = new ArrayList<>();
|
||||
|
||||
private ApiContext apiContext;
|
||||
private DatabaseRepository databaseRepository;
|
||||
private Environment environment;
|
||||
private ConfigLoader configLoader;
|
||||
|
||||
private final ApiContext apiContext;
|
||||
private final DatabaseRepository databaseRepository;
|
||||
private final Environment environment;
|
||||
private final ConfigLoader configLoader;
|
||||
private final MetricsManager metricsManager;
|
||||
|
||||
private final RemoteFetcher remoteFetcher;
|
||||
@Autowired
|
||||
public DatasetProfileManager(ApiContext apiContext, Environment environment, ConfigLoader configLoader, MetricsManager metricsManager) {
|
||||
public DatasetProfileManager(ApiContext apiContext, Environment environment, ConfigLoader configLoader, MetricsManager metricsManager, RemoteFetcher remoteFetcher) {
|
||||
this.apiContext = apiContext;
|
||||
this.databaseRepository = apiContext.getOperationsContext().getDatabaseRepository();
|
||||
this.environment = environment;
|
||||
this.configLoader = configLoader;
|
||||
this.metricsManager = metricsManager;
|
||||
this.remoteFetcher = remoteFetcher;
|
||||
}
|
||||
|
||||
@Transactional
|
||||
|
@ -129,6 +134,21 @@ public class DatasetProfileManager {
|
|||
return datasetProfiles;
|
||||
}
|
||||
|
||||
public List<DatasetProfileWithPrefillingPropertyModel> getAllWithPrefilling(DatasetProfileTableRequestItem tableRequestItem) {
|
||||
List<DatasetProfileWithPrefillingPropertyModel> datasetProfiles = new ArrayList<>();
|
||||
if (!tableRequestItem.getCriteria().getIds().isEmpty()) {
|
||||
tableRequestItem.getCriteria().getIds().forEach(id -> {
|
||||
DatasetProfile datasetProfile = this.getDatasetProfile(id.toString());
|
||||
DatasetProfileWithPrefillingPropertyModel profileModel = new DatasetProfileWithPrefillingPropertyModel();
|
||||
profileModel.setId(id);
|
||||
profileModel.setLabel(datasetProfile.getLabel());
|
||||
profileModel.setEnablePrefilling(datasetProfile.isEnablePrefilling());
|
||||
datasetProfiles.add(profileModel);
|
||||
});
|
||||
}
|
||||
return datasetProfiles;
|
||||
}
|
||||
|
||||
public eu.eudat.models.data.entities.xmlmodels.datasetprofiledefinition.Field queryForField(String xml, String fieldId) throws XPathExpressionException {
|
||||
eu.eudat.models.data.entities.xmlmodels.datasetprofiledefinition.Field field = new Field();
|
||||
Document document = XmlBuilder.fromXml(xml);
|
||||
|
@ -141,8 +161,8 @@ public class DatasetProfileManager {
|
|||
return field;
|
||||
}
|
||||
|
||||
public static List<ExternalAutocompleteFieldModel> getAutocomplete(AutoCompleteData data, String like) {
|
||||
List<ExternalAutocompleteFieldModel> result = new LinkedList<>();
|
||||
public List<ExternalAutocompleteFieldModel> getAutocomplete(AutoCompleteData data, String like) {
|
||||
/*List<ExternalAutocompleteFieldModel> result = new LinkedList<>();
|
||||
SimpleClientHttpRequestFactory simpleFactory = new SimpleClientHttpRequestFactory();
|
||||
|
||||
RestTemplate restTemplate = new RestTemplate(simpleFactory);
|
||||
|
@ -205,8 +225,72 @@ public class DatasetProfileManager {
|
|||
}
|
||||
|
||||
return result.stream().sorted(Comparator.comparing(ExternalAutocompleteFieldModel::getLabel)).collect(Collectors.toList());
|
||||
|
||||
//return result;
|
||||
*/
|
||||
List<ExternalAutocompleteFieldModel> result = new LinkedList<>();
|
||||
ExternalUrlCriteria urlCriteria = new ExternalUrlCriteria();
|
||||
GeneralUrls genericUrls = new GeneralUrls();
|
||||
int ordinal = 1;
|
||||
List<Map<String, String>> rawResults = new ArrayList<>();
|
||||
genericUrls.setFetchMode(FetchStrategy.FIRST);
|
||||
urlCriteria.setLike(like);
|
||||
for (AutoCompleteData.AutoCompleteSingleData singleData : data.getAutoCompleteSingleDataList()) {
|
||||
UrlConfiguration urlConfiguration = new UrlConfiguration();
|
||||
try {
|
||||
URI uri;
|
||||
if (singleData.getUrl().contains("?")) {
|
||||
uri = new URI(singleData.getUrl().substring(0, singleData.getUrl().lastIndexOf("?")));
|
||||
} else {
|
||||
uri = new URI(singleData.getUrl());
|
||||
}
|
||||
String source = singleData.getAutoCompleteOptions().getSource();
|
||||
source = source != null && !source.isEmpty() ? source : uri.getHost();
|
||||
String uriString = singleData.getAutoCompleteOptions().getUri();
|
||||
uriString = uriString != null && !uriString.isEmpty() ? uriString : "uri";
|
||||
String parsedUrl = singleData.getUrl();
|
||||
parsedUrl = parsedUrl.replace("%20", " ");
|
||||
parsedUrl = parsedUrl.replace("%22", "\"");
|
||||
while (parsedUrl.contains("&")) {
|
||||
parsedUrl = parsedUrl.replace("&", "&");
|
||||
}
|
||||
urlConfiguration.setUrl(parsedUrl);
|
||||
urlConfiguration.setOrdinal(ordinal);
|
||||
urlConfiguration.setType("External");
|
||||
urlConfiguration.setContentType(MediaType.APPLICATION_JSON_VALUE);
|
||||
urlConfiguration.setFirstpage("1");
|
||||
urlConfiguration.setRequestType(singleData.getMethod() != null ? singleData.getMethod() : "GET");
|
||||
DataUrlConfiguration dataUrlConfiguration = new DataUrlConfiguration();
|
||||
dataUrlConfiguration.setPath(singleData.getOptionsRoot());
|
||||
DataFieldsUrlConfiguration fieldsUrlConfiguration = new DataFieldsUrlConfiguration();
|
||||
fieldsUrlConfiguration.setId(singleData.getAutoCompleteOptions().getValue());
|
||||
fieldsUrlConfiguration.setName(singleData.getAutoCompleteOptions().getLabel());
|
||||
fieldsUrlConfiguration.setSource(singleData.getAutoCompleteOptions().getSource().isEmpty()? null : singleData.getAutoCompleteOptions().getSource());
|
||||
fieldsUrlConfiguration.setUri(uriString);
|
||||
dataUrlConfiguration.setFieldsUrlConfiguration(fieldsUrlConfiguration);
|
||||
urlConfiguration.setKey(source);
|
||||
urlConfiguration.setLabel(source);
|
||||
urlConfiguration.setData(dataUrlConfiguration);
|
||||
if (singleData.getHasAuth()) {
|
||||
AuthenticationConfiguration authenticationConfiguration = new AuthenticationConfiguration();
|
||||
authenticationConfiguration.setAuthUrl(singleData.getAuth().getUrl());
|
||||
authenticationConfiguration.setAuthMethod(singleData.getAuth().getMethod());
|
||||
authenticationConfiguration.setAuthTokenPath(singleData.getAuth().getPath());
|
||||
authenticationConfiguration.setAuthRequestBody(singleData.getAuth().getBody());
|
||||
authenticationConfiguration.setType(singleData.getAuth().getType());
|
||||
urlConfiguration.setAuth(authenticationConfiguration);
|
||||
}
|
||||
genericUrls.getUrls().add(urlConfiguration);
|
||||
List<Map<String, String>> singleResults = this.remoteFetcher.getExternalGeneric(urlCriteria, genericUrls);
|
||||
if (!singleResults.isEmpty() && !singleResults.get(0).containsKey("source") && !singleData.getAutoCompleteOptions().getSource().isEmpty()) {
|
||||
singleResults.forEach(singleResult -> singleResult.put("source", singleData.getAutoCompleteOptions().getSource()));
|
||||
}
|
||||
rawResults.addAll(singleResults);
|
||||
genericUrls.getUrls().clear();
|
||||
} catch (URISyntaxException e) {
|
||||
logger.error(e.getMessage(), e);
|
||||
}
|
||||
}
|
||||
rawResults.forEach(item -> result.add(new ExternalAutocompleteFieldModel(parseItem(item.get("pid")), parseItem(item.get("name")), parseItem(item.get("source")), parseItem(item.get("uri")))));
|
||||
return result;
|
||||
}
|
||||
|
||||
private static String parseItem(Object item) {
|
||||
|
|
|
@ -140,6 +140,7 @@ public class GrantManager {
|
|||
|
||||
grants.add(grant);
|
||||
}
|
||||
grants = grants.stream().filter(grant -> grant.getLabel() != null).collect(Collectors.toList());
|
||||
grants.sort(Comparator.comparing(Grant::getLabel));
|
||||
grants = grants.stream().filter(listHelper.distinctByKey(Grant::getLabel)).collect(Collectors.toList());
|
||||
return grants;
|
||||
|
|
|
@ -27,11 +27,13 @@ public class PrefillingManager {
|
|||
private final ObjectMapper objectMapper;
|
||||
private final DatasetManager datasetManager;
|
||||
private final LicenseManager licenseManager;
|
||||
private final PrefillingMapper prefillingMapper;
|
||||
|
||||
@Autowired
|
||||
public PrefillingManager(ApiContext apiContext, ConfigLoader configLoader, DatasetManager datasetManager, LicenseManager licenseManager) {
|
||||
public PrefillingManager(ApiContext apiContext, ConfigLoader configLoader, DatasetManager datasetManager, LicenseManager licenseManager, PrefillingMapper prefillingMapper) {
|
||||
this.apiContext = apiContext;
|
||||
this.configLoader = configLoader;
|
||||
this.prefillingMapper = prefillingMapper;
|
||||
this.objectMapper = new ObjectMapper().configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
|
||||
this.datasetManager = datasetManager;
|
||||
this.licenseManager = licenseManager;
|
||||
|
@ -62,14 +64,14 @@ public class PrefillingManager {
|
|||
PrefillingGet prefillingGet = prefillingConfig.getPrefillingGet();
|
||||
Map<String, Object> prefillingEntity = getSingle(prefillingGet.getUrl(), prefillId);
|
||||
DescriptionTemplate descriptionTemplate = apiContext.getOperationsContext().getDatabaseRepository().getDatasetProfileDao().find(profileId);
|
||||
return PrefillingMapper.mapPrefilledEntityToDatasetWizard(prefillingEntity, prefillingGet, prefillingConfig.getType(), descriptionTemplate, datasetManager, licenseManager);
|
||||
return prefillingMapper.mapPrefilledEntityToDatasetWizard(prefillingEntity, prefillingGet, prefillingConfig.getType(), descriptionTemplate, datasetManager, licenseManager);
|
||||
}
|
||||
|
||||
public DatasetWizardModel getPrefilledDatasetUsingData(Map<String, Object> data, String configId, UUID profileId) throws Exception {
|
||||
PrefillingConfig prefillingConfig = configLoader.getExternalUrls().getPrefillings().get(configId);
|
||||
PrefillingGet prefillingGet = prefillingConfig.getPrefillingGet();
|
||||
DescriptionTemplate descriptionTemplate = apiContext.getOperationsContext().getDatabaseRepository().getDatasetProfileDao().find(profileId);
|
||||
return PrefillingMapper.mapPrefilledEntityToDatasetWizard(data, prefillingGet, prefillingConfig.getType(), descriptionTemplate, datasetManager, licenseManager);
|
||||
return prefillingMapper.mapPrefilledEntityToDatasetWizard(data, prefillingGet, prefillingConfig.getType(), descriptionTemplate, datasetManager, licenseManager);
|
||||
}
|
||||
|
||||
private Map<String, Object> getSingle(String url, String id) {
|
||||
|
|
|
@ -27,6 +27,8 @@ import eu.eudat.models.data.license.LicenseModel;
|
|||
import org.json.JSONObject;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
import java.lang.reflect.InvocationTargetException;
|
||||
import java.lang.reflect.Method;
|
||||
|
@ -35,11 +37,18 @@ import java.time.format.DateTimeFormatter;
|
|||
import java.util.*;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
@Component
|
||||
public class PrefillingMapper {
|
||||
private static final Logger logger = LoggerFactory.getLogger(PrefillingMapper.class);
|
||||
private static final ObjectMapper mapper = new ObjectMapper().configure(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY, true);
|
||||
private final DatasetProfileManager datasetProfileManager;
|
||||
|
||||
public static DatasetWizardModel mapPrefilledEntityToDatasetWizard(Map<String, Object> prefilledEntity, PrefillingGet prefillingGet, String type,
|
||||
@Autowired
|
||||
public PrefillingMapper(DatasetProfileManager datasetProfileManager) {
|
||||
this.datasetProfileManager = datasetProfileManager;
|
||||
}
|
||||
|
||||
public DatasetWizardModel mapPrefilledEntityToDatasetWizard(Map<String, Object> prefilledEntity, PrefillingGet prefillingGet, String type,
|
||||
DescriptionTemplate profile, DatasetManager datasetManager, LicenseManager licenseManager) throws Exception {
|
||||
DatasetWizardModel datasetWizardModel = new DatasetWizardModel();
|
||||
datasetWizardModel.setProfile(new DatasetProfileOverviewModel().fromDataModel(profile));
|
||||
|
@ -77,7 +86,7 @@ public class PrefillingMapper {
|
|||
return datasetWizardModel;
|
||||
}
|
||||
|
||||
private static void setValue(PrefillingMapping prefillingMapping, String value, DatasetWizardModel datasetWizardModel, JsonNode parentNode, Map<String, Object> properties, String type, LicenseManager licenseManager) throws InvocationTargetException, IllegalAccessException, JsonProcessingException {
|
||||
private void setValue(PrefillingMapping prefillingMapping, String value, DatasetWizardModel datasetWizardModel, JsonNode parentNode, Map<String, Object> properties, String type, LicenseManager licenseManager) throws InvocationTargetException, IllegalAccessException, JsonProcessingException {
|
||||
String trimRegex = prefillingMapping.getTrimRegex() != null ? prefillingMapping.getTrimRegex() : "";
|
||||
if (!value.startsWith("\"") && !value.startsWith("[") && !value.equals("null")) {
|
||||
value = "\"" + value + "\"";
|
||||
|
@ -216,7 +225,7 @@ public class PrefillingMapper {
|
|||
}
|
||||
}
|
||||
|
||||
private static Object parseComboBoxValues(JsonNode node, List<String> parsedValues) throws JsonProcessingException {
|
||||
private Object parseComboBoxValues(JsonNode node, List<String> parsedValues) throws JsonProcessingException {
|
||||
List<Object> normalizedValues = new ArrayList<>();
|
||||
boolean isMultiSelect;
|
||||
String type = node.isArray() ? node.get(0).get("data").get("type").asText() : node.get("data").get("type").asText();
|
||||
|
@ -227,7 +236,7 @@ public class PrefillingMapper {
|
|||
for (String format : parsedValues) {
|
||||
List<ExternalAutocompleteFieldModel> result = new ArrayList<>();
|
||||
try {
|
||||
result = DatasetProfileManager.getAutocomplete(autoCompleteData, format);
|
||||
result = datasetProfileManager.getAutocomplete(autoCompleteData, format);
|
||||
}
|
||||
catch (Exception e) {
|
||||
logger.error(e.getMessage(), e);
|
||||
|
|
|
@ -0,0 +1,23 @@
|
|||
package eu.eudat.logic.proxy.config;
|
||||
|
||||
public enum AuthType {
|
||||
;
|
||||
private final String name;
|
||||
|
||||
AuthType(String name) {
|
||||
this.name = name;
|
||||
}
|
||||
|
||||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
public static AuthType fromName(String name) {
|
||||
for (AuthType authType : AuthType.values()) {
|
||||
if (authType.getName().equals(name)) {
|
||||
return authType;
|
||||
}
|
||||
}
|
||||
throw new IllegalArgumentException("AuthType [" + name + "] is not supported");
|
||||
}
|
||||
}
|
|
@ -0,0 +1,57 @@
|
|||
package eu.eudat.logic.proxy.config;
|
||||
|
||||
import javax.xml.bind.annotation.XmlElement;
|
||||
|
||||
public class AuthenticationConfiguration {
|
||||
|
||||
private String authUrl;
|
||||
private String authMethod = "GET";
|
||||
private String authTokenPath;
|
||||
private String authRequestBody;
|
||||
private String type;
|
||||
|
||||
public String getAuthUrl() {
|
||||
return authUrl;
|
||||
}
|
||||
|
||||
@XmlElement(name = "authUrl")
|
||||
public void setAuthUrl(String authUrl) {
|
||||
this.authUrl = authUrl;
|
||||
}
|
||||
|
||||
public String getAuthMethod() {
|
||||
return authMethod;
|
||||
}
|
||||
|
||||
@XmlElement(name = "authUrlMethod")
|
||||
public void setAuthMethod(String authMethod) {
|
||||
this.authMethod = authMethod;
|
||||
}
|
||||
|
||||
public String getAuthTokenPath() {
|
||||
return authTokenPath;
|
||||
}
|
||||
|
||||
@XmlElement(name = "authTokenJpath")
|
||||
public void setAuthTokenPath(String authTokenPath) {
|
||||
this.authTokenPath = authTokenPath;
|
||||
}
|
||||
|
||||
public String getAuthRequestBody() {
|
||||
return authRequestBody;
|
||||
}
|
||||
|
||||
@XmlElement(name = "authUrlBody")
|
||||
public void setAuthRequestBody(String authRequestBody) {
|
||||
this.authRequestBody = authRequestBody;
|
||||
}
|
||||
|
||||
public String getType() {
|
||||
return type;
|
||||
}
|
||||
|
||||
@XmlElement(name = "authType")
|
||||
public void setType(String type) {
|
||||
this.type = type;
|
||||
}
|
||||
}
|
|
@ -21,6 +21,7 @@ public class UrlConfiguration {
|
|||
private String requestType = "GET";
|
||||
private String requestBody = "";
|
||||
private String filterType = "remote";
|
||||
private AuthenticationConfiguration auth;
|
||||
|
||||
private List<QueryConfig> queries;
|
||||
|
||||
|
@ -143,4 +144,13 @@ public class UrlConfiguration {
|
|||
public void setQueries(List<QueryConfig> queries) {
|
||||
this.queries = queries;
|
||||
}
|
||||
|
||||
public AuthenticationConfiguration getAuth() {
|
||||
return auth;
|
||||
}
|
||||
|
||||
@XmlElement(name="authentication")
|
||||
public void setAuth(AuthenticationConfiguration auth) {
|
||||
this.auth = auth;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -0,0 +1,31 @@
|
|||
package eu.eudat.logic.proxy.config.entities;
|
||||
|
||||
import eu.eudat.logic.proxy.config.FetchStrategy;
|
||||
import eu.eudat.logic.proxy.config.UrlConfiguration;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
public class GeneralUrls extends GenericUrls{
|
||||
|
||||
List<UrlConfiguration> urls;
|
||||
FetchStrategy fetchMode;
|
||||
|
||||
public GeneralUrls() {
|
||||
this.urls = new ArrayList<>();
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<UrlConfiguration> getUrls() {
|
||||
return urls;
|
||||
}
|
||||
|
||||
@Override
|
||||
public FetchStrategy getFetchMode() {
|
||||
return fetchMode;
|
||||
}
|
||||
|
||||
public void setFetchMode(FetchStrategy fetchMode) {
|
||||
this.fetchMode = fetchMode;
|
||||
}
|
||||
}
|
|
@ -15,9 +15,14 @@ import org.slf4j.Logger;
|
|||
import org.slf4j.LoggerFactory;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.cache.annotation.Cacheable;
|
||||
import org.springframework.core.ParameterizedTypeReference;
|
||||
import org.springframework.http.*;
|
||||
import org.springframework.http.client.reactive.ReactorClientHttpConnector;
|
||||
import org.springframework.http.codec.json.Jackson2JsonDecoder;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.web.client.RestTemplate;
|
||||
import org.springframework.web.reactive.function.client.WebClient;
|
||||
import reactor.netty.http.client.HttpClient;
|
||||
|
||||
import javax.xml.bind.JAXBContext;
|
||||
import javax.xml.bind.Unmarshaller;
|
||||
|
@ -33,10 +38,16 @@ public class RemoteFetcher {
|
|||
private static final Logger logger = LoggerFactory.getLogger(RemoteFetcher.class);
|
||||
|
||||
private ConfigLoader configLoader;
|
||||
private final WebClient client;
|
||||
|
||||
@Autowired
|
||||
public RemoteFetcher(ConfigLoader configLoader) {
|
||||
this.configLoader = configLoader;
|
||||
this.client = WebClient.builder().codecs(clientCodecConfigurer -> {
|
||||
clientCodecConfigurer.defaultCodecs().jackson2JsonDecoder(new Jackson2JsonDecoder(new ObjectMapper(), MediaType.APPLICATION_JSON));
|
||||
clientCodecConfigurer.defaultCodecs().maxInMemorySize(2 * ((int) Math.pow(1024, 3))); //GK: Why here???
|
||||
}
|
||||
).clientConnector(new ReactorClientHttpConnector(HttpClient.create().followRedirect(true))).build();
|
||||
}
|
||||
|
||||
@Cacheable(value = "repositories", keyGenerator = "externalUrlsKeyGenerator")
|
||||
|
@ -198,7 +209,11 @@ public class RemoteFetcher {
|
|||
ifFunderQueryExist(urlConfiguration, externalUrlCriteria);
|
||||
if (urlConfiguration.getType() == null || urlConfiguration.getType().equals("External")) {
|
||||
try {
|
||||
results.addAll(getAllResultsFromUrl(urlConfiguration.getUrl(), fetchStrategy, urlConfiguration.getData(), urlConfiguration.getPaginationPath(), externalUrlCriteria, urlConfiguration.getLabel(), urlConfiguration.getKey(), urlConfiguration.getContentType(), urlConfiguration.getFirstpage(), urlConfiguration.getRequestBody(), urlConfiguration.getRequestType(), urlConfiguration.getFilterType(), urlConfiguration.getQueries()));
|
||||
String auth = null;
|
||||
if (urlConfiguration.getAuth() != null) {
|
||||
auth = this.getAuthentication(urlConfiguration.getAuth());
|
||||
}
|
||||
results.addAll(getAllResultsFromUrl(urlConfiguration.getUrl(), fetchStrategy, urlConfiguration.getData(), urlConfiguration.getPaginationPath(), externalUrlCriteria, urlConfiguration.getLabel(), urlConfiguration.getKey(), urlConfiguration.getContentType(), urlConfiguration.getFirstpage(), urlConfiguration.getRequestBody(), urlConfiguration.getRequestType(), urlConfiguration.getFilterType(), urlConfiguration.getQueries(), auth));
|
||||
} catch (Exception e) {
|
||||
logger.error(e.getLocalizedMessage(), e);
|
||||
}
|
||||
|
@ -217,6 +232,19 @@ public class RemoteFetcher {
|
|||
return results;
|
||||
}
|
||||
|
||||
private String getAuthentication(AuthenticationConfiguration authenticationConfiguration) {
|
||||
HttpMethod method = HttpMethod.valueOf(authenticationConfiguration.getAuthMethod());
|
||||
Map<String, Object> reponse = this.client.method(method).uri(authenticationConfiguration.getAuthUrl())
|
||||
.contentType(MediaType.APPLICATION_JSON)
|
||||
.bodyValue(this.parseBodyString(authenticationConfiguration.getAuthRequestBody()))
|
||||
.exchangeToMono(mono -> mono.bodyToMono(new ParameterizedTypeReference<Map<String, Object>>() {
|
||||
})).block();
|
||||
|
||||
|
||||
|
||||
return authenticationConfiguration.getType() + " " + reponse.get(authenticationConfiguration.getAuthTokenPath());
|
||||
}
|
||||
|
||||
private List<Map<String, Object>> getAllWithData(List<UrlConfiguration> urlConfigs, ExternalUrlCriteria externalUrlCriteria) {
|
||||
|
||||
List<Map<String, Object>> results = new LinkedList<>();
|
||||
|
@ -273,7 +301,7 @@ public class RemoteFetcher {
|
|||
protected String replaceCriteriaOnUrl(String path, ExternalUrlCriteria externalUrlCriteria, String firstPage, List<QueryConfig> queries) {
|
||||
String completedPath = path;
|
||||
if (externalUrlCriteria.getLike() != null) {
|
||||
if ((path.contains("openaire") || path.contains("orcid") || path.contains("ror")) && externalUrlCriteria.getLike().equals("")) {
|
||||
if ((path.contains("openaire") || path.contains("orcid") || path.contains("ror") || path.contains("fairsharing")) && externalUrlCriteria.getLike().equals("")) {
|
||||
completedPath = completedPath.replaceAll("\\{like}", "*");
|
||||
completedPath = completedPath.replaceAll("\\{query}", "*");
|
||||
} else {
|
||||
|
@ -329,13 +357,13 @@ public class RemoteFetcher {
|
|||
return completedPath;
|
||||
}
|
||||
|
||||
private List<Map<String, String>> getAllResultsFromUrl(String path, FetchStrategy fetchStrategy, final DataUrlConfiguration jsonDataPath, final String jsonPaginationPath, ExternalUrlCriteria externalUrlCriteria, String tag, String key, String contentType, String firstPage, String requestBody, String requestType, String filterType, List<QueryConfig> queries) throws Exception {
|
||||
private List<Map<String, String>> getAllResultsFromUrl(String path, FetchStrategy fetchStrategy, final DataUrlConfiguration jsonDataPath, final String jsonPaginationPath, ExternalUrlCriteria externalUrlCriteria, String tag, String key, String contentType, String firstPage, String requestBody, String requestType, String filterType, List<QueryConfig> queries, String auth) throws Exception {
|
||||
Set<Integer> pages = new HashSet<>();
|
||||
|
||||
String replacedPath = replaceCriteriaOnUrl(path, externalUrlCriteria, firstPage, queries);
|
||||
String replacedBody = replaceCriteriaOnUrl(requestBody, externalUrlCriteria, firstPage, queries);
|
||||
|
||||
Results results = getResultsFromUrl(replacedPath, jsonDataPath, jsonPaginationPath, contentType, replacedBody, requestType);
|
||||
Results results = getResultsFromUrl(replacedPath, jsonDataPath, jsonPaginationPath, contentType, replacedBody, requestType, auth);
|
||||
if(results != null) {
|
||||
if (filterType != null && filterType.equals("local") && (externalUrlCriteria.getLike() != null && !externalUrlCriteria.getLike().isEmpty())) {
|
||||
results.setResults(results.getResults().stream()
|
||||
|
@ -354,7 +382,7 @@ public class RemoteFetcher {
|
|||
throw new HugeResultSet("The submitted search query " + externalUrlCriteria.getLike() + " is about to return " + results.getPagination().get("count") + " results... Please submit a more detailed search query");
|
||||
|
||||
Optional<Results> optionalResults = pages.parallelStream()
|
||||
.map(page -> getResultsFromUrl(path + "&page=" + page, jsonDataPath, jsonPaginationPath, contentType, replacedBody, requestType))
|
||||
.map(page -> getResultsFromUrl(path + "&page=" + page, jsonDataPath, jsonPaginationPath, contentType, replacedBody, requestType, auth))
|
||||
.filter(Objects::nonNull)
|
||||
.reduce((result1, result2) -> {
|
||||
result1.getResults().addAll(result2.getResults());
|
||||
|
@ -387,7 +415,7 @@ public class RemoteFetcher {
|
|||
JsonNode jsonBody = new ObjectMapper().readTree(replacedBody);
|
||||
entity = new HttpEntity<>(jsonBody, headers);
|
||||
|
||||
response = restTemplate.exchange(replacedPath, HttpMethod.resolve(requestType), entity, String.class);
|
||||
response = restTemplate.exchange(replacedPath, HttpMethod.valueOf(requestType), entity, String.class);
|
||||
if (response.getStatusCode() == HttpStatus.OK) {
|
||||
if (response.getHeaders().get("Content-Type").get(0).contains("json")) {
|
||||
DocumentContext jsonContext = JsonPath.parse(response.getBody());
|
||||
|
@ -403,12 +431,12 @@ public class RemoteFetcher {
|
|||
}
|
||||
|
||||
|
||||
protected Results getResultsFromUrl(String urlString, DataUrlConfiguration jsonDataPath, String jsonPaginationPath, String contentType, String requestBody, String requestType) {
|
||||
protected Results getResultsFromUrl(String urlString, DataUrlConfiguration jsonDataPath, String jsonPaginationPath, String contentType, String requestBody, String requestType, String auth) {
|
||||
|
||||
try {
|
||||
RestTemplate restTemplate = new RestTemplate();
|
||||
HttpHeaders headers = new HttpHeaders();
|
||||
HttpEntity<JsonNode> entity;
|
||||
//RestTemplate restTemplate = new RestTemplate(new SimpleClientHttpRequestFactory());
|
||||
//HttpHeaders headers = new HttpHeaders();
|
||||
//HttpEntity<JsonNode> entity;
|
||||
ResponseEntity<String> response;
|
||||
/*
|
||||
* URL url = new URL(urlString.replaceAll(" ", "%20"));
|
||||
|
@ -416,14 +444,27 @@ public class RemoteFetcher {
|
|||
* HttpURLConnection con = (HttpURLConnection) url.openConnection();
|
||||
* con.setRequestMethod("GET");
|
||||
*/
|
||||
if (contentType != null && !contentType.isEmpty()) {
|
||||
/* if (contentType != null && !contentType.isEmpty()) {
|
||||
headers.setAccept(Collections.singletonList(MediaType.valueOf(contentType)));
|
||||
headers.setContentType(MediaType.valueOf(contentType));
|
||||
}
|
||||
if (auth != null) {
|
||||
headers.set("Authorization", auth);
|
||||
}*/
|
||||
JsonNode jsonBody = new ObjectMapper().readTree(requestBody);
|
||||
entity = new HttpEntity<>(jsonBody, headers);
|
||||
// entity = new HttpEntity<>(jsonBody, headers);
|
||||
|
||||
response = restTemplate.exchange(urlString, HttpMethod.resolve(requestType), entity, String.class);
|
||||
|
||||
response = this.client.method(HttpMethod.valueOf(requestType)).uri(urlString).headers(httpHeaders -> {
|
||||
if (contentType != null && !contentType.isEmpty()) {
|
||||
httpHeaders.setAccept(Collections.singletonList(MediaType.valueOf(contentType)));
|
||||
httpHeaders.setContentType(MediaType.valueOf(contentType));
|
||||
}
|
||||
if (auth != null) {
|
||||
httpHeaders.set("Authorization", auth);
|
||||
}
|
||||
}).bodyValue(jsonBody).retrieve().toEntity(String.class).block();
|
||||
//response = restTemplate.exchange(urlString, HttpMethod.resolve(requestType), entity, String.class);
|
||||
if (response.getStatusCode() == HttpStatus.OK) { // success
|
||||
//do here all the parsing
|
||||
Results results = new Results();
|
||||
|
@ -431,7 +472,7 @@ public class RemoteFetcher {
|
|||
DocumentContext jsonContext = JsonPath.parse(response.getBody());
|
||||
|
||||
if (jsonDataPath.getFieldsUrlConfiguration().getPath() != null) {
|
||||
results = RemoteFetcherUtils.getFromJsonWithRecursiveFetching(jsonContext, jsonDataPath, this, requestBody, requestType);
|
||||
results = RemoteFetcherUtils.getFromJsonWithRecursiveFetching(jsonContext, jsonDataPath, this, requestBody, requestType, auth);
|
||||
} else if (jsonDataPath.getFieldsUrlConfiguration().getFirstName() != null) {
|
||||
results = RemoteFetcherUtils.getFromJsonWithFirstAndLastName(jsonContext, jsonDataPath);
|
||||
} else {
|
||||
|
@ -553,8 +594,18 @@ public class RemoteFetcher {
|
|||
return null;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
private String parseBodyString(String bodyString) {
|
||||
String finalBodyString = bodyString;
|
||||
if (bodyString.contains("{env:")) {
|
||||
int index = bodyString.indexOf("{env: ");
|
||||
while (index >= 0) {
|
||||
int endIndex = bodyString.indexOf("}", index + 6);
|
||||
String envName = bodyString.substring(index + 6, endIndex);
|
||||
finalBodyString = finalBodyString.replace("{env: " + envName + "}", System.getenv(envName));
|
||||
index = bodyString.indexOf("{env: ", index + 6);
|
||||
}
|
||||
}
|
||||
return finalBodyString;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -28,7 +28,7 @@ public class RemoteFetcherUtils {
|
|||
new HashMap<>(1, 1));
|
||||
}
|
||||
|
||||
public static Results getFromJsonWithRecursiveFetching(DocumentContext jsonContext, DataUrlConfiguration jsonDataPath, RemoteFetcher remoteFetcher, String requestBody, String requestType) {
|
||||
public static Results getFromJsonWithRecursiveFetching(DocumentContext jsonContext, DataUrlConfiguration jsonDataPath, RemoteFetcher remoteFetcher, String requestBody, String requestType, String auth) {
|
||||
Results results = new Results(parseData(jsonContext, jsonDataPath),
|
||||
new HashMap<>(1, 1));
|
||||
|
||||
|
@ -37,7 +37,7 @@ public class RemoteFetcherUtils {
|
|||
externalUrlCriteria.setPath(result.get("path"));
|
||||
externalUrlCriteria.setHost(result.get("host"));
|
||||
String replacedPath = remoteFetcher.replaceCriteriaOnUrl(jsonDataPath.getUrlConfiguration().getUrl(), externalUrlCriteria, jsonDataPath.getUrlConfiguration().getFirstpage(), jsonDataPath.getUrlConfiguration().getQueries());
|
||||
return remoteFetcher.getResultsFromUrl(replacedPath, jsonDataPath.getUrlConfiguration().getData(), jsonDataPath.getUrlConfiguration().getData().getPath(), jsonDataPath.getUrlConfiguration().getContentType(), requestBody, requestType);
|
||||
return remoteFetcher.getResultsFromUrl(replacedPath, jsonDataPath.getUrlConfiguration().getData(), jsonDataPath.getUrlConfiguration().getData().getPath(), jsonDataPath.getUrlConfiguration().getContentType(), requestBody, requestType, auth);
|
||||
}).filter(Objects::nonNull).map(results1 -> results1.getResults().get(0)).collect(Collectors.toList());
|
||||
return new Results(multiResults, new HashMap<>(1, 1));
|
||||
}
|
||||
|
@ -98,11 +98,25 @@ public class RemoteFetcherUtils {
|
|||
}
|
||||
} else {
|
||||
value = value.replace("'", "");
|
||||
if (value.contains(".")) {
|
||||
String[] parts = value.split("\\.");
|
||||
Map<String, Object> tempMap = stringObjectMap;
|
||||
for (int i = 0; i < parts.length; i++) {
|
||||
if (tempMap.containsKey(parts[i])) {
|
||||
if (i + 1 < parts.length) {
|
||||
tempMap = (Map<String, Object>) tempMap.get(parts[i]);
|
||||
} else {
|
||||
parsedData.get(parsedData.size() - 1).put(field.getName().equals("types") ? "tags" : value, normalizeValue(tempMap.get(parts[i]), (field.getName().equals("types") || field.getName().equals("uri"))));
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if (stringObjectMap.containsKey(value)) {
|
||||
parsedData.get(parsedData.size() - 1).put(field.getName().equals("types") ? "tags" : value, normalizeValue(stringObjectMap.get(value), (field.getName().equals("types") || field.getName().equals("uri"))));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
} catch (IllegalAccessException | InvocationTargetException e) {
|
||||
logger.error(e.getLocalizedMessage(), e);
|
||||
}
|
||||
|
@ -135,7 +149,8 @@ public class RemoteFetcherUtils {
|
|||
}
|
||||
}
|
||||
} else if (value instanceof Map) {
|
||||
return ((Map<String, String>)value).get("content");
|
||||
String key = ((Map<String, String>)value).containsKey("$") ? "$" : "content";
|
||||
return ((Map<String, String>)value).get(key);
|
||||
}
|
||||
return value != null ? value.toString() : null;
|
||||
}
|
||||
|
|
|
@ -24,6 +24,7 @@ import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
|
|||
import org.apache.poi.util.Units;
|
||||
import org.apache.poi.xwpf.usermodel.*;
|
||||
import org.apache.xmlbeans.XmlCursor;
|
||||
import org.apache.xmlbeans.XmlObject;
|
||||
import org.json.JSONArray;
|
||||
import org.json.JSONException;
|
||||
import org.jsoup.Jsoup;
|
||||
|
@ -1019,32 +1020,15 @@ public class WordBuilder {
|
|||
int descrParPos = -1;
|
||||
XWPFParagraph descrPar = null;
|
||||
for(XWPFParagraph p: document.getParagraphs()){
|
||||
List<XWPFRun> runs = p.getRuns();
|
||||
if(runs != null){
|
||||
for(XWPFRun r : runs){
|
||||
String text = r.getText(0);
|
||||
if(text != null){
|
||||
if(text.contains("{ARGOS.DMP.TITLE}")) {
|
||||
text = text.replace("{ARGOS.DMP.TITLE}", dmpEntity.getLabel());
|
||||
r.setText(text, 0);
|
||||
} else if(text.contains("{ARGOS.DMP.VERSION}")) {
|
||||
text = text.replace("{ARGOS.DMP.VERSION}", "Version " + dmpEntity.getVersion());
|
||||
r.setText(text, 0);
|
||||
} else if(datasetEntity != null && text.contains("{ARGOS.DATASET.TITLE}")) {
|
||||
text = text.replace("{ARGOS.DATASET.TITLE}", datasetEntity.getLabel());
|
||||
r.setText(text, 0);
|
||||
// } else if(text.equals("Description") && ((!isDataset && (dmpEntity == null || dmpEntity.getDescription() != null)) || (isDataset && (datasetEntity == null || datasetEntity.getDescription() == null)))) {
|
||||
// r.setText("", 0);
|
||||
} else if((dmpEntity != null && text.contains("{ARGOS.DMP.DESCRIPTION}") && !isDataset) || (datasetEntity != null && text.contains("{ARGOS.DATASET.DESCRIPTION}") && isDataset)) {
|
||||
descrParPos = parPos;
|
||||
descrPar = p;
|
||||
if(dmpEntity != null && !isDataset) {
|
||||
text = text.replace("{ARGOS.DMP.DESCRIPTION}", "");
|
||||
} else if(datasetEntity != null && isDataset) {
|
||||
text = text.replace("{ARGOS.DATASET.DESCRIPTION}", "");
|
||||
|
||||
if( dmpEntity != null) {
|
||||
this.replaceTextSegment(p, "'{ARGOS.DMP.TITLE}'", dmpEntity.getLabel());
|
||||
this.replaceTextSegment(p, "'{ARGOS.DMP.VERSION}'", "Version " + dmpEntity.getVersion());
|
||||
}
|
||||
r.setText(text, 0);
|
||||
} else if(text.equals("{ARGOS.DMP.RESEARCHERS}")) {
|
||||
if( datasetEntity != null) {
|
||||
this.replaceTextSegment(p, "'{ARGOS.DATASET.TITLE}'", datasetEntity.getLabel());
|
||||
}
|
||||
|
||||
String researchersNames = "";
|
||||
Set<Researcher> researchers = dmpEntity.getResearchers();
|
||||
int i = 0;
|
||||
|
@ -1052,27 +1036,28 @@ public class WordBuilder {
|
|||
i++;
|
||||
researchersNames += researcher.getLabel() + (i < researchers.size() ? ", " : "");
|
||||
}
|
||||
text = text.replace("{ARGOS.DMP.RESEARCHERS}", researchersNames);
|
||||
r.setText(text, 0);
|
||||
r.setFontSize(17);
|
||||
} else if(text.equals("{ARGOS.DMP.ORGANIZATIONS}")) {
|
||||
this.replaceTextSegment(p, "'{ARGOS.DMP.RESEARCHERS}'", researchersNames, 15);
|
||||
|
||||
String organisationsNames = "";
|
||||
Set<Organisation> organisations = dmpEntity.getOrganisations();
|
||||
int i = 0;
|
||||
i = 0;
|
||||
for(Organisation organisation : organisations){
|
||||
i++;
|
||||
organisationsNames += organisation.getLabel() + (i < organisations.size() ? ", " : "");
|
||||
}
|
||||
text = text.replace("{ARGOS.DMP.ORGANIZATIONS}", organisationsNames);
|
||||
r.setText(text, 0);
|
||||
r.setFontSize(17);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
parPos++;
|
||||
}
|
||||
this.replaceTextSegment(p, "'{ARGOS.DMP.ORGANIZATIONS}'", organisationsNames, 15);
|
||||
|
||||
if(this.textSegmentExists(p,"'{ARGOS.DMP.DESCRIPTION}'")) {
|
||||
descrParPos = parPos;
|
||||
descrPar = p;
|
||||
this.replaceTextSegment(p, "'{ARGOS.DMP.DESCRIPTION}'", "");
|
||||
}
|
||||
if(this.textSegmentExists(p,"'{ARGOS.DATASET.DESCRIPTION}'")) {
|
||||
descrParPos = parPos;
|
||||
descrPar = p;
|
||||
this.replaceTextSegment(p, "'{ARGOS.DATASET.DESCRIPTION}'", "");
|
||||
}
|
||||
}
|
||||
if((descrParPos != -1) && (dmpEntity!=null) && (dmpEntity.getDescription() != null) && !isDataset) {
|
||||
XmlCursor cursor = descrPar.getCTP().newCursor();
|
||||
cursor.toNextSibling();
|
||||
|
@ -1096,7 +1081,7 @@ public class WordBuilder {
|
|||
XWPFParagraph p = it.next().getCell(0).getParagraphs().get(0);
|
||||
XWPFRun run = p.createRun();
|
||||
run.setText(dmpEntity.getGrant().getFunder().getLabel());
|
||||
run.setFontSize(17);
|
||||
run.setFontSize(15);
|
||||
p.setAlignment(ParagraphAlignment.CENTER);
|
||||
}
|
||||
it = tbl.getRows().iterator();
|
||||
|
@ -1111,7 +1096,7 @@ public class WordBuilder {
|
|||
text += parts.length > 1 ? "/ No "+parts[parts.length - 1] : "";
|
||||
}
|
||||
run.setText(text);
|
||||
run.setFontSize(17);
|
||||
run.setFontSize(15);
|
||||
p.setAlignment(ParagraphAlignment.CENTER);
|
||||
}
|
||||
}
|
||||
|
@ -1119,43 +1104,165 @@ public class WordBuilder {
|
|||
public void fillFooter(DMP dmpEntity, Dataset datasetEntity, XWPFDocument document, boolean isDataset) {
|
||||
document.getFooterList().forEach(xwpfFooter -> {
|
||||
List<XWPFRun> runs = xwpfFooter.getParagraphs().get(0).getRuns();
|
||||
if(runs != null){
|
||||
for(XWPFRun r : runs){
|
||||
String text = r.getText(0);
|
||||
if(text != null){
|
||||
if(text.contains("{ARGOS.DMP.TITLE}")){
|
||||
text = text.replace("{ARGOS.DMP.TITLE}", dmpEntity.getLabel());
|
||||
r.setText(text, 0);
|
||||
for(XWPFParagraph p : xwpfFooter.getParagraphs()){
|
||||
if(p != null){
|
||||
if( dmpEntity != null) {
|
||||
this.replaceTextSegment(p, "'{ARGOS.DMP.TITLE}'", dmpEntity.getLabel());
|
||||
}
|
||||
if(text.contains("{ARGOS.DATASET.TITLE}") && datasetEntity != null){
|
||||
text = text.replace("{ARGOS.DATASET.TITLE}", datasetEntity.getLabel());
|
||||
r.setText(text, 0);
|
||||
if( datasetEntity != null) {
|
||||
this.replaceTextSegment(p, "'{ARGOS.DATASET.TITLE}'", datasetEntity.getLabel());
|
||||
}
|
||||
if(text.contains("{ARGOS.DMP.LICENSE}")){
|
||||
Map<String, String> license = null;
|
||||
try {
|
||||
Map<String, String> license = ((Map<String, String>) mapper.readValue(dmpEntity.getExtraProperties(), Map.class).get("license"));
|
||||
text = text.replace("{ARGOS.DMP.LICENSE}", license.get("pid"));
|
||||
license = ((Map<String, String>) mapper.readValue(dmpEntity.getExtraProperties(), Map.class).get("license"));
|
||||
if (license != null && license.get("pid") != null) {
|
||||
this.replaceTextSegment(p, "'{ARGOS.DMP.LICENSE}'", license.get("pid"));
|
||||
} else {
|
||||
this.replaceTextSegment(p, "'{ARGOS.DMP.LICENSE}'", "License: -");
|
||||
}
|
||||
catch (JsonProcessingException | NullPointerException e){
|
||||
text = text.replace("{ARGOS.DMP.LICENSE}", "License: -");
|
||||
} catch (JsonProcessingException e) {
|
||||
this.replaceTextSegment(p, "'{ARGOS.DMP.LICENSE}'", "License: -");
|
||||
}
|
||||
r.setText(text, 0);
|
||||
if(dmpEntity.getDois() != null && !dmpEntity.getDois().isEmpty()) {
|
||||
this.replaceTextSegment(p, "'{ARGOS.DMP.DOI}'", dmpEntity.getDois().iterator().next().getDoi());
|
||||
} else {
|
||||
this.replaceTextSegment(p, "'{ARGOS.DMP.DOI}'", "-");
|
||||
}
|
||||
if(text.contains("{ARGOS.DMP.DOI}")){
|
||||
if(dmpEntity.getDois() != null && !dmpEntity.getDois().isEmpty())
|
||||
text = text.replace("{ARGOS.DMP.DOI}", dmpEntity.getDois().iterator().next().getDoi());
|
||||
else
|
||||
text = text.replace("{ARGOS.DMP.DOI}", "-");
|
||||
r.setText(text, 0);
|
||||
}
|
||||
if(text.contains("{ARGOS.DMP.LAST_MODIFIED}")){
|
||||
DateFormat formatter = new SimpleDateFormat("dd/MM/yyyy");
|
||||
text = text.replace("{ARGOS.DMP.LAST_MODIFIED}", formatter.format(dmpEntity.getModified()));
|
||||
r.setText(text, 0);
|
||||
}
|
||||
}
|
||||
this.replaceTextSegment(p, "'{ARGOS.DMP.LAST_MODIFIED}'", formatter.format(dmpEntity.getModified()));
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
private boolean textSegmentExists(XWPFParagraph paragraph, String textToFind) {
|
||||
TextSegment foundTextSegment = null;
|
||||
PositionInParagraph startPos = new PositionInParagraph(0, 0, 0);
|
||||
while((foundTextSegment = this.searchText(paragraph, textToFind, startPos)) != null) {
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
private void replaceTextSegment(XWPFParagraph paragraph, String textToFind, String replacement) {
|
||||
this.replaceTextSegment(paragraph, textToFind, replacement, null);
|
||||
}
|
||||
|
||||
private void replaceTextSegment(XWPFParagraph paragraph, String textToFind, String replacement, Integer fontSize) {
|
||||
TextSegment foundTextSegment = null;
|
||||
PositionInParagraph startPos = new PositionInParagraph(0, 0, 0);
|
||||
while((foundTextSegment = this.searchText(paragraph, textToFind, startPos)) != null) { // search all text segments having text to find
|
||||
|
||||
System.out.println(foundTextSegment.getBeginRun()+":"+foundTextSegment.getBeginText()+":"+foundTextSegment.getBeginChar());
|
||||
System.out.println(foundTextSegment.getEndRun()+":"+foundTextSegment.getEndText()+":"+foundTextSegment.getEndChar());
|
||||
|
||||
// maybe there is text before textToFind in begin run
|
||||
XWPFRun beginRun = paragraph.getRuns().get(foundTextSegment.getBeginRun());
|
||||
String textInBeginRun = beginRun.getText(foundTextSegment.getBeginText());
|
||||
String textBefore = textInBeginRun.substring(0, foundTextSegment.getBeginChar()); // we only need the text before
|
||||
|
||||
// maybe there is text after textToFind in end run
|
||||
XWPFRun endRun = paragraph.getRuns().get(foundTextSegment.getEndRun());
|
||||
String textInEndRun = endRun.getText(foundTextSegment.getEndText());
|
||||
String textAfter = textInEndRun.substring(foundTextSegment.getEndChar() + 1); // we only need the text after
|
||||
|
||||
if (foundTextSegment.getEndRun() == foundTextSegment.getBeginRun()) {
|
||||
textInBeginRun = textBefore + replacement + textAfter; // if we have only one run, we need the text before, then the replacement, then the text after in that run
|
||||
} else {
|
||||
textInBeginRun = textBefore + replacement; // else we need the text before followed by the replacement in begin run
|
||||
endRun.setText(textAfter, foundTextSegment.getEndText()); // and the text after in end run
|
||||
}
|
||||
|
||||
beginRun.setText(textInBeginRun, foundTextSegment.getBeginText());
|
||||
if (fontSize != null) {
|
||||
beginRun.setFontSize(fontSize);
|
||||
}
|
||||
// runs between begin run and end run needs to be removed
|
||||
for (int runBetween = foundTextSegment.getEndRun() - 1; runBetween > foundTextSegment.getBeginRun(); runBetween--) {
|
||||
paragraph.removeRun(runBetween); // remove not needed runs
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* this methods parse the paragraph and search for the string searched.
|
||||
* If it finds the string, it will return true and the position of the String
|
||||
* will be saved in the parameter startPos.
|
||||
*
|
||||
* @param searched
|
||||
* @param startPos
|
||||
*/
|
||||
private TextSegment searchText(XWPFParagraph paragraph, String searched, PositionInParagraph startPos) {
|
||||
int startRun = startPos.getRun(),
|
||||
startText = startPos.getText(),
|
||||
startChar = startPos.getChar();
|
||||
int beginRunPos = 0, candCharPos = 0;
|
||||
boolean newList = false;
|
||||
|
||||
//CTR[] rArray = paragraph.getRArray(); //This does not contain all runs. It lacks hyperlink runs for ex.
|
||||
java.util.List<XWPFRun> runs = paragraph.getRuns();
|
||||
|
||||
int beginTextPos = 0, beginCharPos = 0; //must be outside the for loop
|
||||
|
||||
//for (int runPos = startRun; runPos < rArray.length; runPos++) {
|
||||
for (int runPos = startRun; runPos < runs.size(); runPos++) {
|
||||
//int beginTextPos = 0, beginCharPos = 0, textPos = 0, charPos; //int beginTextPos = 0, beginCharPos = 0 must be outside the for loop
|
||||
int textPos = 0, charPos;
|
||||
//CTR ctRun = rArray[runPos];
|
||||
CTR ctRun = runs.get(runPos).getCTR();
|
||||
XmlCursor c = ctRun.newCursor();
|
||||
c.selectPath("./*");
|
||||
try {
|
||||
while (c.toNextSelection()) {
|
||||
XmlObject o = c.getObject();
|
||||
if (o instanceof CTText) {
|
||||
if (textPos >= startText) {
|
||||
String candidate = ((CTText) o).getStringValue();
|
||||
if (runPos == startRun) {
|
||||
charPos = startChar;
|
||||
} else {
|
||||
charPos = 0;
|
||||
}
|
||||
|
||||
for (; charPos < candidate.length(); charPos++) {
|
||||
if ((candidate.charAt(charPos) == searched.charAt(0)) && (candCharPos == 0)) {
|
||||
beginTextPos = textPos;
|
||||
beginCharPos = charPos;
|
||||
beginRunPos = runPos;
|
||||
newList = true;
|
||||
}
|
||||
if (candidate.charAt(charPos) == searched.charAt(candCharPos)) {
|
||||
if (candCharPos + 1 < searched.length()) {
|
||||
candCharPos++;
|
||||
} else if (newList) {
|
||||
TextSegment segment = new TextSegment();
|
||||
segment.setBeginRun(beginRunPos);
|
||||
segment.setBeginText(beginTextPos);
|
||||
segment.setBeginChar(beginCharPos);
|
||||
segment.setEndRun(runPos);
|
||||
segment.setEndText(textPos);
|
||||
segment.setEndChar(charPos);
|
||||
return segment;
|
||||
}
|
||||
} else {
|
||||
candCharPos = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
textPos++;
|
||||
} else if (o instanceof CTProofErr) {
|
||||
c.removeXml();
|
||||
} else if (o instanceof CTRPr) {
|
||||
//do nothing
|
||||
} else {
|
||||
candCharPos = 0;
|
||||
}
|
||||
}
|
||||
} finally {
|
||||
c.dispose();
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -37,6 +37,7 @@ public class ExportXmlBuilderDatasetProfile {
|
|||
pages.setAttribute("description", datasetProfile.getDescription());
|
||||
pages.setAttribute("language", datasetProfile.getLanguage());
|
||||
pages.setAttribute("type", datasetProfile.getType());
|
||||
pages.setAttribute("enablePrefilling", String.valueOf(datasetProfile.isEnablePrefilling()));
|
||||
String xml = XmlBuilder.generateXml(xmlDoc);
|
||||
writer.write(xml);
|
||||
writer.close();
|
||||
|
|
|
@ -15,6 +15,7 @@ public class DatasetProfile {
|
|||
private String description;
|
||||
private String language;
|
||||
private String type;
|
||||
private boolean enablePrefilling;
|
||||
|
||||
private List<Page> page;
|
||||
|
||||
|
@ -54,6 +55,15 @@ public class DatasetProfile {
|
|||
this.type = type;
|
||||
}
|
||||
|
||||
@XmlAttribute(name = "enablePrefilling")
|
||||
public boolean isEnablePrefilling() {
|
||||
return enablePrefilling;
|
||||
}
|
||||
|
||||
public void setEnablePrefilling(boolean enablePrefilling) {
|
||||
this.enablePrefilling = enablePrefilling;
|
||||
}
|
||||
|
||||
public eu.eudat.models.data.admin.composite.DatasetProfile toAdminCompositeModel(String label){
|
||||
eu.eudat.models.data.admin.composite.DatasetProfile newDatasetEntityProfile = new eu.eudat.models.data.admin.composite.DatasetProfile();
|
||||
newDatasetEntityProfile.setLabel(label);
|
||||
|
@ -61,6 +71,7 @@ public class DatasetProfile {
|
|||
newDatasetEntityProfile.setDescription(description);
|
||||
newDatasetEntityProfile.setLanguage(language);
|
||||
newDatasetEntityProfile.setType(type);
|
||||
newDatasetEntityProfile.setEnablePrefilling(enablePrefilling);
|
||||
List<eu.eudat.models.data.admin.components.datasetprofile.Page> pagesDatasetEntity = new LinkedList<>();
|
||||
List<eu.eudat.models.data.admin.components.datasetprofile.Section> sectionDatasetEntity = new LinkedList<>();
|
||||
for (Page xmlPage: page) {
|
||||
|
|
|
@ -12,8 +12,8 @@ public class DescriptionTemplate {
|
|||
private String id;
|
||||
private String descriptionTemplateId;
|
||||
private String label;
|
||||
private int minMultiplicity;
|
||||
private int maxMultiplicity;
|
||||
private Integer minMultiplicity;
|
||||
private Integer maxMultiplicity;
|
||||
|
||||
@XmlAttribute(name = "id")
|
||||
public String getId() {
|
||||
|
@ -43,20 +43,20 @@ public class DescriptionTemplate {
|
|||
}
|
||||
|
||||
@XmlAttribute(name = "minMultiplicity")
|
||||
public int getMinMultiplicity() {
|
||||
public Integer getMinMultiplicity() {
|
||||
return minMultiplicity;
|
||||
}
|
||||
|
||||
public void setMinMultiplicity(int minMultiplicity) {
|
||||
public void setMinMultiplicity(Integer minMultiplicity) {
|
||||
this.minMultiplicity = minMultiplicity;
|
||||
}
|
||||
|
||||
@XmlAttribute(name = "maxMultiplicity")
|
||||
public int getMaxMultiplicity() {
|
||||
public Integer getMaxMultiplicity() {
|
||||
return maxMultiplicity;
|
||||
}
|
||||
|
||||
public void setMaxMultiplicity(int maxMultiplicity) {
|
||||
public void setMaxMultiplicity(Integer maxMultiplicity) {
|
||||
this.maxMultiplicity = maxMultiplicity;
|
||||
}
|
||||
|
||||
|
|
|
@ -14,6 +14,7 @@ public class DatasetProfile {
|
|||
private String label;
|
||||
private String description;
|
||||
private String type;
|
||||
private boolean enablePrefilling;
|
||||
private List<Page> pages;
|
||||
private List<Section> sections;
|
||||
private Short status;
|
||||
|
@ -43,6 +44,13 @@ public class DatasetProfile {
|
|||
this.type = type;
|
||||
}
|
||||
|
||||
public boolean isEnablePrefilling() {
|
||||
return enablePrefilling;
|
||||
}
|
||||
public void setEnablePrefilling(boolean enablePrefilling) {
|
||||
this.enablePrefilling = enablePrefilling;
|
||||
}
|
||||
|
||||
public List<Page> getPages() {
|
||||
return pages;
|
||||
}
|
||||
|
@ -80,6 +88,7 @@ public class DatasetProfile {
|
|||
}
|
||||
|
||||
public void buildProfile(eu.eudat.models.data.entities.xmlmodels.datasetprofiledefinition.ViewStyleModel viewStyle) {
|
||||
this.enablePrefilling = viewStyle.isEnablePrefilling();
|
||||
this.sections = new ModelBuilder().fromViewStyleDefinition(viewStyle.getSections(), Section.class);
|
||||
this.pages = new ModelBuilder().fromViewStyleDefinition(viewStyle.getPages(), Page.class);
|
||||
}
|
||||
|
@ -89,6 +98,7 @@ public class DatasetProfile {
|
|||
shortProfile.setLabel(this.label);
|
||||
shortProfile.setDescription(this.description);
|
||||
shortProfile.setType(this.type);
|
||||
shortProfile.setEnablePrefilling(this.enablePrefilling);
|
||||
List<Section> shortSection = new LinkedList<>();
|
||||
for (Section toshortSection : this.getSections()) {
|
||||
shortSection.add(toshortSection.toShort());
|
||||
|
|
|
@ -10,11 +10,62 @@ import java.util.List;
|
|||
import java.util.Map;
|
||||
|
||||
public class AutoCompleteData extends ComboBoxData<AutoCompleteData> {
|
||||
|
||||
public static class AuthAutoCompleteData {
|
||||
private String url;
|
||||
private String method;
|
||||
private String body;
|
||||
private String path;
|
||||
private String type;
|
||||
|
||||
public String getUrl() {
|
||||
return url;
|
||||
}
|
||||
|
||||
public void setUrl(String url) {
|
||||
this.url = url;
|
||||
}
|
||||
|
||||
public String getMethod() {
|
||||
return method;
|
||||
}
|
||||
|
||||
public void setMethod(String method) {
|
||||
this.method = method;
|
||||
}
|
||||
|
||||
public String getBody() {
|
||||
return body;
|
||||
}
|
||||
|
||||
public void setBody(String body) {
|
||||
this.body = body;
|
||||
}
|
||||
|
||||
public String getPath() {
|
||||
return path;
|
||||
}
|
||||
|
||||
public void setPath(String path) {
|
||||
this.path = path;
|
||||
}
|
||||
|
||||
public String getType() {
|
||||
return type;
|
||||
}
|
||||
|
||||
public void setType(String type) {
|
||||
this.type = type;
|
||||
}
|
||||
}
|
||||
public static class AutoCompleteSingleData {
|
||||
private int autocompleteType;
|
||||
private String url;
|
||||
private ComboBoxData.Option autoCompleteOptions;
|
||||
private String optionsRoot;
|
||||
private Boolean hasAuth;
|
||||
private AuthAutoCompleteData auth;
|
||||
private String method;
|
||||
|
||||
public int getAutocompleteType() {
|
||||
return autocompleteType;
|
||||
|
@ -38,12 +89,36 @@ public class AutoCompleteData extends ComboBoxData<AutoCompleteData> {
|
|||
this.url = url;
|
||||
}
|
||||
|
||||
public Boolean getHasAuth() {
|
||||
return hasAuth;
|
||||
}
|
||||
|
||||
public void setHasAuth(Boolean hasAuth) {
|
||||
this.hasAuth = hasAuth;
|
||||
}
|
||||
|
||||
public AuthAutoCompleteData getAuth() {
|
||||
return auth;
|
||||
}
|
||||
|
||||
public void setAuth(AuthAutoCompleteData auth) {
|
||||
this.auth = auth;
|
||||
}
|
||||
|
||||
public ComboBoxData.Option getAutoCompleteOptions() {
|
||||
return autoCompleteOptions;
|
||||
}
|
||||
public void setAutoCompleteOptions(ComboBoxData.Option autoCompleteOptions) {
|
||||
this.autoCompleteOptions = autoCompleteOptions;
|
||||
}
|
||||
|
||||
public String getMethod() {
|
||||
return method;
|
||||
}
|
||||
|
||||
public void setMethod(String method) {
|
||||
this.method = method;
|
||||
}
|
||||
}
|
||||
|
||||
private Boolean multiAutoComplete;
|
||||
|
@ -70,11 +145,22 @@ public class AutoCompleteData extends ComboBoxData<AutoCompleteData> {
|
|||
parent.setAttribute("url", singleData.url);
|
||||
parent.setAttribute("optionsRoot", singleData.optionsRoot);
|
||||
parent.setAttribute("autoCompleteType", Integer.toString(singleData.autocompleteType));
|
||||
parent.setAttribute("hasAuth", Boolean.toString(singleData.hasAuth));
|
||||
parent.setAttribute("method", singleData.method);
|
||||
Element element = doc.createElement("option");
|
||||
element.setAttribute("label", singleData.autoCompleteOptions.getLabel());
|
||||
element.setAttribute("value", singleData.autoCompleteOptions.getValue());
|
||||
element.setAttribute("source", singleData.autoCompleteOptions.getSource());
|
||||
parent.appendChild(element);
|
||||
if (singleData.hasAuth) {
|
||||
Element authElement = doc.createElement("auth");
|
||||
authElement.setAttribute("url", singleData.auth.url);
|
||||
authElement.setAttribute("method", singleData.auth.method);
|
||||
authElement.setAttribute("body", singleData.auth.body);
|
||||
authElement.setAttribute("path", singleData.auth.path);
|
||||
authElement.setAttribute("type", singleData.auth.type);
|
||||
parent.appendChild(authElement);
|
||||
}
|
||||
root.appendChild(parent);
|
||||
}
|
||||
return root;
|
||||
|
@ -108,6 +194,8 @@ public class AutoCompleteData extends ComboBoxData<AutoCompleteData> {
|
|||
} else {
|
||||
singleData.autocompleteType = AutocompleteType.fromValue(Integer.parseInt(item.getAttribute("autoCompleteType"))).getValue();
|
||||
}
|
||||
singleData.hasAuth = Boolean.parseBoolean(item.getAttribute("hasAuth"));
|
||||
singleData.method = item.hasAttribute("method") ? item.getAttribute("method") : "GET";
|
||||
Element optionElement = (Element) item.getElementsByTagName("option").item(0);
|
||||
if (optionElement != null) {
|
||||
singleData.autoCompleteOptions = new Option();
|
||||
|
@ -116,6 +204,17 @@ public class AutoCompleteData extends ComboBoxData<AutoCompleteData> {
|
|||
singleData.autoCompleteOptions.setSource(optionElement.getAttribute("source"));
|
||||
singleData.autoCompleteOptions.setUri(optionElement.getAttribute("uri"));
|
||||
}
|
||||
if (singleData.hasAuth) {
|
||||
Element authElement = (Element) item.getElementsByTagName("auth").item(0);
|
||||
if (authElement != null) {
|
||||
singleData.auth = new AuthAutoCompleteData();
|
||||
singleData.auth.setUrl(authElement.getAttribute("url"));
|
||||
singleData.auth.setMethod(authElement.getAttribute("method"));
|
||||
singleData.auth.setBody(authElement.getAttribute("body"));
|
||||
singleData.auth.setPath(authElement.getAttribute("path"));
|
||||
singleData.auth.setType(authElement.getAttribute("type"));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -141,6 +240,8 @@ public class AutoCompleteData extends ComboBoxData<AutoCompleteData> {
|
|||
this.autoCompleteSingleDataList.get(i).autoCompleteOptions = new Option();
|
||||
this.autoCompleteSingleDataList.get(i).url = (String) singleData.get("url");
|
||||
this.autoCompleteSingleDataList.get(i).optionsRoot = (String) singleData.get("optionsRoot");
|
||||
this.autoCompleteSingleDataList.get(i).hasAuth = (Boolean) singleData.get("hasAuth");
|
||||
this.autoCompleteSingleDataList.get(i).method = singleData.containsKey("method") ? (String) singleData.get("method") : "GET";
|
||||
|
||||
if (singleData.get("autoCompleteType") == null) {
|
||||
this.autoCompleteSingleDataList.get(i).autocompleteType = AutocompleteType.UNCACHED.getValue();
|
||||
|
@ -154,6 +255,17 @@ public class AutoCompleteData extends ComboBoxData<AutoCompleteData> {
|
|||
this.autoCompleteSingleDataList.get(i).autoCompleteOptions.setSource(options.get("source"));
|
||||
this.autoCompleteSingleDataList.get(i).autoCompleteOptions.setUri(options.get("uri"));
|
||||
}
|
||||
if (this.autoCompleteSingleDataList.get(i).hasAuth) {
|
||||
Map<String, String> auth = (Map<String, String>) singleData.get("auth");
|
||||
if (auth != null) {
|
||||
this.autoCompleteSingleDataList.get(i).auth = new AuthAutoCompleteData();
|
||||
this.autoCompleteSingleDataList.get(i).auth.setUrl(auth.get("url"));
|
||||
this.autoCompleteSingleDataList.get(i).auth.setType(auth.get("type"));
|
||||
this.autoCompleteSingleDataList.get(i).auth.setPath(auth.get("path"));
|
||||
this.autoCompleteSingleDataList.get(i).auth.setBody(auth.get("body"));
|
||||
this.autoCompleteSingleDataList.get(i).auth.setMethod(auth.get("method"));
|
||||
}
|
||||
}
|
||||
i++;
|
||||
}
|
||||
}
|
||||
|
@ -190,6 +302,8 @@ public class AutoCompleteData extends ComboBoxData<AutoCompleteData> {
|
|||
node.appendChild(autoCompleteSingles.item(i));
|
||||
node.setAttribute("url", item.getAttribute("url"));
|
||||
node.setAttribute("optionsRoot", item.getAttribute("optionsRoot"));
|
||||
node.setAttribute("hasAuth", item.getAttribute("hasAuth"));
|
||||
node.setAttribute("method", item.hasAttribute("method") ? item.getAttribute("method") : "GET");
|
||||
autoCompletes.add(singleToMap(node));
|
||||
}
|
||||
}
|
||||
|
@ -214,6 +328,16 @@ public class AutoCompleteData extends ComboBoxData<AutoCompleteData> {
|
|||
return dataMap;
|
||||
}
|
||||
|
||||
private Map<String, Object> authToMap(Element item){
|
||||
HashMap dataMap = new HashMap();
|
||||
dataMap.put("url", item != null ? item.getAttribute("url") : "");
|
||||
dataMap.put("method", item != null ? item.getAttribute("method") : "");
|
||||
dataMap.put("body", item != null ? item.getAttribute("body") : "");
|
||||
dataMap.put("path", item != null ? item.getAttribute("path") : "");
|
||||
dataMap.put("type", item != null ? item.getAttribute("type") : "");
|
||||
return dataMap;
|
||||
}
|
||||
|
||||
private Map<String, Object> singleToMap(Element item) {
|
||||
Map<String, Object> dataMap = new HashMap<>();
|
||||
if (!item.getAttribute("autoCompleteType").isEmpty()) {
|
||||
|
@ -221,8 +345,12 @@ public class AutoCompleteData extends ComboBoxData<AutoCompleteData> {
|
|||
}
|
||||
dataMap.put("optionsRoot", item != null ? item.getAttribute("optionsRoot") : "");
|
||||
dataMap.put("url", item != null ? item.getAttribute("url") : "");
|
||||
dataMap.put("hasAuth", item != null ? item.getAttribute("hasAuth") : "false");
|
||||
Element optionElement = (Element) item.getElementsByTagName("option").item(0);
|
||||
dataMap.put("autoCompleteOptions", item != null ? optionToMap(optionElement) : null);
|
||||
Element authElement = (Element) item.getElementsByTagName("auth").item(0);
|
||||
dataMap.put("auth", item != null ? authToMap(authElement) : null);
|
||||
dataMap.put("method", item != null && item.hasAttribute("method") ? item.getAttribute("method") : "GET");
|
||||
return dataMap;
|
||||
}
|
||||
|
||||
|
|
|
@ -0,0 +1,30 @@
|
|||
package eu.eudat.models.data.datasetprofile;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
public class DatasetProfileWithPrefillingPropertyModel {
|
||||
private UUID id;
|
||||
private String label;
|
||||
private boolean enablePrefilling;
|
||||
|
||||
public UUID getId() {
|
||||
return id;
|
||||
}
|
||||
public void setId(UUID id) {
|
||||
this.id = id;
|
||||
}
|
||||
|
||||
public String getLabel() {
|
||||
return label;
|
||||
}
|
||||
public void setLabel(String label) {
|
||||
this.label = label;
|
||||
}
|
||||
|
||||
public boolean isEnablePrefilling() {
|
||||
return enablePrefilling;
|
||||
}
|
||||
public void setEnablePrefilling(boolean enablePrefilling) {
|
||||
this.enablePrefilling = enablePrefilling;
|
||||
}
|
||||
}
|
|
@ -16,7 +16,7 @@ public class AssociatedProfileImportModels {
|
|||
public UUID getId() { return id; }
|
||||
public void setId(UUID id) { this.id = id; }
|
||||
|
||||
@XmlElement(name = "profilelabel")
|
||||
@XmlElement(name = "profileLabel")
|
||||
public String getLabel() { return label; }
|
||||
public void setLabel(String label) { this.label = label; }
|
||||
|
||||
|
|
|
@ -23,7 +23,7 @@ public class DataManagementPlanEditorModel implements DataModel<DMP, DataManagem
|
|||
private UUID id;
|
||||
private String label;
|
||||
private UUID groupId;
|
||||
private Tuple<UUID, String> profile;
|
||||
private UUID profile;
|
||||
private int version;
|
||||
private int status;
|
||||
private boolean lockable;
|
||||
|
@ -53,10 +53,10 @@ public class DataManagementPlanEditorModel implements DataModel<DMP, DataManagem
|
|||
this.id = id;
|
||||
}
|
||||
|
||||
public Tuple<UUID, String> getProfile() {
|
||||
public UUID getProfile() {
|
||||
return profile;
|
||||
}
|
||||
public void setProfile(Tuple<UUID, String> profile) {
|
||||
public void setProfile(UUID profile) {
|
||||
this.profile = profile;
|
||||
}
|
||||
|
||||
|
@ -226,7 +226,7 @@ public class DataManagementPlanEditorModel implements DataModel<DMP, DataManagem
|
|||
@Override
|
||||
public DataManagementPlanEditorModel fromDataModel(DMP entity) {
|
||||
this.id = entity.getId();
|
||||
this.profile = entity.getProfile() != null ? new Tuple<UUID, String>(entity.getProfile().getId(), entity.getProfile().getLabel()) : null;
|
||||
this.profile = entity.getProfile() != null ? entity.getProfile().getId() : null;
|
||||
this.organisations = entity.getOrganisations().stream().map(item -> new Organisation().fromDataModel(item)).collect(Collectors.toList());
|
||||
this.researchers = entity.getResearchers().stream().map(item -> new Researcher().fromDataModel(item)).collect(Collectors.toList());
|
||||
this.version = entity.getVersion();
|
||||
|
@ -289,7 +289,7 @@ public class DataManagementPlanEditorModel implements DataModel<DMP, DataManagem
|
|||
DMP dataManagementPlanEntity = new DMP();
|
||||
if (this.profile != null) {
|
||||
DMPProfile dmpProfile = new DMPProfile();
|
||||
dmpProfile.setId(this.profile.getId());
|
||||
dmpProfile.setId(this.profile);
|
||||
dataManagementPlanEntity.setProfile(dmpProfile);
|
||||
}
|
||||
dataManagementPlanEntity.setId(this.id);
|
||||
|
@ -302,7 +302,7 @@ public class DataManagementPlanEditorModel implements DataModel<DMP, DataManagem
|
|||
if (this.grant != null) {
|
||||
if (this.grant.getExistGrant() != null && this.grant.getLabel() == null && this.grant.getDescription() == null)
|
||||
dataManagementPlanEntity.setGrant(this.grant.getExistGrant().toDataModel());
|
||||
else {
|
||||
else if (this.grant.getLabel() != null) {
|
||||
Grant grant = new Grant();
|
||||
grant.setId(UUID.randomUUID());
|
||||
grant.setAbbreviation("");
|
||||
|
@ -342,7 +342,7 @@ public class DataManagementPlanEditorModel implements DataModel<DMP, DataManagem
|
|||
if (this.project != null) {
|
||||
if (this.project.getExistProject() != null && this.project.getLabel() == null && this.project.getDescription() == null)
|
||||
dataManagementPlanEntity.setProject(this.project.getExistProject().toDataModel());
|
||||
else {
|
||||
else if (this.project.getLabel() != null) {
|
||||
Project project = new Project();
|
||||
project.setId(UUID.randomUUID());
|
||||
project.setAbbreviation("");
|
||||
|
|
|
@ -196,7 +196,7 @@ public class DataManagementPlanNewVersionModel implements DataModel<DMP, DataMan
|
|||
if (this.grant != null) {
|
||||
if (this.grant.getExistGrant() != null && this.grant.getLabel() == null && this.grant.getDescription() == null)
|
||||
entity.setGrant(this.grant.getExistGrant().toDataModel());
|
||||
else {
|
||||
else if (this.grant.getLabel() != null) {
|
||||
eu.eudat.data.entities.Grant grant = new eu.eudat.data.entities.Grant();
|
||||
grant.setId(UUID.randomUUID());
|
||||
grant.setAbbreviation("");
|
||||
|
@ -236,7 +236,7 @@ public class DataManagementPlanNewVersionModel implements DataModel<DMP, DataMan
|
|||
if (this.project != null) {
|
||||
if (this.project.getExistProject() != null && this.project.getLabel() == null && this.project.getDescription() == null)
|
||||
entity.setProject(this.project.getExistProject().toDataModel());
|
||||
else {
|
||||
else if (this.project.getLabel() != null) {
|
||||
Project project = new Project();
|
||||
project.setId(UUID.randomUUID());
|
||||
project.setAbbreviation("");
|
||||
|
|
|
@ -11,9 +11,18 @@ import java.util.LinkedList;
|
|||
import java.util.List;
|
||||
|
||||
public class ViewStyleModel implements XmlSerializable<ViewStyleModel> {
|
||||
private boolean enablePrefilling;
|
||||
private List<Section> sections;
|
||||
private List<Page> pages;
|
||||
|
||||
public boolean isEnablePrefilling() {
|
||||
return enablePrefilling;
|
||||
}
|
||||
|
||||
public void setEnablePrefilling(boolean enablePrefilling) {
|
||||
this.enablePrefilling = enablePrefilling;
|
||||
}
|
||||
|
||||
public List<Section> getSections() {
|
||||
return sections;
|
||||
}
|
||||
|
@ -33,6 +42,8 @@ public class ViewStyleModel implements XmlSerializable<ViewStyleModel> {
|
|||
@Override
|
||||
public Element toXml(Document doc) {
|
||||
Element root = doc.createElement("root");
|
||||
Element prefilling = doc.createElement("enablePrefilling");
|
||||
prefilling.setTextContent(String.valueOf(this.enablePrefilling));
|
||||
Element sections = doc.createElement("sections");
|
||||
Element pages = doc.createElement("pages");
|
||||
for (Section section : this.sections) {
|
||||
|
@ -44,6 +55,7 @@ public class ViewStyleModel implements XmlSerializable<ViewStyleModel> {
|
|||
pages.appendChild(page.toXml(doc));
|
||||
}
|
||||
|
||||
root.appendChild(prefilling);
|
||||
root.appendChild(pages);
|
||||
root.appendChild(sections);
|
||||
return root;
|
||||
|
@ -52,6 +64,12 @@ public class ViewStyleModel implements XmlSerializable<ViewStyleModel> {
|
|||
@Override
|
||||
public ViewStyleModel fromXml(Element element) {
|
||||
|
||||
this.enablePrefilling = true;
|
||||
Element prefilling = (Element) XmlBuilder.getNodeFromListByTagName(element.getChildNodes(), "enablePrefilling");
|
||||
if (prefilling != null) {
|
||||
this.enablePrefilling = Boolean.parseBoolean(prefilling.getChildNodes().item(0).getNodeValue());
|
||||
}
|
||||
|
||||
this.sections = new LinkedList();
|
||||
Element sections = (Element) XmlBuilder.getNodeFromListByTagName(element.getChildNodes(), "sections");
|
||||
if (sections != null) {
|
||||
|
|
|
@ -55,8 +55,8 @@ public class DescriptionTemplate implements XmlSerializable<DescriptionTemplate>
|
|||
rootElement.setAttribute("id", this.getId().toString());
|
||||
rootElement.setAttribute("descriptionTemplateId", this.getDescriptionTemplateId().toString());
|
||||
rootElement.setAttribute("label", this.label);
|
||||
rootElement.setAttribute("minMultiplicity", String.valueOf(this.minMultiplicity));
|
||||
rootElement.setAttribute("maxMultiplicity", String.valueOf(this.maxMultiplicity));
|
||||
if (this.minMultiplicity != null) rootElement.setAttribute("minMultiplicity", String.valueOf(this.minMultiplicity));
|
||||
if (this.maxMultiplicity != null) rootElement.setAttribute("maxMultiplicity", String.valueOf(this.maxMultiplicity));
|
||||
return rootElement;
|
||||
}
|
||||
|
||||
|
|
|
@ -13,6 +13,7 @@ public class DatasetProfile implements PropertiesModelBuilder {
|
|||
private String description;
|
||||
private String language;
|
||||
private String type;
|
||||
private boolean enablePrefilling;
|
||||
private List<Section> sections;
|
||||
private List<Rule> rules;
|
||||
private List<Page> pages;
|
||||
|
@ -42,6 +43,14 @@ public class DatasetProfile implements PropertiesModelBuilder {
|
|||
this.type = type;
|
||||
}
|
||||
|
||||
public boolean isEnablePrefilling() {
|
||||
return enablePrefilling;
|
||||
}
|
||||
|
||||
public void setEnablePrefilling(boolean enablePrefilling) {
|
||||
this.enablePrefilling = enablePrefilling;
|
||||
}
|
||||
|
||||
public List<Section> getSections() {
|
||||
return sections;
|
||||
}
|
||||
|
@ -76,6 +85,7 @@ public class DatasetProfile implements PropertiesModelBuilder {
|
|||
}
|
||||
|
||||
public void buildProfile(eu.eudat.models.data.entities.xmlmodels.datasetprofiledefinition.ViewStyleModel viewStyle) {
|
||||
this.enablePrefilling = viewStyle.isEnablePrefilling();
|
||||
this.sections = new ModelBuilder().fromViewStyleDefinition(viewStyle.getSections(), Section.class);
|
||||
this.pages = new ModelBuilder().fromViewStyleDefinition(viewStyle.getPages(), Page.class);
|
||||
this.rules = ModelBuilderCollector.collectRules(viewStyle.getSections());
|
||||
|
|
|
@ -52,6 +52,7 @@ public class DatasetRDAMapper {
|
|||
rda.setTitle(dataset.getLabel());
|
||||
rda.setDescription(dataset.getDescription());
|
||||
rda.setAdditionalProperty("template", dataset.getProfile().getId());
|
||||
rda.setAdditionalProperty("dmpSectionIndex", dataset.getDmpSectionIndex());
|
||||
try {
|
||||
JSONObject jObject = new JSONObject(dataset.getProperties());
|
||||
Map<String, Object> templateIdsToValues = jObject.toMap();
|
||||
|
@ -284,6 +285,12 @@ public class DatasetRDAMapper {
|
|||
eu.eudat.data.entities.Dataset entity = new eu.eudat.data.entities.Dataset();
|
||||
entity.setLabel(rda.getTitle());
|
||||
entity.setDescription(rda.getDescription());
|
||||
if (rda.getAdditionalProperties().get("dmpSectionIndex") != null) {
|
||||
entity.setDmpSectionIndex(Integer.parseInt(rda.getAdditionalProperties().get("dmpSectionIndex").toString()));
|
||||
} else {
|
||||
entity.setDmpSectionIndex(0);
|
||||
}
|
||||
|
||||
try {
|
||||
DescriptionTemplate profile = apiContext.getOperationsContext().getDatabaseRepository().getDatasetProfileDao().find(UUID.fromString(rda.getAdditionalProperties().get("template").toString()));
|
||||
entity.setProfile(profile);
|
||||
|
|
|
@ -1,8 +1,11 @@
|
|||
package eu.eudat.models.rda.mapper;
|
||||
|
||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||
import eu.eudat.data.entities.*;
|
||||
import eu.eudat.logic.managers.DataManagementProfileManager;
|
||||
import eu.eudat.logic.services.ApiContext;
|
||||
import eu.eudat.logic.utilities.helpers.StreamDistinctBy;
|
||||
import eu.eudat.models.data.dmp.AssociatedProfile;
|
||||
import eu.eudat.models.rda.Dmp;
|
||||
import eu.eudat.models.rda.DmpId;
|
||||
import net.minidev.json.JSONObject;
|
||||
|
@ -24,13 +27,13 @@ public class DmpRDAMapper {
|
|||
|
||||
private DatasetRDAMapper datasetRDAMapper;
|
||||
private ApiContext apiContext;
|
||||
|
||||
private DataManagementProfileManager dataManagementProfileManager;
|
||||
|
||||
@Autowired
|
||||
public DmpRDAMapper(DatasetRDAMapper datasetRDAMapper, ApiContext apiContext) throws IOException {
|
||||
public DmpRDAMapper(DatasetRDAMapper datasetRDAMapper, ApiContext apiContext, DataManagementProfileManager dataManagementProfileManager) throws IOException {
|
||||
this.datasetRDAMapper = datasetRDAMapper;
|
||||
this.apiContext = apiContext;
|
||||
|
||||
this.dataManagementProfileManager = dataManagementProfileManager;
|
||||
}
|
||||
|
||||
@Transactional
|
||||
|
@ -116,10 +119,15 @@ public class DmpRDAMapper {
|
|||
}
|
||||
// rda.getContributor().addAll(dmp.getUsers().stream().map(ContributorRDAMapper::toRDA).collect(Collectors.toList()));
|
||||
rda.setDataset(dmp.getDataset().stream().filter(dataset -> dataset.getStatus() != eu.eudat.elastic.entities.Dmp.DMPStatus.DELETED.getValue()).map(dataset -> datasetRDAMapper.toRDA(dataset, rda)).collect(Collectors.toList()));
|
||||
if (dmp.getProject() != null) {
|
||||
rda.setProject(Collections.singletonList(ProjectRDAMapper.toRDA(dmp.getProject(), dmp.getGrant())));
|
||||
}
|
||||
rda.setAdditionalProperty("templates", dmp.getAssociatedDmps().stream().map(datasetProfile -> datasetProfile.getId().toString()).toArray());
|
||||
|
||||
rda.setAdditionalProperty("templates", dmp.getAssociatedDmps().stream().map(item -> item.getDatasetprofile().getId().toString()).toArray());
|
||||
rda.setAdditionalProperty("blueprintId", dmp.getProfile().getId());
|
||||
rda.setAdditionalProperty("license", extraProperties.get("license"));
|
||||
rda.setAdditionalProperty("visible", extraProperties.get("visible"));
|
||||
rda.setAdditionalProperty("publicDate", extraProperties.get("publicDate"));
|
||||
rda.setAdditionalProperty("contact", extraProperties.get("contact"));
|
||||
rda.setAdditionalProperty("dmpProperties", dmp.getProperties());
|
||||
return rda;
|
||||
}
|
||||
|
||||
|
@ -138,26 +146,46 @@ public class DmpRDAMapper {
|
|||
entity.setDois(new HashSet<>());
|
||||
}
|
||||
}
|
||||
if (((List<String>) rda.getAdditionalProperties().get("templates")) != null && !((List<String>) rda.getAdditionalProperties().get("templates")).isEmpty() && entity.getId() != null) {
|
||||
entity.setAssociatedDmps(((List<String>) rda.getAdditionalProperties().get("templates")).stream().map(x -> this.getProfile(x, entity.getId())).filter(Objects::nonNull).collect(Collectors.toSet()));
|
||||
}
|
||||
if (entity.getAssociatedDmps() == null) {
|
||||
entity.setAssociatedDmps(new HashSet<>());
|
||||
}
|
||||
if (profiles != null && entity.getId() != null) {
|
||||
for (String profile : profiles) {
|
||||
entity.getAssociatedDmps().add(this.getProfile(profile, entity.getId()));
|
||||
|
||||
String blueprintId = (String) rda.getAdditionalProperties().get("blueprintId");
|
||||
DMPProfile blueprint = apiContext.getOperationsContext().getDatabaseRepository().getDmpProfileDao().find(UUID.fromString(blueprintId));
|
||||
entity.setProfile(blueprint);
|
||||
|
||||
if (((List<String>) rda.getAdditionalProperties().get("templates")) != null && !((List<String>) rda.getAdditionalProperties().get("templates")).isEmpty()) {
|
||||
List<DescriptionTemplate> descriptionTemplates = ((List<String>) rda.getAdditionalProperties().get("templates")).stream().map(this::getProfile).filter(Objects::nonNull).collect(Collectors.toList());
|
||||
Set<DMPDatasetProfile> dmpDatasetProfiles = new HashSet<>();
|
||||
for (DescriptionTemplate profile : descriptionTemplates) {
|
||||
DMPDatasetProfile dmpDatasetProfile = new DMPDatasetProfile();
|
||||
dmpDatasetProfile.setDmp(entity);
|
||||
dmpDatasetProfile.setDatasetprofile(profile);
|
||||
String indexes = this.dataManagementProfileManager.sectionIndexesForDescriptionTemplate(blueprint, profile.getId()).stream()
|
||||
.map(String::valueOf) // convert each int to a string
|
||||
.collect(Collectors.joining(","));
|
||||
dmpDatasetProfile.setData("{\"dmpSectionIndex\":[" + indexes + "]}");
|
||||
dmpDatasetProfiles.add(dmpDatasetProfile);
|
||||
}
|
||||
entity.setAssociatedDmps(dmpDatasetProfiles);
|
||||
}
|
||||
|
||||
// if (entity.getAssociatedDmps() == null) {
|
||||
// entity.setAssociatedDmps(new HashSet<>());
|
||||
// }
|
||||
// if (profiles != null && entity.getId() != null) {
|
||||
// for (String profile : profiles) {
|
||||
// entity.getAssociatedDmps().add(this.getProfile(profile, entity.getId()));
|
||||
// }
|
||||
// }
|
||||
if (rda.getContributor() != null && !rda.getContributor().isEmpty() && rda.getContributor().get(0).getContributorId() != null) {
|
||||
entity.setResearchers(rda.getContributor().stream().filter(r -> r.getContributorId() != null).map(ContributorRDAMapper::toEntity).filter(StreamDistinctBy.distinctByKey(Researcher::getReference)).collect(Collectors.toSet()));
|
||||
}
|
||||
entity.setCreated(rda.getCreated());
|
||||
entity.setModified(rda.getModified());
|
||||
entity.setDescription(rda.getDescription());
|
||||
DescriptionTemplate defaultProfile = ((DescriptionTemplate)entity.getAssociatedDmps().toArray()[0]);
|
||||
if(entity.getAssociatedDmps().size() > 0) {
|
||||
DescriptionTemplate defaultProfile = entity.getAssociatedDmps().stream().findFirst().get().getDatasetprofile();
|
||||
entity.setDataset(rda.getDataset().stream().map(rda1 -> datasetRDAMapper.toEntity(rda1, defaultProfile)).collect(Collectors.toSet()));
|
||||
if (rda.getProject().size() > 0) {
|
||||
}
|
||||
if (rda.getProject() != null && rda.getProject().size() > 0) {
|
||||
Map<String, Object> result = ProjectRDAMapper.toEntity(rda.getProject().get(0), apiContext);
|
||||
entity.setProject((Project) result.get("project"));
|
||||
result.entrySet().stream().filter(entry -> entry.getKey().startsWith("grant")).forEach(entry -> entity.setGrant((Grant) entry.getValue()));
|
||||
|
@ -165,16 +193,19 @@ public class DmpRDAMapper {
|
|||
|
||||
Map<String, Object> extraProperties = new HashMap<>();
|
||||
extraProperties.put("language", LanguageRDAMapper.mapRDAIsoToLanguageIso(rda.getLanguage()));
|
||||
|
||||
if (rda.getAdditionalProperties().get("license") != null) extraProperties.put("license", rda.getAdditionalProperties().get("license"));
|
||||
if (rda.getAdditionalProperties().get("visible") != null) extraProperties.put("visible", rda.getAdditionalProperties().get("visible"));
|
||||
if (rda.getAdditionalProperties().get("publicDate") != null) extraProperties.put("publicDate", rda.getAdditionalProperties().get("publicDate"));
|
||||
if (rda.getAdditionalProperties().get("contact") != null) extraProperties.put("contact", rda.getAdditionalProperties().get("contact"));
|
||||
entity.setExtraProperties(JSONObject.toJSONString(extraProperties));
|
||||
|
||||
if (rda.getAdditionalProperties().get("dmpProperties") != null) entity.setProperties(rda.getAdditionalProperties().get("dmpProperties").toString());
|
||||
|
||||
|
||||
return entity;
|
||||
}
|
||||
|
||||
private DMPDatasetProfile getProfile(String descriptionTemplateId, UUID dmpId) {
|
||||
return apiContext.getOperationsContext().getDatabaseRepository().getDmpDatasetProfileDao().asQueryable().where(((builder, root) -> builder.and(
|
||||
builder.equal(root.get("datasetprofile"), UUID.fromString(descriptionTemplateId)),
|
||||
builder.equal(root.get("dmp"), dmpId))
|
||||
)).getSingleOrDefault();
|
||||
private DescriptionTemplate getProfile(String id) {
|
||||
return apiContext.getOperationsContext().getDatabaseRepository().getDatasetProfileDao().asQueryable().where(((builder, root) -> builder.equal(root.get("id"), UUID.fromString(id)))).getSingleOrDefault();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -17,13 +17,13 @@ public class ProjectRDAMapper {
|
|||
public static Project toRDA(eu.eudat.data.entities.Project project, Grant grant) {
|
||||
Project rda = new Project();
|
||||
try {
|
||||
rda.setTitle(project.getLabel());
|
||||
rda.setDescription(project.getDescription());
|
||||
if (project.getStartdate() != null) {
|
||||
rda.setStart(project.getStartdate().toString());
|
||||
rda.setTitle(grant.getLabel());
|
||||
rda.setDescription(grant.getDescription());
|
||||
if (grant.getStartdate() != null) {
|
||||
rda.setStart(grant.getStartdate().toString());
|
||||
}
|
||||
if (project.getEnddate() != null) {
|
||||
rda.setEnd(project.getEnddate().toString());
|
||||
if (grant.getEnddate() != null) {
|
||||
rda.setEnd(grant.getEnddate().toString());
|
||||
}
|
||||
rda.setFunding(Collections.singletonList(FundingRDAMapper.toRDA(grant)));
|
||||
|
||||
|
|
Binary file not shown.
Binary file not shown.
|
@ -13,7 +13,7 @@ ADD COLUMN "Type" uuid;
|
|||
INSERT INTO public."DescriptionTemplateType" ("ID", "Name", "Status")
|
||||
VALUES ('709a8400-10ca-11ee-be56-0242ac120002', 'Dataset', 1);
|
||||
|
||||
UPDATE public."DescriptionTemplate" SET ("Type") = '709a8400-10ca-11ee-be56-0242ac120002';
|
||||
UPDATE public."DescriptionTemplate" SET "Type" = '709a8400-10ca-11ee-be56-0242ac120002';
|
||||
|
||||
ALTER TABLE public."DescriptionTemplate"
|
||||
ALTER COLUMN "Type" SET NOT NULL;
|
||||
|
|
|
@ -4,7 +4,7 @@ BEGIN
|
|||
PERFORM * FROM "DBVersion" WHERE version = this_version;
|
||||
IF FOUND THEN RETURN; END IF;
|
||||
|
||||
INSERT INTO public."DMPProfile" VALUES ('86635178-36a6-484f-9057-a934e4eeecd5', 'Dmp Default Blueprint', '<root><sections><section id="f94e50e0-cb97-4c65-8b88-e5db6badd41d" label="Main Info" description="A DMP in Argos consists of key information about research, such as purpose, objectives and researchers involved, but also about documentation of research datasets that highlight the steps followed and the means used across data management activities." ordinal="1" hasTemplates="false"><systemFields><systemField id="e62c3fa2-4cbe-41bf-a00e-ad722c7c7da1" type="0" label="Title of DMP" placeholder="Title of DMP" description="" required="true" ordinal="1"></systemField><systemField id="eed2871d-5201-401e-8453-87afbeac77e3" type="1" label="Description" placeholder="Fill with description" description="Briefly describe the context and purpose of the DMP" required="true" ordinal="2"></systemField><systemField id="41a0b1db-b186-467d-8edf-7d3b2456f95e" type="2" label="Researchers" placeholder="Select researchers" description="Add here the names of people that have produced, processed, analysed the data described in the DMP." required="false" ordinal="3"></systemField><systemField id="0f0afb55-a11b-41db-a4d0-67ebb74d8685" type="3" label="Organizations" placeholder="Select organization" description="Add here the names of the organizations contributing to the creation and revision of the DMPs" required="false" ordinal="4"></systemField><systemField id="db493026-3130-4730-9b93-da6b77d2eea4" type="4" label="Language" placeholder="Language" description="Select the language of your DMP" required="true" ordinal="5"></systemField><systemField id="22deb104-1c46-4ea8-8261-8fdc9500dca2" type="5" label="Contact" placeholder="Contact" description="" required="true" ordinal="6"></systemField></systemFields><descriptionTemplates></descriptionTemplates></section><section id="3c2608e5-9320-4d94-9ed7-1eab9500d84b" label="Funding" description="Add here information about the scope, funding, actors of your DMP and decide on access and re-use issues for the DMP output that you are creating." ordinal="2" hasTemplates="false"><systemFields><systemField id="527af8fe-27b0-4715-9e1e-35a2fce834a1" type="6" label="Funding organizations" placeholder="Funder" description="Select a funder of your research or add new" required="true" ordinal="1"></systemField><systemField id="4d12904e-2501-4d57-8d2b-1ac795c297e7" type="7" label="Grants" placeholder="Grant" description="Find the grant of your research or add new" required="true" ordinal="2"></systemField><systemField id="82f235c8-98fc-48d1-8245-36ab08f01036" type="8" label="Project" placeholder="Project" description="Projects in Argos are perceived as distinct activities falling under a grant or common activities under different grants in collaborative schemas, eg open call for contributions. Please complete it for the grant associated to your organization if your project falls under this category. In all other cases, please leave blank and it will be autocompleted." required="false" ordinal="3"></systemField></systemFields><descriptionTemplates></descriptionTemplates></section><section id="2a77e1f6-9989-4aeb-acd9-48e911a92abd" label="License" description="Each DMP can contain specific license informatation over how much open and available it is, that way you can determine who can see your dataset and for how long that data will be private." ordinal="3" hasTemplates="false"><systemFields><systemField id="75c31705-6731-45dd-9853-75c5d0627439" type="9" label="License" placeholder="License" description="Assign a license to your DMP by selecting the most appropriate from the list." required="false" ordinal="1"></systemField><systemField id="990df932-eae6-44ca-85da-5378b010f439" type="10" label="Access Rights" placeholder="Access Rights" description="Choose how the DMP is displayed after is published on Zenodo. By choosing Open Access, the DMP will be open on Zenodo after the Publication Date. By choosing Restricted Access, the DMP will be restricted after the publication is made." required="false" ordinal="2"></systemField></systemFields><descriptionTemplates></descriptionTemplates></section><section id="0db7845b-0e7c-41df-8d91-cbca97995fd5" label="Dataset Info" description="Datasets are documented following pre-defined templates which set the content of dataset descriptions. In Argos, a DMP can contain as many dataset descriptions as the datasets it documents." ordinal="4" hasTemplates="true"><systemFields></systemFields><descriptionTemplates></descriptionTemplates></section></sections></root>',1, now(),now());
|
||||
INSERT INTO public."DMPProfile" VALUES ('86635178-36a6-484f-9057-a934e4eeecd5', 'Dmp Default Blueprint', '<root><sections><section id="f94e50e0-cb97-4c65-8b88-e5db6badd41d" label="Main Info" description="" ordinal="1" hasTemplates="false"><systemFields><systemField id="e62c3fa2-4cbe-41bf-a00e-ad722c7c7da1" type="0" label="Title of DMP" placeholder="Title of DMP" description="" required="true" ordinal="1"></systemField><systemField id="eed2871d-5201-401e-8453-87afbeac77e3" type="1" label="Description" placeholder="Fill with description" description="Briefly describe the context and purpose of the DMP" required="true" ordinal="2"></systemField><systemField id="41a0b1db-b186-467d-8edf-7d3b2456f95e" type="2" label="Researchers" placeholder="Select researchers" description="Add here the names of people that have produced, processed, analysed the data described in the DMP." required="false" ordinal="3"></systemField><systemField id="0f0afb55-a11b-41db-a4d0-67ebb74d8685" type="3" label="Organizations" placeholder="Select organization" description="Add here the names of the organizations contributing to the creation and revision of the DMPs" required="false" ordinal="4"></systemField><systemField id="db493026-3130-4730-9b93-da6b77d2eea4" type="4" label="Language" placeholder="Language" description="Select the language of your DMP" required="true" ordinal="5"></systemField><systemField id="22deb104-1c46-4ea8-8261-8fdc9500dca2" type="5" label="Contact" placeholder="Contact" description="" required="true" ordinal="6"></systemField></systemFields><descriptionTemplates></descriptionTemplates></section><section id="3c2608e5-9320-4d94-9ed7-1eab9500d84b" label="Funding" description="" ordinal="2" hasTemplates="false"><systemFields><systemField id="527af8fe-27b0-4715-9e1e-35a2fce834a1" type="6" label="Funding organizations" placeholder="Funder" description="Select a funder of your research or add new" required="true" ordinal="1"></systemField><systemField id="4d12904e-2501-4d57-8d2b-1ac795c297e7" type="7" label="Grants" placeholder="Grant" description="Find the grant of your research or add new" required="true" ordinal="2"></systemField><systemField id="82f235c8-98fc-48d1-8245-36ab08f01036" type="8" label="Project" placeholder="Project" description="Projects in Argos are perceived as distinct activities falling under a grant or common activities under different grants in collaborative schemas, eg open call for contributions. Please complete it for the grant associated to your organization if your project falls under this category. In all other cases, please leave blank and it will be autocompleted." required="false" ordinal="3"></systemField></systemFields><descriptionTemplates></descriptionTemplates></section><section id="2a77e1f6-9989-4aeb-acd9-48e911a92abd" label="License" description="" ordinal="3" hasTemplates="false"><systemFields><systemField id="75c31705-6731-45dd-9853-75c5d0627439" type="9" label="License" placeholder="License" description="Assign a license to your DMP by selecting the most appropriate from the list." required="false" ordinal="1"></systemField><systemField id="990df932-eae6-44ca-85da-5378b010f439" type="10" label="Access Rights" placeholder="Access Rights" description="Choose how the DMP is displayed after is published on Zenodo. By choosing Open Access, the DMP will be open on Zenodo after the Publication Date. By choosing Restricted Access, the DMP will be restricted after the publication is made." required="false" ordinal="2"></systemField></systemFields><descriptionTemplates></descriptionTemplates></section><section id="0db7845b-0e7c-41df-8d91-cbca97995fd5" label="Templates" description="" ordinal="4" hasTemplates="true"><systemFields></systemFields><descriptionTemplates></descriptionTemplates></section></sections></root>',1, now(),now());
|
||||
UPDATE public."DMP" SET "Profile" = '86635178-36a6-484f-9057-a934e4eeecd5' WHERE "Profile" IS NULL;
|
||||
UPDATE public."Dataset" SET "DmpSectionIndex" = '3' WHERE "DmpSectionIndex" IS NULL;
|
||||
UPDATE public."DMPDatasetProfile" SET "data" = '{"dmpSectionIndex":[3]}' WHERE "data" IS NULL;
|
||||
|
|
|
@ -25,7 +25,4 @@
|
|||
<app-notification *ngIf="!onlySplash"></app-notification>
|
||||
<router-outlet *ngIf="onlySplash"></router-outlet>
|
||||
|
||||
<ngx-guided-tour
|
||||
[skipText]="'DASHBOARD.TOUR-GUIDE.LEAVE-TOUR'| translate"
|
||||
[nextText]="'DASHBOARD.TOUR-GUIDE.GOT-IT'| translate"
|
||||
></ngx-guided-tour>
|
||||
<ngx-guided-tour [skipText]="'DASHBOARD.TOUR-GUIDE.LEAVE-TOUR'| translate" [nextText]="'DASHBOARD.TOUR-GUIDE.GOT-IT'| translate"></ngx-guided-tour>
|
|
@ -40,3 +40,70 @@
|
|||
::ng-deep .mat-chip {
|
||||
height: auto !important;
|
||||
}
|
||||
|
||||
.notification-header {
|
||||
height: 64px;
|
||||
background: var(--unnamed-color-var(--primary-color)) 0% 0% no-repeat padding-box;
|
||||
background: var(--primary-color) 0% 0% no-repeat padding-box;
|
||||
box-shadow: 0px 3px 6px #00000029;
|
||||
padding: 0.6rem;
|
||||
margin: 30px 0px 0px 0px;
|
||||
border-radius: 4px;
|
||||
opacity: 1;
|
||||
|
||||
.info {
|
||||
flex: 2;
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
white-space: nowrap;
|
||||
}
|
||||
}
|
||||
|
||||
.notification-discard-btn {
|
||||
background: transparent;
|
||||
border: 1px solid #ffffff;
|
||||
color: white;
|
||||
border-radius: 30px;
|
||||
opacity: 1;
|
||||
width: 110px;
|
||||
height: 40px;
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.notification-title {
|
||||
text-align: left;
|
||||
font-weight: 400;
|
||||
font-size: 14px;
|
||||
color: #ffffff;
|
||||
opacity: 0.75;
|
||||
}
|
||||
|
||||
.notification-subtitle {
|
||||
text-align: left;
|
||||
color: #ffffff;
|
||||
font-weight: 700;
|
||||
font-size: 16px;
|
||||
opacity: 1;
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
white-space: nowrap;
|
||||
}
|
||||
.notification-link {
|
||||
color: #ffffff;
|
||||
text-decoration: underline;
|
||||
}
|
||||
|
||||
.notification-save-btn {
|
||||
background: #ffffff 0% 0% no-repeat padding-box !important;
|
||||
border-radius: 30px;
|
||||
opacity: 1;
|
||||
width: 110px;
|
||||
height: 40px;
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
font-weight: 700;
|
||||
color: var(--primary-color);
|
||||
}
|
|
@ -20,6 +20,8 @@ import { MatomoInjector } from 'ngx-matomo';
|
|||
import { MatomoService } from './core/services/matomo/matomo-service';
|
||||
import { SideNavService } from './core/services/sidenav/side-nav.sevice';
|
||||
import { MatSidenav } from '@angular/material/sidenav';
|
||||
import { runInThisContext } from 'vm';
|
||||
import * as moment from 'moment';
|
||||
|
||||
|
||||
declare const gapi: any;
|
||||
|
@ -52,7 +54,7 @@ export class AppComponent implements OnInit, AfterViewInit {
|
|||
private cookieService: CookieService,
|
||||
private ccService: NgcCookieConsentService,
|
||||
private language: LanguageService,
|
||||
private configurationService: ConfigurationService,
|
||||
public configurationService: ConfigurationService,
|
||||
private location: Location,
|
||||
private matomoService: MatomoService,
|
||||
private sidenavService: SideNavService
|
||||
|
|
|
@ -4,6 +4,7 @@ import { UserInfoListingModel } from "../../user/user-info-listing";
|
|||
export interface DatasetProfile {
|
||||
label: string;
|
||||
type: string;
|
||||
enablePrefilling: boolean;
|
||||
sections: Section[];
|
||||
pages: Page[];
|
||||
status: number;
|
||||
|
|
|
@ -0,0 +1,3 @@
|
|||
export enum AuthType {
|
||||
BEARER = 'Bearer'
|
||||
}
|
|
@ -12,11 +12,22 @@ export interface AutoCompleteFieldData extends FieldData {
|
|||
multiAutoComplete: boolean;
|
||||
}
|
||||
|
||||
export interface AuthAutoCompleteData extends FieldData {
|
||||
url: string;
|
||||
method: string;
|
||||
body: string;
|
||||
path: string;
|
||||
type: string;
|
||||
}
|
||||
|
||||
export interface AutoCompleteSingleData extends FieldData {
|
||||
url: string;
|
||||
optionsRoot: string;
|
||||
autoCompleteOptions: FieldDataOption;
|
||||
autocompleteType: number;
|
||||
hasAuth: boolean;
|
||||
method: string;
|
||||
auth: AuthAutoCompleteData;
|
||||
}
|
||||
|
||||
export interface CheckBoxFieldData extends FieldData {
|
||||
|
|
|
@ -0,0 +1,6 @@
|
|||
export enum HtmlMethod {
|
||||
GET = 'GET',
|
||||
POST = 'POST',
|
||||
PUT = 'PUT',
|
||||
PATCH = 'PATCH'
|
||||
}
|
|
@ -5,6 +5,12 @@ export interface DatasetProfileModel {
|
|||
description: string;
|
||||
}
|
||||
|
||||
export interface DatasetProfileWithPrefillingModel {
|
||||
id: string;
|
||||
label: string;
|
||||
enablePrefilling: boolean;
|
||||
}
|
||||
|
||||
// export class DatasetProfileModel implements Serializable<DatasetProfileModel> {
|
||||
// public id: String;
|
||||
// public label: String;
|
||||
|
|
|
@ -3,6 +3,7 @@ import { BaseCriteria } from "../base-criteria";
|
|||
export class DatasetProfileCriteria extends BaseCriteria {
|
||||
public id: String;
|
||||
public groupIds: string[];
|
||||
public ids: string[];
|
||||
public allVersions: boolean;
|
||||
public finalized: boolean = true;
|
||||
public status: number;
|
||||
|
|
|
@ -101,6 +101,21 @@ export class ConfigurationService extends BaseComponent {
|
|||
return this._maxFileSizeInMB;
|
||||
}
|
||||
|
||||
private _newReleaseNotificationLink: number;
|
||||
get newReleaseNotificationLink(): number {
|
||||
return this._newReleaseNotificationLink;
|
||||
}
|
||||
|
||||
private _newReleaseNotificationExpires: number;
|
||||
get newReleaseNotificationExpires(): number {
|
||||
return this._newReleaseNotificationExpires;
|
||||
}
|
||||
|
||||
private _newReleaseNotificationVersionCode: number;
|
||||
get newReleaseNotificationVersionCode(): number {
|
||||
return this._newReleaseNotificationVersionCode;
|
||||
}
|
||||
|
||||
public loadConfiguration(): Promise<any> {
|
||||
return new Promise((r, e) => {
|
||||
|
||||
|
@ -146,6 +161,9 @@ export class ConfigurationService extends BaseComponent {
|
|||
this._matomoSiteId = config.matomo.siteId;
|
||||
}
|
||||
this._maxFileSizeInMB = config.maxFileSizeInMB;
|
||||
this._newReleaseNotificationExpires = config.newReleaseNotification?.expires;
|
||||
this._newReleaseNotificationLink = config.newReleaseNotification?.link;
|
||||
this._newReleaseNotificationVersionCode = config.newReleaseNotification?.versionCode;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -1,10 +1,9 @@
|
|||
import { Injectable } from '@angular/core';
|
||||
import { Observable } from 'rxjs';
|
||||
import { environment } from '../../../../environments/environment';
|
||||
import { DataTableData } from '../../model/data-table/data-table-data';
|
||||
import { DataTableRequest } from '../../model/data-table/data-table-request';
|
||||
import { DatasetListingModel } from '../../model/dataset/dataset-listing';
|
||||
import { DatasetProfileModel } from '../../model/dataset/dataset-profile';
|
||||
import { DatasetProfileModel, DatasetProfileWithPrefillingModel } from '../../model/dataset/dataset-profile';
|
||||
import { DatasetCriteria } from '../../query/dataset/dataset-criteria';
|
||||
import { ExploreDatasetCriteriaModel } from '../../query/explore-dataset/explore-dataset-criteria';
|
||||
import { BaseHttpService } from '../http/base-http.service';
|
||||
|
@ -43,6 +42,10 @@ export class DatasetService {
|
|||
return this.http.post<DatasetProfileModel[]>(this.configurationSevice.server + 'datasetprofiles/getAll', dataTableRequest);
|
||||
}
|
||||
|
||||
getDatasetProfilesWithPrefilling(dataTableRequest: DataTableRequest<DatasetProfileCriteria>): Observable<DatasetProfileWithPrefillingModel[]> {
|
||||
return this.http.post<DatasetProfileWithPrefillingModel[]>(this.configurationSevice.server + 'datasetprofiles/getAllWithPrefilling', dataTableRequest);
|
||||
}
|
||||
|
||||
getDatasetProfilesUsedPaged(dataTableRequest: DataTableRequest<DatasetProfileCriteria>) {
|
||||
return this.http.post<DataTableData<DatasetListingModel>>(this.actionUrl + 'datasetProfilesUsedByDatasets/paged', dataTableRequest);
|
||||
}
|
||||
|
|
|
@ -67,6 +67,14 @@ export class DmpProfileService {
|
|||
return this.http.post(this.actionUrl + "upload", formData, { params: params });
|
||||
}
|
||||
|
||||
clone(id: string): Observable<DmpBlueprint> {
|
||||
return this.http.post<DmpBlueprint>(this.actionUrl + 'clone/' + id, { headers: this.headers });
|
||||
}
|
||||
|
||||
delete(id: string): Observable<any> {
|
||||
return this.http.delete<any>(this.actionUrl + id, { headers: this.headers });
|
||||
}
|
||||
|
||||
externalAutocomplete(lookUpItem: RequestItem<DmpProfileExternalAutocompleteCriteria>): Observable<any> {
|
||||
return this.httpClient.post(this.actionUrl + 'search/autocomplete', lookUpItem);
|
||||
}
|
||||
|
|
|
@ -20,10 +20,10 @@ export class PrefillingService {
|
|||
}
|
||||
|
||||
public getPrefillingDataset(pid: string, profileId: string, configId: string): Observable<DatasetWizardModel> {
|
||||
return this.http.get<DatasetWizardModel>(this.actionUrl + '/generate/' + encodeURIComponent(pid) + '?configId=' + encodeURIComponent(configId) + '&profileId=' + encodeURIComponent(profileId), { headers: this.headers });
|
||||
return this.http.get<DatasetWizardModel>(this.actionUrl + 'generate/' + encodeURIComponent(pid) + '?configId=' + encodeURIComponent(configId) + '&profileId=' + encodeURIComponent(profileId), { headers: this.headers });
|
||||
}
|
||||
|
||||
public getPrefillingDatasetUsingData(data: any, profileId: string, configId: string): Observable<DatasetWizardModel> {
|
||||
return this.http.post<DatasetWizardModel>(this.actionUrl + '/generateUsingData' + '?configId=' + encodeURIComponent(configId) + '&profileId=' + encodeURIComponent(profileId), data, { headers: this.headers });
|
||||
return this.http.post<DatasetWizardModel>(this.actionUrl + 'generateUsingData' + '?configId=' + encodeURIComponent(configId) + '&profileId=' + encodeURIComponent(profileId), data, { headers: this.headers });
|
||||
}
|
||||
}
|
||||
|
|
|
@ -37,5 +37,6 @@ export interface MultipleAutoCompleteConfiguration {
|
|||
autoSelectFirstOptionOnBlur?: boolean;
|
||||
|
||||
appendClassToItem?: {class: string, applyFunc: (item:any) => boolean}[];
|
||||
canRemoveItem?: (selectedItem: any) => boolean;
|
||||
|
||||
}
|
||||
|
|
|
@ -221,6 +221,9 @@ export class MultipleAutoCompleteComponent extends _CustomComponentMixinBase imp
|
|||
if (changes['configuration'] && changes['configuration'].isFirstChange) {
|
||||
this.getSelectedItems(this.value);
|
||||
}
|
||||
if (changes['value'] && !changes['value'].isFirstChange()) {
|
||||
this.getSelectedItems(this.value);
|
||||
}
|
||||
}
|
||||
|
||||
getSelectedItems(value: any) {
|
||||
|
@ -480,6 +483,10 @@ export class MultipleAutoCompleteComponent extends _CustomComponentMixinBase imp
|
|||
if (event != null) {
|
||||
event.stopPropagation();
|
||||
}
|
||||
if (this.configuration.canRemoveItem != null && !this.configuration.canRemoveItem(item)) {
|
||||
event.stopPropagation();
|
||||
return;
|
||||
}
|
||||
const valueToDelete = this._valueToAssign(item);
|
||||
this.value = this.value.filter(x => this.stringify(x) !== this.stringify(valueToDelete)); //TODO, maybe we need to implement equality here differently.
|
||||
this.optionRemoved.emit(item);
|
||||
|
|
|
@ -47,7 +47,8 @@ export class RichTextEditorComponent {
|
|||
{ name: 'H3 header', class: '', tag: 'h3' },
|
||||
{ name: 'H4 header', class: '', tag: 'h4' },
|
||||
{ name: 'H5 header', class: '', tag: 'h5'},
|
||||
{ name: 'H6 header', class: '', tag: 'h6'}
|
||||
{ name: 'H6 header', class: '', tag: 'h6'},
|
||||
{ name: 'Highlight', class: 'highlight', tag: ''}
|
||||
],
|
||||
toolbarHiddenButtons: [
|
||||
[
|
||||
|
@ -56,7 +57,7 @@ export class RichTextEditorComponent {
|
|||
],
|
||||
[
|
||||
'fontSize',
|
||||
// 'backgroundColor',
|
||||
'backgroundColor',
|
||||
// 'customClasses',
|
||||
'insertImage',
|
||||
'insertVideo',
|
||||
|
|
|
@ -0,0 +1,35 @@
|
|||
import { FormGroup, Validators } from "@angular/forms";
|
||||
import { FieldDataEditorModel } from "./field-data-editor-model";
|
||||
import { AuthAutoCompleteData, AutoCompleteSingleData } from "@app/core/model/dataset-profile-definition/field-data/field-data";
|
||||
|
||||
export class AuthFieldEditorModel extends FieldDataEditorModel<AuthFieldEditorModel> {
|
||||
url: string;
|
||||
method: string;
|
||||
body: string;
|
||||
path: string;
|
||||
type: string;
|
||||
|
||||
buildForm(disabled: boolean = false, skipDisable: Array<String> = []): FormGroup {
|
||||
const formGroup = this.formBuilder.group({
|
||||
method: [{ value: this.method, disabled: (disabled && !skipDisable.includes('AuthFieldEditorModel.method')) }],
|
||||
url: [{ value: this.url, disabled: (disabled && !skipDisable.includes('AuthFieldEditorModel.url')) }, [Validators.required]],
|
||||
body: [{ value: this.body, disabled: (disabled && !skipDisable.includes('AuthFieldEditorModel.body')) }],
|
||||
path: [{ value: this.path, disabled: (disabled && !skipDisable.includes('AuthFieldEditorModel.path')) }, [Validators.required]],
|
||||
type: [{ value: this.type, disabled: (disabled && !skipDisable.includes('AuthFieldEditorModel.type')) }, [Validators.required]]
|
||||
});
|
||||
|
||||
return formGroup;
|
||||
}
|
||||
|
||||
fromModel(item: AuthAutoCompleteData): AuthFieldEditorModel {
|
||||
if (item) {
|
||||
this.url = item.url;
|
||||
this.method = item.method;
|
||||
this.body = item.body;
|
||||
this.path = item.path;
|
||||
this.type = item.type;
|
||||
}
|
||||
return this;
|
||||
}
|
||||
|
||||
}
|
|
@ -3,6 +3,7 @@ import { DatasetProfileComboBoxType } from '@app/core/common/enum/dataset-profil
|
|||
import { FieldDataOptionEditorModel } from './field-data-option-editor-model';
|
||||
import { FormGroup, Validators } from '@angular/forms';
|
||||
import { AutoCompleteFieldData, AutoCompleteSingleData } from '@app/core/model/dataset-profile-definition/field-data/field-data';
|
||||
import { AuthFieldEditorModel } from './auto-complete-auth-field-data.model';
|
||||
|
||||
export class AutoCompleteSingleDataEditorModel extends FieldDataEditorModel<AutoCompleteSingleDataEditorModel> {
|
||||
|
||||
|
@ -11,6 +12,9 @@ export class AutoCompleteSingleDataEditorModel extends FieldDataEditorModel<Auto
|
|||
|
||||
public autoCompleteOptions: FieldDataOptionEditorModel = new FieldDataOptionEditorModel();
|
||||
public autoCompleteType: number;
|
||||
public method: string;
|
||||
public hasAuth: boolean;
|
||||
public auth: AuthFieldEditorModel = new AuthFieldEditorModel();
|
||||
//public multiAutoCompleteOptions: FieldDataOptionEditorModel = new FieldDataOptionEditorModel();
|
||||
|
||||
buildForm(disabled: boolean = false, skipDisable: Array<String> = []): FormGroup {
|
||||
|
@ -18,9 +22,12 @@ export class AutoCompleteSingleDataEditorModel extends FieldDataEditorModel<Auto
|
|||
label: [{ value: this.label, disabled: (disabled && !skipDisable.includes('AutoCompleteSingleDataEditorModel.label')) }],
|
||||
url: [{ value: this.url, disabled: (disabled && !skipDisable.includes('AutoCompleteSingleDataEditorModel.url')) },[Validators.required]],
|
||||
optionsRoot: [{ value: this.optionsRoot, disabled: (disabled && !skipDisable.includes('AutoCompleteSingleDataEditorModel.optionsRoot')) }, [Validators.required]],
|
||||
autoCompleteType: [{ value: this.autoCompleteType, disabled: (disabled && !skipDisable.includes('AutoCompleteSingleDataEditorModel.autoCompleteType')) }]
|
||||
autoCompleteType: [{ value: this.autoCompleteType, disabled: (disabled && !skipDisable.includes('AutoCompleteSingleDataEditorModel.autoCompleteType')) }],
|
||||
hasAuth: [{ value: this.hasAuth, disabled: (disabled && !skipDisable.includes('AutoCompleteSingleDataEditorModel.hasAuth')) }],
|
||||
method: [{ value: this.method, disabled: (disabled && !skipDisable.includes('AutoCompleteSingleDataEditorModel.method')) }]
|
||||
});
|
||||
formGroup.addControl('autoCompleteOptions', this.autoCompleteOptions.buildForm(disabled, skipDisable));
|
||||
formGroup.addControl('auth', this.auth.buildForm(disabled, skipDisable));
|
||||
|
||||
return formGroup;
|
||||
}
|
||||
|
@ -30,7 +37,10 @@ export class AutoCompleteSingleDataEditorModel extends FieldDataEditorModel<Auto
|
|||
this.label = item.label;
|
||||
this.optionsRoot = item.optionsRoot;
|
||||
this.autoCompleteType = item.autocompleteType;
|
||||
this.hasAuth = item.hasAuth;
|
||||
this.method = item.method ? item.method : 'GET';
|
||||
this.autoCompleteOptions = new FieldDataOptionEditorModel().fromModel(item.autoCompleteOptions);
|
||||
this.auth = new AuthFieldEditorModel().fromModel(item.auth);
|
||||
return this;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -37,15 +37,21 @@
|
|||
</div>
|
||||
|
||||
<div *ngFor="let singleForm of multiForm.controls; let i = index" class="row">
|
||||
<mat-form-field class="col-12">
|
||||
<!-- <mat-form-field class="col-12">
|
||||
<mat-label>{{'DATASET-PROFILE-EDITOR.STEPS.FORM.FIELD.FIELDS.FIELD-AUTOCOMPLETE-TYPE' | translate}}</mat-label>
|
||||
<mat-select [formControl]="singleForm.get('autoCompleteType')">
|
||||
<mat-option [value]="0">{{'DATASET-PROFILE-EDITOR.STEPS.FORM.FIELD.FIELDS.FIELD-AUTOCOMPLETE-TYPE-UNCACHED' | translate}}</mat-option>
|
||||
<mat-option [value]="1">{{'DATASET-PROFILE-EDITOR.STEPS.FORM.FIELD.FIELDS.FIELD-AUTOCOMPLETE-TYPE-CACHED' | translate}}</mat-option>
|
||||
</mat-select>
|
||||
</mat-form-field> -->
|
||||
<mat-form-field class="col-md-6">
|
||||
<mat-label>{{'DATASET-PROFILE-EDITOR.STEPS.FORM.FIELD.FIELDS.FIELD-AUTOCOMPLETE-AUTH-METHOD' | translate}}</mat-label>
|
||||
<mat-select [formControl]="singleForm.get('method')">
|
||||
<mat-option *ngFor="let method of htmlMethods | keyvalue" [value]="method.value">{{method.value}}</mat-option>
|
||||
</mat-select>
|
||||
</mat-form-field>
|
||||
|
||||
<mat-form-field class="col-md-12">
|
||||
<mat-form-field class="col-md-6">
|
||||
<mat-label>{{'DATASET-PROFILE-EDITOR.STEPS.FORM.FIELD.FIELDS.FIELD-AUTOCOMPLETE-URL' | translate}}</mat-label>
|
||||
<input matInput [formControl]="singleForm.get('url')">
|
||||
<mat-error *ngIf="singleForm.get('url').hasError('required')">{{'GENERAL.VALIDATION.REQUIRED' | translate}}</mat-error>
|
||||
|
@ -70,6 +76,37 @@
|
|||
<input matInput [formControl]="singleForm.get('autoCompleteOptions').get('source')">
|
||||
<mat-error *ngIf="singleForm.get('autoCompleteOptions').hasError('required')">{{'GENERAL.VALIDATION.REQUIRED' | translate}}</mat-error>
|
||||
</mat-form-field>
|
||||
<mat-checkbox class="col-12" [formControl]="singleForm.get('hasAuth')">{{'DATASET-PROFILE-EDITOR.STEPS.FORM.FIELD.FIELDS.FIELD-AUTOCOMPLETE-HAS-AUTH' | translate}}</mat-checkbox>
|
||||
<div *ngIf="singleForm.get('hasAuth').value === true" class="row">
|
||||
<mat-form-field class="col-md-6">
|
||||
<mat-label>{{'DATASET-PROFILE-EDITOR.STEPS.FORM.FIELD.FIELDS.FIELD-AUTOCOMPLETE-AUTH-METHOD' | translate}}</mat-label>
|
||||
<mat-select [formControl]="singleForm.get('auth').get('method')">
|
||||
<mat-option *ngFor="let method of htmlMethods | keyvalue" [value]="method.value">{{method.value}}</mat-option>
|
||||
</mat-select>
|
||||
</mat-form-field>
|
||||
<mat-form-field class="col-md-6">
|
||||
<mat-label>{{'DATASET-PROFILE-EDITOR.STEPS.FORM.FIELD.FIELDS.FIELD-AUTOCOMPLETE-URL' | translate}}</mat-label>
|
||||
<input matInput [formControl]="singleForm.get('auth').get('url')">
|
||||
<mat-error *ngIf="singleForm.get('auth').get('url').hasError('required')">{{'GENERAL.VALIDATION.REQUIRED' | translate}}</mat-error>
|
||||
</mat-form-field>
|
||||
<mat-form-field class="col-md-6">
|
||||
<mat-label>{{'DATASET-PROFILE-EDITOR.STEPS.FORM.FIELD.FIELDS.FIELD-AUTOCOMPLETE-AUTH-TYPE' | translate}}</mat-label>
|
||||
<mat-select [formControl]="singleForm.get('auth').get('type')">
|
||||
<mat-option *ngFor="let type of authTypes | keyvalue" [value]="type.value">{{type.value}}</mat-option>
|
||||
</mat-select>
|
||||
</mat-form-field>
|
||||
<mat-form-field class="col-md-6">
|
||||
<mat-label>{{'DATASET-PROFILE-EDITOR.STEPS.FORM.FIELD.FIELDS.FIELD-AUTOCOMPLETE-OPTIONS-ROOT' | translate}}</mat-label>
|
||||
<input matInput [formControl]="singleForm.get('auth').get('path')">
|
||||
<mat-error *ngIf="singleForm.get('auth').get('path').hasError('required')">{{'GENERAL.VALIDATION.REQUIRED' | translate}}</mat-error>
|
||||
</mat-form-field>
|
||||
<mat-form-field class="col-md-12">
|
||||
<mat-label>{{'DATASET-PROFILE-EDITOR.STEPS.FORM.FIELD.FIELDS.FIELD-AUTOCOMPLETE-AUTH-BODY' | translate}}</mat-label>
|
||||
<textarea matInput [formControl]="singleForm.get('auth').get('body')"></textarea>
|
||||
<mat-error *ngIf="singleForm.get('auth').get('body').hasError('required')">{{'GENERAL.VALIDATION.REQUIRED' | translate}}</mat-error>
|
||||
</mat-form-field>
|
||||
</div>
|
||||
|
||||
<button mat-button type="button" (click)="removeSource(i)"><mat-icon>delete</mat-icon></button>
|
||||
</div>
|
||||
|
||||
|
|
|
@ -3,6 +3,8 @@ import { FormGroup, FormArray, AbstractControl } from '@angular/forms';
|
|||
import { DatasetProfileComboBoxType } from '../../../../../../../core/common/enum/dataset-profile-combo-box-type';
|
||||
import { AutoCompleteFieldDataEditorModel } from '../../../../admin/field-data/auto-complete-field-data-editor-model';
|
||||
import { AutoCompleteSingleDataEditorModel } from '@app/ui/admin/dataset-profile/admin/field-data/auto-complete-single-data';
|
||||
import { HtmlMethod } from '@app/core/model/dataset-profile-definition/html-method.enum';
|
||||
import { AuthType } from '@app/core/model/dataset-profile-definition/auth-type.enum';
|
||||
|
||||
@Component({
|
||||
selector: 'app-dataset-profile-editor-auto-complete-field-component',
|
||||
|
@ -11,6 +13,9 @@ import { AutoCompleteSingleDataEditorModel } from '@app/ui/admin/dataset-profile
|
|||
})
|
||||
export class DatasetProfileEditorAutoCompleteFieldComponent implements OnInit {
|
||||
|
||||
public htmlMethods = HtmlMethod;
|
||||
public authTypes = AuthType;
|
||||
|
||||
@Input() form: FormGroup;
|
||||
private data: AutoCompleteFieldDataEditorModel = new AutoCompleteFieldDataEditorModel();
|
||||
multiForm: FormArray;
|
||||
|
|
|
@ -30,7 +30,7 @@
|
|||
<input matInput [formControl]="form.get('data').get('options').get(''+i).get('value')">
|
||||
</mat-form-field>
|
||||
<button mat-icon-button class="col-auto" (click)="deleteRow(i)" type="button"
|
||||
[disabled]="this.form.disabled">
|
||||
[disabled]="form.get('data').get('options').get(''+i).get('label').disabled || form.get('data').get('options').get(''+i).get('value').disabled">
|
||||
<mat-icon>delete</mat-icon>
|
||||
</button>
|
||||
</div>
|
||||
|
|
|
@ -16,6 +16,7 @@ export class DatasetProfileEditorModel extends BaseFormModel {
|
|||
public version: number;
|
||||
private description: string;
|
||||
private type: string;
|
||||
public enablePrefilling: boolean;
|
||||
private language: string;
|
||||
private users: UserInfoListingModel[] = [];
|
||||
|
||||
|
@ -24,6 +25,7 @@ export class DatasetProfileEditorModel extends BaseFormModel {
|
|||
if (item.pages) { this.pages = item.pages.map(x => new PageEditorModel().fromModel(x)); }
|
||||
this.label = item.label;
|
||||
this.type = item.type;
|
||||
this.enablePrefilling = item.enablePrefilling;
|
||||
this.status = item.status;
|
||||
this.version = item.version;
|
||||
this.description = item.description;
|
||||
|
@ -37,6 +39,7 @@ export class DatasetProfileEditorModel extends BaseFormModel {
|
|||
label: [{ value: this.label, disabled: (disabled && !skipDisable.includes('DatasetProfileEditorModel.label')) }, [Validators.required]],
|
||||
description: [{ value: this.description, disabled: (disabled && !skipDisable.includes('DatasetProfileEditorModel.description')) }, [Validators.required]],
|
||||
type: [{ value: this.type, disabled: (disabled && !skipDisable.includes('DatasetProfileEditorModel.type')) }, [Validators.required]],
|
||||
enablePrefilling: [{ value: this.enablePrefilling, disabled: (disabled && !skipDisable.includes('DatasetProfileEditorModel.enablePrefilling')) }, []],
|
||||
language: [{ value: this.language, disabled: (disabled && !skipDisable.includes('DatasetProfileEditorModel.language')) }, [Validators.required]],
|
||||
status: [{ value: this.status, disabled: (disabled && !skipDisable.includes('DatasetProfileEditorModel.status')) }],
|
||||
version: [{ value: this.version, disabled: (disabled && !skipDisable.includes('DatasetProfileEditorModel.version')) }],
|
||||
|
|
|
@ -170,7 +170,15 @@
|
|||
</mat-form-field>
|
||||
</div>
|
||||
<div class="col-12">
|
||||
<div class="heading">1.5 {{'DATASET-PROFILE-EDITOR.STEPS.GENERAL-INFO.DATASET-TEMPLATE-USERS'| translate}}</div>
|
||||
<div class="heading">1.5 {{'DATASET-PROFILE-EDITOR.STEPS.GENERAL-INFO.DESCRIPTION-TEMPLATE-PREFILLING'| translate}}</div>
|
||||
<div class="full-width basic-info-input">
|
||||
<mat-checkbox [formControl]="form.get('enablePrefilling')">
|
||||
{{'DATASET-PROFILE-EDITOR.STEPS.GENERAL-INFO.DESCRIPTION-TEMPLATE-ENABLE-PREFILLING'| translate}}
|
||||
</mat-checkbox>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-12">
|
||||
<div class="heading">1.6 {{'DATASET-PROFILE-EDITOR.STEPS.GENERAL-INFO.DATASET-TEMPLATE-USERS'| translate}}</div>
|
||||
<div class="hint">{{'DATASET-PROFILE-EDITOR.STEPS.GENERAL-INFO.DATASET-TEMPLATE-USERS-HINT'| translate}}</div>
|
||||
<div class="full-width basic-info-input">
|
||||
<table class="col-12 user-table">
|
||||
|
|
|
@ -214,6 +214,7 @@ export class DatasetProfileEditorComponent extends CheckDeactivateBaseComponent
|
|||
);
|
||||
} else {
|
||||
this.dataModel = new DatasetProfileEditorModel();
|
||||
this.dataModel.enablePrefilling = true;
|
||||
this.form = this.dataModel.buildForm();
|
||||
// this.form.setValidators([EditorCustomValidators.atLeastOneElementListValidator('pages'), EditorCustomValidators.pagesHaveAtLeastOneSection('pages', 'sections')]);
|
||||
|
||||
|
|
|
@ -8,6 +8,7 @@ import { AdminAuthGuard } from '@app/core/admin-auth-guard.service';
|
|||
const routes: Routes = [
|
||||
{ path: '', component: DmpProfileListingComponent, canActivate: [AdminAuthGuard] },
|
||||
{ path: 'new', component: DmpProfileEditorComponent, canActivate: [AdminAuthGuard], data: { title: 'GENERAL.TITLES.DMP-BLUEPRINT-NEW' } },
|
||||
{ path: 'clone/:cloneid', component: DmpProfileEditorComponent, canActivate: [AdminAuthGuard], data: { title: 'GENERAL.TITLES.DMP-BLUEPRINT-CLONE' } },
|
||||
{ path: ':id', component: DmpProfileEditorComponent, canActivate: [AdminAuthGuard], data: { title: 'GENERAL.TITLES.DMP-BLUEPRINT-EDIT' } },
|
||||
];
|
||||
|
||||
|
|
|
@ -62,7 +62,7 @@ export class DmpBlueprintDefinitionEditor {
|
|||
const formBuilder = new FormBuilder();
|
||||
const formGroup = formBuilder.group({});
|
||||
const sectionsFormArray = new Array<FormGroup>();
|
||||
this.sections.forEach(item => {
|
||||
this.sections.sort((a, b) => a.ordinal - b.ordinal).forEach(item => {
|
||||
const form: FormGroup = item.buildForm();
|
||||
sectionsFormArray.push(form);
|
||||
});
|
||||
|
@ -103,7 +103,7 @@ export class SectionDmpBlueprintEditor {
|
|||
});
|
||||
const formBuilder = new FormBuilder();
|
||||
const fieldsFormArray = new Array<FormGroup>();
|
||||
this.fields.forEach(item => {
|
||||
this.fields.sort((a, b) => a.ordinal - b.ordinal).forEach(item => {
|
||||
const form: FormGroup = item.buildForm();
|
||||
fieldsFormArray.push(form);
|
||||
});
|
||||
|
@ -121,7 +121,7 @@ export class SectionDmpBlueprintEditor {
|
|||
const baseContext: ValidationContext = new ValidationContext();
|
||||
baseContext.validation.push({ key: 'id', validators: [BackendErrorValidator(this.validationErrorModel, 'id')] });
|
||||
baseContext.validation.push({ key: 'label', validators: [Validators.required, BackendErrorValidator(this.validationErrorModel, 'label')] });
|
||||
baseContext.validation.push({ key: 'description', validators: [Validators.required, BackendErrorValidator(this.validationErrorModel, 'description')] });
|
||||
baseContext.validation.push({ key: 'description', validators: [BackendErrorValidator(this.validationErrorModel, 'description')] });
|
||||
baseContext.validation.push({ key: 'ordinal', validators: [Validators.required, BackendErrorValidator(this.validationErrorModel, 'ordinal')] });
|
||||
baseContext.validation.push({ key: 'hasTemplates', validators: [BackendErrorValidator(this.validationErrorModel, 'hasTemplates')] });
|
||||
baseContext.validation.push({ key: 'descriptionTemplates', validators: [BackendErrorValidator(this.validationErrorModel, 'descriptionTemplates')] });
|
||||
|
|
|
@ -2,7 +2,11 @@
|
|||
<div class="container-fluid dmp-profile-editor">
|
||||
<div class="row align-items-center mb-4" *ngIf="formGroup">
|
||||
<div class="col-auto">
|
||||
<h3 *ngIf="isNew">{{'DMP-PROFILE-EDITOR.TITLE.NEW' | translate}}</h3>
|
||||
<h3 *ngIf="isNew && !isClone">{{'DMP-PROFILE-EDITOR.TITLE.NEW' | translate}}</h3>
|
||||
<h3 *ngIf="isNew && isClone">
|
||||
<span>{{'DMP-PROFILE-EDITOR.TITLE.NEW-PROFILE-CLONE' | translate}}</span>
|
||||
{{formGroup.get('label').value}}
|
||||
</h3>
|
||||
<h3 *ngIf="!isNew">{{formGroup.get('label').value}}</h3>
|
||||
</div>
|
||||
<div class="col"></div>
|
||||
|
@ -65,7 +69,7 @@
|
|||
<div class="col-6">
|
||||
<mat-form-field>
|
||||
<mat-label>Section description</mat-label>
|
||||
<input matInput type="text" name="description" formControlName="description" required>
|
||||
<input matInput type="text" name="description" formControlName="description">
|
||||
<mat-error *ngIf="section.get('description').hasError('required')">
|
||||
{{'GENERAL.VALIDATION.REQUIRED' | translate}}</mat-error>
|
||||
</mat-form-field>
|
||||
|
@ -218,7 +222,7 @@
|
|||
<div class="col-12">
|
||||
<mat-form-field>
|
||||
<mat-label>Description Templates</mat-label>
|
||||
<app-multiple-auto-complete placeholder="Description Templates" [disabled]="viewOnly" [value]="descriptionTemplatesPerSection[sectionIndex]" [hidePlaceholder]="true" required='false' [configuration]="profilesAutoCompleteConfiguration" (optionRemoved)="onRemoveTemplate($event, sectionIndex)" (optionSelected)="onOptionSelected($event, sectionIndex)">
|
||||
<app-multiple-auto-complete placeholder="Description Templates" [disabled]="viewOnly" [value]="descriptionTemplatesPerSection[sectionIndex]" [hidePlaceholder]="true" required='false' [configuration]="profilesAutoCompleteConfiguration" (optionRemoved)="onRemoveTemplate($event, sectionIndex)" (optionActionClicked)="onPreviewTemplate($event, sectionIndex)" (optionSelected)="onOptionSelected($event, sectionIndex)">
|
||||
</app-multiple-auto-complete>
|
||||
<!-- <button matSuffix class="input-btn" (click)="allAvailableProfiles($event)">
|
||||
<mat-icon class="icon-btn">view_list</mat-icon>
|
||||
|
|
|
@ -49,6 +49,7 @@ import { FormValidationErrorsDialogComponent } from '@common/forms/form-validati
|
|||
export class DmpProfileEditorComponent extends BaseComponent implements AfterViewInit {
|
||||
|
||||
isNew = true;
|
||||
isClone = false;
|
||||
viewOnly = false;
|
||||
dmpProfileModel: DmpProfileEditorModel;
|
||||
dmpBlueprintModel: DmpBlueprintEditor;
|
||||
|
@ -112,6 +113,7 @@ export class DmpProfileEditorComponent extends BaseComponent implements AfterVie
|
|||
.pipe(takeUntil(this._destroyed))
|
||||
.subscribe((params: Params) => {
|
||||
this.dmpProfileId = params['id'];
|
||||
const cloneId = params['cloneid'];
|
||||
|
||||
if (this.dmpProfileId != null) {
|
||||
this.isNew = false;
|
||||
|
@ -132,6 +134,21 @@ export class DmpProfileEditorComponent extends BaseComponent implements AfterVie
|
|||
url: '/dmp-profiles/' + this.dmpProfileId
|
||||
}]);
|
||||
});
|
||||
} else if (cloneId != null) {
|
||||
this.isClone = true;
|
||||
this.dmpProfileService.clone(cloneId).pipe(map(data => data as DmpBlueprint), takeUntil(this._destroyed))
|
||||
.subscribe(
|
||||
data => {
|
||||
this.dmpBlueprintModel = new DmpBlueprintEditor().fromModel(data);
|
||||
this.dmpBlueprintModel.id = null;
|
||||
this.dmpBlueprintModel.created = null;
|
||||
this.dmpBlueprintModel.status = DmpProfileStatus.Draft;
|
||||
this.formGroup = this.dmpBlueprintModel.buildForm();
|
||||
this.buildSystemFields();
|
||||
this.fillDescriptionTemplatesInMultAutocomplete();
|
||||
},
|
||||
error => this.onCallbackError(error)
|
||||
);
|
||||
} else {
|
||||
this.dmpProfileModel = new DmpProfileEditorModel();
|
||||
this.dmpBlueprintModel = new DmpBlueprintEditor();
|
||||
|
@ -202,11 +219,16 @@ export class DmpProfileEditorComponent extends BaseComponent implements AfterVie
|
|||
section.hasTemplates = false;
|
||||
this.sectionsArray().push(section.buildForm());
|
||||
this.systemFieldListPerSection.push(new Array());
|
||||
this.descriptionTemplatesPerSection.push(new Array());
|
||||
}
|
||||
|
||||
removeSection(sectionIndex: number): void {
|
||||
this.systemFieldListPerSection.splice(sectionIndex, 1);
|
||||
this.descriptionTemplatesPerSection.splice(sectionIndex, 1);
|
||||
this.sectionsArray().removeAt(sectionIndex);
|
||||
this.sectionsArray().controls.forEach((section, index) => {
|
||||
section.get('ordinal').setValue(index + 1);
|
||||
});
|
||||
}
|
||||
|
||||
fieldsArray(sectionIndex: number): FormArray {
|
||||
|
@ -227,6 +249,9 @@ export class DmpProfileEditorComponent extends BaseComponent implements AfterVie
|
|||
|
||||
removeField(sectionIndex: number, fieldIndex: number): void {
|
||||
this.fieldsArray(sectionIndex).removeAt(fieldIndex);
|
||||
this.fieldsArray(sectionIndex).controls.forEach((field, index) => {
|
||||
field.get('ordinal').setValue(index + 1);
|
||||
});
|
||||
}
|
||||
|
||||
systemFieldsArray(sectionIndex: number): FormArray {
|
||||
|
@ -254,6 +279,7 @@ export class DmpProfileEditorComponent extends BaseComponent implements AfterVie
|
|||
}
|
||||
|
||||
selectedFieldType(type: SystemFieldType, sectionIndex: number): void {
|
||||
if (this.systemFieldDisabled(type, sectionIndex)) return;
|
||||
let index = this.systemFieldListPerSection[sectionIndex].indexOf(type);
|
||||
if (index == -1) {
|
||||
this.systemFieldListPerSection[sectionIndex].push(type);
|
||||
|
@ -343,6 +369,9 @@ export class DmpProfileEditorComponent extends BaseComponent implements AfterVie
|
|||
drop(event: CdkDragDrop<string[]>, sectionIndex: number) {
|
||||
moveItemInArray(this.fieldsArray(sectionIndex).controls, event.previousIndex, event.currentIndex);
|
||||
moveItemInArray(this.fieldsArray(sectionIndex).value, event.previousIndex, event.currentIndex);
|
||||
this.fieldsArray(sectionIndex).controls.forEach((field, index) => {
|
||||
field.get('ordinal').setValue(index + 1);
|
||||
});
|
||||
}
|
||||
|
||||
dropSections(event: CdkDragDrop<string[]>) {
|
||||
|
@ -351,6 +380,8 @@ export class DmpProfileEditorComponent extends BaseComponent implements AfterVie
|
|||
this.sectionsArray().controls.forEach((section, index) => {
|
||||
section.get('ordinal').setValue(index + 1);
|
||||
});
|
||||
moveItemInArray(this.systemFieldListPerSection, event.previousIndex, event.currentIndex);
|
||||
moveItemInArray(this.descriptionTemplatesPerSection, event.previousIndex, event.currentIndex);
|
||||
}
|
||||
|
||||
moveItemInFormArray(formArray: FormArray, fromIndex: number, toIndex: number): void {
|
||||
|
@ -374,36 +405,30 @@ export class DmpProfileEditorComponent extends BaseComponent implements AfterVie
|
|||
foundIndex !== -1 && this.descriptionTemplatesArray(sectionIndex).removeAt(foundIndex);
|
||||
}
|
||||
|
||||
// onPreviewTemplate(event, sectionIndex: number) {
|
||||
// const dialogRef = this.dialog.open(DatasetPreviewDialogComponent, {
|
||||
// width: '590px',
|
||||
// minHeight: '200px',
|
||||
// restoreFocus: false,
|
||||
// data: {
|
||||
// template: event
|
||||
// },
|
||||
// panelClass: 'custom-modalbox'
|
||||
// });
|
||||
// dialogRef.afterClosed().pipe(takeUntil(this._destroyed)).subscribe(result => {
|
||||
// if (result) {
|
||||
// let profiles = this.sectionsArray().at(sectionIndex).get('descriptionTemplates').value;//this.formGroup.get('profiles').value;
|
||||
// const profile: DescriptionTemplatesInSectionEditor = new DescriptionTemplatesInSectionEditor();
|
||||
// profile.id = Guid.create().toString();
|
||||
// profile.descriptionTemplateId = event.id;
|
||||
// profile.label = event.label;
|
||||
// profiles.push(profile.buildForm());
|
||||
// this.sectionsArray().at(sectionIndex).get('descriptionTemplates').setValue(profiles);//this.formGroup.get('profiles').setValue(profiles);
|
||||
// this.profilesAutoCompleteConfiguration = {
|
||||
// filterFn: this.filterProfiles.bind(this),
|
||||
// initialItems: (excludedItems: any[]) => this.filterProfiles('').pipe(map(result => result.filter(resultItem => (excludedItems || []).map(x => x.id).indexOf(resultItem.id) === -1))),
|
||||
// displayFn: (item) => item['label'],
|
||||
// titleFn: (item) => item['label'],
|
||||
// subtitleFn: (item) => item['description'],
|
||||
// popupItemActionIcon: 'visibility'
|
||||
// };
|
||||
// }
|
||||
// });
|
||||
// }
|
||||
onPreviewTemplate(event, sectionIndex: number) {
|
||||
const dialogRef = this.dialog.open(DatasetPreviewDialogComponent, {
|
||||
width: '590px',
|
||||
minHeight: '200px',
|
||||
restoreFocus: false,
|
||||
data: {
|
||||
template: event
|
||||
},
|
||||
panelClass: 'custom-modalbox'
|
||||
});
|
||||
dialogRef.afterClosed().pipe(takeUntil(this._destroyed)).subscribe(result => {
|
||||
if (result) {
|
||||
const profile: DescriptionTemplatesInSectionEditor = new DescriptionTemplatesInSectionEditor();
|
||||
profile.id = Guid.create().toString();
|
||||
profile.descriptionTemplateId = event.id;
|
||||
profile.label = event.label;
|
||||
this.descriptionTemplatesArray(sectionIndex).push(profile.buildForm());
|
||||
|
||||
const items = this.descriptionTemplatesPerSection[sectionIndex];
|
||||
items.push({id: event.id, label: event.label, description: ""});
|
||||
this.descriptionTemplatesPerSection[sectionIndex] = [...items];
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
onOptionSelected(item, sectionIndex){
|
||||
const profile: DescriptionTemplatesInSectionEditor = new DescriptionTemplatesInSectionEditor();
|
||||
|
@ -553,6 +578,7 @@ export class DmpProfileEditorComponent extends BaseComponent implements AfterVie
|
|||
.subscribe(
|
||||
confirmed =>{
|
||||
if(confirmed){
|
||||
if(this.formGroup.get('status').value == DmpProfileStatus.Draft) {
|
||||
this.formGroup.get('status').setValue(DmpProfileStatus.Deleted);
|
||||
this.dmpProfileService.createBlueprint(this.formGroup.value)
|
||||
.pipe(takeUntil(this._destroyed))
|
||||
|
@ -561,6 +587,21 @@ export class DmpProfileEditorComponent extends BaseComponent implements AfterVie
|
|||
error => this.onCallbackError(error)
|
||||
);
|
||||
}
|
||||
else {
|
||||
this.dmpProfileService.delete(this.dmpProfileId)
|
||||
.pipe(takeUntil(this._destroyed))
|
||||
.subscribe(
|
||||
complete => this.onCallbackSuccess(),
|
||||
error => {
|
||||
if (error.error.statusCode == 674) {
|
||||
this.uiNotificationService.snackBarNotification(this.language.instant('GENERAL.SNACK-BAR.UNSUCCESSFUL-DMP-BLUEPRINT-DELETE'), SnackBarNotificationLevel.Error);
|
||||
} else {
|
||||
this.uiNotificationService.snackBarNotification(this.language.instant(error.message), SnackBarNotificationLevel.Error);
|
||||
}
|
||||
}
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
)
|
||||
|
||||
|
|
|
@ -1,11 +1,23 @@
|
|||
<div class="dmp-criteria">
|
||||
<div class="row justify-content-end">
|
||||
<div class="col-auto search-container">
|
||||
<div class="row align-items-end">
|
||||
<div class="col-auto">
|
||||
<div class="d-lg-inline-block pr-2 text-muted">
|
||||
<span>{{'CRITERIA.USERS.SHOW' | translate}}:</span>
|
||||
</div>
|
||||
|
||||
<mat-form-field class="status-form-field">
|
||||
<mat-select [(ngModel)]="criteria.status" (ngModelChange)="controlModified()" placeholder=" {{'CRITERIA.BLUEPRINT.STATUS' | translate}}">
|
||||
<mat-option [value]="null">{{'BLUEPRINT-STATUS.NONE' | translate}}</mat-option>
|
||||
<mat-option [value]="0">{{'BLUEPRINT-STATUS.DRAFT' | translate}}</mat-option>
|
||||
<mat-option [value]="1">{{'BLUEPRINT-STATUS.FINALIZED' | translate}}</mat-option>
|
||||
</mat-select>
|
||||
</mat-form-field>
|
||||
|
||||
</div>
|
||||
<div class="col-auto ml-lg-auto">
|
||||
<mat-form-field class="search-form-field">
|
||||
<input matInput placeholder=" {{'CRITERIA.DMP.LIKE'| translate}}" name="grantCriteriaLike"
|
||||
<input matInput placeholder=" {{'CRITERIA.BLUEPRINT.LIKE'| translate}}" name="dmpBlueprintLike"
|
||||
[(ngModel)]="criteria.like" (ngModelChange)="controlModified()">
|
||||
<mat-icon matPrefix>search</mat-icon>
|
||||
</mat-form-field>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
|
|
@ -1,13 +1,17 @@
|
|||
.mat-form-field{
|
||||
display: inline-block !important;
|
||||
}
|
||||
|
||||
:host ::ng-deep .status-form-field .mat-form-field-wrapper {
|
||||
background-color: white !important;
|
||||
padding-bottom: 0 !important;
|
||||
}
|
||||
|
||||
:host ::ng-deep .search-form-field .mat-form-field-wrapper {
|
||||
background-color: white !important;
|
||||
padding-bottom: 0 !important;
|
||||
}
|
||||
:host ::ng-deep .search-container .mat-form-field-appearance-outline .mat-form-field-infix {
|
||||
|
||||
:host ::ng-deep .mat-form-field-appearance-outline .mat-form-field-infix {
|
||||
padding: 0.3rem 0rem 0.6rem 0rem !important;
|
||||
}
|
||||
|
||||
.dmp-criteria{
|
||||
margin-top: 3em;
|
||||
margin-bottom: 0em;
|
||||
}
|
|
@ -1,14 +1,10 @@
|
|||
import { Component, Input, OnInit } from '@angular/core';
|
||||
import { MatDialog } from '@angular/material/dialog';
|
||||
import { GrantListingModel } from '@app/core/model/grant/grant-listing';
|
||||
import { DmpCriteria } from '@app/core/query/dmp/dmp-criteria';
|
||||
import { DmpProfileCriteria } from '@app/core/query/dmp/dmp-profile-criteria';
|
||||
import { DmpBlueprintCriteria } from '@app/core/query/dmp/dmp-blueprint-criteria';
|
||||
import { DmpProfileService } from '@app/core/services/dmp/dmp-profile.service';
|
||||
import { DialodConfirmationUploadDmpProfiles } from '@app/ui/admin/dmp-profile/listing/criteria/dialog-confirmation-upload-profile/dialog-confirmation-upload-profiles.component';
|
||||
import { BaseCriteriaComponent } from '@app/ui/misc/criteria/base-criteria.component';
|
||||
import { ValidationErrorModel } from '@common/forms/validation/error-model/validation-error-model';
|
||||
import { TranslateService } from '@ngx-translate/core';
|
||||
import { takeUntil } from 'rxjs/operators';
|
||||
|
||||
@Component({
|
||||
selector: 'app-dmp-profile-criteria-component',
|
||||
|
@ -17,11 +13,8 @@ import { takeUntil } from 'rxjs/operators';
|
|||
})
|
||||
export class DmpProfileCriteriaComponent extends BaseCriteriaComponent implements OnInit {
|
||||
|
||||
@Input()
|
||||
showGrant: boolean;
|
||||
public criteria: DmpProfileCriteria = new DmpProfileCriteria();
|
||||
filteringGrantsAsync = false;
|
||||
filteredGrants: GrantListingModel[];
|
||||
public criteria: DmpBlueprintCriteria = new DmpBlueprintCriteria();
|
||||
|
||||
constructor(
|
||||
private dmpProfileService: DmpProfileService,
|
||||
private dialog: MatDialog,
|
||||
|
@ -32,10 +25,10 @@ export class DmpProfileCriteriaComponent extends BaseCriteriaComponent implement
|
|||
|
||||
ngOnInit() {
|
||||
super.ngOnInit();
|
||||
if (this.criteria == null) { this.criteria = new DmpCriteria(); }
|
||||
if (this.criteria == null) { this.criteria = new DmpBlueprintCriteria(); }
|
||||
}
|
||||
|
||||
setCriteria(criteria: DmpProfileCriteria): void {
|
||||
setCriteria(criteria: DmpBlueprintCriteria): void {
|
||||
this.criteria = criteria;
|
||||
}
|
||||
|
||||
|
|
|
@ -19,9 +19,14 @@
|
|||
</div>
|
||||
</div>
|
||||
|
||||
<div class="row">
|
||||
<div class="col-12 mt-5">
|
||||
<app-dmp-profile-criteria-component></app-dmp-profile-criteria-component>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="mat-elevation-z6">
|
||||
<mat-table [dataSource]="dataSource" matSort (matSortChange)="refresh()">
|
||||
<mat-table [dataSource]="dataSource" matSort (matSortChange)="refresh()" matSortActive="created" matSortDirection="desc">
|
||||
|
||||
<!-- Column Definition: Name -->
|
||||
<ng-container cdkColumnDef="label">
|
||||
|
@ -30,6 +35,13 @@
|
|||
<mat-cell *matCellDef="let row">{{row.label}}</mat-cell>
|
||||
</ng-container>
|
||||
|
||||
<!-- Column Definition: Created -->
|
||||
<ng-container cdkColumnDef="created">
|
||||
<mat-header-cell *matHeaderCellDef mat-sort-header="created">
|
||||
{{'DMP-PROFILE-LISTING.COLUMNS.CREATED' | translate}}</mat-header-cell>
|
||||
<mat-cell *matCellDef="let row">{{row.created | date:'short'}}</mat-cell>
|
||||
</ng-container>
|
||||
|
||||
<!-- Column Definition: status -->
|
||||
<ng-container cdkColumnDef="status">
|
||||
<mat-header-cell *matHeaderCellDef mat-sort-header="status">
|
||||
|
@ -41,14 +53,29 @@
|
|||
</mat-cell>
|
||||
</ng-container>
|
||||
|
||||
<!-- Column Definition: Created -->
|
||||
<ng-container cdkColumnDef="created">
|
||||
<mat-header-cell *matHeaderCellDef mat-sort-header="created">
|
||||
{{'DMP-PROFILE-LISTING.COLUMNS.CREATED' | translate}}</mat-header-cell>
|
||||
<mat-cell *matCellDef="let row">{{row.created | date:'shortDate'}}</mat-cell>
|
||||
</ng-container>
|
||||
|
||||
<!-- Column Definition: Submission Time -->
|
||||
<ng-container cdkColumnDef="actions">
|
||||
<mat-header-cell *matHeaderCellDef><!-- {{'DATASET-PROFILE-LISTING.COLUMNS.ACTIONS' | translate}} -->
|
||||
</mat-header-cell>
|
||||
<mat-cell *matCellDef="let row" (click)="$event.stopPropagation()">
|
||||
<mat-menu #actionsMenu="matMenu">
|
||||
<button mat-menu-item (click)="clone(row.id)">
|
||||
<mat-icon>filter_none</mat-icon>{{'DMP-PROFILE-LISTING.ACTIONS.CLONE' | translate}}
|
||||
</button>
|
||||
<button mat-menu-item (click)="downloadXML(row.id)" *ngIf="row.status === dmpBlueprintStatus.Finalized">
|
||||
<mat-icon>download</mat-icon>
|
||||
{{'DMP-PROFILE-LISTING.ACTIONS.DOWNLOAD-XML' | translate}}
|
||||
</button>
|
||||
<button mat-menu-item (click)="deleteTemplate(row.id)">
|
||||
<mat-icon>delete</mat-icon>
|
||||
{{'DMP-PROFILE-LISTING.ACTIONS.DELETE' | translate}}
|
||||
</button>
|
||||
</mat-menu>
|
||||
<button mat-icon-button [matMenuTriggerFor]="actionsMenu">
|
||||
<mat-icon>more_horiz</mat-icon>
|
||||
</button>
|
||||
</mat-cell>
|
||||
</ng-container>
|
||||
|
||||
<mat-header-row *matHeaderRowDef="displayedColumns"></mat-header-row>
|
||||
<mat-row *matRowDef="let row; columns: displayedColumns" (click)="rowClick(row.id)"></mat-row>
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
|
||||
import { DataSource } from '@angular/cdk/table';
|
||||
import { HttpClient } from '@angular/common/http';
|
||||
import { HttpClient, HttpErrorResponse } from '@angular/common/http';
|
||||
import { Component, OnInit, ViewChild } from '@angular/core';
|
||||
import { MatDialog } from '@angular/material/dialog';
|
||||
import { MatPaginator, PageEvent } from '@angular/material/paginator';
|
||||
|
@ -21,6 +21,11 @@ import { TranslateService } from '@ngx-translate/core';
|
|||
import { merge as observableMerge, Observable, of as observableOf } from 'rxjs';
|
||||
import { map, startWith, switchMap, takeUntil } from 'rxjs/operators';
|
||||
import { DialodConfirmationUploadDmpProfiles } from './criteria/dialog-confirmation-upload-profile/dialog-confirmation-upload-profiles.component';
|
||||
import { DmpBlueprintCriteria } from '@app/core/query/dmp/dmp-blueprint-criteria';
|
||||
import { DmpBlueprintListing } from '@app/core/model/dmp/dmp-blueprint/dmp-blueprint-listing';
|
||||
import { DmpProfileStatus } from '@app/core/common/enum/dmp-profile-status';
|
||||
import * as FileSaver from 'file-saver';
|
||||
import { ConfirmationDialogComponent } from '@common/modules/confirmation-dialog/confirmation-dialog.component';
|
||||
|
||||
|
||||
@Component({
|
||||
|
@ -35,11 +40,12 @@ export class DmpProfileListingComponent extends BaseComponent implements OnInit
|
|||
@ViewChild(DmpProfileCriteriaComponent, { static: true }) criteria: DmpProfileCriteriaComponent;
|
||||
|
||||
dataSource: DatasetDataSource | null;
|
||||
displayedColumns: String[] = ['label', 'status', 'created'];
|
||||
displayedColumns: String[] = ['label', 'created', 'status', 'actions'];
|
||||
pageEvent: PageEvent;
|
||||
titlePrefix: String;
|
||||
dmpId: String;
|
||||
breadCrumbs: Observable<BreadcrumbItem[]>;
|
||||
dmpBlueprintStatus = DmpProfileStatus;
|
||||
|
||||
statuses = [
|
||||
{ value: '0', viewValue: 'DMP-PROFILE-LISTING.STATUS.DRAFT' },// active
|
||||
|
@ -81,12 +87,81 @@ export class DmpProfileListingComponent extends BaseComponent implements OnInit
|
|||
this.dataSource = new DatasetDataSource(this.dmpProfileService, this._paginator, this.sort, this.criteria);
|
||||
}
|
||||
|
||||
clone(id: string) {
|
||||
this.router.navigate(['dmp-profiles/clone/' + id]);
|
||||
}
|
||||
|
||||
rowClick(rowId: String) {
|
||||
this.router.navigate(['dmp-profiles/' + rowId]);
|
||||
}
|
||||
|
||||
getDefaultCriteria(): DmpProfileCriteria {
|
||||
const defaultCriteria = new DmpProfileCriteria();
|
||||
downloadXML(dmpProfileId: string): void {
|
||||
this.dmpProfileService.downloadXML(dmpProfileId)
|
||||
.pipe(takeUntil(this._destroyed))
|
||||
.subscribe(response => {
|
||||
const blob = new Blob([response.body], { type: 'application/xml' });
|
||||
const filename = this.getFilenameFromContentDispositionHeader(response.headers.get('Content-Disposition'));
|
||||
FileSaver.saveAs(blob, filename);
|
||||
});
|
||||
}
|
||||
getFilenameFromContentDispositionHeader(header: string): string {
|
||||
const regex: RegExp = new RegExp(/filename[^;=\n]*=((['"]).*?\2|[^;\n]*)/g);
|
||||
|
||||
const matches = header.match(regex);
|
||||
let filename: string;
|
||||
for (let i = 0; i < matches.length; i++) {
|
||||
const match = matches[i];
|
||||
if (match.includes('filename="')) {
|
||||
filename = match.substring(10, match.length - 1);
|
||||
break;
|
||||
} else if (match.includes('filename=')) {
|
||||
filename = match.substring(9);
|
||||
break;
|
||||
}
|
||||
}
|
||||
return filename;
|
||||
}
|
||||
|
||||
deleteTemplate(id: string) {
|
||||
if (id) {
|
||||
this.dialog.open(ConfirmationDialogComponent,{data:{
|
||||
isDeleteConfirmation: true,
|
||||
confirmButton: this.languageService.instant('DMP-PROFILE-EDITOR.CONFIRM-DELETE-DIALOG.CONFIRM-BUTTON'),
|
||||
cancelButton: this.languageService.instant("DMP-PROFILE-EDITOR.CONFIRM-DELETE-DIALOG.CANCEL-BUTTON"),
|
||||
message: this.languageService.instant("DMP-PROFILE-EDITOR.CONFIRM-DELETE-DIALOG.MESSAGE")
|
||||
}})
|
||||
.afterClosed()
|
||||
.subscribe(
|
||||
confirmed =>{
|
||||
if(confirmed){
|
||||
this.dmpProfileService.delete(id)
|
||||
.pipe(takeUntil(this._destroyed))
|
||||
.subscribe(
|
||||
complete => {
|
||||
this.uiNotificationService.snackBarNotification(this.languageService.instant('GENERAL.SNACK-BAR.SUCCESSFUL-DMP-BLUEPRINT-DELETE'), SnackBarNotificationLevel.Success);
|
||||
this.refresh();
|
||||
},
|
||||
error => {
|
||||
this.onCallbackError(error);
|
||||
if (error.error.statusCode == 674) {
|
||||
this.uiNotificationService.snackBarNotification(this.languageService.instant('GENERAL.SNACK-BAR.UNSUCCESSFUL-DMP-BLUEPRINT-DELETE'), SnackBarNotificationLevel.Error);
|
||||
} else {
|
||||
this.uiNotificationService.snackBarNotification(this.languageService.instant(error.message), SnackBarNotificationLevel.Error);
|
||||
}
|
||||
}
|
||||
);
|
||||
}
|
||||
}
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
onCallbackError(errorResponse: HttpErrorResponse) {
|
||||
this.uiNotificationService.snackBarNotification(errorResponse.message, SnackBarNotificationLevel.Warning);
|
||||
}
|
||||
|
||||
getDefaultCriteria(): DmpBlueprintCriteria {
|
||||
const defaultCriteria = new DmpBlueprintCriteria();
|
||||
return defaultCriteria;
|
||||
}
|
||||
|
||||
|
@ -142,7 +217,7 @@ export class DmpProfileListingComponent extends BaseComponent implements OnInit
|
|||
}
|
||||
}
|
||||
|
||||
export class DatasetDataSource extends DataSource<DmpProfileListing> {
|
||||
export class DatasetDataSource extends DataSource<DmpBlueprintListing> {
|
||||
|
||||
totalCount = 0;
|
||||
|
||||
|
@ -156,7 +231,7 @@ export class DatasetDataSource extends DataSource<DmpProfileListing> {
|
|||
|
||||
}
|
||||
|
||||
connect(): Observable<DmpProfileListing[]> {
|
||||
connect(): Observable<DmpBlueprintListing[]> {
|
||||
const displayDataChanges = [
|
||||
this._paginator.page
|
||||
//this._sort.matSortChange
|
||||
|
@ -168,9 +243,9 @@ export class DatasetDataSource extends DataSource<DmpProfileListing> {
|
|||
const startIndex = this._paginator.pageIndex * this._paginator.pageSize;
|
||||
let fields: Array<string> = new Array();
|
||||
if (this._sort.active) { fields = this._sort.direction === 'asc' ? ['+' + this._sort.active] : ['-' + this._sort.active]; }
|
||||
const request = new DataTableRequest<DmpProfileCriteria>(startIndex, this._paginator.pageSize, { fields: fields });
|
||||
const request = new DataTableRequest<DmpBlueprintCriteria>(startIndex, this._paginator.pageSize, { fields: fields });
|
||||
request.criteria = this._criteria.criteria;
|
||||
return this._service.getPaged(request);
|
||||
return this._service.getPagedBlueprint(request);
|
||||
}),
|
||||
/*.catch((error: any) => {
|
||||
this._snackBar.openFromComponent(SnackBarNotificationComponent, {
|
||||
|
|
|
@ -3,6 +3,26 @@
|
|||
<div *ngIf="this.dashboardStatisticsData">
|
||||
<div class="main-content">
|
||||
<div class="col">
|
||||
<div class="row">
|
||||
<div *ngIf="newReleaseNotificationVisible" class="new-releases-card col-auto mt-0 mr-4" [style.display]="isVisible ? 'block' : 'none'">
|
||||
<a class="col-auto d-flex" (click)="dismissNewReleaseNotification()"><span class="ml-auto mt-3 material-icons clear-icon">clear</span></a>
|
||||
<div class="row new-releases-hint-container m-0">
|
||||
<p class="new-releases-chip mb-0 col-auto">{{'NEW-RELEASE-NOTIFICATION.HINT' | translate}}</p>
|
||||
</div>
|
||||
<p class="new-releases-title mb-0 pt-4">{{'NEW-RELEASE-NOTIFICATION.TITLE' | translate}}</p>
|
||||
<p class="new-releases-content mb-0">{{'NEW-RELEASE-NOTIFICATION.BODY' | translate}}</p>
|
||||
|
||||
<div class="row d-flex align-items-center mt-4" *ngIf="this.configurationService.newReleaseNotificationLink">
|
||||
<div class="col-auto d-flex">
|
||||
<a class="notification-link" href="{{this.configurationService.newReleaseNotificationLink}}" target="_blank">
|
||||
<button mat-raised-button type="button" class="col-auto align-self-center new-releases-btn">{{'NEW-RELEASE-NOTIFICATION.ACTIONS.LEARN-MORE' | translate}}</button>
|
||||
</a>
|
||||
</div>
|
||||
<span class="new-releases-logo">
|
||||
<img src="../../../assets/images/new-releases-logo.png">
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="card col-auto mt-0" [style.display]="isVisible ? 'block' : 'none'">
|
||||
<a *ngIf="this.hasDmps()" class="col-auto d-flex" (click)="closeCard()"><span class="ml-auto mt-3 material-icons clear-icon">clear</span></a>
|
||||
|
||||
|
@ -29,11 +49,11 @@
|
|||
</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div *ngIf="this.hasDmps()" class="col">
|
||||
<div class="latest-activity-title">{{'DASHBOARD.LATEST-ACTIVITY' | translate}}</div>
|
||||
<mat-tab-group mat-align-tabs="start" class="remove-border-bottom"
|
||||
[selectedIndex]="indexFromCurrentType" (selectedTabChange)="currentType = $event.tab.ariaLabel">
|
||||
<mat-tab-group mat-align-tabs="start" class="remove-border-bottom" [selectedIndex]="indexFromCurrentType" (selectedTabChange)="currentType = $event.tab.ariaLabel">
|
||||
<!-- <mat-tab aria-label="recent" label="{{'DASHBOARD.ALL' | translate}} ({{totalRecents}})">-->
|
||||
<mat-tab aria-label="recent" label="{{'DASHBOARD.ALL' | translate}}">
|
||||
<app-recent-edited-activity (totalCountRecentEdited)="onCountAllRecent($event)" [isActive]="currentType == 'recent'"></app-recent-edited-activity>
|
||||
|
@ -129,8 +149,7 @@
|
|||
</div>
|
||||
<div *ngIf="hasDmps()" class="col activity">
|
||||
<div class="latest-activity-title">{{'DASHBOARD.LATEST-ACTIVITY' | translate}}</div>
|
||||
<mat-tab-group mat-align-tabs="start" class="remove-border-bottom" (
|
||||
[selectedIndex]="indexFromCurrentType" selectedTabChange)="currentType = $event.tab.ariaLabel">
|
||||
<mat-tab-group mat-align-tabs="start" class="remove-border-bottom" ( [selectedIndex]="indexFromCurrentType" selectedTabChange)="currentType = $event.tab.ariaLabel">
|
||||
<!-- <mat-tab aria-label="recent" label="{{'DASHBOARD.ALL' | translate}} ({{totalRecents}})">-->
|
||||
<mat-tab aria-label="recent" label="{{'DASHBOARD.ALL' | translate}}">
|
||||
<app-recent-edited-activity (totalCountRecentEdited)="onCountAllRecent($event)" [isActive]="currentType == 'recent'"></app-recent-edited-activity>
|
||||
|
|
|
@ -425,6 +425,87 @@ input[type="text"] {
|
|||
padding: 0.3rem 0rem 0.6rem 0rem !important;
|
||||
}
|
||||
|
||||
.new-releases-hint-container {
|
||||
padding-left: 40px;
|
||||
/* padding-top: 40px; */
|
||||
padding-right: 55px;
|
||||
}
|
||||
|
||||
.new-releases-card {
|
||||
box-shadow: 0px 3px 6px #00000029;
|
||||
max-width: 712px;
|
||||
min-width: 17.5rem;
|
||||
margin-top: 0rem;
|
||||
margin-bottom: 3.75rem;
|
||||
|
||||
background: transparent linear-gradient(127deg, #EDAEB3 0%, #E1368A 100%) 0% 0% no-repeat padding-box;
|
||||
border-radius: 6px;
|
||||
opacity: 1;
|
||||
padding-bottom: 2em;
|
||||
}
|
||||
|
||||
.new-releases-btn {
|
||||
height: 40px;
|
||||
margin-left: 40px;
|
||||
|
||||
background: var(--primary-color) 0% 0% no-repeat padding-box;
|
||||
border-radius: 30px;
|
||||
opacity: 1;
|
||||
color: #FFFFFF;
|
||||
padding-right: 2em;
|
||||
padding-left: 2em;
|
||||
}
|
||||
|
||||
.new-releases-chip {
|
||||
// margin-bottom: 1em;
|
||||
// margin-left: 2.5em;
|
||||
// margin-right: 2.5em;
|
||||
color: #fff;
|
||||
/* text-transform: uppercase; */
|
||||
text-align: center;
|
||||
font-weight: 500;
|
||||
/* max-width: 160px; */
|
||||
white-space: nowrap;
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
background: #EAEAEA 0% 0% no-repeat padding-box;
|
||||
border-radius: 30px;
|
||||
opacity: 0.7;
|
||||
/* font: normal normal bold 12px/21px Aileron; */
|
||||
letter-spacing: 0.12px;
|
||||
color: #6E6E6E;
|
||||
}
|
||||
|
||||
.new-releases-title {
|
||||
text-align: left;
|
||||
font: Bold 30px/34px Roboto;
|
||||
letter-spacing: 0px;
|
||||
color: #212121;
|
||||
padding-left: 40px;
|
||||
/* padding-top: 40px; */
|
||||
padding-right: 55px;
|
||||
opacity: 1;
|
||||
}
|
||||
|
||||
.new-releases-content {
|
||||
text-align: left;
|
||||
font-weight: 300;
|
||||
font-size: 1rem;
|
||||
letter-spacing: 0px;
|
||||
color: #212121;
|
||||
padding-left: 40px;
|
||||
font: normal normal normal 16px/24px Roboto;
|
||||
padding-top: 36px;
|
||||
padding-right: 55px;
|
||||
opacity: 1;
|
||||
}
|
||||
|
||||
.new-releases-logo {
|
||||
position: absolute;
|
||||
right: 0;
|
||||
bottom: 0;
|
||||
}
|
||||
|
||||
/* ::ng-deep .mat-tab-group {
|
||||
height: 100%;
|
||||
}
|
||||
|
|
|
@ -35,6 +35,9 @@ import { UiNotificationService, SnackBarNotificationLevel } from '@app/core/serv
|
|||
import { GuidedTourService } from '@app/library/guided-tour/guided-tour.service';
|
||||
import { GuidedTour, Orientation } from '@app/library/guided-tour/guided-tour.constants';
|
||||
import { MatomoService } from '@app/core/services/matomo/matomo-service';
|
||||
import { ConfigurationService } from '@app/core/services/configuration/configuration.service';
|
||||
import * as moment from 'moment';
|
||||
import { CookieService } from 'ngx-cookie-service';
|
||||
|
||||
|
||||
@Component({
|
||||
|
@ -73,6 +76,7 @@ export class DashboardComponent extends BaseComponent implements OnInit, IBreadC
|
|||
importFileText: string;
|
||||
startWizardText: string;
|
||||
currentType: string = "recent";
|
||||
newReleaseNotificationVisible = false;
|
||||
|
||||
constructor(
|
||||
private router: Router,
|
||||
|
@ -89,7 +93,9 @@ export class DashboardComponent extends BaseComponent implements OnInit, IBreadC
|
|||
private language: TranslateService,
|
||||
private uiNotificationService: UiNotificationService,
|
||||
private guidedTourService: GuidedTourService,
|
||||
private matomoService: MatomoService
|
||||
private matomoService: MatomoService,
|
||||
private cookieService: CookieService,
|
||||
public configurationService: ConfigurationService
|
||||
) {
|
||||
super();
|
||||
// this.dashboardStatisticsData.totalDataManagementPlanCount = 0;
|
||||
|
@ -154,6 +160,8 @@ export class DashboardComponent extends BaseComponent implements OnInit, IBreadC
|
|||
this.filteredOptions = this.searchControl.valueChanges.pipe(mergeMap(x => {
|
||||
return this.searchBarService.search(x);
|
||||
}));
|
||||
|
||||
this.newReleaseNotificationVisible = this.isNewReleaseNotificationVisible();
|
||||
}
|
||||
|
||||
public get indexFromCurrentType() {
|
||||
|
@ -400,4 +408,26 @@ export class DashboardComponent extends BaseComponent implements OnInit, IBreadC
|
|||
// viewAllPublicDatasetsClicked() {
|
||||
// this.router.navigate(['explore']);
|
||||
// }
|
||||
|
||||
dismissNewReleaseNotification() {
|
||||
this.cookieService.set('new-release-dismiss-' + this.configurationService.newReleaseNotificationVersionCode, 'true', 5000, null, null, false, 'Lax');
|
||||
this.newReleaseNotificationVisible = false;
|
||||
}
|
||||
|
||||
isNewReleaseNotificationVisible() {
|
||||
if (this.configurationService.newReleaseNotificationVersionCode == null) {
|
||||
return false;
|
||||
}
|
||||
if (this.configurationService.newReleaseNotificationExpires == null && this.configurationService.newReleaseNotificationLink == null) {
|
||||
return false;
|
||||
}
|
||||
if (this.configurationService.newReleaseNotificationExpires != null && moment(this.configurationService.newReleaseNotificationExpires).tz('UTC') < moment.utc()) {
|
||||
return false;
|
||||
}
|
||||
if (this.cookieService.get('new-release-dismiss-' + this.configurationService.newReleaseNotificationVersionCode) === 'true') {
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -74,7 +74,7 @@ export class DatasetCopyDialogueComponent {
|
|||
map(result => {
|
||||
this.dmpModel = result
|
||||
this.dmpModel.profiles.forEach((element) => {
|
||||
if (element.id == this.data.datasetProfileId) {
|
||||
if (element.descriptionTemplateId == this.data.datasetProfileId) {
|
||||
this.data.datasetProfileExist = true;
|
||||
}
|
||||
})
|
||||
|
|
|
@ -64,7 +64,7 @@
|
|||
<mat-form-field>
|
||||
<mat-select placeholder="{{'DATASET-WIZARD.FIRST-STEP.PROFILE'| translate}}" [required]="true" [compareWith]="compareWith" formControlName="profile">
|
||||
<mat-option *ngFor="let profile of availableProfiles" [value]="profile">
|
||||
<div (click)="checkMinMax($event, profile)">
|
||||
<div>
|
||||
{{profile.label}}
|
||||
</div>
|
||||
</mat-option>
|
||||
|
|
|
@ -49,8 +49,13 @@ export class DatasetEditorComponent extends BaseComponent {
|
|||
]
|
||||
};
|
||||
|
||||
checkMinMax(event, profile: DatasetProfileModel) {
|
||||
event.stopPropagation();
|
||||
ngOnInit() {
|
||||
this.formGroup.get('profile').valueChanges.pipe(takeUntil(this._destroyed)).subscribe(x => {
|
||||
this.checkMinMax(x);
|
||||
});
|
||||
}
|
||||
|
||||
checkMinMax(profile: DatasetProfileModel) {
|
||||
const dmpSectionIndex = this.formGroup.get('dmpSectionIndex').value;
|
||||
const blueprintId = this.formGroup.get('dmp').value.profile.id;
|
||||
this.dmpProfileService.getSingleBlueprint(blueprintId)
|
||||
|
@ -70,22 +75,14 @@ export class DatasetEditorComponent extends BaseComponent {
|
|||
if (count === foundTemplate.maxMultiplicity) {
|
||||
this.dialog.open(PopupNotificationDialogComponent, {
|
||||
data: {
|
||||
title: 'Max datasets using this template.',
|
||||
message: 'Select another profile.'
|
||||
title: this.language.instant('DATASET-EDITOR.MAX-DESCRIPTION-DIALOG.TITLE'),
|
||||
message: this.language.instant('DATASET-EDITOR.MAX-DESCRIPTION-DIALOG.MESSAGE')
|
||||
}, maxWidth: '30em'
|
||||
});
|
||||
}
|
||||
else{
|
||||
this.formGroup.get('profile').setValue(profile);
|
||||
this.formGroup.get('profile').reset();
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
this.formGroup.get('profile').setValue(profile);
|
||||
}
|
||||
}
|
||||
else {
|
||||
this.formGroup.get('profile').setValue(profile);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
|
|
@ -63,6 +63,9 @@ import {PrefillDatasetComponent} from "@app/ui/dataset/dataset-wizard/prefill-da
|
|||
import { ToCEntry, ToCEntryType } from "@app/ui/misc/dataset-description-form/dataset-description.component";
|
||||
import { dispatchFakeEvent } from "@angular/cdk/testing/testbed/fake-events";
|
||||
import { DmpDatasetProfile } from '@app/core/model/dmp/dmp-dataset-profile/dmp-dataset-profile';
|
||||
import { DmpProfileService } from '@app/core/services/dmp/dmp-profile.service';
|
||||
import { DatasetService } from '@app/core/services/dataset/dataset.service';
|
||||
import { DatasetCriteria } from '@app/core/query/dataset/dataset-criteria';
|
||||
|
||||
@Component({
|
||||
selector: 'app-dataset-wizard-component',
|
||||
|
@ -98,6 +101,7 @@ export class DatasetWizardComponent extends CheckDeactivateBaseComponent impleme
|
|||
dmpId: string;
|
||||
dmpSectionIndex: number;
|
||||
availableDescriptionTemplates: DatasetProfileModel[] = [];
|
||||
availableDescriptionTemplatesForPrefilling: DatasetProfileModel[] = [];
|
||||
newDmpId: string;
|
||||
publicId: string;
|
||||
profileUpdateId: string;
|
||||
|
@ -127,12 +131,14 @@ export class DatasetWizardComponent extends CheckDeactivateBaseComponent impleme
|
|||
|
||||
constructor(
|
||||
private datasetWizardService: DatasetWizardService,
|
||||
private datasetService: DatasetService,
|
||||
private route: ActivatedRoute,
|
||||
public snackBar: MatSnackBar,
|
||||
public router: Router,
|
||||
public language: TranslateService,
|
||||
public externalSourcesService: ExternalSourcesService,
|
||||
public dmpService: DmpService,
|
||||
private dmpProfileService: DmpProfileService,
|
||||
public dialog: MatDialog,
|
||||
public externalSourcesConfigurationService: ExternalSourcesConfigurationService,
|
||||
private uiNotificationService: UiNotificationService,
|
||||
|
@ -199,6 +205,7 @@ export class DatasetWizardComponent extends CheckDeactivateBaseComponent impleme
|
|||
this.lockService.checkLockStatus(data.id).pipe(takeUntil(this._destroyed)).subscribe(lockStatus => {
|
||||
this.lockStatus = lockStatus;
|
||||
this.datasetWizardModel = new DatasetWizardEditorModel().fromModel(data);
|
||||
this.dmpSectionIndex = this.datasetWizardModel.dmpSectionIndex;
|
||||
this.needsUpdate();
|
||||
this.breadCrumbs = observableOf([
|
||||
{
|
||||
|
@ -216,7 +223,7 @@ export class DatasetWizardComponent extends CheckDeactivateBaseComponent impleme
|
|||
this.formGroup = this.datasetWizardModel.buildForm();
|
||||
let profiles = this.datasetWizardModel.dmp.profiles.filter(profile => profile.data.dmpSectionIndex.includes(this.datasetWizardModel.dmpSectionIndex));
|
||||
for (var profile of profiles) {
|
||||
this.availableDescriptionTemplates.push({id: profile.descriptionTemplateId, label: profile.label, description: ""})
|
||||
this.addToAvailableDescriptionTemplates(this.availableDescriptionTemplates, { id: profile.descriptionTemplateId, label: profile.label, description: "" });
|
||||
}
|
||||
this.formGroupRawValue = JSON.parse(JSON.stringify(this.formGroup.getRawValue()));
|
||||
this.editMode = this.datasetWizardModel.status === DatasetStatus.Draft;
|
||||
|
@ -278,17 +285,33 @@ export class DatasetWizardComponent extends CheckDeactivateBaseComponent impleme
|
|||
this.formGroup = this.datasetWizardModel.buildForm();
|
||||
let profiles = this.datasetWizardModel.dmp.profiles.filter(profile => profile.data.dmpSectionIndex.includes(this.dmpSectionIndex));
|
||||
for (var profile of profiles) {
|
||||
this.availableDescriptionTemplates.push({id: profile.descriptionTemplateId, label: profile.label, description: ""})
|
||||
this.addToAvailableDescriptionTemplates(this.availableDescriptionTemplates, { id: profile.descriptionTemplateId, label: profile.label, description: "" });
|
||||
}
|
||||
this.formGroupRawValue = JSON.parse(JSON.stringify(this.formGroup.getRawValue()));
|
||||
this.editMode = this.datasetWizardModel.status === DatasetStatus.Draft;
|
||||
this.formGroup.get('dmp').disable();
|
||||
this.dmpProfileService.getSingleBlueprint(data.profile.id)
|
||||
.pipe(takeUntil(this._destroyed))
|
||||
.subscribe(result => {
|
||||
const request: DataTableRequest<DatasetProfileCriteria> = new DataTableRequest<DatasetProfileCriteria>(null, null, null);
|
||||
request.criteria = new DatasetProfileCriteria();
|
||||
request.criteria.ids = [];
|
||||
this.availableDescriptionTemplates.forEach(template => request.criteria.ids.push(template.id));
|
||||
this.datasetService.getDatasetProfilesWithPrefilling(request)
|
||||
.pipe(takeUntil(this._destroyed))
|
||||
.subscribe(items => {
|
||||
items.forEach(template => {
|
||||
if (template.enablePrefilling) {
|
||||
this.addToAvailableDescriptionTemplates(this.availableDescriptionTemplatesForPrefilling, { id: template.id, label: template.label, description: '' });
|
||||
}
|
||||
})
|
||||
if (this.availableDescriptionTemplatesForPrefilling.length > 0) {
|
||||
const dialogRef = this.dialog.open(PrefillDatasetComponent, {
|
||||
width: '590px',
|
||||
minHeight: '200px',
|
||||
restoreFocus: false,
|
||||
data: {
|
||||
availableProfiles: this.availableDescriptionTemplates,
|
||||
availableProfiles: this.availableDescriptionTemplatesForPrefilling,
|
||||
datasetFormGroup: this.formGroup
|
||||
},
|
||||
panelClass: 'custom-modalbox'
|
||||
|
@ -305,6 +328,9 @@ export class DatasetWizardComponent extends CheckDeactivateBaseComponent impleme
|
|||
this.registerFormListeners();
|
||||
}
|
||||
})
|
||||
}
|
||||
});
|
||||
});
|
||||
this.loadDatasetProfiles();
|
||||
this.registerFormListeners();
|
||||
// this.availableProfiles = data.profiles;
|
||||
|
@ -347,6 +373,10 @@ export class DatasetWizardComponent extends CheckDeactivateBaseComponent impleme
|
|||
this.datasetWizardModel.dmp = data;
|
||||
this.formGroup.get('dmp').setValue(this.datasetWizardModel.dmp);
|
||||
this.formGroupRawValue = JSON.parse(JSON.stringify(this.formGroup.getRawValue()));
|
||||
const descipptionTemplateiNNewDmp:DmpDatasetProfile = this.datasetWizardModel.dmp?.profiles?.find(x => x.descriptionTemplateId === this.datasetWizardModel.profile.id);
|
||||
|
||||
this.dmpSectionIndex = descipptionTemplateiNNewDmp?.data?.dmpSectionIndex?.length > 0 ? descipptionTemplateiNNewDmp?.data?.dmpSectionIndex[0] : 0;
|
||||
this.formGroup.get('dmpSectionIndex').setValue(this.dmpSectionIndex);
|
||||
|
||||
this.loadDatasetProfiles();
|
||||
this.breadCrumbs = observableOf([
|
||||
|
@ -478,6 +508,13 @@ export class DatasetWizardComponent extends CheckDeactivateBaseComponent impleme
|
|||
}
|
||||
}
|
||||
|
||||
addToAvailableDescriptionTemplates(list: DatasetProfileModel[], item: DatasetProfileModel) {
|
||||
if (list.some(x => x.id === item.id)) {
|
||||
list.splice(list.findIndex(x => x.id === item.id), 1)
|
||||
}
|
||||
list.push(item);
|
||||
}
|
||||
|
||||
// private _listenersSubscription:Subscription = new Subscription();
|
||||
registerFormListeners() {
|
||||
// const dmpSubscription =
|
||||
|
|
|
@ -27,7 +27,7 @@
|
|||
<mat-form-field class="col-md-12">
|
||||
<mat-select placeholder="{{'DATASET-CREATE-WIZARD.PREFILL-STEP.PROFILE'| translate}}" [required]="true" [compareWith]="compareWith" formControlName="profile">
|
||||
<mat-option *ngFor="let profile of data.availableProfiles" [value]="profile">
|
||||
<div (click)="checkMinMax($event, profile)">
|
||||
<div>
|
||||
{{profile.label}}
|
||||
</div>
|
||||
</mat-option>
|
||||
|
|
|
@ -11,6 +11,7 @@ import {FormBuilder, FormGroup, Validators} from "@angular/forms";
|
|||
import { DatasetProfileModel } from "@app/core/model/dataset/dataset-profile";
|
||||
import { DmpProfileService } from "@app/core/services/dmp/dmp-profile.service";
|
||||
import { PopupNotificationDialogComponent } from "@app/library/notification/popup/popup-notification.component";
|
||||
import { TranslateService } from "@ngx-translate/core";
|
||||
|
||||
@Component({
|
||||
selector: 'prefill-dataset-component',
|
||||
|
@ -28,6 +29,7 @@ export class PrefillDatasetComponent extends BaseComponent implements OnInit {
|
|||
private prefillingService: PrefillingService,
|
||||
private dmpProfileService: DmpProfileService,
|
||||
private dialog: MatDialog,
|
||||
private language: TranslateService,
|
||||
private progressIndicationService: ProgressIndicationService,
|
||||
private fb: FormBuilder,
|
||||
@Inject(MAT_DIALOG_DATA) public data: any) {
|
||||
|
@ -53,6 +55,10 @@ export class PrefillDatasetComponent extends BaseComponent implements OnInit {
|
|||
titleFn: (item) => item['name'],
|
||||
subtitleFn: (item) => item['pid']
|
||||
};
|
||||
|
||||
this.prefillForm.get('profile').valueChanges.pipe(takeUntil(this._destroyed)).subscribe(x => {
|
||||
this.checkMinMax(x);
|
||||
});
|
||||
}
|
||||
|
||||
addProfileIfUsedLessThanMax(profile: DatasetProfileModel) {
|
||||
|
@ -87,8 +93,7 @@ export class PrefillDatasetComponent extends BaseComponent implements OnInit {
|
|||
});
|
||||
}
|
||||
|
||||
checkMinMax(event, profile: DatasetProfileModel) {
|
||||
event.stopPropagation();
|
||||
checkMinMax(profile: DatasetProfileModel) {
|
||||
const dmpSectionIndex = this.data.datasetFormGroup.get('dmpSectionIndex').value;
|
||||
const blueprintId = this.data.datasetFormGroup.get('dmp').value.profile.id;
|
||||
this.dmpProfileService.getSingleBlueprint(blueprintId)
|
||||
|
@ -108,22 +113,14 @@ export class PrefillDatasetComponent extends BaseComponent implements OnInit {
|
|||
if(count === foundTemplate.maxMultiplicity){
|
||||
this.dialog.open(PopupNotificationDialogComponent, {
|
||||
data: {
|
||||
title: 'Max datasets using this template.',
|
||||
message: 'Select another profile.'
|
||||
title: this.language.instant('DATASET-EDITOR.MAX-DESCRIPTION-DIALOG.TITLE'),
|
||||
message: this.language.instant('DATASET-EDITOR.MAX-DESCRIPTION-DIALOG.MESSAGE')
|
||||
}, maxWidth: '30em'
|
||||
});
|
||||
}
|
||||
else{
|
||||
this.prefillForm.get('profile').setValue(profile);
|
||||
this.prefillForm.get('profile').reset();
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
this.prefillForm.get('profile').setValue(profile);
|
||||
}
|
||||
}
|
||||
else {
|
||||
this.prefillForm.get('profile').setValue(profile);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
|
|
@ -51,9 +51,9 @@
|
|||
</div>
|
||||
</li>
|
||||
</ol>
|
||||
<ul *ngIf="hasProfile(i)" class="add-dataset-option">
|
||||
<ul *ngIf="dmp?.id && hasProfile(i)" class="add-dataset-option">
|
||||
<li>
|
||||
<a class="add-dataset-action" (click)="addDataset(i)">
|
||||
<a class="add-dataset-action" [routerLink]="['/datasets/new/' + dmp.id + '/' + i]">
|
||||
<mat-icon>add</mat-icon>{{'DMP-LISTING.ACTIONS.ADD-DESCRIPTION-FOR-SECTION' | translate}}
|
||||
</a>
|
||||
</li>
|
||||
|
@ -83,8 +83,8 @@
|
|||
</div>
|
||||
<div class="col-auto formForStep0" id="editor-form" *ngIf="this.step === 0 && this.isNew">
|
||||
<div class="col-12 blueprint-section" [hidden]="this.step !== 0">
|
||||
<div class="input-form">
|
||||
<div class="heading2">0.1 Title of DMP *</div>
|
||||
<div class="">
|
||||
<div class="heading2">Title of DMP *</div>
|
||||
<mat-form-field>
|
||||
<mat-label>Title</mat-label>
|
||||
<input matInput type="text" name="label" [formControl]="formGroup.get('label')" required>
|
||||
|
@ -94,14 +94,14 @@
|
|||
{{'GENERAL.VALIDATION.REQUIRED' | translate}}</mat-error> -->
|
||||
</mat-form-field>
|
||||
</div>
|
||||
<div class="input-form">
|
||||
<div class="heading2">0.2 Description of DMP *</div>
|
||||
<div class="">
|
||||
<div class="heading2">Description of DMP *</div>
|
||||
<rich-text-editor-component [parentFormGroup]="formGroup" [controlName]="'description'"
|
||||
[placeholder]="'Fill with description'" [required]="true">
|
||||
</rich-text-editor-component>
|
||||
</div>
|
||||
<div class="dmp-blueprint-form" style="margin-top: 3%;">
|
||||
<div class="heading2">0.3 Blueprint of DMP *</div>
|
||||
<div class="" style="margin-top: 3%;">
|
||||
<div class="heading2">Blueprint of DMP *</div>
|
||||
<mat-form-field>
|
||||
<mat-label>Select blueprint</mat-label>
|
||||
<app-single-auto-complete [required]="false" [formControl]="formGroup.get('profile')" placeholder="Select blueprint" [configuration]="dmpBlueprintAutoCompleteConfiguration">
|
||||
|
@ -110,7 +110,7 @@
|
|||
</div>
|
||||
<div class="row">
|
||||
<div class="col-5">
|
||||
<button mat-button class="action-btn" [disabled]="selectedDmpBlueprintDefinition == null" (click)="selectBlueprint()">Next</button>
|
||||
<button mat-button class="action-btn" [disabled]="selectedDmpBlueprintDefinition == null || !(formGroup.get('label').valid && formGroup.get('description').valid)" (click)="selectBlueprint()">Next</button>
|
||||
</div>
|
||||
<div class="col-7" *ngIf="formGroup.get('profile').value == null || (formGroup.get('profile').value && formGroup.get('profile').value.id !== defaultBlueprintId)">
|
||||
<div class="row">
|
||||
|
@ -138,11 +138,11 @@
|
|||
<div *ngFor="let field of section.fields; let j=index">
|
||||
<div class="heading">{{i + 1}}.{{j + 1}} {{field.label}}<span *ngIf="field.required">*</span></div>
|
||||
<div *ngIf="field.description != null && field.description.length > 0" class="hint">{{field.description}}</div>
|
||||
<div class="input-form">
|
||||
<div class="">
|
||||
<div *ngIf="field.category === 'SYSTEM'">
|
||||
<div *ngIf="field.type == 0">
|
||||
<mat-form-field>
|
||||
<input matInput placeholder="{{'DMP-EDITOR.FIELDS.NAME' | translate}}" type="text" name="label" [formControl]="formGroup.get('label')" required>
|
||||
<input matInput placeholder="{{field?.placeholder?.length > 0 ? field.placeholder : ('DMP-EDITOR.FIELDS.NAME' | translate)}}" type="text" name="label" [formControl]="formGroup.get('label')" required>
|
||||
<mat-error *ngIf="formGroup.get('label').hasError('backendError')">
|
||||
{{formGroup.get('label').getError('backendError').message}}</mat-error>
|
||||
<mat-error *ngIf="formGroup.get('label').hasError('required')">
|
||||
|
@ -151,12 +151,12 @@
|
|||
</div>
|
||||
<div *ngIf="field.type == 1">
|
||||
<rich-text-editor-component [parentFormGroup]="formGroup" [controlName]="'description'"
|
||||
[placeholder]="'DMP-EDITOR.PLACEHOLDER.DESCRIPTION'" [required]="field.required">
|
||||
[placeholder]="field?.placeholder?.length > 0 ? field.placeholder : 'DMP-EDITOR.PLACEHOLDER.DESCRIPTION'" [required]="field.required">
|
||||
</rich-text-editor-component>
|
||||
</div>
|
||||
<div *ngIf="field.type == 2">
|
||||
<mat-form-field>
|
||||
<mat-label>{{'DMP-EDITOR.PLACEHOLDER.RESEARCHERS' | translate}}</mat-label>
|
||||
<mat-label>{{field?.placeholder?.length > 0 ? field.placeholder : ('DMP-EDITOR.PLACEHOLDER.RESEARCHERS' | translate)}}</mat-label>
|
||||
<app-multiple-auto-complete [formControl]="formGroup.get('researchers')" [configuration]="researchersAutoCompleteConfiguration">
|
||||
</app-multiple-auto-complete>
|
||||
<mat-error *ngIf="formGroup.get('researchers').hasError('backendError')">
|
||||
|
@ -174,7 +174,7 @@
|
|||
</div>
|
||||
<div *ngIf="field.type == 3">
|
||||
<mat-form-field>
|
||||
<mat-label>{{'DMP-EDITOR.PLACEHOLDER.ORGANIZATION' | translate}}</mat-label>
|
||||
<mat-label>{{field?.placeholder?.length > 0 ? field.placeholder : ('DMP-EDITOR.PLACEHOLDER.ORGANIZATION' | translate)}}</mat-label>
|
||||
<app-multiple-auto-complete [formControl]="formGroup.get('organisations')" [configuration]="organisationsAutoCompleteConfiguration">
|
||||
</app-multiple-auto-complete>
|
||||
<mat-error *ngIf="formGroup.get('organisations').hasError('backendError')">
|
||||
|
@ -191,7 +191,7 @@
|
|||
</div>
|
||||
<div *ngIf="field.type == 4">
|
||||
<mat-form-field>
|
||||
<mat-select [formControl]="formGroup.get('extraProperties').get('language')" placeholder="{{'DMP-EDITOR.FIELDS.LANGUAGE' | translate}}" required>
|
||||
<mat-select [formControl]="formGroup.get('extraProperties').get('language')" placeholder="{{field?.placeholder?.length > 0 ? field.placeholder : ('DMP-EDITOR.FIELDS.LANGUAGE' | translate)}}" required>
|
||||
<mat-option *ngFor="let lang of getLanguageInfos()" [value]="lang.code">
|
||||
{{ lang.name }}
|
||||
</mat-option>
|
||||
|
@ -205,7 +205,7 @@
|
|||
<div *ngIf="field.type == 5">
|
||||
<div class="contact-form">
|
||||
<mat-form-field>
|
||||
<mat-select [formControl]="formGroup.get('extraProperties').get('contact')" placeholder="{{'DMP-EDITOR.FIELDS.CONTACT' | translate}}">
|
||||
<mat-select [formControl]="formGroup.get('extraProperties').get('contact')" placeholder="{{field?.placeholder?.length > 0 ? field.placeholder : ('DMP-EDITOR.FIELDS.CONTACT' | translate)}}">
|
||||
<mat-option *ngFor="let vis of getAssociates()" [value]="vis.id">
|
||||
{{vis.name | translate}}
|
||||
</mat-option>
|
||||
|
@ -218,17 +218,17 @@
|
|||
</div>
|
||||
</div>
|
||||
<div *ngIf="field.type == 6">
|
||||
<funding-info [formGroup]="formGroup" [grantformGroup]="formGroup.get('grant')" [projectFormGroup]="formGroup.get('project')" [funderFormGroup]="formGroup.get('funder')" [isFinalized]="isFinalized" [isNew]="isNew" [isUserOwner]="isUserOwner" [isRequired]="field.required" [type]="1" (onFormChanged)="formChanged()"></funding-info>
|
||||
<funding-info [formGroup]="formGroup" [grantformGroup]="formGroup.get('grant')" [projectFormGroup]="formGroup.get('project')" [funderFormGroup]="formGroup.get('funder')" [isFinalized]="isFinalized" [isNew]="isNew" [isUserOwner]="isUserOwner" [isRequired]="field.required" [field]="field" [type]="1" (onFormChanged)="formChanged()"></funding-info>
|
||||
</div>
|
||||
<div *ngIf="field.type == 7">
|
||||
<funding-info [formGroup]="formGroup" [grantformGroup]="formGroup.get('grant')" [projectFormGroup]="formGroup.get('project')" [funderFormGroup]="formGroup.get('funder')" [isFinalized]="isFinalized" [isNew]="isNew" [isUserOwner]="isUserOwner" [isRequired]="field.required" [type]="2" (onFormChanged)="formChanged()"></funding-info>
|
||||
<funding-info [formGroup]="formGroup" [grantformGroup]="formGroup.get('grant')" [projectFormGroup]="formGroup.get('project')" [funderFormGroup]="formGroup.get('funder')" [isFinalized]="isFinalized" [isNew]="isNew" [isUserOwner]="isUserOwner" [isRequired]="field.required" [field]="field" [type]="2" (onFormChanged)="formChanged()"></funding-info>
|
||||
</div>
|
||||
<div *ngIf="field.type == 8">
|
||||
<funding-info [formGroup]="formGroup" [grantformGroup]="formGroup.get('grant')" [projectFormGroup]="formGroup.get('project')" [funderFormGroup]="formGroup.get('funder')" [isFinalized]="isFinalized" [isNew]="isNew" [isUserOwner]="isUserOwner" [isRequired]="field.required" [type]="3" (onFormChanged)="formChanged()"></funding-info>
|
||||
<funding-info [formGroup]="formGroup" [grantformGroup]="formGroup.get('grant')" [projectFormGroup]="formGroup.get('project')" [funderFormGroup]="formGroup.get('funder')" [isFinalized]="isFinalized" [isNew]="isNew" [isUserOwner]="isUserOwner" [isRequired]="field.required" [field]="field" [type]="3" (onFormChanged)="formChanged()"></funding-info>
|
||||
</div>
|
||||
<div *ngIf="field.type == 9">
|
||||
<mat-form-field>
|
||||
<app-single-auto-complete [formControl]="formGroup.get('extraProperties').get('license')" placeholder="{{'DMP-EDITOR.FIELDS.LICENSE' | translate}}" [configuration]="licenseAutoCompleteConfiguration">
|
||||
<app-single-auto-complete [formControl]="formGroup.get('extraProperties').get('license')" placeholder="{{field?.placeholder?.length > 0 ? field.placeholder : ('DMP-EDITOR.FIELDS.LICENSE' | translate)}}" [configuration]="licenseAutoCompleteConfiguration">
|
||||
</app-single-auto-complete>
|
||||
<mat-error *ngIf="formGroup.get('extraProperties').get('license').hasError('backendError')">
|
||||
{{formGroup.get('extraProperties').get('license').getError('backendError').message}}</mat-error>
|
||||
|
@ -238,7 +238,7 @@
|
|||
</div>
|
||||
<div *ngIf="field.type == 10">
|
||||
<mat-form-field>
|
||||
<mat-select [formControl]="formGroup.get('extraProperties').get('visible')" placeholder="{{'DMP-EDITOR.FIELDS.VISIBILITY' | translate}}">
|
||||
<mat-select [formControl]="formGroup.get('extraProperties').get('visible')" placeholder="{{field?.placeholder?.length > 0 ? field.placeholder : ('DMP-EDITOR.FIELDS.VISIBILITY' | translate)}}">
|
||||
<mat-option *ngFor="let vis of visibles" [value]="vis.value">
|
||||
{{vis.name | translate}}
|
||||
</mat-option>
|
||||
|
@ -267,7 +267,7 @@
|
|||
</div>
|
||||
</div> -->
|
||||
</div>
|
||||
<div *ngIf="field.category === 'EXTRA'">
|
||||
<div *ngIf="field.category === 'EXTRA' && formGroup.get('extraFields')?.controls?.length > 0">
|
||||
<div *ngIf="field.type === extraFieldTypesEnum.TEXT">
|
||||
<mat-form-field>
|
||||
<input matInput placeholder="{{field.placeholder}}" type="text" name="value" [formControl]="formGroup.get('extraFields').get(getExtraFieldIndex(field.id)).get('value')" [required]="field.required">
|
||||
|
@ -305,11 +305,11 @@
|
|||
<div class="col-12 card" *ngIf="section.hasTemplates">
|
||||
<div class="row">
|
||||
<div class="col-12">
|
||||
<div class="input-form">
|
||||
<div class="">
|
||||
<div class="heading">Description templates</div>
|
||||
<mat-form-field>
|
||||
<mat-label>{{'DMP-EDITOR.FIELDS.SELECT-TEMPLATE' | translate}}</mat-label>
|
||||
<app-multiple-auto-complete placeholder="{{'DMP-EDITOR.FIELDS.SELECT-TEMPLATE' | translate}}" [hidePlaceholder]="true" required='true' [value]="sectionTemplates[section.ordinal - 1]" [configuration]="profilesAutoCompleteConfiguration" (optionRemoved)="onRemoveTemplate($event, i)" (optionActionClicked)="onPreviewTemplate($event, i)" (optionSelected)="onOptionSelected($event, i)">
|
||||
<app-multiple-auto-complete placeholder="{{field?.placeholder?.length > 0 ? field.placeholder : ('DMP-EDITOR.FIELDS.SELECT-TEMPLATE' | translate)}}" [hidePlaceholder]="true" required='true' [value]="sectionTemplates[section.ordinal - 1]" [configuration]="profilesAutoCompleteConfiguration" (optionRemoved)="onRemoveTemplate($event, i)" (optionActionClicked)="onPreviewTemplate($event, i)" (optionSelected)="onOptionSelected($event, i)">
|
||||
</app-multiple-auto-complete>
|
||||
<mat-error *ngIf="formGroup.get('profiles').hasError('backendError')">
|
||||
{{formGroup.get('profiles').getError('backendError').message}}</mat-error>
|
||||
|
|
|
@ -357,13 +357,13 @@ a:hover {
|
|||
}
|
||||
|
||||
.input-form {
|
||||
text-align: left;
|
||||
font-weight: 400;
|
||||
font-size: 16px;
|
||||
letter-spacing: 0.15px;
|
||||
color: #7d7d7d;
|
||||
opacity: 1;
|
||||
margin-bottom: 1rem;
|
||||
// text-align: left;
|
||||
// font-weight: 400;
|
||||
// font-size: 16px;
|
||||
// letter-spacing: 0.15px;
|
||||
// color: #7d7d7d;
|
||||
// opacity: 1;
|
||||
// margin-bottom: 1rem;
|
||||
}
|
||||
|
||||
.insert-manually {
|
||||
|
@ -425,5 +425,13 @@ a:hover {
|
|||
|
||||
::ng-deep .input-form .mat-form-field-appearance-outline .mat-form-field-infix {
|
||||
font-size: 1rem;
|
||||
padding: 0.6em 0 1em 0 !important;
|
||||
// padding: 0.6em 0 1em 0 !important;
|
||||
}
|
||||
|
||||
::ng-deep .mat-form-field-appearance-outline .mat-form-field-infix {
|
||||
padding: 1em 0 1em 0 !important;
|
||||
}
|
||||
|
||||
// ::ng-deep .mat-form-field-appearance-outline .mat-form-field-infix {
|
||||
// padding: 0rem 0rem 0.4rem 0rem !important;
|
||||
// }
|
|
@ -56,6 +56,8 @@ import { PopupNotificationDialogComponent } from '@app/library/notification/popu
|
|||
import { GrantEditorModel } from '@app/ui/grant/editor/grant-editor.model';
|
||||
import { CheckDeactivateBaseComponent } from '@app/library/deactivate/deactivate.component';
|
||||
import { DmpProfileStatus } from '@app/core/common/enum/dmp-profile-status';
|
||||
import { DatasetService } from '@app/core/services/dataset/dataset.service';
|
||||
import { runInThisContext } from 'vm';
|
||||
|
||||
interface Visible {
|
||||
value: boolean;
|
||||
|
@ -132,6 +134,7 @@ export class DmpEditorBlueprintComponent extends CheckDeactivateBaseComponent im
|
|||
|
||||
constructor(
|
||||
private dmpProfileService: DmpProfileService,
|
||||
private datasetService: DatasetService,
|
||||
private authService: AuthService,
|
||||
private route: ActivatedRoute,
|
||||
private router: Router,
|
||||
|
@ -159,81 +162,7 @@ export class DmpEditorBlueprintComponent extends CheckDeactivateBaseComponent im
|
|||
|
||||
if (itemId != null) {
|
||||
this.isNew = false;
|
||||
this.dmpService.getSingle(itemId).pipe(map(data => data as DmpModel))
|
||||
.pipe(takeUntil(this._destroyed))
|
||||
.subscribe(async data => {
|
||||
this.lockService.checkLockStatus(data.id).pipe(takeUntil(this._destroyed)).subscribe(lockStatus => {
|
||||
this.lockStatus = lockStatus;
|
||||
|
||||
this.dmp = new DmpEditorModel();
|
||||
this.dmp.grant = new GrantTabModel();
|
||||
this.dmp.project = new ProjectFormModel();
|
||||
this.dmp.funder = new FunderFormModel();
|
||||
this.dmp.extraProperties = new ExtraPropertiesFormModel();
|
||||
this.dmp.fromModel(data);
|
||||
this.formGroup = this.dmp.buildForm();
|
||||
|
||||
this.datasets = this.formGroup.get('datasets') as FormArray;
|
||||
|
||||
this.formGroupRawValue = JSON.parse(JSON.stringify(this.formGroup.getRawValue()));
|
||||
if (!isNullOrUndefined(this.formGroup.get('profile').value)) {
|
||||
this.dmpProfileService.getSingleBlueprint(this.formGroup.get('profile').value)
|
||||
.pipe(takeUntil(this._destroyed))
|
||||
.subscribe(result => {
|
||||
this.selectedDmpBlueprintDefinition = result.definition;
|
||||
this.checkForGrant();
|
||||
this.checkForFunder();
|
||||
this.checkForProject();
|
||||
this.buildExtraFields();
|
||||
this.formGroup.get('profile').setValue(result);
|
||||
this.maxStep = this.selectedDmpBlueprintDefinition.sections.length;
|
||||
this.step = 1;
|
||||
this.addProfiles(this.dmp.profiles);
|
||||
});
|
||||
}
|
||||
this.maxStep = this.formGroup.get('datasets') ? this.maxStep + this.formGroup.get('datasets').value.length - 1 : this.maxStep;
|
||||
|
||||
this.setIsUserOwner();
|
||||
if (!this.isUserOwner) {
|
||||
|
||||
if(this.isUserMember()){
|
||||
this.router.navigate(['plans', 'overview', itemId]);
|
||||
return;
|
||||
}
|
||||
this.isFinalized = true;
|
||||
this.formGroup.disable();
|
||||
}
|
||||
|
||||
if (this.dmp.status === DmpStatus.Finalized || lockStatus) {
|
||||
this.isFinalized = true;
|
||||
this.formGroup.disable();
|
||||
}
|
||||
|
||||
if (this.authService.current() != null) {
|
||||
if (!lockStatus) {
|
||||
this.lock = new LockModel(data.id, this.getUserFromDMP());
|
||||
|
||||
this.lockService.createOrUpdate(this.lock).pipe(takeUntil(this._destroyed)).subscribe(async result => {
|
||||
this.lock.id = Guid.parse(result);
|
||||
interval(this.configurationService.lockInterval).pipe(takeUntil(this._destroyed)).subscribe(() => this.pumpLock());
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
this.associatedUsers = data.associatedUsers;
|
||||
this.people = data.users;
|
||||
this.formGroup.valueChanges.pipe(takeUntil(this._destroyed))
|
||||
.subscribe(x => {
|
||||
this.formChanged();
|
||||
});
|
||||
if(this.lockStatus){
|
||||
this.dialog.open(PopupNotificationDialogComponent,{data:{
|
||||
title:this.language.instant('DMP-EDITOR.LOCKED.TITLE'),
|
||||
message:this.language.instant('DMP-EDITOR.LOCKED.MESSAGE')
|
||||
}, maxWidth:'30em'});
|
||||
}
|
||||
});
|
||||
});
|
||||
this.getItem(itemId);
|
||||
}
|
||||
else {
|
||||
this.dmp = new DmpEditorModel();
|
||||
|
@ -302,10 +231,92 @@ export class DmpEditorBlueprintComponent extends CheckDeactivateBaseComponent im
|
|||
displayFn: (item) => item['label'],
|
||||
titleFn: (item) => item['label'],
|
||||
subtitleFn: (item) => item['description'],
|
||||
popupItemActionIcon: 'visibility'
|
||||
popupItemActionIcon: 'visibility',
|
||||
canRemoveItem: (item) => this.canRemoveItem(item)
|
||||
};
|
||||
}
|
||||
|
||||
private getItem(itemId: String) {
|
||||
this.dmpService.getSingle(itemId).pipe(map(data => data as DmpModel))
|
||||
.pipe(takeUntil(this._destroyed))
|
||||
.subscribe(async data => {
|
||||
this.lockService.checkLockStatus(data.id).pipe(takeUntil(this._destroyed)).subscribe(lockStatus => {
|
||||
this.lockStatus = lockStatus;
|
||||
|
||||
this.dmp = new DmpEditorModel();
|
||||
this.dmp.grant = new GrantTabModel();
|
||||
this.dmp.project = new ProjectFormModel();
|
||||
this.dmp.funder = new FunderFormModel();
|
||||
this.dmp.extraProperties = new ExtraPropertiesFormModel();
|
||||
this.dmp.fromModel(data);
|
||||
this.formGroup = this.dmp.buildForm();
|
||||
|
||||
this.datasets = this.formGroup.get('datasets') as FormArray;
|
||||
|
||||
this.formGroupRawValue = JSON.parse(JSON.stringify(this.formGroup.getRawValue()));
|
||||
if (!isNullOrUndefined(this.formGroup.get('profile').value)) {
|
||||
this.dmpProfileService.getSingleBlueprint(this.formGroup.get('profile').value)
|
||||
.pipe(takeUntil(this._destroyed))
|
||||
.subscribe(result => {
|
||||
this.selectedDmpBlueprintDefinition = result.definition;
|
||||
this.checkForGrant();
|
||||
this.checkForFunder();
|
||||
this.checkForProject();
|
||||
this.buildExtraFields();
|
||||
this.formGroup.get('profile').setValue(result);
|
||||
this.maxStep = this.selectedDmpBlueprintDefinition.sections.length;
|
||||
this.step = 1;
|
||||
this.sectionTemplates = new Array<Array<DatasetProfileModel>>();
|
||||
this.addProfiles(this.dmp.profiles);
|
||||
});
|
||||
}
|
||||
this.maxStep = this.formGroup.get('datasets') ? this.maxStep + this.formGroup.get('datasets').value.length - 1 : this.maxStep;
|
||||
|
||||
this.setIsUserOwner();
|
||||
if (!this.isUserOwner) {
|
||||
|
||||
if (this.isUserMember()) {
|
||||
this.router.navigate(['plans', 'overview', itemId]);
|
||||
return;
|
||||
}
|
||||
this.isFinalized = true;
|
||||
this.formGroup.disable();
|
||||
}
|
||||
|
||||
if (this.dmp.status === DmpStatus.Finalized || lockStatus) {
|
||||
this.isFinalized = true;
|
||||
this.formGroup.disable();
|
||||
}
|
||||
|
||||
if (this.authService.current() != null) {
|
||||
if (!lockStatus) {
|
||||
this.lock = new LockModel(data.id, this.getUserFromDMP());
|
||||
|
||||
this.lockService.createOrUpdate(this.lock).pipe(takeUntil(this._destroyed)).subscribe(async result => {
|
||||
this.lock.id = Guid.parse(result);
|
||||
interval(this.configurationService.lockInterval).pipe(takeUntil(this._destroyed)).subscribe(() => this.pumpLock());
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
this.associatedUsers = data.associatedUsers;
|
||||
this.people = data.users;
|
||||
this.formGroup.valueChanges.pipe(takeUntil(this._destroyed))
|
||||
.subscribe(x => {
|
||||
this.formChanged();
|
||||
});
|
||||
if (this.lockStatus) {
|
||||
this.dialog.open(PopupNotificationDialogComponent, {
|
||||
data: {
|
||||
title: this.language.instant('DMP-EDITOR.LOCKED.TITLE'),
|
||||
message: this.language.instant('DMP-EDITOR.LOCKED.MESSAGE')
|
||||
}, maxWidth: '30em'
|
||||
});
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
extraFieldsArray(): FormArray {
|
||||
return this.formGroup.get('extraFields') as FormArray;
|
||||
}
|
||||
|
@ -437,7 +448,9 @@ export class DmpEditorBlueprintComponent extends CheckDeactivateBaseComponent im
|
|||
this.selectedDmpBlueprintDefinition = result.definition;
|
||||
this.formGroup.get('profile').setValue(result);
|
||||
this.maxStep = this.selectedDmpBlueprintDefinition.sections.length;
|
||||
if (this.formGroup.get('label').valid && this.formGroup.get('description').valid) {
|
||||
this.nextStep();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
|
@ -473,7 +486,7 @@ export class DmpEditorBlueprintComponent extends CheckDeactivateBaseComponent im
|
|||
}
|
||||
|
||||
hasProfile(sectionIndex: number): boolean {
|
||||
return this.formGroup.get('profiles') && this.formGroup.get('profiles').value && this.formGroup.get('profiles').value.some(x => x.data.dmpSectionIndex.includes(sectionIndex));
|
||||
return this.formGroup.get('profiles') && this.formGroup.get('profiles').value && this.formGroup.get('profiles').value.some(x => x.data?.dmpSectionIndex?.includes(sectionIndex));
|
||||
}
|
||||
|
||||
addDataset(dmpSectionIndex: number) {
|
||||
|
@ -509,7 +522,9 @@ export class DmpEditorBlueprintComponent extends CheckDeactivateBaseComponent im
|
|||
onSubmit(addNew?: boolean, showAddDatasetDialog?: boolean): void {
|
||||
this.scrollTop = document.getElementById('editor-form').scrollTop;
|
||||
// return;
|
||||
this.dmpService.createDmp(this.formGroup.getRawValue())
|
||||
const rawvalue = this.formGroup.getRawValue();
|
||||
if (rawvalue.profile instanceof Object) rawvalue.profile = rawvalue.profile.id;
|
||||
this.dmpService.createDmp(rawvalue)
|
||||
.pipe(takeUntil(this._destroyed))
|
||||
.subscribe(
|
||||
complete => {
|
||||
|
@ -576,24 +591,7 @@ export class DmpEditorBlueprintComponent extends CheckDeactivateBaseComponent im
|
|||
if (this.isNew) {
|
||||
this.router.navigate(['/plans', 'edit', dmp.id]);
|
||||
}
|
||||
let dmpEditorModel: DmpEditorModel;
|
||||
dmpEditorModel = new DmpEditorModel();
|
||||
dmpEditorModel.grant = new GrantTabModel();
|
||||
dmpEditorModel.project = new ProjectFormModel();
|
||||
dmpEditorModel.funder = new FunderFormModel();
|
||||
dmpEditorModel.extraProperties = new ExtraPropertiesFormModel();
|
||||
dmpEditorModel.fromModel(dmp);
|
||||
this.formGroupRawValue = JSON.parse(JSON.stringify(this.formGroup.getRawValue()));
|
||||
this.associatedUsers = dmp.associatedUsers;
|
||||
this.people = dmp.users;
|
||||
|
||||
setTimeout(() => { this.formGroup = null; });
|
||||
setTimeout(() => {
|
||||
this.formGroup = dmpEditorModel.buildForm();
|
||||
this.formGroup.valueChanges.pipe(takeUntil(this._destroyed))
|
||||
.subscribe(x => {
|
||||
this.formChanged();
|
||||
});});
|
||||
this.getItem(dmp.id);
|
||||
setTimeout(() => { document.getElementById('editor-form').scrollTop = this.scrollTop; });
|
||||
this.saving = false;
|
||||
this.isNew = false;
|
||||
|
@ -658,6 +656,44 @@ export class DmpEditorBlueprintComponent extends CheckDeactivateBaseComponent im
|
|||
|
||||
}
|
||||
|
||||
public removeDataset(datasetId: string, index: number) {
|
||||
const dialogRef = this.dialog.open(ConfirmationDialogComponent, {
|
||||
maxWidth: '300px',
|
||||
restoreFocus: false,
|
||||
data: {
|
||||
message: this.language.instant('GENERAL.CONFIRMATION-DIALOG.DELETE-ITEM'),
|
||||
confirmButton: this.language.instant('GENERAL.CONFIRMATION-DIALOG.ACTIONS.DELETE'),
|
||||
cancelButton: this.language.instant('GENERAL.CONFIRMATION-DIALOG.ACTIONS.CANCEL'),
|
||||
isDeleteConfirmation: true
|
||||
}
|
||||
});
|
||||
dialogRef.afterClosed().pipe(takeUntil(this._destroyed)).subscribe(result => {
|
||||
if (result) {
|
||||
if (datasetId) {
|
||||
this.datasetService.delete(datasetId)
|
||||
.pipe(takeUntil(this._destroyed))
|
||||
.subscribe(
|
||||
complete => {
|
||||
this.onDeleteCallbackSuccess();
|
||||
},
|
||||
error => this.onDeleteCallbackError(error)
|
||||
);
|
||||
}
|
||||
this.formGroup.get('datasets')['controls'].splice(index, 1);
|
||||
this.step = 0;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
onDeleteCallbackSuccess(): void {
|
||||
this.uiNotificationService.snackBarNotification(this.language.instant('GENERAL.SNACK-BAR.SUCCESSFUL-DELETE'), SnackBarNotificationLevel.Success);
|
||||
this.dmp.id != null ? this.router.navigate(['/reload']).then(() => this.router.navigate(['/plans', 'edit', this.dmp.id])) : this.router.navigate(['/plans']);
|
||||
}
|
||||
|
||||
onDeleteCallbackError(error) {
|
||||
this.uiNotificationService.snackBarNotification(error.error.message ? error.error.message : this.language.instant('GENERAL.SNACK-BAR.UNSUCCESSFUL-DELETE'), SnackBarNotificationLevel.Error);
|
||||
}
|
||||
|
||||
//checks if the dpm is valid not taking into account the datasets validity
|
||||
private _isDMPDescriptionValid(): boolean {
|
||||
|
||||
|
@ -830,13 +866,7 @@ export class DmpEditorBlueprintComponent extends CheckDeactivateBaseComponent im
|
|||
}
|
||||
|
||||
getExtraFieldIndex(id: string): string {
|
||||
let foundFieldIndex: number;
|
||||
(this.formGroup.get('extraFields') as FormArray).controls.forEach((element, index) => {
|
||||
if(element.value.id === id) {
|
||||
foundFieldIndex = index;
|
||||
}
|
||||
});
|
||||
return foundFieldIndex.toString();
|
||||
return (this.formGroup.get('extraFields') as FormArray).controls.findIndex((element) => element.value.id == id).toString();
|
||||
}
|
||||
|
||||
private checkForGrant() {
|
||||
|
@ -887,7 +917,7 @@ export class DmpEditorBlueprintComponent extends CheckDeactivateBaseComponent im
|
|||
}
|
||||
const templates: Array<DmpDatasetProfile> = new Array<DmpDatasetProfile>();
|
||||
this.selectedDmpBlueprintDefinition.sections.forEach(section => {
|
||||
if (profiles !== undefined) {
|
||||
if (profiles != null) {
|
||||
profiles.filter(profile => profile.data.dmpSectionIndex.includes(section.ordinal - 1)).forEach(profile => this.sectionTemplates[section.ordinal - 1].push({ id: profile.descriptionTemplateId, label: profile.label, description: "" }));
|
||||
}
|
||||
else {
|
||||
|
@ -933,6 +963,7 @@ export class DmpEditorBlueprintComponent extends CheckDeactivateBaseComponent im
|
|||
let fields: Array<string> = new Array();
|
||||
var request = new DataTableRequest<DmpBlueprintCriteria>(0, 20, { fields: fields });
|
||||
request.criteria = new DmpBlueprintCriteria();
|
||||
request.criteria.like = query;
|
||||
request.criteria.status = DmpProfileStatus.Finalized;
|
||||
return this.dmpProfileService.getPagedBlueprint(request).pipe(map(x => x.data));
|
||||
}
|
||||
|
@ -1059,33 +1090,24 @@ export class DmpEditorBlueprintComponent extends CheckDeactivateBaseComponent im
|
|||
return false;
|
||||
}
|
||||
|
||||
onRemoveTemplate(event, sectionIndex: number) {
|
||||
canRemoveItem(item): boolean {
|
||||
let found = false;
|
||||
let profiles = this.formGroup.get('profiles').value as DmpDatasetProfile[];
|
||||
this.formGroup.get('datasets')['controls'].forEach(element => {
|
||||
if ((element.get('profile').value.id === event.id) && (element.get('dmpSectionIndex').value === sectionIndex)) {
|
||||
if ((element.get('profile').value.id === item.id) && (element.get('dmpSectionIndex').value === (this.step - 1))) {
|
||||
found = true;
|
||||
this.uiNotificationService.snackBarNotification(this.language.instant('GENERAL.SNACK-BAR.UNSUCCESSFUL-REMOVE-TEMPLATE'), SnackBarNotificationLevel.Success);
|
||||
}
|
||||
});
|
||||
if (found) {
|
||||
this.formGroup.get('profiles').setValue(profiles);
|
||||
this.profilesAutoCompleteConfiguration = {
|
||||
filterFn: this.filterProfiles.bind(this),
|
||||
initialItems: (excludedItems: any[]) => this.filterProfiles('').pipe(map(result => result.filter(resultItem => (excludedItems || []).map(x => x.id).indexOf(resultItem.id) === -1))),
|
||||
displayFn: (item) => item['label'],
|
||||
titleFn: (item) => item['label'],
|
||||
subtitleFn: (item) => item['description'],
|
||||
popupItemActionIcon: 'visibility'
|
||||
};
|
||||
if (found) return false
|
||||
else return true;
|
||||
}
|
||||
|
||||
}
|
||||
else{
|
||||
onRemoveTemplate(event, sectionIndex: number) {
|
||||
let profiles = this.formGroup.get('profiles').value as DmpDatasetProfile[];
|
||||
this.sectionTemplates[sectionIndex] = this.sectionTemplates[sectionIndex].filter(sectionProfile => sectionProfile.id !== event.id);
|
||||
profiles = profiles.filter(sectionProfile => sectionProfile.descriptionTemplateId !== event.id);
|
||||
profiles = profiles.filter(sectionProfile => sectionProfile.descriptionTemplateId !== event.id || !sectionProfile.data.dmpSectionIndex.includes(sectionIndex));
|
||||
this.formGroup.get('profiles').setValue(profiles);
|
||||
}
|
||||
}
|
||||
|
||||
addProfile(event, sectionIndex: number) {
|
||||
const profiles = this.formGroup.get('profiles').value as DmpDatasetProfile[];
|
||||
|
@ -1119,14 +1141,9 @@ export class DmpEditorBlueprintComponent extends CheckDeactivateBaseComponent im
|
|||
dialogRef.afterClosed().pipe(takeUntil(this._destroyed)).subscribe(result => {
|
||||
if (result) {
|
||||
this.addProfile(event, sectionIndex);
|
||||
this.profilesAutoCompleteConfiguration = {
|
||||
filterFn: this.filterProfiles.bind(this),
|
||||
initialItems: (excludedItems: any[]) => this.filterProfiles('').pipe(map(result => result.filter(resultItem => (excludedItems || []).map(x => x.id).indexOf(resultItem.id) === -1))),
|
||||
displayFn: (item) => item['label'],
|
||||
titleFn: (item) => item['label'],
|
||||
subtitleFn: (item) => item['description'],
|
||||
popupItemActionIcon: 'visibility'
|
||||
};
|
||||
const items = this.sectionTemplates[sectionIndex];
|
||||
items.push({ id: event.id, label: event.label, description: "" });
|
||||
this.sectionTemplates[sectionIndex] = [...items];
|
||||
}
|
||||
});
|
||||
}
|
||||
|
|
|
@ -16,7 +16,7 @@
|
|||
<div class="funder-form" *ngIf="type == 1">
|
||||
<div *ngIf="!isCreateNewFunder">
|
||||
<mat-form-field appearance="outline">
|
||||
<app-single-auto-complete [required]="isRequired" [formControl]="funderFormGroup.get('existFunder')" placeholder="{{'DMP-EDITOR.FIELDS.FUNDER' | translate}}" [configuration]="funderAutoCompleteConfiguration">
|
||||
<app-single-auto-complete [required]="isRequired" [formControl]="funderFormGroup.get('existFunder')" placeholder="{{field?.placeholder?.length > 0 ? field.placeholder : ('DMP-EDITOR.FIELDS.FUNDER' | translate)}}" [configuration]="funderAutoCompleteConfiguration">
|
||||
</app-single-auto-complete>
|
||||
</mat-form-field>
|
||||
</div>
|
||||
|
@ -66,7 +66,7 @@
|
|||
<div class="grant-form" *ngIf="type == 2">
|
||||
<div *ngIf="!isCreateNew">
|
||||
<mat-form-field appearance="outline">
|
||||
<app-single-auto-complete [required]="isRequired" [formControl]="grantformGroup.get('existGrant')" placeholder="{{'DMP-EDITOR.FIELDS.GRANT' | translate}}" [configuration]="grantAutoCompleteConfiguration">
|
||||
<app-single-auto-complete [required]="isRequired" [formControl]="grantformGroup.get('existGrant')" placeholder="{{field?.placeholder?.length > 0 ? field.placeholder : ('DMP-EDITOR.FIELDS.GRANT' | translate)}}" [configuration]="grantAutoCompleteConfiguration">
|
||||
</app-single-auto-complete>
|
||||
</mat-form-field>
|
||||
</div>
|
||||
|
@ -122,7 +122,7 @@
|
|||
<div class="project-form" *ngIf="type == 3">
|
||||
<div *ngIf="!isCreateNewProject">
|
||||
<mat-form-field appearance="outline">
|
||||
<app-single-auto-complete [formControl]="projectFormGroup.get('existProject')" placeholder="{{'DMP-EDITOR.FIELDS.PROJECT' | translate}}" [configuration]="projectAutoCompleteConfiguration" [required]="isRequired">
|
||||
<app-single-auto-complete [formControl]="projectFormGroup.get('existProject')" placeholder="{{field?.placeholder?.length > 0 ? field.placeholder : ('DMP-EDITOR.FIELDS.PROJECT' | translate)}}" [configuration]="projectAutoCompleteConfiguration" [required]="isRequired">
|
||||
</app-single-auto-complete>
|
||||
</mat-form-field>
|
||||
</div>
|
||||
|
|
|
@ -14,6 +14,7 @@ import { FunderCriteria } from '@app/core/query/funder/funder-criteria';
|
|||
import { debounceTime, filter, map, switchMap, takeUntil, tap } from 'rxjs/operators';
|
||||
|
||||
import { isNullOrUndefined } from '@swimlane/ngx-datatable';
|
||||
import { FieldInSection } from '@app/core/model/dmp/dmp-blueprint/dmp-blueprint';
|
||||
@Component({
|
||||
selector: 'funding-info',
|
||||
templateUrl: './funding-info.component.html',
|
||||
|
@ -30,6 +31,7 @@ export class FundingInfoComponent extends BaseComponent implements OnInit {
|
|||
|
||||
@Input() isRequired: boolean;
|
||||
@Input() type: number;
|
||||
@Input() field: FieldInSection;
|
||||
|
||||
@Input() formGroup: FormGroup;
|
||||
@Input() grantformGroup: FormGroup;
|
||||
|
|
|
@ -332,7 +332,7 @@
|
|||
vertical-align: bottom;
|
||||
}
|
||||
|
||||
::ng-deep .mat-form-field-appearance-outline .mat-form-field-infix {
|
||||
:host ::ng-deep .mat-form-field-appearance-outline .mat-form-field-infix {
|
||||
padding: 0rem 0rem 0.4rem 0rem !important;
|
||||
}
|
||||
|
||||
|
|
|
@ -1,54 +1,54 @@
|
|||
import { Location } from '@angular/common';
|
||||
import { Component, ElementRef, OnInit, ViewChild } from '@angular/core';
|
||||
import { FormGroup } from '@angular/forms';
|
||||
import { MatDialog } from '@angular/material/dialog';
|
||||
import { ActivatedRoute, Params, Router } from '@angular/router';
|
||||
import { DatasetStatus } from '@app/core/common/enum/dataset-status';
|
||||
import { DmpStatus } from '@app/core/common/enum/dmp-status';
|
||||
import { Role } from "@app/core/common/enum/role";
|
||||
import { Principal } from '@app/core/model/auth/principal';
|
||||
import { DatasetOverviewModel } from '@app/core/model/dataset/dataset-overview';
|
||||
import { DatasetsToBeFinalized } from '@app/core/model/dataset/datasets-toBeFinalized';
|
||||
import { DepositConfigurationModel } from '@app/core/model/deposit/deposit-configuration';
|
||||
import { DmpModel } from '@app/core/model/dmp/dmp';
|
||||
import { DmpBlueprintDefinition, SystemFieldType } from '@app/core/model/dmp/dmp-blueprint/dmp-blueprint';
|
||||
import { DmpOverviewModel } from '@app/core/model/dmp/dmp-overview';
|
||||
import { DoiModel } from '@app/core/model/doi/doi';
|
||||
import { UserInfoListingModel } from '@app/core/model/user/user-info-listing';
|
||||
import { VersionListingModel } from '@app/core/model/version/version-listing.model';
|
||||
import { AuthService } from '@app/core/services/auth/auth.service';
|
||||
import { ConfigurationService } from '@app/core/services/configuration/configuration.service';
|
||||
import { DepositRepositoriesService } from '@app/core/services/deposit-repositories/deposit-repositories.service';
|
||||
import { DmpProfileService } from '@app/core/services/dmp/dmp-profile.service';
|
||||
import { DmpService } from '@app/core/services/dmp/dmp.service';
|
||||
import { LockService } from '@app/core/services/lock/lock.service';
|
||||
import { MatomoService } from '@app/core/services/matomo/matomo-service';
|
||||
import {
|
||||
SnackBarNotificationLevel,
|
||||
UiNotificationService
|
||||
} from '@app/core/services/notification/ui-notification-service';
|
||||
import {ConfirmationDialogComponent} from '@common/modules/confirmation-dialog/confirmation-dialog.component';
|
||||
import { PopupNotificationDialogComponent } from '@app/library/notification/popup/popup-notification.component';
|
||||
import {
|
||||
DmpFinalizeDialogComponent,
|
||||
DmpFinalizeDialogInput,
|
||||
DmpFinalizeDialogOutput
|
||||
} from '@app/ui/dmp/editor/dmp-finalize-dialog/dmp-finalize-dialog.component';
|
||||
import { BreadcrumbItem } from '@app/ui/misc/breadcrumb/definition/breadcrumb-item';
|
||||
import { isNullOrUndefined } from '@app/utilities/enhancers/utils';
|
||||
import { BaseComponent } from '@common/base/base.component';
|
||||
import { ConfirmationDialogComponent } from '@common/modules/confirmation-dialog/confirmation-dialog.component';
|
||||
import { TranslateService } from '@ngx-translate/core';
|
||||
import * as FileSaver from 'file-saver';
|
||||
import { Observable, of as observableOf } from 'rxjs';
|
||||
import { map, takeUntil } from 'rxjs/operators';
|
||||
import {Role} from "@app/core/common/enum/role";
|
||||
import {DmpInvitationDialogComponent} from '../invitation/dmp-invitation-dialog.component';
|
||||
import {ConfigurationService} from '@app/core/services/configuration/configuration.service';
|
||||
import {Location} from '@angular/common';
|
||||
import {FormGroup} from '@angular/forms';
|
||||
import {LockService} from '@app/core/services/lock/lock.service';
|
||||
import {VersionListingModel} from '@app/core/model/version/version-listing.model';
|
||||
import { CloneDialogComponent } from '../clone/clone-dialog/clone-dialog.component';
|
||||
import {DmpModel} from '@app/core/model/dmp/dmp';
|
||||
import { DmpEditorModel } from '../editor/dmp-editor.model';
|
||||
import {FunderFormModel} from '../editor/grant-tab/funder-form-model';
|
||||
import {ProjectFormModel} from '../editor/grant-tab/project-form-model';
|
||||
import {GrantTabModel} from '../editor/grant-tab/grant-tab-model';
|
||||
import { ExtraPropertiesFormModel } from '../editor/general-tab/extra-properties-form.model';
|
||||
import { FunderFormModel } from '../editor/grant-tab/funder-form-model';
|
||||
import { GrantTabModel } from '../editor/grant-tab/grant-tab-model';
|
||||
import { ProjectFormModel } from '../editor/grant-tab/project-form-model';
|
||||
import { DmpInvitationDialogComponent } from '../invitation/dmp-invitation-dialog.component';
|
||||
import { StartNewDmpDialogComponent } from '../start-new-dmp-dialogue/start-new-dmp-dialog.component';
|
||||
import {MatomoService} from '@app/core/services/matomo/matomo-service';
|
||||
import {PopupNotificationDialogComponent} from '@app/library/notification/popup/popup-notification.component';
|
||||
import {DepositRepositoriesService} from '@app/core/services/deposit-repositories/deposit-repositories.service';
|
||||
import {DepositConfigurationModel} from '@app/core/model/deposit/deposit-configuration';
|
||||
import {DoiModel} from '@app/core/model/doi/doi';
|
||||
import {isNullOrUndefined} from '@app/utilities/enhancers/utils';
|
||||
import { DmpBlueprintDefinition, FieldCategory, SystemFieldType } from '@app/core/model/dmp/dmp-blueprint/dmp-blueprint';
|
||||
import { DmpProfileService } from '@app/core/services/dmp/dmp-profile.service';
|
||||
|
||||
@Component({
|
||||
selector: 'app-dmp-overview',
|
||||
|
@ -662,8 +662,8 @@ export class DmpOverviewComponent extends BaseComponent implements OnInit {
|
|||
if (count < template.minMultiplicity) {
|
||||
this.dialog.open(PopupNotificationDialogComponent, {
|
||||
data: {
|
||||
title: 'Min(' + template.minMultiplicity + ') datasets needed using this template.',
|
||||
message: 'Add dataset.'
|
||||
title: this.language.instant('DMP-OVERVIEW.MIN-DESCRIPTIONS-DIALOG.TITLE', { 'minMultiplicity': template.minMultiplicity }),
|
||||
message: this.language.instant('DMP-OVERVIEW.MIN-DESCRIPTIONS-DIALOG.MESSAGE',)
|
||||
}, maxWidth: '30em'
|
||||
});
|
||||
return true;
|
||||
|
@ -858,10 +858,12 @@ export class DmpOverviewComponent extends BaseComponent implements OnInit {
|
|||
.subscribe(lockStatus => {
|
||||
this.lockStatus = lockStatus
|
||||
if (lockStatus) {
|
||||
this.dialog.open(PopupNotificationDialogComponent,{data:{
|
||||
this.dialog.open(PopupNotificationDialogComponent, {
|
||||
data: {
|
||||
title: this.language.instant('DMP-OVERVIEW.LOCKED-DIALOG.TITLE'),
|
||||
message: this.language.instant('DMP-OVERVIEW.LOCKED-DIALOG.MESSAGE')
|
||||
}, maxWidth:'30em'});
|
||||
}, maxWidth: '30em'
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
|
|
|
@ -52,7 +52,7 @@
|
|||
</div>
|
||||
</div>
|
||||
<div *ngIf="showDelete" class="col-auto align-self-center">
|
||||
<button mat-icon-button type="button" class="deleteBtn" (click)="deleteCompositeField();">
|
||||
<button mat-icon-button type="button" class="deleteBtn" (click)="deleteCompositeField();" [disabled]="form.disabled">
|
||||
<mat-icon>delete</mat-icon>
|
||||
</button>
|
||||
</div>
|
||||
|
|
|
@ -48,6 +48,10 @@
|
|||
{
|
||||
"label": "GENERAL.LANGUAGES.POLISH",
|
||||
"value": "pl"
|
||||
},
|
||||
{
|
||||
"label": "GENERAL.LANGUAGES.BASQUE",
|
||||
"value": "baq"
|
||||
}
|
||||
],
|
||||
"loginProviders": {
|
||||
|
@ -101,5 +105,10 @@
|
|||
"allowOrganizationCreator": true,
|
||||
"useSplash": false,
|
||||
"orcidPath": "https://orcid.org/",
|
||||
"maxFileSizeInMB": 10
|
||||
"maxFileSizeInMB": 10,
|
||||
"newReleaseNotification": {
|
||||
"link": "https://www.openaire.eu/gazing-the-future-output-management-plans",
|
||||
"versionCode": "0",
|
||||
"expires": "2024-02-15T00:00"
|
||||
}
|
||||
}
|
||||
|
|
|
@ -0,0 +1,43 @@
|
|||
|
||||
var sign_out_google = (function() {
|
||||
var auth2 = gapi.auth2.getAuthInstance();
|
||||
auth2.signOut().then(function () {
|
||||
console.log('User signed out from google.');
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
var simple_notifier = (function(type, title, message) {
|
||||
|
||||
setTimeout(function() {
|
||||
$(".alert").remove();
|
||||
}, 11000);
|
||||
|
||||
return notify(type, title, message, null, null, null, null, null, null, null, null, null, null);
|
||||
});
|
||||
|
||||
|
||||
|
||||
function notify(type, title, message, delay, icon, url, target, allow_dismiss, offset_x, offset_y, animate_enter, animate_exit, newest_on_top){
|
||||
|
||||
var options = {};
|
||||
if(icon!=null) options.icon = icon;
|
||||
if(title!=null) options.title = title;
|
||||
if(message!=null) options.message = message;
|
||||
if(url!=null) options.url = url;
|
||||
if(target!=null) options.target = target;
|
||||
|
||||
var settings = {};
|
||||
if(type!=null) settings.type = type;
|
||||
if(allow_dismiss!=null) settings.allow_dismiss = allow_dismiss;
|
||||
settings.delay = 5;
|
||||
if(delay!=null) settings.delay = delay;
|
||||
|
||||
return $.notify(options,settings, delay);
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
File diff suppressed because it is too large
Load Diff
|
@ -28,6 +28,8 @@
|
|||
"UNSUCCESSFUL-LOGIN": "Anmeldung fehlgeschlagen",
|
||||
"SUCCESSFUL-DATASET-PROFILE-DELETE": "Erfolgreich gelöscht",
|
||||
"UNSUCCESSFUL-DATASET-PROFILE-DELETE": "Diese Vorlage kann nicht gelöscht werden, da Datensatzbeschreibungen noch damit verbunden sind",
|
||||
"SUCCESSFUL-DMP-BLUEPRINT-DELETE": "Successful Delete",
|
||||
"UNSUCCESSFUL-DMP-BLUEPRINT-DELETE": "This blueprint can not deleted, because DMPs are associated with it",
|
||||
"SUCCESSFUL-DESCRIPTION-TEMPLATE-TYPE-DELETE": "Successful Delete",
|
||||
"UNSUCCESSFUL-DESCRIPTION-TEMPLATE-TYPE-DELETE": "This type can not deleted, because Descriptions are associated with it",
|
||||
"SUCCESSFUL-DELETE": "Erfolgreich gelöscht",
|
||||
|
@ -155,6 +157,7 @@
|
|||
"GRANT-NEW": "Neue Förderung",
|
||||
"GRANT-EDIT": "Förderung anzeigen/bearbeiten",
|
||||
"DMP-BLUEPRINT-NEW": "New DMP Blueprint",
|
||||
"DMP-BLUEPRINT-CLONE": "New Clone of DMP Blueprint",
|
||||
"DMP-BLUEPRINT-EDIT": "Edit DMP Blueprint",
|
||||
"DATASET-PROFILES-NEW": "Neue Vorlage für Datensatzbeschreibung",
|
||||
"DATASET-PROFILES-EDIT": "Vorlage der Datensatzbeschreibung bearbeiten",
|
||||
|
@ -188,7 +191,8 @@
|
|||
"SERBIAN": "Serbian",
|
||||
"PORTUGUESE": "Portuguese",
|
||||
"CROATIAN": "Croatian",
|
||||
"POLISH": "Polish"
|
||||
"POLISH": "Polish",
|
||||
"BASQUE": "Basque"
|
||||
}
|
||||
},
|
||||
"COOKIE": {
|
||||
|
@ -302,17 +306,19 @@
|
|||
"DATASET-TEMPLATE-NAME": "Description template name",
|
||||
"DATASET-TEMPLATE-NAME-HINT": "A title that determines the Description template.",
|
||||
"DATASET-TEMPLATE-DESCRIPTION": "Description",
|
||||
"DATASET-TEMPLATE-DESCRIPTION-HINT": "A brief description of what the Dataset is about, it's scope and objectives.",
|
||||
"DATASET-TEMPLATE-DESCRIPTION-HINT": "A brief description of what the Description is about, it's scope and objectives.",
|
||||
"DESCRIPTION-TEMPLATE-TYPE": "Description template type",
|
||||
"DESCRIPTION-TEMPLATE-SELECT-TYPE": "Select a type",
|
||||
"DATASET-TEMPLATE-LANGUAGE": "Description template language",
|
||||
"DATASET-TEMPLATE-SELECT-LANGUAGE": "Select a language",
|
||||
"DESCRIPTION-TEMPLATE-PREFILLING": "Prefilling",
|
||||
"DESCRIPTION-TEMPLATE-ENABLE-PREFILLING": "Enable prefilling",
|
||||
"DATASET-TEMPLATE-USERS": "Editors",
|
||||
"DATASET-TEMPLATE-USERS-HINT": "Add editors and save changes to notify them.",
|
||||
"DATASET-TEMPLATE-REMOVE-USER": "Remove Editor",
|
||||
"DATASET-TEMPLATE-NO-USERS-YET": "... No editors yet",
|
||||
"DATASET-TEMPLATE-VALIDATE-AND-ADD-USER": "Validate and Add Editor",
|
||||
"DATASET-TEMPLATE-DESCRIPTION-PLACEHOLDER": "Dataset template description",
|
||||
"DATASET-TEMPLATE-DESCRIPTION-PLACEHOLDER": "Template description",
|
||||
"UNTITLED": "Untitled",
|
||||
"QUESTION": "Question",
|
||||
"TEMPLATE-OUTLINE": "Template outline",
|
||||
|
@ -454,6 +460,10 @@
|
|||
"FIELD-AUTOCOMPLETE-SOURCE": "Source",
|
||||
"FIELD-AUTOCOMPLETE-URL": "Url",
|
||||
"FIELD-AUTOCOMPLETE-OPTIONS-ROOT": "Options Root",
|
||||
"FIELD-AUTOCOMPLETE-HAS-AUTH": "Has Authentication",
|
||||
"FIELD-AUTOCOMPLETE-AUTH-METHOD": "Method",
|
||||
"FIELD-AUTOCOMPLETE-AUTH-BODY": "Request Body",
|
||||
"FIELD-AUTOCOMPLETE-AUTH-TYPE": "Authentication Type",
|
||||
"FIELD-DATE-PICKER-TITLE": "Date Picker",
|
||||
"FIELD-DATE-PICKER-PLACEHOLDER": "Input Placeholder Text",
|
||||
"FIELD-DATE-PICKER-LABEL": "Label",
|
||||
|
@ -834,6 +844,10 @@
|
|||
"LOCKED-DIALOG":{
|
||||
"TITLE": "DMP is locked",
|
||||
"MESSAGE":"Somebody else is modifying the DMP at this moment. If you would like to modify or view it, please come back later."
|
||||
},
|
||||
"MIN-DESCRIPTIONS-DIALOG": {
|
||||
"TITLE": "Min({{minMultiplicity}}) datasets needed using this template.",
|
||||
"MESSAGE": "Add dataset."
|
||||
}
|
||||
},
|
||||
"DATASET-OVERVIEW": {
|
||||
|
@ -857,10 +871,10 @@
|
|||
"DESCRIPTION": "Description",
|
||||
"SELECT-DESCRIPTIONS-TO-CLONE": "Select which descriptions to include in the new DMP. Selected descriptions will be editable.",
|
||||
"SELECT-DESCRIPTIONS-NONE": "Not available Descriptions for this DMP.",
|
||||
"TEXT-INFO": "Datasets are documented following pre-defined templates which set the content of dataset descriptions. In {{ APP_NAME }}, a DMP can contain as many dataset descriptions as the datasets it documents. Browse ",
|
||||
"TEXT-INFO-REST": " for a look at datasets described in {{ APP_NAME }} DMPs",
|
||||
"LINK-PUBLIC-DATASETS": "Public Datasets",
|
||||
"TEXT-INFO-PAR": "New datasets can be added to existing DMPs at any time and be described with more than one template. Datasets can also be cloned and re-used in other DMPs as well as be deleted without negatively affecting the DMP as a whole.",
|
||||
"TEXT-INFO": "Descriptions are documented following pre-defined templates which set the content of the descriptions. In {{ APP_NAME }}, a DMP can contain as many descriptions as the entities it documents. Browse ",
|
||||
"TEXT-INFO-REST": " for a look at entities described in {{ APP_NAME }} DMPs",
|
||||
"LINK-PUBLIC-DATASETS": "Public Descriptions",
|
||||
"TEXT-INFO-PAR": "New descriptions can be added to existing DMPs at any time and be described with more than one template. Descriptions can also be cloned and re-used in other DMPs as well as be deleted without negatively affecting the DMP as a whole.",
|
||||
"COLUMNS": {
|
||||
"NAME": "Name",
|
||||
"REFERNCE": "Referenz",
|
||||
|
@ -999,6 +1013,7 @@
|
|||
"DMP-PROFILE-EDITOR": {
|
||||
"TITLE": {
|
||||
"NEW": "New DMP Blueprint",
|
||||
"NEW-PROFILE-CLONE": "New Clone Of ",
|
||||
"EDIT": "Edit"
|
||||
},
|
||||
"FIELDS": {
|
||||
|
@ -1203,6 +1218,11 @@
|
|||
"PUBLISHED": "Veröffentlicht",
|
||||
"LAST-EDITED": "Zuletzt bearbeitet"
|
||||
},
|
||||
"ACTIONS": {
|
||||
"CLONE": "Clone",
|
||||
"DOWNLOAD-XML":"Download XML",
|
||||
"DELETE": "Delete"
|
||||
},
|
||||
"UPLOAD": {
|
||||
"UPLOAD-XML": "Importieren",
|
||||
"UPLOAD-XML-FILE-TITLE": "Vorlage des Datenmanagementplans importieren",
|
||||
|
@ -1277,6 +1297,10 @@
|
|||
"SELECT-DATASET-TEMPLATES": "Vorlagen für Datensatzbeschreibung auswählen",
|
||||
"RELATED-DATASET-TEMPLATES": "Zugehörige Vorlagen für Datensatzbeschreibung"
|
||||
},
|
||||
"BLUEPRINT": {
|
||||
"LIKE": "Search",
|
||||
"STATUS": "Status"
|
||||
},
|
||||
"USERS": {
|
||||
"LABEL": "Suche",
|
||||
"ROLE": "Rolle",
|
||||
|
@ -1349,6 +1373,10 @@
|
|||
"VIEW-MORE": "View more",
|
||||
"VIEW-LESS": "View less"
|
||||
}
|
||||
},
|
||||
"MAX-DESCRIPTION-DIALOG": {
|
||||
"TITLE": "Max datasets using this template.",
|
||||
"MESSAGE": "Select another profile."
|
||||
}
|
||||
},
|
||||
"DATASET-CREATE-WIZARD": {
|
||||
|
@ -1362,13 +1390,13 @@
|
|||
"PLACEHOLDER": "Bestehenden DMP auswählen"
|
||||
},
|
||||
"PREFILL-STEP": {
|
||||
"TITLE": "Initialize your Dataset",
|
||||
"TITLE": "Initialize your Description",
|
||||
"PREFILL": "Prefill",
|
||||
"OR": "OR",
|
||||
"HINT": "Select the dataset from Zenodo to automatically retrieve answers to some questions in your template or start by answering the questions manually.",
|
||||
"HINT": "Select an entry from Zenodo to automatically retrieve answers to some questions in your template or start by answering the questions manually.",
|
||||
"MANUALLY": "Manually",
|
||||
"PROFILE": "Dataset Template",
|
||||
"PREFILLED-DATASET": "Prefilled Dataset",
|
||||
"PROFILE": "Description Template",
|
||||
"PREFILLED-DATASET": "Prefilled Description",
|
||||
"SEARCH": "Start typing to search for a dataset or software",
|
||||
"NEXT": "Next"
|
||||
}
|
||||
|
@ -1948,5 +1976,11 @@
|
|||
"DRAFT": "Draft",
|
||||
"FINALIZED": "Finalized",
|
||||
"DELETED": "Deleted"
|
||||
},
|
||||
"BLUEPRINT-STATUS": {
|
||||
"NONE": "None",
|
||||
"DRAFT": "Draft",
|
||||
"FINALIZED": "Finalized",
|
||||
"DELETED": "Deleted"
|
||||
}
|
||||
}
|
||||
|
|
|
@ -27,7 +27,9 @@
|
|||
"UNSUCCESSFUL-LOGOUT": "Unsuccessful Logout",
|
||||
"UNSUCCESSFUL-LOGIN": "Unsuccessful Login",
|
||||
"SUCCESSFUL-DATASET-PROFILE-DELETE": "Successful Delete",
|
||||
"UNSUCCESSFUL-DATASET-PROFILE-DELETE": "This template can not deleted, because Datasets are associated with it",
|
||||
"UNSUCCESSFUL-DATASET-PROFILE-DELETE": "This template can not deleted, because Descriptions are associated with it",
|
||||
"SUCCESSFUL-DMP-BLUEPRINT-DELETE": "Successful Delete",
|
||||
"UNSUCCESSFUL-DMP-BLUEPRINT-DELETE": "This blueprint can not deleted, because DMPs are associated with it",
|
||||
"SUCCESSFUL-DESCRIPTION-TEMPLATE-TYPE-DELETE": "Successful Delete",
|
||||
"UNSUCCESSFUL-DESCRIPTION-TEMPLATE-TYPE-DELETE": "This type can not deleted, because Descriptions are associated with it",
|
||||
"SUCCESSFUL-DELETE": "Successful Delete",
|
||||
|
@ -103,7 +105,7 @@
|
|||
},
|
||||
"DMP-TO-DATASET-DIALOG": {
|
||||
"FROM-DMP": "You have successfully created your",
|
||||
"DMP": "DMP",
|
||||
"DMP": "Plan",
|
||||
"TO-DATASET": "You will be transferred to the",
|
||||
"DATASET": "Dataset",
|
||||
"EDITOR": "editor",
|
||||
|
@ -127,11 +129,11 @@
|
|||
"GENERAL": "Data Management Plans Creator",
|
||||
"ABOUT": "About",
|
||||
"PRIVACY": "Privacy Policy",
|
||||
"OPENSOURCE-LICENCES": "Opensource Licences",
|
||||
"OPENSOURCE-LICENCES": "Opensource Licenses",
|
||||
"TERMS": "Terms Of Service",
|
||||
"COOKIES-POLICY": "Cookies Policy",
|
||||
"PLANS": "My DMPs",
|
||||
"EXPLORE-PLANS": "Published DMPs",
|
||||
"PLANS": "My Plans",
|
||||
"EXPLORE-PLANS": "Published Plans",
|
||||
"QUICK-WIZARD": "New DMP (Wizard)",
|
||||
"PLANS-NEW": "New DMP (Expert)",
|
||||
"DMP-NEW": "New DMP",
|
||||
|
@ -140,7 +142,7 @@
|
|||
"DATASETCREATEWIZARD": "Add Dataset (Wizard)",
|
||||
"GRANTS": "My Grants",
|
||||
"DMP-BLUEPRINTS": "DMP Blueprints",
|
||||
"DATASET-PROFILES": "Dataset Templates",
|
||||
"DATASET-PROFILES": "Description Templates",
|
||||
"DESCRIPTION-TYPES": "Description Types",
|
||||
"USERS": "Users",
|
||||
"PROFILE": "My Profile",
|
||||
|
@ -155,9 +157,10 @@
|
|||
"GRANT-NEW": "New Grant",
|
||||
"GRANT-EDIT": "View/Edit Grant",
|
||||
"DMP-BLUEPRINT-NEW": "New DMP Blueprint",
|
||||
"DMP-BLUEPRINT-CLONE": "New Clone of DMP Blueprint",
|
||||
"DMP-BLUEPRINT-EDIT": "Edit DMP Blueprint",
|
||||
"DATASET-PROFILES-NEW": "New Dataset Template",
|
||||
"DATASET-PROFILES-EDIT": "Edit Dataset Template",
|
||||
"DATASET-PROFILES-NEW": "New Description Template",
|
||||
"DATASET-PROFILES-EDIT": "Edit Description Template",
|
||||
"DESCRIPTION-TYPE-NEW": "New Description Type",
|
||||
"DESCRIPTION-TYPE-EDIT": "Edit Description Type",
|
||||
"EXPLORE-PLANS-OVERVIEW": "Published DMP Overview",
|
||||
|
@ -165,8 +168,8 @@
|
|||
"DMP-PUBLIC-EDIT": "View Published DMP",
|
||||
"DATASET-COPY": "Copy Dataset",
|
||||
"DATASET-UPDATE": "Update Dataset",
|
||||
"DATASET-PROFILES-NEW-VERSION": "New Version of Dataset Template",
|
||||
"DATASET-PROFILES-CLONE": "New Clone of Dataset Template",
|
||||
"DATASET-PROFILES-NEW-VERSION": "New Version of Description Template",
|
||||
"DATASET-PROFILES-CLONE": "New Clone of Description Template",
|
||||
"LANGUAGE-EDITOR": "Language Editor",
|
||||
"GUIDE-EDITOR": "User Guide Editor",
|
||||
"LANGUAGE": "Language",
|
||||
|
@ -188,7 +191,8 @@
|
|||
"SERBIAN": "Serbian",
|
||||
"PORTUGUESE": "Portuguese",
|
||||
"CROATIAN": "Croatian",
|
||||
"POLISH": "Polish"
|
||||
"POLISH": "Polish",
|
||||
"BASQUE": "Basque"
|
||||
}
|
||||
},
|
||||
"COOKIE": {
|
||||
|
@ -220,14 +224,14 @@
|
|||
"TITLE": "{{ APP_NAME_CAPS }}",
|
||||
"GRANTS": "Grants",
|
||||
"GRANT": "Grant",
|
||||
"DMP": "DMP",
|
||||
"DMPS": "DMPs",
|
||||
"MY-DMPS": "MY DMPs",
|
||||
"DMP": "Plan",
|
||||
"DMPS": "Plans",
|
||||
"MY-DMPS": "MY Plans",
|
||||
"DATASETS": "Datasets",
|
||||
"DESCRIPTION": "Description",
|
||||
"PUBLIC-DATASETS": "Explore {{ APP_NAME_CAPS }}",
|
||||
"USERS": "Users",
|
||||
"DATASETS-ADMIN": "Dataset Templates",
|
||||
"DATASETS-ADMIN": "Description Templates",
|
||||
"DMP-BLUEPRINTS": "DMP Blueprints",
|
||||
"ABOUT": "About",
|
||||
"MY-DATASET-DESCRIPTIONS": "MY DATASETS",
|
||||
|
@ -240,13 +244,13 @@
|
|||
"TEMPLATE": "TEMPLATE",
|
||||
"DMP-BLUEPRINTS-CAPS": "DMP BLUEPRINTS",
|
||||
"USERS-BREADCRUMB": "USERS",
|
||||
"START-NEW-DMP": "Start new DMP",
|
||||
"START-NEW-DMP": "Start new Plan",
|
||||
"START-NEW-DMP-TXT": "Start fresh or continue work in {{ APP_NAME }}! Create a new DMP or upload an existing DMP to {{ APP_NAME }}",
|
||||
"START-WIZARD": "Start wizard",
|
||||
"IMPORT-FROM-FILE": "Import from file",
|
||||
"SEARCH": {
|
||||
"DATASET": "Dataset",
|
||||
"DMP": "DMP",
|
||||
"DMP": "Plan",
|
||||
"GRANT": "Grant",
|
||||
"PUBLISHED": "Published"
|
||||
}
|
||||
|
@ -256,7 +260,7 @@
|
|||
"ABOUT": "About",
|
||||
"DASHBOARD": "Home",
|
||||
"DMP": "DATA MANAGEMENT PLANS",
|
||||
"MY-DMPS": "My DMPs",
|
||||
"MY-DMPS": "My Plans",
|
||||
"DATASETS": "DATASETS",
|
||||
"GRANTS": "GRANTS",
|
||||
"NEW DATASET": "New Dataset",
|
||||
|
@ -270,7 +274,7 @@
|
|||
"HISTORY-VISITED": "LAST VISITED",
|
||||
"HISTORY-EDITED": "LAST EDITED",
|
||||
"PUBLIC": "PUBLISHED",
|
||||
"PUBLIC-DMPS": "Public DMPs",
|
||||
"PUBLIC-DMPS": "Public Plans",
|
||||
"PUBLIC-DESC": "Public Descriptions",
|
||||
"ACCOUNT": "ACCOUNT",
|
||||
"ADMIN": "ADMIN",
|
||||
|
@ -302,17 +306,19 @@
|
|||
"DATASET-TEMPLATE-NAME": "Description template name",
|
||||
"DATASET-TEMPLATE-NAME-HINT": "A title that determines the Description template.",
|
||||
"DATASET-TEMPLATE-DESCRIPTION": "Description",
|
||||
"DATASET-TEMPLATE-DESCRIPTION-HINT": "A brief description of what the Dataset is about, it's scope and objectives.",
|
||||
"DATASET-TEMPLATE-DESCRIPTION-HINT": "A brief description of what the Description is about, it's scope and objectives.",
|
||||
"DESCRIPTION-TEMPLATE-TYPE": "Description template type",
|
||||
"DESCRIPTION-TEMPLATE-SELECT-TYPE": "Select a type",
|
||||
"DATASET-TEMPLATE-LANGUAGE": "Description template language",
|
||||
"DATASET-TEMPLATE-SELECT-LANGUAGE": "Select a language",
|
||||
"DESCRIPTION-TEMPLATE-PREFILLING": "Prefilling",
|
||||
"DESCRIPTION-TEMPLATE-ENABLE-PREFILLING": "Enable prefilling",
|
||||
"DATASET-TEMPLATE-USERS": "Editors",
|
||||
"DATASET-TEMPLATE-USERS-HINT": "Add editors and save changes to notify them.",
|
||||
"DATASET-TEMPLATE-REMOVE-USER": "Remove Editor",
|
||||
"DATASET-TEMPLATE-NO-USERS-YET": "... No editors yet",
|
||||
"DATASET-TEMPLATE-VALIDATE-AND-ADD-USER": "Validate and Add Editor",
|
||||
"DATASET-TEMPLATE-DESCRIPTION-PLACEHOLDER": "Dataset template description",
|
||||
"DATASET-TEMPLATE-DESCRIPTION-PLACEHOLDER": "Template description",
|
||||
"UNTITLED": "Untitled",
|
||||
"QUESTION": "Question",
|
||||
"TEMPLATE-OUTLINE": "Template outline",
|
||||
|
@ -322,9 +328,9 @@
|
|||
},
|
||||
"PAGE-INFO": {
|
||||
"PAGE-NAME": "Chapter Name",
|
||||
"PAGE-NAME-HINT": "Set a name for the desciption chapter.",
|
||||
"PAGE-NAME-HINT": "Set a name for the description chapter.",
|
||||
"PAGE-DESCRIPTION": "Description",
|
||||
"PAGE-DESCRIPTION-HINT": "Write a brief desciption of what the chapter is about.",
|
||||
"PAGE-DESCRIPTION-HINT": "Write a brief description of what the chapter is about.",
|
||||
"ACTIONS": {
|
||||
"CREATE-FIRST-PAGE": "Create the first chapter",
|
||||
"CREATE-NEW-SUBSECTION": "Section",
|
||||
|
@ -341,7 +347,7 @@
|
|||
"SECTION-NAME": "Section Name",
|
||||
"SECTION-NAME-HINT": "Set a name for the section.",
|
||||
"SECTION-DESCRIPTION": "Description",
|
||||
"SECTION-DESCRIPTION-HINT": "Write a brief desciption of what the section is about.",
|
||||
"SECTION-DESCRIPTION-HINT": "Write a brief description of what the section is about.",
|
||||
"SECTION": "Section"
|
||||
},
|
||||
"PAGES": {
|
||||
|
@ -454,6 +460,10 @@
|
|||
"FIELD-AUTOCOMPLETE-SOURCE": "Source",
|
||||
"FIELD-AUTOCOMPLETE-URL": "Url",
|
||||
"FIELD-AUTOCOMPLETE-OPTIONS-ROOT": "Options Root",
|
||||
"FIELD-AUTOCOMPLETE-HAS-AUTH": "Has Authentication",
|
||||
"FIELD-AUTOCOMPLETE-AUTH-METHOD": "Method",
|
||||
"FIELD-AUTOCOMPLETE-AUTH-BODY": "Request Body",
|
||||
"FIELD-AUTOCOMPLETE-AUTH-TYPE": "Authentication Type",
|
||||
"FIELD-DATE-PICKER-TITLE": "Date Picker",
|
||||
"FIELD-DATE-PICKER-PLACEHOLDER": "Input Placeholder Text",
|
||||
"FIELD-DATE-PICKER-LABEL": "Label",
|
||||
|
@ -597,7 +607,7 @@
|
|||
},
|
||||
"ERRORS": {
|
||||
"INVALID-VISIBILITY-RULES": {
|
||||
"MESSAGE-START": "There were invalid visibilty rules detected in ",
|
||||
"MESSAGE-START": "There were invalid visibility rules detected in ",
|
||||
"MESSAGE-END": ". Would you like to fix them?",
|
||||
"CONFIRM-YES": "Yes, remove invalid rules",
|
||||
"CONFIRM-NO": "No, keep them.",
|
||||
|
@ -613,7 +623,7 @@
|
|||
}
|
||||
},
|
||||
"DMP-LISTING": {
|
||||
"DMP": "DMP",
|
||||
"DMP": "Plan",
|
||||
"GRANT": "Grant",
|
||||
"TITLE": "Data Management Plans",
|
||||
"OWNER": "Owner",
|
||||
|
@ -624,8 +634,8 @@
|
|||
"PUBLISHED": "Published",
|
||||
"VERSION": "Version",
|
||||
"CONTAINED-DESCRIPTIONS": "Contained Descriptions",
|
||||
"TEXT-INFO": "Information in a DMP show how datasets have been collected and/or generated, how they have been processed and analysed, i.e. using which tools, standards, methodologies etc, but also where and how datasets are backed up, published and preserved, including any costs associated with personnel dedicated for data curation/ stewardship activities or costs for acquiring or building data management services.",
|
||||
"TEXT-INFO-QUESTION": "Not sure how a DMP looks in practice? Browse Public DMPs and",
|
||||
"TEXT-INFO": "Information in a DMP show how descriptions have been collected and/or generated, how they have been processed and analyzed, i.e. using which tools, standards, methodologies etc, but also where and how descriptions are backed up, published and preserved, including any costs associated with personnel dedicated for data curation/ stewardship activities or costs for acquiring or building data management services.",
|
||||
"TEXT-INFO-QUESTION": "Not sure how a Plan looks in practice? Browse Public Plans and",
|
||||
"LINK-ZENODO": "LIBER community in Zenodo",
|
||||
"GET-IDEA": "to get an idea!",
|
||||
"SORT-BY": "Sort by",
|
||||
|
@ -681,7 +691,7 @@
|
|||
},
|
||||
"LEVEL-OF-ACCESS": "Level of Access",
|
||||
"INVOLVED-DATASETS": "Involved Datasets",
|
||||
"TEMPLATES-INVOLVED": "Dataset Templates Involved"
|
||||
"TEMPLATES-INVOLVED": "Description Templates Involved"
|
||||
},
|
||||
"VIEW-ALL-VERSIONS": "All versions of",
|
||||
"EMPTY-LIST": "Nothing here yet."
|
||||
|
@ -695,14 +705,14 @@
|
|||
"TOOLTIP": {
|
||||
"PUBLISHED": "Public access - Closed DMP",
|
||||
"INVOLVED-DATASETS": "Involved Datasets",
|
||||
"TEMPLATES-INVOLVED": "Dataset Templates Involved"
|
||||
"TEMPLATES-INVOLVED": "Description Templates Involved"
|
||||
},
|
||||
"EMPTY-LIST": "Nothing here yet."
|
||||
},
|
||||
"DMP-UPLOAD": {
|
||||
"TITLE": "Import Data Management Plan",
|
||||
"UPLOAD-BUTTON": "Upload",
|
||||
"UPLOAD-SUCCESS": "Import was Successfull",
|
||||
"UPLOAD-SUCCESS": "Import was Successful",
|
||||
"ACTIONS": {
|
||||
"IMPORT": "Import",
|
||||
"CANCEL": "Cancel"
|
||||
|
@ -723,7 +733,7 @@
|
|||
"FIRST-STEP": {
|
||||
"TITLE": "Dataset Information",
|
||||
"DMP": "Data Management Plan",
|
||||
"PROFILE": "Dataset Template",
|
||||
"PROFILE": "Description Template",
|
||||
"SUB-TITLE": "Created At: "
|
||||
},
|
||||
"SECOND-STEP": {
|
||||
|
@ -763,7 +773,7 @@
|
|||
"MESSAGES": {
|
||||
"DATASET-NOT-FOUND": "Dataset does not exist",
|
||||
"DATASET-NOT-ALLOWED": "You have no access to this Dataset",
|
||||
"SUCCESS-UPDATE-DATASET-PROFILE": "Dataset Template updated successfully",
|
||||
"SUCCESS-UPDATE-DATASET-PROFILE": "Description Template updated successfully",
|
||||
"MISSING-FIELDS": "There are some required fields left unfilled. Please check the DMP and make sure that all required questions are answered and URLs are provided with valid input. (Missing fields are marked in red color)",
|
||||
"NO-FILES-SELECTED": "There is no selected file to upload",
|
||||
"LARGE-FILE-OR-UNACCEPTED-TYPE": "The file is too large or its type is not supported.",
|
||||
|
@ -772,8 +782,8 @@
|
|||
},
|
||||
"UPLOAD": {
|
||||
"UPLOAD-XML": "Import",
|
||||
"UPLOAD-XML-FILE-TITLE": "Import Dataset Template",
|
||||
"UPLOAD-XML-NAME": "Name Of Dataset Template",
|
||||
"UPLOAD-XML-FILE-TITLE": "Import Description Template",
|
||||
"UPLOAD-XML-NAME": "Name Of Description Template",
|
||||
"UPLOAD-XML-IMPORT": "File",
|
||||
"UPLOAD-XML-FILE-CANCEL": "Cancel"
|
||||
},
|
||||
|
@ -791,7 +801,7 @@
|
|||
"COPY": "Copy",
|
||||
"CANCEL": "Cancel",
|
||||
"NEXT": "Next",
|
||||
"ERROR-MESSAGE": "Does not contain this Dataset Template"
|
||||
"ERROR-MESSAGE": "Does not contain this Description Template"
|
||||
},
|
||||
"LOCKED":{
|
||||
"TITLE":"Dataset is locked",
|
||||
|
@ -813,7 +823,7 @@
|
|||
"TOOLTIP": {
|
||||
"LEVEL-OF-ACCESS": "Level of Access",
|
||||
"INVOLVED-DATASETS": "Involved Datasets",
|
||||
"TEMPLATES-INVOLVED": "Dataset Templates Involved"
|
||||
"TEMPLATES-INVOLVED": "Description Templates Involved"
|
||||
},
|
||||
"ERROR": {
|
||||
"DELETED-DMP": "The requested DMP is deleted",
|
||||
|
@ -834,6 +844,10 @@
|
|||
"LOCKED-DIALOG":{
|
||||
"TITLE": "DMP is locked",
|
||||
"MESSAGE":"Somebody else is modifying the DMP at this moment. If you would like to modify or view it, please come back later."
|
||||
},
|
||||
"MIN-DESCRIPTIONS-DIALOG": {
|
||||
"TITLE": "Min({{minMultiplicity}}) datasets needed using this template.",
|
||||
"MESSAGE": "Add dataset."
|
||||
}
|
||||
},
|
||||
"DATASET-OVERVIEW": {
|
||||
|
@ -853,14 +867,14 @@
|
|||
}
|
||||
},
|
||||
"DATASET-LISTING": {
|
||||
"TITLE": "Datasets",
|
||||
"TITLE": "Datensatzbeschreibungen",
|
||||
"DESCRIPTION": "Description",
|
||||
"SELECT-DESCRIPTIONS-TO-CLONE": "Select which descriptions to include in the new DMP. Selected descriptions will be editable.",
|
||||
"SELECT-DESCRIPTIONS-NONE": "Not available Descriptions for this DMP.",
|
||||
"TEXT-INFO": "Datasets are documented following pre-defined templates which set the content of dataset descriptions. In {{ APP_NAME }}, a DMP can contain as many dataset descriptions as the datasets it documents. Browse ",
|
||||
"TEXT-INFO-REST": " for a look at datasets described in {{ APP_NAME }} DMPs",
|
||||
"LINK-PUBLIC-DATASETS": "Public Datasets",
|
||||
"TEXT-INFO-PAR": "New datasets can be added to existing DMPs at any time and be described with more than one template. Datasets can also be cloned and re-used in other DMPs as well as be deleted without negatively affecting the DMP as a whole.",
|
||||
"TEXT-INFO": "Descriptions are documented following pre-defined templates which set the content of the descriptions. In {{ APP_NAME }}, a DMP can contain as many descriptions as the entities it documents. Browse ",
|
||||
"TEXT-INFO-REST": " for a look at entities described in {{ APP_NAME }} DMPs",
|
||||
"LINK-PUBLIC-DATASETS": "Public Descriptions",
|
||||
"TEXT-INFO-PAR": "New descriptions can be added to existing DMPs at any time and be described with more than one template. Descriptions can also be cloned and re-used in other DMPs as well as be deleted without negatively affecting the DMP as a whole.",
|
||||
"COLUMNS": {
|
||||
"NAME": "Name",
|
||||
"REFERNCE": "Reference",
|
||||
|
@ -873,7 +887,7 @@
|
|||
"FINALIZED": "Finalized",
|
||||
"LAST-EDITED": "Last Edited",
|
||||
"ACTIONS": "Actions",
|
||||
"DMP": "DMP",
|
||||
"DMP": "Plan",
|
||||
"PROFILE": "Template",
|
||||
"DATAREPOSITORIES": "Data Repositories",
|
||||
"REGISTRIES": "Registries",
|
||||
|
@ -900,9 +914,9 @@
|
|||
"DRAFT": "Private access - Editable Dataset",
|
||||
"FINALIZED": "Private access - Closed Dataset"
|
||||
},
|
||||
"DMP": "DMP",
|
||||
"DMP": "Plan",
|
||||
"GRANT": "Grant",
|
||||
"TEMPLATES-INVOLVED": "Dataset Template",
|
||||
"TEMPLATES-INVOLVED": "Description Template",
|
||||
"VERSION": "DMP Version",
|
||||
"PART-OF": "Part of",
|
||||
"TO-DMP": "To DMP",
|
||||
|
@ -914,9 +928,9 @@
|
|||
"TITLE": "Published Datasets",
|
||||
"TOOLTIP": {
|
||||
"FINALIZED": "Private access - Closed Dataset",
|
||||
"DMP": "DMP",
|
||||
"DMP": "Plan",
|
||||
"GRANT": "Grant",
|
||||
"TEMPLATES-INVOLVED": "Dataset Template"
|
||||
"TEMPLATES-INVOLVED": "Description Template"
|
||||
},
|
||||
"EMPTY-LIST": "Nothing here yet."
|
||||
},
|
||||
|
@ -936,7 +950,7 @@
|
|||
"DESCRIPTION": "Description",
|
||||
"CREATED": "Created",
|
||||
"ACTIONS": "Actions",
|
||||
"DMP": "DMP",
|
||||
"DMP": "Plan",
|
||||
"PROFILE": "Template",
|
||||
"DATAREPOSITORIES": "Data Repositories",
|
||||
"REGISTRIES": "Registries",
|
||||
|
@ -978,7 +992,7 @@
|
|||
},
|
||||
"PLACEHOLDER": "Dataset Title",
|
||||
"DATASET-PROFILE": {
|
||||
"SELECT": "Select Dataset Template"
|
||||
"SELECT": "Select Description Template"
|
||||
},
|
||||
"SNACK-BAR": {
|
||||
"SUCCESSFUL-CREATION": "Imported Successfully",
|
||||
|
@ -999,6 +1013,7 @@
|
|||
"DMP-PROFILE-EDITOR": {
|
||||
"TITLE": {
|
||||
"NEW": "New DMP Blueprint",
|
||||
"NEW-PROFILE-CLONE": "New Clone Of ",
|
||||
"EDIT": "Edit"
|
||||
},
|
||||
"FIELDS": {
|
||||
|
@ -1056,8 +1071,8 @@
|
|||
"TITLE": {
|
||||
"NEW": "New Data Management Plan",
|
||||
"EDIT": "Edit",
|
||||
"EDIT-DMP": "Editing DMP",
|
||||
"ADD-DATASET": "Adding dataset",
|
||||
"EDIT-DMP": "Editing Plan",
|
||||
"ADD-DATASET": "Adding description",
|
||||
"EDIT-DESCRIPTION": "Editing Description",
|
||||
"CLONE-DMP": "Clone",
|
||||
"NEW-VERSION": "New Version",
|
||||
|
@ -1073,11 +1088,11 @@
|
|||
"ORGANISATIONS": "Organizations",
|
||||
"ORGANISATIONS-HINT": "Add here the names of the organizations contributing to the creation and revision of the DMPs",
|
||||
"RESEARCHERS": "Researchers",
|
||||
"RESEARCHERS-HINT": "Add here the names of people that have produced, processed, analysed the data described in the DMP. ",
|
||||
"RESEARCHERS-HINT": "Add here the names of people that have produced, processed, analyzed the data described in the DMP. ",
|
||||
"AUTHORS": "Authors",
|
||||
"TEMPLATES": "Templates",
|
||||
"TEMPLATE": "DMP Template",
|
||||
"DATASET-TEMPLATES": "Related Dataset Templates",
|
||||
"DATASET-TEMPLATES": "Related Description Templates",
|
||||
"SELECT-TEMPLATE": "Select a template to describe your descriptions",
|
||||
"PROFILE": "DMP Template",
|
||||
"PROJECT": "Project",
|
||||
|
@ -1144,19 +1159,19 @@
|
|||
"DATASET-SELECTION": "Dataset selection",
|
||||
"DESCRIPTION-INFO": "Description info",
|
||||
"LICENSE-INFO": "License",
|
||||
"DATASET": "Dataset",
|
||||
"DATASET": "Description",
|
||||
"PREVIOUS": "Previous",
|
||||
"NEXT": "Next"
|
||||
},
|
||||
"MAIN-INFO": {
|
||||
"INTRO": "A DMP in {{ APP_NAME }} consists of key information about research, such as purpose, objectives and researchers involved, but also about documentation of research datasets that highlight the steps followed and the means used across data management activities.",
|
||||
"INTRO": "A Plan in {{ APP_NAME }} consists of key information about research, such as purpose, objectives and researchers involved, but also about documentation of research datasets that highlight the steps followed and the means used across data management activities.",
|
||||
"HINT": "A brief description of what the DMP is about, it’s scope and objectives.",
|
||||
"TYPING": "Type more letters of the name so its more possible to find the correct one.",
|
||||
"UNIQUE-IDENTIFIER": "Unique Identifier",
|
||||
"RESEARCHER-IDENTIFIER-EXISTS": "Researcher identifier already exists.",
|
||||
"ORGANISATION-IDENTIFIER-EXSTS": "Organisation identifier already exists.",
|
||||
"ORGANISATION-IDENTIFIER-EXSTS": "Organization identifier already exists.",
|
||||
"IDENTIFIER-EXISTS-RESEARCHER-LIST": "This identifier is already used by a researcher in the researchers list.",
|
||||
"IDENTIFIER-EXISTS-ORGANISATION-LIST": "This identifier is already used by an organisation in the organisations list.",
|
||||
"IDENTIFIER-EXISTS-ORGANISATION-LIST": "This identifier is already used by an organization in the organizations list.",
|
||||
"SAVE":"Save",
|
||||
"CANCEL": "Cancel"
|
||||
},
|
||||
|
@ -1169,18 +1184,18 @@
|
|||
"IDENTIFIER-PROJECT-EXISTS": "A project with the given identifier exists."
|
||||
},
|
||||
"DATASET-INFO": {
|
||||
"INTRO": "A DMP in {{ APP_NAME }} consists of key information about research, such as purpose, objectives and researchers involved, but also about documentation of research datasets that highlight the steps followed and the means used across data management activities.",
|
||||
"SECOND-INTRO": "Datasets are documented following pre-defined templates which set the content of dataset descriptions. In {{ APP_NAME }}, a DMP can contain as many dataset descriptions as the datasets it documents.",
|
||||
"INTRO": "A Plan in {{ APP_NAME }} consists of key information about research, such as purpose, objectives and researchers involved, but also about documentation of research datasets that highlight the steps followed and the means used across data management activities.",
|
||||
"SECOND-INTRO": "Descriptions are documented following pre-defined templates which set the content of dataset descriptions. In {{ APP_NAME }}, a DMP can contain as many dataset descriptions as the datasets it documents.",
|
||||
"FIND": "Couldn't find a suitable one?",
|
||||
"HINT": "Select a template to describe your descriptions. You may select more than one template."
|
||||
},
|
||||
"LICENSE-INFO": {
|
||||
"INTRO": "Each DMP can contain specific license informatation over how much open and available it is, that way you can determine who can see your dataset and for how long that data will be private",
|
||||
"INTRO": "Each DMP can contain specific license information over how much open and available it is, that way you can determine who can see your dataset and for how long that data will be private",
|
||||
"HINT": "Assign a license to your DMP by selecting the most appropriate from the list.",
|
||||
"TYPING": "Type more letters of the name so its more possible to find the correct one."
|
||||
},
|
||||
"DATASET-DESCRIPTION": {
|
||||
"INTRO": "Ιn general terms, your research data should be 'fair', that is findable, accessible, interoperable and re-usable. these principles precede implementation choices and do not necessarily suggest any specific technology, standard, or implementation-solution. this template is not intended as a strict technical implementation of the fair principles, it is rather inspired by fair as a general concept."
|
||||
"INTRO": "In general terms, your research data should be 'fair', that is findable, accessible, interoperable and re-usable. these principles precede implementation choices and do not necessarily suggest any specific technology, standard, or implementation-solution. this template is not intended as a strict technical implementation of the fair principles, it is rather inspired by fair as a general concept."
|
||||
},
|
||||
"CHANGES": "unsaved changes",
|
||||
"CLONE-DIALOG": {
|
||||
|
@ -1203,6 +1218,11 @@
|
|||
"PUBLISHED": "Published",
|
||||
"LAST-EDITED": "Last Edited"
|
||||
},
|
||||
"ACTIONS": {
|
||||
"CLONE": "Clone",
|
||||
"DOWNLOAD-XML":"Download XML",
|
||||
"DELETE": "Delete"
|
||||
},
|
||||
"UPLOAD": {
|
||||
"UPLOAD-XML": "Import",
|
||||
"UPLOAD-XML-FILE-TITLE": "Import Data Management Plan Template",
|
||||
|
@ -1264,8 +1284,8 @@
|
|||
"RELATED-DMP": "Related DMPs",
|
||||
"SELECT-COLLABORATORS": "Select Collaborators",
|
||||
"RELATED-COLLABORATORS": "Related Collaborators",
|
||||
"SELECT-DATASET-TEMPLATES": "Select Dataset Templates",
|
||||
"RELATED-DATASET-TEMPLATES": "Related Dataset Templates",
|
||||
"SELECT-DATASET-TEMPLATES": "Select Description Templates",
|
||||
"RELATED-DATASET-TEMPLATES": "Related Description Templates",
|
||||
"ALL-VERSIONS": "From All Versions"
|
||||
},
|
||||
"DMP": {
|
||||
|
@ -1274,8 +1294,12 @@
|
|||
"SELECT-GRANTS": "Select Grants",
|
||||
"SELECT-COLLABORATORS": "Select Collaborators",
|
||||
"RELATED-COLLABORATORS": "Related Collaborators",
|
||||
"SELECT-DATASET-TEMPLATES": "Select Dataset Templates",
|
||||
"RELATED-DATASET-TEMPLATES": "Related Dataset Templates"
|
||||
"SELECT-DATASET-TEMPLATES": "Select Description Templates",
|
||||
"RELATED-DATASET-TEMPLATES": "Related Description Templates"
|
||||
},
|
||||
"BLUEPRINT": {
|
||||
"LIKE": "Search",
|
||||
"STATUS": "Status"
|
||||
},
|
||||
"USERS": {
|
||||
"LABEL": "Search",
|
||||
|
@ -1298,7 +1322,7 @@
|
|||
"DESCRIPTION": "Description",
|
||||
"PROFILE": "Template",
|
||||
"URI": "Uri",
|
||||
"DMP": "DMP",
|
||||
"DMP": "Plan",
|
||||
"SELECT-DMP": "Select DMP",
|
||||
"DATAREPOSITORIES": "Data Repositories",
|
||||
"REGISTRIES": "Registries",
|
||||
|
@ -1338,10 +1362,10 @@
|
|||
},
|
||||
"VERSION-DIALOG": {
|
||||
"ABOUT": "Versioning is automated.",
|
||||
"QUESTION": "It seems your Dataset Template is outdated. Do you want to update it to the latest version?"
|
||||
"QUESTION": "It seems your Description Template is outdated. Do you want to update it to the latest version?"
|
||||
},
|
||||
"ERRORS":{
|
||||
"ERROR-OCCURED": "An error occured.",
|
||||
"ERROR-OCCURED": "An error occurred.",
|
||||
"MESSAGE": "Message: "
|
||||
},
|
||||
"QUESTION": {
|
||||
|
@ -1349,6 +1373,10 @@
|
|||
"VIEW-MORE": "View more",
|
||||
"VIEW-LESS": "View less"
|
||||
}
|
||||
},
|
||||
"MAX-DESCRIPTION-DIALOG": {
|
||||
"TITLE": "Max datasets using this template.",
|
||||
"MESSAGE": "Select another profile."
|
||||
}
|
||||
},
|
||||
"DATASET-CREATE-WIZARD": {
|
||||
|
@ -1358,17 +1386,17 @@
|
|||
"SAVE": "Save"
|
||||
},
|
||||
"FIRST-STEP": {
|
||||
"TITLE": "DMP",
|
||||
"TITLE": "Plan",
|
||||
"PLACEHOLDER": "Pick an existing DMP"
|
||||
},
|
||||
"PREFILL-STEP": {
|
||||
"TITLE": "Initialize your Dataset",
|
||||
"TITLE": "Initialize your Description",
|
||||
"PREFILL": "Prefill",
|
||||
"OR": "OR",
|
||||
"HINT": "Select the dataset from Zenodo to automatically retrieve answers to some questions in your template or start by answering the questions manually.",
|
||||
"HINT": "Select an entry from Zenodo to automatically retrieve answers to some questions in your template or start by answering the questions manually.",
|
||||
"MANUALLY": "Manually",
|
||||
"PROFILE": "Dataset Template",
|
||||
"PREFILLED-DATASET": "Prefilled Dataset",
|
||||
"PROFILE": "Description Template",
|
||||
"PREFILLED-DATASET": "Prefilled Description",
|
||||
"SEARCH": "Start typing to search for a dataset or software",
|
||||
"NEXT": "Next"
|
||||
}
|
||||
|
@ -1477,7 +1505,7 @@
|
|||
"DATASET-IDENTIFIER": "Dataset Identifier",
|
||||
"CURRENCY": "Currency",
|
||||
"VALIDATION": "Validator",
|
||||
"OTHER": "Other",
|
||||
"OTHER": "Custom",
|
||||
"SELECT": "Select"
|
||||
},
|
||||
"DATASET-PROFILE-UPLOAD-TYPE": {
|
||||
|
@ -1494,7 +1522,7 @@
|
|||
},
|
||||
"DATASET-PROFILE-INTERNAL-DMP-ENTITIES-TYPE": {
|
||||
"RESEARCHERS": "Researchers",
|
||||
"DMPS": "DMPs",
|
||||
"DMPS": "Plans",
|
||||
"DATASETS": "Datasets",
|
||||
"EXTERNAL-SOURCE-HINT": "List of values provided by external source(s)"
|
||||
},
|
||||
|
@ -1545,7 +1573,7 @@
|
|||
},
|
||||
"DMP-WIZARD": {
|
||||
"FIRST-STEP": {
|
||||
"DMP": "DMP Editor",
|
||||
"DMP": "Plan Editor",
|
||||
"DATASETS": "Datasets"
|
||||
},
|
||||
"ACTIONS": {
|
||||
|
@ -1633,7 +1661,7 @@
|
|||
"MAIN-CONTENT": ""
|
||||
},
|
||||
"OPENSOURCE-LICENCES": {
|
||||
"TITLE": "Opensource licences",
|
||||
"TITLE": "Opensource licenses",
|
||||
"MAIN-CONTENT": ""
|
||||
},
|
||||
"TERMS-OF-SERVICE": {
|
||||
|
@ -1665,9 +1693,9 @@
|
|||
"DASHBOARD": {
|
||||
"MY-GRANTS": "My Grants",
|
||||
"GRANTS": "Grants",
|
||||
"MY-DMPS": "My DMPs",
|
||||
"MY-DMPS": "My Plans",
|
||||
"TITLE": "What is {{ APP_NAME_CAPS }}?",
|
||||
"DMP-QUESTION": "What is a DMP in {{ APP_NAME_CAPS }}?",
|
||||
"DMP-QUESTION": "What is a Plan in {{ APP_NAME_CAPS }}?",
|
||||
"INFO-TEXT": "{{ APP_NAME_CAPS }} is an open extensible service that simplifies the management, validation, monitoring and maintenance and of Data Management Plans. It allows actors (researchers, managers, supervisors etc) to create actionable DMPs that may be freely exchanged among infrastructures for carrying out specific aspects of the Data management process in accordance with the intentions and commitment of Data owners.",
|
||||
"INFO-DMP-TEXT": "A Data Management Plan (DMP) is a living document describing the datasets that are generated and/ or re-used during and after a research lifetime. DMPs aim to provide researchers with essential information to re-produce, re-distribute and re-purpose research results thus assuring for their validity and exploitation.",
|
||||
"NEW-QUESTION": "New with DMPs? Visit",
|
||||
|
@ -1675,7 +1703,7 @@
|
|||
"OPEN-AIR-GUIDE": "OpenAIRE’s Guide for Researchers",
|
||||
"LEARN-MORE": "to learn more about how to create one!",
|
||||
"ORGANIZATIONS": "Related Organizations",
|
||||
"DMPS": "DMPs",
|
||||
"DMPS": "Plans",
|
||||
"MY-DATASETS": "My Datasets",
|
||||
"DATASETS": "Datasets",
|
||||
"SEARCH": "SEARCH...",
|
||||
|
@ -1683,15 +1711,15 @@
|
|||
"PERSONAL-USAGE": "Personal Usage",
|
||||
"PUBLIC-USAGE": "Public Usage",
|
||||
"DESCRIPTIONS": "Descriptions",
|
||||
"DATASET-DESCRIPTIONS-DASHBOARD-TEXT": "Datasets",
|
||||
"PUBLIC-DMPS": "Public DMPs",
|
||||
"DATASET-DESCRIPTIONS-DASHBOARD-TEXT": "Descriptions",
|
||||
"PUBLIC-DMPS": "Public Plans",
|
||||
"PUBLIC-DATASETS": "Public Datasets",
|
||||
"RELATED-ORGANISATIONS": "Related Organisations",
|
||||
"RELATED-ORGANISATIONS": "Related Organizations",
|
||||
"DRAFTS": "Drafts",
|
||||
"ALL": "All",
|
||||
"EMPTY-LIST": "Nothing here yet.",
|
||||
"LATEST-ACTIVITY": "Latest Activity",
|
||||
"DMP-ABOUT-BEG": "A DMP in {{ APP_NAME }} consists of key information about research, such as purpose, objectives and researchers involved, but also about documentation of research datasets, namely",
|
||||
"DMP-ABOUT-BEG": "A Plan in {{ APP_NAME }} consists of key information about research, such as purpose, objectives and researchers involved, but also about documentation of research entities, namely",
|
||||
"DMP-ABOUT-END": ", that highlight the steps followed and the means used across data management activities.",
|
||||
"SELECT-DMP": "Select a DMP for your Dataset",
|
||||
"ACTIONS": {
|
||||
|
@ -1700,7 +1728,7 @@
|
|||
},
|
||||
"TOUR-GUIDE": {
|
||||
"DMP": "This is your dashboard. You can view and edit all DMPs that you have either contributed to or created yourself.",
|
||||
"START-NEW": "Create your DMP with Start new DMP.",
|
||||
"START-NEW": "Create your Plan with Start new Plan.",
|
||||
"IMPORT-DMP": "You can import a DMP",
|
||||
"START-WIZARD": "or create new in {{ APP_NAME }}.",
|
||||
"DATASET": "This is your dashboard. You can view and edit all Datasets that you have either contributed to or created yourself.",
|
||||
|
@ -1710,7 +1738,7 @@
|
|||
},
|
||||
"ADD-NEW-DATASET": {
|
||||
"OPTIONS-NOT-ENOUGH": "Are those options not enough?",
|
||||
"START-NEW-DMP": "Start new DMP"
|
||||
"START-NEW-DMP": "Start new Plan"
|
||||
}
|
||||
},
|
||||
"USER-DIALOG": {
|
||||
|
@ -1841,7 +1869,7 @@
|
|||
}
|
||||
},
|
||||
"DMP-FINALISE-DIALOG": {
|
||||
"DMP": "DMP",
|
||||
"DMP": "Plan",
|
||||
"DATASETS": "Datasets",
|
||||
"EMPTY": "No Datasets for this DMP so far",
|
||||
"SUBMIT": "Submit",
|
||||
|
@ -1904,15 +1932,15 @@
|
|||
},
|
||||
"SECOND-STEP": {
|
||||
"TITLE": "DMP Profile",
|
||||
"ABOUT": "A Data Management Plan consists of a set of questions that you should answer with a level of detail appropriate to the grant or with relevance to the purpose that you are creating the DMP. Contents of each DMP vary depending on the selected Dataset Template(s) which contain(s) a set of tailored questions in response to policy requirements of funders, institutions, research communities.",
|
||||
"ABOUT": "A Data Management Plan consists of a set of questions that you should answer with a level of detail appropriate to the grant or with relevance to the purpose that you are creating the DMP. Contents of each DMP vary depending on the selected Description Template(s) which contain(s) a set of tailored questions in response to policy requirements of funders, institutions, research communities.",
|
||||
"NEW-TITLE": "",
|
||||
"DMP-NAME": "DMP For Grant : ",
|
||||
"FIELDS": {
|
||||
"NAME": "Title of the DMP",
|
||||
"DESCRIPTION": "Summary",
|
||||
"DESCRIPTION-HINT": "Briefly describe the context and purpose of the DMP",
|
||||
"PROFILE": "Dataset Template",
|
||||
"PROFILE-HINT": "Select a template to describe your Dataset(s). If you want to select multiple Dataset Templates use \"New DMP (Expert)\". You can also add new Datasets at any time after the DMP creation.",
|
||||
"PROFILE": "Description Template",
|
||||
"PROFILE-HINT": "Select a template to describe your Dataset(s). If you want to select multiple Description Templates use \"New DMP (Expert)\". You can also add new Datasets at any time after the DMP creation.",
|
||||
"HELP": "If you can't find a template or if you want to create a personalized template for your institution, research community or training needs, please contact us."
|
||||
}
|
||||
},
|
||||
|
@ -1949,5 +1977,19 @@
|
|||
"DRAFT": "Draft",
|
||||
"FINALIZED": "Finalized",
|
||||
"DELETED": "Deleted"
|
||||
},
|
||||
"BLUEPRINT-STATUS": {
|
||||
"NONE": "None",
|
||||
"DRAFT": "Draft",
|
||||
"FINALIZED": "Finalized",
|
||||
"DELETED": "Deleted"
|
||||
},
|
||||
"NEW-RELEASE-NOTIFICATION": {
|
||||
"TITLE": "New ARGOS Release!",
|
||||
"HINT": "Discover the all-new Argos version",
|
||||
"BODY": "Discover the latest enhancements and improvements with our brand-new Argos release! Use the Default Blueprint to create plans that include funders information. Contact us to create Blueprints for institutional plans that connect to local services or for training activities. Adopt the output management plan as an overarching plan that combines different templates, e.g. data and software. Don’t miss out – explore now!",
|
||||
"ACTIONS": {
|
||||
"LEARN-MORE": "Learn more"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -28,6 +28,8 @@
|
|||
"UNSUCCESSFUL-LOGIN": "Inicio de sesión fallido",
|
||||
"SUCCESSFUL-DATASET-PROFILE-DELETE": "Borrado correcto",
|
||||
"UNSUCCESSFUL-DATASET-PROFILE-DELETE": "Esta plantilla no se puede borrar, porque está asociada a descripciones del dataset",
|
||||
"SUCCESSFUL-DMP-BLUEPRINT-DELETE": "Successful Delete",
|
||||
"UNSUCCESSFUL-DMP-BLUEPRINT-DELETE": "This blueprint can not deleted, because DMPs are associated with it",
|
||||
"SUCCESSFUL-DESCRIPTION-TEMPLATE-TYPE-DELETE": "Successful Delete",
|
||||
"UNSUCCESSFUL-DESCRIPTION-TEMPLATE-TYPE-DELETE": "This type can not deleted, because Descriptions are associated with it",
|
||||
"SUCCESSFUL-DELETE": "Borrado correcto",
|
||||
|
@ -155,6 +157,7 @@
|
|||
"GRANT-NEW": "Nueva subvención",
|
||||
"GRANT-EDIT": "Ver/Editar subvención",
|
||||
"DMP-BLUEPRINT-NEW": "New DMP Blueprint",
|
||||
"DMP-BLUEPRINT-CLONE": "New Clone of DMP Blueprint",
|
||||
"DMP-BLUEPRINT-EDIT": "Edit DMP Blueprint",
|
||||
"DATASET-PROFILES-NEW": "Nueva plantilla de descripción del dataset",
|
||||
"DATASET-PROFILES-EDIT": "Editar plantilla de descripción del dataset",
|
||||
|
@ -188,7 +191,8 @@
|
|||
"SERBIAN": "Serbio",
|
||||
"PORTUGUESE": "Portugués",
|
||||
"CROATIAN": "Croatian",
|
||||
"POLISH": "Polish"
|
||||
"POLISH": "Polish",
|
||||
"BASQUE": "Basque"
|
||||
}
|
||||
},
|
||||
"COOKIE": {
|
||||
|
@ -307,6 +311,8 @@
|
|||
"DESCRIPTION-TEMPLATE-SELECT-TYPE": "Select a type",
|
||||
"DATASET-TEMPLATE-LANGUAGE": "Description template language",
|
||||
"DATASET-TEMPLATE-SELECT-LANGUAGE": "Seleccione un idioma",
|
||||
"DESCRIPTION-TEMPLATE-PREFILLING": "Prefilling",
|
||||
"DESCRIPTION-TEMPLATE-ENABLE-PREFILLING": "Enable prefilling",
|
||||
"DATASET-TEMPLATE-USERS": "Editors",
|
||||
"DATASET-TEMPLATE-USERS-HINT": "Add editors and save changes to notify them.",
|
||||
"DATASET-TEMPLATE-REMOVE-USER": "Remove Editor",
|
||||
|
@ -454,6 +460,10 @@
|
|||
"FIELD-AUTOCOMPLETE-SOURCE": "Fuente",
|
||||
"FIELD-AUTOCOMPLETE-URL": "Url",
|
||||
"FIELD-AUTOCOMPLETE-OPTIONS-ROOT": "Optiones principales",
|
||||
"FIELD-AUTOCOMPLETE-HAS-AUTH": "Has Authentication",
|
||||
"FIELD-AUTOCOMPLETE-AUTH-METHOD": "Method",
|
||||
"FIELD-AUTOCOMPLETE-AUTH-BODY": "Request Body",
|
||||
"FIELD-AUTOCOMPLETE-AUTH-TYPE": "Authentication Type",
|
||||
"FIELD-DATE-PICKER-TITLE": "Campo de entrada para fecha",
|
||||
"FIELD-DATE-PICKER-PLACEHOLDER": "Marcador de entrada",
|
||||
"FIELD-DATE-PICKER-LABEL": "Etiqueta",
|
||||
|
@ -834,6 +844,10 @@
|
|||
"LOCKED-DIALOG":{
|
||||
"TITLE": "PGD bloqeuado",
|
||||
"MESSAGE":"Alguien más está modificando el PGD. Si quiere modificarlo o visualizarlo, por favor, inténtelo más tarde."
|
||||
},
|
||||
"MIN-DESCRIPTIONS-DIALOG": {
|
||||
"TITLE": "Min({{minMultiplicity}}) datasets needed using this template.",
|
||||
"MESSAGE": "Add dataset."
|
||||
}
|
||||
},
|
||||
"DATASET-OVERVIEW": {
|
||||
|
@ -999,6 +1013,7 @@
|
|||
"DMP-PROFILE-EDITOR": {
|
||||
"TITLE": {
|
||||
"NEW": "New DMP Blueprint",
|
||||
"NEW-PROFILE-CLONE": "New Clone Of ",
|
||||
"EDIT": "Editar"
|
||||
},
|
||||
"FIELDS": {
|
||||
|
@ -1203,6 +1218,11 @@
|
|||
"PUBLISHED": "Publicado",
|
||||
"LAST-EDITED": "Última edición"
|
||||
},
|
||||
"ACTIONS": {
|
||||
"CLONE": "Clone",
|
||||
"DOWNLOAD-XML":"Download XML",
|
||||
"DELETE": "Delete"
|
||||
},
|
||||
"UPLOAD": {
|
||||
"UPLOAD-XML": "Importar",
|
||||
"UPLOAD-XML-FILE-TITLE": "Importar plantilla del Plan de Gestión de Datos",
|
||||
|
@ -1277,6 +1297,10 @@
|
|||
"SELECT-DATASET-TEMPLATES": "Seleccionar la plantilla de descripción del dataset",
|
||||
"RELATED-DATASET-TEMPLATES": "Plantilla de descripción del Dataser relacionada"
|
||||
},
|
||||
"BLUEPRINT": {
|
||||
"LIKE": "Search",
|
||||
"STATUS": "Status"
|
||||
},
|
||||
"USERS": {
|
||||
"LABEL": "Búsqueda",
|
||||
"ROLE": "Función",
|
||||
|
@ -1349,6 +1373,10 @@
|
|||
"VIEW-MORE": "Ver más",
|
||||
"VIEW-LESS": "Ver menos"
|
||||
}
|
||||
},
|
||||
"MAX-DESCRIPTION-DIALOG": {
|
||||
"TITLE": "Max datasets using this template.",
|
||||
"MESSAGE": "Select another profile."
|
||||
}
|
||||
},
|
||||
"DATASET-CREATE-WIZARD": {
|
||||
|
@ -1362,13 +1390,13 @@
|
|||
"PLACEHOLDER": "Seleccione un PGD existente"
|
||||
},
|
||||
"PREFILL-STEP": {
|
||||
"TITLE": "Initialize your Dataset",
|
||||
"TITLE": "Initialize your Description",
|
||||
"PREFILL": "Prefill",
|
||||
"OR": "OR",
|
||||
"HINT": "Select the dataset from Zenodo to automatically retrieve answers to some questions in your template or start by answering the questions manually.",
|
||||
"HINT": "Select an entry from Zenodo to automatically retrieve answers to some questions in your template or start by answering the questions manually.",
|
||||
"MANUALLY": "Manually",
|
||||
"PROFILE": "Dataset Template",
|
||||
"PREFILLED-DATASET": "Prefilled Dataset",
|
||||
"PROFILE": "Description Template",
|
||||
"PREFILLED-DATASET": "Prefilled Description",
|
||||
"SEARCH": "Start typing to search for a dataset or software",
|
||||
"NEXT": "Next"
|
||||
}
|
||||
|
@ -1949,5 +1977,11 @@
|
|||
"DRAFT": "Borrador",
|
||||
"FINALIZED": "Finalizado",
|
||||
"DELETED": "Eliminado"
|
||||
},
|
||||
"BLUEPRINT-STATUS": {
|
||||
"NONE": "None",
|
||||
"DRAFT": "Draft",
|
||||
"FINALIZED": "Finalized",
|
||||
"DELETED": "Deleted"
|
||||
}
|
||||
}
|
||||
|
|
|
@ -28,12 +28,14 @@
|
|||
"UNSUCCESSFUL-LOGIN": "Αποτυχημένη σύνδεση",
|
||||
"SUCCESSFUL-DATASET-PROFILE-DELETE": "Επιτυχής διαγραφή",
|
||||
"UNSUCCESSFUL-DATASET-PROFILE-DELETE": "Το template δεν μπορεί να διαγραφεί, επειδή οι περιγραφές των συνόλων δεδομένων σχετίζονται με αυτό",
|
||||
"SUCCESSFUL-DMP-BLUEPRINT-DELETE": "Successful Delete",
|
||||
"UNSUCCESSFUL-DMP-BLUEPRINT-DELETE": "This blueprint can not deleted, because DMPs are associated with it",
|
||||
"SUCCESSFUL-DESCRIPTION-TEMPLATE-TYPE-DELETE": "Successful Delete",
|
||||
"UNSUCCESSFUL-DESCRIPTION-TEMPLATE-TYPE-DELETE": "This type can not deleted, because Descriptions are associated with it",
|
||||
"SUCCESSFUL-DELETE": "Επιτυχής διαγραφή",
|
||||
"UNSUCCESSFUL-DELETE": "Αποτυχημένη διαγραφή",
|
||||
"UNSUCCESSFUL-EMAIL-SEND": "Αποτυχία αποστολής email",
|
||||
"UNSUCCESSFUL-REMOVE-TEMPLATE": "Αποτυχία αφαίρεσης του template, ένα ή παραπάνω σύνολα δεδομένων του συγκρεκριμένου Σχεδίου Διαχείρισης Δεδομένωνω χρησιμοποιούν αυτό το template"
|
||||
"UNSUCCESSFUL-REMOVE-TEMPLATE": "Αποτυχία αφαίρεσης του template, ένα ή παραπάνω σύνολα δεδομένων του συγκεκριμένου Σχεδίου Διαχείρισης Δεδομένων χρησιμοποιούν αυτό το template"
|
||||
},
|
||||
"ERRORS": {
|
||||
"HTTP-REQUEST-ERROR": "Παρουσιάστηκε μη αναμενόμενο σφάλμα"
|
||||
|
@ -155,6 +157,7 @@
|
|||
"GRANT-NEW": "Νέα Επιχορήγηση",
|
||||
"GRANT-EDIT": "Προβολή / Επεξεργασία Επιχορήγησης",
|
||||
"DMP-BLUEPRINT-NEW": "New DMP Blueprint",
|
||||
"DMP-BLUEPRINT-CLONE": "New Clone of DMP Blueprint",
|
||||
"DMP-BLUEPRINT-EDIT": "Edit DMP Blueprint",
|
||||
"DATASET-PROFILES-NEW": "Νέο template Περιγραφής Συνόλου Δεδομένων",
|
||||
"DATASET-PROFILES-EDIT": "Επεξεργασία template Περιγραφής Συνόλου Δεδομένων",
|
||||
|
@ -188,7 +191,8 @@
|
|||
"SERBIAN": "Σερβικά",
|
||||
"PORTUGUESE": "Πορτογαλικά",
|
||||
"CROATIAN": "Κροατικά",
|
||||
"POLISH": "Πολωνικά"
|
||||
"POLISH": "Πολωνικά",
|
||||
"BASQUE": "Basque"
|
||||
}
|
||||
},
|
||||
"COOKIE": {
|
||||
|
@ -302,17 +306,19 @@
|
|||
"DATASET-TEMPLATE-NAME": "Description template name",
|
||||
"DATASET-TEMPLATE-NAME-HINT": "A title that determines the Description template.",
|
||||
"DATASET-TEMPLATE-DESCRIPTION": "Description",
|
||||
"DATASET-TEMPLATE-DESCRIPTION-HINT": "A brief description of what the Dataset is about, it's scope and objectives.",
|
||||
"DATASET-TEMPLATE-DESCRIPTION-HINT": "A brief description of what the Description is about, it's scope and objectives.",
|
||||
"DESCRIPTION-TEMPLATE-TYPE": "Description template type",
|
||||
"DESCRIPTION-TEMPLATE-SELECT-TYPE": "Select a type",
|
||||
"DATASET-TEMPLATE-LANGUAGE": "Description template language",
|
||||
"DATASET-TEMPLATE-SELECT-LANGUAGE": "Select a language",
|
||||
"DESCRIPTION-TEMPLATE-PREFILLING": "Prefilling",
|
||||
"DESCRIPTION-TEMPLATE-ENABLE-PREFILLING": "Enable prefilling",
|
||||
"DATASET-TEMPLATE-USERS": "Editors",
|
||||
"DATASET-TEMPLATE-USERS-HINT": "Add editors and save changes to notify them.",
|
||||
"DATASET-TEMPLATE-REMOVE-USER": "Remove Editor",
|
||||
"DATASET-TEMPLATE-NO-USERS-YET": "... No editors yet",
|
||||
"DATASET-TEMPLATE-VALIDATE-AND-ADD-USER": "Validate and Add Editor",
|
||||
"DATASET-TEMPLATE-DESCRIPTION-PLACEHOLDER": "Dataset template description",
|
||||
"DATASET-TEMPLATE-DESCRIPTION-PLACEHOLDER": "Template description",
|
||||
"UNTITLED": "Untitled",
|
||||
"QUESTION": "Question",
|
||||
"TEMPLATE-OUTLINE": "Template outline",
|
||||
|
@ -322,9 +328,9 @@
|
|||
},
|
||||
"PAGE-INFO": {
|
||||
"PAGE-NAME": "Chapter Name",
|
||||
"PAGE-NAME-HINT": "Set a name for the desciption chapter.",
|
||||
"PAGE-NAME-HINT": "Set a name for the description chapter.",
|
||||
"PAGE-DESCRIPTION": "Description",
|
||||
"PAGE-DESCRIPTION-HINT": "Write a brief desciption of what the chapter is about.",
|
||||
"PAGE-DESCRIPTION-HINT": "Write a brief description of what the chapter is about.",
|
||||
"ACTIONS": {
|
||||
"CREATE-FIRST-PAGE": "Create the first chapter",
|
||||
"CREATE-NEW-SUBSECTION": "Section",
|
||||
|
@ -341,7 +347,7 @@
|
|||
"SECTION-NAME": "Section Name",
|
||||
"SECTION-NAME-HINT": "Set a name for the section.",
|
||||
"SECTION-DESCRIPTION": "Description",
|
||||
"SECTION-DESCRIPTION-HINT": "Write a brief desciption of what the section is about.",
|
||||
"SECTION-DESCRIPTION-HINT": "Write a brief description of what the section is about.",
|
||||
"SECTION": "Section"
|
||||
},
|
||||
"PAGES": {
|
||||
|
@ -428,7 +434,7 @@
|
|||
"FIELD-CHECKBOX-PLACEHOLDER": "Τοποθέτηση placeholder",
|
||||
"FIELD-FREE-TEXT-TITLE": "Ελεύθερο Κείμενο Δεδομένων",
|
||||
"FIELD-FREE-TEXT-PLACEHOLDER": "Τοποθέτηση placeholder",
|
||||
"FIELD-COMBO-BOX-TYPE": "Τύπος Σύνθετου Πλασίου",
|
||||
"FIELD-COMBO-BOX-TYPE": "Τύπος Σύνθετου Πλαισίου",
|
||||
"FIELD-WORD-LIST-TITLE": "Λίστα Λέξεων Δεδομένων",
|
||||
"FIELD-WORD-LIST-PLACEHOLDER": "Τοποθέτηση placeholder",
|
||||
"FIELD-WORD-LIST-LABEL": "Ετικέτα",
|
||||
|
@ -454,6 +460,10 @@
|
|||
"FIELD-AUTOCOMPLETE-SOURCE": "Πηγή",
|
||||
"FIELD-AUTOCOMPLETE-URL": "Url",
|
||||
"FIELD-AUTOCOMPLETE-OPTIONS-ROOT": "Βάση Επιλογών",
|
||||
"FIELD-AUTOCOMPLETE-HAS-AUTH": "Has Authentication",
|
||||
"FIELD-AUTOCOMPLETE-AUTH-METHOD": "Method",
|
||||
"FIELD-AUTOCOMPLETE-AUTH-BODY": "Request Body",
|
||||
"FIELD-AUTOCOMPLETE-AUTH-TYPE": "Authentication Type",
|
||||
"FIELD-DATE-PICKER-TITLE": "Επιλογή Ημερομηνίας",
|
||||
"FIELD-DATE-PICKER-PLACEHOLDER": "Τοποθέτηση placeholder",
|
||||
"FIELD-DATE-PICKER-LABEL": "Ετικέτα",
|
||||
|
@ -597,7 +607,7 @@
|
|||
},
|
||||
"ERRORS": {
|
||||
"INVALID-VISIBILITY-RULES": {
|
||||
"MESSAGE-START": "There were invalid visibilty rules detected in ",
|
||||
"MESSAGE-START": "There were invalid visibility rules detected in ",
|
||||
"MESSAGE-END": ". Would you like to fix them?",
|
||||
"CONFIRM-YES": "Yes, remove invalid rules",
|
||||
"CONFIRM-NO": "No, keep them.",
|
||||
|
@ -628,7 +638,7 @@
|
|||
"TEXT-INFO-QUESTION": " Εξερευνήστε τα Δημόσια Σχέδια Διαχείρισης Δεδομένων και",
|
||||
"LINK-ZENODO": "την κοινότητα του LIBER στο Zenodo",
|
||||
"GET-IDEA": "για να πάρετε μια ιδέα!",
|
||||
"SORT-BY": "Ταξίνομηση κατά",
|
||||
"SORT-BY": "Ταξινόμηση κατά",
|
||||
"COLUMNS": {
|
||||
"NAME": "Τίτλος",
|
||||
"GRANT": "Επιχορήγηση",
|
||||
|
@ -744,7 +754,7 @@
|
|||
"SAVE": "Save",
|
||||
"SAVE-AND-CONTINUE": "Αποθήκευση & Συνέχεια",
|
||||
"SAVE-AND-ADD": "Αποθήκευση & Προσθήκη Νέου",
|
||||
"SAVE-AND-CLOSE": " Αποθήκευση & Κλείσμο",
|
||||
"SAVE-AND-CLOSE": " Αποθήκευση & Κλείσιμο",
|
||||
"SAVE-AND-FINALISE": "Αποθήκευση και Οριστικοποίηση",
|
||||
"FINALIZE": "Οριστικοποίηση",
|
||||
"REVERSE": "Αναίρεση Οριστικοποίησης",
|
||||
|
@ -768,7 +778,7 @@
|
|||
"NO-FILES-SELECTED": "Δεν υπάρχουν επιλεγμένα αρχεία για μεταφόρτωση",
|
||||
"LARGE-FILE-OR-UNACCEPTED-TYPE": "Το αρχείο είναι πολύ μεγάλο ή ο τύπος του δεν υποστηρίζεται.",
|
||||
"MAX-FILE-SIZE": "Τα αρχεία πρέπει να είναι έως {{maxfilesize}} MB.",
|
||||
"ACCEPTED-FILE-TYPES": "Οι υποστηριζόμενοι τύποι πολυμέσων εναι: "
|
||||
"ACCEPTED-FILE-TYPES": "Οι υποστηριζόμενοι τύποι πολυμέσων είναι: "
|
||||
},
|
||||
"UPLOAD": {
|
||||
"UPLOAD-XML": "Εισαγωγή",
|
||||
|
@ -834,6 +844,10 @@
|
|||
"LOCKED-DIALOG":{
|
||||
"TITLE": "DMP is locked",
|
||||
"MESSAGE":"Somebody else is modifying the DMP at this moment. If you would like to modify or view it, please come back later."
|
||||
},
|
||||
"MIN-DESCRIPTIONS-DIALOG": {
|
||||
"TITLE": "Min({{minMultiplicity}}) datasets needed using this template.",
|
||||
"MESSAGE": "Add dataset."
|
||||
}
|
||||
},
|
||||
"DATASET-OVERVIEW": {
|
||||
|
@ -999,6 +1013,7 @@
|
|||
"DMP-PROFILE-EDITOR": {
|
||||
"TITLE": {
|
||||
"NEW": "New DMP Blueprint",
|
||||
"NEW-PROFILE-CLONE": "New Clone Of ",
|
||||
"EDIT": "Επεξεργασία"
|
||||
},
|
||||
"FIELDS": {
|
||||
|
@ -1086,7 +1101,7 @@
|
|||
"GRANTS-HINT": "Βρείτε την επιχορήγηση της έρευνας σας ή προσθέστε νέα",
|
||||
"FUNDER": "Χορηγός",
|
||||
"FUNDER-HINT": "Επιλέξτε έναν χρηματοδότη της έρευνας σας ή προσθέστε νέο",
|
||||
"FUNDING-ORGANIZATIONS": "Χρημαδοτικοί οργανισμοί",
|
||||
"FUNDING-ORGANIZATIONS": "Χρηματοδοτικοί οργανισμοί",
|
||||
"PROJECT-HINT": "Projects in {{ APP_NAME }} are perceived as distinct activities falling under a grant or common activities under different grants in collaborative schemas, eg open call for contributions. Please complete it for the grant associated to your organization if your project falls under this category. In all other cases, please leave blank and it will be autocompleted.",
|
||||
"STATUS": "Κατάσταση Σχεδίου Διαχείρισης Δεδομένων",
|
||||
"EXTERNAL-SOURCE-HINT": "Κατάλογος των τιμών που παρέχονται από εξωτερικές πηγές",
|
||||
|
@ -1095,7 +1110,7 @@
|
|||
"LANGUAGE-HINT": "Επιλέξτε τη γλώσσα του Σχεδίου Διαχείρισης Δεδομένων σας",
|
||||
"LICENSE": "Άδεια",
|
||||
"VISIBILITY": "Ορατότητα",
|
||||
"VISIBILITY-HINT": "Επιλέξτε πως θα εμφανίζρται το Σχέδιο Διαχείρισης Δεδομένων στο {{ APP_NAME }}. Με την επιλογή «Δημόσιο», το Σχέδιο Διαχείρισης Δεδομένων γίνεται αυτόματα διαθέσιμο σε όλους τους χρήστες της συλλογής «Δημόσια Σχέδια Διαχείρισης Δεδομένων».",
|
||||
"VISIBILITY-HINT": "Επιλέξτε πως θα εμφανίζονται το Σχέδιο Διαχείρισης Δεδομένων στο {{ APP_NAME }}. Με την επιλογή «Δημόσιο», το Σχέδιο Διαχείρισης Δεδομένων γίνεται αυτόματα διαθέσιμο σε όλους τους χρήστες της συλλογής «Δημόσια Σχέδια Διαχείρισης Δεδομένων».",
|
||||
"PUBLICATION": "Ημερομηνία Δημοσιοποίησης",
|
||||
"CONTACT": "Επικοινωνία",
|
||||
"COST": "Δαπάνες",
|
||||
|
@ -1114,7 +1129,7 @@
|
|||
"LOCK": "Κλειδωμένο Σχέδιο Διαχείρισης Δεδομένων",
|
||||
"PERMISSION": "Δεν έχετε άδεια να επεξεργαστείτε αυτό το Σχέδιο Διαχείρισης Δεδομένων",
|
||||
"INSERT-MANUALLY": "Εισάγετε το χειροκίνητα",
|
||||
"CREATE-DATASET": "Δημιούργια νέου",
|
||||
"CREATE-DATASET": "Δημιουργία νέου",
|
||||
"DISABLED-EXPORT": "Παρακαλώ αποθηκεύστε τις αλλαγές σας για να εξάγετε αυτό το Σχέδιο Διαχείρισης Δεδομένων"
|
||||
},
|
||||
"PLACEHOLDER": {
|
||||
|
@ -1126,7 +1141,7 @@
|
|||
"SNACK-BAR": {
|
||||
"UNSUCCESSFUL-DOI": "Αποτυχία δημιουργίας Μονοσήμαντων Αναγνωριστικών Ψηφιακών Αντικειμένων (DOI)",
|
||||
"SUCCESSFUL-DOI": "Επιτυχία δημιουργίας Μονοσήμαντων Αναγνωριστικών Ψηφιακών Αντικειμένων (DOI)",
|
||||
"UNSUCCESSFUL-FINALIZE": "Αποτυχία οριστικοποιήσης Σχεδίου Διαχείρισης Δεδομένων"
|
||||
"UNSUCCESSFUL-FINALIZE": "Αποτυχία οριστικοποίησης Σχεδίου Διαχείρισης Δεδομένων"
|
||||
},
|
||||
"DESCRIPTION-TEMPLATE-LIST": {
|
||||
"TITLE": "Available Description Templates",
|
||||
|
@ -1154,9 +1169,9 @@
|
|||
"TYPING": "Προσθέστε περισσότερα γράμματα στο όνομα ώστε να είναι πιο πιθανό να βρείτε το σωστό.",
|
||||
"UNIQUE-IDENTIFIER": "Unique Identifier",
|
||||
"RESEARCHER-IDENTIFIER-EXISTS": "Researcher identifier already exists.",
|
||||
"ORGANISATION-IDENTIFIER-EXSTS": "Organisation identifier already exists.",
|
||||
"ORGANISATION-IDENTIFIER-EXSTS": "Organization identifier already exists.",
|
||||
"IDENTIFIER-EXISTS-RESEARCHER-LIST": "This identifier is already used by a researcher in the researchers list.",
|
||||
"IDENTIFIER-EXISTS-ORGANISATION-LIST": "This identifier is already used by an organisation in the organisations list.",
|
||||
"IDENTIFIER-EXISTS-ORGANISATION-LIST": "This identifier is already used by an organization in the organizations list.",
|
||||
"SAVE":"Αποθήκευση",
|
||||
"CANCEL": "Ακύρωση"
|
||||
},
|
||||
|
@ -1176,7 +1191,7 @@
|
|||
},
|
||||
"LICENSE-INFO": {
|
||||
"INTRO": "Κάθε Σχέδιο Διαχείρισης Δεδομένων μπορεί να περιλαμβάνει συγκεκριμένες πληροφορίες άδειας σχετικά με το πόσο ανοικτό και διαθέσιμο είναι, ώστε να μπορείτε να καθορίσετε ποιος μπορεί να δει το σύνολο δεδομένων σας και για πόσο τα δεδομένα θα είναι ιδιωτικά.",
|
||||
"HINT": "Μία σύντομη περιγραφή για την άδεια που χρηρισοποιεί το Σχέδιο Διαχείρισης Δεδομένων, το είδος της και πότε θα είναι ανοικτό.",
|
||||
"HINT": "Μία σύντομη περιγραφή για την άδεια που χρησιμοποιεί το Σχέδιο Διαχείρισης Δεδομένων, το είδος της και πότε θα είναι ανοικτό.",
|
||||
"TYPING": "Προσθέστε περισσότερα γράμματα για να είναι πιο πιθανό να βρείτε το σωστό."
|
||||
},
|
||||
"DATASET-DESCRIPTION": {
|
||||
|
@ -1203,6 +1218,11 @@
|
|||
"PUBLISHED": "Δημοσιευμένα",
|
||||
"LAST-EDITED": "Τελευταία Επεξεργασία"
|
||||
},
|
||||
"ACTIONS": {
|
||||
"CLONE": "Clone",
|
||||
"DOWNLOAD-XML":"Download XML",
|
||||
"DELETE": "Delete"
|
||||
},
|
||||
"UPLOAD": {
|
||||
"UPLOAD-XML": "Εισαγωγή",
|
||||
"UPLOAD-XML-FILE-TITLE": "Εισαγωγή Template Σχεδίου Διαχείρισης Δεδομένων",
|
||||
|
@ -1277,6 +1297,10 @@
|
|||
"SELECT-DATASET-TEMPLATES": "Επιλογή Templates Περιγραφής Συνόλου Δεδομένων",
|
||||
"RELATED-DATASET-TEMPLATES": "Σχετικά Templates Περιγραφής Συνόλων Δεδομένων"
|
||||
},
|
||||
"BLUEPRINT": {
|
||||
"LIKE": "Search",
|
||||
"STATUS": "Status"
|
||||
},
|
||||
"USERS": {
|
||||
"LABEL": "Αναζήτηση",
|
||||
"ROLE": "Ρόλος",
|
||||
|
@ -1349,6 +1373,10 @@
|
|||
"VIEW-MORE": "Δείτε περισσότερα",
|
||||
"VIEW-LESS": "Δείτε λιγότερα"
|
||||
}
|
||||
},
|
||||
"MAX-DESCRIPTION-DIALOG": {
|
||||
"TITLE": "Max datasets using this template.",
|
||||
"MESSAGE": "Select another profile."
|
||||
}
|
||||
},
|
||||
"DATASET-CREATE-WIZARD": {
|
||||
|
@ -1362,13 +1390,13 @@
|
|||
"PLACEHOLDER": "Επιλέξτε ένα Σχέδιο Διαχείρισης Δεδομένων από τη συλλογή σας"
|
||||
},
|
||||
"PREFILL-STEP": {
|
||||
"TITLE": "Initialize your Dataset",
|
||||
"TITLE": "Initialize your Description",
|
||||
"PREFILL": "Prefill",
|
||||
"OR": "OR",
|
||||
"HINT": "Select the dataset from Zenodo to automatically retrieve answers to some questions in your template or start by answering the questions manually.",
|
||||
"HINT": "Select an entry from Zenodo to automatically retrieve answers to some questions in your template or start by answering the questions manually.",
|
||||
"MANUALLY": "Manually",
|
||||
"PROFILE": "Dataset Template",
|
||||
"PREFILLED-DATASET": "Prefilled Dataset",
|
||||
"PROFILE": "Description Template",
|
||||
"PREFILLED-DATASET": "Prefilled Description",
|
||||
"SEARCH": "Start typing to search for a dataset or software",
|
||||
"NEXT": "Next"
|
||||
}
|
||||
|
@ -1433,7 +1461,7 @@
|
|||
"SOURCES": "Πηγές",
|
||||
"SOURCE:": "Πηγή: ",
|
||||
"NO-SOURCE": "Δε συνδέεται με την πηγή",
|
||||
"OUTPUT": "Αποτελέσμα",
|
||||
"OUTPUT": "Αποτέλεσμα",
|
||||
"SELECT": "Επιλέξτε"
|
||||
},
|
||||
"DMP": {
|
||||
|
@ -1670,7 +1698,7 @@
|
|||
"DMP-QUESTION": "Τι είναι το DMP στο {{ APP_NAME_CAPS }}?",
|
||||
"INFO-TEXT": "Το {{ APP_NAME_CAPS }} είναι μια ανοικτή επεκτάσιμη υπηρεσία που απλοποιεί τη διαχείριση, την επικύρωση, την παρακολούθηση και τη συντήρηση των Σχεδίων Διαχείρισης Δεδομένων. Επιτρέπει στους φορείς (ερευνητές, υπεύθυνους έρευνας, διευθυντές κλπ.) να δημιουργούν ζωντανά Σχέδια Διαχείρισης Δεδομένων που μπορούν να ανταλλάσσονται ελεύθερα μεταξύ των υποδομών για τη διεξαγωγή συγκεκριμένων πτυχών της διαδικασίας διαχείρισης Δεδομένων, σύμφωνα με τις προθέσεις και τη δέσμευση των κατόχων Δεδομένων.",
|
||||
"INFO-DMP-TEXT": "Ένα Σχέδιο Διαχείρισης Δεδομένων είναι ένα ζωντανό αρχείο που περιγραφεί τα σύνολα δεδομένων που έχουν παραχθεί ή και επαναχρησιμοποιηθεί κατά τη διάρκεια και μετά του κύκλου ζωής της έρευνας. Τα Σχέδια Διαχείρισης Δεδομένων έχουν ως στόχο να παρέχουν στους ερευνητές τις αναγκαίες πληροφορίες για την αναπαραγωγή, επαναδιανομή και ανακατεύθυνση του σκοπού των ερευνητικών αποτελεσμάτων ώστε να εξασφαλίζεται η εγκυρότητα και η εκμετάλλευσή τους.",
|
||||
"NEW-QUESTION": "Νέος με τα DMP; Επίσκεψου",
|
||||
"NEW-QUESTION": "Νέος με τα DMP; Επισκέψου",
|
||||
"START-YOUR-FIRST-DMP": "Ξεκινήστε το πρώτο σας DMP",
|
||||
"OPEN-AIR-GUIDE": "Οδηγός για ερευνητές του OpenAIRE",
|
||||
"LEARN-MORE": "για να μάθετε περισσότερα για το πώς να δημιουργήσετε ένα!",
|
||||
|
@ -1691,7 +1719,7 @@
|
|||
"ALL": "Όλα",
|
||||
"EMPTY-LIST": "Τίποτα ακόμα εδώ.",
|
||||
"LATEST-ACTIVITY": "Τελευταία Δραστηριότητα",
|
||||
"DMP-ABOUT-BEG": "Ένα Σχέδιο Διαχείρισης Δεδομένων αποτελέιται από τις βασικές πληροφορίες σχετικά με την έρευνα, όπως ο σκοπός, οι στόχοι και οι εμπλεκόμενοι ερευνητές, αλλά και σχετικά με την τεκμηρίωση των ερευνητικών συνόλων δεδομένων, δηλαδή",
|
||||
"DMP-ABOUT-BEG": "Ένα Σχέδιο Διαχείρισης Δεδομένων αποτελείται από τις βασικές πληροφορίες σχετικά με την έρευνα, όπως ο σκοπός, οι στόχοι και οι εμπλεκόμενοι ερευνητές, αλλά και σχετικά με την τεκμηρίωση των ερευνητικών συνόλων δεδομένων, δηλαδή",
|
||||
"DMP-ABOUT-END": ", που υπογραμμίζουν τα βήματα που ακολουθήθηκαν και τα μέσα που χρησιμοποιήθηκαν κατά τις δραστηριότητες διαχείρισης δεδομένων.",
|
||||
"SELECT-DMP": "Επιλέξτε ένα Σχέδιο Διαχείρισης Δεδομένων για το Σύνολο Δεδομένων σας",
|
||||
"ACTIONS": {
|
||||
|
@ -1949,5 +1977,11 @@
|
|||
"DRAFT": "Πρόχειρα",
|
||||
"FINALIZED": "Οριστικοποιημένα",
|
||||
"DELETED": "Deleted"
|
||||
},
|
||||
"BLUEPRINT-STATUS": {
|
||||
"NONE": "None",
|
||||
"DRAFT": "Draft",
|
||||
"FINALIZED": "Finalized",
|
||||
"DELETED": "Deleted"
|
||||
}
|
||||
}
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue