diff --git a/resources/i18n/en.json b/resources/i18n/en.json
index b64edd42d5..284fab6c82 100644
--- a/resources/i18n/en.json
+++ b/resources/i18n/en.json
@@ -733,6 +733,7 @@
"sub-communities": "Loading sub-communities...",
"recent-submissions": "Loading recent submissions...",
"item": "Loading item...",
+ "items": "Loading items...",
"objects": "Loading...",
"search-results": "Loading search results...",
"browse-by": "Loading items...",
diff --git a/src/app/+item-page/edit-item-page/item-relationships/item-relationships.component.html b/src/app/+item-page/edit-item-page/item-relationships/item-relationships.component.html
index 50b64fed16..be400649c4 100644
--- a/src/app/+item-page/edit-item-page/item-relationships/item-relationships.component.html
+++ b/src/app/+item-page/edit-item-page/item-relationships/item-relationships.component.html
@@ -18,14 +18,21 @@
-
{{getRelationshipMessageKey(label) | translate}}
-
-
+
+
+
{{getRelationshipMessageKey(label) | translate}}
+
+
+
+
+
+
+
diff --git a/src/app/+item-page/edit-item-page/item-relationships/item-relationships.component.ts b/src/app/+item-page/edit-item-page/item-relationships/item-relationships.component.ts
index 56bac6c478..963db2a67e 100644
--- a/src/app/+item-page/edit-item-page/item-relationships/item-relationships.component.ts
+++ b/src/app/+item-page/edit-item-page/item-relationships/item-relationships.component.ts
@@ -2,7 +2,8 @@ import { Component, Inject } from '@angular/core';
import { Item } from '../../../core/shared/item.model';
import { FieldUpdate, FieldUpdates } from '../../../core/data/object-updates/object-updates.reducer';
import { Observable } from 'rxjs/internal/Observable';
-import { distinctUntilChanged, switchMap, take } from 'rxjs/operators';
+import { map, switchMap, take, tap } from 'rxjs/operators';
+import { combineLatest as observableCombineLatest, zip as observableZip } from 'rxjs';
import { AbstractItemUpdateComponent } from '../abstract-item-update/abstract-item-update.component';
import { ItemDataService } from '../../../core/data/item-data.service';
import { ObjectUpdatesService } from '../../../core/data/object-updates/object-updates.service';
@@ -11,6 +12,10 @@ import { NotificationsService } from '../../../shared/notifications/notification
import { TranslateService } from '@ngx-translate/core';
import { GLOBAL_CONFIG, GlobalConfig } from '../../../../config';
import { RelationshipService } from '../../../core/data/relationship.service';
+import { FieldChangeType } from '../../../core/data/object-updates/object-updates.actions';
+import { Relationship } from '../../../core/shared/item-relationships/relationship.model';
+import { RestResponse } from '../../../core/cache/response.models';
+import { isNotEmptyOperator } from '../../../shared/empty.util';
@Component({
selector: 'ds-item-relationships',
@@ -65,10 +70,32 @@ export class ItemRelationshipsComponent extends AbstractItemUpdateComponent {
}
public submit(): void {
- const updatedItems$ = this.relationshipService.getRelatedItems(this.item).pipe(
- switchMap((items: Item[]) => this.objectUpdatesService.getUpdatedFields(this.url, items) as Observable- )
+ const removedItemIds$ = this.relationshipService.getRelatedItems(this.item).pipe(
+ switchMap((items: Item[]) => this.objectUpdatesService.getFieldUpdatesExclusive(this.url, items) as Observable),
+ map((fieldUpdates: FieldUpdates) => Object.values(fieldUpdates).filter((fieldUpdate: FieldUpdate) => fieldUpdate.changeType === FieldChangeType.REMOVE)),
+ map((fieldUpdates: FieldUpdate[]) => fieldUpdates.map((fieldUpdate: FieldUpdate) => fieldUpdate.field.uuid) as string[]),
+ isNotEmptyOperator()
);
- // TODO: Delete relationships
+ const allRelationshipsAndRemovedItemIds$ = observableCombineLatest(
+ this.relationshipService.getItemRelationshipsArray(this.item),
+ removedItemIds$
+ );
+ const removedRelationshipIds$ = allRelationshipsAndRemovedItemIds$.pipe(
+ map(([relationships, itemIds]) =>
+ relationships
+ .filter((relationship: Relationship) => itemIds.indexOf(relationship.leftId) > -1 || itemIds.indexOf(relationship.rightId) > -1)
+ .map((relationship: Relationship) => relationship.id))
+ );
+ removedRelationshipIds$.pipe(
+ take(1),
+ switchMap((removedIds: string[]) => observableZip(removedIds.map((uuid: string) => this.relationshipService.deleteRelationship(uuid)))),
+ map((responses: RestResponse[]) => responses.filter((response: RestResponse) => response.isSuccessful))
+ ).subscribe((responses: RestResponse[]) => {
+ console.log(responses);
+ this.initializeOriginalFields();
+ this.initializeUpdates();
+ this.notificationsService.success(this.getNotificationTitle('saved'), this.getNotificationContent('saved'));
+ });
}
/**
diff --git a/src/app/core/data/relationship.service.ts b/src/app/core/data/relationship.service.ts
index 6e30696325..c6b8e8319c 100644
--- a/src/app/core/data/relationship.service.ts
+++ b/src/app/core/data/relationship.service.ts
@@ -3,7 +3,7 @@ import { RequestService } from './request.service';
import { HALEndpointService } from '../shared/hal-endpoint.service';
import { RemoteDataBuildService } from '../cache/builders/remote-data-build.service';
import { hasValue, hasValueOperator, isNotEmptyOperator } from '../../shared/empty.util';
-import { distinctUntilChanged, flatMap, map, take } from 'rxjs/operators';
+import { distinctUntilChanged, flatMap, map, switchMap, take, tap } from 'rxjs/operators';
import {
configureRequest,
filterSuccessfulResponses,
@@ -46,17 +46,12 @@ export class RelationshipService {
}
deleteRelationship(uuid: string): Observable {
- const requestUuid = this.requestService.generateRequestId();
-
- this.getRelationshipEndpoint(uuid).pipe(
+ return this.getRelationshipEndpoint(uuid).pipe(
isNotEmptyOperator(),
distinctUntilChanged(),
- map((endpointURL: string) => new DeleteRequest(requestUuid, endpointURL)),
+ map((endpointURL: string) => new DeleteRequest(this.requestService.generateRequestId(), endpointURL)),
configureRequest(this.requestService),
- take(1)
- ).subscribe();
-
- return this.requestService.getByUUID(requestUuid).pipe(
+ switchMap((restRequest: RestRequest) => this.requestService.getByUUID(restRequest.uuid)),
filterSuccessfulResponses()
);
}