import { Component, Input, OnDestroy, OnInit } from '@angular/core'; import { BehaviorSubject, combineLatest as observableCombineLatest } from 'rxjs'; import { RemoteData } from '../../core/data/remote-data'; import { Collection } from '../../core/shared/collection.model'; import { Community } from '../../core/shared/community.model'; import { fadeIn } from '../../shared/animations/fade'; import { PaginatedList } from '../../core/data/paginated-list.model'; import { PaginationComponentOptions } from '../../shared/pagination/pagination-component-options.model'; import { SortDirection, SortOptions } from '../../core/cache/models/sort-options.model'; import { CollectionDataService } from '../../core/data/collection-data.service'; import { PaginationService } from '../../core/pagination/pagination.service'; import { switchMap } from 'rxjs/operators'; import { hasValue } from '../../shared/empty.util'; @Component({ selector: 'ds-community-page-sub-collection-list', styleUrls: ['./community-page-sub-collection-list.component.scss'], templateUrl: './community-page-sub-collection-list.component.html', animations:[fadeIn] }) export class CommunityPageSubCollectionListComponent implements OnInit, OnDestroy { @Input() community: Community; /** * Optional page size. Overrides communityList.pageSize configuration for this component. * Value can be added in the themed version of the parent component. */ @Input() pageSize: number; /** * The pagination configuration */ config: PaginationComponentOptions; /** * The pagination id */ pageId = 'cmcl'; /** * The sorting configuration */ sortConfig: SortOptions; /** * A list of remote data objects of communities' collections */ subCollectionsRDObs: BehaviorSubject>> = new BehaviorSubject>>({} as any); constructor(private cds: CollectionDataService, private paginationService: PaginationService, ) {} ngOnInit(): void { this.config = new PaginationComponentOptions(); this.config.id = this.pageId; if (hasValue(this.pageSize)) { this.config.pageSize = this.pageSize; } this.config.currentPage = 1; this.sortConfig = new SortOptions('dc.title', SortDirection.ASC); this.initPage(); } /** * Initialise the list of collections */ initPage() { const pagination$ = this.paginationService.getCurrentPagination(this.config.id, this.config); const sort$ = this.paginationService.getCurrentSort(this.config.id, this.sortConfig); observableCombineLatest([pagination$, sort$]).pipe( switchMap(([currentPagination, currentSort]) => { return this.cds.findByParent(this.community.id, { currentPage: currentPagination.currentPage, elementsPerPage: currentPagination.pageSize, sort: {field: currentSort.field, direction: currentSort.direction} }); }) ).subscribe((results) => { this.subCollectionsRDObs.next(results); }); } ngOnDestroy(): void { this.paginationService.clearPagination(this.config.id); } }