Skip to content

Commit df58c8a

Browse files
KoenPKoen Pauwels
authored andcommitted
Reduce browse definition requests on simple item page (#3701)
* 121561 Reduce the number of browse definition requests on Item pages by reusing the navbar request for all browse indexes * Fix test issues. --------- Co-authored-by: Koen Pauwels <[email protected]>
1 parent 9fce33f commit df58c8a

11 files changed

+156
-19
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
import { CacheableObject } from '../cache/cacheable-object.model';
36

47
/**
@@ -9,6 +12,9 @@ export abstract class BrowseDefinition extends CacheableObject {
912
@autoserialize
1013
id: string;
1114

15+
@autoserializeAs('metadata')
16+
metadataKeys: string[];
17+
1218
/**
1319
* Get the render type of the BrowseDefinition model
1420
*/

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

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { autoserialize, autoserializeAs, deserialize, inheritSerialization } from 'cerialize';
1+
import { autoserialize, deserialize, inheritSerialization } from 'cerialize';
22
import { typedObject } from '../cache/builders/build-decorators';
33
import { excludeFromEquals } from '../utilities/equals.decorators';
44
import { HIERARCHICAL_BROWSE_DEFINITION } from './hierarchical-browse-definition.resource-type';
@@ -26,9 +26,6 @@ export class HierarchicalBrowseDefinition extends BrowseDefinition {
2626
@autoserialize
2727
vocabulary: string;
2828

29-
@autoserializeAs('metadata')
30-
metadataKeys: string[];
31-
3229
get self(): string {
3330
return this._links.self.href;
3431
}

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

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

19-
@autoserializeAs('metadata')
20-
metadataKeys: string[];
21-
2219
@autoserialize
2320
dataType: BrowseByDataType;
2421
}

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

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@ import { TranslateLoaderMock } from '../../../../../shared/testing/translate-loa
66
import { SharedModule } from '../../../../../shared/shared.module';
77
import { APP_CONFIG } from '../../../../../../config/app-config.interface';
88
import { environment } from '../../../../../../environments/environment';
9+
import { BrowseService } from '../../../../../core/browse/browse.service';
10+
import { BrowseServiceStub } from '../../../../../shared/testing/browse-service.stub';
911
import { By } from '@angular/platform-browser';
1012
import { BrowseDefinitionDataService } from '../../../../../core/browse/browse-definition-data.service';
1113
import { BrowseDefinitionDataServiceStub } from '../../../../../shared/testing/browse-definition-data-service.stub';
@@ -27,7 +29,8 @@ describe('ItemPageAbstractFieldComponent', () => {
2729
],
2830
providers: [
2931
{ provide: APP_CONFIG, useValue: environment },
30-
{ provide: BrowseDefinitionDataService, useValue: BrowseDefinitionDataServiceStub }
32+
{ provide: BrowseDefinitionDataService, useValue: BrowseDefinitionDataServiceStub },
33+
{ provide: BrowseService, useValue: BrowseServiceStub },
3134
],
3235
declarations: [ItemPageAbstractFieldComponent],
3336
schemas: [NO_ERRORS_SCHEMA]

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

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ import { mockItemWithMetadataFieldsAndValue } from '../item-page-field.component
77
import { ItemPageAuthorFieldComponent } from './item-page-author-field.component';
88
import { APP_CONFIG } from '../../../../../../config/app-config.interface';
99
import { environment } from '../../../../../../environments/environment';
10+
import { BrowseService } from '../../../../../core/browse/browse.service';
11+
import { BrowseServiceStub } from '../../../../../shared/testing/browse-service.stub';
1012
import { BrowseDefinitionDataService } from '../../../../../core/browse/browse-definition-data.service';
1113
import { BrowseDefinitionDataServiceStub } from '../../../../../shared/testing/browse-definition-data-service.stub';
1214

@@ -27,7 +29,8 @@ describe('ItemPageAuthorFieldComponent', () => {
2729
})],
2830
providers: [
2931
{ provide: APP_CONFIG, useValue: environment },
30-
{ provide: BrowseDefinitionDataService, useValue: BrowseDefinitionDataServiceStub }
32+
{ provide: BrowseDefinitionDataService, useValue: BrowseDefinitionDataServiceStub },
33+
{ provide: BrowseService, useValue: BrowseServiceStub },
3134
],
3235
declarations: [ItemPageAuthorFieldComponent, MetadataValuesComponent],
3336
schemas: [NO_ERRORS_SCHEMA]

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

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ import { mockItemWithMetadataFieldsAndValue } from '../item-page-field.component
77
import { ItemPageDateFieldComponent } from './item-page-date-field.component';
88
import { APP_CONFIG } from '../../../../../../config/app-config.interface';
99
import { environment } from '../../../../../../environments/environment';
10+
import { BrowseService } from '../../../../../core/browse/browse.service';
11+
import { BrowseServiceStub } from '../../../../../shared/testing/browse-service.stub';
1012
import { BrowseDefinitionDataService } from '../../../../../core/browse/browse-definition-data.service';
1113
import { BrowseDefinitionDataServiceStub } from '../../../../../shared/testing/browse-definition-data-service.stub';
1214

@@ -27,7 +29,8 @@ describe('ItemPageDateFieldComponent', () => {
2729
})],
2830
providers: [
2931
{ provide: APP_CONFIG, useValue: environment },
30-
{ provide: BrowseDefinitionDataService, useValue: BrowseDefinitionDataServiceStub }
32+
{ provide: BrowseDefinitionDataService, useValue: BrowseDefinitionDataServiceStub },
33+
{ provide: BrowseService, useValue: BrowseServiceStub },
3134
],
3235
declarations: [ItemPageDateFieldComponent, MetadataValuesComponent],
3336
schemas: [NO_ERRORS_SCHEMA]

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

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ import { mockItemWithMetadataFieldsAndValue } from '../item-page-field.component
77
import { GenericItemPageFieldComponent } from './generic-item-page-field.component';
88
import { APP_CONFIG } from '../../../../../../config/app-config.interface';
99
import { environment } from '../../../../../../environments/environment';
10+
import { BrowseService } from '../../../../../core/browse/browse.service';
11+
import { BrowseServiceStub } from '../../../../../shared/testing/browse-service.stub';
1012
import { BrowseDefinitionDataService } from '../../../../../core/browse/browse-definition-data.service';
1113
import { BrowseDefinitionDataServiceStub } from '../../../../../shared/testing/browse-definition-data-service.stub';
1214

@@ -29,7 +31,8 @@ describe('GenericItemPageFieldComponent', () => {
2931
})],
3032
providers: [
3133
{ provide: APP_CONFIG, useValue: environment },
32-
{ provide: BrowseDefinitionDataService, useValue: BrowseDefinitionDataServiceStub }
34+
{ provide: BrowseDefinitionDataService, useValue: BrowseDefinitionDataServiceStub },
35+
{ provide: BrowseService, useValue: BrowseServiceStub },
3336
],
3437
declarations: [GenericItemPageFieldComponent, MetadataValuesComponent],
3538
schemas: [NO_ERRORS_SCHEMA]

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

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@ import { MarkdownPipe } from '../../../../shared/utils/markdown.pipe';
1313
import { SharedModule } from '../../../../shared/shared.module';
1414
import { APP_CONFIG } from '../../../../../config/app-config.interface';
1515
import { By } from '@angular/platform-browser';
16+
import { BrowseService } from '../../../../core/browse/browse.service';
17+
import { BrowseServiceStub } from '../../../../shared/testing/browse-service.stub';
1618
import { BrowseDefinitionDataService } from '../../../../core/browse/browse-definition-data.service';
1719
import { BrowseDefinitionDataServiceStub } from '../../../../shared/testing/browse-definition-data-service.stub';
1820
import { RouterTestingModule } from '@angular/router/testing';
@@ -51,7 +53,8 @@ describe('ItemPageFieldComponent', () => {
5153
],
5254
providers: [
5355
{ provide: APP_CONFIG, useValue: appConfig },
54-
{ provide: BrowseDefinitionDataService, useValue: BrowseDefinitionDataServiceStub }
56+
{ provide: BrowseDefinitionDataService, useValue: BrowseDefinitionDataServiceStub },
57+
{ provide: BrowseService, useValue: BrowseServiceStub },
5558
],
5659
declarations: [ItemPageFieldComponent, MetadataValuesComponent],
5760
schemas: [NO_ERRORS_SCHEMA]

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

Lines changed: 33 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,20 @@
11
import { Component, Input } from '@angular/core';
22
import { Item } from '../../../../core/shared/item.model';
3-
import { map } from 'rxjs/operators';
3+
import intersectionWith from 'lodash/intersectionWith';
4+
import {
5+
filter,
6+
mergeAll,
7+
take,
8+
} from 'rxjs/operators';
49
import { Observable } from 'rxjs';
10+
import { BrowseService } from '../../../../core/browse/browse.service';
511
import { BrowseDefinition } from '../../../../core/shared/browse-definition.model';
612
import { BrowseDefinitionDataService } from '../../../../core/browse/browse-definition-data.service';
7-
import { getFirstCompletedRemoteData } from '../../../../core/shared/operators';
13+
import {
14+
getFirstCompletedRemoteData,
15+
getPaginatedListPayload,
16+
getRemoteDataPayload,
17+
} from '../../../../core/shared/operators';
818

919
/**
1020
* This component can be used to represent metadata on a simple item page.
@@ -17,7 +27,8 @@ import { getFirstCompletedRemoteData } from '../../../../core/shared/operators';
1727
})
1828
export class ItemPageFieldComponent {
1929

20-
constructor(protected browseDefinitionDataService: BrowseDefinitionDataService) {
30+
constructor(protected browseDefinitionDataService: BrowseDefinitionDataService,
31+
protected browseService: BrowseService) {
2132
}
2233

2334
/**
@@ -56,9 +67,26 @@ export class ItemPageFieldComponent {
5667
* link in dspace.cfg (webui.browse.link.<n>)
5768
*/
5869
get browseDefinition(): Observable<BrowseDefinition> {
59-
return this.browseDefinitionDataService.findByFields(this.fields).pipe(
70+
return this.browseService.getBrowseDefinitions().pipe(
6071
getFirstCompletedRemoteData(),
61-
map((def) => def.payload)
72+
getRemoteDataPayload(),
73+
getPaginatedListPayload(),
74+
mergeAll(),
75+
filter((def: BrowseDefinition) =>
76+
intersectionWith(def.metadataKeys, this.fields, ItemPageFieldComponent.fieldMatch).length > 0,
77+
),
78+
take(1),
6279
);
6380
}
81+
82+
/**
83+
* Returns true iff the spec and field match.
84+
* @param spec Specification of a metadata field name: either a metadata field, or a prefix ending in ".*".
85+
* @param field A metadata field name.
86+
* @private
87+
*/
88+
private static fieldMatch(spec: string, field: string): boolean {
89+
return field === spec
90+
|| (spec.endsWith('.*') && field.substring(0, spec.length - 1) === spec.substring(0, spec.length - 1));
91+
}
6492
}

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

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ import { ItemPageUriFieldComponent } from './item-page-uri-field.component';
77
import { MetadataUriValuesComponent } from '../../../../field-components/metadata-uri-values/metadata-uri-values.component';
88
import { environment } from '../../../../../../environments/environment';
99
import { APP_CONFIG } from '../../../../../../config/app-config.interface';
10+
import { BrowseService } from '../../../../../core/browse/browse.service';
11+
import { BrowseServiceStub } from '../../../../../shared/testing/browse-service.stub';
1012
import { BrowseDefinitionDataService } from '../../../../../core/browse/browse-definition-data.service';
1113
import { BrowseDefinitionDataServiceStub } from '../../../../../shared/testing/browse-definition-data-service.stub';
1214

@@ -28,7 +30,8 @@ describe('ItemPageUriFieldComponent', () => {
2830
})],
2931
providers: [
3032
{ provide: APP_CONFIG, useValue: environment },
31-
{ provide: BrowseDefinitionDataService, useValue: BrowseDefinitionDataServiceStub }
33+
{ provide: BrowseDefinitionDataService, useValue: BrowseDefinitionDataServiceStub },
34+
{ provide: BrowseService, useValue: BrowseServiceStub },
3235
],
3336
declarations: [ItemPageUriFieldComponent, MetadataUriValuesComponent],
3437
schemas: [NO_ERRORS_SCHEMA]

0 commit comments

Comments
 (0)