Skip to content

Commit a9ee4e5

Browse files
[DURACOM-426] add authority link for md representation
1 parent a514b6e commit a9ee4e5

9 files changed

Lines changed: 109 additions & 21 deletions

File tree

src/app/shared/metadata-link-view/metadata-link-view-popover/metadata-link-view-popover.component.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@
4646
[ngbTooltip]="getSourceSubTypeIdentifier(metadata)?.link"
4747
class="source-icon"
4848
alt="source-logo"
49-
[src]="getSourceSubTypeIdentifier(metadata)?.icon"
49+
[ngSrc]="getSourceSubTypeIdentifier(metadata)?.icon"
5050
data-test="sourceIcon"
5151
/>
5252
</div>

src/app/shared/metadata-link-view/metadata-link-view.component.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@
3838
[iconPosition]="iconPosition"
3939
[entityType]="metadataView.entityType"
4040
[entityStyle]="metadataView.entityStyle"
41-
[fallbackOnDefault]="false">{{normalizeValue(metadataView.value)}}</span>
41+
[fallbackOnDefault]="false">{{normalizeValue(metadataView.value)}}</span>
4242
</ng-template>
4343

4444
<ng-template #textWithoutIcon let-metadataView="metadataView">

src/app/shared/metadata-link-view/metadata-link-view.component.spec.ts

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,6 @@ describe('MetadataLinkViewComponent', () => {
120120
fixture = TestBed.createComponent(MetadataLinkViewComponent);
121121
itemService.findByIdWithProjections.and.returnValue(createSuccessfulRemoteDataObject$(testOrgunit));
122122
component = fixture.componentInstance;
123-
component.item = testPerson;
124123
component.metadata = testMetadataValueWithoutAuthority;
125124
fixture.detectChanges();
126125
});
@@ -145,7 +144,6 @@ describe('MetadataLinkViewComponent', () => {
145144
fixture = TestBed.createComponent(MetadataLinkViewComponent);
146145
itemService.findByIdWithProjections.and.returnValue(createSuccessfulRemoteDataObject$(testPerson));
147146
component = fixture.componentInstance;
148-
component.item = testPerson;
149147
component.metadata = testMetadataValueWithAuthority;
150148
fixture.detectChanges();
151149
});
@@ -172,7 +170,6 @@ describe('MetadataLinkViewComponent', () => {
172170
fixture = TestBed.createComponent(MetadataLinkViewComponent);
173171
itemService.findByIdWithProjections.and.returnValue(createSuccessfulRemoteDataObject$(testOrgunit));
174172
component = fixture.componentInstance;
175-
component.item = testPerson;
176173
component.metadata = testMetadataValueWithAuthority;
177174
fixture.detectChanges();
178175
});
@@ -199,7 +196,6 @@ describe('MetadataLinkViewComponent', () => {
199196
fixture = TestBed.createComponent(MetadataLinkViewComponent);
200197
itemService.findByIdWithProjections.and.returnValue(createFailedRemoteDataObject$());
201198
component = fixture.componentInstance;
202-
component.item = testPerson;
203199
component.metadata = testMetadataValueWithAuthority;
204200
fixture.detectChanges();
205201
});

src/app/shared/metadata-link-view/metadata-link-view.component.ts

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,6 @@ import {
2828

2929
import { ItemDataService } from '../../core/data/item-data.service';
3030
import { RemoteData } from '../../core/data/remote-data';
31-
import { DSpaceObject } from '../../core/shared/dspace-object.model';
3231
import { Item } from '../../core/shared/item.model';
3332
import { MetadataValue } from '../../core/shared/metadata.models';
3433
import { Metadata } from '../../core/shared/metadata.utils';
@@ -62,16 +61,6 @@ export class MetadataLinkViewComponent implements OnInit {
6261
*/
6362
@Input() metadata: MetadataValue;
6463

65-
/**
66-
* Metadata name that we need to show in the template
67-
*/
68-
@Input() metadataName: string|string[];
69-
70-
/**
71-
* Item of the metadata value
72-
*/
73-
@Input() item: DSpaceObject;
74-
7564
/**
7665
* Processed metadata to create MetadataOrcid with the information needed to show
7766
*/

src/app/shared/metadata-representation/metadata-representation.decorator.ts

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import {
1515
DEFAULT_THEME,
1616
resolveTheme,
1717
} from '../object-collection/shared/listable-object/listable-object.decorator';
18+
import { AuthorityLinkMetadataListElementComponent } from '../object-list/metadata-representation-list-element/authority-link/authority-link-metadata-list-element.component';
1819
import { BrowseLinkMetadataListElementComponent } from '../object-list/metadata-representation-list-element/browse-link/browse-link-metadata-list-element.component';
1920
import { ItemMetadataListElementComponent } from '../object-list/metadata-representation-list-element/item/item-metadata-list-element.component';
2021
import { PlainTextMetadataListElementComponent } from '../object-list/metadata-representation-list-element/plain-text/plain-text-metadata-list-element.component';
@@ -34,29 +35,36 @@ export type MetadataRepresentationComponent =
3435
typeof ItemMetadataListElementComponent |
3536
typeof OrgUnitItemMetadataListElementComponent |
3637
typeof PersonItemMetadataListElementComponent |
37-
typeof ProjectItemMetadataListElementComponent;
38+
typeof ProjectItemMetadataListElementComponent |
39+
typeof AuthorityLinkMetadataListElementComponent;
3840

3941
export const METADATA_REPRESENTATION_COMPONENT_DECORATOR_MAP =
4042
new Map<string, Map<MetadataRepresentationType, Map<Context, Map<string, MetadataRepresentationComponent>>>>([
4143
['Publication', new Map([
4244
[MetadataRepresentationType.PlainText, new Map([
4345
[DEFAULT_CONTEXT, new Map([[DEFAULT_THEME, PlainTextMetadataListElementComponent as any]])]])],
4446
[MetadataRepresentationType.AuthorityControlled, new Map([
45-
[DEFAULT_CONTEXT, new Map([[DEFAULT_THEME, PlainTextMetadataListElementComponent]])]])],
47+
[DEFAULT_CONTEXT, new Map([[DEFAULT_THEME, AuthorityLinkMetadataListElementComponent]])]])],
4648
[MetadataRepresentationType.BrowseLink, new Map([
4749
[DEFAULT_CONTEXT, new Map([[DEFAULT_THEME, BrowseLinkMetadataListElementComponent]])]])],
4850
[MetadataRepresentationType.Item, new Map([
4951
[DEFAULT_CONTEXT, new Map([[DEFAULT_THEME, ItemMetadataListElementComponent]])]])],
5052
])],
5153
['Person', new Map([
54+
[MetadataRepresentationType.AuthorityControlled, new Map([
55+
[DEFAULT_CONTEXT, new Map([[DEFAULT_THEME, AuthorityLinkMetadataListElementComponent as any]])]])],
5256
[MetadataRepresentationType.Item, new Map([
5357
[DEFAULT_CONTEXT, new Map([[DEFAULT_THEME, PersonItemMetadataListElementComponent]])]])],
5458
])],
5559
['OrgUnit', new Map([
60+
[MetadataRepresentationType.AuthorityControlled, new Map([
61+
[DEFAULT_CONTEXT, new Map([[DEFAULT_THEME, AuthorityLinkMetadataListElementComponent as any]])]])],
5662
[MetadataRepresentationType.Item, new Map([
5763
[DEFAULT_CONTEXT, new Map([[DEFAULT_THEME, OrgUnitItemMetadataListElementComponent]])]])],
5864
])],
5965
['Project', new Map([
66+
[MetadataRepresentationType.AuthorityControlled, new Map([
67+
[DEFAULT_CONTEXT, new Map([[DEFAULT_THEME, AuthorityLinkMetadataListElementComponent as any]])]])],
6068
[MetadataRepresentationType.Item, new Map([
6169
[DEFAULT_CONTEXT, new Map([[DEFAULT_THEME, ProjectItemMetadataListElementComponent]])]])],
6270
])],
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
<ds-metadata-link-view [metadata]="metadataValue"></ds-metadata-link-view>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
import {
2+
ChangeDetectionStrategy,
3+
NO_ERRORS_SCHEMA,
4+
} from '@angular/core';
5+
import {
6+
ComponentFixture,
7+
TestBed,
8+
waitForAsync,
9+
} from '@angular/core/testing';
10+
import { ItemDataService } from '@dspace/core/data/item-data.service';
11+
import { MetadataRepresentationType } from '@dspace/core/shared/metadata-representation/metadata-representation.model';
12+
import { MetadatumRepresentation } from '@dspace/core/shared/metadata-representation/metadatum/metadatum-representation.model';
13+
import { ValueListBrowseDefinition } from '@dspace/core/shared/value-list-browse-definition.model';
14+
15+
import { MetadataLinkViewComponent } from '../../../metadata-link-view/metadata-link-view.component';
16+
import { AuthorityLinkMetadataListElementComponent } from './authority-link-metadata-list-element.component';
17+
18+
19+
const mockMetadataRepresentation = Object.assign(new MetadatumRepresentation('type'), {
20+
key: 'dc.contributor.author',
21+
value: 'Test Author',
22+
browseDefinition: Object.assign(new ValueListBrowseDefinition(), {
23+
id: 'author',
24+
}),
25+
} as Partial<MetadatumRepresentation>);
26+
27+
const itemService = jasmine.createSpyObj('ItemDataService', {
28+
findByIdWithProjections: jasmine.createSpy('findByIdWithProjections'),
29+
});
30+
31+
describe('AuthorityLinkMetadataListElementComponent', () => {
32+
let comp: AuthorityLinkMetadataListElementComponent;
33+
let fixture: ComponentFixture<AuthorityLinkMetadataListElementComponent>;
34+
35+
beforeEach(waitForAsync(() => {
36+
void TestBed.configureTestingModule({
37+
imports: [AuthorityLinkMetadataListElementComponent, MetadataLinkViewComponent],
38+
schemas: [NO_ERRORS_SCHEMA],
39+
providers: [
40+
{ provide: ItemDataService, useValue: itemService },
41+
],
42+
}).overrideComponent(AuthorityLinkMetadataListElementComponent, {
43+
set: { changeDetection: ChangeDetectionStrategy.Default },
44+
}).compileComponents();
45+
}));
46+
47+
beforeEach(() => {
48+
fixture = TestBed.createComponent(AuthorityLinkMetadataListElementComponent);
49+
comp = fixture.componentInstance;
50+
});
51+
52+
describe('with authorithy controlled metadata', () => {
53+
beforeEach(() => {
54+
comp.mdRepresentation = mockMetadataRepresentation;
55+
spyOnProperty(comp.mdRepresentation, 'representationType', 'get').and.returnValue(MetadataRepresentationType.AuthorityControlled);
56+
fixture.detectChanges();
57+
});
58+
59+
it('should contain the value', () => {
60+
expect(fixture.debugElement.nativeElement.textContent).toContain(mockMetadataRepresentation.value);
61+
});
62+
63+
});
64+
65+
});
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
2+
import {
3+
Component,
4+
OnInit,
5+
} from '@angular/core';
6+
import { MetadatumRepresentation } from '@dspace/core/shared/metadata-representation/metadatum/metadatum-representation.model';
7+
8+
import { MetadataLinkViewComponent } from '../../../metadata-link-view/metadata-link-view.component';
9+
import { MetadataRepresentationListElementComponent } from '../metadata-representation-list-element.component';
10+
11+
@Component({
12+
selector: 'ds-authority-link-metadata-list-element',
13+
templateUrl: './authority-link-metadata-list-element.component.html',
14+
imports: [
15+
MetadataLinkViewComponent,
16+
],
17+
})
18+
/**
19+
* A component for displaying MetadataRepresentation objects with authority in the form of a link
20+
* It will simply use the value retrieved from MetadataRepresentation.getValue() to display a link to the item
21+
*/
22+
export class AuthorityLinkMetadataListElementComponent extends MetadataRepresentationListElementComponent implements OnInit {
23+
24+
metadataValue: MetadatumRepresentation;
25+
26+
ngOnInit() {
27+
this.metadataValue = this.mdRepresentation as MetadatumRepresentation;
28+
}
29+
}

src/app/shared/object-list/search-result-list-element/item-search-result/item-types/item/item-search-result-list-element.component.html

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@
5454
@if (collapsed) {
5555
@for (author of dso.limitedMetadata(authorMetadata, additionalMetadataLimit, placeholderFilter); track author; let last = $last) {
5656
<span>
57-
<ds-metadata-link-view [item]="dso" [metadata]="author" [metadataName]="authorMetadata"></ds-metadata-link-view>
57+
<ds-metadata-link-view [metadata]="author"></ds-metadata-link-view>
5858
@if (!last) {
5959
<span>; </span>
6060
}
@@ -64,7 +64,7 @@
6464
@if (!collapsed) {
6565
@for (author of dso.allMetadata(authorMetadata, placeholderFilter); track author; let last = $last) {
6666
<span>
67-
<ds-metadata-link-view [item]="dso" [metadata]="author" [metadataName]="authorMetadata"></ds-metadata-link-view>
67+
<ds-metadata-link-view [metadata]="author"></ds-metadata-link-view>
6868
@if (!last) {
6969
<span>; </span>
7070
}

0 commit comments

Comments
 (0)