mirror of
https://github.com/DSpace/dspace-angular.git
synced 2025-10-16 14:33:03 +00:00
Merge branch 'master' into w2p-62741_Entities-grid-templates
This commit is contained in:
@@ -1,5 +1,3 @@
|
||||
@import '../../../../styles/variables.scss';
|
||||
|
||||
.selectable-row:hover {
|
||||
cursor: pointer;
|
||||
}
|
||||
|
@@ -1,5 +1,3 @@
|
||||
@import '../../../../styles/variables.scss';
|
||||
|
||||
.selectable-row:hover {
|
||||
cursor: pointer;
|
||||
}
|
||||
|
@@ -1 +0,0 @@
|
||||
@import '../../../../styles/variables.scss';
|
@@ -1,4 +1,4 @@
|
||||
<nav @slideHorizontal class="navbar navbar-dark bg-dark p-0"
|
||||
<nav @slideHorizontal class="navbar navbar-dark p-0"
|
||||
[ngClass]="{'active': sidebarOpen, 'inactive': sidebarClosed}"
|
||||
[@slideSidebar]="{
|
||||
value: (!(sidebarExpanded | async) ? 'collapsed' : 'expanded'),
|
||||
|
@@ -1,5 +1,3 @@
|
||||
@import '../../../styles/variables.scss';
|
||||
@import '../../../styles/mixins.scss';
|
||||
$icon-z-index: 10;
|
||||
|
||||
:host {
|
||||
@@ -8,6 +6,7 @@ $icon-z-index: 10;
|
||||
height: 100vh;
|
||||
flex: 1 1 auto;
|
||||
nav {
|
||||
background-color: $admin-sidebar-bg;
|
||||
height: 100%;
|
||||
flex-direction: column;
|
||||
> div {
|
||||
@@ -44,7 +43,7 @@ $icon-z-index: 10;
|
||||
.sidebar-section {
|
||||
display: flex;
|
||||
align-content: stretch;
|
||||
background-color: $dark;
|
||||
background-color: $admin-sidebar-bg;
|
||||
.nav-item {
|
||||
padding-top: $spacer;
|
||||
padding-bottom: $spacer;
|
||||
|
@@ -1,5 +1,3 @@
|
||||
@import '../../../../styles/variables.scss';
|
||||
|
||||
::ng-deep {
|
||||
.fa-chevron-right {
|
||||
padding-left: $spacer/2;
|
||||
|
@@ -13,6 +13,7 @@ import { BrowseService } from '../../core/browse/browse.service';
|
||||
import { DSpaceObjectDataService } from '../../core/data/dspace-object-data.service';
|
||||
import { GLOBAL_CONFIG, GlobalConfig } from '../../../config';
|
||||
import { StartsWithType } from '../../shared/starts-with/starts-with-decorator';
|
||||
import { BrowseByType, rendersBrowseBy } from '../+browse-by-switcher/browse-by-decorator';
|
||||
|
||||
@Component({
|
||||
selector: 'ds-browse-by-date-page',
|
||||
@@ -21,9 +22,10 @@ import { StartsWithType } from '../../shared/starts-with/starts-with-decorator';
|
||||
})
|
||||
/**
|
||||
* Component for browsing items by metadata definition of type 'date'
|
||||
* A metadata definition is a short term used to describe one or multiple metadata fields.
|
||||
* A metadata definition (a.k.a. browse id) is a short term used to describe one or multiple metadata fields.
|
||||
* An example would be 'dateissued' for 'dc.date.issued'
|
||||
*/
|
||||
@rendersBrowseBy(BrowseByType.Date)
|
||||
export class BrowseByDatePageComponent extends BrowseByMetadataPageComponent {
|
||||
|
||||
/**
|
||||
@@ -53,12 +55,12 @@ export class BrowseByDatePageComponent extends BrowseByMetadataPageComponent {
|
||||
})
|
||||
.subscribe((params) => {
|
||||
const metadataField = params.metadataField || this.defaultMetadataField;
|
||||
this.metadata = params.metadata || this.defaultMetadata;
|
||||
this.browseId = params.id || this.defaultBrowseId;
|
||||
this.startsWith = +params.startsWith || params.startsWith;
|
||||
const searchOptions = browseParamsToOptions(params, Object.assign({}), this.sortConfig, this.metadata);
|
||||
const searchOptions = browseParamsToOptions(params, Object.assign({}), this.sortConfig, this.browseId);
|
||||
this.updatePageWithItems(searchOptions, this.value);
|
||||
this.updateParent(params.scope);
|
||||
this.updateStartsWithOptions(this.metadata, metadataField, params.scope);
|
||||
this.updateStartsWithOptions(this.browseId, metadataField, params.scope);
|
||||
}));
|
||||
}
|
||||
|
||||
@@ -78,8 +80,9 @@ export class BrowseByDatePageComponent extends BrowseByMetadataPageComponent {
|
||||
let lowerLimit = this.config.browseBy.defaultLowerLimit;
|
||||
if (hasValue(firstItemRD.payload)) {
|
||||
const date = firstItemRD.payload.firstMetadataValue(metadataField);
|
||||
if (hasValue(date) && hasValue(+date.split('-')[0])) {
|
||||
lowerLimit = +date.split('-')[0];
|
||||
if (hasValue(date)) {
|
||||
const dateObj = new Date(date);
|
||||
lowerLimit = dateObj.getFullYear();
|
||||
}
|
||||
}
|
||||
const options = [];
|
||||
|
@@ -1,7 +1,7 @@
|
||||
<div class="container">
|
||||
<div class="browse-by-metadata w-100">
|
||||
<ds-browse-by *ngIf="startsWithOptions" class="col-xs-12 w-100"
|
||||
title="{{'browse.title' | translate:{collection: (parent$ | async)?.payload?.name || '', field: 'browse.metadata.' + metadata | translate, value: (value)? '"' + value + '"': ''} }}"
|
||||
title="{{'browse.title' | translate:{collection: (parent$ | async)?.payload?.name || '', field: 'browse.metadata.' + browseId | translate, value: (value)? '"' + value + '"': ''} }}"
|
||||
[objects$]="(items$ !== undefined)? items$ : browseEntries$"
|
||||
[paginationConfig]="paginationConfig"
|
||||
[sortConfig]="sortConfig"
|
||||
|
@@ -15,6 +15,7 @@ import { DSpaceObjectDataService } from '../../core/data/dspace-object-data.serv
|
||||
import { DSpaceObject } from '../../core/shared/dspace-object.model';
|
||||
import { take } from 'rxjs/operators';
|
||||
import { StartsWithType } from '../../shared/starts-with/starts-with-decorator';
|
||||
import { BrowseByType, rendersBrowseBy } from '../+browse-by-switcher/browse-by-decorator';
|
||||
|
||||
@Component({
|
||||
selector: 'ds-browse-by-metadata-page',
|
||||
@@ -23,9 +24,10 @@ import { StartsWithType } from '../../shared/starts-with/starts-with-decorator';
|
||||
})
|
||||
/**
|
||||
* Component for browsing (items) by metadata definition
|
||||
* A metadata definition is a short term used to describe one or multiple metadata fields.
|
||||
* A metadata definition (a.k.a. browse id) is a short term used to describe one or multiple metadata fields.
|
||||
* An example would be 'author' for 'dc.contributor.*'
|
||||
*/
|
||||
@rendersBrowseBy(BrowseByType.Metadata)
|
||||
export class BrowseByMetadataPageComponent implements OnInit {
|
||||
|
||||
/**
|
||||
@@ -63,14 +65,14 @@ export class BrowseByMetadataPageComponent implements OnInit {
|
||||
subs: Subscription[] = [];
|
||||
|
||||
/**
|
||||
* The default metadata definition to resort to when none is provided
|
||||
* The default browse id to resort to when none is provided
|
||||
*/
|
||||
defaultMetadata = 'author';
|
||||
defaultBrowseId = 'author';
|
||||
|
||||
/**
|
||||
* The current metadata definition
|
||||
* The current browse id
|
||||
*/
|
||||
metadata = this.defaultMetadata;
|
||||
browseId = this.defaultBrowseId;
|
||||
|
||||
/**
|
||||
* The type of StartsWith options to render
|
||||
@@ -112,10 +114,10 @@ export class BrowseByMetadataPageComponent implements OnInit {
|
||||
return Object.assign({}, params, queryParams);
|
||||
})
|
||||
.subscribe((params) => {
|
||||
this.metadata = params.metadata || this.defaultMetadata;
|
||||
this.browseId = params.id || this.defaultBrowseId;
|
||||
this.value = +params.value || params.value || '';
|
||||
this.startsWith = +params.startsWith || params.startsWith;
|
||||
const searchOptions = browseParamsToOptions(params, this.paginationConfig, this.sortConfig, this.metadata);
|
||||
const searchOptions = browseParamsToOptions(params, this.paginationConfig, this.sortConfig, this.browseId);
|
||||
if (isNotEmpty(this.value)) {
|
||||
this.updatePageWithItems(searchOptions, this.value);
|
||||
} else {
|
||||
|
@@ -0,0 +1,12 @@
|
||||
import { BrowseByType, rendersBrowseBy } from './browse-by-decorator';
|
||||
|
||||
describe('BrowseByDecorator', () => {
|
||||
const titleDecorator = rendersBrowseBy(BrowseByType.Title);
|
||||
const dateDecorator = rendersBrowseBy(BrowseByType.Date);
|
||||
const metadataDecorator = rendersBrowseBy(BrowseByType.Metadata);
|
||||
it('should have a decorator for all types', () => {
|
||||
expect(titleDecorator.length).not.toEqual(0);
|
||||
expect(dateDecorator.length).not.toEqual(0);
|
||||
expect(metadataDecorator.length).not.toEqual(0);
|
||||
});
|
||||
});
|
@@ -0,0 +1,37 @@
|
||||
import { hasNoValue } from '../../shared/empty.util';
|
||||
|
||||
export enum BrowseByType {
|
||||
Title = 'title',
|
||||
Metadata = 'metadata',
|
||||
Date = 'date'
|
||||
}
|
||||
|
||||
export const DEFAULT_BROWSE_BY_TYPE = BrowseByType.Metadata;
|
||||
|
||||
const map = new Map();
|
||||
|
||||
/**
|
||||
* Decorator used for rendering Browse-By pages by type
|
||||
* @param browseByType The type of page
|
||||
*/
|
||||
export function rendersBrowseBy(browseByType: BrowseByType) {
|
||||
return function decorator(component: any) {
|
||||
if (hasNoValue(map.get(browseByType))) {
|
||||
map.set(browseByType, component);
|
||||
} else {
|
||||
throw new Error(`There can't be more than one component to render Browse-By of type "${browseByType}"`);
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the component used for rendering a Browse-By page by type
|
||||
* @param browseByType The type of page
|
||||
*/
|
||||
export function getComponentByBrowseByType(browseByType) {
|
||||
const comp = map.get(browseByType);
|
||||
if (hasNoValue(comp)) {
|
||||
map.get(DEFAULT_BROWSE_BY_TYPE);
|
||||
}
|
||||
return comp;
|
||||
}
|
@@ -0,0 +1 @@
|
||||
<ng-container *ngComponentOutlet="browseByComponent | async"></ng-container>
|
@@ -0,0 +1,55 @@
|
||||
import { BrowseBySwitcherComponent } from './browse-by-switcher.component';
|
||||
import { async, ComponentFixture, TestBed } from '@angular/core/testing';
|
||||
import { NO_ERRORS_SCHEMA } from '@angular/core';
|
||||
import { ENV_CONFIG, GLOBAL_CONFIG } from '../../../config';
|
||||
import { ActivatedRoute } from '@angular/router';
|
||||
import * as decorator from './browse-by-decorator';
|
||||
import createSpy = jasmine.createSpy;
|
||||
import { BehaviorSubject } from 'rxjs/internal/BehaviorSubject';
|
||||
|
||||
describe('BrowseBySwitcherComponent', () => {
|
||||
let comp: BrowseBySwitcherComponent;
|
||||
let fixture: ComponentFixture<BrowseBySwitcherComponent>;
|
||||
|
||||
const types = ENV_CONFIG.browseBy.types;
|
||||
|
||||
const params = new BehaviorSubject(createParamsWithId('initialValue'));
|
||||
|
||||
const activatedRouteStub = {
|
||||
params: params
|
||||
};
|
||||
|
||||
beforeEach(async(() => {
|
||||
TestBed.configureTestingModule({
|
||||
declarations: [ BrowseBySwitcherComponent ],
|
||||
providers: [
|
||||
{ provide: GLOBAL_CONFIG, useValue: ENV_CONFIG },
|
||||
{ provide: ActivatedRoute, useValue: activatedRouteStub }
|
||||
],
|
||||
schemas: [ NO_ERRORS_SCHEMA ]
|
||||
}).compileComponents();
|
||||
}));
|
||||
|
||||
beforeEach(async(() => {
|
||||
fixture = TestBed.createComponent(BrowseBySwitcherComponent);
|
||||
comp = fixture.componentInstance;
|
||||
spyOnProperty(decorator, 'getComponentByBrowseByType').and.returnValue(createSpy('getComponentByItemType'));
|
||||
}));
|
||||
|
||||
types.forEach((type) => {
|
||||
describe(`when switching to a browse-by page for "${type.id}"`, () => {
|
||||
beforeEach(() => {
|
||||
params.next(createParamsWithId(type.id));
|
||||
fixture.detectChanges();
|
||||
});
|
||||
|
||||
it(`should call getComponentByBrowseByType with type "${type.type}"`, () => {
|
||||
expect(decorator.getComponentByBrowseByType).toHaveBeenCalledWith(type.type);
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
export function createParamsWithId(id) {
|
||||
return { id: id };
|
||||
}
|
@@ -0,0 +1,40 @@
|
||||
import { Component, Inject, OnInit } from '@angular/core';
|
||||
import { ActivatedRoute } from '@angular/router';
|
||||
import { Observable } from 'rxjs/internal/Observable';
|
||||
import { GLOBAL_CONFIG, GlobalConfig } from '../../../config';
|
||||
import { BrowseByTypeConfig } from '../../../config/browse-by-type-config.interface';
|
||||
import { map, tap } from 'rxjs/operators';
|
||||
import { getComponentByBrowseByType } from './browse-by-decorator';
|
||||
|
||||
@Component({
|
||||
selector: 'ds-browse-by-switcher',
|
||||
templateUrl: './browse-by-switcher.component.html'
|
||||
})
|
||||
/**
|
||||
* Component for determining what Browse-By component to use depending on the metadata (browse ID) provided
|
||||
*/
|
||||
export class BrowseBySwitcherComponent implements OnInit {
|
||||
|
||||
/**
|
||||
* Resolved browse-by component
|
||||
*/
|
||||
browseByComponent: Observable<any>;
|
||||
|
||||
public constructor(@Inject(GLOBAL_CONFIG) public config: GlobalConfig,
|
||||
protected route: ActivatedRoute) {
|
||||
}
|
||||
|
||||
/**
|
||||
* Fetch the correct browse-by component by using the relevant config from environment.js
|
||||
*/
|
||||
ngOnInit(): void {
|
||||
this.browseByComponent = this.route.params.pipe(
|
||||
map((params) => {
|
||||
const id = params.id;
|
||||
return this.config.browseBy.types.find((config: BrowseByTypeConfig) => config.id === id);
|
||||
}),
|
||||
map((config: BrowseByTypeConfig) => getComponentByBrowseByType(config.type))
|
||||
);
|
||||
}
|
||||
|
||||
}
|
@@ -1,6 +1,5 @@
|
||||
import { combineLatest as observableCombineLatest } from 'rxjs';
|
||||
import { Component } from '@angular/core';
|
||||
import { ItemDataService } from '../../core/data/item-data.service';
|
||||
import { ActivatedRoute, Router } from '@angular/router';
|
||||
import { hasValue } from '../../shared/empty.util';
|
||||
import {
|
||||
@@ -11,6 +10,7 @@ import { BrowseEntrySearchOptions } from '../../core/browse/browse-entry-search-
|
||||
import { DSpaceObjectDataService } from '../../core/data/dspace-object-data.service';
|
||||
import { BrowseService } from '../../core/browse/browse.service';
|
||||
import { SortDirection, SortOptions } from '../../core/cache/models/sort-options.model';
|
||||
import { BrowseByType, rendersBrowseBy } from '../+browse-by-switcher/browse-by-decorator';
|
||||
|
||||
@Component({
|
||||
selector: 'ds-browse-by-title-page',
|
||||
@@ -20,6 +20,7 @@ import { SortDirection, SortOptions } from '../../core/cache/models/sort-options
|
||||
/**
|
||||
* Component for browsing items by title (dc.title)
|
||||
*/
|
||||
@rendersBrowseBy(BrowseByType.Title)
|
||||
export class BrowseByTitlePageComponent extends BrowseByMetadataPageComponent {
|
||||
|
||||
public constructor(protected route: ActivatedRoute,
|
||||
@@ -41,8 +42,8 @@ export class BrowseByTitlePageComponent extends BrowseByMetadataPageComponent {
|
||||
return Object.assign({}, params, queryParams, data);
|
||||
})
|
||||
.subscribe((params) => {
|
||||
this.metadata = params.metadata || this.defaultMetadata;
|
||||
this.updatePageWithItems(browseParamsToOptions(params, this.paginationConfig, this.sortConfig, this.metadata), undefined);
|
||||
this.browseId = params.id || this.defaultBrowseId;
|
||||
this.updatePageWithItems(browseParamsToOptions(params, this.paginationConfig, this.sortConfig, this.browseId), undefined);
|
||||
this.updateParent(params.scope)
|
||||
}));
|
||||
this.updateStartsWithTextOptions();
|
||||
|
@@ -1,6 +1,7 @@
|
||||
import { first } from 'rxjs/operators';
|
||||
import { BrowseByGuard } from './browse-by-guard';
|
||||
import { of as observableOf } from 'rxjs';
|
||||
import { ENV_CONFIG } from '../../config';
|
||||
|
||||
describe('BrowseByGuard', () => {
|
||||
describe('canActivate', () => {
|
||||
@@ -11,20 +12,20 @@ describe('BrowseByGuard', () => {
|
||||
const name = 'An interesting DSO';
|
||||
const title = 'Author';
|
||||
const field = 'Author';
|
||||
const metadata = 'author';
|
||||
const id = 'author';
|
||||
const metadataField = 'dc.contributor';
|
||||
const scope = '1234-65487-12354-1235';
|
||||
const value = 'Filter';
|
||||
|
||||
beforeEach(() => {
|
||||
dsoService = {
|
||||
findById: (id: string) => observableOf({ payload: { name: name }, hasSucceeded: true })
|
||||
findById: (dsoId: string) => observableOf({ payload: { name: name }, hasSucceeded: true })
|
||||
};
|
||||
|
||||
translateService = {
|
||||
instant: () => field
|
||||
};
|
||||
guard = new BrowseByGuard(dsoService, translateService);
|
||||
guard = new BrowseByGuard(ENV_CONFIG, dsoService, translateService);
|
||||
});
|
||||
|
||||
it('should return true, and sets up the data correctly, with a scope and value', () => {
|
||||
@@ -34,7 +35,7 @@ describe('BrowseByGuard', () => {
|
||||
metadataField,
|
||||
},
|
||||
params: {
|
||||
metadata,
|
||||
id,
|
||||
},
|
||||
queryParams: {
|
||||
scope,
|
||||
@@ -47,7 +48,7 @@ describe('BrowseByGuard', () => {
|
||||
(canActivate) => {
|
||||
const result = {
|
||||
title,
|
||||
metadata,
|
||||
id,
|
||||
metadataField,
|
||||
collection: name,
|
||||
field,
|
||||
@@ -66,7 +67,7 @@ describe('BrowseByGuard', () => {
|
||||
metadataField,
|
||||
},
|
||||
params: {
|
||||
metadata,
|
||||
id,
|
||||
},
|
||||
queryParams: {
|
||||
scope
|
||||
@@ -79,7 +80,7 @@ describe('BrowseByGuard', () => {
|
||||
(canActivate) => {
|
||||
const result = {
|
||||
title,
|
||||
metadata,
|
||||
id,
|
||||
metadataField,
|
||||
collection: name,
|
||||
field,
|
||||
@@ -98,7 +99,7 @@ describe('BrowseByGuard', () => {
|
||||
metadataField,
|
||||
},
|
||||
params: {
|
||||
metadata,
|
||||
id,
|
||||
},
|
||||
queryParams: {
|
||||
value
|
||||
@@ -110,7 +111,7 @@ describe('BrowseByGuard', () => {
|
||||
(canActivate) => {
|
||||
const result = {
|
||||
title,
|
||||
metadata,
|
||||
id,
|
||||
metadataField,
|
||||
collection: '',
|
||||
field,
|
||||
|
@@ -1,11 +1,12 @@
|
||||
import { ActivatedRouteSnapshot, CanActivate, RouterStateSnapshot } from '@angular/router';
|
||||
import { Injectable } from '@angular/core';
|
||||
import { Inject, Injectable } from '@angular/core';
|
||||
import { DSpaceObjectDataService } from '../core/data/dspace-object-data.service';
|
||||
import { hasValue } from '../shared/empty.util';
|
||||
import { hasNoValue, hasValue } from '../shared/empty.util';
|
||||
import { map } from 'rxjs/operators';
|
||||
import { getSucceededRemoteData } from '../core/shared/operators';
|
||||
import { TranslateService } from '@ngx-translate/core';
|
||||
import { of as observableOf } from 'rxjs';
|
||||
import { GLOBAL_CONFIG, GlobalConfig } from '../../config';
|
||||
|
||||
@Injectable()
|
||||
/**
|
||||
@@ -13,36 +14,43 @@ import { of as observableOf } from 'rxjs';
|
||||
*/
|
||||
export class BrowseByGuard implements CanActivate {
|
||||
|
||||
constructor(protected dsoService: DSpaceObjectDataService,
|
||||
constructor(@Inject(GLOBAL_CONFIG) public config: GlobalConfig,
|
||||
protected dsoService: DSpaceObjectDataService,
|
||||
protected translate: TranslateService) {
|
||||
}
|
||||
|
||||
canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) {
|
||||
const title = route.data.title;
|
||||
const metadata = route.params.metadata || route.queryParams.metadata || route.data.metadata;
|
||||
const metadataField = route.data.metadataField;
|
||||
const id = route.params.id || route.queryParams.id || route.data.id;
|
||||
let metadataField = route.data.metadataField;
|
||||
if (hasNoValue(metadataField) && hasValue(id)) {
|
||||
const config = this.config.browseBy.types.find((conf) => conf.id === id);
|
||||
if (hasValue(config) && hasValue(config.metadataField)) {
|
||||
metadataField = config.metadataField;
|
||||
}
|
||||
}
|
||||
const scope = route.queryParams.scope;
|
||||
const value = route.queryParams.value;
|
||||
const metadataTranslated = this.translate.instant('browse.metadata.' + metadata);
|
||||
const metadataTranslated = this.translate.instant('browse.metadata.' + id);
|
||||
if (hasValue(scope)) {
|
||||
const dsoAndMetadata$ = this.dsoService.findById(scope).pipe(getSucceededRemoteData());
|
||||
return dsoAndMetadata$.pipe(
|
||||
map((dsoRD) => {
|
||||
const name = dsoRD.payload.name;
|
||||
route.data = this.createData(title, metadata, metadataField, name, metadataTranslated, value);
|
||||
route.data = this.createData(title, id, metadataField, name, metadataTranslated, value);
|
||||
return true;
|
||||
})
|
||||
);
|
||||
} else {
|
||||
route.data = this.createData(title, metadata, metadataField, '', metadataTranslated, value);
|
||||
route.data = this.createData(title, id, metadataField, '', metadataTranslated, value);
|
||||
return observableOf(true);
|
||||
}
|
||||
}
|
||||
|
||||
private createData(title, metadata, metadataField, collection, field, value) {
|
||||
private createData(title, id, metadataField, collection, field, value) {
|
||||
return {
|
||||
title: title,
|
||||
metadata: metadata,
|
||||
id: id,
|
||||
metadataField: metadataField,
|
||||
collection: collection,
|
||||
field: field,
|
||||
|
@@ -1,16 +1,12 @@
|
||||
import { RouterModule } from '@angular/router';
|
||||
import { NgModule } from '@angular/core';
|
||||
import { BrowseByTitlePageComponent } from './+browse-by-title-page/browse-by-title-page.component';
|
||||
import { BrowseByMetadataPageComponent } from './+browse-by-metadata-page/browse-by-metadata-page.component';
|
||||
import { BrowseByDatePageComponent } from './+browse-by-date-page/browse-by-date-page.component';
|
||||
import { BrowseByGuard } from './browse-by-guard';
|
||||
import { BrowseBySwitcherComponent } from './+browse-by-switcher/browse-by-switcher.component';
|
||||
|
||||
@NgModule({
|
||||
imports: [
|
||||
RouterModule.forChild([
|
||||
{ path: 'title', component: BrowseByTitlePageComponent, canActivate: [BrowseByGuard], data: { metadata: 'title', title: 'browse.title' } },
|
||||
{ path: 'dateissued', component: BrowseByDatePageComponent, canActivate: [BrowseByGuard], data: { metadata: 'dateissued', metadataField: 'dc.date.issued', title: 'browse.title' } },
|
||||
{ path: ':metadata', component: BrowseByMetadataPageComponent, canActivate: [BrowseByGuard], data: { title: 'browse.title' } }
|
||||
{ path: ':id', component: BrowseBySwitcherComponent, canActivate: [BrowseByGuard], data: { title: 'browse.title' } }
|
||||
])
|
||||
]
|
||||
})
|
||||
|
@@ -8,6 +8,7 @@ import { BrowseService } from '../core/browse/browse.service';
|
||||
import { BrowseByMetadataPageComponent } from './+browse-by-metadata-page/browse-by-metadata-page.component';
|
||||
import { BrowseByDatePageComponent } from './+browse-by-date-page/browse-by-date-page.component';
|
||||
import { BrowseByGuard } from './browse-by-guard';
|
||||
import { BrowseBySwitcherComponent } from './+browse-by-switcher/browse-by-switcher.component';
|
||||
|
||||
@NgModule({
|
||||
imports: [
|
||||
@@ -18,12 +19,18 @@ import { BrowseByGuard } from './browse-by-guard';
|
||||
declarations: [
|
||||
BrowseByTitlePageComponent,
|
||||
BrowseByMetadataPageComponent,
|
||||
BrowseByDatePageComponent
|
||||
BrowseByDatePageComponent,
|
||||
BrowseBySwitcherComponent
|
||||
],
|
||||
providers: [
|
||||
ItemDataService,
|
||||
BrowseService,
|
||||
BrowseByGuard
|
||||
],
|
||||
entryComponents: [
|
||||
BrowseByTitlePageComponent,
|
||||
BrowseByMetadataPageComponent,
|
||||
BrowseByDatePageComponent
|
||||
]
|
||||
})
|
||||
export class BrowseByModule {
|
||||
|
@@ -1 +0,0 @@
|
||||
@import '../../styles/variables.scss';
|
||||
|
@@ -1 +0,0 @@
|
||||
@import '../../styles/variables.scss';
|
||||
|
@@ -1 +0,0 @@
|
||||
@import '../../../styles/variables.scss';
|
||||
|
@@ -1 +0,0 @@
|
||||
@import '../../../styles/variables.scss';
|
||||
|
@@ -1,16 +1,14 @@
|
||||
@import '../../../styles/variables.scss';
|
||||
|
||||
:host {
|
||||
display: block;
|
||||
margin-top: -$content-spacing;
|
||||
margin-bottom: -$content-spacing;
|
||||
display: block;
|
||||
margin-top: -$content-spacing;
|
||||
margin-bottom: -$content-spacing;
|
||||
}
|
||||
|
||||
.display-3 {
|
||||
word-break: break-word;
|
||||
word-break: break-word;
|
||||
}
|
||||
|
||||
.dspace-logo {
|
||||
height: 110px;
|
||||
width: 110px;
|
||||
}
|
||||
height: 110px;
|
||||
width: 110px;
|
||||
}
|
0
src/app/+home-page/home-page.component.default.scss
Normal file
0
src/app/+home-page/home-page.component.default.scss
Normal file
@@ -1 +1,2 @@
|
||||
@import '../../styles/variables.scss';
|
||||
:host {
|
||||
}
|
@@ -1,5 +1,3 @@
|
||||
@import '../../../styles/variables.scss';
|
||||
|
||||
.btn {
|
||||
min-width: $edit-item-button-min-width;
|
||||
}
|
||||
|
@@ -1 +0,0 @@
|
||||
@import '../../../../styles/variables.scss';
|
@@ -1,4 +1,3 @@
|
||||
@import '../../../../../styles/variables.scss';
|
||||
.btn[disabled] {
|
||||
color: $gray-600;
|
||||
border-color: $gray-600;
|
||||
|
@@ -1,5 +1,3 @@
|
||||
@import '../../../../styles/variables.scss';
|
||||
|
||||
.button-row {
|
||||
.btn {
|
||||
margin-right: 0.5 * $spacer;
|
||||
|
@@ -1,5 +1,3 @@
|
||||
@import '../../../../styles/variables.scss';
|
||||
|
||||
:host {
|
||||
.simple-view-element {
|
||||
margin-bottom: 15px;
|
||||
|
@@ -1 +0,0 @@
|
||||
@import '../../../../styles/variables.scss';
|
||||
|
@@ -1 +0,0 @@
|
||||
@import '../../../../styles/variables.scss';
|
||||
|
@@ -1,5 +1,3 @@
|
||||
@import '../../../../../styles/variables';
|
||||
@import '../../../../../styles/mixins';
|
||||
@media screen and (min-width: map-get($grid-breakpoints, md)) {
|
||||
dt {
|
||||
text-align: right;
|
||||
|
@@ -1,5 +1,3 @@
|
||||
@import '../../../styles/variables.scss';
|
||||
|
||||
:host {
|
||||
div.simple-view-link {
|
||||
text-align: center;
|
||||
|
@@ -21,6 +21,10 @@
|
||||
[fields]="['journalvolume.identifier.name']"
|
||||
[label]="'publication.page.volume-title'">
|
||||
</ds-generic-item-page-field>
|
||||
<ds-generic-item-page-field [item]="item"
|
||||
[fields]="['dc.publisher']"
|
||||
[label]="'publication.page.publisher'">
|
||||
</ds-generic-item-page-field>
|
||||
</div>
|
||||
<div class="col-xs-12 col-md-6">
|
||||
<ds-metadata-representation-list
|
||||
@@ -40,6 +44,11 @@
|
||||
[label]="'relationships.isJournalIssueOf' | translate">
|
||||
</ds-related-items>
|
||||
<ds-item-page-abstract-field [item]="item"></ds-item-page-abstract-field>
|
||||
<ds-generic-item-page-field [item]="item"
|
||||
[fields]="['dc.description']"
|
||||
[label]="'publication.page.description'">
|
||||
</ds-generic-item-page-field>
|
||||
|
||||
<ds-generic-item-page-field [item]="item"
|
||||
[fields]="['dc.subject']"
|
||||
[separator]="','"
|
||||
|
@@ -1,12 +1,10 @@
|
||||
import { ChangeDetectionStrategy, Component, Inject, OnInit } from '@angular/core';
|
||||
import { ChangeDetectionStrategy, Component, OnInit } from '@angular/core';
|
||||
import { Observable } from 'rxjs';
|
||||
import { ItemDataService } from '../../../../core/data/item-data.service';
|
||||
import { Item } from '../../../../core/shared/item.model';
|
||||
import {
|
||||
DEFAULT_ITEM_TYPE, ItemViewMode,
|
||||
rendersItemType
|
||||
} from '../../../../shared/items/item-type-decorator';
|
||||
import { ITEM } from '../../../../shared/items/switcher/item-type-switcher.component';
|
||||
import { ItemComponent } from '../shared/item.component';
|
||||
import { MetadataRepresentation } from '../../../../core/shared/metadata-representation/metadata-representation.model';
|
||||
import { filterRelationsByTypeLabel, relationsToItems } from '../shared/item-relationships-utils';
|
||||
@@ -40,33 +38,26 @@ export class PublicationComponent extends ItemComponent implements OnInit {
|
||||
*/
|
||||
journalIssues$: Observable<Item[]>;
|
||||
|
||||
constructor(
|
||||
@Inject(ITEM) public item: Item,
|
||||
private ids: ItemDataService
|
||||
) {
|
||||
super(item);
|
||||
}
|
||||
|
||||
ngOnInit(): void {
|
||||
super.ngOnInit();
|
||||
|
||||
if (this.resolvedRelsAndTypes$) {
|
||||
|
||||
this.authors$ = this.buildRepresentations('Person', 'dc.contributor.author', this.ids);
|
||||
this.authors$ = this.buildRepresentations('Person', 'dc.contributor.author');
|
||||
|
||||
this.projects$ = this.resolvedRelsAndTypes$.pipe(
|
||||
filterRelationsByTypeLabel('isProjectOfPublication'),
|
||||
relationsToItems(this.item.id, this.ids)
|
||||
relationsToItems(this.item.id)
|
||||
);
|
||||
|
||||
this.orgUnits$ = this.resolvedRelsAndTypes$.pipe(
|
||||
filterRelationsByTypeLabel('isOrgUnitOfPublication'),
|
||||
relationsToItems(this.item.id, this.ids)
|
||||
relationsToItems(this.item.id)
|
||||
);
|
||||
|
||||
this.journalIssues$ = this.resolvedRelsAndTypes$.pipe(
|
||||
filterRelationsByTypeLabel('isJournalIssueOfPublication'),
|
||||
relationsToItems(this.item.id, this.ids)
|
||||
relationsToItems(this.item.id)
|
||||
);
|
||||
|
||||
}
|
||||
|
@@ -8,7 +8,7 @@ import { Observable } from 'rxjs/internal/Observable';
|
||||
import { Relationship } from '../../../../core/shared/item-relationships/relationship.model';
|
||||
import { RelationshipType } from '../../../../core/shared/item-relationships/relationship-type.model';
|
||||
import { distinctUntilChanged, flatMap, map } from 'rxjs/operators';
|
||||
import { of as observableOf, zip as observableZip } from 'rxjs';
|
||||
import { of as observableOf, zip as observableZip, combineLatest as observableCombineLatest } from 'rxjs';
|
||||
import { ItemDataService } from '../../../../core/data/item-data.service';
|
||||
import { Item } from '../../../../core/shared/item.model';
|
||||
import { RemoteData } from '../../../../core/data/remote-data';
|
||||
@@ -60,27 +60,26 @@ export const filterRelationsByTypeLabel = (label: string) =>
|
||||
/**
|
||||
* Operator for turning a list of relationships into a list of the relevant items
|
||||
* @param {string} thisId The item's id of which the relations belong to
|
||||
* @param {ItemDataService} ids The ItemDataService to fetch items from the REST API
|
||||
* @returns {(source: Observable<Relationship[]>) => Observable<Item[]>}
|
||||
*/
|
||||
export const relationsToItems = (thisId: string, ids: ItemDataService) =>
|
||||
export const relationsToItems = (thisId: string) =>
|
||||
(source: Observable<Relationship[]>): Observable<Item[]> =>
|
||||
source.pipe(
|
||||
flatMap((rels: Relationship[]) =>
|
||||
observableZip(
|
||||
...rels.map((rel: Relationship) => {
|
||||
let queryId = rel.leftId;
|
||||
if (rel.leftId === thisId) {
|
||||
queryId = rel.rightId;
|
||||
}
|
||||
return ids.findById(queryId);
|
||||
})
|
||||
...rels.map((rel: Relationship) => observableCombineLatest(rel.leftItem, rel.rightItem))
|
||||
)
|
||||
),
|
||||
map((arr: Array<RemoteData<Item>>) =>
|
||||
map((arr) =>
|
||||
arr
|
||||
.filter((d: RemoteData<Item>) => d.hasSucceeded)
|
||||
.map((d: RemoteData<Item>) => d.payload)),
|
||||
.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;
|
||||
}
|
||||
})),
|
||||
distinctUntilChanged(compareArraysUsingIds()),
|
||||
);
|
||||
|
||||
@@ -103,13 +102,15 @@ export const relationsToRepresentations = (parentId: string, itemType: string, m
|
||||
const matchingRels = rels.filter((rel: Relationship) => ('' + rel.id) === metadatum.virtualValue);
|
||||
if (matchingRels.length > 0) {
|
||||
const matchingRel = matchingRels[0];
|
||||
let queryId = matchingRel.leftId;
|
||||
if (matchingRel.leftId === parentId) {
|
||||
queryId = matchingRel.rightId;
|
||||
}
|
||||
return ids.findById(queryId).pipe(
|
||||
getSucceededRemoteData(),
|
||||
map((d: RemoteData<Item>) => Object.assign(new ItemMetadataRepresentation(), d.payload))
|
||||
return observableCombineLatest(matchingRel.leftItem, matchingRel.rightItem).pipe(
|
||||
map(([leftItem, rightItem]) => {
|
||||
if (leftItem.payload.id === parentId) {
|
||||
return rightItem.payload;
|
||||
} else if (rightItem.payload.id === parentId) {
|
||||
return leftItem.payload;
|
||||
}
|
||||
}),
|
||||
map((item: Item) => Object.assign(new ItemMetadataRepresentation(), item))
|
||||
);
|
||||
}
|
||||
} else {
|
||||
|
@@ -319,20 +319,31 @@ describe('ItemComponent', () => {
|
||||
let fixture: ComponentFixture<ItemComponent>;
|
||||
|
||||
const metadataField = 'dc.contributor.author';
|
||||
const relatedItem = Object.assign(new Item(), {
|
||||
id: '2',
|
||||
metadata: Object.assign(new MetadataMap(), {
|
||||
'dc.title': [
|
||||
{
|
||||
language: 'en_US',
|
||||
value: 'related item'
|
||||
}
|
||||
]
|
||||
})
|
||||
});
|
||||
const mockItem = Object.assign(new Item(), {
|
||||
id: '1',
|
||||
uuid: '1',
|
||||
metadata: new MetadataMap(),
|
||||
relationships: observableOf(new RemoteData(false, false, true, null, new PaginatedList(new PageInfo(), [
|
||||
Object.assign(new Relationship(), {
|
||||
uuid: '123',
|
||||
id: '123',
|
||||
leftId: '1',
|
||||
rightId: '2',
|
||||
relationshipType: observableOf(new RemoteData(false, false, true, null, new RelationshipType()))
|
||||
})
|
||||
])))
|
||||
metadata: new MetadataMap()
|
||||
});
|
||||
mockItem.relationships = observableOf(new RemoteData(false, false, true, null, new PaginatedList(new PageInfo(), [
|
||||
Object.assign(new Relationship(), {
|
||||
uuid: '123',
|
||||
id: '123',
|
||||
leftItem: observableOf(new RemoteData(false, false, true, null, mockItem)),
|
||||
rightItem: observableOf(new RemoteData(false, false, true, null, relatedItem)),
|
||||
relationshipType: observableOf(new RemoteData(false, false, true, null, new RelationshipType()))
|
||||
})
|
||||
])));
|
||||
mockItem.metadata[metadataField] = [
|
||||
{
|
||||
value: 'Second value',
|
||||
@@ -353,17 +364,6 @@ describe('ItemComponent', () => {
|
||||
authority: '123'
|
||||
}
|
||||
] as MetadataValue[];
|
||||
const relatedItem = Object.assign(new Item(), {
|
||||
id: '2',
|
||||
metadata: Object.assign(new MetadataMap(), {
|
||||
'dc.title': [
|
||||
{
|
||||
language: 'en_US',
|
||||
value: 'related item'
|
||||
}
|
||||
]
|
||||
})
|
||||
});
|
||||
const mockItemDataService = Object.assign({
|
||||
findById: (id) => {
|
||||
if (id === relatedItem.id) {
|
||||
@@ -397,7 +397,7 @@ describe('ItemComponent', () => {
|
||||
fixture = TestBed.createComponent(ItemComponent);
|
||||
comp = fixture.componentInstance;
|
||||
fixture.detectChanges();
|
||||
representations = comp.buildRepresentations('bogus', metadataField, mockItemDataService);
|
||||
representations = comp.buildRepresentations('bogus', metadataField);
|
||||
}));
|
||||
|
||||
it('should contain exactly 4 metadata-representations', () => {
|
||||
|
@@ -1,5 +1,5 @@
|
||||
import { Component, Inject, OnInit } from '@angular/core';
|
||||
import { combineLatest as observableCombineLatest, Observable, zip as observableZip } from 'rxjs';
|
||||
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';
|
||||
@@ -7,10 +7,52 @@ import { RemoteData } from '../../../../core/data/remote-data';
|
||||
import { RelationshipType } from '../../../../core/shared/item-relationships/relationship-type.model';
|
||||
import { Relationship } from '../../../../core/shared/item-relationships/relationship.model';
|
||||
import { Item } from '../../../../core/shared/item.model';
|
||||
import { MetadataRepresentation } from '../../../../core/shared/metadata-representation/metadata-representation.model';
|
||||
import { getRemoteDataPayload, getSucceededRemoteData } from '../../../../core/shared/operators';
|
||||
import { ITEM } from '../../../../shared/items/switcher/item-type-switcher.component';
|
||||
import { compareArraysUsingIds, relationsToRepresentations } from './item-relationships-utils';
|
||||
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));
|
||||
}
|
||||
})
|
||||
)
|
||||
)
|
||||
);
|
||||
|
||||
@Component({
|
||||
selector: 'ds-item',
|
||||
@@ -60,9 +102,8 @@ export class ItemComponent implements OnInit {
|
||||
* certain type.
|
||||
* @param itemType The type of item we're building representations of. Used for matching templates.
|
||||
* @param metadataField The metadata field that resembles the item type.
|
||||
* @param itemDataService ItemDataService to turn relations into items.
|
||||
*/
|
||||
buildRepresentations(itemType: string, metadataField: string, itemDataService: ItemDataService): Observable<MetadataRepresentation[]> {
|
||||
buildRepresentations(itemType: string, metadataField: string): Observable<MetadataRepresentation[]> {
|
||||
const metadata = this.item.findMetadataSortedByPlace(metadataField);
|
||||
const relsCurrentPage$ = this.item.relationships.pipe(
|
||||
getSucceededRemoteData(),
|
||||
@@ -72,7 +113,7 @@ export class ItemComponent implements OnInit {
|
||||
);
|
||||
|
||||
return relsCurrentPage$.pipe(
|
||||
relationsToRepresentations(this.item.id, itemType, metadata, itemDataService)
|
||||
relationsToRepresentations(this.item.id, itemType, metadata)
|
||||
);
|
||||
}
|
||||
|
||||
|
@@ -1,5 +1,3 @@
|
||||
@import '../../styles/variables.scss';
|
||||
|
||||
.login-logo {
|
||||
height: $login-logo-height;
|
||||
width: $login-logo-width;
|
||||
|
@@ -1,5 +1,3 @@
|
||||
@import '../../../../../styles/variables.scss';
|
||||
@import '../../../../../styles/mixins.scss';
|
||||
|
||||
.filters {
|
||||
.toggle-more-filters a {
|
||||
|
@@ -1,9 +1,9 @@
|
||||
<a *ngIf="isVisible | async" class="d-flex flex-row"
|
||||
[routerLink]="[getSearchLink()]"
|
||||
[queryParams]="addQueryParams" queryParamsHandling="merge">
|
||||
<input type="checkbox" [checked]="false" class="my-1 align-self-stretch"/>
|
||||
<span class="filter-value px-1">{{filterValue.value}}</span>
|
||||
<span class="float-right filter-value-count ml-auto">
|
||||
[routerLink]="[getSearchLink()]"
|
||||
[queryParams]="addQueryParams" queryParamsHandling="merge">
|
||||
<input type="checkbox" [checked]="false" class="my-1 align-self-stretch"/>
|
||||
<span class="filter-value px-1">{{filterValue.value}}</span>
|
||||
<span class="float-right filter-value-count ml-auto">
|
||||
<span class="badge badge-secondary badge-pill">{{filterValue.count}}</span>
|
||||
</span>
|
||||
</a>
|
||||
</a>
|
||||
|
@@ -1,5 +1,3 @@
|
||||
@import '../../../../../../styles/variables.scss';
|
||||
|
||||
a {
|
||||
color: $body-color;
|
||||
&:hover, &focus {
|
||||
|
@@ -1,8 +1,8 @@
|
||||
<a *ngIf="isVisible | async" class="d-flex flex-row"
|
||||
[routerLink]="[getSearchLink()]"
|
||||
[queryParams]="changeQueryParams" queryParamsHandling="merge">
|
||||
<span class="filter-value px-1">{{filterValue.label}}</span>
|
||||
<span class="float-right filter-value-count ml-auto">
|
||||
<span class="filter-value px-1">{{filterValue.label}}</span>
|
||||
<span class="float-right filter-value-count ml-auto">
|
||||
<span class="badge badge-secondary badge-pill">{{filterValue.count}}</span>
|
||||
</span>
|
||||
</a>
|
||||
|
@@ -1,5 +1,3 @@
|
||||
@import '../../../../../../styles/variables.scss';
|
||||
|
||||
a {
|
||||
color: $link-color;
|
||||
&:hover {
|
||||
|
@@ -18,6 +18,7 @@ const rangeDelimiter = '-';
|
||||
@Component({
|
||||
selector: 'ds-search-facet-range-option',
|
||||
styleUrls: ['./search-facet-range-option.component.scss'],
|
||||
// templateUrl: './search-facet-range-option.component.html',
|
||||
templateUrl: './search-facet-range-option.component.html',
|
||||
})
|
||||
|
||||
|
@@ -1,5 +1,3 @@
|
||||
@import '../../../../../../styles/variables.scss';
|
||||
|
||||
a {
|
||||
color: $body-color;
|
||||
&:hover, &focus {
|
||||
|
@@ -1,12 +1,12 @@
|
||||
import {
|
||||
combineLatest as observableCombineLatest,
|
||||
of as observableOf,
|
||||
BehaviorSubject,
|
||||
combineLatest as observableCombineLatest,
|
||||
Observable,
|
||||
of as observableOf,
|
||||
Subject,
|
||||
Subscription
|
||||
} from 'rxjs';
|
||||
import { switchMap, distinctUntilChanged, map, take, flatMap, tap } from 'rxjs/operators';
|
||||
import { distinctUntilChanged, map, switchMap, take, tap } from 'rxjs/operators';
|
||||
import { animate, state, style, transition, trigger } from '@angular/animations';
|
||||
import { Component, Inject, OnDestroy, OnInit } from '@angular/core';
|
||||
import { Router } from '@angular/router';
|
||||
@@ -137,7 +137,7 @@ export class SearchFacetFilterComponent implements OnInit, OnDestroy {
|
||||
this.selectedValues$ = this.filterService.getSelectedValuesForFilter(this.filterConfig).pipe(
|
||||
map((selectedValues) => {
|
||||
return selectedValues.map((value: string) => {
|
||||
const fValue = [].concat(...rd.payload.map((page) => page.page)).find((facetValue: FacetValue) => facetValue.value === value);
|
||||
const fValue = [].concat(...rd.payload.map((page) => page.page)).find((facetValue: FacetValue) => this.getFacetValue(facetValue) === value);
|
||||
if (hasValue(fValue)) {
|
||||
return fValue;
|
||||
}
|
||||
|
@@ -1,13 +1,10 @@
|
||||
@import '../../../../styles/variables.scss';
|
||||
@import '../../../../styles/mixins.scss';
|
||||
|
||||
:host .facet-filter {
|
||||
border: 1px solid map-get($theme-colors, light);
|
||||
cursor: pointer;
|
||||
.search-filter-wrapper.closed {
|
||||
overflow: hidden;
|
||||
}
|
||||
.filter-toggle {
|
||||
line-height: $line-height-base;
|
||||
}
|
||||
border: 1px solid map-get($theme-colors, light);
|
||||
cursor: pointer;
|
||||
.search-filter-wrapper.closed {
|
||||
overflow: hidden;
|
||||
}
|
||||
.filter-toggle {
|
||||
line-height: $line-height-base;
|
||||
}
|
||||
}
|
||||
|
@@ -1,6 +1,3 @@
|
||||
@import '../../../../../styles/variables.scss';
|
||||
@import '../../../../../styles/mixins.scss';
|
||||
|
||||
.filters {
|
||||
.toggle-more-filters a {
|
||||
color: $link-color;
|
||||
|
@@ -1,14 +1,10 @@
|
||||
@import '../../../../../styles/variables.scss';
|
||||
@import '../../../../../styles/mixins.scss';
|
||||
|
||||
|
||||
.filters {
|
||||
.toggle-more-filters a {
|
||||
color: $link-color;
|
||||
text-decoration: underline;
|
||||
cursor: pointer;
|
||||
}
|
||||
}
|
||||
.toggle-more-filters a {
|
||||
color: $link-color;
|
||||
text-decoration: underline;
|
||||
cursor: pointer;
|
||||
}
|
||||
}
|
||||
|
||||
$slider-handle-width: 18px;
|
||||
::ng-deep
|
||||
|
@@ -1,5 +1,3 @@
|
||||
@import '../../../../../styles/variables.scss';
|
||||
@import '../../../../../styles/mixins.scss';
|
||||
|
||||
.filters {
|
||||
.toggle-more-filters a {
|
||||
|
@@ -1,2 +0,0 @@
|
||||
@import '../../../styles/variables.scss';
|
||||
@import '../../../styles/mixins.scss';
|
@@ -1,5 +1,3 @@
|
||||
@import '../../styles/variables.scss';
|
||||
@import '../../styles/mixins.scss';
|
||||
|
||||
@include media-breakpoint-down(md) {
|
||||
.container {
|
||||
|
@@ -1,4 +1,3 @@
|
||||
<script src="../search-switch-configuration/search-switch-configuration.component.ts"></script>
|
||||
<ng-container *ngVar="(searchOptions$ | async) as config">
|
||||
<h3>{{ 'search.sidebar.settings.title' | translate}}</h3>
|
||||
<div *ngIf="config?.sort" class="setting-option result-order-settings mb-3 p-3">
|
||||
|
@@ -1,5 +1,3 @@
|
||||
@import '../../../styles/variables.scss';
|
||||
|
||||
.setting-option {
|
||||
border: 1px solid map-get($theme-colors, light);
|
||||
border: 1px solid map-get($theme-colors, light);
|
||||
}
|
||||
|
@@ -1,6 +1,3 @@
|
||||
@import '../../../styles/variables.scss';
|
||||
@import '../../../styles/mixins.scss';
|
||||
|
||||
:host {
|
||||
.results {
|
||||
line-height: $button-height;
|
||||
|
@@ -9,7 +9,6 @@
|
||||
<ds-notifications-board
|
||||
[options]="config.notifications">
|
||||
</ds-notifications-board>
|
||||
|
||||
<main class="main-content">
|
||||
<div class="container" *ngIf="isLoading">
|
||||
<ds-loading message="{{'loading.default' | translate}}"></ds-loading>
|
||||
|
@@ -1,4 +1,3 @@
|
||||
@import '../styles/variables.scss';
|
||||
@import '../styles/helpers/font_awesome_imports.scss';
|
||||
@import '../../node_modules/bootstrap/scss/bootstrap.scss';
|
||||
@import '../../node_modules/nouislider/distribute/nouislider.min';
|
||||
@@ -48,4 +47,3 @@ ds-admin-sidebar {
|
||||
position: fixed;
|
||||
z-index: $sidebar-z-index;
|
||||
}
|
||||
|
||||
|
@@ -28,10 +28,10 @@ import variables from '../styles/_exposed_variables.scss';
|
||||
import { CSSVariableService } from './shared/sass-helper/sass-helper.service';
|
||||
import { MenuService } from './shared/menu/menu.service';
|
||||
import { MenuID } from './shared/menu/initial-menus-state';
|
||||
import { Observable } from 'rxjs/internal/Observable';
|
||||
import { combineLatest as combineLatestObservable, Observable, of } from 'rxjs';
|
||||
import { slideSidebarPadding } from './shared/animations/slide';
|
||||
import { combineLatest as combineLatestObservable } from 'rxjs';
|
||||
import { HostWindowService } from './shared/host-window.service';
|
||||
import { Theme } from '../config/theme.inferface';
|
||||
|
||||
@Component({
|
||||
selector: 'ds-app',
|
||||
@@ -47,6 +47,7 @@ export class AppComponent implements OnInit, AfterViewInit {
|
||||
slideSidebarOver: Observable<boolean>;
|
||||
collapsedSidebarWidth: Observable<string>;
|
||||
totalSidebarWidth: Observable<string>;
|
||||
theme: Observable<Theme> = of({} as any);
|
||||
|
||||
constructor(
|
||||
@Inject(GLOBAL_CONFIG) public config: GlobalConfig,
|
||||
@@ -59,7 +60,7 @@ export class AppComponent implements OnInit, AfterViewInit {
|
||||
private router: Router,
|
||||
private cssService: CSSVariableService,
|
||||
private menuService: MenuService,
|
||||
private windowService: HostWindowService
|
||||
private windowService: HostWindowService,
|
||||
) {
|
||||
// Load all the languages that are defined as active from the config file
|
||||
translate.addLangs(config.languages.filter((LangConfig) => LangConfig.active === true).map((a) => a.code));
|
||||
@@ -83,6 +84,7 @@ export class AppComponent implements OnInit, AfterViewInit {
|
||||
}
|
||||
|
||||
ngOnInit() {
|
||||
|
||||
const env: string = this.config.production ? 'Production' : 'Development';
|
||||
const color: string = this.config.production ? 'red' : 'green';
|
||||
console.info(`Environment: %c${env}`, `color: ${color}; font-weight: bold;`);
|
||||
|
@@ -19,16 +19,18 @@ export class NormalizedRelationship extends NormalizedObject<Relationship> {
|
||||
id: string;
|
||||
|
||||
/**
|
||||
* The identifier of the Item to the left side of this Relationship
|
||||
* The item to the left of this relationship
|
||||
*/
|
||||
@autoserialize
|
||||
leftId: string;
|
||||
@relationship(ResourceType.Item, false)
|
||||
leftItem: string;
|
||||
|
||||
/**
|
||||
* The identifier of the Item to the right side of this Relationship
|
||||
* The item to the right of this relationship
|
||||
*/
|
||||
@autoserialize
|
||||
rightId: string;
|
||||
@relationship(ResourceType.Item, false)
|
||||
rightItem: string;
|
||||
|
||||
/**
|
||||
* The place of the Item to the left side of this Relationship
|
||||
|
@@ -1,4 +1,3 @@
|
||||
|
||||
import { ObjectCacheEffects } from './cache/object-cache.effects';
|
||||
import { UUIDIndexEffects } from './index/index.effects';
|
||||
import { RequestEffects } from './data/request.effects';
|
||||
|
@@ -89,7 +89,7 @@ describe('ComColDataService', () => {
|
||||
function initMockCommunityDataService(): CommunityDataService {
|
||||
return jasmine.createSpyObj('responseCache', {
|
||||
getEndpoint: hot('--a-', { a: communitiesEndpoint }),
|
||||
getIDHref: cold('b-', { b: communityEndpoint })
|
||||
getIDHref: communityEndpoint
|
||||
});
|
||||
}
|
||||
|
||||
|
@@ -31,7 +31,7 @@ export abstract class ComColDataService<T extends CacheableObject> extends DataS
|
||||
return this.halService.getEndpoint(linkPath);
|
||||
} else {
|
||||
const scopeCommunityHrefObs = this.cds.getEndpoint().pipe(
|
||||
mergeMap((endpoint: string) => this.cds.getIDHref(endpoint, options.scopeID)),
|
||||
map((endpoint: string) => this.cds.getIDHref(endpoint, options.scopeID)),
|
||||
filter((href: string) => isNotEmpty(href)),
|
||||
take(1),
|
||||
tap((href: string) => {
|
||||
|
@@ -3,6 +3,7 @@ import { CacheableObject } from '../../cache/object-cache.reducer';
|
||||
import { RemoteData } from '../../data/remote-data';
|
||||
import { ResourceType } from '../resource-type';
|
||||
import { RelationshipType } from './relationship-type.model';
|
||||
import { Item } from '../item.model';
|
||||
|
||||
/**
|
||||
* Describes a Relationship between two Items
|
||||
@@ -29,14 +30,14 @@ export class Relationship implements CacheableObject {
|
||||
id: string;
|
||||
|
||||
/**
|
||||
* The identifier of the Item to the left side of this Relationship
|
||||
* The item to the left of this relationship
|
||||
*/
|
||||
leftId: string;
|
||||
leftItem: Observable<RemoteData<Item>>;
|
||||
|
||||
/**
|
||||
* The identifier of the Item to the right side of this Relationship
|
||||
* The item to the right of this relationship
|
||||
*/
|
||||
rightId: string;
|
||||
rightItem: Observable<RemoteData<Item>>;
|
||||
|
||||
/**
|
||||
* The place of the Item to the left side of this Relationship
|
||||
|
@@ -4,14 +4,14 @@
|
||||
[innerHTML]="firstMetadataValue('dc.title')"></a>
|
||||
<span class="text-muted">
|
||||
<ds-truncatable-part [id]="item.id" [minLines]="1">
|
||||
<span *ngIf="item.allMetadata(['journalvolume.identifier.volume']).length > 0"
|
||||
<span *ngIf="item.allMetadata(['publicationvolume.volumeNumber']).length > 0"
|
||||
class="item-list-journal-issues">
|
||||
<span *ngFor="let value of allMetadataValues(['journalvolume.identifier.volume']); let last=last;">
|
||||
<span *ngFor="let value of allMetadataValues(['publicationvolume.volumeNumber']); let last=last;">
|
||||
<span [innerHTML]="value"><span [innerHTML]="value"></span></span>
|
||||
</span>
|
||||
<span *ngIf="item.allMetadata(['journalissue.identifier.number']).length > 0"
|
||||
<span *ngIf="item.allMetadata(['publicationissue.issueNumber']).length > 0"
|
||||
class="item-list-journal-issue-numbers">
|
||||
<span *ngFor="let value of allMetadataValues(['journalissue.identifier.number']); let last=last;">
|
||||
<span *ngFor="let value of allMetadataValues(['publicationissue.issueNumber']); let last=last;">
|
||||
<span> - </span><span [innerHTML]="value"><span [innerHTML]="value"></span></span>
|
||||
</span>
|
||||
</span>
|
||||
|
@@ -20,13 +20,13 @@ const mockItemWithMetadata: Item = Object.assign(new Item(), {
|
||||
value: 'This is just another title'
|
||||
}
|
||||
],
|
||||
'journalvolume.identifier.volume': [
|
||||
'publicationvolume.volumeNumber': [
|
||||
{
|
||||
language: 'en_US',
|
||||
value: '1234'
|
||||
}
|
||||
],
|
||||
'journalissue.identifier.number': [
|
||||
'publicationissue.issueNumber': [
|
||||
{
|
||||
language: 'en_US',
|
||||
value: '5678'
|
||||
|
@@ -10,9 +10,9 @@
|
||||
<span [innerHTML]="value"><span [innerHTML]="value"></span></span>
|
||||
</span>
|
||||
</span>
|
||||
<span *ngIf="item.allMetadata(['journalvolume.identifier.volume']).length > 0"
|
||||
<span *ngIf="item.allMetadata(['publicationvolume.volumeNumber']).length > 0"
|
||||
class="item-list-journal-volume-identifiers">
|
||||
<span *ngFor="let value of allMetadataValues(['journalvolume.identifier.volume']); let last=last;">
|
||||
<span *ngFor="let value of allMetadataValues(['publicationvolume.volumeNumber']); let last=last;">
|
||||
<span> (</span><span [innerHTML]="value"><span [innerHTML]="value"></span></span><span>)</span>
|
||||
</span>
|
||||
</span>
|
||||
|
@@ -26,7 +26,7 @@ const mockItemWithMetadata: Item = Object.assign(new Item(), {
|
||||
value: 'This is just another journal title'
|
||||
}
|
||||
],
|
||||
'journalvolume.identifier.volume': [
|
||||
'publicationvolume.volumeNumber': [
|
||||
{
|
||||
language: 'en_US',
|
||||
value: '1234'
|
||||
|
@@ -4,9 +4,9 @@
|
||||
[innerHTML]="firstMetadataValue('dc.title')"></a>
|
||||
<span class="text-muted">
|
||||
<ds-truncatable-part [id]="item.id" [minLines]="1">
|
||||
<span *ngIf="item.allMetadata(['journal.identifier.issn']).length > 0"
|
||||
<span *ngIf="item.allMetadata(['creativeworkseries.issn']).length > 0"
|
||||
class="item-list-journals">
|
||||
<span *ngFor="let value of allMetadataValues(['journal.identifier.issn']); let last=last;">
|
||||
<span *ngFor="let value of allMetadataValues(['creativeworkseries.issn']); let last=last;">
|
||||
<span [innerHTML]="value"><span [innerHTML]="value"></span></span>
|
||||
</span>
|
||||
</span>
|
||||
|
@@ -20,7 +20,7 @@ const mockItemWithMetadata: Item = Object.assign(new Item(), {
|
||||
value: 'This is just another title'
|
||||
}
|
||||
],
|
||||
'journal.identifier.issn': [
|
||||
'creativeworkseries.issn': [
|
||||
{
|
||||
language: 'en_US',
|
||||
value: '1234'
|
||||
|
@@ -7,11 +7,15 @@
|
||||
<ds-thumbnail [thumbnail]="this.item.getThumbnail() | async"></ds-thumbnail>
|
||||
</ds-metadata-field-wrapper>
|
||||
<ds-generic-item-page-field [item]="item"
|
||||
[fields]="['journalissue.identifier.number']"
|
||||
[fields]="['publicationvolume.volumeNumber']"
|
||||
[label]="'journalvolume.page.volume'">
|
||||
</ds-generic-item-page-field>
|
||||
<ds-generic-item-page-field [item]="item"
|
||||
[fields]="['publicationissue.issueNumber']"
|
||||
[label]="'journalissue.page.number'">
|
||||
</ds-generic-item-page-field>
|
||||
<ds-generic-item-page-field [item]="item"
|
||||
[fields]="['journalissue.issuedate']"
|
||||
[fields]="['creativework.datePublished']"
|
||||
[label]="'journalissue.page.issuedate'">
|
||||
</ds-generic-item-page-field>
|
||||
<ds-generic-item-page-field [item]="item"
|
||||
@@ -19,7 +23,7 @@
|
||||
[label]="'journalissue.page.journal-title'">
|
||||
</ds-generic-item-page-field>
|
||||
<ds-generic-item-page-field [item]="item"
|
||||
[fields]="['journal.identifier.issn']"
|
||||
[fields]="['creativeworkseries.issn']"
|
||||
[label]="'journalissue.page.journal-issn'">
|
||||
</ds-generic-item-page-field>
|
||||
</div>
|
||||
@@ -34,11 +38,11 @@
|
||||
[label]="'relationships.isPublicationOfJournalIssue' | translate">
|
||||
</ds-related-items>
|
||||
<ds-generic-item-page-field [item]="item"
|
||||
[fields]="['journalissue.identifier.description']"
|
||||
[fields]="['dc.description']"
|
||||
[label]="'journalissue.page.description'">
|
||||
</ds-generic-item-page-field>
|
||||
<ds-generic-item-page-field [item]="item"
|
||||
[fields]="['journalissue.identifier.keyword']"
|
||||
[fields]="['creativework.keywords']"
|
||||
[label]="'journalissue.page.keyword'">
|
||||
</ds-generic-item-page-field>
|
||||
<div>
|
||||
|
@@ -12,25 +12,25 @@ import {
|
||||
const mockItem: Item = Object.assign(new Item(), {
|
||||
bitstreams: observableOf(new RemoteData(false, false, true, null, new PaginatedList(new PageInfo(), []))),
|
||||
metadata: {
|
||||
'journalissue.identifier.number': [
|
||||
'publicationissue.issueNumber': [
|
||||
{
|
||||
language: 'en_US',
|
||||
value: '1234'
|
||||
}
|
||||
],
|
||||
'journalissue.issuedate': [
|
||||
'creativework.datePublished': [
|
||||
{
|
||||
language: 'en_US',
|
||||
value: '2018'
|
||||
}
|
||||
],
|
||||
'journalissue.identifier.description': [
|
||||
'dc.description': [
|
||||
{
|
||||
language: 'en_US',
|
||||
value: 'desc'
|
||||
}
|
||||
],
|
||||
'journalissue.identifier.keyword': [
|
||||
'creativework.keywords': [
|
||||
{
|
||||
language: 'en_US',
|
||||
value: 'keyword'
|
||||
|
@@ -1,9 +1,7 @@
|
||||
import { Component, Inject } from '@angular/core';
|
||||
import { Component } from '@angular/core';
|
||||
import { Observable } from 'rxjs';
|
||||
import { ItemDataService } from '../../../../core/data/item-data.service';
|
||||
import { Item } from '../../../../core/shared/item.model';
|
||||
import { ItemViewMode, rendersItemType } from '../../../../shared/items/item-type-decorator';
|
||||
import { ITEM } from '../../../../shared/items/switcher/item-type-switcher.component';
|
||||
import { isNotEmpty } from '../../../../shared/empty.util';
|
||||
import { ItemComponent } from '../../../../+item-page/simple/item-types/shared/item.component';
|
||||
import {
|
||||
@@ -31,23 +29,17 @@ export class JournalIssueComponent extends ItemComponent {
|
||||
*/
|
||||
publications$: Observable<Item[]>;
|
||||
|
||||
constructor(
|
||||
@Inject(ITEM) public item: Item,
|
||||
private ids: ItemDataService
|
||||
) {
|
||||
super(item);
|
||||
}
|
||||
ngOnInit(): void {
|
||||
super.ngOnInit();
|
||||
|
||||
if (isNotEmpty(this.resolvedRelsAndTypes$)) {
|
||||
this.volumes$ = this.resolvedRelsAndTypes$.pipe(
|
||||
filterRelationsByTypeLabel('isJournalVolumeOfIssue'),
|
||||
relationsToItems(this.item.id, this.ids)
|
||||
relationsToItems(this.item.id)
|
||||
);
|
||||
this.publications$ = this.resolvedRelsAndTypes$.pipe(
|
||||
filterRelationsByTypeLabel('isPublicationOfJournalIssue'),
|
||||
relationsToItems(this.item.id, this.ids)
|
||||
relationsToItems(this.item.id)
|
||||
);
|
||||
}
|
||||
}
|
||||
|
@@ -7,11 +7,11 @@
|
||||
<ds-thumbnail [thumbnail]="this.item.getThumbnail() | async"></ds-thumbnail>
|
||||
</ds-metadata-field-wrapper>
|
||||
<ds-generic-item-page-field [item]="item"
|
||||
[fields]="['journalvolume.identifier.volume']"
|
||||
[fields]="['publicationvolume.volumeNumber']"
|
||||
[label]="'journalvolume.page.volume'">
|
||||
</ds-generic-item-page-field>
|
||||
<ds-generic-item-page-field [item]="item"
|
||||
[fields]="['journalvolume.issuedate']"
|
||||
[fields]="['creativework.datePublished']"
|
||||
[label]="'journalvolume.page.issuedate'">
|
||||
</ds-generic-item-page-field>
|
||||
</div>
|
||||
@@ -25,7 +25,7 @@
|
||||
[label]="'relationships.isIssueOf' | translate">
|
||||
</ds-related-items>
|
||||
<ds-generic-item-page-field [item]="item"
|
||||
[fields]="['journalvolume.identifier.description']"
|
||||
[fields]="['dc.description']"
|
||||
[label]="'journalvolume.page.description'">
|
||||
</ds-generic-item-page-field>
|
||||
<div>
|
||||
|
@@ -12,19 +12,19 @@ import {
|
||||
const mockItem: Item = Object.assign(new Item(), {
|
||||
bitstreams: observableOf(new RemoteData(false, false, true, null, new PaginatedList(new PageInfo(), []))),
|
||||
metadata: {
|
||||
'journalvolume.identifier.volume': [
|
||||
'publicationvolume.volumeNumber': [
|
||||
{
|
||||
language: 'en_US',
|
||||
value: '1234'
|
||||
}
|
||||
],
|
||||
'journalvolume.issuedate': [
|
||||
'creativework.datePublished': [
|
||||
{
|
||||
language: 'en_US',
|
||||
value: '2018'
|
||||
}
|
||||
],
|
||||
'journalvolume.identifier.description': [
|
||||
'dc.description': [
|
||||
{
|
||||
language: 'en_US',
|
||||
value: 'desc'
|
||||
|
@@ -1,9 +1,7 @@
|
||||
import { Component, Inject } from '@angular/core';
|
||||
import { Component } from '@angular/core';
|
||||
import { Observable } from 'rxjs';
|
||||
import { ItemDataService } from '../../../../core/data/item-data.service';
|
||||
import { Item } from '../../../../core/shared/item.model';
|
||||
import { ItemViewMode, rendersItemType } from '../../../../shared/items/item-type-decorator';
|
||||
import { ITEM } from '../../../../shared/items/switcher/item-type-switcher.component';
|
||||
import { isNotEmpty } from '../../../../shared/empty.util';
|
||||
import { ItemComponent } from '../../../../+item-page/simple/item-types/shared/item.component';
|
||||
import {
|
||||
@@ -31,23 +29,17 @@ export class JournalVolumeComponent extends ItemComponent {
|
||||
*/
|
||||
issues$: Observable<Item[]>;
|
||||
|
||||
constructor(
|
||||
@Inject(ITEM) public item: Item,
|
||||
private ids: ItemDataService
|
||||
) {
|
||||
super(item);
|
||||
}
|
||||
ngOnInit(): void {
|
||||
super.ngOnInit();
|
||||
|
||||
if (isNotEmpty(this.resolvedRelsAndTypes$)) {
|
||||
this.journals$ = this.resolvedRelsAndTypes$.pipe(
|
||||
filterRelationsByTypeLabel('isJournalOfVolume'),
|
||||
relationsToItems(this.item.id, this.ids)
|
||||
relationsToItems(this.item.id)
|
||||
);
|
||||
this.issues$ = this.resolvedRelsAndTypes$.pipe(
|
||||
filterRelationsByTypeLabel('isIssueOfJournalVolume'),
|
||||
relationsToItems(this.item.id, this.ids)
|
||||
relationsToItems(this.item.id)
|
||||
);
|
||||
}
|
||||
}
|
||||
|
@@ -7,15 +7,15 @@
|
||||
<ds-thumbnail [thumbnail]="this.item.getThumbnail() | async"></ds-thumbnail>
|
||||
</ds-metadata-field-wrapper>
|
||||
<ds-generic-item-page-field class="item-page-fields" [item]="item"
|
||||
[fields]="['journal.identifier.issn']"
|
||||
[fields]="['creativeworkseries.issn']"
|
||||
[label]="'journal.page.issn'">
|
||||
</ds-generic-item-page-field>
|
||||
<ds-generic-item-page-field class="item-page-fields" [item]="item"
|
||||
[fields]="['journal.publisher']"
|
||||
[fields]="['creativework.publisher']"
|
||||
[label]="'journal.page.publisher'">
|
||||
</ds-generic-item-page-field>
|
||||
<ds-generic-item-page-field [item]="item"
|
||||
[fields]="['journal.contributor.editor']"
|
||||
[fields]="['creativework.editor']"
|
||||
[label]="'journal.page.editor'">
|
||||
</ds-generic-item-page-field>
|
||||
</div>
|
||||
@@ -25,7 +25,7 @@
|
||||
[label]="'relationships.isVolumeOf' | translate">
|
||||
</ds-related-items>
|
||||
<ds-generic-item-page-field class="item-page-fields" [item]="item"
|
||||
[fields]="['journal.identifier.description']"
|
||||
[fields]="['dc.description']"
|
||||
[label]="'journal.page.description'">
|
||||
</ds-generic-item-page-field>
|
||||
<div>
|
||||
|
@@ -22,19 +22,19 @@ let fixture: ComponentFixture<JournalComponent>;
|
||||
const mockItem: Item = Object.assign(new Item(), {
|
||||
bitstreams: observableOf(new RemoteData(false, false, true, null, new PaginatedList(new PageInfo(), []))),
|
||||
metadata: {
|
||||
'journal.identifier.issn': [
|
||||
'creativeworkseries.issn': [
|
||||
{
|
||||
language: 'en_US',
|
||||
value: '1234'
|
||||
}
|
||||
],
|
||||
'journal.publisher': [
|
||||
'creativework.publisher': [
|
||||
{
|
||||
language: 'en_US',
|
||||
value: 'a publisher'
|
||||
}
|
||||
],
|
||||
'journal.identifier.description': [
|
||||
'dc.description': [
|
||||
{
|
||||
language: 'en_US',
|
||||
value: 'desc'
|
||||
|
@@ -1,9 +1,7 @@
|
||||
import { Component, Inject } from '@angular/core';
|
||||
import { Component } from '@angular/core';
|
||||
import { Observable } from 'rxjs';
|
||||
import { ItemDataService } from '../../../../core/data/item-data.service';
|
||||
import { Item } from '../../../../core/shared/item.model';
|
||||
import { ItemViewMode, rendersItemType } from '../../../../shared/items/item-type-decorator';
|
||||
import { ITEM } from '../../../../shared/items/switcher/item-type-switcher.component';
|
||||
import { isNotEmpty } from '../../../../shared/empty.util';
|
||||
import { ItemComponent } from '../../../../+item-page/simple/item-types/shared/item.component';
|
||||
import {
|
||||
@@ -26,19 +24,13 @@ export class JournalComponent extends ItemComponent {
|
||||
*/
|
||||
volumes$: Observable<Item[]>;
|
||||
|
||||
constructor(
|
||||
@Inject(ITEM) public item: Item,
|
||||
private ids: ItemDataService
|
||||
) {
|
||||
super(item);
|
||||
}
|
||||
ngOnInit(): void {
|
||||
super.ngOnInit();
|
||||
|
||||
if (isNotEmpty(this.resolvedRelsAndTypes$)) {
|
||||
this.volumes$ = this.resolvedRelsAndTypes$.pipe(
|
||||
filterRelationsByTypeLabel('isVolumeOfJournal'),
|
||||
relationsToItems(this.item.id, this.ids)
|
||||
relationsToItems(this.item.id)
|
||||
);
|
||||
}
|
||||
}
|
||||
|
@@ -1,13 +1,13 @@
|
||||
<ds-truncatable [id]="item.id">
|
||||
<a
|
||||
[routerLink]="['/items/' + item.id]" class="lead"
|
||||
[innerHTML]="firstMetadataValue('orgunit.identifier.name')"></a>
|
||||
[innerHTML]="firstMetadataValue('organization.legalName')"></a>
|
||||
<span class="text-muted">
|
||||
<ds-truncatable-part [id]="item.id" [minLines]="3">
|
||||
<span *ngIf="item.allMetadata(['orgunit.identifier.description']).length > 0"
|
||||
<span *ngIf="item.allMetadata(['dc.description']).length > 0"
|
||||
class="item-list-orgunit-description">
|
||||
<ds-truncatable-part [id]="item.id" [minLines]="3"><span
|
||||
[innerHTML]="firstMetadataValue('orgunit.identifier.description')"></span>
|
||||
[innerHTML]="firstMetadataValue('dc.description')"></span>
|
||||
</ds-truncatable-part>
|
||||
</span>
|
||||
</ds-truncatable-part>
|
||||
|
@@ -20,7 +20,7 @@ const mockItemWithMetadata: Item = Object.assign(new Item(), {
|
||||
value: 'This is just another title'
|
||||
}
|
||||
],
|
||||
'orgunit.identifier.description': [
|
||||
'dc.description': [
|
||||
{
|
||||
language: 'en_US',
|
||||
value: 'A description about the OrgUnit'
|
||||
|
@@ -1,13 +1,13 @@
|
||||
<ng-template #descTemplate>
|
||||
<span class="text-muted">
|
||||
<span *ngIf="item.allMetadata(['orgunit.identifier.description']).length > 0"
|
||||
<span *ngIf="item.allMetadata(['dc.description']).length > 0"
|
||||
class="item-list-job-title">
|
||||
<span [innerHTML]="firstMetadataValue(['orgunit.identifier.description'])"></span>
|
||||
<span [innerHTML]="firstMetadataValue(['dc.description'])"></span>
|
||||
</span>
|
||||
</span>
|
||||
</ng-template>
|
||||
<ds-truncatable [id]="item.id">
|
||||
<a [routerLink]="['/items/' + item.id]"
|
||||
[innerHTML]="firstMetadataValue('orgunit.identifier.name')"
|
||||
[innerHTML]="firstMetadataValue('organization.legalName')"
|
||||
[tooltip]="descTemplate"></a>
|
||||
</ds-truncatable>
|
||||
|
@@ -1,12 +1,12 @@
|
||||
<ds-truncatable [id]="item.id">
|
||||
<a
|
||||
[routerLink]="['/items/' + item.id]" class="lead"
|
||||
[innerHTML]="firstMetadataValue('dc.contributor.author')"></a>
|
||||
[innerHTML]="firstMetadataValue('person.familyName') + ', ' + firstMetadataValue('person.givenName')"></a>
|
||||
<span class="text-muted">
|
||||
<ds-truncatable-part [id]="item.id" [minLines]="1">
|
||||
<span *ngIf="item.allMetadata(['person.identifier.jobtitle']).length > 0"
|
||||
<span *ngIf="item.allMetadata(['person.jobTitle']).length > 0"
|
||||
class="item-list-job-title">
|
||||
<span *ngFor="let value of allMetadataValues(['person.identifier.jobtitle']); let last=last;">
|
||||
<span *ngFor="let value of allMetadataValues(['person.jobTitle']); let last=last;">
|
||||
<span [innerHTML]="value"><span [innerHTML]="value"></span></span>
|
||||
</span>
|
||||
</span>
|
||||
|
@@ -20,7 +20,7 @@ const mockItemWithMetadata: Item = Object.assign(new Item(), {
|
||||
value: 'This is just another title'
|
||||
}
|
||||
],
|
||||
'person.identifier.jobtitle': [
|
||||
'person.jobTitle': [
|
||||
{
|
||||
language: 'en_US',
|
||||
value: 'Developer'
|
||||
|
@@ -1,8 +1,8 @@
|
||||
<ng-template #descTemplate>
|
||||
<span class="text-muted">
|
||||
<span *ngIf="item.allMetadata(['person.identifier.jobtitle']).length > 0"
|
||||
<span *ngIf="item.allMetadata(['person.jobTitle']).length > 0"
|
||||
class="item-list-job-title">
|
||||
<span *ngFor="let value of allMetadataValues(['person.identifier.jobtitle']); let last=last;">
|
||||
<span *ngFor="let value of allMetadataValues(['person.jobTitle']); let last=last;">
|
||||
<span [innerHTML]="value"><span [innerHTML]="value"></span></span>
|
||||
</span>
|
||||
</span>
|
||||
@@ -10,6 +10,6 @@
|
||||
</ng-template>
|
||||
<ds-truncatable [id]="item.id">
|
||||
<a [routerLink]="['/items/' + item.id]"
|
||||
[innerHTML]="firstMetadataValue('dc.contributor.author')"
|
||||
[innerHTML]="firstMetadataValue('person.familyName') + ', ' + firstMetadataValue('person.givenName')"
|
||||
[tooltip]="descTemplate"></a>
|
||||
</ds-truncatable>
|
||||
|
@@ -1,16 +1,16 @@
|
||||
<ds-truncatable [id]="item.id">
|
||||
<a
|
||||
[routerLink]="['/items/' + item.id]" class="lead"
|
||||
[innerHTML]="firstMetadataValue('project.identifier.name')"></a>
|
||||
<span class="text-muted">
|
||||
<ds-truncatable-part [id]="item.id" [minLines]="1">
|
||||
<span *ngIf="item.allMetadata(['project.identifier.status']).length > 0"
|
||||
class="item-list-status">
|
||||
<span *ngFor="let value of allMetadataValues(['project.identifier.status']); let last=last;">
|
||||
<span [innerHTML]="value"><span [innerHTML]="value"></span></span>
|
||||
</span>
|
||||
</span>
|
||||
</ds-truncatable-part>
|
||||
</span>
|
||||
[innerHTML]="firstMetadataValue('dc.title')"></a>
|
||||
<!--<span class="text-muted">-->
|
||||
<!--<ds-truncatable-part [id]="item.id" [minLines]="1">-->
|
||||
<!--<span *ngIf="item.allMetadata(['project.identifier.status']).length > 0"-->
|
||||
<!--class="item-list-status">-->
|
||||
<!--<span *ngFor="let value of allMetadataValues(['project.identifier.status']); let last=last;">-->
|
||||
<!--<span [innerHTML]="value"><span [innerHTML]="value"></span></span>-->
|
||||
<!--</span>-->
|
||||
<!--</span>-->
|
||||
<!--</ds-truncatable-part>-->
|
||||
<!--</span>-->
|
||||
</ds-truncatable>
|
||||
|
||||
|
@@ -20,12 +20,12 @@ const mockItemWithMetadata: Item = Object.assign(new Item(), {
|
||||
value: 'This is just another title'
|
||||
}
|
||||
],
|
||||
'project.identifier.status': [
|
||||
{
|
||||
language: 'en_US',
|
||||
value: 'A status about the project'
|
||||
}
|
||||
]
|
||||
// 'project.identifier.status': [
|
||||
// {
|
||||
// language: 'en_US',
|
||||
// value: 'A status about the project'
|
||||
// }
|
||||
// ]
|
||||
}
|
||||
});
|
||||
const mockItemWithoutMetadata: Item = Object.assign(new Item(), {
|
||||
@@ -61,27 +61,27 @@ describe('ProjectListElementComponent', () => {
|
||||
|
||||
}));
|
||||
|
||||
describe('When the item has a status', () => {
|
||||
beforeEach(() => {
|
||||
projectListElementComponent.item = mockItemWithMetadata;
|
||||
fixture.detectChanges();
|
||||
});
|
||||
|
||||
it('should show the status span', () => {
|
||||
const statusField = fixture.debugElement.query(By.css('span.item-list-status'));
|
||||
expect(statusField).not.toBeNull();
|
||||
});
|
||||
});
|
||||
|
||||
describe('When the item has no status', () => {
|
||||
beforeEach(() => {
|
||||
projectListElementComponent.item = mockItemWithoutMetadata;
|
||||
fixture.detectChanges();
|
||||
});
|
||||
|
||||
it('should not show the status span', () => {
|
||||
const statusField = fixture.debugElement.query(By.css('span.item-list-status'));
|
||||
expect(statusField).toBeNull();
|
||||
});
|
||||
});
|
||||
// describe('When the item has a status', () => {
|
||||
// beforeEach(() => {
|
||||
// projectListElementComponent.item = mockItemWithMetadata;
|
||||
// fixture.detectChanges();
|
||||
// });
|
||||
//
|
||||
// it('should show the status span', () => {
|
||||
// const statusField = fixture.debugElement.query(By.css('span.item-list-status'));
|
||||
// expect(statusField).not.toBeNull();
|
||||
// });
|
||||
// });
|
||||
//
|
||||
// describe('When the item has no status', () => {
|
||||
// beforeEach(() => {
|
||||
// projectListElementComponent.item = mockItemWithoutMetadata;
|
||||
// fixture.detectChanges();
|
||||
// });
|
||||
//
|
||||
// it('should not show the status span', () => {
|
||||
// const statusField = fixture.debugElement.query(By.css('span.item-list-status'));
|
||||
// expect(statusField).toBeNull();
|
||||
// });
|
||||
// });
|
||||
});
|
||||
|
@@ -1,5 +1,5 @@
|
||||
<h2 class="item-page-title-field">
|
||||
{{'orgunit.page.titleprefix' | translate}}<ds-metadata-values [mdValues]="item?.allMetadata(['orgunit.identifier.name'])"></ds-metadata-values>
|
||||
{{'orgunit.page.titleprefix' | translate}}<ds-metadata-values [mdValues]="item?.allMetadata(['organization.legalName'])"></ds-metadata-values>
|
||||
</h2>
|
||||
<div class="row">
|
||||
<div class="col-xs-12 col-md-4">
|
||||
@@ -7,19 +7,19 @@
|
||||
<ds-thumbnail [thumbnail]="this.item.getThumbnail() | async" [defaultImage]="'assets/images/orgunit-placeholder.svg'"></ds-thumbnail>
|
||||
</ds-metadata-field-wrapper>
|
||||
<ds-generic-item-page-field [item]="item"
|
||||
[fields]="['orgunit.identifier.dateestablished']"
|
||||
[fields]="['organization.foundingDate']"
|
||||
[label]="'orgunit.page.dateestablished'">
|
||||
</ds-generic-item-page-field>
|
||||
<ds-generic-item-page-field [item]="item"
|
||||
[fields]="['orgunit.identifier.city']"
|
||||
[fields]="['organization.address.addressLocality']"
|
||||
[label]="'orgunit.page.city'">
|
||||
</ds-generic-item-page-field>
|
||||
<ds-generic-item-page-field [item]="item"
|
||||
[fields]="['orgunit.identifier.country']"
|
||||
[fields]="['organization.adress.addressCountry']"
|
||||
[label]="'orgunit.page.country'">
|
||||
</ds-generic-item-page-field>
|
||||
<ds-generic-item-page-field [item]="item"
|
||||
[fields]="['orgunit.identifier.id']"
|
||||
[fields]="['dc.identifier']"
|
||||
[label]="'orgunit.page.id'">
|
||||
</ds-generic-item-page-field>
|
||||
</div>
|
||||
@@ -37,7 +37,7 @@
|
||||
[label]="'relationships.isPublicationOf' | translate">
|
||||
</ds-related-items>
|
||||
<ds-generic-item-page-field [item]="item"
|
||||
[fields]="['orgunit.identifier.description']"
|
||||
[fields]="['dc.description']"
|
||||
[label]="'orgunit.page.description'">
|
||||
</ds-generic-item-page-field>
|
||||
<div>
|
||||
|
@@ -12,31 +12,31 @@ import {
|
||||
const mockItem: Item = Object.assign(new Item(), {
|
||||
bitstreams: observableOf(new RemoteData(false, false, true, null, new PaginatedList(new PageInfo(), []))),
|
||||
metadata: {
|
||||
'orgunit.identifier.dateestablished': [
|
||||
'organization.foundingDate': [
|
||||
{
|
||||
language: 'en_US',
|
||||
value: '2018'
|
||||
}
|
||||
],
|
||||
'orgunit.identifier.city': [
|
||||
'organization.address.addressLocality': [
|
||||
{
|
||||
language: 'en_US',
|
||||
value: 'New York'
|
||||
}
|
||||
],
|
||||
'orgunit.identifier.country': [
|
||||
'organization.adress.addressCountry': [
|
||||
{
|
||||
language: 'en_US',
|
||||
value: 'USA'
|
||||
}
|
||||
],
|
||||
'orgunit.identifier.id': [
|
||||
'dc.identifier': [
|
||||
{
|
||||
language: 'en_US',
|
||||
value: '1'
|
||||
}
|
||||
],
|
||||
'orgunit.identifier.description': [
|
||||
'dc.description': [
|
||||
{
|
||||
language: 'en_US',
|
||||
value: 'desc'
|
||||
|
@@ -1,9 +1,7 @@
|
||||
import { Component, Inject, OnInit } from '@angular/core';
|
||||
import { Component, OnInit } from '@angular/core';
|
||||
import { Observable } from 'rxjs';
|
||||
import { ItemDataService } from '../../../../core/data/item-data.service';
|
||||
import { Item } from '../../../../core/shared/item.model';
|
||||
import { ItemViewMode, rendersItemType } from '../../../../shared/items/item-type-decorator';
|
||||
import { ITEM } from '../../../../shared/items/switcher/item-type-switcher.component';
|
||||
import { isNotEmpty } from '../../../../shared/empty.util';
|
||||
import { ItemComponent } from '../../../../+item-page/simple/item-types/shared/item.component';
|
||||
import {
|
||||
@@ -36,30 +34,23 @@ export class OrgunitComponent extends ItemComponent implements OnInit {
|
||||
*/
|
||||
publications$: Observable<Item[]>;
|
||||
|
||||
constructor(
|
||||
@Inject(ITEM) public item: Item,
|
||||
private ids: ItemDataService
|
||||
) {
|
||||
super(item);
|
||||
}
|
||||
|
||||
ngOnInit(): void {
|
||||
super.ngOnInit();
|
||||
|
||||
if (isNotEmpty(this.resolvedRelsAndTypes$)) {
|
||||
this.people$ = this.resolvedRelsAndTypes$.pipe(
|
||||
filterRelationsByTypeLabel('isPersonOfOrgUnit'),
|
||||
relationsToItems(this.item.id, this.ids)
|
||||
relationsToItems(this.item.id)
|
||||
);
|
||||
|
||||
this.projects$ = this.resolvedRelsAndTypes$.pipe(
|
||||
filterRelationsByTypeLabel('isProjectOfOrgUnit'),
|
||||
relationsToItems(this.item.id, this.ids)
|
||||
relationsToItems(this.item.id)
|
||||
);
|
||||
|
||||
this.publications$ = this.resolvedRelsAndTypes$.pipe(
|
||||
filterRelationsByTypeLabel('isPublicationOfOrgUnit'),
|
||||
relationsToItems(this.item.id, this.ids)
|
||||
relationsToItems(this.item.id)
|
||||
);
|
||||
}
|
||||
}}
|
||||
|
@@ -1,5 +1,5 @@
|
||||
<h2 class="item-page-title-field">
|
||||
{{'person.page.titleprefix' | translate}}<ds-metadata-values [mdValues]="item?.allMetadata(['dc.contributor.author'])"></ds-metadata-values>
|
||||
{{'person.page.titleprefix' | translate}}<ds-metadata-values [mdValues]="[item?.firstMetadata('person.familyName'), item?.firstMetadata('person.givenName')]" [separator]="', '"></ds-metadata-values>
|
||||
</h2>
|
||||
<div class="row">
|
||||
<div class="col-xs-12 col-md-4">
|
||||
@@ -7,21 +7,21 @@
|
||||
<ds-thumbnail [thumbnail]="this.item.getThumbnail() | async" [defaultImage]="'assets/images/person-placeholder.svg'"></ds-thumbnail>
|
||||
</ds-metadata-field-wrapper>
|
||||
<ds-generic-item-page-field [item]="item"
|
||||
[fields]="['person.identifier.email']"
|
||||
[fields]="['person.email']"
|
||||
[label]="'person.page.email'">
|
||||
</ds-generic-item-page-field>
|
||||
<!--<ds-generic-item-page-field [item]="item"-->
|
||||
<!--[fields]="['person.identifier.orcid']"-->
|
||||
<!--[label]="'person.page.orcid'">-->
|
||||
<!--</ds-generic-item-page-field>-->
|
||||
<ds-generic-item-page-field [item]="item"
|
||||
[fields]="['person.identifier.orcid']"
|
||||
[label]="'person.page.orcid'">
|
||||
</ds-generic-item-page-field>
|
||||
<ds-generic-item-page-field [item]="item"
|
||||
[fields]="['person.identifier.birthdate']"
|
||||
[fields]="['person.birthDate']"
|
||||
[label]="'person.page.birthdate'">
|
||||
</ds-generic-item-page-field>
|
||||
<ds-generic-item-page-field [item]="item"
|
||||
[fields]="['person.identifier.staffid']"
|
||||
[label]="'person.page.staffid'">
|
||||
</ds-generic-item-page-field>
|
||||
<!--<ds-generic-item-page-field [item]="item"-->
|
||||
<!--[fields]="['person.identifier.staffid']"-->
|
||||
<!--[label]="'person.page.staffid'">-->
|
||||
<!--</ds-generic-item-page-field>-->
|
||||
</div>
|
||||
<div class="col-xs-12 col-md-6">
|
||||
<ds-related-items
|
||||
@@ -33,15 +33,15 @@
|
||||
[label]="'relationships.isOrgUnitOf' | translate">
|
||||
</ds-related-items>
|
||||
<ds-generic-item-page-field [item]="item"
|
||||
[fields]="['person.identifier.jobtitle']"
|
||||
[fields]="['person.jobTitle']"
|
||||
[label]="'person.page.jobtitle'">
|
||||
</ds-generic-item-page-field>
|
||||
<ds-generic-item-page-field [item]="item"
|
||||
[fields]="['person.identifier.lastname']"
|
||||
[fields]="['person.familyName']"
|
||||
[label]="'person.page.lastname'">
|
||||
</ds-generic-item-page-field>
|
||||
<ds-generic-item-page-field [item]="item"
|
||||
[fields]="['person.identifier.firstname']"
|
||||
[fields]="['person.givenName']"
|
||||
[label]="'person.page.firstname'">
|
||||
</ds-generic-item-page-field>
|
||||
<div>
|
||||
|
@@ -12,43 +12,43 @@ import {
|
||||
const mockItem: Item = Object.assign(new Item(), {
|
||||
bitstreams: observableOf(new RemoteData(false, false, true, null, new PaginatedList(new PageInfo(), []))),
|
||||
metadata: {
|
||||
'person.identifier.email': [
|
||||
'person.email': [
|
||||
{
|
||||
language: 'en_US',
|
||||
value: 'fake@email.com'
|
||||
}
|
||||
],
|
||||
'person.identifier.orcid': [
|
||||
{
|
||||
language: 'en_US',
|
||||
value: 'ORCID-1'
|
||||
}
|
||||
],
|
||||
'person.identifier.birthdate': [
|
||||
// 'person.identifier.orcid': [
|
||||
// {
|
||||
// language: 'en_US',
|
||||
// value: 'ORCID-1'
|
||||
// }
|
||||
// ],
|
||||
'person.birthDate': [
|
||||
{
|
||||
language: 'en_US',
|
||||
value: '1993'
|
||||
}
|
||||
],
|
||||
'person.identifier.staffid': [
|
||||
{
|
||||
language: 'en_US',
|
||||
value: '1'
|
||||
}
|
||||
],
|
||||
'person.identifier.jobtitle': [
|
||||
// 'person.identifier.staffid': [
|
||||
// {
|
||||
// language: 'en_US',
|
||||
// value: '1'
|
||||
// }
|
||||
// ],
|
||||
'person.jobTitle': [
|
||||
{
|
||||
language: 'en_US',
|
||||
value: 'Developer'
|
||||
}
|
||||
],
|
||||
'person.identifier.lastname': [
|
||||
'person.familyName': [
|
||||
{
|
||||
language: 'en_US',
|
||||
value: 'Doe'
|
||||
}
|
||||
],
|
||||
'person.identifier.firstname': [
|
||||
'person.givenName': [
|
||||
{
|
||||
language: 'en_US',
|
||||
value: 'John'
|
||||
|
@@ -1,6 +1,5 @@
|
||||
import { Component, Inject } from '@angular/core';
|
||||
import { Observable , of as observableOf } from 'rxjs';
|
||||
import { ItemDataService } from '../../../../core/data/item-data.service';
|
||||
import { Item } from '../../../../core/shared/item.model';
|
||||
import { ItemViewMode, rendersItemType } from '../../../../shared/items/item-type-decorator';
|
||||
import { ITEM } from '../../../../shared/items/switcher/item-type-switcher.component';
|
||||
@@ -49,7 +48,6 @@ export class PersonComponent extends ItemComponent {
|
||||
|
||||
constructor(
|
||||
@Inject(ITEM) public item: Item,
|
||||
private ids: ItemDataService,
|
||||
private fixedFilterService: SearchFixedFilterService
|
||||
) {
|
||||
super(item);
|
||||
@@ -60,17 +58,17 @@ export class PersonComponent extends ItemComponent {
|
||||
if (isNotEmpty(this.resolvedRelsAndTypes$)) {
|
||||
this.publications$ = this.resolvedRelsAndTypes$.pipe(
|
||||
filterRelationsByTypeLabel('isPublicationOfAuthor'),
|
||||
relationsToItems(this.item.id, this.ids)
|
||||
relationsToItems(this.item.id)
|
||||
);
|
||||
|
||||
this.projects$ = this.resolvedRelsAndTypes$.pipe(
|
||||
filterRelationsByTypeLabel('isProjectOfPerson'),
|
||||
relationsToItems(this.item.id, this.ids)
|
||||
relationsToItems(this.item.id)
|
||||
);
|
||||
|
||||
this.orgUnits$ = this.resolvedRelsAndTypes$.pipe(
|
||||
filterRelationsByTypeLabel('isOrgUnitOfPerson'),
|
||||
relationsToItems(this.item.id, this.ids)
|
||||
relationsToItems(this.item.id)
|
||||
);
|
||||
|
||||
this.fixedFilterQuery = this.fixedFilterService.getQueryByRelations('isAuthorOfPublication', this.item.id);
|
||||
|
@@ -1,15 +1,15 @@
|
||||
<h2 class="item-page-title-field">
|
||||
{{'project.page.titleprefix' | translate}}<ds-metadata-values [mdValues]="item?.allMetadata(['project.identifier.name'])"></ds-metadata-values>
|
||||
{{'project.page.titleprefix' | translate}}<ds-metadata-values [mdValues]="item?.allMetadata(['dc.title'])"></ds-metadata-values>
|
||||
</h2>
|
||||
<div class="row">
|
||||
<div class="col-xs-12 col-md-4">
|
||||
<ds-metadata-field-wrapper>
|
||||
<ds-thumbnail [thumbnail]="this.item.getThumbnail() | async" [defaultImage]="'assets/images/project-placeholder.svg'"></ds-thumbnail>
|
||||
</ds-metadata-field-wrapper>
|
||||
<ds-generic-item-page-field [item]="item"
|
||||
[fields]="['project.identifier.status']"
|
||||
[label]="'project.page.status'">
|
||||
</ds-generic-item-page-field>
|
||||
<!--<ds-generic-item-page-field [item]="item"-->
|
||||
<!--[fields]="['project.identifier.status']"-->
|
||||
<!--[label]="'project.page.status'">-->
|
||||
<!--</ds-generic-item-page-field>-->
|
||||
<ds-metadata-representation-list
|
||||
[label]="'project.page.contributor' | translate"
|
||||
[representations]="contributors$ | async">
|
||||
@@ -19,13 +19,13 @@
|
||||
[label]="'project.page.funder'">
|
||||
</ds-generic-item-page-field>
|
||||
<ds-generic-item-page-field [item]="item"
|
||||
[fields]="['project.identifier.id']"
|
||||
[fields]="['dc.identifier']"
|
||||
[label]="'project.page.id'">
|
||||
</ds-generic-item-page-field>
|
||||
<ds-generic-item-page-field [item]="item"
|
||||
[fields]="['project.identifier.expectedcompletion']"
|
||||
[label]="'project.page.expectedcompletion'">
|
||||
</ds-generic-item-page-field>
|
||||
<!--<ds-generic-item-page-field [item]="item"-->
|
||||
<!--[fields]="['project.identifier.expectedcompletion']"-->
|
||||
<!--[label]="'project.page.expectedcompletion'">-->
|
||||
<!--</ds-generic-item-page-field>-->
|
||||
</div>
|
||||
<div class="col-xs-12 col-md-6">
|
||||
<ds-related-items
|
||||
@@ -41,11 +41,11 @@
|
||||
[label]="'relationships.isOrgUnitOf' | translate">
|
||||
</ds-related-items>
|
||||
<ds-generic-item-page-field [item]="item"
|
||||
[fields]="['project.identifier.description']"
|
||||
[fields]="['dc.description']"
|
||||
[label]="'project.page.description'">
|
||||
</ds-generic-item-page-field>
|
||||
<ds-generic-item-page-field [item]="item"
|
||||
[fields]="['project.identifier.keyword']"
|
||||
[fields]="['dc.subject']"
|
||||
[label]="'project.page.keyword'">
|
||||
</ds-generic-item-page-field>
|
||||
<div>
|
||||
|
@@ -12,31 +12,31 @@ import {
|
||||
const mockItem: Item = Object.assign(new Item(), {
|
||||
bitstreams: observableOf(new RemoteData(false, false, true, null, new PaginatedList(new PageInfo(), []))),
|
||||
metadata: {
|
||||
'project.identifier.status': [
|
||||
{
|
||||
language: 'en_US',
|
||||
value: 'published'
|
||||
}
|
||||
],
|
||||
'project.identifier.id': [
|
||||
// 'project.identifier.status': [
|
||||
// {
|
||||
// language: 'en_US',
|
||||
// value: 'published'
|
||||
// }
|
||||
// ],
|
||||
'dc.identifier': [
|
||||
{
|
||||
language: 'en_US',
|
||||
value: '1'
|
||||
}
|
||||
],
|
||||
'project.identifier.expectedcompletion': [
|
||||
{
|
||||
language: 'en_US',
|
||||
value: 'exp comp'
|
||||
}
|
||||
],
|
||||
'project.identifier.description': [
|
||||
// 'project.identifier.expectedcompletion': [
|
||||
// {
|
||||
// language: 'en_US',
|
||||
// value: 'exp comp'
|
||||
// }
|
||||
// ],
|
||||
'dc.description': [
|
||||
{
|
||||
language: 'en_US',
|
||||
value: 'keyword'
|
||||
}
|
||||
],
|
||||
'project.identifier.keyword': [
|
||||
'dc.subject': [
|
||||
{
|
||||
language: 'en_US',
|
||||
value: 'keyword'
|
||||
|
@@ -1,10 +1,8 @@
|
||||
import { Component, Inject, OnInit } from '@angular/core';
|
||||
import { Component, OnInit } from '@angular/core';
|
||||
import { Observable } from 'rxjs';
|
||||
import { ItemDataService } from '../../../../core/data/item-data.service';
|
||||
import { Item } from '../../../../core/shared/item.model';
|
||||
import { MetadataRepresentation } from '../../../../core/shared/metadata-representation/metadata-representation.model';
|
||||
import { ItemViewMode, rendersItemType } from '../../../../shared/items/item-type-decorator';
|
||||
import { ITEM } from '../../../../shared/items/switcher/item-type-switcher.component';
|
||||
import { isNotEmpty } from '../../../../shared/empty.util';
|
||||
import { ItemComponent } from '../../../../+item-page/simple/item-types/shared/item.component';
|
||||
import {
|
||||
@@ -42,32 +40,25 @@ export class ProjectComponent extends ItemComponent implements OnInit {
|
||||
*/
|
||||
orgUnits$: Observable<Item[]>;
|
||||
|
||||
constructor(
|
||||
@Inject(ITEM) public item: Item,
|
||||
private ids: ItemDataService
|
||||
) {
|
||||
super(item);
|
||||
}
|
||||
|
||||
ngOnInit(): void {
|
||||
super.ngOnInit();
|
||||
|
||||
if (isNotEmpty(this.resolvedRelsAndTypes$)) {
|
||||
this.contributors$ = this.buildRepresentations('OrgUnit', 'project.contributor.other', this.ids);
|
||||
this.contributors$ = this.buildRepresentations('OrgUnit', 'project.contributor.other');
|
||||
|
||||
this.people$ = this.resolvedRelsAndTypes$.pipe(
|
||||
filterRelationsByTypeLabel('isPersonOfProject'),
|
||||
relationsToItems(this.item.id, this.ids)
|
||||
relationsToItems(this.item.id)
|
||||
);
|
||||
|
||||
this.publications$ = this.resolvedRelsAndTypes$.pipe(
|
||||
filterRelationsByTypeLabel('isPublicationOfProject'),
|
||||
relationsToItems(this.item.id, this.ids)
|
||||
relationsToItems(this.item.id)
|
||||
);
|
||||
|
||||
this.orgUnits$ = this.resolvedRelsAndTypes$.pipe(
|
||||
filterRelationsByTypeLabel('isOrgUnitOfProject'),
|
||||
relationsToItems(this.item.id, this.ids)
|
||||
relationsToItems(this.item.id)
|
||||
);
|
||||
}
|
||||
}
|
||||
|
@@ -1,4 +1,3 @@
|
||||
@import '../../styles/variables.scss';
|
||||
$footer-bg: $gray-100;
|
||||
$footer-border: 1px solid darken($footer-bg, 10%);
|
||||
$footer-padding: $spacer * 1.5;
|
||||
|
@@ -1,5 +1,3 @@
|
||||
@import '../../styles/variables.scss';
|
||||
|
||||
@media screen and (max-width: map-get($grid-breakpoints, md)) {
|
||||
:host.open {
|
||||
background-color: $white;
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user