From ef02fa806ecd043fb23888f5497473965bf359e5 Mon Sep 17 00:00:00 2001 From: Diamantis Tziotzios Date: Fri, 19 Jan 2024 18:28:53 +0200 Subject: [PATCH] various fixes --- .../java/eu/eudat/model/DmpReference.java | 12 +++++++ .../model/builder/DmpReferenceBuilder.java | 1 + .../eu/eudat/query/DmpReferenceQuery.java | 2 ++ .../query/lookup/DmpReferenceLookup.java | 30 ++++++++++++++-- .../eu/eudat/service/dmp/DmpServiceImpl.java | 7 ++-- .../main/resources/config/storage-devel.yml | 2 +- dmp-frontend/src/app/core/model/dmp/dmp.ts | 2 +- .../services/reference/reference.service.ts | 34 +++++++++++++++++-- .../dmp-editor.component.ts | 14 ++++---- .../dmp-editor-blueprint/dmp-editor.model.ts | 15 ++++---- .../dmp-editor.resolver.ts | 1 + 11 files changed, 96 insertions(+), 24 deletions(-) diff --git a/dmp-backend/core/src/main/java/eu/eudat/model/DmpReference.java b/dmp-backend/core/src/main/java/eu/eudat/model/DmpReference.java index b29f6a535..857e11d42 100644 --- a/dmp-backend/core/src/main/java/eu/eudat/model/DmpReference.java +++ b/dmp-backend/core/src/main/java/eu/eudat/model/DmpReference.java @@ -1,5 +1,6 @@ package eu.eudat.model; +import eu.eudat.commons.enums.IsActive; import eu.eudat.model.dmpreference.DmpReferenceData; import java.time.Instant; @@ -16,6 +17,9 @@ public class DmpReference { private Reference reference; public static final String _reference = "reference"; + private IsActive isActive; + public static final String _isActive = "isActive"; + private Instant createdAt; public static final String _createdAt = "createdAt"; @@ -53,6 +57,14 @@ public class DmpReference { this.reference = reference; } + public IsActive getIsActive() { + return isActive; + } + + public void setIsActive(IsActive isActive) { + this.isActive = isActive; + } + public Instant getCreatedAt() { return createdAt;} public void setCreatedAt(Instant createdAt) {this.createdAt = createdAt;} diff --git a/dmp-backend/core/src/main/java/eu/eudat/model/builder/DmpReferenceBuilder.java b/dmp-backend/core/src/main/java/eu/eudat/model/builder/DmpReferenceBuilder.java index 94440d537..21ddba61f 100644 --- a/dmp-backend/core/src/main/java/eu/eudat/model/builder/DmpReferenceBuilder.java +++ b/dmp-backend/core/src/main/java/eu/eudat/model/builder/DmpReferenceBuilder.java @@ -74,6 +74,7 @@ public class DmpReferenceBuilder extends BaseBuilder { item.setDmpId(QueryBase.convertSafe(tuple, columns, DmpReferenceEntity._dmpId, UUID.class)); item.setReferenceId(QueryBase.convertSafe(tuple, columns, DmpReferenceEntity._referenceId, UUID.class)); item.setData(QueryBase.convertSafe(tuple, columns, DmpReferenceEntity._data, String.class)); + item.setIsActive(QueryBase.convertSafe(tuple, columns, DmpReferenceEntity._isActive, IsActive.class)); item.setCreatedAt(QueryBase.convertSafe(tuple, columns, DmpReferenceEntity._createdAt, Instant.class)); item.setUpdatedAt(QueryBase.convertSafe(tuple, columns, DmpReferenceEntity._updatedAt, Instant.class)); return item; @@ -224,6 +225,7 @@ public class DmpReferenceQuery extends QueryBase { else if (item.match(DmpReference._dmp) || item.match(PublicDmpReference._dmp)) return DmpReferenceEntity._dmpId; else if (item.match(DmpReference._reference) || item.match(PublicDmpReference._reference)) return DmpReferenceEntity._referenceId; else if (item.prefix(DmpReference._data)) return DmpReferenceEntity._data; + else if (item.match(DmpReference._isActive)) return DmpReferenceEntity._isActive; else if (item.match(DmpReference._createdAt)) return DmpReferenceEntity._createdAt; else if (item.match(DmpReference._updatedAt)) return DmpReferenceEntity._updatedAt; else if (item.match(DmpReference._hash)) return DmpReferenceEntity._updatedAt; diff --git a/dmp-backend/core/src/main/java/eu/eudat/query/lookup/DmpReferenceLookup.java b/dmp-backend/core/src/main/java/eu/eudat/query/lookup/DmpReferenceLookup.java index 706cd5ac8..29fbd3407 100644 --- a/dmp-backend/core/src/main/java/eu/eudat/query/lookup/DmpReferenceLookup.java +++ b/dmp-backend/core/src/main/java/eu/eudat/query/lookup/DmpReferenceLookup.java @@ -5,16 +5,40 @@ import gr.cite.tools.data.query.Lookup; import gr.cite.tools.data.query.QueryFactory; import java.util.Collection; +import java.util.List; import java.util.UUID; public class DmpReferenceLookup extends Lookup { - private Collection ids; + private List ids; - private Collection dmpIds; + private List dmpIds; - private Collection referenceIds; + private List referenceIds; + public List getIds() { + return ids; + } + + public void setIds(List ids) { + this.ids = ids; + } + + public List getDmpIds() { + return dmpIds; + } + + public void setDmpIds(List dmpIds) { + this.dmpIds = dmpIds; + } + + public List getReferenceIds() { + return referenceIds; + } + + public void setReferenceIds(List referenceIds) { + this.referenceIds = referenceIds; + } public DmpReferenceQuery enrich(QueryFactory queryFactory) { DmpReferenceQuery query = queryFactory.query(DmpReferenceQuery.class); diff --git a/dmp-backend/core/src/main/java/eu/eudat/service/dmp/DmpServiceImpl.java b/dmp-backend/core/src/main/java/eu/eudat/service/dmp/DmpServiceImpl.java index 13f583790..3742c0c0c 100644 --- a/dmp-backend/core/src/main/java/eu/eudat/service/dmp/DmpServiceImpl.java +++ b/dmp-backend/core/src/main/java/eu/eudat/service/dmp/DmpServiceImpl.java @@ -569,7 +569,7 @@ public class DmpServiceImpl implements DmpService { data.getContacts().add(this.buildDmpContactEntity(contactPersist)); } } - if (persist.getDmpBlueprintValues() == null && !persist.getDmpBlueprintValues().isEmpty()){ + if (persist.getDmpBlueprintValues() != null && !persist.getDmpBlueprintValues().isEmpty()){ data.setDmpBlueprintValues(new ArrayList<>()); for (DmpBlueprintValuePersist fieldValuePersist: persist.getDmpBlueprintValues().values()) { if (!this.conventionService.isNullOrEmpty(fieldValuePersist.getFieldValue())) data.getDmpBlueprintValues().add(this.buildDmpBlueprintValueEntity(fieldValuePersist)); @@ -604,7 +604,7 @@ public class DmpServiceImpl implements DmpService { private @NotNull List buildDmpReferencePersists(DmpPropertiesPersist persist){ List dmpReferencePersists = new ArrayList<>(); - if (persist.getDmpBlueprintValues() == null && !persist.getDmpBlueprintValues().isEmpty()){ + if (persist.getDmpBlueprintValues() != null && !persist.getDmpBlueprintValues().isEmpty()){ for (DmpBlueprintValuePersist fieldValuePersist: persist.getDmpBlueprintValues().values()) { if (this.conventionService.isNullOrEmpty(fieldValuePersist.getFieldValue()) && !this.conventionService.isListNullOrEmpty( fieldValuePersist.getReferences())) { for (ReferencePersist referencePersist : fieldValuePersist.getReferences()) { @@ -636,7 +636,7 @@ public class DmpServiceImpl implements DmpService { Map dmpReferenceDataEntityMap = new HashMap<>(); for (DmpReferenceEntity dmpReferenceEntity : dmpReferences){ - dmpReferenceDataEntityMap.put(dmpReferenceEntity.getDmpId(), this.jsonHandlingService.fromJsonSafe(DmpReferenceDataEntity.class, dmpReferenceEntity.getData())); + dmpReferenceDataEntityMap.put(dmpReferenceEntity.getId(), this.jsonHandlingService.fromJsonSafe(DmpReferenceDataEntity.class, dmpReferenceEntity.getData())); } List updatedCreatedIds = new ArrayList<>(); @@ -708,6 +708,7 @@ public class DmpServiceImpl implements DmpService { data.setId(UUID.randomUUID()); data.setIsActive(IsActive.Active); data.setCreatedAt(Instant.now()); + data.setUpdatedAt(Instant.now()); data.setDmpId(id); data.setSectionId(model.getSectionId()); data.setDescriptionTemplateGroupId(model.getDescriptionTemplateGroupId()); diff --git a/dmp-backend/web/src/main/resources/config/storage-devel.yml b/dmp-backend/web/src/main/resources/config/storage-devel.yml index d3f9cb46c..1e2173850 100644 --- a/dmp-backend/web/src/main/resources/config/storage-devel.yml +++ b/dmp-backend/web/src/main/resources/config/storage-devel.yml @@ -9,7 +9,7 @@ storage: - type: Transformer basePath: ${TRANSFORMER_BASE_PATH} static-files: - externalUrls: externalUrls/ExternalUrls.xml + externalUrls: dmp-backend/web/src/main/resources/externalUrls/ExternalUrls.xml semantics: Semantics.json h2020Template: documents/h2020.docx h2020DescriptionTemplate: documents/h2020_dataset.docx diff --git a/dmp-frontend/src/app/core/model/dmp/dmp.ts b/dmp-frontend/src/app/core/model/dmp/dmp.ts index 5b3507a81..39610071c 100644 --- a/dmp-frontend/src/app/core/model/dmp/dmp.ts +++ b/dmp-frontend/src/app/core/model/dmp/dmp.ts @@ -81,7 +81,7 @@ export interface DmpPersist extends BaseEntityPersist { } export interface DmpPropertiesPersist { - dmpBlueprintValues: DmpBlueprintValuePersist[]; + dmpBlueprintValues: Map; contacts: DmpContactPersist[]; } diff --git a/dmp-frontend/src/app/core/services/reference/reference.service.ts b/dmp-frontend/src/app/core/services/reference/reference.service.ts index 49e5480ea..e485ccc12 100644 --- a/dmp-frontend/src/app/core/services/reference/reference.service.ts +++ b/dmp-frontend/src/app/core/services/reference/reference.service.ts @@ -103,7 +103,7 @@ export class ReferenceService { lookup.project = { fields: [ nameof(x => x.id), - nameof(x => x.label) + nameof(x => x.label), ] }; if (types && types.length > 0) { lookup.types = types; } @@ -120,7 +120,7 @@ export class ReferenceService { return { initialItems: (data?: any) => this.search(this.buildAutocompleteSearchLookup(type)).pipe(map(x => x)), filterFn: (searchQuery: string, data?: any) => this.search(this.buildAutocompleteSearchLookup(type, searchQuery)).pipe(map(x => x)), - getSelectedItem: (selectedItem: any) => this.search(this.buildAutocompleteSearchLookup(type)).pipe(map(x => x[0])), + getSelectedItem: (selectedItem: any) => this.query(this.buildAutocompleteSearchSelectedItemsLookup([type], null, null, null, [selectedItem])).pipe(map(x => x.items[0])), displayFn: (item: Reference) => item.label, titleFn: (item: Reference) => item.label, valueAssign: (item: Reference) => item.id, @@ -131,7 +131,7 @@ export class ReferenceService { return { initialItems: (excludedItems: any[], data?: any) => this.search(this.buildAutocompleteSearchLookup(type, null)).pipe(map(x => x)), filterFn: (searchQuery: string, excludedItems: any[]) => this.search(this.buildAutocompleteSearchLookup(type, searchQuery)).pipe(map(x => x)), - getSelectedItems: (selectedItems: any[]) => this.search(this.buildAutocompleteSearchLookup(type, null)).pipe(map(x => x)), + getSelectedItems: (selectedItems: any[]) => this.query(this.buildAutocompleteSearchSelectedItemsLookup([type], null, null, null, selectedItems?.map(x => x.id))).pipe(map(x => x.items)), displayFn: (item: Reference) => item.label, titleFn: (item: Reference) => item.label, valueAssign: (item: Reference) => item, @@ -162,6 +162,34 @@ export class ReferenceService { return lookup; } + private buildAutocompleteSearchSelectedItemsLookup(types?: ReferenceType[], sourceTypes?: ReferenceSourceType[], like?: string, excludedIds?: Guid[], ids?: Guid[]): ReferenceLookup { + const lookup: ReferenceLookup = new ReferenceLookup(); + lookup.page = { size: 100, offset: 0 }; + if (excludedIds && excludedIds.length > 0) { lookup.excludedIds = excludedIds; } + if (ids && ids.length > 0) { lookup.ids = ids; } + lookup.isActive = [IsActive.Active]; + lookup.project = { + fields: [ + nameof(x => x.id), + nameof(x => x.label), + nameof(x => x.type), + nameof(x => x.description), + [nameof(x => x.definition), nameof(x => x.fields), nameof(x => x.code)].join('.'), + [nameof(x => x.definition), nameof(x => x.fields), nameof(x => x.dataType)].join('.'), + [nameof(x => x.definition), nameof(x => x.fields), nameof(x => x.value)].join('.'), + nameof(x => x.reference), + nameof(x => x.abbreviation), + nameof(x => x.source), + nameof(x => x.sourceType), + ] + }; + if (types && types.length > 0) { lookup.types = types; } + if (sourceTypes && sourceTypes.length > 0) { lookup.sourceTypes = sourceTypes; } + lookup.order = { items: [nameof(x => x.label)] }; + if (like) { lookup.like = this.filterService.transformLike(like); } + return lookup; + } + // // diff --git a/dmp-frontend/src/app/ui/dmp/dmp-editor-blueprint/dmp-editor.component.ts b/dmp-frontend/src/app/ui/dmp/dmp-editor-blueprint/dmp-editor.component.ts index 59ec2db22..66b89cf51 100644 --- a/dmp-frontend/src/app/ui/dmp/dmp-editor-blueprint/dmp-editor.component.ts +++ b/dmp-frontend/src/app/ui/dmp/dmp-editor-blueprint/dmp-editor.component.ts @@ -212,15 +212,17 @@ export class DmpEditorComponent extends BaseEditor implemen //Transform to persist //Transform descriptionTemplates formData.descriptionTemplates = []; - for (const fieldId in (this.formGroup.get('descriptionTemplates') as UntypedFormGroup).controls) { - formData.descriptionTemplates.push(this.formGroup.get('descriptionTemplates').get(fieldId).value); + for (const sectionId in (this.formGroup.get('descriptionTemplates') as UntypedFormGroup).controls) { + formData.descriptionTemplates.push( + ...(this.formGroup.get('descriptionTemplates').get(sectionId).value as Guid[]).map(x => { return { sectionId: Guid.parse(sectionId), descriptionTemplateGroupId: x } }) + ); } //Transform properties - formData.properties.dmpBlueprintValues = []; - for (const fieldId in (this.formGroup.get('properties').get('dmpBlueprintValues') as UntypedFormGroup).controls) { - formData.properties.dmpBlueprintValues.push(this.formGroup.get('properties').get('dmpBlueprintValues').get(fieldId).value); - } + // formData.properties.dmpBlueprintValues = []; + // for (const fieldId in (this.formGroup.get('properties').get('dmpBlueprintValues') as UntypedFormGroup).controls) { + // formData.properties.dmpBlueprintValues.push(this.formGroup.get('properties').get('dmpBlueprintValues').get(fieldId).value); + // } this.dmpService.persist(formData) diff --git a/dmp-frontend/src/app/ui/dmp/dmp-editor-blueprint/dmp-editor.model.ts b/dmp-frontend/src/app/ui/dmp/dmp-editor-blueprint/dmp-editor.model.ts index 7edbf9f8b..c749896fd 100644 --- a/dmp-frontend/src/app/ui/dmp/dmp-editor-blueprint/dmp-editor.model.ts +++ b/dmp-frontend/src/app/ui/dmp/dmp-editor-blueprint/dmp-editor.model.ts @@ -1,6 +1,7 @@ import { FormControl, UntypedFormBuilder, UntypedFormGroup, Validators } from "@angular/forms"; import { DmpAccessType } from "@app/core/common/enum/dmp-access-type"; import { DmpStatus } from "@app/core/common/enum/dmp-status"; +import { IsActive } from "@app/core/common/enum/is-active.enum"; import { DmpBlueprint } from "@app/core/model/dmp-blueprint/dmp-blueprint"; import { Dmp, DmpBlueprintValue, DmpBlueprintValuePersist, DmpContact, DmpContactPersist, DmpDescriptionTemplate, DmpDescriptionTemplatePersist, DmpPersist, DmpProperties, DmpPropertiesPersist, DmpReferenceDataPersist, DmpReferencePersist } from "@app/core/model/dmp/dmp"; import { DmpReference } from "@app/core/model/dmp/dmp-reference"; @@ -32,7 +33,7 @@ export class DmpEditorModel extends BaseEditorModel implements DmpPersist { super.fromModel(item); this.label = item.label; this.status = item.status; - this.properties = new DmpPropertiesEditorModel().fromModel(item.properties, item.dmpReferences, item.blueprint); + this.properties = new DmpPropertiesEditorModel().fromModel(item.properties, item.dmpReferences.filter(x => x.isActive === IsActive.Active), item.blueprint); this.description = item.description; this.language = item.language; this.blueprint = item.blueprint?.id; @@ -122,7 +123,7 @@ export class DmpEditorModel extends BaseEditorModel implements DmpPersist { } export class DmpPropertiesEditorModel implements DmpPropertiesPersist { - dmpBlueprintValues: DmpBlueprintValueEditorModel[] = []; + dmpBlueprintValues: Map = new Map; contacts: DmpContactEditorModel[] = []; protected formBuilder: UntypedFormBuilder = new UntypedFormBuilder(); @@ -133,9 +134,10 @@ export class DmpPropertiesEditorModel implements DmpPropertiesPersist { fromModel(item: DmpProperties, dmpReferences: DmpReference[], dmpBlueprint: DmpBlueprint): DmpPropertiesEditorModel { + dmpBlueprint.definition.sections.forEach(section => { section.fields.forEach(field => { - this.dmpBlueprintValues.push(new DmpBlueprintValueEditorModel().fromModel( + this.dmpBlueprintValues.set(field.id, new DmpBlueprintValueEditorModel().fromModel( { fieldId: field.id, fieldValue: item?.dmpBlueprintValues?.find(x => x.fieldId == field.id)?.fieldValue, @@ -151,7 +153,7 @@ export class DmpPropertiesEditorModel implements DmpPropertiesPersist { context?: ValidationContext, disabled?: boolean, rootPath?: string - }): UntypedFormGroup { + }, dmpReferences?: DmpReference[], dmpBlueprint?: DmpBlueprint): UntypedFormGroup { let { context = null, disabled = false, rootPath } = params ?? {} if (context == null) { context = DmpPropertiesEditorModel.createValidationContext({ @@ -175,9 +177,8 @@ export class DmpPropertiesEditorModel implements DmpPropertiesPersist { const dmpBlueprintValuesFormGroup = this.formBuilder.group({}); - (this.dmpBlueprintValues ?? []).filter(x => x?.fieldId).map( - (item, index) => dmpBlueprintValuesFormGroup.addControl(item.fieldId.toString(), item.buildForm({ - rootPath: `dmpBlueprintValues[${index}].` + this.dmpBlueprintValues.forEach((value, key) => dmpBlueprintValuesFormGroup.addControl(key.toString(), value.buildForm({ + rootPath: `dmpBlueprintValues[${key}].` })), context.getValidation('dmpBlueprintValues') ) formGroup.addControl('dmpBlueprintValues', dmpBlueprintValuesFormGroup); diff --git a/dmp-frontend/src/app/ui/dmp/dmp-editor-blueprint/dmp-editor.resolver.ts b/dmp-frontend/src/app/ui/dmp/dmp-editor-blueprint/dmp-editor.resolver.ts index dc0906c4b..8b464d2e2 100644 --- a/dmp-frontend/src/app/ui/dmp/dmp-editor-blueprint/dmp-editor.resolver.ts +++ b/dmp-frontend/src/app/ui/dmp/dmp-editor-blueprint/dmp-editor.resolver.ts @@ -57,6 +57,7 @@ export class DmpEditorResolver extends BaseEditorResolver { // [nameof(x => x.dmpUsers), nameof(x => x.user.name)].join('.'), // [nameof(x => x.dmpUsers), nameof(x => x.role)].join('.'), [nameof(x => x.dmpReferences), nameof(x => x.id)].join('.'), + [nameof(x => x.dmpReferences), nameof(x => x.isActive)].join('.'), [nameof(x => x.dmpReferences), nameof(x => x.data), nameof(x => x.blueprintFieldId)].join('.'), [nameof(x => x.dmpReferences), nameof(x => x.reference), nameof(x => x.id)].join('.'), [nameof(x => x.dmpReferences), nameof(x => x.reference), nameof(x => x.label)].join('.'),