Skip to content

Commit dc54990

Browse files
Merge branch 'main-upstream' into issue-1833_entity-title-refactor-main
2 parents 87d9c28 + 9c93a8a commit dc54990

163 files changed

Lines changed: 2890 additions & 764 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 & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -174,6 +174,27 @@ browseBy:
174174
fiveYearLimit: 30
175175
# The absolute lowest year to display in the dropdown (only used when no lowest date can be found for all items)
176176
defaultLowerLimit: 1900
177+
# If true, thumbnail images for items will be added to BOTH search and browse result lists.
178+
showThumbnails: true
179+
# The number of entries in a paginated browse results list.
180+
# Rounded to the nearest size in the list of selectable sizes on the
181+
# settings menu.
182+
pageSize: 20
183+
184+
communityList:
185+
# No. of communities to list per expansion (show more)
186+
pageSize: 20
187+
188+
homePage:
189+
recentSubmissions:
190+
# The number of item showing in recent submission components
191+
pageSize: 5
192+
# Sort record of recent submission
193+
sortField: 'dc.date.accessioned'
194+
topLevelCommunityList:
195+
# No. of communities to list per page on the home page
196+
# 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
197+
pageSize: 5
177198

178199
# Item Config
179200
item:
@@ -249,7 +270,7 @@ themes:
249270

250271
# The default bundles that should always be displayed as suggestions when you upload a new bundle
251272
bundle:
252-
- standardBundles: [ ORIGINAL, THUMBNAIL, LICENSE ]
273+
standardBundles: [ ORIGINAL, THUMBNAIL, LICENSE ]
253274

254275
# Whether to enable media viewer for image and/or video Bitstreams (i.e. Bitstreams whose MIME type starts with 'image' or 'video').
255276
# For images, this enables a gallery viewer where you can zoom or page through images.
@@ -264,10 +285,3 @@ mediaViewer:
264285
info:
265286
enableEndUserAgreement: true
266287
enablePrivacyStatement: true
267-
# Home Page
268-
homePage:
269-
recentSubmissions:
270-
# The number of item showing in recent submission components
271-
pageSize: 5
272-
# Sort record of recent submission
273-
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/admin/admin-search-page/admin-search-results/admin-search-result-list-element/collection-search-result/collection-admin-search-result-list-element.component.spec.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@ import { RouterTestingModule } from '@angular/router/testing';
1313
import { getCollectionEditRoute } from '../../../../../collection-page/collection-page-routing-paths';
1414
import { DSONameService } from '../../../../../core/breadcrumbs/dso-name.service';
1515
import { DSONameServiceMock } from '../../../../../shared/mocks/dso-name.service.mock';
16+
import { APP_CONFIG } from '../../../../../../config/app-config.interface';
17+
import { environment } from '../../../../../../environments/environment';
1618

1719
describe('CollectionAdminSearchResultListElementComponent', () => {
1820
let component: CollectionAdminSearchResultListElementComponent;
@@ -36,7 +38,8 @@ describe('CollectionAdminSearchResultListElementComponent', () => {
3638
],
3739
declarations: [CollectionAdminSearchResultListElementComponent],
3840
providers: [{ provide: TruncatableService, useValue: {} },
39-
{ provide: DSONameService, useClass: DSONameServiceMock }],
41+
{ provide: DSONameService, useClass: DSONameServiceMock },
42+
{ provide: APP_CONFIG, useValue: environment }],
4043
schemas: [NO_ERRORS_SCHEMA]
4144
})
4245
.compileComponents();

src/app/admin/admin-search-page/admin-search-results/admin-search-result-list-element/community-search-result/community-admin-search-result-list-element.component.spec.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@ import { Community } from '../../../../../core/shared/community.model';
1313
import { getCommunityEditRoute } from '../../../../../community-page/community-page-routing-paths';
1414
import { DSONameService } from '../../../../../core/breadcrumbs/dso-name.service';
1515
import { DSONameServiceMock } from '../../../../../shared/mocks/dso-name.service.mock';
16+
import { APP_CONFIG } from '../../../../../../config/app-config.interface';
17+
import { environment } from '../../../../../../environments/environment';
1618

1719
describe('CommunityAdminSearchResultListElementComponent', () => {
1820
let component: CommunityAdminSearchResultListElementComponent;
@@ -36,7 +38,8 @@ describe('CommunityAdminSearchResultListElementComponent', () => {
3638
],
3739
declarations: [CommunityAdminSearchResultListElementComponent],
3840
providers: [{ provide: TruncatableService, useValue: {} },
39-
{ provide: DSONameService, useClass: DSONameServiceMock }],
41+
{ provide: DSONameService, useClass: DSONameServiceMock },
42+
{ provide: APP_CONFIG, useValue: environment }],
4043
schemas: [NO_ERRORS_SCHEMA]
4144
})
4245
.compileComponents();

src/app/admin/admin-search-page/admin-search-results/admin-search-result-list-element/item-search-result/item-admin-search-result-list-element.component.spec.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@ import { ItemAdminSearchResultListElementComponent } from './item-admin-search-r
1010
import { Item } from '../../../../../core/shared/item.model';
1111
import { DSONameService } from '../../../../../core/breadcrumbs/dso-name.service';
1212
import { DSONameServiceMock } from '../../../../../shared/mocks/dso-name.service.mock';
13+
import { APP_CONFIG } from '../../../../../../config/app-config.interface';
14+
import { environment } from '../../../../../../environments/environment';
1315

1416
describe('ItemAdminSearchResultListElementComponent', () => {
1517
let component: ItemAdminSearchResultListElementComponent;
@@ -33,7 +35,8 @@ describe('ItemAdminSearchResultListElementComponent', () => {
3335
],
3436
declarations: [ItemAdminSearchResultListElementComponent],
3537
providers: [{ provide: TruncatableService, useValue: {} },
36-
{ provide: DSONameService, useClass: DSONameServiceMock }],
38+
{ provide: DSONameService, useClass: DSONameServiceMock },
39+
{ provide: APP_CONFIG, useValue: environment }],
3740
schemas: [NO_ERRORS_SCHEMA]
3841
})
3942
.compileComponents();

src/app/admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-list-element/workflow-item/workflow-item-search-result-admin-workflow-list-element.component.spec.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@ import { createSuccessfulRemoteDataObject$ } from '../../../../../shared/remote-
1818
import { getMockLinkService } from '../../../../../shared/mocks/link-service.mock';
1919
import { DSONameService } from '../../../../../core/breadcrumbs/dso-name.service';
2020
import { DSONameServiceMock } from '../../../../../shared/mocks/dso-name.service.mock';
21+
import { APP_CONFIG } from '../../../../../../config/app-config.interface';
22+
import { environment } from '../../../../../../environments/environment';
2123

2224
describe('WorkflowItemAdminWorkflowListElementComponent', () => {
2325
let component: WorkflowItemSearchResultAdminWorkflowListElementComponent;
@@ -51,7 +53,8 @@ describe('WorkflowItemAdminWorkflowListElementComponent', () => {
5153
providers: [
5254
{ provide: TruncatableService, useValue: mockTruncatableService },
5355
{ provide: LinkService, useValue: linkService },
54-
{ provide: DSONameService, useClass: DSONameServiceMock }
56+
{ provide: DSONameService, useClass: DSONameServiceMock },
57+
{ provide: APP_CONFIG, useValue: environment }
5558
],
5659
schemas: [NO_ERRORS_SCHEMA]
5760
})

src/app/admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-list-element/workflow-item/workflow-item-search-result-admin-workflow-list-element.component.ts

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { Component, OnInit } from '@angular/core';
1+
import { Component, Inject, OnInit } from '@angular/core';
22
import { ViewMode } from '../../../../../core/shared/view-mode.model';
33
import { listableObjectComponent } from '../../../../../shared/object-collection/shared/listable-object/listable-object.decorator';
44
import { Context } from '../../../../../core/shared/context.model';
@@ -13,6 +13,7 @@ import { SearchResultListElementComponent } from '../../../../../shared/object-l
1313
import { TruncatableService } from '../../../../../shared/truncatable/truncatable.service';
1414
import { WorkflowItemSearchResult } from '../../../../../shared/object-collection/shared/workflow-item-search-result.model';
1515
import { DSONameService } from '../../../../../core/breadcrumbs/dso-name.service';
16+
import { APP_CONFIG, AppConfig } from '../../../../../../config/app-config.interface';
1617

1718
@listableObjectComponent(WorkflowItemSearchResult, ViewMode.ListElement, Context.AdminWorkflowSearch)
1819
@Component({
@@ -32,9 +33,10 @@ export class WorkflowItemSearchResultAdminWorkflowListElementComponent extends S
3233

3334
constructor(private linkService: LinkService,
3435
protected truncatableService: TruncatableService,
35-
protected dsoNameService: DSONameService
36+
protected dsoNameService: DSONameService,
37+
@Inject(APP_CONFIG) protected appConfig: AppConfig
3638
) {
37-
super(truncatableService, dsoNameService);
39+
super(truncatableService, dsoNameService, appConfig);
3840
}
3941

4042
/**

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

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,10 @@ import { BrowseEntrySearchOptions } from '../../core/browse/browse-entry-search-
1818
import { toRemoteData } from '../browse-by-metadata-page/browse-by-metadata-page.component.spec';
1919
import { VarDirective } from '../../shared/utils/var.directive';
2020
import { createSuccessfulRemoteDataObject$ } from '../../shared/remote-data.utils';
21-
import { PaginationComponentOptions } from '../../shared/pagination/pagination-component-options.model';
22-
import { SortDirection, SortOptions } from '../../core/cache/models/sort-options.model';
2321
import { PaginationService } from '../../core/pagination/pagination.service';
2422
import { PaginationServiceStub } from '../../shared/testing/pagination-service.stub';
25-
import { FindListOptions } from '../../core/data/find-list-options.model';
23+
import { APP_CONFIG } from '../../../config/app-config.interface';
24+
import { environment } from '../../../environments/environment';
2625

2726
describe('BrowseByDatePageComponent', () => {
2827
let comp: BrowseByDatePageComponent;
@@ -83,7 +82,8 @@ describe('BrowseByDatePageComponent', () => {
8382
{ provide: DSpaceObjectDataService, useValue: mockDsoService },
8483
{ provide: Router, useValue: new RouterMock() },
8584
{ provide: PaginationService, useValue: paginationService },
86-
{ provide: ChangeDetectorRef, useValue: mockCdRef }
85+
{ provide: ChangeDetectorRef, useValue: mockCdRef },
86+
{ provide: APP_CONFIG, useValue: environment }
8787
],
8888
schemas: [NO_ERRORS_SCHEMA]
8989
}).compileComponents();

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

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,8 @@
1-
import { ChangeDetectorRef, Component } from '@angular/core';
1+
import { ChangeDetectorRef, Component, Inject } from '@angular/core';
22
import {
33
BrowseByMetadataPageComponent,
4-
browseParamsToOptions
4+
browseParamsToOptions, getBrowseSearchOptions
55
} from '../browse-by-metadata-page/browse-by-metadata-page.component';
6-
import { BrowseEntrySearchOptions } from '../../core/browse/browse-entry-search-options.model';
76
import { combineLatest as observableCombineLatest } from 'rxjs';
87
import { RemoteData } from '../../core/data/remote-data';
98
import { Item } from '../../core/shared/item.model';
@@ -13,12 +12,12 @@ import { BrowseService } from '../../core/browse/browse.service';
1312
import { DSpaceObjectDataService } from '../../core/data/dspace-object-data.service';
1413
import { StartsWithType } from '../../shared/starts-with/starts-with-decorator';
1514
import { BrowseByDataType, rendersBrowseBy } from '../browse-by-switcher/browse-by-decorator';
16-
import { environment } from '../../../environments/environment';
1715
import { PaginationService } from '../../core/pagination/pagination.service';
1816
import { map } from 'rxjs/operators';
1917
import { PaginationComponentOptions } from '../../shared/pagination/pagination-component-options.model';
2018
import { SortDirection, SortOptions } from '../../core/cache/models/sort-options.model';
2119
import { isValidDate } from '../../shared/date.util';
20+
import { AppConfig, APP_CONFIG } from '../../../config/app-config.interface';
2221

2322
@Component({
2423
selector: 'ds-browse-by-date-page',
@@ -43,14 +42,16 @@ export class BrowseByDatePageComponent extends BrowseByMetadataPageComponent {
4342
protected dsoService: DSpaceObjectDataService,
4443
protected router: Router,
4544
protected paginationService: PaginationService,
46-
protected cdRef: ChangeDetectorRef) {
47-
super(route, browseService, dsoService, paginationService, router);
45+
protected cdRef: ChangeDetectorRef,
46+
@Inject(APP_CONFIG) public appConfig: AppConfig) {
47+
super(route, browseService, dsoService, paginationService, router, appConfig);
4848
}
4949

5050
ngOnInit(): void {
5151
const sortConfig = new SortOptions('default', SortDirection.ASC);
5252
this.startsWithType = StartsWithType.date;
53-
this.updatePage(new BrowseEntrySearchOptions(this.defaultBrowseId, this.paginationConfig, sortConfig));
53+
// include the thumbnail configuration in browse search options
54+
this.updatePage(getBrowseSearchOptions(this.defaultBrowseId, this.paginationConfig, sortConfig, this.fetchThumbnails));
5455
this.currentPagination$ = this.paginationService.getCurrentPagination(this.paginationConfig.id, this.paginationConfig);
5556
this.currentSort$ = this.paginationService.getCurrentSort(this.paginationConfig.id, sortConfig);
5657
this.subs.push(
@@ -63,7 +64,7 @@ export class BrowseByDatePageComponent extends BrowseByMetadataPageComponent {
6364
const metadataKeys = params.browseDefinition ? params.browseDefinition.metadataKeys : this.defaultMetadataKeys;
6465
this.browseId = params.id || this.defaultBrowseId;
6566
this.startsWith = +params.startsWith || params.startsWith;
66-
const searchOptions = browseParamsToOptions(params, currentPage, currentSort, this.browseId);
67+
const searchOptions = browseParamsToOptions(params, currentPage, currentSort, this.browseId, this.fetchThumbnails);
6768
this.updatePageWithItems(searchOptions, this.value, undefined);
6869
this.updateParent(params.scope);
6970
this.updateStartsWithOptions(this.browseId, metadataKeys, params.scope);
@@ -83,7 +84,7 @@ export class BrowseByDatePageComponent extends BrowseByMetadataPageComponent {
8384
updateStartsWithOptions(definition: string, metadataKeys: string[], scope?: string) {
8485
this.subs.push(
8586
this.browseService.getFirstItemFor(definition, scope).subscribe((firstItemRD: RemoteData<Item>) => {
86-
let lowerLimit = environment.browseBy.defaultLowerLimit;
87+
let lowerLimit = this.appConfig.browseBy.defaultLowerLimit;
8788
if (hasValue(firstItemRD.payload)) {
8889
const date = firstItemRD.payload.firstMetadataValue(metadataKeys);
8990
if (isNotEmpty(date) && isValidDate(date)) {
@@ -94,8 +95,8 @@ export class BrowseByDatePageComponent extends BrowseByMetadataPageComponent {
9495
}
9596
const options = [];
9697
const currentYear = new Date().getUTCFullYear();
97-
const oneYearBreak = Math.floor((currentYear - environment.browseBy.oneYearLimit) / 5) * 5;
98-
const fiveYearBreak = Math.floor((currentYear - environment.browseBy.fiveYearLimit) / 10) * 10;
98+
const oneYearBreak = Math.floor((currentYear - this.appConfig.browseBy.oneYearLimit) / 5) * 5;
99+
const fiveYearBreak = Math.floor((currentYear - this.appConfig.browseBy.fiveYearLimit) / 10) * 10;
99100
if (lowerLimit <= fiveYearBreak) {
100101
lowerLimit -= 10;
101102
} else if (lowerLimit <= oneYearBreak) {

0 commit comments

Comments
 (0)