From 367861c0508b60c517473a5432122aab8b816c32 Mon Sep 17 00:00:00 2001 From: Aldo Mihasi Date: Wed, 20 Sep 2023 09:34:39 +0300 Subject: [PATCH] fix bugs: saving extra fields in dmp, showing draft blueprints when min or max of a description template are not set --- .../managers/DataManagementPlanManager.java | 20 +++++----- .../models/data/dmp/DataManagementPlan.java | 37 +++++++++++------- .../dmp/DataManagementPlanEditorModel.java | 25 +++++++----- .../models/data/dmp/ExtraFieldModel.java | 20 ++++++++++ .../DescriptionTemplate.java | 4 +- .../DataManagementPlanOverviewModel.java | 2 +- .../src/app/core/model/dmp/dmp-extra-field.ts | 4 ++ dmp-frontend/src/app/core/model/dmp/dmp.ts | 3 +- .../dmp-editor-blueprint.component.html | 14 +++---- .../dmp-editor-blueprint.component.ts | 39 +++++++++++++++++-- .../src/app/ui/dmp/editor/dmp-editor.model.ts | 37 ++++++++++++------ .../dmp/overview/dmp-overview.component.html | 6 ++- .../ui/dmp/wizard/dmp-wizard-editor.model.ts | 12 +++--- 13 files changed, 156 insertions(+), 67 deletions(-) create mode 100644 dmp-backend/web/src/main/java/eu/eudat/models/data/dmp/ExtraFieldModel.java create mode 100644 dmp-frontend/src/app/core/model/dmp/dmp-extra-field.ts 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 bd1c93ac5..b447f83b6 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 @@ -1958,15 +1958,15 @@ public class DataManagementPlanManager { // Creates new dataManagementPlan to fill it with the data model that was parsed from the xml. // Creates properties. DataManagementPlanEditorModel dm = new DataManagementPlanEditorModel(); - DataManagementPlanProfile dmpProfile = new DataManagementPlanProfile(); - - List fieldList = new LinkedList<>(); - Field field = new Field(); - field.setLabel(dataManagementPlans.get(0).getDmpProfile().getDmpProfileName()); - field.setId(dataManagementPlans.get(0).getDmpProfile().getDmpProfileId()); - - fieldList.add(field); - dmpProfile.setFields(fieldList); +// DataManagementPlanProfile dmpProfile = new DataManagementPlanProfile(); +// +// List fieldList = new LinkedList<>(); +// Field field = new Field(); +// field.setLabel(dataManagementPlans.get(0).getDmpProfile().getDmpProfileName()); +// field.setId(dataManagementPlans.get(0).getDmpProfile().getDmpProfileId()); +// +// fieldList.add(field); +// dmpProfile.setFields(fieldList); /*Tuple tuple = new Tuple(); tuple.setId(dataManagementPlans.get(0).getDmpProfile().getDmpProfileId()); @@ -2043,7 +2043,7 @@ public class DataManagementPlanManager { dm.setResearchers(researchers); // Sets researchers property. dm.setAssociatedUsers(associatedUsers); // Sets associatedUsers property. dm.setDynamicFields(dynamicFields); // Sets dynamicFields property. - dm.setDefinition(dmpProfile); + //dm.setDefinition(dmpProfile); //ObjectMapper mapper = new ObjectMapper(); Map extraPropertiesMap = new HashMap<>(); if (dataManagementPlans.get(0).getLanguage() != null) { diff --git a/dmp-backend/web/src/main/java/eu/eudat/models/data/dmp/DataManagementPlan.java b/dmp-backend/web/src/main/java/eu/eudat/models/data/dmp/DataManagementPlan.java index 3811ead04..01cc8321e 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/models/data/dmp/DataManagementPlan.java +++ b/dmp-backend/web/src/main/java/eu/eudat/models/data/dmp/DataManagementPlan.java @@ -35,7 +35,7 @@ public class DataManagementPlan implements DataModel { private List organisations; private List researchers; private List associatedUsers; - private DataManagementPlanProfile definition; + private List extraFields; private eu.eudat.models.data.userinfo.UserInfo creator; private Date modified; private Date created; @@ -153,11 +153,11 @@ public class DataManagementPlan implements DataModel { this.description = description; } - public DataManagementPlanProfile getDefinition() { - return definition; + public List getExtraFields() { + return extraFields; } - public void setDefinition(DataManagementPlanProfile definition) { - this.definition = definition; + public void setExtraFields(List extraFields) { + this.extraFields = extraFields; } public Map getProperties() { @@ -253,11 +253,13 @@ public class DataManagementPlan implements DataModel { this.creator = new eu.eudat.models.data.userinfo.UserInfo(); this.groupId = entity.getGroupId(); this.lockable = entity.getDataset() != null && entity.getDataset().stream().findAny().isPresent(); - this.definition = entity.getProfile() == null ? null : new DataManagementPlanProfile().fromXml(XmlBuilder.fromXml(entity.getProfile().getDefinition()).getDocumentElement()); - if (this.definition != null && this.definition.getFields() != null && !this.definition.getFields().isEmpty() && this.properties != null) { - this.definition.getFields().forEach(item -> { - Optional> fieldOptional = ((List>) this.properties.get("fields")).stream().filter(field -> field.get("id").equals(item.getId().toString())).findFirst(); - if (fieldOptional.isPresent()) item.setValue(fieldOptional.get().get("value")); + if (this.properties != null) { + this.extraFields = new ArrayList<>(); + this.properties.forEach((id, value) -> { + ExtraFieldModel extraField = new ExtraFieldModel(); + extraField.setId(id); + extraField.setValue(value.toString()); + this.extraFields.add(extraField); }); } if (entity.getUsers() != null && entity.getUsers().stream().anyMatch(userDMP -> userDMP.getRole().equals(UserDMP.UserDMPRoles.OWNER.getValue()))) @@ -345,6 +347,9 @@ public class DataManagementPlan implements DataModel { } dataManagementPlanEntity.setAssociatedDmps(dmpDatasetProfiles); } + if(this.extraFields != null) { + this.properties = this.extraFields.stream().collect(Collectors.toMap(ExtraFieldModel::getId, ExtraFieldModel::getValue)); + } dataManagementPlanEntity.setProperties(this.properties != null ? JSONObject.toJSONString(this.properties) : null); dataManagementPlanEntity.setGroupId(this.groupId != null ? this.groupId : UUID.randomUUID()); dataManagementPlanEntity.setModified(this.modified != null ? this.modified : new Date()); @@ -371,11 +376,13 @@ public class DataManagementPlan implements DataModel { this.creator = new eu.eudat.models.data.userinfo.UserInfo(); this.groupId = entity.getGroupId(); this.lockable = entity.getDataset() != null && entity.getDataset().stream().findAny().isPresent(); - this.definition = entity.getProfile() == null ? null : new DataManagementPlanProfile().fromXml(XmlBuilder.fromXml(entity.getProfile().getDefinition()).getDocumentElement()); - if (this.definition != null && this.definition.getFields() != null && !this.definition.getFields().isEmpty() && this.properties != null) { - this.definition.getFields().forEach(item -> { - Optional> fieldOptional = ((List>) this.properties.get("fields")).stream().filter(field -> field.get("id").equals(item.getId().toString())).findFirst(); - fieldOptional.ifPresent(stringObjectMap -> item.setValue(stringObjectMap.get("value"))); + if (this.properties != null) { + this.extraFields = new ArrayList<>(); + this.properties.forEach((id, value) -> { + ExtraFieldModel extraField = new ExtraFieldModel(); + extraField.setId(id); + extraField.setValue(value.toString()); + this.extraFields.add(extraField); }); } if (entity.getUsers() != null && entity.getUsers().stream().anyMatch(userDMP -> userDMP.getRole().equals(UserDMP.UserDMPRoles.OWNER.getValue()))) diff --git a/dmp-backend/web/src/main/java/eu/eudat/models/data/dmp/DataManagementPlanEditorModel.java b/dmp-backend/web/src/main/java/eu/eudat/models/data/dmp/DataManagementPlanEditorModel.java index babf28de9..29ffb6e00 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/models/data/dmp/DataManagementPlanEditorModel.java +++ b/dmp-backend/web/src/main/java/eu/eudat/models/data/dmp/DataManagementPlanEditorModel.java @@ -34,7 +34,7 @@ public class DataManagementPlanEditorModel implements DataModel organisations; private List researchers; private List associatedUsers; - private DataManagementPlanProfile definition; + private List extraFields; private eu.eudat.models.data.userinfo.UserInfo creator; private Date modified; private Date created; @@ -151,11 +151,11 @@ public class DataManagementPlanEditorModel implements DataModel getExtraFields() { + return extraFields; } - public void setDefinition(DataManagementPlanProfile definition) { - this.definition = definition; + public void setExtraFields(List extraFields) { + this.extraFields = extraFields; } public Map getProperties() { @@ -239,11 +239,13 @@ public class DataManagementPlanEditorModel implements DataModel { - Optional> fieldOptional = ((List>) this.properties.get("fields")).stream().filter(field -> field.get("id").equals(item.getId().toString())).findFirst(); - if (fieldOptional.isPresent()) item.setValue(fieldOptional.get().get("value")); + if (this.properties != null) { + this.extraFields = new ArrayList<>(); + this.properties.forEach((id, value) -> { + ExtraFieldModel extraField = new ExtraFieldModel(); + extraField.setId(id); + extraField.setValue(value.toString()); + this.extraFields.add(extraField); }); } if (entity.getUsers().stream().anyMatch(userDMP -> userDMP.getRole().equals(UserDMP.UserDMPRoles.OWNER.getValue()))) @@ -371,6 +373,9 @@ public class DataManagementPlanEditorModel implements DataModel this.id = UUID.fromString(item.getAttribute("id")); this.descriptionTemplateId = UUID.fromString(item.getAttribute("descriptionTemplateId")); this.label = item.getAttribute("label"); - this.minMultiplicity = Integer.valueOf(item.getAttribute("minMultiplicity")); - this.maxMultiplicity = Integer.valueOf(item.getAttribute("maxMultiplicity")); + this.minMultiplicity = item.hasAttribute("minMultiplicity") && !item.getAttribute("minMultiplicity").equals("null") ? Integer.parseInt(item.getAttribute("minMultiplicity")) : null; + this.maxMultiplicity = item.hasAttribute("maxMultiplicity") && !item.getAttribute("minMultiplicity").equals("null") ? Integer.parseInt(item.getAttribute("maxMultiplicity")) : null; return this; } } diff --git a/dmp-backend/web/src/main/java/eu/eudat/models/data/listingmodels/DataManagementPlanOverviewModel.java b/dmp-backend/web/src/main/java/eu/eudat/models/data/listingmodels/DataManagementPlanOverviewModel.java index 1c79930b0..811d18bf3 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/models/data/listingmodels/DataManagementPlanOverviewModel.java +++ b/dmp-backend/web/src/main/java/eu/eudat/models/data/listingmodels/DataManagementPlanOverviewModel.java @@ -190,7 +190,7 @@ public class DataManagementPlanOverviewModel implements DataModel; dynamicFields: Array; modified: Date; extraProperties: Map; diff --git a/dmp-frontend/src/app/ui/dmp/dmp-editor-blueprint/dmp-editor-blueprint.component.html b/dmp-frontend/src/app/ui/dmp/dmp-editor-blueprint/dmp-editor-blueprint.component.html index f0e80534f..14c836714 100644 --- a/dmp-frontend/src/app/ui/dmp/dmp-editor-blueprint/dmp-editor-blueprint.component.html +++ b/dmp-frontend/src/app/ui/dmp/dmp-editor-blueprint/dmp-editor-blueprint.component.html @@ -268,26 +268,26 @@ -->
-
+
- +
-
+
-
+
- +
-
+
- +
diff --git a/dmp-frontend/src/app/ui/dmp/dmp-editor-blueprint/dmp-editor-blueprint.component.ts b/dmp-frontend/src/app/ui/dmp/dmp-editor-blueprint/dmp-editor-blueprint.component.ts index be658a829..1eea3c3a9 100644 --- a/dmp-frontend/src/app/ui/dmp/dmp-editor-blueprint/dmp-editor-blueprint.component.ts +++ b/dmp-frontend/src/app/ui/dmp/dmp-editor-blueprint/dmp-editor-blueprint.component.ts @@ -1,13 +1,13 @@ import { Component, OnInit } from '@angular/core'; -import { AbstractControl, FormArray, FormControl, FormGroup, Validators } from '@angular/forms'; +import { AbstractControl, FormArray, FormBuilder, FormControl, FormGroup, Validators } from '@angular/forms'; import { DataTableRequest } from '@app/core/model/data-table/data-table-request'; -import { DmpBlueprintDefinition, FieldCategory, SystemFieldType } from '@app/core/model/dmp/dmp-blueprint/dmp-blueprint'; +import { DmpBlueprintDefinition, ExtraFieldType, FieldCategory, SystemFieldType } from '@app/core/model/dmp/dmp-blueprint/dmp-blueprint'; import { DmpBlueprintCriteria } from '@app/core/query/dmp/dmp-blueprint-criteria'; import { DmpProfileService } from '@app/core/services/dmp/dmp-profile.service'; import { SingleAutoCompleteConfiguration } from '@app/library/auto-complete/single/single-auto-complete-configuration'; import { DmpBlueprintEditor } from '@app/ui/admin/dmp-profile/editor/dmp-blueprint-editor.model'; import { debounceTime, filter, map, switchMap, takeUntil, tap } from 'rxjs/operators'; -import { DmpEditorModel } from '../editor/dmp-editor.model'; +import { DmpEditorModel, DmpExtraFieldEditorModel } from '../editor/dmp-editor.model'; import { ExtraPropertiesFormModel } from '../editor/general-tab/extra-properties-form.model'; import { FunderFormModel } from '../editor/grant-tab/funder-form-model'; import { GrantTabModel } from '../editor/grant-tab/grant-tab-model'; @@ -109,6 +109,8 @@ export class DmpEditorBlueprintComponent extends CheckDeactivateBaseComponent im sectionTemplates: Array> = new Array>(); + extraFieldTypesEnum = ExtraFieldType; + private associates: UserModel[] = []; visibles: Visible[] = [ @@ -181,6 +183,7 @@ export class DmpEditorBlueprintComponent extends CheckDeactivateBaseComponent im this.checkForGrant(); this.checkForFunder(); this.checkForProject(); + this.buildExtraFields(); this.formGroup.get('profile').setValue(result); this.maxStep = this.selectedDmpBlueprintDefinition.sections.length; this.step = 1; @@ -248,6 +251,10 @@ export class DmpEditorBlueprintComponent extends CheckDeactivateBaseComponent im .pipe(takeUntil(this._destroyed)) .subscribe(result => { this.selectedDmpBlueprintDefinition = result.definition; + this.checkForGrant(); + this.checkForFunder(); + this.checkForProject(); + this.buildExtraFields(); this.formGroup.get('profile').setValue(result); this.maxStep = this.selectedDmpBlueprintDefinition.sections.length; this.step = 1; @@ -790,6 +797,7 @@ export class DmpEditorBlueprintComponent extends CheckDeactivateBaseComponent im this.checkForGrant(); this.checkForFunder(); this.checkForProject(); + this.buildExtraFields(); this.addProfiles(); } else { @@ -798,6 +806,31 @@ export class DmpEditorBlueprintComponent extends CheckDeactivateBaseComponent im }) } + private buildExtraFields(): void { + const extraFields = new Array(); + this.selectedDmpBlueprintDefinition.sections.forEach(section => section.fields.forEach(field => { + if (field.category as unknown == 'EXTRA') { + let extraField = new DmpExtraFieldEditorModel(); + extraField.id = field.id; + if (!isNullOrUndefined(this.dmp.extraFields)) { + extraField.value = this.dmp.extraFields.find(f => f.id === field.id).value; + } + extraFields.push(extraField.buildForm()); + } + })); + this.formGroup.setControl('extraFields', new FormBuilder().array(extraFields)); + } + + getExtraFieldIndex(id: string): string { + let foundFieldIndex: number; + (this.formGroup.get('extraFields') as FormArray).controls.forEach((element, index) => { + if(element.value.id === id) { + foundFieldIndex = index; + } + }); + return foundFieldIndex.toString(); + } + private checkForGrant() { let hasGrant = false; this.selectedDmpBlueprintDefinition.sections.forEach(section => section.fields.forEach( diff --git a/dmp-frontend/src/app/ui/dmp/editor/dmp-editor.model.ts b/dmp-frontend/src/app/ui/dmp/editor/dmp-editor.model.ts index 8c7547485..42f641fd1 100644 --- a/dmp-frontend/src/app/ui/dmp/editor/dmp-editor.model.ts +++ b/dmp-frontend/src/app/ui/dmp/editor/dmp-editor.model.ts @@ -2,7 +2,6 @@ import { FormBuilder, FormGroup, Validators } from "@angular/forms"; import { DmpProfileFieldDataType } from '@app/core/common/enum/dmp-profile-field-type'; import { DmpProfileType } from '@app/core/common/enum/dmp-profile-type'; import { DmpStatus } from '@app/core/common/enum/dmp-status'; -import { DmpProfileDefinition } from '@app/core/model/dmp-profile/dmp-profile'; import { DmpProfileField } from '@app/core/model/dmp-profile/dmp-profile-field'; import { DmpModel } from '@app/core/model/dmp/dmp'; import { DmpDynamicField } from '@app/core/model/dmp/dmp-dynamic-field'; @@ -23,6 +22,7 @@ import { ExtraPropertiesFormModel } from './general-tab/extra-properties-form.mo import { isNullOrUndefined } from '@app/utilities/enhancers/utils'; import { DatasetWizardEditorModel } from '@app/ui/dataset/dataset-wizard/dataset-wizard-editor.model'; import { DmpDatasetProfile } from "@app/core/model/dmp/dmp-dataset-profile/dmp-dataset-profile"; +import { DmpExtraField } from "@app/core/model/dmp/dmp-extra-field"; export class DmpEditorModel { public id: string; @@ -45,7 +45,7 @@ export class DmpEditorModel { public datasetsToBeFinalized: string[] = []; public associatedUsers: UserModel[] = []; public users: UserInfoListingModel[] = []; - public definition: DmpProfileDefinition; + public extraFields: Array = []; public dynamicFields: Array = []; public validationErrorModel: ValidationErrorModel = new ValidationErrorModel(); public modified: Date; @@ -70,7 +70,7 @@ export class DmpEditorModel { this.datasetsToBeFinalized = item.datasetsToBeFinalized; this.associatedUsers = item.associatedUsers; this.users = item.users; - if (item.definition) { this.definition = item.definition; } + if (item.extraFields) { item.extraFields.map(x => this.extraFields.push(new DmpExtraFieldEditorModel().fromModel(x))); } if (item.dynamicFields) { item.dynamicFields.map(x => this.dynamicFields.push(new DmpDynamicFieldEditorModel().fromModel(x))); } this.creator = item.creator; this.modified = new Date(item.modified); @@ -113,14 +113,9 @@ export class DmpEditorModel { if (this.dynamicFields) { this.dynamicFields.forEach(item => dynamicFields.push(item.buildForm())); } formGroup.addControl('dynamicFields', new FormBuilder().array(dynamicFields)); - if (this.definition) { - const fields = new Array(); - this.definition.fields.forEach(item => fields.push(new DmpDefinitionFieldEditorModel().fromModel(item).buildForm())); - const definition = new FormBuilder().group({ - fields: new FormBuilder().array(fields) - }); - formGroup.addControl('definition', definition); - } + const extraFields = new Array(); + if (this.extraFields) { this.extraFields.forEach(item => extraFields.push(item.buildForm())); } + formGroup.addControl('extraFields', new FormBuilder().array(extraFields)); return formGroup; } @@ -149,6 +144,26 @@ export class DmpEditorModel { } } +export class DmpExtraFieldEditorModel { + public id: string; + public value: string; + + fromModel(item: DmpExtraField): DmpExtraFieldEditorModel { + this.id = item.id; + this.value = item.value; + return this; + } + + buildForm(): FormGroup { + const builder = new FormBuilder(); + const formGroup = builder.group({ + id: [this.id], + value: [this.value] + }); + return formGroup; + } +} + export class DmpDynamicFieldEditorModel { public id: string; diff --git a/dmp-frontend/src/app/ui/dmp/overview/dmp-overview.component.html b/dmp-frontend/src/app/ui/dmp/overview/dmp-overview.component.html index f64512914..77a5e3435 100644 --- a/dmp-frontend/src/app/ui/dmp/overview/dmp-overview.component.html +++ b/dmp-frontend/src/app/ui/dmp/overview/dmp-overview.component.html @@ -61,8 +61,10 @@ delete
-
{{'DMP-OVERVIEW.GRANT' | translate}}
-
{{ dmp.grant.label }}
+
+
{{'DMP-OVERVIEW.GRANT' | translate}}
+
{{ dmp.grant.label }}
+
{{'DMP-OVERVIEW.RESEARCHERS' | translate}}
diff --git a/dmp-frontend/src/app/ui/dmp/wizard/dmp-wizard-editor.model.ts b/dmp-frontend/src/app/ui/dmp/wizard/dmp-wizard-editor.model.ts index 64fd7278f..f4725cb41 100644 --- a/dmp-frontend/src/app/ui/dmp/wizard/dmp-wizard-editor.model.ts +++ b/dmp-frontend/src/app/ui/dmp/wizard/dmp-wizard-editor.model.ts @@ -1,6 +1,4 @@ import { FormBuilder, FormGroup, Validators } from "@angular/forms"; -import { Status } from '@app/core/common/enum/status'; -import { DmpProfile, DmpProfileDefinition } from '@app/core/model/dmp-profile/dmp-profile'; import { DmpModel } from '@app/core/model/dmp/dmp'; import { DmpDynamicField } from '@app/core/model/dmp/dmp-dynamic-field'; import { DmpDynamicFieldDependency } from '@app/core/model/dmp/dmp-dynamic-field-dependency'; @@ -18,6 +16,7 @@ import { DmpStatus } from '@app/core/common/enum/dmp-status'; import { ExtraPropertiesFormModel } from '../editor/general-tab/extra-properties-form.model'; import { UserInfoListingModel } from '@app/core/model/user/user-info-listing'; import { DmpDatasetProfile } from "@app/core/model/dmp/dmp-dataset-profile/dmp-dataset-profile"; +import { DmpExtraFieldEditorModel } from "../editor/dmp-editor.model"; export class DmpWizardEditorModel { public id: string; @@ -37,7 +36,7 @@ export class DmpWizardEditorModel { public profiles: DmpDatasetProfile[] = []; public associatedUsers: UserModel[] = []; public users: UserInfoListingModel[] = []; - public definition: DmpProfileDefinition; + public extraFields: Array = []; public dynamicFields: Array = []; public validationErrorModel: ValidationErrorModel = new ValidationErrorModel(); public extraProperties: ExtraPropertiesFormModel; @@ -59,7 +58,7 @@ export class DmpWizardEditorModel { this.profiles = item.profiles; this.associatedUsers = item.associatedUsers; this.users = item.users; - if (item.definition) { this.definition = item.definition; } + if (item.extraFields) { item.extraFields.map(x => this.extraFields.push(new DmpExtraFieldEditorModel().fromModel(x))); } if (item.dynamicFields) { item.dynamicFields.map(x => this.dynamicFields.push(new DmpDynamicFieldEditorModel().fromModel(x))); } this.creator = item.creator; this.extraProperties.fromModel(item.extraProperties); @@ -91,9 +90,12 @@ export class DmpWizardEditorModel { const dynamicFields = new Array(); if (this.dynamicFields) { this.dynamicFields.forEach(item => dynamicFields.push(item.buildForm())); } - formGroup.addControl('dynamicFields', new FormBuilder().array(dynamicFields)); + const extraFields = new Array(); + if (this.extraFields) { this.extraFields.forEach(item => extraFields.push(item.buildForm())); } + formGroup.addControl('extraFields', new FormBuilder().array(extraFields)); + return formGroup; }