diff --git a/src/app/object-list/collection-list-element/collection-list-element.component.ts b/src/app/object-list/collection-list-element/collection-list-element.component.ts index a1a76f3a97..a99e64a27f 100644 --- a/src/app/object-list/collection-list-element/collection-list-element.component.ts +++ b/src/app/object-list/collection-list-element/collection-list-element.component.ts @@ -1,4 +1,4 @@ -import { Component } from '@angular/core'; +import { Component, Inject } from '@angular/core'; import { Collection } from '../../core/shared/collection.model'; import { ObjectListElementComponent } from '../object-list-element/object-list-element.component'; @@ -11,4 +11,4 @@ import { listElementFor } from '../list-element-decorator'; }) @listElementFor(Collection) -export class CollectionListElementComponent extends ObjectListElementComponent {} +export class CollectionListElementComponent extends ObjectListElementComponent {} diff --git a/src/app/object-list/community-list-element/community-list-element.component.ts b/src/app/object-list/community-list-element/community-list-element.component.ts index 2c193e7488..c05915e8d7 100644 --- a/src/app/object-list/community-list-element/community-list-element.component.ts +++ b/src/app/object-list/community-list-element/community-list-element.component.ts @@ -1,4 +1,4 @@ -import { Component, Input } from '@angular/core'; +import { Component, Input, Inject } from '@angular/core'; import { Community } from '../../core/shared/community.model'; import { ObjectListElementComponent } from '../object-list-element/object-list-element.component'; @@ -11,4 +11,4 @@ import { listElementFor } from '../list-element-decorator'; }) @listElementFor(Community) -export class CommunityListElementComponent extends ObjectListElementComponent {} +export class CommunityListElementComponent extends ObjectListElementComponent {} diff --git a/src/app/object-list/item-list-element/item-list-element.component.ts b/src/app/object-list/item-list-element/item-list-element.component.ts index 14e4ea8b77..cc6c837bb7 100644 --- a/src/app/object-list/item-list-element/item-list-element.component.ts +++ b/src/app/object-list/item-list-element/item-list-element.component.ts @@ -1,4 +1,4 @@ -import { Component, Input } from '@angular/core'; +import { Component, Input, Inject } from '@angular/core'; import { Item } from '../../core/shared/item.model'; import { ObjectListElementComponent } from '../object-list-element/object-list-element.component'; @@ -11,4 +11,4 @@ import { listElementFor } from '../list-element-decorator'; }) @listElementFor(Item) -export class ItemListElementComponent extends ObjectListElementComponent {} +export class ItemListElementComponent extends ObjectListElementComponent {} diff --git a/src/app/object-list/list-element-decorator.ts b/src/app/object-list/list-element-decorator.ts index 37f820d77c..64a747d4a5 100644 --- a/src/app/object-list/list-element-decorator.ts +++ b/src/app/object-list/list-element-decorator.ts @@ -1,12 +1,16 @@ import { ListableObject } from './listable-object/listable-object.model'; import { GenericConstructor } from '../core/shared/generic-constructor'; -const listElementForMetadataKey = Symbol('listElementFor'); - -export function listElementFor(value: GenericConstructor) { - return Reflect.metadata(listElementForMetadataKey, value); +const listElementMap = new Map(); +export function listElementFor(listable: GenericConstructor) { + return function decorator(objectElement: any) { + if (!objectElement) { + return; + } + listElementMap.set(listable, objectElement); + }; } -export function getListElementFor(target: any) { - return Reflect.getOwnMetadata(listElementForMetadataKey, target); +export function getListElementFor(listable: GenericConstructor) { + return listElementMap.get(listable); } diff --git a/src/app/object-list/listable-object/listable-object.model.ts b/src/app/object-list/listable-object/listable-object.model.ts index 85cea9fb36..07c626cda2 100644 --- a/src/app/object-list/listable-object/listable-object.model.ts +++ b/src/app/object-list/listable-object/listable-object.model.ts @@ -1,3 +1 @@ -export interface ListableObject { - -} \ No newline at end of file +export interface ListableObject {} diff --git a/src/app/object-list/object-list-element/object-list-element.component.ts b/src/app/object-list/object-list-element/object-list-element.component.ts index 1b7ce2701e..df39a7d18d 100644 --- a/src/app/object-list/object-list-element/object-list-element.component.ts +++ b/src/app/object-list/object-list-element/object-list-element.component.ts @@ -6,8 +6,9 @@ import { ListableObject } from '../listable-object/listable-object.model'; styleUrls: ['./object-list-element.component.scss'], templateUrl: './object-list-element.component.html' }) -export class ObjectListElementComponent { - - // In the current version of Angular4, @Input is not supported by the NgComponentOutlet - instead we're using DI - constructor(@Inject('objectElementProvider') public object: ListableObject) { } +export class ObjectListElementComponent { + object: T; + public constructor(@Inject('objectElementProvider') public listable: ListableObject) { + this.object = listable as T; + } } diff --git a/src/app/object-list/search-result-list-element/collection-search-result/collection-search-result-list-element.component.html b/src/app/object-list/search-result-list-element/collection-search-result/collection-search-result-list-element.component.html new file mode 100644 index 0000000000..f35d8766b0 --- /dev/null +++ b/src/app/object-list/search-result-list-element/collection-search-result/collection-search-result-list-element.component.html @@ -0,0 +1,6 @@ + + {{dso.name}} + +
+ {{dso.shortDescription}} +
diff --git a/src/app/object-list/search-result-list-element/collection-search-result/collection-search-result-list-element.component.scss b/src/app/object-list/search-result-list-element/collection-search-result/collection-search-result-list-element.component.scss new file mode 100644 index 0000000000..88eb98509a --- /dev/null +++ b/src/app/object-list/search-result-list-element/collection-search-result/collection-search-result-list-element.component.scss @@ -0,0 +1 @@ +@import '../../../../styles/variables.scss'; \ No newline at end of file diff --git a/src/app/object-list/search-result-list-element/collection-search-result/collection-search-result-list-element.component.ts b/src/app/object-list/search-result-list-element/collection-search-result/collection-search-result-list-element.component.ts new file mode 100644 index 0000000000..327bb1d3aa --- /dev/null +++ b/src/app/object-list/search-result-list-element/collection-search-result/collection-search-result-list-element.component.ts @@ -0,0 +1,15 @@ +import { Component } from '@angular/core'; + +import { listElementFor } from '../../list-element-decorator'; +import { CollectionSearchResult } from './collection-search-result.model'; +import { SearchResultListElementComponent } from '../search-result-list-element.component'; +import { Collection } from '../../../core/shared/collection.model'; + +@Component({ + selector: 'ds-collection-search-result-list-element', + styleUrls: ['collection-search-result-list-element.component.scss'], + templateUrl: 'collection-search-result-list-element.component.html' +}) + +@listElementFor(CollectionSearchResult) +export class CollectionSearchResultListElementComponent extends SearchResultListElementComponent {} diff --git a/src/app/object-list/search-result-list-element/collection-search-result/collection-search-result.model.ts b/src/app/object-list/search-result-list-element/collection-search-result/collection-search-result.model.ts new file mode 100644 index 0000000000..081111e96c --- /dev/null +++ b/src/app/object-list/search-result-list-element/collection-search-result/collection-search-result.model.ts @@ -0,0 +1,5 @@ +import { SearchResult } from '../../../search/search-result.model'; +import { Collection } from '../../../core/shared/collection.model'; + +export class CollectionSearchResult extends SearchResult { +} diff --git a/src/app/object-list/search-result-list-element/community-search-result/community-search-result-list-element.component.html b/src/app/object-list/search-result-list-element/community-search-result/community-search-result-list-element.component.html new file mode 100644 index 0000000000..218c210be2 --- /dev/null +++ b/src/app/object-list/search-result-list-element/community-search-result/community-search-result-list-element.component.html @@ -0,0 +1,6 @@ + + {{dso.name}} + +
+ {{dso.shortDescription}} +
diff --git a/src/app/object-list/search-result-list-element/community-search-result/community-search-result-list-element.component.scss b/src/app/object-list/search-result-list-element/community-search-result/community-search-result-list-element.component.scss new file mode 100644 index 0000000000..88eb98509a --- /dev/null +++ b/src/app/object-list/search-result-list-element/community-search-result/community-search-result-list-element.component.scss @@ -0,0 +1 @@ +@import '../../../../styles/variables.scss'; \ No newline at end of file diff --git a/src/app/object-list/search-result-list-element/community-search-result/community-search-result-list-element.component.ts b/src/app/object-list/search-result-list-element/community-search-result/community-search-result-list-element.component.ts new file mode 100644 index 0000000000..602d82a6c9 --- /dev/null +++ b/src/app/object-list/search-result-list-element/community-search-result/community-search-result-list-element.component.ts @@ -0,0 +1,17 @@ +import { Component } from '@angular/core'; + +import { listElementFor } from '../../list-element-decorator'; +import { CommunitySearchResult } from './community-search-result.model'; +import { SearchResultListElementComponent } from '../search-result-list-element.component'; +import { Community } from '../../../core/shared/community.model'; + +@Component({ + selector: 'ds-community-search-result-list-element', + styleUrls: ['community-search-result-list-element.component.scss'], + templateUrl: 'community-search-result-list-element.component.html' +}) + +@listElementFor(CommunitySearchResult) +export class CommunitySearchResultListElementComponent extends SearchResultListElementComponent { + +} diff --git a/src/app/object-list/search-result-list-element/community-search-result/community-search-result.model.ts b/src/app/object-list/search-result-list-element/community-search-result/community-search-result.model.ts new file mode 100644 index 0000000000..522b41700e --- /dev/null +++ b/src/app/object-list/search-result-list-element/community-search-result/community-search-result.model.ts @@ -0,0 +1,5 @@ +import { SearchResult } from '../../../search/search-result.model'; +import { Community } from '../../../core/shared/community.model'; + +export class CommunitySearchResult extends SearchResult { +} diff --git a/src/app/object-list/search-result-list-element/item-search-result/item-search-result-list-element.component.html b/src/app/object-list/search-result-list-element/item-search-result/item-search-result-list-element.component.html new file mode 100644 index 0000000000..e963b6abbf --- /dev/null +++ b/src/app/object-list/search-result-list-element/item-search-result/item-search-result-list-element.component.html @@ -0,0 +1,14 @@ + + {{dso.findMetadata("dc.title")}} + +
+ + + {{authorMd.value}} + ; + + + ({{dso.findMetadata("dc.publisher")}}, {{dso.findMetadata("dc.date.issued")}}) + +
{{dso.findMetadata("dc.description.abstract") | dsTruncate:[200] }}
+
diff --git a/src/app/object-list/search-result-list-element/item-search-result/item-search-result-list-element.component.scss b/src/app/object-list/search-result-list-element/item-search-result/item-search-result-list-element.component.scss new file mode 100644 index 0000000000..88eb98509a --- /dev/null +++ b/src/app/object-list/search-result-list-element/item-search-result/item-search-result-list-element.component.scss @@ -0,0 +1 @@ +@import '../../../../styles/variables.scss'; \ No newline at end of file diff --git a/src/app/object-list/search-result-list-element/item-search-result/item-search-result-list-element.component.ts b/src/app/object-list/search-result-list-element/item-search-result/item-search-result-list-element.component.ts new file mode 100644 index 0000000000..4ecf0a8ff2 --- /dev/null +++ b/src/app/object-list/search-result-list-element/item-search-result/item-search-result-list-element.component.ts @@ -0,0 +1,15 @@ +import { Component } from '@angular/core'; + +import { listElementFor } from '../../list-element-decorator'; +import { ItemSearchResult } from './item-search-result.model'; +import { SearchResultListElementComponent } from '../search-result-list-element.component'; +import { Item } from '../../../core/shared/item.model'; + +@Component({ + selector: 'ds-item-search-result-list-element', + styleUrls: ['item-search-result-list-element.component.scss'], + templateUrl: 'item-search-result-list-element.component.html' +}) + +@listElementFor(ItemSearchResult) +export class ItemSearchResultListElementComponent extends SearchResultListElementComponent {} diff --git a/src/app/object-list/search-result-list-element/item-search-result/item-search-result.model.ts b/src/app/object-list/search-result-list-element/item-search-result/item-search-result.model.ts new file mode 100644 index 0000000000..dc5d282c25 --- /dev/null +++ b/src/app/object-list/search-result-list-element/item-search-result/item-search-result.model.ts @@ -0,0 +1,5 @@ +import { SearchResult } from '../../../search/search-result.model'; +import { Item } from '../../../core/shared/item.model'; + +export class ItemSearchResult extends SearchResult { +} diff --git a/src/app/object-list/search-result-list-element/search-result-list-element.component.ts b/src/app/object-list/search-result-list-element/search-result-list-element.component.ts new file mode 100644 index 0000000000..72c55b0c64 --- /dev/null +++ b/src/app/object-list/search-result-list-element/search-result-list-element.component.ts @@ -0,0 +1,19 @@ +import { Component, Inject } from '@angular/core'; + +import { ObjectListElementComponent } from '../object-list-element/object-list-element.component'; +import { ListableObject } from '../listable-object/listable-object.model'; +import { SearchResult } from '../../search/search-result.model'; +import { DSpaceObject } from '../../core/shared/dspace-object.model'; + +@Component({ + selector: 'ds-search-result-list-element', + template: `` +}) + +export class SearchResultListElementComponent, K extends DSpaceObject> extends ObjectListElementComponent { + dso: K; + public constructor(@Inject('objectElementProvider') public listable: ListableObject) { + super(listable); + this.dso = this.object.dspaceObject; + } +} diff --git a/src/app/object-list/wrapper-list-element/wrapper-list-element.component.ts b/src/app/object-list/wrapper-list-element/wrapper-list-element.component.ts index 148d4fd986..443b9681d1 100644 --- a/src/app/object-list/wrapper-list-element/wrapper-list-element.component.ts +++ b/src/app/object-list/wrapper-list-element/wrapper-list-element.component.ts @@ -1,6 +1,7 @@ import { Component, Input, Injector, ReflectiveInjector, OnInit } from '@angular/core'; import { ListableObject } from '../listable-object/listable-object.model'; import { getListElementFor } from '../list-element-decorator' +import { GenericConstructor } from '../../core/shared/generic-constructor'; @Component({ selector: 'ds-wrapper-list-element', @@ -15,11 +16,12 @@ export class WrapperListElementComponent implements OnInit { ngOnInit(): void { this.objectInjector = ReflectiveInjector.resolveAndCreate( - [{provide: 'objectElementProvider', useFactory: () => ({ providedObject: this.object }) }], this.injector); + [{provide: 'objectElementProvider', useFactory: () => (this.object) }], this.injector); } - private getListElement(): string { - return getListElementFor(this.object.constructor).constructor.name; + getListElement(): string { + const f: GenericConstructor = this.object.constructor as GenericConstructor; + return getListElementFor(f); } } diff --git a/src/app/search-page/search-page.component.ts b/src/app/search-page/search-page.component.ts index a533817a37..f37f119a4b 100644 --- a/src/app/search-page/search-page.component.ts +++ b/src/app/search-page/search-page.component.ts @@ -19,7 +19,7 @@ import { DSpaceObject } from '../core/shared/dspace-object.model'; }) export class SearchPageComponent implements OnInit { private sub; - private results: RemoteData>>; + results: RemoteData>>; constructor( private service: SearchService, diff --git a/src/app/search-page/search-page.module.ts b/src/app/search-page/search-page.module.ts index f641c8b16a..c1425340ab 100644 --- a/src/app/search-page/search-page.module.ts +++ b/src/app/search-page/search-page.module.ts @@ -9,6 +9,10 @@ import { SearchPageRoutingModule } from './search-page-routing.module'; import { SearchPageComponent } from './search-page.component'; import { SearchFormComponent } from '../shared/search-form/search-form.component'; import { SearchResultsComponent } from './search-results/search-results.compontent'; +import { SearchModule } from '../search/search.module'; +import { ItemSearchResultListElementComponent } from '../object-list/search-result-list-element/item-search-result/item-search-result-list-element.component'; +import { CollectionSearchResultListElementComponent } from '../object-list/search-result-list-element/collection-search-result/collection-search-result-list-element.component'; +import { CommunitySearchResultListElementComponent } from '../object-list/search-result-list-element/community-search-result/community-search-result-list-element.component'; @NgModule({ imports: [ @@ -17,11 +21,20 @@ import { SearchResultsComponent } from './search-results/search-results.componte TranslateModule, RouterModule, SharedModule, + SearchModule ], declarations: [ SearchPageComponent, SearchFormComponent, - SearchResultsComponent + SearchResultsComponent, + ItemSearchResultListElementComponent, + CollectionSearchResultListElementComponent, + CommunitySearchResultListElementComponent + ], + entryComponents: [ + ItemSearchResultListElementComponent, + CollectionSearchResultListElementComponent, + CommunitySearchResultListElementComponent ] }) export class SearchPageModule { } diff --git a/src/app/search-page/search-results/search-results.compontent.ts b/src/app/search-page/search-results/search-results.compontent.ts index daf5ad6c27..abb3830d74 100644 --- a/src/app/search-page/search-results/search-results.compontent.ts +++ b/src/app/search-page/search-results/search-results.compontent.ts @@ -1,5 +1,6 @@ import { Component, OnInit, Input } from '@angular/core'; import { RemoteData } from '../../core/data/remote-data'; +import { SearchResult } from '../../search/search-result.model'; import { DSpaceObject } from '../../core/shared/dspace-object.model'; /** @@ -14,7 +15,7 @@ import { DSpaceObject } from '../../core/shared/dspace-object.model'; }) export class SearchResultsComponent implements OnInit { - @Input() searchResults: RemoteData; + @Input() searchResults: RemoteData>>; ngOnInit(): void { // onInit diff --git a/src/app/search/search.service.ts b/src/app/search/search.service.ts index 5562056ad2..20b6449297 100644 --- a/src/app/search/search.service.ts +++ b/src/app/search/search.service.ts @@ -9,6 +9,7 @@ import { SearchOptions } from './search.models'; import { hasValue, isNotEmpty } from '../shared/empty.util'; import { Metadatum } from '../core/shared/metadatum.model'; import { Item } from '../core/shared/item.model'; +import { ItemSearchResult } from '../object-list/search-result-list-element/item-search-result/item-search-result.model'; @Injectable() export class SearchService { @@ -62,12 +63,12 @@ export class SearchService { elementsPerPage: returningPageInfo.elementsPerPage }); const payload = itemsRD.payload.map((items: Item[]) => { - return items.sort(()=>{ + return items.sort(() => { const values = [-1, 0, 1]; return values[Math.floor(Math.random() * values.length)]; }) .map((item: Item, index: number) => { - const mockResult: SearchResult = new SearchResult(); + const mockResult: SearchResult = new ItemSearchResult(); mockResult.dspaceObject = item; const highlight = new Metadatum(); highlight.key = 'dc.description.abstract'; diff --git a/src/app/shared/search-form/search-form.component.html b/src/app/shared/search-form/search-form.component.html index 3ab94ca338..ec310360db 100644 --- a/src/app/shared/search-form/search-form.component.html +++ b/src/app/shared/search-form/search-form.component.html @@ -1,15 +1,19 @@ -
+
-
- - +
+ + +
+
diff --git a/src/app/shared/shared.module.ts b/src/app/shared/shared.module.ts index 552ea7e3bc..756ed80561 100644 --- a/src/app/shared/shared.module.ts +++ b/src/app/shared/shared.module.ts @@ -25,6 +25,7 @@ import { CommunityListElementComponent } from '../object-list/community-list-ele import { CollectionListElementComponent } from '../object-list/collection-list-element/collection-list-element.component'; import { TruncatePipe } from './utils/truncate.pipe'; import { WrapperListElementComponent } from '../object-list/wrapper-list-element/wrapper-list-element.component'; +import { SearchResultListElementComponent } from '../object-list/search-result-list-element/search-result-list-element.component'; const MODULES = [ // Do NOT include UniversalModule, HttpModule, or JsonpModule here @@ -54,10 +55,15 @@ const COMPONENTS = [ ComcolPageLogoComponent, ObjectListComponent, ObjectListElementComponent, - WrapperListElementComponent, + WrapperListElementComponent +]; + +const ENTRY_COMPONENTS = [ + // put shared entry components (components that are created dynamically) here ItemListElementComponent, CollectionListElementComponent, - CommunityListElementComponent + CommunityListElementComponent, + SearchResultListElementComponent ]; const PROVIDERS = [ @@ -72,7 +78,8 @@ const PROVIDERS = [ ], declarations: [ ...PIPES, - ...COMPONENTS + ...COMPONENTS, + ...ENTRY_COMPONENTS ], exports: [ ...MODULES, @@ -81,6 +88,9 @@ const PROVIDERS = [ ], providers: [ ...PROVIDERS + ], + entryComponents: [ + ...ENTRY_COMPONENTS ] }) export class SharedModule {