Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -236,7 +236,7 @@
"tslint": "5.11.0",
"typedoc": "^0.9.0",
"typescript": "^2.9.1",
"webdriver-manager": "^12.1.6",
"webdriver-manager": "^12.1.7",
"webpack": "^4.17.1",
"webpack-bundle-analyzer": "^3.3.2",
"webpack-dev-middleware": "3.2.0",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -117,9 +117,8 @@ export const getRelatedItemsByTypeLabel = (thisId: string, label: string) =>
* @param parentId The id of the parent item
* @param itemType The type of relation this list resembles (for creating representations)
* @param metadata The list of original Metadatum objects
* @param ids The ItemDataService to use for fetching Items from the Rest API
*/
export const relationsToRepresentations = (parentId: string, itemType: string, metadata: MetadataValue[], ids: ItemDataService) =>
export const relationsToRepresentations = (parentId: string, itemType: string, metadata: MetadataValue[]) =>
(source: Observable<Relationship[]>): Observable<MetadataRepresentation[]> =>
source.pipe(
flatMap((rels: Relationship[]) =>
Expand All @@ -139,7 +138,7 @@ export const relationsToRepresentations = (parentId: string, itemType: string, m
return leftItem.payload;
}
}),
map((item: Item) => Object.assign(new ItemMetadataRepresentation(), item))
map((item: Item) => Object.assign(new ItemMetadataRepresentation(metadatum), item))
);
}
} else {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -413,7 +413,7 @@ describe('ItemComponent', () => {
representations.subscribe((reps: MetadataRepresentation[]) => {
expect(reps[0].getValue()).toEqual('First value');
expect(reps[1].getValue()).toEqual('Second value');
expect(reps[2].getValue()).toEqual('related item');
expect(reps[2].getValue()).toEqual('Third value');
expect(reps[3].getValue()).toEqual('Fourth value');
});
});
Expand Down
45 changes: 1 addition & 44 deletions src/app/+item-page/simple/item-types/shared/item.component.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
import { Component, Inject, OnInit } from '@angular/core';
import { Observable , zip as observableZip, combineLatest as observableCombineLatest } from 'rxjs';
import { distinctUntilChanged, filter, flatMap, map } from 'rxjs/operators';
import { ItemDataService } from '../../../../core/data/item-data.service';
import { PaginatedList } from '../../../../core/data/paginated-list';
import { RemoteData } from '../../../../core/data/remote-data';
import { RelationshipType } from '../../../../core/shared/item-relationships/relationship-type.model';
Expand All @@ -10,49 +9,7 @@ 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 { 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';
import { of } from 'rxjs/internal/observable/of';
import { MetadataValue } from '../../../../core/shared/metadata.models';
import { compareArraysUsingIds } from './item-relationships-utils';

/**
* Operator for turning a list of relationships into a list of metadatarepresentations given the original metadata
* @param thisId The id of the parent item
* @param itemType The type of relation this list resembles (for creating representations)
* @param metadata The list of original Metadatum objects
*/
export const relationsToRepresentations = (thisId: string, itemType: string, metadata: MetadataValue[]) =>
(source: Observable<Relationship[]>): Observable<MetadataRepresentation[]> =>
source.pipe(
flatMap((rels: Relationship[]) =>
observableZip(
...metadata
.map((metadatum: any) => Object.assign(new MetadataValue(), metadatum))
.map((metadatum: MetadataValue) => {
if (metadatum.isVirtual) {
const matchingRels = rels.filter((rel: Relationship) => ('' + rel.id) === metadatum.virtualValue);
if (matchingRels.length > 0) {
const matchingRel = matchingRels[0];
return observableCombineLatest(matchingRel.leftItem, matchingRel.rightItem).pipe(
filter(([leftItem, rightItem]) => leftItem.hasSucceeded && rightItem.hasSucceeded),
map(([leftItem, rightItem]) => {
if (leftItem.payload.id === thisId) {
return rightItem.payload;
} else if (rightItem.payload.id === thisId) {
return leftItem.payload;
}
}),
map((item: Item) => Object.assign(new ItemMetadataRepresentation(), item))
);
}
} else {
return of(Object.assign(new MetadatumRepresentation(itemType), metadatum));
}
})
)
)
);
import { compareArraysUsingIds, relationsToRepresentations } from './item-relationships-utils';

@Component({
selector: 'ds-item',
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import { ItemMetadataRepresentation } from '../../../core/shared/metadata-repres

const itemType = 'type';
const metadataRepresentation1 = new MetadatumRepresentation(itemType);
const metadataRepresentation2 = new ItemMetadataRepresentation();
const metadataRepresentation2 = new ItemMetadataRepresentation(Object.assign({}));
const representations = [metadataRepresentation1, metadataRepresentation2];

describe('MetadataRepresentationListComponent', () => {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,38 +1,43 @@
import { MetadataRepresentationType } from '../metadata-representation.model';
import { ItemMetadataRepresentation, ItemTypeToValue } from './item-metadata-representation.model';
import { ItemMetadataRepresentation } from './item-metadata-representation.model';
import { Item } from '../../item.model';
import { MetadataMap, MetadataValue } from '../../metadata.models';
import { MetadataValue } from '../../metadata.models';

describe('ItemMetadataRepresentation', () => {
const valuePrefix = 'Test value for ';
const item = new Item();
const itemType = 'Item Type';
let itemMetadataRepresentation: ItemMetadataRepresentation;
const metadataMap = new MetadataMap();
for (const key of Object.keys(ItemTypeToValue)) {
metadataMap[ItemTypeToValue[key]] = [Object.assign(new MetadataValue(), {
value: `${valuePrefix}${ItemTypeToValue[key]}`
})];
}
item.metadata = metadataMap;
item.metadata = {
'dc.title': [
{
value: `${valuePrefix}dc.title`
}
] as MetadataValue[],
'dc.contributor.author': [
{
value: `${valuePrefix}dc.contributor.author`
}
] as MetadataValue[]
};

for (const itemType of Object.keys(ItemTypeToValue)) {
for (const metadataField of Object.keys(item.metadata)) {
describe(`when creating an ItemMetadataRepresentation`, () => {
beforeEach(() => {
item.metadata['relationship.type'] = [
Object.assign(new MetadataValue(), {
value: itemType
})
];

itemMetadataRepresentation = Object.assign(new ItemMetadataRepresentation(), item);
itemMetadataRepresentation = Object.assign(new ItemMetadataRepresentation(item.metadata[metadataField][0]), item);
});

it('should have a representation type of item', () => {
expect(itemMetadataRepresentation.representationType).toEqual(MetadataRepresentationType.Item);
});

it('should return the correct value when calling getValue', () => {
expect(itemMetadataRepresentation.getValue()).toEqual(`${valuePrefix}${ItemTypeToValue[itemType]}`);
expect(itemMetadataRepresentation.getValue()).toEqual(`${valuePrefix}${metadataField}`);
});

it('should return the correct item type', () => {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,21 +1,22 @@
import { Item } from '../../item.model';
import { MetadataRepresentation, MetadataRepresentationType } from '../metadata-representation.model';
import { hasValue } from '../../../../shared/empty.util';

/**
* An object to convert item types into the metadata field it should render for the item's value
*/
export const ItemTypeToValue = {
Default: 'dc.title',
Person: 'dc.contributor.author',
OrgUnit: 'dc.title'
};
import { MetadataValue } from '../../metadata.models';

/**
* This class determines which fields to use when rendering an Item as a metadata value.
*/
export class ItemMetadataRepresentation extends Item implements MetadataRepresentation {

/**
* The virtual metadata value representing this item
*/
virtualMetadata: MetadataValue;

constructor(virtualMetadata: MetadataValue) {
super();
this.virtualMetadata = virtualMetadata;
}

/**
* The type of item this item can be represented as
*/
Expand All @@ -34,13 +35,7 @@ export class ItemMetadataRepresentation extends Item implements MetadataRepresen
* Get the value to display, depending on the itemType
*/
getValue(): string {
let metadata;
if (hasValue(ItemTypeToValue[this.itemType])) {
metadata = ItemTypeToValue[this.itemType];
} else {
metadata = ItemTypeToValue.Default;
}
return this.firstMetadataValue(metadata);
return this.virtualMetadata.value;
}

}
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
<ng-template #descTemplate>
<span class="text-muted">
<span *ngIf="item.allMetadata(['dc.description']).length > 0"
<span *ngIf="metadataRepresentation.allMetadata(['dc.description']).length > 0"
class="item-list-job-title">
<span [innerHTML]="firstMetadataValue(['dc.description'])"></span>
<span [innerHTML]="metadataRepresentation.firstMetadataValue(['dc.description'])"></span>
</span>
</span>
</ng-template>
<ds-truncatable [id]="item.id">
<a [routerLink]="['/items/' + item.id]"
[innerHTML]="firstMetadataValue('organization.legalName')"
[tooltip]="descTemplate"></a>
<ds-truncatable [id]="metadataRepresentation.id">
<a [routerLink]="['/items/' + metadataRepresentation.id]"
[innerHTML]="metadataRepresentation.getValue()"
[tooltip]="metadataRepresentation.allMetadata(['dc.description']).length > 0 ? descTemplate : null"></a>
</ds-truncatable>
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { Component } from '@angular/core';
import { MetadataRepresentationType } from '../../../../core/shared/metadata-representation/metadata-representation.model';
import { ItemViewMode, 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 { ItemMetadataRepresentationListElementComponent } from '../../../../shared/object-list/metadata-representation-list-element/item/item-metadata-representation-list-element.component';

@rendersItemType('OrgUnit', ItemViewMode.Element, MetadataRepresentationType.Item)
@Component({
Expand All @@ -11,5 +11,5 @@ import { TypedItemSearchResultListElementComponent } from '../../../../shared/ob
/**
* The component for displaying a list element for an item of the type OrgUnit
*/
export class OrgUnitMetadataListElementComponent extends TypedItemSearchResultListElementComponent {
export class OrgUnitMetadataListElementComponent extends ItemMetadataRepresentationListElementComponent {
}
Original file line number Diff line number Diff line change
@@ -1,15 +1,15 @@
<ng-template #descTemplate>
<span class="text-muted">
<span *ngIf="item.allMetadata(['person.jobTitle']).length > 0"
<span *ngIf="metadataRepresentation.allMetadata(['person.jobTitle']).length > 0"
class="item-list-job-title">
<span *ngFor="let value of allMetadataValues(['person.jobTitle']); let last=last;">
<span *ngFor="let value of metadataRepresentation.allMetadataValues(['person.jobTitle']); let last=last;">
<span [innerHTML]="value"><span [innerHTML]="value"></span></span>
</span>
</span>
</span>
</ng-template>
<ds-truncatable [id]="item.id">
<a [routerLink]="['/items/' + item.id]"
[innerHTML]="firstMetadataValue('person.familyName') + ', ' + firstMetadataValue('person.givenName')"
[tooltip]="descTemplate"></a>
<ds-truncatable [id]="metadataRepresentation.id">
<a [routerLink]="['/items/' + metadataRepresentation.id]"
[innerHTML]="metadataRepresentation.getValue()"
[tooltip]="metadataRepresentation.allMetadata(['person.jobTitle']).length > 0 ? descTemplate : null"></a>
</ds-truncatable>
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { Component } from '@angular/core';
import { ItemViewMode, 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 { ItemMetadataRepresentationListElementComponent } from '../../../../shared/object-list/metadata-representation-list-element/item/item-metadata-representation-list-element.component';

@rendersItemType('Person', ItemViewMode.Element, MetadataRepresentationType.Item)
@Component({
Expand All @@ -11,5 +11,5 @@ import { TypedItemSearchResultListElementComponent } from '../../../../shared/ob
/**
* The component for displaying a list element for an item of the type Person
*/
export class PersonMetadataListElementComponent extends TypedItemSearchResultListElementComponent {
export class PersonMetadataListElementComponent extends ItemMetadataRepresentationListElementComponent {
}
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ const mockItem: Item = Object.assign(new Item(), {
]
}
});
const mockItemMetadataRepresentation = Object.assign(new ItemMetadataRepresentation(), mockItem);
const mockItemMetadataRepresentation = Object.assign(new ItemMetadataRepresentation(Object.assign({})), mockItem);
let viewMode = ItemViewMode.Full;

describe('ItemTypeSwitcherComponent', () => {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import { ItemMetadataListElementComponent } from './item-metadata-list-element.c
import { By } from '@angular/platform-browser';
import { ItemMetadataRepresentation } from '../../../../core/shared/metadata-representation/item/item-metadata-representation.model';

const mockItemMetadataRepresentation = new ItemMetadataRepresentation();
const mockItemMetadataRepresentation = new ItemMetadataRepresentation(Object.assign({}));

describe('ItemMetadataListElementComponent', () => {
let comp: ItemMetadataListElementComponent;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
import { MetadataRepresentationListElementComponent } from '../metadata-representation-list-element.component';
import { Component, Inject } from '@angular/core';
import { ITEM } from '../../../items/switcher/item-type-switcher.component';
import { ItemMetadataRepresentation } from '../../../../core/shared/metadata-representation/item/item-metadata-representation.model';

@Component({
selector: 'ds-item-metadata-representation-list-element',
template: ''
})
/**
* An abstract class for displaying a single ItemMetadataRepresentation
*/
export class ItemMetadataRepresentationListElementComponent extends MetadataRepresentationListElementComponent {
constructor(@Inject(ITEM) public metadataRepresentation: ItemMetadataRepresentation) {
super(metadataRepresentation);
}
}
4 changes: 3 additions & 1 deletion src/app/shared/shared.module.ts
Original file line number Diff line number Diff line change
Expand Up @@ -143,6 +143,7 @@ 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 { ItemMetadataRepresentationListElementComponent } from './object-list/metadata-representation-list-element/item/item-metadata-representation-list-element.component';

const MODULES = [
// Do NOT include UniversalModule, HttpModule, or JsonpModule here
Expand Down Expand Up @@ -310,7 +311,8 @@ const ENTRY_COMPONENTS = [
StartsWithTextComponent,
PlainTextMetadataListElementComponent,
ItemMetadataListElementComponent,
MetadataRepresentationListElementComponent
MetadataRepresentationListElementComponent,
ItemMetadataRepresentationListElementComponent
];

const SHARED_ITEM_PAGE_COMPONENTS = [
Expand Down
8 changes: 4 additions & 4 deletions yarn.lock
Original file line number Diff line number Diff line change
Expand Up @@ -11355,10 +11355,10 @@ webdriver-manager@^12.0.6:
semver "^5.3.0"
xml2js "^0.4.17"

webdriver-manager@^12.1.6:
version "12.1.6"
resolved "https://registry.yarnpkg.com/webdriver-manager/-/webdriver-manager-12.1.6.tgz#9e5410c506d1a7e0a7aa6af91ba3d5bb37f362b6"
integrity sha512-B1mOycNCrbk7xODw7Jgq/mdD3qzPxMaTsnKIQDy2nXlQoyjTrJTTD0vRpEZI9b8RibPEyQvh9zIZ0M1mpOxS3w==
webdriver-manager@^12.1.7:
version "12.1.7"
resolved "https://registry.yarnpkg.com/webdriver-manager/-/webdriver-manager-12.1.7.tgz#ed4eaee8f906b33c146e869b55e850553a1b1162"
integrity sha512-XINj6b8CYuUYC93SG3xPkxlyUc3IJbD6Vvo75CVGuG9uzsefDzWQrhz0Lq8vbPxtb4d63CZdYophF8k8Or/YiA==
dependencies:
adm-zip "^0.4.9"
chalk "^1.1.1"
Expand Down