metadata representation

This commit is contained in:
lotte
2019-10-10 16:18:14 +02:00
parent 0fb12c4274
commit dfe1143184
48 changed files with 131 additions and 102 deletions

View File

@@ -5,10 +5,10 @@ import { ItemComponent } from '../shared/item.component';
import { MetadataRepresentation } from '../../../../core/shared/metadata-representation/metadata-representation.model'; import { MetadataRepresentation } from '../../../../core/shared/metadata-representation/metadata-representation.model';
import { getRelatedItemsByTypeLabel } from '../shared/item-relationships-utils'; import { getRelatedItemsByTypeLabel } from '../shared/item-relationships-utils';
import { ViewMode } from '../../../../core/shared/view-mode.model'; import { ViewMode } from '../../../../core/shared/view-mode.model';
import { DEFAULT_ITEM_TYPE, listableObjectComponent } from '../../../../shared/object-collection/shared/listable-object/listable-object.decorator'; import { listableObjectComponent } from '../../../../shared/object-collection/shared/listable-object/listable-object.decorator';
@listableObjectComponent('Publication', ViewMode.StandalonePage) @listableObjectComponent('Publication', ViewMode.StandalonePage)
@listableObjectComponent(DEFAULT_ITEM_TYPE, ViewMode.StandalonePage) @listableObjectComponent(Item.name, ViewMode.StandalonePage)
@Component({ @Component({
selector: 'ds-publication', selector: 'ds-publication',
styleUrls: ['./publication.component.scss'], styleUrls: ['./publication.component.scss'],

View File

@@ -1,5 +1,5 @@
<ds-metadata-field-wrapper *ngIf="representations && representations.length > 0" [label]="label"> <ds-metadata-field-wrapper *ngIf="representations && representations.length > 0" [label]="label">
<ds-listable-object-component-loader *ngFor="let rep of representations" <ds-metadata-representation-loader *ngFor="let rep of representations"
[object]="rep" [viewMode]="viewMode"> [mdRepresentation]="rep">
</ds-listable-object-component-loader> </ds-metadata-representation-loader>
</ds-metadata-field-wrapper> </ds-metadata-field-wrapper>

View File

@@ -58,7 +58,8 @@ import { PoolSearchResultDetailElementComponent } from '../shared/object-detail/
WorkspaceItemSearchResultDetailElementComponent, WorkspaceItemSearchResultDetailElementComponent,
WorkflowItemSearchResultDetailElementComponent, WorkflowItemSearchResultDetailElementComponent,
ClaimedTaskSearchResultDetailElementComponent, ClaimedTaskSearchResultDetailElementComponent,
PoolSearchResultDetailElementComponent PoolSearchResultDetailElementComponent,
ItemSearchResultListElementSubmissionComponent
] ]
}) })

View File

@@ -4,7 +4,8 @@
[hasBorder]="hasBorder" [hasBorder]="hasBorder"
[sortConfig]="searchConfig.sort" [sortConfig]="searchConfig.sort"
[objects]="searchResults" [objects]="searchResults"
[hideGear]="true"> [hideGear]="true"
[context]="context">
</ds-viewable-collection> </ds-viewable-collection>
</div> </div>
<ds-loading *ngIf="isLoading()" message="{{'loading.mydspace-results' | translate}}"></ds-loading> <ds-loading *ngIf="isLoading()" message="{{'loading.mydspace-results' | translate}}"></ds-loading>

View File

@@ -7,6 +7,7 @@ import { PaginatedList } from '../../core/data/paginated-list';
import { ViewMode } from '../../core/shared/view-mode.model'; import { ViewMode } from '../../core/shared/view-mode.model';
import { isEmpty } from '../../shared/empty.util'; import { isEmpty } from '../../shared/empty.util';
import { SearchResult } from '../../+search-page/search-result.model'; import { SearchResult } from '../../+search-page/search-result.model';
import { Context } from '../../core/shared/context.model';
/** /**
* Component that represents all results for mydspace page * Component that represents all results for mydspace page
@@ -36,6 +37,7 @@ export class MyDSpaceResultsComponent {
*/ */
@Input() viewMode: ViewMode; @Input() viewMode: ViewMode;
context = Context.Submission;
/** /**
* A boolean representing if search results entry are separated by a line * A boolean representing if search results entry are separated by a line
*/ */

View File

@@ -16,7 +16,7 @@ export class SearchResult<T extends DSpaceObject> implements ListableObject {
*/ */
hitHighlights: MetadataMap; hitHighlights: MetadataMap;
getRenderType(): string { getRenderTypes(): string[] {
return this.indexableObject.getRenderType() + 'SearchResult'; return this.indexableObject.getRenderTypes().map((type) => type +'SearchResult');
} }
} }

View File

@@ -51,7 +51,7 @@ export class MetadataField implements ListableObject {
return key; return key;
} }
getRenderType(): string { getRenderTypes(): string[] {
return this.constructor.name; return [this.constructor.name];
} }
} }

View File

@@ -27,7 +27,7 @@ export class MetadataSchema implements ListableObject {
*/ */
namespace: string; namespace: string;
getRenderType(): string { getRenderTypes(): string[] {
return this.constructor.name; return [this.constructor.name];
} }
} }

View File

@@ -29,7 +29,7 @@ export class BrowseEntry implements ListableObject {
*/ */
count: number; count: number;
getRenderType(): string { getRenderTypes(): string[] {
return (this as any).type.value; return [this.constructor.name];
} }
} }

View File

@@ -146,7 +146,7 @@ export class DSpaceObject implements CacheableObject, ListableObject {
}); });
} }
getRenderType(): string { getRenderTypes(): string[] {
return this.constructor.name; return [this.constructor.name];
} }
} }

View File

@@ -5,7 +5,7 @@ import { DSpaceObject } from './dspace-object.model';
import { Collection } from './collection.model'; import { Collection } from './collection.model';
import { RemoteData } from '../data/remote-data'; import { RemoteData } from '../data/remote-data';
import { Bitstream } from './bitstream.model'; import { Bitstream } from './bitstream.model';
import { hasValue, isNotEmpty } from '../../shared/empty.util'; import { hasValue, isEmpty, isNotEmpty } from '../../shared/empty.util';
import { PaginatedList } from '../data/paginated-list'; import { PaginatedList } from '../data/paginated-list';
import { Relationship } from './item-relationships/relationship.model'; import { Relationship } from './item-relationships/relationship.model';
import { ResourceType } from './resource-type'; import { ResourceType } from './resource-type';
@@ -110,11 +110,11 @@ export class Item extends DSpaceObject {
})); }));
} }
getRenderType(): string { getRenderTypes(): string[] {
const entityType = this.firstMetadataValue('relationship.type'); let entityType = this.firstMetadataValue('relationship.type');
if (isNotEmpty(entityType)) { if (isEmpty(entityType)) {
return entityType; entityType = 'Publication';
} }
return 'Publication'; return [entityType, ...super.getRenderTypes()];
} }
} }

View File

@@ -7,7 +7,7 @@
</div> </div>
</a> </a>
<div class="card-body"> <div class="card-body">
<ds-item-type-badge [object]="object"></ds-item-type-badge> <ds-item-type-badge [object]="dso"></ds-item-type-badge>
<ds-truncatable-part [id]="dso.id" [minLines]="3" type="h4"> <ds-truncatable-part [id]="dso.id" [minLines]="3" type="h4">
<h4 class="card-title" [innerHTML]="dso.firstMetadataValue('dc.title')"></h4> <h4 class="card-title" [innerHTML]="dso.firstMetadataValue('dc.title')"></h4>
</ds-truncatable-part> </ds-truncatable-part>

View File

@@ -7,7 +7,7 @@
</div> </div>
</a> </a>
<div class="card-body"> <div class="card-body">
<ds-item-type-badge [object]="object"></ds-item-type-badge> <ds-item-type-badge [object]="dso"></ds-item-type-badge>
<ds-truncatable-part [id]="dso.id" [minLines]="3" type="h4"> <ds-truncatable-part [id]="dso.id" [minLines]="3" type="h4">
<h4 class="card-title" [innerHTML]="dso.firstMetadataValue('dc.title')"></h4> <h4 class="card-title" [innerHTML]="dso.firstMetadataValue('dc.title')"></h4>
</ds-truncatable-part> </ds-truncatable-part>

View File

@@ -7,7 +7,7 @@
</div> </div>
</a> </a>
<div class="card-body"> <div class="card-body">
<ds-item-type-badge [object]="object"></ds-item-type-badge> <ds-item-type-badge [object]="dso"></ds-item-type-badge>
<ds-truncatable-part [id]="dso.id" [minLines]="3" type="h4"> <ds-truncatable-part [id]="dso.id" [minLines]="3" type="h4">
<h4 class="card-title" [innerHTML]="dso.firstMetadataValue('dc.title')"></h4> <h4 class="card-title" [innerHTML]="dso.firstMetadataValue('dc.title')"></h4>
</ds-truncatable-part> </ds-truncatable-part>

View File

@@ -7,7 +7,7 @@
</div> </div>
</a> </a>
<div class="card-body"> <div class="card-body">
<ds-item-type-badge [object]="object"></ds-item-type-badge> <ds-item-type-badge [object]="dso"></ds-item-type-badge>
<ds-truncatable-part [id]="dso.id" [minLines]="3" type="h4"> <ds-truncatable-part [id]="dso.id" [minLines]="3" type="h4">
<h4 class="card-title" [innerHTML]="dso.firstMetadataValue('organization.legalName')"></h4> <h4 class="card-title" [innerHTML]="dso.firstMetadataValue('organization.legalName')"></h4>
</ds-truncatable-part> </ds-truncatable-part>

View File

@@ -7,7 +7,7 @@
</div> </div>
</a> </a>
<div class="card-body"> <div class="card-body">
<ds-item-type-badge [object]="object"></ds-item-type-badge> <ds-item-type-badge [object]="dso"></ds-item-type-badge>
<ds-truncatable-part [id]="dso.id" [minLines]="3" type="h4"> <ds-truncatable-part [id]="dso.id" [minLines]="3" type="h4">
<h4 class="card-title" [innerHTML]="dso.firstMetadataValue('person.familyName') + ', ' + dso.firstMetadataValue('person.givenName')"></h4> <h4 class="card-title" [innerHTML]="dso.firstMetadataValue('person.familyName') + ', ' + dso.firstMetadataValue('person.givenName')"></h4>
</ds-truncatable-part> </ds-truncatable-part>

View File

@@ -7,7 +7,7 @@
</div> </div>
</a> </a>
<div class="card-body"> <div class="card-body">
<ds-item-type-badge [object]="object"></ds-item-type-badge> <ds-item-type-badge [object]="dso"></ds-item-type-badge>
<ds-truncatable-part [id]="dso.id" [minLines]="3" type="h4"> <ds-truncatable-part [id]="dso.id" [minLines]="3" type="h4">
<h4 class="card-title" [innerHTML]="dso.firstMetadataValue('dc.title')"></h4> <h4 class="card-title" [innerHTML]="dso.firstMetadataValue('dc.title')"></h4>
</ds-truncatable-part> </ds-truncatable-part>

View File

@@ -1,7 +1,4 @@
import { Component } from '@angular/core'; import { Component } from '@angular/core';
import { ViewMode } from '../../../../core/shared/view-mode.model';
import { DEFAULT_ITEM_TYPE, listableObjectComponent } from '../../../../shared/object-collection/shared/listable-object/listable-object.decorator';
import { Context } from '../../../../core/shared/context.model';
import { AbstractListableElementComponent } from '../../../../shared/object-collection/shared/object-collection-element/abstract-listable-element.component'; import { AbstractListableElementComponent } from '../../../../shared/object-collection/shared/object-collection-element/abstract-listable-element.component';
import { Item } from '../../../../core/shared/item.model'; import { Item } from '../../../../core/shared/item.model';
import { metadataRepresentationComponent } from '../../../../shared/metadata-representation/metadata-representation.decorator'; import { metadataRepresentationComponent } from '../../../../shared/metadata-representation/metadata-representation.decorator';

View File

@@ -1,10 +1,10 @@
import { Component } from '@angular/core'; import { Component } from '@angular/core';
import { metadataRepresentationComponent } from '../../../../shared/metadata-representation/metadata-representation.decorator';
import { MetadataRepresentationType } from '../../../../core/shared/metadata-representation/metadata-representation.model';
import { AbstractListableElementComponent } from '../../../../shared/object-collection/shared/object-collection-element/abstract-listable-element.component'; import { AbstractListableElementComponent } from '../../../../shared/object-collection/shared/object-collection-element/abstract-listable-element.component';
import { Item } from '../../../../core/shared/item.model'; import { Item } from '../../../../core/shared/item.model';
import { listableObjectComponent } from '../../../../shared/object-collection/shared/listable-object/listable-object.decorator';
import { ViewMode } from '../../../../core/shared/view-mode.model';
@metadataRepresentationComponent('Project', MetadataRepresentationType.PlainText) @listableObjectComponent('Project', ViewMode.ListElement)
@Component({ @Component({
selector: 'ds-project-list-element', selector: 'ds-project-list-element',
styleUrls: ['./project-list-element.component.scss'], styleUrls: ['./project-list-element.component.scss'],

View File

@@ -1,11 +1,11 @@
import { Component } from '@angular/core'; import { Component } from '@angular/core';
import { SearchResultListElementComponent } from '../../../../../shared/object-list/search-result-list-element/search-result-list-element.component'; import { SearchResultListElementComponent } from '../../../../../shared/object-list/search-result-list-element/search-result-list-element.component';
import { ItemSearchResult } from '../../../../../shared/object-collection/shared/item-search-result.model'; import { ItemSearchResult } from '../../../../../shared/object-collection/shared/item-search-result.model';
import { metadataRepresentationComponent } from '../../../../../shared/metadata-representation/metadata-representation.decorator';
import { MetadataRepresentationType } from '../../../../../core/shared/metadata-representation/metadata-representation.model';
import { Item } from '../../../../../core/shared/item.model'; import { Item } from '../../../../../core/shared/item.model';
import { listableObjectComponent } from '../../../../../shared/object-collection/shared/listable-object/listable-object.decorator';
import { ViewMode } from '../../../../../core/shared/view-mode.model';
@metadataRepresentationComponent('ProjectSearchResult', MetadataRepresentationType.PlainText) @listableObjectComponent('ProjectSearchResult', ViewMode.ListElement)
@Component({ @Component({
selector: 'ds-project-search-result-list-element', selector: 'ds-project-search-result-list-element',
styleUrls: ['./project-search-result-list-element.component.scss'], styleUrls: ['./project-search-result-list-element.component.scss'],

View File

@@ -1,7 +1,7 @@
import { MetadataRepresentationType } from '../../core/shared/metadata-representation/metadata-representation.model'; import { MetadataRepresentationType } from '../../core/shared/metadata-representation/metadata-representation.model';
import { hasNoValue, hasValue } from '../empty.util'; import { hasNoValue, hasValue } from '../empty.util';
import { Context } from '../../core/shared/context.model'; import { Context } from '../../core/shared/context.model';
import { DEFAULT_ITEM_TYPE } from '../object-collection/shared/listable-object/listable-object.decorator'; import { Item } from '../../core/shared/item.model';
const map = new Map(); const map = new Map();
@@ -39,5 +39,5 @@ export function getMetadataRepresentationComponent(entityType: string, mdReprese
} }
return mapForEntity.get(DEFAULT_REPRESENTATION_TYPE).get(DEFAULT_CONTEXT); return mapForEntity.get(DEFAULT_REPRESENTATION_TYPE).get(DEFAULT_CONTEXT);
} }
return map.get(DEFAULT_ITEM_TYPE).get(DEFAULT_REPRESENTATION_TYPE).get(DEFAULT_CONTEXT); return map.get(Item.name).get(DEFAULT_REPRESENTATION_TYPE).get(DEFAULT_CONTEXT);
} }

View File

@@ -3,6 +3,7 @@
[objects]="objects" [objects]="objects"
[hasBorder]="hasBorder" [hasBorder]="hasBorder"
[hideGear]="hideGear" [hideGear]="hideGear"
[context]="context"
(paginationChange)="onPaginationChange($event)" (paginationChange)="onPaginationChange($event)"
(pageChange)="onPageChange($event)" (pageChange)="onPageChange($event)"
(pageSizeChange)="onPageSizeChange($event)" (pageSizeChange)="onPageSizeChange($event)"
@@ -15,6 +16,7 @@
[sortConfig]="sortConfig" [sortConfig]="sortConfig"
[objects]="objects" [objects]="objects"
[hideGear]="hideGear" [hideGear]="hideGear"
[context]="context"
(paginationChange)="onPaginationChange($event)" (paginationChange)="onPaginationChange($event)"
(pageChange)="onPageChange($event)" (pageChange)="onPageChange($event)"
(pageSizeChange)="onPageSizeChange($event)" (pageSizeChange)="onPageSizeChange($event)"
@@ -27,6 +29,7 @@
[sortConfig]="sortConfig" [sortConfig]="sortConfig"
[objects]="objects" [objects]="objects"
[hideGear]="hideGear" [hideGear]="hideGear"
[context]="context"
*ngIf="(currentMode$ | async) === viewModeEnum.DetailedListElement"> *ngIf="(currentMode$ | async) === viewModeEnum.DetailedListElement">
</ds-object-detail> </ds-object-detail>

View File

@@ -24,6 +24,7 @@ export class ObjectCollectionComponent implements OnInit {
@Input() sortConfig: SortOptions; @Input() sortConfig: SortOptions;
@Input() hasBorder = false; @Input() hasBorder = false;
@Input() hideGear = false; @Input() hideGear = false;
@Input() context: string;
pageInfo: Observable<PageInfo>; pageInfo: Observable<PageInfo>;
/** /**
* An event fired when the page is changed. * An event fired when the page is changed.

View File

@@ -1,5 +1,5 @@
import { TypedObject } from '../../../core/cache/object-cache.reducer'; import { TypedObject } from '../../../core/cache/object-cache.reducer';
export interface ListableObject extends TypedObject { export interface ListableObject extends TypedObject {
getRenderType(): string; getRenderTypes(): string[];
} }

View File

@@ -49,6 +49,6 @@ export class ListableObjectComponentLoaderComponent implements OnInit {
* @returns {string} * @returns {string}
*/ */
private getComponent(): GenericConstructor<Component> { private getComponent(): GenericConstructor<Component> {
return getListableObjectComponent(this.object.getRenderType(), this.viewMode) return getListableObjectComponent(this.object.getRenderTypes(), this.viewMode, this.context)
} }
} }

View File

@@ -1,15 +1,12 @@
import { ViewMode } from '../../../../core/shared/view-mode.model'; 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 { Context } from '../../../../core/shared/context.model';
import { hasNoValue, hasValue } from '../../../empty.util'; import { hasNoValue, hasValue } from '../../../empty.util';
import { DEFAULT_CONTEXT } from '../../../metadata-representation/metadata-representation.decorator'; import { DEFAULT_CONTEXT } from '../../../metadata-representation/metadata-representation.decorator';
export const DEFAULT_ITEM_TYPE = 'Default';
export const DEFAULT_VIEW_MODE = ViewMode.ListElement; export const DEFAULT_VIEW_MODE = ViewMode.ListElement;
const listElementMap = new Map(); const map = new Map();
/** /**
* Decorator used for rendering simple item pages by type and viewMode (and optionally a representationType) * Decorator used for rendering simple item pages by type and viewMode (and optionally a representationType)
@@ -21,30 +18,40 @@ export function listableObjectComponent(objectType: string, viewMode: ViewMode,
if (hasNoValue(objectType)) { if (hasNoValue(objectType)) {
return; return;
} }
if (hasNoValue(listElementMap.get(objectType))) { if (hasNoValue(map.get(objectType))) {
listElementMap.set(objectType, new Map()); map.set(objectType, new Map());
} }
if (hasNoValue(listElementMap.get(objectType).get(viewMode))) { if (hasNoValue(map.get(objectType).get(viewMode))) {
listElementMap.get(objectType).set(viewMode, new Map()); map.get(objectType).set(viewMode, new Map());
} }
listElementMap.get(objectType).get(viewMode).set(context, component); map.get(objectType).get(viewMode).set(context, component);
}; };
} }
export function getListableObjectComponent(entityType: GenericConstructor<ListableObject> | string, viewMode: ViewMode, context: Context = DEFAULT_CONTEXT) { export function getListableObjectComponent(types: string[], viewMode: ViewMode, context: Context = DEFAULT_CONTEXT) {
const mapForType = listElementMap.get(entityType); let bestMatch = undefined;
if (hasValue(mapForType)) { let bestMatchValue = 0;
const typeAndMDRepMap = mapForType.get(viewMode); for (let i = 0; i < types.length; i++) {
if (hasValue(typeAndMDRepMap)) { const typeMap = map.get(types[i]);
if (hasValue(typeAndMDRepMap.get(context))) { if (hasValue(typeMap)) {
return typeAndMDRepMap.get(context); const typeModeMap = typeMap.get(viewMode);
if (hasValue(typeModeMap)) {
if (hasValue(typeModeMap.get(context))) {
console.log(typeModeMap.get(context));
return typeModeMap.get(context);
}
if (bestMatchValue < 2 && hasValue(typeModeMap.get(DEFAULT_CONTEXT))) {
bestMatchValue = 2;
bestMatch = typeModeMap.get(DEFAULT_CONTEXT);
}
} }
if (hasValue(typeAndMDRepMap.get(DEFAULT_CONTEXT))) { if (bestMatchValue < 1 && hasValue(typeMap.get(DEFAULT_VIEW_MODE).get(DEFAULT_CONTEXT))) {
return typeAndMDRepMap.get(DEFAULT_CONTEXT); bestMatchValue = 1;
bestMatch = typeMap.get(DEFAULT_VIEW_MODE).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); console.log(bestMatch);
return bestMatch;
} }

View File

@@ -17,6 +17,12 @@ import { ItemSearchResult } from '../../../object-collection/shared/item-search-
}) })
@listableObjectComponent('PublicationSearchResult', ViewMode.DetailedListElement) @listableObjectComponent('PublicationSearchResult', ViewMode.DetailedListElement)
@listableObjectComponent('OrgUnitSearchResult', ViewMode.DetailedListElement)
@listableObjectComponent('PersonSearchResult', ViewMode.DetailedListElement)
@listableObjectComponent('JournalSearchResult', ViewMode.DetailedListElement)
@listableObjectComponent('JournalIssueSearchResult', ViewMode.DetailedListElement)
@listableObjectComponent('JournalVolumeSearchResult', ViewMode.DetailedListElement)
@listableObjectComponent('ProjectSearchResult', ViewMode.DetailedListElement)
export class ItemSearchResultDetailElementComponent extends SearchResultDetailElementComponent<ItemSearchResult, Item> { export class ItemSearchResultDetailElementComponent extends SearchResultDetailElementComponent<ItemSearchResult, Item> {
/** /**

View File

@@ -14,9 +14,9 @@
<div class="row mt-2" *ngIf="objects?.hasSucceeded" @fadeIn> <div class="row mt-2" *ngIf="objects?.hasSucceeded" @fadeIn>
<div class="col" <div class="col"
*ngFor="let object of objects?.payload?.page"> *ngFor="let object of objects?.payload?.page">
<ds-listable-object-component-loader [object]="object" [viewMode]="viewMode"></ds-listable-object-component-loader> <ds-listable-object-component-loader [object]="object" [viewMode]="viewMode" [context]="context"></ds-listable-object-component-loader>
</div> </div>
</div> </div>
<ds-error *ngIf="objects.hasFailed | async" message="{{'error.objects' | translate}}"></ds-error> <ds-error *ngIf="objects.hasFailed" message="{{'error.objects' | translate}}"></ds-error>
<ds-loading *ngIf="objects.isLoading | async" message="{{'loading.objects' | translate}}"></ds-loading> <ds-loading *ngIf="objects.isLoading" message="{{'loading.objects' | translate}}"></ds-loading>
</ds-pagination> </ds-pagination>

View File

@@ -1,9 +1,9 @@
@import '../../../styles/variables'; @import '../../../styles/variables';
@import '../../../styles/mixins'; @import '../../../styles/mixins';
ds-wrapper-detail-element ::ng-deep { :host::ng-deep {
div.thumbnail > img { div.thumbnail > img {
height: $card-thumbnail-height; height: $card-thumbnail-height;
width: 100%; width: 100%;
} }
} }

View File

@@ -16,6 +16,7 @@ import { ListableObject } from '../object-collection/shared/listable-object.mode
import { PaginationComponentOptions } from '../pagination/pagination-component-options.model'; import { PaginationComponentOptions } from '../pagination/pagination-component-options.model';
import { ViewMode } from '../../core/shared/view-mode.model'; import { ViewMode } from '../../core/shared/view-mode.model';
import { Context } from '../../core/shared/context.model';
/** /**
* This component renders a paginated set of results in the detail view. * This component renders a paginated set of results in the detail view.
@@ -50,6 +51,7 @@ export class ObjectDetailComponent {
* A boolean representing if to hide pagination when there is only a page * A boolean representing if to hide pagination when there is only a page
*/ */
@Input() hidePagerWhenSinglePage = true; @Input() hidePagerWhenSinglePage = true;
@Input() context: Context;
/** /**
* The list of objects to paginate * The list of objects to paginate

View File

@@ -1,12 +1,12 @@
import { Component } from '@angular/core'; import { Component } from '@angular/core';
import { focusShadow } from '../../../../animations/focus'; import { focusShadow } from '../../../../animations/focus';
import { ViewMode } from '../../../../../core/shared/view-mode.model'; import { ViewMode } from '../../../../../core/shared/view-mode.model';
import { DEFAULT_ITEM_TYPE, listableObjectComponent } from '../../../../object-collection/shared/listable-object/listable-object.decorator'; import { listableObjectComponent } from '../../../../object-collection/shared/listable-object/listable-object.decorator';
import { AbstractListableElementComponent } from '../../../../object-collection/shared/object-collection-element/abstract-listable-element.component'; import { AbstractListableElementComponent } from '../../../../object-collection/shared/object-collection-element/abstract-listable-element.component';
import { Item } from '../../../../../core/shared/item.model'; import { Item } from '../../../../../core/shared/item.model';
@listableObjectComponent('Publication', ViewMode.GridElement) @listableObjectComponent('Publication', ViewMode.GridElement)
@listableObjectComponent(DEFAULT_ITEM_TYPE, ViewMode.GridElement) @listableObjectComponent(Item.name, ViewMode.GridElement)
@Component({ @Component({
selector: 'ds-publication-grid-element', selector: 'ds-publication-grid-element',
styleUrls: ['./publication-grid-element.component.scss'], styleUrls: ['./publication-grid-element.component.scss'],

View File

@@ -13,11 +13,11 @@
<div class="card-columns row" *ngIf="objects?.hasSucceeded"> <div class="card-columns row" *ngIf="objects?.hasSucceeded">
<div class="card-column col col-sm-6 col-lg-4" *ngFor="let column of (columns$ | async)" @fadeIn> <div class="card-column col col-sm-6 col-lg-4" *ngFor="let column of (columns$ | async)" @fadeIn>
<div class="card-element" *ngFor="let object of column"> <div class="card-element" *ngFor="let object of column">
<ds-listable-object-component-loader [object]="object" [viewMode]="viewMode"></ds-listable-object-component-loader> <ds-listable-object-component-loader [object]="object" [viewMode]="viewMode" [context]="context"></ds-listable-object-component-loader>
</div> </div>
</div> </div>
</div> </div>
<ds-error *ngIf="objects.hasFailed | async" message="{{'error.objects' | translate}}"></ds-error> <ds-error *ngIf="objects.hasFailed" message="{{'error.objects' | translate}}"></ds-error>
<ds-loading *ngIf="objects.isLoading | async" message="{{'loading.objects' | translate}}"></ds-loading> <ds-loading *ngIf="objects.isLoading" message="{{'loading.objects' | translate}}"></ds-loading>
</ds-pagination> </ds-pagination>

View File

@@ -1,6 +1,6 @@
$ds-wrapper-grid-spacing: $spacer/2; $ds-wrapper-grid-spacing: $spacer/2;
ds-wrapper-grid-element ::ng-deep { :host ::ng-deep {
div.thumbnail > img { div.thumbnail > img {
height: $card-thumbnail-height; height: $card-thumbnail-height;
width: 100%; width: 100%;

View File

@@ -21,6 +21,7 @@ import { ListableObject } from '../object-collection/shared/listable-object.mode
import { PaginationComponentOptions } from '../pagination/pagination-component-options.model'; import { PaginationComponentOptions } from '../pagination/pagination-component-options.model';
import { ViewMode } from '../../core/shared/view-mode.model'; import { ViewMode } from '../../core/shared/view-mode.model';
import { Context } from '../../core/shared/context.model';
@Component({ @Component({
changeDetection: ChangeDetectionStrategy.Default, changeDetection: ChangeDetectionStrategy.Default,
@@ -32,12 +33,13 @@ import { ViewMode } from '../../core/shared/view-mode.model';
}) })
export class ObjectGridComponent implements OnInit { export class ObjectGridComponent implements OnInit {
viewMode = ViewMode.ListElement; viewMode = ViewMode.GridElement;
@Input() config: PaginationComponentOptions; @Input() config: PaginationComponentOptions;
@Input() sortConfig: SortOptions; @Input() sortConfig: SortOptions;
@Input() hideGear = false; @Input() hideGear = false;
@Input() hidePagerWhenSinglePage = true; @Input() hidePagerWhenSinglePage = true;
@Input() context: Context;
private _objects$: BehaviorSubject<RemoteData<PaginatedList<ListableObject>>>; private _objects$: BehaviorSubject<RemoteData<PaginatedList<ListableObject>>>;
@Input() set objects(objects: RemoteData<PaginatedList<ListableObject>>) { @Input() set objects(objects: RemoteData<PaginatedList<ListableObject>>) {

View File

@@ -7,7 +7,7 @@
</div> </div>
</a> </a>
<div class="card-body"> <div class="card-body">
<ds-item-type-badge [object]="object"></ds-item-type-badge> <ds-item-type-badge [object]="dso"></ds-item-type-badge>
<ds-truncatable-part [id]="dso.id" [minLines]="3" type="h4"> <ds-truncatable-part [id]="dso.id" [minLines]="3" type="h4">
<h4 class="card-title" [innerHTML]="dso.firstMetadataValue('dc.title')"></h4> <h4 class="card-title" [innerHTML]="dso.firstMetadataValue('dc.title')"></h4>
</ds-truncatable-part> </ds-truncatable-part>

View File

@@ -1,11 +1,11 @@
import { Component } from '@angular/core'; import { Component } from '@angular/core';
import { ViewMode } from '../../../../../core/shared/view-mode.model'; import { ViewMode } from '../../../../../core/shared/view-mode.model';
import { DEFAULT_ITEM_TYPE, listableObjectComponent } from '../../../../object-collection/shared/listable-object/listable-object.decorator'; import { listableObjectComponent } from '../../../../object-collection/shared/listable-object/listable-object.decorator';
import { AbstractListableElementComponent } from '../../../../object-collection/shared/object-collection-element/abstract-listable-element.component'; import { AbstractListableElementComponent } from '../../../../object-collection/shared/object-collection-element/abstract-listable-element.component';
import { Item } from '../../../../../core/shared/item.model'; import { Item } from '../../../../../core/shared/item.model';
@listableObjectComponent('Publication', ViewMode.ListElement) @listableObjectComponent('Publication', ViewMode.ListElement)
@listableObjectComponent(DEFAULT_ITEM_TYPE, ViewMode.ListElement) @listableObjectComponent(Item.name, ViewMode.ListElement)
@Component({ @Component({
selector: 'ds-publication-list-element', selector: 'ds-publication-list-element',
styleUrls: ['./publication-list-element.component.scss'], styleUrls: ['./publication-list-element.component.scss'],

View File

@@ -1,3 +1,3 @@
<div *ngIf="object && object.indexableObject && object.indexableObject.firstMetadataValue('relationship.type') as type"> <div *ngIf="object && object.firstMetadataValue('relationship.type') as type">
<span class="badge badge-light">{{ type.toLowerCase() + '.listelement.badge' | translate }}</span> <span class="badge badge-light">{{ type.toLowerCase() + '.listelement.badge' | translate }}</span>
</div> </div>

View File

@@ -3,9 +3,9 @@ import { Component } from '@angular/core';
import { MetadataRepresentationListElementComponent } from '../metadata-representation-list-element.component'; import { MetadataRepresentationListElementComponent } from '../metadata-representation-list-element.component';
import { ViewMode } from '../../../../core/shared/view-mode.model'; import { ViewMode } from '../../../../core/shared/view-mode.model';
import { metadataRepresentationComponent } from '../../../metadata-representation/metadata-representation.decorator'; import { metadataRepresentationComponent } from '../../../metadata-representation/metadata-representation.decorator';
import { DEFAULT_ITEM_TYPE } from '../../../object-collection/shared/listable-object/listable-object.decorator'; import { Item } from '../../../../core/shared/item.model';
@metadataRepresentationComponent(DEFAULT_ITEM_TYPE, MetadataRepresentationType.Item) @metadataRepresentationComponent(Item.name, MetadataRepresentationType.Item)
@Component({ @Component({
selector: 'ds-item-metadata-list-element', selector: 'ds-item-metadata-list-element',
templateUrl: './item-metadata-list-element.component.html' templateUrl: './item-metadata-list-element.component.html'

View File

@@ -2,11 +2,11 @@ import { MetadataRepresentationType } from '../../../../core/shared/metadata-rep
import { Component } from '@angular/core'; import { Component } from '@angular/core';
import { MetadataRepresentationListElementComponent } from '../metadata-representation-list-element.component'; import { MetadataRepresentationListElementComponent } from '../metadata-representation-list-element.component';
import { metadataRepresentationComponent } from '../../../metadata-representation/metadata-representation.decorator'; import { metadataRepresentationComponent } from '../../../metadata-representation/metadata-representation.decorator';
import { DEFAULT_ITEM_TYPE } from '../../../object-collection/shared/listable-object/listable-object.decorator'; import { Item } from '../../../../core/shared/item.model';
@metadataRepresentationComponent(DEFAULT_ITEM_TYPE, MetadataRepresentationType.PlainText) @metadataRepresentationComponent(Item.name, MetadataRepresentationType.PlainText)
// For now, authority controlled fields are rendered the same way as plain text fields // For now, authority controlled fields are rendered the same way as plain text fields
@metadataRepresentationComponent(DEFAULT_ITEM_TYPE, MetadataRepresentationType.AuthorityControlled) @metadataRepresentationComponent(Item.name, MetadataRepresentationType.AuthorityControlled)
@Component({ @Component({
selector: 'ds-plain-text-metadata-list-element', selector: 'ds-plain-text-metadata-list-element',
templateUrl: './plain-text-metadata-list-element.component.html' templateUrl: './plain-text-metadata-list-element.component.html'

View File

@@ -46,6 +46,7 @@ export class ClaimedSearchResultListElementComponent extends SearchResultListEle
* Initialize all instance variables * Initialize all instance variables
*/ */
ngOnInit() { ngOnInit() {
super.ngOnInit();
this.initWorkflowItem(this.dso.workflowitem as Observable<RemoteData<WorkflowItem>>); this.initWorkflowItem(this.dso.workflowitem as Observable<RemoteData<WorkflowItem>>);
} }

View File

@@ -1,4 +1,4 @@
import { Component } from '@angular/core'; import { Component, OnInit } from '@angular/core';
import { Item } from '../../../../core/shared/item.model'; import { Item } from '../../../../core/shared/item.model';
import { MyDspaceItemStatusType } from '../../../object-collection/shared/mydspace-item-status/my-dspace-item-status-type'; import { MyDspaceItemStatusType } from '../../../object-collection/shared/mydspace-item-status/my-dspace-item-status-type';
@@ -17,12 +17,14 @@ import { SearchResultListElementComponent } from '../../search-result-list-eleme
templateUrl: './item-search-result-list-element-submission.component.html' templateUrl: './item-search-result-list-element-submission.component.html'
}) })
@listableObjectComponent('PublicationSearchResult', ViewMode.ListElement, Context.Submission) @listableObjectComponent(ItemSearchResult.name, ViewMode.ListElement, Context.Submission)
export class ItemSearchResultListElementSubmissionComponent extends SearchResultListElementComponent<ItemSearchResult, Item> { export class ItemSearchResultListElementSubmissionComponent extends SearchResultListElementComponent<ItemSearchResult, Item> implements OnInit {
ngOnInit() {
super.ngOnInit();
}
/** /**
* Represent item's status * Represent item's status
*/ */
public status = MyDspaceItemStatusType.ARCHIVED; public status = MyDspaceItemStatusType.ARCHIVED;
} }

View File

@@ -51,6 +51,7 @@ export class PoolSearchResultListElementComponent extends SearchResultListElemen
* Initialize all instance variables * Initialize all instance variables
*/ */
ngOnInit() { ngOnInit() {
super.ngOnInit();
this.initWorkflowItem(this.dso.workflowitem as Observable<RemoteData<WorkflowItem>>); this.initWorkflowItem(this.dso.workflowitem as Observable<RemoteData<WorkflowItem>>);
} }

View File

@@ -39,6 +39,7 @@ export class WorkflowItemSearchResultListElementComponent extends SearchResultLi
* Initialize all instance variables * Initialize all instance variables
*/ */
ngOnInit() { ngOnInit() {
super.ngOnInit();
this.initItem(this.dso.item as Observable<RemoteData<Item>> ); this.initItem(this.dso.item as Observable<RemoteData<Item>> );
} }

View File

@@ -39,6 +39,7 @@ export class WorkspaceItemSearchResultListElementComponent extends SearchResultL
* Initialize all instance variables * Initialize all instance variables
*/ */
ngOnInit() { ngOnInit() {
super.ngOnInit();
this.initItem(this.dso.item as Observable<RemoteData<Item>>); this.initItem(this.dso.item as Observable<RemoteData<Item>>);
} }

View File

@@ -12,7 +12,7 @@
(paginationChange)="onPaginationChange($event)"> (paginationChange)="onPaginationChange($event)">
<ul *ngIf="objects?.hasSucceeded" class="list-unstyled"> <ul *ngIf="objects?.hasSucceeded" class="list-unstyled">
<li *ngFor="let object of objects?.payload?.page; let i = index; let last = last" class="mt-4 mb-4" [class.border-bottom]="hasBorder && !last"> <li *ngFor="let object of objects?.payload?.page; let i = index; let last = last" class="mt-4 mb-4" [class.border-bottom]="hasBorder && !last">
<ds-listable-object-component-loader [object]="object" [viewMode]="viewMode" [index]="i"></ds-listable-object-component-loader> <ds-listable-object-component-loader [object]="object" [viewMode]="viewMode" [index]="i" [context]="context"></ds-listable-object-component-loader>
</li> </li>
</ul> </ul>
</ds-pagination> </ds-pagination>

View File

@@ -13,6 +13,7 @@ import { fadeIn } from '../animations/fade';
import { ListableObject } from '../object-collection/shared/listable-object.model'; import { ListableObject } from '../object-collection/shared/listable-object.model';
import { PaginationComponentOptions } from '../pagination/pagination-component-options.model'; import { PaginationComponentOptions } from '../pagination/pagination-component-options.model';
import { ViewMode } from '../../core/shared/view-mode.model'; import { ViewMode } from '../../core/shared/view-mode.model';
import { Context } from '../../core/shared/context.model';
@Component({ @Component({
changeDetection: ChangeDetectionStrategy.Default, changeDetection: ChangeDetectionStrategy.Default,
@@ -29,6 +30,7 @@ export class ObjectListComponent {
@Input() hasBorder = false; @Input() hasBorder = false;
@Input() hideGear = false; @Input() hideGear = false;
@Input() hidePagerWhenSinglePage = true; @Input() hidePagerWhenSinglePage = true;
@Input() context: Context;
private _objects: RemoteData<PaginatedList<ListableObject>>; private _objects: RemoteData<PaginatedList<ListableObject>>;
@Input() set objects(objects: RemoteData<PaginatedList<ListableObject>>) { @Input() set objects(objects: RemoteData<PaginatedList<ListableObject>>) {
this._objects = objects; this._objects = objects;

View File

@@ -6,7 +6,6 @@ import { Collection } from '../../../../core/shared/collection.model';
import { CollectionSearchResult } from '../../../object-collection/shared/collection-search-result.model'; import { CollectionSearchResult } from '../../../object-collection/shared/collection-search-result.model';
import { ViewMode } from '../../../../core/shared/view-mode.model'; import { ViewMode } from '../../../../core/shared/view-mode.model';
import { listableObjectComponent } from '../../../object-collection/shared/listable-object/listable-object.decorator'; import { listableObjectComponent } from '../../../object-collection/shared/listable-object/listable-object.decorator';
import { BrowseEntry } from '../../../../core/shared/browse-entry.model';
@Component({ @Component({
selector: 'ds-collection-search-result-list-element', selector: 'ds-collection-search-result-list-element',

View File

@@ -1,13 +1,13 @@
<ds-item-type-badge [object]="dso"></ds-item-type-badge> <ds-item-type-badge [object]="dso"></ds-item-type-badge>
<ds-truncatable [id]="dso.id" *ngIf="object !== undefined && object !== null"> <ds-truncatable [id]="dso.id" *ngIf="object !== undefined && object !== null">
<a <a
[routerLink]="['/items/' + dso.id]" class="lead" [routerLink]="['/items/' + dso.id]" class="lead"
[innerHTML]="firstMetadataValue('dc.title')"></a> [innerHTML]="firstMetadataValue('dc.title')"></a>
<span class="text-muted"> <span class="text-muted">
<ds-truncatable-part [id]="dso.id" [minLines]="1"> <ds-truncatable-part [id]="dso.id" [minLines]="1">
<ng-container *ngIf="dso.firstMetadataValue('dc.publisher') || dso.firstMetadataValue('dc.date.issued')">(<span class="item-list-publisher" <ng-container *ngIf="dso.firstMetadataValue('dc.publisher') || dso.firstMetadataValue('dc.date.issued')">(<span class="item-list-publisher"
[innerHTML]="firstMetadataValue('dc.publisher')">, </span><span [innerHTML]="firstMetadataValue('dc.publisher')">, </span><span
*ngIf="dso.firstMetadataValue('dc.date.issued')" class="item-list-date" *ngIf="dso.firstMetadataValue('dc.date.issued')" class="item-list-date"
[innerHTML]="firstMetadataValue('dc.date.issued')"></span>)</ng-container> [innerHTML]="firstMetadataValue('dc.date.issued')"></span>)</ng-container>
<span *ngIf="dso.allMetadata(['dc.contributor.author', 'dc.creator', 'dc.contributor.*']).length > 0" <span *ngIf="dso.allMetadata(['dc.contributor.author', 'dc.creator', 'dc.contributor.*']).length > 0"
@@ -19,9 +19,9 @@
</span> </span>
</ds-truncatable-part> </ds-truncatable-part>
</span> </span>
<div *ngIf="dso.firstMetadataValue('dc.description.abstract')" class="item-list-abstract"> <div *ngIf="dso.firstMetadataValue('dc.description.abstract')" class="item-list-abstract">
<ds-truncatable-part [id]="dso.id" [minLines]="3"><span <ds-truncatable-part [id]="dso.id" [minLines]="3"><span
[innerHTML]="firstMetadataValue('dc.description.abstract')"></span> [innerHTML]="firstMetadataValue('dc.description.abstract')"></span>
</ds-truncatable-part> </ds-truncatable-part>
</div> </div>
</ds-truncatable> </ds-truncatable>