Merge pull request #3803 from DSpace/backport-3142-to-dspace-8_x

[Port dspace-8_x] Add support for non repeatable relationships
This commit is contained in:
Tim Donohue
2025-01-06 14:03:28 -06:00
committed by GitHub
2 changed files with 47 additions and 1 deletions

View File

@@ -110,7 +110,7 @@ describe('EditRelationshipListComponent', () => {
},
};
function init(leftType: string, rightType: string): void {
function init(leftType: string, rightType: string, leftMaxCardinality?: number, rightMaxCardinality?: number): void {
entityTypeLeft = Object.assign(new ItemType(), {
id: leftType,
uuid: leftType,
@@ -130,6 +130,8 @@ describe('EditRelationshipListComponent', () => {
rightType: createSuccessfulRemoteDataObject$(entityTypeRight),
leftwardType: `is${rightType}Of${leftType}`,
rightwardType: `is${leftType}Of${rightType}`,
leftMaxCardinality: leftMaxCardinality,
rightMaxCardinality: rightMaxCardinality,
});
paginationOptions = Object.assign(new PaginationComponentOptions(), {
@@ -402,4 +404,31 @@ describe('EditRelationshipListComponent', () => {
}));
});
});
describe('Is repeatable relationship', () => {
beforeEach(waitForAsync(() => {
currentItemIsLeftItem$ = new BehaviorSubject<boolean>(true);
}));
describe('when max cardinality is 1', () => {
beforeEach(waitForAsync(() => init('Publication', 'OrgUnit', 1, undefined)));
it('should return false', () => {
const result = (comp as any).isRepeatable();
expect(result).toBeFalse();
});
});
describe('when max cardinality is 2', () => {
beforeEach(waitForAsync(() => init('Publication', 'OrgUnit', 2, undefined)));
it('should return true', () => {
const result = (comp as any).isRepeatable();
expect(result).toBeTrue();
});
});
describe('when max cardinality is undefined', () => {
beforeEach(waitForAsync(() => init('Publication', 'OrgUnit', undefined, undefined)));
it('should return true', () => {
const result = (comp as any).isRepeatable();
expect(result).toBeTrue();
});
});
});
});

View File

@@ -264,6 +264,22 @@ export class EditRelationshipListComponent implements OnInit, OnDestroy {
return update && update.field ? update.field.uuid : undefined;
}
/**
* Check whether the current entity can have multiple relationships of this type
* This is based on the max cardinality of the relationship
* @private
*/
private isRepeatable(): boolean {
const isLeft = this.currentItemIsLeftItem$.getValue();
if (isLeft) {
const leftMaxCardinality = this.relationshipType.leftMaxCardinality;
return hasNoValue(leftMaxCardinality) || leftMaxCardinality > 1;
} else {
const rightMaxCardinality = this.relationshipType.rightMaxCardinality;
return hasNoValue(rightMaxCardinality) || rightMaxCardinality > 1;
}
}
/**
* Open the dynamic lookup modal to search for items to add as relationships
*/
@@ -281,6 +297,7 @@ export class EditRelationshipListComponent implements OnInit, OnDestroy {
modalComp.toAdd = [];
modalComp.toRemove = [];
modalComp.isPending = false;
modalComp.repeatable = this.isRepeatable();
modalComp.hiddenQuery = '-search.resourceid:' + this.item.uuid;
this.item.owningCollection.pipe(