diff --git a/src/app/core/data/relationship.service.ts b/src/app/core/data/relationship.service.ts index 248d36c838..04e602df4c 100644 --- a/src/app/core/data/relationship.service.ts +++ b/src/app/core/data/relationship.service.ts @@ -250,9 +250,10 @@ export class RelationshipService extends DataService { .pipe( switchMap((relationships: Relationship[]) => { return observableCombineLatest(...relationships.map((relationship: Relationship) => { + console.log('relationship: ', relationship.uuid); return observableCombineLatest( - this.isItemMatchWithItemRD(relationship.leftItem, item2), - this.isItemMatchWithItemRD(relationship.rightItem, item2) + this.isItemMatchWithItemRD(relationship.leftItem, item2, 'left'), + this.isItemMatchWithItemRD(relationship.rightItem, item2, 'right') ).pipe( filter(([isLeftItem, isRightItem]) => isLeftItem || isRightItem), map(() => relationship), @@ -265,10 +266,11 @@ export class RelationshipService extends DataService { } - private isItemMatchWithItemRD(itemRD$: Observable>, itemCheck: Item): Observable { + private isItemMatchWithItemRD(itemRD$: Observable>, itemCheck: Item, side: string): Observable { return itemRD$.pipe( getSucceededRemoteData(), map((itemRD: RemoteData) => itemRD.payload), + tap((item) => console.log(side, ': ', item.uuid)), map((item: Item) => item.uuid === itemCheck.uuid) ); } diff --git a/src/app/shared/form/builder/ds-dynamic-form-ui/ds-dynamic-form-control-container.component.ts b/src/app/shared/form/builder/ds-dynamic-form-ui/ds-dynamic-form-control-container.component.ts index 83a76a3482..f26e8acf5d 100644 --- a/src/app/shared/form/builder/ds-dynamic-form-ui/ds-dynamic-form-control-container.component.ts +++ b/src/app/shared/form/builder/ds-dynamic-form-ui/ds-dynamic-form-control-container.component.ts @@ -69,7 +69,7 @@ import { DsDynamicFormArrayComponent } from './models/array-group/dynamic-form-a import { DsDynamicRelationGroupComponent } from './models/relation-group/dynamic-relation-group.components'; import { DYNAMIC_FORM_CONTROL_TYPE_RELATION_GROUP } from './models/relation-group/dynamic-relation-group.model'; import { DsDatePickerInlineComponent } from './models/date-picker-inline/dynamic-date-picker-inline.component'; -import { map, switchMap, tap } from 'rxjs/operators'; +import { map, switchMap, take, tap } from 'rxjs/operators'; import { SelectableListState } from '../../../object-list/selectable-list/selectable-list.reducer'; import { Observable } from 'rxjs'; import { SearchResult } from '../../../search/search-result.model'; @@ -92,6 +92,8 @@ import { DsDynamicInputModel } from './models/ds-dynamic-input.model'; import { getSucceededRemoteData } from '../../../../core/shared/operators'; import { RemoteData } from '../../../../core/data/remote-data'; import { Item } from '../../../../core/shared/item.model'; +import { Relationship } from '../../../../core/shared/item-relationships/relationship.model'; +import { ItemDataService } from '../../../../core/data/item-data.service'; export function dsDynamicFormControlMapFn(model: DynamicFormControlModel): Type | null { switch (model.type) { @@ -182,7 +184,7 @@ export class DsDynamicFormControlContainerComponent extends DynamicFormControlCo modelValueMDRepresentation; listId: string; searchConfig: string; - + uuid; /* tslint:disable:no-output-rename */ @Output('dfBlur') blur: EventEmitter = new EventEmitter(); @Output('dfChange') change: EventEmitter = new EventEmitter(); @@ -205,6 +207,8 @@ export class DsDynamicFormControlContainerComponent extends DynamicFormControlCo private modalService: NgbModal, private relationService: RelationshipService, private selectableListService: SelectableListService, + private itemService: ItemDataService, + private relationshipService: RelationshipService, ) { super(componentFactoryResolver, layoutService, validationService); } @@ -215,8 +219,9 @@ export class DsDynamicFormControlContainerComponent extends DynamicFormControlCo this.listId = 'list-' + this.model.relationship.relationshipType; this.model.workspaceItem.item.pipe( getSucceededRemoteData(), + tap((itemRD: RemoteData) => this.uuid = itemRD.payload.uuid), switchMap((itemRD: RemoteData) => this.relationService.getRelatedItemsByLabel(itemRD.payload, this.model.relationship.relationshipType)), - map((items: Item[]) => items.map((item) => Object.assign(new SearchResult(), { indexableObject: item }))) + map((items: Item[]) => items.map((item) => Object.assign(new SearchResult(), { indexableObject: item }))), ).subscribe((relatedItems) => this.selectableListService.select(this.listId, relatedItems)); this.model.value = this.selectableListService.getSelectableList(this.listId).pipe( @@ -275,10 +280,17 @@ export class DsDynamicFormControlContainerComponent extends DynamicFormControlCo modalComp.listId = this.listId; modalComp.relationship = this.model.relationship; modalComp.label = this.model.label; - modalComp.itemRD$ = this.model.workspaceItem.item; + modalComp.uuid = this.uuid; } - removeSelection(object: SearchResult) { + removeSelection(object: SearchResult) { this.selectableListService.deselectSingle(this.listId, object); + setTimeout(() => this.itemService.findById(this.uuid).pipe( + getSucceededRemoteData(), + switchMap((itemRD: RemoteData) => this.relationshipService.getRelationshipByItemsAndLabel(itemRD.payload, object.indexableObject, this.model.relationship.relationshipType)), + tap(t => console.log(t)), + switchMap((relationship: Relationship) => this.relationshipService.deleteRelationship(relationship.id)), + take(1) + ).subscribe(), 0); } } diff --git a/src/app/shared/form/builder/ds-dynamic-form-ui/relation-lookup-modal/dynamic-lookup-relation-modal.component.ts b/src/app/shared/form/builder/ds-dynamic-form-ui/relation-lookup-modal/dynamic-lookup-relation-modal.component.ts index 36279687dd..c00ad4589e 100644 --- a/src/app/shared/form/builder/ds-dynamic-form-ui/relation-lookup-modal/dynamic-lookup-relation-modal.component.ts +++ b/src/app/shared/form/builder/ds-dynamic-form-ui/relation-lookup-modal/dynamic-lookup-relation-modal.component.ts @@ -25,6 +25,7 @@ import { Item } from '../../../../../core/shared/item.model'; import { RelationshipOptions } from '../../models/relationship-options.model'; import { Relationship } from '../../../../../core/shared/item-relationships/relationship.model'; import { ItemDataService } from '../../../../../core/data/item-data.service'; +import { ObjectCacheService } from '../../../../../core/cache/object-cache.service'; @Component({ selector: 'ds-dynamic-lookup-relation-modal', @@ -40,7 +41,6 @@ import { ItemDataService } from '../../../../../core/data/item-data.service'; export class DsDynamicLookupRelationModalComponent implements OnInit, OnDestroy { label: string; relationship: RelationshipOptions; - itemRD$: Observable>; listId: string; resultsRD$: Observable>>>; searchConfig: PaginatedSearchOptions; @@ -55,6 +55,7 @@ export class DsDynamicLookupRelationModalComponent implements OnInit, OnDestroy pageSize: 10 }); selection$: Observable; + uuid; constructor( public modal: NgbActiveModal, @@ -65,12 +66,12 @@ export class DsDynamicLookupRelationModalComponent implements OnInit, OnDestroy private routeService: RouteService, private relationshipService: RelationshipService, private relationshipTypeService: RelationshipTypeService, - private itemService: ItemDataService + private itemService: ItemDataService, + private objectCache: ObjectCacheService, ) { } ngOnInit(): void { - this.itemRD$.subscribe(t => console.log('subscription', t)); this.resetRoute(); this.routeService.setParameter('fixedFilterQuery', this.relationship.filter); this.routeService.setParameter('configuration', this.relationship.searchConfiguration); @@ -96,7 +97,7 @@ export class DsDynamicLookupRelationModalComponent implements OnInit, OnDestroy ) as any ) }) - ) + ); } @@ -149,9 +150,8 @@ export class DsDynamicLookupRelationModalComponent implements OnInit, OnDestroy select(selectableObject: SearchResult) { - this.itemRD$ + this.itemService.findById(this.uuid) .pipe( - tap((t) => console.log('tap',t)), getSucceededRemoteData(), mergeMap((itemRD: RemoteData) => { const type1: string = itemRD.payload.firstMetadataValue('relationship.type'); @@ -165,8 +165,7 @@ export class DsDynamicLookupRelationModalComponent implements OnInit, OnDestroy return this.relationshipService.addRelationship(type.id, itemRD.payload, selectableObject.indexableObject); } } - ), - tap(() => this.itemRD$ = this.itemService.findById(itemRD.payload.uuid)) + ) ); }), @@ -177,7 +176,7 @@ export class DsDynamicLookupRelationModalComponent implements OnInit, OnDestroy deselect(selectableObject: SearchResult) { - const subscription = this.itemRD$.pipe( + this.itemService.findById(this.uuid).pipe( getSucceededRemoteData(), switchMap((itemRD: RemoteData) => this.relationshipService.getRelationshipByItemsAndLabel(itemRD.payload, selectableObject.indexableObject, this.relationship.relationshipType)), switchMap((relationship: Relationship) => this.relationshipService.deleteRelationship(relationship.id)),