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 eac23a9748..db2c07c63a 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,7 +3,7 @@ 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/item-type-switcher.component';
+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';
diff --git a/src/app/+item-page/simple/item-types/publication/publication.component.ts b/src/app/+item-page/simple/item-types/publication/publication.component.ts
index 5cb7734404..09319a4fa6 100644
--- a/src/app/+item-page/simple/item-types/publication/publication.component.ts
+++ b/src/app/+item-page/simple/item-types/publication/publication.component.ts
@@ -1,16 +1,14 @@
import { ChangeDetectionStrategy, Component, OnInit } from '@angular/core';
import { Observable } from 'rxjs';
import { Item } from '../../../../core/shared/item.model';
-import {
- DEFAULT_ITEM_TYPE, rendersItemType
-} from '../../../../shared/items/item-type-decorator';
import { ItemComponent } from '../shared/item.component';
import { MetadataRepresentation } from '../../../../core/shared/metadata-representation/metadata-representation.model';
import { getRelatedItemsByTypeLabel } from '../shared/item-relationships-utils';
import { ViewMode } from '../../../../core/shared/view-mode.model';
+import { DEFAULT_ITEM_TYPE, listableObjectComponent } from '../../../../shared/object-collection/shared/listable-object/listable-object.decorator';
-@rendersItemType('Publication', ViewMode.StandalonePage)
-@rendersItemType(DEFAULT_ITEM_TYPE, ViewMode.StandalonePage)
+@listableObjectComponent('Publication', ViewMode.StandalonePage)
+@listableObjectComponent(DEFAULT_ITEM_TYPE, ViewMode.StandalonePage)
@Component({
selector: 'ds-publication',
styleUrls: ['./publication.component.scss'],
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 3f525e6a25..e6880c3c90 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,7 +7,7 @@ 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/item-type-switcher.component';
+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';
diff --git a/src/app/+item-page/simple/item-types/shared/item.component.ts b/src/app/+item-page/simple/item-types/shared/item.component.ts
index 556496fe49..6ad84ffae2 100644
--- a/src/app/+item-page/simple/item-types/shared/item.component.ts
+++ b/src/app/+item-page/simple/item-types/shared/item.component.ts
@@ -8,7 +8,7 @@ import { RelationshipType } from '../../../../core/shared/item-relationships/rel
import { Relationship } from '../../../../core/shared/item-relationships/relationship.model';
import { Item } from '../../../../core/shared/item.model';
import { getRemoteDataPayload, getSucceededRemoteData } from '../../../../core/shared/operators';
-import { ITEM } from '../../../../shared/items/switcher/item-type-switcher.component';
+import { ITEM } from '../../../../shared/items/switcher/listable-object-component-loader.component';
import { MetadataRepresentation } from '../../../../core/shared/metadata-representation/metadata-representation.model';
import { ItemMetadataRepresentation } from '../../../../core/shared/metadata-representation/item/item-metadata-representation.model';
import { MetadatumRepresentation } from '../../../../core/shared/metadata-representation/metadatum/metadatum-representation.model';
diff --git a/src/app/core/shared/context.model.ts b/src/app/core/shared/context.model.ts
index 907210b2f1..a0e7f6a967 100644
--- a/src/app/core/shared/context.model.ts
+++ b/src/app/core/shared/context.model.ts
@@ -4,9 +4,9 @@
export enum Context {
Undefined = 'undefined',
- SearchList = 'searchList',
- SearchGrid = 'searchGrid',
+ ItemPage = 'itemPage',
+ Search = 'search',
Submission = 'submission',
- AdminMenuList = 'adminMenuList',
+ AdminMenu = 'adminMenu',
SubmissionModal = 'submissionModal',
}
diff --git a/src/app/entity-groups/journal-entities/item-grid-elements/journal-issue/journal-issue-grid-element.component.ts b/src/app/entity-groups/journal-entities/item-grid-elements/journal-issue/journal-issue-grid-element.component.ts
index f989e993b2..75e23de21d 100644
--- a/src/app/entity-groups/journal-entities/item-grid-elements/journal-issue/journal-issue-grid-element.component.ts
+++ b/src/app/entity-groups/journal-entities/item-grid-elements/journal-issue/journal-issue-grid-element.component.ts
@@ -1,10 +1,10 @@
-import { rendersItemType } from '../../../../shared/items/item-type-decorator';
import { Component } from '@angular/core';
import { focusShadow } from '../../../../shared/animations/focus';
import { TypedItemSearchResultGridElementComponent } from '../../../../shared/object-grid/item-grid-element/item-types/typed-item-search-result-grid-element.component';
import { ViewMode } from '../../../../core/shared/view-mode.model';
+import { listableObjectComponent } from '../../../../shared/object-collection/shared/listable-object/listable-object.decorator';
-@rendersItemType('JournalIssue', ViewMode.GridElement)
+@listableObjectComponent('JournalIssue', ViewMode.GridElement)
@Component({
selector: 'ds-journal-issue-grid-element',
styleUrls: ['./journal-issue-grid-element.component.scss'],
diff --git a/src/app/entity-groups/journal-entities/item-grid-elements/journal-volume/journal-volume-grid-element.component.ts b/src/app/entity-groups/journal-entities/item-grid-elements/journal-volume/journal-volume-grid-element.component.ts
index f4c4e8699f..35f1a6161d 100644
--- a/src/app/entity-groups/journal-entities/item-grid-elements/journal-volume/journal-volume-grid-element.component.ts
+++ b/src/app/entity-groups/journal-entities/item-grid-elements/journal-volume/journal-volume-grid-element.component.ts
@@ -1,10 +1,10 @@
-import { rendersItemType } from '../../../../shared/items/item-type-decorator';
import { Component } from '@angular/core';
import { focusShadow } from '../../../../shared/animations/focus';
import { TypedItemSearchResultGridElementComponent } from '../../../../shared/object-grid/item-grid-element/item-types/typed-item-search-result-grid-element.component';
import { ViewMode } from '../../../../core/shared/view-mode.model';
+import { listableObjectComponent } from '../../../../shared/object-collection/shared/listable-object/listable-object.decorator';
-@rendersItemType('JournalVolume', ViewMode.GridElement)
+@listableObjectComponent('JournalVolume', ViewMode.GridElement)
@Component({
selector: 'ds-journal-volume-grid-element',
styleUrls: ['./journal-volume-grid-element.component.scss'],
diff --git a/src/app/entity-groups/journal-entities/item-grid-elements/journal/journal-grid-element.component.ts b/src/app/entity-groups/journal-entities/item-grid-elements/journal/journal-grid-element.component.ts
index 4af5034a02..4596549e3a 100644
--- a/src/app/entity-groups/journal-entities/item-grid-elements/journal/journal-grid-element.component.ts
+++ b/src/app/entity-groups/journal-entities/item-grid-elements/journal/journal-grid-element.component.ts
@@ -1,10 +1,10 @@
-import { rendersItemType } from '../../../../shared/items/item-type-decorator';
import { Component } from '@angular/core';
import { focusShadow } from '../../../../shared/animations/focus';
import { TypedItemSearchResultGridElementComponent } from '../../../../shared/object-grid/item-grid-element/item-types/typed-item-search-result-grid-element.component';
import { ViewMode } from '../../../../core/shared/view-mode.model';
+import { listableObjectComponent } from '../../../../shared/object-collection/shared/listable-object/listable-object.decorator';
-@rendersItemType('Journal', ViewMode.GridElement)
+@listableObjectComponent('Journal', ViewMode.GridElement)
@Component({
selector: 'ds-journal-grid-element',
styleUrls: ['./journal-grid-element.component.scss'],
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 24498088cb..37234f8140 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
@@ -5,7 +5,7 @@ import { JournalIssueListElementComponent } from './journal-issue-list-element.c
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/item-type-switcher.component';
+import { ITEM } from '../../../../shared/items/switcher/listable-object-component-loader.component';
import { TruncatableService } from '../../../../shared/truncatable/truncatable.service';
let journalIssueListElementComponent: JournalIssueListElementComponent;
diff --git a/src/app/entity-groups/journal-entities/item-list-elements/journal-issue/journal-issue-list-element.component.ts b/src/app/entity-groups/journal-entities/item-list-elements/journal-issue/journal-issue-list-element.component.ts
index 723c4055eb..847b8a6978 100644
--- a/src/app/entity-groups/journal-entities/item-list-elements/journal-issue/journal-issue-list-element.component.ts
+++ b/src/app/entity-groups/journal-entities/item-list-elements/journal-issue/journal-issue-list-element.component.ts
@@ -1,9 +1,9 @@
import { Component } from '@angular/core';
-import { rendersItemType } from '../../../../shared/items/item-type-decorator';
import { TypedItemSearchResultListElementComponent } from '../../../../shared/object-list/item-list-element/item-types/typed-item-search-result-list-element.component';
import { ViewMode } from '../../../../core/shared/view-mode.model';
+import { listableObjectComponent } from '../../../../shared/object-collection/shared/listable-object/listable-object.decorator';
-@rendersItemType('JournalIssue', ViewMode.ListElement)
+@listableObjectComponent('JournalIssue', ViewMode.ListElement)
@Component({
selector: 'ds-journal-issue-list-element',
styleUrls: ['./journal-issue-list-element.component.scss'],
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 15f5424960..4872d47c31 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
@@ -5,7 +5,7 @@ import { JournalVolumeListElementComponent } from './journal-volume-list-element
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/item-type-switcher.component';
+import { ITEM } from '../../../../shared/items/switcher/listable-object-component-loader.component';
import { TruncatableService } from '../../../../shared/truncatable/truncatable.service';
let journalVolumeListElementComponent: JournalVolumeListElementComponent;
diff --git a/src/app/entity-groups/journal-entities/item-list-elements/journal-volume/journal-volume-list-element.component.ts b/src/app/entity-groups/journal-entities/item-list-elements/journal-volume/journal-volume-list-element.component.ts
index 272af6fca5..e1bc178b5e 100644
--- a/src/app/entity-groups/journal-entities/item-list-elements/journal-volume/journal-volume-list-element.component.ts
+++ b/src/app/entity-groups/journal-entities/item-list-elements/journal-volume/journal-volume-list-element.component.ts
@@ -1,9 +1,9 @@
import { Component } from '@angular/core';
-import { rendersItemType } from '../../../../shared/items/item-type-decorator';
import { TypedItemSearchResultListElementComponent } from '../../../../shared/object-list/item-list-element/item-types/typed-item-search-result-list-element.component';
import { ViewMode } from '../../../../core/shared/view-mode.model';
+import { listableObjectComponent } from '../../../../shared/object-collection/shared/listable-object/listable-object.decorator';
-@rendersItemType('JournalVolume', ViewMode.ListElement)
+@listableObjectComponent('JournalVolume', ViewMode.ListElement)
@Component({
selector: 'ds-journal-volume-list-element',
styleUrls: ['./journal-volume-list-element.component.scss'],
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 204672dfe9..469549821e 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
@@ -5,7 +5,7 @@ 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/item-type-switcher.component';
+import { ITEM } from '../../../../shared/items/switcher/listable-object-component-loader.component';
import { TruncatableService } from '../../../../shared/truncatable/truncatable.service';
let journalListElementComponent: JournalListElementComponent;
diff --git a/src/app/entity-groups/journal-entities/item-list-elements/journal/journal-list-element.component.ts b/src/app/entity-groups/journal-entities/item-list-elements/journal/journal-list-element.component.ts
index 93eaae57ea..05e1576219 100644
--- a/src/app/entity-groups/journal-entities/item-list-elements/journal/journal-list-element.component.ts
+++ b/src/app/entity-groups/journal-entities/item-list-elements/journal/journal-list-element.component.ts
@@ -1,9 +1,9 @@
import { Component } from '@angular/core';
-import { rendersItemType } from '../../../../shared/items/item-type-decorator';
import { TypedItemSearchResultListElementComponent } from '../../../../shared/object-list/item-list-element/item-types/typed-item-search-result-list-element.component';
import { ViewMode } from '../../../../core/shared/view-mode.model';
+import { listableObjectComponent } from '../../../../shared/object-collection/shared/listable-object/listable-object.decorator';
-@rendersItemType('Journal', ViewMode.ListElement)
+@listableObjectComponent('Journal', ViewMode.ListElement)
@Component({
selector: 'ds-journal-list-element',
styleUrls: ['./journal-list-element.component.scss'],
diff --git a/src/app/entity-groups/journal-entities/item-pages/journal-issue/journal-issue.component.ts b/src/app/entity-groups/journal-entities/item-pages/journal-issue/journal-issue.component.ts
index 0db13d8a6f..631ec64490 100644
--- a/src/app/entity-groups/journal-entities/item-pages/journal-issue/journal-issue.component.ts
+++ b/src/app/entity-groups/journal-entities/item-pages/journal-issue/journal-issue.component.ts
@@ -1,13 +1,13 @@
import { Component } from '@angular/core';
import { Observable } from 'rxjs';
import { Item } from '../../../../core/shared/item.model';
-import { rendersItemType } from '../../../../shared/items/item-type-decorator';
import { isNotEmpty } from '../../../../shared/empty.util';
import { ItemComponent } from '../../../../+item-page/simple/item-types/shared/item.component';
import { getRelatedItemsByTypeLabel } from '../../../../+item-page/simple/item-types/shared/item-relationships-utils';
import { ViewMode } from '../../../../core/shared/view-mode.model';
+import { listableObjectComponent } from '../../../../shared/object-collection/shared/listable-object/listable-object.decorator';
-@rendersItemType('JournalIssue', ViewMode.StandalonePage)
+@listableObjectComponent('JournalIssue', ViewMode.StandalonePage)
@Component({
selector: 'ds-journal-issue',
styleUrls: ['./journal-issue.component.scss'],
diff --git a/src/app/entity-groups/journal-entities/item-pages/journal-volume/journal-volume.component.ts b/src/app/entity-groups/journal-entities/item-pages/journal-volume/journal-volume.component.ts
index 6a7db84c43..72cfc103fa 100644
--- a/src/app/entity-groups/journal-entities/item-pages/journal-volume/journal-volume.component.ts
+++ b/src/app/entity-groups/journal-entities/item-pages/journal-volume/journal-volume.component.ts
@@ -1,13 +1,13 @@
import { Component } from '@angular/core';
import { Observable } from 'rxjs';
import { Item } from '../../../../core/shared/item.model';
-import { rendersItemType } from '../../../../shared/items/item-type-decorator';
import { isNotEmpty } from '../../../../shared/empty.util';
import { ItemComponent } from '../../../../+item-page/simple/item-types/shared/item.component';
import { getRelatedItemsByTypeLabel } from '../../../../+item-page/simple/item-types/shared/item-relationships-utils';
import { ViewMode } from '../../../../core/shared/view-mode.model';
+import { listableObjectComponent } from '../../../../shared/object-collection/shared/listable-object/listable-object.decorator';
-@rendersItemType('JournalVolume', ViewMode.StandalonePage)
+@listableObjectComponent('JournalVolume', ViewMode.StandalonePage)
@Component({
selector: 'ds-journal-volume',
styleUrls: ['./journal-volume.component.scss'],
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 c66c3a2462..29398befb5 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,7 +1,7 @@
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/item-type-switcher.component';
+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';
diff --git a/src/app/entity-groups/journal-entities/item-pages/journal/journal.component.ts b/src/app/entity-groups/journal-entities/item-pages/journal/journal.component.ts
index 5ac378a90b..32b2648477 100644
--- a/src/app/entity-groups/journal-entities/item-pages/journal/journal.component.ts
+++ b/src/app/entity-groups/journal-entities/item-pages/journal/journal.component.ts
@@ -1,13 +1,13 @@
import { Component } from '@angular/core';
import { Observable } from 'rxjs';
import { Item } from '../../../../core/shared/item.model';
-import { rendersItemType } from '../../../../shared/items/item-type-decorator';
import { isNotEmpty } from '../../../../shared/empty.util';
import { ItemComponent } from '../../../../+item-page/simple/item-types/shared/item.component';
import { getRelatedItemsByTypeLabel } from '../../../../+item-page/simple/item-types/shared/item-relationships-utils';
import { ViewMode } from '../../../../core/shared/view-mode.model';
+import { listableObjectComponent } from '../../../../shared/object-collection/shared/listable-object/listable-object.decorator';
-@rendersItemType('Journal', ViewMode.StandalonePage)
+@listableObjectComponent('Journal', ViewMode.StandalonePage)
@Component({
selector: 'ds-journal',
styleUrls: ['./journal.component.scss'],
diff --git a/src/app/entity-groups/research-entities/item-grid-elements/orgunit/orgunit-grid-element.component.ts b/src/app/entity-groups/research-entities/item-grid-elements/orgunit/orgunit-grid-element.component.ts
index c718d3565b..f7a13f1033 100644
--- a/src/app/entity-groups/research-entities/item-grid-elements/orgunit/orgunit-grid-element.component.ts
+++ b/src/app/entity-groups/research-entities/item-grid-elements/orgunit/orgunit-grid-element.component.ts
@@ -1,10 +1,10 @@
-import { rendersItemType } from '../../../../shared/items/item-type-decorator';
import { Component } from '@angular/core';
import { focusShadow } from '../../../../shared/animations/focus';
import { TypedItemSearchResultGridElementComponent } from '../../../../shared/object-grid/item-grid-element/item-types/typed-item-search-result-grid-element.component';
import { ViewMode } from '../../../../core/shared/view-mode.model';
+import { listableObjectComponent } from '../../../../shared/object-collection/shared/listable-object/listable-object.decorator';
-@rendersItemType('OrgUnit', ViewMode.GridElement)
+@listableObjectComponent('OrgUnit', ViewMode.GridElement)
@Component({
selector: 'ds-orgunit-grid-element',
styleUrls: ['./orgunit-grid-element.component.scss'],
diff --git a/src/app/entity-groups/research-entities/item-grid-elements/person/person-grid-element.component.ts b/src/app/entity-groups/research-entities/item-grid-elements/person/person-grid-element.component.ts
index 374ec323b4..2458d0b99d 100644
--- a/src/app/entity-groups/research-entities/item-grid-elements/person/person-grid-element.component.ts
+++ b/src/app/entity-groups/research-entities/item-grid-elements/person/person-grid-element.component.ts
@@ -1,10 +1,10 @@
-import { rendersItemType } from '../../../../shared/items/item-type-decorator';
import { Component } from '@angular/core';
import { TypedItemSearchResultGridElementComponent } from '../../../../shared/object-grid/item-grid-element/item-types/typed-item-search-result-grid-element.component';
import { focusShadow } from '../../../../shared/animations/focus';
import { ViewMode } from '../../../../core/shared/view-mode.model';
+import { listableObjectComponent } from '../../../../shared/object-collection/shared/listable-object/listable-object.decorator';
-@rendersItemType('Person', ViewMode.GridElement)
+@listableObjectComponent('Person', ViewMode.GridElement)
@Component({
selector: 'ds-person-grid-element',
styleUrls: ['./person-grid-element.component.scss'],
diff --git a/src/app/entity-groups/research-entities/item-grid-elements/project/project-grid-element.component.ts b/src/app/entity-groups/research-entities/item-grid-elements/project/project-grid-element.component.ts
index 742562cdc9..067e14bae3 100644
--- a/src/app/entity-groups/research-entities/item-grid-elements/project/project-grid-element.component.ts
+++ b/src/app/entity-groups/research-entities/item-grid-elements/project/project-grid-element.component.ts
@@ -1,10 +1,10 @@
-import { rendersItemType } from '../../../../shared/items/item-type-decorator';
import { Component } from '@angular/core';
import { focusShadow } from '../../../../shared/animations/focus';
import { TypedItemSearchResultGridElementComponent } from '../../../../shared/object-grid/item-grid-element/item-types/typed-item-search-result-grid-element.component';
import { ViewMode } from '../../../../core/shared/view-mode.model';
+import { listableObjectComponent } from '../../../../shared/object-collection/shared/listable-object/listable-object.decorator';
-@rendersItemType('Project', ViewMode.GridElement)
+@listableObjectComponent('Project', ViewMode.GridElement)
@Component({
selector: 'ds-project-grid-element',
styleUrls: ['./project-grid-element.component.scss'],
diff --git a/src/app/entity-groups/research-entities/item-list-elements/orgunit/orgunit-metadata-list-element.component.html b/src/app/entity-groups/research-entities/item-list-elements/orgunit/orgunit-item-page-list-element.component.html
similarity index 100%
rename from src/app/entity-groups/research-entities/item-list-elements/orgunit/orgunit-metadata-list-element.component.html
rename to src/app/entity-groups/research-entities/item-list-elements/orgunit/orgunit-item-page-list-element.component.html
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
new file mode 100644
index 0000000000..350ddf7ece
--- /dev/null
+++ b/src/app/entity-groups/research-entities/item-list-elements/orgunit/orgunit-item-page-list-element.component.ts
@@ -0,0 +1,16 @@
+import { Component } from '@angular/core';
+import { TypedItemSearchResultListElementComponent } from '../../../../shared/object-list/item-list-element/item-types/typed-item-search-result-list-element.component';
+import { ViewMode } from '../../../../core/shared/view-mode.model';
+import { listableObjectComponent } from '../../../../shared/object-collection/shared/listable-object/listable-object.decorator';
+import { Context } from '../../../../core/shared/context.model';
+
+@listableObjectComponent('OrgUnit', ViewMode.ListElement, Context.ItemPage)
+@Component({
+ selector: 'ds-orgunit-item-page-list-element',
+ templateUrl: './orgunit-item-page-list-element.component.html'
+})
+/**
+ * The component for displaying a list element for an item of the type OrgUnit
+ */
+export class OrgunitItemPageListElementComponent extends TypedItemSearchResultListElementComponent {
+}
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 dd2b138abb..a06ed5ac72 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
@@ -5,7 +5,7 @@ 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/item-type-switcher.component';
+import { ITEM } from '../../../../shared/items/switcher/listable-object-component-loader.component';
import { TruncatableService } from '../../../../shared/truncatable/truncatable.service';
let orgUnitListElementComponent: OrgUnitListElementComponent;
diff --git a/src/app/entity-groups/research-entities/item-list-elements/orgunit/orgunit-list-element.component.ts b/src/app/entity-groups/research-entities/item-list-elements/orgunit/orgunit-list-element.component.ts
index d302af4e84..8348a3fe35 100644
--- a/src/app/entity-groups/research-entities/item-list-elements/orgunit/orgunit-list-element.component.ts
+++ b/src/app/entity-groups/research-entities/item-list-elements/orgunit/orgunit-list-element.component.ts
@@ -1,9 +1,9 @@
import { Component } from '@angular/core';
-import { rendersItemType } from '../../../../shared/items/item-type-decorator';
import { TypedItemSearchResultListElementComponent } from '../../../../shared/object-list/item-list-element/item-types/typed-item-search-result-list-element.component';
import { ViewMode } from '../../../../core/shared/view-mode.model';
+import { listableObjectComponent } from '../../../../shared/object-collection/shared/listable-object/listable-object.decorator';
-@rendersItemType('OrgUnit', ViewMode.ListElement)
+@listableObjectComponent('OrgUnit', ViewMode.ListElement)
@Component({
selector: 'ds-orgunit-list-element',
styleUrls: ['./orgunit-list-element.component.scss'],
diff --git a/src/app/entity-groups/research-entities/item-list-elements/orgunit/orgunit-metadata-list-element.component.ts b/src/app/entity-groups/research-entities/item-list-elements/orgunit/orgunit-metadata-list-element.component.ts
deleted file mode 100644
index 4643465f06..0000000000
--- a/src/app/entity-groups/research-entities/item-list-elements/orgunit/orgunit-metadata-list-element.component.ts
+++ /dev/null
@@ -1,16 +0,0 @@
-import { Component } from '@angular/core';
-import { MetadataRepresentationType } from '../../../../core/shared/metadata-representation/metadata-representation.model';
-import { rendersItemType } from '../../../../shared/items/item-type-decorator';
-import { TypedItemSearchResultListElementComponent } from '../../../../shared/object-list/item-list-element/item-types/typed-item-search-result-list-element.component';
-import { ViewMode } from '../../../../core/shared/view-mode.model';
-
-@rendersItemType('OrgUnit', ViewMode.ListElement, MetadataRepresentationType.Item)
-@Component({
- selector: 'ds-orgunit-metadata-list-element',
- templateUrl: './orgunit-metadata-list-element.component.html'
-})
-/**
- * The component for displaying a list element for an item of the type OrgUnit
- */
-export class OrgUnitMetadataListElementComponent extends TypedItemSearchResultListElementComponent {
-}
diff --git a/src/app/entity-groups/research-entities/item-list-elements/person/person-metadata-list-element.component.html b/src/app/entity-groups/research-entities/item-list-elements/person/person-item-page-list-element.component.html
similarity index 100%
rename from src/app/entity-groups/research-entities/item-list-elements/person/person-metadata-list-element.component.html
rename to src/app/entity-groups/research-entities/item-list-elements/person/person-item-page-list-element.component.html
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
new file mode 100644
index 0000000000..2569a9cb4e
--- /dev/null
+++ b/src/app/entity-groups/research-entities/item-list-elements/person/person-item-page-list-element.component.ts
@@ -0,0 +1,16 @@
+import { Component } from '@angular/core';
+import { TypedItemSearchResultListElementComponent } from '../../../../shared/object-list/item-list-element/item-types/typed-item-search-result-list-element.component';
+import { ViewMode } from '../../../../core/shared/view-mode.model';
+import { Context } from '../../../../core/shared/context.model';
+import { listableObjectComponent } from '../../../../shared/object-collection/shared/listable-object/listable-object.decorator';
+
+@listableObjectComponent('OrgUnit', ViewMode.ListElement, Context.ItemPage)
+@Component({
+ selector: 'ds-person-item-page-list-element',
+ templateUrl: './person-item-page-list-element.component.html'
+})
+/**
+ * The component for displaying a list element for an item of the type Person
+ */
+export class PersonItemPageListElementComponent extends TypedItemSearchResultListElementComponent {
+}
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 3b6aeae45b..9553f8ea2c 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
@@ -5,7 +5,7 @@ import { PersonListElementComponent } from './person-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/item-type-switcher.component';
+import { ITEM } from '../../../../shared/items/switcher/listable-object-component-loader.component';
import { TruncatableService } from '../../../../shared/truncatable/truncatable.service';
let personListElementComponent: PersonListElementComponent;
diff --git a/src/app/entity-groups/research-entities/item-list-elements/person/person-list-element.component.ts b/src/app/entity-groups/research-entities/item-list-elements/person/person-list-element.component.ts
index 7505eec247..bd46cb1cdd 100644
--- a/src/app/entity-groups/research-entities/item-list-elements/person/person-list-element.component.ts
+++ b/src/app/entity-groups/research-entities/item-list-elements/person/person-list-element.component.ts
@@ -1,9 +1,9 @@
import { Component } from '@angular/core';
-import { rendersItemType } from '../../../../shared/items/item-type-decorator';
import { TypedItemSearchResultListElementComponent } from '../../../../shared/object-list/item-list-element/item-types/typed-item-search-result-list-element.component';
import { ViewMode } from '../../../../core/shared/view-mode.model';
+import { listableObjectComponent } from '../../../../shared/object-collection/shared/listable-object/listable-object.decorator';
-@rendersItemType('Person', ViewMode.ListElement)
+@listableObjectComponent('Person', ViewMode.ListElement)
@Component({
selector: 'ds-person-list-element',
styleUrls: ['./person-list-element.component.scss'],
diff --git a/src/app/entity-groups/research-entities/item-list-elements/person/person-metadata-list-element.component.ts b/src/app/entity-groups/research-entities/item-list-elements/person/person-metadata-list-element.component.ts
deleted file mode 100644
index c60a29e41e..0000000000
--- a/src/app/entity-groups/research-entities/item-list-elements/person/person-metadata-list-element.component.ts
+++ /dev/null
@@ -1,16 +0,0 @@
-import { Component } from '@angular/core';
-import { rendersItemType } from '../../../../shared/items/item-type-decorator';
-import { MetadataRepresentationType } from '../../../../core/shared/metadata-representation/metadata-representation.model';
-import { TypedItemSearchResultListElementComponent } from '../../../../shared/object-list/item-list-element/item-types/typed-item-search-result-list-element.component';
-import { ViewMode } from '../../../../core/shared/view-mode.model';
-
-@rendersItemType('Person', ViewMode.ListElement, MetadataRepresentationType.Item)
-@Component({
- selector: 'ds-person-metadata-list-element',
- templateUrl: './person-metadata-list-element.component.html'
-})
-/**
- * The component for displaying a list element for an item of the type Person
- */
-export class PersonMetadataListElementComponent extends TypedItemSearchResultListElementComponent {
-}
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 02dc3f6d73..0c171ae9ba 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
@@ -5,7 +5,7 @@ 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/item-type-switcher.component';
+import { ITEM } from '../../../../shared/items/switcher/listable-object-component-loader.component';
import { TruncatableService } from '../../../../shared/truncatable/truncatable.service';
let projectListElementComponent: ProjectListElementComponent;
diff --git a/src/app/entity-groups/research-entities/item-list-elements/project/project-list-element.component.ts b/src/app/entity-groups/research-entities/item-list-elements/project/project-list-element.component.ts
index d8765aa254..d6b0dbfbce 100644
--- a/src/app/entity-groups/research-entities/item-list-elements/project/project-list-element.component.ts
+++ b/src/app/entity-groups/research-entities/item-list-elements/project/project-list-element.component.ts
@@ -1,9 +1,9 @@
import { Component } from '@angular/core';
-import { rendersItemType } from '../../../../shared/items/item-type-decorator';
import { TypedItemSearchResultListElementComponent } from '../../../../shared/object-list/item-list-element/item-types/typed-item-search-result-list-element.component';
-import { ViewMode } from '../../../../core/shared/view-mode.model';
+import { metadataRepresentationComponent } from '../../../../shared/metadata-representation/metadata-representation.decorator';
+import { MetadataRepresentationType } from '../../../../core/shared/metadata-representation/metadata-representation.model';
-@rendersItemType('Project', ViewMode.ListElement)
+@metadataRepresentationComponent('Project', MetadataRepresentationType.PlainText)
@Component({
selector: 'ds-project-list-element',
styleUrls: ['./project-list-element.component.scss'],
diff --git a/src/app/entity-groups/research-entities/item-pages/orgunit/orgunit.component.ts b/src/app/entity-groups/research-entities/item-pages/orgunit/orgunit.component.ts
index 10c210edd0..164388547c 100644
--- a/src/app/entity-groups/research-entities/item-pages/orgunit/orgunit.component.ts
+++ b/src/app/entity-groups/research-entities/item-pages/orgunit/orgunit.component.ts
@@ -1,13 +1,13 @@
import { Component, OnInit } from '@angular/core';
import { Observable } from 'rxjs';
import { Item } from '../../../../core/shared/item.model';
-import { rendersItemType } from '../../../../shared/items/item-type-decorator';
import { isNotEmpty } from '../../../../shared/empty.util';
import { ItemComponent } from '../../../../+item-page/simple/item-types/shared/item.component';
import { getRelatedItemsByTypeLabel } from '../../../../+item-page/simple/item-types/shared/item-relationships-utils';
import { ViewMode } from '../../../../core/shared/view-mode.model';
+import { listableObjectComponent } from '../../../../shared/object-collection/shared/listable-object/listable-object.decorator';
-@rendersItemType('OrgUnit', ViewMode.StandalonePage)
+@listableObjectComponent('OrgUnit', ViewMode.StandalonePage)
@Component({
selector: 'ds-orgunit',
styleUrls: ['./orgunit.component.scss'],
diff --git a/src/app/entity-groups/research-entities/item-pages/person/person.component.ts b/src/app/entity-groups/research-entities/item-pages/person/person.component.ts
index 6a61a9cf4a..4783a7548e 100644
--- a/src/app/entity-groups/research-entities/item-pages/person/person.component.ts
+++ b/src/app/entity-groups/research-entities/item-pages/person/person.component.ts
@@ -1,15 +1,15 @@
import { Component, Inject } from '@angular/core';
import { Observable , of as observableOf } from 'rxjs';
import { Item } from '../../../../core/shared/item.model';
-import { rendersItemType } from '../../../../shared/items/item-type-decorator';
-import { ITEM } from '../../../../shared/items/switcher/item-type-switcher.component';
+import { ITEM } from '../../../../shared/items/switcher/listable-object-component-loader.component';
import { SearchFixedFilterService } from '../../../../+search-page/search-filters/search-filter/search-fixed-filter.service';
import { isNotEmpty } from '../../../../shared/empty.util';
import { ItemComponent } from '../../../../+item-page/simple/item-types/shared/item.component';
import { getRelatedItemsByTypeLabel } from '../../../../+item-page/simple/item-types/shared/item-relationships-utils';
import { ViewMode } from '../../../../core/shared/view-mode.model';
+import { listableObjectComponent } from '../../../../shared/object-collection/shared/listable-object/listable-object.decorator';
-@rendersItemType('Person', ViewMode.StandalonePage)
+@listableObjectComponent('Person', ViewMode.StandalonePage)
@Component({
selector: 'ds-person',
styleUrls: ['./person.component.scss'],
diff --git a/src/app/entity-groups/research-entities/item-pages/project/project.component.ts b/src/app/entity-groups/research-entities/item-pages/project/project.component.ts
index cc995c79e4..776e38e7f4 100644
--- a/src/app/entity-groups/research-entities/item-pages/project/project.component.ts
+++ b/src/app/entity-groups/research-entities/item-pages/project/project.component.ts
@@ -2,13 +2,13 @@ import { Component, OnInit } from '@angular/core';
import { Observable } from 'rxjs';
import { Item } from '../../../../core/shared/item.model';
import { MetadataRepresentation } from '../../../../core/shared/metadata-representation/metadata-representation.model';
-import { rendersItemType } from '../../../../shared/items/item-type-decorator';
import { isNotEmpty } from '../../../../shared/empty.util';
import { ItemComponent } from '../../../../+item-page/simple/item-types/shared/item.component';
import { getRelatedItemsByTypeLabel } from '../../../../+item-page/simple/item-types/shared/item-relationships-utils';
import { ViewMode } from '../../../../core/shared/view-mode.model';
+import { listableObjectComponent } from '../../../../shared/object-collection/shared/listable-object/listable-object.decorator';
-@rendersItemType('Project', ViewMode.StandalonePage)
+@listableObjectComponent('Project', ViewMode.StandalonePage)
@Component({
selector: 'ds-project',
styleUrls: ['./project.component.scss'],
diff --git a/src/app/entity-groups/research-entities/research-entities.module.ts b/src/app/entity-groups/research-entities/research-entities.module.ts
index 099fa2a6a3..1f6e477097 100644
--- a/src/app/entity-groups/research-entities/research-entities.module.ts
+++ b/src/app/entity-groups/research-entities/research-entities.module.ts
@@ -6,8 +6,8 @@ import { OrgunitComponent } from './item-pages/orgunit/orgunit.component';
import { PersonComponent } from './item-pages/person/person.component';
import { ProjectComponent } from './item-pages/project/project.component';
import { OrgUnitListElementComponent } from './item-list-elements/orgunit/orgunit-list-element.component';
-import { OrgUnitMetadataListElementComponent } from './item-list-elements/orgunit/orgunit-metadata-list-element.component';
-import { PersonMetadataListElementComponent } from './item-list-elements/person/person-metadata-list-element.component';
+import { OrgunitItemPageListElementComponent } from './item-list-elements/orgunit/orgunit-item-page-list-element.component';
+import { PersonItemPageListElementComponent } from './item-list-elements/person/person-item-page-list-element.component';
import { PersonListElementComponent } from './item-list-elements/person/person-list-element.component';
import { ProjectListElementComponent } from './item-list-elements/project/project-list-element.component';
import { TooltipModule } from 'ngx-bootstrap';
@@ -20,9 +20,9 @@ const ENTRY_COMPONENTS = [
PersonComponent,
ProjectComponent,
OrgUnitListElementComponent,
- OrgUnitMetadataListElementComponent,
+ OrgunitItemPageListElementComponent,
PersonListElementComponent,
- PersonMetadataListElementComponent,
+ PersonItemPageListElementComponent,
ProjectListElementComponent,
PersonGridElementComponent,
OrgunitGridElementComponent,
diff --git a/src/app/shared/items/item-type-decorator.ts b/src/app/shared/items/item-type-decorator.ts
deleted file mode 100644
index e6c7c18150..0000000000
--- a/src/app/shared/items/item-type-decorator.ts
+++ /dev/null
@@ -1,40 +0,0 @@
-import { hasNoValue, hasValue } from '../empty.util';
-import { ViewMode } from '../../core/shared/view-mode.model';
-
-export const DEFAULT_ITEM_TYPE = 'Default';
-export const DEFAULT_VIEW_MODE = ViewMode.ListElement;
-
-
-const map = new Map();
-
-/**
- * Decorator used for rendering simple item pages by type and viewMode (and optionally a representationType)
- * @param type
- * @param viewMode
- */
-export function rendersItemType(type: string, viewMode: string) {
- return function decorator(component: any) {
- if (hasNoValue(map.get(viewMode))) {
- map.set(viewMode, new Map());
- }
- if (hasValue(map.get(viewMode).get(type))) {
- throw new Error(`There can't be more than one component to render Metadata of type "${type}" in view mode "${viewMode}"`);
- }
- map.get(viewMode).set(type, component);
- };
-}
-
-/**
- * Get the component used for rendering an item by type and viewMode (and optionally a representationType)
- * @param type
- * @param viewMode
- */
-export function getComponentByItemType(type: string, viewMode: string) {
- if (hasNoValue(map.get(viewMode))) {
- viewMode = DEFAULT_VIEW_MODE;
- }
- if (hasNoValue(map.get(viewMode).get(type))) {
- type = DEFAULT_ITEM_TYPE;
- }
- return map.get(viewMode).get(type);
-}
diff --git a/src/app/shared/items/switcher/item-type-switcher.component.html b/src/app/shared/items/switcher/item-type-switcher.component.html
deleted file mode 100644
index f2ea5784fc..0000000000
--- a/src/app/shared/items/switcher/item-type-switcher.component.html
+++ /dev/null
@@ -1 +0,0 @@
-
diff --git a/src/app/shared/items/switcher/item-type-switcher.component.scss b/src/app/shared/items/switcher/item-type-switcher.component.scss
deleted file mode 100644
index 45a533cd01..0000000000
--- a/src/app/shared/items/switcher/item-type-switcher.component.scss
+++ /dev/null
@@ -1 +0,0 @@
-@import '../../../../styles/variables';
diff --git a/src/app/shared/items/switcher/item-type-switcher.component.ts b/src/app/shared/items/switcher/item-type-switcher.component.ts
deleted file mode 100644
index 0f31b10c7a..0000000000
--- a/src/app/shared/items/switcher/item-type-switcher.component.ts
+++ /dev/null
@@ -1,64 +0,0 @@
-import { Component, InjectionToken, Injector, Input, OnInit } from '@angular/core';
-import { SearchResult } from '../../../+search-page/search-result.model';
-import { Item } from '../../../core/shared/item.model';
-import { hasValue } from '../../empty.util';
-import { ItemSearchResult } from '../../object-collection/shared/item-search-result.model';
-import { getComponentByItemType } from '../item-type-decorator';
-import { MetadataRepresentation } from '../../../core/shared/metadata-representation/metadata-representation.model';
-
-export const ITEM: InjectionToken = new InjectionToken('item');
-
-@Component({
- selector: 'ds-item-type-switcher',
- styleUrls: ['./item-type-switcher.component.scss'],
- templateUrl: './item-type-switcher.component.html'
-})
-/**
- * Component for determining what component to use depending on the item's relationship type (relationship.type)
- */
-export class ItemTypeSwitcherComponent implements OnInit {
- /**
- * The item or metadata to determine the component for
- */
- @Input() object: Item | SearchResult- ;
-
- /**
- * The preferred view-mode to display
- */
- @Input() viewMode: string;
-
- /**
- * The object injector used to inject the item into the child component
- */
- objectInjector: Injector;
-
- component: any;
-
- constructor(private injector: Injector) {
- }
-
- ngOnInit(): void {
- this.objectInjector = Injector.create({
- providers: [{ provide: ITEM, useFactory: () => this.object, deps:[] }],
- parent: this.injector
- });
- this.component = this.getComponent();
- }
-
- /**
- * Fetch the component depending on the item's relationship type
- * @returns {string}
- */
- private getComponent(): string {
- let item: Item;
- if (hasValue((this.object as any).indexableObject)) {
- const searchResult = this.object as ItemSearchResult;
- item = searchResult.indexableObject;
- } else {
- item = this.object as Item;
- }
-
- const type = item.firstMetadataValue('relationship.type');
- return getComponentByItemType(type, this.viewMode);
- }
-}
diff --git a/src/app/shared/metadata-representation/metadata-representation-loader.component.html b/src/app/shared/metadata-representation/metadata-representation-loader.component.html
new file mode 100644
index 0000000000..3979c238ad
--- /dev/null
+++ b/src/app/shared/metadata-representation/metadata-representation-loader.component.html
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/app/shared/metadata-representation/metadata-representation-loader.component.ts b/src/app/shared/metadata-representation/metadata-representation-loader.component.ts
index e69de29bb2..ba3f6ed00b 100644
--- a/src/app/shared/metadata-representation/metadata-representation-loader.component.ts
+++ b/src/app/shared/metadata-representation/metadata-representation-loader.component.ts
@@ -0,0 +1,45 @@
+import { Component, ComponentFactoryResolver, InjectionToken, Injector, Input, OnInit, ViewChild } from '@angular/core';
+import { MetadataRepresentation } from '../../core/shared/metadata-representation/metadata-representation.model';
+import { getMetadataRepresentationComponent } from './metadata-representation.decorator';
+import { Context } from '../../core/shared/context.model';
+import { GenericConstructor } from '../../core/shared/generic-constructor';
+import { MetadataRepresentationListElementComponent } from '../object-list/metadata-representation-list-element/metadata-representation-list-element.component';
+import { MetadataRepresentationDirective } from './metadata-representation.directive';
+
+@Component({
+ selector: 'ds-metadata-representation-loader',
+ // styleUrls: ['./metadata-representation-loader.component.scss'],
+ templateUrl: './metadata-representation-loader.component.html'
+})
+/**
+ * Component for determining what component to use depending on the item's relationship type (relationship.type)
+ */
+export class MetadataRepresentationLoaderComponent implements OnInit {
+ /**
+ * The item or metadata to determine the component for
+ */
+ @Input() mdRepresentation: MetadataRepresentation;
+ @Input() context: Context;
+ @ViewChild(MetadataRepresentationDirective) mdRepDirective: MetadataRepresentationDirective;
+
+ constructor(private componentFactoryResolver: ComponentFactoryResolver) {
+ }
+
+ ngOnInit(): void {
+ const componentFactory = this.componentFactoryResolver.resolveComponentFactory(this.getComponent());
+
+ const viewContainerRef = this.mdRepDirective.viewContainerRef;
+ viewContainerRef.clear();
+
+ const componentRef = viewContainerRef.createComponent(componentFactory);
+ (componentRef.instance).metadataRepresentation = this.mdRepresentation;
+ }
+
+ /**
+ * Fetch the component depending on the item's relationship type
+ * @returns {string}
+ */
+ private getComponent(): GenericConstructor {
+ return getMetadataRepresentationComponent(this.mdRepresentation.itemType, this.mdRepresentation.representationType, this.context);
+ }
+}
diff --git a/src/app/shared/metadata-representation/metadata-representation.decorator.ts b/src/app/shared/metadata-representation/metadata-representation.decorator.ts
index 0eee4f6d2f..42495fec81 100644
--- a/src/app/shared/metadata-representation/metadata-representation.decorator.ts
+++ b/src/app/shared/metadata-representation/metadata-representation.decorator.ts
@@ -1,7 +1,7 @@
import { MetadataRepresentationType } from '../../core/shared/metadata-representation/metadata-representation.model';
import { hasNoValue, hasValue } from '../empty.util';
import { Context } from '../../core/shared/context.model';
-import { DEFAULT_ITEM_TYPE } from '../items/item-type-decorator';
+import { DEFAULT_ITEM_TYPE } from '../object-collection/shared/listable-object/listable-object.decorator';
const map = new Map();
@@ -26,19 +26,18 @@ export function metadataRepresentationComponent(entityType: string, mdRepresenta
}
export function getMetadataRepresentationComponent(entityType: string, mdRepresentationType: MetadataRepresentationType, context: Context = DEFAULT_CONTEXT) {
- if (hasNoValue(entityType) || hasNoValue(map.get(entityType))) {
- entityType = DEFAULT_ITEM_TYPE;
+ const mapForEntity = map.get(entityType);
+ if (hasValue(mapForEntity)) {
+ const entityAndMDRepMap = mapForEntity.get(mdRepresentationType);
+ if (hasValue(entityAndMDRepMap)) {
+ if (hasValue(entityAndMDRepMap.get(context))) {
+ return entityAndMDRepMap.get(context);
+ }
+ if (hasValue(entityAndMDRepMap.get(DEFAULT_CONTEXT))) {
+ return entityAndMDRepMap.get(DEFAULT_CONTEXT);
+ }
+ }
+ return mapForEntity.get(DEFAULT_REPRESENTATION_TYPE).get(DEFAULT_CONTEXT);
}
-
- if (hasNoValue(map.get(entityType).get(mdRepresentationType))) {
- mdRepresentationType = DEFAULT_REPRESENTATION_TYPE;
- }
-
- let representationComponent = map.get(entityType).get(mdRepresentationType).get(context);
-
- if (hasNoValue(representationComponent)) {
- representationComponent = map.get(entityType).get(mdRepresentationType).get(DEFAULT_REPRESENTATION_TYPE);
- }
-
- return representationComponent;
+ return map.get(DEFAULT_ITEM_TYPE).get(DEFAULT_REPRESENTATION_TYPE).get(DEFAULT_CONTEXT);
}
\ No newline at end of file
diff --git a/src/app/shared/metadata-representation/metadata-representation.directive.ts b/src/app/shared/metadata-representation/metadata-representation.directive.ts
new file mode 100644
index 0000000000..c57d1ef4ac
--- /dev/null
+++ b/src/app/shared/metadata-representation/metadata-representation.directive.ts
@@ -0,0 +1,8 @@
+import { Directive, ViewContainerRef } from '@angular/core';
+
+@Directive({
+ selector: '[dsMetadataRepresentation]',
+})
+export class MetadataRepresentationDirective {
+ constructor(public viewContainerRef: ViewContainerRef) { }
+}
\ No newline at end of file
diff --git a/src/app/shared/object-collection/shared/dso-element-decorator.spec.ts b/src/app/shared/object-collection/shared/dso-element-decorator.spec.ts
deleted file mode 100644
index 836ddf727d..0000000000
--- a/src/app/shared/object-collection/shared/dso-element-decorator.spec.ts
+++ /dev/null
@@ -1,16 +0,0 @@
-import { renderElementsFor } from './dso-element-decorator';
-import { Item } from '../../../core/shared/item.model';
-import { ViewMode } from '../../../core/shared/view-mode.model';
-
-describe('ElementDecorator', () => {
- const gridDecorator = renderElementsFor(Item, ViewMode.GridElement);
- const listDecorator = renderElementsFor(Item, ViewMode.ListElement);
- it('should have a decorator for both list and grid', () => {
- expect(listDecorator.length).not.toBeNull();
- expect(gridDecorator.length).not.toBeNull();
- });
- it('should have 2 separate decorators for grid and list', () => {
- expect(listDecorator).not.toEqual(gridDecorator);
- });
-
-});
diff --git a/src/app/shared/object-collection/shared/dso-element-decorator.ts b/src/app/shared/object-collection/shared/dso-element-decorator.ts
deleted file mode 100644
index 98650fd25b..0000000000
--- a/src/app/shared/object-collection/shared/dso-element-decorator.ts
+++ /dev/null
@@ -1,20 +0,0 @@
-import { GenericConstructor } from '../../../core/shared/generic-constructor';
-import { ListableObject } from './listable-object.model';
-import { ViewMode } from '../../../core/shared/view-mode.model';
-
-const dsoElementMap = new Map();
-export function renderElementsFor(listable: GenericConstructor, viewMode: ViewMode) {
- return function decorator(objectElement: any) {
- if (!objectElement) {
- return;
- }
- if (!dsoElementMap.get(viewMode)) {
- dsoElementMap.set(viewMode, new Map());
- }
- dsoElementMap.get(viewMode).set(listable, objectElement);
- };
-}
-
-export function rendersDSOType(listable: GenericConstructor, viewMode: ViewMode) {
- return dsoElementMap.get(viewMode).get(listable);
-}
diff --git a/src/app/shared/object-collection/shared/listable-object/listable-object-component-loader.component.html b/src/app/shared/object-collection/shared/listable-object/listable-object-component-loader.component.html
new file mode 100644
index 0000000000..d41303d462
--- /dev/null
+++ b/src/app/shared/object-collection/shared/listable-object/listable-object-component-loader.component.html
@@ -0,0 +1 @@
+
diff --git a/src/app/shared/items/switcher/item-type-switcher.component.spec.ts b/src/app/shared/object-collection/shared/listable-object/listable-object-component-loader.component.spec.ts
similarity index 88%
rename from src/app/shared/items/switcher/item-type-switcher.component.spec.ts
rename to src/app/shared/object-collection/shared/listable-object/listable-object-component-loader.component.spec.ts
index c564c72564..d10ee1a0dd 100644
--- a/src/app/shared/items/switcher/item-type-switcher.component.spec.ts
+++ b/src/app/shared/object-collection/shared/listable-object/listable-object-component-loader.component.spec.ts
@@ -1,4 +1,4 @@
-import { ItemTypeSwitcherComponent } from './item-type-switcher.component';
+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';
@@ -33,18 +33,18 @@ const mockItemMetadataRepresentation = Object.assign(new ItemMetadataRepresentat
let viewMode = ViewMode.StandalonePage;
describe('ItemTypeSwitcherComponent', () => {
- let comp: ItemTypeSwitcherComponent;
- let fixture: ComponentFixture;
+ let comp: ListableObjectComponentLoaderComponent;
+ let fixture: ComponentFixture;
beforeEach(async(() => {
TestBed.configureTestingModule({
- declarations: [ ItemTypeSwitcherComponent ],
+ declarations: [ ListableObjectComponentLoaderComponent ],
schemas: [ NO_ERRORS_SCHEMA ]
}).compileComponents(); // compile template and css
}));
beforeEach(async(() => {
- fixture = TestBed.createComponent(ItemTypeSwitcherComponent);
+ fixture = TestBed.createComponent(ListableObjectComponentLoaderComponent);
comp = fixture.componentInstance;
comp.object = mockItem;
comp.viewMode = viewMode;
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
new file mode 100644
index 0000000000..17c860e04b
--- /dev/null
+++ b/src/app/shared/object-collection/shared/listable-object/listable-object-component-loader.component.ts
@@ -0,0 +1,43 @@
+import { Component, InjectionToken, Injector, Input, OnInit } from '@angular/core';
+import { ListableObject } from '../listable-object.model';
+import { ViewMode } from '../../../../core/shared/view-mode.model';
+import { Context } from '../../../../core/shared/context.model';
+import { hasValue } from '../../../empty.util';
+import { getListableObjectComponent } from './listable-object.decorator';
+
+@Component({
+ selector: 'ds-listable-object-component-loader',
+ styleUrls: ['./listable-object-component-loader.component.scss'],
+ templateUrl: './listable-object-component-loader.component.html'
+})
+/**
+ * Component for determining what component to use depending on the item's relationship type (relationship.type)
+ */
+export class ListableObjectComponentLoaderComponent implements OnInit {
+ /**
+ * The item or metadata to determine the component for
+ */
+ @Input() object: ListableObject;
+
+ /**
+ * The preferred view-mode to display
+ */
+ @Input() viewMode: ViewMode;
+
+ @Input() context: Context;
+
+ constructor(private injector: Injector) {
+ }
+
+ ngOnInit(): void {
+
+ }
+
+ /**
+ * Fetch the component depending on the item's relationship type
+ * @returns {string}
+ */
+ private getComponent(): string {
+ return getListableObjectComponent(this.object, this.viewMode);
+ }
+}
diff --git a/src/app/shared/object-collection/shared/listable-object/listable-object.decorator.spec.ts b/src/app/shared/object-collection/shared/listable-object/listable-object.decorator.spec.ts
new file mode 100644
index 0000000000..c628378c6f
--- /dev/null
+++ b/src/app/shared/object-collection/shared/listable-object/listable-object.decorator.spec.ts
@@ -0,0 +1,16 @@
+import { Item } from '../../../../core/shared/item.model';
+import { ViewMode } from '../../../../core/shared/view-mode.model';
+import { listableObjectComponent } from './listable-object.decorator';
+
+describe('ElementDecorator', () => {
+ const gridDecorator = listableObjectComponent(Item, ViewMode.GridElement);
+ const listDecorator = listableObjectComponent(Item, ViewMode.ListElement);
+ it('should have a decorator for both list and grid', () => {
+ expect(listDecorator.length).not.toBeNull();
+ expect(gridDecorator.length).not.toBeNull();
+ });
+ it('should have 2 separate decorators for grid and list', () => {
+ expect(listDecorator).not.toEqual(gridDecorator);
+ });
+
+});
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
new file mode 100644
index 0000000000..2e30c0b761
--- /dev/null
+++ b/src/app/shared/object-collection/shared/listable-object/listable-object.decorator.ts
@@ -0,0 +1,50 @@
+import { ViewMode } from '../../../../core/shared/view-mode.model';
+import { GenericConstructor } from '../../../../core/shared/generic-constructor';
+import { ListableObject } from '../listable-object.model';
+import { Context } from '../../../../core/shared/context.model';
+import { hasNoValue, hasValue } from '../../../empty.util';
+import { DEFAULT_CONTEXT } from '../../../metadata-representation/metadata-representation.decorator';
+
+export const DEFAULT_ITEM_TYPE = 'Default';
+export const DEFAULT_VIEW_MODE = ViewMode.ListElement;
+
+
+const listElementMap = new Map();
+
+/**
+ * Decorator used for rendering simple item pages by type and viewMode (and optionally a representationType)
+ * @param type
+ * @param viewMode
+ */
+export function listableObjectComponent(objectType: GenericConstructor | string, viewMode: ViewMode, context: Context = DEFAULT_CONTEXT) {
+ return function decorator(component: any) {
+ if (hasNoValue(objectType)) {
+ return;
+ }
+ if (hasNoValue(listElementMap.get(objectType))) {
+ listElementMap.set(objectType, new Map());
+ }
+ if (hasNoValue(listElementMap.get(objectType).get(viewMode))) {
+ listElementMap.get(objectType).set(viewMode, new Map());
+ }
+ listElementMap.get(objectType).get(viewMode).set(context, component);
+ };
+}
+
+
+export function getListableObjectComponent(entityType: GenericConstructor | string, viewMode: ViewMode, context: Context = DEFAULT_CONTEXT) {
+ const mapForType = listElementMap.get(entityType);
+ if (hasValue(mapForType)) {
+ const typeAndMDRepMap = mapForType.get(viewMode);
+ if (hasValue(typeAndMDRepMap)) {
+ if (hasValue(typeAndMDRepMap.get(context))) {
+ return typeAndMDRepMap.get(context);
+ }
+ if (hasValue(typeAndMDRepMap.get(DEFAULT_CONTEXT))) {
+ return typeAndMDRepMap.get(DEFAULT_CONTEXT);
+ }
+ }
+ return mapForType.get(DEFAULT_VIEW_MODE).get(DEFAULT_CONTEXT);
+ }
+ return listElementMap.get(DEFAULT_ITEM_TYPE).get(DEFAULT_VIEW_MODE).get(DEFAULT_CONTEXT);
+}
\ No newline at end of file
diff --git a/src/app/shared/object-collection/shared/listable-object/listable-object.directive.ts b/src/app/shared/object-collection/shared/listable-object/listable-object.directive.ts
new file mode 100644
index 0000000000..3b0decd7bd
--- /dev/null
+++ b/src/app/shared/object-collection/shared/listable-object/listable-object.directive.ts
@@ -0,0 +1,8 @@
+import { Directive, ViewContainerRef } from '@angular/core';
+
+@Directive({
+ selector: '[dsListableObject]',
+})
+export class ListableObjectDirective {
+ constructor(public viewContainerRef: ViewContainerRef) { }
+}
\ No newline at end of file
diff --git a/src/app/shared/object-detail/my-dspace-result-detail-element/claimed-my-dspace-result/claimed-my-dspace-result-detail-element.component.ts b/src/app/shared/object-detail/my-dspace-result-detail-element/claimed-my-dspace-result/claimed-my-dspace-result-detail-element.component.ts
index 83222e8e20..4e947a496f 100644
--- a/src/app/shared/object-detail/my-dspace-result-detail-element/claimed-my-dspace-result/claimed-my-dspace-result-detail-element.component.ts
+++ b/src/app/shared/object-detail/my-dspace-result-detail-element/claimed-my-dspace-result/claimed-my-dspace-result-detail-element.component.ts
@@ -3,7 +3,6 @@ import { Component, Inject } from '@angular/core';
import { Observable } from 'rxjs';
import { find } from 'rxjs/operators';
-import { renderElementsFor } from '../../../object-collection/shared/dso-element-decorator';
import { RemoteData } from '../../../../core/data/remote-data';
import { ViewMode } from '../../../../core/shared/view-mode.model';
import { isNotUndefined } from '../../../empty.util';
@@ -13,6 +12,7 @@ import { ClaimedTask } from '../../../../core/tasks/models/claimed-task-object.m
import { ClaimedTaskMyDSpaceResult } from '../../../object-collection/shared/claimed-task-my-dspace-result.model';
import { MyDSpaceResultDetailElementComponent } from '../my-dspace-result-detail-element.component';
import { MyDspaceItemStatusType } from '../../../object-collection/shared/mydspace-item-status/my-dspace-item-status-type';
+import { listableObjectComponent } from '../../../object-collection/shared/listable-object/listable-object.decorator';
/**
* This component renders claimed task object for the mydspace result in the detail view.
@@ -23,8 +23,8 @@ import { MyDspaceItemStatusType } from '../../../object-collection/shared/mydspa
templateUrl: './claimed-my-dspace-result-detail-element.component.html'
})
-@renderElementsFor(ClaimedTaskMyDSpaceResult, ViewMode.DetailedListElement)
-@renderElementsFor(ClaimedTask, ViewMode.DetailedListElement)
+@listableObjectComponent(ClaimedTaskMyDSpaceResult, ViewMode.DetailedListElement)
+@listableObjectComponent(ClaimedTask, ViewMode.DetailedListElement)
export class ClaimedMyDSpaceResultDetailElementComponent extends MyDSpaceResultDetailElementComponent {
/**
diff --git a/src/app/shared/object-detail/my-dspace-result-detail-element/item-my-dspace-result/item-my-dspace-result-detail-element.component.ts b/src/app/shared/object-detail/my-dspace-result-detail-element/item-my-dspace-result/item-my-dspace-result-detail-element.component.ts
index 51bc44a6ac..2b50dd0819 100644
--- a/src/app/shared/object-detail/my-dspace-result-detail-element/item-my-dspace-result/item-my-dspace-result-detail-element.component.ts
+++ b/src/app/shared/object-detail/my-dspace-result-detail-element/item-my-dspace-result/item-my-dspace-result-detail-element.component.ts
@@ -1,11 +1,11 @@
import { Component } from '@angular/core';
-import { renderElementsFor } from '../../../object-collection/shared/dso-element-decorator';
import { ViewMode } from '../../../../core/shared/view-mode.model';
import { Item } from '../../../../core/shared/item.model';
import { ItemMyDSpaceResult } from '../../../object-collection/shared/item-my-dspace-result.model';
import { MyDSpaceResultDetailElementComponent } from '../my-dspace-result-detail-element.component';
import { MyDspaceItemStatusType } from '../../../object-collection/shared/mydspace-item-status/my-dspace-item-status-type';
+import { listableObjectComponent } from '../../../object-collection/shared/listable-object/listable-object.decorator';
/**
* This component renders item object for the mydspace result in the detail view.
@@ -16,7 +16,7 @@ import { MyDspaceItemStatusType } from '../../../object-collection/shared/mydspa
templateUrl: './item-my-dspace-result-detail-element.component.html'
})
-@renderElementsFor(ItemMyDSpaceResult, ViewMode.DetailedListElement)
+@listableObjectComponent(ItemMyDSpaceResult, ViewMode.DetailedListElement)
export class ItemMyDSpaceResultDetailElementComponent extends MyDSpaceResultDetailElementComponent {
/**
diff --git a/src/app/shared/object-detail/my-dspace-result-detail-element/pool-my-dspace-result/pool-my-dspace-result-detail-element.component.ts b/src/app/shared/object-detail/my-dspace-result-detail-element/pool-my-dspace-result/pool-my-dspace-result-detail-element.component.ts
index 7dffac9630..16e96cf412 100644
--- a/src/app/shared/object-detail/my-dspace-result-detail-element/pool-my-dspace-result/pool-my-dspace-result-detail-element.component.ts
+++ b/src/app/shared/object-detail/my-dspace-result-detail-element/pool-my-dspace-result/pool-my-dspace-result-detail-element.component.ts
@@ -2,7 +2,6 @@ import { Component, Inject } from '@angular/core';
import { Observable } from 'rxjs';
import { find } from 'rxjs/operators';
-import { renderElementsFor } from '../../../object-collection/shared/dso-element-decorator';
import { RemoteData } from '../../../../core/data/remote-data';
import { isNotUndefined } from '../../../empty.util';
import { ListableObject } from '../../../object-collection/shared/listable-object.model';
@@ -12,6 +11,7 @@ import { MyDSpaceResultDetailElementComponent } from '../my-dspace-result-detail
import { MyDspaceItemStatusType } from '../../../object-collection/shared/mydspace-item-status/my-dspace-item-status-type';
import { WorkflowItem } from '../../../../core/submission/models/workflowitem.model';
import { ViewMode } from '../../../../core/shared/view-mode.model';
+import { listableObjectComponent } from '../../../object-collection/shared/listable-object/listable-object.decorator';
/**
* This component renders pool task object for the mydspace result in the detail view.
@@ -22,8 +22,8 @@ import { ViewMode } from '../../../../core/shared/view-mode.model';
templateUrl: './pool-my-dspace-result-detail-element.component.html',
})
-@renderElementsFor(PoolTaskMyDSpaceResult, ViewMode.DetailedListElement)
-@renderElementsFor(PoolTask, ViewMode.DetailedListElement)
+@listableObjectComponent(PoolTaskMyDSpaceResult, ViewMode.DetailedListElement)
+@listableObjectComponent(PoolTask, ViewMode.DetailedListElement)
export class PoolMyDSpaceResultDetailElementComponent extends MyDSpaceResultDetailElementComponent {
/**
diff --git a/src/app/shared/object-detail/my-dspace-result-detail-element/workflowitem-my-dspace-result/workflowitem-my-dspace-result-detail-element.component.ts b/src/app/shared/object-detail/my-dspace-result-detail-element/workflowitem-my-dspace-result/workflowitem-my-dspace-result-detail-element.component.ts
index 10890d9635..a8c2e5555f 100644
--- a/src/app/shared/object-detail/my-dspace-result-detail-element/workflowitem-my-dspace-result/workflowitem-my-dspace-result-detail-element.component.ts
+++ b/src/app/shared/object-detail/my-dspace-result-detail-element/workflowitem-my-dspace-result/workflowitem-my-dspace-result-detail-element.component.ts
@@ -1,6 +1,5 @@
import { Component, Inject } from '@angular/core';
-import { renderElementsFor } from '../../../object-collection/shared/dso-element-decorator';
import { ViewMode } from '../../../../core/shared/view-mode.model';
import { Item } from '../../../../core/shared/item.model';
import { ListableObject } from '../../../object-collection/shared/listable-object.model';
@@ -12,6 +11,7 @@ import { Observable } from 'rxjs/internal/Observable';
import { RemoteData } from '../../../../core/data/remote-data';
import { find } from 'rxjs/operators';
import { isNotUndefined } from '../../../empty.util';
+import { listableObjectComponent } from '../../../object-collection/shared/listable-object/listable-object.decorator';
/**
* This component renders workflowitem object for the mydspace result in the detail view.
@@ -22,8 +22,8 @@ import { isNotUndefined } from '../../../empty.util';
templateUrl: './workflowitem-my-dspace-result-detail-element.component.html',
})
-@renderElementsFor(WorkflowitemMyDSpaceResult, ViewMode.DetailedListElement)
-@renderElementsFor(WorkflowItem, ViewMode.DetailedListElement)
+@listableObjectComponent(WorkflowitemMyDSpaceResult, ViewMode.DetailedListElement)
+@listableObjectComponent(WorkflowItem, ViewMode.DetailedListElement)
export class WorkflowitemMyDSpaceResultDetailElementComponent extends MyDSpaceResultDetailElementComponent {
/**
diff --git a/src/app/shared/object-detail/my-dspace-result-detail-element/workspaceitem-my-dspace-result/workspaceitem-my-dspace-result-detail-element.component.ts b/src/app/shared/object-detail/my-dspace-result-detail-element/workspaceitem-my-dspace-result/workspaceitem-my-dspace-result-detail-element.component.ts
index 72b68e4e92..0415715c44 100644
--- a/src/app/shared/object-detail/my-dspace-result-detail-element/workspaceitem-my-dspace-result/workspaceitem-my-dspace-result-detail-element.component.ts
+++ b/src/app/shared/object-detail/my-dspace-result-detail-element/workspaceitem-my-dspace-result/workspaceitem-my-dspace-result-detail-element.component.ts
@@ -3,7 +3,6 @@ import { Component, Inject } from '@angular/core';
import { Observable } from 'rxjs';
import { find } from 'rxjs/operators';
-import { renderElementsFor } from '../../../object-collection/shared/dso-element-decorator';
import {
WorkspaceItem
} from '../../../../core/submission/models/workspaceitem.model';
@@ -15,6 +14,7 @@ import { ListableObject } from '../../../object-collection/shared/listable-objec
import { MyDSpaceResultDetailElementComponent } from '../my-dspace-result-detail-element.component';
import { MyDspaceItemStatusType } from '../../../object-collection/shared/mydspace-item-status/my-dspace-item-status-type';
import { ViewMode } from '../../../../core/shared/view-mode.model';
+import { listableObjectComponent } from '../../../object-collection/shared/listable-object/listable-object.decorator';
/**
* This component renders workspaceitem object for the mydspace result in the detail view.
@@ -25,8 +25,8 @@ import { ViewMode } from '../../../../core/shared/view-mode.model';
templateUrl: './workspaceitem-my-dspace-result-detail-element.component.html',
})
-@renderElementsFor(WorkspaceitemMyDSpaceResult, ViewMode.DetailedListElement)
-@renderElementsFor(WorkspaceItem, ViewMode.DetailedListElement)
+@listableObjectComponent(WorkspaceitemMyDSpaceResult, ViewMode.DetailedListElement)
+@listableObjectComponent(WorkspaceItem, ViewMode.DetailedListElement)
export class WorkspaceitemMyDSpaceResultDetailElementComponent extends MyDSpaceResultDetailElementComponent {
/**
diff --git a/src/app/shared/object-detail/wrapper-detail-element/wrapper-detail-element.component.html b/src/app/shared/object-detail/wrapper-detail-element/wrapper-detail-element.component.html
deleted file mode 100644
index ef7254b97c..0000000000
--- a/src/app/shared/object-detail/wrapper-detail-element/wrapper-detail-element.component.html
+++ /dev/null
@@ -1 +0,0 @@
-
diff --git a/src/app/shared/object-detail/wrapper-detail-element/wrapper-detail-element.component.scss b/src/app/shared/object-detail/wrapper-detail-element/wrapper-detail-element.component.scss
deleted file mode 100644
index 51a7fc6a55..0000000000
--- a/src/app/shared/object-detail/wrapper-detail-element/wrapper-detail-element.component.scss
+++ /dev/null
@@ -1,2 +0,0 @@
-@import '../../../../styles/variables';
-
diff --git a/src/app/shared/object-detail/wrapper-detail-element/wrapper-detail-element.component.spec.ts b/src/app/shared/object-detail/wrapper-detail-element/wrapper-detail-element.component.spec.ts
deleted file mode 100644
index e54ae58398..0000000000
--- a/src/app/shared/object-detail/wrapper-detail-element/wrapper-detail-element.component.spec.ts
+++ /dev/null
@@ -1,44 +0,0 @@
-import { async, ComponentFixture, TestBed } from '@angular/core/testing';
-import { NO_ERRORS_SCHEMA } from '@angular/core';
-import { By } from '@angular/platform-browser';
-import { ActivatedRoute, Router } from '@angular/router';
-
-import { of as observableOf } from 'rxjs';
-
-import { RouterStub } from '../../testing/router-stub';
-import { WrapperDetailElementComponent } from './wrapper-detail-element.component';
-
-let wrapperDetailElementComponent: WrapperDetailElementComponent;
-let fixture: ComponentFixture;
-const queryParam = 'test query';
-const scopeParam = '7669c72a-3f2a-451f-a3b9-9210e7a4c02f';
-const activatedRouteStub = {
- queryParams: observableOf({
- query: queryParam,
- scope: scopeParam
- })
-};
-
-describe('WrapperDetailElementComponent', () => {
- beforeEach(async(() => {
- TestBed.configureTestingModule({
- declarations: [ WrapperDetailElementComponent ],
- providers: [
- { provide: ActivatedRoute, useValue: activatedRouteStub },
- { provide: Router, useClass: RouterStub },
- { provide: 'objectElementProvider', useFactory: (WrapperDetailElementComponent)}
- ],
-
- schemas: [ NO_ERRORS_SCHEMA ]
- }).compileComponents(); // compile template and css
- }));
-
- beforeEach(async(() => {
- fixture = TestBed.createComponent(WrapperDetailElementComponent);
- wrapperDetailElementComponent = fixture.componentInstance;
- }));
-
- it('should show the wrapper element containing the detail object',() => {
- expect(fixture.debugElement.query(By.css('ds-workspaceitem-my-dspace-result-detail-element'))).toBeDefined();
- })
-});
diff --git a/src/app/shared/object-detail/wrapper-detail-element/wrapper-detail-element.component.ts b/src/app/shared/object-detail/wrapper-detail-element/wrapper-detail-element.component.ts
deleted file mode 100644
index 5b48d4069f..0000000000
--- a/src/app/shared/object-detail/wrapper-detail-element/wrapper-detail-element.component.ts
+++ /dev/null
@@ -1,56 +0,0 @@
-import { Component, Injector, Input, OnInit } from '@angular/core';
-
-import { ViewMode } from '../../../core/shared/view-mode.model';
-import { GenericConstructor } from '../../../core/shared/generic-constructor';
-import { rendersDSOType } from '../../object-collection/shared/dso-element-decorator';
-import { ListableObject } from '../../object-collection/shared/listable-object.model';
-
-/**
- * This component renders a wrapper for an object in the detail view.
- */
-@Component({
- selector: 'ds-wrapper-detail-element',
- styleUrls: ['./wrapper-detail-element.component.scss'],
- templateUrl: './wrapper-detail-element.component.html'
-})
-export class WrapperDetailElementComponent implements OnInit {
-
- /**
- * The listable object.
- */
- @Input() object: ListableObject;
-
- /**
- * The instance of the injector.
- */
- objectInjector: Injector;
-
- detailElement: any;
-
- /**
- * Initialize instance variables
- *
- * @param {Injector} injector
- */
- constructor(private injector: Injector) {
- }
-
- /**
- * Initialize injector
- */
- ngOnInit(): void {
- this.objectInjector = Injector.create({
- providers: [{ provide: 'objectElementProvider', useFactory: () => (this.object), deps:[] }],
- parent: this.injector
- });
- this.detailElement = this.getDetailElement();
- }
-
- /**
- * Return class name for the object to inject
- */
- private getDetailElement(): string {
- const f: GenericConstructor = this.object.constructor as GenericConstructor;
- return rendersDSOType(f, ViewMode.DetailedListElement);
- }
-}
diff --git a/src/app/shared/object-grid/collection-grid-element/collection-grid-element.component.ts b/src/app/shared/object-grid/collection-grid-element/collection-grid-element.component.ts
index c142e4d13e..1261cd6dfd 100644
--- a/src/app/shared/object-grid/collection-grid-element/collection-grid-element.component.ts
+++ b/src/app/shared/object-grid/collection-grid-element/collection-grid-element.component.ts
@@ -1,9 +1,9 @@
import { Component, Inject } from '@angular/core';
import { Collection } from '../../../core/shared/collection.model';
-import { renderElementsFor} from '../../object-collection/shared/dso-element-decorator';
import { AbstractListableElementComponent } from '../../object-collection/shared/object-collection-element/abstract-listable-element.component';
import { ViewMode } from '../../../core/shared/view-mode.model';
+import { listableObjectComponent } from '../../object-collection/shared/listable-object/listable-object.decorator';
@Component({
selector: 'ds-collection-grid-element',
@@ -11,5 +11,5 @@ import { ViewMode } from '../../../core/shared/view-mode.model';
templateUrl: './collection-grid-element.component.html'
})
-@renderElementsFor(Collection, ViewMode.GridElement)
+@listableObjectComponent(Collection, ViewMode.GridElement)
export class CollectionGridElementComponent extends AbstractListableElementComponent {}
diff --git a/src/app/shared/object-grid/community-grid-element/community-grid-element.component.ts b/src/app/shared/object-grid/community-grid-element/community-grid-element.component.ts
index 773b862784..67d4ac663c 100644
--- a/src/app/shared/object-grid/community-grid-element/community-grid-element.component.ts
+++ b/src/app/shared/object-grid/community-grid-element/community-grid-element.component.ts
@@ -2,8 +2,8 @@ import { Component } from '@angular/core';
import { Community } from '../../../core/shared/community.model';
import { AbstractListableElementComponent } from '../../object-collection/shared/object-collection-element/abstract-listable-element.component';
-import { renderElementsFor } from '../../object-collection/shared/dso-element-decorator';
import { ViewMode } from '../../../core/shared/view-mode.model';
+import { listableObjectComponent } from '../../object-collection/shared/listable-object/listable-object.decorator';
@Component({
selector: 'ds-community-grid-element',
@@ -11,5 +11,5 @@ import { ViewMode } from '../../../core/shared/view-mode.model';
templateUrl: './community-grid-element.component.html'
})
-@renderElementsFor(Community, ViewMode.GridElement)
+@listableObjectComponent(Community, ViewMode.GridElement)
export class CommunityGridElementComponent extends AbstractListableElementComponent {}
diff --git a/src/app/shared/object-grid/item-grid-element/item-grid-element.component.ts b/src/app/shared/object-grid/item-grid-element/item-grid-element.component.ts
index 3e083fb973..e146370752 100644
--- a/src/app/shared/object-grid/item-grid-element/item-grid-element.component.ts
+++ b/src/app/shared/object-grid/item-grid-element/item-grid-element.component.ts
@@ -1,9 +1,9 @@
-import { Component, Input, Inject } from '@angular/core';
+import { Component } from '@angular/core';
import { Item } from '../../../core/shared/item.model';
-import { renderElementsFor} from '../../object-collection/shared/dso-element-decorator';
import { AbstractListableElementComponent } from '../../object-collection/shared/object-collection-element/abstract-listable-element.component';
import { ViewMode } from '../../../core/shared/view-mode.model';
+import { listableObjectComponent } from '../../object-collection/shared/listable-object/listable-object.decorator';
@Component({
selector: 'ds-item-grid-element',
@@ -11,5 +11,5 @@ import { ViewMode } from '../../../core/shared/view-mode.model';
templateUrl: './item-grid-element.component.html'
})
-@renderElementsFor(Item, ViewMode.GridElement)
+@listableObjectComponent(Item, ViewMode.GridElement)
export class ItemGridElementComponent extends AbstractListableElementComponent
- {}
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 e0ba26fcfc..3d0b80932d 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,7 +8,7 @@ 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/item-type-switcher.component';
+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';
diff --git a/src/app/shared/object-grid/item-grid-element/item-types/publication/publication-grid-element.component.ts b/src/app/shared/object-grid/item-grid-element/item-types/publication/publication-grid-element.component.ts
index 63f5148aec..f99810ea69 100644
--- a/src/app/shared/object-grid/item-grid-element/item-types/publication/publication-grid-element.component.ts
+++ b/src/app/shared/object-grid/item-grid-element/item-types/publication/publication-grid-element.component.ts
@@ -1,11 +1,11 @@
import { TypedItemSearchResultGridElementComponent } from '../typed-item-search-result-grid-element.component';
-import { DEFAULT_ITEM_TYPE, rendersItemType } from '../../../../items/item-type-decorator';
import { Component } from '@angular/core';
import { focusShadow } from '../../../../animations/focus';
import { ViewMode } from '../../../../../core/shared/view-mode.model';
+import { DEFAULT_ITEM_TYPE, listableObjectComponent } from '../../../../object-collection/shared/listable-object/listable-object.decorator';
-@rendersItemType('Publication', ViewMode.GridElement)
-@rendersItemType(DEFAULT_ITEM_TYPE, ViewMode.GridElement)
+@listableObjectComponent('Publication', ViewMode.GridElement)
+@listableObjectComponent(DEFAULT_ITEM_TYPE, ViewMode.GridElement)
@Component({
selector: 'ds-publication-grid-element',
styleUrls: ['./publication-grid-element.component.scss'],
diff --git a/src/app/shared/object-grid/item-grid-element/item-types/typed-item-search-result-grid-element.component.spec.ts b/src/app/shared/object-grid/item-grid-element/item-types/typed-item-search-result-grid-element.component.spec.ts
index e4ace8d0b2..8035ec623f 100644
--- a/src/app/shared/object-grid/item-grid-element/item-types/typed-item-search-result-grid-element.component.spec.ts
+++ b/src/app/shared/object-grid/item-grid-element/item-types/typed-item-search-result-grid-element.component.spec.ts
@@ -6,7 +6,7 @@ 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 { ITEM } from '../../../items/switcher/item-type-switcher.component';
+import { ITEM } from '../../../items/switcher/listable-object-component-loader.component';
import { ItemSearchResult } from '../../../object-collection/shared/item-search-result.model';
import { createRelationshipsObservable } from '../../../../+item-page/simple/item-types/shared/item.component.spec';
import { of as observableOf } from 'rxjs';
diff --git a/src/app/shared/object-grid/item-grid-element/item-types/typed-item-search-result-grid-element.component.ts b/src/app/shared/object-grid/item-grid-element/item-types/typed-item-search-result-grid-element.component.ts
index f4f470c052..3e19b34c04 100644
--- a/src/app/shared/object-grid/item-grid-element/item-types/typed-item-search-result-grid-element.component.ts
+++ b/src/app/shared/object-grid/item-grid-element/item-types/typed-item-search-result-grid-element.component.ts
@@ -3,7 +3,7 @@ import { Item } from '../../../../core/shared/item.model';
import { SearchResultGridElementComponent } from '../../search-result-grid-element/search-result-grid-element.component';
import { TruncatableService } from '../../../truncatable/truncatable.service';
import { Component, Inject } from '@angular/core';
-import { ITEM } from '../../../items/switcher/item-type-switcher.component';
+import { ITEM } from '../../../items/switcher/listable-object-component-loader.component';
import { hasValue } from '../../../empty.util';
import { MetadataMap } from '../../../../core/shared/metadata.models';
diff --git a/src/app/shared/object-grid/search-result-grid-element/collection-search-result/collection-search-result-grid-element.component.ts b/src/app/shared/object-grid/search-result-grid-element/collection-search-result/collection-search-result-grid-element.component.ts
index e61e5375b3..1d0f47b70b 100644
--- a/src/app/shared/object-grid/search-result-grid-element/collection-search-result/collection-search-result-grid-element.component.ts
+++ b/src/app/shared/object-grid/search-result-grid-element/collection-search-result/collection-search-result-grid-element.component.ts
@@ -1,10 +1,10 @@
import { Component } from '@angular/core';
-import { renderElementsFor} from '../../../object-collection/shared/dso-element-decorator';
import { SearchResultGridElementComponent } from '../search-result-grid-element.component';
import { Collection } from '../../../../core/shared/collection.model';
import { CollectionSearchResult } from '../../../object-collection/shared/collection-search-result.model';
import { ViewMode } from '../../../../core/shared/view-mode.model';
+import { listableObjectComponent } from '../../../object-collection/shared/listable-object/listable-object.decorator';
@Component({
selector: 'ds-collection-search-result-grid-element',
@@ -12,5 +12,5 @@ import { ViewMode } from '../../../../core/shared/view-mode.model';
templateUrl: 'collection-search-result-grid-element.component.html'
})
-@renderElementsFor(CollectionSearchResult, ViewMode.GridElement)
+@listableObjectComponent(CollectionSearchResult, ViewMode.GridElement)
export class CollectionSearchResultGridElementComponent extends SearchResultGridElementComponent {}
diff --git a/src/app/shared/object-grid/search-result-grid-element/community-search-result/community-search-result-grid-element.component.ts b/src/app/shared/object-grid/search-result-grid-element/community-search-result/community-search-result-grid-element.component.ts
index 66c7b11983..806e6a44e3 100644
--- a/src/app/shared/object-grid/search-result-grid-element/community-search-result/community-search-result-grid-element.component.ts
+++ b/src/app/shared/object-grid/search-result-grid-element/community-search-result/community-search-result-grid-element.component.ts
@@ -1,9 +1,9 @@
import { Component } from '@angular/core';
import { Community } from '../../../../core/shared/community.model';
-import { renderElementsFor } from '../../../object-collection/shared/dso-element-decorator';
import { SearchResultGridElementComponent } from '../search-result-grid-element.component';
import { CommunitySearchResult } from '../../../object-collection/shared/community-search-result.model';
import { ViewMode } from '../../../../core/shared/view-mode.model';
+import { listableObjectComponent } from '../../../object-collection/shared/listable-object/listable-object.decorator';
@Component({
selector: 'ds-community-search-result-grid-element',
@@ -11,7 +11,7 @@ import { ViewMode } from '../../../../core/shared/view-mode.model';
templateUrl: 'community-search-result-grid-element.component.html'
})
-@renderElementsFor(CommunitySearchResult, ViewMode.GridElement)
+@listableObjectComponent(CommunitySearchResult, ViewMode.GridElement)
export class CommunitySearchResultGridElementComponent extends SearchResultGridElementComponent {
}
diff --git a/src/app/shared/object-grid/search-result-grid-element/item-search-result/item-search-result-grid-element.component.ts b/src/app/shared/object-grid/search-result-grid-element/item-search-result/item-search-result-grid-element.component.ts
index cb10d0b2db..f90a9f6799 100644
--- a/src/app/shared/object-grid/search-result-grid-element/item-search-result/item-search-result-grid-element.component.ts
+++ b/src/app/shared/object-grid/search-result-grid-element/item-search-result/item-search-result-grid-element.component.ts
@@ -1,11 +1,11 @@
import { Component } from '@angular/core';
-import { renderElementsFor } from '../../../object-collection/shared/dso-element-decorator';
import { SearchResultGridElementComponent } from '../search-result-grid-element.component';
import { Item } from '../../../../core/shared/item.model';
import { ItemSearchResult } from '../../../object-collection/shared/item-search-result.model';
import { focusShadow } from '../../../animations/focus';
import { ViewMode } from '../../../../core/shared/view-mode.model';
+import { listableObjectComponent } from '../../../object-collection/shared/listable-object/listable-object.decorator';
@Component({
selector: 'ds-item-search-result-grid-element',
@@ -14,7 +14,7 @@ import { ViewMode } from '../../../../core/shared/view-mode.model';
animations: [focusShadow],
})
-@renderElementsFor(ItemSearchResult, ViewMode.GridElement)
+@listableObjectComponent(ItemSearchResult, ViewMode.GridElement)
export class ItemSearchResultGridElementComponent extends SearchResultGridElementComponent {
viewMode = ViewMode.GridElement;
-}
+}
\ No newline at end of file
diff --git a/src/app/shared/object-grid/wrapper-grid-element/wrapper-grid-element.component.html b/src/app/shared/object-grid/wrapper-grid-element/wrapper-grid-element.component.html
deleted file mode 100644
index d6fd1cf9aa..0000000000
--- a/src/app/shared/object-grid/wrapper-grid-element/wrapper-grid-element.component.html
+++ /dev/null
@@ -1 +0,0 @@
-
diff --git a/src/app/shared/object-grid/wrapper-grid-element/wrapper-grid-element.component.scss b/src/app/shared/object-grid/wrapper-grid-element/wrapper-grid-element.component.scss
deleted file mode 100644
index 8b13789179..0000000000
--- a/src/app/shared/object-grid/wrapper-grid-element/wrapper-grid-element.component.scss
+++ /dev/null
@@ -1 +0,0 @@
-
diff --git a/src/app/shared/object-grid/wrapper-grid-element/wrapper-grid-element.component.spec.ts b/src/app/shared/object-grid/wrapper-grid-element/wrapper-grid-element.component.spec.ts
deleted file mode 100644
index 0a78c97209..0000000000
--- a/src/app/shared/object-grid/wrapper-grid-element/wrapper-grid-element.component.spec.ts
+++ /dev/null
@@ -1,43 +0,0 @@
-import { WrapperGridElementComponent } from './wrapper-grid-element.component';
-import { async, ComponentFixture, TestBed } from '@angular/core/testing';
-import { of as observableOf } from 'rxjs';
-import { ActivatedRoute, Router } from '@angular/router';
-import { RouterStub } from '../../testing/router-stub';
-import { NO_ERRORS_SCHEMA } from '@angular/core';
-import { By } from '@angular/platform-browser';
-
-let wrapperGridElementComponent: WrapperGridElementComponent;
-let fixture: ComponentFixture;
-const queryParam = 'test query';
-const scopeParam = '7669c72a-3f2a-451f-a3b9-9210e7a4c02f';
-const activatedRouteStub = {
- queryParams: observableOf({
- query: queryParam,
- scope: scopeParam
- })
-};
-
-describe('WrapperGridElementComponent', () => {
- beforeEach(async(() => {
- TestBed.configureTestingModule({
- declarations: [ WrapperGridElementComponent ],
- providers: [
- { provide: ActivatedRoute, useValue: activatedRouteStub },
- { provide: Router, useClass: RouterStub },
- { provide: 'objectElementProvider', useFactory: (wrapperGridElementComponent)}
- ],
-
- schemas: [ NO_ERRORS_SCHEMA ]
- }).compileComponents(); // compile template and css
- }));
-
- beforeEach(async(() => {
- fixture = TestBed.createComponent(WrapperGridElementComponent);
- wrapperGridElementComponent = fixture.componentInstance;
-
- }));
-
- it('should show the wrapper element containing the cards',() => {
- expect(fixture.debugElement.query(By.css('ds-collection-grid-element'))).toBeDefined();
- })
-})
diff --git a/src/app/shared/object-grid/wrapper-grid-element/wrapper-grid-element.component.ts b/src/app/shared/object-grid/wrapper-grid-element/wrapper-grid-element.component.ts
deleted file mode 100644
index 2bd1e8bfc8..0000000000
--- a/src/app/shared/object-grid/wrapper-grid-element/wrapper-grid-element.component.ts
+++ /dev/null
@@ -1,32 +0,0 @@
-import { Component, Injector, Input, OnInit } from '@angular/core';
-import { GenericConstructor } from '../../../core/shared/generic-constructor';
-import { rendersDSOType } from '../../object-collection/shared/dso-element-decorator';
-import { ListableObject } from '../../object-collection/shared/listable-object.model';
-import { ViewMode } from '../../../core/shared/view-mode.model';
-
-@Component({
- selector: 'ds-wrapper-grid-element',
- styleUrls: ['./wrapper-grid-element.component.scss'],
- templateUrl: './wrapper-grid-element.component.html'
-})
-export class WrapperGridElementComponent implements OnInit {
- @Input() object: ListableObject;
- objectInjector: Injector;
- gridElement: any;
-
- constructor(private injector: Injector) {
- }
-
- ngOnInit(): void {
- this.objectInjector = Injector.create({
- providers: [{ provide: 'objectElementProvider', useFactory: () => (this.object), deps:[] }],
- parent: this.injector
- });
- this.gridElement = this.getGridElement();
- }
-
- getGridElement(): string {
- const f: GenericConstructor = this.object.constructor as GenericConstructor;
- return rendersDSOType(f, ViewMode.GridElement);
- }
-}
diff --git a/src/app/shared/object-list/browse-entry-list-element/browse-entry-list-element.component.ts b/src/app/shared/object-list/browse-entry-list-element/browse-entry-list-element.component.ts
index 8732637228..2ebfc2713e 100644
--- a/src/app/shared/object-list/browse-entry-list-element/browse-entry-list-element.component.ts
+++ b/src/app/shared/object-list/browse-entry-list-element/browse-entry-list-element.component.ts
@@ -1,9 +1,9 @@
import { Component, Input, Inject } from '@angular/core';
import { AbstractListableElementComponent } from '../../object-collection/shared/object-collection-element/abstract-listable-element.component';
-import { renderElementsFor } from '../../object-collection/shared/dso-element-decorator';
import { BrowseEntry } from '../../../core/shared/browse-entry.model';
import { ViewMode } from '../../../core/shared/view-mode.model';
+import { listableObjectComponent } from '../../object-collection/shared/listable-object/listable-object.decorator';
@Component({
selector: 'ds-browse-entry-list-element',
@@ -14,5 +14,5 @@ import { ViewMode } from '../../../core/shared/view-mode.model';
/**
* This component is automatically used to create a list view for BrowseEntry objects when used in ObjectCollectionComponent
*/
-@renderElementsFor(BrowseEntry, ViewMode.ListElement)
+@listableObjectComponent(BrowseEntry, ViewMode.ListElement)
export class BrowseEntryListElementComponent extends AbstractListableElementComponent {}
diff --git a/src/app/shared/object-list/collection-list-element/collection-list-element.component.ts b/src/app/shared/object-list/collection-list-element/collection-list-element.component.ts
index d4d46fdd69..685a990409 100644
--- a/src/app/shared/object-list/collection-list-element/collection-list-element.component.ts
+++ b/src/app/shared/object-list/collection-list-element/collection-list-element.component.ts
@@ -1,9 +1,9 @@
import { Component, Inject } from '@angular/core';
import { Collection } from '../../../core/shared/collection.model';
-import { renderElementsFor } from '../../object-collection/shared/dso-element-decorator';
import { AbstractListableElementComponent } from '../../object-collection/shared/object-collection-element/abstract-listable-element.component';
import { ViewMode } from '../../../core/shared/view-mode.model';
+import { listableObjectComponent } from '../../object-collection/shared/listable-object/listable-object.decorator';
@Component({
selector: 'ds-collection-list-element',
@@ -11,5 +11,5 @@ import { ViewMode } from '../../../core/shared/view-mode.model';
templateUrl: './collection-list-element.component.html'
})
-@renderElementsFor(Collection, ViewMode.ListElement)
+@listableObjectComponent(Collection, ViewMode.ListElement)
export class CollectionListElementComponent extends AbstractListableElementComponent {}
diff --git a/src/app/shared/object-list/community-list-element/community-list-element.component.ts b/src/app/shared/object-list/community-list-element/community-list-element.component.ts
index c23d35b961..4581c2c0da 100644
--- a/src/app/shared/object-list/community-list-element/community-list-element.component.ts
+++ b/src/app/shared/object-list/community-list-element/community-list-element.component.ts
@@ -2,8 +2,8 @@ import { Component, Input, Inject } from '@angular/core';
import { Community } from '../../../core/shared/community.model';
import { AbstractListableElementComponent } from '../../object-collection/shared/object-collection-element/abstract-listable-element.component';
-import { renderElementsFor } from '../../object-collection/shared/dso-element-decorator';
import { ViewMode } from '../../../core/shared/view-mode.model';
+import { listableObjectComponent } from '../../object-collection/shared/listable-object/listable-object.decorator';
@Component({
selector: 'ds-community-list-element',
@@ -11,5 +11,5 @@ import { ViewMode } from '../../../core/shared/view-mode.model';
templateUrl: './community-list-element.component.html'
})
-@renderElementsFor(Community, ViewMode.ListElement)
+@listableObjectComponent(Community, ViewMode.ListElement)
export class CommunityListElementComponent extends AbstractListableElementComponent {}
diff --git a/src/app/shared/object-list/item-list-element/item-list-element.component.ts b/src/app/shared/object-list/item-list-element/item-list-element.component.ts
index 3428c3f68d..e41a92f36d 100644
--- a/src/app/shared/object-list/item-list-element/item-list-element.component.ts
+++ b/src/app/shared/object-list/item-list-element/item-list-element.component.ts
@@ -1,9 +1,9 @@
import { Component } from '@angular/core';
import { Item } from '../../../core/shared/item.model';
-import { renderElementsFor } from '../../object-collection/shared/dso-element-decorator';
import { AbstractListableElementComponent } from '../../object-collection/shared/object-collection-element/abstract-listable-element.component';
import { ViewMode } from '../../../core/shared/view-mode.model';
+import { listableObjectComponent } from '../../object-collection/shared/listable-object/listable-object.decorator';
@Component({
selector: 'ds-item-list-element',
@@ -15,7 +15,7 @@ import { ViewMode } from '../../../core/shared/view-mode.model';
* The component used to list items depending on type
* Uses item-type-switcher to determine which components to use for displaying the list
*/
-@renderElementsFor(Item, ViewMode.ListElement)
+@listableObjectComponent(Item, ViewMode.ListElement)
export class ItemListElementComponent extends AbstractListableElementComponent
- {
viewMode = ViewMode.ListElement;
}
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 732fd0d4e4..fe46669cfe 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
@@ -5,7 +5,7 @@ import { PublicationListElementComponent } from './publication-list-element.comp
import { Item } from '../../../../../core/shared/item.model';
import { TruncatePipe } from '../../../../utils/truncate.pipe';
import { TruncatableService } from '../../../../truncatable/truncatable.service';
-import { ITEM } from '../../../../items/switcher/item-type-switcher.component';
+import { ITEM } from '../../../../items/switcher/listable-object-component-loader.component';
import { of as observableOf } from 'rxjs';
let publicationListElementComponent: PublicationListElementComponent;
diff --git a/src/app/shared/object-list/item-list-element/item-types/publication/publication-list-element.component.ts b/src/app/shared/object-list/item-list-element/item-types/publication/publication-list-element.component.ts
index 46de8ac6cc..52d2f569b3 100644
--- a/src/app/shared/object-list/item-list-element/item-types/publication/publication-list-element.component.ts
+++ b/src/app/shared/object-list/item-list-element/item-types/publication/publication-list-element.component.ts
@@ -1,10 +1,10 @@
import { Component } from '@angular/core';
-import { DEFAULT_ITEM_TYPE, rendersItemType } from '../../../../items/item-type-decorator';
import { TypedItemSearchResultListElementComponent } from '../typed-item-search-result-list-element.component';
import { ViewMode } from '../../../../../core/shared/view-mode.model';
+import { DEFAULT_ITEM_TYPE, listableObjectComponent } from '../../../../object-collection/shared/listable-object/listable-object.decorator';
-@rendersItemType('Publication', ViewMode.ListElement)
-@rendersItemType(DEFAULT_ITEM_TYPE, ViewMode.ListElement)
+@listableObjectComponent('Publication', ViewMode.ListElement)
+@listableObjectComponent(DEFAULT_ITEM_TYPE, ViewMode.ListElement)
@Component({
selector: 'ds-publication-list-element',
styleUrls: ['./publication-list-element.component.scss'],
diff --git a/src/app/shared/object-list/item-list-element/item-types/typed-item-search-result-list-element.component.spec.ts b/src/app/shared/object-list/item-list-element/item-types/typed-item-search-result-list-element.component.spec.ts
index 082347be0b..c114a941cf 100644
--- a/src/app/shared/object-list/item-list-element/item-types/typed-item-search-result-list-element.component.spec.ts
+++ b/src/app/shared/object-list/item-list-element/item-types/typed-item-search-result-list-element.component.spec.ts
@@ -7,7 +7,7 @@ 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 { ITEM } from '../../../items/switcher/item-type-switcher.component';
+import { ITEM } from '../../../items/switcher/listable-object-component-loader.component';
import { ItemSearchResult } from '../../../object-collection/shared/item-search-result.model';
import { createRelationshipsObservable } from '../../../../+item-page/simple/item-types/shared/item.component.spec';
import { of as observableOf } from 'rxjs';
diff --git a/src/app/shared/object-list/item-list-element/item-types/typed-item-search-result-list-element.component.ts b/src/app/shared/object-list/item-list-element/item-types/typed-item-search-result-list-element.component.ts
index dd1b5a7e5f..cf7dc0b330 100644
--- a/src/app/shared/object-list/item-list-element/item-types/typed-item-search-result-list-element.component.ts
+++ b/src/app/shared/object-list/item-list-element/item-types/typed-item-search-result-list-element.component.ts
@@ -1,7 +1,7 @@
import { Component, Inject } from '@angular/core';
import { Item } from '../../../../core/shared/item.model';
import { hasValue } from '../../../empty.util';
-import { ITEM } from '../../../items/switcher/item-type-switcher.component';
+import { ITEM } from '../../../items/switcher/listable-object-component-loader.component';
import { ItemSearchResult } from '../../../object-collection/shared/item-search-result.model';
import { TruncatableService } from '../../../truncatable/truncatable.service';
import { SearchResultListElementComponent } from '../../search-result-list-element/search-result-list-element.component';
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 5ffa068951..2aa54bae64 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
@@ -1,5 +1,5 @@
import { async, ComponentFixture, TestBed } from '@angular/core/testing';
-import { ITEM } from '../../../items/switcher/item-type-switcher.component';
+import { ITEM } from '../../../items/switcher/listable-object-component-loader.component';
import { ChangeDetectionStrategy, NO_ERRORS_SCHEMA } from '@angular/core';
import { ItemMetadataListElementComponent } from './item-metadata-list-element.component';
import { By } from '@angular/platform-browser';
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 cf2786a2e6..25e97d59f6 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
@@ -1,10 +1,11 @@
import { MetadataRepresentationType } from '../../../../core/shared/metadata-representation/metadata-representation.model';
import { Component } from '@angular/core';
import { MetadataRepresentationListElementComponent } from '../metadata-representation-list-element.component';
-import { DEFAULT_ITEM_TYPE, rendersItemType } from '../../../items/item-type-decorator';
import { ViewMode } from '../../../../core/shared/view-mode.model';
+import { metadataRepresentationComponent } from '../../../metadata-representation/metadata-representation.decorator';
+import { DEFAULT_ITEM_TYPE } from '../../../object-collection/shared/listable-object/listable-object.decorator';
-@rendersItemType(DEFAULT_ITEM_TYPE, ViewMode.MetadataField, MetadataRepresentationType.Item)
+@metadataRepresentationComponent(DEFAULT_ITEM_TYPE, 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 2488db50b1..427726149f 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
@@ -1,6 +1,6 @@
import { Component, Inject } from '@angular/core';
import { MetadataRepresentation } from '../../../core/shared/metadata-representation/metadata-representation.model';
-import { ITEM } from '../../items/switcher/item-type-switcher.component';
+import { ITEM } from '../../items/switcher/listable-object-component-loader.component';
@Component({
selector: 'ds-metadata-representation-list-element',
@@ -10,6 +10,8 @@ import { ITEM } from '../../items/switcher/item-type-switcher.component';
* An abstract class for displaying a single MetadataRepresentation
*/
export class MetadataRepresentationListElementComponent {
- constructor(@Inject(ITEM) public metadataRepresentation: MetadataRepresentation) {
+ 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 42b9abde16..ba6d06ad84 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
@@ -2,7 +2,7 @@ import { async, ComponentFixture, TestBed } from '@angular/core/testing';
import { ChangeDetectionStrategy, NO_ERRORS_SCHEMA } from '@angular/core';
import { PlainTextMetadataListElementComponent } from './plain-text-metadata-list-element.component';
import { MetadatumRepresentation } from '../../../../core/shared/metadata-representation/metadatum/metadatum-representation.model';
-import { ITEM } from '../../../items/switcher/item-type-switcher.component';
+import { ITEM } from '../../../items/switcher/listable-object-component-loader.component';
const mockMetadataRepresentation = Object.assign(new MetadatumRepresentation('type'), {
key: 'dc.contributor.author',
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 0ebccc79f8..20d7c9739e 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
@@ -1,12 +1,12 @@
import { MetadataRepresentationType } from '../../../../core/shared/metadata-representation/metadata-representation.model';
import { Component } from '@angular/core';
import { MetadataRepresentationListElementComponent } from '../metadata-representation-list-element.component';
-import { DEFAULT_ITEM_TYPE, rendersItemType } from '../../../items/item-type-decorator';
-import { ViewMode } from '../../../../core/shared/view-mode.model';
+import { metadataRepresentationComponent } from '../../../metadata-representation/metadata-representation.decorator';
+import { DEFAULT_ITEM_TYPE } from '../../../object-collection/shared/listable-object/listable-object.decorator';
-@rendersItemType(DEFAULT_ITEM_TYPE, ViewMode.MetadataField, MetadataRepresentationType.PlainText)
+@metadataRepresentationComponent(DEFAULT_ITEM_TYPE, MetadataRepresentationType.PlainText)
// For now, authority controlled fields are rendered the same way as plain text fields
-@rendersItemType(DEFAULT_ITEM_TYPE, ViewMode.MetadataField, MetadataRepresentationType.AuthorityControlled)
+@metadataRepresentationComponent(DEFAULT_ITEM_TYPE, 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-my-dspace-result/claimed-my-dspace-result-list-element.component.ts b/src/app/shared/object-list/my-dspace-result-list-element/claimed-my-dspace-result/claimed-my-dspace-result-list-element.component.ts
index 66cdbfb43c..68eb27c93a 100644
--- a/src/app/shared/object-list/my-dspace-result-list-element/claimed-my-dspace-result/claimed-my-dspace-result-list-element.component.ts
+++ b/src/app/shared/object-list/my-dspace-result-list-element/claimed-my-dspace-result/claimed-my-dspace-result-list-element.component.ts
@@ -4,7 +4,6 @@ import { Location, LocationStrategy, PathLocationStrategy } from '@angular/commo
import { Observable } from 'rxjs';
import { find } from 'rxjs/operators';
-import { renderElementsFor } from '../../../object-collection/shared/dso-element-decorator';
import { MyDSpaceResultListElementComponent, } from '../my-dspace-result-list-element.component';
import { ViewMode } from '../../../../core/shared/view-mode.model';
import { RemoteData } from '../../../../core/data/remote-data';
@@ -13,6 +12,7 @@ import { WorkflowItem } from '../../../../core/submission/models/workflowitem.mo
import { ClaimedTask } from '../../../../core/tasks/models/claimed-task-object.model';
import { ClaimedTaskMyDSpaceResult } from '../../../object-collection/shared/claimed-task-my-dspace-result.model';
import { MyDspaceItemStatusType } from '../../../object-collection/shared/mydspace-item-status/my-dspace-item-status-type';
+import { listableObjectComponent } from '../../../object-collection/shared/listable-object/listable-object.decorator';
/**
* This component renders claimed task object for the mydspace result in the list view.
@@ -24,8 +24,8 @@ import { MyDspaceItemStatusType } from '../../../object-collection/shared/mydspa
providers: [Location, { provide: LocationStrategy, useClass: PathLocationStrategy }]
})
-@renderElementsFor(ClaimedTaskMyDSpaceResult, ViewMode.ListElement)
-@renderElementsFor(ClaimedTask, ViewMode.ListElement)
+@listableObjectComponent(ClaimedTaskMyDSpaceResult, ViewMode.ListElement)
+@listableObjectComponent(ClaimedTask, ViewMode.ListElement)
export class ClaimedMyDSpaceResultListElementComponent extends MyDSpaceResultListElementComponent {
/**
diff --git a/src/app/shared/object-list/my-dspace-result-list-element/item-my-dspace-result/item-my-dspace-result-list-element.component.ts b/src/app/shared/object-list/my-dspace-result-list-element/item-my-dspace-result/item-my-dspace-result-list-element.component.ts
index a9ceac5da3..8d3fd00eaa 100644
--- a/src/app/shared/object-list/my-dspace-result-list-element/item-my-dspace-result/item-my-dspace-result-list-element.component.ts
+++ b/src/app/shared/object-list/my-dspace-result-list-element/item-my-dspace-result/item-my-dspace-result-list-element.component.ts
@@ -1,11 +1,11 @@
import { Component } from '@angular/core';
-import { renderElementsFor } from '../../../object-collection/shared/dso-element-decorator';
import { MyDSpaceResultListElementComponent, } from '../my-dspace-result-list-element.component';
import { Item } from '../../../../core/shared/item.model';
import { ItemMyDSpaceResult } from '../../../object-collection/shared/item-my-dspace-result.model';
import { MyDspaceItemStatusType } from '../../../object-collection/shared/mydspace-item-status/my-dspace-item-status-type';
import { ViewMode } from '../../../../core/shared/view-mode.model';
+import { listableObjectComponent } from '../../../object-collection/shared/listable-object/listable-object.decorator';
/**
* This component renders item object for the mydspace result in the list view.
@@ -16,7 +16,7 @@ import { ViewMode } from '../../../../core/shared/view-mode.model';
templateUrl: './item-my-dspace-result-list-element.component.html'
})
-@renderElementsFor(ItemMyDSpaceResult, ViewMode.ListElement)
+@listableObjectComponent(ItemMyDSpaceResult, ViewMode.ListElement)
export class ItemMyDSpaceResultListElementComponent extends MyDSpaceResultListElementComponent {
/**
diff --git a/src/app/shared/object-list/my-dspace-result-list-element/pool-my-dspace-result/pool-my-dspace-result-list-element.component.ts b/src/app/shared/object-list/my-dspace-result-list-element/pool-my-dspace-result/pool-my-dspace-result-list-element.component.ts
index 62cbdde1c0..d3876714dc 100644
--- a/src/app/shared/object-list/my-dspace-result-list-element/pool-my-dspace-result/pool-my-dspace-result-list-element.component.ts
+++ b/src/app/shared/object-list/my-dspace-result-list-element/pool-my-dspace-result/pool-my-dspace-result-list-element.component.ts
@@ -3,7 +3,6 @@ import { Component, Inject, OnInit } from '@angular/core';
import { Observable } from 'rxjs';
import { find } from 'rxjs/operators';
-import { renderElementsFor } from '../../../object-collection/shared/dso-element-decorator';
import { MyDSpaceResultListElementComponent, } from '../my-dspace-result-list-element.component';
import { ViewMode } from '../../../../core/shared/view-mode.model';
import { RemoteData } from '../../../../core/data/remote-data';
@@ -13,6 +12,7 @@ import { WorkflowItem } from '../../../../core/submission/models/workflowitem.mo
import { PoolTask } from '../../../../core/tasks/models/pool-task-object.model';
import { PoolTaskMyDSpaceResult } from '../../../object-collection/shared/pool-task-my-dspace-result.model';
import { MyDspaceItemStatusType } from '../../../object-collection/shared/mydspace-item-status/my-dspace-item-status-type';
+import { listableObjectComponent } from '../../../object-collection/shared/listable-object/listable-object.decorator';
/**
* This component renders pool task object for the mydspace result in the list view.
@@ -23,8 +23,8 @@ import { MyDspaceItemStatusType } from '../../../object-collection/shared/mydspa
templateUrl: './pool-my-dspace-result-list-element.component.html',
})
-@renderElementsFor(PoolTaskMyDSpaceResult, ViewMode.ListElement)
-@renderElementsFor(PoolTask, ViewMode.ListElement)
+@listableObjectComponent(PoolTaskMyDSpaceResult, ViewMode.ListElement)
+@listableObjectComponent(PoolTask, ViewMode.ListElement)
export class PoolMyDSpaceResultListElementComponent extends MyDSpaceResultListElementComponent implements OnInit {
/**
diff --git a/src/app/shared/object-list/my-dspace-result-list-element/workflowitem-my-dspace-result/workflowitem-my-dspace-result-list-element.component.ts b/src/app/shared/object-list/my-dspace-result-list-element/workflowitem-my-dspace-result/workflowitem-my-dspace-result-list-element.component.ts
index e03367abce..5ec7572984 100644
--- a/src/app/shared/object-list/my-dspace-result-list-element/workflowitem-my-dspace-result/workflowitem-my-dspace-result-list-element.component.ts
+++ b/src/app/shared/object-list/my-dspace-result-list-element/workflowitem-my-dspace-result/workflowitem-my-dspace-result-list-element.component.ts
@@ -3,7 +3,6 @@ import { Component } from '@angular/core';
import { Observable } from 'rxjs';
import { find } from 'rxjs/operators';
-import { renderElementsFor } from '../../../object-collection/shared/dso-element-decorator';
import { MyDSpaceResultListElementComponent, } from '../my-dspace-result-list-element.component';
import { ViewMode } from '../../../../core/shared/view-mode.model';
import { RemoteData } from '../../../../core/data/remote-data';
@@ -12,6 +11,7 @@ import { WorkflowitemMyDSpaceResult } from '../../../object-collection/shared/wo
import { WorkflowItem } from '../../../../core/submission/models/workflowitem.model';
import { Item } from '../../../../core/shared/item.model';
import { MyDspaceItemStatusType } from '../../../object-collection/shared/mydspace-item-status/my-dspace-item-status-type';
+import { listableObjectComponent } from '../../../object-collection/shared/listable-object/listable-object.decorator';
/**
* This component renders workflowitem object for the mydspace result in the list view.
@@ -22,8 +22,8 @@ import { MyDspaceItemStatusType } from '../../../object-collection/shared/mydspa
templateUrl: './workflowitem-my-dspace-result-list-element.component.html',
})
-@renderElementsFor(WorkflowitemMyDSpaceResult, ViewMode.ListElement)
-@renderElementsFor(WorkflowItem, ViewMode.ListElement)
+@listableObjectComponent(WorkflowitemMyDSpaceResult, ViewMode.ListElement)
+@listableObjectComponent(WorkflowItem, ViewMode.ListElement)
export class WorkflowitemMyDSpaceResultListElementComponent extends MyDSpaceResultListElementComponent {
/**
diff --git a/src/app/shared/object-list/my-dspace-result-list-element/workspaceitem-my-dspace-result/workspaceitem-my-dspace-result-list-element.component.ts b/src/app/shared/object-list/my-dspace-result-list-element/workspaceitem-my-dspace-result/workspaceitem-my-dspace-result-list-element.component.ts
index ea5f9d6f6b..e88ea54703 100644
--- a/src/app/shared/object-list/my-dspace-result-list-element/workspaceitem-my-dspace-result/workspaceitem-my-dspace-result-list-element.component.ts
+++ b/src/app/shared/object-list/my-dspace-result-list-element/workspaceitem-my-dspace-result/workspaceitem-my-dspace-result-list-element.component.ts
@@ -3,7 +3,6 @@ import { Component } from '@angular/core';
import { Observable } from 'rxjs';
import { find } from 'rxjs/operators';
-import { renderElementsFor } from '../../../object-collection/shared/dso-element-decorator';
import { MyDSpaceResultListElementComponent, } from '../my-dspace-result-list-element.component';
import { ViewMode } from '../../../../core/shared/view-mode.model';
import { WorkspaceItem } from '../../../../core/submission/models/workspaceitem.model';
@@ -12,6 +11,7 @@ import { RemoteData } from '../../../../core/data/remote-data';
import { isNotUndefined } from '../../../empty.util';
import { Item } from '../../../../core/shared/item.model';
import { MyDspaceItemStatusType } from '../../../object-collection/shared/mydspace-item-status/my-dspace-item-status-type';
+import { listableObjectComponent } from '../../../object-collection/shared/listable-object/listable-object.decorator';
/**
* This component renders workspaceitem object for the mydspace result in the list view.
@@ -22,7 +22,7 @@ import { MyDspaceItemStatusType } from '../../../object-collection/shared/mydspa
templateUrl: './workspaceitem-my-dspace-result-list-element.component.html',
})
-@renderElementsFor(WorkspaceitemMyDSpaceResult, ViewMode.ListElement)
+@listableObjectComponent(WorkspaceitemMyDSpaceResult, ViewMode.ListElement)
export class WorkspaceitemMyDSpaceResultListElementComponent extends MyDSpaceResultListElementComponent {
/**
diff --git a/src/app/shared/object-list/search-result-list-element/collection-search-result/collection-search-result-list-element.component.ts b/src/app/shared/object-list/search-result-list-element/collection-search-result/collection-search-result-list-element.component.ts
index 657252c1bd..384e1c1f81 100644
--- a/src/app/shared/object-list/search-result-list-element/collection-search-result/collection-search-result-list-element.component.ts
+++ b/src/app/shared/object-list/search-result-list-element/collection-search-result/collection-search-result-list-element.component.ts
@@ -1,11 +1,11 @@
import { Component } from '@angular/core';
-import { renderElementsFor } from '../../../object-collection/shared/dso-element-decorator';
import { SearchResultListElementComponent } from '../search-result-list-element.component';
import { Collection } from '../../../../core/shared/collection.model';
import { CollectionSearchResult } from '../../../object-collection/shared/collection-search-result.model';
import { ViewMode } from '../../../../core/shared/view-mode.model';
+import { listableObjectComponent } from '../../../object-collection/shared/listable-object/listable-object.decorator';
@Component({
selector: 'ds-collection-search-result-list-element',
@@ -13,5 +13,5 @@ import { ViewMode } from '../../../../core/shared/view-mode.model';
templateUrl: 'collection-search-result-list-element.component.html'
})
-@renderElementsFor(CollectionSearchResult, ViewMode.ListElement)
+@listableObjectComponent(CollectionSearchResult, ViewMode.ListElement)
export class CollectionSearchResultListElementComponent extends SearchResultListElementComponent {}
diff --git a/src/app/shared/object-list/search-result-list-element/community-search-result/community-search-result-list-element.component.ts b/src/app/shared/object-list/search-result-list-element/community-search-result/community-search-result-list-element.component.ts
index c57e716a2f..3281e380e4 100644
--- a/src/app/shared/object-list/search-result-list-element/community-search-result/community-search-result-list-element.component.ts
+++ b/src/app/shared/object-list/search-result-list-element/community-search-result/community-search-result-list-element.component.ts
@@ -1,11 +1,11 @@
import { Component } from '@angular/core';
-import { renderElementsFor } from '../../../object-collection/shared/dso-element-decorator';
import { SearchResultListElementComponent } from '../search-result-list-element.component';
import { Community } from '../../../../core/shared/community.model';
import { CommunitySearchResult } from '../../../object-collection/shared/community-search-result.model';
import { ViewMode } from '../../../../core/shared/view-mode.model';
+import { listableObjectComponent } from '../../../object-collection/shared/listable-object/listable-object.decorator';
@Component({
selector: 'ds-community-search-result-list-element',
@@ -13,7 +13,7 @@ import { ViewMode } from '../../../../core/shared/view-mode.model';
templateUrl: 'community-search-result-list-element.component.html'
})
-@renderElementsFor(CommunitySearchResult, ViewMode.ListElement)
+@listableObjectComponent(CommunitySearchResult, ViewMode.ListElement)
export class CommunitySearchResultListElementComponent extends SearchResultListElementComponent {
}
diff --git a/src/app/shared/object-list/search-result-list-element/item-search-result/item-search-result-list-element.component.ts b/src/app/shared/object-list/search-result-list-element/item-search-result/item-search-result-list-element.component.ts
index 6acedefdbd..0b25443454 100644
--- a/src/app/shared/object-list/search-result-list-element/item-search-result/item-search-result-list-element.component.ts
+++ b/src/app/shared/object-list/search-result-list-element/item-search-result/item-search-result-list-element.component.ts
@@ -2,10 +2,10 @@ import { Component } from '@angular/core';
import { Item } from '../../../../core/shared/item.model';
import { focusBackground } from '../../../animations/focus';
-import { renderElementsFor } from '../../../object-collection/shared/dso-element-decorator';
import { ItemSearchResult } from '../../../object-collection/shared/item-search-result.model';
import { SearchResultListElementComponent } from '../search-result-list-element.component';
import { ViewMode } from '../../../../core/shared/view-mode.model';
+import { listableObjectComponent } from '../../../object-collection/shared/listable-object/listable-object.decorator';
@Component({
selector: 'ds-item-search-result-list-element',
@@ -15,7 +15,7 @@ import { ViewMode } from '../../../../core/shared/view-mode.model';
})
-@renderElementsFor(ItemSearchResult, ViewMode.ListElement)
+@listableObjectComponent(ItemSearchResult, ViewMode.ListElement)
export class ItemSearchResultListElementComponent extends SearchResultListElementComponent {
viewMode = ViewMode.ListElement;
diff --git a/src/app/shared/object-list/wrapper-list-element/wrapper-list-element.component.html b/src/app/shared/object-list/wrapper-list-element/wrapper-list-element.component.html
deleted file mode 100644
index db87596f31..0000000000
--- a/src/app/shared/object-list/wrapper-list-element/wrapper-list-element.component.html
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/src/app/shared/object-list/wrapper-list-element/wrapper-list-element.component.scss b/src/app/shared/object-list/wrapper-list-element/wrapper-list-element.component.scss
deleted file mode 100644
index 8b13789179..0000000000
--- a/src/app/shared/object-list/wrapper-list-element/wrapper-list-element.component.scss
+++ /dev/null
@@ -1 +0,0 @@
-
diff --git a/src/app/shared/object-list/wrapper-list-element/wrapper-list-element.component.ts b/src/app/shared/object-list/wrapper-list-element/wrapper-list-element.component.ts
deleted file mode 100644
index 8663d37d35..0000000000
--- a/src/app/shared/object-list/wrapper-list-element/wrapper-list-element.component.ts
+++ /dev/null
@@ -1,35 +0,0 @@
-import { Component, Injector, Input, OnInit } from '@angular/core';
-import { GenericConstructor } from '../../../core/shared/generic-constructor';
-import { rendersDSOType } from '../../object-collection/shared/dso-element-decorator'
-import { ListableObject } from '../../object-collection/shared/listable-object.model';
-import { ViewMode } from '../../../core/shared/view-mode.model';
-
-@Component({
- selector: 'ds-wrapper-list-element',
- styleUrls: ['./wrapper-list-element.component.scss'],
- templateUrl: './wrapper-list-element.component.html'
-})
-export class WrapperListElementComponent implements OnInit {
- @Input() object: ListableObject;
- @Input() index: number;
- objectInjector: Injector;
- listElement: any;
-
- constructor(private injector: Injector) {}
-
- ngOnInit(): void {
- this.objectInjector = Injector.create({
- providers: [
- { provide: 'objectElementProvider', useFactory: () => (this.object), deps:[] },
- { provide: 'indexElementProvider', useFactory: () => (this.index), deps:[] }
- ],
- parent: this.injector
- });
- this.listElement = this.getListElement();
- }
-
- private getListElement(): string {
- const f: GenericConstructor = this.object.constructor as GenericConstructor;
- return rendersDSOType(f, ViewMode.ListElement);
- }
-}
diff --git a/src/app/shared/shared.module.ts b/src/app/shared/shared.module.ts
index 2367652dd3..d50056d731 100644
--- a/src/app/shared/shared.module.ts
+++ b/src/app/shared/shared.module.ts
@@ -9,7 +9,7 @@ import { NgbDatepickerModule, NgbModule, NgbTimepickerModule, NgbTypeaheadModule
import { TranslateModule } from '@ngx-translate/core';
import { NgxPaginationModule } from 'ngx-pagination';
-import { ItemTypeSwitcherComponent } from './items/switcher/item-type-switcher.component';
+import { ListableObjectComponentLoaderComponent } from './items/switcher/listable-object-component-loader.component';
import { TypedItemSearchResultListElementComponent } from './object-list/item-list-element/item-types/typed-item-search-result-list-element.component';
import { PublicationListElementComponent } from './object-list/item-list-element/item-types/publication/publication-list-element.component';
@@ -143,6 +143,8 @@ import { DsoInputSuggestionsComponent } from './input-suggestions/dso-input-sugg
import { TypedItemSearchResultGridElementComponent } from './object-grid/item-grid-element/item-types/typed-item-search-result-grid-element.component';
import { PublicationGridElementComponent } from './object-grid/item-grid-element/item-types/publication/publication-grid-element.component';
import { ItemTypeBadgeComponent } from './object-list/item-type-badge/item-type-badge.component';
+import { MetadataRepresentationLoaderComponent } from './metadata-representation/metadata-representation-loader.component';
+import { MetadataRepresentationDirective } from './metadata-representation/metadata-representation.directive';
const MODULES = [
// Do NOT include UniversalModule, HttpModule, or JsonpModule here
@@ -264,9 +266,10 @@ const COMPONENTS = [
ItemSearchResultListElementComponent,
TypedItemSearchResultListElementComponent,
TypedItemSearchResultGridElementComponent,
- ItemTypeSwitcherComponent,
+ ListableObjectComponentLoaderComponent,
BrowseByComponent,
- ItemTypeBadgeComponent
+ ItemTypeBadgeComponent,
+ MetadataRepresentationLoaderComponent
];
const ENTRY_COMPONENTS = [
@@ -335,7 +338,8 @@ const DIRECTIVES = [
AuthorityConfidenceStateDirective,
InListValidator,
AutoFocusDirective,
- RoleDirective
+ RoleDirective,
+ MetadataRepresentationDirective
];
@NgModule({