Skip to content

Commit bfe927e

Browse files
authored
Merge pull request #3811 from tdonohue/port_3701_to_8x
[Port dspace-8_x] Reduce browse definition requests on simple item page (#3701)
2 parents e8f0c20 + 0120896 commit bfe927e

12 files changed

+152
-15
lines changed

src/app/core/shared/browse-definition.model.ts

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
1-
import { autoserialize } from 'cerialize';
1+
import {
2+
autoserialize,
3+
autoserializeAs,
4+
} from 'cerialize';
25

36
import { BrowseByDataType } from '../../browse-by/browse-by-switcher/browse-by-data-type';
47
import { CacheableObject } from '../cache/cacheable-object.model';
@@ -11,6 +14,9 @@ export abstract class BrowseDefinition extends CacheableObject {
1114
@autoserialize
1215
id: string;
1316

17+
@autoserializeAs('metadata')
18+
metadataKeys: string[];
19+
1420
/**
1521
* Get the render type of the BrowseDefinition model
1622
*/

src/app/core/shared/hierarchical-browse-definition.model.ts

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
import {
22
autoserialize,
3-
autoserializeAs,
43
deserialize,
54
inheritSerialization,
65
} from 'cerialize';
@@ -33,9 +32,6 @@ export class HierarchicalBrowseDefinition extends BrowseDefinition {
3332
@autoserialize
3433
vocabulary: string;
3534

36-
@autoserializeAs('metadata')
37-
metadataKeys: string[];
38-
3935
get self(): string {
4036
return this._links.self.href;
4137
}

src/app/core/shared/non-hierarchical-browse-definition.ts

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,6 @@ export abstract class NonHierarchicalBrowseDefinition extends BrowseDefinition {
2121
@autoserializeAs('order')
2222
defaultSortOrder: string;
2323

24-
@autoserializeAs('metadata')
25-
metadataKeys: string[];
26-
2724
@autoserialize
2825
dataType: BrowseByDataType;
2926
}

src/app/item-page/simple/field-components/specific-field/abstract/item-page-abstract-field.component.spec.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,10 @@ import {
1515

1616
import { APP_CONFIG } from '../../../../../../config/app-config.interface';
1717
import { environment } from '../../../../../../environments/environment';
18+
import { BrowseService } from '../../../../../core/browse/browse.service';
1819
import { BrowseDefinitionDataService } from '../../../../../core/browse/browse-definition-data.service';
1920
import { BrowseDefinitionDataServiceStub } from '../../../../../shared/testing/browse-definition-data-service.stub';
21+
import { BrowseServiceStub } from '../../../../../shared/testing/browse-service.stub';
2022
import { TranslateLoaderMock } from '../../../../../shared/testing/translate-loader.mock';
2123
import { ItemPageAbstractFieldComponent } from './item-page-abstract-field.component';
2224

@@ -38,6 +40,7 @@ describe('ItemPageAbstractFieldComponent', () => {
3840
providers: [
3941
{ provide: APP_CONFIG, useValue: environment },
4042
{ provide: BrowseDefinitionDataService, useValue: BrowseDefinitionDataServiceStub },
43+
{ provide: BrowseService, useValue: BrowseServiceStub },
4144
],
4245
schemas: [NO_ERRORS_SCHEMA],
4346
}).overrideComponent(ItemPageAbstractFieldComponent, {

src/app/item-page/simple/field-components/specific-field/author/item-page-author-field.component.spec.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,11 @@ import {
1515

1616
import { APP_CONFIG } from '../../../../../../config/app-config.interface';
1717
import { environment } from '../../../../../../environments/environment';
18+
import { BrowseService } from '../../../../../core/browse/browse.service';
1819
import { BrowseDefinitionDataService } from '../../../../../core/browse/browse-definition-data.service';
1920
import { ActivatedRouteStub } from '../../../../../shared/testing/active-router.stub';
2021
import { BrowseDefinitionDataServiceStub } from '../../../../../shared/testing/browse-definition-data-service.stub';
22+
import { BrowseServiceStub } from '../../../../../shared/testing/browse-service.stub';
2123
import { TranslateLoaderMock } from '../../../../../shared/testing/translate-loader.mock';
2224
import { MetadataValuesComponent } from '../../../../field-components/metadata-values/metadata-values.component';
2325
import { mockItemWithMetadataFieldsAndValue } from '../item-page-field.component.spec';
@@ -41,6 +43,7 @@ describe('ItemPageAuthorFieldComponent', () => {
4143
providers: [
4244
{ provide: APP_CONFIG, useValue: environment },
4345
{ provide: BrowseDefinitionDataService, useValue: BrowseDefinitionDataServiceStub },
46+
{ provide: BrowseService, useValue: BrowseServiceStub },
4447
{ provide: ActivatedRoute, useValue: new ActivatedRouteStub() },
4548
],
4649
schemas: [NO_ERRORS_SCHEMA],

src/app/item-page/simple/field-components/specific-field/date/item-page-date-field.component.spec.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,11 @@ import {
1515

1616
import { APP_CONFIG } from '../../../../../../config/app-config.interface';
1717
import { environment } from '../../../../../../environments/environment';
18+
import { BrowseService } from '../../../../../core/browse/browse.service';
1819
import { BrowseDefinitionDataService } from '../../../../../core/browse/browse-definition-data.service';
1920
import { ActivatedRouteStub } from '../../../../../shared/testing/active-router.stub';
2021
import { BrowseDefinitionDataServiceStub } from '../../../../../shared/testing/browse-definition-data-service.stub';
22+
import { BrowseServiceStub } from '../../../../../shared/testing/browse-service.stub';
2123
import { TranslateLoaderMock } from '../../../../../shared/testing/translate-loader.mock';
2224
import { MetadataValuesComponent } from '../../../../field-components/metadata-values/metadata-values.component';
2325
import { mockItemWithMetadataFieldsAndValue } from '../item-page-field.component.spec';
@@ -41,8 +43,8 @@ describe('ItemPageDateFieldComponent', () => {
4143
providers: [
4244
{ provide: APP_CONFIG, useValue: environment },
4345
{ provide: BrowseDefinitionDataService, useValue: BrowseDefinitionDataServiceStub },
46+
{ provide: BrowseService, useValue: BrowseServiceStub },
4447
{ provide: ActivatedRoute, useValue: new ActivatedRouteStub() },
45-
4648
],
4749
schemas: [NO_ERRORS_SCHEMA],
4850
}).overrideComponent(ItemPageDateFieldComponent, {

src/app/item-page/simple/field-components/specific-field/generic/generic-item-page-field.component.spec.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,11 @@ import {
1515

1616
import { APP_CONFIG } from '../../../../../../config/app-config.interface';
1717
import { environment } from '../../../../../../environments/environment';
18+
import { BrowseService } from '../../../../../core/browse/browse.service';
1819
import { BrowseDefinitionDataService } from '../../../../../core/browse/browse-definition-data.service';
1920
import { ActivatedRouteStub } from '../../../../../shared/testing/active-router.stub';
2021
import { BrowseDefinitionDataServiceStub } from '../../../../../shared/testing/browse-definition-data-service.stub';
22+
import { BrowseServiceStub } from '../../../../../shared/testing/browse-service.stub';
2123
import { TranslateLoaderMock } from '../../../../../shared/testing/translate-loader.mock';
2224
import { MetadataValuesComponent } from '../../../../field-components/metadata-values/metadata-values.component';
2325
import { mockItemWithMetadataFieldsAndValue } from '../item-page-field.component.spec';
@@ -43,6 +45,7 @@ describe('GenericItemPageFieldComponent', () => {
4345
providers: [
4446
{ provide: APP_CONFIG, useValue: environment },
4547
{ provide: BrowseDefinitionDataService, useValue: BrowseDefinitionDataServiceStub },
48+
{ provide: BrowseService, useValue: BrowseServiceStub },
4649
{ provide: ActivatedRoute, useValue: new ActivatedRouteStub() },
4750
],
4851
schemas: [NO_ERRORS_SCHEMA],

src/app/item-page/simple/field-components/specific-field/img/item-page-img-field.component.spec.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,10 @@ import {
1414

1515
import { APP_CONFIG } from '../../../../../../config/app-config.interface';
1616
import { environment } from '../../../../../../environments/environment';
17+
import { BrowseService } from '../../../../../core/browse/browse.service';
1718
import { BrowseDefinitionDataService } from '../../../../../core/browse/browse-definition-data.service';
1819
import { BrowseDefinitionDataServiceStub } from '../../../../../shared/testing/browse-definition-data-service.stub';
20+
import { BrowseServiceStub } from '../../../../../shared/testing/browse-service.stub';
1921
import { TranslateLoaderMock } from '../../../../../shared/testing/translate-loader.mock';
2022
import { MetadataValuesComponent } from '../../../../field-components/metadata-values/metadata-values.component';
2123
import { GenericItemPageFieldComponent } from '../generic/generic-item-page-field.component';
@@ -49,6 +51,7 @@ describe('ItemPageImgFieldComponent', () => {
4951
providers: [
5052
{ provide: APP_CONFIG, useValue: environment },
5153
{ provide: BrowseDefinitionDataService, useValue: BrowseDefinitionDataServiceStub },
54+
{ provide: BrowseService, useValue: BrowseServiceStub },
5255
],
5356
schemas: [NO_ERRORS_SCHEMA],
5457
})

src/app/item-page/simple/field-components/specific-field/item-page-field.component.spec.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import {
1616

1717
import { APP_CONFIG } from '../../../../../config/app-config.interface';
1818
import { environment } from '../../../../../environments/environment';
19+
import { BrowseService } from '../../../../core/browse/browse.service';
1920
import { BrowseDefinitionDataService } from '../../../../core/browse/browse-definition-data.service';
2021
import { Item } from '../../../../core/shared/item.model';
2122
import { MathService } from '../../../../core/shared/math.service';
@@ -26,6 +27,7 @@ import {
2627
import { TranslateLoaderMock } from '../../../../shared/mocks/translate-loader.mock';
2728
import { createSuccessfulRemoteDataObject$ } from '../../../../shared/remote-data.utils';
2829
import { BrowseDefinitionDataServiceStub } from '../../../../shared/testing/browse-definition-data-service.stub';
30+
import { BrowseServiceStub } from '../../../../shared/testing/browse-service.stub';
2931
import { createPaginatedList } from '../../../../shared/testing/utils.test';
3032
import { MarkdownDirective } from '../../../../shared/utils/markdown.directive';
3133
import { MetadataValuesComponent } from '../../../field-components/metadata-values/metadata-values.component';
@@ -66,6 +68,7 @@ describe('ItemPageFieldComponent', () => {
6668
providers: [
6769
{ provide: APP_CONFIG, useValue: appConfig },
6870
{ provide: BrowseDefinitionDataService, useValue: BrowseDefinitionDataServiceStub },
71+
{ provide: BrowseService, useValue: BrowseServiceStub },
6972
{ provide: MathService, useValue: {} },
7073
],
7174
schemas: [NO_ERRORS_SCHEMA],

src/app/item-page/simple/field-components/specific-field/item-page-field.component.ts

Lines changed: 33 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,17 +3,26 @@ import {
33
Component,
44
Input,
55
} from '@angular/core';
6+
import intersectionWith from 'lodash/intersectionWith';
67
import { Observable } from 'rxjs';
7-
import { map } from 'rxjs/operators';
8+
import {
9+
filter,
10+
mergeAll,
11+
take,
12+
} from 'rxjs/operators';
813

14+
import { BrowseService } from '../../../../core/browse/browse.service';
915
import { BrowseDefinitionDataService } from '../../../../core/browse/browse-definition-data.service';
1016
import { BrowseDefinition } from '../../../../core/shared/browse-definition.model';
1117
import { Item } from '../../../../core/shared/item.model';
12-
import { getFirstCompletedRemoteData } from '../../../../core/shared/operators';
18+
import {
19+
getFirstCompletedRemoteData,
20+
getPaginatedListPayload,
21+
getRemoteDataPayload,
22+
} from '../../../../core/shared/operators';
1323
import { MetadataValuesComponent } from '../../../field-components/metadata-values/metadata-values.component';
1424
import { ImageField } from './image-field';
1525

16-
1726
/**
1827
* This component can be used to represent metadata on a simple item page.
1928
* It expects one input parameter of type Item to which the metadata belongs.
@@ -30,7 +39,8 @@ import { ImageField } from './image-field';
3039
})
3140
export class ItemPageFieldComponent {
3241

33-
constructor(protected browseDefinitionDataService: BrowseDefinitionDataService) {
42+
constructor(protected browseDefinitionDataService: BrowseDefinitionDataService,
43+
protected browseService: BrowseService) {
3444
}
3545

3646
/**
@@ -74,9 +84,26 @@ export class ItemPageFieldComponent {
7484
* link in dspace.cfg (webui.browse.link.<n>)
7585
*/
7686
get browseDefinition(): Observable<BrowseDefinition> {
77-
return this.browseDefinitionDataService.findByFields(this.fields).pipe(
87+
return this.browseService.getBrowseDefinitions().pipe(
7888
getFirstCompletedRemoteData(),
79-
map((def) => def.payload),
89+
getRemoteDataPayload(),
90+
getPaginatedListPayload(),
91+
mergeAll(),
92+
filter((def: BrowseDefinition) =>
93+
intersectionWith(def.metadataKeys, this.fields, ItemPageFieldComponent.fieldMatch).length > 0,
94+
),
95+
take(1),
8096
);
8197
}
98+
99+
/**
100+
* Returns true iff the spec and field match.
101+
* @param spec Specification of a metadata field name: either a metadata field, or a prefix ending in ".*".
102+
* @param field A metadata field name.
103+
* @private
104+
*/
105+
private static fieldMatch(spec: string, field: string): boolean {
106+
return field === spec
107+
|| (spec.endsWith('.*') && field.substring(0, spec.length - 1) === spec.substring(0, spec.length - 1));
108+
}
82109
}

0 commit comments

Comments
 (0)