mirror of
https://github.com/DSpace/dspace-angular.git
synced 2025-10-11 03:53:02 +00:00
[TLC-249] Larger refactor to field, item components for browse links
This commit is contained in:
@@ -50,7 +50,7 @@ export class BrowseDefinitionDataService extends IdentifiableDataService<BrowseD
|
|||||||
protected halService: HALEndpointService,
|
protected halService: HALEndpointService,
|
||||||
) {
|
) {
|
||||||
super('browses', requestService, rdbService, objectCache, halService);
|
super('browses', requestService, rdbService, objectCache, halService);
|
||||||
|
this.searchData = new SearchDataImpl(this.linkPath, requestService, rdbService, objectCache, halService, this.responseMsToLive);
|
||||||
this.findAllData = new FindAllDataImpl(this.linkPath, requestService, rdbService, objectCache, halService, this.responseMsToLive);
|
this.findAllData = new FindAllDataImpl(this.linkPath, requestService, rdbService, objectCache, halService, this.responseMsToLive);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -126,34 +126,52 @@ export class BrowseDefinitionDataService extends IdentifiableDataService<BrowseD
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
findAllLinked(
|
||||||
|
useCachedVersionIfAvailable = true,
|
||||||
|
reRequestOnStale = true,
|
||||||
|
...linksToFollow: FollowLinkConfig<BrowseDefinition>[]
|
||||||
|
): Observable<RemoteData<BrowseDefinition>> {
|
||||||
|
const searchParams = [];
|
||||||
|
|
||||||
|
const hrefObs = this.getSearchByHref(
|
||||||
|
'allLinked',
|
||||||
|
{ searchParams },
|
||||||
|
...linksToFollow
|
||||||
|
);
|
||||||
|
|
||||||
|
return this.findByHref(
|
||||||
|
hrefObs,
|
||||||
|
useCachedVersionIfAvailable,
|
||||||
|
reRequestOnStale,
|
||||||
|
...linksToFollow,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the browse URL by providing a list of metadata keys
|
* Get the browse URL by providing a list of metadata keys
|
||||||
* @param metadatumKey
|
* @param metadatumKey
|
||||||
* @param linkPath
|
* @param linkPath
|
||||||
*/
|
*/
|
||||||
findByFields(metadataKeys: string[]): Observable<BrowseDefinition> {
|
findByFields(
|
||||||
let searchKeyArray: string[] = [];
|
fields: string[],
|
||||||
metadataKeys.forEach((metadataKey) => {
|
useCachedVersionIfAvailable = true,
|
||||||
searchKeyArray = searchKeyArray.concat(BrowseDefinitionDataService.toSearchKeyArray(metadataKey));
|
reRequestOnStale = true,
|
||||||
});
|
...linksToFollow: FollowLinkConfig<BrowseDefinition>[]
|
||||||
return this.findAll().pipe(
|
): Observable<RemoteData<BrowseDefinition>> {
|
||||||
getRemoteDataPayload(),
|
const searchParams = [];
|
||||||
getPaginatedListPayload(),
|
searchParams.push(new RequestParam('fields', fields));
|
||||||
map((browseDefinitions: BrowseDefinition[]) => browseDefinitions
|
|
||||||
.find((def: BrowseDefinition) => {
|
const hrefObs = this.getSearchByHref(
|
||||||
const matchingKeys = def.metadataKeys.find((key: string) => searchKeyArray.indexOf(key) >= 0);
|
'byFields',
|
||||||
return isNotEmpty(matchingKeys);
|
{ searchParams },
|
||||||
})
|
...linksToFollow
|
||||||
),
|
);
|
||||||
map((def: BrowseDefinition) => {
|
|
||||||
if (isEmpty(def) || isEmpty(def.id)) {
|
return this.findByHref(
|
||||||
//throw new Error(`A browse definition for field ${metadataKey} isn't configured`);
|
hrefObs,
|
||||||
} else {
|
useCachedVersionIfAvailable,
|
||||||
return def;
|
reRequestOnStale,
|
||||||
}
|
...linksToFollow,
|
||||||
}),
|
|
||||||
startWith(undefined),
|
|
||||||
distinctUntilChanged()
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -1,28 +0,0 @@
|
|||||||
import { followLink } from '../../shared/utils/follow-link-config.model';
|
|
||||||
import { EMPTY } from 'rxjs';
|
|
||||||
import { FindListOptions } from '../data/find-list-options.model';
|
|
||||||
import { BrowseLinkDataService } from './browse-link-data.service';
|
|
||||||
|
|
||||||
describe(`BrowseLinkDataService`, () => {
|
|
||||||
let service: BrowseLinkDataService;
|
|
||||||
const findAllDataSpy = jasmine.createSpyObj('findAllData', {
|
|
||||||
findAll: EMPTY,
|
|
||||||
});
|
|
||||||
const options = new FindListOptions();
|
|
||||||
const linksToFollow = [
|
|
||||||
followLink('entries'),
|
|
||||||
followLink('items')
|
|
||||||
];
|
|
||||||
|
|
||||||
beforeEach(() => {
|
|
||||||
service = new BrowseLinkDataService(null, null, null, null, null);
|
|
||||||
(service as any).findAllData = findAllDataSpy;
|
|
||||||
});
|
|
||||||
|
|
||||||
describe(`getBrowseLinkFor`, () => {
|
|
||||||
it(`should call findAll on findAllData`, () => {
|
|
||||||
service.getBrowseLinkFor(['dc.test']);
|
|
||||||
expect(findAllDataSpy.findAll).toHaveBeenCalledWith({ elementsPerPage: 9999 });
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
@@ -1,82 +0,0 @@
|
|||||||
import { Injectable } from '@angular/core';
|
|
||||||
import { BrowseDefinition } from '../shared/browse-definition.model';
|
|
||||||
import { RequestService } from '../data/request.service';
|
|
||||||
import { RemoteDataBuildService } from '../cache/builders/remote-data-build.service';
|
|
||||||
import { ObjectCacheService } from '../cache/object-cache.service';
|
|
||||||
import { HALEndpointService } from '../shared/hal-endpoint.service';
|
|
||||||
import { Observable } from 'rxjs';
|
|
||||||
import { RemoteData } from '../data/remote-data';
|
|
||||||
import { PaginatedList } from '../data/paginated-list.model';
|
|
||||||
import { IdentifiableDataService } from '../data/base/identifiable-data.service';
|
|
||||||
import { FindAllDataImpl } from '../data/base/find-all-data';
|
|
||||||
import { BrowseDefinitionDataService } from './browse-definition-data.service';
|
|
||||||
import {
|
|
||||||
getFirstSucceededRemoteData, getPaginatedListPayload, getRemoteDataPayload
|
|
||||||
} from '../shared/operators';
|
|
||||||
import { distinctUntilChanged, map, startWith } from 'rxjs/operators';
|
|
||||||
import { isEmpty, isNotEmpty } from '../../shared/empty.util';
|
|
||||||
import { BrowseService } from './browse.service';
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Data service responsible for retrieving browse definitions from the REST server, IF AND ONLY IF
|
|
||||||
* they are configured as browse links (webui.browse.link.<n>)
|
|
||||||
*/
|
|
||||||
@Injectable()
|
|
||||||
export class BrowseLinkDataService extends IdentifiableDataService<BrowseDefinition> {
|
|
||||||
private findAllData: FindAllDataImpl<BrowseDefinition>;
|
|
||||||
|
|
||||||
constructor(
|
|
||||||
protected requestService: RequestService,
|
|
||||||
protected rdbService: RemoteDataBuildService,
|
|
||||||
protected objectCache: ObjectCacheService,
|
|
||||||
protected halService: HALEndpointService,
|
|
||||||
protected browseDefinitionDataService: BrowseDefinitionDataService
|
|
||||||
) {
|
|
||||||
super('browselinks', requestService, rdbService, objectCache, halService);
|
|
||||||
this.findAllData = new FindAllDataImpl(this.linkPath, requestService, rdbService, objectCache, halService, this.responseMsToLive);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get all BrowseDefinitions
|
|
||||||
*/
|
|
||||||
getBrowseLinks(): Observable<RemoteData<PaginatedList<BrowseDefinition>>> {
|
|
||||||
return this.findAllData.findAll({ elementsPerPage: 9999 }).pipe(
|
|
||||||
getFirstSucceededRemoteData(),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get the browse URL by providing a list of metadata keys
|
|
||||||
* @param metadatumKey
|
|
||||||
* @param linkPath
|
|
||||||
*/
|
|
||||||
getBrowseLinkFor(metadataKeys: string[]): Observable<BrowseDefinition> {
|
|
||||||
let searchKeyArray: string[] = [];
|
|
||||||
metadataKeys.forEach((metadataKey) => {
|
|
||||||
searchKeyArray = searchKeyArray.concat(BrowseService.toSearchKeyArray(metadataKey));
|
|
||||||
});
|
|
||||||
return this.getBrowseLinks().pipe(
|
|
||||||
getRemoteDataPayload(),
|
|
||||||
getPaginatedListPayload(),
|
|
||||||
map((browseDefinitions: BrowseDefinition[]) => browseDefinitions
|
|
||||||
.find((def: BrowseDefinition) => {
|
|
||||||
const matchingKeys = def.metadataKeys.find((key: string) => searchKeyArray.indexOf(key) >= 0);
|
|
||||||
return isNotEmpty(matchingKeys);
|
|
||||||
})
|
|
||||||
),
|
|
||||||
map((def: BrowseDefinition) => {
|
|
||||||
if (isEmpty(def) || isEmpty(def.id)) {
|
|
||||||
//throw new Error(`A browse definition for field ${metadataKey} isn't configured`);
|
|
||||||
} else {
|
|
||||||
return def;
|
|
||||||
}
|
|
||||||
}),
|
|
||||||
startWith(undefined),
|
|
||||||
distinctUntilChanged()
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
@@ -24,7 +24,6 @@ import { SidebarService } from '../shared/sidebar/sidebar.service';
|
|||||||
import { AuthenticatedGuard } from './auth/authenticated.guard';
|
import { AuthenticatedGuard } from './auth/authenticated.guard';
|
||||||
import { AuthStatus } from './auth/models/auth-status.model';
|
import { AuthStatus } from './auth/models/auth-status.model';
|
||||||
import { BrowseService } from './browse/browse.service';
|
import { BrowseService } from './browse/browse.service';
|
||||||
import { BrowseLinkDataService } from './browse/browse-link-data.service';
|
|
||||||
import { RemoteDataBuildService } from './cache/builders/remote-data-build.service';
|
import { RemoteDataBuildService } from './cache/builders/remote-data-build.service';
|
||||||
import { ObjectCacheService } from './cache/object-cache.service';
|
import { ObjectCacheService } from './cache/object-cache.service';
|
||||||
import { SubmissionDefinitionsModel } from './config/models/config-submission-definitions.model';
|
import { SubmissionDefinitionsModel } from './config/models/config-submission-definitions.model';
|
||||||
@@ -222,7 +221,6 @@ const PROVIDERS = [
|
|||||||
MyDSpaceResponseParsingService,
|
MyDSpaceResponseParsingService,
|
||||||
ServerResponseService,
|
ServerResponseService,
|
||||||
BrowseService,
|
BrowseService,
|
||||||
BrowseLinkDataService,
|
|
||||||
AccessStatusDataService,
|
AccessStatusDataService,
|
||||||
SubmissionCcLicenseDataService,
|
SubmissionCcLicenseDataService,
|
||||||
SubmissionCcLicenseUrlDataService,
|
SubmissionCcLicenseUrlDataService,
|
||||||
|
@@ -35,6 +35,12 @@ import { VersionDataService } from '../../../../core/data/version-data.service';
|
|||||||
import { WorkspaceitemDataService } from '../../../../core/submission/workspaceitem-data.service';
|
import { WorkspaceitemDataService } from '../../../../core/submission/workspaceitem-data.service';
|
||||||
import { SearchService } from '../../../../core/shared/search/search.service';
|
import { SearchService } from '../../../../core/shared/search/search.service';
|
||||||
import { mockRouteService } from '../../../../item-page/simple/item-types/shared/item.component.spec';
|
import { mockRouteService } from '../../../../item-page/simple/item-types/shared/item.component.spec';
|
||||||
|
import {
|
||||||
|
BrowseDefinitionDataServiceStub,
|
||||||
|
browseServiceStub,
|
||||||
|
} from '../../../../shared/testing/browse-definition-data-service.stub';
|
||||||
|
import { BrowseService } from '../../../../core/browse/browse.service';
|
||||||
|
import { BrowseDefinitionDataService } from '../../../../core/browse/browse-definition-data.service';
|
||||||
|
|
||||||
let comp: JournalComponent;
|
let comp: JournalComponent;
|
||||||
let fixture: ComponentFixture<JournalComponent>;
|
let fixture: ComponentFixture<JournalComponent>;
|
||||||
@@ -100,7 +106,9 @@ describe('JournalComponent', () => {
|
|||||||
{ provide: BitstreamDataService, useValue: mockBitstreamDataService },
|
{ provide: BitstreamDataService, useValue: mockBitstreamDataService },
|
||||||
{ provide: WorkspaceitemDataService, useValue: {} },
|
{ provide: WorkspaceitemDataService, useValue: {} },
|
||||||
{ provide: SearchService, useValue: {} },
|
{ provide: SearchService, useValue: {} },
|
||||||
{ provide: RouteService, useValue: mockRouteService }
|
{ provide: RouteService, useValue: mockRouteService },
|
||||||
|
{ provide: BrowseService, useValue: browseServiceStub },
|
||||||
|
{ provide: BrowseDefinitionDataService, useValue: BrowseDefinitionDataServiceStub }
|
||||||
],
|
],
|
||||||
|
|
||||||
schemas: [NO_ERRORS_SCHEMA]
|
schemas: [NO_ERRORS_SCHEMA]
|
||||||
|
@@ -7,8 +7,8 @@ import { SharedModule } from '../../../../../shared/shared.module';
|
|||||||
import { APP_CONFIG } from '../../../../../../config/app-config.interface';
|
import { APP_CONFIG } from '../../../../../../config/app-config.interface';
|
||||||
import { environment } from '../../../../../../environments/environment';
|
import { environment } from '../../../../../../environments/environment';
|
||||||
import { By } from '@angular/platform-browser';
|
import { By } from '@angular/platform-browser';
|
||||||
import { BrowseLinkDataService } from '../../../../../core/browse/browse-link-data.service';
|
import { BrowseDefinitionDataService } from '../../../../../core/browse/browse-definition-data.service';
|
||||||
import { browseLinkDataServiceStub } from '../../../../../shared/testing/browse-link-data-service.stub';
|
import { BrowseDefinitionDataServiceStub } from '../../../../../shared/testing/browse-definition-data-service.stub';
|
||||||
|
|
||||||
let comp: ItemPageAbstractFieldComponent;
|
let comp: ItemPageAbstractFieldComponent;
|
||||||
let fixture: ComponentFixture<ItemPageAbstractFieldComponent>;
|
let fixture: ComponentFixture<ItemPageAbstractFieldComponent>;
|
||||||
@@ -27,7 +27,7 @@ describe('ItemPageAbstractFieldComponent', () => {
|
|||||||
],
|
],
|
||||||
providers: [
|
providers: [
|
||||||
{ provide: APP_CONFIG, useValue: environment },
|
{ provide: APP_CONFIG, useValue: environment },
|
||||||
{ provide: BrowseLinkDataService, useValue: browseLinkDataServiceStub }
|
{ provide: BrowseDefinitionDataService, useValue: BrowseDefinitionDataServiceStub }
|
||||||
],
|
],
|
||||||
declarations: [ItemPageAbstractFieldComponent],
|
declarations: [ItemPageAbstractFieldComponent],
|
||||||
schemas: [NO_ERRORS_SCHEMA]
|
schemas: [NO_ERRORS_SCHEMA]
|
||||||
|
@@ -7,8 +7,8 @@ import { mockItemWithMetadataFieldsAndValue } from '../item-page-field.component
|
|||||||
import { ItemPageAuthorFieldComponent } from './item-page-author-field.component';
|
import { ItemPageAuthorFieldComponent } from './item-page-author-field.component';
|
||||||
import { APP_CONFIG } from '../../../../../../config/app-config.interface';
|
import { APP_CONFIG } from '../../../../../../config/app-config.interface';
|
||||||
import { environment } from '../../../../../../environments/environment';
|
import { environment } from '../../../../../../environments/environment';
|
||||||
import { BrowseLinkDataService } from '../../../../../core/browse/browse-link-data.service';
|
import { BrowseDefinitionDataService } from '../../../../../core/browse/browse-definition-data.service';
|
||||||
import { browseLinkDataServiceStub } from '../../../../../shared/testing/browse-link-data-service.stub';
|
import { BrowseDefinitionDataServiceStub } from '../../../../../shared/testing/browse-definition-data-service.stub';
|
||||||
|
|
||||||
let comp: ItemPageAuthorFieldComponent;
|
let comp: ItemPageAuthorFieldComponent;
|
||||||
let fixture: ComponentFixture<ItemPageAuthorFieldComponent>;
|
let fixture: ComponentFixture<ItemPageAuthorFieldComponent>;
|
||||||
@@ -27,7 +27,7 @@ describe('ItemPageAuthorFieldComponent', () => {
|
|||||||
})],
|
})],
|
||||||
providers: [
|
providers: [
|
||||||
{ provide: APP_CONFIG, useValue: environment },
|
{ provide: APP_CONFIG, useValue: environment },
|
||||||
{ provide: BrowseLinkDataService, useValue: browseLinkDataServiceStub }
|
{ provide: BrowseDefinitionDataService, useValue: BrowseDefinitionDataServiceStub }
|
||||||
],
|
],
|
||||||
declarations: [ItemPageAuthorFieldComponent, MetadataValuesComponent],
|
declarations: [ItemPageAuthorFieldComponent, MetadataValuesComponent],
|
||||||
schemas: [NO_ERRORS_SCHEMA]
|
schemas: [NO_ERRORS_SCHEMA]
|
||||||
|
@@ -7,8 +7,8 @@ import { mockItemWithMetadataFieldsAndValue } from '../item-page-field.component
|
|||||||
import { ItemPageDateFieldComponent } from './item-page-date-field.component';
|
import { ItemPageDateFieldComponent } from './item-page-date-field.component';
|
||||||
import { APP_CONFIG } from '../../../../../../config/app-config.interface';
|
import { APP_CONFIG } from '../../../../../../config/app-config.interface';
|
||||||
import { environment } from '../../../../../../environments/environment';
|
import { environment } from '../../../../../../environments/environment';
|
||||||
import { BrowseLinkDataService } from '../../../../../core/browse/browse-link-data.service';
|
import { BrowseDefinitionDataService } from '../../../../../core/browse/browse-definition-data.service';
|
||||||
import { browseLinkDataServiceStub } from '../../../../../shared/testing/browse-link-data-service.stub';
|
import { BrowseDefinitionDataServiceStub } from '../../../../../shared/testing/browse-definition-data-service.stub';
|
||||||
|
|
||||||
let comp: ItemPageDateFieldComponent;
|
let comp: ItemPageDateFieldComponent;
|
||||||
let fixture: ComponentFixture<ItemPageDateFieldComponent>;
|
let fixture: ComponentFixture<ItemPageDateFieldComponent>;
|
||||||
@@ -27,7 +27,7 @@ describe('ItemPageDateFieldComponent', () => {
|
|||||||
})],
|
})],
|
||||||
providers: [
|
providers: [
|
||||||
{ provide: APP_CONFIG, useValue: environment },
|
{ provide: APP_CONFIG, useValue: environment },
|
||||||
{ provide: BrowseLinkDataService, useValue: browseLinkDataServiceStub }
|
{ provide: BrowseDefinitionDataService, useValue: BrowseDefinitionDataServiceStub }
|
||||||
],
|
],
|
||||||
declarations: [ItemPageDateFieldComponent, MetadataValuesComponent],
|
declarations: [ItemPageDateFieldComponent, MetadataValuesComponent],
|
||||||
schemas: [NO_ERRORS_SCHEMA]
|
schemas: [NO_ERRORS_SCHEMA]
|
||||||
|
@@ -7,8 +7,8 @@ import { mockItemWithMetadataFieldsAndValue } from '../item-page-field.component
|
|||||||
import { GenericItemPageFieldComponent } from './generic-item-page-field.component';
|
import { GenericItemPageFieldComponent } from './generic-item-page-field.component';
|
||||||
import { APP_CONFIG } from '../../../../../../config/app-config.interface';
|
import { APP_CONFIG } from '../../../../../../config/app-config.interface';
|
||||||
import { environment } from '../../../../../../environments/environment';
|
import { environment } from '../../../../../../environments/environment';
|
||||||
import { BrowseLinkDataService } from '../../../../../core/browse/browse-link-data.service';
|
import { BrowseDefinitionDataService } from '../../../../../core/browse/browse-definition-data.service';
|
||||||
import { browseLinkDataServiceStub } from '../../../../../shared/testing/browse-link-data-service.stub';
|
import { BrowseDefinitionDataServiceStub } from '../../../../../shared/testing/browse-definition-data-service.stub';
|
||||||
|
|
||||||
let comp: GenericItemPageFieldComponent;
|
let comp: GenericItemPageFieldComponent;
|
||||||
let fixture: ComponentFixture<GenericItemPageFieldComponent>;
|
let fixture: ComponentFixture<GenericItemPageFieldComponent>;
|
||||||
@@ -29,7 +29,7 @@ describe('GenericItemPageFieldComponent', () => {
|
|||||||
})],
|
})],
|
||||||
providers: [
|
providers: [
|
||||||
{ provide: APP_CONFIG, useValue: environment },
|
{ provide: APP_CONFIG, useValue: environment },
|
||||||
{ provide: BrowseLinkDataService, useValue: browseLinkDataServiceStub }
|
{ provide: BrowseDefinitionDataService, useValue: BrowseDefinitionDataServiceStub }
|
||||||
],
|
],
|
||||||
declarations: [GenericItemPageFieldComponent, MetadataValuesComponent],
|
declarations: [GenericItemPageFieldComponent, MetadataValuesComponent],
|
||||||
schemas: [NO_ERRORS_SCHEMA]
|
schemas: [NO_ERRORS_SCHEMA]
|
||||||
|
@@ -12,9 +12,9 @@ import { environment } from '../../../../../environments/environment';
|
|||||||
import { MarkdownPipe } from '../../../../shared/utils/markdown.pipe';
|
import { MarkdownPipe } from '../../../../shared/utils/markdown.pipe';
|
||||||
import { SharedModule } from '../../../../shared/shared.module';
|
import { SharedModule } from '../../../../shared/shared.module';
|
||||||
import { APP_CONFIG } from '../../../../../config/app-config.interface';
|
import { APP_CONFIG } from '../../../../../config/app-config.interface';
|
||||||
import { BrowseLinkDataService } from '../../../../core/browse/browse-link-data.service';
|
|
||||||
import { browseLinkDataServiceStub } from '../../../../shared/testing/browse-link-data-service.stub';
|
|
||||||
import { By } from '@angular/platform-browser';
|
import { By } from '@angular/platform-browser';
|
||||||
|
import { BrowseDefinitionDataService } from '../../../../core/browse/browse-definition-data.service';
|
||||||
|
import { BrowseDefinitionDataServiceStub } from '../../../../shared/testing/browse-definition-data-service.stub';
|
||||||
|
|
||||||
let comp: ItemPageFieldComponent;
|
let comp: ItemPageFieldComponent;
|
||||||
let fixture: ComponentFixture<ItemPageFieldComponent>;
|
let fixture: ComponentFixture<ItemPageFieldComponent>;
|
||||||
@@ -49,7 +49,7 @@ describe('ItemPageFieldComponent', () => {
|
|||||||
],
|
],
|
||||||
providers: [
|
providers: [
|
||||||
{ provide: APP_CONFIG, useValue: appConfig },
|
{ provide: APP_CONFIG, useValue: appConfig },
|
||||||
{ provide: BrowseLinkDataService, useValue: browseLinkDataServiceStub }
|
{ provide: BrowseDefinitionDataService, useValue: BrowseDefinitionDataServiceStub }
|
||||||
],
|
],
|
||||||
declarations: [ItemPageFieldComponent, MetadataValuesComponent],
|
declarations: [ItemPageFieldComponent, MetadataValuesComponent],
|
||||||
schemas: [NO_ERRORS_SCHEMA]
|
schemas: [NO_ERRORS_SCHEMA]
|
||||||
|
@@ -3,7 +3,8 @@ import { Item } from '../../../../core/shared/item.model';
|
|||||||
import { map } from 'rxjs/operators';
|
import { map } from 'rxjs/operators';
|
||||||
import { Observable } from 'rxjs';
|
import { Observable } from 'rxjs';
|
||||||
import { BrowseDefinition } from '../../../../core/shared/browse-definition.model';
|
import { BrowseDefinition } from '../../../../core/shared/browse-definition.model';
|
||||||
import { BrowseLinkDataService } from '../../../../core/browse/browse-link-data.service';
|
import { BrowseDefinitionDataService } from '../../../../core/browse/browse-definition-data.service';
|
||||||
|
import { getPaginatedListPayload, getRemoteDataPayload } from '../../../../core/shared/operators';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This component can be used to represent metadata on a simple item page.
|
* This component can be used to represent metadata on a simple item page.
|
||||||
@@ -16,7 +17,7 @@ import { BrowseLinkDataService } from '../../../../core/browse/browse-link-data.
|
|||||||
})
|
})
|
||||||
export class ItemPageFieldComponent {
|
export class ItemPageFieldComponent {
|
||||||
|
|
||||||
constructor(protected browseLinkDataService: BrowseLinkDataService) {
|
constructor(protected browseDefinitionDataService: BrowseDefinitionDataService) {
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -55,7 +56,9 @@ export class ItemPageFieldComponent {
|
|||||||
* link in dspace.cfg (webui.browse.link.<n>)
|
* link in dspace.cfg (webui.browse.link.<n>)
|
||||||
*/
|
*/
|
||||||
get browseDefinition(): Observable<BrowseDefinition> {
|
get browseDefinition(): Observable<BrowseDefinition> {
|
||||||
return this.browseLinkDataService.getBrowseLinkFor(this.fields).pipe(
|
return this.browseDefinitionDataService.findByFields(this.fields).pipe(
|
||||||
map((def) => def));
|
getRemoteDataPayload(),
|
||||||
|
map((def) => def)
|
||||||
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -7,8 +7,8 @@ import { ItemPageUriFieldComponent } from './item-page-uri-field.component';
|
|||||||
import { MetadataUriValuesComponent } from '../../../../field-components/metadata-uri-values/metadata-uri-values.component';
|
import { MetadataUriValuesComponent } from '../../../../field-components/metadata-uri-values/metadata-uri-values.component';
|
||||||
import { environment } from '../../../../../../environments/environment';
|
import { environment } from '../../../../../../environments/environment';
|
||||||
import { APP_CONFIG } from '../../../../../../config/app-config.interface';
|
import { APP_CONFIG } from '../../../../../../config/app-config.interface';
|
||||||
import { BrowseLinkDataService } from '../../../../../core/browse/browse-link-data.service';
|
import { BrowseDefinitionDataService } from '../../../../../core/browse/browse-definition-data.service';
|
||||||
import { browseLinkDataServiceStub } from '../../../../../shared/testing/browse-link-data-service.stub';
|
import { BrowseDefinitionDataServiceStub } from '../../../../../shared/testing/browse-definition-data-service.stub';
|
||||||
|
|
||||||
let comp: ItemPageUriFieldComponent;
|
let comp: ItemPageUriFieldComponent;
|
||||||
let fixture: ComponentFixture<ItemPageUriFieldComponent>;
|
let fixture: ComponentFixture<ItemPageUriFieldComponent>;
|
||||||
@@ -28,7 +28,7 @@ describe('ItemPageUriFieldComponent', () => {
|
|||||||
})],
|
})],
|
||||||
providers: [
|
providers: [
|
||||||
{ provide: APP_CONFIG, useValue: environment },
|
{ provide: APP_CONFIG, useValue: environment },
|
||||||
{ provide: BrowseLinkDataService, useValue: browseLinkDataServiceStub }
|
{ provide: BrowseDefinitionDataService, useValue: BrowseDefinitionDataServiceStub }
|
||||||
],
|
],
|
||||||
declarations: [ItemPageUriFieldComponent, MetadataUriValuesComponent],
|
declarations: [ItemPageUriFieldComponent, MetadataUriValuesComponent],
|
||||||
schemas: [NO_ERRORS_SCHEMA]
|
schemas: [NO_ERRORS_SCHEMA]
|
||||||
|
@@ -36,8 +36,12 @@ import { VersionDataService } from '../../../../core/data/version-data.service';
|
|||||||
import { RouterTestingModule } from '@angular/router/testing';
|
import { RouterTestingModule } from '@angular/router/testing';
|
||||||
import { WorkspaceitemDataService } from '../../../../core/submission/workspaceitem-data.service';
|
import { WorkspaceitemDataService } from '../../../../core/submission/workspaceitem-data.service';
|
||||||
import { SearchService } from '../../../../core/shared/search/search.service';
|
import { SearchService } from '../../../../core/shared/search/search.service';
|
||||||
import { BrowseLinkDataService } from '../../../../core/browse/browse-link-data.service';
|
import { BrowseDefinitionDataService } from '../../../../core/browse/browse-definition-data.service';
|
||||||
import { browseLinkDataServiceStub } from '../../../../shared/testing/browse-link-data-service.stub';
|
import {
|
||||||
|
BrowseDefinitionDataServiceStub,
|
||||||
|
browseServiceStub,
|
||||||
|
} from '../../../../shared/testing/browse-definition-data-service.stub';
|
||||||
|
import { BrowseService } from '../../../../core/browse/browse.service';
|
||||||
|
|
||||||
const noMetadata = new MetadataMap();
|
const noMetadata = new MetadataMap();
|
||||||
|
|
||||||
@@ -90,7 +94,8 @@ describe('PublicationComponent', () => {
|
|||||||
{ provide: WorkspaceitemDataService, useValue: {} },
|
{ provide: WorkspaceitemDataService, useValue: {} },
|
||||||
{ provide: SearchService, useValue: {} },
|
{ provide: SearchService, useValue: {} },
|
||||||
{ provide: RouteService, useValue: mockRouteService },
|
{ provide: RouteService, useValue: mockRouteService },
|
||||||
{ provide: BrowseLinkDataService, useValue: browseLinkDataServiceStub }
|
{ provide: BrowseDefinitionDataService, useValue: BrowseDefinitionDataServiceStub },
|
||||||
|
{ provide: BrowseService, useValue: browseServiceStub },
|
||||||
],
|
],
|
||||||
|
|
||||||
schemas: [NO_ERRORS_SCHEMA]
|
schemas: [NO_ERRORS_SCHEMA]
|
||||||
|
@@ -23,7 +23,10 @@ import { UUIDService } from '../../../../core/shared/uuid.service';
|
|||||||
import { isNotEmpty } from '../../../../shared/empty.util';
|
import { isNotEmpty } from '../../../../shared/empty.util';
|
||||||
import { TranslateLoaderMock } from '../../../../shared/mocks/translate-loader.mock';
|
import { TranslateLoaderMock } from '../../../../shared/mocks/translate-loader.mock';
|
||||||
import { NotificationsService } from '../../../../shared/notifications/notifications.service';
|
import { NotificationsService } from '../../../../shared/notifications/notifications.service';
|
||||||
import { createSuccessfulRemoteDataObject$ } from '../../../../shared/remote-data.utils';
|
import {
|
||||||
|
createSuccessfulRemoteDataObject,
|
||||||
|
createSuccessfulRemoteDataObject$
|
||||||
|
} from '../../../../shared/remote-data.utils';
|
||||||
import { TruncatableService } from '../../../../shared/truncatable/truncatable.service';
|
import { TruncatableService } from '../../../../shared/truncatable/truncatable.service';
|
||||||
import { TruncatePipe } from '../../../../shared/utils/truncate.pipe';
|
import { TruncatePipe } from '../../../../shared/utils/truncate.pipe';
|
||||||
import { GenericItemPageFieldComponent } from '../../field-components/specific-field/generic/generic-item-page-field.component';
|
import { GenericItemPageFieldComponent } from '../../field-components/specific-field/generic/generic-item-page-field.component';
|
||||||
@@ -38,13 +41,18 @@ import { VersionHistoryDataService } from '../../../../core/data/version-history
|
|||||||
import { RouterTestingModule } from '@angular/router/testing';
|
import { RouterTestingModule } from '@angular/router/testing';
|
||||||
import { AuthorizationDataService } from '../../../../core/data/feature-authorization/authorization-data.service';
|
import { AuthorizationDataService } from '../../../../core/data/feature-authorization/authorization-data.service';
|
||||||
import { ResearcherProfileDataService } from '../../../../core/profile/researcher-profile-data.service';
|
import { ResearcherProfileDataService } from '../../../../core/profile/researcher-profile-data.service';
|
||||||
import { BrowseLinkDataService } from '../../../../core/browse/browse-link-data.service';
|
import { BrowseService } from '../../../../core/browse/browse.service';
|
||||||
import { browseLinkDataServiceStub } from '../../../../shared/testing/browse-link-data-service.stub';
|
import { BrowseDefinitionDataService } from '../../../../core/browse/browse-definition-data.service';
|
||||||
|
import {
|
||||||
|
BrowseDefinitionDataServiceStub,
|
||||||
|
browseServiceStub,
|
||||||
|
} from '../../../../shared/testing/browse-definition-data-service.stub';
|
||||||
|
|
||||||
import { buildPaginatedList } from '../../../../core/data/paginated-list.model';
|
import { buildPaginatedList, PaginatedList } from '../../../../core/data/paginated-list.model';
|
||||||
import { PageInfo } from '../../../../core/shared/page-info.model';
|
import { PageInfo } from '../../../../core/shared/page-info.model';
|
||||||
import { Router } from '@angular/router';
|
import { Router } from '@angular/router';
|
||||||
import { ItemComponent } from './item.component';
|
import { ItemComponent } from './item.component';
|
||||||
|
import { BrowseDefinition } from '../../../../core/shared/browse-definition.model';
|
||||||
|
|
||||||
export function getIIIFSearchEnabled(enabled: boolean): MetadataValue {
|
export function getIIIFSearchEnabled(enabled: boolean): MetadataValue {
|
||||||
return Object.assign(new MetadataValue(), {
|
return Object.assign(new MetadataValue(), {
|
||||||
@@ -72,6 +80,12 @@ export const mockRouteService = {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export const mockBrowseService = {
|
||||||
|
getBrowseDefinitions(): Observable<RemoteData<PaginatedList<BrowseDefinition>>> {
|
||||||
|
return observableOf(createSuccessfulRemoteDataObject(buildPaginatedList(new PageInfo(), [])));
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create a generic test for an item-page-fields component using a mockItem and the type of component
|
* Create a generic test for an item-page-fields component using a mockItem and the type of component
|
||||||
* @param {Item} mockItem The item to use for testing. The item needs to contain just the metadata necessary to
|
* @param {Item} mockItem The item to use for testing. The item needs to contain just the metadata necessary to
|
||||||
@@ -128,7 +142,8 @@ export function getItemPageFieldsTest(mockItem: Item, component) {
|
|||||||
{ provide: RouteService, useValue: mockRouteService },
|
{ provide: RouteService, useValue: mockRouteService },
|
||||||
{ provide: AuthorizationDataService, useValue: authorizationService },
|
{ provide: AuthorizationDataService, useValue: authorizationService },
|
||||||
{ provide: ResearcherProfileDataService, useValue: {} },
|
{ provide: ResearcherProfileDataService, useValue: {} },
|
||||||
{ provide: BrowseLinkDataService, useValue: browseLinkDataServiceStub }
|
{ provide: BrowseDefinitionDataService, useValue: BrowseDefinitionDataServiceStub },
|
||||||
|
{ provide: BrowseService, useValue: browseServiceStub }
|
||||||
],
|
],
|
||||||
|
|
||||||
schemas: [NO_ERRORS_SCHEMA]
|
schemas: [NO_ERRORS_SCHEMA]
|
||||||
@@ -447,7 +462,8 @@ describe('ItemComponent', () => {
|
|||||||
{ provide: SearchService, useValue: {} },
|
{ provide: SearchService, useValue: {} },
|
||||||
{ provide: RouteService, useValue: mockRouteService },
|
{ provide: RouteService, useValue: mockRouteService },
|
||||||
{ provide: AuthorizationDataService, useValue: {} },
|
{ provide: AuthorizationDataService, useValue: {} },
|
||||||
{ provide: ResearcherProfileDataService, useValue: {} }
|
{ provide: ResearcherProfileDataService, useValue: {} },
|
||||||
|
{ provide: BrowseService, useValue: browseServiceStub }
|
||||||
],
|
],
|
||||||
schemas: [NO_ERRORS_SCHEMA]
|
schemas: [NO_ERRORS_SCHEMA]
|
||||||
}).overrideComponent(ItemComponent, {
|
}).overrideComponent(ItemComponent, {
|
||||||
|
@@ -36,9 +36,13 @@ import { VersionDataService } from '../../../../core/data/version-data.service';
|
|||||||
import { RouterTestingModule } from '@angular/router/testing';
|
import { RouterTestingModule } from '@angular/router/testing';
|
||||||
import { WorkspaceitemDataService } from '../../../../core/submission/workspaceitem-data.service';
|
import { WorkspaceitemDataService } from '../../../../core/submission/workspaceitem-data.service';
|
||||||
import { SearchService } from '../../../../core/shared/search/search.service';
|
import { SearchService } from '../../../../core/shared/search/search.service';
|
||||||
import { BrowseLinkDataService } from '../../../../core/browse/browse-link-data.service';
|
|
||||||
import { browseLinkDataServiceStub } from '../../../../shared/testing/browse-link-data-service.stub';
|
|
||||||
import { ItemVersionsSharedService } from '../../../versions/item-versions-shared.service';
|
import { ItemVersionsSharedService } from '../../../versions/item-versions-shared.service';
|
||||||
|
import { BrowseDefinitionDataService } from '../../../../core/browse/browse-definition-data.service';
|
||||||
|
import {
|
||||||
|
BrowseDefinitionDataServiceStub,
|
||||||
|
browseServiceStub,
|
||||||
|
} from '../../../../shared/testing/browse-definition-data-service.stub';
|
||||||
|
import { BrowseService } from '../../../../core/browse/browse.service';
|
||||||
|
|
||||||
const noMetadata = new MetadataMap();
|
const noMetadata = new MetadataMap();
|
||||||
|
|
||||||
@@ -93,7 +97,8 @@ describe('UntypedItemComponent', () => {
|
|||||||
{ provide: ItemDataService, useValue: {} },
|
{ provide: ItemDataService, useValue: {} },
|
||||||
{ provide: ItemVersionsSharedService, useValue: {} },
|
{ provide: ItemVersionsSharedService, useValue: {} },
|
||||||
{ provide: RouteService, useValue: mockRouteService },
|
{ provide: RouteService, useValue: mockRouteService },
|
||||||
{ provide: BrowseLinkDataService, useValue: browseLinkDataServiceStub }
|
{ provide: BrowseDefinitionDataService, useValue: BrowseDefinitionDataServiceStub },
|
||||||
|
{ provide: BrowseService, useValue: browseServiceStub },
|
||||||
],
|
],
|
||||||
schemas: [NO_ERRORS_SCHEMA]
|
schemas: [NO_ERRORS_SCHEMA]
|
||||||
}).overrideComponent(UntypedItemComponent, {
|
}).overrideComponent(UntypedItemComponent, {
|
||||||
|
@@ -21,6 +21,10 @@ import { Version } from '../../../../core/shared/version.model';
|
|||||||
import { RouteService } from '../../../../core/services/route.service';
|
import { RouteService } from '../../../../core/services/route.service';
|
||||||
import { TranslateLoaderMock } from '../../../../shared/testing/translate-loader.mock';
|
import { TranslateLoaderMock } from '../../../../shared/testing/translate-loader.mock';
|
||||||
import { ItemSharedModule } from '../../../item-shared.module';
|
import { ItemSharedModule } from '../../../item-shared.module';
|
||||||
|
import {
|
||||||
|
browseServiceStub,
|
||||||
|
} from '../../../../shared/testing/browse-definition-data-service.stub';
|
||||||
|
import { BrowseService } from '../../../../core/browse/browse.service';
|
||||||
|
|
||||||
const mockItem: Item = Object.assign(new Item(), {
|
const mockItem: Item = Object.assign(new Item(), {
|
||||||
bundles: createSuccessfulRemoteDataObject$(buildPaginatedList(new PageInfo(), [])),
|
bundles: createSuccessfulRemoteDataObject$(buildPaginatedList(new PageInfo(), [])),
|
||||||
@@ -77,7 +81,8 @@ describe('VersionedItemComponent', () => {
|
|||||||
{ provide: WorkspaceitemDataService, useValue: {} },
|
{ provide: WorkspaceitemDataService, useValue: {} },
|
||||||
{ provide: SearchService, useValue: {} },
|
{ provide: SearchService, useValue: {} },
|
||||||
{ provide: ItemDataService, useValue: {} },
|
{ provide: ItemDataService, useValue: {} },
|
||||||
{ provide: RouteService, useValue: mockRouteService }
|
{ provide: RouteService, useValue: mockRouteService },
|
||||||
|
{ provide: BrowseService, useValue: browseServiceStub },
|
||||||
]
|
]
|
||||||
}).compileComponents();
|
}).compileComponents();
|
||||||
versionService = TestBed.inject(VersionDataService);
|
versionService = TestBed.inject(VersionDataService);
|
||||||
|
@@ -3,7 +3,7 @@ import { ChangeDetectionStrategy, NO_ERRORS_SCHEMA } from '@angular/core';
|
|||||||
import { PlainTextMetadataListElementComponent } from './plain-text-metadata-list-element.component';
|
import { PlainTextMetadataListElementComponent } from './plain-text-metadata-list-element.component';
|
||||||
import { MetadatumRepresentation } from '../../../../core/shared/metadata-representation/metadatum/metadatum-representation.model';
|
import { MetadatumRepresentation } from '../../../../core/shared/metadata-representation/metadatum/metadatum-representation.model';
|
||||||
import { By } from '@angular/platform-browser';
|
import { By } from '@angular/platform-browser';
|
||||||
import { mockData } from '../../../testing/browse-link-data-service.stub';
|
import { mockData } from '../../../testing/browse-definition-data-service.stub';
|
||||||
|
|
||||||
// Render the mock representation with the default mock author browse definition so it is also rendered as a link
|
// Render the mock representation with the default mock author browse definition so it is also rendered as a link
|
||||||
// without affecting other tests
|
// without affecting other tests
|
||||||
|
@@ -36,25 +36,39 @@ export const mockData: BrowseDefinition[] = [
|
|||||||
})
|
})
|
||||||
];
|
];
|
||||||
|
|
||||||
|
export const browseServiceStub = {
|
||||||
|
getBrowseDefinitions(): Observable<RemoteData<PaginatedList<BrowseDefinition>>> {
|
||||||
|
return observableOf(createSuccessfulRemoteDataObject(buildPaginatedList(new PageInfo(), mockData)));
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
export const BrowseDefinitionDataServiceStub: any = {
|
||||||
|
|
||||||
export const browseLinkDataServiceStub: any = {
|
|
||||||
/**
|
/**
|
||||||
* Get all BrowseDefinitions
|
* Get all BrowseDefinitions
|
||||||
*/
|
*/
|
||||||
getBrowseLinks(): Observable<RemoteData<PaginatedList<BrowseDefinition>>> {
|
findAll(): Observable<RemoteData<PaginatedList<BrowseDefinition>>> {
|
||||||
return observableOf(createSuccessfulRemoteDataObject(buildPaginatedList(new PageInfo(), mockData)));
|
return observableOf(createSuccessfulRemoteDataObject(buildPaginatedList(new PageInfo(), mockData)));
|
||||||
},
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get all BrowseDefinitions with any link configuration
|
||||||
|
*/
|
||||||
|
findAllLinked(): Observable<RemoteData<PaginatedList<BrowseDefinition>>> {
|
||||||
|
return observableOf(createSuccessfulRemoteDataObject(buildPaginatedList(new PageInfo(), mockData)));
|
||||||
|
},
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the browse URL by providing a list of metadata keys
|
* Get the browse URL by providing a list of metadata keys
|
||||||
* @param metadatumKey
|
* @param metadatumKey
|
||||||
* @param linkPath
|
* @param linkPath
|
||||||
*/
|
*/
|
||||||
getBrowseLinkFor(metadataKeys: string[]): Observable<BrowseDefinition> {
|
findByFields(metadataKeys: string[]): Observable<BrowseDefinition> {
|
||||||
let searchKeyArray: string[] = [];
|
let searchKeyArray: string[] = [];
|
||||||
metadataKeys.forEach((metadataKey) => {
|
metadataKeys.forEach((metadataKey) => {
|
||||||
searchKeyArray = searchKeyArray.concat(BrowseService.toSearchKeyArray(metadataKey));
|
searchKeyArray = searchKeyArray.concat(BrowseService.toSearchKeyArray(metadataKey));
|
||||||
});
|
});
|
||||||
return this.getBrowseLinks().pipe(
|
return this.findAllLinked().pipe(
|
||||||
getRemoteDataPayload(),
|
getRemoteDataPayload(),
|
||||||
getPaginatedListPayload(),
|
getPaginatedListPayload(),
|
||||||
map((browseDefinitions: BrowseDefinition[]) => browseDefinitions
|
map((browseDefinitions: BrowseDefinition[]) => browseDefinitions
|
Reference in New Issue
Block a user