Skip to content

Commit b022a93

Browse files
committed
Merge remote-tracking branch 'origin/main' into CST-6685
2 parents 34beb7d + 001d6dc commit b022a93

65 files changed

Lines changed: 3507 additions & 510 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

config/config.example.yml

Lines changed: 22 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -162,6 +162,9 @@ languages:
162162
- code: bn
163163
label: বাংলা
164164
active: true
165+
- code: el
166+
label: Ελληνικά
167+
active: true
165168

166169
# Browse-By Pages
167170
browseBy:
@@ -171,6 +174,25 @@ browseBy:
171174
fiveYearLimit: 30
172175
# The absolute lowest year to display in the dropdown (only used when no lowest date can be found for all items)
173176
defaultLowerLimit: 1900
177+
# The number of entries in a paginated browse results list.
178+
# Rounded to the nearest size in the list of selectable sizes on the
179+
# settings menu.
180+
pageSize: 20
181+
182+
communityList:
183+
# No. of communities to list per expansion (show more)
184+
pageSize: 20
185+
186+
homePage:
187+
recentSubmissions:
188+
# The number of item showing in recent submission components
189+
pageSize: 5
190+
# Sort record of recent submission
191+
sortField: 'dc.date.accessioned'
192+
topLevelCommunityList:
193+
# No. of communities to list per page on the home page
194+
# This will always round to the nearest number from the list of page sizes. e.g. if you set it to 7 it'll use 10
195+
pageSize: 5
174196

175197
# Item Config
176198
item:
@@ -261,10 +283,3 @@ mediaViewer:
261283
info:
262284
enableEndUserAgreement: true
263285
enablePrivacyStatement: true
264-
# Home Page
265-
homePage:
266-
recentSubmissions:
267-
# The number of item showing in recent submission components
268-
pageSize: 5
269-
# Sort record of recent submission
270-
sortField: 'dc.date.accessioned'

src/app/access-control/group-registry/group-form/members-list/members-list.component.ts

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import {
1010
combineLatest as observableCombineLatest,
1111
ObservedValueOf,
1212
} from 'rxjs';
13-
import { map, mergeMap, switchMap, take } from 'rxjs/operators';
13+
import { defaultIfEmpty, map, mergeMap, switchMap, take } from 'rxjs/operators';
1414
import {buildPaginatedList, PaginatedList} from '../../../../core/data/paginated-list.model';
1515
import { RemoteData } from '../../../../core/data/remote-data';
1616
import { EPersonDataService } from '../../../../core/eperson/eperson-data.service';
@@ -144,7 +144,7 @@ export class MembersListComponent implements OnInit, OnDestroy {
144144
}
145145
}),
146146
switchMap((epersonListRD: RemoteData<PaginatedList<EPerson>>) => {
147-
const dtos$ = observableCombineLatest(...epersonListRD.payload.page.map((member: EPerson) => {
147+
const dtos$ = observableCombineLatest([...epersonListRD.payload.page.map((member: EPerson) => {
148148
const dto$: Observable<EpersonDtoModel> = observableCombineLatest(
149149
this.isMemberOfGroup(member), (isMember: ObservedValueOf<Observable<boolean>>) => {
150150
const epersonDtoModel: EpersonDtoModel = new EpersonDtoModel();
@@ -153,8 +153,8 @@ export class MembersListComponent implements OnInit, OnDestroy {
153153
return epersonDtoModel;
154154
});
155155
return dto$;
156-
}));
157-
return dtos$.pipe(map((dtos: EpersonDtoModel[]) => {
156+
})]);
157+
return dtos$.pipe(defaultIfEmpty([]), map((dtos: EpersonDtoModel[]) => {
158158
return buildPaginatedList(epersonListRD.payload.pageInfo, dtos);
159159
}));
160160
}))
@@ -174,7 +174,7 @@ export class MembersListComponent implements OnInit, OnDestroy {
174174
return this.ePersonDataService.findListByHref(group._links.epersons.href, {
175175
currentPage: 1,
176176
elementsPerPage: 9999
177-
}, false)
177+
})
178178
.pipe(
179179
getFirstSucceededRemoteData(),
180180
getRemoteDataPayload(),
@@ -274,7 +274,7 @@ export class MembersListComponent implements OnInit, OnDestroy {
274274
}
275275
}),
276276
switchMap((epersonListRD: RemoteData<PaginatedList<EPerson>>) => {
277-
const dtos$ = observableCombineLatest(...epersonListRD.payload.page.map((member: EPerson) => {
277+
const dtos$ = observableCombineLatest([...epersonListRD.payload.page.map((member: EPerson) => {
278278
const dto$: Observable<EpersonDtoModel> = observableCombineLatest(
279279
this.isMemberOfGroup(member), (isMember: ObservedValueOf<Observable<boolean>>) => {
280280
const epersonDtoModel: EpersonDtoModel = new EpersonDtoModel();
@@ -283,8 +283,8 @@ export class MembersListComponent implements OnInit, OnDestroy {
283283
return epersonDtoModel;
284284
});
285285
return dto$;
286-
}));
287-
return dtos$.pipe(map((dtos: EpersonDtoModel[]) => {
286+
})]);
287+
return dtos$.pipe(defaultIfEmpty([]), map((dtos: EpersonDtoModel[]) => {
288288
return buildPaginatedList(epersonListRD.payload.pageInfo, dtos);
289289
}));
290290
}))

src/app/browse-by/browse-by-date-page/browse-by-date-page.component.spec.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@ import { SortDirection, SortOptions } from '../../core/cache/models/sort-options
2323
import { PaginationService } from '../../core/pagination/pagination.service';
2424
import { PaginationServiceStub } from '../../shared/testing/pagination-service.stub';
2525
import { FindListOptions } from '../../core/data/find-list-options.model';
26+
import { APP_CONFIG } from 'src/config/app-config.interface';
27+
import { environment } from 'src/environments/environment';
2628

2729
describe('BrowseByDatePageComponent', () => {
2830
let comp: BrowseByDatePageComponent;
@@ -83,7 +85,8 @@ describe('BrowseByDatePageComponent', () => {
8385
{ provide: DSpaceObjectDataService, useValue: mockDsoService },
8486
{ provide: Router, useValue: new RouterMock() },
8587
{ provide: PaginationService, useValue: paginationService },
86-
{ provide: ChangeDetectorRef, useValue: mockCdRef }
88+
{ provide: ChangeDetectorRef, useValue: mockCdRef },
89+
{ provide: APP_CONFIG, useValue: environment }
8790
],
8891
schemas: [NO_ERRORS_SCHEMA]
8992
}).compileComponents();

src/app/browse-by/browse-by-date-page/browse-by-date-page.component.ts

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { ChangeDetectorRef, Component } from '@angular/core';
1+
import { ChangeDetectorRef, Component, Inject } from '@angular/core';
22
import {
33
BrowseByMetadataPageComponent,
44
browseParamsToOptions
@@ -19,6 +19,7 @@ import { map } from 'rxjs/operators';
1919
import { PaginationComponentOptions } from '../../shared/pagination/pagination-component-options.model';
2020
import { SortDirection, SortOptions } from '../../core/cache/models/sort-options.model';
2121
import { isValidDate } from '../../shared/date.util';
22+
import { AppConfig, APP_CONFIG } from '../../../config/app-config.interface';
2223

2324
@Component({
2425
selector: 'ds-browse-by-date-page',
@@ -43,8 +44,9 @@ export class BrowseByDatePageComponent extends BrowseByMetadataPageComponent {
4344
protected dsoService: DSpaceObjectDataService,
4445
protected router: Router,
4546
protected paginationService: PaginationService,
46-
protected cdRef: ChangeDetectorRef) {
47-
super(route, browseService, dsoService, paginationService, router);
47+
protected cdRef: ChangeDetectorRef,
48+
@Inject(APP_CONFIG) protected appConfig: AppConfig) {
49+
super(route, browseService, dsoService, paginationService, router, appConfig);
4850
}
4951

5052
ngOnInit(): void {

src/app/browse-by/browse-by-metadata-page/browse-by-metadata-page.component.spec.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@ import { createSuccessfulRemoteDataObject$ } from '../../shared/remote-data.util
2525
import { PaginationService } from '../../core/pagination/pagination.service';
2626
import { PaginationComponentOptions } from '../../shared/pagination/pagination-component-options.model';
2727
import { PaginationServiceStub } from '../../shared/testing/pagination-service.stub';
28+
import { APP_CONFIG } from '../../../config/app-config.interface';
29+
import { environment } from '../../../environments/environment';
2830

2931
describe('BrowseByMetadataPageComponent', () => {
3032
let comp: BrowseByMetadataPageComponent;
@@ -97,7 +99,8 @@ describe('BrowseByMetadataPageComponent', () => {
9799
{ provide: BrowseService, useValue: mockBrowseService },
98100
{ provide: DSpaceObjectDataService, useValue: mockDsoService },
99101
{ provide: PaginationService, useValue: paginationService },
100-
{ provide: Router, useValue: new RouterMock() }
102+
{ provide: Router, useValue: new RouterMock() },
103+
{ provide: APP_CONFIG, useValue: environment }
101104
],
102105
schemas: [NO_ERRORS_SCHEMA]
103106
}).compileComponents();

src/app/browse-by/browse-by-metadata-page/browse-by-metadata-page.component.ts

Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { combineLatest as observableCombineLatest, Observable, Subscription } from 'rxjs';
2-
import { Component, OnInit } from '@angular/core';
2+
import { Component, Inject, OnInit } from '@angular/core';
3+
import { AppConfig, APP_CONFIG } from '../../../config/app-config.interface';
34
import { RemoteData } from '../../core/data/remote-data';
45
import { PaginatedList } from '../../core/data/paginated-list.model';
56
import { PaginationComponentOptions } from '../../shared/pagination/pagination-component-options.model';
@@ -26,9 +27,10 @@ export const BBM_PAGINATION_ID = 'bbm';
2627
templateUrl: './browse-by-metadata-page.component.html'
2728
})
2829
/**
29-
* Component for browsing (items) by metadata definition
30-
* A metadata definition (a.k.a. browse id) is a short term used to describe one or multiple metadata fields.
31-
* An example would be 'author' for 'dc.contributor.*'
30+
* Component for browsing (items) by metadata definition.
31+
* A metadata definition (a.k.a. browse id) is a short term used to describe one
32+
* or multiple metadata fields. An example would be 'author' for
33+
* 'dc.contributor.*'
3234
*/
3335
@rendersBrowseBy(BrowseByDataType.Metadata)
3436
export class BrowseByMetadataPageComponent implements OnInit {
@@ -51,11 +53,7 @@ export class BrowseByMetadataPageComponent implements OnInit {
5153
/**
5254
* The pagination config used to display the values
5355
*/
54-
paginationConfig: PaginationComponentOptions = Object.assign(new PaginationComponentOptions(), {
55-
id: BBM_PAGINATION_ID,
56-
currentPage: 1,
57-
pageSize: 20
58-
});
56+
paginationConfig: PaginationComponentOptions;
5957

6058
/**
6159
* The pagination observable
@@ -115,8 +113,14 @@ export class BrowseByMetadataPageComponent implements OnInit {
115113
protected browseService: BrowseService,
116114
protected dsoService: DSpaceObjectDataService,
117115
protected paginationService: PaginationService,
118-
protected router: Router) {
119-
}
116+
protected router: Router,
117+
@Inject(APP_CONFIG) protected appConfig: AppConfig) {
118+
this.paginationConfig = Object.assign(new PaginationComponentOptions(), {
119+
id: BBM_PAGINATION_ID,
120+
currentPage: 1,
121+
pageSize: this.appConfig.browseBy.pageSize,
122+
});
123+
}
120124

121125
ngOnInit(): void {
122126
const sortConfig = new SortOptions('default', SortDirection.ASC);

src/app/browse-by/browse-by-title-page/browse-by-title-page.component.spec.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@ import { SortDirection, SortOptions } from '../../core/cache/models/sort-options
2323
import { PaginationService } from '../../core/pagination/pagination.service';
2424
import { PaginationServiceStub } from '../../shared/testing/pagination-service.stub';
2525
import { FindListOptions } from '../../core/data/find-list-options.model';
26+
import { APP_CONFIG } from 'src/config/app-config.interface';
27+
import { environment } from 'src/environments/environment';
2628

2729
describe('BrowseByTitlePageComponent', () => {
2830
let comp: BrowseByTitlePageComponent;
@@ -77,7 +79,8 @@ describe('BrowseByTitlePageComponent', () => {
7779
{ provide: BrowseService, useValue: mockBrowseService },
7880
{ provide: DSpaceObjectDataService, useValue: mockDsoService },
7981
{ provide: PaginationService, useValue: paginationService },
80-
{ provide: Router, useValue: new RouterMock() }
82+
{ provide: Router, useValue: new RouterMock() },
83+
{ provide: APP_CONFIG, useValue: environment }
8184
],
8285
schemas: [NO_ERRORS_SCHEMA]
8386
}).compileComponents();

src/app/browse-by/browse-by-title-page/browse-by-title-page.component.ts

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { combineLatest as observableCombineLatest } from 'rxjs';
2-
import { Component } from '@angular/core';
2+
import { Component, Inject } from '@angular/core';
33
import { ActivatedRoute, Params, Router } from '@angular/router';
44
import { hasValue } from '../../shared/empty.util';
55
import {
@@ -14,6 +14,7 @@ import { BrowseByDataType, rendersBrowseBy } from '../browse-by-switcher/browse-
1414
import { PaginationService } from '../../core/pagination/pagination.service';
1515
import { map } from 'rxjs/operators';
1616
import { PaginationComponentOptions } from '../../shared/pagination/pagination-component-options.model';
17+
import { AppConfig, APP_CONFIG } from '../../../config/app-config.interface';
1718

1819
@Component({
1920
selector: 'ds-browse-by-title-page',
@@ -30,8 +31,9 @@ export class BrowseByTitlePageComponent extends BrowseByMetadataPageComponent {
3031
protected browseService: BrowseService,
3132
protected dsoService: DSpaceObjectDataService,
3233
protected paginationService: PaginationService,
33-
protected router: Router) {
34-
super(route, browseService, dsoService, paginationService, router);
34+
protected router: Router,
35+
@Inject(APP_CONFIG) protected appConfig: AppConfig) {
36+
super(route, browseService, dsoService, paginationService, router, appConfig);
3537
}
3638

3739
ngOnInit(): void {

src/app/community-list-page/community-list-service.spec.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@ import { Collection } from '../core/shared/collection.model';
1515
import { PageInfo } from '../core/shared/page-info.model';
1616
import { FlatNode } from './flat-node.model';
1717
import { FindListOptions } from '../core/data/find-list-options.model';
18+
import { APP_CONFIG } from 'src/config/app-config.interface';
19+
import { environment } from 'src/environments/environment.test';
1820

1921
describe('CommunityListService', () => {
2022
let store: StoreMock<AppState>;
@@ -191,13 +193,14 @@ describe('CommunityListService', () => {
191193
};
192194
TestBed.configureTestingModule({
193195
providers: [CommunityListService,
196+
{ provide: APP_CONFIG, useValue: environment },
194197
{ provide: CollectionDataService, useValue: collectionDataServiceStub },
195198
{ provide: CommunityDataService, useValue: communityDataServiceStub },
196199
{ provide: Store, useValue: StoreMock },
197200
],
198201
});
199202
store = TestBed.inject(Store as any);
200-
service = new CommunityListService(communityDataServiceStub, collectionDataServiceStub, store);
203+
service = new CommunityListService(environment, communityDataServiceStub, collectionDataServiceStub, store);
201204
});
202205

203206
it('should create', inject([CommunityListService], (serviceIn: CommunityListService) => {

src/app/community-list-page/community-list-service.ts

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/* eslint-disable max-classes-per-file */
2-
import { Injectable } from '@angular/core';
2+
import { Inject, Injectable } from '@angular/core';
33
import { createSelector, Store } from '@ngrx/store';
44

55
import { combineLatest as observableCombineLatest, Observable, of as observableOf } from 'rxjs';
@@ -23,6 +23,7 @@ import { followLink } from '../shared/utils/follow-link-config.model';
2323
import { FlatNode } from './flat-node.model';
2424
import { ShowMoreFlatNode } from './show-more-flat-node.model';
2525
import { FindListOptions } from '../core/data/find-list-options.model';
26+
import { AppConfig, APP_CONFIG } from 'src/config/app-config.interface';
2627

2728
// Helper method to combine an flatten an array of observables of flatNode arrays
2829
export const combineAndFlatten = (obsList: Observable<FlatNode[]>[]): Observable<FlatNode[]> =>
@@ -80,17 +81,22 @@ const communityListStateSelector = (state: AppState) => state.communityList;
8081
const expandedNodesSelector = createSelector(communityListStateSelector, (communityList: CommunityListState) => communityList.expandedNodes);
8182
const loadingNodeSelector = createSelector(communityListStateSelector, (communityList: CommunityListState) => communityList.loadingNode);
8283

83-
export const MAX_COMCOLS_PER_PAGE = 20;
84-
8584
/**
8685
* Service class for the community list, responsible for the creating of the flat list used by communityList dataSource
8786
* and connection to the store to retrieve and save the state of the community list
8887
*/
8988
@Injectable()
9089
export class CommunityListService {
9190

92-
constructor(private communityDataService: CommunityDataService, private collectionDataService: CollectionDataService,
93-
private store: Store<any>) {
91+
private pageSize: number;
92+
93+
constructor(
94+
@Inject(APP_CONFIG) protected appConfig: AppConfig,
95+
private communityDataService: CommunityDataService,
96+
private collectionDataService: CollectionDataService,
97+
private store: Store<any>
98+
) {
99+
this.pageSize = appConfig.communityList.pageSize;
94100
}
95101

96102
private configOnePage: FindListOptions = Object.assign(new FindListOptions(), {
@@ -145,7 +151,7 @@ export class CommunityListService {
145151
private getTopCommunities(options: FindListOptions): Observable<PaginatedList<Community>> {
146152
return this.communityDataService.findTop({
147153
currentPage: options.currentPage,
148-
elementsPerPage: MAX_COMCOLS_PER_PAGE,
154+
elementsPerPage: this.pageSize,
149155
sort: {
150156
field: options.sort.field,
151157
direction: options.sort.direction
@@ -216,7 +222,7 @@ export class CommunityListService {
216222
let subcoms = [];
217223
for (let i = 1; i <= currentCommunityPage; i++) {
218224
const nextSetOfSubcommunitiesPage = this.communityDataService.findByParent(community.uuid, {
219-
elementsPerPage: MAX_COMCOLS_PER_PAGE,
225+
elementsPerPage: this.pageSize,
220226
currentPage: i
221227
},
222228
followLink('subcommunities', { findListOptions: this.configOnePage }),
@@ -241,7 +247,7 @@ export class CommunityListService {
241247
let collections = [];
242248
for (let i = 1; i <= currentCollectionPage; i++) {
243249
const nextSetOfCollectionsPage = this.collectionDataService.findByParent(community.uuid, {
244-
elementsPerPage: MAX_COMCOLS_PER_PAGE,
250+
elementsPerPage: this.pageSize,
245251
currentPage: i
246252
})
247253
.pipe(

0 commit comments

Comments
 (0)