From bafb2f349064f4b9ea9c3267a198da5d34b9abb8 Mon Sep 17 00:00:00 2001 From: lotte <lotte_hofstede@hotmail.com> Date: Mon, 14 Oct 2019 16:27:08 +0200 Subject: [PATCH] fixed existing tests and added linkType --- .../item-metadata.component.spec.ts | 6 +- .../edit-relationship.component.spec.ts | 3 +- .../modify-item-overview.component.spec.ts | 2 +- ...item-page-abstract-field.component.spec.ts | 2 +- .../item-page-author-field.component.spec.ts | 2 +- .../item-page-date-field.component.spec.ts | 2 +- .../generic-item-page-field.component.spec.ts | 2 +- .../item-page-field.component.spec.ts | 5 +- .../item-page-title-field.component.spec.ts | 2 +- .../uri/item-page-uri-field.component.spec.ts | 2 +- .../publication/publication.component.spec.ts | 5 +- .../item-types/shared/item.component.spec.ts | 10 +- ...data-representation-list.component.spec.ts | 2 +- .../related-entities-search.component.spec.ts | 2 +- .../+my-dspace-page/my-dspace-page.module.ts | 4 +- .../search-results.component.html | 1 + .../search-results.component.ts | 3 + .../journal-issue-grid-element.component.html | 2 +- ...urnal-issue-grid-element.component.spec.ts | 65 +++++-- ...journal-volume-grid-element.component.html | 2 +- ...rnal-volume-grid-element.component.spec.ts | 67 +++++-- .../journal-grid-element.component.html | 2 +- .../journal-grid-element.component.spec.ts | 64 +++++-- ...-search-result-grid-element.component.html | 14 +- ...arch-result-grid-element.component.spec.ts | 2 +- ...-search-result-grid-element.component.html | 14 +- ...arch-result-grid-element.component.spec.ts | 2 +- ...-search-result-grid-element.component.html | 20 +- ...arch-result-grid-element.component.spec.ts | 2 +- .../journal-issue-list-element.component.html | 2 +- ...urnal-issue-list-element.component.spec.ts | 111 ++++------- ...journal-volume-list-element.component.html | 2 +- ...rnal-volume-list-element.component.spec.ts | 112 ++++-------- .../journal-list-element.component.html | 2 +- .../journal-list-element.component.spec.ts | 88 ++++----- ...-search-result-list-element.component.html | 5 +- ...arch-result-list-element.component.spec.ts | 2 +- ...-search-result-list-element.component.html | 5 +- ...arch-result-list-element.component.spec.ts | 2 +- ...-search-result-list-element.component.html | 5 +- ...arch-result-list-element.component.spec.ts | 2 +- .../journal-issue.component.html | 2 +- .../journal-volume.component.html | 2 +- .../item-pages/journal/journal.component.html | 2 +- .../journal/journal.component.spec.ts | 5 +- .../orgunit-grid-element.component.html | 2 +- .../orgunit-grid-element.component.spec.ts | 65 +++++-- .../person/person-grid-element.component.html | 2 +- .../person-grid-element.component.spec.ts | 65 +++++-- .../project-grid-element.component.html | 2 +- .../project-grid-element.component.spec.ts | 64 +++++-- ...-search-result-grid-element.component.html | 26 ++- ...arch-result-grid-element.component.spec.ts | 2 +- ...-search-result-grid-element.component.html | 21 ++- ...arch-result-grid-element.component.spec.ts | 2 +- ...-search-result-grid-element.component.html | 16 +- ...arch-result-grid-element.component.spec.ts | 2 +- ...unit-item-page-list-element.component.html | 10 +- ...rgunit-item-page-list-element.component.ts | 6 +- .../orgunit-list-element.component.html | 2 +- .../orgunit-list-element.component.spec.ts | 89 ++++----- ...rson-item-page-list-element.component.html | 10 +- ...person-item-page-list-element.component.ts | 5 +- .../person/person-list-element.component.html | 2 +- .../person-list-element.component.spec.ts | 86 ++++----- .../project-list-element.component.html | 2 +- .../project-list-element.component.spec.ts | 97 ++++------ ...-search-result-list-element.component.html | 9 +- ...arch-result-list-element.component.spec.ts | 2 +- ...-search-result-list-element.component.html | 9 +- ...arch-result-list-element.component.spec.ts | 2 +- ...-search-result-list-element.component.html | 35 ++-- ...arch-result-list-element.component.spec.ts | 2 +- .../item-pages/orgunit/orgunit.component.html | 2 +- .../item-pages/person/person.component.html | 18 +- .../item-pages/project/project.component.html | 2 +- .../dso-input-suggestions.component.html | 6 +- .../dso-input-suggestions.component.ts | 2 + .../input-suggestions.component.scss | 10 - .../collection-element-link.type.ts | 3 + .../object-collection.component.html | 3 + .../object-collection.component.ts | 8 +- ...-object-component-loader.component.spec.ts | 90 --------- ...table-object-component-loader.component.ts | 3 + .../listable-object.decorator.ts | 2 - .../abstract-listable-element.component.ts | 6 +- ...ch-result-detail-element.component.spec.ts | 9 +- .../item-detail-preview.component.html | 2 +- .../item-detail-preview.component.spec.ts | 2 +- ...ch-result-detail-element.component.spec.ts | 6 +- ...earch-result-detail-element.component.html | 0 ...ch-result-detail-element.component.spec.ts | 6 +- ...-search-result-detail-element.component.ts | 0 ...ch-result-detail-element.component.spec.ts | 5 +- ...earch-result-detail-element.component.html | 0 ...earch-result-detail-element.component.scss | 0 ...ch-result-detail-element.component.spec.ts | 5 +- ...-search-result-detail-element.component.ts | 0 .../object-detail/object-detail.component.ts | 2 + .../collection-grid-element.component.html | 11 +- .../community-grid-element.component.html | 11 +- .../publication-grid-element.component.html | 2 +- ...publication-grid-element.component.spec.ts | 74 ++------ .../object-grid/object-grid.component.html | 2 +- .../object-grid/object-grid.component.ts | 2 + ...-search-result-grid-element.component.html | 10 +- ...-search-result-grid-element.component.html | 11 +- ...-search-result-grid-element.component.html | 23 ++- ...arch-result-grid-element.component.spec.ts | 4 +- .../browse-entry-list-element.component.html | 13 +- .../collection-list-element.component.html | 5 +- .../community-list-element.component.html | 5 +- .../publication-list-element.component.html | 2 +- ...publication-list-element.component.spec.ts | 173 +++++------------- .../item-type-badge.component.spec.ts | 8 +- ...em-metadata-list-element.component.spec.ts | 1 + .../item-metadata-list-element.component.ts | 3 +- ...a-representation-list-element.component.ts | 3 - ...xt-metadata-list-element.component.spec.ts | 1 + ...in-text-metadata-list-element.component.ts | 5 +- ...arch-result-list-element.component.spec.ts | 10 +- ...-list-element-submission.component.spec.ts | 4 +- ...arch-result-list-element.component.spec.ts | 9 +- ...arch-result-list-element.component.spec.ts | 11 +- ...arch-result-list-element.component.spec.ts | 9 +- .../object-list/object-list.component.html | 2 +- .../object-list/object-list.component.ts | 2 + ...-search-result-list-element.component.html | 3 +- ...arch-result-list-element.component.spec.ts | 4 +- ...-search-result-list-element.component.html | 3 +- ...arch-result-list-element.component.spec.ts | 3 +- ...-search-result-list-element.component.html | 8 +- ...arch-result-list-element.component.spec.ts | 105 ++++++----- 133 files changed, 942 insertions(+), 1089 deletions(-) create mode 100644 src/app/shared/object-collection/collection-element-link.type.ts delete mode 100644 src/app/shared/object-collection/shared/listable-object/listable-object-component-loader.component.spec.ts rename src/app/shared/object-detail/my-dspace-result-detail-element/{pool-my-dspace-result => pool-search-result}/pool-search-result-detail-element.component.html (100%) rename src/app/shared/object-detail/my-dspace-result-detail-element/{pool-my-dspace-result => pool-search-result}/pool-search-result-detail-element.component.spec.ts (93%) rename src/app/shared/object-detail/my-dspace-result-detail-element/{pool-my-dspace-result => pool-search-result}/pool-search-result-detail-element.component.ts (100%) rename src/app/shared/object-detail/my-dspace-result-detail-element/{workspace-item-my-dspace-result => workspace-item-search-result}/workspace-item-search-result-detail-element.component.html (100%) rename src/app/shared/object-detail/my-dspace-result-detail-element/{workspace-item-my-dspace-result => workspace-item-search-result}/workspace-item-search-result-detail-element.component.scss (100%) rename src/app/shared/object-detail/my-dspace-result-detail-element/{workspace-item-my-dspace-result => workspace-item-search-result}/workspace-item-search-result-detail-element.component.spec.ts (93%) rename src/app/shared/object-detail/my-dspace-result-detail-element/{workspace-item-my-dspace-result => workspace-item-search-result}/workspace-item-search-result-detail-element.component.ts (100%) diff --git a/src/app/+item-page/edit-item-page/item-metadata/item-metadata.component.spec.ts b/src/app/+item-page/edit-item-page/item-metadata/item-metadata.component.spec.ts index b9a793eddd..0c164b7bc2 100644 --- a/src/app/+item-page/edit-item-page/item-metadata/item-metadata.component.spec.ts +++ b/src/app/+item-page/edit-item-page/item-metadata/item-metadata.component.spec.ts @@ -216,9 +216,9 @@ describe('ItemMetadataComponent', () => { }); it('it should call reinstateFieldUpdates on the objectUpdatesService with the correct url and metadata', () => { - expect(objectUpdatesService.getUpdatedFields).toHaveBeenCalledWith(url, comp.object.metadataAsList); - expect(itemService.update).toHaveBeenCalledWith(Object.assign(comp.object, { metadata: Metadata.toMetadataMap(comp.object.metadataAsList) })); - expect(objectUpdatesService.getFieldUpdates).toHaveBeenCalledWith(url, comp.object.metadataAsList); + expect(objectUpdatesService.getUpdatedFields).toHaveBeenCalledWith(url, comp.item.metadataAsList); + expect(itemService.update).toHaveBeenCalledWith(Object.assign(comp.item, { metadata: Metadata.toMetadataMap(comp.item.metadataAsList) })); + expect(objectUpdatesService.getFieldUpdates).toHaveBeenCalledWith(url, comp.item.metadataAsList); }); }); diff --git a/src/app/+item-page/edit-item-page/item-relationships/edit-relationship/edit-relationship.component.spec.ts b/src/app/+item-page/edit-item-page/item-relationships/edit-relationship/edit-relationship.component.spec.ts index 55f97000e7..b90543d6ca 100644 --- a/src/app/+item-page/edit-item-page/item-relationships/edit-relationship/edit-relationship.component.spec.ts +++ b/src/app/+item-page/edit-item-page/item-relationships/edit-relationship/edit-relationship.component.spec.ts @@ -5,7 +5,6 @@ import { ObjectUpdatesService } from '../../../../core/data/object-updates/objec import { NO_ERRORS_SCHEMA } from '@angular/core'; import { EditRelationshipComponent } from './edit-relationship.component'; import { RelationshipType } from '../../../../core/shared/item-relationships/relationship-type.model'; -import { ResourceType } from '../../../../core/shared/resource-type'; import { Relationship } from '../../../../core/shared/item-relationships/relationship.model'; import { RemoteData } from '../../../../core/data/remote-data'; import { Item } from '../../../../core/shared/item.model'; @@ -113,7 +112,7 @@ describe('EditRelationshipComponent', () => { comp.url = url; comp.fieldUpdate = fieldUpdate1; - comp.object = item; + comp.item = item; fixture.detectChanges(); }); diff --git a/src/app/+item-page/edit-item-page/modify-item-overview/modify-item-overview.component.spec.ts b/src/app/+item-page/edit-item-page/modify-item-overview/modify-item-overview.component.spec.ts index d0c875d2d3..07ad9a347c 100644 --- a/src/app/+item-page/edit-item-page/modify-item-overview/modify-item-overview.component.spec.ts +++ b/src/app/+item-page/edit-item-page/modify-item-overview/modify-item-overview.component.spec.ts @@ -32,7 +32,7 @@ describe('ModifyItemOverviewComponent', () => { beforeEach(() => { fixture = TestBed.createComponent(ModifyItemOverviewComponent); comp = fixture.componentInstance; - comp.object = mockItem; + comp.item = mockItem; fixture.detectChanges(); }); diff --git a/src/app/+item-page/simple/field-components/specific-field/abstract/item-page-abstract-field.component.spec.ts b/src/app/+item-page/simple/field-components/specific-field/abstract/item-page-abstract-field.component.spec.ts index 219da338eb..9461ee0950 100644 --- a/src/app/+item-page/simple/field-components/specific-field/abstract/item-page-abstract-field.component.spec.ts +++ b/src/app/+item-page/simple/field-components/specific-field/abstract/item-page-abstract-field.component.spec.ts @@ -31,7 +31,7 @@ describe('ItemPageAbstractFieldComponent', () => { beforeEach(async(() => { fixture = TestBed.createComponent(ItemPageAbstractFieldComponent); comp = fixture.componentInstance; - comp.object = mockItemWithMetadataFieldAndValue(mockField, mockValue); + comp.item = mockItemWithMetadataFieldAndValue(mockField, mockValue); fixture.detectChanges(); })); diff --git a/src/app/+item-page/simple/field-components/specific-field/author/item-page-author-field.component.spec.ts b/src/app/+item-page/simple/field-components/specific-field/author/item-page-author-field.component.spec.ts index 5647c7cc11..d865caff8a 100644 --- a/src/app/+item-page/simple/field-components/specific-field/author/item-page-author-field.component.spec.ts +++ b/src/app/+item-page/simple/field-components/specific-field/author/item-page-author-field.component.spec.ts @@ -32,7 +32,7 @@ describe('ItemPageAuthorFieldComponent', () => { beforeEach(async(() => { fixture = TestBed.createComponent(ItemPageAuthorFieldComponent); comp = fixture.componentInstance; - comp.object = mockItemWithMetadataFieldAndValue(field, mockValue); + comp.item = mockItemWithMetadataFieldAndValue(field, mockValue); fixture.detectChanges(); })); diff --git a/src/app/+item-page/simple/field-components/specific-field/date/item-page-date-field.component.spec.ts b/src/app/+item-page/simple/field-components/specific-field/date/item-page-date-field.component.spec.ts index 760398e1f5..2adada582b 100644 --- a/src/app/+item-page/simple/field-components/specific-field/date/item-page-date-field.component.spec.ts +++ b/src/app/+item-page/simple/field-components/specific-field/date/item-page-date-field.component.spec.ts @@ -31,7 +31,7 @@ describe('ItemPageDateFieldComponent', () => { beforeEach(async(() => { fixture = TestBed.createComponent(ItemPageDateFieldComponent); comp = fixture.componentInstance; - comp.object = mockItemWithMetadataFieldAndValue(mockField, mockValue); + comp.item = mockItemWithMetadataFieldAndValue(mockField, mockValue); fixture.detectChanges(); })); diff --git a/src/app/+item-page/simple/field-components/specific-field/generic/generic-item-page-field.component.spec.ts b/src/app/+item-page/simple/field-components/specific-field/generic/generic-item-page-field.component.spec.ts index 2bfff14dd6..d8abd39cf3 100644 --- a/src/app/+item-page/simple/field-components/specific-field/generic/generic-item-page-field.component.spec.ts +++ b/src/app/+item-page/simple/field-components/specific-field/generic/generic-item-page-field.component.spec.ts @@ -33,7 +33,7 @@ describe('GenericItemPageFieldComponent', () => { beforeEach(async(() => { fixture = TestBed.createComponent(GenericItemPageFieldComponent); comp = fixture.componentInstance; - comp.object = mockItemWithMetadataFieldAndValue(mockField, mockValue); + comp.item = mockItemWithMetadataFieldAndValue(mockField, mockValue); comp.fields = mockFields; comp.label = mockLabel; fixture.detectChanges(); diff --git a/src/app/+item-page/simple/field-components/specific-field/item-page-field.component.spec.ts b/src/app/+item-page/simple/field-components/specific-field/item-page-field.component.spec.ts index 4db4e06ce6..6e5ed2c535 100644 --- a/src/app/+item-page/simple/field-components/specific-field/item-page-field.component.spec.ts +++ b/src/app/+item-page/simple/field-components/specific-field/item-page-field.component.spec.ts @@ -4,12 +4,9 @@ import { async, ComponentFixture, TestBed } from '@angular/core/testing'; import { Item } from '../../../../core/shared/item.model'; import { PaginatedList } from '../../../../core/data/paginated-list'; import { MockTranslateLoader } from '../../../../shared/mocks/mock-translate-loader'; -import { Observable } from 'rxjs'; import { PageInfo } from '../../../../core/shared/page-info.model'; -import { RemoteData } from '../../../../core/data/remote-data'; import { ItemPageFieldComponent } from './item-page-field.component'; import { MetadataValuesComponent } from '../../../field-components/metadata-values/metadata-values.component'; -import { of as observableOf } from 'rxjs'; import { MetadataMap, MetadataValue } from '../../../../core/shared/metadata.models'; import { createSuccessfulRemoteDataObject$ } from '../../../../shared/testing/utils'; @@ -40,7 +37,7 @@ describe('ItemPageFieldComponent', () => { beforeEach(async(() => { fixture = TestBed.createComponent(ItemPageFieldComponent); comp = fixture.componentInstance; - comp.object = mockItemWithMetadataFieldAndValue(mockField, mockValue); + comp.item = mockItemWithMetadataFieldAndValue(mockField, mockValue); comp.fields = mockFields; comp.label = mockLabel; fixture.detectChanges(); diff --git a/src/app/+item-page/simple/field-components/specific-field/title/item-page-title-field.component.spec.ts b/src/app/+item-page/simple/field-components/specific-field/title/item-page-title-field.component.spec.ts index 17ce39dd18..cb1ba6a4bc 100644 --- a/src/app/+item-page/simple/field-components/specific-field/title/item-page-title-field.component.spec.ts +++ b/src/app/+item-page/simple/field-components/specific-field/title/item-page-title-field.component.spec.ts @@ -31,7 +31,7 @@ describe('ItemPageTitleFieldComponent', () => { beforeEach(async(() => { fixture = TestBed.createComponent(ItemPageTitleFieldComponent); comp = fixture.componentInstance; - comp.object = mockItemWithMetadataFieldAndValue(mockField, mockValue); + comp.item = mockItemWithMetadataFieldAndValue(mockField, mockValue); fixture.detectChanges(); })); diff --git a/src/app/+item-page/simple/field-components/specific-field/uri/item-page-uri-field.component.spec.ts b/src/app/+item-page/simple/field-components/specific-field/uri/item-page-uri-field.component.spec.ts index 60d2f5c97c..4511f16aae 100644 --- a/src/app/+item-page/simple/field-components/specific-field/uri/item-page-uri-field.component.spec.ts +++ b/src/app/+item-page/simple/field-components/specific-field/uri/item-page-uri-field.component.spec.ts @@ -31,7 +31,7 @@ describe('ItemPageUriFieldComponent', () => { beforeEach(async(() => { fixture = TestBed.createComponent(ItemPageUriFieldComponent); comp = fixture.componentInstance; - comp.object = mockItemWithMetadataFieldAndValue(mockField, mockValue); + comp.item = mockItemWithMetadataFieldAndValue(mockField, mockValue); fixture.detectChanges(); })); diff --git a/src/app/+item-page/simple/item-types/publication/publication.component.spec.ts b/src/app/+item-page/simple/item-types/publication/publication.component.spec.ts index db2c07c63a..5b17f7bbd4 100644 --- a/src/app/+item-page/simple/item-types/publication/publication.component.spec.ts +++ b/src/app/+item-page/simple/item-types/publication/publication.component.spec.ts @@ -3,19 +3,16 @@ import { TranslateLoader, TranslateModule } from '@ngx-translate/core'; import { MockTranslateLoader } from '../../../../shared/mocks/mock-translate-loader'; import { GenericItemPageFieldComponent } from '../../field-components/specific-field/generic/generic-item-page-field.component'; import { TruncatePipe } from '../../../../shared/utils/truncate.pipe'; -import { ITEM } from '../../../../shared/items/switcher/listable-object-component-loader.component'; import { ItemDataService } from '../../../../core/data/item-data.service'; import { SearchFixedFilterService } from '../../../../+search-page/search-filters/search-filter/search-fixed-filter.service'; import { TruncatableService } from '../../../../shared/truncatable/truncatable.service'; import { ChangeDetectionStrategy, NO_ERRORS_SCHEMA } from '@angular/core'; import { Item } from '../../../../core/shared/item.model'; -import { RemoteData } from '../../../../core/data/remote-data'; import { PaginatedList } from '../../../../core/data/paginated-list'; import { PageInfo } from '../../../../core/shared/page-info.model'; import { By } from '@angular/platform-browser'; import { createRelationshipsObservable } from '../shared/item.component.spec'; import { PublicationComponent } from './publication.component'; -import { of as observableOf } from 'rxjs'; import { MetadataMap } from '../../../../core/shared/metadata.models'; import { createSuccessfulRemoteDataObject$ } from '../../../../shared/testing/utils'; @@ -45,7 +42,6 @@ describe('PublicationComponent', () => { })], declarations: [PublicationComponent, GenericItemPageFieldComponent, TruncatePipe], providers: [ - {provide: ITEM, useValue: mockItem}, {provide: ItemDataService, useValue: {}}, {provide: SearchFixedFilterService, useValue: searchFixedFilterServiceStub}, {provide: TruncatableService, useValue: {}} @@ -60,6 +56,7 @@ describe('PublicationComponent', () => { beforeEach(async(() => { fixture = TestBed.createComponent(PublicationComponent); comp = fixture.componentInstance; + comp.object = mockItem; fixture.detectChanges(); })); diff --git a/src/app/+item-page/simple/item-types/shared/item.component.spec.ts b/src/app/+item-page/simple/item-types/shared/item.component.spec.ts index e6880c3c90..f436b2f767 100644 --- a/src/app/+item-page/simple/item-types/shared/item.component.spec.ts +++ b/src/app/+item-page/simple/item-types/shared/item.component.spec.ts @@ -7,17 +7,14 @@ import { ItemDataService } from '../../../../core/data/item-data.service'; import { TranslateLoader, TranslateModule } from '@ngx-translate/core'; import { MockTranslateLoader } from '../../../../shared/mocks/mock-translate-loader'; import { ChangeDetectionStrategy, DebugElement, NO_ERRORS_SCHEMA } from '@angular/core'; -import { ITEM } from '../../../../shared/items/switcher/listable-object-component-loader.component'; import { TruncatePipe } from '../../../../shared/utils/truncate.pipe'; import { isNotEmpty } from '../../../../shared/empty.util'; import { SearchFixedFilterService } from '../../../../+search-page/search-filters/search-filter/search-fixed-filter.service'; import { RelationshipType } from '../../../../core/shared/item-relationships/relationship-type.model'; import { PaginatedList } from '../../../../core/data/paginated-list'; -import { RemoteData } from '../../../../core/data/remote-data'; import { Relationship } from '../../../../core/shared/item-relationships/relationship.model'; import { PageInfo } from '../../../../core/shared/page-info.model'; import { ItemComponent } from './item.component'; -import { of as observableOf } from 'rxjs'; import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; import { VarDirective } from '../../../../shared/utils/var.directive'; import { Observable } from 'rxjs/internal/Observable'; @@ -56,7 +53,6 @@ export function getItemPageFieldsTest(mockItem: Item, component) { })], declarations: [component, GenericItemPageFieldComponent, TruncatePipe], providers: [ - {provide: ITEM, useValue: mockItem}, {provide: ItemDataService, useValue: {}}, {provide: SearchFixedFilterService, useValue: searchFixedFilterServiceStub}, {provide: TruncatableService, useValue: {}} @@ -71,6 +67,7 @@ export function getItemPageFieldsTest(mockItem: Item, component) { beforeEach(async(() => { fixture = TestBed.createComponent(component); comp = fixture.componentInstance; + comp.object = mockItem; fixture.detectChanges(); })); @@ -386,10 +383,6 @@ describe('ItemComponent', () => { } }), BrowserAnimationsModule], declarations: [ItemComponent, VarDirective], - providers: [ - {provide: ITEM, useValue: mockItem} - ], - schemas: [NO_ERRORS_SCHEMA] }).overrideComponent(ItemComponent, { set: {changeDetection: ChangeDetectionStrategy.Default} @@ -399,6 +392,7 @@ describe('ItemComponent', () => { beforeEach(async(() => { fixture = TestBed.createComponent(ItemComponent); comp = fixture.componentInstance; + comp.object = mockItem; fixture.detectChanges(); representations = comp.buildRepresentations('bogus', metadataField); })); diff --git a/src/app/+item-page/simple/metadata-representation-list/metadata-representation-list.component.spec.ts b/src/app/+item-page/simple/metadata-representation-list/metadata-representation-list.component.spec.ts index dcdfc1ccea..6795e36440 100644 --- a/src/app/+item-page/simple/metadata-representation-list/metadata-representation-list.component.spec.ts +++ b/src/app/+item-page/simple/metadata-representation-list/metadata-representation-list.component.spec.ts @@ -33,7 +33,7 @@ describe('MetadataRepresentationListComponent', () => { })); it(`should load ${representations.length} item-type-switcher components`, () => { - const fields = fixture.debugElement.queryAll(By.css('ds-listable-object-component-loader')); + const fields = fixture.debugElement.queryAll(By.css('ds-metadata-representation-loader')); expect(fields.length).toBe(representations.length); }); 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 index bc2571f6f9..711e1b9d3d 100644 --- 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 @@ -38,7 +38,7 @@ describe('RelatedEntitiesSearchComponent', () => { comp = fixture.componentInstance; fixedFilterService = (comp as any).fixedFilterService; comp.relationType = mockRelationType; - comp.object = mockItem; + comp.item = mockItem; comp.relationEntityType = mockRelationEntityType; fixture.detectChanges(); }); diff --git a/src/app/+my-dspace-page/my-dspace-page.module.ts b/src/app/+my-dspace-page/my-dspace-page.module.ts index 685f1155be..be14aebdea 100644 --- a/src/app/+my-dspace-page/my-dspace-page.module.ts +++ b/src/app/+my-dspace-page/my-dspace-page.module.ts @@ -12,7 +12,7 @@ import { ClaimedSearchResultListElementComponent } from '../shared/object-list/m import { PoolSearchResultListElementComponent } from '../shared/object-list/my-dspace-result-list-element/pool-search-result/pool-search-result-list-element.component'; import { MyDSpaceNewSubmissionComponent } from './my-dspace-new-submission/my-dspace-new-submission.component'; import { ItemSearchResultDetailElementComponent } from '../shared/object-detail/my-dspace-result-detail-element/item-search-result/item-search-result-detail-element.component'; -import { WorkspaceItemSearchResultDetailElementComponent } from '../shared/object-detail/my-dspace-result-detail-element/workspace-item-my-dspace-result/workspace-item-search-result-detail-element.component'; +import { WorkspaceItemSearchResultDetailElementComponent } from '../shared/object-detail/my-dspace-result-detail-element/workspace-item-search-result/workspace-item-search-result-detail-element.component'; import { WorkflowItemSearchResultDetailElementComponent } from '../shared/object-detail/my-dspace-result-detail-element/workflow-item-search-result/workflow-item-search-result-detail-element.component'; import { ClaimedTaskSearchResultDetailElementComponent } from '../shared/object-detail/my-dspace-result-detail-element/claimed-task-search-result/claimed-task-search-result-detail-element.component'; import { MyDSpaceGuard } from './my-dspace.guard'; @@ -20,7 +20,7 @@ import { MyDSpaceConfigurationService } from './my-dspace-configuration.service' import { SearchResultListElementComponent } from '../shared/object-list/search-result-list-element/search-result-list-element.component'; import { ItemSearchResultListElementSubmissionComponent } from '../shared/object-list/my-dspace-result-list-element/item-search-result/item-search-result-list-element-submission.component'; import { WorkflowItemSearchResultListElementComponent } from '../shared/object-list/my-dspace-result-list-element/workflow-item-search-result/workflow-item-search-result-list-element.component'; -import { PoolSearchResultDetailElementComponent } from '../shared/object-detail/my-dspace-result-detail-element/pool-my-dspace-result/pool-search-result-detail-element.component'; +import { PoolSearchResultDetailElementComponent } from '../shared/object-detail/my-dspace-result-detail-element/pool-search-result/pool-search-result-detail-element.component'; @NgModule({ imports: [ diff --git a/src/app/+search-page/search-results/search-results.component.html b/src/app/+search-page/search-results/search-results.component.html index 5a1e89858b..c08a4f023f 100644 --- a/src/app/+search-page/search-results/search-results.component.html +++ b/src/app/+search-page/search-results/search-results.component.html @@ -4,6 +4,7 @@ [config]="searchConfig.pagination" [sortConfig]="searchConfig.sort" [objects]="searchResults" + [linkType]="linkType" [hideGear]="true"> </ds-viewable-collection></div> <ds-loading *ngIf="hasNoValue(searchResults) || hasNoValue(searchResults.payload) || searchResults.isLoading" message="{{'loading.search-results' | translate}}"></ds-loading> diff --git a/src/app/+search-page/search-results/search-results.component.ts b/src/app/+search-page/search-results/search-results.component.ts index 8ec7b1cae4..46d15d97d9 100644 --- a/src/app/+search-page/search-results/search-results.component.ts +++ b/src/app/+search-page/search-results/search-results.component.ts @@ -8,6 +8,7 @@ import { PaginatedList } from '../../core/data/paginated-list'; import { hasNoValue, isNotEmpty } from '../../shared/empty.util'; import { SortOptions } from '../../core/cache/models/sort-options.model'; import { ViewMode } from '../../core/shared/view-mode.model'; +import { CollectionElementLinkType } from '../../shared/object-collection/collection-element-link.type'; @Component({ selector: 'ds-search-results', @@ -24,6 +25,8 @@ import { ViewMode } from '../../core/shared/view-mode.model'; export class SearchResultsComponent { hasNoValue = hasNoValue; + @Input() linkType: CollectionElementLinkType; + /** * The actual search result objects */ diff --git a/src/app/entity-groups/journal-entities/item-grid-elements/journal-issue/journal-issue-grid-element.component.html b/src/app/entity-groups/journal-entities/item-grid-elements/journal-issue/journal-issue-grid-element.component.html index fab0cf5c07..fb69ed92f5 100644 --- a/src/app/entity-groups/journal-entities/item-grid-elements/journal-issue/journal-issue-grid-element.component.html +++ b/src/app/entity-groups/journal-entities/item-grid-elements/journal-issue/journal-issue-grid-element.component.html @@ -1 +1 @@ -<ds-journal-issue-search-result-grid-element [object]="{ indexableObject: object, hitHighlights: {} }"></ds-journal-issue-search-result-grid-element> \ No newline at end of file +<ds-journal-issue-search-result-grid-element [object]="{ indexableObject: object, hitHighlights: {} }" [linkType]="linkType"></ds-journal-issue-search-result-grid-element> \ No newline at end of file diff --git a/src/app/entity-groups/journal-entities/item-grid-elements/journal-issue/journal-issue-grid-element.component.spec.ts b/src/app/entity-groups/journal-entities/item-grid-elements/journal-issue/journal-issue-grid-element.component.spec.ts index d13feda406..4ad7770e1e 100644 --- a/src/app/entity-groups/journal-entities/item-grid-elements/journal-issue/journal-issue-grid-element.component.spec.ts +++ b/src/app/entity-groups/journal-entities/item-grid-elements/journal-issue/journal-issue-grid-element.component.spec.ts @@ -1,15 +1,19 @@ import { ItemSearchResult } from '../../../../shared/object-collection/shared/item-search-result.model'; import { Item } from '../../../../core/shared/item.model'; -import { of as observableOf } from 'rxjs/internal/observable/of'; import { getEntityGridElementTestComponent } from '../../../../shared/object-grid/item-grid-element/item-types/publication/publication-grid-element.component.spec'; import { JournalIssueGridElementComponent } from './journal-issue-grid-element.component'; import { createSuccessfulRemoteDataObject$ } from '../../../../shared/testing/utils'; import { PaginatedList } from '../../../../core/data/paginated-list'; import { PageInfo } from '../../../../core/shared/page-info.model'; +import { of as observableOf } from 'rxjs'; +import { async, TestBed } from '@angular/core/testing'; +import { NoopAnimationsModule } from '@angular/platform-browser/animations'; +import { TruncatePipe } from '../../../../shared/utils/truncate.pipe'; +import { TruncatableService } from '../../../../shared/truncatable/truncatable.service'; +import { ChangeDetectionStrategy, NO_ERRORS_SCHEMA } from '@angular/core'; +import { By } from '@angular/platform-browser'; -const mockItemWithMetadata: ItemSearchResult = new ItemSearchResult(); -mockItemWithMetadata.hitHighlights = {}; -mockItemWithMetadata.indexableObject = Object.assign(new Item(), { +const mockItem = Object.assign(new Item(), { bitstreams: createSuccessfulRemoteDataObject$(new PaginatedList(new PageInfo(), [])), metadata: { 'dc.title': [ @@ -33,18 +37,43 @@ mockItemWithMetadata.indexableObject = Object.assign(new Item(), { } }); -const mockItemWithoutMetadata: ItemSearchResult = new ItemSearchResult(); -mockItemWithoutMetadata.hitHighlights = {}; -mockItemWithoutMetadata.indexableObject = Object.assign(new Item(), { - bitstreams: createSuccessfulRemoteDataObject$(new PaginatedList(new PageInfo(), [])), - metadata: { - 'dc.title': [ - { - language: 'en_US', - value: 'This is just another title' - } - ] - } -}); +describe('JournalIssueGridElementComponent', + () => { + let comp; + let fixture; + + const truncatableServiceStub: any = { + isCollapsed: (id: number) => observableOf(true), + }; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + imports: [NoopAnimationsModule], + declarations: [JournalIssueGridElementComponent, TruncatePipe], + providers: [ + { provide: TruncatableService, useValue: truncatableServiceStub }, + ], + schemas: [NO_ERRORS_SCHEMA] + }).overrideComponent(JournalIssueGridElementComponent, { + set: { changeDetection: ChangeDetectionStrategy.Default } + }).compileComponents(); + })); + + beforeEach(async(() => { + fixture = TestBed.createComponent(JournalIssueGridElementComponent); + comp = fixture.componentInstance; + })); + + describe(`when the journal issue is rendered`, () => { + beforeEach(() => { + comp.object = mockItem; + fixture.detectChanges(); + }); + + it(`should contain a JournalIssueSearchResultGridElementComponent`, () => { + const journalIssueGridElement = fixture.debugElement.query(By.css(`ds-journal-issue-search-result-grid-element`)); + expect(journalIssueGridElement).not.toBeNull(); + }); + }); -describe('JournalIssueGridElementComponent', getEntityGridElementTestComponent(JournalIssueGridElementComponent, mockItemWithMetadata, mockItemWithoutMetadata, ['date', 'journal-title'])); + }); diff --git a/src/app/entity-groups/journal-entities/item-grid-elements/journal-volume/journal-volume-grid-element.component.html b/src/app/entity-groups/journal-entities/item-grid-elements/journal-volume/journal-volume-grid-element.component.html index 06bcb10c4d..53713b47ee 100644 --- a/src/app/entity-groups/journal-entities/item-grid-elements/journal-volume/journal-volume-grid-element.component.html +++ b/src/app/entity-groups/journal-entities/item-grid-elements/journal-volume/journal-volume-grid-element.component.html @@ -1 +1 @@ -<ds-journal-volume-search-result-grid-element [object]="{ indexableObject: object, hitHighlights: {} }"></ds-journal-volume-search-result-grid-element> \ No newline at end of file +<ds-journal-volume-search-result-grid-element [object]="{ indexableObject: object, hitHighlights: {} }" [linkType]="linkType"></ds-journal-volume-search-result-grid-element> \ No newline at end of file diff --git a/src/app/entity-groups/journal-entities/item-grid-elements/journal-volume/journal-volume-grid-element.component.spec.ts b/src/app/entity-groups/journal-entities/item-grid-elements/journal-volume/journal-volume-grid-element.component.spec.ts index 8c854aeb77..427f1db3cd 100644 --- a/src/app/entity-groups/journal-entities/item-grid-elements/journal-volume/journal-volume-grid-element.component.spec.ts +++ b/src/app/entity-groups/journal-entities/item-grid-elements/journal-volume/journal-volume-grid-element.component.spec.ts @@ -1,15 +1,19 @@ import { ItemSearchResult } from '../../../../shared/object-collection/shared/item-search-result.model'; import { Item } from '../../../../core/shared/item.model'; -import { of as observableOf } from 'rxjs/internal/observable/of'; -import { getEntityGridElementTestComponent } from '../../../../shared/object-grid/item-grid-element/item-types/publication/publication-grid-element.component.spec'; import { JournalVolumeGridElementComponent } from './journal-volume-grid-element.component'; import { createSuccessfulRemoteDataObject$ } from '../../../../shared/testing/utils'; import { PaginatedList } from '../../../../core/data/paginated-list'; import { PageInfo } from '../../../../core/shared/page-info.model'; +import { of as observableOf } from 'rxjs'; +import { async, TestBed } from '@angular/core/testing'; +import { NoopAnimationsModule } from '@angular/platform-browser/animations'; +import { JournalIssueGridElementComponent } from '../journal-issue/journal-issue-grid-element.component'; +import { TruncatePipe } from '../../../../shared/utils/truncate.pipe'; +import { TruncatableService } from '../../../../shared/truncatable/truncatable.service'; +import { ChangeDetectionStrategy, NO_ERRORS_SCHEMA } from '@angular/core'; +import { By } from '@angular/platform-browser'; -const mockItemWithMetadata: ItemSearchResult = new ItemSearchResult(); -mockItemWithMetadata.hitHighlights = {}; -mockItemWithMetadata.indexableObject = Object.assign(new Item(), { +const mockItem = Object.assign(new Item(), { bitstreams: createSuccessfulRemoteDataObject$(new PaginatedList(new PageInfo(), [])), metadata: { 'dc.title': [ @@ -33,18 +37,43 @@ mockItemWithMetadata.indexableObject = Object.assign(new Item(), { } }); -const mockItemWithoutMetadata: ItemSearchResult = new ItemSearchResult(); -mockItemWithoutMetadata.hitHighlights = {}; -mockItemWithoutMetadata.indexableObject = Object.assign(new Item(), { - bitstreams: createSuccessfulRemoteDataObject$(new PaginatedList(new PageInfo(), [])), - metadata: { - 'dc.title': [ - { - language: 'en_US', - value: 'This is just another title' - } - ] - } -}); +describe('JournalVolumeGridElementComponent', + () => { + let comp; + let fixture; + + const truncatableServiceStub: any = { + isCollapsed: (id: number) => observableOf(true), + }; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + imports: [NoopAnimationsModule], + declarations: [JournalVolumeGridElementComponent, TruncatePipe], + providers: [ + { provide: TruncatableService, useValue: truncatableServiceStub }, + ], + schemas: [NO_ERRORS_SCHEMA] + }).overrideComponent(JournalVolumeGridElementComponent, { + set: { changeDetection: ChangeDetectionStrategy.Default } + }).compileComponents(); + })); + + beforeEach(async(() => { + fixture = TestBed.createComponent(JournalVolumeGridElementComponent); + comp = fixture.componentInstance; + })); + + describe(`when the journal volume is rendered`, () => { + beforeEach(() => { + comp.object = mockItem; + fixture.detectChanges(); + }); + + it(`should contain a JournalVolumeSearchResultGridElementComponent`, () => { + const journalVolumeGridElement = fixture.debugElement.query(By.css(`ds-journal-volume-search-result-grid-element`)); + expect(journalVolumeGridElement).not.toBeNull(); + }); + }); -describe('JournalVolumeGridElementComponent', getEntityGridElementTestComponent(JournalVolumeGridElementComponent, mockItemWithMetadata, mockItemWithoutMetadata, ['date', 'description'])); + }); \ No newline at end of file diff --git a/src/app/entity-groups/journal-entities/item-grid-elements/journal/journal-grid-element.component.html b/src/app/entity-groups/journal-entities/item-grid-elements/journal/journal-grid-element.component.html index 1a7a6f5da8..594a0e0dc1 100644 --- a/src/app/entity-groups/journal-entities/item-grid-elements/journal/journal-grid-element.component.html +++ b/src/app/entity-groups/journal-entities/item-grid-elements/journal/journal-grid-element.component.html @@ -1 +1 @@ -<ds-journal-search-result-grid-element [object]="{ indexableObject: object, hitHighlights: {} }"></ds-journal-search-result-grid-element> \ No newline at end of file +<ds-journal-search-result-grid-element [object]="{ indexableObject: object, hitHighlights: {} }" [linkType]="linkType"></ds-journal-search-result-grid-element> \ No newline at end of file diff --git a/src/app/entity-groups/journal-entities/item-grid-elements/journal/journal-grid-element.component.spec.ts b/src/app/entity-groups/journal-entities/item-grid-elements/journal/journal-grid-element.component.spec.ts index 0d0f77842a..d0f3753840 100644 --- a/src/app/entity-groups/journal-entities/item-grid-elements/journal/journal-grid-element.component.spec.ts +++ b/src/app/entity-groups/journal-entities/item-grid-elements/journal/journal-grid-element.component.spec.ts @@ -1,15 +1,18 @@ import { ItemSearchResult } from '../../../../shared/object-collection/shared/item-search-result.model'; import { Item } from '../../../../core/shared/item.model'; import { of as observableOf } from 'rxjs/internal/observable/of'; -import { getEntityGridElementTestComponent } from '../../../../shared/object-grid/item-grid-element/item-types/publication/publication-grid-element.component.spec'; import { JournalGridElementComponent } from './journal-grid-element.component'; import { createSuccessfulRemoteDataObject$ } from '../../../../shared/testing/utils'; import { PaginatedList } from '../../../../core/data/paginated-list'; import { PageInfo } from '../../../../core/shared/page-info.model'; +import { async, TestBed } from '@angular/core/testing'; +import { NoopAnimationsModule } from '@angular/platform-browser/animations'; +import { TruncatePipe } from '../../../../shared/utils/truncate.pipe'; +import { TruncatableService } from '../../../../shared/truncatable/truncatable.service'; +import { ChangeDetectionStrategy, NO_ERRORS_SCHEMA } from '@angular/core'; +import { By } from '@angular/platform-browser'; -const mockItemWithMetadata: ItemSearchResult = new ItemSearchResult(); -mockItemWithMetadata.hitHighlights = {}; -mockItemWithMetadata.indexableObject = Object.assign(new Item(), { +const mockItem = Object.assign(new Item(), { bitstreams: createSuccessfulRemoteDataObject$(new PaginatedList(new PageInfo(), [])), metadata: { 'dc.title': [ @@ -39,18 +42,43 @@ mockItemWithMetadata.indexableObject = Object.assign(new Item(), { } }); -const mockItemWithoutMetadata: ItemSearchResult = new ItemSearchResult(); -mockItemWithoutMetadata.hitHighlights = {}; -mockItemWithoutMetadata.indexableObject = Object.assign(new Item(), { - bitstreams: createSuccessfulRemoteDataObject$(new PaginatedList(new PageInfo(), [])), - metadata: { - 'dc.title': [ - { - language: 'en_US', - value: 'This is just another title' - } - ] - } -}); +describe('JournalGridElementComponent', + () => { + let comp; + let fixture; + + const truncatableServiceStub: any = { + isCollapsed: (id: number) => observableOf(true), + }; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + imports: [NoopAnimationsModule], + declarations: [JournalGridElementComponent, TruncatePipe], + providers: [ + { provide: TruncatableService, useValue: truncatableServiceStub }, + ], + schemas: [NO_ERRORS_SCHEMA] + }).overrideComponent(JournalGridElementComponent, { + set: { changeDetection: ChangeDetectionStrategy.Default } + }).compileComponents(); + })); + + beforeEach(async(() => { + fixture = TestBed.createComponent(JournalGridElementComponent); + comp = fixture.componentInstance; + })); + + describe(`when the journal is rendered`, () => { + beforeEach(() => { + comp.object = mockItem; + fixture.detectChanges(); + }); + + it(`should contain a JournalGridElementComponent`, () => { + const journalGridElement = fixture.debugElement.query(By.css(`ds-journal-search-result-grid-element`)); + expect(journalGridElement).not.toBeNull(); + }); + }); -describe('JournalGridElementComponent', getEntityGridElementTestComponent(JournalGridElementComponent, mockItemWithMetadata, mockItemWithoutMetadata, ['editor', 'publisher', 'description'])); + }); \ No newline at end of file diff --git a/src/app/entity-groups/journal-entities/item-grid-elements/search-result-grid-elements/journal-issue/journal-issue-search-result-grid-element.component.html b/src/app/entity-groups/journal-entities/item-grid-elements/search-result-grid-elements/journal-issue/journal-issue-search-result-grid-element.component.html index 23cc3ae285..18ff77bf23 100644 --- a/src/app/entity-groups/journal-entities/item-grid-elements/search-result-grid-elements/journal-issue/journal-issue-search-result-grid-element.component.html +++ b/src/app/entity-groups/journal-entities/item-grid-elements/search-result-grid-elements/journal-issue/journal-issue-search-result-grid-element.component.html @@ -1,15 +1,21 @@ <ds-truncatable [id]="dso.id"> <div class="card" [@focusShadow]="(isCollapsed$ | async)?'blur':'focus'"> - <a [routerLink]="['/items/' + dso.id]" class="card-img-top full-width"> + <a *ngIf="linkType != linkTypes.None" [target]="(linkType == linkTypes.ExternalLink) ? '_blank' : '_self'" rel="noopener noreferrer" [routerLink]="['/items/' + dso.id]" class="card-img-top full-width"> <div> <ds-grid-thumbnail [thumbnail]="dso.getThumbnail() | async"> </ds-grid-thumbnail> </div> </a> + <span *ngIf="linkType == linkTypes.None" class="card-img-top full-width"> + <div> + <ds-grid-thumbnail [thumbnail]="dso.getThumbnail() | async"> + </ds-grid-thumbnail> + </div> + </span> <div class="card-body"> <ds-item-type-badge [object]="dso"></ds-item-type-badge> <ds-truncatable-part [id]="dso.id" [minLines]="3" type="h4"> - <h4 class="card-title" [innerHTML]="dso.firstMetadataValue('dc.title')"></h4> + <h4 class="card-title" [innerHTML]="firstMetadataValue('dc.title')"></h4> </ds-truncatable-part> <p *ngIf="dso.hasMetadata('creativework.datePublished')" class="item-date card-text text-muted"> <ds-truncatable-part [id]="dso.id" [minLines]="1"> @@ -21,8 +27,8 @@ <span [innerHTML]="firstMetadataValue('journal.title')"></span> </ds-truncatable-part> </p> - <div class="text-center"> - <a [routerLink]="['/items/' + dso.id]" + <div *ngIf="linkType != linkTypes.None" class="text-center"> + <a [target]="(linkType == linkTypes.ExternalLink) ? '_blank' : '_self'" rel="noopener noreferrer" [routerLink]="['/items/' + dso.id]" class="lead btn btn-primary viewButton">View</a> </div> </div> diff --git a/src/app/entity-groups/journal-entities/item-grid-elements/search-result-grid-elements/journal-issue/journal-issue-search-result-grid-element.component.spec.ts b/src/app/entity-groups/journal-entities/item-grid-elements/search-result-grid-elements/journal-issue/journal-issue-search-result-grid-element.component.spec.ts index 6619694f88..3cca9071b0 100644 --- a/src/app/entity-groups/journal-entities/item-grid-elements/search-result-grid-elements/journal-issue/journal-issue-search-result-grid-element.component.spec.ts +++ b/src/app/entity-groups/journal-entities/item-grid-elements/search-result-grid-elements/journal-issue/journal-issue-search-result-grid-element.component.spec.ts @@ -46,4 +46,4 @@ mockItemWithoutMetadata.indexableObject = Object.assign(new Item(), { } }); -describe('JournalIssueGridElementComponent', getEntityGridElementTestComponent(JournalIssueSearchResultGridElementComponent, mockItemWithMetadata, mockItemWithoutMetadata, ['date', 'journal-title'])); +describe('JournalIssueSearchResultGridElementComponent', getEntityGridElementTestComponent(JournalIssueSearchResultGridElementComponent, mockItemWithMetadata, mockItemWithoutMetadata, ['date', 'journal-title'])); diff --git a/src/app/entity-groups/journal-entities/item-grid-elements/search-result-grid-elements/journal-volume/journal-volume-search-result-grid-element.component.html b/src/app/entity-groups/journal-entities/item-grid-elements/search-result-grid-elements/journal-volume/journal-volume-search-result-grid-element.component.html index f9ee1c51b7..07e50eb6fb 100644 --- a/src/app/entity-groups/journal-entities/item-grid-elements/search-result-grid-elements/journal-volume/journal-volume-search-result-grid-element.component.html +++ b/src/app/entity-groups/journal-entities/item-grid-elements/search-result-grid-elements/journal-volume/journal-volume-search-result-grid-element.component.html @@ -1,11 +1,17 @@ <ds-truncatable [id]="dso.id"> <div class="card" [@focusShadow]="(isCollapsed$ | async)?'blur':'focus'"> - <a [routerLink]="['/items/' + dso.id]" class="card-img-top full-width"> + <a *ngIf="linkType != linkTypes.None" [target]="(linkType == linkTypes.ExternalLink) ? '_blank' : '_self'" rel="noopener noreferrer" [routerLink]="['/items/' + dso.id]" class="card-img-top full-width"> <div> - <ds-grid-thumbnail [thumbnail]="this.dso.getThumbnail() | async"> + <ds-grid-thumbnail [thumbnail]="dso.getThumbnail() | async"> </ds-grid-thumbnail> </div> </a> + <span *ngIf="linkType == linkTypes.None" class="card-img-top full-width"> + <div> + <ds-grid-thumbnail [thumbnail]="dso.getThumbnail() | async"> + </ds-grid-thumbnail> + </div> + </span> <div class="card-body"> <ds-item-type-badge [object]="dso"></ds-item-type-badge> <ds-truncatable-part [id]="dso.id" [minLines]="3" type="h4"> @@ -21,8 +27,8 @@ <span [innerHTML]="firstMetadataValue('dc.description')"></span> </ds-truncatable-part> </p> - <div class="text-center"> - <a [routerLink]="['/items/' + dso.id]" + <div *ngIf="linkType != linkTypes.None" class="text-center"> + <a [target]="(linkType == linkTypes.ExternalLink) ? '_blank' : '_self'" rel="noopener noreferrer" [routerLink]="['/items/' + dso.id]" class="lead btn btn-primary viewButton">View</a> </div> </div> diff --git a/src/app/entity-groups/journal-entities/item-grid-elements/search-result-grid-elements/journal-volume/journal-volume-search-result-grid-element.component.spec.ts b/src/app/entity-groups/journal-entities/item-grid-elements/search-result-grid-elements/journal-volume/journal-volume-search-result-grid-element.component.spec.ts index bcdde289e0..8923b15ccb 100644 --- a/src/app/entity-groups/journal-entities/item-grid-elements/search-result-grid-elements/journal-volume/journal-volume-search-result-grid-element.component.spec.ts +++ b/src/app/entity-groups/journal-entities/item-grid-elements/search-result-grid-elements/journal-volume/journal-volume-search-result-grid-element.component.spec.ts @@ -46,4 +46,4 @@ mockItemWithoutMetadata.indexableObject = Object.assign(new Item(), { } }); -describe('JournalVolumeGridElementComponent', getEntityGridElementTestComponent(JournalVolumeSearchResultGridElementComponent, mockItemWithMetadata, mockItemWithoutMetadata, ['date', 'description'])); +describe('JournalVolumeSearchResultGridElementComponent', getEntityGridElementTestComponent(JournalVolumeSearchResultGridElementComponent, mockItemWithMetadata, mockItemWithoutMetadata, ['date', 'description'])); diff --git a/src/app/entity-groups/journal-entities/item-grid-elements/search-result-grid-elements/journal/journal-search-result-grid-element.component.html b/src/app/entity-groups/journal-entities/item-grid-elements/search-result-grid-elements/journal/journal-search-result-grid-element.component.html index 72faf6a864..394e5241e1 100644 --- a/src/app/entity-groups/journal-entities/item-grid-elements/search-result-grid-elements/journal/journal-search-result-grid-element.component.html +++ b/src/app/entity-groups/journal-entities/item-grid-elements/search-result-grid-elements/journal/journal-search-result-grid-element.component.html @@ -1,23 +1,29 @@ <ds-truncatable [id]="dso.id"> <div class="card" [@focusShadow]="(isCollapsed$ | async)?'blur':'focus'"> - <a [routerLink]="['/items/' + dso.id]" class="card-img-top full-width"> + <a *ngIf="linkType != linkTypes.None" [target]="(linkType == linkTypes.ExternalLink) ? '_blank' : '_self'" rel="noopener noreferrer" [routerLink]="['/items/' + dso.id]" class="card-img-top full-width"> <div> - <ds-grid-thumbnail [thumbnail]="this.dso.getThumbnail() | async"> + <ds-grid-thumbnail [thumbnail]="dso.getThumbnail() | async"> </ds-grid-thumbnail> </div> </a> + <span *ngIf="linkType == linkTypes.None" class="card-img-top full-width"> + <div> + <ds-grid-thumbnail [thumbnail]="dso.getThumbnail() | async"> + </ds-grid-thumbnail> + </div> + </span> <div class="card-body"> <ds-item-type-badge [object]="dso"></ds-item-type-badge> <ds-truncatable-part [id]="dso.id" [minLines]="3" type="h4"> - <h4 class="card-title" [innerHTML]="dso.firstMetadataValue('dc.title')"></h4> + <h4 class="card-title" [innerHTML]="firstMetadataValue('dc.title')"></h4> </ds-truncatable-part> <p *ngIf="dso.hasMetadata('creativework.editor')" class="item-publisher card-text text-muted"> <ds-truncatable-part [id]="dso.id" [minLines]="1"> - <span class="item-editor">{{dso.firstMetadataValue('creativework.editor')}}</span> + <span class="item-editor">{{firstMetadataValue('creativework.editor')}}</span> <span *ngIf="dso.hasMetadata('creativework.publisher')" class="item-publisher"> <span>, </span> - {{dso.firstMetadataValue('creativework.publisher')}} + {{firstMetadataValue('creativework.publisher')}} </span> </ds-truncatable-part> </p> @@ -26,8 +32,8 @@ <span [innerHTML]="firstMetadataValue('dc.description')"></span> </ds-truncatable-part> </p> - <div class="text-center"> - <a [routerLink]="['/items/' + dso.id]" + <div *ngIf="linkType != linkTypes.None" class="text-center"> + <a [target]="(linkType == linkTypes.ExternalLink) ? '_blank' : '_self'" rel="noopener noreferrer" [routerLink]="['/items/' + dso.id]" class="lead btn btn-primary viewButton">View</a> </div> </div> diff --git a/src/app/entity-groups/journal-entities/item-grid-elements/search-result-grid-elements/journal/journal-search-result-grid-element.component.spec.ts b/src/app/entity-groups/journal-entities/item-grid-elements/search-result-grid-elements/journal/journal-search-result-grid-element.component.spec.ts index 1ce0aa2436..5712b211ff 100644 --- a/src/app/entity-groups/journal-entities/item-grid-elements/search-result-grid-elements/journal/journal-search-result-grid-element.component.spec.ts +++ b/src/app/entity-groups/journal-entities/item-grid-elements/search-result-grid-elements/journal/journal-search-result-grid-element.component.spec.ts @@ -52,4 +52,4 @@ mockItemWithoutMetadata.indexableObject = Object.assign(new Item(), { } }); -describe('JournalGridElementComponent', getEntityGridElementTestComponent(JournalSearchResultGridElementComponent, mockItemWithMetadata, mockItemWithoutMetadata, ['editor', 'publisher', 'description'])); +describe('JournalSearchResultGridElementComponent', getEntityGridElementTestComponent(JournalSearchResultGridElementComponent, mockItemWithMetadata, mockItemWithoutMetadata, ['editor', 'publisher', 'description'])); diff --git a/src/app/entity-groups/journal-entities/item-list-elements/journal-issue/journal-issue-list-element.component.html b/src/app/entity-groups/journal-entities/item-list-elements/journal-issue/journal-issue-list-element.component.html index 1e418ba7c2..398feea260 100644 --- a/src/app/entity-groups/journal-entities/item-list-elements/journal-issue/journal-issue-list-element.component.html +++ b/src/app/entity-groups/journal-entities/item-list-elements/journal-issue/journal-issue-list-element.component.html @@ -1 +1 @@ -<ds-journal-issue-search-result-list-element [object]="{ indexableObject: object, hitHighlights: {} }"></ds-journal-issue-search-result-list-element> \ No newline at end of file +<ds-journal-issue-search-result-list-element [object]="{ indexableObject: object, hitHighlights: {} }" [linkType]="linkType"></ds-journal-issue-search-result-list-element> \ No newline at end of file diff --git a/src/app/entity-groups/journal-entities/item-list-elements/journal-issue/journal-issue-list-element.component.spec.ts b/src/app/entity-groups/journal-entities/item-list-elements/journal-issue/journal-issue-list-element.component.spec.ts index d1cf67a07e..1a06e9f29c 100644 --- a/src/app/entity-groups/journal-entities/item-list-elements/journal-issue/journal-issue-list-element.component.spec.ts +++ b/src/app/entity-groups/journal-entities/item-list-elements/journal-issue/journal-issue-list-element.component.spec.ts @@ -1,4 +1,4 @@ -import { async, ComponentFixture, TestBed } from '@angular/core/testing'; +import { async, TestBed } from '@angular/core/testing'; import { ChangeDetectionStrategy, NO_ERRORS_SCHEMA } from '@angular/core'; import { By } from '@angular/platform-browser'; import { JournalIssueListElementComponent } from './journal-issue-list-element.component'; @@ -7,10 +7,7 @@ import { Item } from '../../../../core/shared/item.model'; import { TruncatePipe } from '../../../../shared/utils/truncate.pipe'; import { TruncatableService } from '../../../../shared/truncatable/truncatable.service'; -let journalIssueListElementComponent: JournalIssueListElementComponent; -let fixture: ComponentFixture<JournalIssueListElementComponent>; - -const mockItemWithMetadata: Item = Object.assign(new Item(), { +const mockItem: Item = Object.assign(new Item(), { bitstreams: observableOf({}), metadata: { 'dc.title': [ @@ -33,83 +30,43 @@ const mockItemWithMetadata: Item = Object.assign(new Item(), { ] } }); -const mockItemWithoutMetadata: Item = Object.assign(new Item(), { - bitstreams: observableOf({}), - metadata: { - 'dc.title': [ - { - language: 'en_US', - value: 'This is just another title' - } - ] - } -}); - -describe('JournalIssueListElementComponent', () => { - beforeEach(async(() => { - TestBed.configureTestingModule({ - declarations: [ JournalIssueListElementComponent , TruncatePipe], - providers: [ - { provide: TruncatableService, useValue: {} } - ], - schemas: [ NO_ERRORS_SCHEMA ] - }).overrideComponent(JournalIssueListElementComponent, { - set: { changeDetection: ChangeDetectionStrategy.Default } - }).compileComponents(); - })); +describe('JournalIssueListElementComponent', + () => { + let comp; + let fixture; - beforeEach(async(() => { - fixture = TestBed.createComponent(JournalIssueListElementComponent); - journalIssueListElementComponent = fixture.componentInstance; + const truncatableServiceStub: any = { + isCollapsed: (id: number) => observableOf(true), + }; - })); + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [JournalIssueListElementComponent, TruncatePipe], + providers: [ + { provide: TruncatableService, useValue: truncatableServiceStub }, + ], + schemas: [NO_ERRORS_SCHEMA] + }).overrideComponent(JournalIssueListElementComponent, { + set: { changeDetection: ChangeDetectionStrategy.Default } + }).compileComponents(); + })); - describe('When the item has a journal identifier', () => { - beforeEach(() => { - journalIssueListElementComponent.object = mockItemWithMetadata; - fixture.detectChanges(); - }); - - it('should show the journal issues span', () => { - const journalIdentifierField = fixture.debugElement.query(By.css('span.item-list-journal-issues')); - expect(journalIdentifierField).not.toBeNull(); - }); - }); - - describe('When the item has no journal identifier', () => { - beforeEach(() => { - journalIssueListElementComponent.object = mockItemWithoutMetadata; - fixture.detectChanges(); - }); - - it('should not show the journal issues span', () => { - const journalIdentifierField = fixture.debugElement.query(By.css('span.item-list-journal-issues')); - expect(journalIdentifierField).toBeNull(); - }); - }); - - describe('When the item has a journal number', () => { - beforeEach(() => { - journalIssueListElementComponent.object = mockItemWithMetadata; - fixture.detectChanges(); - }); + beforeEach(async(() => { + fixture = TestBed.createComponent(JournalIssueListElementComponent); + comp = fixture.componentInstance; + })); - it('should show the journal issue numbers span', () => { - const journalNumberField = fixture.debugElement.query(By.css('span.item-list-journal-issue-numbers')); - expect(journalNumberField).not.toBeNull(); - }); - }); + describe(`when the journal issue is rendered`, () => { + beforeEach(() => { + comp.object = mockItem; + fixture.detectChanges(); + }); - describe('When the item has no journal number', () => { - beforeEach(() => { - journalIssueListElementComponent.object = mockItemWithoutMetadata; - fixture.detectChanges(); + it(`should contain a JournalIssueListElementComponent`, () => { + const journalIssueListElement = fixture.debugElement.query(By.css(`ds-journal-issue-search-result-list-element`)); + expect(journalIssueListElement).not.toBeNull(); + }); }); - it('should not show the journal issue numbers span', () => { - const journalNumberField = fixture.debugElement.query(By.css('span.item-list-journal-issue-numbers')); - expect(journalNumberField).toBeNull(); - }); - }); -}); + }); \ No newline at end of file diff --git a/src/app/entity-groups/journal-entities/item-list-elements/journal-volume/journal-volume-list-element.component.html b/src/app/entity-groups/journal-entities/item-list-elements/journal-volume/journal-volume-list-element.component.html index c00de1c33d..bf967e6e78 100644 --- a/src/app/entity-groups/journal-entities/item-list-elements/journal-volume/journal-volume-list-element.component.html +++ b/src/app/entity-groups/journal-entities/item-list-elements/journal-volume/journal-volume-list-element.component.html @@ -1 +1 @@ -<ds-journal-volume-search-result-list-element [object]="{ indexableObject: object, hitHighlights: {} }"></ds-journal-volume-search-result-list-element> \ No newline at end of file +<ds-journal-volume-search-result-list-element [object]="{ indexableObject: object, hitHighlights: {} }" [linkType]="linkType"></ds-journal-volume-search-result-list-element> \ No newline at end of file diff --git a/src/app/entity-groups/journal-entities/item-list-elements/journal-volume/journal-volume-list-element.component.spec.ts b/src/app/entity-groups/journal-entities/item-list-elements/journal-volume/journal-volume-list-element.component.spec.ts index 2ab4c1eaed..0d1401068b 100644 --- a/src/app/entity-groups/journal-entities/item-list-elements/journal-volume/journal-volume-list-element.component.spec.ts +++ b/src/app/entity-groups/journal-entities/item-list-elements/journal-volume/journal-volume-list-element.component.spec.ts @@ -1,4 +1,4 @@ -import { async, ComponentFixture, TestBed } from '@angular/core/testing'; +import { async, TestBed } from '@angular/core/testing'; import { ChangeDetectionStrategy, NO_ERRORS_SCHEMA } from '@angular/core'; import { By } from '@angular/platform-browser'; import { JournalVolumeListElementComponent } from './journal-volume-list-element.component'; @@ -7,10 +7,7 @@ import { Item } from '../../../../core/shared/item.model'; import { TruncatePipe } from '../../../../shared/utils/truncate.pipe'; import { TruncatableService } from '../../../../shared/truncatable/truncatable.service'; -let journalVolumeListElementComponent: JournalVolumeListElementComponent; -let fixture: ComponentFixture<JournalVolumeListElementComponent>; - -const mockItemWithMetadata: Item = Object.assign(new Item(), { +const mockItem: Item = Object.assign(new Item(), { bitstreams: observableOf({}), metadata: { 'dc.title': [ @@ -33,83 +30,42 @@ const mockItemWithMetadata: Item = Object.assign(new Item(), { ] } }); -const mockItemWithoutMetadata: Item = Object.assign(new Item(), { - bitstreams: observableOf({}), - metadata: { - 'dc.title': [ - { - language: 'en_US', - value: 'This is just another title' - } - ] - } -}); - -describe('JournalVolumeListElementComponent', () => { - beforeEach(async(() => { - TestBed.configureTestingModule({ - declarations: [ JournalVolumeListElementComponent , TruncatePipe], - providers: [ - { provide: TruncatableService, useValue: {} } - ], +describe('JournalVolumeListElementComponent', + () => { + let comp; + let fixture; - schemas: [ NO_ERRORS_SCHEMA ] - }).overrideComponent(JournalVolumeListElementComponent, { - set: { changeDetection: ChangeDetectionStrategy.Default } - }).compileComponents(); - })); + const truncatableServiceStub: any = { + isCollapsed: (id: number) => observableOf(true), + }; - beforeEach(async(() => { - fixture = TestBed.createComponent(JournalVolumeListElementComponent); - journalVolumeListElementComponent = fixture.componentInstance; + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [JournalVolumeListElementComponent, TruncatePipe], + providers: [ + { provide: TruncatableService, useValue: truncatableServiceStub }, + ], + schemas: [NO_ERRORS_SCHEMA] + }).overrideComponent(JournalVolumeListElementComponent, { + set: { changeDetection: ChangeDetectionStrategy.Default } + }).compileComponents(); + })); - })); + beforeEach(async(() => { + fixture = TestBed.createComponent(JournalVolumeListElementComponent); + comp = fixture.componentInstance; + })); - describe('When the item has a journal title', () => { - beforeEach(() => { - journalVolumeListElementComponent.object = mockItemWithMetadata; - fixture.detectChanges(); - }); + describe(`when the journal volume is rendered`, () => { + beforeEach(() => { + comp.object = mockItem; + fixture.detectChanges(); + }); - it('should show the journal title span', () => { - const journalTitleField = fixture.debugElement.query(By.css('span.item-list-journal-volumes')); - expect(journalTitleField).not.toBeNull(); + it(`should contain a JournalVolumeListElementComponent`, () => { + const journalVolumeListElement = fixture.debugElement.query(By.css(`ds-journal-volume-search-result-list-element`)); + expect(journalVolumeListElement).not.toBeNull(); + }); }); - }); - describe('When the item has no journal title', () => { - beforeEach(() => { - journalVolumeListElementComponent.object = mockItemWithoutMetadata; - fixture.detectChanges(); - }); - - it('should not show the journal title span', () => { - const journalTitleField = fixture.debugElement.query(By.css('span.item-list-journal-volumes')); - expect(journalTitleField).toBeNull(); - }); - }); - - describe('When the item has a journal identifier', () => { - beforeEach(() => { - journalVolumeListElementComponent.object = mockItemWithMetadata; - fixture.detectChanges(); - }); - - it('should show the journal identifiers span', () => { - const journalIdentifierField = fixture.debugElement.query(By.css('span.item-list-journal-volume-identifiers')); - expect(journalIdentifierField).not.toBeNull(); - }); - }); - - describe('When the item has no journal identifier', () => { - beforeEach(() => { - journalVolumeListElementComponent.object = mockItemWithoutMetadata; - fixture.detectChanges(); - }); - - it('should not show the journal identifiers span', () => { - const journalIdentifierField = fixture.debugElement.query(By.css('span.item-list-journal-volume-identifiers')); - expect(journalIdentifierField).toBeNull(); - }); - }); -}); + }); \ No newline at end of file diff --git a/src/app/entity-groups/journal-entities/item-list-elements/journal/journal-list-element.component.html b/src/app/entity-groups/journal-entities/item-list-elements/journal/journal-list-element.component.html index 3df361e7f9..3e4dfb0b48 100644 --- a/src/app/entity-groups/journal-entities/item-list-elements/journal/journal-list-element.component.html +++ b/src/app/entity-groups/journal-entities/item-list-elements/journal/journal-list-element.component.html @@ -1 +1 @@ -<ds-journal-search-result-list-element [object]="{ indexableObject: object, hitHighlights: {} }"></ds-journal-search-result-list-element> \ No newline at end of file +<ds-journal-search-result-list-element [object]="{ indexableObject: object, hitHighlights: {} }" [linkType]="linkType"></ds-journal-search-result-list-element> \ No newline at end of file diff --git a/src/app/entity-groups/journal-entities/item-list-elements/journal/journal-list-element.component.spec.ts b/src/app/entity-groups/journal-entities/item-list-elements/journal/journal-list-element.component.spec.ts index c9567fc731..432f81c171 100644 --- a/src/app/entity-groups/journal-entities/item-list-elements/journal/journal-list-element.component.spec.ts +++ b/src/app/entity-groups/journal-entities/item-list-elements/journal/journal-list-element.component.spec.ts @@ -1,17 +1,13 @@ -import { async, ComponentFixture, TestBed } from '@angular/core/testing'; +import { async, TestBed } from '@angular/core/testing'; import { ChangeDetectionStrategy, NO_ERRORS_SCHEMA } from '@angular/core'; import { By } from '@angular/platform-browser'; import { JournalListElementComponent } from './journal-list-element.component'; import { of as observableOf } from 'rxjs'; import { Item } from '../../../../core/shared/item.model'; import { TruncatePipe } from '../../../../shared/utils/truncate.pipe'; -import { ITEM } from '../../../../shared/items/switcher/listable-object-component-loader.component'; import { TruncatableService } from '../../../../shared/truncatable/truncatable.service'; -let journalListElementComponent: JournalListElementComponent; -let fixture: ComponentFixture<JournalListElementComponent>; - -const mockItemWithMetadata: Item = Object.assign(new Item(), { +const mockItem: Item = Object.assign(new Item(), { bitstreams: observableOf({}), metadata: { 'dc.title': [ @@ -28,60 +24,44 @@ const mockItemWithMetadata: Item = Object.assign(new Item(), { ] } }); -const mockItemWithoutMetadata: Item = Object.assign(new Item(), { - bitstreams: observableOf({}), - metadata: { - 'dc.title': [ - { - language: 'en_US', - value: 'This is just another title' - } - ] - } -}); -describe('JournalListElementComponent', () => { - beforeEach(async(() => { - TestBed.configureTestingModule({ - declarations: [ JournalListElementComponent , TruncatePipe], - providers: [ - { provide: ITEM, useValue: mockItemWithMetadata}, - { provide: TruncatableService, useValue: {} } - ], - schemas: [ NO_ERRORS_SCHEMA ] - }).overrideComponent(JournalListElementComponent, { - set: { changeDetection: ChangeDetectionStrategy.Default } - }).compileComponents(); - })); +describe('JournalListElementComponent', + () => { + let comp; + let fixture; - beforeEach(async(() => { - fixture = TestBed.createComponent(JournalListElementComponent); - journalListElementComponent = fixture.componentInstance; + const truncatableServiceStub: any = { + isCollapsed: (id: number) => observableOf(true), + }; - })); + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [JournalListElementComponent, TruncatePipe], + providers: [ + { provide: TruncatableService, useValue: truncatableServiceStub }, + ], + schemas: [NO_ERRORS_SCHEMA] + }).overrideComponent(JournalListElementComponent, { + set: { changeDetection: ChangeDetectionStrategy.Default } + }).compileComponents(); + })); - describe('When the item has an issn', () => { - beforeEach(() => { - journalListElementComponent.object = mockItemWithMetadata; - fixture.detectChanges(); - }); + beforeEach(async(() => { + fixture = TestBed.createComponent(JournalListElementComponent); + comp = fixture.componentInstance; + })); - it('should show the journals span', () => { - const issnField = fixture.debugElement.query(By.css('span.item-list-journals')); - expect(issnField).not.toBeNull(); - }); - }); + describe(`when the journal is rendered`, () => { + beforeEach(() => { + comp.object = mockItem; + fixture.detectChanges(); + }); - describe('When the item has no issn', () => { - beforeEach(() => { - journalListElementComponent.object = mockItemWithoutMetadata; - fixture.detectChanges(); + it(`should contain a JournalListElementComponent`, () => { + const journalListElement = fixture.debugElement.query(By.css(`ds-journal-search-result-list-element`)); + expect(journalListElement).not.toBeNull(); + }); }); - it('should not show the journals span', () => { - const issnField = fixture.debugElement.query(By.css('span.item-list-journals')); - expect(issnField).toBeNull(); - }); - }); -}); + }); \ No newline at end of file diff --git a/src/app/entity-groups/journal-entities/item-list-elements/search-result-list-elements/journal-issue/journal-issue-search-result-list-element.component.html b/src/app/entity-groups/journal-entities/item-list-elements/search-result-list-elements/journal-issue/journal-issue-search-result-list-element.component.html index 98a8472975..38094c5c79 100644 --- a/src/app/entity-groups/journal-entities/item-list-elements/search-result-list-elements/journal-issue/journal-issue-search-result-list-element.component.html +++ b/src/app/entity-groups/journal-entities/item-list-elements/search-result-list-elements/journal-issue/journal-issue-search-result-list-element.component.html @@ -1,8 +1,11 @@ <ds-item-type-badge [object]="dso"></ds-item-type-badge> <ds-truncatable [id]="dso.id"> - <a + <a *ngIf="linkType != linkTypes.None" [target]="(linkType == linkTypes.ExternalLink) ? '_blank' : '_self'" rel="noopener noreferrer" [routerLink]="['/items/' + dso.id]" class="lead" [innerHTML]="firstMetadataValue('dc.title')"></a> + <span *ngIf="linkType == linkTypes.None" + class="lead" + [innerHTML]="firstMetadataValue('dc.title')"></span> <span class="text-muted"> <ds-truncatable-part [id]="dso.id" [minLines]="1"> <span *ngIf="dso.allMetadata(['publicationvolume.volumeNumber']).length > 0" diff --git a/src/app/entity-groups/journal-entities/item-list-elements/search-result-list-elements/journal-issue/journal-issue-search-result-list-element.component.spec.ts b/src/app/entity-groups/journal-entities/item-list-elements/search-result-list-elements/journal-issue/journal-issue-search-result-list-element.component.spec.ts index a41105e11e..ab02ce244e 100644 --- a/src/app/entity-groups/journal-entities/item-list-elements/search-result-list-elements/journal-issue/journal-issue-search-result-list-element.component.spec.ts +++ b/src/app/entity-groups/journal-entities/item-list-elements/search-result-list-elements/journal-issue/journal-issue-search-result-list-element.component.spec.ts @@ -55,7 +55,7 @@ const mockItemWithoutMetadata: ItemSearchResult = Object.assign( }) }); -describe('JournalIssueListElementComponent', () => { +describe('JournalIssueSearchResultListElementComponent', () => { beforeEach(async(() => { TestBed.configureTestingModule({ declarations: [JournalIssueSearchResultListElementComponent, TruncatePipe], diff --git a/src/app/entity-groups/journal-entities/item-list-elements/search-result-list-elements/journal-volume/journal-volume-search-result-list-element.component.html b/src/app/entity-groups/journal-entities/item-list-elements/search-result-list-elements/journal-volume/journal-volume-search-result-list-element.component.html index 9af28297d8..460c4a2187 100644 --- a/src/app/entity-groups/journal-entities/item-list-elements/search-result-list-elements/journal-volume/journal-volume-search-result-list-element.component.html +++ b/src/app/entity-groups/journal-entities/item-list-elements/search-result-list-elements/journal-volume/journal-volume-search-result-list-element.component.html @@ -1,8 +1,11 @@ <ds-item-type-badge [object]="dso"></ds-item-type-badge> <ds-truncatable [id]="dso.id"> - <a + <a *ngIf="linkType != linkTypes.None" [target]="(linkType == linkTypes.ExternalLink) ? '_blank' : '_self'" rel="noopener noreferrer" [routerLink]="['/items/' + dso.id]" class="lead" [innerHTML]="firstMetadataValue('dc.title')"></a> + <span *ngIf="linkType == linkTypes.None" + class="lead" + [innerHTML]="firstMetadataValue('dc.title')"></span> <span class="text-muted"> <ds-truncatable-part [id]="dso.id" [minLines]="1"> <span *ngIf="dso.allMetadata(['journal.title']).length > 0" diff --git a/src/app/entity-groups/journal-entities/item-list-elements/search-result-list-elements/journal-volume/journal-volume-search-result-list-element.component.spec.ts b/src/app/entity-groups/journal-entities/item-list-elements/search-result-list-elements/journal-volume/journal-volume-search-result-list-element.component.spec.ts index 2a6c68ed60..4ac4e51439 100644 --- a/src/app/entity-groups/journal-entities/item-list-elements/search-result-list-elements/journal-volume/journal-volume-search-result-list-element.component.spec.ts +++ b/src/app/entity-groups/journal-entities/item-list-elements/search-result-list-elements/journal-volume/journal-volume-search-result-list-element.component.spec.ts @@ -54,7 +54,7 @@ const mockItemWithoutMetadata: ItemSearchResult = Object.assign( }) }); -describe('JournalVolumeListElementComponent', () => { +describe('JournalVolumeSearchResultListElementComponent', () => { beforeEach(async(() => { TestBed.configureTestingModule({ declarations: [JournalVolumeSearchResultListElementComponent, TruncatePipe], diff --git a/src/app/entity-groups/journal-entities/item-list-elements/search-result-list-elements/journal/journal-search-result-list-element.component.html b/src/app/entity-groups/journal-entities/item-list-elements/search-result-list-elements/journal/journal-search-result-list-element.component.html index 20b689327a..a43132d332 100644 --- a/src/app/entity-groups/journal-entities/item-list-elements/search-result-list-elements/journal/journal-search-result-list-element.component.html +++ b/src/app/entity-groups/journal-entities/item-list-elements/search-result-list-elements/journal/journal-search-result-list-element.component.html @@ -1,8 +1,11 @@ <ds-item-type-badge [object]="dso"></ds-item-type-badge> <ds-truncatable [id]="dso.id"> - <a + <a *ngIf="linkType != linkTypes.None" [target]="(linkType == linkTypes.ExternalLink) ? '_blank' : '_self'" rel="noopener noreferrer" [routerLink]="['/items/' + dso.id]" class="lead" [innerHTML]="firstMetadataValue('dc.title')"></a> + <span *ngIf="linkType == linkTypes.None" + class="lead" + [innerHTML]="firstMetadataValue('dc.title')"></span> <span class="text-muted"> <ds-truncatable-part [id]="dso.id" [minLines]="1"> <span *ngIf="dso.allMetadata(['creativeworkseries.issn']).length > 0" diff --git a/src/app/entity-groups/journal-entities/item-list-elements/search-result-list-elements/journal/journal-search-result-list-element.component.spec.ts b/src/app/entity-groups/journal-entities/item-list-elements/search-result-list-elements/journal/journal-search-result-list-element.component.spec.ts index f7eced8cde..46eeaa1fb2 100644 --- a/src/app/entity-groups/journal-entities/item-list-elements/search-result-list-elements/journal/journal-search-result-list-element.component.spec.ts +++ b/src/app/entity-groups/journal-entities/item-list-elements/search-result-list-elements/journal/journal-search-result-list-element.component.spec.ts @@ -50,7 +50,7 @@ const mockItemWithoutMetadata: ItemSearchResult = Object.assign( } ); -describe('JournalListElementComponent', () => { +describe('JournalSearchResultListElementComponent', () => { beforeEach(async(() => { TestBed.configureTestingModule({ declarations: [JournalSearchResultListElementComponent, TruncatePipe], diff --git a/src/app/entity-groups/journal-entities/item-pages/journal-issue/journal-issue.component.html b/src/app/entity-groups/journal-entities/item-pages/journal-issue/journal-issue.component.html index d49d80b15e..4b306b73f2 100644 --- a/src/app/entity-groups/journal-entities/item-pages/journal-issue/journal-issue.component.html +++ b/src/app/entity-groups/journal-entities/item-pages/journal-issue/journal-issue.component.html @@ -4,7 +4,7 @@ <div class="row"> <div class="col-xs-12 col-md-4"> <ds-metadata-field-wrapper> - <ds-thumbnail [thumbnail]="this.object.getThumbnail() | async"></ds-thumbnail> + <ds-thumbnail [thumbnail]="object.getThumbnail() | async"></ds-thumbnail> </ds-metadata-field-wrapper> <ds-generic-item-page-field [item]="object" [fields]="['publicationvolume.volumeNumber']" diff --git a/src/app/entity-groups/journal-entities/item-pages/journal-volume/journal-volume.component.html b/src/app/entity-groups/journal-entities/item-pages/journal-volume/journal-volume.component.html index d96bff9570..ec7cd94127 100644 --- a/src/app/entity-groups/journal-entities/item-pages/journal-volume/journal-volume.component.html +++ b/src/app/entity-groups/journal-entities/item-pages/journal-volume/journal-volume.component.html @@ -4,7 +4,7 @@ <div class="row"> <div class="col-xs-12 col-md-4"> <ds-metadata-field-wrapper> - <ds-thumbnail [thumbnail]="this.object.getThumbnail() | async"></ds-thumbnail> + <ds-thumbnail [thumbnail]="object.getThumbnail() | async"></ds-thumbnail> </ds-metadata-field-wrapper> <ds-generic-item-page-field [item]="object" [fields]="['publicationvolume.volumeNumber']" diff --git a/src/app/entity-groups/journal-entities/item-pages/journal/journal.component.html b/src/app/entity-groups/journal-entities/item-pages/journal/journal.component.html index 05d7ffc802..c2a5142ca9 100644 --- a/src/app/entity-groups/journal-entities/item-pages/journal/journal.component.html +++ b/src/app/entity-groups/journal-entities/item-pages/journal/journal.component.html @@ -4,7 +4,7 @@ <div class="row"> <div class="col-xs-12 col-md-4"> <ds-metadata-field-wrapper> - <ds-thumbnail [thumbnail]="this.object.getThumbnail() | async"></ds-thumbnail> + <ds-thumbnail [thumbnail]="object.getThumbnail() | async"></ds-thumbnail> </ds-metadata-field-wrapper> <ds-generic-item-page-field class="item-page-fields" [item]="object" [fields]="['creativeworkseries.issn']" diff --git a/src/app/entity-groups/journal-entities/item-pages/journal/journal.component.spec.ts b/src/app/entity-groups/journal-entities/item-pages/journal/journal.component.spec.ts index 29398befb5..10fdd3bf93 100644 --- a/src/app/entity-groups/journal-entities/item-pages/journal/journal.component.spec.ts +++ b/src/app/entity-groups/journal-entities/item-pages/journal/journal.component.spec.ts @@ -1,19 +1,16 @@ import { ChangeDetectionStrategy, DebugElement, NO_ERRORS_SCHEMA } from '@angular/core'; import { async, ComponentFixture, TestBed } from '@angular/core/testing'; import { TruncatableService } from '../../../../shared/truncatable/truncatable.service'; -import { ITEM } from '../../../../shared/items/switcher/listable-object-component-loader.component'; import { TruncatePipe } from '../../../../shared/utils/truncate.pipe'; import { ItemDataService } from '../../../../core/data/item-data.service'; import { Item } from '../../../../core/shared/item.model'; import { By } from '@angular/platform-browser'; import { TranslateLoader, TranslateModule } from '@ngx-translate/core'; import { MockTranslateLoader } from '../../../../shared/mocks/mock-translate-loader'; -import { RemoteData } from '../../../../core/data/remote-data'; import { PaginatedList } from '../../../../core/data/paginated-list'; import { PageInfo } from '../../../../core/shared/page-info.model'; import { isNotEmpty } from '../../../../shared/empty.util'; import { JournalComponent } from './journal.component'; -import { of as observableOf } from 'rxjs'; import { GenericItemPageFieldComponent } from '../../../../+item-page/simple/field-components/specific-field/generic/generic-item-page-field.component'; import { createSuccessfulRemoteDataObject$ } from '../../../../shared/testing/utils'; @@ -55,7 +52,6 @@ describe('JournalComponent', () => { })], declarations: [JournalComponent, GenericItemPageFieldComponent, TruncatePipe], providers: [ - {provide: ITEM, useValue: mockItem}, {provide: ItemDataService, useValue: {}}, {provide: TruncatableService, useValue: {}} ], @@ -69,6 +65,7 @@ describe('JournalComponent', () => { beforeEach(async(() => { fixture = TestBed.createComponent(JournalComponent); comp = fixture.componentInstance; + comp.object = mockItem; fixture.detectChanges(); })); diff --git a/src/app/entity-groups/research-entities/item-grid-elements/orgunit/orgunit-grid-element.component.html b/src/app/entity-groups/research-entities/item-grid-elements/orgunit/orgunit-grid-element.component.html index 8ad7ce3590..f42ffb87e9 100644 --- a/src/app/entity-groups/research-entities/item-grid-elements/orgunit/orgunit-grid-element.component.html +++ b/src/app/entity-groups/research-entities/item-grid-elements/orgunit/orgunit-grid-element.component.html @@ -1 +1 @@ -<ds-orgunit-search-result-grid-element [object]="{ indexableObject: object, hitHighlights: {} }"></ds-orgunit-search-result-grid-element> \ No newline at end of file +<ds-orgunit-search-result-grid-element [object]="{ indexableObject: object, hitHighlights: {} }" [linkType]="linkType"></ds-orgunit-search-result-grid-element> \ No newline at end of file diff --git a/src/app/entity-groups/research-entities/item-grid-elements/orgunit/orgunit-grid-element.component.spec.ts b/src/app/entity-groups/research-entities/item-grid-elements/orgunit/orgunit-grid-element.component.spec.ts index 15c7b75bf5..1140f7d908 100644 --- a/src/app/entity-groups/research-entities/item-grid-elements/orgunit/orgunit-grid-element.component.spec.ts +++ b/src/app/entity-groups/research-entities/item-grid-elements/orgunit/orgunit-grid-element.component.spec.ts @@ -1,15 +1,17 @@ -import { ItemSearchResult } from '../../../../shared/object-collection/shared/item-search-result.model'; import { Item } from '../../../../core/shared/item.model'; import { of as observableOf } from 'rxjs/internal/observable/of'; -import { getEntityGridElementTestComponent } from '../../../../shared/object-grid/item-grid-element/item-types/publication/publication-grid-element.component.spec'; import { OrgunitGridElementComponent } from './orgunit-grid-element.component'; import { createSuccessfulRemoteDataObject$ } from '../../../../shared/testing/utils'; import { PaginatedList } from '../../../../core/data/paginated-list'; import { PageInfo } from '../../../../core/shared/page-info.model'; +import { async, TestBed } from '@angular/core/testing'; +import { NoopAnimationsModule } from '@angular/platform-browser/animations'; +import { TruncatePipe } from '../../../../shared/utils/truncate.pipe'; +import { TruncatableService } from '../../../../shared/truncatable/truncatable.service'; +import { ChangeDetectionStrategy, NO_ERRORS_SCHEMA } from '@angular/core'; +import { By } from '@angular/platform-browser'; -const mockItemWithMetadata: ItemSearchResult = new ItemSearchResult(); -mockItemWithMetadata.hitHighlights = {}; -mockItemWithMetadata.indexableObject = Object.assign(new Item(), { +const mockItem = Object.assign(new Item(), { bitstreams: createSuccessfulRemoteDataObject$(new PaginatedList(new PageInfo(), [])), metadata: { 'dc.title': [ @@ -39,18 +41,43 @@ mockItemWithMetadata.indexableObject = Object.assign(new Item(), { } }); -const mockItemWithoutMetadata: ItemSearchResult = new ItemSearchResult(); -mockItemWithoutMetadata.hitHighlights = {}; -mockItemWithoutMetadata.indexableObject = Object.assign(new Item(), { - bitstreams: createSuccessfulRemoteDataObject$(new PaginatedList(new PageInfo(), [])), - metadata: { - 'dc.title': [ - { - language: 'en_US', - value: 'This is just another title' - } - ] - } -}); +describe('OrgunitGridElementComponent', + () => { + let comp; + let fixture; + + const truncatableServiceStub: any = { + isCollapsed: (id: number) => observableOf(true), + }; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + imports: [NoopAnimationsModule], + declarations: [OrgunitGridElementComponent, TruncatePipe], + providers: [ + { provide: TruncatableService, useValue: truncatableServiceStub }, + ], + schemas: [NO_ERRORS_SCHEMA] + }).overrideComponent(OrgunitGridElementComponent, { + set: { changeDetection: ChangeDetectionStrategy.Default } + }).compileComponents(); + })); + + beforeEach(async(() => { + fixture = TestBed.createComponent(OrgunitGridElementComponent); + comp = fixture.componentInstance; + })); + + describe(`when the org unit is rendered`, () => { + beforeEach(() => { + comp.object = mockItem; + fixture.detectChanges(); + }); + + it(`should contain a OrgunitGridElementComponent`, () => { + const orgunitGridElement = fixture.debugElement.query(By.css(`ds-orgunit-search-result-grid-element`)); + expect(orgunitGridElement).not.toBeNull(); + }); + }); -describe('OrgunitGridElementComponent', getEntityGridElementTestComponent(OrgunitGridElementComponent, mockItemWithMetadata, mockItemWithoutMetadata, ['date', 'country', 'city'])); + }); \ No newline at end of file diff --git a/src/app/entity-groups/research-entities/item-grid-elements/person/person-grid-element.component.html b/src/app/entity-groups/research-entities/item-grid-elements/person/person-grid-element.component.html index b837422121..a431f5979f 100644 --- a/src/app/entity-groups/research-entities/item-grid-elements/person/person-grid-element.component.html +++ b/src/app/entity-groups/research-entities/item-grid-elements/person/person-grid-element.component.html @@ -1 +1 @@ -<ds-person-search-result-grid-element [object]="{ indexableObject: object, hitHighlights: {} }"></ds-person-search-result-grid-element> \ No newline at end of file +<ds-person-search-result-grid-element [object]="{ indexableObject: object, hitHighlights: {} }" [linkType]="linkType"></ds-person-search-result-grid-element> \ No newline at end of file diff --git a/src/app/entity-groups/research-entities/item-grid-elements/person/person-grid-element.component.spec.ts b/src/app/entity-groups/research-entities/item-grid-elements/person/person-grid-element.component.spec.ts index 25268261e1..fdcc84d864 100644 --- a/src/app/entity-groups/research-entities/item-grid-elements/person/person-grid-element.component.spec.ts +++ b/src/app/entity-groups/research-entities/item-grid-elements/person/person-grid-element.component.spec.ts @@ -1,15 +1,17 @@ -import { ItemSearchResult } from '../../../../shared/object-collection/shared/item-search-result.model'; import { Item } from '../../../../core/shared/item.model'; import { of as observableOf } from 'rxjs/internal/observable/of'; -import { getEntityGridElementTestComponent } from '../../../../shared/object-grid/item-grid-element/item-types/publication/publication-grid-element.component.spec'; import { PersonGridElementComponent } from './person-grid-element.component'; import { createSuccessfulRemoteDataObject$ } from '../../../../shared/testing/utils'; import { PaginatedList } from '../../../../core/data/paginated-list'; import { PageInfo } from '../../../../core/shared/page-info.model'; +import { async, TestBed } from '@angular/core/testing'; +import { NoopAnimationsModule } from '@angular/platform-browser/animations'; +import { TruncatePipe } from '../../../../shared/utils/truncate.pipe'; +import { TruncatableService } from '../../../../shared/truncatable/truncatable.service'; +import { ChangeDetectionStrategy, NO_ERRORS_SCHEMA } from '@angular/core'; +import { By } from '@angular/platform-browser'; -const mockItemWithMetadata: ItemSearchResult = new ItemSearchResult(); -mockItemWithMetadata.hitHighlights = {}; -mockItemWithMetadata.indexableObject = Object.assign(new Item(), { +const mockItem = Object.assign(new Item(), { bitstreams: createSuccessfulRemoteDataObject$(new PaginatedList(new PageInfo(), [])), metadata: { 'dc.title': [ @@ -33,18 +35,43 @@ mockItemWithMetadata.indexableObject = Object.assign(new Item(), { } }); -const mockItemWithoutMetadata: ItemSearchResult = new ItemSearchResult(); -mockItemWithoutMetadata.hitHighlights = {}; -mockItemWithoutMetadata.indexableObject = Object.assign(new Item(), { - bitstreams: createSuccessfulRemoteDataObject$(new PaginatedList(new PageInfo(), [])), - metadata: { - 'dc.title': [ - { - language: 'en_US', - value: 'This is just another title' - } - ] - } -}); +describe('PersonGridElementComponent', + () => { + let comp; + let fixture; + + const truncatableServiceStub: any = { + isCollapsed: (id: number) => observableOf(true), + }; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + imports: [NoopAnimationsModule], + declarations: [PersonGridElementComponent, TruncatePipe], + providers: [ + { provide: TruncatableService, useValue: truncatableServiceStub }, + ], + schemas: [NO_ERRORS_SCHEMA] + }).overrideComponent(PersonGridElementComponent, { + set: { changeDetection: ChangeDetectionStrategy.Default } + }).compileComponents(); + })); + + beforeEach(async(() => { + fixture = TestBed.createComponent(PersonGridElementComponent); + comp = fixture.componentInstance; + })); + + describe(`when the person is rendered`, () => { + beforeEach(() => { + comp.object = mockItem; + fixture.detectChanges(); + }); + + it(`should contain a PersonGridElementComponent`, () => { + const personGridElement = fixture.debugElement.query(By.css(`ds-person-search-result-grid-element`)); + expect(personGridElement).not.toBeNull(); + }); + }); -describe('PersonGridElementComponent', getEntityGridElementTestComponent(PersonGridElementComponent, mockItemWithMetadata, mockItemWithoutMetadata, ['email', 'jobtitle'])); + }); \ No newline at end of file diff --git a/src/app/entity-groups/research-entities/item-grid-elements/project/project-grid-element.component.html b/src/app/entity-groups/research-entities/item-grid-elements/project/project-grid-element.component.html index 094d109dde..0c87599399 100644 --- a/src/app/entity-groups/research-entities/item-grid-elements/project/project-grid-element.component.html +++ b/src/app/entity-groups/research-entities/item-grid-elements/project/project-grid-element.component.html @@ -1 +1 @@ -<ds-project-search-result-grid-element [object]="{ indexableObject: object, hitHighlights: {} }"></ds-project-search-result-grid-element> \ No newline at end of file +<ds-project-search-result-grid-element [object]="{ indexableObject: object, hitHighlights: {} }" [linkType]="linkType"></ds-project-search-result-grid-element> \ No newline at end of file diff --git a/src/app/entity-groups/research-entities/item-grid-elements/project/project-grid-element.component.spec.ts b/src/app/entity-groups/research-entities/item-grid-elements/project/project-grid-element.component.spec.ts index 969912976c..701ca46a73 100644 --- a/src/app/entity-groups/research-entities/item-grid-elements/project/project-grid-element.component.spec.ts +++ b/src/app/entity-groups/research-entities/item-grid-elements/project/project-grid-element.component.spec.ts @@ -6,10 +6,15 @@ import { ProjectGridElementComponent } from './project-grid-element.component'; import { createSuccessfulRemoteDataObject$ } from '../../../../shared/testing/utils'; import { PaginatedList } from '../../../../core/data/paginated-list'; import { PageInfo } from '../../../../core/shared/page-info.model'; +import { async, TestBed } from '@angular/core/testing'; +import { NoopAnimationsModule } from '@angular/platform-browser/animations'; +import { PersonGridElementComponent } from '../person/person-grid-element.component'; +import { TruncatePipe } from '../../../../shared/utils/truncate.pipe'; +import { TruncatableService } from '../../../../shared/truncatable/truncatable.service'; +import { ChangeDetectionStrategy, NO_ERRORS_SCHEMA } from '@angular/core'; +import { By } from '@angular/platform-browser'; -const mockItemWithMetadata: ItemSearchResult = new ItemSearchResult(); -mockItemWithMetadata.hitHighlights = {}; -mockItemWithMetadata.indexableObject = Object.assign(new Item(), { +const mockItem = Object.assign(new Item(), { bitstreams: createSuccessfulRemoteDataObject$(new PaginatedList(new PageInfo(), [])), metadata: { 'dc.title': [ @@ -27,18 +32,43 @@ mockItemWithMetadata.indexableObject = Object.assign(new Item(), { } }); -const mockItemWithoutMetadata: ItemSearchResult = new ItemSearchResult(); -mockItemWithoutMetadata.hitHighlights = {}; -mockItemWithoutMetadata.indexableObject = Object.assign(new Item(), { - bitstreams: createSuccessfulRemoteDataObject$(new PaginatedList(new PageInfo(), [])), - metadata: { - 'dc.title': [ - { - language: 'en_US', - value: 'This is just another title' - } - ] - } -}); +describe('ProjectGridElementComponent', + () => { + let comp; + let fixture; + + const truncatableServiceStub: any = { + isCollapsed: (id: number) => observableOf(true), + }; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + imports: [NoopAnimationsModule], + declarations: [ProjectGridElementComponent, TruncatePipe], + providers: [ + { provide: TruncatableService, useValue: truncatableServiceStub }, + ], + schemas: [NO_ERRORS_SCHEMA] + }).overrideComponent(ProjectGridElementComponent, { + set: { changeDetection: ChangeDetectionStrategy.Default } + }).compileComponents(); + })); + + beforeEach(async(() => { + fixture = TestBed.createComponent(ProjectGridElementComponent); + comp = fixture.componentInstance; + })); + + describe(`when the project is rendered`, () => { + beforeEach(() => { + comp.object = mockItem; + fixture.detectChanges(); + }); + + it(`should contain a ProjectGridElementComponent`, () => { + const projectGridElement = fixture.debugElement.query(By.css(`ds-project-search-result-grid-element`)); + expect(projectGridElement).not.toBeNull(); + }); + }); -describe('ProjectGridElementComponent', getEntityGridElementTestComponent(ProjectGridElementComponent, mockItemWithMetadata, mockItemWithoutMetadata, ['description'])); + }); \ No newline at end of file diff --git a/src/app/entity-groups/research-entities/item-grid-elements/search-result-grid-elements/orgunit/orgunit-search-result-grid-element.component.html b/src/app/entity-groups/research-entities/item-grid-elements/search-result-grid-elements/orgunit/orgunit-search-result-grid-element.component.html index 675044294a..5c42be2b24 100644 --- a/src/app/entity-groups/research-entities/item-grid-elements/search-result-grid-elements/orgunit/orgunit-search-result-grid-element.component.html +++ b/src/app/entity-groups/research-entities/item-grid-elements/search-result-grid-elements/orgunit/orgunit-search-result-grid-element.component.html @@ -1,34 +1,40 @@ <ds-truncatable [id]="dso.id"> <div class="card" [@focusShadow]="(isCollapsed$ | async)?'blur':'focus'"> - <a [routerLink]="['/items/' + dso.id]" class="card-img-top full-width"> + <a *ngIf="linkType != linkTypes.None" [target]="(linkType == linkTypes.ExternalLink) ? '_blank' : '_self'" rel="noopener noreferrer" [routerLink]="['/items/' + dso.id]" class="card-img-top full-width"> <div> <ds-grid-thumbnail [thumbnail]="dso.getThumbnail() | async"> </ds-grid-thumbnail> </div> </a> + <span *ngIf="linkType == linkTypes.None" class="card-img-top full-width"> + <div> + <ds-grid-thumbnail [thumbnail]="dso.getThumbnail() | async"> + </ds-grid-thumbnail> + </div> + </span> <div class="card-body"> <ds-item-type-badge [object]="dso"></ds-item-type-badge> <ds-truncatable-part [id]="dso.id" [minLines]="3" type="h4"> - <h4 class="card-title" [innerHTML]="dso.firstMetadataValue('organization.legalName')"></h4> + <h4 class="card-title" [innerHTML]="firstMetadataValue('organization.legalName')"></h4> </ds-truncatable-part> - <p *ngIf="dso.hasMetadata('organization.foundingDate')" class="dso-date card-text text-muted"> + <p *ngIf="dso.hasMetadata('organization.foundingDate')" class="item-date card-text text-muted"> <ds-truncatable-part [id]="dso.id" [minLines]="1"> <span [innerHTML]="firstMetadataValue('organization.foundingDate')"></span> </ds-truncatable-part> </p> <p *ngIf="dso.hasMetadata('organization.address.addressCountry')" - class="dso-location card-text"> + class="item-location card-text"> <ds-truncatable-part [id]="dso.id" [minLines]="3"> - <span class="dso-country">{{dso.firstMetadataValue('organization.address.addressCountry')}}</span> - <span *ngIf="dso.hasMetadata('organization.address.addressLocality')" class="dso-city"> + <span class="item-country">{{firstMetadataValue('organization.address.addressCountry')}}</span> + <span *ngIf="dso.hasMetadata('organization.address.addressLocality')" class="item-city"> <span>, </span> - {{dso.firstMetadataValue('organization.address.addressLocality')}} + {{firstMetadataValue('organization.address.addressLocality')}} </span> </ds-truncatable-part> </p> - <div class="text-center"> - <a [routerLink]="['/items/' + dso.id]" - class="lead btn btn-primary viewButton">View</a> + <div *ngIf="linkType != linkTypes.None" class="text-center"> + <a [target]="(linkType == linkTypes.ExternalLink) ? '_blank' : '_self'" rel="noopener noreferrer" [routerLink]="['/items/' + dso.id]" + class="lead btn btn-primary viewButton">View</a> </div> </div> </div> diff --git a/src/app/entity-groups/research-entities/item-grid-elements/search-result-grid-elements/orgunit/orgunit-search-result-grid-element.component.spec.ts b/src/app/entity-groups/research-entities/item-grid-elements/search-result-grid-elements/orgunit/orgunit-search-result-grid-element.component.spec.ts index 579161f940..bb4cb93a70 100644 --- a/src/app/entity-groups/research-entities/item-grid-elements/search-result-grid-elements/orgunit/orgunit-search-result-grid-element.component.spec.ts +++ b/src/app/entity-groups/research-entities/item-grid-elements/search-result-grid-elements/orgunit/orgunit-search-result-grid-element.component.spec.ts @@ -52,4 +52,4 @@ mockItemWithoutMetadata.indexableObject = Object.assign(new Item(), { } }); -describe('OrgunitGridElementComponent', getEntityGridElementTestComponent(OrgunitSearchResultGridElementComponent, mockItemWithMetadata, mockItemWithoutMetadata, ['date', 'country', 'city'])); +describe('OrgunitSearchResultGridElementComponent', getEntityGridElementTestComponent(OrgunitSearchResultGridElementComponent, mockItemWithMetadata, mockItemWithoutMetadata, ['date', 'country', 'city'])); diff --git a/src/app/entity-groups/research-entities/item-grid-elements/search-result-grid-elements/person/person-search-result-grid-element.component.html b/src/app/entity-groups/research-entities/item-grid-elements/search-result-grid-elements/person/person-search-result-grid-element.component.html index 378bf43ec2..b7eed7c8b4 100644 --- a/src/app/entity-groups/research-entities/item-grid-elements/search-result-grid-elements/person/person-search-result-grid-element.component.html +++ b/src/app/entity-groups/research-entities/item-grid-elements/search-result-grid-elements/person/person-search-result-grid-element.component.html @@ -1,28 +1,35 @@ <ds-truncatable [id]="dso.id"> <div class="card" [@focusShadow]="(isCollapsed$ | async)?'blur':'focus'"> - <a [routerLink]="['/items/' + dso.id]" class="card-img-top full-width"> + <a *ngIf="linkType != linkTypes.None" [target]="(linkType == linkTypes.ExternalLink) ? '_blank' : '_self'" rel="noopener noreferrer" [routerLink]="['/items/' + dso.id]" + class="card-img-top full-width"> <div> - <ds-grid-thumbnail [thumbnail]="this.dso.getThumbnail() | async"> + <ds-grid-thumbnail [thumbnail]="dso.getThumbnail() | async"> </ds-grid-thumbnail> </div> </a> + <span *ngIf="linkType == linkTypes.None" class="card-img-top full-width"> + <div> + <ds-grid-thumbnail [thumbnail]="dso.getThumbnail() | async"> + </ds-grid-thumbnail> + </div> + </span> <div class="card-body"> <ds-item-type-badge [object]="dso"></ds-item-type-badge> <ds-truncatable-part [id]="dso.id" [minLines]="3" type="h4"> - <h4 class="card-title" [innerHTML]="dso.firstMetadataValue('person.familyName') + ', ' + dso.firstMetadataValue('person.givenName')"></h4> + <h4 class="card-title" [innerHTML]="firstMetadataValue('person.familyName') + ', ' + firstMetadataValue('person.givenName')"></h4> </ds-truncatable-part> - <p *ngIf="dso.hasMetadata('person.email')" class="dso-email card-text text-muted"> + <p *ngIf="dso.hasMetadata('person.email')" class="item-email card-text text-muted"> <ds-truncatable-part [id]="dso.id" [minLines]="1"> <span [innerHTML]="firstMetadataValue('person.email')"></span> </ds-truncatable-part> </p> - <p *ngIf="dso.hasMetadata('person.jobTitle')" class="dso-jobtitle card-text"> + <p *ngIf="dso.hasMetadata('person.jobTitle')" class="item-jobtitle card-text"> <ds-truncatable-part [id]="dso.id" [minLines]="3"> <span [innerHTML]="firstMetadataValue('person.jobTitle')"></span> </ds-truncatable-part> </p> - <div class="text-center"> - <a [routerLink]="['/items/' + dso.id]" + <div *ngIf="linkType != linkTypes.None" class="text-center"> + <a [target]="(linkType == linkTypes.ExternalLink) ? '_blank' : '_self'" rel="noopener noreferrer" [routerLink]="['/items/' + dso.id]" class="lead btn btn-primary viewButton">View</a> </div> </div> diff --git a/src/app/entity-groups/research-entities/item-grid-elements/search-result-grid-elements/person/person-search-result-grid-element.component.spec.ts b/src/app/entity-groups/research-entities/item-grid-elements/search-result-grid-elements/person/person-search-result-grid-element.component.spec.ts index 6a5c79c770..05baa7a63f 100644 --- a/src/app/entity-groups/research-entities/item-grid-elements/search-result-grid-elements/person/person-search-result-grid-element.component.spec.ts +++ b/src/app/entity-groups/research-entities/item-grid-elements/search-result-grid-elements/person/person-search-result-grid-element.component.spec.ts @@ -46,4 +46,4 @@ mockItemWithoutMetadata.indexableObject = Object.assign(new Item(), { } }); -describe('PersonGridElementComponent', getEntityGridElementTestComponent(PersonSearchResultGridElementComponent, mockItemWithMetadata, mockItemWithoutMetadata, ['email', 'jobtitle'])); +describe('PersonSearchResultGridElementComponent', getEntityGridElementTestComponent(PersonSearchResultGridElementComponent, mockItemWithMetadata, mockItemWithoutMetadata, ['email', 'jobtitle'])); diff --git a/src/app/entity-groups/research-entities/item-grid-elements/search-result-grid-elements/project/project-search-result-grid-element.component.html b/src/app/entity-groups/research-entities/item-grid-elements/search-result-grid-elements/project/project-search-result-grid-element.component.html index 4e98f94fb9..f3a0dea81f 100644 --- a/src/app/entity-groups/research-entities/item-grid-elements/search-result-grid-elements/project/project-search-result-grid-element.component.html +++ b/src/app/entity-groups/research-entities/item-grid-elements/search-result-grid-elements/project/project-search-result-grid-element.component.html @@ -1,23 +1,29 @@ <ds-truncatable [id]="dso.id"> <div class="card" [@focusShadow]="(isCollapsed$ | async)?'blur':'focus'"> - <a [routerLink]="['/items/' + dso.id]" class="card-img-top full-width"> + <a *ngIf="linkType != linkTypes.None" [target]="(linkType == linkTypes.ExternalLink) ? '_blank' : '_self'" rel="noopener noreferrer" [routerLink]="['/items/' + dso.id]" class="card-img-top full-width"> <div> <ds-grid-thumbnail [thumbnail]="dso.getThumbnail() | async"> </ds-grid-thumbnail> </div> </a> + <span *ngIf="linkType == linkTypes.None" class="card-img-top full-width"> + <div> + <ds-grid-thumbnail [thumbnail]="dso.getThumbnail() | async"> + </ds-grid-thumbnail> + </div> + </span> <div class="card-body"> <ds-item-type-badge [object]="dso"></ds-item-type-badge> <ds-truncatable-part [id]="dso.id" [minLines]="3" type="h4"> - <h4 class="card-title" [innerHTML]="dso.firstMetadataValue('dc.title')"></h4> + <h4 class="card-title" [innerHTML]="firstMetadataValue('dc.title')"></h4> </ds-truncatable-part> - <p *ngIf="dso.hasMetadata('dc.description')" class="dso-description card-text text-muted"> + <p *ngIf="dso.hasMetadata('dc.description')" class="item-description card-text text-muted"> <ds-truncatable-part [id]="dso.id" [minLines]="3"> <span [innerHTML]="firstMetadataValue('dc.description')"></span> </ds-truncatable-part> </p> - <div class="text-center"> - <a [routerLink]="['/items/' + dso.id]" + <div *ngIf="linkType != linkTypes.None" class="text-center"> + <a [target]="(linkType == linkTypes.ExternalLink) ? '_blank' : '_self'" rel="noopener noreferrer" [routerLink]="['/items/' + dso.id]" class="lead btn btn-primary viewButton">View</a> </div> </div> diff --git a/src/app/entity-groups/research-entities/item-grid-elements/search-result-grid-elements/project/project-search-result-grid-element.component.spec.ts b/src/app/entity-groups/research-entities/item-grid-elements/search-result-grid-elements/project/project-search-result-grid-element.component.spec.ts index 64fedf155d..a9c0774c8c 100644 --- a/src/app/entity-groups/research-entities/item-grid-elements/search-result-grid-elements/project/project-search-result-grid-element.component.spec.ts +++ b/src/app/entity-groups/research-entities/item-grid-elements/search-result-grid-elements/project/project-search-result-grid-element.component.spec.ts @@ -40,4 +40,4 @@ mockItemWithoutMetadata.indexableObject = Object.assign(new Item(), { } }); -describe('ProjectGridElementComponent', getEntityGridElementTestComponent(ProjectSearchResultGridElementComponent, mockItemWithMetadata, mockItemWithoutMetadata, ['description'])); +describe('ProjectSearchResultGridElementComponent', getEntityGridElementTestComponent(ProjectSearchResultGridElementComponent, mockItemWithMetadata, mockItemWithoutMetadata, ['description'])); diff --git a/src/app/entity-groups/research-entities/item-list-elements/orgunit/orgunit-item-page-list-element.component.html b/src/app/entity-groups/research-entities/item-list-elements/orgunit/orgunit-item-page-list-element.component.html index bacec900c0..bdeb37dcd8 100644 --- a/src/app/entity-groups/research-entities/item-list-elements/orgunit/orgunit-item-page-list-element.component.html +++ b/src/app/entity-groups/research-entities/item-list-elements/orgunit/orgunit-item-page-list-element.component.html @@ -1,13 +1,13 @@ <ng-template #descTemplate> <span class="text-muted"> - <span *ngIf="object.allMetadata(['dc.description']).length > 0" + <span *ngIf="metadataRepresentation.allMetadata(['dc.description']).length > 0" class="item-list-job-title"> - <span [innerHTML]="firstMetadataValue(['dc.description'])"></span> + <span [innerHTML]="metadataRepresentation.firstMetadataValue(['dc.description'])"></span> </span> </span> </ng-template> -<ds-truncatable [id]="object.id"> - <a [routerLink]="['/items/' + object.id]" - [innerHTML]="firstMetadataValue('organization.legalName')" +<ds-truncatable [id]="metadataRepresentation.id"> + <a [routerLink]="['/items/' + metadataRepresentation.id]" + [innerHTML]="metadataRepresentation.firstMetadataValue('organization.legalName')" [tooltip]="descTemplate"></a> </ds-truncatable> diff --git a/src/app/entity-groups/research-entities/item-list-elements/orgunit/orgunit-item-page-list-element.component.ts b/src/app/entity-groups/research-entities/item-list-elements/orgunit/orgunit-item-page-list-element.component.ts index 708139da95..2025faac75 100644 --- a/src/app/entity-groups/research-entities/item-list-elements/orgunit/orgunit-item-page-list-element.component.ts +++ b/src/app/entity-groups/research-entities/item-list-elements/orgunit/orgunit-item-page-list-element.component.ts @@ -1,8 +1,7 @@ import { Component } from '@angular/core'; -import { AbstractListableElementComponent } from '../../../../shared/object-collection/shared/object-collection-element/abstract-listable-element.component'; -import { Item } from '../../../../core/shared/item.model'; import { metadataRepresentationComponent } from '../../../../shared/metadata-representation/metadata-representation.decorator'; import { MetadataRepresentationType } from '../../../../core/shared/metadata-representation/metadata-representation.model'; +import { ItemMetadataRepresentation } from '../../../../core/shared/metadata-representation/item/item-metadata-representation.model'; @metadataRepresentationComponent('OrgUnit', MetadataRepresentationType.Item) @Component({ @@ -12,5 +11,6 @@ import { MetadataRepresentationType } from '../../../../core/shared/metadata-rep /** * The component for displaying a list element for an item of the type OrgUnit */ -export class OrgunitItemPageListElementComponent extends AbstractListableElementComponent<Item> { +export class OrgunitItemPageListElementComponent { + metadataRepresentation: ItemMetadataRepresentation; } diff --git a/src/app/entity-groups/research-entities/item-list-elements/orgunit/orgunit-list-element.component.html b/src/app/entity-groups/research-entities/item-list-elements/orgunit/orgunit-list-element.component.html index 246bac000c..ad0eec0313 100644 --- a/src/app/entity-groups/research-entities/item-list-elements/orgunit/orgunit-list-element.component.html +++ b/src/app/entity-groups/research-entities/item-list-elements/orgunit/orgunit-list-element.component.html @@ -1 +1 @@ -<ds-orgunit-search-result-list-element [object]="{ indexableObject: object, hitHighlights: {} }"></ds-orgunit-search-result-list-element> \ No newline at end of file +<ds-orgunit-search-result-list-element [object]="{ indexableObject: object, hitHighlights: {} }" [linkType]="linkType"></ds-orgunit-search-result-list-element> \ No newline at end of file diff --git a/src/app/entity-groups/research-entities/item-list-elements/orgunit/orgunit-list-element.component.spec.ts b/src/app/entity-groups/research-entities/item-list-elements/orgunit/orgunit-list-element.component.spec.ts index f1ff6b1dce..d0254e675d 100644 --- a/src/app/entity-groups/research-entities/item-list-elements/orgunit/orgunit-list-element.component.spec.ts +++ b/src/app/entity-groups/research-entities/item-list-elements/orgunit/orgunit-list-element.component.spec.ts @@ -1,17 +1,13 @@ -import { async, ComponentFixture, TestBed } from '@angular/core/testing'; +import { async, TestBed } from '@angular/core/testing'; import { ChangeDetectionStrategy, NO_ERRORS_SCHEMA } from '@angular/core'; import { By } from '@angular/platform-browser'; import { OrgUnitListElementComponent } from './orgunit-list-element.component'; import { of as observableOf } from 'rxjs'; import { Item } from '../../../../core/shared/item.model'; import { TruncatePipe } from '../../../../shared/utils/truncate.pipe'; -import { ITEM } from '../../../../shared/items/switcher/listable-object-component-loader.component'; import { TruncatableService } from '../../../../shared/truncatable/truncatable.service'; -let orgUnitListElementComponent: OrgUnitListElementComponent; -let fixture: ComponentFixture<OrgUnitListElementComponent>; - -const mockItemWithMetadata: Item = Object.assign(new Item(), { +const mockItem: Item = Object.assign(new Item(), { bitstreams: observableOf({}), metadata: { 'dc.title': [ @@ -28,60 +24,43 @@ const mockItemWithMetadata: Item = Object.assign(new Item(), { ] } }); -const mockItemWithoutMetadata: Item = Object.assign(new Item(), { - bitstreams: observableOf({}), - metadata: { - 'dc.title': [ - { - language: 'en_US', - value: 'This is just another title' - } - ] - } -}); - -describe('OrgUnitListElementComponent', () => { - beforeEach(async(() => { - TestBed.configureTestingModule({ - declarations: [ OrgUnitListElementComponent , TruncatePipe], - providers: [ - { provide: ITEM, useValue: mockItemWithMetadata}, - { provide: TruncatableService, useValue: {} } - ], - schemas: [ NO_ERRORS_SCHEMA ] - }).overrideComponent(OrgUnitListElementComponent, { - set: { changeDetection: ChangeDetectionStrategy.Default } - }).compileComponents(); - })); +describe('OrgunitListElementComponent', + () => { + let comp; + let fixture; - beforeEach(async(() => { - fixture = TestBed.createComponent(OrgUnitListElementComponent); - orgUnitListElementComponent = fixture.componentInstance; + const truncatableServiceStub: any = { + isCollapsed: (id: number) => observableOf(true), + }; - })); + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [OrgUnitListElementComponent, TruncatePipe], + providers: [ + { provide: TruncatableService, useValue: truncatableServiceStub }, + ], + schemas: [NO_ERRORS_SCHEMA] + }).overrideComponent(OrgUnitListElementComponent, { + set: { changeDetection: ChangeDetectionStrategy.Default } + }).compileComponents(); + })); - describe('When the item has an orgunit description', () => { - beforeEach(() => { - orgUnitListElementComponent.object = mockItemWithMetadata; - fixture.detectChanges(); - }); + beforeEach(async(() => { + fixture = TestBed.createComponent(OrgUnitListElementComponent); + comp = fixture.componentInstance; + })); - it('should show the description span', () => { - const orgunitDescriptionField = fixture.debugElement.query(By.css('span.item-list-orgunit-description')); - expect(orgunitDescriptionField).not.toBeNull(); - }); - }); + describe(`when the orgunit is rendered`, () => { + beforeEach(() => { + comp.object = mockItem; + fixture.detectChanges(); + }); - describe('When the item has no orgunit description', () => { - beforeEach(() => { - orgUnitListElementComponent.object = mockItemWithoutMetadata; - fixture.detectChanges(); + it(`should contain a OrgUnitListElementComponent`, () => { + const orgunitListElement = fixture.debugElement.query(By.css(`ds-orgunit-search-result-list-element`)); + expect(orgunitListElement).not.toBeNull(); + }); }); - it('should not show the description span', () => { - const orgunitDescriptionField = fixture.debugElement.query(By.css('span.item-list-orgunit-description')); - expect(orgunitDescriptionField).toBeNull(); - }); - }); -}); + }); \ No newline at end of file diff --git a/src/app/entity-groups/research-entities/item-list-elements/person/person-item-page-list-element.component.html b/src/app/entity-groups/research-entities/item-list-elements/person/person-item-page-list-element.component.html index e9627b504e..fdc9dd8943 100644 --- a/src/app/entity-groups/research-entities/item-list-elements/person/person-item-page-list-element.component.html +++ b/src/app/entity-groups/research-entities/item-list-elements/person/person-item-page-list-element.component.html @@ -1,15 +1,15 @@ <ng-template #descTemplate> <span class="text-muted"> - <span *ngIf="object.allMetadata(['person.jobTitle']).length > 0" + <span *ngIf="metadataRepresentation.allMetadata(['person.jobTitle']).length > 0" class="item-list-job-title"> - <span *ngFor="let value of allMetadataValues(['person.jobTitle']); let last=last;"> + <span *ngFor="let value of metadataRepresentation.allMetadataValues(['person.jobTitle']); let last=last;"> <span [innerHTML]="value"><span [innerHTML]="value"></span></span> </span> </span> </span> </ng-template> -<ds-truncatable [id]="object.id"> - <a [routerLink]="['/items/' + object.id]" - [innerHTML]="firstMetadataValue('person.familyName') + ', ' + firstMetadataValue('person.givenName')" +<ds-truncatable [id]="metadataRepresentation.id"> + <a [routerLink]="['/items/' + metadataRepresentation.id]" + [innerHTML]="metadataRepresentation.firstMetadataValue('person.familyName') + ', ' + metadataRepresentation.firstMetadataValue('person.givenName')" [tooltip]="descTemplate"></a> </ds-truncatable> diff --git a/src/app/entity-groups/research-entities/item-list-elements/person/person-item-page-list-element.component.ts b/src/app/entity-groups/research-entities/item-list-elements/person/person-item-page-list-element.component.ts index 696640dae5..6679852cdb 100644 --- a/src/app/entity-groups/research-entities/item-list-elements/person/person-item-page-list-element.component.ts +++ b/src/app/entity-groups/research-entities/item-list-elements/person/person-item-page-list-element.component.ts @@ -3,6 +3,8 @@ import { AbstractListableElementComponent } from '../../../../shared/object-coll import { Item } from '../../../../core/shared/item.model'; import { metadataRepresentationComponent } from '../../../../shared/metadata-representation/metadata-representation.decorator'; import { MetadataRepresentationType } from '../../../../core/shared/metadata-representation/metadata-representation.model'; +import { MetadataRepresentationListElementComponent } from '../../../../shared/object-list/metadata-representation-list-element/metadata-representation-list-element.component'; +import { ItemMetadataRepresentation } from '../../../../core/shared/metadata-representation/item/item-metadata-representation.model'; @metadataRepresentationComponent('Person', MetadataRepresentationType.Item) @Component({ @@ -12,5 +14,6 @@ import { MetadataRepresentationType } from '../../../../core/shared/metadata-rep /** * The component for displaying a list element for an item of the type Person */ -export class PersonItemPageListElementComponent extends AbstractListableElementComponent<Item> { +export class PersonItemPageListElementComponent { + metadataRepresentation: ItemMetadataRepresentation; } diff --git a/src/app/entity-groups/research-entities/item-list-elements/person/person-list-element.component.html b/src/app/entity-groups/research-entities/item-list-elements/person/person-list-element.component.html index 9df315824a..dbc3a42a05 100644 --- a/src/app/entity-groups/research-entities/item-list-elements/person/person-list-element.component.html +++ b/src/app/entity-groups/research-entities/item-list-elements/person/person-list-element.component.html @@ -1 +1 @@ -<ds-person-search-result-list-element [object]="{ indexableObject: object, hitHighlights: {} }"></ds-person-search-result-list-element> \ No newline at end of file +<ds-person-search-result-list-element [object]="{ indexableObject: object, hitHighlights: {} }" [linkType]="linkType"></ds-person-search-result-list-element> \ No newline at end of file diff --git a/src/app/entity-groups/research-entities/item-list-elements/person/person-list-element.component.spec.ts b/src/app/entity-groups/research-entities/item-list-elements/person/person-list-element.component.spec.ts index 7d9eaf0d16..acc149c1df 100644 --- a/src/app/entity-groups/research-entities/item-list-elements/person/person-list-element.component.spec.ts +++ b/src/app/entity-groups/research-entities/item-list-elements/person/person-list-element.component.spec.ts @@ -6,11 +6,9 @@ import { of as observableOf } from 'rxjs'; import { Item } from '../../../../core/shared/item.model'; import { TruncatePipe } from '../../../../shared/utils/truncate.pipe'; import { TruncatableService } from '../../../../shared/truncatable/truncatable.service'; +import { OrgUnitListElementComponent } from '../orgunit/orgunit-list-element.component'; -let personListElementComponent: PersonListElementComponent; -let fixture: ComponentFixture<PersonListElementComponent>; - -const mockItemWithMetadata: Item = Object.assign(new Item(), { +const mockItem: Item = Object.assign(new Item(), { bitstreams: observableOf({}), metadata: { 'dc.title': [ @@ -27,59 +25,43 @@ const mockItemWithMetadata: Item = Object.assign(new Item(), { ] } }); -const mockItemWithoutMetadata: Item = Object.assign(new Item(), { - bitstreams: observableOf({}), - metadata: { - 'dc.title': [ - { - language: 'en_US', - value: 'This is just another title' - } - ] - } -}); - -describe('PersonListElementComponent', () => { - beforeEach(async(() => { - TestBed.configureTestingModule({ - declarations: [ PersonListElementComponent , TruncatePipe], - providers: [ - { provide: TruncatableService, useValue: {} } - ], - schemas: [ NO_ERRORS_SCHEMA ] - }).overrideComponent(PersonListElementComponent, { - set: { changeDetection: ChangeDetectionStrategy.Default } - }).compileComponents(); - })); +describe('PersonListElementComponent', + () => { + let comp; + let fixture; - beforeEach(async(() => { - fixture = TestBed.createComponent(PersonListElementComponent); - personListElementComponent = fixture.componentInstance; + const truncatableServiceStub: any = { + isCollapsed: (id: number) => observableOf(true), + }; - })); + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [PersonListElementComponent, TruncatePipe], + providers: [ + { provide: TruncatableService, useValue: truncatableServiceStub }, + ], + schemas: [NO_ERRORS_SCHEMA] + }).overrideComponent(PersonListElementComponent, { + set: { changeDetection: ChangeDetectionStrategy.Default } + }).compileComponents(); + })); - describe('When the item has a job title', () => { - beforeEach(() => { - personListElementComponent.object = mockItemWithMetadata; - fixture.detectChanges(); - }); + beforeEach(async(() => { + fixture = TestBed.createComponent(PersonListElementComponent); + comp = fixture.componentInstance; + })); - it('should show the job title span', () => { - const jobTitleField = fixture.debugElement.query(By.css('span.item-list-job-title')); - expect(jobTitleField).not.toBeNull(); - }); - }); + describe(`when the person is rendered`, () => { + beforeEach(() => { + comp.object = mockItem; + fixture.detectChanges(); + }); - describe('When the item has no job title', () => { - beforeEach(() => { - personListElementComponent.object = mockItemWithoutMetadata; - fixture.detectChanges(); + it(`should contain a PersonListElementComponent`, () => { + const personListElement = fixture.debugElement.query(By.css(`ds-person-search-result-list-element`)); + expect(personListElement).not.toBeNull(); + }); }); - it('should not show the job title span', () => { - const jobTitleField = fixture.debugElement.query(By.css('span.item-list-job-title')); - expect(jobTitleField).toBeNull(); - }); - }); -}); + }); \ No newline at end of file diff --git a/src/app/entity-groups/research-entities/item-list-elements/project/project-list-element.component.html b/src/app/entity-groups/research-entities/item-list-elements/project/project-list-element.component.html index 6d33c48fb4..8f74452eaa 100644 --- a/src/app/entity-groups/research-entities/item-list-elements/project/project-list-element.component.html +++ b/src/app/entity-groups/research-entities/item-list-elements/project/project-list-element.component.html @@ -1 +1 @@ -<ds-project-search-result-list-element [object]="{ indexableObject: object, hitHighlights: {} }"></ds-project-search-result-list-element> \ No newline at end of file +<ds-project-search-result-list-element [object]="{ indexableObject: object, hitHighlights: {} }" [linkType]="linkType"></ds-project-search-result-list-element> \ No newline at end of file diff --git a/src/app/entity-groups/research-entities/item-list-elements/project/project-list-element.component.spec.ts b/src/app/entity-groups/research-entities/item-list-elements/project/project-list-element.component.spec.ts index 0c171ae9ba..5591a5b625 100644 --- a/src/app/entity-groups/research-entities/item-list-elements/project/project-list-element.component.spec.ts +++ b/src/app/entity-groups/research-entities/item-list-elements/project/project-list-element.component.spec.ts @@ -1,17 +1,14 @@ -import { async, ComponentFixture, TestBed } from '@angular/core/testing'; +import { async, TestBed } from '@angular/core/testing'; import { ChangeDetectionStrategy, NO_ERRORS_SCHEMA } from '@angular/core'; import { By } from '@angular/platform-browser'; -import { ProjectListElementComponent } from './project-list-element.component'; import { of as observableOf } from 'rxjs'; import { Item } from '../../../../core/shared/item.model'; import { TruncatePipe } from '../../../../shared/utils/truncate.pipe'; -import { ITEM } from '../../../../shared/items/switcher/listable-object-component-loader.component'; import { TruncatableService } from '../../../../shared/truncatable/truncatable.service'; +import { PersonListElementComponent } from '../person/person-list-element.component'; +import { ProjectListElementComponent } from './project-list-element.component'; -let projectListElementComponent: ProjectListElementComponent; -let fixture: ComponentFixture<ProjectListElementComponent>; - -const mockItemWithMetadata: Item = Object.assign(new Item(), { +const mockItem: Item = Object.assign(new Item(), { bitstreams: observableOf({}), metadata: { 'dc.title': [ @@ -28,60 +25,42 @@ const mockItemWithMetadata: Item = Object.assign(new Item(), { // ] } }); -const mockItemWithoutMetadata: Item = Object.assign(new Item(), { - bitstreams: observableOf({}), - metadata: { - 'dc.title': [ - { - language: 'en_US', - value: 'This is just another title' - } - ] - } -}); +describe('ProjectListElementComponent', + () => { + let comp; + let fixture; -describe('ProjectListElementComponent', () => { - beforeEach(async(() => { - TestBed.configureTestingModule({ - declarations: [ ProjectListElementComponent , TruncatePipe], - providers: [ - { provide: ITEM, useValue: mockItemWithMetadata}, - { provide: TruncatableService, useValue: {} } - ], + const truncatableServiceStub: any = { + isCollapsed: (id: number) => observableOf(true), + }; - schemas: [ NO_ERRORS_SCHEMA ] - }).overrideComponent(ProjectListElementComponent, { - set: { changeDetection: ChangeDetectionStrategy.Default } - }).compileComponents(); - })); + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ProjectListElementComponent, TruncatePipe], + providers: [ + { provide: TruncatableService, useValue: truncatableServiceStub }, + ], + schemas: [NO_ERRORS_SCHEMA] + }).overrideComponent(ProjectListElementComponent, { + set: { changeDetection: ChangeDetectionStrategy.Default } + }).compileComponents(); + })); - beforeEach(async(() => { - fixture = TestBed.createComponent(ProjectListElementComponent); - projectListElementComponent = fixture.componentInstance; + beforeEach(async(() => { + fixture = TestBed.createComponent(ProjectListElementComponent); + comp = fixture.componentInstance; + })); - })); + describe(`when the project is rendered`, () => { + beforeEach(() => { + comp.object = mockItem; + fixture.detectChanges(); + }); - // describe('When the item has a status', () => { - // beforeEach(() => { - // projectListElementComponent.item = mockItemWithMetadata; - // fixture.detectChanges(); - // }); - // - // it('should show the status span', () => { - // const statusField = fixture.debugElement.query(By.css('span.item-list-status')); - // expect(statusField).not.toBeNull(); - // }); - // }); - // - // describe('When the item has no status', () => { - // beforeEach(() => { - // projectListElementComponent.item = mockItemWithoutMetadata; - // fixture.detectChanges(); - // }); - // - // it('should not show the status span', () => { - // const statusField = fixture.debugElement.query(By.css('span.item-list-status')); - // expect(statusField).toBeNull(); - // }); - // }); -}); + it(`should contain a ProjectListElementComponent`, () => { + const projectListElement = fixture.debugElement.query(By.css(`ds-project-search-result-list-element`)); + expect(projectListElement).not.toBeNull(); + }); + }); + + }); \ No newline at end of file diff --git a/src/app/entity-groups/research-entities/item-list-elements/search-result-list-elements/orgunit/orgunit-search-result-list-element.component.html b/src/app/entity-groups/research-entities/item-list-elements/search-result-list-elements/orgunit/orgunit-search-result-list-element.component.html index 4b32ac8278..39a7add763 100644 --- a/src/app/entity-groups/research-entities/item-list-elements/search-result-list-elements/orgunit/orgunit-search-result-list-element.component.html +++ b/src/app/entity-groups/research-entities/item-list-elements/search-result-list-elements/orgunit/orgunit-search-result-list-element.component.html @@ -1,8 +1,11 @@ <ds-item-type-badge [object]="dso"></ds-item-type-badge> <ds-truncatable [id]="dso.id"> - <a - [routerLink]="['/items/' + dso.id]" class="lead" - [innerHTML]="firstMetadataValue('organization.legalName')"></a> + <a *ngIf="linkType != linkTypes.None" [target]="(linkType == linkTypes.ExternalLink) ? '_blank' : '_self'" rel="noopener noreferrer" + [routerLink]="['/items/' + dso.id]" class="lead" + [innerHTML]="firstMetadataValue('organization.legalName')"></a> + <span *ngIf="linkType == linkTypes.None" + class="lead" + [innerHTML]="firstMetadataValue('organization.legalName')"></span> <span class="text-muted"> <ds-truncatable-part [id]="dso.id" [minLines]="3"> <span *ngIf="dso.allMetadata(['dc.description']).length > 0" diff --git a/src/app/entity-groups/research-entities/item-list-elements/search-result-list-elements/orgunit/orgunit-search-result-list-element.component.spec.ts b/src/app/entity-groups/research-entities/item-list-elements/search-result-list-elements/orgunit/orgunit-search-result-list-element.component.spec.ts index 72e3f246a9..6093b5c680 100644 --- a/src/app/entity-groups/research-entities/item-list-elements/search-result-list-elements/orgunit/orgunit-search-result-list-element.component.spec.ts +++ b/src/app/entity-groups/research-entities/item-list-elements/search-result-list-elements/orgunit/orgunit-search-result-list-element.component.spec.ts @@ -48,7 +48,7 @@ const mockItemWithoutMetadata: ItemSearchResult = Object.assign( }) }); -describe('OrgUnitListElementComponent', () => { +describe('OrgUnitSearchResultListElementComponent', () => { beforeEach(async(() => { TestBed.configureTestingModule({ declarations: [ OrgunitSearchResultListElementComponent , TruncatePipe], diff --git a/src/app/entity-groups/research-entities/item-list-elements/search-result-list-elements/person/person-search-result-list-element.component.html b/src/app/entity-groups/research-entities/item-list-elements/search-result-list-elements/person/person-search-result-list-element.component.html index c3a471c486..b2791c4891 100644 --- a/src/app/entity-groups/research-entities/item-list-elements/search-result-list-elements/person/person-search-result-list-element.component.html +++ b/src/app/entity-groups/research-entities/item-list-elements/search-result-list-elements/person/person-search-result-list-element.component.html @@ -1,8 +1,11 @@ <ds-item-type-badge [object]="dso"></ds-item-type-badge> <ds-truncatable [id]="dso.id"> - <a - [routerLink]="['/items/' + dso.id]" class="lead" - [innerHTML]="firstMetadataValue('person.familyName') + ', ' + firstMetadataValue('person.givenName')"></a> + <a *ngIf="linkType != linkTypes.None" [target]="(linkType == linkTypes.ExternalLink) ? '_blank' : '_self'" rel="noopener noreferrer" + [routerLink]="['/items/' + dso.id]" class="lead" + [innerHTML]="firstMetadataValue('person.familyName') + ', ' + firstMetadataValue('person.givenName')"></a> + <span *ngIf="linkType == linkTypes.None" + class="lead" + [innerHTML]="firstMetadataValue('person.familyName') + ', ' + firstMetadataValue('person.givenName')"></span> <span class="text-muted"> <ds-truncatable-part [id]="dso.id" [minLines]="1"> <span *ngIf="dso.allMetadata(['person.jobTitle']).length > 0" diff --git a/src/app/entity-groups/research-entities/item-list-elements/search-result-list-elements/person/person-search-result-list-element.component.spec.ts b/src/app/entity-groups/research-entities/item-list-elements/search-result-list-elements/person/person-search-result-list-element.component.spec.ts index dac5487164..a240d31bec 100644 --- a/src/app/entity-groups/research-entities/item-list-elements/search-result-list-elements/person/person-search-result-list-element.component.spec.ts +++ b/src/app/entity-groups/research-entities/item-list-elements/search-result-list-elements/person/person-search-result-list-element.component.spec.ts @@ -48,7 +48,7 @@ const mockItemWithoutMetadata: ItemSearchResult = Object.assign( }) }); -describe('PersonListElementComponent', () => { +describe('PersonSearchResultListElementComponent', () => { beforeEach(async(() => { TestBed.configureTestingModule({ declarations: [PersonSearchResultListElementComponent, TruncatePipe], diff --git a/src/app/entity-groups/research-entities/item-list-elements/search-result-list-elements/project/project-search-result-list-element.component.html b/src/app/entity-groups/research-entities/item-list-elements/search-result-list-elements/project/project-search-result-list-element.component.html index df14563102..95bff99e7e 100644 --- a/src/app/entity-groups/research-entities/item-list-elements/search-result-list-elements/project/project-search-result-list-element.component.html +++ b/src/app/entity-groups/research-entities/item-list-elements/search-result-list-elements/project/project-search-result-list-element.component.html @@ -1,16 +1,19 @@ - <ds-truncatable [id]="dso.id"> - <ds-item-type-badge [object]="dso"></ds-item-type-badge> - <a - [routerLink]="['/items/' + dso.id]" class="lead" - [innerHTML]="firstMetadataValue('dc.title')"></a> - <!--<span class="text-muted">--> - <!--<ds-truncatable-part [id]="dso.id" [minLines]="1">--> - <!--<span *ngIf="dso.allMetadata(['project.identifier.status']).length > 0"--> - <!--class="item-list-status">--> - <!--<span *ngFor="let value of allMetadataValues(['project.identifier.status']); let last=last;">--> - <!--<span [innerHTML]="value"><span [innerHTML]="value"></span></span>--> - <!--</span>--> - <!--</span>--> - <!--</ds-truncatable-part>--> - <!--</span>--> - </ds-truncatable> +<ds-truncatable [id]="dso.id"> + <ds-item-type-badge [object]="dso"></ds-item-type-badge> + <a *ngIf="linkType != linkTypes.None" [target]="(linkType == linkTypes.ExternalLink) ? '_blank' : '_self'" rel="noopener noreferrer" + [routerLink]="['/items/' + dso.id]" class="lead" + [innerHTML]="firstMetadataValue('dc.title')"></a> + <span *ngIf="linkType == linkTypes.None" + class="lead" + [innerHTML]="firstMetadataValue('dc.title')"></span> + <!--<span class="text-muted">--> + <!--<ds-truncatable-part [id]="dso.id" [minLines]="1">--> + <!--<span *ngIf="dso.allMetadata(['project.identifier.status']).length > 0"--> + <!--class="item-list-status">--> + <!--<span *ngFor="let value of allMetadataValues(['project.identifier.status']); let last=last;">--> + <!--<span [innerHTML]="value"><span [innerHTML]="value"></span></span>--> + <!--</span>--> + <!--</span>--> + <!--</ds-truncatable-part>--> + <!--</span>--> +</ds-truncatable> diff --git a/src/app/entity-groups/research-entities/item-list-elements/search-result-list-elements/project/project-search-result-list-element.component.spec.ts b/src/app/entity-groups/research-entities/item-list-elements/search-result-list-elements/project/project-search-result-list-element.component.spec.ts index e08e25eb69..128190a88b 100644 --- a/src/app/entity-groups/research-entities/item-list-elements/search-result-list-elements/project/project-search-result-list-element.component.spec.ts +++ b/src/app/entity-groups/research-entities/item-list-elements/search-result-list-elements/project/project-search-result-list-element.component.spec.ts @@ -48,7 +48,7 @@ const mockItemWithoutMetadata: ItemSearchResult = Object.assign( }) }); -describe('ProjectListElementComponent', () => { +describe('ProjectSearchResultListElementComponent', () => { beforeEach(async(() => { TestBed.configureTestingModule({ declarations: [ProjectSearchResultListElementComponent, TruncatePipe], diff --git a/src/app/entity-groups/research-entities/item-pages/orgunit/orgunit.component.html b/src/app/entity-groups/research-entities/item-pages/orgunit/orgunit.component.html index 637e59b4fb..c88eb6d439 100644 --- a/src/app/entity-groups/research-entities/item-pages/orgunit/orgunit.component.html +++ b/src/app/entity-groups/research-entities/item-pages/orgunit/orgunit.component.html @@ -4,7 +4,7 @@ <div class="row"> <div class="col-xs-12 col-md-4"> <ds-metadata-field-wrapper> - <ds-thumbnail [thumbnail]="this.object.getThumbnail() | async" [defaultImage]="'assets/images/orgunit-placeholder.svg'"></ds-thumbnail> + <ds-thumbnail [thumbnail]="object.getThumbnail() | async" [defaultImage]="'assets/images/orgunit-placeholder.svg'"></ds-thumbnail> </ds-metadata-field-wrapper> <ds-generic-item-page-field [item]="object" [fields]="['organization.foundingDate']" diff --git a/src/app/entity-groups/research-entities/item-pages/person/person.component.html b/src/app/entity-groups/research-entities/item-pages/person/person.component.html index 04d7b9e062..ad62b26a4b 100644 --- a/src/app/entity-groups/research-entities/item-pages/person/person.component.html +++ b/src/app/entity-groups/research-entities/item-pages/person/person.component.html @@ -1,12 +1,12 @@ <h2 class="item-page-title-field"> - {{'person.page.titleprefix' | translate}}<ds-metadata-values [mdValues]="[item?.firstMetadata('person.familyName'), item?.firstMetadata('person.givenName')]" [separator]="', '"></ds-metadata-values> + {{'person.page.titleprefix' | translate}}<ds-metadata-values [mdValues]="[object?.firstMetadata('person.familyName'), object?.firstMetadata('person.givenName')]" [separator]="', '"></ds-metadata-values> </h2> <div class="row"> <div class="col-xs-12 col-md-4"> <ds-metadata-field-wrapper> - <ds-thumbnail [thumbnail]="this.item.getThumbnail() | async" [defaultImage]="'assets/images/person-placeholder.svg'"></ds-thumbnail> + <ds-thumbnail [thumbnail]="this.object.getThumbnail() | async" [defaultImage]="'assets/images/person-placeholder.svg'"></ds-thumbnail> </ds-metadata-field-wrapper> - <ds-generic-item-page-field [item]="item" + <ds-generic-item-page-field [item]="object" [fields]="['person.email']" [label]="'person.page.email'"> </ds-generic-item-page-field> @@ -14,7 +14,7 @@ <!--[fields]="['person.identifier.orcid']"--> <!--[label]="'person.page.orcid'">--> <!--</ds-generic-item-page-field>--> - <ds-generic-item-page-field [item]="item" + <ds-generic-item-page-field [item]="object" [fields]="['person.birthDate']" [label]="'person.page.birthdate'"> </ds-generic-item-page-field> @@ -32,26 +32,26 @@ [items]="orgUnits$ | async" [label]="'relationships.isOrgUnitOf' | translate"> </ds-related-items> - <ds-generic-item-page-field [item]="item" + <ds-generic-item-page-field [item]="object" [fields]="['person.jobTitle']" [label]="'person.page.jobtitle'"> </ds-generic-item-page-field> - <ds-generic-item-page-field [item]="item" + <ds-generic-item-page-field [item]="object" [fields]="['person.familyName']" [label]="'person.page.lastname'"> </ds-generic-item-page-field> - <ds-generic-item-page-field [item]="item" + <ds-generic-item-page-field [item]="object" [fields]="['person.givenName']" [label]="'person.page.firstname'"> </ds-generic-item-page-field> <div> - <a class="btn btn-outline-primary" [routerLink]="['/items/' + item.id + '/full']"> + <a class="btn btn-outline-primary" [routerLink]="['/items/' + object.id + '/full']"> {{"item.page.link.full" | translate}} </a> </div> </div> <div class="mt-5 w-100"> - <ds-related-entities-search [item]="item" + <ds-related-entities-search [item]="object" [relationType]="'isAuthorOfPublication'"> </ds-related-entities-search> </div> diff --git a/src/app/entity-groups/research-entities/item-pages/project/project.component.html b/src/app/entity-groups/research-entities/item-pages/project/project.component.html index f9596e7f0c..615cd3c6cb 100644 --- a/src/app/entity-groups/research-entities/item-pages/project/project.component.html +++ b/src/app/entity-groups/research-entities/item-pages/project/project.component.html @@ -4,7 +4,7 @@ <div class="row"> <div class="col-xs-12 col-md-4"> <ds-metadata-field-wrapper> - <ds-thumbnail [thumbnail]="this.object.getThumbnail() | async" [defaultImage]="'assets/images/project-placeholder.svg'"></ds-thumbnail> + <ds-thumbnail [thumbnail]="object.getThumbnail() | async" [defaultImage]="'assets/images/project-placeholder.svg'"></ds-thumbnail> </ds-metadata-field-wrapper> <!--<ds-generic-item-page-field [item]="item"--> <!--[fields]="['project.identifier.status']"--> diff --git a/src/app/shared/input-suggestions/dso-input-suggestions/dso-input-suggestions.component.html b/src/app/shared/input-suggestions/dso-input-suggestions/dso-input-suggestions.component.html index 3e304d9eb3..7515b830b9 100644 --- a/src/app/shared/input-suggestions/dso-input-suggestions/dso-input-suggestions.component.html +++ b/src/app/shared/input-suggestions/dso-input-suggestions/dso-input-suggestions.component.html @@ -1,5 +1,5 @@ <form #form="ngForm" (ngSubmit)="onSubmit(currentObject)" - [action]="action" (keydown)="onKeydown($event)" + [action]="action" (keydown.arrowdown)="shiftFocusDown($event)" (keydown.arrowup)="shiftFocusUp($event)" (keydown.esc)="close()" (dsClickOutside)="close();"> @@ -14,9 +14,7 @@ <div class="dropdown-list"> <div *ngFor="let suggestionOption of suggestions"> <button class="d-block dropdown-item" (click)="onClickSuggestion(suggestionOption)" #suggestion> - <div class="click-blocker"> - </div> - <ds-listable-object-component-loader [object]="suggestionOption" [viewMode]="viewMode"></ds-listable-object-component-loader> + <ds-listable-object-component-loader [object]="suggestionOption" [viewMode]="viewMode" [linkType]="linkTypes.None"></ds-listable-object-component-loader> </button> </div> </div> diff --git a/src/app/shared/input-suggestions/dso-input-suggestions/dso-input-suggestions.component.ts b/src/app/shared/input-suggestions/dso-input-suggestions/dso-input-suggestions.component.ts index e1e9d18c8f..92775f25c6 100644 --- a/src/app/shared/input-suggestions/dso-input-suggestions/dso-input-suggestions.component.ts +++ b/src/app/shared/input-suggestions/dso-input-suggestions/dso-input-suggestions.component.ts @@ -3,6 +3,7 @@ import { NG_VALUE_ACCESSOR } from '@angular/forms'; import { InputSuggestionsComponent } from '../input-suggestions.component'; import { DSpaceObject } from '../../../core/shared/dspace-object.model'; import { ViewMode } from '../../../core/shared/view-mode.model'; +import { CollectionElementLinkType } from '../../object-collection/collection-element-link.type'; @Component({ selector: 'ds-dso-input-suggestions', @@ -24,6 +25,7 @@ import { ViewMode } from '../../../core/shared/view-mode.model'; */ export class DsoInputSuggestionsComponent extends InputSuggestionsComponent { viewMode = ViewMode.ListElement; + linkTypes = CollectionElementLinkType; /** * The suggestions that should be shown */ diff --git a/src/app/shared/input-suggestions/input-suggestions.component.scss b/src/app/shared/input-suggestions/input-suggestions.component.scss index eb0db5ed42..263c315d30 100644 --- a/src/app/shared/input-suggestions/input-suggestions.component.scss +++ b/src/app/shared/input-suggestions/input-suggestions.component.scss @@ -5,19 +5,9 @@ white-space: normal; word-break: break-word; padding: $input-padding-y $input-padding-x; - position: relative; - &:focus { outline: none; } - - .click-blocker { - position: absolute; - top: 0; - left: 0; - right: 0; - bottom: 0; - } } } diff --git a/src/app/shared/object-collection/collection-element-link.type.ts b/src/app/shared/object-collection/collection-element-link.type.ts new file mode 100644 index 0000000000..7bef4cf393 --- /dev/null +++ b/src/app/shared/object-collection/collection-element-link.type.ts @@ -0,0 +1,3 @@ +export enum CollectionElementLinkType { + None, Link, ExternalLink +} \ No newline at end of file diff --git a/src/app/shared/object-collection/object-collection.component.html b/src/app/shared/object-collection/object-collection.component.html index cd845b5b47..199f6d0bcf 100644 --- a/src/app/shared/object-collection/object-collection.component.html +++ b/src/app/shared/object-collection/object-collection.component.html @@ -3,6 +3,7 @@ [objects]="objects" [hasBorder]="hasBorder" [hideGear]="hideGear" + [linkType]="linkType" [context]="context" (paginationChange)="onPaginationChange($event)" (pageChange)="onPageChange($event)" @@ -16,6 +17,7 @@ [sortConfig]="sortConfig" [objects]="objects" [hideGear]="hideGear" + [linkType]="linkType" [context]="context" (paginationChange)="onPaginationChange($event)" (pageChange)="onPageChange($event)" @@ -29,6 +31,7 @@ [sortConfig]="sortConfig" [objects]="objects" [hideGear]="hideGear" + [linkType]="linkType" [context]="context" *ngIf="(currentMode$ | async) === viewModeEnum.DetailedListElement"> </ds-object-detail> diff --git a/src/app/shared/object-collection/object-collection.component.ts b/src/app/shared/object-collection/object-collection.component.ts index 175bd3ea53..2756d38639 100644 --- a/src/app/shared/object-collection/object-collection.component.ts +++ b/src/app/shared/object-collection/object-collection.component.ts @@ -11,6 +11,9 @@ import { SortDirection, SortOptions } from '../../core/cache/models/sort-options import { ListableObject } from './shared/listable-object.model'; import { isNotEmpty } from '../empty.util'; import { ViewMode } from '../../core/shared/view-mode.model'; +import { CollectionElementLinkType } from './collection-element-link.type'; +import { PaginatedList } from '../../core/data/paginated-list'; +import { Context } from '../../core/shared/context.model'; @Component({ selector: 'ds-viewable-collection', @@ -19,12 +22,13 @@ import { ViewMode } from '../../core/shared/view-mode.model'; }) export class ObjectCollectionComponent implements OnInit { - @Input() objects: RemoteData<ListableObject[]>; + @Input() objects: RemoteData<PaginatedList<ListableObject>>; @Input() config?: PaginationComponentOptions; @Input() sortConfig: SortOptions; @Input() hasBorder = false; @Input() hideGear = false; - @Input() context: string; + @Input() linkType: CollectionElementLinkType; + @Input() context: Context; pageInfo: Observable<PageInfo>; /** * An event fired when the page is changed. diff --git a/src/app/shared/object-collection/shared/listable-object/listable-object-component-loader.component.spec.ts b/src/app/shared/object-collection/shared/listable-object/listable-object-component-loader.component.spec.ts deleted file mode 100644 index d10ee1a0dd..0000000000 --- a/src/app/shared/object-collection/shared/listable-object/listable-object-component-loader.component.spec.ts +++ /dev/null @@ -1,90 +0,0 @@ -import { ListableObjectComponentLoaderComponent } from './listable-object-component-loader.component'; -import { async, ComponentFixture, TestBed } from '@angular/core/testing'; -import { NO_ERRORS_SCHEMA } from '@angular/core'; -import { PageInfo } from '../../../core/shared/page-info.model'; -import { Item } from '../../../core/shared/item.model'; -import { PaginatedList } from '../../../core/data/paginated-list'; -import * as decorator from '../item-type-decorator'; -import { getComponentByItemType} from '../item-type-decorator'; -import { ItemMetadataRepresentation } from '../../../core/shared/metadata-representation/item/item-metadata-representation.model'; -import { createSuccessfulRemoteDataObject$ } from '../../testing/utils'; -import createSpy = jasmine.createSpy; -import { ViewMode } from '../../../core/shared/view-mode.model'; - -const relationType = 'type'; -const mockItem: Item = Object.assign(new Item(), { - bitstreams: createSuccessfulRemoteDataObject$(new PaginatedList(new PageInfo(), [])), - metadata: { - 'dc.title': [ - { - language: 'en_US', - value: 'test item' - } - ], - 'relationship.type': [ - { - language: 'en_US', - value: relationType - } - ] - } -}); -const mockItemMetadataRepresentation = Object.assign(new ItemMetadataRepresentation(), mockItem); -let viewMode = ViewMode.StandalonePage; - -describe('ItemTypeSwitcherComponent', () => { - let comp: ListableObjectComponentLoaderComponent; - let fixture: ComponentFixture<ListableObjectComponentLoaderComponent>; - - beforeEach(async(() => { - TestBed.configureTestingModule({ - declarations: [ ListableObjectComponentLoaderComponent ], - schemas: [ NO_ERRORS_SCHEMA ] - }).compileComponents(); // compile template and css - })); - - beforeEach(async(() => { - fixture = TestBed.createComponent(ListableObjectComponentLoaderComponent); - comp = fixture.componentInstance; - comp.object = mockItem; - comp.viewMode = viewMode; - spyOnProperty(decorator, 'getComponentByItemType').and.returnValue(createSpy('getComponentByItemType')) - })); - - describe('when the injected object is of type Item', () => { - beforeEach(() => { - viewMode = ViewMode.StandalonePage; - comp.object = mockItem; - comp.viewMode = viewMode; - }); - - describe('when calling getComponent', () => { - beforeEach(() => { - (comp as any).getComponent(); - }); - - it('should call getComponentByItemType with parameters type and viewMode', () => { - expect(decorator.getComponentByItemType).toHaveBeenCalledWith(relationType, viewMode); - }); - }); - }); - - describe('when the injected object is of type MetadataRepresentation', () => { - beforeEach(() => { - viewMode = ViewMode.MetadataField; - comp.object = mockItemMetadataRepresentation; - comp.viewMode = viewMode; - }); - - describe('when calling getComponent', () => { - beforeEach(() => { - (comp as any).getComponent(); - }); - - it('should call getComponentByItemType with parameters type, viewMode and representationType', () => { - expect(decorator.getComponentByItemType).toHaveBeenCalledWith(relationType, viewMode, mockItemMetadataRepresentation.representationType); - }); - }); - }); - -}); diff --git a/src/app/shared/object-collection/shared/listable-object/listable-object-component-loader.component.ts b/src/app/shared/object-collection/shared/listable-object/listable-object-component-loader.component.ts index 45367df857..fb315303f6 100644 --- a/src/app/shared/object-collection/shared/listable-object/listable-object-component-loader.component.ts +++ b/src/app/shared/object-collection/shared/listable-object/listable-object-component-loader.component.ts @@ -5,6 +5,7 @@ import { Context } from '../../../../core/shared/context.model'; import { getListableObjectComponent } from './listable-object.decorator'; import { GenericConstructor } from '../../../../core/shared/generic-constructor'; import { ListableObjectDirective } from './listable-object.directive'; +import { CollectionElementLinkType } from '../../collection-element-link.type'; @Component({ selector: 'ds-listable-object-component-loader', @@ -28,6 +29,7 @@ export class ListableObjectComponentLoaderComponent implements OnInit { @Input() viewMode: ViewMode; @Input() context: Context; + @Input() linkType: CollectionElementLinkType; @ViewChild(ListableObjectDirective) listableObjectDirective: ListableObjectDirective; constructor(private componentFactoryResolver: ComponentFactoryResolver) { @@ -42,6 +44,7 @@ export class ListableObjectComponentLoaderComponent implements OnInit { const componentRef = viewContainerRef.createComponent(componentFactory); (<Component>componentRef.instance as any).object = this.object; (<Component>componentRef.instance as any).index = this.index; + (<Component>componentRef.instance as any).linkType = this.linkType; } /** diff --git a/src/app/shared/object-collection/shared/listable-object/listable-object.decorator.ts b/src/app/shared/object-collection/shared/listable-object/listable-object.decorator.ts index 29cd1287a1..6098875b4d 100644 --- a/src/app/shared/object-collection/shared/listable-object/listable-object.decorator.ts +++ b/src/app/shared/object-collection/shared/listable-object/listable-object.decorator.ts @@ -38,7 +38,6 @@ export function getListableObjectComponent(types: string[], viewMode: ViewMode, const typeModeMap = typeMap.get(viewMode); if (hasValue(typeModeMap)) { if (hasValue(typeModeMap.get(context))) { - console.log(typeModeMap.get(context)); return typeModeMap.get(context); } if (bestMatchValue < 2 && hasValue(typeModeMap.get(DEFAULT_CONTEXT))) { @@ -52,6 +51,5 @@ export function getListableObjectComponent(types: string[], viewMode: ViewMode, } } } - console.log(bestMatch); return bestMatch; } \ No newline at end of file diff --git a/src/app/shared/object-collection/shared/object-collection-element/abstract-listable-element.component.ts b/src/app/shared/object-collection/shared/object-collection-element/abstract-listable-element.component.ts index d6819b04da..6d9f0289dd 100644 --- a/src/app/shared/object-collection/shared/object-collection-element/abstract-listable-element.component.ts +++ b/src/app/shared/object-collection/shared/object-collection-element/abstract-listable-element.component.ts @@ -1,6 +1,6 @@ -import { Component, Inject, Input } from '@angular/core'; +import { Component, Input } from '@angular/core'; import { ListableObject } from '../listable-object.model'; -import { ViewMode } from '../../../../core/shared/view-mode.model'; +import { CollectionElementLinkType } from '../../collection-element-link.type'; @Component({ selector: 'ds-abstract-object-element', @@ -8,4 +8,6 @@ import { ViewMode } from '../../../../core/shared/view-mode.model'; }) export class AbstractListableElementComponent<T extends ListableObject> { @Input() object: T; + @Input() linkType: CollectionElementLinkType; + linkTypes = CollectionElementLinkType; } diff --git a/src/app/shared/object-detail/my-dspace-result-detail-element/claimed-task-search-result/claimed-task-search-result-detail-element.component.spec.ts b/src/app/shared/object-detail/my-dspace-result-detail-element/claimed-task-search-result/claimed-task-search-result-detail-element.component.spec.ts index 63520a8f5f..64bdfeff7b 100644 --- a/src/app/shared/object-detail/my-dspace-result-detail-element/claimed-task-search-result/claimed-task-search-result-detail-element.component.spec.ts +++ b/src/app/shared/object-detail/my-dspace-result-detail-element/claimed-task-search-result/claimed-task-search-result-detail-element.component.spec.ts @@ -6,12 +6,11 @@ import { of as observableOf } from 'rxjs'; import { Item } from '../../../../core/shared/item.model'; import { ClaimedTaskSearchResultDetailElementComponent } from './claimed-task-search-result-detail-element.component'; -import { ClaimedTaskSearchResult } from '../../../object-collection/shared/claimed-task-my-dspace-result.model'; import { ClaimedTask } from '../../../../core/tasks/models/claimed-task-object.model'; -import { RemoteData } from '../../../../core/data/remote-data'; import { MyDspaceItemStatusType } from '../../../object-collection/shared/mydspace-item-status/my-dspace-item-status-type'; import { WorkflowItem } from '../../../../core/submission/models/workflowitem.model'; import { createSuccessfulRemoteDataObject } from '../../../testing/utils'; +import { ClaimedTaskSearchResult } from '../../../object-collection/shared/claimed-task-search-result.model'; let component: ClaimedTaskSearchResultDetailElementComponent; let fixture: ComponentFixture<ClaimedTaskSearchResultDetailElementComponent>; @@ -55,15 +54,11 @@ const workflowitem = Object.assign(new WorkflowItem(), { item: observableOf(rdIt const rdWorkflowitem = createSuccessfulRemoteDataObject(workflowitem); mockResultObject.indexableObject = Object.assign(new ClaimedTask(), { workflowitem: observableOf(rdWorkflowitem) }); -describe('ClaimedMyDSpaceResultDetailElementComponent', () => { +describe('ClaimedTaskSearchResultDetailElementComponent', () => { beforeEach(async(() => { TestBed.configureTestingModule({ imports: [NoopAnimationsModule], declarations: [ClaimedTaskSearchResultDetailElementComponent], - providers: [ - { provide: 'objectElementProvider', useValue: (mockResultObject) }, - { provide: 'indexElementProvider', useValue: (compIndex) } - ], schemas: [NO_ERRORS_SCHEMA] }).overrideComponent(ClaimedTaskSearchResultDetailElementComponent, { set: { changeDetection: ChangeDetectionStrategy.Default } diff --git a/src/app/shared/object-detail/my-dspace-result-detail-element/item-detail-preview/item-detail-preview.component.html b/src/app/shared/object-detail/my-dspace-result-detail-element/item-detail-preview/item-detail-preview.component.html index 04e128c49a..66644d23a9 100644 --- a/src/app/shared/object-detail/my-dspace-result-detail-element/item-detail-preview/item-detail-preview.component.html +++ b/src/app/shared/object-detail/my-dspace-result-detail-element/item-detail-preview/item-detail-preview.component.html @@ -15,7 +15,7 @@ <ng-container *ngVar="(bitstreams$ | async) as bitstreams"> <ds-metadata-field-wrapper [label]="('item.page.files' | translate)"> <div *ngIf="bitstreams?.length > 0" class="file-section"> - <a *ngFor="let file of bitstreams; let last=last;" [href]="file?.content" target="_blank" [download]="file?.name"> + <a *ngFor="let file of bitstreams; let last=last;" [href]="file?.content" target="_blank" rel="noopener noreferrer" [download]="file?.name"> <span>{{file?.name}}</span> <span>({{(file?.sizeBytes) |Â dsFileSize }})</span> <span *ngIf="!last" innerHTML="{{separator}}"></span> diff --git a/src/app/shared/object-detail/my-dspace-result-detail-element/item-detail-preview/item-detail-preview.component.spec.ts b/src/app/shared/object-detail/my-dspace-result-detail-element/item-detail-preview/item-detail-preview.component.spec.ts index c5970d751f..7920e54b00 100644 --- a/src/app/shared/object-detail/my-dspace-result-detail-element/item-detail-preview/item-detail-preview.component.spec.ts +++ b/src/app/shared/object-detail/my-dspace-result-detail-element/item-detail-preview/item-detail-preview.component.spec.ts @@ -72,7 +72,7 @@ describe('ItemDetailPreviewComponent', () => { fixture = TestBed.createComponent(ItemDetailPreviewComponent); component = fixture.componentInstance; component.object = { hitHighlights: {} } as any; - component.object = mockItem; + component.item = mockItem; component.separator = ', '; spyOn(component.item, 'getFiles').and.returnValue(mockItem.bitstreams); fixture.detectChanges(); diff --git a/src/app/shared/object-detail/my-dspace-result-detail-element/item-search-result/item-search-result-detail-element.component.spec.ts b/src/app/shared/object-detail/my-dspace-result-detail-element/item-search-result/item-search-result-detail-element.component.spec.ts index 070fedde81..72fbff78ed 100644 --- a/src/app/shared/object-detail/my-dspace-result-detail-element/item-search-result/item-search-result-detail-element.component.spec.ts +++ b/src/app/shared/object-detail/my-dspace-result-detail-element/item-search-result/item-search-result-detail-element.component.spec.ts @@ -47,15 +47,11 @@ mockResultObject.indexableObject = Object.assign(new Item(), { } }); -describe('ItemMyDSpaceResultDetailElementComponent', () => { +describe('ItemSearchResultDetailElementComponent', () => { beforeEach(async(() => { TestBed.configureTestingModule({ imports: [NoopAnimationsModule], declarations: [ItemSearchResultDetailElementComponent], - providers: [ - { provide: 'objectElementProvider', useValue: (mockResultObject) }, - { provide: 'indexElementProvider', useValue: (compIndex) } - ], schemas: [NO_ERRORS_SCHEMA] }).overrideComponent(ItemSearchResultDetailElementComponent, { set: { changeDetection: ChangeDetectionStrategy.Default } diff --git a/src/app/shared/object-detail/my-dspace-result-detail-element/pool-my-dspace-result/pool-search-result-detail-element.component.html b/src/app/shared/object-detail/my-dspace-result-detail-element/pool-search-result/pool-search-result-detail-element.component.html similarity index 100% rename from src/app/shared/object-detail/my-dspace-result-detail-element/pool-my-dspace-result/pool-search-result-detail-element.component.html rename to src/app/shared/object-detail/my-dspace-result-detail-element/pool-search-result/pool-search-result-detail-element.component.html diff --git a/src/app/shared/object-detail/my-dspace-result-detail-element/pool-my-dspace-result/pool-search-result-detail-element.component.spec.ts b/src/app/shared/object-detail/my-dspace-result-detail-element/pool-search-result/pool-search-result-detail-element.component.spec.ts similarity index 93% rename from src/app/shared/object-detail/my-dspace-result-detail-element/pool-my-dspace-result/pool-search-result-detail-element.component.spec.ts rename to src/app/shared/object-detail/my-dspace-result-detail-element/pool-search-result/pool-search-result-detail-element.component.spec.ts index b6fd29e8a6..412dd00c13 100644 --- a/src/app/shared/object-detail/my-dspace-result-detail-element/pool-my-dspace-result/pool-search-result-detail-element.component.spec.ts +++ b/src/app/shared/object-detail/my-dspace-result-detail-element/pool-search-result/pool-search-result-detail-element.component.spec.ts @@ -5,12 +5,12 @@ import { NoopAnimationsModule } from '@angular/platform-browser/animations'; import { of as observableOf } from 'rxjs'; import { Item } from '../../../../core/shared/item.model'; -import { PoolSearchResultDetailElementComponent } from './pool-my-dspace-result-detail-element.component'; -import { PoolTaskSearchResult } from '../../../object-collection/shared/pool-task-my-dspace-result.model'; import { PoolTask } from '../../../../core/tasks/models/pool-task-object.model'; import { MyDspaceItemStatusType } from '../../../object-collection/shared/mydspace-item-status/my-dspace-item-status-type'; import { WorkflowItem } from '../../../../core/submission/models/workflowitem.model'; import { createSuccessfulRemoteDataObject } from '../../../testing/utils'; +import { PoolSearchResultDetailElementComponent } from './pool-search-result-detail-element.component'; +import { PoolTaskSearchResult } from '../../../object-collection/shared/pool-task-search-result.model'; let component: PoolSearchResultDetailElementComponent; let fixture: ComponentFixture<PoolSearchResultDetailElementComponent>; @@ -54,7 +54,7 @@ const workflowitem = Object.assign(new WorkflowItem(), { item: observableOf(rdIt const rdWorkflowitem = createSuccessfulRemoteDataObject(workflowitem); mockResultObject.indexableObject = Object.assign(new PoolTask(), { workflowitem: observableOf(rdWorkflowitem) }); -describe('PoolMyDSpaceResultDetailElementComponent', () => { +describe('PoolSearchResultDetailElementComponent', () => { beforeEach(async(() => { TestBed.configureTestingModule({ imports: [NoopAnimationsModule], diff --git a/src/app/shared/object-detail/my-dspace-result-detail-element/pool-my-dspace-result/pool-search-result-detail-element.component.ts b/src/app/shared/object-detail/my-dspace-result-detail-element/pool-search-result/pool-search-result-detail-element.component.ts similarity index 100% rename from src/app/shared/object-detail/my-dspace-result-detail-element/pool-my-dspace-result/pool-search-result-detail-element.component.ts rename to src/app/shared/object-detail/my-dspace-result-detail-element/pool-search-result/pool-search-result-detail-element.component.ts diff --git a/src/app/shared/object-detail/my-dspace-result-detail-element/workflow-item-search-result/workflow-item-search-result-detail-element.component.spec.ts b/src/app/shared/object-detail/my-dspace-result-detail-element/workflow-item-search-result/workflow-item-search-result-detail-element.component.spec.ts index a4f0e3542a..0e1a3bd307 100644 --- a/src/app/shared/object-detail/my-dspace-result-detail-element/workflow-item-search-result/workflow-item-search-result-detail-element.component.spec.ts +++ b/src/app/shared/object-detail/my-dspace-result-detail-element/workflow-item-search-result/workflow-item-search-result-detail-element.component.spec.ts @@ -6,11 +6,10 @@ import { of as observableOf } from 'rxjs'; import { Item } from '../../../../core/shared/item.model'; import { WorkflowItemSearchResultDetailElementComponent } from './workflow-item-search-result-detail-element.component'; -import { WorkflowItemSearchResult } from '../../../object-collection/shared/workflowitem-my-dspace-result.model'; import { WorkflowItem } from '../../../../core/submission/models/workflowitem.model'; -import { RemoteData } from '../../../../core/data/remote-data'; import { MyDspaceItemStatusType } from '../../../object-collection/shared/mydspace-item-status/my-dspace-item-status-type'; import { createSuccessfulRemoteDataObject } from '../../../testing/utils'; +import { WorkflowItemSearchResult } from '../../../object-collection/shared/workflowitem-search-result.model'; let component: WorkflowItemSearchResultDetailElementComponent; let fixture: ComponentFixture<WorkflowItemSearchResultDetailElementComponent>; @@ -52,7 +51,7 @@ const item = Object.assign(new Item(), { const rd = createSuccessfulRemoteDataObject(item); mockResultObject.indexableObject = Object.assign(new WorkflowItem(), { item: observableOf(rd) }); -describe('WorkflowitemMyDSpaceResultDetailElementComponent', () => { +describe('WorkflowItemSearchResultDetailElementComponent', () => { beforeEach(async(() => { TestBed.configureTestingModule({ imports: [NoopAnimationsModule], diff --git a/src/app/shared/object-detail/my-dspace-result-detail-element/workspace-item-my-dspace-result/workspace-item-search-result-detail-element.component.html b/src/app/shared/object-detail/my-dspace-result-detail-element/workspace-item-search-result/workspace-item-search-result-detail-element.component.html similarity index 100% rename from src/app/shared/object-detail/my-dspace-result-detail-element/workspace-item-my-dspace-result/workspace-item-search-result-detail-element.component.html rename to src/app/shared/object-detail/my-dspace-result-detail-element/workspace-item-search-result/workspace-item-search-result-detail-element.component.html diff --git a/src/app/shared/object-detail/my-dspace-result-detail-element/workspace-item-my-dspace-result/workspace-item-search-result-detail-element.component.scss b/src/app/shared/object-detail/my-dspace-result-detail-element/workspace-item-search-result/workspace-item-search-result-detail-element.component.scss similarity index 100% rename from src/app/shared/object-detail/my-dspace-result-detail-element/workspace-item-my-dspace-result/workspace-item-search-result-detail-element.component.scss rename to src/app/shared/object-detail/my-dspace-result-detail-element/workspace-item-search-result/workspace-item-search-result-detail-element.component.scss diff --git a/src/app/shared/object-detail/my-dspace-result-detail-element/workspace-item-my-dspace-result/workspace-item-search-result-detail-element.component.spec.ts b/src/app/shared/object-detail/my-dspace-result-detail-element/workspace-item-search-result/workspace-item-search-result-detail-element.component.spec.ts similarity index 93% rename from src/app/shared/object-detail/my-dspace-result-detail-element/workspace-item-my-dspace-result/workspace-item-search-result-detail-element.component.spec.ts rename to src/app/shared/object-detail/my-dspace-result-detail-element/workspace-item-search-result/workspace-item-search-result-detail-element.component.spec.ts index ebd0d1ba6a..c841bf1dab 100644 --- a/src/app/shared/object-detail/my-dspace-result-detail-element/workspace-item-my-dspace-result/workspace-item-search-result-detail-element.component.spec.ts +++ b/src/app/shared/object-detail/my-dspace-result-detail-element/workspace-item-search-result/workspace-item-search-result-detail-element.component.spec.ts @@ -6,11 +6,10 @@ import { of as observableOf } from 'rxjs'; import { Item } from '../../../../core/shared/item.model'; import { WorkspaceItemSearchResultDetailElementComponent } from './workspace-item-search-result-detail-element.component'; -import { WorkflowItemSearchResult } from '../../../object-collection/shared/workspaceitem-my-dspace-result.model'; import { WorkspaceItem } from '../../../../core/submission/models/workspaceitem.model'; -import { RemoteData } from '../../../../core/data/remote-data'; import { MyDspaceItemStatusType } from '../../../object-collection/shared/mydspace-item-status/my-dspace-item-status-type'; import { createSuccessfulRemoteDataObject } from '../../../testing/utils'; +import { WorkflowItemSearchResult } from '../../../object-collection/shared/workflowitem-search-result.model'; let component: WorkspaceItemSearchResultDetailElementComponent; let fixture: ComponentFixture<WorkspaceItemSearchResultDetailElementComponent>; @@ -52,7 +51,7 @@ const item = Object.assign(new Item(), { const rd = createSuccessfulRemoteDataObject(item); mockResultObject.indexableObject = Object.assign(new WorkspaceItem(), { item: observableOf(rd) }); -describe('WorkspaceitemMyDSpaceResultDetailElementComponent', () => { +describe('WorkspaceItemSearchResultDetailElementComponent', () => { beforeEach(async(() => { TestBed.configureTestingModule({ imports: [NoopAnimationsModule], diff --git a/src/app/shared/object-detail/my-dspace-result-detail-element/workspace-item-my-dspace-result/workspace-item-search-result-detail-element.component.ts b/src/app/shared/object-detail/my-dspace-result-detail-element/workspace-item-search-result/workspace-item-search-result-detail-element.component.ts similarity index 100% rename from src/app/shared/object-detail/my-dspace-result-detail-element/workspace-item-my-dspace-result/workspace-item-search-result-detail-element.component.ts rename to src/app/shared/object-detail/my-dspace-result-detail-element/workspace-item-search-result/workspace-item-search-result-detail-element.component.ts diff --git a/src/app/shared/object-detail/object-detail.component.ts b/src/app/shared/object-detail/object-detail.component.ts index 93da1bcce6..36963b2f5d 100644 --- a/src/app/shared/object-detail/object-detail.component.ts +++ b/src/app/shared/object-detail/object-detail.component.ts @@ -17,6 +17,7 @@ import { ListableObject } from '../object-collection/shared/listable-object.mode import { PaginationComponentOptions } from '../pagination/pagination-component-options.model'; import { ViewMode } from '../../core/shared/view-mode.model'; import { Context } from '../../core/shared/context.model'; +import { CollectionElementLinkType } from '../object-collection/collection-element-link.type'; /** * This component renders a paginated set of results in the detail view. @@ -51,6 +52,7 @@ export class ObjectDetailComponent { * A boolean representing if to hide pagination when there is only a page */ @Input() hidePagerWhenSinglePage = true; + @Input() linkType: CollectionElementLinkType; @Input() context: Context; /** diff --git a/src/app/shared/object-grid/collection-grid-element/collection-grid-element.component.html b/src/app/shared/object-grid/collection-grid-element/collection-grid-element.component.html index 9fecb51b9a..0b1a85d0ef 100644 --- a/src/app/shared/object-grid/collection-grid-element/collection-grid-element.component.html +++ b/src/app/shared/object-grid/collection-grid-element/collection-grid-element.component.html @@ -1,14 +1,17 @@ <div class="card"> - <a [routerLink]="['/collections/', object.id]" class="card-img-top"> + <a *ngIf="linkType != linkTypes.None" [target]="(linkType == linkTypes.ExternalLink) ? '_blank' : '_self'" rel="noopener noreferrer" [routerLink]="['/collections/', object.id]" class="card-img-top"> <ds-grid-thumbnail [thumbnail]="object.logo"> </ds-grid-thumbnail> </a> + <span *ngIf="linkType == linkTypes.None" class="card-img-top"> + <ds-grid-thumbnail [thumbnail]="object.logo"> + </ds-grid-thumbnail> + </span> <div class="card-body"> <h4 class="card-title">{{object.name}}</h4> <p *ngIf="object.shortDescription" class="card-text">{{object.shortDescription}}</p> - <div class="text-center"> - <a [routerLink]="['/collections/', object.id]" class="lead btn btn-primary viewButton">View</a> + <div *ngIf="linkType != linkTypes.None" class="text-center"> + <a [target]="(linkType == linkTypes.ExternalLink) ? '_blank' : '_self'" rel="noopener noreferrer" [routerLink]="['/collections/', object.id]" class="lead btn btn-primary viewButton">View</a> </div> - </div> </div> diff --git a/src/app/shared/object-grid/community-grid-element/community-grid-element.component.html b/src/app/shared/object-grid/community-grid-element/community-grid-element.component.html index 31a9e8ad3d..eed29367fa 100644 --- a/src/app/shared/object-grid/community-grid-element/community-grid-element.component.html +++ b/src/app/shared/object-grid/community-grid-element/community-grid-element.component.html @@ -1,14 +1,17 @@ <div class="card"> - - <a [routerLink]="['/communities/', object.id]" class="card-img-top"> + <a *ngIf="linkType != linkTypes.None" [target]="(linkType == linkTypes.ExternalLink) ? '_blank' : '_self'" rel="noopener noreferrer" [routerLink]="['/communities/', object.id]" class="card-img-top"> <ds-grid-thumbnail [thumbnail]="object.logo"> </ds-grid-thumbnail> </a> + <span *ngIf="linkType == linkTypes.None" class="card-img-top"> + <ds-grid-thumbnail [thumbnail]="object.logo"> + </ds-grid-thumbnail> + </span> <div class="card-body"> <h4 class="card-title">{{object.name}}</h4> <p *ngIf="object.shortDescription" class="card-text">{{object.shortDescription}}</p> - <div class="text-center"> - <a [routerLink]="['/communities/', object.id]" class="lead btn btn-primary viewButton">View</a> + <div *ngIf="linkType != linkTypes.None" class="text-center"> + <a [target]="(linkType == linkTypes.ExternalLink) ? '_blank' : '_self'" rel="noopener noreferrer" [routerLink]="['/communities/', object.id]" class="lead btn btn-primary viewButton">View</a> </div> </div> </div> diff --git a/src/app/shared/object-grid/item-grid-element/item-types/publication/publication-grid-element.component.html b/src/app/shared/object-grid/item-grid-element/item-types/publication/publication-grid-element.component.html index df413ebead..81ee3ebcce 100644 --- a/src/app/shared/object-grid/item-grid-element/item-types/publication/publication-grid-element.component.html +++ b/src/app/shared/object-grid/item-grid-element/item-types/publication/publication-grid-element.component.html @@ -1 +1 @@ -<ds-publication-search-result-grid-element [object]="{ indexableObject: object, hitHighlights: {} }"></ds-publication-search-result-grid-element> +<ds-publication-search-result-grid-element [object]="{ indexableObject: object, hitHighlights: {} }" [linkType]="linkType"></ds-publication-search-result-grid-element> diff --git a/src/app/shared/object-grid/item-grid-element/item-types/publication/publication-grid-element.component.spec.ts b/src/app/shared/object-grid/item-grid-element/item-types/publication/publication-grid-element.component.spec.ts index 3d0b80932d..a3103268fe 100644 --- a/src/app/shared/object-grid/item-grid-element/item-types/publication/publication-grid-element.component.spec.ts +++ b/src/app/shared/object-grid/item-grid-element/item-types/publication/publication-grid-element.component.spec.ts @@ -8,14 +8,12 @@ import { PublicationGridElementComponent } from './publication-grid-element.comp import { of as observableOf } from 'rxjs/internal/observable/of'; import { ItemSearchResult } from '../../../../object-collection/shared/item-search-result.model'; import { Item } from '../../../../../core/shared/item.model'; -import { ITEM } from '../../../../items/switcher/listable-object-component-loader.component'; import { createSuccessfulRemoteDataObject$ } from '../../../../testing/utils'; import { PaginatedList } from '../../../../../core/data/paginated-list'; import { PageInfo } from '../../../../../core/shared/page-info.model'; +import { JournalGridElementComponent } from '../../../../../entity-groups/journal-entities/item-grid-elements/journal/journal-grid-element.component'; -const mockItemWithMetadata: ItemSearchResult = new ItemSearchResult(); -mockItemWithMetadata.hitHighlights = {}; -mockItemWithMetadata.indexableObject = Object.assign(new Item(), { +const mockItem = Object.assign(new Item(), { bitstreams: createSuccessfulRemoteDataObject$(new PaginatedList(new PageInfo(), [])), metadata: { 'dc.title': [ @@ -45,33 +43,8 @@ mockItemWithMetadata.indexableObject = Object.assign(new Item(), { } }); -const mockItemWithoutMetadata: ItemSearchResult = new ItemSearchResult(); -mockItemWithoutMetadata.hitHighlights = {}; -mockItemWithoutMetadata.indexableObject = Object.assign(new Item(), { - bitstreams: createSuccessfulRemoteDataObject$(new PaginatedList(new PageInfo(), [])), - metadata: { - 'dc.title': [ - { - language: 'en_US', - value: 'This is just another title' - } - ] - } -}); - -describe('PublicationGridElementComponent', getEntityGridElementTestComponent(PublicationGridElementComponent, mockItemWithMetadata, mockItemWithoutMetadata, ['authors', 'date', 'abstract'])); - -/** - * Create test cases for a grid component of an entity. - * @param component The component's class - * @param searchResultWithMetadata An ItemSearchResult containing an item with metadata that should be displayed in the grid element - * @param searchResultWithoutMetadata An ItemSearchResult containing an item that's missing the metadata that should be displayed in the grid element - * @param fieldsToCheck A list of fields to check. The tests expect to find html elements with class ".item-${field}", so make sure they exist in the html template of the grid element. - * For example: If one of the fields to check is labeled "authors", the html template should contain at least one element with class ".item-authors" that's - * present when the author metadata is available. - */ -export function getEntityGridElementTestComponent(component, searchResultWithMetadata: ItemSearchResult, searchResultWithoutMetadata: ItemSearchResult, fieldsToCheck: string[]) { - return () => { +describe('PublicationGridElementComponent', + () => { let comp; let fixture; @@ -82,46 +55,31 @@ export function getEntityGridElementTestComponent(component, searchResultWithMet beforeEach(async(() => { TestBed.configureTestingModule({ imports: [NoopAnimationsModule], - declarations: [component, TruncatePipe], + declarations: [PublicationGridElementComponent, TruncatePipe], providers: [ { provide: TruncatableService, useValue: truncatableServiceStub }, - {provide: ITEM, useValue: searchResultWithoutMetadata} ], schemas: [NO_ERRORS_SCHEMA] - }).overrideComponent(component, { + }).overrideComponent(PublicationGridElementComponent, { set: { changeDetection: ChangeDetectionStrategy.Default } }).compileComponents(); })); beforeEach(async(() => { - fixture = TestBed.createComponent(component); + fixture = TestBed.createComponent(PublicationGridElementComponent); comp = fixture.componentInstance; })); - fieldsToCheck.forEach((field) => { - describe(`when the item has "${field}" metadata`, () => { - beforeEach(() => { - comp.dso = searchResultWithMetadata.indexableObject; - fixture.detectChanges(); - }); - - it(`should show the "${field}" field`, () => { - const itemAuthorField = fixture.debugElement.query(By.css(`.item-${field}`)); - expect(itemAuthorField).not.toBeNull(); - }); + describe(`when the publication is rendered`, () => { + beforeEach(() => { + comp.object = mockItem; + fixture.detectChanges(); }); - describe(`when the item has no "${field}" metadata`, () => { - beforeEach(() => { - comp.dso = searchResultWithoutMetadata.indexableObject; - fixture.detectChanges(); - }); - - it(`should not show the "${field}" field`, () => { - const itemAuthorField = fixture.debugElement.query(By.css(`.item-${field}`)); - expect(itemAuthorField).toBeNull(); - }); + it(`should contain a PublicationGridElementComponent`, () => { + const publicationGridElement = fixture.debugElement.query(By.css(`ds-publication-search-result-grid-element`)); + expect(publicationGridElement).not.toBeNull(); }); }); - } -} + + }); \ No newline at end of file diff --git a/src/app/shared/object-grid/object-grid.component.html b/src/app/shared/object-grid/object-grid.component.html index f527aa3555..348536bfed 100644 --- a/src/app/shared/object-grid/object-grid.component.html +++ b/src/app/shared/object-grid/object-grid.component.html @@ -13,7 +13,7 @@ <div class="card-columns row" *ngIf="objects?.hasSucceeded"> <div class="card-column col col-sm-6 col-lg-4" *ngFor="let column of (columns$ | async)" @fadeIn> <div class="card-element" *ngFor="let object of column"> - <ds-listable-object-component-loader [object]="object" [viewMode]="viewMode" [context]="context"></ds-listable-object-component-loader> + <ds-listable-object-component-loader [object]="object" [viewMode]="viewMode" [context]="context" [linkType]="linkType"></ds-listable-object-component-loader> </div> </div> </div> diff --git a/src/app/shared/object-grid/object-grid.component.ts b/src/app/shared/object-grid/object-grid.component.ts index 52f6e29d14..6b61e6bfd8 100644 --- a/src/app/shared/object-grid/object-grid.component.ts +++ b/src/app/shared/object-grid/object-grid.component.ts @@ -22,6 +22,7 @@ import { ListableObject } from '../object-collection/shared/listable-object.mode import { PaginationComponentOptions } from '../pagination/pagination-component-options.model'; import { ViewMode } from '../../core/shared/view-mode.model'; import { Context } from '../../core/shared/context.model'; +import { CollectionElementLinkType } from '../object-collection/collection-element-link.type'; @Component({ changeDetection: ChangeDetectionStrategy.Default, @@ -39,6 +40,7 @@ export class ObjectGridComponent implements OnInit { @Input() sortConfig: SortOptions; @Input() hideGear = false; @Input() hidePagerWhenSinglePage = true; + @Input() linkType: CollectionElementLinkType; @Input() context: Context; private _objects$: BehaviorSubject<RemoteData<PaginatedList<ListableObject>>>; diff --git a/src/app/shared/object-grid/search-result-grid-element/collection-search-result/collection-search-result-grid-element.component.html b/src/app/shared/object-grid/search-result-grid-element/collection-search-result/collection-search-result-grid-element.component.html index 91548d945d..0c45316e30 100644 --- a/src/app/shared/object-grid/search-result-grid-element/collection-search-result/collection-search-result-grid-element.component.html +++ b/src/app/shared/object-grid/search-result-grid-element/collection-search-result/collection-search-result-grid-element.component.html @@ -1,13 +1,17 @@ <div class="card"> - <a [routerLink]="['/collections/', dso.id]" class="card-img-top"> + <a *ngIf="linkType != linkTypes.None" [target]="(linkType == linkTypes.ExternalLink) ? '_blank' : '_self'" rel="noopener noreferrer" [routerLink]="['/collections/', dso.id]" class="card-img-top"> <ds-grid-thumbnail [thumbnail]="dso.logo"> </ds-grid-thumbnail> </a> + <span *ngIf="linkType == linkTypes.None" class="card-img-top"> + <ds-grid-thumbnail [thumbnail]="dso.logo"> + </ds-grid-thumbnail> + </span> <div class="card-body"> <h4 class="card-title">{{dso.name}}</h4> <p *ngIf="dso.shortDescription" class="card-text">{{dso.shortDescription}}</p> - <div class="text-center"> - <a [routerLink]="['/collections/', dso.id]" class="lead btn btn-primary viewButton">View</a> + <div *ngIf="linkType != linkTypes.None" class="text-center"> + <a [target]="(linkType == linkTypes.ExternalLink) ? '_blank' : '_self'" rel="noopener noreferrer" [routerLink]="['/collections/', dso.id]" class="lead btn btn-primary viewButton">View</a> </div> </div> </div> diff --git a/src/app/shared/object-grid/search-result-grid-element/community-search-result/community-search-result-grid-element.component.html b/src/app/shared/object-grid/search-result-grid-element/community-search-result/community-search-result-grid-element.component.html index 95094a6fa1..d0a9aa700e 100644 --- a/src/app/shared/object-grid/search-result-grid-element/community-search-result/community-search-result-grid-element.component.html +++ b/src/app/shared/object-grid/search-result-grid-element/community-search-result/community-search-result-grid-element.component.html @@ -1,14 +1,17 @@ <div class="card"> - - <a [routerLink]="['/communities/', dso.id]" class="card-img-top"> + <a *ngIf="linkType != linkTypes.None" [target]="(linkType == linkTypes.ExternalLink) ? '_blank' : '_self'" rel="noopener noreferrer" [routerLink]="['/communities/', dso.id]" class="card-img-top"> <ds-grid-thumbnail [thumbnail]="dso.logo"> </ds-grid-thumbnail> </a> + <span *ngIf="linkType == linkTypes.None" class="card-img-top"> + <ds-grid-thumbnail [thumbnail]="dso.logo"> + </ds-grid-thumbnail> + </span> <div class="card-body"> <h4 class="card-title">{{dso.name}}</h4> <p *ngIf="dso.shortDescription" class="card-text">{{dso.shortDescription}}</p> - <div class="text-center"> - <a [routerLink]="['/communities/', dso.id]" class="lead btn btn-primary viewButton">View</a> + <div *ngIf="linkType != linkTypes.None" class="text-center"> + <a [target]="(linkType == linkTypes.ExternalLink) ? '_blank' : '_self'" rel="noopener noreferrer" [routerLink]="['/communities/', dso.id]" class="lead btn btn-primary viewButton">View</a> </div> </div> </div> diff --git a/src/app/shared/object-grid/search-result-grid-element/item-search-result/publication/publication-search-result-grid-element.component.html b/src/app/shared/object-grid/search-result-grid-element/item-search-result/publication/publication-search-result-grid-element.component.html index e0eedc22fc..a00e30cbcd 100644 --- a/src/app/shared/object-grid/search-result-grid-element/item-search-result/publication/publication-search-result-grid-element.component.html +++ b/src/app/shared/object-grid/search-result-grid-element/item-search-result/publication/publication-search-result-grid-element.component.html @@ -1,32 +1,39 @@ <ds-truncatable [id]="dso.id"> <div class="card" [@focusShadow]="(isCollapsed$ | async)?'blur':'focus'"> - <a [routerLink]="['/items/' + dso.id]" class="card-img-top full-width"> + <a *ngIf="linkType != linkTypes.None" [target]="(linkType == linkTypes.ExternalLink) ? '_blank' : '_self'" rel="noopener noreferrer" [routerLink]="['/items/' + dso.id]" + class="card-img-top full-width"> <div> <ds-grid-thumbnail [thumbnail]="this.dso.getThumbnail() | async"> </ds-grid-thumbnail> </div> </a> + <span *ngIf="linkType == linkTypes.None" class="card-img-top full-width"> + <div> + <ds-grid-thumbnail [thumbnail]="dso.getThumbnail() | async"> + </ds-grid-thumbnail> + </div> + </span> <div class="card-body"> <ds-item-type-badge [object]="dso"></ds-item-type-badge> <ds-truncatable-part [id]="dso.id" [minLines]="3" type="h4"> - <h4 class="card-title" [innerHTML]="dso.firstMetadataValue('dc.title')"></h4> + <h4 class="card-title" [innerHTML]="firstMetadataValue('dc.title')"></h4> </ds-truncatable-part> <p *ngIf="dso.hasMetadata(['dc.contributor.author', 'dc.creator', 'dc.contributor.*'])" - class="dso-authors card-text text-muted"> + class="item-authors card-text text-muted"> <ds-truncatable-part [id]="dso.id" [minLines]="1"> - <span *ngIf="dso.hasMetadata('dc.date.issued')" class="dso-date">{{dso.firstMetadataValue('dc.date.issued')}}</span> - <span *ngFor="let author of dso.allMetadataValues(['dc.contributor.author', 'dc.creator', 'dc.contributor.*']);">, + <span *ngIf="dso.hasMetadata('dc.date.issued')" class="item-date">{{firstMetadataValue('dc.date.issued')}}</span> + <span *ngFor="let author of allMetadataValues(['dc.contributor.author', 'dc.creator', 'dc.contributor.*']);">, <span [innerHTML]="author"></span> </span> </ds-truncatable-part> </p> - <p *ngIf="dso.hasMetadata('dc.description.abstract')" class="dso-abstract card-text"> + <p *ngIf="dso.hasMetadata('dc.description.abstract')" class="item-abstract card-text"> <ds-truncatable-part [id]="dso.id" [minLines]="3"> <span [innerHTML]="firstMetadataValue('dc.description.abstract')"></span> </ds-truncatable-part> </p> - <div class="text-center"> - <a [routerLink]="['/items/' + dso.id]" + <div *ngIf="linkType != linkTypes.None" class="text-center"> + <a [target]="(linkType == linkTypes.ExternalLink) ? '_blank' : '_self'" rel="noopener noreferrer" [routerLink]="['/items/' + dso.id]" class="lead btn btn-primary viewButton">View</a> </div> </div> diff --git a/src/app/shared/object-grid/search-result-grid-element/item-search-result/publication/publication-search-result-grid-element.component.spec.ts b/src/app/shared/object-grid/search-result-grid-element/item-search-result/publication/publication-search-result-grid-element.component.spec.ts index 63ee848aa0..30bb2c9262 100644 --- a/src/app/shared/object-grid/search-result-grid-element/item-search-result/publication/publication-search-result-grid-element.component.spec.ts +++ b/src/app/shared/object-grid/search-result-grid-element/item-search-result/publication/publication-search-result-grid-element.component.spec.ts @@ -99,7 +99,7 @@ export function getEntityGridElementTestComponent(component, searchResultWithMet fieldsToCheck.forEach((field) => { describe(`when the item has "${field}" metadata`, () => { beforeEach(() => { - comp.dso = searchResultWithMetadata.indexableObject; + comp.object = searchResultWithMetadata; fixture.detectChanges(); }); @@ -111,7 +111,7 @@ export function getEntityGridElementTestComponent(component, searchResultWithMet describe(`when the item has no "${field}" metadata`, () => { beforeEach(() => { - comp.dso = searchResultWithoutMetadata.indexableObject; + comp.object = searchResultWithoutMetadata; fixture.detectChanges(); }); diff --git a/src/app/shared/object-list/browse-entry-list-element/browse-entry-list-element.component.html b/src/app/shared/object-list/browse-entry-list-element/browse-entry-list-element.component.html index 0fad726777..e3455bf095 100644 --- a/src/app/shared/object-list/browse-entry-list-element/browse-entry-list-element.component.html +++ b/src/app/shared/object-list/browse-entry-list-element/browse-entry-list-element.component.html @@ -1,7 +1,10 @@ <div class="d-flex flex-row"> - <a [routerLink]="" [queryParams]="{value: object.value, startsWith: undefined}" [queryParamsHandling]="'merge'" class="lead"> - {{object.value}} - </a> - <span class="pr-2"> </span> - <span class="badge badge-pill badge-secondary align-self-center">{{object.count}}</span> + <a *ngIf="linkType != linkTypes.None" [target]="(linkType == linkTypes.ExternalLink) ? '_blank' : '_self'" rel="noopener noreferrer" [routerLink]="" [queryParams]="{value: object.value, startsWith: undefined}" [queryParamsHandling]="'merge'" class="lead"> + {{object.value}} + </a> + <span *ngIf="linkType == linkTypes.None" class="lead"> + {{object.value}} + </span> + <span class="pr-2"> </span> + <span class="badge badge-pill badge-secondary align-self-center">{{object.count}}</span> </div> diff --git a/src/app/shared/object-list/collection-list-element/collection-list-element.component.html b/src/app/shared/object-list/collection-list-element/collection-list-element.component.html index dec2794dca..c61adf5dad 100644 --- a/src/app/shared/object-list/collection-list-element/collection-list-element.component.html +++ b/src/app/shared/object-list/collection-list-element/collection-list-element.component.html @@ -1,6 +1,9 @@ -<a [routerLink]="['/collections/' + object.id]" class="lead"> +<a *ngIf="linkType != linkTypes.None" [target]="(linkType == linkTypes.ExternalLink) ? '_blank' : '_self'" rel="noopener noreferrer" [routerLink]="['/collections/' + object.id]" class="lead"> {{object.name}} </a> +<span *ngIf="linkType == linkTypes.None" class="lead"> + {{object.name}} +</span> <div *ngIf="object.shortDescription" class="text-muted abstract-text"> {{object.shortDescription}} </div> diff --git a/src/app/shared/object-list/community-list-element/community-list-element.component.html b/src/app/shared/object-list/community-list-element/community-list-element.component.html index 7582680fb2..af01999ca7 100644 --- a/src/app/shared/object-list/community-list-element/community-list-element.component.html +++ b/src/app/shared/object-list/community-list-element/community-list-element.component.html @@ -1,6 +1,9 @@ -<a [routerLink]="['/communities/' + object.id]" class="lead"> +<a *ngIf="linkType != linkTypes.None" [target]="(linkType == linkTypes.ExternalLink) ? '_blank' : '_self'" rel="noopener noreferrer" [routerLink]="['/communities/' + object.id]" class="lead"> {{object.name}} </a> +<span *ngIf="linkType == linkTypes.None" class="lead"> + {{object.name}} +</span> <div *ngIf="object.shortDescription" class="text-muted abstract-text"> {{object.shortDescription}} </div> diff --git a/src/app/shared/object-list/item-list-element/item-types/publication/publication-list-element.component.html b/src/app/shared/object-list/item-list-element/item-types/publication/publication-list-element.component.html index f4269d357d..acc3ee4194 100644 --- a/src/app/shared/object-list/item-list-element/item-types/publication/publication-list-element.component.html +++ b/src/app/shared/object-list/item-list-element/item-types/publication/publication-list-element.component.html @@ -1 +1 @@ -<ds-publication-search-result-list-element [object]="{ indexableObject: object, hitHighlights: {} }"></ds-publication-search-result-list-element> \ No newline at end of file +<ds-publication-search-result-list-element [object]="{ indexableObject: object, hitHighlights: {} }" [linkType]="linkType"></ds-publication-search-result-list-element> \ No newline at end of file diff --git a/src/app/shared/object-list/item-list-element/item-types/publication/publication-list-element.component.spec.ts b/src/app/shared/object-list/item-list-element/item-types/publication/publication-list-element.component.spec.ts index 5761a591dd..24bc774b1f 100644 --- a/src/app/shared/object-list/item-list-element/item-types/publication/publication-list-element.component.spec.ts +++ b/src/app/shared/object-list/item-list-element/item-types/publication/publication-list-element.component.spec.ts @@ -1,4 +1,4 @@ -import { async, ComponentFixture, TestBed } from '@angular/core/testing'; +import { async, TestBed } from '@angular/core/testing'; import { ChangeDetectionStrategy, NO_ERRORS_SCHEMA } from '@angular/core'; import { By } from '@angular/platform-browser'; import { PublicationListElementComponent } from './publication-list-element.component'; @@ -7,10 +7,7 @@ import { TruncatePipe } from '../../../../utils/truncate.pipe'; import { TruncatableService } from '../../../../truncatable/truncatable.service'; import { of as observableOf } from 'rxjs'; -let publicationListElementComponent: PublicationListElementComponent; -let fixture: ComponentFixture<PublicationListElementComponent>; - -const mockItemWithMetadata: Item = Object.assign(new Item(), { +const mockItem: Item = Object.assign(new Item(), { bitstreams: observableOf({}), metadata: { 'dc.title': [ @@ -45,131 +42,43 @@ const mockItemWithMetadata: Item = Object.assign(new Item(), { ] } }); -const mockItemWithoutMetadata: Item = Object.assign(new Item(), { - bitstreams: observableOf({}), - metadata: { - 'dc.title': [ - { - language: 'en_US', - value: 'This is just another title' - } - ] - } -}); - -describe('PublicationListElementComponent', () => { - beforeEach(async(() => { - TestBed.configureTestingModule({ - declarations: [ PublicationListElementComponent , TruncatePipe], - providers: [ - { provide: TruncatableService, useValue: {} } - ], - schemas: [ NO_ERRORS_SCHEMA ] - }).overrideComponent(PublicationListElementComponent, { - set: { changeDetection: ChangeDetectionStrategy.Default } - }).compileComponents(); - })); - - beforeEach(async(() => { - fixture = TestBed.createComponent(PublicationListElementComponent); - publicationListElementComponent = fixture.componentInstance; - - })); - - describe('When the item has an author', () => { - beforeEach(() => { - publicationListElementComponent.object = mockItemWithMetadata; - fixture.detectChanges(); - }); - - it('should show the author paragraph', () => { - const itemAuthorField = fixture.debugElement.query(By.css('span.item-list-authors')); - expect(itemAuthorField).not.toBeNull(); - }); - }); - - describe('When the item has no author', () => { - beforeEach(() => { - publicationListElementComponent.object = mockItemWithoutMetadata; - fixture.detectChanges(); - }); - - it('should not show the author paragraph', () => { - const itemAuthorField = fixture.debugElement.query(By.css('span.item-list-authors')); - expect(itemAuthorField).toBeNull(); - }); - }); - - describe('When the item has a publisher', () => { - beforeEach(() => { - publicationListElementComponent.object = mockItemWithMetadata; - fixture.detectChanges(); - }); - - it('should show the publisher span', () => { - const publisherField = fixture.debugElement.query(By.css('span.item-list-publisher')); - expect(publisherField).not.toBeNull(); - }); - }); - - describe('When the item has no publisher', () => { - beforeEach(() => { - publicationListElementComponent.object = mockItemWithoutMetadata; - fixture.detectChanges(); - }); - - it('should not show the publisher span', () => { - const publisherField = fixture.debugElement.query(By.css('span.item-list-publisher')); - expect(publisherField).toBeNull(); - }); - }); - - describe('When the item has an issuedate', () => { - beforeEach(() => { - publicationListElementComponent.object = mockItemWithMetadata; - fixture.detectChanges(); - }); - - it('should show the issuedate span', () => { - const dateField = fixture.debugElement.query(By.css('span.item-list-date')); - expect(dateField).not.toBeNull(); - }); - }); - - describe('When the item has no issuedate', () => { - beforeEach(() => { - publicationListElementComponent.object = mockItemWithoutMetadata; - fixture.detectChanges(); - }); - - it('should not show the issuedate span', () => { - const dateField = fixture.debugElement.query(By.css('span.item-list-date')); - expect(dateField).toBeNull(); - }); - }); - - describe('When the item has an abstract', () => { - beforeEach(() => { - publicationListElementComponent.object = mockItemWithMetadata; - fixture.detectChanges(); - }); - - it('should show the abstract span', () => { - const abstractField = fixture.debugElement.query(By.css('div.item-list-abstract')); - expect(abstractField).not.toBeNull(); - }); - }); - - describe('When the item has no abstract', () => { - beforeEach(() => { - publicationListElementComponent.object = mockItemWithoutMetadata; - fixture.detectChanges(); - }); - - it('should not show the abstract span', () => { - const abstractField = fixture.debugElement.query(By.css('div.item-list-abstract')); - expect(abstractField).toBeNull(); - }); - }); -}); +describe('PublicationListElementComponent', + () => { + let comp; + let fixture; + + const truncatableServiceStub: any = { + isCollapsed: (id: number) => observableOf(true), + }; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [PublicationListElementComponent, TruncatePipe], + providers: [ + { provide: TruncatableService, useValue: truncatableServiceStub }, + ], + schemas: [NO_ERRORS_SCHEMA] + }).overrideComponent(PublicationListElementComponent, { + set: { changeDetection: ChangeDetectionStrategy.Default } + }).compileComponents(); + })); + + beforeEach(async(() => { + fixture = TestBed.createComponent(PublicationListElementComponent); + comp = fixture.componentInstance; + })); + + describe(`when the publication is rendered`, () => { + beforeEach(() => { + comp.object = mockItem; + fixture.detectChanges(); + }); + + it(`should contain a PublicationListElementComponent`, () => { + const publicationListElement = fixture.debugElement.query(By.css(`ds-publication-search-result-list-element`)); + expect(publicationListElement).not.toBeNull(); + }); + }); + + }); \ No newline at end of file diff --git a/src/app/shared/object-list/item-type-badge/item-type-badge.component.spec.ts b/src/app/shared/object-list/item-type-badge/item-type-badge.component.spec.ts index 04c40b73ff..35f283efe3 100644 --- a/src/app/shared/object-list/item-type-badge/item-type-badge.component.spec.ts +++ b/src/app/shared/object-list/item-type-badge/item-type-badge.component.spec.ts @@ -13,9 +13,7 @@ let fixture: ComponentFixture<ItemTypeBadgeComponent>; const type = 'authorOfPublication'; -const mockItemWithRelationshipType: ItemSearchResult = new ItemSearchResult(); -mockItemWithRelationshipType.hitHighlights = {}; -mockItemWithRelationshipType.indexableObject = Object.assign(new Item(), { +const mockItemWithRelationshipType = Object.assign(new Item(), { bitstreams: observableOf({}), metadata: { 'relationship.type': [ @@ -27,9 +25,7 @@ mockItemWithRelationshipType.indexableObject = Object.assign(new Item(), { } }); -const mockItemWithoutRelationshipType: ItemSearchResult = new ItemSearchResult(); -mockItemWithoutRelationshipType.hitHighlights = {}; -mockItemWithoutRelationshipType.indexableObject = Object.assign(new Item(), { +const mockItemWithoutRelationshipType = Object.assign(new Item(), { bitstreams: observableOf({}), metadata: { 'dc.title': [ diff --git a/src/app/shared/object-list/metadata-representation-list-element/item/item-metadata-list-element.component.spec.ts b/src/app/shared/object-list/metadata-representation-list-element/item/item-metadata-list-element.component.spec.ts index 7afe774831..fe2ada3aff 100644 --- a/src/app/shared/object-list/metadata-representation-list-element/item/item-metadata-list-element.component.spec.ts +++ b/src/app/shared/object-list/metadata-representation-list-element/item/item-metadata-list-element.component.spec.ts @@ -23,6 +23,7 @@ describe('ItemMetadataListElementComponent', () => { beforeEach(async(() => { fixture = TestBed.createComponent(ItemMetadataListElementComponent); comp = fixture.componentInstance; + comp.metadataRepresentation = mockItemMetadataRepresentation; fixture.detectChanges(); })); diff --git a/src/app/shared/object-list/metadata-representation-list-element/item/item-metadata-list-element.component.ts b/src/app/shared/object-list/metadata-representation-list-element/item/item-metadata-list-element.component.ts index 08ff67e3f1..4f27bf05dd 100644 --- a/src/app/shared/object-list/metadata-representation-list-element/item/item-metadata-list-element.component.ts +++ b/src/app/shared/object-list/metadata-representation-list-element/item/item-metadata-list-element.component.ts @@ -3,9 +3,8 @@ import { Component } from '@angular/core'; import { MetadataRepresentationListElementComponent } from '../metadata-representation-list-element.component'; import { ViewMode } from '../../../../core/shared/view-mode.model'; import { metadataRepresentationComponent } from '../../../metadata-representation/metadata-representation.decorator'; -import { Item } from '../../../../core/shared/item.model'; -@metadataRepresentationComponent(Item.name, MetadataRepresentationType.Item) +@metadataRepresentationComponent('Publication', MetadataRepresentationType.Item) @Component({ selector: 'ds-item-metadata-list-element', templateUrl: './item-metadata-list-element.component.html' diff --git a/src/app/shared/object-list/metadata-representation-list-element/metadata-representation-list-element.component.ts b/src/app/shared/object-list/metadata-representation-list-element/metadata-representation-list-element.component.ts index b7f4a381e2..7b8e0d7f9c 100644 --- a/src/app/shared/object-list/metadata-representation-list-element/metadata-representation-list-element.component.ts +++ b/src/app/shared/object-list/metadata-representation-list-element/metadata-representation-list-element.component.ts @@ -10,7 +10,4 @@ import { MetadataRepresentation } from '../../../core/shared/metadata-representa */ export class MetadataRepresentationListElementComponent { metadataRepresentation: MetadataRepresentation; - - constructor() { - } } diff --git a/src/app/shared/object-list/metadata-representation-list-element/plain-text/plain-text-metadata-list-element.component.spec.ts b/src/app/shared/object-list/metadata-representation-list-element/plain-text/plain-text-metadata-list-element.component.spec.ts index 9926b8639e..9a409aa147 100644 --- a/src/app/shared/object-list/metadata-representation-list-element/plain-text/plain-text-metadata-list-element.component.spec.ts +++ b/src/app/shared/object-list/metadata-representation-list-element/plain-text/plain-text-metadata-list-element.component.spec.ts @@ -25,6 +25,7 @@ describe('PlainTextMetadataListElementComponent', () => { beforeEach(async(() => { fixture = TestBed.createComponent(PlainTextMetadataListElementComponent); comp = fixture.componentInstance; + comp.metadataRepresentation = mockMetadataRepresentation; fixture.detectChanges(); })); diff --git a/src/app/shared/object-list/metadata-representation-list-element/plain-text/plain-text-metadata-list-element.component.ts b/src/app/shared/object-list/metadata-representation-list-element/plain-text/plain-text-metadata-list-element.component.ts index 50e2c2a60b..198c3712d9 100644 --- a/src/app/shared/object-list/metadata-representation-list-element/plain-text/plain-text-metadata-list-element.component.ts +++ b/src/app/shared/object-list/metadata-representation-list-element/plain-text/plain-text-metadata-list-element.component.ts @@ -2,11 +2,10 @@ import { MetadataRepresentationType } from '../../../../core/shared/metadata-rep import { Component } from '@angular/core'; import { MetadataRepresentationListElementComponent } from '../metadata-representation-list-element.component'; import { metadataRepresentationComponent } from '../../../metadata-representation/metadata-representation.decorator'; -import { Item } from '../../../../core/shared/item.model'; -@metadataRepresentationComponent(Item.name, MetadataRepresentationType.PlainText) +@metadataRepresentationComponent('Publication', MetadataRepresentationType.PlainText) // For now, authority controlled fields are rendered the same way as plain text fields -@metadataRepresentationComponent(Item.name, MetadataRepresentationType.AuthorityControlled) +@metadataRepresentationComponent('Publication', MetadataRepresentationType.AuthorityControlled) @Component({ selector: 'ds-plain-text-metadata-list-element', templateUrl: './plain-text-metadata-list-element.component.html' diff --git a/src/app/shared/object-list/my-dspace-result-list-element/claimed-search-result/claimed-search-result-list-element.component.spec.ts b/src/app/shared/object-list/my-dspace-result-list-element/claimed-search-result/claimed-search-result-list-element.component.spec.ts index c52b1f1b07..327bb750b1 100644 --- a/src/app/shared/object-list/my-dspace-result-list-element/claimed-search-result/claimed-search-result-list-element.component.spec.ts +++ b/src/app/shared/object-list/my-dspace-result-list-element/claimed-search-result/claimed-search-result-list-element.component.spec.ts @@ -6,12 +6,13 @@ import { of as observableOf } from 'rxjs'; import { Item } from '../../../../core/shared/item.model'; import { ClaimedSearchResultListElementComponent } from './claimed-search-result-list-element.component'; -import { ClaimedTaskSearchResult } from '../../../object-collection/shared/claimed-task-my-dspace-result.model'; import { ClaimedTask } from '../../../../core/tasks/models/claimed-task-object.model'; -import { RemoteData } from '../../../../core/data/remote-data'; import { MyDspaceItemStatusType } from '../../../object-collection/shared/mydspace-item-status/my-dspace-item-status-type'; import { WorkflowItem } from '../../../../core/submission/models/workflowitem.model'; import { createSuccessfulRemoteDataObject } from '../../../testing/utils'; +import { ClaimedTaskSearchResult } from '../../../object-collection/shared/claimed-task-search-result.model'; +import { TruncatableAction } from '../../../truncatable/truncatable.actions'; +import { TruncatableService } from '../../../truncatable/truncatable.service'; let component: ClaimedSearchResultListElementComponent; let fixture: ComponentFixture<ClaimedSearchResultListElementComponent>; @@ -55,14 +56,13 @@ const workflowitem = Object.assign(new WorkflowItem(), { item: observableOf(rdIt const rdWorkflowitem = createSuccessfulRemoteDataObject(workflowitem); mockResultObject.indexableObject = Object.assign(new ClaimedTask(), { workflowitem: observableOf(rdWorkflowitem) }); -describe('ClaimedMyDSpaceResultListElementComponent', () => { +describe('ClaimedSearchResultListElementComponent', () => { beforeEach(async(() => { TestBed.configureTestingModule({ imports: [NoopAnimationsModule], declarations: [ClaimedSearchResultListElementComponent], providers: [ - { provide: 'objectElementProvider', useValue: (mockResultObject) }, - { provide: 'indexElementProvider', useValue: (compIndex) } + { provide: TruncatableService, useValue: {} }, ], schemas: [NO_ERRORS_SCHEMA] }).overrideComponent(ClaimedSearchResultListElementComponent, { diff --git a/src/app/shared/object-list/my-dspace-result-list-element/item-search-result/item-search-result-list-element-submission.component.spec.ts b/src/app/shared/object-list/my-dspace-result-list-element/item-search-result/item-search-result-list-element-submission.component.spec.ts index d3c657cc3f..57c1a4706c 100644 --- a/src/app/shared/object-list/my-dspace-result-list-element/item-search-result/item-search-result-list-element-submission.component.spec.ts +++ b/src/app/shared/object-list/my-dspace-result-list-element/item-search-result/item-search-result-list-element-submission.component.spec.ts @@ -8,6 +8,7 @@ import { Item } from '../../../../core/shared/item.model'; import { MyDspaceItemStatusType } from '../../../object-collection/shared/mydspace-item-status/my-dspace-item-status-type'; import { ItemSearchResult } from '../../../object-collection/shared/item-search-result.model'; import { ItemSearchResultListElementSubmissionComponent } from './item-search-result-list-element-submission.component'; +import { TruncatableService } from '../../../truncatable/truncatable.service'; let component: ItemSearchResultListElementSubmissionComponent; let fixture: ComponentFixture<ItemSearchResultListElementSubmissionComponent>; @@ -53,8 +54,7 @@ describe('ItemMyDSpaceResultListElementComponent', () => { imports: [NoopAnimationsModule], declarations: [ItemSearchResultListElementSubmissionComponent], providers: [ - { provide: 'objectElementProvider', useValue: (mockResultObject) }, - { provide: 'indexElementProvider', useValue: (compIndex) } + { provide: TruncatableService, useValue: {} }, ], schemas: [NO_ERRORS_SCHEMA] }).overrideComponent(ItemSearchResultListElementSubmissionComponent, { diff --git a/src/app/shared/object-list/my-dspace-result-list-element/pool-search-result/pool-search-result-list-element.component.spec.ts b/src/app/shared/object-list/my-dspace-result-list-element/pool-search-result/pool-search-result-list-element.component.spec.ts index 08b670862f..31f29439af 100644 --- a/src/app/shared/object-list/my-dspace-result-list-element/pool-search-result/pool-search-result-list-element.component.spec.ts +++ b/src/app/shared/object-list/my-dspace-result-list-element/pool-search-result/pool-search-result-list-element.component.spec.ts @@ -6,12 +6,12 @@ import { of as observableOf } from 'rxjs'; import { Item } from '../../../../core/shared/item.model'; import { PoolSearchResultListElementComponent } from './pool-search-result-list-element.component'; -import { PoolTaskSearchResult } from '../../../object-collection/shared/pool-task-my-dspace-result.model'; import { PoolTask } from '../../../../core/tasks/models/pool-task-object.model'; -import { RemoteData } from '../../../../core/data/remote-data'; import { MyDspaceItemStatusType } from '../../../object-collection/shared/mydspace-item-status/my-dspace-item-status-type'; import { WorkflowItem } from '../../../../core/submission/models/workflowitem.model'; import { createSuccessfulRemoteDataObject } from '../../../testing/utils'; +import { PoolTaskSearchResult } from '../../../object-collection/shared/pool-task-search-result.model'; +import { TruncatableService } from '../../../truncatable/truncatable.service'; let component: PoolSearchResultListElementComponent; let fixture: ComponentFixture<PoolSearchResultListElementComponent>; @@ -55,14 +55,13 @@ const workflowitem = Object.assign(new WorkflowItem(), { item: observableOf(rdIt const rdWorkflowitem = createSuccessfulRemoteDataObject(workflowitem); mockResultObject.indexableObject = Object.assign(new PoolTask(), { workflowitem: observableOf(rdWorkflowitem) }); -describe('PoolMyDSpaceResultListElementComponent', () => { +describe('PoolSearchResultListElementComponent', () => { beforeEach(async(() => { TestBed.configureTestingModule({ imports: [NoopAnimationsModule], declarations: [PoolSearchResultListElementComponent], providers: [ - { provide: 'objectElementProvider', useValue: (mockResultObject) }, - { provide: 'indexElementProvider', useValue: (compIndex) } + { provide: TruncatableService, useValue: {} }, ], schemas: [NO_ERRORS_SCHEMA] }).overrideComponent(PoolSearchResultListElementComponent, { diff --git a/src/app/shared/object-list/my-dspace-result-list-element/workflow-item-search-result/workflow-item-search-result-list-element.component.spec.ts b/src/app/shared/object-list/my-dspace-result-list-element/workflow-item-search-result/workflow-item-search-result-list-element.component.spec.ts index dd04198b93..90036142c4 100644 --- a/src/app/shared/object-list/my-dspace-result-list-element/workflow-item-search-result/workflow-item-search-result-list-element.component.spec.ts +++ b/src/app/shared/object-list/my-dspace-result-list-element/workflow-item-search-result/workflow-item-search-result-list-element.component.spec.ts @@ -5,12 +5,12 @@ import { NoopAnimationsModule } from '@angular/platform-browser/animations'; import { of as observableOf } from 'rxjs'; import { Item } from '../../../../core/shared/item.model'; -import { WorkflowItemSearchResultListElementComponent } from './workflow-item-my-search-result-list-element.component'; -import { WorkflowItemSearchResult } from '../../../object-collection/shared/workflowitem-my-dspace-result.model'; import { WorkflowItem } from '../../../../core/submission/models/workflowitem.model'; -import { RemoteData } from '../../../../core/data/remote-data'; import { MyDspaceItemStatusType } from '../../../object-collection/shared/mydspace-item-status/my-dspace-item-status-type'; import { createSuccessfulRemoteDataObject } from '../../../testing/utils'; +import { WorkflowItemSearchResultListElementComponent } from './workflow-item-search-result-list-element.component'; +import { WorkflowItemSearchResult } from '../../../object-collection/shared/workflowitem-search-result.model'; +import { TruncatableService } from '../../../truncatable/truncatable.service'; let component: WorkflowItemSearchResultListElementComponent; let fixture: ComponentFixture<WorkflowItemSearchResultListElementComponent>; @@ -52,14 +52,13 @@ const item = Object.assign(new Item(), { const rd = createSuccessfulRemoteDataObject(item); mockResultObject.indexableObject = Object.assign(new WorkflowItem(), { item: observableOf(rd) }); -describe('WorkflowitemMyDSpaceResultListElementComponent', () => { +describe('WorkflowItemSearchResultListElementComponent', () => { beforeEach(async(() => { TestBed.configureTestingModule({ imports: [NoopAnimationsModule], declarations: [WorkflowItemSearchResultListElementComponent], providers: [ - { provide: 'objectElementProvider', useValue: (mockResultObject) }, - { provide: 'indexElementProvider', useValue: (compIndex) } + { provide: TruncatableService, useValue: {} }, ], schemas: [NO_ERRORS_SCHEMA] }).overrideComponent(WorkflowItemSearchResultListElementComponent, { diff --git a/src/app/shared/object-list/my-dspace-result-list-element/workspace-item-search-result/workspace-item-search-result-list-element.component.spec.ts b/src/app/shared/object-list/my-dspace-result-list-element/workspace-item-search-result/workspace-item-search-result-list-element.component.spec.ts index 988d550345..eac4320bd7 100644 --- a/src/app/shared/object-list/my-dspace-result-list-element/workspace-item-search-result/workspace-item-search-result-list-element.component.spec.ts +++ b/src/app/shared/object-list/my-dspace-result-list-element/workspace-item-search-result/workspace-item-search-result-list-element.component.spec.ts @@ -6,11 +6,11 @@ import { of as observableOf } from 'rxjs'; import { Item } from '../../../../core/shared/item.model'; import { WorkspaceItemSearchResultListElementComponent } from './workspace-item-search-result-list-element.component'; -import { WorkflowItemSearchResult } from '../../../object-collection/shared/workspaceitem-my-dspace-result.model'; import { WorkspaceItem } from '../../../../core/submission/models/workspaceitem.model'; -import { RemoteData } from '../../../../core/data/remote-data'; import { MyDspaceItemStatusType } from '../../../object-collection/shared/mydspace-item-status/my-dspace-item-status-type'; import { createSuccessfulRemoteDataObject } from '../../../testing/utils'; +import { WorkflowItemSearchResult } from '../../../object-collection/shared/workflowitem-search-result.model'; +import { TruncatableService } from '../../../truncatable/truncatable.service'; let component: WorkspaceItemSearchResultListElementComponent; let fixture: ComponentFixture<WorkspaceItemSearchResultListElementComponent>; @@ -52,14 +52,13 @@ const item = Object.assign(new Item(), { const rd = createSuccessfulRemoteDataObject(item); mockResultObject.indexableObject = Object.assign(new WorkspaceItem(), { item: observableOf(rd) }); -describe('WorkspaceitemMyDSpaceResultListElementComponent', () => { +describe('WorkspaceItemSearchResultListElementComponent', () => { beforeEach(async(() => { TestBed.configureTestingModule({ imports: [NoopAnimationsModule], declarations: [WorkspaceItemSearchResultListElementComponent], providers: [ - { provide: 'objectElementProvider', useValue: (mockResultObject) }, - { provide: 'indexElementProvider', useValue: (compIndex) } + { provide: TruncatableService, useValue: {} }, ], schemas: [NO_ERRORS_SCHEMA] }).overrideComponent(WorkspaceItemSearchResultListElementComponent, { diff --git a/src/app/shared/object-list/object-list.component.html b/src/app/shared/object-list/object-list.component.html index daec1db8ad..1d49ea09d7 100644 --- a/src/app/shared/object-list/object-list.component.html +++ b/src/app/shared/object-list/object-list.component.html @@ -12,7 +12,7 @@ (paginationChange)="onPaginationChange($event)"> <ul *ngIf="objects?.hasSucceeded" class="list-unstyled"> <li *ngFor="let object of objects?.payload?.page; let i = index; let last = last" class="mt-4 mb-4" [class.border-bottom]="hasBorder && !last"> - <ds-listable-object-component-loader [object]="object" [viewMode]="viewMode" [index]="i" [context]="context"></ds-listable-object-component-loader> + <ds-listable-object-component-loader [object]="object" [viewMode]="viewMode" [index]="i" [context]="context" [linkType]="linkType"></ds-listable-object-component-loader> </li> </ul> </ds-pagination> diff --git a/src/app/shared/object-list/object-list.component.ts b/src/app/shared/object-list/object-list.component.ts index 0776134e83..9704dee70e 100644 --- a/src/app/shared/object-list/object-list.component.ts +++ b/src/app/shared/object-list/object-list.component.ts @@ -14,6 +14,7 @@ import { ListableObject } from '../object-collection/shared/listable-object.mode import { PaginationComponentOptions } from '../pagination/pagination-component-options.model'; import { ViewMode } from '../../core/shared/view-mode.model'; import { Context } from '../../core/shared/context.model'; +import { CollectionElementLinkType } from '../object-collection/collection-element-link.type'; @Component({ changeDetection: ChangeDetectionStrategy.Default, @@ -30,6 +31,7 @@ export class ObjectListComponent { @Input() hasBorder = false; @Input() hideGear = false; @Input() hidePagerWhenSinglePage = true; + @Input() linkType: CollectionElementLinkType; @Input() context: Context; private _objects: RemoteData<PaginatedList<ListableObject>>; @Input() set objects(objects: RemoteData<PaginatedList<ListableObject>>) { diff --git a/src/app/shared/object-list/search-result-list-element/collection-search-result/collection-search-result-list-element.component.html b/src/app/shared/object-list/search-result-list-element/collection-search-result/collection-search-result-list-element.component.html index b4af631e83..3c787c47ce 100644 --- a/src/app/shared/object-list/search-result-list-element/collection-search-result/collection-search-result-list-element.component.html +++ b/src/app/shared/object-list/search-result-list-element/collection-search-result/collection-search-result-list-element.component.html @@ -1,2 +1,3 @@ -<a [routerLink]="['/collections/' + dso.id]" class="lead" [innerHTML]="firstMetadataValue('dc.title')"></a> +<a *ngIf="linkType != linkTypes.None" [target]="(linkType == linkTypes.ExternalLink) ? '_blank' : '_self'" rel="noopener noreferrer" [routerLink]="['/collections/' + dso.id]" class="lead" [innerHTML]="firstMetadataValue('dc.title')"></a> +<span *ngIf="linkType == linkTypes.None" class="lead" [innerHTML]="firstMetadataValue('dc.title')"></span> <div *ngIf="dso.shortDescription" class="text-muted abstract-text" [innerHTML]="firstMetadataValue('dc.description.abstract')"></div> diff --git a/src/app/shared/object-list/search-result-list-element/collection-search-result/collection-search-result-list-element.component.spec.ts b/src/app/shared/object-list/search-result-list-element/collection-search-result/collection-search-result-list-element.component.spec.ts index 7f5aaf5d9c..9de1e085b5 100644 --- a/src/app/shared/object-list/search-result-list-element/collection-search-result/collection-search-result-list-element.component.spec.ts +++ b/src/app/shared/object-list/search-result-list-element/collection-search-result/collection-search-result-list-element.component.spec.ts @@ -47,9 +47,7 @@ describe('CollectionSearchResultListElementComponent', () => { declarations: [ CollectionSearchResultListElementComponent, TruncatePipe ], providers: [ { provide: TruncatableService, useValue: truncatableServiceStub }, - { provide: 'objectElementProvider', useValue: (mockCollectionWithAbstract) } ], - schemas: [ NO_ERRORS_SCHEMA ] }).overrideComponent(CollectionSearchResultListElementComponent, { set: { changeDetection: ChangeDetectionStrategy.Default } @@ -59,6 +57,8 @@ describe('CollectionSearchResultListElementComponent', () => { beforeEach(async(() => { fixture = TestBed.createComponent(CollectionSearchResultListElementComponent); collectionSearchResultListElementComponent = fixture.componentInstance; + collectionSearchResultListElementComponent.object = mockCollectionWithAbstract; + fixture.detectChanges(); })); describe('When the collection has an abstract', () => { diff --git a/src/app/shared/object-list/search-result-list-element/community-search-result/community-search-result-list-element.component.html b/src/app/shared/object-list/search-result-list-element/community-search-result/community-search-result-list-element.component.html index 9444a63771..32834fefee 100644 --- a/src/app/shared/object-list/search-result-list-element/community-search-result/community-search-result-list-element.component.html +++ b/src/app/shared/object-list/search-result-list-element/community-search-result/community-search-result-list-element.component.html @@ -1,2 +1,3 @@ -<a [routerLink]="['/communities/' + dso.id]" class="lead" [innerHTML]="firstMetadataValue('dc.title')"></a> +<a *ngIf="linkType != linkTypes.None" [target]="(linkType == linkTypes.ExternalLink) ? '_blank' : '_self'" rel="noopener noreferrer" [routerLink]="['/communities/' + dso.id]" class="lead" [innerHTML]="firstMetadataValue('dc.title')"></a> +<span *ngIf="linkType == linkTypes.None" class="lead" [innerHTML]="firstMetadataValue('dc.title')"></span> <div *ngIf="dso.shortDescription" class="text-muted abstract-text" [innerHTML]="firstMetadataValue('dc.description.abstract')"></div> diff --git a/src/app/shared/object-list/search-result-list-element/community-search-result/community-search-result-list-element.component.spec.ts b/src/app/shared/object-list/search-result-list-element/community-search-result/community-search-result-list-element.component.spec.ts index 691a69dde4..2bf61c2ab9 100644 --- a/src/app/shared/object-list/search-result-list-element/community-search-result/community-search-result-list-element.component.spec.ts +++ b/src/app/shared/object-list/search-result-list-element/community-search-result/community-search-result-list-element.component.spec.ts @@ -47,7 +47,6 @@ describe('CommunitySearchResultListElementComponent', () => { declarations: [ CommunitySearchResultListElementComponent, TruncatePipe ], providers: [ { provide: TruncatableService, useValue: truncatableServiceStub }, - { provide: 'objectElementProvider', useValue: (mockCommunityWithAbstract) } ], schemas: [ NO_ERRORS_SCHEMA ] @@ -59,6 +58,8 @@ describe('CommunitySearchResultListElementComponent', () => { beforeEach(async(() => { fixture = TestBed.createComponent(CommunitySearchResultListElementComponent); communitySearchResultListElementComponent = fixture.componentInstance; + communitySearchResultListElementComponent.object = mockCommunityWithAbstract; + fixture.detectChanges(); })); describe('When the community has an abstract', () => { diff --git a/src/app/shared/object-list/search-result-list-element/item-search-result/item-types/publication/publication-search-result-list-element.component.html b/src/app/shared/object-list/search-result-list-element/item-search-result/item-types/publication/publication-search-result-list-element.component.html index 62b9bc5e74..3d2604585d 100644 --- a/src/app/shared/object-list/search-result-list-element/item-search-result/item-types/publication/publication-search-result-list-element.component.html +++ b/src/app/shared/object-list/search-result-list-element/item-search-result/item-types/publication/publication-search-result-list-element.component.html @@ -1,9 +1,11 @@ <ds-item-type-badge [object]="dso"></ds-item-type-badge> <ds-truncatable [id]="dso.id" *ngIf="object !== undefined && object !== null"> - <a - [routerLink]="['/items/' + dso.id]" class="lead" - [innerHTML]="firstMetadataValue('dc.title')"></a> + <a *ngIf="linkType != linkTypes.None" [target]="(linkType == linkTypes.ExternalLink) ? '_blank' : '_self'" rel="noopener noreferrer" + [routerLink]="['/items/' + dso.id]" class="lead" + [innerHTML]="firstMetadataValue('dc.title')"></a> + <span *ngIf="linkType == linkTypes.None" class="lead" + [innerHTML]="firstMetadataValue('dc.title')"></span> <span class="text-muted"> <ds-truncatable-part [id]="dso.id" [minLines]="1"> <ng-container *ngIf="dso.firstMetadataValue('dc.publisher') || dso.firstMetadataValue('dc.date.issued')">(<span class="item-list-publisher" diff --git a/src/app/shared/object-list/search-result-list-element/item-search-result/item-types/publication/publication-search-result-list-element.component.spec.ts b/src/app/shared/object-list/search-result-list-element/item-search-result/item-types/publication/publication-search-result-list-element.component.spec.ts index 1b77c5bd85..82703f1ee0 100644 --- a/src/app/shared/object-list/search-result-list-element/item-search-result/item-types/publication/publication-search-result-list-element.component.spec.ts +++ b/src/app/shared/object-list/search-result-list-element/item-search-result/item-types/publication/publication-search-result-list-element.component.spec.ts @@ -1,73 +1,78 @@ import { async, ComponentFixture, TestBed } from '@angular/core/testing'; import { ChangeDetectionStrategy, NO_ERRORS_SCHEMA } from '@angular/core'; import { By } from '@angular/platform-browser'; -import { PublicationSearchResultListElementComponent } from './publication-list-element.component'; -import { Item } from '../../../../../core/shared/item.model'; -import { TruncatePipe } from '../../../../utils/truncate.pipe'; -import { TruncatableService } from '../../../../truncatable/truncatable.service'; -import { ITEM } from '../../../../items/switcher/listable-object-component-loader.component'; import { of as observableOf } from 'rxjs'; +import { PublicationSearchResultListElementComponent } from './publication-search-result-list-element.component'; +import { Item } from '../../../../../../core/shared/item.model'; +import { TruncatePipe } from '../../../../../utils/truncate.pipe'; +import { TruncatableService } from '../../../../../truncatable/truncatable.service'; +import { ItemSearchResult } from '../../../../../object-collection/shared/item-search-result.model'; let publicationListElementComponent: PublicationSearchResultListElementComponent; let fixture: ComponentFixture<PublicationSearchResultListElementComponent>; -const mockItemWithMetadata: Item = Object.assign(new Item(), { - bitstreams: observableOf({}), - metadata: { - 'dc.title': [ - { - language: 'en_US', - value: 'This is just another title' +const mockItemWithMetadata: ItemSearchResult = Object.assign(new ItemSearchResult(), { + indexableObject: + Object.assign(new Item(), { + bitstreams: observableOf({}), + metadata: { + 'dc.title': [ + { + language: 'en_US', + value: 'This is just another title' + } + ], + 'dc.contributor.author': [ + { + language: 'en_US', + value: 'Smith, Donald' + } + ], + 'dc.publisher': [ + { + language: 'en_US', + value: 'a publisher' + } + ], + 'dc.date.issued': [ + { + language: 'en_US', + value: '2015-06-26' + } + ], + 'dc.description.abstract': [ + { + language: 'en_US', + value: 'This is the abstract' + } + ] } - ], - 'dc.contributor.author': [ - { - language: 'en_US', - value: 'Smith, Donald' - } - ], - 'dc.publisher': [ - { - language: 'en_US', - value: 'a publisher' - } - ], - 'dc.date.issued': [ - { - language: 'en_US', - value: '2015-06-26' - } - ], - 'dc.description.abstract': [ - { - language: 'en_US', - value: 'This is the abstract' - } - ] - } + }) }); -const mockItemWithoutMetadata: Item = Object.assign(new Item(), { - bitstreams: observableOf({}), - metadata: { - 'dc.title': [ - { - language: 'en_US', - value: 'This is just another title' +const mockItemWithoutMetadata: ItemSearchResult = Object.assign(new ItemSearchResult(), { + indexableObject: + Object.assign(new Item(), { + bitstreams: observableOf({}), + metadata: { + 'dc.title': [ + { + language: 'en_US', + value: 'This is just another title' + } + ] } - ] - } + }) }); describe('PublicationListElementComponent', () => { beforeEach(async(() => { TestBed.configureTestingModule({ - declarations: [ PublicationSearchResultListElementComponent , TruncatePipe], + declarations: [PublicationSearchResultListElementComponent, TruncatePipe], providers: [ - { provide: ITEM, useValue: mockItemWithMetadata}, { provide: TruncatableService, useValue: {} } ], - schemas: [ NO_ERRORS_SCHEMA ] + schemas: [NO_ERRORS_SCHEMA] }).overrideComponent(PublicationSearchResultListElementComponent, { set: { changeDetection: ChangeDetectionStrategy.Default } }).compileComponents(); -- GitLab