diff --git a/dmp-backend/core/src/main/java/eu/eudat/service/description/DescriptionServiceImpl.java b/dmp-backend/core/src/main/java/eu/eudat/service/description/DescriptionServiceImpl.java index 03a07da98..9c4680484 100644 --- a/dmp-backend/core/src/main/java/eu/eudat/service/description/DescriptionServiceImpl.java +++ b/dmp-backend/core/src/main/java/eu/eudat/service/description/DescriptionServiceImpl.java @@ -611,7 +611,7 @@ public class DescriptionServiceImpl implements DescriptionService { Map> fieldToReferenceMap = new HashMap<>(); - List descriptionReferences = this.queryFactory.query(DescriptionReferenceQuery.class).descriptionIds(descriptionId).collect(); + List descriptionReferences = this.queryFactory.query(DescriptionReferenceQuery.class).isActive(IsActive.Active).descriptionIds(descriptionId).collect(); Map> descriptionReferenceEntityByReferenceId = new HashMap<>(); for (DescriptionReferenceEntity descriptionReferenceEntity : descriptionReferences){ List descriptionReferenceEntities = descriptionReferenceEntityByReferenceId.getOrDefault(descriptionReferenceEntity.getReferenceId(), null); 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 d1c24ba50..638ebbc2b 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 @@ -767,7 +767,7 @@ public class DmpServiceImpl implements DmpService { private void patchAndSaveReferences(List models, UUID dmpId, eu.eudat.commons.types.dmpblueprint.DefinitionEntity blueprintDefinition) throws InvalidApplicationException { if (models == null) models = new ArrayList<>(); - List dmpReferences = this.queryFactory.query(DmpReferenceQuery.class).dmpIds(dmpId).collect(); + List dmpReferences = this.queryFactory.query(DmpReferenceQuery.class).dmpIds(dmpId).isActives(IsActive.Active).collect(); Map> dmpReferenceEntityByReferenceId = new HashMap<>(); for (DmpReferenceEntity dmpReferenceEntity : dmpReferences){ List dmpReferenceEntities = dmpReferenceEntityByReferenceId.getOrDefault(dmpReferenceEntity.getReferenceId(), null); diff --git a/dmp-frontend/src/app/ui/reference/reference-field/reference-field.component.ts b/dmp-frontend/src/app/ui/reference/reference-field/reference-field.component.ts index e53f86a86..4114fa5a5 100644 --- a/dmp-frontend/src/app/ui/reference/reference-field/reference-field.component.ts +++ b/dmp-frontend/src/app/ui/reference/reference-field/reference-field.component.ts @@ -1,4 +1,4 @@ -import { Component, Input, OnInit } from '@angular/core'; +import { Component, Input, OnChanges, OnInit, SimpleChanges } from '@angular/core'; import { UntypedFormArray, UntypedFormGroup } from '@angular/forms'; import { MatDialog } from '@angular/material/dialog'; import { ReferenceType } from '@app/core/model/reference-type/reference-type'; @@ -13,13 +13,14 @@ import { Reference, ReferencePersist } from '@app/core/model/reference/reference import { ReferenceSearchLookup } from '@app/core/query/reference-search.lookup'; import { Guid } from '@common/types/guid'; import { nameof } from 'ts-simple-nameof'; +import { Subscription } from 'rxjs'; @Component({ selector: 'app-reference-field-component', templateUrl: 'reference-field.component.html', styleUrls: ['./reference-field.component.scss'] }) -export class ReferenceFieldComponent extends BaseComponent implements OnInit { +export class ReferenceFieldComponent extends BaseComponent implements OnInit, OnChanges { @Input() referenceType: ReferenceType = null; @Input() form: UntypedFormGroup = null; @@ -31,11 +32,13 @@ export class ReferenceFieldComponent extends BaseComponent implements OnInit { @Input() dependencies: UntypedFormGroup = null; referenceToUse: Reference[]= []; - referenceToUseInitialized = false; + + referenceDepedencyIds: Guid[] = []; multipleAutoCompleteSearchConfiguration: MultipleAutoCompleteConfiguration; singleAutoCompleteSearchConfiguration: SingleAutoCompleteConfiguration; + dependenciesSubscription: Subscription = null; constructor( private referenceService: ReferenceService, public enumUtils: EnumUtils, @@ -43,13 +46,9 @@ export class ReferenceFieldComponent extends BaseComponent implements OnInit { ) { super(); } ngOnInit() { - const referenceDepedencyIds = this.referenceType.definition.sources.filter(x => x.referenceTypeDependencies).flatMap(x => x.referenceTypeDependencies).filter(x => x).map(x => x.id); - if (referenceDepedencyIds.length > 0) { - this.referenceToUseInitialized = false; - this.dependencies.valueChanges.pipe(takeUntil(this._destroyed)).subscribe(changes => { - this.resolveReferenceDepedency(referenceDepedencyIds); - }); - this.resolveReferenceDepedency(referenceDepedencyIds); + this.referenceDepedencyIds = this.referenceType.definition.sources.filter(x => x.referenceTypeDependencies).flatMap(x => x.referenceTypeDependencies).filter(x => x).map(x => x.id); + if (this.referenceDepedencyIds.length > 0) { + this.resolveReferenceDepedency(true); } else { if (this.multiple) { this.multipleAutoCompleteSearchConfiguration = this.referenceService.getMultipleAutoCompleteSearchConfiguration(this.referenceType.id, null); @@ -59,7 +58,20 @@ export class ReferenceFieldComponent extends BaseComponent implements OnInit { } } - resolveReferenceDepedency(referenceDepedencyIds: Guid[]) { + ngOnChanges(changes: SimpleChanges) { + if ((changes['dependencies'] || changes['referenceType']) && this.dependencies != null && this.referenceType != null) { + this.referenceDepedencyIds = this.referenceType.definition.sources.filter(x => x.referenceTypeDependencies).flatMap(x => x.referenceTypeDependencies).filter(x => x).map(x => x.id); + if (this.referenceDepedencyIds.length > 0) { + if (this.dependenciesSubscription != null) this.dependenciesSubscription.unsubscribe(); + this.resolveReferenceDepedency(true); + this.dependenciesSubscription = this.dependencies.valueChanges.pipe(takeUntil(this._destroyed)).subscribe(changes => { + this.resolveReferenceDepedency(false); + }); + } + } + } + + resolveReferenceDepedency(isInitial: boolean) { const referenceToUse : Reference[]= []; Object.keys(this.dependencies.controls).forEach(controlName => { // (this.dependencies.get(controlName).get('references').value as Reference[]).filter(x=> sourcesWithDependencies.some(y => y.referenceTypeDependencies) x.type.id == this.referenceType.id &&) @@ -67,7 +79,7 @@ export class ReferenceFieldComponent extends BaseComponent implements OnInit { if (foudReferences != null) { for (let i = 0; i < foudReferences.length; i++) { const foudReference = foudReferences[i]; - if (foudReference?.typeId && referenceDepedencyIds.includes(foudReference.typeId)) { + if (foudReference?.typeId && this.referenceDepedencyIds.includes(foudReference.typeId)) { const typed = foudReference as ReferencePersist; referenceToUse.push({ @@ -84,20 +96,28 @@ export class ReferenceFieldComponent extends BaseComponent implements OnInit { id: typed.typeId, } }) - } else if (foudReference?.type?.id && referenceDepedencyIds.includes(foudReference.type.id)) { + } else if (foudReference?.type?.id && this.referenceDepedencyIds.includes(foudReference.type.id)) { const typed = foudReference as Reference; if (typed != null) referenceToUse.push(typed); } } } }); - if (this.referenceToUseInitialized && (!referenceToUse.map(x => x.reference).every(x => this.referenceToUse.map(y => y.reference).includes(x)) || + if (!isInitial && (!referenceToUse.map(x => x.reference).every(x => this.referenceToUse.map(y => y.reference).includes(x)) || !this.referenceToUse.map(x => x.reference).every(x => referenceToUse.map(y => y.reference).includes(x)))) { - this.form.setValue(null, {onlySelf: true, emitEvent: false}); - } + this.referenceToUse = referenceToUse; + this.form.setValue([]); + this.form.updateValueAndValidity(); + } else { + this.referenceToUse = referenceToUse; + } + // if (this.referenceToUseInitialized && (!referenceToUse.map(x => x.reference).every(x => this.referenceToUse.map(y => y.reference).includes(x)) || + // !this.referenceToUse.map(x => x.reference).every(x => referenceToUse.map(y => y.reference).includes(x)))) { + // this.form.setValue(null, {onlySelf: true, emitEvent: false}); + // } - this.referenceToUse = referenceToUse; - this.referenceToUseInitialized = true; + // this.referenceToUse = referenceToUse; + // this.referenceToUseInitialized = true; if (this.multiple) { this.multipleAutoCompleteSearchConfiguration = this.referenceService.getMultipleAutoCompleteSearchConfiguration(this.referenceType.id, this.referenceToUse);