Merge branch 'ui-redesign' of gitlab.eudat.eu:dmp/OpenAIRE-EUDAT-DMP-service-pilot into ui-redesign

This commit is contained in:
apapachristou 2020-07-17 17:47:48 +03:00
commit e475b265ab
57 changed files with 2409 additions and 489 deletions

View File

@ -1,224 +0,0 @@
package eu.eudat.controllers;
import eu.eudat.data.entities.Dataset;
import eu.eudat.data.query.items.item.dataset.DatasetWizardAutocompleteRequest;
import eu.eudat.data.query.items.item.datasetprofile.DatasetProfileWizardAutocompleteRequest;
import eu.eudat.exceptions.datasetwizard.DatasetWizardCannotUnlockException;
import eu.eudat.exceptions.security.UnauthorisedException;
import eu.eudat.logic.managers.DatasetManager;
import eu.eudat.logic.managers.DatasetWizardManager;
import eu.eudat.logic.managers.UserManager;
import eu.eudat.logic.proxy.config.configloaders.ConfigLoader;
import eu.eudat.logic.security.claims.ClaimedAuthorities;
import eu.eudat.logic.services.ApiContext;
import eu.eudat.logic.services.forms.VisibilityRuleService;
import eu.eudat.logic.utilities.documents.helpers.FileEnvelope;
import eu.eudat.models.data.datasetwizard.DataManagentPlanListingModel;
import eu.eudat.models.data.datasetwizard.DatasetWizardModel;
import eu.eudat.models.data.dmp.AssociatedProfile;
import eu.eudat.models.data.helpers.responses.ResponseItem;
import eu.eudat.models.data.listingmodels.DataManagementPlanOverviewModel;
import eu.eudat.models.data.security.Principal;
import eu.eudat.models.data.user.composite.PagedDatasetProfile;
import eu.eudat.types.ApiMessageCode;
import eu.eudat.types.Authorities;
import org.apache.poi.util.IOUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.env.Environment;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.persistence.NoResultException;
import javax.transaction.Transactional;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.nio.file.Files;
import java.util.List;
import java.util.UUID;
import static eu.eudat.types.Authorities.ANONYMOUS;
@RestController
@CrossOrigin
@RequestMapping(value = {"api/datasetwizard"})
public class DatasetWizardController extends BaseController {
private static final Logger logger = LoggerFactory.getLogger(DatasetWizardController.class);
private Environment environment;
private DatasetManager datasetManager;
private UserManager userManager;
private ConfigLoader configLoader;
@Autowired
public DatasetWizardController(ApiContext apiContext, Environment environment, DatasetManager datasetManager, UserManager userManager, ConfigLoader configLoader) {
super(apiContext);
this.environment = environment;
this.datasetManager = datasetManager;
this.userManager = userManager;
this.configLoader = configLoader;
}
@RequestMapping(method = RequestMethod.POST, value = {"/userDmps"}, produces = "application/json")
public @ResponseBody
ResponseEntity<ResponseItem<List<DataManagentPlanListingModel>>> getUserDmps(@RequestBody DatasetWizardAutocompleteRequest datasetWizardAutocompleteRequest, Principal principal) throws IllegalAccessException, InstantiationException {
List<DataManagentPlanListingModel> dataManagementPlans = DatasetWizardManager.getUserDmps(this.getApiContext().getOperationsContext().getDatabaseRepository().getDmpDao(), datasetWizardAutocompleteRequest, principal);
return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem<List<DataManagentPlanListingModel>>().status(ApiMessageCode.NO_MESSAGE).payload(dataManagementPlans));
}
@RequestMapping(method = RequestMethod.POST, value = {"/getAvailableProfiles"}, produces = "application/json")
public @ResponseBody
ResponseEntity<ResponseItem<List<AssociatedProfile>>> getAvailableProfiles(@RequestBody DatasetProfileWizardAutocompleteRequest datasetProfileWizardAutocompleteRequest, @ClaimedAuthorities(claims = {ANONYMOUS}) Principal principal) throws IllegalAccessException, InstantiationException {
List<AssociatedProfile> dataManagementPlans = DatasetWizardManager.getAvailableProfiles(this.getApiContext().getOperationsContext().getDatabaseRepository().getDmpDao(), datasetProfileWizardAutocompleteRequest);
return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem<List<AssociatedProfile>>().status(ApiMessageCode.NO_MESSAGE).payload(dataManagementPlans));
}
@Transactional
@RequestMapping(method = RequestMethod.GET, value = {"{id}"}, produces = "application/json")
public @ResponseBody
ResponseEntity getSingle(@PathVariable String id, @RequestHeader("Content-Type") String contentType, @ClaimedAuthorities(claims = {Authorities.ADMIN, Authorities.MANAGER, Authorities.USER, Authorities.ANONYMOUS}) Principal principal) throws IllegalAccessException, IOException, InstantiationException {
try {
if (contentType.equals("application/xml")) {
VisibilityRuleService visibilityRuleService = this.getApiContext().getUtilitiesService().getVisibilityRuleService();
return this.datasetManager.getDocument(id, visibilityRuleService, contentType, principal);
} else if (contentType.equals("application/msword")) {
FileEnvelope file = datasetManager.getWordDocumentFile(this.configLoader, id, this.getApiContext().getUtilitiesService().getVisibilityRuleService(), principal);
InputStream resource = new FileInputStream(file.getFile());
HttpHeaders responseHeaders = new HttpHeaders();
responseHeaders.setContentLength(file.getFile().length());
responseHeaders.setContentType(MediaType.APPLICATION_OCTET_STREAM);
responseHeaders.set("Content-Disposition", "attachment;filename=" + file.getFilename());
responseHeaders.set("Access-Control-Expose-Headers", "Content-Disposition");
responseHeaders.get("Access-Control-Expose-Headers").add("Content-Type");
byte[] content = IOUtils.toByteArray(resource);
resource.close();
Files.deleteIfExists(file.getFile().toPath());
return new ResponseEntity<>(content,
responseHeaders,
HttpStatus.OK);
} else {
DatasetWizardModel dataset = this.datasetManager.getSingle(id, principal);
return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem<DatasetWizardModel>().status(ApiMessageCode.NO_MESSAGE).payload(dataset));
}
} catch (Exception e) {
if (e instanceof UnauthorisedException) {
if (e instanceof UnauthorisedException) {
return ResponseEntity.status(HttpStatus.FORBIDDEN).body(new ResponseItem<DataManagementPlanOverviewModel>().status(ApiMessageCode.ERROR_MESSAGE));
} else if (e instanceof NoResultException) {
return ResponseEntity.status(HttpStatus.NOT_FOUND).body(new ResponseItem<DataManagementPlanOverviewModel>().status(ApiMessageCode.ERROR_MESSAGE));
} else {
throw e;
}
}
}
return null; // ????
}
@RequestMapping(method = RequestMethod.GET, value = {"/public/{id}"}, produces = "application/json")
public @ResponseBody
ResponseEntity getSinglePublic(@PathVariable String id) throws Exception {
try {
DatasetWizardModel dataset = this.datasetManager.getSinglePublic(id);
return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem<DatasetWizardModel>().status(ApiMessageCode.NO_MESSAGE).payload(dataset));
}
catch (Exception ex) {
return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(new ResponseItem<DatasetWizardModel>().status(ApiMessageCode.NO_MESSAGE).message(ex.getMessage()));
}
}
@Transactional
@RequestMapping(method = RequestMethod.DELETE, value = {"{id}"}, produces = "application/json")
public @ResponseBody
ResponseEntity<ResponseItem<Dataset>> delete(@PathVariable(value = "id") UUID id, Principal principal) throws Exception {
new DatasetWizardManager().delete(this.getApiContext(), id);
return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem<Dataset>().status(ApiMessageCode.SUCCESS_MESSAGE).message("Deleted"));
}
@Transactional
@RequestMapping(method = RequestMethod.POST, consumes = "application/json", produces = "application/json")
public @ResponseBody
ResponseEntity<ResponseItem<Dataset>> createOrUpdate(@RequestBody DatasetWizardModel profile, Principal principal) throws Exception {
this.datasetManager.createOrUpdate(profile, principal);
return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem<eu.eudat.data.entities.Dataset>().status(ApiMessageCode.SUCCESS_MESSAGE).message("Created").payload(null));
}
@RequestMapping(method = RequestMethod.GET, value = {"/getPDF/{id}"})
public @ResponseBody
ResponseEntity<byte[]> getPDFDocument(@PathVariable String id, @ClaimedAuthorities(claims = {Authorities.ADMIN, Authorities.MANAGER, Authorities.USER, Authorities.ANONYMOUS}) Principal principal) throws IllegalAccessException, IOException, InstantiationException, InterruptedException {
FileEnvelope file = datasetManager.getWordDocumentFile(this.configLoader, id, this.getApiContext().getUtilitiesService().getVisibilityRuleService(), principal);
String fileName = file.getFilename();
if (fileName.endsWith(".docx")){
fileName = fileName.substring(0, fileName.length() - 5);
}
File pdffile = datasetManager.convertToPDF(file, environment);
InputStream resource = new FileInputStream(pdffile);
HttpHeaders responseHeaders = new HttpHeaders();
responseHeaders.setContentLength(pdffile.length());
responseHeaders.setContentType(MediaType.APPLICATION_OCTET_STREAM);
responseHeaders.set("Content-Disposition", "attachment;filename=" + fileName + ".pdf");
responseHeaders.set("Access-Control-Expose-Headers", "Content-Disposition");
responseHeaders.get("Access-Control-Expose-Headers").add("Content-Type");
byte[] content = IOUtils.toByteArray(resource);
resource.close();
Files.deleteIfExists(file.getFile().toPath());
Files.deleteIfExists(pdffile.toPath());
return new ResponseEntity<>(content,
responseHeaders,
HttpStatus.OK);
}
@RequestMapping(method = RequestMethod.GET, value = {"/get/{id}"}, produces = "application/json")
public ResponseEntity<ResponseItem<PagedDatasetProfile>> getSingle(@PathVariable String id) {
eu.eudat.data.entities.DatasetProfile profile = this.getApiContext().getOperationsContext().getDatabaseRepository().getDatasetProfileDao().find(UUID.fromString(id));
eu.eudat.models.data.user.composite.DatasetProfile datasetprofile = userManager.generateDatasetProfileModel(profile);
PagedDatasetProfile pagedDatasetProfile = new PagedDatasetProfile();
pagedDatasetProfile.buildPagedDatasetProfile(datasetprofile);
return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem<PagedDatasetProfile>().status(ApiMessageCode.NO_MESSAGE).payload(pagedDatasetProfile));
}
@Transactional
@RequestMapping(method = RequestMethod.GET, value = {"/{id}/unlock"}, produces = "application/json")
public @ResponseBody
ResponseEntity<ResponseItem<Dataset>> unlock(@PathVariable(value = "id") UUID id, Principal principal) throws Exception {
try {
new DatasetWizardManager().unlock(this.getApiContext(), id);
return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem<Dataset>().status(ApiMessageCode.SUCCESS_MESSAGE).message("Unlocked"));
} catch (DatasetWizardCannotUnlockException datasetWizardCannotUnlockException) {
return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(new ResponseItem<Dataset>().status(ApiMessageCode.ERROR_MESSAGE).message(datasetWizardCannotUnlockException.getMessage()));
}
}
@RequestMapping(method = RequestMethod.POST, value = {"/upload"})
public ResponseEntity<ResponseItem> datasetXmlImport(@RequestParam("file") MultipartFile file, @RequestParam("dmpId") String dmpId, @RequestParam("datasetProfileId") String datasetProfileId, Principal principal) {
try {
Dataset dataset = this.datasetManager.createDatasetFromXml(file, dmpId, datasetProfileId, principal);
if (dataset != null){
return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem().status(ApiMessageCode.SUCCESS_MESSAGE));
}
else {
return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(new ResponseItem().status(ApiMessageCode.NO_MESSAGE).message("Import was unsuccessful."));
}
} catch (Exception e) {
logger.error(e.getMessage(), e);
return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(new ResponseItem().status(ApiMessageCode.NO_MESSAGE).message("Import was unsuccessful."));
}
}
@RequestMapping(method = RequestMethod.GET, value = {"profile/{id}"}, produces = "application/json")
public @ResponseBody
ResponseEntity getSingleProfileUpdate(@PathVariable String id, @ClaimedAuthorities(claims = {ANONYMOUS}) Principal principal) throws IllegalAccessException, IOException, InstantiationException {
DatasetWizardModel dataset = this.datasetManager.datasetUpdateProfile(id);
return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem<DatasetWizardModel>().status(ApiMessageCode.NO_MESSAGE).payload(dataset));
}
}

View File

@ -1,45 +1,84 @@
package eu.eudat.controllers;
import eu.eudat.data.entities.Dataset;
import eu.eudat.data.query.items.item.dataset.DatasetWizardAutocompleteRequest;
import eu.eudat.data.query.items.item.datasetprofile.DatasetProfileWizardAutocompleteRequest;
import eu.eudat.data.query.items.table.dataset.DatasetPublicTableRequest;
import eu.eudat.data.query.items.table.dataset.DatasetTableRequest;
import eu.eudat.data.query.items.table.datasetprofile.DatasetProfileTableRequestItem;
import eu.eudat.exceptions.datasetwizard.DatasetWizardCannotUnlockException;
import eu.eudat.exceptions.security.UnauthorisedException;
import eu.eudat.logic.managers.DatasetManager;
import eu.eudat.logic.managers.DatasetWizardManager;
import eu.eudat.logic.managers.UserManager;
import eu.eudat.logic.proxy.config.configloaders.ConfigLoader;
import eu.eudat.logic.security.claims.ClaimedAuthorities;
import eu.eudat.logic.services.ApiContext;
import eu.eudat.logic.services.forms.VisibilityRuleService;
import eu.eudat.logic.utilities.documents.helpers.FileEnvelope;
import eu.eudat.models.data.dataset.DatasetOverviewModel;
import eu.eudat.models.data.datasetprofile.DatasetProfileListingModel;
import eu.eudat.models.data.datasetwizard.DataManagentPlanListingModel;
import eu.eudat.models.data.datasetwizard.DatasetWizardModel;
import eu.eudat.models.data.dmp.AssociatedProfile;
import eu.eudat.models.data.helpers.common.DataTableData;
import eu.eudat.models.data.helpers.responses.ResponseItem;
import eu.eudat.models.data.listingmodels.DataManagementPlanOverviewModel;
import eu.eudat.models.data.listingmodels.DatasetListingModel;
import eu.eudat.models.data.security.Principal;
import eu.eudat.models.data.user.composite.PagedDatasetProfile;
import eu.eudat.types.ApiMessageCode;
import eu.eudat.types.Authorities;
import org.apache.poi.util.IOUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.env.Environment;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.persistence.NoResultException;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.nio.file.Files;
import java.util.List;
import java.util.Locale;
import java.util.UUID;
import static eu.eudat.types.Authorities.ANONYMOUS;
@RestController
@CrossOrigin
@RequestMapping(value = {"/api/datasets/"})
public class Datasets extends BaseController {
private static final Logger logger = LoggerFactory.getLogger(Datasets.class);
private Environment environment;
private DatasetManager datasetManager;
private ConfigLoader configLoader;
private UserManager userManager;
@Autowired
public Datasets(ApiContext apiContext, DatasetManager datasetManager) {
public Datasets(ApiContext apiContext, Environment environment, DatasetManager datasetManager, ConfigLoader configLoader, UserManager userManager) {
super(apiContext);
this.environment = environment;
this.datasetManager = datasetManager;
this.configLoader = configLoader;
this.userManager = userManager;
}
/*
* Data Retrieval
* */
@RequestMapping(method = RequestMethod.POST, value = {"paged"}, consumes = "application/json", produces = "application/json")
public @ResponseBody
ResponseEntity<ResponseItem<DataTableData<DatasetListingModel>>> getPaged(@RequestBody DatasetTableRequest datasetTableRequest, @ClaimedAuthorities(claims = {Authorities.ADMIN, Authorities.MANAGER, Authorities.USER, Authorities.ANONYMOUS}) Principal principal) throws Exception {
@ -81,12 +120,46 @@ public class Datasets extends BaseController {
// }
}
@Transactional
@RequestMapping(method = RequestMethod.GET, value = {"/makepublic/{id}"}, produces = "application/json")
@javax.transaction.Transactional
@RequestMapping(method = RequestMethod.GET, value = {"{id}"}, produces = "application/json")
public @ResponseBody
ResponseEntity<ResponseItem<Dataset>> makePublic(@PathVariable UUID id, Principal principal, Locale locale) throws Exception {
this.datasetManager.makePublic(this.getApiContext().getOperationsContext().getDatabaseRepository().getDatasetDao(), id);
return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem<Dataset>().status(ApiMessageCode.SUCCESS_MESSAGE).message(this.getApiContext().getHelpersService().getMessageSource().getMessage("dataset.public", new Object[]{}, locale)));
ResponseEntity getSingle(@PathVariable String id, @RequestHeader("Content-Type") String contentType, @ClaimedAuthorities(claims = {Authorities.ADMIN, Authorities.MANAGER, Authorities.USER, Authorities.ANONYMOUS}) Principal principal) throws IllegalAccessException, IOException, InstantiationException {
try {
if (contentType.equals("application/xml")) {
VisibilityRuleService visibilityRuleService = this.getApiContext().getUtilitiesService().getVisibilityRuleService();
return this.datasetManager.getDocument(id, visibilityRuleService, contentType, principal);
} else if (contentType.equals("application/msword")) {
FileEnvelope file = datasetManager.getWordDocumentFile(this.configLoader, id, this.getApiContext().getUtilitiesService().getVisibilityRuleService(), principal);
InputStream resource = new FileInputStream(file.getFile());
HttpHeaders responseHeaders = new HttpHeaders();
responseHeaders.setContentLength(file.getFile().length());
responseHeaders.setContentType(MediaType.APPLICATION_OCTET_STREAM);
responseHeaders.set("Content-Disposition", "attachment;filename=" + file.getFilename());
responseHeaders.set("Access-Control-Expose-Headers", "Content-Disposition");
responseHeaders.get("Access-Control-Expose-Headers").add("Content-Type");
byte[] content = IOUtils.toByteArray(resource);
resource.close();
Files.deleteIfExists(file.getFile().toPath());
return new ResponseEntity<>(content,
responseHeaders,
HttpStatus.OK);
} else {
DatasetWizardModel dataset = this.datasetManager.getSingle(id, principal);
return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem<DatasetWizardModel>().status(ApiMessageCode.NO_MESSAGE).payload(dataset));
}
} catch (Exception e) {
if (e instanceof UnauthorisedException) {
if (e instanceof UnauthorisedException) {
return ResponseEntity.status(HttpStatus.FORBIDDEN).body(new ResponseItem<DataManagementPlanOverviewModel>().status(ApiMessageCode.ERROR_MESSAGE));
} else if (e instanceof NoResultException) {
return ResponseEntity.status(HttpStatus.NOT_FOUND).body(new ResponseItem<DataManagementPlanOverviewModel>().status(ApiMessageCode.ERROR_MESSAGE));
} else {
throw e;
}
}
}
return null; // ????
}
@RequestMapping(method = RequestMethod.POST, value = {"/datasetProfilesUsedByDatasets/paged"}, produces = "application/json")
@ -96,6 +169,143 @@ public class Datasets extends BaseController {
return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem<DataTableData<DatasetProfileListingModel>>().status(ApiMessageCode.NO_MESSAGE).payload(datasetProfileTableData));
}
@RequestMapping(method = RequestMethod.POST, value = {"/userDmps"}, produces = "application/json")
public @ResponseBody
ResponseEntity<ResponseItem<List<DataManagentPlanListingModel>>> getUserDmps(@RequestBody DatasetWizardAutocompleteRequest datasetWizardAutocompleteRequest, Principal principal) throws IllegalAccessException, InstantiationException {
List<DataManagentPlanListingModel> dataManagementPlans = DatasetWizardManager.getUserDmps(this.getApiContext().getOperationsContext().getDatabaseRepository().getDmpDao(), datasetWizardAutocompleteRequest, principal);
return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem<List<DataManagentPlanListingModel>>().status(ApiMessageCode.NO_MESSAGE).payload(dataManagementPlans));
}
@RequestMapping(method = RequestMethod.POST, value = {"/getAvailableProfiles"}, produces = "application/json")
public @ResponseBody
ResponseEntity<ResponseItem<List<AssociatedProfile>>> getAvailableProfiles(@RequestBody DatasetProfileWizardAutocompleteRequest datasetProfileWizardAutocompleteRequest, @ClaimedAuthorities(claims = {ANONYMOUS}) Principal principal) throws IllegalAccessException, InstantiationException {
List<AssociatedProfile> dataManagementPlans = DatasetWizardManager.getAvailableProfiles(this.getApiContext().getOperationsContext().getDatabaseRepository().getDmpDao(), datasetProfileWizardAutocompleteRequest);
return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem<List<AssociatedProfile>>().status(ApiMessageCode.NO_MESSAGE).payload(dataManagementPlans));
}
@RequestMapping(method = RequestMethod.GET, value = {"/public/{id}"}, produces = "application/json")
public @ResponseBody
ResponseEntity getSinglePublic(@PathVariable String id) throws Exception {
try {
DatasetWizardModel dataset = this.datasetManager.getSinglePublic(id);
return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem<DatasetWizardModel>().status(ApiMessageCode.NO_MESSAGE).payload(dataset));
}
catch (Exception ex) {
return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(new ResponseItem<DatasetWizardModel>().status(ApiMessageCode.NO_MESSAGE).message(ex.getMessage()));
}
}
@RequestMapping(method = RequestMethod.GET, value = {"/get/{id}"}, produces = "application/json")
public ResponseEntity<ResponseItem<PagedDatasetProfile>> getSingle(@PathVariable String id) {
eu.eudat.data.entities.DatasetProfile profile = this.getApiContext().getOperationsContext().getDatabaseRepository().getDatasetProfileDao().find(UUID.fromString(id));
eu.eudat.models.data.user.composite.DatasetProfile datasetprofile = userManager.generateDatasetProfileModel(profile);
PagedDatasetProfile pagedDatasetProfile = new PagedDatasetProfile();
pagedDatasetProfile.buildPagedDatasetProfile(datasetprofile);
return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem<PagedDatasetProfile>().status(ApiMessageCode.NO_MESSAGE).payload(pagedDatasetProfile));
}
@RequestMapping(method = RequestMethod.GET, value = {"profile/{id}"}, produces = "application/json")
public @ResponseBody
ResponseEntity getSingleProfileUpdate(@PathVariable String id, @ClaimedAuthorities(claims = {ANONYMOUS}) Principal principal) throws IllegalAccessException, IOException, InstantiationException {
DatasetWizardModel dataset = this.datasetManager.datasetUpdateProfile(id);
return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem<DatasetWizardModel>().status(ApiMessageCode.NO_MESSAGE).payload(dataset));
}
/*
* Data Export
* */
@RequestMapping(method = RequestMethod.GET, value = {"/getPDF/{id}"})
public @ResponseBody
ResponseEntity<byte[]> getPDFDocument(@PathVariable String id, @ClaimedAuthorities(claims = {Authorities.ADMIN, Authorities.MANAGER, Authorities.USER, Authorities.ANONYMOUS}) Principal principal) throws IllegalAccessException, IOException, InstantiationException, InterruptedException {
FileEnvelope file = datasetManager.getWordDocumentFile(this.configLoader, id, this.getApiContext().getUtilitiesService().getVisibilityRuleService(), principal);
String fileName = file.getFilename();
if (fileName.endsWith(".docx")){
fileName = fileName.substring(0, fileName.length() - 5);
}
File pdffile = datasetManager.convertToPDF(file, environment);
InputStream resource = new FileInputStream(pdffile);
HttpHeaders responseHeaders = new HttpHeaders();
responseHeaders.setContentLength(pdffile.length());
responseHeaders.setContentType(MediaType.APPLICATION_OCTET_STREAM);
responseHeaders.set("Content-Disposition", "attachment;filename=" + fileName + ".pdf");
responseHeaders.set("Access-Control-Expose-Headers", "Content-Disposition");
responseHeaders.get("Access-Control-Expose-Headers").add("Content-Type");
byte[] content = IOUtils.toByteArray(resource);
resource.close();
Files.deleteIfExists(file.getFile().toPath());
Files.deleteIfExists(pdffile.toPath());
return new ResponseEntity<>(content,
responseHeaders,
HttpStatus.OK);
}
/*
* Data Management
* */
@javax.transaction.Transactional
@RequestMapping(method = RequestMethod.POST, consumes = "application/json", produces = "application/json")
public @ResponseBody
ResponseEntity<ResponseItem<Dataset>> createOrUpdate(@RequestBody DatasetWizardModel profile, Principal principal) throws Exception {
this.datasetManager.createOrUpdate(profile, principal);
return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem<eu.eudat.data.entities.Dataset>().status(ApiMessageCode.SUCCESS_MESSAGE).message("Created").payload(null));
}
@Transactional
@RequestMapping(method = RequestMethod.GET, value = {"/makepublic/{id}"}, produces = "application/json")
public @ResponseBody
ResponseEntity<ResponseItem<Dataset>> makePublic(@PathVariable UUID id, Principal principal, Locale locale) throws Exception {
this.datasetManager.makePublic(this.getApiContext().getOperationsContext().getDatabaseRepository().getDatasetDao(), id);
return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem<Dataset>().status(ApiMessageCode.SUCCESS_MESSAGE).message(this.getApiContext().getHelpersService().getMessageSource().getMessage("dataset.public", new Object[]{}, locale)));
}
@javax.transaction.Transactional
@RequestMapping(method = RequestMethod.DELETE, value = {"/delete/{id}"}, produces = "application/json")
public @ResponseBody
ResponseEntity<ResponseItem<Dataset>> delete(@PathVariable(value = "id") UUID id, Principal principal) throws Exception {
new DatasetWizardManager().delete(this.getApiContext(), id);
return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem<Dataset>().status(ApiMessageCode.SUCCESS_MESSAGE).message("Deleted"));
}
@javax.transaction.Transactional
@RequestMapping(method = RequestMethod.GET, value = {"/{id}/unlock"}, produces = "application/json")
public @ResponseBody
ResponseEntity<ResponseItem<Dataset>> unlock(@PathVariable(value = "id") UUID id, Principal principal) throws Exception {
try {
new DatasetWizardManager().unlock(this.getApiContext(), id);
return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem<Dataset>().status(ApiMessageCode.SUCCESS_MESSAGE).message("Unlocked"));
} catch (DatasetWizardCannotUnlockException datasetWizardCannotUnlockException) {
return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(new ResponseItem<Dataset>().status(ApiMessageCode.ERROR_MESSAGE).message(datasetWizardCannotUnlockException.getMessage()));
}
}
/*
* Data Import
* */
@RequestMapping(method = RequestMethod.POST, value = {"/upload"})
public ResponseEntity<ResponseItem> datasetXmlImport(@RequestParam("file") MultipartFile file, @RequestParam("dmpId") String dmpId, @RequestParam("datasetProfileId") String datasetProfileId, Principal principal) {
try {
Dataset dataset = this.datasetManager.createDatasetFromXml(file, dmpId, datasetProfileId, principal);
if (dataset != null){
return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem().status(ApiMessageCode.SUCCESS_MESSAGE));
}
else {
return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(new ResponseItem().status(ApiMessageCode.NO_MESSAGE).message("Import was unsuccessful."));
}
} catch (Exception e) {
logger.error(e.getMessage(), e);
return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(new ResponseItem().status(ApiMessageCode.NO_MESSAGE).message("Import was unsuccessful."));
}
}
/*
* Data Index
* */
@javax.transaction.Transactional
@RequestMapping(method = RequestMethod.POST, value = {"/index"})
public @ResponseBody
@ -112,12 +322,6 @@ public class Datasets extends BaseController {
return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem<eu.eudat.data.entities.Dataset>().status(ApiMessageCode.SUCCESS_MESSAGE).message("Cleared").payload(null));
}
@javax.transaction.Transactional
@RequestMapping(method = RequestMethod.DELETE, value = {"/delete/{id}"}, produces = "application/json")
public @ResponseBody
ResponseEntity<ResponseItem<Dataset>> delete(@PathVariable(value = "id") UUID id, Principal principal) throws Exception {
new DatasetWizardManager().delete(this.getApiContext(), id);
return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem<Dataset>().status(ApiMessageCode.SUCCESS_MESSAGE).message("Deleted"));
}
}

View File

@ -31,6 +31,7 @@ import eu.eudat.logic.services.operations.authentication.AuthenticationService;
import eu.eudat.models.data.helpers.responses.ResponseItem;
import eu.eudat.models.data.login.Credentials;
import eu.eudat.models.data.login.LoginInfo;
import eu.eudat.models.data.principal.PrincipalModel;
import eu.eudat.models.data.security.Principal;
import eu.eudat.types.ApiMessageCode;
import org.slf4j.Logger;
@ -91,17 +92,17 @@ public class Login {
@Transactional
@RequestMapping(method = RequestMethod.POST, value = {"/externallogin"}, consumes = "application/json", produces = "application/json")
public @ResponseBody
ResponseEntity<ResponseItem<Principal>> externallogin(@RequestBody LoginInfo credentials) throws GeneralSecurityException, NullEmailException {
ResponseEntity<ResponseItem<PrincipalModel>> externallogin(@RequestBody LoginInfo credentials) throws GeneralSecurityException, NullEmailException {
logger.info("Trying To Login With " + credentials.getProvider());
return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem<Principal>().payload(customAuthenticationProvider.authenticate(credentials)).status(ApiMessageCode.SUCCESS_MESSAGE));
return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem<PrincipalModel>().payload(customAuthenticationProvider.authenticate(credentials)).status(ApiMessageCode.SUCCESS_MESSAGE));
}
@Transactional
@RequestMapping(method = RequestMethod.POST, value = {"/nativelogin"}, consumes = "application/json", produces = "application/json")
public @ResponseBody
ResponseEntity<ResponseItem<Principal>> nativelogin(@RequestBody Credentials credentials) throws NullEmailException {
ResponseEntity<ResponseItem<PrincipalModel>> nativelogin(@RequestBody Credentials credentials) throws NullEmailException {
logger.info(credentials.getUsername() + " Trying To Login");
return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem<Principal>().payload(userManager.authenticate(this.nonVerifiedUserAuthenticationService, credentials)).status(ApiMessageCode.SUCCESS_MESSAGE));
return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem<PrincipalModel>().payload(userManager.authenticate(this.nonVerifiedUserAuthenticationService, credentials)).status(ApiMessageCode.SUCCESS_MESSAGE));
}
@RequestMapping(method = RequestMethod.GET, value = {"/twitterRequestToken"}, produces = "application/json")
@ -148,9 +149,11 @@ public class Login {
@RequestMapping(method = RequestMethod.POST, value = {"/me"}, consumes = "application/json", produces = "application/json")
public @ResponseBody
ResponseEntity<ResponseItem<Principal>> authMe(Principal principal) throws NullEmailException {
ResponseEntity<ResponseItem<PrincipalModel>> authMe(Principal principal) throws NullEmailException {
logger.info(principal + " Getting Me");
return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem<Principal>().payload(this.nonVerifiedUserAuthenticationService.Touch(principal.getToken())).status(ApiMessageCode.NO_MESSAGE));
Principal principal1 = this.nonVerifiedUserAuthenticationService.Touch(principal.getToken());
PrincipalModel principalModel = PrincipalModel.fromEntity(principal1);
return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem<PrincipalModel>().payload(principalModel).status(ApiMessageCode.NO_MESSAGE));
}
@Transactional

View File

@ -17,6 +17,7 @@ public class PrincipalBuilder extends Builder<Principal> {
private UUID id;
private UUID token;
private String name;
private String email;
private Date expiresAt;
private String avatarUrl;
private Set<Authorities> authorities;
@ -43,6 +44,11 @@ public class PrincipalBuilder extends Builder<Principal> {
return this;
}
public PrincipalBuilder email(String email) {
this.email = email;
return this;
}
public PrincipalBuilder expiresAt(Date expiresAt) {
this.expiresAt = expiresAt;
return this;
@ -98,6 +104,7 @@ public class PrincipalBuilder extends Builder<Principal> {
Principal principal = new Principal();
principal.setAuthorities(authorities);
principal.setName(name);
principal.setEmail(email);
principal.setExpiresAt(expiresAt);
principal.setToken(token);
principal.setId(id);

View File

@ -24,6 +24,7 @@ import eu.eudat.models.data.dmp.DataManagementPlan;
import eu.eudat.models.data.doi.DOIRequest;
import eu.eudat.models.data.helpers.common.DataTableData;
import eu.eudat.models.data.login.Credentials;
import eu.eudat.models.data.principal.PrincipalModel;
import eu.eudat.models.data.security.Principal;
import eu.eudat.models.data.userinfo.UserListingModel;
import eu.eudat.models.data.userinfo.UserProfile;
@ -105,10 +106,11 @@ public class UserManager {
.createOrUpdate(userInfo);
}
public Principal authenticate(AuthenticationService authenticationServiceImpl, Credentials credentials) throws NullEmailException {
public PrincipalModel authenticate(AuthenticationService authenticationServiceImpl, Credentials credentials) throws NullEmailException {
Principal principal = authenticationServiceImpl.Touch(credentials);
if (principal == null) throw new UnauthorisedException("Could not Sign In User");
return principal;
PrincipalModel principalModel = PrincipalModel.fromEntity(principal);
return principalModel;
}
public DataTableData<UserListingModel> getCollaboratorsPaged(UserInfoTableRequestItem userInfoTableRequestItem, Principal principal) throws Exception {

View File

@ -4,6 +4,7 @@ import eu.eudat.exceptions.security.NonValidTokenException;
import eu.eudat.exceptions.security.NullEmailException;
import eu.eudat.exceptions.security.UnauthorisedException;
import eu.eudat.models.data.login.LoginInfo;
import eu.eudat.models.data.principal.PrincipalModel;
import eu.eudat.models.data.security.Principal;
import eu.eudat.logic.security.validators.TokenValidatorFactory;
import org.slf4j.Logger;
@ -22,11 +23,11 @@ public class CustomAuthenticationProvider {
@Autowired
private TokenValidatorFactory tokenValidatorFactory;
public Principal authenticate(LoginInfo credentials) throws GeneralSecurityException, NullEmailException {
public PrincipalModel authenticate(LoginInfo credentials) throws GeneralSecurityException, NullEmailException {
String token = credentials.getTicket();
try {
Principal principal = this.tokenValidatorFactory.getProvider(credentials.getProvider()).validateToken(credentials);
return principal;
return PrincipalModel.fromEntity(principal);
} catch (NonValidTokenException e) {
logger.error("Could not validate a user by his token! Reason: " + e.getMessage(), e);
throw new UnauthorisedException("Token validation failed - Not a valid token");

View File

@ -78,7 +78,9 @@ public class NonVerifiedUserEmailAuthenticationService extends AbstractAuthentic
}
Principal principal = this.apiContext.getOperationsContext().getBuilderFactory().getBuilder(PrincipalBuilder.class)
.id(user.getId()).token(token.getToken())
.expiresAt(token.getExpiresAt()).name(user.getName())
.expiresAt(token.getExpiresAt())
.name(user.getName())
.email(user.getEmail())
.avatarUrl(avatarUrl)
.culture(culture)
.language(language)

View File

@ -87,7 +87,9 @@ public class VerifiedUserAuthenticationService extends AbstractAuthenticationSer
}
Principal principal = this.apiContext.getOperationsContext().getBuilderFactory().getBuilder(PrincipalBuilder.class)
.id(user.getId()).token(token.getToken())
.expiresAt(token.getExpiresAt()).name(user.getName())
.expiresAt(token.getExpiresAt())
.name(user.getName())
.email(user.getEmail())
.avatarUrl(avatarUrl)
.culture(culture)
.language(language)

View File

@ -0,0 +1,131 @@
package eu.eudat.models.data.principal;
import eu.eudat.models.data.security.Principal;
import eu.eudat.types.Authorities;
import java.util.Date;
import java.util.Set;
import java.util.UUID;
import java.util.stream.Collectors;
public class PrincipalModel {
private UUID id;
private UUID token;
private String name;
private String email;
private Date expiresAt;
private String avatarUrl;
private Set<Authorities> authorities;
private String culture;
private String language;
private String timezone;
private String zenodoEmail;
public UUID getId() {
return id;
}
public void setId(UUID id) {
this.id = id;
}
public UUID getToken() {
return token;
}
public void setToken(UUID token) {
this.token = token;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public Date getExpiresAt() {
return expiresAt;
}
public void setExpiresAt(Date expiresAt) {
this.expiresAt = expiresAt;
}
public String getAvatarUrl() {
return avatarUrl;
}
public void setAvatarUrl(String avatarUrl) {
this.avatarUrl = avatarUrl;
}
public Set<Authorities> getAuthz() {
return authorities;
}
public Set<Integer> getAuthorities() {
return authorities.stream().map(authz -> authz.getValue()).collect(Collectors.toSet());
}
public void setAuthorities(Set<Authorities> authorities) {
this.authorities = authorities;
}
public String getCulture() {
return culture;
}
public void setCulture(String culture) {
this.culture = culture;
}
public String getLanguage() {
return language;
}
public void setLanguage(String language) {
this.language = language;
}
public String getTimezone() {
return timezone;
}
public void setTimezone(String timezone) {
this.timezone = timezone;
}
public String getZenodoEmail() {
return zenodoEmail;
}
public void setZenodoEmail(String zenodoEmail) {
this.zenodoEmail = zenodoEmail;
}
public static PrincipalModel fromEntity(Principal principal) {
PrincipalModel model = new PrincipalModel();
model.setId(principal.getId());
model.setToken(principal.getToken());
model.setAuthorities(principal.getAuthz());
model.setAvatarUrl(principal.getAvatarUrl());
model.setCulture(principal.getCulture());
model.setEmail(principal.getEmail());
model.setExpiresAt(principal.getExpiresAt());
model.setLanguage(principal.getLanguage());
model.setName(principal.getName());
model.setTimezone(principal.getTimezone());
model.setZenodoEmail(principal.getZenodoEmail());
return model;
}
}

View File

@ -12,6 +12,7 @@ public class Principal {
private UUID id;
private UUID token;
private String name;
private String email;
private Date expiresAt;
private String avatarUrl;
private Set<Authorities> authorities;
@ -47,6 +48,14 @@ public class Principal {
this.name = name;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public Date getExpiresAt() {
return expiresAt;
}

View File

@ -22,7 +22,7 @@ public class UserInfo implements DataModel<eu.eudat.data.entities.UserInfo, User
private Date lastloggedin = null;
private String additionalinfo;
// private String additionalinfo;
public UUID getId() {
return id;
@ -88,13 +88,13 @@ public class UserInfo implements DataModel<eu.eudat.data.entities.UserInfo, User
this.lastloggedin = lastloggedin;
}
public String getAdditionalinfo() {
/*public String getAdditionalinfo() {
return additionalinfo;
}
public void setAdditionalinfo(String additionalinfo) {
this.additionalinfo = additionalinfo;
}
}*/
@Override
public UserInfo fromDataModel(eu.eudat.data.entities.UserInfo entity) {
@ -111,7 +111,7 @@ public class UserInfo implements DataModel<eu.eudat.data.entities.UserInfo, User
entity.setId(this.getId());
entity.setEmail(this.getEmail());
entity.setName(this.getName());
entity.setAdditionalinfo(this.getAdditionalinfo());
//entity.setAdditionalinfo(this.getAdditionalinfo());
entity.setAuthorization_level(this.getAuthorization_level());
entity.setCreated(this.getCreated());
entity.setLastloggedin(this.getLastloggedin());

View File

@ -17,7 +17,7 @@ public class UserListingModel implements DataModel<eu.eudat.data.entities.UserIn
private String name;
private Date created;
private Date lastloggedin;
private String additionalinfo;
//private String additionalinfo;
private List<Integer> appRoles;
public UUID getId() {
@ -69,12 +69,12 @@ public class UserListingModel implements DataModel<eu.eudat.data.entities.UserIn
this.lastloggedin = lastloggedin;
}
public String getAdditionalinfo() {
/*public String getAdditionalinfo() {
return additionalinfo;
}
public void setAdditionalinfo(String additionalinfo) {
this.additionalinfo = additionalinfo;
}
}*/
public List<Integer> getAppRoles() {
return appRoles;
@ -92,7 +92,7 @@ public class UserListingModel implements DataModel<eu.eudat.data.entities.UserIn
this.name = entity.getName();
this.created = entity.getCreated();
this.lastloggedin = entity.getLastloggedin();
this.additionalinfo = entity.getAdditionalinfo();
// this.additionalinfo = entity.getAdditionalinfo();
this.appRoles = entity.getUserRoles().stream().map(item -> item.getRole()).collect(Collectors.toList());
return this;
}
@ -107,7 +107,7 @@ public class UserListingModel implements DataModel<eu.eudat.data.entities.UserIn
userInfo.setName(this.name);
userInfo.setCreated(this.created);
userInfo.setLastloggedin(this.lastloggedin);
userInfo.setAdditionalinfo(this.additionalinfo);
// userInfo.setAdditionalinfo(this.additionalinfo);
return userInfo;
}

View File

@ -1,27 +1,37 @@
package eu.eudat.models.data.userinfo;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.ObjectMapper;
import eu.eudat.data.entities.*;
import eu.eudat.data.entities.UserInfo;
import eu.eudat.models.DataModel;
import eu.eudat.models.data.dmp.DataManagementPlan;
import net.minidev.json.parser.JSONParser;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.Date;
import java.util.List;
import java.util.UUID;
import java.io.IOException;
import java.util.*;
import java.util.stream.Collectors;
/**
* Created by ikalyvas on 8/24/2018.
*/
public class UserProfile implements DataModel<eu.eudat.data.entities.UserInfo, UserProfile> {
private static final Logger logger = LoggerFactory.getLogger(UserProfile.class);
private UUID id;
private String email;
private Short usertype;
private String name;
private Date lastloggedin;
private String additionalinfo;
//private String additionalinfo;
private List<DataManagementPlan> associatedDmps;
private String zenodoEmail;
private Map<String, Object> language;
private String timezone;
private Map<String, Object> culture;
private String avatarUrl;
public UUID getId() {
return id;
@ -63,13 +73,13 @@ public class UserProfile implements DataModel<eu.eudat.data.entities.UserInfo, U
this.lastloggedin = lastloggedin;
}
public String getAdditionalinfo() {
/*public String getAdditionalinfo() {
return additionalinfo;
}
public void setAdditionalinfo(String additionalinfo) {
this.additionalinfo = additionalinfo;
}
}*/
public List<DataManagementPlan> getAssociatedDmps() {
return associatedDmps;
@ -79,6 +89,46 @@ public class UserProfile implements DataModel<eu.eudat.data.entities.UserInfo, U
this.associatedDmps = associatedDmps;
}
public String getZenodoEmail() {
return zenodoEmail;
}
public void setZenodoEmail(String zenodoEmail) {
this.zenodoEmail = zenodoEmail;
}
public Map<String, Object> getLanguage() {
return language;
}
public void setLanguage(Map<String, Object> language) {
this.language = language;
}
public String getTimezone() {
return timezone;
}
public void setTimezone(String timezone) {
this.timezone = timezone;
}
public Map<String, Object> getCulture() {
return culture;
}
public void setCulture(Map<String, Object> culture) {
this.culture = culture;
}
public String getAvatarUrl() {
return avatarUrl;
}
public void setAvatarUrl(String avatarUrl) {
this.avatarUrl = avatarUrl;
}
@Override
public UserProfile fromDataModel(UserInfo entity) {
this.id = entity.getId();
@ -86,7 +136,17 @@ public class UserProfile implements DataModel<eu.eudat.data.entities.UserInfo, U
this.usertype = entity.getUsertype();
this.name = entity.getName();
this.lastloggedin = entity.getLastloggedin();
this.additionalinfo = entity.getAdditionalinfo();
//this.additionalinfo = entity.getAdditionalinfo();
try {
Map<String, Object> additionalInfo = new ObjectMapper().readValue(entity.getAdditionalinfo(), HashMap.class);
this.language = (Map)additionalInfo.get("language");
this.culture = (Map) additionalInfo.get("culture");
this.timezone = (String) additionalInfo.get("timezone");
this.zenodoEmail = (String) additionalInfo.get("zenodoEmail");
this.avatarUrl = (String) additionalInfo.get("avatarUrl");
} catch (IOException e) {
logger.error(e.getMessage(), e);
}
return this;
}

View File

@ -18,7 +18,7 @@ http-logger.server-address = http://localhost:31311
pdf.converter.url=http://localhost:88/
####################CONFIGURATION FILES OVERRIDES CONFIGURATIONS##########
configuration.externalUrls=ExternalUrls.xml
configuration.externalUrls=externalUrls/ExternalUrls.xml
configuration.rda=RDACommonStandards.txt
configuration.h2020template=documents/h2020.docx
configuration.configurable_login_providers=configurableLoginProviders.json

View File

@ -139,6 +139,14 @@ const appRoutes: Routes = [
title: 'GENERAL.TITLES.PRIVACY'
}
},
{
path: 'opensource-licences',
loadChildren: () => import('./ui/sidebar/sidebar-footer/opensource-licences/opensource-licenses.module').then(m => m.OpensourceLicencesModule),
data: {
breadcrumb: true,
title: 'GENERAL.TITLES.OPENSOURCE-LICENCES'
}
},
{
path: 'terms-and-conditions',
loadChildren: () => import('./ui/sidebar/sidebar-footer/terms/terms.module').then(m => m.TermsModule),

View File

@ -4,6 +4,7 @@ export interface Principal {
id: string;
token: string;
name: string;
email: string;
expiresAt: Date;
authorities: AppRole[];
avatarUrl: string;

View File

@ -5,7 +5,7 @@ import { DmpOverviewModel } from '../dmp/dmp-overview';
export interface DatasetOverviewModel {
id: string;
label: string;
status: any;
status: number;
datasetTemplate: DatasetProfileModel;
users: any[];

View File

@ -5,6 +5,10 @@ export interface UserListingModel {
name: String;
email: string;
appRoles: AppRole[];
additionalinfo: any;
associatedDmps: any[];
language: any;
culture: any;
timezone: String;
zenodoEmail: String;
avatarUrl: String;
}

View File

@ -19,7 +19,7 @@ export class DatasetWizardService {
private headers = new HttpHeaders();
constructor(private http: BaseHttpService, private httpClient: HttpClient, private configurationService: ConfigurationService) {
this.actionUrl = configurationService.server + 'datasetwizard/';
this.actionUrl = configurationService.server + 'datasets/';
}
// public userDmps(criteria: RequestItem<DmpCriteria>): Observable<DmpModel[]> {
@ -39,7 +39,7 @@ export class DatasetWizardService {
}
public delete(id: string): Observable<DatasetWizardModel> {
return this.http.delete<DatasetWizardModel>(this.actionUrl + id, { headers: this.headers });
return this.http.delete<DatasetWizardModel>(this.actionUrl + 'delete/' + id, { headers: this.headers });
}
createDataset(datasetModel: DatasetWizardModel): Observable<DatasetWizardModel> {

View File

@ -16,7 +16,7 @@ export class DatasetExternalAutocompleteService {
private httpClient: HttpClient,
private datasetProfileService: DatasetProfileService,
private configurationService: ConfigurationService) {
this.actionUrl = configurationService.server + 'datasetwizard/';
this.actionUrl = configurationService.server + 'datasets/';
}
getDatasetProfileById(datasetProfileID) {

View File

@ -90,7 +90,8 @@ export class DatasetService {
return this.httpClient.get(this.actionUrl + 'getPDF/' + id, { responseType: 'blob', observe: 'response', headers: headerPdf });
}
public downloadJson(id: string): Observable<HttpResponse<Blob>> {
return this.httpClient.get(this.actionUrl + 'rda/' + id, { responseType: 'blob', observe: 'response' });
}
//GK: NO
// public downloadJson(id: string): Observable<HttpResponse<Blob>> {
// return this.httpClient.get(this.actionUrl + 'rda/' + id, { responseType: 'blob', observe: 'response' });
// }
}

View File

@ -12,8 +12,8 @@
<p class="col dataset-label p-0 ml-3 mb-0">{{ dataset.label }}</p>
</div>
<div class="row d-flex align-items-center mt-3 mb-4 label-txt">
<div *ngIf="isUserDatasetRelated()" class="d-flex">
<p class="ml-0 mr-3 mb-0 label2-txt">
<div *ngIf="isUserDatasetRelated()" class="d-flex mr-2">
<p class="ml-0 mb-0 label2-txt">
{{ roleDisplayFromList(dataset.users) }}
</p>
</div>
@ -33,12 +33,12 @@
<mat-icon class="status-icon">lock_outline</mat-icon>
{{'DMP-OVERVIEW.LOCKED' | translate}}
</div>
<div class="d-flex ml-2 mr-3">{{'GENERAL.STATUSES.EDIT' | translate}} :
<div class="d-flex ml-2 mr-2">{{'GENERAL.STATUSES.EDIT' | translate}} :
{{dataset.modified | date:"longDate"}}
</div>
<div class="d-flex ml-2 mr-4">
<div *ngIf="dataset.status" class="d-flex flex-row uppercase">
<mat-icon class="status-icon">check</mat-icon>
<mat-icon class="status-icon check-icon">check</mat-icon>
{{'TYPES.DATASET-STATUS.FINALISED' | translate}}
</div>
</div>
@ -49,12 +49,12 @@
matTooltipPosition="above">
<mat-icon class="mat-mini-fab-icon">content_copy</mat-icon>
</button>
<button *ngIf="isDraftDataset(dataset) && isUserOwner" (click)="editClicked(dataset)"
<button *ngIf="isDraftDataset(dataset) && isUserOwner && !lockStatus" (click)="editClicked(dataset)"
mat-mini-fab class="mr-3 actions-btn"
matTooltip="{{'DMP-LISTING.ACTIONS.EDIT' | translate}}" matTooltipPosition="above">
<mat-icon class="mat-mini-fab-icon">create</mat-icon>
</button>
<button *ngIf="isDraftDataset(dataset) && isUserOwner" (click)="deleteClicked()" mat-mini-fab
<button *ngIf="isUserOwner && !lockStatus" (click)="deleteClicked()" mat-mini-fab
class="mr-3 actions-btn" matTooltip="{{'DMP-LISTING.ACTIONS.DELETE' | translate}}"
matTooltipPosition="above">
<mat-icon class="mat-mini-fab-icon">delete</mat-icon>
@ -91,17 +91,17 @@
</div>
<div class="col-md-4 col-lg-4 p-0">
<div class="frame mb-3 pt-4 pl-3 pr-5 pb-1">
<!-- <div *ngIf="!dataset.status && isDraftDataset(dataset) && isUserOwner">
<div *ngIf="!dataset.status && isDraftDataset(dataset) && isUserOwner && !lockStatus">
<div class="row ml-0 mr-0 pl-4 d-flex align-items-center" (click)="finalize(dataset)">
<button mat-mini-fab class="finalize-btn">
<mat-icon class="mat-mini-fab-icon">check</mat-icon>
<mat-icon class="mat-mini-fab-icon check-icon">check</mat-icon>
</button>
<p class="mb-0 pl-2 finalize-txt">{{ 'DMP-LISTING.ACTIONS.FINALIZE' | translate }}</p>
<p class="mb-0 pl-2 frame-txt">{{ 'DMP-LISTING.ACTIONS.FINALIZE' | translate }}</p>
</div>
<div class="row ml-0 mr-0 pl-4 d-flex align-items-center">
<hr class="hr-line">
</div>
</div> -->
</div>
<div class="row ml-0 mr-0 pl-4 pb-3 d-flex align-items-center">
<button mat-mini-fab class="frame-btn" [matMenuTriggerFor]="exportMenu">
<mat-icon class="mat-mini-fab-icon">open_in_new</mat-icon>
@ -109,6 +109,12 @@
<p class="mb-0 mr-0 pl-2 frame-txt" [matMenuTriggerFor]="exportMenu">
{{ 'DMP-LISTING.ACTIONS.EXPORT' | translate }}</p>
</div>
<div *ngIf="!dataset.public && showPublishButton(dataset) && isUserOwner && dataset.dmp.isPublic" class="row ml-0 mr-0 pl-4 pb-3 d-flex align-items-center" (click)="publish(dataset.id)">
<button mat-mini-fab class="frame-btn">
<mat-icon class="mat-mini-fab-icon">public</mat-icon>
</button>
<p class="mb-0 pl-2 frame-txt">{{ 'DMP-LISTING.ACTIONS.MAKE-PUBLIC' | translate }}</p>
</div>
<mat-menu #exportMenu="matMenu" xPosition="before">
<button mat-menu-item (click)="downloadPDF(dataset.id)">
<i class="fa fa-file-pdf-o pr-2"></i>
@ -122,10 +128,11 @@
<i class="fa fa-file-code-o pr-2"></i>
<span>{{'GENERAL.FILE-TYPES.XML' | translate}}</span>
</button>
<button mat-menu-item (click)="downloadJson(dataset.id)">
<!-- GK: NO-->
<!-- <button mat-menu-item (click)="downloadJson(dataset.id)">
<i class="fa fa-file-o pr-2"></i>
<span>{{'GENERAL.FILE-TYPES.JSON' | translate}}</span>
</button>
</button> -->
</mat-menu>
</div>
<div class="frame mb-3 pt-4 pl-3 pr-3 pb-1">

View File

@ -29,6 +29,10 @@
color: #A7A7A7;
}
.check-icon {
font-weight: bold;
}
.account-icon {
font-size: 2.5em;
}
@ -52,7 +56,7 @@
.dmp-btn {
width: 35em;
height: 2.3em;
min-height: 2.3em;
background-color: #129D99;
border-radius: 4px;
flex-direction: row;
@ -76,15 +80,15 @@
.frame-btn {
border: 1px solid #212121;
color: black;
background: #FFFFFF;
}
.finalize-btn {
border: 1px solid #129D99;
color: #129D99;
border: 1px solid #F7DD72;
background: #F5DB71;
}
.frame-btn, .finalize-btn {
background: #FFFFFF;
box-shadow: 0px 2px 6px #00000029;
}
@ -177,6 +181,7 @@
overflow: hidden;
color: #FFFFFF;
opacity: 0.8;
text-align: left;
}
.doi-label {
@ -221,10 +226,6 @@
color: #000000;
}
.finalize-txt {
color: #129D99;
}
.frame-txt, .finalize-txt {
font-size: 0.75em;
font-weight: bold;

View File

@ -28,6 +28,9 @@ import { DatasetCopyDialogueComponent } from '../dataset-wizard/dataset-copy-dia
import { DmpService } from '@app/core/services/dmp/dmp.service';
import { ResearcherModel } from '@app/core/model/researcher/researcher';
import { LockService } from '@app/core/services/lock/lock.service';
import { DatasetsToBeFinalized } from '@app/core/model/dataset/datasets-toBeFinalized';
import { DatasetModel } from '@app/core/model/dataset/dataset';
import { DatasetWizardModel } from '@app/core/model/dataset/dataset-wizard';
@Component({
@ -38,7 +41,8 @@ import { LockService } from '@app/core/services/lock/lock.service';
export class DatasetOverviewComponent extends BaseComponent implements OnInit {
dataset: DatasetOverviewModel;
datasetWizardModel: DatasetWizardEditorModel;
datasetWizardEditorModel: DatasetWizardEditorModel;
datasetWizardModel: DatasetWizardModel;
isNew = true;
isFinalized = false;
isPublicView = true;
@ -87,10 +91,7 @@ export class DatasetOverviewComponent extends BaseComponent implements OnInit {
this.dataset = data;
this.getDmpResearchers();
this.getDmpUsers();
this.datasetWizardService.getSingle(this.dataset.id).pipe(takeUntil(this._destroyed))
.subscribe(data => {
this.datasetWizardModel = new DatasetWizardEditorModel().fromModel(data);
});
this.getDatasetWizardModel(this.dataset.id);
this.checkLockStatus(this.dataset.id);
this.setIsUserOwner();
const breadCrumbs = [];
@ -116,10 +117,7 @@ export class DatasetOverviewComponent extends BaseComponent implements OnInit {
this.dataset = data;
this.getDmpResearchers();
this.getDmpUsers();
this.datasetWizardService.getSingle(this.dataset.id).pipe(takeUntil(this._destroyed))
.subscribe(data => {
this.datasetWizardModel = new DatasetWizardEditorModel().fromModel(data);
});
this.getDatasetWizardModel(this.dataset.id);
this.checkLockStatus(this.dataset.id);
this.setIsUserOwner();
const breadCrumbs = [];
@ -138,6 +136,14 @@ export class DatasetOverviewComponent extends BaseComponent implements OnInit {
});
}
getDatasetWizardModel(id: string) {
this.datasetWizardService.getSingle(id).pipe(takeUntil(this._destroyed))
.subscribe(data => {
this.datasetWizardEditorModel = new DatasetWizardEditorModel().fromModel(data);
this.datasetWizardModel = data;
});
}
checkLockStatus(id: string) {
this.lockService.checkLockStatus(id).pipe(takeUntil(this._destroyed))
.subscribe(lockStatus => this.lockStatus = lockStatus);
@ -278,8 +284,7 @@ export class DatasetOverviewComponent extends BaseComponent implements OnInit {
.pipe(takeUntil(this._destroyed))
.subscribe(
complete => {
this.onCallbackSuccess();
this.router.navigate(['/datasets']);
this.onDeleteCallbackSuccess();
},
error => this.onDeleteCallbackError(error)
);
@ -291,23 +296,33 @@ export class DatasetOverviewComponent extends BaseComponent implements OnInit {
this.router.navigate(['/plans/overview/' + dmpId]);
}
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);
onDeleteCallbackSuccess(): void {
this.uiNotificationService.snackBarNotification(this.language.instant('GENERAL.SNACK-BAR.SUCCESSFUL-DATASET-PROFILE-DELETE'), SnackBarNotificationLevel.Success);
this.router.navigate(['/datasets']);
}
onUpdateCallbackSuccess(): void {
this.uiNotificationService.snackBarNotification(this.language.instant('GENERAL.SNACK-BAR.SUCCESSFUL-UPDATE'), SnackBarNotificationLevel.Success);
this.reloadPage();
}
onDeleteCallbackError(error) {
this.uiNotificationService.snackBarNotification(error.error.message ? error.error.message : this.language.instant('GENERAL.SNACK-BAR.UNSUCCESSFUL-DELETE'), SnackBarNotificationLevel.Error);
}
onUpdateCallbackError(error) {
this.uiNotificationService.snackBarNotification(error.error.message ? error.error.message : this.language.instant('DATASET-UPLOAD.SNACK-BAR.UNSUCCESSFUL'), SnackBarNotificationLevel.Error);
}
public getOrcidPath(): string {
return this.configurationService.orcidPath;
}
getOrcidPathForResearcher(reference: string): string {
const path = this.getOrcidPath();
const userId = reference.split(':')[1];
return path + userId;
}
const path = this.getOrcidPath();
const userId = reference.split(':')[1];
return path + userId;
}
downloadPDF(id: string) {
this.datasetService.downloadPDF(id)
@ -342,15 +357,16 @@ export class DatasetOverviewComponent extends BaseComponent implements OnInit {
});
}
downloadJson(id: string) {
this.datasetService.downloadJson(id)
.pipe(takeUntil(this._destroyed))
.subscribe(response => {
const blob = new Blob([response.body], { type: 'application/json' });
const filename = this.getFilenameFromContentDispositionHeader(response.headers.get('Content-Disposition'));
FileSaver.saveAs(blob, filename);
})
}
//GK: NO
// downloadJson(id: string) {
// this.datasetService.downloadJson(id)
// .pipe(takeUntil(this._destroyed))
// .subscribe(response => {
// const blob = new Blob([response.body], { type: 'application/json' });
// const filename = this.getFilenameFromContentDispositionHeader(response.headers.get('Content-Disposition'));
// FileSaver.saveAs(blob, filename);
// })
// }
getFilenameFromContentDispositionHeader(header: string): string {
const regex: RegExp = new RegExp(/filename[^;=\n]*=((['"]).*?\2|[^;\n]*)/g);
@ -378,7 +394,7 @@ export class DatasetOverviewComponent extends BaseComponent implements OnInit {
data: {
formControl: formControl,
datasetId: this.dataset.id,
datasetProfileId: this.datasetWizardModel.profile,
datasetProfileId: this.datasetWizardEditorModel.profile,
datasetProfileExist: false,
confirmButton: this.language.instant('DATASET-WIZARD.DIALOGUE.COPY'),
cancelButton: this.language.instant('DATASET-WIZARD.DIALOGUE.CANCEL')
@ -398,10 +414,9 @@ export class DatasetOverviewComponent extends BaseComponent implements OnInit {
return this.dmpService.updateUsers(this.dataset.dmp.id, this.users).pipe(takeUntil(this._destroyed))
.subscribe(
complete => {
this.onCallbackSuccess();
this.reloadPage();
this.onUpdateCallbackSuccess();
},
error => this.onDeleteCallbackError(error)
error => this.onUpdateCallbackError(error)
);
}
@ -418,12 +433,63 @@ export class DatasetOverviewComponent extends BaseComponent implements OnInit {
if (result) {
const index = this.users.findIndex(x => x.id === user.id);
if (index > -1) {
this.users.splice(index, 1);
this.users.splice(index, 1);
}
this.updateUsers();
}
});
}
showPublishButton(dataset: DatasetOverviewModel) {
return this.isFinalizedDataset(dataset) && !dataset.public && this.hasPublishButton;
}
publish(id: String) {
const dialogRef = this.dialog.open(ConfirmationDialogComponent, {
maxWidth: '500px',
restoreFocus: false,
data: {
message: this.language.instant('GENERAL.CONFIRMATION-DIALOG.PUBLISH-ITEM'),
privacyPolicyNames: this.language.instant('GENERAL.CONFIRMATION-DIALOG.PRIVACY-POLICY-NAMES'),
confirmButton: this.language.instant('GENERAL.CONFIRMATION-DIALOG.ACTIONS.CONFIRM'),
cancelButton: this.language.instant('GENERAL.CONFIRMATION-DIALOG.ACTIONS.CANCEL'),
isDeleteConfirmation: false
}
});
dialogRef.afterClosed().pipe(takeUntil(this._destroyed)).subscribe(result => {
if (result) {
this.datasetService.publish(id)
.pipe(takeUntil(this._destroyed))
.subscribe(() => {
this.hasPublishButton = false;
this.reloadPage();
});
}
});
}
finalize(dataset: DatasetOverviewModel) {
const dialogRef = this.dialog.open(ConfirmationDialogComponent, {
restoreFocus: false,
data: {
message: this.language.instant('GENERAL.CONFIRMATION-DIALOG.FINALIZE-ITEM'),
confirmButton: this.language.instant('QUICKWIZARD.SAVE-DIALOG.ACTIONS.AFFIRMATIVE'),
cancelButton: this.language.instant('QUICKWIZARD.SAVE-DIALOG.ACTIONS.NEGATIVE'),
isDeleteConfirmation: false
}
});
dialogRef.afterClosed().pipe(takeUntil(this._destroyed)).subscribe(result => {
if (result) {
this.getDatasetWizardModel(this.dataset.id);
this.datasetWizardModel.status = DatasetStatus.Finalized;
this.datasetWizardService.createDataset(this.datasetWizardModel)
.pipe(takeUntil(this._destroyed))
.subscribe(
data => this.onUpdateCallbackSuccess(),
error => this.onUpdateCallbackError(error)
);
}
});
}
}

View File

@ -54,7 +54,7 @@
<button *ngIf="isDraftDmp(dmp) && isUserOwner && !lockStatus" (click)="editClicked(dmp)" mat-mini-fab class="mr-3 d-flex justify-content-center align-items-center" matTooltip="{{'DMP-LISTING.ACTIONS.EDIT' | translate}}" matTooltipPosition="above">
<mat-icon class="mat-mini-fab-icon">create</mat-icon>
</button>
<button *ngIf="isDraftDmp(dmp) && isUserOwner && !lockStatus" (click)="deleteClicked()" mat-mini-fab class="mr-3 d-flex justify-content-center align-items-center" matTooltip="{{'DMP-LISTING.ACTIONS.DELETE' | translate}}" matTooltipPosition="above">
<button *ngIf="isUserOwner && !lockStatus" (click)="deleteClicked()" mat-mini-fab class="mr-3 d-flex justify-content-center align-items-center" matTooltip="{{'DMP-LISTING.ACTIONS.DELETE' | translate}}" matTooltipPosition="above">
<mat-icon class="mat-mini-fab-icon">delete</mat-icon>
</button>
</div>
@ -132,7 +132,7 @@
<hr class="hr-line">
</div>
</div>
<div *ngIf="hasDoi(dmp) && isFinalizedDmp(dmp) && !this.isPublicView && isUserOwner" (click)="getDoi(dmp)" class="row ml-0 mr-0 pl-4 pb-3 d-flex align-items-center">
<div *ngIf="isFinalizedDmp(dmp) && !this.isPublicView && isUserOwner" (click)="getDoi(dmp)" class="row ml-0 mr-0 pl-4 pb-3 d-flex align-items-center">
<button mat-mini-fab class="frame-btn">
<mat-icon class="mat-mini-fab-icon">archive</mat-icon>
</button>
@ -145,7 +145,7 @@
<p class="mb-0 mr-0 pl-2 frame-txt" [matMenuTriggerFor]="exportMenu">
{{ 'DMP-LISTING.ACTIONS.EXPORT' | translate }}</p>
</div>
<div class="row ml-0 mr-0 pl-4 pb-3 d-flex align-items-center" *ngIf="isUserOwner && !lockStatus" (click)="newVersion(dmp.id, dmp.label)">
<div *ngIf="isUserOwner" class="row ml-0 mr-0 pl-4 pb-3 d-flex align-items-center" (click)="newVersion(dmp.id, dmp.label)">
<button mat-mini-fab class="frame-btn">
<mat-icon class="mat-mini-fab-icon">add_to_photos</mat-icon>
</button>

View File

@ -30,14 +30,6 @@
// ********BUTTONS********
.version-btn {
// width: 6.7em;
height: 1.8em;
border: 1px solid #707070;
border-radius: 4px;
background-color: transparent;
}
.id-btn {
background: url("../../../../assets/images/NoPath.png") no-repeat center;
width: 1em;
@ -194,7 +186,7 @@
}
.doi-txt {
font-size: 0.8em;
font-size: 1em;
letter-spacing: 0.009em;
color: #7d7d7d;
width: 12em;
@ -202,6 +194,7 @@
overflow: hidden;
border: none;
padding: 0px;
background-color: transparent;
}
.doi-panel {
@ -303,6 +296,17 @@
::ng-deep .versions-select .mat-form-field-wrapper {
background-color: transparent !important;
padding-bottom: 0 !important;
width: 6.5rem;
}
::ng-deep .versions-select .mat-form-field-wrapper .mat-form-field-flex {
padding: 0 0.5rem 0 0.625rem;
margin-bottom: 0.2rem;
font-weight: 500;
}
::ng-deep mat-select .mat-select-arrow-wrapper {
vertical-align: bottom;
}
::ng-deep .mat-form-field-appearance-outline .mat-form-field-infix {

View File

@ -478,7 +478,10 @@ export class DmpOverviewComponent extends BaseComponent implements OnInit {
if (result) {
this.dmpService.publish(dmpId)
.pipe(takeUntil(this._destroyed))
.subscribe(() => { this.hasPublishButton = false });
.subscribe(() => {
this.hasPublishButton = false;
this.reloadPage();
});
}
});
}

View File

@ -3,8 +3,8 @@
<div class="dropdown-options">
<mat-divider class="col-12 top-divider"></mat-divider>
<div class="col-12 pl-2">
<a mat-button class="profile mt-2 mb-2 pl-0">
<mat-icon class="check-icon">check</mat-icon>{{ data.user.email }}
<a class="profile email-btn mt-2 mb-2 pl-0">
<mat-icon class="check-icon">check</mat-icon>{{ getPrincipalEmail() }}
</a>
</div>
<mat-divider class="col-12"></mat-divider>

View File

@ -19,6 +19,13 @@ $mat-card-header-size: 40px !default;
text-align: left;
}
.email-btn {
cursor: auto;
display: inline-block;
line-height: 2.25rem;
font-size: 0.875rem;
}
.dropdown-top {
width: 0rem;
border-bottom: 0.625rem solid #FFFFFF;

View File

@ -35,6 +35,12 @@ export class UserDialogComponent implements OnInit {
return '';
}
public getPrincipalEmail(): string {
const principal: Principal = this.authentication.current();
if (principal) { return principal.email; }
return '';
}
public principalHasAvatar(): boolean {
return this.authentication.current() && this.authentication.current().avatarUrl != null && this.authentication.current().avatarUrl.length > 0;
}

View File

@ -73,7 +73,6 @@ export class NavbarComponent extends BaseComponent implements OnInit {
this.progressIndicationService.getProgressIndicationObservable().pipe(takeUntil(this._destroyed)).subscribe(x => {
setTimeout(() => { this.progressIndication = x; });
});
this.getPrincipalAsUser();
}
public isAuthenticated(): boolean {
@ -84,13 +83,6 @@ export class NavbarComponent extends BaseComponent implements OnInit {
return this.currentRoute === '/language-editor' || this.currentRoute === '/profile';
}
public getPrincipalAsUser() {
const principal: Principal = this.authentication.current();
if (principal) {
this.userService.getUser(principal.id).pipe(takeUntil(this._destroyed)).subscribe(result => this.user = result);
}
}
sidebarOpen() {
const toggleButton = this.toggleButton;
const body = document.getElementsByTagName('body')[0];
@ -223,9 +215,6 @@ export class NavbarComponent extends BaseComponent implements OnInit {
autoFocus: false,
closeOnNavigation: true,
disableClose: false,
data: {
user: this.user
},
position: { top: '64px', right: '1em' }
});
}

View File

@ -0,0 +1,21 @@
h1 {
text-align: center;
margin: 2rem 0 1rem 0;
}
h4 {
margin: 1rem 0rem 0.5rem 0rem;
}
img {
height: 150px;
width: 100%;
}
.terms-component {
margin-top: 80px;
}
p {
margin: 0.5rem 0rem;
}

View File

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

View File

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

View File

@ -0,0 +1,15 @@
import { NgModule } from '@angular/core';
import { CommonUiModule } from '@common/ui/common-ui.module';
import { OpensourceLicencesRoutingModule } from './opensource-licences.routing';
import { OpensourceLicencesComponent } from './opensource-licences.component';
@NgModule({
imports: [
CommonUiModule,
OpensourceLicencesRoutingModule
],
declarations: [
OpensourceLicencesComponent
],
})
export class OpensourceLicencesModule { }

View File

@ -1,5 +1,6 @@
h1 {
text-align: center;
margin: 2rem 0 1rem 0;
}
img {

View File

@ -6,7 +6,7 @@
<div class="row">
<div class="col-12">
<div class="row profile-card-center-row">
<div class="col-auto"><img mat-card-avatar [src]="userProfile.additionalinfo.avatarUrl" (error)="applyFallbackAvatar($event)">
<div class="col-auto"><img mat-card-avatar [src]="userProfile.avatarUrl" (error)="applyFallbackAvatar($event)">
</div>
</div>
<div class="row profile-card-center-row">

View File

@ -33,7 +33,7 @@ export class UserProfileComponent extends BaseComponent implements OnInit, OnDes
editMode = false;
languages = availableLanguages;
zenodoToken: string;
zenodoEmail: string;
zenodoEmail: String;
formGroup: FormGroup;
constructor(
@ -56,13 +56,13 @@ export class UserProfileComponent extends BaseComponent implements OnInit, OnDes
this.currentUserId = this.authService.current().id;
const userId = !params['id'] ? 'me' : params['id'];
this.user = this.userService.getUser(userId).pipe(map(result => {
result['additionalinfo'] = JSON.parse(result['additionalinfo']);
this.zenodoToken = result['additionalinfo']['zenodoToken'];
this.zenodoEmail = result['additionalinfo']['zenodoEmail'];
//result['additionalinfo'] = JSON.parse(result['additionalinfo']);
//this.zenodoToken = result['additionalinfo']['zenodoToken'];
this.zenodoEmail = result['zenodoEmail'];
this.formGroup = new FormBuilder().group({
language: new FormControl(result['additionalinfo']['language'] ? availableLanguages.filter(x => x.value === result['additionalinfo']['language']['value']).pop() : '', [Validators.required]),
timezone: new FormControl(result['additionalinfo']['timezone'], [Validators.required]),
culture: new FormControl(result['additionalinfo']['culture'], [Validators.required])
language: new FormControl(result['language'] ? availableLanguages.filter(x => x.value === result['language']['value']).pop() : '', [Validators.required]),
timezone: new FormControl(result['timezone'], [Validators.required]),
culture: new FormControl(result['culture'], [Validators.required])
});
//this.formGroup.get('language').valueChanges.pipe(takeUntil(this._destroyed)).subscribe(x => { if (x) this.translate.use(x.value) })
this.formGroup.get('timezone').valueChanges
@ -157,7 +157,7 @@ export class UserProfileComponent extends BaseComponent implements OnInit, OnDes
}
public hasZenodo(): boolean {
return !isNullOrUndefined(this.zenodoToken) && this.zenodoToken !== "";
return !isNullOrUndefined(this.zenodoEmail) && this.zenodoEmail !== "";
}
public loginToZenodo() {

View File

@ -89,6 +89,7 @@
"GENERAL": "Data Management Plans Creator",
"ABOUT": "About",
"PRIVACY": "Privacy Policy",
"OPENSOURCE-LICENCES": "Opensource Licences",
"TERMS": "Terms Of Service",
"COOKIES-POLICY": "Cookies Policy",
"PLANS": "My DMPs",
@ -1193,6 +1194,10 @@
"TITLE": "-Privacy Policy-",
"MAIN-CONTENT": ""
},
"OPENSOURCE-LICENCES": {
"TITLE": "Opensource licences",
"MAIN-CONTENT": ""
},
"TERMS-OF-SERVICE": {
"TITLE": "Terms of Service",
"MAIN-CONTENT": ""

View File

@ -88,6 +88,7 @@
"GENERAL": "Crear Planes de Gestión de Datos",
"ABOUT": "Acerca de",
"PRIVACY": "Política de privacidad",
"OPENSOURCE-LICENCES": "Opensource Licences",
"TERMS": "Términos de servicio",
"COOKIES-POLICY": "Cookies Policy",
"PLANS": "Mis PGDs",
@ -1173,6 +1174,10 @@
"TITLE": "-Política de privacidad-",
"MAIN-CONTENT": ""
},
"OPENSOURCE-LICENCES": {
"TITLE": "Opensource licences",
"MAIN-CONTENT": ""
},
"TERMS-OF-SERVICE": {
"TITLE": "-Términos del servicio-",
"MAIN-CONTENT": ""

View File

@ -88,6 +88,7 @@
"GENERAL": "Δημιουργός Σχεδίου Διαχείρισης Δεδομένων",
"ABOUT": "Σχετικά",
"PRIVACY": "Πολιτική Απορρήτου και Προστασίας Προσωπικών Δεδομένων",
"OPENSOURCE-LICENCES": "Opensource Licences",
"TERMS": "Όροι χρήσης",
"COOKIES-POLICY": "Cookies Policy",
"PLANS": "Τα Σχέδια Διαχείρισης Δεδομένων Μου",
@ -1174,6 +1175,10 @@
"TITLE": "-Πολιτική Απορρήτου-",
"MAIN-CONTENT": ""
},
"OPENSOURCE-LICENCES": {
"TITLE": "Opensource licences",
"MAIN-CONTENT": ""
},
"TERMS-OF-SERVICE": {
"TITLE": "-Όροι Χρήσης-",
"MAIN-CONTENT": ""

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

View File

@ -0,0 +1,140 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<title>Argos</title>
<link rel="icon" type="image/x-icon" href="../assets/img/fav-icon.png">
<!-- 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">
<!-- 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">
</head>
<body id="page-top" class="bootstrap-overrides">
<!-- Navbar -->
<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>
<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>
<div id="aboutDropdown" class="dropdown-content">
<div class="dropdown-top"></div>
<div class="dropdown-options">
<a href="how-it-works.html">How it works</a>
<a href="https://trello.com/b/x49lylnK/argos" target="_blank">Roadmap</a>
<a href="faqs.html">faqs</a>
<a href="contributors.html">Contributors</a>
</div>
</div>
</li>
<li class="nav-item">
<a class="nav-link dropbtn" href="#resources">RESOURCES</a>
<div id="resourcesDropdown" class="dropdown-content">
<div class="dropdown-top"></div>
<div class="dropdown-options">
<a href="../resources/media-kit.html">Media kit</a>
<a href="../resources/user-guide.html">User Guide</a>
<a href="../resources/co-branding.html">Co-branding</a>
</div>
</div>
</li>
<li class="nav-item"><a class="nav-link" href="../contact.html">CONTACT</a></li>
<li class="nav-item"><li class="nav-item"><a class="nav-link" href="/login">SIGN IN</a></li></li>
</ul>
</div>
</div>
</nav>
<!-- Translators -->
<section class="page-section how-it-works" id="how-it-works">
<div class="container-small">
<div class="col">
<div class="page-title">About</div>
</div>
<div class="col pt-5 pb-3">
<div class="row title-4">Translators</div>
</div>
<div class="card mt-3 flex-row">
<img class="col-4 flag" alt="Flag of Greece" src="../../images/contributors/flag-greece.png">
<div class="col-8 card-body" class="flex-column align-items-center">
<p class="card-text-1">Athena Research & Innovation Center</p>
<p class="card-text-2">Dimitra Aglamisi, Elli Papadopoulou</p>
</div>
</div>
<div class="card flex-row">
<img class="col-4 card-img" alt="Flag of Spain" src="../../images/contributors/NoPath - Copy (7).png">
<div class="col-8 card-body" class="flex-column align-items-center">
<p class="card-text-1">Consorcio Madroño</p>
<p class="card-text-2">Lanko López, Juan Corrales Correyero, Fernando González Ballesteros</p>
</div>
</div>
<div class="card flex-row">
<img class="col-4 card-img" alt="Flag of Turkey" src="../../images/contributors/Image 82.png">
<div class="col-8 card-body" class="flex-column align-items-center">
<p class="card-text-1">Turkish Higher Education Council Research Data and Open Data working group</p>
</div>
</div>
</div>
</section>
<!-- Footer-->
<footer class="footer">
<div class="container">
<div class="row justify-content-center">
<div class="col-auto">
<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. 777541.</div>
</div>
<div class="col-auto">
<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="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="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-auto conditions-policy" href="/opensource-licences">Οpensource licences</a>
<a class="col-auto conditions-policy" href="/terms-and-conditions">Terms and conditions</a>
<a class="col-auto 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><u><a class="licence" 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>
</body>
</html>

View File

@ -36,6 +36,7 @@
<a href="how-it-works.html">How it works</a>
<a href="https://trello.com/b/x49lylnK/argos" target="_blank">Roadmap</a>
<a href="faqs.html">faqs</a>
<a href="contributors.html">Contributors</a>
</div>
</div>
</li>
@ -62,10 +63,10 @@
<section class="page-section how-it-works" id="how-it-works">
<div class="container-small">
<div class="col">
<div class="page-title">FAQs</div>
<div class="page-title">About</div>
</div>
<div class="col pt-5 pb-3">
<div class="row title-1">FAQs</div>
<div class="row title-4">FAQs</div>
</div>
<div class="collapse-box">
<div class="panel-heading">
@ -167,7 +168,7 @@
<img src="../assets/img/argos-logo - Copy.svg" width="98" height="37">
</div>
<div class="col-auto">
<div class="footer-text">OpenAIRE-Advance receives funding from the European Union's Horizon 2020
<div class="footer-text">ARGOS receives funding from the European Union's Horizon 2020
Research and Innovation programme under Grant Agreement No. 777541.</div>
</div>
<div class="col-auto">
@ -188,15 +189,16 @@
</div>
</div>
<div class="row justify-content-center pt-5">
<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>
<a class="col-auto conditions-policy" href="/opensource-licences">Οpensource licences</a>
<a class="col-auto conditions-policy" href="/terms-and-conditions">Terms and conditions</a>
<a class="col-auto 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><a href="https://creativecommons.org/licenses/by/4.0/">ATTRIBUTION 4.0 INTERNATIONAL LICENSE.</a></u></div>
<div><u><a class="licence" href="https://creativecommons.org/licenses/by/4.0/">ATTRIBUTION 4.0 INTERNATIONAL LICENSE.</a></u></div>
</div>
</div>
</footer>

View File

@ -35,6 +35,7 @@
<a href="how-it-works.html">How it works</a>
<a href="https://trello.com/b/x49lylnK/argos" target="_blank">Roadmap</a>
<a href="faqs.html">faqs</a>
<a href="contributors.html">Contributors</a>
</div>
</div>
</li>
@ -59,12 +60,12 @@
<section class="page-section how-it-works" id="how-it-works">
<div class="container-small">
<div class="col">
<div class="page-title">How it works</div>
<div class="page-title">About</div>
</div>
<div class="col pt-5 pb-2">
<div class="row title-1">How it works</div>
<div class="col pt-5 pb-3">
<div class="row title-4">How it works</div>
</div>
<p class="pt-2">
<p class="pt-3">
ARGOS is the joint effort of OpenAIRE and EUDAT to deliver an open platform for Data Management Planning
that addresses FAIR and Open best practices and assumes no barriers for its use and adoption.
</p>
@ -121,7 +122,7 @@
<img src="../assets/img/argos-logo - Copy.svg" width="98" height="37">
</div>
<div class="col-auto">
<div class="footer-text">OpenAIRE-Advance receives funding from the European Union's Horizon 2020
<div class="footer-text">ARGOS receives funding from the European Union's Horizon 2020
Research and Innovation programme under Grant Agreement No. 777541.</div>
</div>
<div class="col-auto">
@ -142,15 +143,16 @@
</div>
</div>
<div class="row justify-content-center pt-5">
<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>
<a class="col-auto conditions-policy" href="/opensource-licences">Οpensource licences</a>
<a class="col-auto conditions-policy" href="/terms-and-conditions">Terms and conditions</a>
<a class="col-auto 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><a href="https://creativecommons.org/licenses/by/4.0/">ATTRIBUTION 4.0 INTERNATIONAL LICENSE.</a></u></div>
<div><u><a class="licence" href="https://creativecommons.org/licenses/by/4.0/">ATTRIBUTION 4.0 INTERNATIONAL LICENSE.</a></u></div>
</div>
</div>
</footer>

View File

@ -36,6 +36,7 @@
<a href="about/how-it-works.html">How it works</a>
<a href="https://trello.com/b/x49lylnK/argos" target="_blank">Roadmap</a>
<a href="about/faqs.html">faqs</a>
<a href="about/contributors.html">Contributors</a>
</div>
</div>
</li>
@ -67,7 +68,7 @@
<div class="col page-subtitle">
<div>Contact us to learn more</div>
</div>
<div class="col required">
<div class="col required mb-5">
<div>* Required fields</div>
</div>
@ -104,7 +105,7 @@
<img src="assets/img/argos-logo - Copy.svg" width="98" height="37">
</div>
<div class="col-auto">
<div class="footer-text">OpenAIRE-Advance receives funding from the European Union's Horizon 2020
<div class="footer-text">ARGOS receives funding from the European Union's Horizon 2020
Research and Innovation programme under Grant Agreement No. 777541..</div>
</div>
<div class="col-auto">
@ -124,15 +125,16 @@
</div>
</div>
<div class="row justify-content-center pt-5">
<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>
<a class="col-auto conditions-policy" href="/opensource-licences">Οpensource licences</a>
<a class="col-auto conditions-policy" href="/terms-and-conditions">Terms and conditions</a>
<a class="col-auto 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><a href="https://creativecommons.org/licenses/by/4.0/">ATTRIBUTION 4.0 INTERNATIONAL LICENSE.</a></u></div>
<div><u><a class="licence" href="https://creativecommons.org/licenses/by/4.0/">ATTRIBUTION 4.0 INTERNATIONAL LICENSE.</a></u></div>
</div>
</div>
</footer>

View File

@ -41,7 +41,7 @@
.conditions-policy {
text-align: left;
text-decoration: underline;
text-decoration: underline !important;
font-weight: 400;
font-family: 'Roboto',sans-serif;
font-size: 1rem;

View File

@ -124,6 +124,7 @@ section.benefits {
box-shadow: 0px 6px 15px #0000001A;
border-radius: 36px;
opacity: 1;
margin-bottom: 0.5rem;
}
.benefit-card-title {
@ -216,6 +217,12 @@ section.benefits {
padding: 2rem 0rem;
}
.list {
font-size: 0.87rem;
color: #212121;
opacity: 0.8;
}
section.media-kit-logo {
background: #F3F3F3;
opacity: 1;

View File

@ -130,30 +130,30 @@ p a {
}
.title-1 {
text-align: left;
font-size: 2.37rem;
line-height: 2.75rem;
font-family: 'Roboto', sans-serif;
font-weight: 300;
color: #FFFFFF;
}
.title-2 {
text-align: left;
font-size: 2.37rem;
line-height: 2.75rem;
font-family: 'Roboto', sans-serif;
font-weight: 700;
color: #FFFFFF;
}
.title-3 {
opacity: 0.95;
}
.title-3, .title-4 {
font-weight: 300;
color: #212121;
}
.title-1, .title-2, .title-3, .title-4 {
text-align: left;
font-size: 2.37rem;
font-family: 'Roboto', sans-serif;
font-weight: 300;
color: #212121;
opacity: 0.95;
}
.page-title {
@ -323,3 +323,41 @@ hr {
max-width: 900px;
}
}
.card {
min-height: 14rem;
margin-bottom: 1.875rem;
box-shadow: 0px 3px 6px #00000029;
}
.card-img {
transform: scale(0.5);
}
.card-body {
display: flex;
flex-direction: column;
align-items: left;
justify-content: center;
padding: 1rem 1.25rem !important;
}
.card-text-1 {
font-size: 1.125rem;
font-weight: bold;
text-transform: uppercase;
}
.card-text-2 {
font-size: 1rem;
font-weight: 400;
opacity: 0.6;
}
.flag {
border: 10px solid #EEEEEE;
border-radius: 50% !important;
padding-right: 0px !important;
padding-left: 0px !important;
transform: scale(0.45);
}

View File

@ -36,6 +36,7 @@
<a href="about/how-it-works.html">How it works</a>
<a href="https://trello.com/b/x49lylnK/argos" target="_blank">Roadmap</a>
<a href="about/faqs.html">faqs</a>
<a href="about/contributors.html">Contributors</a>
</div>
</div>
</li>
@ -350,7 +351,7 @@
<img src="assets/img/argos-logo - Copy.svg" width="98" height="37">
</div>
<div class="col-auto">
<div class="footer-text">OpenAIRE-Advance receives funding from the European Union's Horizon 2020
<div class="footer-text">ARGOS receives funding from the European Union's Horizon 2020
Research and Innovation programme under Grant Agreement No. 777541.</div>
</div>
<div class="col-auto">
@ -371,15 +372,16 @@
</div>
</div>
<div class="row justify-content-center pt-5">
<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>
<a class="col-auto conditions-policy" href="/opensource-licences">Οpensource licences</a>
<a class="col-auto conditions-policy" href="/terms-and-conditions">Terms and conditions</a>
<a class="col-auto 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><a href="https://creativecommons.org/licenses/by/4.0/">ATTRIBUTION 4.0 INTERNATIONAL LICENSE.</a></u></div>
<div><u><a class="licence" href="https://creativecommons.org/licenses/by/4.0/">CC ATTRIBUTION 4.0 INTERNATIONAL LICENSE.</a></u></div>
</div>
</div>
</footer>

View File

@ -9,14 +9,17 @@
<!-- 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">
@ -24,7 +27,9 @@
<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">
@ -35,6 +40,7 @@
<a href="../about/how-it-works.html">How it works</a>
<a href="https://trello.com/b/x49lylnK/argos" target="_blank">Roadmap</a>
<a href="../about/faqs.html">faqs</a>
<a href="../about/contributors.html">Contributors</a>
</div>
</div>
</li>
@ -50,7 +56,9 @@
</div>
</li>
<li class="nav-item"><a class="nav-link" href="../contact.html">CONTACT</a></li>
<li class="nav-item"><li class="nav-item"><a class="nav-link" href="/login">SIGN IN</a></li></li>
<li class="nav-item">
<li class="nav-item"><a class="nav-link" href="/login">SIGN IN</a></li>
</li>
</ul>
</div>
</div>
@ -65,12 +73,17 @@
<div class="title-3">Download ARGOS</div>
</div>
<div class="col">
<p>
<div>Open to all to suggest new features and to actively contribute to Argos development via pull requests of code in <a href="https://gitlab.eudat.eu/dmp/OpenAIRE-EUDAT-DMP-service-pilot">GitLab</a>!</div>
<div>Note that this page is under development.</div>
<p>Open to all to suggest new features and to actively contribute to Argos development via pull
requests of code in
<a href="https://gitlab.eudat.eu/dmp/OpenAIRE-EUDAT-DMP-service-pilot">GitLab</a>!
<br>Note that this page is under development.
</p>
</div>
<div class="col d-flex justify-content-center"><a href="https://gitlab.eudat.eu/dmp/OpenAIRE-EUDAT-DMP-service-pilot"><button class="normal-btn">Download argos</button></a></div>
<div class="col d-flex justify-content-center mt-5 pt-5 mb-5 pb-5">
<a href="https://gitlab.eudat.eu/dmp/OpenAIRE-EUDAT-DMP-service-pilot">
<button class="normal-btn">Download argos</button>
</a>
</div>
</div>
</section>
<!-- Footer-->
@ -81,7 +94,7 @@
<img src="../assets/img/argos-logo - Copy.svg" width="98" height="37">
</div>
<div class="col-auto">
<div class="footer-text">OpenAIRE-Advance receives funding from the European Union's Horizon 2020
<div class="footer-text">ARGOS receives funding from the European Union's Horizon 2020
Research and Innovation programme under Grant Agreement No. 777541.</div>
</div>
<div class="col-auto">
@ -92,34 +105,48 @@
</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="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>
<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="https://www.openaire.eu/newsletter/listing"><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">Terms and conditions</a>
<a class="col conditions-policy" href="/cookies-policy">Cookies policy</a>
<a class="col-auto conditions-policy" href="/opensource-licences">Οpensource licences</a>
<a class="col-auto conditions-policy" href="/terms-and-conditions">Terms and conditions</a>
<a class="col-auto 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><a href="https://creativecommons.org/licenses/by/4.0/">ATTRIBUTION 4.0 INTERNATIONAL LICENSE.</a></u></div>
<div><u><a class="licence" 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>

View File

@ -9,14 +9,17 @@
<!-- 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">
@ -24,7 +27,9 @@
<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">
@ -35,6 +40,7 @@
<a href="../about/how-it-works.html">How it works</a>
<a href="https://trello.com/b/x49lylnK/argos" target="_blank">Roadmap</a>
<a href="../about/faqs.html">faqs</a>
<a href="../about/contributors.html">Contributors</a>
</div>
</div>
</li>
@ -50,7 +56,9 @@
</div>
</li>
<li class="nav-item"><a class="nav-link" href="../contact.html">CONTACT</a></li>
<li class="nav-item"><li class="nav-item"><a class="nav-link" href="/login">SIGN IN</a></li></li>
<li class="nav-item">
<li class="nav-item"><a class="nav-link" href="/login">SIGN IN</a></li>
</li>
</ul>
</div>
</div>
@ -64,29 +72,35 @@
<div class="col pt-5 pb-3">
<div class="title-3">Media Kit</div>
</div>
<div class="col">
<div class="col mb-5">
<p>
This kit has been designed for everyone who wishes to get more familiar with the Argos tool or
promote Argos in their area of influence. The media kit includes:
<ul>
</p>
<ul class="list">
<li>
<a href="#media-kit-logo">Argos logo</a> for dark and light backgrounds in two resolutions, including examples of misuse.
<a href="#media-kit-logo">Argos logo</a> for dark and light backgrounds in two resolutions,
including examples of misuse.
Please avoid changing the colors, rotating the icons, moving the icons, adding text, etc. If you
need to make any modifications on the versions of the logo provided in the Media Kit, please reach
need to make any modifications on the versions of the logo provided in the Media Kit, please
reach
out to argos@openaire.eu.
</li>
<li>
<a href="#moo-cards">Moo card,</a> a two-sided card capturing the most essential and unique features of Argos in a concise
<a href="#moo-cards">Moo card,</a> a two-sided card capturing the most essential and unique
features of Argos in a concise
way.
</li>
<li>
<a href="../assets/media-kit/Factsheet.pdf">Factsheet</a> containing the basics of Argos and explaining its key features in an adequate level of
<a href="../assets/media-kit/Factsheet.pdf">Factsheet</a> containing the basics of Argos and
explaining its key features in an adequate level of
</li>
<li>
<a href="https://www.openaire.eu/argos/">Useful Resources,</a> a collection of resources either directly for Argos or indirectly for Research Data Management issues which to some extent relate to Argos.
<a href="https://www.openaire.eu/argos/">Useful Resources,</a> a collection of resources either
directly for Argos or indirectly for Research Data Management issues which to some extent relate
to Argos.
</li>
</ul>
</p>
</div>
</div>
</section>
@ -98,36 +112,46 @@
<div class="col-auto">
<img src="../assets/img/logo-1.png" width="570" height="283">
<div class="row pr-4">
<a href="../assets/media-kit/argos-logo.svg"><div class="col-auto ml-auto pt-4"><i class="fas fa-lg fa-download"></i>SVG</a></div>
<a href="../assets/media-kit/argos-logo.png"><div class="col-auto pt-4"><i class="fas fa-lg fa-download"></i>PNG</a></div>
</div>
</div>
<div class="col-auto">
<img src="../assets/img/logo-2.png" width="570" height="283">
<div class="row pr-4">
<a href="../assets/media-kit/argos-logo-white.svg"><div class="col-auto ml-auto pt-4"><i class="fas fa-lg fa-download"></i>SVG</a></div>
<a href="../assets/media-kit/argos-logo-white.png"><div class="col-auto pt-4"><i class="fas fa-lg fa-download"></i>PNG</a></div>
</div>
<a href="../assets/media-kit/argos-logo.svg">
<div class="col-auto ml-auto pt-4"><i class="fas fa-lg fa-download"></i>SVG
</a></div>
<a href="../assets/media-kit/argos-logo.png">
<div class="col-auto pt-4"><i class="fas fa-lg fa-download"></i>PNG
</a>
</div>
</div>
<div class="row media-kit-logo-title pt-5">Logo Usage Crimes</div>
<div class="row d-flex justify-content-center pt-5">
<div class="col-auto">
<img src="../assets/img/logo-wrong-use-1.jpg" width="288" height="122">
<div class="col-auto d-flex justify-content-center pt-4"><i class="far fa-lg fa-times-circle"></i>
</div>
</div>
<div class="col-auto">
<img src="../assets/img/logo-wrong-use-2.jpg" width="288" height="122">
<div class="col-auto d-flex justify-content-center pt-4"><i class="far fa-lg fa-times-circle"></i>
</div>
</div>
<div class="col-auto">
<img src="../assets/img/logo-wrong-use-3.jpg" width="288" height="122">
<div class="col-auto d-flex justify-content-center pt-4"><i class="far fa-lg fa-times-circle"></i>
</div>
</div>
<div class="col-auto">
<img src="../assets/img/logo-2.png" width="570" height="283">
<div class="row pr-4">
<a href="../assets/media-kit/argos-logo-white.svg">
<div class="col-auto ml-auto pt-4"><i class="fas fa-lg fa-download"></i>SVG
</a></div>
<a href="../assets/media-kit/argos-logo-white.png">
<div class="col-auto pt-4"><i class="fas fa-lg fa-download"></i>PNG
</a>
</div>
</div>
</div>
</div>
<div class="row media-kit-logo-title pt-5">Logo Usage Crimes</div>
<div class="row d-flex justify-content-center pt-5">
<div class="col-auto">
<img src="../assets/img/logo-wrong-use-1.jpg" width="288" height="122">
<div class="col-auto d-flex justify-content-center pt-4"><i class="far fa-lg fa-times-circle"></i>
</div>
</div>
<div class="col-auto">
<img src="../assets/img/logo-wrong-use-2.jpg" width="288" height="122">
<div class="col-auto d-flex justify-content-center pt-4"><i class="far fa-lg fa-times-circle"></i>
</div>
</div>
<div class="col-auto">
<img src="../assets/img/logo-wrong-use-3.jpg" width="288" height="122">
<div class="col-auto d-flex justify-content-center pt-4"><i class="far fa-lg fa-times-circle"></i>
</div>
</div>
</div>
</div>
</section>
<!-- Moo Cards -->
@ -143,8 +167,10 @@
</div>
</div>
<div class="row d-flex justify-content-center">
<div class="col-auto pt-4"><a href="../assets/media-kit/moo-card-svg.zip"><i class="fas fa-lg fa-download"></i>SVG</a></div>
<div class="col-auto pt-4"><a href="../assets/media-kit/moo-card-png.zip"><i class="fas fa-lg fa-download"></i>PNG</a></div>
<div class="col-auto pt-4"><a href="../assets/media-kit/moo-card-svg.zip"><i
class="fas fa-lg fa-download"></i>SVG</a></div>
<div class="col-auto pt-4"><a href="../assets/media-kit/moo-card-png.zip"><i
class="fas fa-lg fa-download"></i>PNG</a></div>
</div>
</div>
</section>
@ -156,7 +182,7 @@
<img src="../assets/img/argos-logo - Copy.svg" width="98" height="37">
</div>
<div class="col-auto">
<div class="footer-text">OpenAIRE-Advance receives funding from the European Union's Horizon 2020
<div class="footer-text">ARGOS receives funding from the European Union's Horizon 2020
Research and Innovation programme under Grant Agreement No. 777541.</div>
</div>
<div class="col-auto">
@ -167,34 +193,48 @@
</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="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>
<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="https://www.openaire.eu/newsletter/listing"><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">Terms and conditions</a>
<a class="col conditions-policy" href="/cookies-policy">Cookies policy</a>
<a class="col-auto conditions-policy" href="/opensource-licences">Οpensource licences</a>
<a class="col-auto conditions-policy" href="/terms-and-conditions">Terms and conditions</a>
<a class="col-auto 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><a href="https://creativecommons.org/licenses/by/4.0/">ATTRIBUTION 4.0 INTERNATIONAL LICENSE.</a></u></div>
<div><u><a class="licence" 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>

View File

@ -9,14 +9,17 @@
<!-- 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">
@ -24,7 +27,9 @@
<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">
@ -35,6 +40,7 @@
<a href="../about/how-it-works.html">How it works</a>
<a href="https://trello.com/b/x49lylnK/argos" target="_blank">Roadmap</a>
<a href="../about/faqs.html">faqs</a>
<a href="../about/contributors.html">Contributors</a>
</div>
</div>
</li>
@ -68,16 +74,19 @@
</div>
<div class="col">
<p>
Become proficient in using Argos by following the User Guide. Check presentation for additional hints and leave your thoughts for improvements in the feedback form.
<ul>
<li><a href="/user-guide">User Guide</a></li>
<li><a href="../assets/presentations/argos.pdf">Presentations</a></li>
<li><a href="https://docs.google.com/forms/d/1KNhgjQyGrA6lYjOOUUL5cqU2BVquS0qdfwzOGxokgAw">Feedback Form</a></li>
</ul>
Become proficient in using Argos by following the User Guide. Check presentation for additional
hints and leave your thoughts for improvements in the feedback form.
</p>
<ul class="list mb-5">
<li><a href="/user-guide">User Guide</a></li>
<li><a href="../assets/presentations/argos.pdf">Presentations</a></li>
<li><a href="https://docs.google.com/forms/d/1KNhgjQyGrA6lYjOOUUL5cqU2BVquS0qdfwzOGxokgAw">Feedback
Form</a></li>
</ul>
</div>
<div class="col d-flex justify-content-center mb-5 pb-5">
<a href="/user-guide"><button class="normal-btn">View User Guide Online</button></a>
</div>
<div class="col d-flex justify-content-center"><a href="/user-guide"><button class="normal-btn">View User Guide
Online</button></a></div>
</div>
</section>
<!-- Footer-->
@ -88,7 +97,7 @@
<img src="../assets/img/argos-logo - Copy.svg" width="98" height="37">
</div>
<div class="col-auto">
<div class="footer-text">OpenAIRE-Advance receives funding from the European Union's Horizon 2020
<div class="footer-text">ARGOS receives funding from the European Union's Horizon 2020
Research and Innovation programme under Grant Agreement No. 777541..</div>
</div>
<div class="col-auto">
@ -99,33 +108,47 @@
</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="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>
<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="https://www.openaire.eu/newsletter/listing"><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">Terms and conditions</a>
<a class="col conditions-policy" href="/cookies-policy">Cookies policy</a>
<a class="col-auto conditions-policy" href="/opensource-licences">Οpensource licences</a>
<a class="col-auto conditions-policy" href="/terms-and-conditions">Terms and conditions</a>
<a class="col-auto 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><a href="https://creativecommons.org/licenses/by/4.0/">ATTRIBUTION 4.0 INTERNATIONAL LICENSE.</a></u></div>
<div><u><a class="licence" href="https://creativecommons.org/licenses/by/4.0/">CC 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

@ -0,0 +1,47 @@
-- Angular
https://github.com/angular/angular/blob/master/LICENSE
-- NGX-Translate
https://github.com/ngx-translate/core/blob/master/LICENSE
-- Swimlane
https://github.com/swimlane/ngx-datatable/blob/master/LICENSE
-- TinyMCE
https://github.com/tinymce/tinymce/blob/develop/LICENSE.TXT
-- W11K GmbH
https://github.com/w11k/angular-sticky-things/blob/master/LICENSE
-- Bootstrap
https://github.com/twbs/bootstrap/blob/main/LICENSE
-- Cookie Consent
https://github.com/osano/cookieconsent/blob/dev/LICENSE
-- Core-js
https://github.com/zloirock/core-js/blob/master/LICENSE
-- File Saver
https://github.com/eligrey/FileSaver.js/blob/master/LICENSE.md
-- Moment
https://github.com/moment/moment/blob/develop/LICENSE
-- Ngx-Cookie-Service
https://github.com/stevermeister/ngx-cookie-service/blob/master/LICENSE
-- Ngx-cookieconsent
https://github.com/tinesoft/ngx-cookieconsent/blob/master/LICENSE
-- Rxjs
https://github.com/ReactiveX/rxjs/blob/master/LICENSE.txt
-- Tslib
https://github.com/microsoft/tslib/blob/master/LICENSE.txt
-- Web-animations-js
https://github.com/web-animations/web-animations-js/blob/dev/COPYING
-- Zone.js
https://github.com/angular/zone.js/blob/master/LICENSE