Merge remote-tracking branch 'origin/ui-redesign' into ui-redesign

This commit is contained in:
George Kalampokis 2020-07-03 11:37:40 +03:00
commit 7197892352
112 changed files with 49705 additions and 903 deletions

View File

@ -2,7 +2,6 @@ package eu.eudat.data.dao.entities.security;
import eu.eudat.data.dao.DatabaseAccessLayer;
import eu.eudat.data.entities.Credential;
import sun.security.krb5.Credentials;
import java.util.UUID;

View File

@ -195,6 +195,36 @@
<artifactId>log4j-to-slf4j</artifactId>
<version>2.8.2</version>
</dependency>
<!-- https://mvnrepository.com/artifact/javax.xml.bind/jaxb-api -->
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>2.3.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.glassfish.jaxb/jaxb-core -->
<dependency>
<groupId>org.glassfish.jaxb</groupId>
<artifactId>jaxb-core</artifactId>
<version>2.3.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.glassfish.jaxb/jaxb-runtime -->
<dependency>
<groupId>org.glassfish.jaxb</groupId>
<artifactId>jaxb-runtime</artifactId>
<version>2.3.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/javax.annotation/javax.annotation-api -->
<dependency>
<groupId>javax.annotation</groupId>
<artifactId>javax.annotation-api</artifactId>
<version>1.3.1</version>
</dependency>
</dependencies>

View File

@ -40,6 +40,8 @@ public class ResponsesCache {
caches.add(new GuavaCache("tags", CacheBuilder.newBuilder().expireAfterAccess(HOW_MANY, TIME_UNIT).build()));
caches.add(new GuavaCache("researchers", CacheBuilder.newBuilder().expireAfterAccess(HOW_MANY, TIME_UNIT).build()));
caches.add(new GuavaCache("externalDatasets", CacheBuilder.newBuilder().expireAfterAccess(HOW_MANY, TIME_UNIT).build()));
caches.add(new GuavaCache("currencies", CacheBuilder.newBuilder().expireAfterAccess(HOW_MANY, TIME_UNIT).build()));
caches.add(new GuavaCache("licenses", CacheBuilder.newBuilder().expireAfterAccess(HOW_MANY, TIME_UNIT).build()));
simpleCacheManager.setCaches(caches);
logger.info("OK");
return simpleCacheManager;

View File

@ -2,6 +2,7 @@ package eu.eudat.controllers;
import eu.eudat.logic.managers.ContactEmailManager;
import eu.eudat.models.data.ContactEmail.ContactEmailModel;
import eu.eudat.models.data.ContactEmail.PublicContactEmailModel;
import eu.eudat.models.data.helpers.responses.ResponseItem;
import eu.eudat.models.data.security.Principal;
import eu.eudat.types.ApiMessageCode;
@ -38,4 +39,18 @@ public class ContactEmail {
return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(new ResponseItem().status(ApiMessageCode.ERROR_MESSAGE).message(ex.getMessage()));
}
}
@Transactional
@RequestMapping(method = RequestMethod.POST, path = "public", consumes = "application/x-www-form-urlencoded", produces = "application/json")
public @ResponseBody
ResponseEntity sendContactEmailNoAuth(@ModelAttribute PublicContactEmailModel contactEmailModel) {
logger.info(contactEmailModel.toString());
try {
this.contactEmailManager.sendContactEmailNoAuth(contactEmailModel);
return ResponseEntity.status(HttpStatus.NO_CONTENT).body(new ResponseItem().status(ApiMessageCode.SUCCESS_MESSAGE));
} catch (Exception ex) {
logger.error(ex.getMessage(), ex);
return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(new ResponseItem().status(ApiMessageCode.ERROR_MESSAGE).message(ex.getMessage()));
}
}
}

View File

@ -0,0 +1,31 @@
package eu.eudat.controllers;
import eu.eudat.logic.managers.LocalFetchManager;
import eu.eudat.models.data.helpers.responses.ResponseItem;
import eu.eudat.models.data.local.LocalFetchModel;
import eu.eudat.types.ApiMessageCode;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@RestController
@CrossOrigin
@RequestMapping(value = "api/currency")
public class CurrencyController {
private LocalFetchManager localFetchManager;
@Autowired
public CurrencyController(LocalFetchManager localFetchManager) {
this.localFetchManager = localFetchManager;
}
@RequestMapping(method = RequestMethod.GET)
public ResponseEntity<ResponseItem<List<LocalFetchModel>>> getCurrencies( @RequestParam(value = "query", required = false) String query) throws Exception {
List<LocalFetchModel> currencies = localFetchManager.getCurrency(query);
return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem<List<LocalFetchModel>>().status(ApiMessageCode.NO_MESSAGE).payload(currencies));
}
}

View File

@ -0,0 +1,41 @@
package eu.eudat.controllers;
import eu.eudat.logic.managers.LicenseManager;
import eu.eudat.logic.proxy.config.exceptions.HugeResultSet;
import eu.eudat.logic.proxy.config.exceptions.NoURLFound;
import eu.eudat.logic.services.ApiContext;
import eu.eudat.models.data.helpers.responses.ResponseItem;
import eu.eudat.models.data.license.LicenseModel;
import eu.eudat.models.data.security.Principal;
import eu.eudat.types.ApiMessageCode;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@RestController
@CrossOrigin
@RequestMapping(value = {"/api/external/licenses"})
public class Licenses extends BaseController {
private LicenseManager licenseManager;
@Autowired
public Licenses(ApiContext apiContext, LicenseManager licenseManager) {
super(apiContext);
this.licenseManager = licenseManager;
}
@RequestMapping(method = RequestMethod.GET, produces = "application/json")
public @ResponseBody
ResponseEntity<ResponseItem<List<LicenseModel>>> listExternalLicenses(
@RequestParam(value = "query", required = false) String query, @RequestParam(value = "type", required = false) String type, Principal principal
) throws HugeResultSet, NoURLFound {
List<LicenseModel> licenseModels = this.licenseManager.getLicenses(query, type);
return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem<List<LicenseModel>>().status(ApiMessageCode.NO_MESSAGE).payload(licenseModels));
}
}

View File

@ -1,8 +1,6 @@
package eu.eudat.controllers;
import com.sun.org.apache.xpath.internal.operations.Bool;
import eu.eudat.logic.managers.LockManager;
import eu.eudat.models.data.dmp.DataManagementPlan;
import eu.eudat.models.data.helpers.responses.ResponseItem;
import eu.eudat.models.data.lock.Lock;
import eu.eudat.models.data.security.Principal;

View File

@ -4,7 +4,6 @@ import eu.eudat.exceptions.security.UnauthorisedException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.annotation.Order;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
@ -20,11 +19,9 @@ import javax.annotation.Priority;
@Priority(4)
public class ControllerUnauthorisedHandler {
private static final Logger logger = LoggerFactory.getLogger(ControllerUnauthorisedHandler.class);
// private Logger logger;
@Autowired
public ControllerUnauthorisedHandler(/*Logger logger*/) {
// this.logger = logger;
public ControllerUnauthorisedHandler() {
}
@ExceptionHandler(UnauthorisedException.class)

View File

@ -1,6 +1,5 @@
package eu.eudat.controllers.interceptors;
import eu.eudat.logic.services.helpers.LoggerService;
import eu.eudat.types.WarningLevel;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@ -18,11 +17,9 @@ import java.util.Date;
@Component
public class RequestInterceptor extends HandlerInterceptorAdapter {
private static final Logger logger = LoggerFactory.getLogger(RequestInterceptor.class);
// private LoggerService loggerService;
@Autowired
public RequestInterceptor(/*LoggerService loggerService*/) {
// this.loggerService = loggerService;
public RequestInterceptor() {
}
@Override

View File

@ -26,10 +26,26 @@ public class AdminManager {
viewStyleDoc.appendChild(elementViewStyle);
String xml = XmlBuilder.generateXml(viewStyleDoc);
if (profile.getDescription() == null) {
profile.setDescription("");
}
if (profile.getLanguage() == null) {
profile.setLanguage("en");
}
eu.eudat.data.entities.DatasetProfile datasetProfile = apiContext.getOperationsContext().getBuilderFactory().getBuilder(DatasetProfileBuilder.class).definition(xml).label(profile.getLabel())
.status(profile.getStatus()).created(new Date()).description(profile.getDescription()).language(profile.getLanguage())
.build();
if (datasetProfile.getGroupId() == null) {
datasetProfile.setGroupId(UUID.randomUUID());
}
if (datasetProfile.getVersion() == null) {
datasetProfile.setVersion((short)1);
}
return datasetProfile;
}

View File

@ -3,6 +3,7 @@ package eu.eudat.logic.managers;
import eu.eudat.data.entities.UserInfo;
import eu.eudat.logic.services.ApiContext;
import eu.eudat.models.data.ContactEmail.ContactEmailModel;
import eu.eudat.models.data.ContactEmail.PublicContactEmailModel;
import eu.eudat.models.data.mail.SimpleMail;
import eu.eudat.models.data.security.Principal;
import org.springframework.core.env.Environment;
@ -35,6 +36,17 @@ public class ContactEmailManager {
apiContext.getUtilitiesService().getMailService().sendSimpleMail(mail);
}
public void sendContactEmailNoAuth(PublicContactEmailModel contactEmailModel) throws MessagingException {
SimpleMail mail = new SimpleMail();
String enrichedMail = contactEmailModel.getMessage() + "\n\n" + "Send by user: " + contactEmailModel.getEmail() ;
mail.setSubject(contactEmailModel.getAffiliation());
mail.setTo(environment.getProperty("contact_email.mail"));
mail.setContent(enrichedMail);
mail.setFrom(contactEmailModel.getEmail());
apiContext.getUtilitiesService().getMailService().sendSimpleMail(mail);
}
public void emailValidation(ContactEmailModel contactEmailModel) throws Exception {
if (contactEmailModel.getSubject() == null || contactEmailModel.getSubject().trim().isEmpty()) {
throw new Exception("Subject is empty");

View File

@ -1,6 +1,5 @@
package eu.eudat.logic.managers;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import eu.eudat.configurations.dynamicgrant.DynamicGrantConfiguration;
@ -14,10 +13,8 @@ import eu.eudat.data.enumeration.notification.ActiveStatus;
import eu.eudat.data.enumeration.notification.ContactType;
import eu.eudat.data.enumeration.notification.NotificationType;
import eu.eudat.data.enumeration.notification.NotifyState;
import eu.eudat.data.query.items.item.dmp.DataManagementPlanCriteriaRequest;
import eu.eudat.data.query.items.table.datasetprofile.DatasetProfileTableRequestItem;
import eu.eudat.data.query.items.table.dmp.DataManagementPlanTableRequest;
import eu.eudat.data.query.items.table.dmp.DataManagmentPlanPublicTableRequest;
import eu.eudat.elastic.criteria.DmpCriteria;
import eu.eudat.elastic.entities.Collaborator;
import eu.eudat.elastic.entities.Dmp;
@ -83,14 +80,13 @@ import org.springframework.web.multipart.MultipartFile;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import javax.persistence.criteria.Join;
import javax.persistence.criteria.JoinType;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Unmarshaller;
import java.io.*;
import java.math.BigInteger;
import java.nio.file.Files;
import java.time.Instant;
import java.util.*;
import java.util.concurrent.CompletableFuture;
import java.util.stream.Collectors;
@ -1412,7 +1408,9 @@ public class DataManagementPlanManager {
}
databaseRepository.getDmpDao().createOrUpdate(dmp);
assignUser(dmp, me);
this.updateIndex(dmp);
if (this.apiContext.getOperationsContext().getElasticRepository().getDmpRepository().getClient() != null) {
this.updateIndex(dmp);
}
dmp.getDataset().forEach(dataset -> {
dataset.setStatus(Dataset.Status.SAVED.getValue());
dataset.setCreated(new Date());
@ -1665,6 +1663,7 @@ public class DataManagementPlanManager {
headers.setAccept(Collections.singletonList(MediaType.APPLICATION_JSON));
headers.setContentType(MediaType.APPLICATION_JSON);
String createData = null;
Map<String, Object> extraProperties = dmp.getExtraProperties() != null ? new org.json.JSONObject(dmp.getExtraProperties()).toMap() : new HashMap<>();
StringBuilder dataBuilder = new StringBuilder();
dataBuilder.append("{\n \"metadata\": {\n");
dataBuilder.append( " \"title\": \"").append(dmp.getLabel()).append("\",\n");
@ -1673,15 +1672,27 @@ public class DataManagementPlanManager {
dataBuilder.append(" \"description\": \"").append((dmp.getDescription() != null && !dmp.getDescription().isEmpty() ? dmp.getDescription() : "<p></p>")).append("\",\n");
dataBuilder.append(" \"version\": \"").append(dmp.getVersion()).append("\",\n");
dataBuilder.append(" \"access_right\": \"");
if (dmp.isPublic()) {
dataBuilder.append("open\",\n");
dataBuilder.append(" \"related_identifiers\": [{\n");
dataBuilder.append(" \t\t\"identifier\": \"").append((this.environment.getProperty("dmp.domain") + "/external/zenodo/" + id.toString())).append("\",\n");
dataBuilder.append(" \t\t\"relation\": \"isIdenticalTo\"}],\n");
if (((Boolean)extraProperties.get("visible"))) {
Instant publicationDate = Instant.parse(extraProperties.get("publicDate").toString());
if (publicationDate.isBefore(Instant.now())) {
dataBuilder.append("open\",\n");
} else {
dataBuilder.append("embargoed\",\n");
dataBuilder.append(" \"embargo_date\": \"" + publicationDate + "\",\n");
}
if (extraProperties.get("license") != null) {
dataBuilder.append(" \"license\": \"").append(((Map)extraProperties.get("license")).get("pid")).append("\",\n");
}
} else {
dataBuilder.append("restricted\",\n");
dataBuilder.append(" \"access_conditions\": \"\",\n");
}
if (dmp.isPublic()) {
dataBuilder.append(" \"related_identifiers\": [{\n");
dataBuilder.append(" \t\t\"identifier\": \"").append((this.environment.getProperty("dmp.domain") + "/external/zenodo/" + id.toString())).append("\",\n");
dataBuilder.append(" \t\t\"relation\": \"isIdenticalTo\"}],\n");
}
dataBuilder.append(" \"contributors\": [");
int i = 0;
for(UserDMP userDMP: dmp.getUsers()) {

View File

@ -0,0 +1,48 @@
package eu.eudat.logic.managers;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import eu.eudat.data.dao.criteria.DataRepositoryCriteria;
import eu.eudat.data.entities.DataRepository;
import eu.eudat.logic.proxy.config.ExternalUrlCriteria;
import eu.eudat.logic.proxy.config.exceptions.HugeResultSet;
import eu.eudat.logic.proxy.config.exceptions.NoURLFound;
import eu.eudat.logic.services.ApiContext;
import eu.eudat.models.data.datarepository.DataRepositoryModel;
import eu.eudat.models.data.license.LicenseModel;
import eu.eudat.models.data.security.Principal;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
* Created by ikalyvas on 9/3/2018.
*/
@Component
public class LicenseManager {
private ApiContext apiContext;
@Autowired
public LicenseManager(ApiContext apiContext) {
this.apiContext = apiContext;
}
public List<LicenseModel> getLicenses(String query, String type) throws HugeResultSet, NoURLFound {
ExternalUrlCriteria externalUrlCriteria = new ExternalUrlCriteria(query);
List<Map<String, String>> remoteRepos = this.apiContext.getOperationsContext().getRemoteFetcher().getlicenses(externalUrlCriteria, type);
DataRepositoryCriteria criteria = new DataRepositoryCriteria();
if (!query.isEmpty()) criteria.setLike(query);
List<LicenseModel> licenseModels = new LinkedList<>();
ObjectMapper mapper = new ObjectMapper().configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
licenseModels.addAll(remoteRepos.stream().map(item -> mapper.convertValue(item, LicenseModel.class)).collect(Collectors.toList()));
licenseModels = licenseModels.stream().filter(licenseModel -> licenseModel.getName().contains(query)).collect(Collectors.toList());
return licenseModels;
}
}

View File

@ -0,0 +1,28 @@
package eu.eudat.logic.managers;
import eu.eudat.logic.proxy.fetching.LocalFetcher;
import eu.eudat.logic.utilities.helpers.StreamDistinctBy;
import eu.eudat.models.data.local.LocalFetchModel;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
@Component
public class LocalFetchManager {
private LocalFetcher localFetcher;
@Autowired
public LocalFetchManager(LocalFetcher localFetcher) {
this.localFetcher = localFetcher;
}
public List<LocalFetchModel> getCurrency(String query) throws Exception {
List<Map<String, String>> data = localFetcher.retrieveCurrency();
List<LocalFetchModel> result = data.stream().map(entry -> new LocalFetchModel(entry.get("name"), entry.get("value"))).collect(Collectors.toList());
result = result.stream().filter(localFetchModel -> localFetchModel.getValue() != null).filter(StreamDistinctBy.distinctByKey(LocalFetchModel::getValue)).filter(localFetchModel -> localFetchModel.getName().contains(query)).collect(Collectors.toList());
return result;
}
}

View File

@ -34,8 +34,9 @@ public class RDAManager {
ObjectMapper mapper = new ObjectMapper();
mapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'"));
DMPWrap wrap = new DMPWrap(rdaDmp);
result = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(wrap);
RDAModel model = new RDAModel();
model.setDmp(rdaDmp);
result = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(model);
return result;
}
@ -44,28 +45,7 @@ public class RDAManager {
ObjectMapper mapper = new ObjectMapper();
mapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'"));
Dmp rda = mapper.readValue(json, DMPWrap.class).getDmp();
Dmp rda = mapper.readValue(json, RDAModel.class).getDmp();
return dmpRDAMapper.toEntity(rda, profiles);
}
public static class DMPWrap implements Serializable {
@JsonProperty("dmp")
private Dmp dmp;
public DMPWrap() {
}
public DMPWrap(Dmp dmp) {
this.dmp = dmp;
}
public Dmp getDmp() {
return dmp;
}
public void setDmp(Dmp dmp) {
this.dmp = dmp;
}
}
}

View File

@ -58,7 +58,7 @@ public class DmpMapper {
}
if (dmp.getDataset() != null) {
elastic.setDatasets(dmp.getDataset().stream().map(dataset -> {
elastic.setDatasets(dmp.getDataset().stream().filter(dataset -> dataset.getId() != null).map(dataset -> {
List<Tag> tags = null;
try {
Dataset dataset1 = apiContext.getOperationsContext().getElasticRepository().getDatasetRepository().findDocument(dataset.getId().toString());

View File

@ -24,6 +24,7 @@ public class ExternalUrls implements Serializable {
DatasetUrls datasets;
/*TagUrls tags;*/
FunderUrls funders;
LicenseUrls licenses;
public RegistryUrls getRegistries() {
@ -133,6 +134,15 @@ public class ExternalUrls implements Serializable {
public void setDatasets(DatasetUrls datasets) {
this.datasets = datasets;
}
public LicenseUrls getLicenses() {
return licenses;
}
@XmlElement(name = "licenses")
public void setLicenses(LicenseUrls licenses) {
this.licenses = licenses;
}
}

View File

@ -0,0 +1,33 @@
package eu.eudat.logic.proxy.config.entities;
import eu.eudat.logic.proxy.config.FetchStrategy;
import eu.eudat.logic.proxy.config.UrlConfiguration;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlElementWrapper;
import java.util.List;
public class LicenseUrls {
List<UrlConfiguration> urls;
FetchStrategy fetchMode;
public List<UrlConfiguration> getUrls() {
return urls;
}
@XmlElementWrapper
@XmlElement(name = "urlConfig")
public void setUrls(List<UrlConfiguration> urls) {
this.urls = urls;
}
public FetchStrategy getFetchMode() {
return fetchMode;
}
@XmlElement(name = "fetchMode")
public void setFetchMode(FetchStrategy fetchMode) {
this.fetchMode = fetchMode;
}
}

View File

@ -0,0 +1,99 @@
package eu.eudat.logic.proxy.fetching;
import com.fasterxml.jackson.databind.ObjectMapper;
import eu.eudat.logic.proxy.fetching.entities.Config;
import eu.eudat.logic.proxy.fetching.entities.ConfigSingle;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Component;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.Unmarshaller;
import java.beans.PropertyDescriptor;
import java.io.InputStream;
import java.lang.reflect.Method;
import java.util.*;
@Component
public class LocalFetcher {
@Cacheable("currencies")
public List<Map<String, String>> retrieveCurrency() throws Exception {
InputStream is = getClass().getClassLoader().getResource("internal/fetchConfig.xml").openStream();
JAXBContext context = JAXBContext.newInstance(Config.class);
Unmarshaller unmarshaller = context.createUnmarshaller();
Config config = (Config) unmarshaller.unmarshal(is);
ConfigSingle currencyConfig = config.getConfigs().stream().filter(configSingle -> configSingle.getType().equals("currency")).findFirst().get();
return retrieveData(currencyConfig);
}
public List<Map<String, String>> retrieveData(ConfigSingle configSingle) throws Exception {
List<Map<String, String>> result = new ArrayList<>();
InputStream is = getClass().getClassLoader().getResource(configSingle.getFilePath()).openStream();
FileType type = FileType.fromName(configSingle.getFileType());
switch(type) {
case XML:
{
Class<?> aClass = Class.forName(configSingle.getParseClass());
JAXBContext context = JAXBContext.newInstance(aClass);
Unmarshaller unmarshaller = context.createUnmarshaller();
Object object = unmarshaller.unmarshal(is);
Method reader = null;
if (configSingle.getParseField() != null && !configSingle.getParseField().isEmpty()) {
reader = new PropertyDescriptor(configSingle.getParseField(), aClass).getReadMethod();
}
ObjectMapper objectMapper = new ObjectMapper();
List<Map<String, String>> values = new ArrayList<>();
int max = 1;
if (reader != null) {
Object invokedField = reader.invoke(object);
if (invokedField instanceof Collection) {
max = ((Collection) invokedField).size();
}
}
for (int i = 0; i< max; i++) {
Object value;
if (reader != null) {
Object invokedField = reader.invoke(object);
if (invokedField instanceof Collection) {
value = ((Collection) invokedField).toArray()[i];
} else {
value = invokedField;
}
} else {
value = object;
}
Map<String, String> map = objectMapper.convertValue(value, Map.class);
result.add(new HashMap<>());
result.get(result.size() - 1).put("name", map.get(configSingle.getName()));
result.get(result.size() - 1).put("value", map.get(configSingle.getValue()));
}
}
}
return result;
}
public enum FileType {
XML("xml"), JSON("json");
private String name;
FileType(String name) {
this.name = name;
}
public String getName() {
return name;
}
public static FileType fromName(String name) {
for (FileType type: FileType.values()) {
if (name.equals(type.getName())) {
return type;
}
}
throw new NoSuchElementException("File Type [" + name + "] is not supported");
}
}
}

View File

@ -126,6 +126,15 @@ public class RemoteFetcher {
return getAll(urlConfigs, fetchStrategy, externalUrlCriteria);
}
@Cacheable("licenses")
public List<Map<String, String>> getlicenses(ExternalUrlCriteria externalUrlCriteria, String key) throws NoURLFound, HugeResultSet {
List<UrlConfiguration> urlConfigs =
key != null && !key.isEmpty() ? configLoader.getExternalUrls().getLicenses().getUrls().stream().filter(item -> item.getKey().equals(key)).collect(Collectors.toList())
: configLoader.getExternalUrls().getLicenses().getUrls();
FetchStrategy fetchStrategy = configLoader.getExternalUrls().getLicenses().getFetchMode();
return getAll(urlConfigs, fetchStrategy, externalUrlCriteria);
}
private List<Map<String, String>> getAll(List<UrlConfiguration> urlConfigs, FetchStrategy fetchStrategy, ExternalUrlCriteria externalUrlCriteria) throws NoURLFound, HugeResultSet {

View File

@ -0,0 +1,21 @@
package eu.eudat.logic.proxy.fetching.entities;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlElementWrapper;
import javax.xml.bind.annotation.XmlRootElement;
import java.util.List;
@XmlRootElement(name = "fetchConfig")
public class Config {
private List<ConfigSingle> configs;
@XmlElementWrapper
@XmlElement(name = "config")
public List<ConfigSingle> getConfigs() {
return configs;
}
public void setConfigs(List<ConfigSingle> configs) {
this.configs = configs;
}
}

View File

@ -0,0 +1,71 @@
package eu.eudat.logic.proxy.fetching.entities;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement(name = "config")
public class ConfigSingle {
private String type;
private String fileType;
private String filePath;
private String parseClass;
private String parseField;
private String name;
private String value;
@XmlElement(name = "type")
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
@XmlElement(name = "fileType")
public String getFileType() {
return fileType;
}
public void setFileType(String fileType) {
this.fileType = fileType;
}
@XmlElement(name = "filePath")
public String getFilePath() {
return filePath;
}
public void setFilePath(String filePath) {
this.filePath = filePath;
}
@XmlElement(name = "parseClass")
public String getParseClass() {
return parseClass;
}
public void setParseClass(String parseClass) {
this.parseClass = parseClass;
}
@XmlElement(name = "parseField")
public String getParseField() {
return parseField;
}
public void setParseField(String parseField) {
this.parseField = parseField;
}
@XmlElement(name = "name")
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@XmlElement(name = "value")
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
}

View File

@ -0,0 +1,21 @@
package eu.eudat.logic.proxy.fetching.entities;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlElementWrapper;
import javax.xml.bind.annotation.XmlRootElement;
import java.util.List;
@XmlRootElement(name = "ISO_4217")
public class CurrencyModel {
private List<CurrencySingleModel> currencies;
@XmlElementWrapper(name = "CcyTbl")
@XmlElement(name = "CcyNtry")
public List<CurrencySingleModel> getCurrencies() {
return currencies;
}
public void setCurrencies(List<CurrencySingleModel> currencies) {
this.currencies = currencies;
}
}

View File

@ -0,0 +1,53 @@
package eu.eudat.logic.proxy.fetching.entities;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement(name = "CcyNtry")
public class CurrencySingleModel {
private String country;
private String currency;
private String code;
private Integer numericCode;
private Integer unit;
@XmlElement(name = "CtryNm")
public String getCountry() {
return country;
}
public void setCountry(String country) {
this.country = country;
}
@XmlElement(name = "CcyNm")
public String getCurrency() {
return currency;
}
public void setCurrency(String currency) {
this.currency = currency;
}
@XmlElement(name = "Ccy")
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
@XmlElement(name = "CcyNbr")
public Integer getNumericCode() {
return numericCode;
}
public void setNumericCode(Integer numericCode) {
this.numericCode = numericCode;
}
@XmlElement(name = "CcyMnrUnts")
public Integer getUnit() {
return unit;
}
public void setUnit(Integer unit) {
this.unit = unit;
}
}

View File

@ -93,6 +93,7 @@ public class ModelBuilder {
if (type.equals("researchers")) return (FieldData<U>) new ResearcherData().fromData(data);
if (type.equals("organizations")) return (FieldData<U>) new OrganizationsData().fromData(data);
if (type.equals("datasetIdentifier")) return (FieldData<U>) new DatasetIdentifierData().fromData(data);
if (type.equals("currency")) return (FieldData<U>) new CurrencyData().fromData(data);
return null;
}
@ -130,6 +131,7 @@ public class ModelBuilder {
if (type.equals("researchers")) return (FieldData<U>) new ResearcherData().fromData(data);
if (type.equals("organizations")) return (FieldData<U>) new OrganizationsData().fromData(data);
if (type.equals("datasetIdentifier")) return (FieldData<U>) new DatasetIdentifierData().fromData(data);
if (type.equals("currency")) return (FieldData<U>) new CurrencyData().fromData(data);
return null;
}
}

View File

@ -217,10 +217,12 @@ public class ExportXmlBuilderDatasetProfile {
AutoCompleteData autoCompleteDataObject = (AutoCompleteData) field.getData();
dataOut.setAttribute("label", autoCompleteDataObject.getLabel());
dataOut.setAttribute("type", autoCompleteDataObject.getType());
dataOut.setAttribute("multiAutoComplete", autoCompleteDataObject.getMultiAutoComplete().toString());
for (AutoCompleteData.AutoCompleteSingleData singleData: autoCompleteDataObject.getAutoCompleteSingleDataList()) {
Element singleItem = element.createElement("autocompleteSingle");
singleItem.setAttribute("optionsRoot", singleData.getOptionsRoot());
singleItem.setAttribute("url", singleData.getUrl());
singleItem.setAttribute("autoCompleteType", Integer.toString(singleData.getAutocompleteType()));
if (singleData.getAutoCompleteOptions() != null) {
Element optionChild = element.createElement("option");
optionChild.setAttribute("label", singleData.getAutoCompleteOptions().getLabel());

View File

@ -0,0 +1,41 @@
package eu.eudat.models.data.ContactEmail;
public class PublicContactEmailModel {
private String fullName;
private String email;
private String affiliation;
private String message;
public String getFullName() {
return fullName;
}
public void setFullName(String fullName) {
this.fullName = fullName;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getAffiliation() {
return affiliation;
}
public void setAffiliation(String affiliation) {
this.affiliation = affiliation;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}

View File

@ -128,7 +128,7 @@ public class AutoCompleteData extends ComboBoxData<AutoCompleteData> {
if (data != null) {
this.multiAutoComplete = (Boolean) ((Map<Boolean, Object>) data).get("multiAutoComplete");
List<Map<String, Object>> dataList = (List<Map<String, Object>>) ((Map<String, Object>) data).get("autoCompleteSingleDataList");
List<Map<String, Object>> dataList = (List<Map<String, Object>>) ((Map<String, Object>) data).get("autocompleteSingle");
this.autoCompleteSingleDataList = new ArrayList<>();
@ -168,16 +168,36 @@ public class AutoCompleteData extends ComboBoxData<AutoCompleteData> {
public Map<String, Object> toMap(Element item) {
HashMap dataMap = new HashMap();
dataMap.put("label", item != null ? item.getAttribute("label") : "");
dataMap.put("url", item != null ? item.getAttribute("url") : "");
//dataMap.put("url", item != null ? item.getAttribute("url") : "");
dataMap.put("type", item != null ? item.getAttribute("type") : "autocomplete");
dataMap.put("optionsRoot", item != null ? item.getAttribute("optionsRoot") : "");
Element optionElement = (Element) item.getElementsByTagName("option").item(0);
dataMap.put("multiAutoComplete", item != null ? Boolean.valueOf(item.getAttribute("multiAutoComplete")) : false);
List<Map<String, Object>> autoCompletes = new ArrayList<>();
NodeList autoCompleteSingles = item.getChildNodes();
for (int i = 0; i < autoCompleteSingles.getLength(); i++) {
if (autoCompleteSingles.item(i) instanceof Element && !((Element) autoCompleteSingles.item(i)).getTagName().equals("option")) {
Element node = (Element) autoCompleteSingles.item(i);
if (!node.hasChildNodes()) {
node.appendChild(node);
}
autoCompletes.add(singleToMap(node));
} else if (((Element) autoCompleteSingles.item(i)).getTagName().equals("option")) {
Element node = item.getOwnerDocument().createElement("autocompleteSingle");
node.appendChild(autoCompleteSingles.item(i));
node.setAttribute("url", item.getAttribute("url"));
node.setAttribute("optionsRoot", item.getAttribute("optionsRoot"));
autoCompletes.add(singleToMap(node));
}
}
dataMap.put("autocompleteSingle", autoCompletes);
//dataMap.put("optionsRoot", item != null ? item.getAttribute("optionsRoot") : "");
//Element optionElement = (Element) item.getElementsByTagName("option").item(0);
// if (optionElement != null) {
// this.autoCompleteOptions = new Option();
// this.autoCompleteOptions.setLabel(optionElement.getAttribute("label"));
// this.autoCompleteOptions.setValue(optionElement.getAttribute("value"));
// }
dataMap.put("autoCompleteOptions", item != null ? optionToMap(optionElement) : null);
// dataMap.put("autoCompleteOptions", item != null ? optionToMap(optionElement) : null);
return dataMap;
}
@ -189,6 +209,18 @@ public class AutoCompleteData extends ComboBoxData<AutoCompleteData> {
return dataMap;
}
private Map<String, Object> singleToMap(Element item) {
Map<String, Object> dataMap = new HashMap<>();
if (!item.getAttribute("autoCompleteType").isEmpty()) {
dataMap.put("autoCompleteType", Integer.parseInt(item.getAttribute("autoCompleteType")));
}
dataMap.put("optionsRoot", item != null ? item.getAttribute("optionsRoot") : "");
dataMap.put("url", item != null ? item.getAttribute("url") : "");
Element optionElement = (Element) item.getElementsByTagName("option").item(0);
dataMap.put("autoCompleteOptions", item != null ? optionToMap(optionElement) : null);
return dataMap;
}
public enum AutocompleteType {
UNCACHED(0), CACHED(1);

View File

@ -0,0 +1,42 @@
package eu.eudat.models.data.components.commons.datafield;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import java.util.HashMap;
import java.util.Map;
public class CurrencyData extends FieldData<CurrencyData> {
@Override
public CurrencyData fromData(Object data) {
if (data != null) {
this.setLabel((String) ((Map<String, Object>) data).get("label"));
}
return this;
}
@Override
public Object toData() {
return null;
}
@Override
public Element toXml(Document doc) {
Element root = doc.createElement("data");
root.setAttribute("label", this.getLabel());
return root;
}
@Override
public CurrencyData fromXml(Element item) {
this.setLabel(item != null ? item.getAttribute("label") : "");
return this;
}
@Override
public Map<String, Object> toMap(Element item) {
HashMap dataMap = new HashMap();
dataMap.put("label", item != null ? item.getAttribute("label") : "");
return dataMap;
}
}

View File

@ -7,6 +7,7 @@ import eu.eudat.models.data.funder.FunderDMPEditorModel;
import eu.eudat.models.data.grant.GrantDMPEditorModel;
import eu.eudat.models.data.project.ProjectDMPEditorModel;
import eu.eudat.models.data.userinfo.UserInfo;
import net.minidev.json.JSONObject;
import java.util.*;
import java.util.stream.Collectors;
@ -31,6 +32,7 @@ public class DataManagementPlanNewVersionModel implements DataModel<DMP, DataMan
private List<Dataset> datasets;
private ProjectDMPEditorModel project;
private FunderDMPEditorModel funder;
private Map<String, Object> extraProperties;
public UUID getId() {
return id;
@ -144,6 +146,14 @@ public class DataManagementPlanNewVersionModel implements DataModel<DMP, DataMan
this.funder = funder;
}
public Map<String, Object> getExtraProperties() {
return extraProperties;
}
public void setExtraProperties(Map<String, Object> extraProperties) {
this.extraProperties = extraProperties;
}
@Override
public DataManagementPlanNewVersionModel fromDataModel(DMP entity) {
return null;
@ -244,6 +254,7 @@ public class DataManagementPlanNewVersionModel implements DataModel<DMP, DataMan
}
}
entity.setExtraProperties(this.extraProperties != null ? JSONObject.toJSONString(this.extraProperties) : null);
if (this.profiles != null)
entity.setAssociatedDmps(this.profiles.stream().map(x -> x.toData()).collect(Collectors.toSet()));
return entity;

View File

@ -0,0 +1,19 @@
package eu.eudat.models.data.external;
import java.util.List;
import java.util.Map;
public class LicensesExternalSourcesModel extends ExternalListingItem<LicensesExternalSourcesModel> {
@Override
public LicensesExternalSourcesModel fromExternalItem(List<Map<String, String>> values) {
for (Map<String, String> item : values) {
ExternalSourcesItemModel model = new ExternalSourcesItemModel();
model.setId(item.get("id"));
model.setUri(item.get("uri"));
model.setName(item.get("name"));
this.add(model);
}
return this;
}
}

View File

@ -0,0 +1,127 @@
package eu.eudat.models.data.license;
import eu.eudat.data.entities.DataRepository;
import eu.eudat.data.entities.UserInfo;
import eu.eudat.models.DataModel;
import java.util.Date;
import java.util.UUID;
public class LicenseModel implements DataModel<DataRepository, LicenseModel> {
private UUID id;
private String name;
private String pid;
private String abbreviation;
private String uri;
private Date created;
private Date modified;
private String tag; // Api fetching the data
private String source; // Actual harvested source
public UUID getId() {
return id;
}
public void setId(UUID id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPid() {
return pid;
}
public void setPid(String pid) {
this.pid = pid;
}
public String getAbbreviation() {
return abbreviation;
}
public void setAbbreviation(String abbreviation) {
this.abbreviation = abbreviation;
}
public String getUri() {
return uri;
}
public void setUri(String uri) {
this.uri = uri;
}
public Date getCreated() {
return created;
}
public void setCreated(Date created) {
this.created = created;
}
public Date getModified() {
return modified;
}
public void setModified(Date modified) {
this.modified = modified;
}
public String getTag() {
return tag;
}
public void setTag(String tag) {
this.tag = tag;
}
public String getSource() {
return source;
}
public void setSource(String source) {
this.source = source;
}
@Override
public LicenseModel fromDataModel(DataRepository entity) {
this.setAbbreviation(entity.getAbbreviation());
this.setName(entity.getLabel());
this.setUri(entity.getUri());
this.setId(entity.getId());
this.setPid(entity.getReference());
String source1 = entity.getReference().substring(0, entity.getReference().indexOf(":"));
if (source1.equals("dmp")) {
this.source = "Internal";
} else {
this.source = source1;
}
return this;
}
@Override
public DataRepository toDataModel() throws Exception {
DataRepository dataRepository = new DataRepository();
dataRepository.setId(this.id != null ? this.id : UUID.randomUUID());
dataRepository.setAbbreviation(this.abbreviation);
dataRepository.setCreated(this.created != null ? this.created : new Date());
dataRepository.setModified(new Date());
dataRepository.setLabel(this.name);
if (this.source != null) {
if (this.source.equals("Internal") || this.source.equals(this.id.toString().substring(0, this.source.length()))) {
dataRepository.setReference(this.id.toString());
} else {
dataRepository.setReference(this.source + ":" + dataRepository.getId());
}
} else {
dataRepository.setReference("dmp:" + dataRepository.getId());
}
dataRepository.setUri(this.uri);
dataRepository.setStatus((short) 0);
dataRepository.setCreationUser(new UserInfo());
return dataRepository;
}
@Override
public String getHint() {
return null;
}
}

View File

@ -0,0 +1,27 @@
package eu.eudat.models.data.local;
public class LocalFetchModel {
private String name;
private String value;
public LocalFetchModel(String name, String value) {
this.name = name;
this.value = value;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
}

View File

@ -6,10 +6,7 @@ import eu.eudat.models.data.dmp.AssociatedProfile;
import eu.eudat.models.data.security.Principal;
import eu.eudat.models.data.userinfo.UserListingModel;
import java.util.Date;
import java.util.LinkedList;
import java.util.List;
import java.util.UUID;
import java.util.*;
public class DmpQuickWizardModel {
@ -19,6 +16,7 @@ public class DmpQuickWizardModel {
private AssociatedProfile datasetProfile;
private String description;
private eu.eudat.models.data.grant.Grant grant;
private String language;
public UUID getId() {
@ -65,6 +63,14 @@ public class DmpQuickWizardModel {
this.grant = grant;
}
public String getLanguage() {
return language;
}
public void setLanguage(String language) {
this.language = language;
}
public eu.eudat.models.data.dmp.DataManagementPlan toDataDmp(Grant grant, Project project, Principal principal) {
eu.eudat.models.data.dmp.DataManagementPlan dataManagementPlanEntity = new eu.eudat.models.data.dmp.DataManagementPlan();
@ -93,6 +99,8 @@ public class DmpQuickWizardModel {
eu.eudat.models.data.userinfo.UserInfo userInfo = new eu.eudat.models.data.userinfo.UserInfo();
userInfo.setId(principal.getId());
dataManagementPlanEntity.setAssociatedUsers(user);
dataManagementPlanEntity.setExtraProperties(new HashMap<>());
dataManagementPlanEntity.getExtraProperties().put("language", this.language);
return dataManagementPlanEntity;
}

View File

@ -5,7 +5,6 @@ import eu.eudat.models.data.properties.PropertiesGenerator;
import eu.eudat.models.data.user.composite.PropertiesModelBuilder;
import eu.eudat.logic.utilities.builders.ModelBuilder;
import eu.eudat.logic.utilities.interfaces.ViewStyleDefinition;
import sun.rmi.runtime.NewThreadAction;
import java.security.Key;
import java.util.*;

View File

@ -217,20 +217,22 @@ public class DatasetRDAMapper {
properties.putAll(DistributionRDAMapper.toProperties(rda.getDistribution().get(0), datasetDescriptionObj));
}
List <String> keywordIds = rda.getAdditionalProperties().entrySet().stream().filter(entry -> entry.getKey().startsWith("keyword")).map(entry -> entry.getValue().toString()).collect(Collectors.toList());
boolean takeAll = false;
if (keywordIds.size() < rda.getKeyword().size()) {
takeAll = true;
}
for (int i = 0; i < keywordIds.size(); i++) {
if (takeAll) {
List<String> tags = new ArrayList<>();
for (String keyword: rda.getKeyword()) {
tags.add(mapper.writeValueAsString(toTagEntity(keyword)));
if (rda.getKeyword() != null) {
List<String> keywordIds = rda.getAdditionalProperties().entrySet().stream().filter(entry -> entry.getKey().startsWith("keyword")).map(entry -> entry.getValue().toString()).collect(Collectors.toList());
boolean takeAll = false;
if (keywordIds.size() < rda.getKeyword().size()) {
takeAll = true;
}
for (int i = 0; i < keywordIds.size(); i++) {
if (takeAll) {
List<String> tags = new ArrayList<>();
for (String keyword : rda.getKeyword()) {
tags.add(mapper.writeValueAsString(toTagEntity(keyword)));
}
properties.put(keywordIds.get(i), tags);
} else {
properties.put(keywordIds.get(i), mapper.writeValueAsString(toTagEntity(rda.getKeyword().get(i))));
}
properties.put(keywordIds.get(i), tags);
} else {
properties.put(keywordIds.get(i), mapper.writeValueAsString(toTagEntity(rda.getKeyword().get(i))));
}
}

View File

@ -42,7 +42,9 @@ public class DmpRDAMapper {
rda.setTitle(dmp.getLabel());
Map<String, Object> extraProperties = new org.json.JSONObject(dmp.getExtraProperties()).toMap();
rda.setLanguage(LanguageRDAMapper.mapLanguageIsoToRDAIso(extraProperties.get("language").toString()));
if (!extraProperties.isEmpty()) {
rda.setLanguage(LanguageRDAMapper.mapLanguageIsoToRDAIso(extraProperties.get("language").toString()));
}
UserInfo creator;
if (dmp.getCreator() != null) {

View File

@ -77,7 +77,7 @@ zenodo.login.redirect_uri=http://localhost:4200/login/external/zenodo
#############CONTACT EMAIL CONFIGURATIONS#########
contact_email.mail=
language.path=i18n/
language.path=dmp-frontend/src/assets/i18n/
#############LOGGING#########
logging.config=classpath:logging/logback-${spring.profiles.active}.xml

View File

@ -497,7 +497,7 @@
<repositories>
<urls>
<urlConfig>
<key>openAire</key>
<key>openaire</key>
<label>OpenAIRE</label>
<ordinal>1</ordinal>
<type>External</type>
@ -514,6 +514,24 @@
</data>
<paginationpath>$['meta']['pagination']['page','pages','count']</paginationpath>
</urlConfig>
<urlConfig>
<key>openairealt</key>
<label>OpenAIRE Alternative</label>
<ordinal>1</ordinal>
<type>External</type>
<url>https://services.openaire.eu/search/v2/api/resources?query=oaftype%20exact%20datasource%20and%20{like}&amp;page={page}&amp;size={pageSize}&amp;format=json</url>
<firstPage>0</firstPage>
<contenttype>application/json;charset=UTF-8</contenttype>
<data>
<path>$['results'][*]['result']['metadata']['oaf:entity']['oaf:datasource']</path>
<fields>
<id>'originalId'</id>
<name>'officialname'</name>
<count>'count'</count>
</fields>
</data>
<paginationpath>$['meta']['pagination']['page','pages','count']</paginationpath>
</urlConfig>
<!--<urlConfig>
<key>cristin</key>
<label>Cristin</label>
@ -799,6 +817,24 @@
</data>
<paginationpath>$['number_of_results']</paginationpath>
</urlConfig>
<urlConfig>
<key>openaire</key>
<label>OpenAIRE</label>
<ordinal>1</ordinal>
<type>External</type>
<url>https://services.openaire.eu/search/v2/api/organizations/?q={like}&amp;page={page}&amp;size={pageSize}&amp;format=json</url>
<firstPage>0</firstPage>
<contenttype>application/json; charset=utf-8</contenttype>
<data>
<path>$['results'][*]['result']['metadata']['oaf:entity']['oaf:organization']</path>
<fields>
<id>'originalId'</id>
<name>'legalname'</name>
<count>'count'</count>
</fields>
</data>
<paginationpath>$['meta']['pagination']['page','pages','count']</paginationpath>
</urlConfig>
<!-- <urlConfig>
<key>openAire</key>
<label>OpenAIRE</label>
@ -901,6 +937,30 @@
<fetchMode>FIRST</fetchMode> <!-- EITHER 'FIRST' OR 'ALL' -->
</datasets>
<licenses>
<urls>
<urlConfig>
<key>opendefinition</key>
<label>Open Definition</label>
<ordinal>1</ordinal>
<type>External</type>
<url>https://licenses.opendefinition.org/licenses/groups/all.json</url>
<firstPage>1</firstPage>
<contenttype>application/vnd.api+json; charset=utf-8</contenttype>
<data>
<path>$[*]</path>
<fields>
<id>'id'</id>
<name>'title'</name>
<uri>'url'</uri>
<description>'maintainer'</description>
</fields>
</data>
</urlConfig>
</urls>
<fetchMode>FIRST</fetchMode>
</licenses>
</externalUrls>

View File

@ -0,0 +1,13 @@
<fetchConfig>
<configs>
<config>
<type>currency</type>
<fileType>xml</fileType>
<filePath>internal/iso-4217.xml</filePath>
<parseClass>eu.eudat.logic.proxy.fetching.entities.CurrencyModel</parseClass>
<parseField>currencies</parseField>
<name>currency</name>
<value>code</value>
</config>
</configs>
</fetchConfig>

File diff suppressed because it is too large Load Diff

View File

@ -140,7 +140,7 @@ const appRoutes: Routes = [
}
},
{
path: 'terms-of-service',
path: 'terms-and-conditions',
loadChildren: () => import('./ui/sidebar/sidebar-footer/terms/terms.module').then(m => m.TermsModule),
data: {
breadcrumb: true,
@ -148,10 +148,11 @@ const appRoutes: Routes = [
}
},
{
path: 'home',
loadChildren: () => import('./ui/dashboard/dashboard.module').then(m => m.DashboardModule),
path: 'cookies-policy',
loadChildren: () => import('./ui/sidebar/sidebar-footer/cookies-policy/cookies-policy.module').then(m => m.CookiesPolicyModule),
data: {
breadcrumb: true
breadcrumb: true,
title: 'GENERAL.TITLES.COOKIES-POLICY'
}
},
{
@ -162,12 +163,19 @@ const appRoutes: Routes = [
}
},
{
path: 'splash',
loadChildren: () => import('./ui/splash/splash.module').then(m => m.SplashModule),
path: 'home',
loadChildren: () => import('./ui/dashboard/dashboard.module').then(m => m.DashboardModule),
data: {
breadcrumb: true
}
},
// {
// path: 'splash',
// loadChildren: () => import('./ui/splash/splash.module').then(m => m.SplashModule),
// data: {
// breadcrumb: true
// }
// },
{
path: 'unauthorized',
loadChildren: () => import('./ui/misc/unauthorized/unauthorized.module').then(m => m.UnauthorizedModule),

View File

@ -117,7 +117,7 @@ export class AppComponent implements OnInit {
}
});
this.ccService.getConfig().content.href = this.configurationService.app + "terms-of-service";
this.ccService.getConfig().content.href = this.configurationService.app + "cookies-policy";
this.ccService.getConfig().cookie.domain = this.configurationService.app;
this.translate
.get(['COOKIE.MESSAGE', 'COOKIE.DISMISS', 'COOKIE.DENY', 'COOKIE.LINK', 'COOKIE.POLICY'])

View File

@ -63,7 +63,7 @@ const cookieConfig: NgcCookieConsentConfig = {
deny: "Refuse cookies",
link: "Learn more",
href: "",//environment.App + "terms-of-service",
policy: "Cookie Policy"
policy: "Cookies Policy"
},
position: "bottom-right",
theme: 'edgeless',

View File

@ -14,5 +14,6 @@ export enum DatasetProfileFieldViewStyle {
Tags = "tags",
Researchers = "researchers",
Organizations = "organizations",
DatasetIdentifier = "datasetIdentifier"
DatasetIdentifier = "datasetIdentifier",
Currency = "currency"
}

View File

@ -42,6 +42,7 @@ import { UserGuideService } from './services/user-guide/user-guide.service';
import { ConfigurationService } from './services/configuration/configuration.service';
import { HttpClient } from '@angular/common/http';
import { LanguageInfoService } from './services/culture/language-info-service';
import { CurrencyService } from './services/currency/currency.service';
//
//
// This is shared module that provides all the services. Its imported only once on the AppModule.
@ -105,6 +106,7 @@ export class CoreServiceModule {
LanguageService,
LockService,
UserGuideService,
CurrencyService,
ConfigurationService,
{
provide: APP_INITIALIZER,

View File

@ -100,3 +100,7 @@ export interface OrganizationsFieldData extends FieldData {
export interface DatasetIdentifierFieldData extends FieldData {
}
export interface CurrencyFieldData extends FieldData {
}

View File

@ -36,4 +36,5 @@ export interface DmpModel {
dynamicFields: Array<DmpDynamicField>;
modified: Date;
extraProperties: Map<String, any>;
language: String;
}

View File

@ -0,0 +1,4 @@
export class LocalFetchModel {
name: string;
value: string;
}

View File

@ -0,0 +1,5 @@
import { BaseCriteria } from "../base-criteria";
export class LicenseCriteria extends BaseCriteria {
public type: string;
}

View File

@ -14,6 +14,7 @@ import { environment } from 'environments/environment';
import { Observable, of as observableOf, throwError as observableThrowError } from 'rxjs';
import { catchError, map, takeUntil } from 'rxjs/operators';
import { ConfigurationService } from '../configuration/configuration.service';
import { CookieService } from 'ngx-cookie-service';
@Injectable()
export class AuthService extends BaseService {
@ -26,7 +27,8 @@ export class AuthService extends BaseService {
private language: TranslateService,
private router: Router,
private uiNotificationService: UiNotificationService,
private configurationService: ConfigurationService
private configurationService: ConfigurationService,
private cookieService: CookieService
) {
super();
@ -73,6 +75,7 @@ export class AuthService extends BaseService {
return this.http.post(url, loginInfo, { headers: this.headers }).pipe(
map((res: any) => {
const principal = this.current(res.payload);
this.cookieService.set('cookiesConsent', 'true', 356);
//this.loginContextSubject.next(true);
return principal;
}),
@ -89,6 +92,7 @@ export class AuthService extends BaseService {
return this.http.post(url, credentials, { headers: this.headers }).pipe(
map((res: any) => {
const principal = this.current(res.payload);
this.cookieService.set('cookiesConsent', 'true', 356);
//this.loginContextSubject.next(true);
return principal;
}),

View File

@ -1,7 +1,6 @@
import { Injectable } from '@angular/core';
import { BaseHttpParams } from '@common/http/base-http-params';
import { InterceptorType } from '@common/http/interceptors/interceptor-type';
import { BaseHttpService } from '@common/base/base-http.service';
import { BaseComponent } from '@common/base/base.component';
import { catchError, takeUntil } from 'rxjs/operators';
import { Observable, throwError } from 'rxjs';

View File

@ -0,0 +1,21 @@
import { ConfigurationService } from '../configuration/configuration.service';
import { Injectable } from '@angular/core';
import { Observable } from 'rxjs';
import { LocalFetchModel } from '@app/core/model/local-fetch/local-fetch.model';
import { BaseHttpService } from '../http/base-http.service';
@Injectable()
export class CurrencyService {
private actionUrl: string;
constructor(private http: BaseHttpService, private configurationService: ConfigurationService) {
this.actionUrl = configurationService.server + 'currency';
}
get(query: string): Observable<LocalFetchModel[]> {
return this.http.get<LocalFetchModel[]>(`${this.actionUrl}?query=${query}`);
}
}

View File

@ -0,0 +1,19 @@
import { ConfigurationService } from '../../configuration/configuration.service';
import { Injectable } from '@angular/core';
import { Observable } from 'rxjs';
import { LocalFetchModel } from '@app/core/model/local-fetch/local-fetch.model';
import { BaseHttpService } from '../../http/base-http.service';
@Injectable()
export class CurrencyService {
private actionUrl: string;
constructor(private http: BaseHttpService, private configurationService: ConfigurationService) {
this.actionUrl = configurationService.server + 'currency';
}
get(): Observable<LocalFetchModel[]> {
return this.http.get<LocalFetchModel[]>(this.actionUrl);
}
}

View File

@ -12,6 +12,7 @@ import { ServiceCriteria } from '../../query/service/service-criteria';
import { TagCriteria } from '../../query/tag/tag-criteria';
import { BaseHttpService } from '../http/base-http.service';
import { ConfigurationService } from '../configuration/configuration.service';
import { LicenseCriteria } from '@app/core/query/license/license-criteria';
@Injectable()
export class ExternalSourcesService {
@ -40,6 +41,10 @@ export class ExternalSourcesService {
return this.http.get<ExternalSourceItemModel[]>(this.actionUrl + 'services' + '?query=' + requestItem.criteria.like + '&type=' + requestItem.criteria.type, { headers: this.headers });
}
public searchLicense(requestItem: RequestItem<LicenseCriteria>): Observable<ExternalSourceItemModel[]> {
return this.http.get<ExternalSourceItemModel[]>(this.actionUrl + 'licenses' + '?query=' + requestItem.criteria.like + '&type=' + requestItem.criteria.type, { headers: this.headers });
}
public searchDatasetTags(requestItem: RequestItem<TagCriteria>): Observable<ExternalSourceItemModel[]> {
// return Observable.of([
// { id: '1', name: 'Tag 1', description: '' },

View File

@ -83,6 +83,7 @@ export class EnumUtils {
case DatasetProfileFieldViewStyle.Researchers: return this.language.instant('TYPES.DATASET-PROFILE-FIELD-VIEW-STYLE.RESEARCHERS');
case DatasetProfileFieldViewStyle.Organizations: return this.language.instant('TYPES.DATASET-PROFILE-FIELD-VIEW-STYLE.ORGANIZATIONS');
case DatasetProfileFieldViewStyle.DatasetIdentifier: return this.language.instant('TYPES.DATASET-PROFILE-FIELD-VIEW-STYLE.DATASET-IDENTIFIER');
case DatasetProfileFieldViewStyle.Currency: return this.language.instant('TYPES.DATASET-PROFILE-FIELD-VIEW-STYLE.CURRENCY');
}
}

View File

@ -0,0 +1,19 @@
import { FormGroup } from '@angular/forms';
import { FieldDataEditorModel } from './field-data-editor-model';
import { CurrencyFieldData } from '../../../../../core/model/dataset-profile-definition/field-data/field-data';
export class CurrencyDataEditorModel extends FieldDataEditorModel<CurrencyDataEditorModel> {
public label: string;
buildForm(disabled: boolean = false, skipDisable: Array<String> = []): FormGroup {
const formGroup = this.formBuilder.group({
label: [{ value: this.label, disabled: (disabled && !skipDisable.includes('CurrencyDataEditorModel.label')) }]
});
return formGroup;
}
fromModel(item: CurrencyFieldData): CurrencyDataEditorModel {
this.label = item.label;
return this;
}
}

View File

@ -26,6 +26,7 @@ import { TagsDataEditorModel } from './field-data/tags-data-editor-models';
import { ResearchersDataEditorModel } from './field-data/researchers-data-editor-models';
import { OrganizationsDataEditorModel } from './field-data/organizations-data-editor-models';
import { DatasetIdentifierDataEditorModel } from './field-data/dataset-identifier-data-editor-models';
import { CurrencyDataEditorModel } from './field-data/currency-data-editor-models';
export class FieldEditorModel extends BaseFormModel {
@ -73,6 +74,7 @@ export class FieldEditorModel extends BaseFormModel {
if (this.viewStyle.renderStyle === 'researchers') { this.data = new ResearchersDataEditorModel().fromModel(item.data); }
if (this.viewStyle.renderStyle === 'organizations') { this.data = new OrganizationsDataEditorModel().fromModel(item.data); }
if (this.viewStyle.renderStyle === 'datasetIdentifier') { this.data = new DatasetIdentifierDataEditorModel().fromModel(item.data); }
if (this.viewStyle.renderStyle === 'currency') { this.data = new CurrencyDataEditorModel().fromModel(item.data); }
}
}
return this;

View File

@ -36,6 +36,7 @@ import { DatasetProfileEditorTagsFieldComponent } from './editor/components/fiel
import { DatasetProfileEditorResearchersFieldComponent } from './editor/components/field-type/researchers/dataset-profile-editor-researchers-field.component';
import { DatasetProfileEditorOrganizationsFieldComponent } from './editor/components/field-type/organizations/dataset-profile-editor-organizations-field.component';
import { DatasetProfileEditorDatasetIdentifierFieldComponent } from './editor/components/field-type/dataset-identifier/dataset-profile-editor-dataset-identifier-field.component';
import { DatasetProfileEditorCurrencyFieldComponent } from './editor/components/field-type/currency/dataset-profile-editor-currency-field.component';
@NgModule({
imports: [
@ -77,7 +78,8 @@ import { DatasetProfileEditorDatasetIdentifierFieldComponent } from './editor/co
DatasetProfileEditorTagsFieldComponent,
DatasetProfileEditorResearchersFieldComponent,
DatasetProfileEditorOrganizationsFieldComponent,
DatasetProfileEditorDatasetIdentifierFieldComponent
DatasetProfileEditorDatasetIdentifierFieldComponent,
DatasetProfileEditorCurrencyFieldComponent
],
entryComponents: [
DialodConfirmationUploadDatasetProfiles

View File

@ -0,0 +1,9 @@
<div class="row" *ngIf="form.get('data')">
<h5 style="font-weight: bold" class="col-12">{{'DATASET-PROFILE-EDITOR.STEPS.FORM.FIELD.FIELDS.FIELD-DATE-PICKER-TITLE'
| translate}}</h5>
<mat-form-field class="col-12">
<input matInput type="string"
placeholder="{{'DATASET-PROFILE-EDITOR.STEPS.FORM.FIELD.FIELDS.FIELD-CHECKBOX-PLACEHOLDER' | translate}}"
[formControl]="form.get('data').get('label')">
</mat-form-field>
</div>

View File

@ -0,0 +1,18 @@
import { Component, Input, OnInit } from '@angular/core';
import { FormGroup } from '@angular/forms';
import { DataRepositoriesDataEditorModel } from '@app/ui/admin/dataset-profile/admin/field-data/data-repositories-data-editor-models';
@Component({
selector: 'app-dataset-profile-editor-currency-field-component',
styleUrls: ['./dataset-profile-editor-currency-field.component.scss'],
templateUrl: './dataset-profile-editor-currency-field.component.html'
})
export class DatasetProfileEditorCurrencyFieldComponent implements OnInit {
@Input() form: FormGroup;
private data: DataRepositoriesDataEditorModel = new DataRepositoriesDataEditorModel();
ngOnInit() {
if (!this.form.get('data')) { this.form.addControl('data', this.data.buildForm()); }
}
}

View File

@ -25,6 +25,7 @@
<mat-option [value]="viewStyleEnum.Researchers">{{enumUtils.toDatasetProfileFieldViewStyleString(viewStyleEnum.Researchers)}}</mat-option>
<mat-option [value]="viewStyleEnum.Organizations">{{enumUtils.toDatasetProfileFieldViewStyleString(viewStyleEnum.Organizations)}}</mat-option>
<mat-option [value]="viewStyleEnum.DatasetIdentifier">{{enumUtils.toDatasetProfileFieldViewStyleString(viewStyleEnum.DatasetIdentifier)}}</mat-option>
<mat-option [value]="viewStyleEnum.Currency">{{enumUtils.toDatasetProfileFieldViewStyleString(viewStyleEnum.Currency)}}</mat-option>
</mat-select>
<mat-error *ngIf="this.form.get('viewStyle').get('renderStyle').hasError('required')">{{'GENERAL.VALIDATION.REQUIRED' | translate}}</mat-error>
</mat-form-field>
@ -80,6 +81,7 @@
<app-dataset-profile-editor-researchers-field-component *ngSwitchCase="viewStyleEnum.Researchers" class="col-12" [form]="form"></app-dataset-profile-editor-researchers-field-component>
<app-dataset-profile-editor-organizations-field-component *ngSwitchCase="viewStyleEnum.Organizations" class="col-12" [form]="form"></app-dataset-profile-editor-organizations-field-component>
<app-dataset-profile-editor-dataset-identifier-field-component *ngSwitchCase="viewStyleEnum.DatasetIdentifier" class="col-12" [form]="form"></app-dataset-profile-editor-dataset-identifier-field-component>
<app-dataset-profile-editor-currency-field-component *ngSwitchCase="viewStyleEnum.Currency" class="col-12" [form]="form"></app-dataset-profile-editor-currency-field-component>
</div>
<div class="row">
<h4 class="col-12" style="font-weight: bold">{{'DATASET-PROFILE-EDITOR.STEPS.FORM.FIELD.FIELDS.RULES-TITLE' | translate}}

View File

@ -25,6 +25,7 @@ import { ResearchersDataEditorModel } from '../../../admin/field-data/researcher
import { OrganizationsDataEditorModel } from '../../../admin/field-data/organizations-data-editor-models';
import { DatasetIdentifierDataEditorModel } from '../../../admin/field-data/dataset-identifier-data-editor-models';
import { ExternalDatasetsDataEditorModel } from '../../../admin/field-data/external-datasets-data-editor-models';
import { CurrencyDataEditorModel } from '../../../admin/field-data/currency-data-editor-models';
@Component({
selector: 'app-dataset-profile-editor-field-component',
@ -109,6 +110,9 @@ export class DatasetProfileEditorFieldComponent extends BaseComponent implements
case DatasetProfileFieldViewStyle.DatasetIdentifier:
this.form.addControl('data', new DatasetIdentifierDataEditorModel().buildForm());
break;
case DatasetProfileFieldViewStyle.Currency:
this.form.addControl('data', new CurrencyDataEditorModel().buildForm());
break;
}
}
});
@ -133,6 +137,7 @@ export class DatasetProfileEditorFieldComponent extends BaseComponent implements
case DatasetProfileFieldViewStyle.Registries:
case DatasetProfileFieldViewStyle.Organizations:
case DatasetProfileFieldViewStyle.DatasetIdentifier:
case DatasetProfileFieldViewStyle.Currency:
return false;
default:
return false;

View File

@ -61,7 +61,7 @@ export class DatasetCopyDialogueComponent {
const dmpDataTableRequest: DataTableRequest<DmpCriteria> = new DataTableRequest(0, null, { fields: fields });
dmpDataTableRequest.criteria = new DmpCriteria();
dmpDataTableRequest.criteria.like = query;
return this.dmpService.getPaged(dmpDataTableRequest, "autocomplete").pipe(map(x => x.data), map(x => x.filter(y => this.existsDatasetDescriptionTemplate(y.associatedProfiles))));
return this.dmpService.getPaged(dmpDataTableRequest, "profiles").pipe(map(x => x.data), map(x => x.filter(y => this.existsDatasetDescriptionTemplate(y.associatedProfiles))));
}
existsDatasetDescriptionTemplate(associatedProfiles: DmpAssociatedProfileModel[]): boolean {

View File

@ -8,7 +8,7 @@
<mat-error *ngIf="formGroup.get('label').hasError('required')">{{'GENERAL.VALIDATION.REQUIRED' | translate}}</mat-error>
</mat-form-field>
</div>
<div class="row">
<div class="row" *ngIf="showUri">
<mat-form-field class="col-sm-12 col-md-6">
<input matInput placeholder="{{'DATASET-EDITOR.FIELDS.URI' | translate}}" type="text" name="uri" formControlName="uri">
<mat-error *ngIf="formGroup.get('uri').hasError('backendError')">{{formGroup.get('uri').getError('backendError').message}}</mat-error>

View File

@ -11,6 +11,7 @@ import { BaseComponent } from '@common/base/base.component';
export class DatasetEditorComponent extends BaseComponent {
@Input() formGroup: FormGroup = null;
showUri: boolean = false;
constructor(
private router: Router,

View File

@ -63,7 +63,7 @@ export class DatasetExternalReferencesEditorComponent extends BaseComponent impl
initialItems: (type) => this.searchDatasetExternalDataRepositories('', type),
displayFn: (item) => item ? item.name : null,
titleFn: (item) => item ? item.name : null,
subtitleFn: (item) => item.source ? this.language.instant('TYPES.EXTERNAL-DATASET-TYPE.SOURCE:') + item.source : this.language.instant('TYPES.EXTERNAL-DATASET-TYPE.NO-SOURCE')
subtitleFn: (item) => item.source ? this.language.instant('TYPES.EXTERNAL-DATASET-TYPE.SOURCE:') + item.source : item.tag ? this.language.instant('TYPES.EXTERNAL-DATASET-TYPE.SOURCE:') + item.tag : this.language.instant('TYPES.EXTERNAL-DATASET-TYPE.NO-SOURCE')
};
servicesAutoCompleteConfiguration: SingleAutoCompleteConfiguration = {

View File

@ -232,17 +232,21 @@ export class DatasetCriteriaComponent extends BaseCriteriaComponent implements O
const fields: Array<string> = new Array<string>();
fields.push('asc');
if (this.isPublic) {
const dmpDataTableRequest: DataTableRequest<ExploreDmpCriteriaModel> = new DataTableRequest(0, null, { fields: fields });
dmpDataTableRequest.criteria = new ExploreDmpCriteriaModel();
dmpDataTableRequest.criteria.like = value;
return this.dmpService.getPublicPaged(dmpDataTableRequest, "autocomplete");
} else {
// if (this.isPublic) {
// const dmpDataTableRequest: DataTableRequest<ExploreDmpCriteriaModel> = new DataTableRequest(0, null, { fields: fields });
// dmpDataTableRequest.criteria = new ExploreDmpCriteriaModel();
// dmpDataTableRequest.criteria.like = value;
// return this.dmpService.getPublicPaged(dmpDataTableRequest, "autocomplete");
// } else {
const dmpDataTableRequest: DataTableRequest<DmpCriteria> = new DataTableRequest(0, null, { fields: fields });
dmpDataTableRequest.criteria = new DmpCriteria();
dmpDataTableRequest.criteria.like = value;
return this.dmpService.getPaged(dmpDataTableRequest, "autocomplete");
if (this.isPublic) {
dmpDataTableRequest.criteria.isPublic = true;
dmpDataTableRequest.criteria.onlyPublic = true;
}
return this.dmpService.getPaged(dmpDataTableRequest, "autocomplete");
// }
}
filterGrant(query: string) {

View File

@ -17,6 +17,7 @@ import { TranslateService } from '@ngx-translate/core';
import { Observable, of as observableOf } from 'rxjs';
import { map, takeUntil } from 'rxjs/operators';
import { DmpStatus } from '@app/core/common/enum/dmp-status';
import { ExtraPropertiesFormModel } from '../editor/general-tab/extra-properties-form.model';
@Component({
@ -60,6 +61,7 @@ export class DmpCloneComponent extends BaseComponent implements OnInit {
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.dmp.status = DmpStatus.Draft;
this.formGroup = this.dmp.buildForm();

View File

@ -21,6 +21,7 @@ import { BackendErrorValidator } from '@common/forms/validation/custom-validator
import { ValidationErrorModel } from '@common/forms/validation/error-model/validation-error-model';
import { ValidationContext } from '@common/forms/validation/validation-context';
import { ExtraPropertiesFormModel } from './general-tab/extra-properties-form.model';
import { isNullOrUndefined } from 'util';
export class DmpEditorModel {
public id: string;
@ -71,7 +72,9 @@ export class DmpEditorModel {
if (item.dynamicFields) { item.dynamicFields.map(x => this.dynamicFields.push(new DmpDynamicFieldEditorModel().fromModel(x))); }
this.creator = item.creator;
this.modified = new Date(item.modified);
this.extraProperties.fromModel(item.extraProperties);
if (!isNullOrUndefined(item.extraProperties)) {
this.extraProperties.fromModel(item.extraProperties);
}
return this;
}

View File

@ -4,9 +4,15 @@ import { BackendErrorValidator } from '@common/forms/validation/custom-validator
export class ExtraPropertiesFormModel {
public language: string;
public license: string;
public visible: boolean;
public publicDate: Date;
fromModel(item: any): ExtraPropertiesFormModel {
this.language = item.language;
this.license = item.license;
this.visible = item.visible;
this.publicDate = item.publicDate;
return this;
}
@ -14,7 +20,10 @@ export class ExtraPropertiesFormModel {
if (context == null) { context = this.createValidationContext(); }
const formGroup = new FormBuilder().group({
language: [{ value: this.language, disabled: disabled }, context.getValidation('language').validators]
language: [{ value: this.language, disabled: disabled }, context.getValidation('language').validators],
license: [{ value: this.license, disabled: disabled }, context.getValidation('license').validators],
visible: [{ value: this.visible, disabled: disabled }, context.getValidation('visible').validators],
publicDate: [{ value: this.publicDate, disabled: disabled }, context.getValidation('publicDate').validators]
});
return formGroup;
}
@ -22,6 +31,9 @@ export class ExtraPropertiesFormModel {
createValidationContext(): ValidationContext {
const baseContext: ValidationContext = new ValidationContext();
baseContext.validation.push({ key: 'language', validators: [] });
baseContext.validation.push({ key: 'license', validators: [] });
baseContext.validation.push({ key: 'visible', validators: [] });
baseContext.validation.push({ key: 'publicDate', validators: [] });
return baseContext;
}

View File

@ -69,7 +69,7 @@
<mat-form-field class="col-sm-12 col-md-8">
<!-- <app-multiple-auto-complete [formControl]="formGroup.get('extraProperties').get('language')" placeholder="{{'DMP-EDITOR.FIELDS.RESEARCHERS' | translate}}" [configuration]="researchersAutoCompleteConfiguration">
</app-multiple-auto-complete> -->
<mat-select [formControl]="formGroup.get('extraProperties').get('language')">
<mat-select [formControl]="formGroup.get('extraProperties').get('language')" placeholder="{{'DMP-EDITOR.FIELDS.LANGUAGE' | translate}}">
<mat-option *ngFor="let lang of getLanguageInfos()" [value]="lang.code">
{{ lang.name }}
</mat-option>
@ -81,6 +81,49 @@
</mat-form-field>
<!-- <h4 mat-subheader class="col-12">{{'DMP-EDITOR.FIELDS.PROFILE' | translate}}</h4> -->
</div>
<div class="row pt-3">
<mat-form-field class="col-sm-12 col-md-8">
<!-- <app-multiple-auto-complete [formControl]="formGroup.get('extraProperties').get('language')" placeholder="{{'DMP-EDITOR.FIELDS.RESEARCHERS' | translate}}" [configuration]="researchersAutoCompleteConfiguration">
</app-multiple-auto-complete> -->
<app-single-auto-complete [formControl]="formGroup.get('extraProperties').get('license')" 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('language').getError('backendError').message}}</mat-error>
<mat-error *ngIf="formGroup.get('extraProperties').get('license').hasError('required')">
{{'GENERAL.VALIDATION.REQUIRED' | translate}}</mat-error>
</mat-form-field>
<!-- <h4 mat-subheader class="col-12">{{'DMP-EDITOR.FIELDS.PROFILE' | translate}}</h4> -->
</div>
<div class="row pt-3">
<mat-form-field class="col-sm-12 col-md-8">
<!-- <app-multiple-auto-complete [formControl]="formGroup.get('extraProperties').get('language')" placeholder="{{'DMP-EDITOR.FIELDS.RESEARCHERS' | translate}}" [configuration]="researchersAutoCompleteConfiguration">
</app-multiple-auto-complete> -->
<mat-select [formControl]="formGroup.get('extraProperties').get('visible')" placeholder="{{'DMP-EDITOR.FIELDS.VISIBILITY' | translate}}">
<mat-option *ngFor="let vis of visibles" [value]="vis.value">
{{vis.name | translate}}
</mat-option>
</mat-select>
<mat-error *ngIf="formGroup.get('extraProperties').get('visible').hasError('backendError')">
{{formGroup.get('extraProperties').get('visible').getError('backendError').message}}</mat-error>
<mat-error *ngIf="formGroup.get('extraProperties').get('visible').hasError('required')">
{{'GENERAL.VALIDATION.REQUIRED' | translate}}</mat-error>
</mat-form-field>
<!-- <h4 mat-subheader class="col-12">{{'DMP-EDITOR.FIELDS.PROFILE' | translate}}</h4> -->
</div>
<div class="row pt-3" *ngIf="formGroup.get('extraProperties').get('visible').value">
<mat-form-field class="col-sm-12 col-md-8">
<!-- <app-multiple-auto-complete [formControl]="formGroup.get('extraProperties').get('language')" placeholder="{{'DMP-EDITOR.FIELDS.RESEARCHERS' | translate}}" [configuration]="researchersAutoCompleteConfiguration">
</app-multiple-auto-complete> -->
<input matInput [matDatepicker]="picker" [formControl]="formGroup.get('extraProperties').get('publicDate')" placeholder="{{'DMP-EDITOR.FIELDS.PUBLICATION' | translate}}">
<mat-datepicker-toggle matSuffix [for]="picker"></mat-datepicker-toggle>
<mat-datepicker #picker></mat-datepicker>
<mat-error *ngIf="formGroup.get('extraProperties').get('visible').hasError('backendError')">
{{formGroup.get('extraProperties').get('visible').getError('backendError').message}}</mat-error>
<mat-error *ngIf="formGroup.get('extraProperties').get('visible').hasError('required')">
{{'GENERAL.VALIDATION.REQUIRED' | translate}}</mat-error>
</mat-form-field>
<!-- <h4 mat-subheader class="col-12">{{'DMP-EDITOR.FIELDS.PROFILE' | translate}}</h4> -->
</div>
<div class="row pt-2">
<mat-form-field class="col-sm-12 col-md-8">
<app-single-auto-complete [required]="false" [formControl]="formGroup.get('profile')" placeholder="{{'DMP-EDITOR.FIELDS.TEMPLATE' | translate}}" [configuration]="dmpProfileAutoCompleteConfiguration">

View File

@ -25,6 +25,12 @@ import { isNullOrUndefined } from 'util';
import { ConfigurationService } from '@app/core/services/configuration/configuration.service';
import { LanguageInfoService } from '@app/core/services/culture/language-info-service';
import { LanguageInfo } from '@app/core/model/language-info';
import { LicenseCriteria } from '@app/core/query/license/license-criteria';
interface Visible {
value: boolean;
name: string;
}
@Component({
selector: 'app-general-tab',
@ -67,8 +73,20 @@ export class GeneralTabComponent extends BaseComponent implements OnInit {
titleFn: (item) => item['label']
};
licenseAutoCompleteConfiguration: SingleAutoCompleteConfiguration = {
filterFn: this.licenseSearch.bind(this),
initialItems: (excludedItems: any[]) => this.licenseSearch('').pipe(map(result => result.filter(resultItem => (excludedItems || []).map(x => x.id).indexOf(resultItem.id) === -1))),
displayFn: (item) => item['name'],
titleFn: (item) => item['name']
};
selectedDmpProfileDefinition: DmpProfileDefinition;
visibles: Visible[] = [
{ value: true, name: 'DMP-EDITOR.VISIBILITY.PUBLIC' },
{ value: false, name: 'DMP-EDITOR.VISIBILITY.RESTRICTED' }
]
constructor(
private dmpProfileService: DmpProfileService,
private externalSourcesService: ExternalSourcesService,
@ -92,6 +110,9 @@ export class GeneralTabComponent extends BaseComponent implements OnInit {
if (!this.isUserOwner && !this.isClone) {
this.formGroup.disable();
}
if (isNullOrUndefined(this.formGroup.get('extraProperties').get('publicDate').value)) {
this.formGroup.get('extraProperties').get('publicDate').patchValue(new Date());
}
}
registerFormEventsForDmpProfile(definitionProperties?: DmpProfileDefinition): void {
@ -120,6 +141,14 @@ export class GeneralTabComponent extends BaseComponent implements OnInit {
return this.dmpProfileService.getPaged(request).pipe(map(x => x.data));
}
licenseSearch(query: string): Observable<ExternalSourceItemModel[]> {
const request = new RequestItem<LicenseCriteria>();
request.criteria = new LicenseCriteria();
request.criteria.like = query;
request.criteria.type = '';
return this.externalSourcesService.searchLicense(request);
}
// onCallbackSuccess(): void {
// this.uiNotificationService.snackBarNotification(this.isNew ? this.language.instant('GENERAL.SNACK-BAR.SUCCESSFUL-CREATION') : this.language.instant('GENERAL.SNACK-BAR.SUCCESSFUL-UPDATE'), SnackBarNotificationLevel.Success);
// this.router.navigate(['/plans']);
@ -147,7 +176,7 @@ export class GeneralTabComponent extends BaseComponent implements OnInit {
filterProfiles(value: string): Observable<DatasetProfileModel[]> {
const request = new DataTableRequest<DatasetProfileCriteria>(null, null, {fields: ['+label']});
const request = new DataTableRequest<DatasetProfileCriteria>(null, null, { fields: ['+label'] });
const criteria = new DatasetProfileCriteria();
criteria.like = value;
request.criteria = criteria;

View File

@ -79,6 +79,16 @@
color: #129D99;
}
.grant-title {
width: 130px;
color: #089dbb;
background-color: white;
padding: 0px 10px;
margin-top: -16px;
cursor: default;
text-transform: uppercase;
}
.frame-btn, .finalize-btn {
background: #FFFFFF;
box-shadow: 0px 2px 6px #00000029;

View File

@ -15,6 +15,7 @@ import { BackendErrorValidator } from '@common/forms/validation/custom-validator
import { ValidationErrorModel } from '@common/forms/validation/error-model/validation-error-model';
import { ValidationContext } from '@common/forms/validation/validation-context';
import { DmpStatus } from '@app/core/common/enum/dmp-status';
import { ExtraPropertiesFormModel } from '../editor/general-tab/extra-properties-form.model';
export class DmpWizardEditorModel {
public id: string;
@ -36,6 +37,7 @@ export class DmpWizardEditorModel {
public definition: DmpProfileDefinition;
public dynamicFields: Array<DmpDynamicFieldEditorModel> = [];
public validationErrorModel: ValidationErrorModel = new ValidationErrorModel();
public extraProperties: ExtraPropertiesFormModel;
fromModel(item: DmpModel): DmpWizardEditorModel {
this.id = item.id;
@ -56,6 +58,7 @@ export class DmpWizardEditorModel {
if (item.definition) { this.definition = item.definition; }
if (item.dynamicFields) { item.dynamicFields.map(x => this.dynamicFields.push(new DmpDynamicFieldEditorModel().fromModel(x))); }
this.creator = item.creator;
this.extraProperties.fromModel(item.extraProperties);
return this;
}
@ -78,6 +81,7 @@ export class DmpWizardEditorModel {
researchers: [{ value: this.researchers, disabled: disabled }, context.getValidation('researchers').validators],
profiles: [{ value: this.profiles, disabled: disabled }, context.getValidation('profiles').validators],
associatedUsers: [{ value: this.associatedUsers, disabled: disabled }, context.getValidation('associatedUsers').validators],
extraProperties: this.extraProperties.buildForm(),
});
const dynamicFields = new Array<FormGroup>();

View File

@ -244,4 +244,16 @@
</mat-form-field>
</div>
</div>
<div *ngSwitchCase="datasetProfileFieldViewStyleEnum.Currency" class="col-12">
<div class="row">
<mat-form-field class="col-md-12">
<app-single-auto-complete placeholder="{{ form.get('data').value.label | translate }}" [formControl]="form.get('value')"
[configuration]="currencyAutoCompleteConfiguration" [required]="form.get('validationRequired').value">
</app-single-auto-complete>
<mat-error *ngIf="form.get('value').hasError('required')">{{'GENERAL.VALIDATION.REQUIRED' | translate}}
</mat-error>
</mat-form-field>
</div>
</div>
</div>

View File

@ -32,6 +32,8 @@ import { ExternalTagEditorModel } from '@app/ui/dataset/dataset-wizard/dataset-w
import { MatChipInputEvent } from '@angular/material';
import { ENTER, COMMA } from '@angular/cdk/keycodes';
import { DatasetIdModel } from '@app/core/model/dataset/dataset-id.model';
import { LocalFetchModel } from '@app/core/model/local-fetch/local-fetch.model';
import { CurrencyService } from '@app/core/services/currency/currency.service';
@Component({
selector: 'app-form-field',
@ -60,6 +62,7 @@ export class FormFieldComponent extends BaseComponent implements OnInit {
tagsAutoCompleteConfiguration: SingleAutoCompleteConfiguration;
researchersAutoCompleteConfiguration: MultipleAutoCompleteConfiguration;
organisationsAutoCompleteConfiguration: MultipleAutoCompleteConfiguration;
currencyAutoCompleteConfiguration: SingleAutoCompleteConfiguration;
readonly separatorKeysCodes: number[] = [ENTER, COMMA];
@ -81,7 +84,8 @@ export class FormFieldComponent extends BaseComponent implements OnInit {
private externalSourcesService: ExternalSourcesService,
private language: TranslateService,
private datasetService: DatasetService,
private dmpService: DmpService
private dmpService: DmpService,
private currencyService: CurrencyService
) { super(); }
ngOnInit() {
@ -130,7 +134,7 @@ export class FormFieldComponent extends BaseComponent implements OnInit {
initialItems: () => this.searchDatasetExternalDataRepositories(''),
displayFn: (item) => typeof (item) == 'string' ? JSON.parse(item)['name'] : item.name,
titleFn: (item) => typeof (item) == 'string' ? JSON.parse(item)['name'] : item.name,
subtitleFn: (item) => item.source ? this.language.instant('TYPES.EXTERNAL-DATASET-TYPE.SOURCE:') + item.source : this.language.instant('TYPES.EXTERNAL-DATASET-TYPE.NO-SOURCE'),
subtitleFn: (item) => item.source ? this.language.instant('TYPES.EXTERNAL-DATASET-TYPE.SOURCE:') + item.source : item.tag ? this.language.instant('TYPES.EXTERNAL-DATASET-TYPE.SOURCE:') + item.tag : this.language.instant('TYPES.EXTERNAL-DATASET-TYPE.NO-SOURCE'),
valueAssign: (item) => typeof (item) == 'string' ? item : JSON.stringify(item)
};
break;
@ -183,6 +187,15 @@ export class FormFieldComponent extends BaseComponent implements OnInit {
this.form.addControl('value', new DatasetIdModel(value).buildForm());
this.datasetIdInitialized = true;
break;
case DatasetProfileFieldViewStyle.Currency:
this.currencyAutoCompleteConfiguration = {
filterFn: this.searchCurrency.bind(this),
initialItems: () => this.searchCurrency(''),
displayFn: (item) => typeof (item) == 'string' ? JSON.parse(item)['name'] : item.name,
titleFn: (item) => typeof (item) == 'string' ? JSON.parse(item)['name'] : item.name,
valueAssign: (item) => typeof (item) == 'string' ? item : JSON.stringify(item)
};
break;
}
if (this.form.get('viewStyle').value.renderStyle === DatasetProfileFieldViewStyle.InternalDmpEntities) {
@ -347,4 +360,8 @@ export class FormFieldComponent extends BaseComponent implements OnInit {
getDatasetIdControl(name: string): FormControl {
return this.form.get('value').get(name) as FormControl;
}
searchCurrency(query: string): Observable<LocalFetchModel[]> {
return this.currencyService.get(query);
}
}

View File

@ -17,6 +17,7 @@ export class DmpEditorWizardModel {
public datasetProfile: DatasetProfileModel;
public definition: DmpProfileDefinition;
public validationErrorModel: ValidationErrorModel = new ValidationErrorModel();
public language: String;
fromModel(item: DmpModel): DmpEditorWizardModel {
this.id = item.id;
@ -24,6 +25,7 @@ export class DmpEditorWizardModel {
this.status = item.status;
this.description = item.description;
this.datasetProfile = item.profiles[0];
this.language = item.language;
return this;
}
@ -35,6 +37,7 @@ export class DmpEditorWizardModel {
status: [{ value: this.status, disabled: disabled }, context.getValidation('status').validators],
description: [{ value: this.description, disabled: disabled }, context.getValidation('description').validators],
datasetProfile: [{ value: this.datasetProfile, disabled: disabled }, context.getValidation('datasetProfile').validators],
language: [{ value: this.language, disabled: disabled }, context.getValidation('language').validators],
});
return formGroup;
}
@ -46,6 +49,7 @@ export class DmpEditorWizardModel {
baseContext.validation.push({ key: 'status', validators: [Validators.required, BackendErrorValidator(this.validationErrorModel, 'status')] });
baseContext.validation.push({ key: 'description', validators: [BackendErrorValidator(this.validationErrorModel, 'description')] });
baseContext.validation.push({ key: 'datasetProfile', validators: [Validators.required, ValidJsonValidator, BackendErrorValidator(this.validationErrorModel, 'datasetProfile')] });
baseContext.validation.push({ key: 'language', validators: [Validators.required, ValidJsonValidator, BackendErrorValidator(this.validationErrorModel, 'language')] });
return baseContext;
}
}

View File

@ -43,6 +43,20 @@
<mat-error *ngIf="formGroup.get('datasetProfile').hasError('required')">
{{'GENERAL.VALIDATION.REQUIRED' | translate}}</mat-error>
</mat-form-field>
<mat-form-field class="col-12 mt-3">
<!-- <app-multiple-auto-complete [formControl]="formGroup.get('extraProperties').get('language')" placeholder="{{'DMP-EDITOR.FIELDS.RESEARCHERS' | translate}}" [configuration]="researchersAutoCompleteConfiguration">
</app-multiple-auto-complete> -->
<mat-select [formControl]="formGroup.get('language')" placeholder="{{'DMP-EDITOR.FIELDS.LANGUAGE' | translate}}">
<mat-option *ngFor="let lang of getLanguageInfos()" [value]="lang.code">
{{ lang.name }}
</mat-option>
</mat-select>
<mat-error *ngIf="formGroup.get('language').hasError('backendError')">
{{formGroup.get('language').getError('backendError').message}}</mat-error>
<mat-error *ngIf="formGroup.get('language').hasError('required')">
{{'GENERAL.VALIDATION.REQUIRED' | translate}}</mat-error>
</mat-form-field>
<!-- <h4 mat-subheader class="col-12">{{'DMP-EDITOR.FIELDS.PROFILE' | translate}}</h4> -->
<div class="col-md-12 help">
{{'QUICKWIZARD.CREATE-ADD.CREATE.QUICKWIZARD_CREATE.SECOND-STEP.FIELDS.HELP' | translate}}
</div>

View File

@ -18,6 +18,9 @@ import { TranslateService } from '@ngx-translate/core';
import { Observable, of as observableOf } from 'rxjs';
import { DmpEditorWizardModel } from './dmp-editor-wizard-model';
import { DataTableRequest } from '@app/core/model/data-table/data-table-request';
import { LanguageInfo } from '@app/core/model/language-info';
import { LanguageService } from '@app/core/services/language/language.service';
import { LanguageInfoService } from '@app/core/services/culture/language-info-service';
@Component({
@ -47,7 +50,8 @@ export class DmpEditorWizardComponent extends BaseComponent implements OnInit, I
private route: ActivatedRoute,
private _service: DmpService,
public language: TranslateService,
private formService: FormService
private formService: FormService,
private languageInfoService: LanguageInfoService
) {
super();
}
@ -130,4 +134,8 @@ export class DmpEditorWizardComponent extends BaseComponent implements OnInit, I
}
return false;
}
getLanguageInfos(): LanguageInfo[] {
return this.languageInfoService.getLanguageInfoValues();
}
}

View File

@ -0,0 +1,34 @@
<div class="container cookies-policy-component">
<div class="row">
<div class="col-md-12">
<h1>{{ 'COOKIES-POLICY.TITLE' | translate}}</h1>
</div>
</div>
<div class="row">
<div class="col-md-12">
<p><span>ARGOS </span><span>(&quot;us&quot;, &quot;we&quot;, &quot;our&quot;) uses cookies. By using ARGOS, you consent to the use of cookies.</span></p>
<p><span>Our Cookies Policy explains what cookies are, how we use cookies, how third-parties we may partner with may use cookies on ARGOS, your choices regarding cookies and further information about cookies.</span></p>
<p><span></span></p>
<br />
<p><strong>What are cookies</strong></p>
<p><span>Cookies are small pieces of text sent by your web browser by a website you visit. A cookie file is stored in your web browser and allows ARGOS or a third-party to recognize you and make your next visit easier and ARGOS more useful to you.</span></p>
<p><span>Cookies can be &quot;persistent&quot; or &quot;session&quot; cookies.</span></p>
<br />
<p><strong>How Argos uses cookies</strong></p>
<p><span>When you use and access ARGOS, we may place cookies files in your web browser. </span></p>
<p><span>We use cookies for the following purposes: to enable certain functions of ARGOS and to provide analytics.</span></p>
<p><span>We use both session and persistent cookies on ARGOS and we use different types of cookies to run the Service: </span></p>
<p><span>1. Essential cookies. We may use essential cookies to authenticate users and prevent fraudulent use of user accounts.</span></p>
<p><span>2. Performance cookies. We use performance cookies to count visits and traffic sources, so we can measure and improve the performance of Argos, for example by analysing patterns of user behaviour in order to enhance user experience or by identifying areas of the website which may require maintenance. All information these cookies collect is anonymous.</span></p>
<p><span>&nbsp;3. Third-party cookies. Apart from our own cookies, we may use cookies from sources that Argos and OpenAIRE (Argos provider) makes use of for Argos to properly function and validate input and output. Third-party cookies are also used to report usage statistics of Argos.</span></p>
<p><span></span></p>
<br />
<p><strong>What are your choices regarding cookies</strong></p>
<p><span>If you&#39;d like to delete cookies or instruct your web browser to delete or refuse cookies, please visit the help pages of your web browser.</span></p>
<p><span>Please note, however, that if you delete cookies or refuse to accept them, you might not be able to use all of the features we offer, you may not be able to store your preferences, and some of our pages might not display properly.</span></p>
<p><span>Please contact OpenAIRE&rsquo;s Data Protection Officer for further </span><span>information on the cookies that we use and their purposes</span><span>: </span><span class="c5"><a href="mailto:dpo@openaire.eu">dpo@openaire.eu</a></span><span>&nbsp;</span></p>
<p><span></span></p>
<p><span>Last updated: 16/06/2020</span></p>
</div>
</div>
</div>

View File

@ -0,0 +1,12 @@
h1 {
text-align: center;
}
img {
height: 150px;
width: 100%;
}
.cookies-policy-component {
margin-top: 80px;
}

View File

@ -0,0 +1,15 @@
import { Component, OnInit } from '@angular/core';
@Component({
selector: 'app-cookies-policy',
templateUrl: './cookies-policy.component.html',
styleUrls: ['./cookies-policy.component.scss']
})
export class CookiesPolicyComponent implements OnInit {
constructor() { }
ngOnInit() {
}
}

View File

@ -0,0 +1,15 @@
import { NgModule } from '@angular/core';
import { CookiesPolicyComponent } from '@app/ui/sidebar/sidebar-footer/cookies-policy/cookies-policy.component';
import { CookiesPolicyRoutingModule } from '@app/ui/sidebar/sidebar-footer/cookies-policy/cookies-policy.routing';
import { CommonUiModule } from '@common/ui/common-ui.module';
@NgModule({
imports: [
CommonUiModule,
CookiesPolicyRoutingModule
],
declarations: [
CookiesPolicyComponent
],
})
export class CookiesPolicyModule { }

View File

@ -0,0 +1,16 @@
import { NgModule } from '@angular/core';
import { RouterModule, Routes } from '@angular/router';
import { CookiesPolicyComponent } from './cookies-policy.component';
const routes: Routes = [
{
path: '',
component: CookiesPolicyComponent,
},
];
@NgModule({
imports: [RouterModule.forChild(routes)],
exports: [RouterModule]
})
export class CookiesPolicyRoutingModule { }

View File

@ -6,7 +6,29 @@
</div>
<div class="row">
<div class="col-md-12">
<p>{{ 'TERMS-OF-SERVICE.MAIN-CONTENT' | translate}}</p>
<p><span>The </span><span>OpenDMP</span><span>&nbsp;service was developed to provide a more flexible, </span><span>collaborative </span><span>environment with machine actionable solutions in writing, sharing and publishing Data Management Plans (DMPs). It is a product of </span><span>cooperation between </span><span>OpenAIRE </span><span>AMKE</span><span class="c0">&nbsp;and EUDAT CDI and is offered both as a software &ldquo;OpenDMP &#39;&#39; and as an online service under the name &ldquo;ARGOS&rdquo;. </span></p>
<p><span></span></p>
<ol>
<li><span><a href="https://gitlab.eudat.eu/dmp/OpenAIRE-EUDAT-DMP-service-pilot">OpenDMP software</a></span><span>&nbsp;is offered under the Free Open Source Software license &nbsp;</span><span>Apache 2.0</span><span class="c0">, for further development and use by institutions and interested parties.</span></li>
<li><span><a href="https://argos.openaire.eu/">ARGOS</a></span><span>&nbsp;service</span><span>&nbsp;is offered by</span><span>&nbsp;</span><span>OpenAIRE</span><span>&nbsp;as </span><span>part of its mission to support Open Science in the European Research Area, focusing on information linking and contextualisation that enriches its </span><span class="c5"><a href="https://zenodo.org/record/2600275#.XZpJgUYzY2w">Research Graph</a></span><span>.</span><span class="c0">&nbsp;Use of ARGOS denotes agreement with the following terms:</span>
<ol>
<li><span>ARGOS is a software interface and a database with no storage capacity to store or preserve research data. The DMPs created are hosted in the </span><span>OpenAIRE </span><span>production environment for the sole purpose of exposing the DMP records once finalised (&ldquo;published&rdquo;). If assigned a DOI, the DMP records are linked to and preserved in Zenodo, the OpenAIRE&rsquo;s repository service. The ARGOS service is made available for use free-of-charge for research, educational and informational purposes.</span></li>
<li><span>Login to ARGOS is possible through a variety of external providers, among which Google, Facebook, Twitter, B2Access </span><span>and OpenAIRE Login</span><span>, that share information of their user profiles with ARGOS, </span><span>according to the rights that have been granted to the given provider by the user.</span><span>&nbsp;External email addresses that are used in invitations for collaborations are held in ARGOS database that stores information about only the </span><span class="c11">name</span><span>, </span><span class="c11">surname</span><span>&nbsp;</span><span>and </span><span class="c11">email address</span><span>&nbsp;</span><span>of the DMP creator and collaborator. &nbsp;Personal data is collected via the login option and via email invitations sent to external DMP contributors. This personal information as well as the activity of ARGOS users is used only for deriving usage metrics and assessing the service quality. They are stored in ARGOS database for as long as the account is active and they are accessible only from people in the team in charge of </span><span>quality and risk assessment</span><span>. </span><span>They will not be used for other purposes other than the ones stated in this document and they can be deleted at any time should the user claim a relevant request. </span><span>The aforementioned processes are also facilitated by the use of c</span><span>ookies</span><span>&nbsp;(see below the &ldquo;Cookie policy&rdquo;). </span></li>
<li><span>Data concerning DMP information will be used by OpenAIRE for research and development </span><span>purposes, </span><span>such as identifying DMP models, and for ensuring compliance with policy requirements and monitoring of DMPs uptake linked to OpenAIRE&rsquo;s Monitoring Dashboards and the Open Science Observatory.</span></li>
<li><span>The DMP Manager</span><span>, i.e. the person who creates and manages a DMP, and/ or the </span><span>contributor, i.e. the person who is invited to collaborate on a DMP, shall ensure that content is accurate and presented in a way that adheres to these </span><span>Terms of Service</span><span>&nbsp;and applicable laws, including, but not limited to, privacy, data protection and intellectual property rights.</span></li>
<li><span>ARGOS service is provided by OpenAIRE &ldquo;as is&rdquo;. Although OpenAIRE and its partners take measures for the availability, dependability, and accuracy of the service, access to ARGOS, utilisation of its features and preservation of the data deposited or produced by the service are not guaranteed. OpenAIRE cannot be held responsible </span><span>for any data loss regarding DMPs,</span><span>&nbsp;ethical or financial damage or any other direct or indirect impact that any failure of ARGOS service may have on its users. &nbsp;</span></li>
<li><span>ARGOS </span><span>users are exclusively responsible for their use of content, and shall hold OpenAIRE free and harmless in connection with their download and/or use.</span></li>
<li><span>OpenAIRE may not be held responsible for the content provided </span><span>or statements</span><span>&nbsp;made in Data Management Plans created and managed by its users. </span></li>
<li><span>All content is provided &ldquo;as-is&rdquo;. Users of content (&ldquo;Users&rdquo;) shall respect applicable license conditions. Download and use of content from ARGOS does not transfer any intellectual property rights in the content to the User.</span></li>
<li><span>In the case any content is reported as violating third party rights or other legal provisions, ARGOS reserves the right to remove the content from the service until the dispute is legally settled. Any such incidents should be reported at </span><span class="c5"><a href="mailto:noticeandtakedown@openaire.eu">noticeandtakedown@openaire.eu</a></span><span class="c0">&nbsp;</span></li>
<li><span>ARGOS users are held responsible for the data and information they provide in the service. Users may not add information, data or any other type of artifact that may be </span><span>malicious</span><span>, intentionally erroneous and potentially harmful for other ARGOS users, IPR owners and/or the general public.</span></li>
<li><span>In case a user of ARGOS identifies a potential </span><span>infringement</span><span>&nbsp;of copyright, </span><span>harmful</span><span>&nbsp;or </span><span>malicious </span><span>operation, function, code, information or data, shall inform OpenAIRE providing sufficient evidence for the identification of the case and the information and/or data challenged.</span></li>
<li><span>OpenAIRE reserves the right, without notice, at its sole discretion and without liability, (i) to alter or delete inappropriate content, and (ii) to restrict or remove User access where it considers that use of ARGOS interferes with its operations or violates these Terms of Service or applicable laws.</span></li>
<li><span>These Terms of Service are subject to change by OpenAIRE at any time and without notice, other than through posting the updated Terms of Service on the OpenAIRE website and indicating the version and date of last update.</span></li>
</ol>
</li>
</ol>
<p><span>For any questions or comments you may have about the current Terms of Service, please contact us: </span><span class="c5"><a href="mailto:argos@openaire.eu">argos@openaire.eu</a></span><span class="c0">&nbsp;</span></p>
</div>
</div>
</div>
</div>

View File

@ -1,18 +1,17 @@
import { NgModule } from '@angular/core';
import { Routes, RouterModule } from '@angular/router';
import { RouterModule, Routes } from '@angular/router';
import { UserGuideContentComponent } from './user-guide-content/user-guide-content.component';
import { UserGuideDialogComponent } from './dialog/user-guide-dialog.component';
const routes: Routes = [
{
path: '',
component: UserGuideDialogComponent,
component: UserGuideContentComponent,
},
];
@NgModule({
imports: [RouterModule.forChild(routes)],
exports: [RouterModule]
imports: [RouterModule.forChild(routes)],
exports: [RouterModule]
})
export class UserGuideRoutingModule { }

View File

@ -90,6 +90,7 @@
"ABOUT": "About",
"PRIVACY": "Privacy Policy",
"TERMS": "Terms Of Service",
"COOKIES-POLICY": "Cookies Policy",
"PLANS": "My DMPs",
"EXPLORE-PLANS": "Published DMPs",
"QUICK-WIZARD": "New DMP (Wizard)",
@ -143,7 +144,7 @@
"DISMISS": "Accept",
"DENY": "Refuse cookies",
"LINK": "Learn more",
"POLICY": "Cookie Policy"
"POLICY": "Cookies Policy"
},
"EMAIL-CONFIRMATION": {
"EXPIRED-EMAIL": "Mail invitation expired",
@ -739,7 +740,11 @@
"FUNDER": "Funder",
"STATUS": "DMP Status",
"EXTERNAL-SOURCE-HINT": "List of values provided by external source(s)",
"COLLABORATORS": "Collaborators"
"COLLABORATORS": "Collaborators",
"LANGUAGE": "Language",
"LICENSE": "License",
"VISIBILITY": "Visibility",
"PUBLICATION": "Publication Date"
},
"ACTIONS": {
"GO-TO-GRANT": "Go To DMP Grant",
@ -761,6 +766,10 @@
"TITLE": "Available Dataset Templates",
"TEXT": "Dataset Profiles selected: ",
"OK": "OK"
},
"VISIBILITY": {
"PUBLIC": "Public",
"RESTRICTED": "Restricted"
}
},
"DMP-PROFILE-LISTING": {
@ -974,7 +983,8 @@
"TAGS": "Tags",
"RESEARCHERS": "Researchers",
"ORGANIZATIONS": "Organizations",
"DATASET-IDENTIFIER": "Dataset Identifier"
"DATASET-IDENTIFIER": "Dataset Identifier",
"CURRENCY": "Currency"
},
"DATASET-PROFILE-COMBO-BOX-TYPE": {
"WORD-LIST": "Word List",
@ -1073,8 +1083,9 @@
"GUIDE": "User Guide",
"GLOSSARY": "Glossary",
"TERMS-OF-SERVICE": "Terms Of Service",
"PRIVACY-POLICY": "Privacy Policy",
"ABOUT": "About"
"ABOUT": "About",
"COOKIES-POLICY": "Cookies Policy",
"PRIVACY-POLICY": "Privacy Policy"
},
"GLOSSARY": {
"TITLE": "Glossary",
@ -1096,9 +1107,12 @@
"MAIN-CONTENT": ""
},
"TERMS-OF-SERVICE": {
"TITLE": "-Terms Of Service-",
"TITLE": "Terms of Service",
"MAIN-CONTENT": ""
},
"COOKIES-POLICY": {
"TITLE": "Cookies Policy"
},
"CONTACT": {
"SUPPORT": {
"TITLE": "Contact Support",

View File

@ -89,6 +89,7 @@
"ABOUT": "Acerca de",
"PRIVACY": "Política de privacidad",
"TERMS": "Términos de servicio",
"COOKIES-POLICY": "Cookies Policy",
"PLANS": "Mis PGDs",
"EXPLORE-PLANS": "PGDs Publicados",
"QUICK-WIZARD": "(Asistente) Nuevo PGD",
@ -735,7 +736,11 @@
"FUNDER": "Financiador",
"STATUS": "Estado del PGD",
"EXTERNAL-SOURCE-HINT": "Lista de valores proporcioador por fuente(s) externa(s)",
"COLLABORATORS": "Collaborators"
"COLLABORATORS": "Collaborators",
"LANGUAGE": "Language",
"LICENSE": "License",
"VISIBILITY": "Visibility",
"PUBLICATION": "Publication Date"
},
"ACTIONS": {
"GO-TO-GRANT": "Ir a las subvención del PGD",
@ -757,6 +762,10 @@
"TITLE": "Plantilla del Dataset disponible",
"TEXT": "Perfil del Dataset seleccionado: ",
"OK": "OK"
},
"VISIBILITY": {
"PUBLIC": "Public",
"RESTRICTED": "Restricted"
}
},
"DMP-PROFILE-LISTING": {
@ -800,8 +809,9 @@
}
},
"DATASET-PROFILE": {
"LIKE": "Buscar"
},
"LIKE": "Buscar",
"STATUS": "Status"
},
"DATA-SETS": {
"PERIOD-FROM": "Inicio",
"PERIOD-TO": "Fin",
@ -961,7 +971,16 @@
"FREE-TEXT": "Texto libre",
"RADIO-BOX": "Casilla",
"TEXT-AREA": "Area de texto",
"DATE-PICKER": "Campo de entrada para fecha"
"DATE-PICKER": "Campo de entrada para fecha",
"EXTERNAL-DATASETS": "External Datasets",
"DATA-REPOSITORIES": "Data Repositories",
"REGISTRIES": "Registries",
"SERVICES": "Services",
"TAGS": "Tags",
"RESEARCHERS": "Researchers",
"ORGANIZATIONS": "Organizations",
"DATASET-IDENTIFIER": "Dataset Identifier",
"CURRENCY": "Currency"
},
"DATASET-PROFILE-COMBO-BOX-TYPE": {
"WORD-LIST": "Lista de palabras",
@ -1060,8 +1079,9 @@
"GUIDE": "User Guide",
"GLOSSARY": "Glosario",
"TERMS-OF-SERVICE": "Términos del servicio",
"PRIVACY-POLICY": "Política de privacidad",
"ABOUT": "Acerca de"
"ABOUT": "Acerca de",
"COOKIES-POLICY": "Cookies Policy",
"PRIVACY-POLICY": "Política de privacidad"
},
"GLOSSARY": {
"TITLE": "Glosario",
@ -1086,6 +1106,9 @@
"TITLE": "-Términos del servicio-",
"MAIN-CONTENT": ""
},
"COOKIES-POLICY": {
"TITLE": "Cookies Policy"
},
"CONTACT": {
"SUPPORT": {
"TITLE": "Contacte con el soporte técnico",
@ -1316,5 +1339,10 @@
}
},
"HINT": "(Nombre sugerido por defecto)"
},
"DATASET-PROFILE-STATUS": {
"NONE": "None",
"DRAFT": "Draft",
"FINALIZED": "Finalized"
}
}

View File

@ -62,7 +62,7 @@
"DELETE": "Διαγραφή",
"REMOVE": "Αφαίρεση",
"CANCEL": "Ακύρωση",
"LEAVE": "Αναχώρηση",
"LEAVE": "Αποχώρηση",
"POLICY-AGREE": "Κάντε τα ονόματα ορατά στο κοινό.",
"REQUIRED": "Απαιτείται να κάνετε κλικ στο πλαίσιο ελέγχου."
}
@ -89,6 +89,7 @@
"ABOUT": "Σχετικά",
"PRIVACY": "Πολιτική Απορρήτου και Προστασίας Προσωπικών Δεδομένων",
"TERMS": "Όροι χρήσης",
"COOKIES-POLICY": "Cookies Policy",
"PLANS": "Τα Σχέδια Διαχείρισης Δεδομένων Μου",
"EXPLORE-PLANS": "Δημοσιευμένα Σχέδια Διαχείρισης Δεδομένων",
"QUICK-WIZARD": "Νέο Σχέδιο Διαχείρισης Δεδομένων (Wizard)",
@ -554,6 +555,10 @@
"ERROR": {
"DELETED-DMP": "Το επιλεγμένο Σχέδιο Διαχείρισης Δεδομένων θα διαγραφεί",
"FORBIDEN-DMP": "Δεν επιτρέπεται η πρόσβαση σε αυτό το Σχέδιο Διαχείρισης Δεδομένων"
},
"MULTIPLE-DIALOG": {
"ZENODO-LOGIN": "Login with Zenodo",
"USE-DEFAULT": "Use Default Token"
}
},
"DATASET-LISTING": {
@ -732,7 +737,11 @@
"FUNDER": "Χορηγός",
"STATUS": "Κατάσταση Σχεδίου Διαχείρισης Δεδομένων",
"EXTERNAL-SOURCE-HINT": "Κατάλογος των τιμών που παρέχονται από εξωτερικές πηγές",
"COLLABORATORS": "Συνεργάτες"
"COLLABORATORS": "Συνεργάτες",
"LANGUAGE": "Language",
"LICENSE": "License",
"VISIBILITY": "Visibility",
"PUBLICATION": "Publication Date"
},
"ACTIONS": {
"GO-TO-GRANT": "Μεταβείτε στην Επιχορήγηση Σχεδίου Διαχείρισης Δεδομένων",
@ -754,6 +763,10 @@
"TITLE": "Διαθέσιμα Templates Συνόλου Δεδομένων",
"TEXT": "Επιλογή Χαρακτηριστικών Συνόλου Δεδομένων:",
"OK": "OK"
},
"VISIBILITY": {
"PUBLIC": "Public",
"RESTRICTED": "Restricted"
}
},
"DMP-PROFILE-LISTING": {
@ -797,7 +810,8 @@
}
},
"DATASET-PROFILE": {
"LIKE": "Αναζήτηση"
"LIKE": "Αναζήτηση",
"STATUS": "Status"
},
"DATA-SETS": {
"PERIOD-FROM": "Έναρξη",
@ -861,7 +875,8 @@
"ACTIONS": {
"SAVE": "Αποθήκευση",
"CANCEL": "Ακύρωση",
"DELETE": "Διαγραφή"
"DELETE": "Διαγραφή",
"UPDATE": "Update"
},
"VERSION-DIALOG": {
"ABOUT": "Η δημιουργία νέας έκδοσης συμβαίνει αυτόματα",
@ -957,7 +972,16 @@
"FREE-TEXT": "Ελεύθερο Κείμενο",
"RADIO-BOX": "Πλαίσιο Επιλογής",
"TEXT-AREA": "Περιοχή Κειμένου",
"DATE-PICKER": "Επιλογή Ημερομηνίας"
"DATE-PICKER": "Επιλογή Ημερομηνίας",
"EXTERNAL-DATASETS": "External Datasets",
"DATA-REPOSITORIES": "Data Repositories",
"REGISTRIES": "Registries",
"SERVICES": "Services",
"TAGS": "Tags",
"RESEARCHERS": "Researchers",
"ORGANIZATIONS": "Organizations",
"DATASET-IDENTIFIER": "Dataset Identifier",
"CURRENCY": "Currency"
},
"DATASET-PROFILE-COMBO-BOX-TYPE": {
"WORD-LIST": "Λίστα Λέξεων",
@ -979,6 +1003,14 @@
"TITLE": "Προσθήκη Ερευνητή",
"FIRST_NAME": "Όνομα",
"LAST_NAME": "Επώνυμο",
"ACTIONS": {
"SAVE": "Save",
"CANCEL": "Cancel"
}
},
"ADDORGANIZATION-EDITOR": {
"TITLE": "Add an Organization",
"NAME": "Name",
"ACTIONS": {
"SAVE": "Αποθήκευση",
"CANCEL": "Ακύρωση"
@ -1048,8 +1080,9 @@
"GUIDE": "Οδηγός Χρήστη",
"GLOSSARY": "Γλωσσάριο",
"TERMS-OF-SERVICE": "Όροι Χρήσης",
"PRIVACY-POLICY": "Πολιτική Απορρήτου",
"ABOUT": "Σχετικά με το Argos"
"ABOUT": "Σχετικά με το Argos",
"COOKIES-POLICY": "Cookies Policy",
"PRIVACY-POLICY": "Πολιτική Απορρήτου"
},
"GLOSSARY": {
"TITLE": "Γλωσσάριο",
@ -1074,6 +1107,9 @@
"TITLE": "-Όροι Χρήσης-",
"MAIN-CONTENT": ""
},
"COOKIES-POLICY": {
"TITLE": "Cookies Policy"
},
"CONTACT": {
"SUPPORT": {
"TITLE": "Επικοινωνία",
@ -1142,6 +1178,12 @@
"SHOW-ALL": "Προβολή Όλων",
"CREATOR": "Συντάκτης",
"MEMBER": "Μέλος"
},
"ZENODO": {
"LOGIN": "Login to Zenodo",
"LOGOUT": "Remove Zenodo",
"TITLE": "Zenodo Account",
"DESCRIPTION": "Linked Zenodo Account:"
}
},
"DATASET-REFERENCED-MODELS": {

View File

@ -9,17 +9,14 @@
<!-- Font Awesome icons (free version)-->
<script src="https://use.fontawesome.com/releases/v5.12.1/js/all.js" crossorigin="anonymous"></script>
<!-- Google fonts-->
<link
href="https://fonts.googleapis.com/css2?family=Roboto:ital,wght@0,100;0,300;0,400;0,500;0,700;0,900;1,100;1,300;1,400;1,500;1,700;1,900&display=swap"
rel="stylesheet">
<link href="https://fonts.googleapis.com/css2?family=Roboto:ital,wght@0,100;0,300;0,400;0,500;0,700;0,900;1,100;1,300;1,400;1,500;1,700;1,900&display=swap" rel="stylesheet">
<!-- Core theme CSS -->
<link href="../css/styles.css" rel="stylesheet">
<link href="../css/navbar.css" rel="stylesheet">
<link href="../css/footer.css" rel="stylesheet">
<link href="../css/section.css" rel="stylesheet">
<!-- Bootstrap -->
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css"
integrity="sha384-Gn5384xqQ1aoWXA+058RXPxPg6fy4IWvTNh0E263XmFcJlSAwiGgFAW/dAiS6JXm" crossorigin="anonymous">
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css" integrity="sha384-Gn5384xqQ1aoWXA+058RXPxPg6fy4IWvTNh0E263XmFcJlSAwiGgFAW/dAiS6JXm" crossorigin="anonymous">
<link href="//maxcdn.bootstrapcdn.com/font-awesome/4.3.0/css/font-awesome.min.css" rel="stylesheet">
</head>
@ -28,13 +25,11 @@
<nav class="navbar navbar-expand-lg" id="nav">
<div class="container">
<a class="navbar-brand" href="../index.html"><img src="../assets/img/argos-logo.svg"></a>
<button class="collapse navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarResponsive"
aria-controls="navbarResponsive" aria-expanded="false" aria-label="Toggle navigation"><i
class="fas fa-bars ml-1"></i></button>
<button class="collapse navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarResponsive" aria-controls="navbarResponsive" aria-expanded="false" aria-label="Toggle navigation"><i class="fas fa-bars ml-1"></i></button>
<div class="navbar-collapse" id="navbarResponsive">
<ul class="navbar-nav text-uppercase ml-auto">
<li class="nav-item">
<a class="nav-link dropbtn active-nav-link" href="#about">ABOUT</a>
<a class="nav-link dropbtn active-nav-link" href="#about">ABOUT</a>
<div id="aboutDropdown" class="dropdown-content">
<div class="dropdown-top"></div>
<div class="dropdown-options">
@ -56,7 +51,7 @@
</div>
</li>
<li class="nav-item"><a class="nav-link" href="../contact.html">CONTACT</a></li>
<li class="nav-item"><a class="nav-link" href="#sign-in">SIGN IN</a></li>
<li class="nav-item"><li class="nav-item"><a class="nav-link" href="/login">SIGN IN</a></li></li>
</ul>
</div>
</div>
@ -94,9 +89,16 @@
<a data-toggle="collapse" href="#collapseFAQ-2" aria-expanded="true" aria-controls="collapseFAQ-2">Who is it for?</a>
</div>
</div>
<!-- <div class="collapse show" id="collapseFAQ-2">
<div class="faq-content"></div>
</div> -->
<div class="collapse show" id="collapseFAQ-2">
<div class="faq-content">
ARGOS is inclusive to all researchers and research coordinators who may use the tool to create
machine actionable DMPs. Funding and Research Performing Organizations as well as research
communities may use the tool and create Dataset Description templates according to their
preferences or requirements. ARGOS may be used for purposes other than research projects, such
as on the occasion of trainings that familiarise scientists with the data management planning
process.
</div>
</div>
</div>
<div class="collapse-box">
<div class="panel-heading">
@ -104,9 +106,54 @@
<a data-toggle="collapse" href="#collapseFAQ-3" aria-expanded="true" aria-controls="collapseFAQ-3">How can I use it?</a>
</div>
</div>
<!-- <div class="collapse show" id="collapseFAQ-3">
<div class="faq-content"></div>
</div> -->
<div class="collapse show" id="collapseFAQ-3">
<div class="faq-content">
<p>ARGOS is comprised of two main functionalities: DMP templates and Dataset Descriptions.
Additional entities are Projects that link to funders and grants information.<br />ARGOS can
be used for:
<br /><br /><u style="padding:20px;"> A. viewing/ consulting publicly released DMPs and
Dataset Descriptions or Projects corresponding to DMPs</u><br /><br />
The tool offers options for publishing DMPs in two modes, private or public. To view public
DMPs and Dataset Descriptions, there is no need for login to the platform.
<br /><br /><u style="padding:20px;"> B. writing and publishing a DMP</u><br /><br />
The tool helps researchers comply with mandates that may be attached to their grant
proposal/ project funding. They can therefore choose from the most suitable to their needs
template from the Dataset Descriptions collection and proceed with answering the
corresponding questions. Once finalized, researchers can assign a DOI to their DMP, publish
and eventually cite it.
<br /><br /><u style="padding:20px;"> C. practicing in writing DMPs and Dataset
Descriptions</u><br /><br />
Given that Data Management Planning reflects the data management lifecycle and in
accordance/ response to the increasing demand of the global scientific/ research community
for training in Research Data Management (RDM), ARGOS may be used for educational purposes.
Examples may refer to embedding DMP and DMP tools in specific curricula or even utilization
of the tool for researchers and students familiarization with the concept and process, as
part of library instructions sessions.
</p>
</div>
</div>
</div>
<div class="collapse-box">
<div class="panel-heading">
<div class="collapse-title">
<a data-toggle="collapse" href="#collapseFAQ-4" aria-expanded="true" aria-controls="collapseFAQ-4">What is the difference between the “Wizard” and the “Expert”
modes/ features?</a>
</div>
</div>
<div class="collapse show" id="collapseFAQ-4">
<div class="faq-content">
There are two ways of creating a DMP: the “Wizard” and the “Expert”. The DMP Wizard combines the
most necessary fields of the DMP template and the Data Description template. It is an easy way
of starting a DMP and completing a Dataset Description. The downside when using the Wizard is
that it only supports one Dataset Description. To add more datasets documentation, someone must
open the DMP from DMP Expert.
DMP expert contains extra fields for describing the project, grant, funding, contributors and
associations between DMP authors, etc. DMP Expert is advised for use when further modification
and personalization is to take place.
</div>
</div>
</div>
</div>
</section>
@ -118,53 +165,45 @@
<img src="../assets/img/argos-logo - Copy.svg" width="98" height="37">
</div>
<div class="col-auto">
<div class="footer-text">ARGOS receives funding from the European Union's Horizon 2020 Research and
Innovation programme under grant agreement No. 731011.</div>
<div class="footer-text">OpenAIRE-Advance receives funding from the European Union's Horizon 2020
Research and Innovation programme under Grant Agreement No. 777541.</div>
</div>
<div class="col-auto">
<img src="../assets/img/Logo_Horizontal_white_small.png" width="126" height="30">
<a href="https://www.openaire.eu/">
<img src="../assets/img/Logo_Horizontal_white_small.png" width="126" height="30">
</a>
</div>
</div>
<div class="row justify-content-center pt-5">
<div class="col d-flex justify-content-end">
<a class="btn rounded-circle btn-social mx-1" href="#!"><i class="fab fa-lg fa-facebook-f"></i></a>
<a class="btn rounded-circle btn-social twitter mx-1" href="#!"><i
class="fab fa-lg fa-twitter"></i></a>
<a class="btn rounded-circle btn-social linkedin mx-1" href="#!"><i
class="fab fa-lg fa-linkedin-in"></i></a>
<a class="btn rounded-circle btn-social youtube mx-1" href="#!"><i
class="fab fa-lg fa-youtube"></i></a>
<a class="btn rounded-circle btn-social mx-1" href="https://www.facebook.com/groups/openaire/"><i class="fab fa-lg fa-facebook-f"></i></a>
<a class="btn rounded-circle btn-social twitter mx-1" href="https://twitter.com/OpenAIRE_eu"><i class="fab fa-lg fa-twitter"></i></a>
<a class="btn rounded-circle btn-social linkedin mx-1" href="https://www.linkedin.com/groups/3893548/"><i class="fab fa-lg fa-linkedin-in"></i></a>
<a class="btn rounded-circle btn-social youtube mx-1" href="https://www.youtube.com/channel/UChFYqizc-S6asNjQSoWuwjw"><i class="fab fa-lg fa-youtube"></i></a>
</div>
<div class="col">
<a class="btn mx-1" href="#!"><span class="newsletter">Newsletter</span><i
class="fas fa-lg fa-wifi wifi-rotate"></i></i></a>
<a class="btn mx-1" href="https://www.openaire.eu/newsletter/listing"><span class="newsletter">Newsletter</span><i class="fas fa-lg fa-wifi wifi-rotate"></i></i></a>
</div>
</div>
<div class="row justify-content-center pt-5">
<a class="col d-flex justify-content-end conditions-policy" href="#!">Terms and conditions</a>
<a class="col conditions-policy" href="#!">Cookies policy</a>
<a class="col d-flex justify-content-end conditions-policy" href="/terms-and-conditions">Terms and conditions</a>
<a class="col conditions-policy" href="/cookies-policy">Cookies policy</a>
</div>
<div class="row justify-content-center pt-5">
<div class="col-auto"><img src="../assets/img/Cc.logo.circle.png" width="24" height="24"></div>
<div class="col-auto pl-0"><img src="../assets/img/univ-access.png" width="24" height="24"></div>
<div class="licence">Unless otherwise indicated, all materials created by OpenAIRE are licenced under
</div>&nbsp;
<div class="licence"><u>ATTRIBUTION 4.0 INTERNATIONAL LICENSE.</u></div>
<div class="licence"><u><a href="https://creativecommons.org/licenses/by/4.0/">ATTRIBUTION 4.0 INTERNATIONAL LICENSE.</a></u></div>
</div>
</div>
</footer>
<!-- Core theme JS-->
<script src="../js/scripts.js"></script>
<!-- Bootstrap -->
<script src="https://code.jquery.com/jquery-3.5.1.slim.min.js"
integrity="sha384-DfXdz2htPH0lsSSs5nCTpuj/zy4C+OGpamoFVy38MVBnE+IbbVYUew+OrCXaRkfj"
crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/popper.js@1.16.0/dist/umd/popper.min.js"
integrity="sha384-Q6E9RHvbIyZFJoft+2mJbHaEWldlvI9IOYy5n3zV9zzTtmI3UksdQRVvoxMfooAo"
crossorigin="anonymous"></script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.5.0/js/bootstrap.min.js"
integrity="sha384-OgVRvuATP1z7JjHLkuOU7Xw704+h835Lr+6QL9UvYjZE3Ipu6Tp75j7Bh/kR0JKI"
crossorigin="anonymous"></script>
<script src="https://code.jquery.com/jquery-3.5.1.slim.min.js" integrity="sha384-DfXdz2htPH0lsSSs5nCTpuj/zy4C+OGpamoFVy38MVBnE+IbbVYUew+OrCXaRkfj" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/popper.js@1.16.0/dist/umd/popper.min.js" integrity="sha384-Q6E9RHvbIyZFJoft+2mJbHaEWldlvI9IOYy5n3zV9zzTtmI3UksdQRVvoxMfooAo" crossorigin="anonymous"></script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.5.0/js/bootstrap.min.js" integrity="sha384-OgVRvuATP1z7JjHLkuOU7Xw704+h835Lr+6QL9UvYjZE3Ipu6Tp75j7Bh/kR0JKI" crossorigin="anonymous"></script>
</body>
</html>
</html>

View File

@ -9,17 +9,14 @@
<!-- Font Awesome icons (free version)-->
<script src="https://use.fontawesome.com/releases/v5.12.1/js/all.js" crossorigin="anonymous"></script>
<!-- Google fonts-->
<link
href="https://fonts.googleapis.com/css2?family=Roboto:ital,wght@0,100;0,300;0,400;0,500;0,700;0,900;1,100;1,300;1,400;1,500;1,700;1,900&display=swap"
rel="stylesheet">
<link href="https://fonts.googleapis.com/css2?family=Roboto:ital,wght@0,100;0,300;0,400;0,500;0,700;0,900;1,100;1,300;1,400;1,500;1,700;1,900&display=swap" rel="stylesheet">
<!-- Core theme CSS -->
<link href="../css/styles.css" rel="stylesheet">
<link href="../css/navbar.css" rel="stylesheet">
<link href="../css/footer.css" rel="stylesheet">
<link href="../css/section.css" rel="stylesheet">
<!-- Bootstrap -->
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css"
integrity="sha384-Gn5384xqQ1aoWXA+058RXPxPg6fy4IWvTNh0E263XmFcJlSAwiGgFAW/dAiS6JXm" crossorigin="anonymous">
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css" integrity="sha384-Gn5384xqQ1aoWXA+058RXPxPg6fy4IWvTNh0E263XmFcJlSAwiGgFAW/dAiS6JXm" crossorigin="anonymous">
</head>
<body id="page-top" class="bootstrap-overrides">
@ -27,9 +24,7 @@
<nav class="navbar navbar-expand-lg" id="nav">
<div class="container">
<a class="navbar-brand" href="../index.html"><img src="../assets/img/argos-logo.svg"></a>
<button class="collapse navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarResponsive"
aria-controls="navbarResponsive" aria-expanded="false" aria-label="Toggle navigation"><i
class="fas fa-bars ml-1"></i></button>
<button class="collapse navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarResponsive" aria-controls="navbarResponsive" aria-expanded="false" aria-label="Toggle navigation"><i class="fas fa-bars ml-1"></i></button>
<div class="navbar-collapse" id="navbarResponsive">
<ul class="navbar-nav text-uppercase ml-auto">
<li class="nav-item">
@ -55,7 +50,7 @@
</div>
</li>
<li class="nav-item"><a class="nav-link" href="../contact.html">CONTACT</a></li>
<li class="nav-item"><a class="nav-link" href="#sign-in">SIGN IN</a></li>
<li class="nav-item"><li class="nav-item"><a class="nav-link" href="/login">SIGN IN</a></li></li>
</ul>
</div>
</div>
@ -84,7 +79,8 @@
<p class="pt-2">
ARGOS is a service that is integrated within the OpenAIRE platform and is freely offered for use through
the
<a href="#"><u>OpenAIRE Service Catalogue</u></a> and the EOSC Catalogue. ARGOS enhances the OpenAIRE
<a href="http://catalogue.openaire.eu/"><u>OpenAIRE Service Catalogue</u></a> and the EOSC Catalogue.
ARGOS enhances the OpenAIRE
Research Graph while at the same time utilises its
underlying services, external sources and semantics to add value to the Dataset Description templates it
produces thus increasing validation of DMPs. DMPs in ARGOS are treated as research outputs that can be
@ -94,18 +90,21 @@
<div class="text-box">
<p>
<b>The Name:</b> ARGOS is inspired by Greek mythology, both from
<a href="#"><u>Argus Panoptes</u></a> the hundred-eyed giant and
from <a href="#"><u>Argus (Argonaut)</u></a> builder of Argos ship, for the many-eyes monitoring sense and for the crafting
<a href="https://en.wikipedia.org/wiki/Argus_Panoptes"><u>Argus Panoptes</u></a> the hundred-eyed
giant and
from <a href="https://en.wikipedia.org/wiki/Argus_(Argonaut)"><u>Argus (Argonaut)</u></a> builder of
Argos ship, for the many-eyes monitoring sense and for the crafting
and building for endurance concealing long-term goals.
</p>
</div>
<p class="pt-2">
More details on ARGOS as registered in the OpenAIRE services catalogue is available here:
<a href="#"><u>http://catalogue.openaire.eu/service/openaire.argos</u></a>. ARGOS as a Data Management
<a href="http://catalogue.openaire.eu/service/openaire.argos"><u>http://catalogue.openaire.eu/service/openaire.argos</u></a>.
ARGOS as a Data Management
Planning tool within
EOSC can be explored in the EOSC catalogue of services here:
<a href="#"><u>https://catalogue.eosc-portal.eu/service/openaire.argos</u></a>
<a href="https://catalogue.eosc-portal.eu/service/openaire.argos"><u>https://catalogue.eosc-portal.eu/service/openaire.argos</u></a>
</p>
<p class="pt-2 pb-5">
ARGOS is offered as a standalone service, where
@ -122,53 +121,45 @@
<img src="../assets/img/argos-logo - Copy.svg" width="98" height="37">
</div>
<div class="col-auto">
<div class="footer-text">ARGOS receives funding from the European Union's Horizon 2020 Research and
Innovation programme under grant agreement No. 731011.</div>
<div class="footer-text">OpenAIRE-Advance receives funding from the European Union's Horizon 2020
Research and Innovation programme under Grant Agreement No. 777541.</div>
</div>
<div class="col-auto">
<img src="../assets/img/Logo_Horizontal_white_small.png" width="126" height="30">
<a href="https://www.openaire.eu/">
<img src="../assets/img/Logo_Horizontal_white_small.png" width="126" height="30">
</a>
</div>
</div>
<div class="row justify-content-center pt-5">
<div class="col d-flex justify-content-end">
<a class="btn rounded-circle btn-social mx-1" href="#!"><i class="fab fa-lg fa-facebook-f"></i></a>
<a class="btn rounded-circle btn-social twitter mx-1" href="#!"><i
class="fab fa-lg fa-twitter"></i></a>
<a class="btn rounded-circle btn-social linkedin mx-1" href="#!"><i
class="fab fa-lg fa-linkedin-in"></i></a>
<a class="btn rounded-circle btn-social youtube mx-1" href="#!"><i
class="fab fa-lg fa-youtube"></i></a>
<a class="btn rounded-circle btn-social mx-1" href="https://www.facebook.com/groups/openaire/"><i class="fab fa-lg fa-facebook-f"></i></a>
<a class="btn rounded-circle btn-social twitter mx-1" href="https://twitter.com/OpenAIRE_eu"><i class="fab fa-lg fa-twitter"></i></a>
<a class="btn rounded-circle btn-social linkedin mx-1" href="https://www.linkedin.com/groups/3893548/"><i class="fab fa-lg fa-linkedin-in"></i></a>
<a class="btn rounded-circle btn-social youtube mx-1" href="https://www.youtube.com/channel/UChFYqizc-S6asNjQSoWuwjw"><i class="fab fa-lg fa-youtube"></i></a>
</div>
<div class="col">
<a class="btn mx-1" href="#!"><span class="newsletter">Newsletter</span><i
class="fas fa-lg fa-wifi wifi-rotate"></i></i></a>
<a class="btn mx-1" href="https://www.openaire.eu/newsletter/listing"><span class="newsletter">Newsletter</span><i class="fas fa-lg fa-wifi wifi-rotate"></i></i></a>
</div>
</div>
<div class="row justify-content-center pt-5">
<a class="col d-flex justify-content-end conditions-policy" href="#!">Terms and conditions</a>
<a class="col conditions-policy" href="#!">Cookies policy</a>
<a class="col d-flex justify-content-end conditions-policy" href="/terms-and-conditions">Terms and conditions</a>
<a class="col conditions-policy" href="/cookies-policy">Cookies policy</a>
</div>
<div class="row justify-content-center pt-5">
<div class="col-auto"><img src="../assets/img/Cc.logo.circle.png" width="24" height="24"></div>
<div class="col-auto pl-0"><img src="../assets/img/univ-access.png" width="24" height="24"></div>
<div class="licence">Unless otherwise indicated, all materials created by OpenAIRE are licenced under
</div>&nbsp;
<div class="licence"><u>ATTRIBUTION 4.0 INTERNATIONAL LICENSE.</u></div>
<div class="licence"><u><a href="https://creativecommons.org/licenses/by/4.0/">ATTRIBUTION 4.0 INTERNATIONAL LICENSE.</a></u></div>
</div>
</div>
</footer>
<!-- Core theme JS-->
<script src="../js/scripts.js"></script>
<!-- Bootstrap -->
<script src="https://code.jquery.com/jquery-3.5.1.slim.min.js"
integrity="sha384-DfXdz2htPH0lsSSs5nCTpuj/zy4C+OGpamoFVy38MVBnE+IbbVYUew+OrCXaRkfj"
crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/popper.js@1.16.0/dist/umd/popper.min.js"
integrity="sha384-Q6E9RHvbIyZFJoft+2mJbHaEWldlvI9IOYy5n3zV9zzTtmI3UksdQRVvoxMfooAo"
crossorigin="anonymous"></script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.5.0/js/bootstrap.min.js"
integrity="sha384-OgVRvuATP1z7JjHLkuOU7Xw704+h835Lr+6QL9UvYjZE3Ipu6Tp75j7Bh/kR0JKI"
crossorigin="anonymous"></script>
<script src="https://code.jquery.com/jquery-3.5.1.slim.min.js" integrity="sha384-DfXdz2htPH0lsSSs5nCTpuj/zy4C+OGpamoFVy38MVBnE+IbbVYUew+OrCXaRkfj" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/popper.js@1.16.0/dist/umd/popper.min.js" integrity="sha384-Q6E9RHvbIyZFJoft+2mJbHaEWldlvI9IOYy5n3zV9zzTtmI3UksdQRVvoxMfooAo" crossorigin="anonymous"></script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.5.0/js/bootstrap.min.js" integrity="sha384-OgVRvuATP1z7JjHLkuOU7Xw704+h835Lr+6QL9UvYjZE3Ipu6Tp75j7Bh/kR0JKI" crossorigin="anonymous"></script>
</body>
</html>
</html>

View File

@ -1 +1,60 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="472" height="519" viewBox="0 0 472 519"><defs><filter id="a" x="25.5" y="111.5" width="418" height="363" filterUnits="userSpaceOnUse"><feOffset dy="6" input="SourceAlpha"/><feGaussianBlur stdDeviation="6.5" result="b"/><feFlood flood-opacity="0.18"/><feComposite operator="in" in2="b"/><feComposite in="SourceGraphic"/></filter></defs><g transform="translate(-373 -431)"><g transform="translate(373 431)" fill="#fff" stroke="#b6e2e2" stroke-width="8"><rect width="472" height="519" rx="37" stroke="none"/><rect x="4" y="4" width="464" height="511" rx="33" fill="none"/></g><text transform="translate(418 499)" font-size="15" font-family="Roboto-Regular, Roboto" opacity="0.45"><tspan x="0" y="0">Select Template</tspan></text><g transform="translate(417.741 518.451)"><g transform="translate(0.259 -0.451)" fill="#fff" stroke="#a9dedd" stroke-width="2"><rect width="379" height="38" rx="4" stroke="none"/><rect x="1" y="1" width="377" height="36" rx="3" fill="none"/></g><path d="M4.911,0,9.822,5.113H0Z" transform="translate(361.766 22.37) rotate(180)" fill="#23bcba" opacity="0.56"/><text transform="translate(16.259 24.549)" fill="#23bcba" font-size="15" font-family="Roboto-Regular, Roboto"><tspan x="0" y="0">Select a template from the list</tspan></text></g><g transform="matrix(1, 0, 0, 1, 373, 431)" filter="url(#a)"><rect width="379" height="324" rx="4" transform="translate(45 125)" fill="#fff"/></g><rect width="379" height="79" transform="translate(418 556)" fill="#f3f3f3"/><text transform="translate(431 614)" font-size="15" font-family="Roboto-Regular, Roboto" opacity="0.45"><tspan x="0" y="0">Dataset description - </tspan><tspan y="0" font-family="Roboto-Bold, Roboto" font-weight="700">Funder</tspan></text><text transform="translate(431 591)" font-size="20" font-family="Roboto-Regular, Roboto" opacity="0.6"><tspan x="0" y="0">Horizon 2020</tspan></text><g transform="translate(0 78)"><rect width="379" height="79" transform="translate(418 556)" fill="#fff"/><text transform="translate(431 614)" font-size="15" font-family="Roboto-Regular, Roboto" opacity="0.45"><tspan x="0" y="0">Dataset description - </tspan><tspan y="0" font-family="Roboto-Bold, Roboto" font-weight="700">Research Community</tspan></text><text transform="translate(431 591)" font-size="20" font-family="Roboto-Regular, Roboto" opacity="0.6"><tspan x="0" y="0">FWF - Austrian Science Fund</tspan></text></g><g transform="translate(0 156)"><rect width="379" height="79" transform="translate(418 556)" fill="#fff"/><text transform="translate(431 614)" font-size="15" font-family="Roboto-Regular, Roboto" opacity="0.45"><tspan x="0" y="0">Dataset description - </tspan><tspan y="0" font-family="Roboto-Bold, Roboto" font-weight="700">Institution</tspan></text><text transform="translate(431 591)" font-size="20" font-family="Roboto-Regular, Roboto" opacity="0.6"><tspan x="0" y="0">Clarin-D</tspan></text></g><g transform="translate(0 234)"><rect width="379" height="79" transform="translate(418 556)" fill="none"/><text transform="translate(431 614)" font-size="15" font-family="Roboto-Regular, Roboto" opacity="0.45"><tspan x="0" y="0">Dataset description - </tspan><tspan y="0" font-family="Roboto-Bold, Roboto" font-weight="700">Initiative</tspan></text><text transform="translate(431 591)" font-size="20" font-family="Roboto-Regular, Roboto" opacity="0.6"><tspan x="0" y="0">IOSSG</tspan></text></g></g></svg>
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="568" height="615" viewBox="0 0 568 615">
<defs>
<filter id="Rectangle_7" x="0" y="0" width="568" height="615" filterUnits="userSpaceOnUse">
<feOffset input="SourceAlpha"/>
<feGaussianBlur stdDeviation="16" result="blur"/>
<feFlood flood-color="#458e8d"/>
<feComposite operator="in" in2="blur"/>
<feComposite in="SourceGraphic"/>
</filter>
<filter id="Rectangle_1512" x="73.5" y="147.5" width="418" height="363" filterUnits="userSpaceOnUse">
<feOffset dy="6" input="SourceAlpha"/>
<feGaussianBlur stdDeviation="6.5" result="blur-2"/>
<feFlood flood-opacity="0.18"/>
<feComposite operator="in" in2="blur-2"/>
<feComposite in="SourceGraphic"/>
</filter>
</defs>
<g id="Group_1162" data-name="Group 1162" transform="translate(-325 -383)">
<g transform="matrix(1, 0, 0, 1, 325, 383)" filter="url(#Rectangle_7)">
<g id="Rectangle_7-2" data-name="Rectangle 7" transform="translate(48 48)" fill="#fff" stroke="#b6e2e2" stroke-width="8">
<rect width="472" height="519" rx="37" stroke="none"/>
<rect x="4" y="4" width="464" height="511" rx="33" fill="none"/>
</g>
</g>
<text id="Select_one_or_more_templates_for_your_DMP" data-name="Select one or more templates for your DMP" transform="translate(418 487)" font-size="15" font-family="Roboto-Regular, Roboto" opacity="0.8"><tspan x="0" y="0">Select one or more templates for your DMP</tspan></text>
<g id="Group_1161" data-name="Group 1161" transform="translate(417.741 506.451)">
<g id="Rectangle_1188" data-name="Rectangle 1188" transform="translate(0.259 -0.451)" fill="#fff" stroke="#a9dedd" stroke-width="2">
<rect width="379" height="38" rx="4" stroke="none"/>
<rect x="1" y="1" width="377" height="36" rx="3" fill="none"/>
</g>
<path id="Polygon_2" data-name="Polygon 2" d="M4.911,0,9.822,5.113H0Z" transform="translate(361.766 22.37) rotate(180)" fill="#23bcba" opacity="0.56"/>
<text id="Select_templates_from_the_list" data-name="Select templates from the list" transform="translate(16.259 24.549)" fill="#23bcba" font-size="15" font-family="Roboto-Regular, Roboto"><tspan x="0" y="0">Select templates from the list</tspan></text>
</g>
<g transform="matrix(1, 0, 0, 1, 325, 383)" filter="url(#Rectangle_1512)">
<rect id="Rectangle_1512-2" data-name="Rectangle 1512" width="379" height="324" rx="4" transform="translate(93 161)" fill="#fff"/>
</g>
<g id="Group_1294" data-name="Group 1294" transform="translate(0 -12)">
<rect id="Rectangle_1511" data-name="Rectangle 1511" width="379" height="79" transform="translate(418 556)" fill="#f3f3f3"/>
<text id="Funder_-_Dataset_description" data-name="Funder - Dataset description" transform="translate(485 614)" font-size="15" font-family="Roboto-Bold, Roboto" opacity="0.45" font-weight="700"><tspan x="0" y="0">Funder</tspan><tspan y="0" xml:space="preserve" font-family="Roboto-Regular, Roboto" font-weight="400"> - Dataset description</tspan></text>
<text id="Horizon_2020" data-name="Horizon 2020" transform="translate(485 591)" font-size="20" font-family="Roboto-Regular, Roboto" opacity="0.6"><tspan x="0" y="0">Horizon 2020</tspan></text>
<path id="ic_check_24px" d="M9.834,17.748,5.042,12.956,3.41,14.576,9.834,21,23.623,7.21,22,5.59Z" transform="translate(439.59 583.41)" fill="#23bcba" stroke="#23bcba" stroke-width="2"/>
</g>
<g id="Group_1295" data-name="Group 1295" transform="translate(0 146)">
<rect id="Rectangle_1511-2" data-name="Rectangle 1511" width="379" height="79" transform="translate(418 556)" fill="#f3f3f3"/>
<text id="Institution_-_Dataset_description" data-name="Institution - Dataset description" transform="translate(485 614)" font-size="15" font-family="Roboto-Bold, Roboto" opacity="0.45" font-weight="700"><tspan x="0" y="0">Institution</tspan><tspan y="0" xml:space="preserve" font-family="Roboto-Regular, Roboto" font-weight="400"> - Dataset description</tspan></text>
<text id="Athena_Research_Center" data-name="Athena Research Center" transform="translate(485 591)" font-size="20" font-family="Roboto-Regular, Roboto" opacity="0.6"><tspan x="0" y="0">Athena Research Center</tspan></text>
<path id="ic_check_24px-2" data-name="ic_check_24px" d="M9.834,17.748,5.042,12.956,3.41,14.576,9.834,21,23.623,7.21,22,5.59Z" transform="translate(439.59 582.41)" fill="#23bcba" stroke="#23bcba" stroke-width="2"/>
</g>
<g id="Group_1296" data-name="Group 1296" transform="translate(0 67)">
<rect id="Rectangle_1511-3" data-name="Rectangle 1511" width="379" height="79" transform="translate(418 556)" fill="#fff"/>
<text id="Research_Community_-_Dataset_description" data-name="Research Community - Dataset description" transform="translate(485 614)" font-size="15" font-family="Roboto-Bold, Roboto" opacity="0.45" font-weight="700"><tspan x="0" y="0">Research Community</tspan><tspan y="0" xml:space="preserve" font-family="Roboto-Regular, Roboto" font-weight="400"> - Dataset description</tspan></text>
<text id="Clarin-D" transform="translate(485 591)" font-size="20" font-family="Roboto-Regular, Roboto" opacity="0.6"><tspan x="0" y="0">Clarin-D</tspan></text>
</g>
<g id="Group_1297" data-name="Group 1297" transform="translate(0 222)">
<rect id="Rectangle_1511-4" data-name="Rectangle 1511" width="379" height="79" transform="translate(418 556)" fill="none"/>
<text id="Initiative_-_Dataset_description" data-name="Initiative - Dataset description" transform="translate(485 614)" font-size="15" font-family="Roboto-Bold, Roboto" opacity="0.45" font-weight="700"><tspan x="0" y="0">Initiative</tspan><tspan y="0" xml:space="preserve" font-family="Roboto-Regular, Roboto" font-weight="400"> - Dataset description</tspan></text>
<text id="IOSSG" transform="translate(485 591)" font-size="20" font-family="Roboto-Regular, Roboto" opacity="0.6"><tspan x="0" y="0">IOSSG</tspan></text>
</g>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 3.4 KiB

After

Width:  |  Height:  |  Size: 6.0 KiB

View File

@ -1 +1,66 @@
<svg xmlns="http://www.w3.org/2000/svg" width="472" height="519" viewBox="0 0 472 519"><g transform="translate(-373 -431)"><g transform="translate(373 431)" fill="#fff" stroke="#b6e2e2" stroke-width="8"><rect width="472" height="519" rx="37" stroke="none"/><rect x="4" y="4" width="464" height="511" rx="33" fill="none"/></g><text transform="translate(418 502)" font-size="21" font-family="Roboto-Regular, Roboto" opacity="0.75"><tspan x="0" y="0">Selected template</tspan></text><g transform="translate(0 97)"><text transform="translate(418 556)" font-size="15" font-family="Roboto-Regular, Roboto" opacity="0.45"><tspan x="0" y="0">Will you use metadata to describe the data?</tspan></text><g transform="translate(417.741 575.451)"><g transform="translate(0.259 -0.451)" fill="#fff" stroke="#a9dedd" stroke-width="2"><rect width="379" height="38" rx="4" stroke="none"/><rect x="1" y="1" width="377" height="36" rx="3" fill="none"/></g><path d="M4.911,0,9.822,5.113H0Z" transform="translate(361.766 22.37) rotate(180)" fill="#23bcba" opacity="0.56"/><text transform="translate(16.259 24.549)" fill="#23bcba" font-size="15" font-family="Roboto-Regular, Roboto"><tspan x="0" y="0">Dublin Core</tspan></text></g></g><g transform="translate(0 -117)"><text transform="translate(418 673)" font-size="15" font-family="Roboto-Regular, Roboto" opacity="0.45"><tspan x="0" y="0">Will you be re-using data?</tspan></text><text transform="translate(454 707)" fill="#23bcba" font-size="15" font-family="Roboto-Regular, Roboto"><tspan x="0" y="0">Yes</tspan></text><text transform="translate(532 707)" font-size="15" font-family="Roboto-Regular, Roboto" opacity="0.6"><tspan x="0" y="0">No</tspan></text><g transform="translate(501 692)" fill="#fff" stroke="rgba(0,0,0,0.4)" stroke-width="1"><circle cx="10" cy="10" r="10" stroke="none"/><circle cx="10" cy="10" r="9.5" fill="none"/></g><path d="M12.512,7.256a5.256,5.256,0,1,0,5.256,5.256A5.258,5.258,0,0,0,12.512,7.256Zm0-5.256A10.512,10.512,0,1,0,23.023,12.512,10.515,10.515,0,0,0,12.512,2Zm0,18.921a8.409,8.409,0,1,1,8.409-8.409A8.407,8.407,0,0,1,12.512,20.921Z" transform="translate(419.576 689.778)" fill="#23bcba"/></g><g transform="translate(418 790)" fill="#fff" stroke="#a3d8d7" stroke-width="2"><rect width="379" height="113" rx="2" stroke="none"/><rect x="1" y="1" width="377" height="111" rx="1" fill="none"/></g><text transform="translate(418 771)" font-size="15" font-family="Roboto-Regular, Roboto" opacity="0.45"><tspan x="0" y="0">Where will your data be preserved?</tspan></text><text transform="translate(434 806)" fill="#3d3d3d" font-size="12" font-family="Roboto-Regular, Roboto" opacity="0.6"><tspan x="0" y="11">Master copy stored on University network storage; regular </tspan><tspan x="0" y="29">backup/sync to University network when offsite; regular backup </tspan><tspan x="0" y="47">to UvA/AUAS figshare;</tspan></text><line x1="6.392" y2="6.392" transform="translate(786.538 891.836)" fill="none" stroke="#23bcba" stroke-width="2" opacity="0.4"/><line x1="12.783" y2="12.783" transform="translate(780.147 885.445)" fill="none" stroke="#23bcba" stroke-width="2" opacity="0.4"/></g></svg>
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="568" height="615" viewBox="0 0 568 615">
<defs>
<filter id="Rectangle_7" x="0" y="0" width="568" height="615" filterUnits="userSpaceOnUse">
<feOffset input="SourceAlpha"/>
<feGaussianBlur stdDeviation="16" result="blur"/>
<feFlood flood-color="#458e8d"/>
<feComposite operator="in" in2="blur"/>
<feComposite in="SourceGraphic"/>
</filter>
</defs>
<g id="Group_1162" data-name="Group 1162" transform="translate(-325 -383)">
<g transform="matrix(1, 0, 0, 1, 325, 383)" filter="url(#Rectangle_7)">
<g id="Rectangle_7-2" data-name="Rectangle 7" transform="translate(48 48)" fill="#fff" stroke="#b6e2e2" stroke-width="8">
<rect width="472" height="519" rx="37" stroke="none"/>
<rect x="4" y="4" width="464" height="511" rx="33" fill="none"/>
</g>
</g>
<g id="Rectangle_1559" data-name="Rectangle 1559" transform="translate(418 542)" fill="#fff" stroke="#d1d1d1" stroke-width="1">
<rect width="379" height="374" rx="4" stroke="none"/>
<rect x="0.5" y="0.5" width="378" height="373" rx="3.5" fill="none"/>
</g>
<g id="Group_1323" data-name="Group 1323" transform="translate(24 143)">
<text id="Will_you_use_metadata_to_describe_the_data_" data-name="Will you use metadata to describe the data?" transform="translate(418 556)" font-size="15" font-family="Roboto-Regular, Roboto" opacity="0.45"><tspan x="0" y="0">Will you use metadata to describe the data?</tspan></text>
<g id="Group_1161" data-name="Group 1161" transform="translate(418 575)">
<g id="Rectangle_1188" data-name="Rectangle 1188" fill="#fff" stroke="#a9dedd" stroke-width="2">
<rect width="330" height="38" rx="4" stroke="none"/>
<rect x="1" y="1" width="328" height="36" rx="3" fill="none"/>
</g>
<path id="Polygon_2" data-name="Polygon 2" d="M4.911,0,9.822,5.113H0Z" transform="translate(312.507 22.821) rotate(180)" fill="#23bcba" opacity="0.56"/>
<text id="Dublin_Core" data-name="Dublin Core" transform="translate(16 25)" fill="#23bcba" font-size="15" font-family="Roboto-Regular, Roboto"><tspan x="0" y="0">Dublin Core</tspan></text>
</g>
</g>
<g id="Group_1321" data-name="Group 1321" transform="translate(24 -52)">
<text id="Will_you_be_re-using_data_" data-name="Will you be re-using data?" transform="translate(418 673)" font-size="15" font-family="Roboto-Regular, Roboto" opacity="0.45"><tspan x="0" y="0">Will you be re-using data?</tspan></text>
<text id="Yes" transform="translate(454 707)" fill="#23bcba" font-size="15" font-family="Roboto-Regular, Roboto"><tspan x="0" y="0">Yes</tspan></text>
<text id="No" transform="translate(532 707)" font-size="15" font-family="Roboto-Regular, Roboto" opacity="0.6"><tspan x="0" y="0">No</tspan></text>
<g id="Ellipse_295" data-name="Ellipse 295" transform="translate(501 692)" fill="#fff" stroke="rgba(0,0,0,0.4)" stroke-width="1">
<circle cx="10" cy="10" r="10" stroke="none"/>
<circle cx="10" cy="10" r="9.5" fill="none"/>
</g>
<path id="ic_radio_button_checked_24px" d="M12.512,7.256a5.256,5.256,0,1,0,5.256,5.256A5.258,5.258,0,0,0,12.512,7.256Zm0-5.256A10.512,10.512,0,1,0,23.023,12.512,10.515,10.515,0,0,0,12.512,2Zm0,18.921a8.409,8.409,0,1,1,8.409-8.409A8.407,8.407,0,0,1,12.512,20.921Z" transform="translate(419.576 689.778)" fill="#23bcba"/>
</g>
<g id="Group_1322" data-name="Group 1322" transform="translate(24 23)">
<g id="Rectangle_1189" data-name="Rectangle 1189" transform="translate(418 790)" fill="#fff" stroke="#a3d8d7" stroke-width="2">
<rect width="330" height="80" rx="2" stroke="none"/>
<rect x="1" y="1" width="328" height="78" rx="1" fill="none"/>
</g>
<text id="Where_will_your_data_be_preserved_" data-name="Where will your data be preserved?" transform="translate(418 771)" font-size="15" font-family="Roboto-Regular, Roboto" opacity="0.45"><tspan x="0" y="0">Where will your data be preserved?</tspan></text>
<text id="Master_copy_stored_on_University_network_storage_regular_backup_sync_to_University_network_when_offs..." data-name="Master copy stored on University network storage; regular backup/sync to University network when offs..." transform="translate(434 806)" fill="#3d3d3d" font-size="12" font-family="Roboto-Regular, Roboto" opacity="0.6"><tspan x="0" y="13">Master copy stored on University network storage; </tspan><tspan x="0" y="31">regular backup/sync to University network when offs...</tspan></text>
<line id="Line_225" data-name="Line 225" x1="6.392" y2="6.392" transform="translate(737.538 858.836)" fill="none" stroke="#23bcba" stroke-width="2" opacity="0.4"/>
<line id="Line_226" data-name="Line 226" x1="12.783" y2="12.783" transform="translate(731.147 852.445)" fill="none" stroke="#23bcba" stroke-width="2" opacity="0.4"/>
</g>
<g id="Group_2213" data-name="Group 2213" transform="translate(0 7)">
<g id="Group_2212" data-name="Group 2212" transform="translate(-5762 -5510)">
<g id="Rectangle_1559-2" data-name="Rectangle 1559" transform="translate(6180 5976)" fill="#fff" stroke="#d1d1d1" stroke-width="1">
<rect width="379" height="58" rx="4" stroke="none"/>
<rect x="0.5" y="0.5" width="378" height="57" rx="3.5" fill="none"/>
</g>
<text id="Horizon_2020" data-name="Horizon 2020" transform="translate(6204 6012)" fill="#212121" font-size="20" font-family="Roboto-Regular, Roboto" opacity="0.67"><tspan x="0" y="0">Horizon 2020</tspan></text>
<path id="ic_expand_more_24px" d="M16.59,8.59,12,13.17,7.41,8.59,6,10l6,6,6-6Z" transform="translate(6509 5992.487)" opacity="0.6"/>
</g>
</g>
<text id="Athena_Research_Center" data-name="Athena Research Center" transform="translate(442 578)" fill="#212121" font-size="20" font-family="Roboto-Regular, Roboto" opacity="0.67"><tspan x="0" y="0">Athena Research Center</tspan></text>
<path id="ic_expand_more_24px-2" data-name="ic_expand_more_24px" d="M16.59,16,12,11.42,7.41,16,6,14.59l6-6,6,6Z" transform="translate(747 558.487)" opacity="0.6"/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 3.1 KiB

After

Width:  |  Height:  |  Size: 6.1 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 44 KiB

After

Width:  |  Height:  |  Size: 46 KiB

File diff suppressed because one or more lines are too long

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256.03 96.56"><defs><style>.cls-1{fill:#fff;}</style></defs><title>argos logo white</title><g id="Layer_2" data-name="Layer 2"><g id="Layer_1-2" data-name="Layer 1"><path class="cls-1" d="M249.94,32.77s-.05,0-.07-.08c-.17-.13-.38-.23-.56-.36a29.06,29.06,0,0,0-7.94-3.83l-9.28-3.18-1.49-.51L228.33,24c-1.36-.45-2.57-.87-3.63-1.27-5.39-2.08-7.11-3.73-6.94-6.24.21-3.39,2.67-5,5.53-5.62a22.11,22.11,0,0,1,6.23-.41c.45,0,.92.06,1.39.14a9.59,9.59,0,0,1,1,.14H232a15.44,15.44,0,0,1,3,.78c.28.09.52.21.78.32a7.8,7.8,0,0,1,2.1,1.27l.07.06a8.13,8.13,0,0,1,.92.71,1.48,1.48,0,0,0,.93.34h12.71a1.48,1.48,0,0,0,1.39-2c-1.95-4.6-5.87-7.91-11.77-9.88A45.26,45.26,0,0,0,230.57.32c-9.19-.61-16.7,1.11-21.64,4.64l-.2.14a6.83,6.83,0,0,0-.79.6q-.36.28-.66.57a6.68,6.68,0,0,0-.66.64A15,15,0,0,0,203,13.19l0,0a30.58,30.58,0,0,0-53.74,6.67A30.6,30.6,0,0,0,104.57,4.58c-.29-.22-.66-.49-1.11-.79a.16.16,0,0,0-.08,0L103,3.49c-.47-.29-1-.59-1.56-.89a20.4,20.4,0,0,0-5.69-2L95,.52h0A16.11,16.11,0,0,0,92.64.41L92,.43a1.07,1.07,0,0,0-.25,0l-.29,0a.15.15,0,0,0-.09,0l-.21,0-.54.07-.53.08c-.37.08-.72.16-1.08.27L88.79,1c-.42.12-.86.26-1.3.42h0l-.66.26L86.15,2h0l-.48.25-.11.06-.11.06a13,13,0,0,0-1.31.79,37.31,37.31,0,0,0-5.66,4.6V1.58A1.42,1.42,0,0,0,77.27.16.55.55,0,0,0,77,.1H68.62a2.22,2.22,0,0,0-2.09,2.22V18.43a2.91,2.91,0,0,1-.61,1.75h0l-4.08,4h0c-.74.73-.94.23-1-.26V2.32A2.23,2.23,0,0,0,58.74.09H50.43A1.43,1.43,0,0,0,49,1.54l0,1.75a1.45,1.45,0,0,1-2.22,1.22c-.61-.37-1.27-.72-1.91-1h0l0,0,0,0A30.67,30.67,0,1,0,30.66,61.33a30.41,30.41,0,0,0,15.82-4.41l.15-.08a1.45,1.45,0,0,1,2.22,1.22l0,1.75h0A1.31,1.31,0,0,0,50.21,61h8.42a2.21,2.21,0,0,0,2.22-2.21V43a3.31,3.31,0,0,0,0-.71v-2A3.81,3.81,0,0,1,61.72,38L65.92,34c.25-.19.61-.29.61.67V58.83A2.21,2.21,0,0,0,68.74,61h8a1.67,1.67,0,0,0,1.67-1.67l.05-34.56V22.47a1.4,1.4,0,0,1,.23-.8,1,1,0,0,1,.25-.29l.07-.09a1.45,1.45,0,0,0,.19-.17c.86-.74,1.84-1.61,3-2.59,4.72-4,8.71-4.5,11.68-4h0a2.1,2.1,0,0,1,.45.18l.07.07a30.57,30.57,0,0,0,42.4,41.75A18.66,18.66,0,1,1,102.06,67.7a2,2,0,0,0-2-1.8H92A2,2,0,0,0,90,68a30.66,30.66,0,1,0,55.59-19.87,30.46,30.46,0,0,0,3.55-6.7,30.59,30.59,0,0,0,59.21-10.78c0-.67,0-1.34-.07-2h0a.57.57,0,0,0,.13.08,2.16,2.16,0,0,0,.53.36,27.36,27.36,0,0,0,6.35,3.29c.52.2,1,.39,1.59.56L230,37.4c8.26,2.73,10.74,4.5,10.54,7.51-.38,5.91-7.52,6.31-11.78,6.05a16,16,0,0,1-2.42-.29h0a18.2,18.2,0,0,1-3-.77l-.8-.34a7.71,7.71,0,0,1-2.07-1.26s0,0-.06,0c-.3-.23-.6-.46-.91-.73a1.52,1.52,0,0,0-.95-.35H205.81a1.47,1.47,0,0,0-1.35,2c3,7.14,10.77,11.13,23.28,11.94,16.47,1,27.54-5.25,28.26-16.09C256.32,40,254.31,35.92,249.94,32.77ZM43.48,44.22a18.65,18.65,0,1,1,5.85-13.56A18.57,18.57,0,0,1,43.48,44.22Zm134.32,5a18.68,18.68,0,0,1-17.39-12l-.09-.23h0c-.24-1-5.13-1.86-11.13-1.86s-10.9.83-11.14,1.86h0l-.09.24a18.59,18.59,0,1,1,0-13.09l.09.23h0c.24,1,5.13,1.86,11.13,1.86s10.9-.83,11.14-1.86h0l.09-.24A18.59,18.59,0,1,1,177.8,49.25Z"/></g></g></svg>

After

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Some files were not shown because too many files have changed in this diff Show More