diff --git a/resources/i18n/en.json b/resources/i18n/en.json
index e296326b72..fe3bb0c2ff 100644
--- a/resources/i18n/en.json
+++ b/resources/i18n/en.json
@@ -35,6 +35,8 @@
"uri": "URI",
"files": "Files",
"collections": "Collections",
+ "subject": "Keywords",
+ "citation": "Citation",
"filesection": {
"download": "Download",
"name": "Name:",
@@ -212,7 +214,8 @@
"page": {
"issn": "ISSN",
"publisher": "Publisher",
- "description": "Description"
+ "description": "Description",
+ "editor": "Editor-in-Chief"
}
},
"journalvolume": {
@@ -227,7 +230,16 @@
"number": "Number",
"issuedate": "Issue Date",
"description": "Description",
- "keyword": "Keywords"
+ "keyword": "Keywords",
+ "journal-title": "Journal Title",
+ "journal-issn": "Journal ISSN"
+ }
+ },
+ "publication": {
+ "page": {
+ "journal-title": "Journal Title",
+ "journal-issn": "Journal ISSN",
+ "volume-title": "Volume Title"
}
},
"nav": {
diff --git a/src/app/+item-page/item-page.module.ts b/src/app/+item-page/item-page.module.ts
index 1cde0f2fa8..0c4ccc868b 100644
--- a/src/app/+item-page/item-page.module.ts
+++ b/src/app/+item-page/item-page.module.ts
@@ -31,6 +31,7 @@ import { JournalIssueComponent } from './simple/item-types/journal-issue/journal
import { ItemComponent } from './simple/item-types/shared/item.component';
import { EditItemPageModule } from './edit-item-page/edit-item-page.module';
import { MetadataRepresentationListComponent } from './simple/metadata-representation-list/metadata-representation-list.component';
+import { RelatedEntitiesSearchComponent } from './simple/related-entities/related-entities-search/related-entities-search.component';
@NgModule({
imports: [
@@ -65,7 +66,8 @@ import { MetadataRepresentationListComponent } from './simple/metadata-represent
JournalComponent,
JournalIssueComponent,
JournalVolumeComponent,
- MetadataRepresentationListComponent
+ MetadataRepresentationListComponent,
+ RelatedEntitiesSearchComponent
],
entryComponents: [
PublicationComponent,
diff --git a/src/app/+item-page/simple/item-types/journal-issue/journal-issue.component.html b/src/app/+item-page/simple/item-types/journal-issue/journal-issue.component.html
index 13e977ac5c..e17a902297 100644
--- a/src/app/+item-page/simple/item-types/journal-issue/journal-issue.component.html
+++ b/src/app/+item-page/simple/item-types/journal-issue/journal-issue.component.html
@@ -14,6 +14,14 @@
[fields]="['journalissue.issuedate']"
[label]="'journalissue.page.issuedate'">
+
+
+
+
diff --git a/src/app/+item-page/simple/item-types/journal/journal.component.html b/src/app/+item-page/simple/item-types/journal/journal.component.html
index 548f6304bc..157d6133bf 100644
--- a/src/app/+item-page/simple/item-types/journal/journal.component.html
+++ b/src/app/+item-page/simple/item-types/journal/journal.component.html
@@ -14,6 +14,10 @@
[fields]="['journal.publisher']"
[label]="'journal.page.publisher'">
+
+
+
+
+
+
diff --git a/src/app/+item-page/simple/item-types/person/person.component.html b/src/app/+item-page/simple/item-types/person/person.component.html
index a490361ac3..30153353de 100644
--- a/src/app/+item-page/simple/item-types/person/person.component.html
+++ b/src/app/+item-page/simple/item-types/person/person.component.html
@@ -50,12 +50,9 @@
-
diff --git a/src/app/+item-page/simple/item-types/publication/publication.component.html b/src/app/+item-page/simple/item-types/publication/publication.component.html
index b1259be689..ab1ce097f5 100644
--- a/src/app/+item-page/simple/item-types/publication/publication.component.html
+++ b/src/app/+item-page/simple/item-types/publication/publication.component.html
@@ -7,6 +7,18 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/src/app/+item-page/simple/related-entities/related-entities-search/related-entities-search.component.html b/src/app/+item-page/simple/related-entities/related-entities-search/related-entities-search.component.html
new file mode 100644
index 0000000000..9ec082db73
--- /dev/null
+++ b/src/app/+item-page/simple/related-entities/related-entities-search/related-entities-search.component.html
@@ -0,0 +1,6 @@
+
+
diff --git a/src/app/+item-page/simple/related-entities/related-entities-search/related-entities-search.component.spec.ts b/src/app/+item-page/simple/related-entities/related-entities-search/related-entities-search.component.spec.ts
new file mode 100644
index 0000000000..e76a9cf3d0
--- /dev/null
+++ b/src/app/+item-page/simple/related-entities/related-entities-search/related-entities-search.component.spec.ts
@@ -0,0 +1,56 @@
+import { RelatedEntitiesSearchComponent } from './related-entities-search.component';
+import { async, ComponentFixture, TestBed } from '@angular/core/testing';
+import { NoopAnimationsModule } from '@angular/platform-browser/animations';
+import { TranslateModule } from '@ngx-translate/core';
+import { NO_ERRORS_SCHEMA } from '@angular/core';
+import { FormsModule } from '@angular/forms';
+import { SearchFixedFilterService } from '../../../../+search-page/search-filters/search-filter/search-fixed-filter.service';
+import { Item } from '../../../../core/shared/item.model';
+
+describe('RelatedEntitiesSearchComponent', () => {
+ let comp: RelatedEntitiesSearchComponent;
+ let fixture: ComponentFixture;
+ let fixedFilterService: SearchFixedFilterService;
+
+ const mockItem = Object.assign(new Item(), {
+ id: 'id1'
+ });
+ const mockRelationType = 'publicationsOfAuthor';
+ const mockRelationEntityType = 'publication';
+ const mockFilter= `f.${mockRelationType}=${mockItem.id}`;
+ const fixedFilterServiceStub = {
+ getFilterByRelation: () => mockFilter
+ };
+
+ beforeEach(async(() => {
+ TestBed.configureTestingModule({
+ imports: [TranslateModule.forRoot(), NoopAnimationsModule, FormsModule],
+ declarations: [RelatedEntitiesSearchComponent],
+ providers: [
+ { provide: SearchFixedFilterService, useValue: fixedFilterServiceStub }
+ ],
+ schemas: [NO_ERRORS_SCHEMA]
+ }).compileComponents();
+ }));
+
+ beforeEach(() => {
+ fixture = TestBed.createComponent(RelatedEntitiesSearchComponent);
+ comp = fixture.componentInstance;
+ fixedFilterService = (comp as any).fixedFilterService;
+ comp.relationType = mockRelationType;
+ comp.item = mockItem;
+ comp.relationEntityType = mockRelationEntityType;
+ fixture.detectChanges();
+ });
+
+ it('should create a fixedFilter', () => {
+ expect(comp.fixedFilter).toEqual(mockFilter);
+ });
+
+ it('should create a fixedFilter$', () => {
+ comp.fixedFilter$.subscribe((fixedFilter) => {
+ expect(fixedFilter).toEqual(mockRelationEntityType);
+ })
+ });
+
+});
diff --git a/src/app/+item-page/simple/related-entities/related-entities-search/related-entities-search.component.ts b/src/app/+item-page/simple/related-entities/related-entities-search/related-entities-search.component.ts
new file mode 100644
index 0000000000..672655a8b8
--- /dev/null
+++ b/src/app/+item-page/simple/related-entities/related-entities-search/related-entities-search.component.ts
@@ -0,0 +1,64 @@
+import { Component, Input, OnInit } from '@angular/core';
+import { Observable } from 'rxjs';
+import { Item } from '../../../../core/shared/item.model';
+import { SearchFixedFilterService } from '../../../../+search-page/search-filters/search-filter/search-fixed-filter.service';
+import { isNotEmpty } from '../../../../shared/empty.util';
+import { of } from 'rxjs/internal/observable/of';
+
+@Component({
+ selector: 'ds-related-entities-search',
+ templateUrl: './related-entities-search.component.html'
+})
+/**
+ * A component to show related items as search results.
+ * Related items can be facetted, or queried using an
+ * optional search box.
+ */
+export class RelatedEntitiesSearchComponent implements OnInit {
+
+ /**
+ * The type of relationship to fetch items for
+ * e.g. 'isAuthorOfPublication'
+ */
+ @Input() relationType: string;
+
+ /**
+ * The item to render relationships for
+ */
+ @Input() item: Item;
+
+ /**
+ * The entity type of the relationship items to be displayed
+ * e.g. 'publication'
+ * This determines the title of the search results (if search is enabled)
+ */
+ @Input() relationEntityType: string;
+
+ /**
+ * Whether or not the search bar and title should be displayed (defaults to true)
+ * @type {boolean}
+ */
+ @Input() searchEnabled = true;
+
+ /**
+ * The ratio of the sidebar's width compared to the search results (1-12) (defaults to 4)
+ * @type {number}
+ */
+ @Input() sideBarWidth = 4;
+
+ fixedFilter: string;
+ fixedFilter$: Observable;
+
+ constructor(private fixedFilterService: SearchFixedFilterService) {
+ }
+
+ ngOnInit(): void {
+ if (isNotEmpty(this.relationType) && isNotEmpty(this.item)) {
+ this.fixedFilter = this.fixedFilterService.getFilterByRelation(this.relationType, this.item.id);
+ }
+ if (isNotEmpty(this.relationEntityType)) {
+ this.fixedFilter$ = of(this.relationEntityType);
+ }
+ }
+
+}
diff --git a/src/app/+search-page/search-filters/search-filter/search-fixed-filter.service.ts b/src/app/+search-page/search-filters/search-filter/search-fixed-filter.service.ts
index 8f8997e63c..bf812fe4cc 100644
--- a/src/app/+search-page/search-filters/search-filter/search-fixed-filter.service.ts
+++ b/src/app/+search-page/search-filters/search-filter/search-fixed-filter.service.ts
@@ -73,4 +73,13 @@ export class SearchFixedFilterService {
return `query=relation.${relationType}:${itemUUID}`;
}
+ /**
+ * Get the filter for a relation with the item's UUID
+ * @param relationType The type of relation e.g. 'isAuthorOfPublication'
+ * @param itemUUID The item's UUID
+ */
+ getFilterByRelation(relationType: string, itemUUID: string): string {
+ return `f.${relationType}=${itemUUID}`;
+ }
+
}
diff --git a/src/app/+search-page/search-page.module.ts b/src/app/+search-page/search-page.module.ts
index 658c32d27e..b32e504966 100644
--- a/src/app/+search-page/search-page.module.ts
+++ b/src/app/+search-page/search-page.module.ts
@@ -91,7 +91,7 @@ const effects = [
SearchBooleanFilterComponent,
],
exports: [
- FilteredSearchPageComponent
+ FilteredSearchPageComponent,
]
})