diff --git a/config/config.example.yml b/config/config.example.yml index ae733e0be5..4814c826f1 100644 --- a/config/config.example.yml +++ b/config/config.example.yml @@ -258,3 +258,10 @@ mediaViewer: info: enableEndUserAgreement: true enablePrivacyStatement: true +# Home Page +homePage: + recentSubmissions: + # The number of item showing in recent submission components + pageSize: 5 + # Sort record of recent submission + sortField: 'dc.date.accessioned' diff --git a/src/app/home-page/home-page.component.html b/src/app/home-page/home-page.component.html index 0f7db182f0..1000dbe9a4 100644 --- a/src/app/home-page/home-page.component.html +++ b/src/app/home-page/home-page.component.html @@ -5,4 +5,5 @@ + diff --git a/src/app/home-page/home-page.component.ts b/src/app/home-page/home-page.component.ts index 65caa01430..c151cbbb16 100644 --- a/src/app/home-page/home-page.component.ts +++ b/src/app/home-page/home-page.component.ts @@ -3,7 +3,7 @@ import { map } from 'rxjs/operators'; import { ActivatedRoute } from '@angular/router'; import { Observable } from 'rxjs'; import { Site } from '../core/shared/site.model'; - +import { environment } from '../../environments/environment'; @Component({ selector: 'ds-home-page', styleUrls: ['./home-page.component.scss'], @@ -12,10 +12,11 @@ import { Site } from '../core/shared/site.model'; export class HomePageComponent implements OnInit { site$: Observable; - + recentSubmissionspageSize: number; constructor( private route: ActivatedRoute, ) { + this.recentSubmissionspageSize = environment.homePage.recentSubmissions.pageSize; } ngOnInit(): void { diff --git a/src/app/home-page/home-page.module.ts b/src/app/home-page/home-page.module.ts index d304c78696..26fde41d8d 100644 --- a/src/app/home-page/home-page.module.ts +++ b/src/app/home-page/home-page.module.ts @@ -9,13 +9,14 @@ import { TopLevelCommunityListComponent } from './top-level-community-list/top-l import { StatisticsModule } from '../statistics/statistics.module'; import { ThemedHomeNewsComponent } from './home-news/themed-home-news.component'; import { ThemedHomePageComponent } from './themed-home-page.component'; - +import { RecentItemListComponent } from './recent-item-list/recent-item-list.component'; const DECLARATIONS = [ HomePageComponent, ThemedHomePageComponent, TopLevelCommunityListComponent, ThemedHomeNewsComponent, HomeNewsComponent, + RecentItemListComponent ]; @NgModule({ diff --git a/src/app/home-page/recent-item-list/recent-item-list.component.html b/src/app/home-page/recent-item-list/recent-item-list.component.html new file mode 100644 index 0000000000..8314580f1d --- /dev/null +++ b/src/app/home-page/recent-item-list/recent-item-list.component.html @@ -0,0 +1,15 @@ + +
+
+

{{'home.recent-submissions.head' | translate}}

+
+ + +
+ +
+ + + +
\ No newline at end of file diff --git a/src/app/home-page/recent-item-list/recent-item-list.component.scss b/src/app/home-page/recent-item-list/recent-item-list.component.scss new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/app/home-page/recent-item-list/recent-item-list.component.spec.ts b/src/app/home-page/recent-item-list/recent-item-list.component.spec.ts new file mode 100644 index 0000000000..87152f53ef --- /dev/null +++ b/src/app/home-page/recent-item-list/recent-item-list.component.spec.ts @@ -0,0 +1,66 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; +import { SearchService } from 'src/app/core/shared/search/search.service'; +import { createSuccessfulRemoteDataObject } from 'src/app/shared/remote-data.utils'; +import { SearchServiceStub } from 'src/app/shared/testing/search-service.stub'; +import { createPaginatedList } from 'src/app/shared/testing/utils.test'; +import { PaginationService } from '../../core/pagination/pagination.service'; +import { PaginationServiceStub } from '../../shared/testing/pagination-service.stub'; +import { RecentItemListComponent } from './recent-item-list.component'; +import { SearchConfigurationService } from '../../core/shared/search/search-configuration.service'; +import { PaginatedSearchOptions } from '../../shared/search/models/paginated-search-options.model'; +import { PaginationComponentOptions } from '../../shared/pagination/pagination-component-options.model'; +import { SortDirection, SortOptions } from '../../core/cache/models/sort-options.model'; +import { ViewMode } from 'src/app/core/shared/view-mode.model'; +import { of as observableOf } from 'rxjs'; +describe('RecentItemListComponent', () => { + let component: RecentItemListComponent; + let fixture: ComponentFixture; + const emptyList = createSuccessfulRemoteDataObject(createPaginatedList([])); + let paginationService; + const searchServiceStub = Object.assign(new SearchServiceStub(), { + search: () => observableOf(emptyList), + /* eslint-disable no-empty,@typescript-eslint/no-empty-function */ + clearDiscoveryRequests: () => {} + /* eslint-enable no-empty,@typescript-eslint/no-empty-function */ + }); + paginationService = new PaginationServiceStub(); + const mockSearchOptions = observableOf(new PaginatedSearchOptions({ + pagination: Object.assign(new PaginationComponentOptions(), { + id: 'search-page-configuration', + pageSize: 10, + currentPage: 1 + }), + sort: new SortOptions('dc.date.accessioned', SortDirection.DESC), + })); + const searchConfigServiceStub = { + paginatedSearchOptions: mockSearchOptions + }; + beforeEach(async () => { + await TestBed.configureTestingModule({ + declarations: [ RecentItemListComponent], + providers: [ + { provide: SearchService, useValue: searchServiceStub }, + { provide: PaginationService, useValue: paginationService }, + { provide: SearchConfigurationService, useValue: searchConfigServiceStub }, + ], + }) + .compileComponents(); + }); + + beforeEach(() => { + fixture = TestBed.createComponent(RecentItemListComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); + + it('should call the navigate method on the Router with view mode list parameter as a parameter when setViewMode is called', () => { + component.onLoadMore(); + expect(paginationService.updateRouteWithUrl).toHaveBeenCalledWith(undefined, ['search'], Object({ sortField: 'dc.date.accessioned', sortDirection: 'DESC', page: 1 })); + }); +}); + + diff --git a/src/app/home-page/recent-item-list/recent-item-list.component.ts b/src/app/home-page/recent-item-list/recent-item-list.component.ts new file mode 100644 index 0000000000..df5359386a --- /dev/null +++ b/src/app/home-page/recent-item-list/recent-item-list.component.ts @@ -0,0 +1,72 @@ +import { ChangeDetectionStrategy, Component, OnInit } from '@angular/core'; +import { PaginatedSearchOptions } from '../../shared/search/models/paginated-search-options.model'; +import { fadeIn, fadeInOut } from '../../shared/animations/fade'; +import { RemoteData } from '../../core/data/remote-data'; +import { PaginatedList } from '../../core/data/paginated-list.model'; +import { Item } from '../../core/shared/item.model'; +import { PaginationComponentOptions } from '../../shared/pagination/pagination-component-options.model'; +import { PaginationService } from '../../core/pagination/pagination.service'; +import { SearchService } from '../../core/shared/search/search.service'; +import { SortDirection, SortOptions } from '../../core/cache/models/sort-options.model'; +import { environment } from '../../../environments/environment'; +import { ViewMode } from '../../core/shared/view-mode.model'; +import { SearchConfigurationService } from '../../core/shared/search/search-configuration.service'; +import { + toDSpaceObjectListRD +} from '../../core/shared/operators'; +import { + Observable, +} from 'rxjs'; +@Component({ + selector: 'ds-recent-item-list', + templateUrl: './recent-item-list.component.html', + styleUrls: ['./recent-item-list.component.scss'], + changeDetection: ChangeDetectionStrategy.OnPush, + animations: [ + fadeIn, + fadeInOut + ] +}) +export class RecentItemListComponent implements OnInit { + itemRD$: Observable>>; + paginationConfig: PaginationComponentOptions; + sortConfig: SortOptions; + /** + * The view-mode we're currently on + * @type {ViewMode} + */ + viewMode = ViewMode.ListElement; + constructor(private searchService: SearchService, + private paginationService: PaginationService, + public searchConfigurationService: SearchConfigurationService + ) { + + this.paginationConfig = Object.assign(new PaginationComponentOptions(), { + id: 'hp', + pageSize: environment.homePage.recentSubmissions.pageSize, + currentPage: 1, + maxSize: 1 + }); + this.sortConfig = new SortOptions(environment.homePage.recentSubmissions.sortField, SortDirection.DESC); + } + ngOnInit(): void { + this.itemRD$ = this.searchService.search( + new PaginatedSearchOptions({ + pagination: this.paginationConfig, + sort: this.sortConfig, + }), + ).pipe(toDSpaceObjectListRD()) as Observable>>; + } + ngOnDestroy(): void { + this.paginationService.clearPagination(this.paginationConfig.id); + } + onLoadMore(): void { + this.paginationService.updateRouteWithUrl(this.searchConfigurationService.paginationID, ['search'], { + sortField: environment.homePage.recentSubmissions.sortField, + sortDirection: 'DESC' as SortDirection, + page: 1 + }); + } + +} + diff --git a/src/assets/i18n/en.json5 b/src/assets/i18n/en.json5 index bd40bc642c..e7f31350be 100644 --- a/src/assets/i18n/en.json5 +++ b/src/assets/i18n/en.json5 @@ -4763,5 +4763,6 @@ "person.orcid.registry.queue": "ORCID Registry Queue", "person.orcid.registry.auth": "ORCID Authorizations", + "home.recent-submissions.head": "Recent Submissions", } diff --git a/src/config/app-config.interface.ts b/src/config/app-config.interface.ts index cd9ef103ae..6bca828a91 100644 --- a/src/config/app-config.interface.ts +++ b/src/config/app-config.interface.ts @@ -17,7 +17,7 @@ import { BrowseByConfig } from './browse-by-config.interface'; import { BundleConfig } from './bundle-config.interface'; import { ActuatorsConfig } from './actuators.config'; import { InfoConfig } from './info-config.interface'; - +import { HomeConfig } from './homepage-config.interface'; interface AppConfig extends Config { ui: UIServerConfig; rest: ServerConfig; @@ -38,6 +38,7 @@ interface AppConfig extends Config { bundle: BundleConfig; actuators: ActuatorsConfig info: InfoConfig; + homePage: HomeConfig; } /** diff --git a/src/config/default-app-config.ts b/src/config/default-app-config.ts index d2d0608a03..b1b64d1c87 100644 --- a/src/config/default-app-config.ts +++ b/src/config/default-app-config.ts @@ -17,7 +17,7 @@ import { UIServerConfig } from './ui-server-config.interface'; import { BundleConfig } from './bundle-config.interface'; import { ActuatorsConfig } from './actuators.config'; import { InfoConfig } from './info-config.interface'; - +import { HomeConfig } from './homepage-config.interface'; export class DefaultAppConfig implements AppConfig { production = false; @@ -338,4 +338,13 @@ export class DefaultAppConfig implements AppConfig { enableEndUserAgreement: true, enablePrivacyStatement: true }; + // Home Pages + homePage: HomeConfig = { + recentSubmissions: { + //The number of item showing in recent submission components + pageSize: 5, + //sort record of recent submission + sortField: 'dc.date.accessioned', + } + }; } diff --git a/src/config/homepage-config.interface.ts b/src/config/homepage-config.interface.ts new file mode 100644 index 0000000000..1f955358e0 --- /dev/null +++ b/src/config/homepage-config.interface.ts @@ -0,0 +1,20 @@ +import { Config } from './config.interface'; + +/** + * Config that determines how the dropdown list of years are created for browse-by-date components + */ +export interface HomeConfig extends Config { + recentSubmissions: { + /** + * The number of item showing in recent submission components + */ + pageSize: number; + + /** + * sort record of recent submission + */ + sortField: string; + } + + +} diff --git a/src/environments/environment.test.ts b/src/environments/environment.test.ts index 4d466bd37b..6fe4dd6516 100644 --- a/src/environments/environment.test.ts +++ b/src/environments/environment.test.ts @@ -247,5 +247,13 @@ export const environment: BuildConfig = { info: { enableEndUserAgreement: true, enablePrivacyStatement: true, + }, + //Home Page + homePage: { + recentSubmissions: { + pageSize: 5, + //sort record of recent submission + sortField: 'dc.date.accessioned', + } } };