diff --git a/dmp-backend/web/src/main/java/eu/eudat/controllers/DMPs.java b/dmp-backend/web/src/main/java/eu/eudat/controllers/DMPs.java index 770550796..6bf522700 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/controllers/DMPs.java +++ b/dmp-backend/web/src/main/java/eu/eudat/controllers/DMPs.java @@ -11,10 +11,12 @@ import eu.eudat.data.query.items.table.dmp.DataManagementPlanTableRequest; import eu.eudat.exceptions.datamanagementplan.DMPWithDatasetsDeleteException; import eu.eudat.logic.managers.DataManagementPlanManager; import eu.eudat.logic.managers.DatasetManager; +import eu.eudat.logic.managers.FileManager; 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.dmp.DataManagementPlan; +import eu.eudat.models.data.files.ContentFile; import eu.eudat.models.data.helpermodels.Tuple; import eu.eudat.models.data.helpers.common.DataTableData; import eu.eudat.models.data.helpers.responses.ResponseItem; @@ -30,9 +32,11 @@ 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.activation.MimetypesFileTypeMap; import javax.validation.Valid; +import javax.xml.bind.JAXBException; import java.io.File; import java.io.FileInputStream; import java.io.IOException; @@ -172,5 +176,12 @@ public class DMPs extends BaseController { responseHeaders, HttpStatus.OK); } + + @RequestMapping(method = RequestMethod.POST, value = {"/upload"}) + public ResponseEntity dmpXmlUpload(@RequestParam("file") MultipartFile[] files, Principal principal) throws IOException, JAXBException, Exception { + this.dataManagementPlanManager.createDmpFromXml(this.getApiContext(), files, principal); + return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem() + .status(ApiMessageCode.SUCCESS_MESSAGE).message("Bravo Giorgo")); + } } diff --git a/dmp-backend/web/src/main/java/eu/eudat/controllers/FileController.java b/dmp-backend/web/src/main/java/eu/eudat/controllers/FileController.java index f41b5e6ab..b597cb8da 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/controllers/FileController.java +++ b/dmp-backend/web/src/main/java/eu/eudat/controllers/FileController.java @@ -49,5 +49,4 @@ public class FileController extends BaseController { .header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + resource.getFilename() + "." + type + "\"") .body(resource); } - } diff --git a/dmp-backend/web/src/main/java/eu/eudat/controllers/QuickWizardController.java b/dmp-backend/web/src/main/java/eu/eudat/controllers/QuickWizardController.java index 4b6e8e37a..d1589a1eb 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/controllers/QuickWizardController.java +++ b/dmp-backend/web/src/main/java/eu/eudat/controllers/QuickWizardController.java @@ -16,21 +16,24 @@ import eu.eudat.models.data.quickwizard.DatasetCreateWizardModel; import javax.transaction.Transactional; import javax.validation.Valid; + @RestController @CrossOrigin @RequestMapping(value = {"/api/quick-wizard/"}) public class QuickWizardController extends BaseController { private QuickWizardManager quickWizardManager; + private ProjectManager projectManager; private DatasetManager datasetManager; @Autowired - public QuickWizardController(ApiContext apiContext, QuickWizardManager quickWizardManager,DatasetManager datasetManager) { + public QuickWizardController(ApiContext apiContext, QuickWizardManager quickWizardManager, DatasetManager datasetManager, ProjectManager projectManager) { super(apiContext); this.quickWizardManager = quickWizardManager; this.datasetManager = datasetManager; + this.projectManager = projectManager; } @@ -38,7 +41,33 @@ public class QuickWizardController extends BaseController { @RequestMapping(method = RequestMethod.POST, consumes = "application/json", produces = "application/json") public @ResponseBody ResponseEntity> addQuickWizardModel(@Valid @RequestBody QuickWizardModel quickWizard, Principal principal) throws Exception { - this.quickWizardManager.createOrUpdate(quickWizard, principal); + eu.eudat.data.entities.Project projectEntity; + //Create Project + if (quickWizard.getProject().getExistProject() == null) { + projectEntity = this.quickWizardManager.createOrUpdate(quickWizard.getProject().toDataProject(), principal); + } else { + projectEntity = quickWizard.getProject().getExistProject().toDataModel(); + } + //Create Dmp + eu.eudat.data.entities.DMP dmpEntity = this.quickWizardManager.createOrUpdate( + quickWizard.getDmp().toDataDmp( + this.getApiContext().getOperationsContext().getDatabaseRepository().getUserInfoDao(), + projectEntity, + principal), + principal); + + //Create Datasets + quickWizard.getDmp().setId(dmpEntity.getId()); + for (DatasetDescriptionQuickWizardModel dataset : quickWizard.getDatasets().getDatasetsList()) { + this.datasetManager.createOrUpdate(dataset.toDataModel(quickWizard.getDmp().toDataDmp( + this.getApiContext().getOperationsContext().getDatabaseRepository().getUserInfoDao(), + projectEntity, + principal), + quickWizard.getDmp().getDatasetProfile().getId()), + principal); + } + + return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem().status(ApiMessageCode.SUCCESS_MESSAGE).message("Created")); } diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DataManagementPlanManager.java b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DataManagementPlanManager.java index cfdd6cc88..e3970b381 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DataManagementPlanManager.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DataManagementPlanManager.java @@ -5,6 +5,8 @@ import eu.eudat.configurations.dynamicproject.entities.Property; import eu.eudat.data.dao.criteria.*; import eu.eudat.data.dao.entities.*; import eu.eudat.data.entities.*; +import eu.eudat.data.entities.Organisation; +import eu.eudat.data.entities.Researcher; import eu.eudat.data.query.items.item.dmp.DataManagementPlanCriteriaRequest; import eu.eudat.data.query.items.table.dmp.DataManagementPlanTableRequest; import eu.eudat.exceptions.datamanagementplan.DMPWithDatasetsDeleteException; @@ -21,8 +23,7 @@ import eu.eudat.logic.utilities.documents.word.WordBuilder; import eu.eudat.logic.utilities.documents.xml.ExportXmlBuilder; import eu.eudat.models.HintedModelFactory; import eu.eudat.models.data.datasetwizard.DatasetWizardModel; -import eu.eudat.models.data.dmp.DataManagementPlan; -import eu.eudat.models.data.dmp.DataManagementPlanNewVersionModel; +import eu.eudat.models.data.dmp.*; import eu.eudat.models.data.dynamicfields.DynamicFieldWithValue; import eu.eudat.models.data.helpermodels.Tuple; import eu.eudat.models.data.helpers.common.DataTableData; @@ -38,10 +39,16 @@ import org.springframework.core.env.Environment; import org.springframework.http.*; import org.springframework.stereotype.Component; import org.springframework.web.client.RestTemplate; +import org.springframework.web.multipart.MultipartFile; import org.w3c.dom.Document; import org.w3c.dom.Element; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; import javax.activation.MimetypesFileTypeMap; +import javax.xml.bind.JAXBContext; +import javax.xml.bind.JAXBException; +import javax.xml.bind.Unmarshaller; import java.io.*; import java.math.BigInteger; import java.net.URL; @@ -126,12 +133,21 @@ public class DataManagementPlanManager { wordBuilder.addParagraphContent(dmpEntity.getDescription(), document, ParagraphStyle.TEXT, BigInteger.ZERO); wordBuilder.addParagraphContent("Organisations", document, ParagraphStyle.HEADER2, BigInteger.ZERO); - wordBuilder.addParagraphContent(dmpEntity.getOrganisations().stream().map(x -> x.getLabel()).collect(Collectors.joining(",")) - , document, ParagraphStyle.TEXT, BigInteger.ZERO); + if (dmpEntity.getOrganisations().size() > 0) { + wordBuilder.addParagraphContent(dmpEntity.getOrganisations().stream().map(x -> x.getLabel()).collect(Collectors.joining(", ")) + , document, ParagraphStyle.TEXT, BigInteger.ZERO); + } wordBuilder.addParagraphContent("Researchers", document, ParagraphStyle.HEADER2, BigInteger.ZERO); - wordBuilder.addParagraphContent(dmpEntity.getResearchers().stream().map(x -> x.getLabel()).collect(Collectors.joining(",")) - , document, ParagraphStyle.TEXT, BigInteger.ZERO); + if (dmpEntity.getResearchers().size() > 0) { + wordBuilder.addParagraphContent(dmpEntity.getResearchers().stream().map(x -> x.getLabel()).collect(Collectors.joining(", ")) + , document, ParagraphStyle.TEXT, BigInteger.ZERO); + } + + /*wordBuilder.addParagraphContent("DMP Profile", document, ParagraphStyle.HEADER2, BigInteger.ZERO); + if (dmpEntity.getProfile() != null){ + wordBuilder.addParagraphContent(dmpEntity.getProfile().getLabel(), document, ParagraphStyle.TEXT, BigInteger.ZERO); + }*/ wordBuilder.addParagraphContent("Datasets", document, ParagraphStyle.TITLE, BigInteger.ZERO); dmpEntity.getDataset().stream().forEach(datasetEntity -> { @@ -152,7 +168,9 @@ public class DataManagementPlanManager { e.printStackTrace(); } }); - File exportFile = new File(dmpEntity.getLabel() + ".docx"); + String fileName = dmpEntity.getLabel(); + fileName = fileName.replaceAll("[^a-zA-Z0-9+ ]", ""); + File exportFile = new File( fileName + ".docx"); FileOutputStream out = new FileOutputStream(exportFile); document.write(out); out.close(); @@ -341,7 +359,6 @@ public class DataManagementPlanManager { } } - private void copyDatasets(DMP newDmp, DatasetDao datasetDao) { List> futures = new LinkedList<>(); for (Dataset dataset : newDmp.getDataset()) { @@ -407,32 +424,62 @@ public class DataManagementPlanManager { VisibilityRuleService visibilityRuleService = utilitiesService.getVisibilityRuleService(); eu.eudat.data.entities.DMP dmp = databaseRepository.getDmpDao().find(UUID.fromString(id)); List datasets = dmp.getDataset().stream().collect(Collectors.toList()); - File xmlFile = new File(dmp.getLabel() + ".xml"); + String fileName = dmp.getLabel(); + fileName = fileName.replaceAll("[^a-zA-Z0-9+ ]", ""); + File xmlFile = new File(fileName + ".xml"); BufferedWriter writer = new BufferedWriter(new FileWriter(xmlFile, true)); Document xmlDoc = XmlBuilder.getDocument(); - Element root = xmlDoc.createElement("root"); Element dmpElement = xmlDoc.createElement("dmp"); + Element dmpDescription = xmlDoc.createElement("description"); + dmpDescription.setTextContent(dmp.getDescription()); + dmpElement.appendChild(dmpDescription); Element dmpName = xmlDoc.createElement("dmpName"); dmpName.setTextContent(dmp.getLabel()); dmpElement.appendChild(dmpName); - Element projectName = xmlDoc.createElement("projectName"); - projectName.setTextContent(dmp.getProject().getLabel()); - dmpElement.appendChild(projectName); + + DMPProfile dmpProfile = dmp.getProfile(); + Element dmpProfileElement = xmlDoc.createElement("dmpProfile"); + Element dmpProfileName = xmlDoc.createElement("dmpProfileName"); + if (!(dmpProfile == null)){ + dmpProfileName.setTextContent(dmpProfile.getLabel()); + dmpProfileElement.appendChild(dmpProfileName); + Element dmpProfileId = xmlDoc.createElement("dmpProfileId"); + dmpProfileId.setTextContent(dmpProfile.getId().toString()); + dmpProfileElement.appendChild(dmpProfileId); + } + dmpElement.appendChild(dmpProfileElement); + + Element project = xmlDoc.createElement("project"); + Element label = xmlDoc.createElement("label"); + label.setTextContent(dmp.getProject().getLabel()); + project.appendChild(label); + Element projectId = xmlDoc.createElement("id"); + projectId.setTextContent(dmp.getProject().getId().toString()); + project.appendChild(projectId); + dmpElement.appendChild(project); Element organisationsElement = xmlDoc.createElement("organisations"); for (Organisation organisation : dmp.getOrganisations()) { Element organisationElement = xmlDoc.createElement("organisation"); - organisationElement.setAttribute("name", organisation.getLabel()); - organisationElement.setAttribute("reference", organisation.getReference()); + Element organisationNameElement = xmlDoc.createElement("name"); + organisationNameElement.setTextContent(organisation.getLabel()); + Element organisationReferenceElement = xmlDoc.createElement("reference"); + organisationReferenceElement.setTextContent(organisation.getReference()); + organisationElement.appendChild(organisationNameElement); + organisationElement.appendChild(organisationReferenceElement); organisationsElement.appendChild(organisationElement); } dmpElement.appendChild(organisationsElement); Element researchersElement = xmlDoc.createElement("researchers"); for (Researcher researcher : dmp.getResearchers()) { - Element researcherElement = xmlDoc.createElement("organisation"); - researcherElement.setAttribute("name", researcher.getLabel()); - researcherElement.setAttribute("reference", researcher.getReference()); - organisationsElement.appendChild(researcherElement); + Element researcherElement = xmlDoc.createElement("researcher"); + Element researcherNameElement = xmlDoc.createElement("name"); + researcherNameElement.setTextContent(researcher.getLabel()); + Element researcherReferenceElement = xmlDoc.createElement("reference"); + researcherReferenceElement.setTextContent(researcher.getReference()); + researcherElement.appendChild(researcherNameElement); + researcherElement.appendChild(researcherReferenceElement); + researchersElement.appendChild(researcherElement); } dmpElement.appendChild(researchersElement); Element datasetsElement = xmlDoc.createElement("datasets"); @@ -452,9 +499,33 @@ public class DataManagementPlanManager { datasetElement.appendChild(xmlBuilder.createPages(pagedDatasetProfile.getPages(), visibilityRuleService, xmlDoc)); datasetsElement.appendChild(datasetElement); } + Element profiles = xmlDoc.createElement("profiles"); + // Get DatasetProfiles from dmp to add to XML. + if (dmp.getAssociatedDmps() != null && !dmp.getAssociatedDmps().isEmpty()) { + Document viewStyleDoc = XmlBuilder.fromXml(dmp.getAssociatedDmps()); + Element item = (Element) viewStyleDoc.getElementsByTagName("profiles").item(0); + if (item != null) { + NodeList associatedProfilesElement = item.getChildNodes(); + for (int temp = 0; temp < associatedProfilesElement.getLength(); temp++) { + Node associatedProfileElement = associatedProfilesElement.item(temp); + if (associatedProfileElement.getNodeType() == Node.ELEMENT_NODE) { + Element profile = xmlDoc.createElement("profile"); + Element profileLabel = xmlDoc.createElement("profilelabel"); + Node labelNode = associatedProfileElement.getAttributes().item(0); + profileLabel.setTextContent(labelNode.getNodeValue()); + profile.appendChild(profileLabel); + Element profileId = xmlDoc.createElement("profileId"); + Node idNode = associatedProfileElement.getAttributes().item(1); + profileId.setTextContent(idNode.getNodeValue()); + profile.appendChild(profileId); + profiles.appendChild(profile); + } + } + } + } + dmpElement.appendChild(profiles); dmpElement.appendChild(datasetsElement); - root.appendChild(dmpElement); - xmlDoc.appendChild(root); + xmlDoc.appendChild(dmpElement); String xml = XmlBuilder.generateXml(xmlDoc); writer.write(xml); writer.close(); @@ -496,4 +567,65 @@ public class DataManagementPlanManager { responseHeaders, HttpStatus.OK); } + + public List createDmpFromXml( ApiContext apiContext, MultipartFile[] files, Principal principal) throws IOException, JAXBException, Exception { + List dataManagementPlans = new ArrayList<>(); + // Jaxb approach. + JAXBContext jaxbContext; + + for (MultipartFile multipartFile : Arrays.asList(files)){ // Gets one item from the array. + try{ + InputStream in = multipartFile.getInputStream(); // Transforms item to InputStream. + jaxbContext = JAXBContext.newInstance(DmpImportModel.class); + Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller(); + DmpImportModel dmpImportModel = (DmpImportModel)jaxbUnmarshaller.unmarshal(in); + System.out.println(dmpImportModel.getDmpNameImport()); + dataManagementPlans.add(dmpImportModel); + } + catch (IOException | JAXBException ex){ + ex.printStackTrace(); + } + // TODO Iterate through the list of dataManagmentPlans. + // Creates new dataManagmentPlan to fill it with the data model that was parsed from the xml. + // Creates properties. + DataManagementPlan dm = new DataManagementPlan(); + Tuple tuple = new Tuple(); + tuple.setId(dataManagementPlans.get(0).getDmpProfile().getDmpProfileId()); + tuple.setLabel(dataManagementPlans.get(0).getDmpProfile().getDmpProfileName()); + eu.eudat.models.data.project.Project project = new eu.eudat.models.data.project.Project(); + ProjectImportModels projectImport = dataManagementPlans.get(0).getProjectImport(); + project.setId(projectImport.getId()); + project.setLabel(projectImport.getLabel()); + project.setAbbreviation(projectImport.getAbbreviation()); + project.setDescription(projectImport.getDescription()); + List associatedProfiles = new LinkedList<>(); + for(AssociatedProfileImportModels a : dataManagementPlans.get(0).getProfilesImportModels()) { + AssociatedProfile associatedProfile = new AssociatedProfile(); + associatedProfile.setId(a.getId()); + associatedProfile.setLabel(a.getLabel()); + associatedProfiles.add(associatedProfile); + } + List< eu.eudat.models.data.dmp.Organisation > organisations = new ArrayList<>(); + List researchers = new LinkedList<>(); + List associatedUsers = new LinkedList<>(); + List dynamicFields = new LinkedList<>(); + + // Sets properties. + dm.setLabel(files[0].getOriginalFilename()); // Sets label. + dm.setProject(project); //Sets project property. + dm.setDescription(dataManagementPlans.get(0).getDescriptionImport()); // Sets description property. + dm.setProfiles(associatedProfiles); + dm.setOrganisations(organisations); // Sets organisations property. + dm.setResearchers(researchers); // Sets researchers property. + dm.setAssociatedUsers(associatedUsers); // Sets associatedUsers property. + dm.setDynamicFields(dynamicFields); // Sets dynamicFields property. + dm.setProfile(tuple); + + createOrUpdate(apiContext, dm, principal); + + System.out.println(dm); + } + + return dataManagementPlans; + } } diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/QuickWizardManager.java b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/QuickWizardManager.java index b2ab4d993..7cb5f7f15 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/QuickWizardManager.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/QuickWizardManager.java @@ -1,8 +1,10 @@ package eu.eudat.logic.managers; -import eu.eudat.data.entities.DMP; -import eu.eudat.data.entities.Project; -import eu.eudat.data.entities.UserInfo; +import eu.eudat.data.dao.criteria.ProjectCriteria; +import eu.eudat.data.dao.entities.ContentDao; +import eu.eudat.data.dao.entities.ProjectDao; +import eu.eudat.data.dao.entities.UserInfoDao; +import eu.eudat.data.entities.*; import eu.eudat.logic.services.ApiContext; import eu.eudat.logic.services.helpers.FileStorageService; import eu.eudat.logic.services.operations.DatabaseRepository; @@ -19,45 +21,46 @@ import java.text.ParseException; @Component public class QuickWizardManager { - private ApiContext apiContext; - private DatabaseRepository databaseRepository; - private FileStorageService fileStorageService; - private DatasetManager datasetManager; + private ApiContext apiContext; + private DatabaseRepository databaseRepository; - @Autowired - public QuickWizardManager(ApiContext apiContext, DatasetManager datasetManager) { - this.apiContext = apiContext; - this.databaseRepository = apiContext.getOperationsContext().getDatabaseRepository(); - this.fileStorageService = apiContext.getOperationsContext().getFileStorageService(); - } + @Autowired + public QuickWizardManager(ApiContext apiContext) { + this.apiContext = apiContext; + this.databaseRepository = apiContext.getOperationsContext().getDatabaseRepository(); + } - public void createOrUpdate(QuickWizardModel quickWizard, Principal principal) throws Exception { - //Create Project - eu.eudat.data.entities.Project projectEntity = createOrUpdate(quickWizard.getProject().toDataProject(), principal); + public Project createOrUpdate(eu.eudat.models.data.project.Project project, Principal principal) throws ParseException, IOException { + eu.eudat.data.entities.Project projectEntity = project.toDataModel(); + projectEntity.setType(eu.eudat.data.entities.Project.ProjectType.INTERNAL.getValue()); + projectEntity.setCreationUser(databaseRepository.getUserInfoDao().find(principal.getId())); + Project projectEntityRet = databaseRepository.getProjectDao().createOrUpdate(projectEntity); + return projectEntityRet; + } - //Create Dmp - eu.eudat.data.entities.DMP dmpEntity = createOrUpdate(quickWizard.getDmp().toDataDmp(projectEntity), principal); + public DMP createOrUpdate(DataManagementPlan dataManagementPlan, Principal principal) throws Exception { + DMP newDmp = dataManagementPlan.toDataModel(); + UserInfo user = apiContext.getOperationsContext().getDatabaseRepository().getUserInfoDao().find(principal.getId()); + createProjectIfItDoesntExist(newDmp, user); + newDmp.setCreator(user); + DMP dmpret = apiContext.getOperationsContext().getDatabaseRepository().getDmpDao().createOrUpdate(newDmp); + return dmpret; + } - //Create Datasets - quickWizard.getDmp().setId(dmpEntity.getId()); - for(DatasetDescriptionQuickWizardModel dataset : quickWizard.getDatasets().getDatasetsList()){ - this.datasetManager.createOrUpdate(dataset.toDataModel(quickWizard.getDmp().toDataDmp(projectEntity),quickWizard.getDmp().getDatasetProfile().getId()), principal); - } - } - private Project createOrUpdate(eu.eudat.models.data.project.Project project, Principal principal) throws ParseException, IOException { - eu.eudat.data.entities.Project projectEntity = project.toDataModel(); - projectEntity.setType(eu.eudat.data.entities.Project.ProjectType.INTERNAL.getValue()); - projectEntity.setCreationUser(databaseRepository.getUserInfoDao().find(principal.getId())); - Project projectEntityRet = databaseRepository.getProjectDao().createOrUpdate(projectEntity); - return projectEntityRet; - } + private void createProjectIfItDoesntExist(DMP newDmp, UserInfo userInfo) { + if (newDmp.getProject() != null) { + Project project = newDmp.getProject(); + ProjectCriteria criteria = new ProjectCriteria(); + criteria.setReference(project.getReference()); + eu.eudat.data.entities.Project projectEntity = databaseRepository.getProjectDao().getWithCriteria(criteria).getSingleOrDefault(); + if (projectEntity != null) project.setId(projectEntity.getId()); + else { + project.setType(Project.ProjectType.EXTERNAL.getValue()); + databaseRepository.getProjectDao().createOrUpdate(project); + } + } + } + - private DMP createOrUpdate(DataManagementPlan dataManagementPlan, Principal principal) throws Exception { - DMP newDmp = dataManagementPlan.toDataModel(); - UserInfo user = apiContext.getOperationsContext().getDatabaseRepository().getUserInfoDao().find(principal.getId()); - newDmp.setCreator(user); - DMP dmpret = apiContext.getOperationsContext().getDatabaseRepository().getDmpDao().createOrUpdate(newDmp); - return dmpret; - } } diff --git a/dmp-backend/web/src/main/java/eu/eudat/models/data/dmp/AssociatedProfileImportModels.java b/dmp-backend/web/src/main/java/eu/eudat/models/data/dmp/AssociatedProfileImportModels.java new file mode 100644 index 000000000..25c0f6ffd --- /dev/null +++ b/dmp-backend/web/src/main/java/eu/eudat/models/data/dmp/AssociatedProfileImportModels.java @@ -0,0 +1,19 @@ +package eu.eudat.models.data.dmp; + +import java.util.UUID; +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlRootElement; + +@XmlRootElement(name = "profile") +public class AssociatedProfileImportModels { + private UUID id; + private String label; + + @XmlElement(name = "profileId") + public UUID getId() { return id; } + public void setId(UUID id) { this.id = id; } + + @XmlElement(name = "profilelabel") + public String getLabel() { return label; } + public void setLabel(String label) { this.label = label; } +} diff --git a/dmp-backend/web/src/main/java/eu/eudat/models/data/dmp/DatasetImportModels.java b/dmp-backend/web/src/main/java/eu/eudat/models/data/dmp/DatasetImportModels.java new file mode 100644 index 000000000..5d1b87380 --- /dev/null +++ b/dmp-backend/web/src/main/java/eu/eudat/models/data/dmp/DatasetImportModels.java @@ -0,0 +1,9 @@ +package eu.eudat.models.data.dmp; + +import javax.xml.bind.annotation.XmlRootElement; + +@XmlRootElement(name = "dataset") +public class DatasetImportModels { + + private String name; +} diff --git a/dmp-backend/web/src/main/java/eu/eudat/models/data/dmp/DmpImportModel.java b/dmp-backend/web/src/main/java/eu/eudat/models/data/dmp/DmpImportModel.java new file mode 100644 index 000000000..1a316db06 --- /dev/null +++ b/dmp-backend/web/src/main/java/eu/eudat/models/data/dmp/DmpImportModel.java @@ -0,0 +1,98 @@ +package eu.eudat.models.data.dmp; + +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlElementWrapper; +import javax.xml.bind.annotation.XmlRootElement; +import java.util.List; + +@XmlRootElement(name = "dmp") +public class DmpImportModel { + private String description; + private String dmpName; + private DmpProfileImportModel profile; + private ProjectImportModels projectImportModels; + private List profilesImportModels; + private List organisationImportModels; + private List researchersImportModels; + private List associatedUsersImportModels; + private List dynamicFieldsImportModels; + private List datasetImportModels; + + @XmlElement(name = "description") + public String getDescriptionImport() { + return description; + } + public void setDescriptionImport(String description) { + this.description = description; + } + + @XmlElement(name = "dmpName") + public String getDmpNameImport() { + return dmpName; + } + public void setDmpNameImport(String dmpName) { + this.dmpName = dmpName; + } + + @XmlElement(name = "dmpProfile") + public DmpProfileImportModel getDmpProfile() { return profile; } + public void setDmpProfile(DmpProfileImportModel profile) { this.profile = profile; } + + @XmlElement(name = "project") + public ProjectImportModels getProjectImport() { + return projectImportModels; + } + public void setProjectImport(ProjectImportModels projectImportModels) { + this.projectImportModels = projectImportModels; + } + + @XmlElementWrapper(name="organisations") + @XmlElement(name = "organisation") + public List getOrganisationImportModels() { + return organisationImportModels; + } + public void setOrganisationImportModels(List organisationImportModels) { + this.organisationImportModels = organisationImportModels; + } + + @XmlElementWrapper(name="profiles") + @XmlElement(name = "profile") + public List getProfilesImportModels() { + return profilesImportModels; + } + public void setProfilesImportModels(List profilesImportModels) { + this.profilesImportModels = profilesImportModels; + } + + @XmlElementWrapper(name="researchers") + @XmlElement(name = "researcher") + public List getResearchersImportModels() { + return researchersImportModels; + } + public void setResearchersImportModels(List researchersImportModels) { + this.researchersImportModels = researchersImportModels; + } + + @XmlElementWrapper(name="UserInfos") + @XmlElement(name = "UserInfo") + public List getAssociatedUsersImportModels() { + return associatedUsersImportModels; + } + public void setAssociatedUsersImportModels(List associatedUsersImportModels) { + this.associatedUsersImportModels = associatedUsersImportModels; + } + + @XmlElementWrapper(name="dynamicFieldWithValues") + @XmlElement(name = "dynamicFieldWithValue") + public List getDynamicFieldsImportModels() { + return dynamicFieldsImportModels; + } + public void setDynamicFieldsImportModels(List dynamicFieldsImportModels) { + this.dynamicFieldsImportModels = dynamicFieldsImportModels; + } + + @XmlElementWrapper(name="datasets") + @XmlElement(name = "dataset") + public List getDatasetImportModels() { return datasetImportModels; } + public void setDatasetImportModels(List datasetImportModels) { this.datasetImportModels = datasetImportModels; } +} diff --git a/dmp-backend/web/src/main/java/eu/eudat/models/data/dmp/DmpProfileImportModel.java b/dmp-backend/web/src/main/java/eu/eudat/models/data/dmp/DmpProfileImportModel.java new file mode 100644 index 000000000..b507ac55a --- /dev/null +++ b/dmp-backend/web/src/main/java/eu/eudat/models/data/dmp/DmpProfileImportModel.java @@ -0,0 +1,21 @@ +package eu.eudat.models.data.dmp; + +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlRootElement; +import java.util.UUID; + +@XmlRootElement(name = "dmpProfile") +public class DmpProfileImportModel { + + private String dmpProfileName; + private UUID dmpProfileId; + + @XmlElement(name = "dmpProfileName") + public String getDmpProfileName() { return dmpProfileName; } + public void setDmpProfileName(String dmpProfileName) { this.dmpProfileName = dmpProfileName; } + + @XmlElement(name = "dmpProfileId") + public UUID getDmpProfileId() { return dmpProfileId; } + public void setDmpProfileId(UUID dmpProfileId) { this.dmpProfileId = dmpProfileId; } + +} diff --git a/dmp-backend/web/src/main/java/eu/eudat/models/data/dmp/DynamicFieldWithValueImportModels.java b/dmp-backend/web/src/main/java/eu/eudat/models/data/dmp/DynamicFieldWithValueImportModels.java new file mode 100644 index 000000000..faa8ac455 --- /dev/null +++ b/dmp-backend/web/src/main/java/eu/eudat/models/data/dmp/DynamicFieldWithValueImportModels.java @@ -0,0 +1,7 @@ +package eu.eudat.models.data.dmp; + +import javax.xml.bind.annotation.XmlRootElement; + +@XmlRootElement(name = "dynamicFieldWithValue") +public class DynamicFieldWithValueImportModels { +} diff --git a/dmp-backend/web/src/main/java/eu/eudat/models/data/dmp/OrganisationImportModel.java b/dmp-backend/web/src/main/java/eu/eudat/models/data/dmp/OrganisationImportModel.java new file mode 100644 index 000000000..015ed47a8 --- /dev/null +++ b/dmp-backend/web/src/main/java/eu/eudat/models/data/dmp/OrganisationImportModel.java @@ -0,0 +1,35 @@ +package eu.eudat.models.data.dmp; + +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlRootElement; + +@XmlRootElement(name = "organisation") +public class OrganisationImportModel { + private String source; + private String name; + private String id; + + @XmlElement(name = "source") + public String getOrganaisationSourceImport() { + return source; + } + public void setOrganaisationSourceImport(String source) { + this.source = source; + } + + @XmlElement(name = "name") + public String getOrganaisationNameImport() { + return name; + } + public void setOrganaisationNameImport(String name) { + this.name = name; + } + + @XmlElement(name = "id") + public String getOrganaisationIdImport() { + return id; + } + public void setOrganaisationIdImport(String id) { + this.id = id; + } +} diff --git a/dmp-backend/web/src/main/java/eu/eudat/models/data/dmp/ProjectImportModels.java b/dmp-backend/web/src/main/java/eu/eudat/models/data/dmp/ProjectImportModels.java new file mode 100644 index 000000000..f7ea3f304 --- /dev/null +++ b/dmp-backend/web/src/main/java/eu/eudat/models/data/dmp/ProjectImportModels.java @@ -0,0 +1,40 @@ +package eu.eudat.models.data.dmp; + +import javax.xml.bind.annotation.XmlRootElement; +import java.util.UUID; + +@XmlRootElement(name = "project") +public class ProjectImportModels { + private UUID id; + private String label; + private String abbreviation; + private String description; + + public UUID getId() { + return id; + } + public void setId(UUID id) { + this.id = id; + } + + public String getLabel() { + return label; + } + public void setLabel(String label) { + this.label = label; + } + + public String getAbbreviation() { + return abbreviation; + } + public void setAbbreviation(String abbreviation) { + this.abbreviation = abbreviation; + } + + public String getDescription() { + return description; + } + public void setDescription(String description) { + this.description = description; + } +} diff --git a/dmp-backend/web/src/main/java/eu/eudat/models/data/dmp/ResearcherImportModels.java b/dmp-backend/web/src/main/java/eu/eudat/models/data/dmp/ResearcherImportModels.java new file mode 100644 index 000000000..2a64228fa --- /dev/null +++ b/dmp-backend/web/src/main/java/eu/eudat/models/data/dmp/ResearcherImportModels.java @@ -0,0 +1,44 @@ +package eu.eudat.models.data.dmp; + +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlRootElement; + +@XmlRootElement(name = "researcher") +public class ResearcherImportModels { + private String label; + private String name; + private String id; + private int status; + + @XmlElement(name = "label") + public String getLabel() { + return label; + } + public void setLabel(String label) { + this.label = label; + } + + @XmlElement(name = "name") + public String getName() { + return name; + } + public void setName(String name) { + this.name = name; + } + + @XmlElement(name = "id") + public String getId() { + return id; + } + public void setId(String id) { + this.id = id; + } + + @XmlElement(name = "status") + public int getStatus() { + return status; + } + public void setStatus(int status) { + this.status = status; + } +} diff --git a/dmp-backend/web/src/main/java/eu/eudat/models/data/dmp/UserInfoImportModels.java b/dmp-backend/web/src/main/java/eu/eudat/models/data/dmp/UserInfoImportModels.java new file mode 100644 index 000000000..47f1aef9b --- /dev/null +++ b/dmp-backend/web/src/main/java/eu/eudat/models/data/dmp/UserInfoImportModels.java @@ -0,0 +1,7 @@ +package eu.eudat.models.data.dmp; + +import javax.xml.bind.annotation.XmlRootElement; + +@XmlRootElement(name = "userInfo") +public class UserInfoImportModels { +} diff --git a/dmp-backend/web/src/main/java/eu/eudat/models/data/quickwizard/DmpQuickWizardModel.java b/dmp-backend/web/src/main/java/eu/eudat/models/data/quickwizard/DmpQuickWizardModel.java index 1e443eaed..757cdfcd8 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/models/data/quickwizard/DmpQuickWizardModel.java +++ b/dmp-backend/web/src/main/java/eu/eudat/models/data/quickwizard/DmpQuickWizardModel.java @@ -1,7 +1,9 @@ package eu.eudat.models.data.quickwizard; +import eu.eudat.data.dao.entities.UserInfoDao; import eu.eudat.data.entities.Project; import eu.eudat.models.data.dmp.AssociatedProfile; +import eu.eudat.models.data.security.Principal; import eu.eudat.models.data.userinfo.UserInfo; import java.util.Date; @@ -67,7 +69,7 @@ public class DmpQuickWizardModel { this.project = project; } - public eu.eudat.models.data.dmp.DataManagementPlan toDataDmp(Project project) { + public eu.eudat.models.data.dmp.DataManagementPlan toDataDmp(UserInfoDao userInfoRepository ,Project project, Principal principal) { eu.eudat.models.data.dmp.DataManagementPlan dataManagementPlanEntity = new eu.eudat.models.data.dmp.DataManagementPlan(); dataManagementPlanEntity.setId(this.id); @@ -89,7 +91,7 @@ public class DmpQuickWizardModel { dataManagementPlanEntity.setCreated(new Date()); List user = new LinkedList(); eu.eudat.models.data.userinfo.UserInfo usetInfo = new eu.eudat.models.data.userinfo.UserInfo(); - usetInfo.fromDataModel(project.getCreationUser()); + usetInfo.fromDataModel(userInfoRepository.find(principal.getId())); user.add(usetInfo); dataManagementPlanEntity.setAssociatedUsers(user); return dataManagementPlanEntity; diff --git a/dmp-backend/web/src/main/java/eu/eudat/models/data/quickwizard/ProjectQuickWizardModel.java b/dmp-backend/web/src/main/java/eu/eudat/models/data/quickwizard/ProjectQuickWizardModel.java index b0c16f29a..4767b4442 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/models/data/quickwizard/ProjectQuickWizardModel.java +++ b/dmp-backend/web/src/main/java/eu/eudat/models/data/quickwizard/ProjectQuickWizardModel.java @@ -1,24 +1,18 @@ package eu.eudat.models.data.quickwizard; +import eu.eudat.models.data.project.Project; + import java.util.Date; import java.util.UUID; public class ProjectQuickWizardModel { - private UUID id; private String label; - private eu.eudat.data.entities.Project.Status status; private String description; + private Project existProject; - public UUID getId() { - return id; - } - - public void setId(UUID id) { - this.id = id; - } public String getLabel() { return label; @@ -28,15 +22,6 @@ public class ProjectQuickWizardModel { this.label = label; } - public short getStatus() { - return status.getValue(); - } - - public void setStatus(Short status) { - this.status = eu.eudat.data.entities.Project.Status.fromInteger(status); - } - - public String getDescription() { return description; } @@ -46,19 +31,23 @@ public class ProjectQuickWizardModel { } + public Project getExistProject() { + return existProject; + } + + public void setExistProject(Project existProject) { + this.existProject = existProject; + } + public eu.eudat.models.data.project.Project toDataProject(){ - eu.eudat.models.data.project.Project toProject = new eu.eudat.models.data.project.Project(); - toProject.setId(this.id); - toProject.setAbbreviation(""); - toProject.setLabel(this.label); - toProject.setReference("dmp:" + this.label); - toProject.setUri(""); - toProject.setDefinition(""); - toProject.setCreated(new Date()); - toProject.setStatus(this.status != null ? this.getStatus() : eu.eudat.data.entities.Project.Status.ACTIVE.getValue()); - toProject.setModified(new Date()); - toProject.setDescription(this.description); - return toProject; + eu.eudat.models.data.project.Project toProject = new eu.eudat.models.data.project.Project(); + toProject.setAbbreviation(""); + toProject.setLabel(this.label); + toProject.setReference("dmp:" + this.label); + toProject.setUri(""); + toProject.setDefinition(""); + toProject.setDescription(this.description); + return toProject; } } diff --git a/dmp-frontend/src/app/core/core-service.module.ts b/dmp-frontend/src/app/core/core-service.module.ts index d482bb9e3..93ec38742 100644 --- a/dmp-frontend/src/app/core/core-service.module.ts +++ b/dmp-frontend/src/app/core/core-service.module.ts @@ -32,7 +32,6 @@ import { UserService } from './services/user/user.service'; import { CollectionUtils } from './services/utilities/collection-utils.service'; import { TypeUtils } from './services/utilities/type-utils.service'; import { QuickWizardService } from './services/quick-wizard/quick-wizard.service'; -import { QuickDatasetCreateWizardService } from './services/dataset-create-wizard/quick-dataset-create-wizard.service'; // // // This is shared module that provides all the services. Its imported only once on the AppModule. @@ -85,7 +84,6 @@ export class CoreServiceModule { DmpInvitationService, DatasetExternalAutocompleteService, QuickWizardService, - QuickDatasetCreateWizardService ], }; } diff --git a/dmp-frontend/src/app/core/services/dmp/dmp.service.ts b/dmp-frontend/src/app/core/services/dmp/dmp.service.ts index 3905e93e1..ff2f79ab0 100644 --- a/dmp-frontend/src/app/core/services/dmp/dmp.service.ts +++ b/dmp-frontend/src/app/core/services/dmp/dmp.service.ts @@ -12,6 +12,9 @@ import { DatasetProfileCriteria } from '../../query/dataset-profile/dataset-prof import { DmpCriteria } from '../../query/dmp/dmp-criteria'; import { RequestItem } from '../../query/request-item'; import { BaseHttpService } from '../http/base-http.service'; +import { ContentType } from '@angular/http/src/enums'; +import { BaseHttpParams } from '../../../common/http/base-http-params'; +import { InterceptorType } from '../../../common/http/interceptors/interceptor-type'; @Injectable() export class DmpService { @@ -31,7 +34,6 @@ export class DmpService { else { return this.http.post>(this.actionUrl + 'paged?fieldsGroup=' + fieldsGroup, dataTableRequest, { headers: this.headers }); } - } getSingle(id: String): Observable { @@ -41,6 +43,7 @@ export class DmpService { unlock(id: String): Observable { return this.http.get(this.actionUrl + id + '/unlock', { headers: this.headers }); } + createDmp(dataManagementPlanModel: DmpModel): Observable { return this.http.post(this.actionUrl, dataManagementPlanModel, { headers: this.headers }); } @@ -83,4 +86,21 @@ export class DmpService { let headerPdf: HttpHeaders = this.headers.set('Content-Type', 'application/pdf') return this.httpClient.get(this.actionUrl + 'getPDF/' + id, { responseType: 'blob', observe: 'response', headers: headerPdf }); } + + public uploadXml(fileList: FileList, dmpTitle: string): Observable { + const formData: FormData = new FormData(); + //formData.append('file', fileList[0], dmpTitle); + if (fileList instanceof FileList) { + for (let i = 0; i < fileList.length; i++) { + formData.append('file', fileList[i], dmpTitle); + } + } else { + formData.append('file', fileList); + } + const params = new BaseHttpParams(); + params.interceptorContext = { + excludedInterceptors: [InterceptorType.JSONContentType] + }; + return this.http.post(this.actionUrl + 'upload', formData, { params: params }); + } } diff --git a/dmp-frontend/src/app/ui/dashboard/quick-wizard-create-add/quick-wizard-create-add.component.ts b/dmp-frontend/src/app/ui/dashboard/quick-wizard-create-add/quick-wizard-create-add.component.ts index 018741525..ebcfc399f 100644 --- a/dmp-frontend/src/app/ui/dashboard/quick-wizard-create-add/quick-wizard-create-add.component.ts +++ b/dmp-frontend/src/app/ui/dashboard/quick-wizard-create-add/quick-wizard-create-add.component.ts @@ -33,7 +33,7 @@ export class QuickWizardCreateAdd extends BaseComponent implements OnInit { navigateToAdd(){ - this.router.navigate(["/quick-wizard-add"]); + this.router.navigate(["/datasetcreatewizard"]); } diff --git a/dmp-frontend/src/app/ui/dataset-create-wizard/dataset-create-wizard.component.html b/dmp-frontend/src/app/ui/dataset-create-wizard/dataset-create-wizard.component.html index d8c7ea9e8..4cdaad652 100644 --- a/dmp-frontend/src/app/ui/dataset-create-wizard/dataset-create-wizard.component.html +++ b/dmp-frontend/src/app/ui/dataset-create-wizard/dataset-create-wizard.component.html @@ -3,13 +3,15 @@ {{'DATASET-CREATE-WIZARD.FIRST-STEP.TITLE'| translate}}
- + +
- +
@@ -18,16 +20,18 @@ {{'QUICKWIZARD.CREATE-ADD.CREATE.QUICKWIZARD_CREATE.THIRD-STEP.TITLE' | translate}} -
- +
+ -
-
+ \ No newline at end of file diff --git a/dmp-frontend/src/app/ui/dataset-create-wizard/dataset-create-wizard.component.ts b/dmp-frontend/src/app/ui/dataset-create-wizard/dataset-create-wizard.component.ts index 802815481..4ac3c3985 100644 --- a/dmp-frontend/src/app/ui/dataset-create-wizard/dataset-create-wizard.component.ts +++ b/dmp-frontend/src/app/ui/dataset-create-wizard/dataset-create-wizard.component.ts @@ -1,12 +1,10 @@ import { Component, OnInit, ViewChild } from '@angular/core'; -import { Observable } from 'rxjs'; +import { FormBuilder, FormGroup } from '@angular/forms'; import { MatStepper } from '@angular/material'; -import { BaseComponent } from '../../core/common/base/base.component'; -import { TranslateService } from '@ngx-translate/core'; -import { FormBuilder, FormGroup, Validators } from '@angular/forms'; -import { DatasetCreateWizardModel } from './dataset-create-wizard.model'; import { Router } from '@angular/router/src/router'; +import { BaseComponent } from '../../core/common/base/base.component'; import { QuickWizardService } from '../../core/services/quick-wizard/quick-wizard.service'; +import { DatasetCreateWizardModel } from './dataset-create-wizard.model'; @Component({ selector: 'dataset-create-wizard.component', @@ -40,7 +38,16 @@ export class DatasetCreateWizard extends BaseComponent implements OnInit { submit() { this.quickWizardService.createQuickDatasetWizard(this.formGroup.value) .subscribe(data => { - this.router.navigateByUrl(''); + this.router.navigateByUrl('/create-add'); }) } + + isAvtive(step: string): boolean { + switch (step) { + case 'step1': + return this.stepper.selectedIndex==0; + case 'step2': + return this.stepper.selectedIndex==1; + } + } } diff --git a/dmp-frontend/src/app/ui/dataset-create-wizard/dataset-create-wizard.model.ts b/dmp-frontend/src/app/ui/dataset-create-wizard/dataset-create-wizard.model.ts index 8bc4a8a7d..a0ef11de6 100644 --- a/dmp-frontend/src/app/ui/dataset-create-wizard/dataset-create-wizard.model.ts +++ b/dmp-frontend/src/app/ui/dataset-create-wizard/dataset-create-wizard.model.ts @@ -1,19 +1,15 @@ -import { DatasetDmpSelectorModel } from "./dmp-selector/dataset-dmp-selector.model"; -import { DmpModel } from "../../core/model/dmp/dmp"; -import { FormGroup, FormBuilder, Validators } from "@angular/forms"; -import { DatasetProfileModel } from "../../core/model/dataset/dataset-profile"; -import { ValidationContext } from "../../common/forms/validation/validation-context"; +import { FormBuilder, FormGroup, Validators } from "@angular/forms"; import { BackendErrorValidator } from "../../common/forms/validation/custom-validator"; import { ValidationErrorModel } from "../../common/forms/validation/error-model/validation-error-model"; +import { ValidationContext } from "../../common/forms/validation/validation-context"; import { DmpCreateWizardFormModel } from "../../core/model/dmp/dmp-create-wizard/dmp-create-wizard-form.model"; -import { DatasetEditorWizardModel } from "../quick-wizard/dataset-editor/dataset-editor-wizard-model"; import { DatasetWizardEditorModel } from "../dataset/dataset-wizard/dataset-wizard-editor.model"; +import { DatasetEditorWizardModel } from "../quick-wizard/dataset-editor/dataset-editor-wizard-model"; -import { DmpEditorWizardModel } from "../quick-wizard/dmp-editor/dmp-editor-wizard-model"; export class DatasetCreateWizardModel { - public dmpMeta: DmpCreateWizardFormModel; - public datasets: DatasetEditorWizardModel; + public dmpMeta: DmpCreateWizardFormModel; + public datasets: DatasetEditorWizardModel; public validationErrorModel: ValidationErrorModel = new ValidationErrorModel(); fromModelDmp(item: DmpCreateWizardFormModel): DatasetCreateWizardModel { @@ -31,7 +27,7 @@ export class DatasetCreateWizardModel { const formBuilder = new FormBuilder(); const formGroup = formBuilder.group({ dmpMeta: new DmpCreateWizardFormModel().buildForm(), - datasets: new DatasetEditorWizardModel().buildForm() + datasets: new DatasetEditorWizardModel().buildForm() }); return formGroup; diff --git a/dmp-frontend/src/app/ui/dataset-create-wizard/dataset-create-wizard.module.ts b/dmp-frontend/src/app/ui/dataset-create-wizard/dataset-create-wizard.module.ts index 54d9bb5f2..dbb004455 100644 --- a/dmp-frontend/src/app/ui/dataset-create-wizard/dataset-create-wizard.module.ts +++ b/dmp-frontend/src/app/ui/dataset-create-wizard/dataset-create-wizard.module.ts @@ -1,20 +1,16 @@ import { NgModule } from '@angular/core'; +import { CommonFormsModule } from '../../common/forms/common-forms.module'; +import { CommonUiModule } from '../../common/ui/common-ui.module'; +import { FormattingModule } from '../../core/formatting.module'; +import { AutoCompleteModule } from '../../library/auto-complete/auto-complete.module'; +import { ConfirmationDialogModule } from '../../library/confirmation-dialog/confirmation-dialog.module'; +import { UrlListingModule } from '../../library/url-listing/url-listing.module'; +import { DatasetDescriptionFormModule } from '../misc/dataset-description-form/dataset-description-form.module'; +import { OuickWizardModule } from '../quick-wizard/quick-wizard.module'; +import { QuickWizardRoutingModule } from '../quick-wizard/quick-wizard.rooting'; import { DatasetCreateWizard } from './dataset-create-wizard.component'; import { DatasetCreateWizardRoutingModule } from './dataset-create-wizard.routing'; -import { CommonUiModule } from '../../common/ui/common-ui.module'; -import { CommonFormsModule } from '../../common/forms/common-forms.module'; -import { AutoCompleteModule } from '../../library/auto-complete/auto-complete.module'; import { DatasetDmpSelector } from './dmp-selector/dataset-dmp-selector.component'; -import { FormattingModule } from '../../core/formatting.module'; -import { DatasetEditorWizardComponent } from '../quick-wizard/dataset-editor/dataset-editor-wizard.component'; -//import { DatasetDescriptionFormComponent } from '../misc/dataset-description-form/dataset-description-form.component'; -//import { FormProgressIndicationComponent } from '../misc/dataset-description-form/components/form-progress-indication/form-progress-indication.component'; -import { UrlListingModule } from '../../library/url-listing/url-listing.module'; -import { ConfirmationDialogModule } from '../../library/confirmation-dialog/confirmation-dialog.module'; -import { DatasetDescriptionFormModule } from '../misc/dataset-description-form/dataset-description-form.module'; -import { QuickWizardRoutingModule } from '../quick-wizard/quick-wizard.rooting'; -import { OuickWizardModule } from '../quick-wizard/quick-wizard.module'; -import { CoreServiceModule } from '../../core/core-service.module'; @NgModule({ diff --git a/dmp-frontend/src/app/ui/dataset/dataset-wizard/dataset-wizard.component.ts b/dmp-frontend/src/app/ui/dataset/dataset-wizard/dataset-wizard.component.ts index 78357dd11..9ade1b6b3 100644 --- a/dmp-frontend/src/app/ui/dataset/dataset-wizard/dataset-wizard.component.ts +++ b/dmp-frontend/src/app/ui/dataset/dataset-wizard/dataset-wizard.component.ts @@ -392,7 +392,7 @@ export class DatasetWizardComponent extends BaseComponent implements OnInit, IBr openConfirm(dmpLabel, id): void { const dialogRef = this.dialog.open(ConfirmationDialogComponent, { - maxWidth: '300px', + //maxWidth: '300px', data: { message: this.language.instant('GENERAL.CONFIRMATION-DIALOG.DELETE-ITEM'), confirmButton: this.language.instant('GENERAL.CONFIRMATION-DIALOG.ACTIONS.CONFIRM'), @@ -404,7 +404,7 @@ export class DatasetWizardComponent extends BaseComponent implements OnInit, IBr this.datasetWizardService.delete(id) .pipe(takeUntil(this._destroyed)) .subscribe( - complete => { this.onCallbackSuccess(); this.router.navigateByUrl('/datasets/dmp/' + this.formGroup.get('dmp').value.id);}, + complete => { this.onCallbackSuccess(); this.router.navigateByUrl('/datasets')}, error => this.onCallbackError(error) ); } diff --git a/dmp-frontend/src/app/ui/dmp/editor/dmp-editor.component.ts b/dmp-frontend/src/app/ui/dmp/editor/dmp-editor.component.ts index e23a7c811..f9d165abb 100644 --- a/dmp-frontend/src/app/ui/dmp/editor/dmp-editor.component.ts +++ b/dmp-frontend/src/app/ui/dmp/editor/dmp-editor.component.ts @@ -39,7 +39,6 @@ import { AddResearcherComponent } from './add-researcher/add-researcher.componen import { AvailableProfilesComponent } from './available-profiles/available-profiles.component'; import { DmpEditorModel } from './dmp-editor.model'; import { DmpFinalizeDialogComponent } from './dmp-finalize-dialog/dmp-finalize-dialog.component'; -import { DmpProfileStatus } from '../../../core/common/enum/dmp-profile-status'; @Component({ selector: 'app-dmp-editor-component', @@ -193,7 +192,7 @@ export class DmpEditorComponent extends BaseComponent implements OnInit, IBreadC .pipe(takeUntil(this._destroyed)) .subscribe(Option => { if (Option instanceof Object) { - this.selectedDmpProfileDefinition=null; + this.selectedDmpProfileDefinition = null; this.dmpProfileService.getSingle(Option.id) .pipe(takeUntil(this._destroyed)) .subscribe(result => { @@ -344,8 +343,8 @@ export class DmpEditorComponent extends BaseComponent implements OnInit, IBreadC } }); } - onDeleteCallbackError(error){ - this.uiNotificationService.snackBarNotification(error.error.message? error.error.message : this.language.instant('GENERAL.SNACK-BAR.UNSUCCESSFUL-DELETE'), SnackBarNotificationLevel.Error); + onDeleteCallbackError(error) { + this.uiNotificationService.snackBarNotification(error.error.message ? error.error.message : this.language.instant('GENERAL.SNACK-BAR.UNSUCCESSFUL-DELETE'), SnackBarNotificationLevel.Error); } // selectOption(option: any) { diff --git a/dmp-frontend/src/app/ui/dmp/listing/criteria/dmp-criteria.component.html b/dmp-frontend/src/app/ui/dmp/listing/criteria/dmp-criteria.component.html index e9bd47897..ae7d43056 100644 --- a/dmp-frontend/src/app/ui/dmp/listing/criteria/dmp-criteria.component.html +++ b/dmp-frontend/src/app/ui/dmp/listing/criteria/dmp-criteria.component.html @@ -1,17 +1,23 @@
- +

{{'CRITERIA.FILTERS'| translate}}

+
+
- + {{formGroup.get('like').getError('backendError').message}} - +
diff --git a/dmp-frontend/src/app/ui/dmp/listing/criteria/dmp-criteria.component.scss b/dmp-frontend/src/app/ui/dmp/listing/criteria/dmp-criteria.component.scss index 0b6d2bc32..1de5ce5b2 100644 --- a/dmp-frontend/src/app/ui/dmp/listing/criteria/dmp-criteria.component.scss +++ b/dmp-frontend/src/app/ui/dmp/listing/criteria/dmp-criteria.component.scss @@ -7,4 +7,12 @@ mat-card { padding-bottom: 0px; } + + .hidden { + display: none; + } + + .uploadButton { + float: right; + } } diff --git a/dmp-frontend/src/app/ui/dmp/listing/criteria/dmp-criteria.component.ts b/dmp-frontend/src/app/ui/dmp/listing/criteria/dmp-criteria.component.ts index f69798e56..2371ff5fd 100644 --- a/dmp-frontend/src/app/ui/dmp/listing/criteria/dmp-criteria.component.ts +++ b/dmp-frontend/src/app/ui/dmp/listing/criteria/dmp-criteria.component.ts @@ -11,6 +11,9 @@ import { MultipleAutoCompleteConfiguration } from '../../../../library/auto-comp import { RequestItem } from '../../../../core/query/request-item'; import { BaseCriteriaComponent } from '../../../misc/criteria/base-criteria.component'; import { DataTableRequest } from '../../../../core/model/data-table/data-table-request'; +import { DmpService } from '../../../../core/services/dmp/dmp.service'; +import { MatDialog } from '@angular/material'; +import { DmpUploadDialogue } from './upload-dialogue/dmp-upload-dialogue.component'; @Component({ selector: 'app-dmp-criteria-component', @@ -21,6 +24,9 @@ export class DmpCriteriaComponent extends BaseCriteriaComponent implements OnIni @Input() showProject: boolean; filteringProjectsAsync = false; + sizeError = false; + maxFileSize: number = 1048576; + filteredProjects: ProjectListingModel[]; public formGroup = new FormBuilder().group({ like: new FormControl(), @@ -36,7 +42,9 @@ export class DmpCriteriaComponent extends BaseCriteriaComponent implements OnIni constructor( public language: TranslateService, public projectService: ProjectService, - public formBuilder: FormBuilder + private dmpService: DmpService, + public formBuilder: FormBuilder, + private dialog: MatDialog ) { super(new ValidationErrorModel()); } @@ -79,4 +87,22 @@ export class DmpCriteriaComponent extends BaseCriteriaComponent implements OnIni projectRequestItem.criteria.like = query; return this.projectService.getPaged(projectRequestItem, "autocomplete").map(x => x.data); } + + fileSave(event) { + const dialogRef = this.dialog.open(DmpUploadDialogue, { + data: { + fileList: FileList, + success: Boolean, + dmpTitle: String + } + }); + dialogRef.afterClosed().pipe(takeUntil(this._destroyed)).subscribe(result => { + if (result && result.success) { + console.log(result.fileList[0]); + this.dmpService.uploadXml(result.fileList, result.dmpTitle) + .pipe(takeUntil(this._destroyed)) + .subscribe(); + } + }); + } } diff --git a/dmp-frontend/src/app/ui/dmp/listing/criteria/upload-dialogue/dmp-upload-dialogue.component.html b/dmp-frontend/src/app/ui/dmp/listing/criteria/upload-dialogue/dmp-upload-dialogue.component.html new file mode 100644 index 000000000..246925f20 --- /dev/null +++ b/dmp-frontend/src/app/ui/dmp/listing/criteria/upload-dialogue/dmp-upload-dialogue.component.html @@ -0,0 +1,27 @@ +
+
+
+
+ {{'DMP-UPLOAD.TITLE' | translate}} +
+
+ + +
+
+
+ + + +
+
+ +
+
+
+ +
+
+
diff --git a/dmp-frontend/src/app/ui/dmp/listing/criteria/upload-dialogue/dmp-upload-dialogue.component.scss b/dmp-frontend/src/app/ui/dmp/listing/criteria/upload-dialogue/dmp-upload-dialogue.component.scss new file mode 100644 index 000000000..c066ed1b5 --- /dev/null +++ b/dmp-frontend/src/app/ui/dmp/listing/criteria/upload-dialogue/dmp-upload-dialogue.component.scss @@ -0,0 +1,21 @@ +.confirmation-dialog { + .confirmation-message { + padding-bottom: 20px; + } + + .hidden { + display: none; + } + + .uploadButton { + float: right; + } + + .col-md-6 { + display: flex; + flex-direction: row; + flex-wrap: wrap; + align-items: center; + margin: -4px; + } +} diff --git a/dmp-frontend/src/app/ui/dmp/listing/criteria/upload-dialogue/dmp-upload-dialogue.component.ts b/dmp-frontend/src/app/ui/dmp/listing/criteria/upload-dialogue/dmp-upload-dialogue.component.ts new file mode 100644 index 000000000..6e6101276 --- /dev/null +++ b/dmp-frontend/src/app/ui/dmp/listing/criteria/upload-dialogue/dmp-upload-dialogue.component.ts @@ -0,0 +1,37 @@ +import { Component, Inject } from '@angular/core'; +import { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material'; +import { DmpService } from '../../../../../core/services/dmp/dmp.service'; + +@Component({ + selector: 'dmp-upload-dialogue', + templateUrl: './dmp-upload-dialogue.component.html', + styleUrls: ['./dmp-upload-dialogue.component.scss'] +}) +export class DmpUploadDialogue { + dmpTitle: string; + + + constructor( + public dialogRef: MatDialogRef, + @Inject(MAT_DIALOG_DATA) public data: any, + ) {} + + cancel() { + this.data.success = false; + this.dialogRef.close(this.data); + } + + confirm() { + this.data.success = true; + this.data.dmpTitle = this.dmpTitle; + this.dialogRef.close(this.data); + } + + uploadFile(event) { + const fileList: FileList = event.target.files + this.data.fileList = fileList; + if (this.data.fileList.length > 0) { + this.dmpTitle = fileList.item(0).name; + } + } +} diff --git a/dmp-frontend/src/app/ui/quick-wizard/dataset-editor/dataset-editor-wizard-model.ts b/dmp-frontend/src/app/ui/quick-wizard/dataset-editor/dataset-editor-wizard-model.ts index 8234c7092..d31785025 100644 --- a/dmp-frontend/src/app/ui/quick-wizard/dataset-editor/dataset-editor-wizard-model.ts +++ b/dmp-frontend/src/app/ui/quick-wizard/dataset-editor/dataset-editor-wizard-model.ts @@ -1,4 +1,4 @@ -import { FormBuilder, FormGroup } from "@angular/forms"; +import { FormBuilder, FormGroup, Validators } from "@angular/forms"; import { BackendErrorValidator } from "../../../common/forms/validation/custom-validator"; import { ValidationErrorModel } from "../../../common/forms/validation/error-model/validation-error-model"; import { ValidationContext } from "../../../common/forms/validation/validation-context"; @@ -17,9 +17,9 @@ export class DatasetEditorWizardModel extends BaseFormModel { return this; } - buildForm(context: ValidationContext = null, disabled: boolean = false): FormGroup { + buildForm(context: ValidationContext = null): FormGroup { if (context == null) { context = this.createValidationContext(); } - const formGroup = new FormBuilder().group({}); + const formGroup = new FormBuilder().group({},context.getValidation('datasetsList').validators); const formArray = new Array(); this.datasetsList.forEach(item => { const form: FormGroup = item.buildForm(); @@ -31,7 +31,7 @@ export class DatasetEditorWizardModel extends BaseFormModel { createValidationContext(): ValidationContext { const baseContext: ValidationContext = new ValidationContext(); - baseContext.validation.push({ key: 'datasetsList', validators: [BackendErrorValidator(this.validationErrorModel, 'datasetsList')] }); + baseContext.validation.push({ key: 'datasetsList', validators:[BackendErrorValidator(this.validationErrorModel, 'datasetsList')] }); return baseContext; } diff --git a/dmp-frontend/src/app/ui/quick-wizard/dataset-editor/dataset-editor-wizard.component.html b/dmp-frontend/src/app/ui/quick-wizard/dataset-editor/dataset-editor-wizard.component.html index 767ccc00c..af2e9d36d 100644 --- a/dmp-frontend/src/app/ui/quick-wizard/dataset-editor/dataset-editor-wizard.component.html +++ b/dmp-frontend/src/app/ui/quick-wizard/dataset-editor/dataset-editor-wizard.component.html @@ -35,7 +35,6 @@
- @@ -51,7 +50,7 @@ + [visibilityRules]="this.datasetProfileDefinition.rules" [datasetProfileId]="datasetProfile.value"> \ No newline at end of file diff --git a/dmp-frontend/src/app/ui/quick-wizard/dataset-editor/dataset-editor-wizard.component.ts b/dmp-frontend/src/app/ui/quick-wizard/dataset-editor/dataset-editor-wizard.component.ts index b6a8d8b93..73bd3c06e 100644 --- a/dmp-frontend/src/app/ui/quick-wizard/dataset-editor/dataset-editor-wizard.component.ts +++ b/dmp-frontend/src/app/ui/quick-wizard/dataset-editor/dataset-editor-wizard.component.ts @@ -11,6 +11,7 @@ import { IBreadCrumbComponent } from "../../misc/breadcrumb/definition/IBreadCru import { DatasetDescriptionFormEditorModel } from "../../misc/dataset-description-form/dataset-description-form.model"; import { QuickWizardDatasetDescriptionModel } from "./quick-wizard-dataset-description-model"; import { IfStmt } from "@angular/compiler"; +import { TranslateService } from "@ngx-translate/core"; @@ -27,70 +28,81 @@ export class DatasetEditorWizardComponent extends BaseComponent implements OnIni breadCrumbs: Observable; @Input() formGroup: FormGroup; - @Input() profile: FormGroup;// DatasetProfileModel; - @Input() datasetLabel:FormGroup; + @Input() datasetProfile: FormGroup;// DatasetProfileModel; + @Input() datasetLabel: string; editedDataset: boolean = false; dataset: DatasetDescriptionFormEditorModel; public datasetProfileDefinition: DatasetDescriptionFormEditorModel; public lastIndexOfDataset = 0; - public toggleButton=0; + public toggleButton = 0; public _inputValue: string; constructor( - private datasetWizardService: DatasetWizardService + private datasetWizardService: DatasetWizardService, + public language: TranslateService, ) { super(); } ngOnInit(): void { - } - - onValChange(event: any){ - if(event=="list"){ - this.toggleButton=0; - this.editedDataset=false; - this._inputValue="list"; - }else if (event=="add"){ - this.addDataset(); - this.toggleButton=2; - this._inputValue="dataset"; - }else if (event=="dataset"){ - this.toggleButton=2; - this._inputValue="dataset"; - } - - } - editDataset(index:number){ - this.lastIndexOfDataset = index; - this.toggleButton=2; - this.editedDataset=true; - this._inputValue="dataset" - } - - deleteDataset(index:number){//TODO: delete Dataset From List - this.lastIndexOfDataset = index; - this.toggleButton=0; - this.editedDataset=false; - this._inputValue="list"; - (this.formGroup.get('datasets').get('datasetsList') as FormArray).removeAt(index); - } - - addDataset() { - this.datasetWizardService.getDefinition(this.profile.value["id"]) + this.datasetWizardService.getDefinition(this.datasetProfile.value["id"]) .pipe(takeUntil(this._destroyed)) .subscribe(item => { this.datasetProfileDefinition = new DatasetDescriptionFormEditorModel().fromModel(item); - const formArray: FormArray = (this.formGroup.get('datasets').get('datasetsList') as FormArray); - this.lastIndexOfDataset = formArray.length; - let dataset = new QuickWizardDatasetDescriptionModel().fromModel(this.datasetProfileDefinition); - let formGroup = dataset.buildForm(); - formGroup.get('datasetLabel').setValue("Dataset :"+this.profile.value["label"]+" For Dmp : "+this.datasetLabel.value); - formArray.push(formGroup); - this.editedDataset=true; + this.onValChange("list"); + const length = (this.formGroup.get('datasets').get('datasetsList') as FormArray).length; + if (length == 0) { + this.lastIndexOfDataset = length; + this.addDataset(); + this.onValChange("dataset"); + } }); - + } + onValChange(event: any) { + if (event == "list") { + this.toggleButton = 0; + this.editedDataset = false; + this._inputValue = "list"; + } else if (event == "add") { + this.addDataset(); + this.toggleButton = 2; + this._inputValue = "dataset"; + } else if (event == "dataset") { + this.toggleButton = 2; + this._inputValue = "dataset"; + } + + } + editDataset(index: number) { + this.lastIndexOfDataset = index; + this.toggleButton = 2; + this.editedDataset = true; + this._inputValue = "dataset" + } + + deleteDataset(index: number) {//TODO: delete Dataset From List + this.lastIndexOfDataset = index; + this.toggleButton = 0; + this.editedDataset = false; + this._inputValue = "list"; + (this.formGroup.get('datasets').get('datasetsList') as FormArray).removeAt(index); + } + + addDataset() { + const formArray: FormArray = (this.formGroup.get('datasets').get('datasetsList') as FormArray); + let dataset = new QuickWizardDatasetDescriptionModel().fromModel(this.datasetProfileDefinition); + let formGroup = dataset.buildForm(); + + formGroup.get('datasetLabel').setValue( + this.language.instant('QUICKWIZARD.CREATE-ADD.CREATE.QUICKWIZARD_CREATE.THIRD-STEP.DATASET-NAME') + + this.datasetProfile.value["label"] + + this.language.instant('QUICKWIZARD.CREATE-ADD.CREATE.QUICKWIZARD_CREATE.THIRD-STEP.DATASET-NAME-FOR') + + this.datasetLabel); + formArray.push(formGroup); + this.lastIndexOfDataset = formArray.length - 1; + this.editedDataset = true; } diff --git a/dmp-frontend/src/app/ui/quick-wizard/dmp-editor/dmp-editor-wizard.component.html b/dmp-frontend/src/app/ui/quick-wizard/dmp-editor/dmp-editor-wizard.component.html index 1c09d58c9..99d9230a7 100644 --- a/dmp-frontend/src/app/ui/quick-wizard/dmp-editor/dmp-editor-wizard.component.html +++ b/dmp-frontend/src/app/ui/quick-wizard/dmp-editor/dmp-editor-wizard.component.html @@ -29,7 +29,7 @@ + [configuration]="profilesAutoCompleteConfiguration" [disabled]="dataseteIsEmpty()"> {{formGroup.get('datasetProfile').getError('backendError').message}} diff --git a/dmp-frontend/src/app/ui/quick-wizard/dmp-editor/dmp-editor-wizard.component.ts b/dmp-frontend/src/app/ui/quick-wizard/dmp-editor/dmp-editor-wizard.component.ts index 9f05ff5cd..ad877d60a 100644 --- a/dmp-frontend/src/app/ui/quick-wizard/dmp-editor/dmp-editor-wizard.component.ts +++ b/dmp-frontend/src/app/ui/quick-wizard/dmp-editor/dmp-editor-wizard.component.ts @@ -1,20 +1,20 @@ -import { Component, OnInit, Input } from '@angular/core'; -import { BaseComponent } from "../../../core/common/base/base.component"; -import { BreadcrumbItem } from '../../misc/breadcrumb/definition/breadcrumb-item'; -import { Observable } from 'rxjs'; -import { IBreadCrumbComponent } from '../../misc/breadcrumb/definition/IBreadCrumbComponent'; +import { Component, Input, OnInit } from '@angular/core'; +import { AbstractControl, FormArray, FormControl, FormGroup } from '@angular/forms'; import { MatSnackBar } from '@angular/material'; -import { Router, ActivatedRoute } from '@angular/router'; +import { ActivatedRoute, Router } from '@angular/router'; import { TranslateService } from '@ngx-translate/core'; -import { FormGroup, AbstractControl, FormControl, FormArray } from '@angular/forms'; -import { DmpEditorWizardModel } from './dmp-editor-wizard-model'; -import { UiNotificationService, SnackBarNotificationLevel } from '../../../core/services/notification/ui-notification-service'; +import { Observable } from 'rxjs'; import { ValidationErrorModel } from '../../../common/forms/validation/error-model/validation-error-model'; -import { SingleAutoCompleteConfiguration } from '../../../library/auto-complete/single/single-auto-complete-configuration'; +import { BaseComponent } from "../../../core/common/base/base.component"; import { DatasetProfileModel } from '../../../core/model/dataset/dataset-profile'; -import { RequestItem } from '../../../core/query/request-item'; import { DatasetProfileCriteria } from '../../../core/query/dataset-profile/dataset-profile-criteria'; +import { RequestItem } from '../../../core/query/request-item'; import { DmpService } from '../../../core/services/dmp/dmp.service'; +import { SnackBarNotificationLevel, UiNotificationService } from '../../../core/services/notification/ui-notification-service'; +import { SingleAutoCompleteConfiguration } from '../../../library/auto-complete/single/single-auto-complete-configuration'; +import { BreadcrumbItem } from '../../misc/breadcrumb/definition/breadcrumb-item'; +import { IBreadCrumbComponent } from '../../misc/breadcrumb/definition/IBreadCrumbComponent'; +import { DmpEditorWizardModel } from './dmp-editor-wizard-model'; @Component({ @@ -23,33 +23,34 @@ import { DmpService } from '../../../core/services/dmp/dmp.service'; styleUrls: ['./dmp-editor-wizard.component.scss'] }) export class DmpEditorWizardComponent extends BaseComponent implements OnInit, IBreadCrumbComponent { - + breadCrumbs: Observable = Observable.of([]); isNew = true; dmp: DmpEditorWizardModel; @Input() formGroup: FormGroup; - @Input() dmpLabel: FormGroup; + @Input() dmpLabel: string; + @Input() datasetFormGroup: FormGroup; //formGroup: FormGroup = null; private uiNotificationService: UiNotificationService - profilesAutoCompleteConfiguration:SingleAutoCompleteConfiguration; + profilesAutoCompleteConfiguration: SingleAutoCompleteConfiguration; filteredProfiles: DatasetProfileModel[]; - filteredProfilesAsync = false; - - + filteredProfilesAsync = false; + + constructor( public snackBar: MatSnackBar, public router: Router, private route: ActivatedRoute, private _service: DmpService, - public language: TranslateService, + public language: TranslateService ) { super(); } ngOnInit(): void { - + this.profilesAutoCompleteConfiguration = { filterFn: this.filterProfiles.bind(this), initialItems: (extraData) => this.filterProfiles(''), @@ -62,15 +63,16 @@ export class DmpEditorWizardComponent extends BaseComponent implements OnInit, I this.dmp = new DmpEditorWizardModel(); this.formGroup = this.dmp.buildForm(); } - this.formGroup.get('label').setValue("Dmp From Project : "+ this.dmpLabel.value); + this.formGroup.get('label').setValue(this.language.instant('QUICKWIZARD.CREATE-ADD.CREATE.QUICKWIZARD_CREATE.SECOND-STEP.DMP-NAME') + this.dmpLabel); + this.formGroup.get('label').setValue(this.language.instant('QUICKWIZARD.CREATE-ADD.CREATE.QUICKWIZARD_CREATE.SECOND-STEP.DMP-NAME') + this.dmpLabel); this.breadCrumbs = Observable.of([ { - parentComponentName: 'project', - label: 'Dmp', - url: '/quick-wizard/dmp' + parentComponentName: 'project', + label: 'Dmp', + url: '/quick-wizard/dmp' }] - ); + ); } @@ -142,17 +144,22 @@ export class DmpEditorWizardComponent extends BaseComponent implements OnInit, I filterProfiles(value: string): Observable { - this.filteredProfiles = undefined; - this.filteredProfilesAsync = true; - - const request = new RequestItem(); - const criteria = new DatasetProfileCriteria(); - criteria.like = value; - request.criteria = criteria; - return this._service.searchDMPProfiles(request); - } + this.filteredProfiles = undefined; + this.filteredProfilesAsync = true; + const request = new RequestItem(); + const criteria = new DatasetProfileCriteria(); + criteria.like = value; + request.criteria = criteria; + return this._service.searchDMPProfiles(request); + } + dataseteIsEmpty() { + if (this.datasetFormGroup && this.datasetFormGroup.get('datasetsList') && (this.datasetFormGroup.get('datasetsList') as FormArray).length != 0) { + return true; + } + return false; + } } \ No newline at end of file diff --git a/dmp-frontend/src/app/ui/quick-wizard/project-editor/project-editor-wizard-model.ts b/dmp-frontend/src/app/ui/quick-wizard/project-editor/project-editor-wizard-model.ts index 2208fe2bd..0b584948d 100644 --- a/dmp-frontend/src/app/ui/quick-wizard/project-editor/project-editor-wizard-model.ts +++ b/dmp-frontend/src/app/ui/quick-wizard/project-editor/project-editor-wizard-model.ts @@ -4,12 +4,14 @@ import { ValidationContext } from "../../../common/forms/validation/validation-c import { FormGroup, FormBuilder, Validators } from "@angular/forms"; import { BackendErrorValidator } from "../../../common/forms/validation/custom-validator"; import { ValidationErrorModel } from "../../../common/forms/validation/error-model/validation-error-model"; +import { ValidJsonValidator } from "../../../library/auto-complete/auto-complete-custom-validator"; export class ProjectEditorWizardModel { public id: string; public label: string; public status: Status = Status.Active; public description: String; + public existProject: ProjectListingModel; public validationErrorModel: ValidationErrorModel = new ValidationErrorModel(); @@ -29,6 +31,7 @@ export class ProjectEditorWizardModel { label: [{ value: this.label, disabled: disabled }, context.getValidation('label').validators], status: [{ value: this.status, disabled: disabled }, context.getValidation('status').validators], description: [{ value: this.description, disabled: disabled }, context.getValidation('description').validators], + existProject: [{ value: this.existProject, disabled: disabled }, context.getValidation('existProject').validators], }); return formGroup; } @@ -39,6 +42,10 @@ export class ProjectEditorWizardModel { baseContext.validation.push({ key: 'label', validators: [Validators.required, BackendErrorValidator(this.validationErrorModel, 'label')] }); baseContext.validation.push({ key: 'status', validators: [] }); baseContext.validation.push({ key: 'description', validators: [Validators.required, BackendErrorValidator(this.validationErrorModel, 'description')] }); + baseContext.validation.push({ key: 'existProject', validators: [Validators.required, ValidJsonValidator, BackendErrorValidator(this.validationErrorModel, 'existProject')] }); return baseContext; } + + } + diff --git a/dmp-frontend/src/app/ui/quick-wizard/project-editor/project-editor-wizard.component.html b/dmp-frontend/src/app/ui/quick-wizard/project-editor/project-editor-wizard.component.html index e94eb7657..27436ab00 100644 --- a/dmp-frontend/src/app/ui/quick-wizard/project-editor/project-editor-wizard.component.html +++ b/dmp-frontend/src/app/ui/quick-wizard/project-editor/project-editor-wizard.component.html @@ -1,42 +1,68 @@
- {{'QUICKWIZARD.CREATE-ADD.CREATE.QUICKWIZARD_CREATE.FIRST-STEP.NEW-TITLE' | translate}} -
+ + - + -
+
- - {{formGroup.get('label').getError('backendError').message}} - {{'GENERAL.VALIDATION.REQUIRED' | translate}} - - - - - - {{formGroup.get('description').getError('backendError').message}} - {{'GENERAL.VALIDATION.REQUIRED' | translate}} + + + + {{formGroup.get('project').getError('backendError').message}} + + {{'GENERAL.VALIDATION.REQUIRED' | translate}}
+ +
+ + + + {{formGroup.get('label').getError('backendError').message}} + + {{'GENERAL.VALIDATION.REQUIRED' | translate}} + + + + + {{formGroup.get('description').getError('backendError').message}} + + {{'GENERAL.VALIDATION.REQUIRED' | translate}} + +
+ +
+
+
+
+

+ {{'QUICKWIZARD.CREATE-ADD.CREATE.QUICKWIZARD_CREATE.FIRST-STEP.OR' | translate}} +

+
+
+
+
+
+
+ + + + +
+
+ -
+
\ No newline at end of file diff --git a/dmp-frontend/src/app/ui/quick-wizard/project-editor/project-editor-wizard.component.ts b/dmp-frontend/src/app/ui/quick-wizard/project-editor/project-editor-wizard.component.ts index 566f55e65..2614bc76f 100644 --- a/dmp-frontend/src/app/ui/quick-wizard/project-editor/project-editor-wizard.component.ts +++ b/dmp-frontend/src/app/ui/quick-wizard/project-editor/project-editor-wizard.component.ts @@ -1,16 +1,20 @@ -import { Component, OnInit, Input } from '@angular/core'; -import { BaseComponent } from "../../../core/common/base/base.component"; -import { BreadcrumbItem } from '../../misc/breadcrumb/definition/breadcrumb-item'; +import { Component, Input, OnInit } from '@angular/core'; +import { AbstractControl, FormArray, FormControl, FormGroup } from '@angular/forms'; +import { MatSnackBar } from '@angular/material'; +import { ActivatedRoute, Router } from '@angular/router'; +import { TranslateService } from '@ngx-translate/core'; import { Observable } from 'rxjs'; +import { ValidationErrorModel } from '../../../common/forms/validation/error-model/validation-error-model'; +import { BaseComponent } from "../../../core/common/base/base.component"; +import { ProjectCriteria } from '../../../core/query/project/project-criteria'; +import { RequestItem } from '../../../core/query/request-item'; +import { SnackBarNotificationLevel, UiNotificationService } from '../../../core/services/notification/ui-notification-service'; +import { ProjectService } from '../../../core/services/project/project.service'; +import { SingleAutoCompleteConfiguration } from '../../../library/auto-complete/single/single-auto-complete-configuration'; +import { LanguageResolverService } from '../../../services/language-resolver/language-resolver.service'; +import { BreadcrumbItem } from '../../misc/breadcrumb/definition/breadcrumb-item'; import { IBreadCrumbComponent } from '../../misc/breadcrumb/definition/IBreadCrumbComponent'; import { ProjectEditorWizardModel } from './project-editor-wizard-model'; -import { MatSnackBar } from '@angular/material'; -import { Router, ActivatedRoute, Params } from '@angular/router'; -import { TranslateService } from '@ngx-translate/core'; -import { FormGroup, AbstractControl, FormControl, FormArray } from '@angular/forms'; -import { takeUntil } from 'rxjs/operators'; -import { ValidationErrorModel } from '../../../common/forms/validation/error-model/validation-error-model'; -import { SnackBarNotificationLevel, UiNotificationService } from '../../../core/services/notification/ui-notification-service'; @Component({ selector: 'app-quick-wizard-project-editor-component', @@ -20,27 +24,26 @@ import { SnackBarNotificationLevel, UiNotificationService } from '../../../core/ export class ProjectEditorWizardComponent extends BaseComponent implements OnInit, IBreadCrumbComponent { breadCrumbs: Observable = Observable.of([]); - isNew = true; + isNew = false; project: ProjectEditorWizardModel; @Input() formGroup: FormGroup; //formGroup: FormGroup = null; private uiNotificationService: UiNotificationService + projectAutoCompleteConfiguration: SingleAutoCompleteConfiguration; constructor( public snackBar: MatSnackBar, private route: ActivatedRoute, public router: Router, public language: TranslateService, + private projectService: ProjectService, + public languageResolverService: LanguageResolverService, ) { super(); } ngOnInit() { - if (this.formGroup == null) { - this.project = new ProjectEditorWizardModel(); - this.formGroup = this.project.buildForm(); - } this.breadCrumbs = Observable.of([ { parentComponentName: 'QuickCreate', @@ -48,6 +51,29 @@ export class ProjectEditorWizardComponent extends BaseComponent implements OnIni url: '/quick-wizard/project' }] ); + + const projectRequestItem: RequestItem = new RequestItem(); + projectRequestItem.criteria = new ProjectCriteria(); + + this.projectAutoCompleteConfiguration = { + filterFn: this.searchProject.bind(this), + initialItems: (extraData) => this.searchProject(''), + displayFn: (item) => item['label'], + titleFn: (item) => item['label'] + }; + + if (!this.formGroup) { + this.project = new ProjectEditorWizardModel(); + this.formGroup = this.project.buildForm(); + } + + this.formGroup.get('existProject').enable(); + this.formGroup.get('label').disable(); + this.formGroup.get('description').disable(); + + + + // this.route.params // .pipe(takeUntil(this._destroyed)) // .subscribe((params: Params) => { @@ -76,11 +102,6 @@ export class ProjectEditorWizardComponent extends BaseComponent implements OnIni // }); } - formSubmit(): void { - this.touchAllFormFields(this.formGroup); - if (!this.isFormValid()) { return; } - this.onSubmit(); - } public isFormValid() { return this.formGroup.valid; @@ -101,16 +122,6 @@ export class ProjectEditorWizardComponent extends BaseComponent implements OnIni } } - onSubmit(): void { - // this.projectService.createProject(this.formGroup.value) - // .pipe(takeUntil(this._destroyed)) - // .subscribe( - // complete => this.onCallbackSuccess(), - // error => this.onCallbackError(error) - // ); - } - - onCallbackSuccess(): void { this.uiNotificationService.snackBarNotification(this.isNew ? this.language.instant('GENERAL.SNACK-BAR.SUCCESSFUL-CREATION') : this.language.instant('GENERAL.SNACK-BAR.SUCCESSFUL-UPDATE'), SnackBarNotificationLevel.Success); this.router.navigate(['/project']); @@ -143,4 +154,27 @@ export class ProjectEditorWizardComponent extends BaseComponent implements OnIni } + searchProject(query: string) { + const projectRequestItem: RequestItem = new RequestItem(); + projectRequestItem.criteria = new ProjectCriteria(); + projectRequestItem.criteria.like = query; + return this.projectService.getWithExternal(projectRequestItem); + } + + create() { + this.isNew = !this.isNew; + if (this.isNew) { + this.formGroup.get('existProject').disable(); + this.formGroup.get('existProject').reset(); + this.formGroup.get('label').enable(); + this.formGroup.get('description').enable(); + } else { + this.formGroup.get('existProject').enable(); + this.formGroup.get('label').disable(); + this.formGroup.get('label').reset(); + this.formGroup.get('description').disable(); + this.formGroup.get('description').reset(); + } + } + } \ No newline at end of file diff --git a/dmp-frontend/src/app/ui/quick-wizard/quick-wizard-editor/quick-wizard-editor.component.html b/dmp-frontend/src/app/ui/quick-wizard/quick-wizard-editor/quick-wizard-editor.component.html index 6a5a844c5..0659a7db0 100644 --- a/dmp-frontend/src/app/ui/quick-wizard/quick-wizard-editor/quick-wizard-editor.component.html +++ b/dmp-frontend/src/app/ui/quick-wizard/quick-wizard-editor/quick-wizard-editor.component.html @@ -4,29 +4,28 @@
- - - {{'QUICKWIZARD.CREATE-ADD.CREATE.QUICKWIZARD_CREATE.FIRST-STEP.TITLE' | translate}} - -
- - -
- -
+ + {{'QUICKWIZARD.CREATE-ADD.CREATE.QUICKWIZARD_CREATE.FIRST-STEP.TITLE' | translate}} + +
+ + +
+
- - - {{'QUICKWIZARD.CREATE-ADD.CREATE.QUICKWIZARD_CREATE.SECOND-STEP.TITLE' | translate}} - -
+ + {{'QUICKWIZARD.CREATE-ADD.CREATE.QUICKWIZARD_CREATE.SECOND-STEP.TITLE' | translate}} + + +
+ [datasetFormGroup]="formGroup.get('datasets')" + [dmpLabel]=" getProjectLabel()">