Skip to content

Commit f1706e2

Browse files
115046: Fixed related item not invalidating on relationship deletion & automatically invalidate the isSelected value after updating relationship on item
1 parent 33b59c7 commit f1706e2

5 files changed

Lines changed: 50 additions & 6 deletions

File tree

src/app/core/data/relationship-data.service.spec.ts

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,8 @@ describe('RelationshipDataService', () => {
125125

126126
const itemService = jasmine.createSpyObj('itemService', {
127127
findById: (uuid) => createSuccessfulRemoteDataObject(relatedItems.find((relatedItem) => relatedItem.id === uuid)),
128-
findByHref: createSuccessfulRemoteDataObject$(relatedItems[0])
128+
findByHref: createSuccessfulRemoteDataObject$(relatedItems[0]),
129+
getIDHrefObs: (uuid: string) => observableOf(`https://demo.dspace.org/server/api/core/items/${uuid}`),
129130
});
130131

131132
function initTestService() {
@@ -240,6 +241,16 @@ describe('RelationshipDataService', () => {
240241
});
241242
});
242243

244+
describe('searchByItemsAndType', () => {
245+
it('should call addDependency for each item to invalidate the request when one of the items is update', () => {
246+
spyOn(service as any, 'addDependency');
247+
248+
service.searchByItemsAndType(relationshipType.id, item.id, relationshipType.leftwardType, ['item-id-1', 'item-id-2']);
249+
250+
expect((service as any).addDependency).toHaveBeenCalledTimes(2);
251+
});
252+
});
253+
243254
describe('resolveMetadataRepresentation', () => {
244255
const parentItem: Item = Object.assign(new Item(), {
245256
id: 'parent-item',

src/app/core/data/relationship-data.service.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -555,13 +555,18 @@ export class RelationshipDataService extends IdentifiableDataService<Relationshi
555555
);
556556
});
557557

558-
return this.searchBy(
558+
const searchRD$: Observable<RemoteData<PaginatedList<Relationship>>> = this.searchBy(
559559
'byItemsAndType',
560560
{
561561
searchParams: searchParams
562562
},
563563
) as Observable<RemoteData<PaginatedList<Relationship>>>;
564564

565+
arrayOfItemIds.forEach((itemId: string) => {
566+
this.addDependency(searchRD$, this.itemService.getIDHrefObs(encodeURIComponent(itemId)));
567+
});
568+
569+
return searchRD$;
565570
}
566571

567572
/**

src/app/item-page/edit-item-page/item-relationships/edit-item-relationships.service.spec.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -185,6 +185,7 @@ describe('EditItemRelationshipsService', () => {
185185

186186
expect(itemService.invalidateByHref).toHaveBeenCalledWith(currentItem.self);
187187
expect(itemService.invalidateByHref).toHaveBeenCalledWith(relationshipItem1.self);
188+
expect(itemService.invalidateByHref).toHaveBeenCalledWith(relationshipItem2.self);
188189

189190
expect(notificationsService.success).toHaveBeenCalledTimes(1);
190191
});

src/app/item-page/edit-item-page/item-relationships/edit-item-relationships.service.ts

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,17 @@ export class EditItemRelationshipsService {
6161
// process each update one by one, while waiting for the previous to finish
6262
concatMap((update: FieldUpdate) => {
6363
if (update.changeType === FieldChangeType.REMOVE) {
64-
return this.deleteRelationship(update.field as DeleteRelationship).pipe(take(1));
64+
return this.deleteRelationship(update.field as DeleteRelationship).pipe(
65+
take(1),
66+
switchMap((deleteRD: RemoteData<NoContent>) => {
67+
if (deleteRD.hasSucceeded) {
68+
return this.itemService.invalidateByHref((update.field as DeleteRelationship).relatedItem._links.self.href).pipe(
69+
map(() => deleteRD),
70+
);
71+
}
72+
return [deleteRD];
73+
}),
74+
);
6575
} else if (update.changeType === FieldChangeType.ADD) {
6676
return this.addRelationship(update.field as RelationshipIdentifiable).pipe(
6777
take(1),

src/app/item-page/edit-item-page/item-relationships/edit-relationship-list/edit-relationship-list.component.ts

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ import {
3333
} from '../../../../core/shared/item-relationships/relationship-type.model';
3434
import {
3535
getAllSucceededRemoteData,
36+
getFirstCompletedRemoteData,
3637
getFirstSucceededRemoteData,
3738
getFirstSucceededRemoteDataPayload,
3839
getRemoteDataPayload,
@@ -334,6 +335,7 @@ export class EditRelationshipListComponent implements OnInit, OnDestroy {
334335
type: this.relationshipType,
335336
originalIsLeft: isLeft,
336337
originalItem: this.item,
338+
relatedItem,
337339
relationship,
338340
} as RelationshipIdentifiable;
339341
return this.objectUpdatesService.saveRemoveFieldUpdate(this.url,update);
@@ -483,10 +485,24 @@ export class EditRelationshipListComponent implements OnInit, OnDestroy {
483485
this.relationshipService.isLeftItem(relationship, this.item).pipe(
484486
// emit an array containing both the relationship and whether it's the left item,
485487
// as we'll need both
486-
map((isLeftItem: boolean) => [relationship, isLeftItem])
487-
)
488+
switchMap((isLeftItem: boolean) => {
489+
if (isLeftItem) {
490+
return relationship.rightItem.pipe(
491+
getFirstCompletedRemoteData(),
492+
getRemoteDataPayload(),
493+
map((relatedItem: Item) => [relationship, isLeftItem, relatedItem]),
494+
);
495+
} else {
496+
return relationship.leftItem.pipe(
497+
getFirstCompletedRemoteData(),
498+
getRemoteDataPayload(),
499+
map((relatedItem: Item) => [relationship, isLeftItem, relatedItem]),
500+
);
501+
}
502+
}),
503+
),
488504
),
489-
map(([relationship, isLeftItem]: [Relationship, boolean]) => {
505+
map(([relationship, isLeftItem, relatedItem]: [Relationship, boolean, Item]) => {
490506
// turn it into a RelationshipIdentifiable, an
491507
const nameVariant =
492508
isLeftItem ? relationship.rightwardValue : relationship.leftwardValue;
@@ -496,6 +512,7 @@ export class EditRelationshipListComponent implements OnInit, OnDestroy {
496512
relationship,
497513
originalIsLeft: isLeftItem,
498514
originalItem: this.item,
515+
relatedItem: relatedItem,
499516
nameVariant,
500517
} as RelationshipIdentifiable;
501518
}),

0 commit comments

Comments
 (0)