diff --git a/dmp-backend/src/main/java/eu/eudat/controllers/Admin.java b/dmp-backend/src/main/java/eu/eudat/controllers/Admin.java index acacd3b52..e183071d2 100644 --- a/dmp-backend/src/main/java/eu/eudat/controllers/Admin.java +++ b/dmp-backend/src/main/java/eu/eudat/controllers/Admin.java @@ -6,6 +6,7 @@ import eu.eudat.dao.entities.*; import eu.eudat.managers.DashBoardManager; import eu.eudat.models.dashboard.DashBoardStatistics; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.ApplicationContext; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.CrossOrigin; @@ -19,10 +20,16 @@ import eu.eudat.managers.AdminManager; import eu.eudat.models.admin.composite.DatasetProfile; import javax.transaction.Transactional; +import javax.validation.Valid; @RestController @CrossOrigin -public class Admin { +public class Admin extends BaseController{ + + @Autowired + public Admin(ApplicationContext springContext) { + super(springContext); + } @Autowired private DatasetProfileDao datasetProfileDao; @Autowired private DatasetProfileRulesetDao datasetProfileRulesetDao; @@ -30,7 +37,7 @@ public class Admin { @Transactional @RequestMapping(method = RequestMethod.POST, value = { "/admin/addDmp" },consumes = "application/json", produces="application/json") - public ResponseEntity addDmp(@RequestBody DatasetProfile profile){ + public ResponseEntity addDmp(@Valid @RequestBody DatasetProfile profile){ try{ eu.eudat.entities.DatasetProfile modelDefinition = AdminManager.generateViewStyleDefinition(profile); datasetProfileDao.createOrUpdate(modelDefinition); diff --git a/dmp-backend/src/main/java/eu/eudat/controllers/BaseController.java b/dmp-backend/src/main/java/eu/eudat/controllers/BaseController.java index 164657957..a766aec8d 100644 --- a/dmp-backend/src/main/java/eu/eudat/controllers/BaseController.java +++ b/dmp-backend/src/main/java/eu/eudat/controllers/BaseController.java @@ -1,6 +1,8 @@ package eu.eudat.controllers; import eu.eudat.validators.DataManagementPlanTableRequestValidator; +import eu.eudat.validators.DatasetProfileValidator; +import eu.eudat.validators.ProjectModelValidator; import eu.eudat.validators.ProjectTableRequestValidator; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.ApplicationContext; @@ -22,5 +24,8 @@ public abstract class BaseController { protected void initBinder(WebDataBinder binder) { if (binder.getTarget() != null && DataManagementPlanTableRequestValidator.supportsType((binder.getTarget().getClass()))) binder.addValidators(this.springContext.getBean("dataManagementPlanTableRequestValidator",DataManagementPlanTableRequestValidator.class)); if (binder.getTarget() != null && ProjectTableRequestValidator.supportsType((binder.getTarget().getClass()))) binder.addValidators(this.springContext.getBean("projectTableRequestValidator",ProjectTableRequestValidator.class)); + if (binder.getTarget() != null && DatasetProfileValidator.supportsType((binder.getTarget().getClass()))) binder.addValidators(this.springContext.getBean("datasetProfileValidator",DatasetProfileValidator.class)); + if (binder.getTarget() != null && ProjectModelValidator.supportsType((binder.getTarget().getClass()))) binder.addValidators(this.springContext.getBean("projectModelValidator",ProjectModelValidator.class)); + } } diff --git a/dmp-backend/src/main/java/eu/eudat/controllers/Projects.java b/dmp-backend/src/main/java/eu/eudat/controllers/Projects.java index 862a4a1ea..424f4bbda 100644 --- a/dmp-backend/src/main/java/eu/eudat/controllers/Projects.java +++ b/dmp-backend/src/main/java/eu/eudat/controllers/Projects.java @@ -110,7 +110,7 @@ public class Projects extends BaseController{ @Transactional @RequestMapping(method = RequestMethod.POST, value = { "/projects/createOrUpdate" }, consumes = "application/json", produces="application/json") - public @ResponseBody ResponseItem addProject(@RequestBody eu.eudat.models.project.Project project, Principal principal) { + public @ResponseBody ResponseItem addProject(@Valid @RequestBody eu.eudat.models.project.Project project, Principal principal) { try { ProjectManager.createOrUpdate(projectDao,userInfoDao,project,principal); return new ResponseItem().status(HttpStatus.OK); diff --git a/dmp-backend/src/main/java/eu/eudat/entities/xmlmodels/datasetprofiledefinition/Field.java b/dmp-backend/src/main/java/eu/eudat/entities/xmlmodels/datasetprofiledefinition/Field.java index 43044298d..48f91df17 100644 --- a/dmp-backend/src/main/java/eu/eudat/entities/xmlmodels/datasetprofiledefinition/Field.java +++ b/dmp-backend/src/main/java/eu/eudat/entities/xmlmodels/datasetprofiledefinition/Field.java @@ -1,7 +1,6 @@ package eu.eudat.entities.xmlmodels.datasetprofiledefinition; import eu.eudat.models.components.commons.DefaultValue; -import eu.eudat.models.components.commons.Multiplicity; import org.w3c.dom.Document; import org.w3c.dom.Element; import eu.eudat.models.components.commons.ViewStyle; @@ -10,6 +9,11 @@ import eu.eudat.models.components.commons.datafield.FieldData; import eu.eudat.utilities.XmlSerializable; import eu.eudat.utilities.builders.ModelBuilder; import eu.eudat.utilities.builders.XmlBuilder; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; + +import java.util.LinkedList; +import java.util.List; public class Field implements DatabaseViewStyleDefinition,XmlSerializable{ private String id; @@ -18,6 +22,8 @@ public class Field implements DatabaseViewStyleDefinition,XmlSerializable private DefaultValue defaultValue; private Visibility visible; private FieldData data; + private List validations; + public String getId() { return id; } @@ -58,6 +64,15 @@ public class Field implements DatabaseViewStyleDefinition,XmlSerializable public void setVisible(Visibility visible) { this.visible = visible; } + + public List getValidations() { + return validations; + } + + public void setValidations(List validations) { + this.validations = validations; + } + @Override public Element toXml(Document doc) { Element rootElement = doc.createElement("field"); @@ -74,6 +89,14 @@ public class Field implements DatabaseViewStyleDefinition,XmlSerializable defaultValue.setAttribute("type",this.defaultValue.getType()); defaultValue.setAttribute("value",this.defaultValue.getValue()); + Element validations = doc.createElement("validations"); + for(eu.eudat.models.admin.components.datasetprofile.Field.ValidationType validationType: this.validations){ + Element validation = doc.createElement("validation"); + validation.setAttribute("type",""+validationType.getValue()); + validations.appendChild(validation); + } + + rootElement.appendChild(validations); rootElement.appendChild(defaultValue); rootElement.appendChild(visibility); rootElement.appendChild(viewStyle); @@ -105,6 +128,19 @@ public class Field implements DatabaseViewStyleDefinition,XmlSerializable this.data = new ModelBuilder().toFieldData(null, this.viewStyle.getRenderStyle(),dataElement); if(this.data!=null)this.data.fromXml(dataElement); + this.validations = new LinkedList<>(); + Element validations = (Element)XmlBuilder.getNodeFromListByTagName(element.getChildNodes(), "validations"); + if(validations!=null){ + NodeList validationElements = validations.getChildNodes(); + for (int temp = 0; temp < validationElements.getLength(); temp++) { + Node validationElement = validationElements.item(temp); + if (validationElement.getNodeType() == Node.ELEMENT_NODE) { + int enumValue = Integer.parseInt(((Element)validationElement).getAttribute("type")); + eu.eudat.models.admin.components.datasetprofile.Field.ValidationType validationType = eu.eudat.models.admin.components.datasetprofile.Field.ValidationType.fromInteger(enumValue); + this.validations.add(validationType); + } + } + } return this; } diff --git a/dmp-backend/src/main/java/eu/eudat/entities/xmlmodels/datasetprofiledefinition/FieldSet.java b/dmp-backend/src/main/java/eu/eudat/entities/xmlmodels/datasetprofiledefinition/FieldSet.java index 2128c1058..914f7ccba 100644 --- a/dmp-backend/src/main/java/eu/eudat/entities/xmlmodels/datasetprofiledefinition/FieldSet.java +++ b/dmp-backend/src/main/java/eu/eudat/entities/xmlmodels/datasetprofiledefinition/FieldSet.java @@ -126,7 +126,7 @@ public class FieldSet implements DatabaseViewStyleDefinition,XmlSerializable,Comparable{ + + public enum ValidationType { + REQUIRED((short) 1); + private short value; + private ValidationType(short value) { this.value = value; } + public short getValue(){return value;} + public static ValidationType fromInteger(int value) { + switch (value) { + case 1: + return REQUIRED; + default: + throw new RuntimeException("Unsupported Project Status"); + } + } + public static List fromIntegers(List values){ + return values.stream().map(ValidationType::fromInteger).collect(Collectors.toList()); + } + } + private String id; private Integer ordinal; private String value; @@ -21,7 +44,7 @@ public class Field implements ViewStyleDefinition validations; public String getId() { return id; } @@ -84,6 +107,14 @@ public class Field implements ViewStyleDefinition getValidations() { + return this.validations.stream().map(item->(int)item.getValue()).collect(Collectors.toList()); + } + + public void setValidations(List validations) { + this.validations = ValidationType.fromIntegers(validations); + } + @Override public eu.eudat.entities.xmlmodels.datasetprofiledefinition.Field toDatabaseDefinition(eu.eudat.entities.xmlmodels.datasetprofiledefinition.Field field) { if(this.id == null||this.id.isEmpty())this.id = "field_"+RandomStringUtils.random(5, true, true); @@ -94,6 +125,7 @@ public class Field implements ViewStyleDefinition error = new HashMap<>(); - - public Map getError() { - return error; - } - - public void setError(Map error) { - this.error = error; - } +public class ValidationErrorContext extends HashMap{ public ValidationErrorContext() { } - public void addFieldError(String path, String message) { - error.put(path,message); + this.put(path,message); } } diff --git a/dmp-backend/src/main/java/eu/eudat/models/user/components/datasetprofile/Field.java b/dmp-backend/src/main/java/eu/eudat/models/user/components/datasetprofile/Field.java index 30984948f..85bae57b5 100644 --- a/dmp-backend/src/main/java/eu/eudat/models/user/components/datasetprofile/Field.java +++ b/dmp-backend/src/main/java/eu/eudat/models/user/components/datasetprofile/Field.java @@ -26,6 +26,7 @@ public class Field implements Comparable,PropertiesModelBuilder,ViewStyleDefinit private Multiplicity multiplicity; private Object data; private List multiplicityItems; + private List validations; private Visibility visible; public List getMultiplicityItems() { return multiplicityItems; @@ -104,6 +105,14 @@ public class Field implements Comparable,PropertiesModelBuilder,ViewStyleDefinit this.visible = visible; } + public List getValidations() { + return validations; + } + + public void setValidations(List validations) { + this.validations = validations; + } + public Field cloneForMultiplicity(String key, Map properties){ Field newField = new Field(); newField.id = key; @@ -114,7 +123,7 @@ public class Field implements Comparable,PropertiesModelBuilder,ViewStyleDefinit newField.page = this.page; newField.defaultValue = this.defaultValue; newField.data = this.data; - + newField.validations = this.validations; return newField; } @@ -126,6 +135,7 @@ public class Field implements Comparable,PropertiesModelBuilder,ViewStyleDefinit field.setData(new ModelBuilder().toFieldData(data, this.viewStyle.getRenderStyle())); field.setDefaultValue(this.defaultValue); field.setVisible(this.visible); + field.setValidations(this.validations); return field; } @Override @@ -136,6 +146,7 @@ public class Field implements Comparable,PropertiesModelBuilder,ViewStyleDefinit this.data = item.getData(); this.defaultValue = item.getDefaultValue(); this.visible= item.getVisible(); + this.validations = item.getValidations(); } @Override public void fromJsonObject(Map properties) { diff --git a/dmp-backend/src/main/java/eu/eudat/validators/DatasetProfileValidator.java b/dmp-backend/src/main/java/eu/eudat/validators/DatasetProfileValidator.java new file mode 100644 index 000000000..5898411bc --- /dev/null +++ b/dmp-backend/src/main/java/eu/eudat/validators/DatasetProfileValidator.java @@ -0,0 +1,30 @@ +package eu.eudat.validators; + +import eu.eudat.models.admin.composite.DatasetProfile; +import eu.eudat.models.project.ProjectTableRequest; +import org.springframework.stereotype.Component; +import org.springframework.validation.Errors; +import org.springframework.validation.Validator; + +/** + * Created by ikalyvas on 1/3/2018. + */ +@Component("datasetProfileValidator") +public class DatasetProfileValidator implements Validator { + @Override + public boolean supports(Class aClass) { + return DatasetProfile.class.equals(aClass); + } + + @Override + public void validate(Object obj, Errors errors) { + DatasetProfile datasetProfile = (DatasetProfile) obj; + if(datasetProfile.getLabel()==null){ + errors.rejectValue("label", "datasetprofile.label.null"); + } + } + public static boolean supportsType(Class clazz) { + return DatasetProfile.class.equals(clazz); + } + +} diff --git a/dmp-backend/src/main/java/eu/eudat/validators/ProjectModelValidator.java b/dmp-backend/src/main/java/eu/eudat/validators/ProjectModelValidator.java new file mode 100644 index 000000000..2bd6849ef --- /dev/null +++ b/dmp-backend/src/main/java/eu/eudat/validators/ProjectModelValidator.java @@ -0,0 +1,29 @@ +package eu.eudat.validators; + +import eu.eudat.models.project.Project; +import org.springframework.stereotype.Component; +import org.springframework.validation.Errors; +import org.springframework.validation.Validator; + +/** + * Created by ikalyvas on 1/3/2018. + */ +@Component("projectModelValidator") +public class ProjectModelValidator implements Validator { + @Override + public boolean supports(Class aClass) { + return Project.class.equals(aClass); + } + + @Override + public void validate(Object obj, Errors errors) { + Project project = (Project)obj; + if(project.getStartDate().after(project.getEndDate())){ + errors.rejectValue("startDate","project.startDate.overlapping"); + } + } + + public static boolean supportsType(Class aClass){ + return Project.class.equals(aClass); + } +} diff --git a/dmp-backend/src/main/resources/messages.properties b/dmp-backend/src/main/resources/messages.properties index 296cbb932..3c109db7e 100644 --- a/dmp-backend/src/main/resources/messages.properties +++ b/dmp-backend/src/main/resources/messages.properties @@ -2,4 +2,6 @@ datamanagementplanrequest.length.negative=table length cannot be negative datamanagementplanrequest.offset.negative=table offset cannot be negative projectTableRequest.periodStart.overlapping = Period Start cannot overlap Period End projectTableRequest.offset.negative=table offset cannot be negative -projectTableRequest.length.negative=table length cannot be negative \ No newline at end of file +projectTableRequest.length.negative=table length cannot be negative +datasetprofile.label.null = Dataset Profile Label cannot be null +project.startDate.overlapping = Period Start cannot overlap Period End \ No newline at end of file diff --git a/dmp-frontend/src/app/dataset-wizard/dataset-wizard.component.ts b/dmp-frontend/src/app/dataset-wizard/dataset-wizard.component.ts index 86d815708..b09e2b5e5 100644 --- a/dmp-frontend/src/app/dataset-wizard/dataset-wizard.component.ts +++ b/dmp-frontend/src/app/dataset-wizard/dataset-wizard.component.ts @@ -61,7 +61,7 @@ export class DatasetWizardComponent implements AfterViewInit { this.isNew = false; this.datasetWizardService.getSingle(itemId).map(data => data as DatasetWizardModel) .subscribe(data => { - this.datasetWizardModel = new JsonSerializer().fromJSONObject(data, DatasetWizardModel); + this.datasetWizardModel = JsonSerializer.fromJSONObject(data, DatasetWizardModel); this.formGroup = this.datasetWizardModel.buildForm(); this.datasetProfileAutoCompleteConfiguration = new AutoCompleteConfiguration(this.datasetWizardService.getAvailableProfiles.bind(this.datasetWizardService), datasetProfileRequestItem); this.formGroup.get("dmp").valueChanges.subscribe(change=>{ @@ -126,7 +126,7 @@ export class DatasetWizardComponent implements AfterViewInit { complete => { this.datasetWizardService.getSingle(complete.id).subscribe( result=>{ - this.datasetWizardModel = new JsonSerializer().fromJSONObject(result,DatasetWizardModel); + this.datasetWizardModel = JsonSerializer.fromJSONObject(result,DatasetWizardModel); } ) this.onCallbackSuccess() diff --git a/dmp-frontend/src/app/dmps/editor/dmp-editor.component.ts b/dmp-frontend/src/app/dmps/editor/dmp-editor.component.ts index 1139ea32f..8fe54498a 100644 --- a/dmp-frontend/src/app/dmps/editor/dmp-editor.component.ts +++ b/dmp-frontend/src/app/dmps/editor/dmp-editor.component.ts @@ -70,7 +70,7 @@ export class DataManagementPlanEditorComponent implements AfterViewInit { this.isNew = false; this.dataManagementPlanService.getSingle(itemId).map(data => data as DataManagementPlanModel) .subscribe(data => { - this.dataManagementPlan = new JsonSerializer().fromJSONObject(data, DataManagementPlanModel); + this.dataManagementPlan = JsonSerializer.fromJSONObject(data, DataManagementPlanModel); this.formGroup = this.dataManagementPlan.buildForm(); }); } else { diff --git a/dmp-frontend/src/app/form/dynamic-form.component.ts b/dmp-frontend/src/app/form/dynamic-form.component.ts index bd39d83e6..329245b01 100644 --- a/dmp-frontend/src/app/form/dynamic-form.component.ts +++ b/dmp-frontend/src/app/form/dynamic-form.component.ts @@ -61,7 +61,7 @@ export class DynamicFormComponent implements OnInit { this.createPagination(); this.form = this.datasetProfileDefinitionModel.buildForm(); this.visibilityRulesService.formGroup = this.form; - let rules: Rule[] = new JsonSerializer().fromJSONArray(this.datasetProfileDefinitionModel.rules, Rule); + let rules: Rule[] = JsonSerializer.fromJSONArray(this.datasetProfileDefinitionModel.rules, Rule); this.visibilityRulesService.buildVisibilityRules(rules) this.progressbar = true; diff --git a/dmp-frontend/src/app/homepage/homepage.component.ts b/dmp-frontend/src/app/homepage/homepage.component.ts index c2c0da111..ccfb7b604 100644 --- a/dmp-frontend/src/app/homepage/homepage.component.ts +++ b/dmp-frontend/src/app/homepage/homepage.component.ts @@ -30,7 +30,7 @@ export class HomepageComponent implements OnInit { this.dashBoardService.getStatistics().subscribe(results => { //let data = results['payload']; - this.dashboardStatisticsData = new JsonSerializer().fromJSONObject(results, DashboardStatisticsModel); + this.dashboardStatisticsData = JsonSerializer.fromJSONObject(results, DashboardStatisticsModel); }) } diff --git a/dmp-frontend/src/app/models/CompositeField.ts b/dmp-frontend/src/app/models/CompositeField.ts index bb6bbeccc..a1e22b860 100644 --- a/dmp-frontend/src/app/models/CompositeField.ts +++ b/dmp-frontend/src/app/models/CompositeField.ts @@ -14,14 +14,14 @@ export class CompositeField extends BaseModel implements Serializable().fromJSONArray(item.fields, Field); + this.fields = JsonSerializer.fromJSONArray(item.fields, Field); this.ordinal = item.ordinal; this.id = item.id; this.title = item.title; - this.multiplicity = new JsonSerializer().fromJSONObject(item.multiplicity, Multiplicity); + this.multiplicity = JsonSerializer.fromJSONObject(item.multiplicity, Multiplicity); //this.multiplicity = new Multiplicity(); //this.multiplicity.max = 2; - if(item.multiplicityItems)this.multiplicityItems = new JsonSerializer().fromJSONArray(item.multiplicityItems, CompositeField); + if(item.multiplicityItems)this.multiplicityItems = JsonSerializer.fromJSONArray(item.multiplicityItems, CompositeField); return this; } diff --git a/dmp-frontend/src/app/models/DatasetProfileDefinitionModel.ts b/dmp-frontend/src/app/models/DatasetProfileDefinitionModel.ts index 268897593..a28c72fc1 100644 --- a/dmp-frontend/src/app/models/DatasetProfileDefinitionModel.ts +++ b/dmp-frontend/src/app/models/DatasetProfileDefinitionModel.ts @@ -11,8 +11,8 @@ export class DatasetProfileDefinitionModel extends BaseModel implements Serializ public sections:Array
fromJSONObject(item:any):DatasetProfileDefinitionModel{ this.status = item.status; - this.sections = new JsonSerializer
().fromJSONArray(item.sections,Section); - this.rules = new JsonSerializer().fromJSONArray(item.rules,Rule); + this.sections = JsonSerializer.fromJSONArray(item.sections,Section); + this.rules = JsonSerializer.fromJSONArray(item.rules,Rule); return this; } diff --git a/dmp-frontend/src/app/models/Field.ts b/dmp-frontend/src/app/models/Field.ts index 260c6e278..be5dfc674 100644 --- a/dmp-frontend/src/app/models/Field.ts +++ b/dmp-frontend/src/app/models/Field.ts @@ -29,12 +29,12 @@ export class Field extends BaseModel implements Serializable, FormGenerat this.viewStyle = item.viewStyle; this.defaultVisibility = item.defaultVisibility; this.page = item.page; - this.multiplicity = new JsonSerializer().fromJSONObject(item.multiplicity, Multiplicity); - this.defaultValue = new JsonSerializer().fromJSONObject(item.defaultValue, DefaultValue); + this.multiplicity = JsonSerializer.fromJSONObject(item.multiplicity, Multiplicity); + this.defaultValue = JsonSerializer.fromJSONObject(item.defaultValue, DefaultValue); this.value = this.defaultValue.value && !item.value ? this.defaultValue.value : item.value; //this.multiplicity = new Multiplicity(); //this.multiplicity.max = 2; - if(item.multiplicityItems)this.multiplicityItems = new JsonSerializer().fromJSONArray(item.multiplicityItems, Field); + if(item.multiplicityItems)this.multiplicityItems = JsonSerializer.fromJSONArray(item.multiplicityItems, Field); this.data = item.data; return this; } diff --git a/dmp-frontend/src/app/models/FieldGroup.ts b/dmp-frontend/src/app/models/FieldGroup.ts index ae608f78f..20eed5f8e 100644 --- a/dmp-frontend/src/app/models/FieldGroup.ts +++ b/dmp-frontend/src/app/models/FieldGroup.ts @@ -27,7 +27,7 @@ export class FieldGroup extends BaseModel implements Serializable, F this.extendedDescription = item.extendedDescription; this.defaultVisibility = item.defaultVisibility; this.page = item.page; - this.compositeFields = new JsonSerializer().fromJSONArray(item.compositeFields, CompositeField); + this.compositeFields = JsonSerializer.fromJSONArray(item.compositeFields, CompositeField); return this; } diff --git a/dmp-frontend/src/app/models/Section.ts b/dmp-frontend/src/app/models/Section.ts index 109e49fc6..2ca192c8c 100644 --- a/dmp-frontend/src/app/models/Section.ts +++ b/dmp-frontend/src/app/models/Section.ts @@ -17,14 +17,14 @@ export class Section extends BaseModel implements Serializable
, FormGen public compositeFields: Array = new Array(); fromJSONObject(item: any): Section { - this.sections = new JsonSerializer
().fromJSONArray(item.sections, Section); + this.sections = JsonSerializer.fromJSONArray(item.sections, Section); //this.fieldGroups = new JsonSerializer().fromJSONArray(item.fieldGroups, FieldGroup); this.page = item.page; this.defaultVisibility = item.defaultVisibility; this.id = item.id; this.title = item.title; this.description = item.description; - this.compositeFields = new JsonSerializer().fromJSONArray(item.fieldSets, CompositeField); + this.compositeFields = JsonSerializer.fromJSONArray(item.fieldSets, CompositeField); return this; } diff --git a/dmp-frontend/src/app/models/data-managemnt-plans/DataManagementPlanModel.ts b/dmp-frontend/src/app/models/data-managemnt-plans/DataManagementPlanModel.ts index 795ed42a0..7ce3d5ea3 100644 --- a/dmp-frontend/src/app/models/data-managemnt-plans/DataManagementPlanModel.ts +++ b/dmp-frontend/src/app/models/data-managemnt-plans/DataManagementPlanModel.ts @@ -32,10 +32,10 @@ export class DataManagementPlanModel implements Serializable().fromJSONObject(item.project, ProjectModel); - this.organisations = new JsonSerializer().fromJSONArray(item.organisations, OrganisationModel); - this.researchers = new JsonSerializer().fromJSONArray(item.researchers, ResearcherModel); - this.profiles = new JsonSerializer().fromJSONArray(item.profiles, ProfileModel); + this.project = JsonSerializer.fromJSONObject(item.project, ProjectModel); + this.organisations = JsonSerializer.fromJSONArray(item.organisations, OrganisationModel); + this.researchers = JsonSerializer.fromJSONArray(item.researchers, ResearcherModel); + this.profiles = JsonSerializer.fromJSONArray(item.profiles, ProfileModel); return this; } diff --git a/dmp-frontend/src/app/models/datasets/DatasetModel.ts b/dmp-frontend/src/app/models/datasets/DatasetModel.ts index 07dbbc9ca..002673c32 100644 --- a/dmp-frontend/src/app/models/datasets/DatasetModel.ts +++ b/dmp-frontend/src/app/models/datasets/DatasetModel.ts @@ -29,9 +29,9 @@ export class DatasetModel implements Serializable { this.uri = item.uri; this.status = item.status; this.description = item.description; - this.services = new JsonSerializer().fromJSONArray(item.services, ServiceModel); - this.registries = new JsonSerializer().fromJSONArray(item.registries, RegisterModel); - this.dataRepositories = new JsonSerializer().fromJSONArray(item.dataRepositories, DataRepositoryModel); + this.services = JsonSerializer.fromJSONArray(item.services, ServiceModel); + this.registries = JsonSerializer.fromJSONArray(item.registries, RegisterModel); + this.dataRepositories = JsonSerializer.fromJSONArray(item.dataRepositories, DataRepositoryModel); return this; } diff --git a/dmp-frontend/src/app/models/datasets/DatasetWizardModel.ts b/dmp-frontend/src/app/models/datasets/DatasetWizardModel.ts index d6f373dce..2be355f9e 100644 --- a/dmp-frontend/src/app/models/datasets/DatasetWizardModel.ts +++ b/dmp-frontend/src/app/models/datasets/DatasetWizardModel.ts @@ -33,12 +33,12 @@ export class DatasetWizardModel implements Serializable { this.uri = item.uri; this.status = item.status; this.description = item.description; - this.services = new JsonSerializer().fromJSONArray(item.services, ServiceModel); - this.registries = new JsonSerializer().fromJSONArray(item.registries, RegisterModel); - this.dataRepositories = new JsonSerializer().fromJSONArray(item.dataRepositories, DataRepositoryModel); - this.dmp = new JsonSerializer().fromJSONObject(item.dmp, DataManagementPlanModel); - this.profile = new JsonSerializer().fromJSONObject(item.profile, DatasetWizardModel); - this.datasetProfileDefinition = new JsonSerializer().fromJSONObject(item.datasetProfileDefinition, DatasetProfileDefinitionModel); + this.services = JsonSerializer.fromJSONArray(item.services, ServiceModel); + this.registries = JsonSerializer.fromJSONArray(item.registries, RegisterModel); + this.dataRepositories = JsonSerializer.fromJSONArray(item.dataRepositories, DataRepositoryModel); + this.dmp = JsonSerializer.fromJSONObject(item.dmp, DataManagementPlanModel); + this.profile = JsonSerializer.fromJSONObject(item.profile, DatasetWizardModel); + this.datasetProfileDefinition = JsonSerializer.fromJSONObject(item.datasetProfileDefinition, DatasetProfileDefinitionModel); return this; } diff --git a/dmp-frontend/src/app/projects/editor/project-editor.component.html b/dmp-frontend/src/app/projects/editor/project-editor.component.html index b0cd9d48a..bd2ef3aa8 100644 --- a/dmp-frontend/src/app/projects/editor/project-editor.component.html +++ b/dmp-frontend/src/app/projects/editor/project-editor.component.html @@ -33,7 +33,7 @@ class="table-input" [matDatepicker]="startDate" formControlName="startDate" required> - {{baseErrorModel.startDate}} + {{this.project.errorModel.startDate}} {{'GENERAL.VALIDATION.REQUIRED' | translate}} diff --git a/dmp-frontend/src/app/projects/editor/project-editor.component.ts b/dmp-frontend/src/app/projects/editor/project-editor.component.ts index 5d8f5e405..d7817f28b 100644 --- a/dmp-frontend/src/app/projects/editor/project-editor.component.ts +++ b/dmp-frontend/src/app/projects/editor/project-editor.component.ts @@ -8,7 +8,7 @@ import { DataManagementPlanService } from "../../services/data-management-plan/d import { ProjectModel } from "../../models/projects/ProjectModel"; import { ProjectService } from "../../services/project/project.service"; import { JsonSerializer } from "../../utilities/JsonSerializer"; -import { FormGroup } from "@angular/forms"; +import { FormGroup, AbstractControl, FormControl, FormArray } from "@angular/forms"; import { SnackBarNotificationComponent } from "../../shared/components/notificaiton/snack-bar-notification.component"; import { BaseErrorModel } from "../../models/error/BaseErrorModel"; import { TdDialogService } from "@covalent/core"; @@ -47,7 +47,7 @@ export class ProjectEditorComponent implements AfterViewInit { this.isNew = false; this.projectService.getSingle(itemId).map(data => data as ProjectModel) .subscribe(data => { - this.project = new JsonSerializer().fromJSONObject(data, ProjectModel); + this.project = JsonSerializer.fromJSONObject(data, ProjectModel); this.formGroup = this.project.buildForm(); }); } else { @@ -60,7 +60,7 @@ export class ProjectEditorComponent implements AfterViewInit { } formSubmit(): void { - //this.touchAllFormFields(this.formGroup); + this.touchAllFormFields(this.formGroup); if (!this.isFormValid()) { return; } this.onSubmit(); } @@ -85,9 +85,9 @@ export class ProjectEditorComponent implements AfterViewInit { this.router.navigate(['/projects']); } - onCallbackError(error: any) { - this.setErrorModel(error.error); - //this.validateAllFormFields(this.formGroup); + onCallbackError(errorResponse: any) { + this.setErrorModel(errorResponse.error); + this.validateAllFormFields(this.formGroup); } public setErrorModel(errorModel: BaseErrorModel) { @@ -117,4 +117,36 @@ export class ProjectEditorComponent implements AfterViewInit { }); }); } + + public touchAllFormFields(formControl: AbstractControl) { + if (formControl instanceof FormControl) { + formControl.markAsTouched(); + } else if (formControl instanceof FormGroup) { + Object.keys(formControl.controls).forEach(item => { + const control = formControl.get(item); + this.touchAllFormFields(control); + }) + } + else if (formControl instanceof FormArray) { + formControl.controls.forEach(item => { + this.touchAllFormFields(item); + }) + } + } + + public validateAllFormFields(formControl: AbstractControl) { + if (formControl instanceof FormControl) { + formControl.updateValueAndValidity({ emitEvent: false }) + } else if (formControl instanceof FormGroup) { + Object.keys(formControl.controls).forEach(item => { + const control = formControl.get(item); + this.validateAllFormFields(control); + }) + } + else if (formControl instanceof FormArray) { + formControl.controls.forEach(item => { + this.validateAllFormFields(item); + }) + } + } } \ No newline at end of file diff --git a/dmp-frontend/src/app/services/auth/auth.service.ts b/dmp-frontend/src/app/services/auth/auth.service.ts index c960812df..6a074b8be 100644 --- a/dmp-frontend/src/app/services/auth/auth.service.ts +++ b/dmp-frontend/src/app/services/auth/auth.service.ts @@ -66,7 +66,7 @@ export class AuthService { return this.http.post(url, loginInfo, { headers: this.headers }) .map((res: any) => { - const principal = this.current(new JsonSerializer().fromJSONObject(res.payload, Principal)); + const principal = this.current(JsonSerializer.fromJSONObject(res.payload, Principal)); //this.loginContextSubject.next(true); return principal; }) @@ -101,7 +101,7 @@ export class AuthService { headers = headers.set('AuthToken', principal.token) return this.http.post(url, null, { headers: headers }) .map((r: Response) => { - const princ = this.current(new JsonSerializer().fromJSONObject(r.json(), Principal)); + const princ = this.current(JsonSerializer.fromJSONObject(r.json(), Principal)); //this.loginContextSubject.next(true); return princ; }) diff --git a/dmp-frontend/src/app/utilities/JsonSerializer.ts b/dmp-frontend/src/app/utilities/JsonSerializer.ts index b3b23d812..da284c1ad 100644 --- a/dmp-frontend/src/app/utilities/JsonSerializer.ts +++ b/dmp-frontend/src/app/utilities/JsonSerializer.ts @@ -1,7 +1,7 @@ import { Serializable } from '../models/interfaces/Serializable'; -export class JsonSerializer>{ +export class JsonSerializer{ - public fromJSONArray(items: any[], type: { new(): T; }): T[] { + public static fromJSONArray>(items: any[], type: { new(): T; }): T[] { if(!items)return new Array(); const objectList: T[] = new Array(); for (let i = 0; i < items.length; i++) { @@ -10,7 +10,7 @@ export class JsonSerializer>{ return objectList; } - public fromJSONObject(item: any, type: { new(): T; }): T { + public static fromJSONObject>(item: any, type: { new(): T; }): T { if(!item)return null; return new type().fromJSONObject(item); }