-
-
-
-
-
- - {{"item.page.filesection.name" | translate}}
- - {{file.name}}
-
- - {{"item.page.filesection.size" | translate}}
- - {{(file.sizeBytes) | dsFileSize }}
+
+
+
0"
+ [hideGear]="true"
+ [hidePagerWhenSinglePage]="true"
+ [paginationOptions]="originalOptions"
+ [pageInfoState]="originals"
+ [collectionSize]="originals?.totalElements"
+ [disableRouteParameterUpdate]="true"
+ (pageChange)="switchOriginalPage($event)">
- - {{"item.page.filesection.format" | translate}}
- - {{(file.format | async)?.payload?.description}}
+
+
+
+
+
+
+
+ - {{"item.page.filesection.name" | translate}}
+ - {{file.name}}
+
+ - {{"item.page.filesection.size" | translate}}
+ - {{(file.sizeBytes) | dsFileSize }}
- - {{"item.page.filesection.description" | translate}}
- - {{file.firstMetadataValue("dc.description")}}
-
-
-
-
- {{"item.page.filesection.download" | translate}}
-
-
+
- {{"item.page.filesection.format" | translate}}
+
- {{(file.format | async)?.payload?.description}}
+
+
+
- {{"item.page.filesection.description" | translate}}
+
- {{file.firstMetadataValue("dc.description")}}
+
+
+
+
+ {{"item.page.filesection.download" | translate}}
+
+
+
+
+
+
+
+
+
0"
+ [hideGear]="true"
+ [hidePagerWhenSinglePage]="true"
+ [paginationOptions]="licenseOptions"
+ [pageInfoState]="licenses"
+ [collectionSize]="licenses?.totalElements"
+ [disableRouteParameterUpdate]="true"
+ (pageChange)="switchLicensePage($event)">
+
+
+
+
+
+
+
+
+
+ - {{"item.page.filesection.name" | translate}}
+ - {{file.name}}
+
+ - {{"item.page.filesection.size" | translate}}
+ - {{(file.sizeBytes) | dsFileSize }}
+
+
+ - {{"item.page.filesection.format" | translate}}
+ - {{(file.format | async)?.payload?.description}}
+
+
+ - {{"item.page.filesection.description" | translate}}
+ - {{file.firstMetadataValue("dc.description")}}
+
+
+
+
+ {{"item.page.filesection.download" | translate}}
+
+
+
+
diff --git a/src/app/+item-page/full/field-components/file-section/full-file-section.component.spec.ts b/src/app/+item-page/full/field-components/file-section/full-file-section.component.spec.ts
new file mode 100644
index 0000000000..970420f252
--- /dev/null
+++ b/src/app/+item-page/full/field-components/file-section/full-file-section.component.spec.ts
@@ -0,0 +1,117 @@
+import {FullFileSectionComponent} from './full-file-section.component';
+import {async, ComponentFixture, TestBed} from '@angular/core/testing';
+import {createSuccessfulRemoteDataObject$} from '../../../../shared/remote-data.utils';
+import {createPaginatedList} from '../../../../shared/testing/utils.test';
+import {TranslateLoader, TranslateModule} from '@ngx-translate/core';
+import {TranslateLoaderMock} from '../../../../shared/mocks/translate-loader.mock';
+import {BrowserAnimationsModule} from '@angular/platform-browser/animations';
+import {VarDirective} from '../../../../shared/utils/var.directive';
+import {FileSizePipe} from '../../../../shared/utils/file-size-pipe';
+import {MetadataFieldWrapperComponent} from '../../../field-components/metadata-field-wrapper/metadata-field-wrapper.component';
+import {BitstreamDataService} from '../../../../core/data/bitstream-data.service';
+import {NO_ERRORS_SCHEMA} from '@angular/core';
+import {Bitstream} from '../../../../core/shared/bitstream.model';
+import {of as observableOf} from 'rxjs';
+import {MockBitstreamFormat1} from '../../../../shared/mocks/item.mock';
+import {By} from '@angular/platform-browser';
+
+describe('FullFileSectionComponent', () => {
+ let comp: FullFileSectionComponent;
+ let fixture: ComponentFixture
;
+
+ const mockBitstream: Bitstream = Object.assign(new Bitstream(),
+ {
+ sizeBytes: 10201,
+ content: 'https://dspace7.4science.it/dspace-spring-rest/api/core/bitstreams/cf9b0c8e-a1eb-4b65-afd0-567366448713/content',
+ format: observableOf(MockBitstreamFormat1),
+ bundleName: 'ORIGINAL',
+ _links: {
+ self: {
+ href: 'https://dspace7.4science.it/dspace-spring-rest/api/core/bitstreams/cf9b0c8e-a1eb-4b65-afd0-567366448713'
+ },
+ content: {
+ href: 'https://dspace7.4science.it/dspace-spring-rest/api/core/bitstreams/cf9b0c8e-a1eb-4b65-afd0-567366448713/content'
+ }
+ },
+ id: 'cf9b0c8e-a1eb-4b65-afd0-567366448713',
+ uuid: 'cf9b0c8e-a1eb-4b65-afd0-567366448713',
+ type: 'bitstream',
+ metadata: {
+ 'dc.title': [
+ {
+ language: null,
+ value: 'test_word.docx'
+ }
+ ]
+ }
+ });
+
+ const bitstreamDataService = jasmine.createSpyObj('bitstreamDataService', {
+ findAllByItemAndBundleName: createSuccessfulRemoteDataObject$(createPaginatedList([mockBitstream, mockBitstream, mockBitstream]))
+ });
+
+ beforeEach(async(() => {
+
+ TestBed.configureTestingModule({
+ imports: [TranslateModule.forRoot({
+ loader: {
+ provide: TranslateLoader,
+ useClass: TranslateLoaderMock
+ }
+ }), BrowserAnimationsModule],
+ declarations: [FullFileSectionComponent, VarDirective, FileSizePipe, MetadataFieldWrapperComponent],
+ providers: [
+ {provide: BitstreamDataService, useValue: bitstreamDataService}
+ ],
+
+ schemas: [NO_ERRORS_SCHEMA]
+ }).compileComponents();
+ }));
+
+ beforeEach(async(() => {
+ fixture = TestBed.createComponent(FullFileSectionComponent);
+ comp = fixture.componentInstance;
+ fixture.detectChanges();
+ }));
+
+ describe('when the full file section gets loaded with bitstreams available', () => {
+ it ('should contain a list with bitstreams', () => {
+ const fileSection = fixture.debugElement.queryAll(By.css('.file-section'));
+ expect(fileSection.length).toEqual(6);
+ });
+
+ describe('when we press the pageChange button for original bundle', () => {
+ beforeEach(() => {
+ comp.switchOriginalPage(2);
+ fixture.detectChanges();
+ });
+
+ it ('should give the value to the currentpage', () => {
+ expect(comp.originalOptions.currentPage).toBe(2);
+ })
+ it ('should call the next function on the originalCurrentPage', (done) => {
+ comp.originalCurrentPage$.subscribe((event) => {
+ expect(event).toEqual(2);
+ done();
+ })
+ })
+ })
+
+ describe('when we press the pageChange button for license bundle', () => {
+ beforeEach(() => {
+ comp.switchLicensePage(2);
+ fixture.detectChanges();
+ });
+
+ it ('should give the value to the currentpage', () => {
+ expect(comp.licenseOptions.currentPage).toBe(2);
+ })
+ it ('should call the next function on the licenseCurrentPage', (done) => {
+ comp.licenseCurrentPage$.subscribe((event) => {
+ expect(event).toEqual(2);
+ done();
+ })
+ })
+ })
+ })
+})
diff --git a/src/app/+item-page/full/field-components/file-section/full-file-section.component.ts b/src/app/+item-page/full/field-components/file-section/full-file-section.component.ts
index f18fccd7e9..fdbe662ed9 100644
--- a/src/app/+item-page/full/field-components/file-section/full-file-section.component.ts
+++ b/src/app/+item-page/full/field-components/file-section/full-file-section.component.ts
@@ -1,13 +1,15 @@
-import { Component, Injector, Input, OnInit } from '@angular/core';
-import { combineLatest as observableCombineLatest, Observable } from 'rxjs';
-import { map, startWith } from 'rxjs/operators';
+import { Component, Input, OnInit } from '@angular/core';
+import { BehaviorSubject, Observable } from 'rxjs';
import { BitstreamDataService } from '../../../../core/data/bitstream-data.service';
import { Bitstream } from '../../../../core/shared/bitstream.model';
import { Item } from '../../../../core/shared/item.model';
-import { getFirstSucceededRemoteListPayload } from '../../../../core/shared/operators';
import { followLink } from '../../../../shared/utils/follow-link-config.model';
import { FileSectionComponent } from '../../../simple/field-components/file-section/file-section.component';
+import { PaginationComponentOptions } from '../../../../shared/pagination/pagination-component-options.model';
+import { PaginatedList } from '../../../../core/data/paginated-list';
+import { RemoteData } from '../../../../core/data/remote-data';
+import { switchMap } from 'rxjs/operators';
/**
* This component renders the file section of the item
@@ -25,7 +27,23 @@ export class FullFileSectionComponent extends FileSectionComponent implements On
label: string;
- bitstreams$: Observable;
+ originals$: Observable>>;
+ licenses$: Observable>>;
+
+ pageSize = 5;
+ originalOptions = Object.assign(new PaginationComponentOptions(),{
+ id: 'original-bitstreams-options',
+ currentPage: 1,
+ pageSize: this.pageSize
+ });
+ originalCurrentPage$ = new BehaviorSubject(1);
+
+ licenseOptions = Object.assign(new PaginationComponentOptions(),{
+ id: 'license-bitstreams-options',
+ currentPage: 1,
+ pageSize: this.pageSize
+ });
+ licenseCurrentPage$ = new BehaviorSubject(1);
constructor(
bitstreamDataService: BitstreamDataService
@@ -34,40 +52,45 @@ export class FullFileSectionComponent extends FileSectionComponent implements On
}
ngOnInit(): void {
- super.ngOnInit();
+ this.initialize();
}
initialize(): void {
- // TODO pagination
- const originals$ = this.bitstreamDataService.findAllByItemAndBundleName(
- this.item,
- 'ORIGINAL',
- { elementsPerPage: Number.MAX_SAFE_INTEGER },
- followLink( 'format')
- ).pipe(
- getFirstSucceededRemoteListPayload(),
- startWith([])
+ this.originals$ = this.originalCurrentPage$.pipe(
+ switchMap((pageNumber: number) => this.bitstreamDataService.findAllByItemAndBundleName(
+ this.item,
+ 'ORIGINAL',
+ { elementsPerPage: this.pageSize, currentPage: pageNumber },
+ followLink( 'format')
+ ))
);
- const licenses$ = this.bitstreamDataService.findAllByItemAndBundleName(
- this.item,
- 'LICENSE',
- { elementsPerPage: Number.MAX_SAFE_INTEGER },
- followLink( 'format')
- ).pipe(
- getFirstSucceededRemoteListPayload(),
- startWith([])
- );
- this.bitstreams$ = observableCombineLatest(originals$, licenses$).pipe(
- map(([o, l]) => [...o, ...l]),
- map((files: Bitstream[]) =>
- files.map(
- (original) => {
- original.thumbnail = this.bitstreamDataService.getMatchingThumbnail(this.item, original);
- return original;
- }
- )
- )
+
+ this.licenses$ = this.licenseCurrentPage$.pipe(
+ switchMap((pageNumber: number) => this.bitstreamDataService.findAllByItemAndBundleName(
+ this.item,
+ 'LICENSE',
+ { elementsPerPage: this.pageSize, currentPage: pageNumber },
+ followLink( 'format')
+ ))
);
+
}
+ /**
+ * Update the current page for the original bundle bitstreams
+ * @param page
+ */
+ switchOriginalPage(page: number) {
+ this.originalOptions.currentPage = page;
+ this.originalCurrentPage$.next(page);
+ }
+
+ /**
+ * Update the current page for the license bundle bitstreams
+ * @param page
+ */
+ switchLicensePage(page: number) {
+ this.licenseOptions.currentPage = page;
+ this.licenseCurrentPage$.next(page);
+ }
}
diff --git a/src/app/+item-page/simple/field-components/file-section/file-section.component.html b/src/app/+item-page/simple/field-components/file-section/file-section.component.html
index 17e4a795e7..1fdee6dc4d 100644
--- a/src/app/+item-page/simple/field-components/file-section/file-section.component.html
+++ b/src/app/+item-page/simple/field-components/file-section/file-section.component.html
@@ -6,6 +6,13 @@
({{(file?.sizeBytes) | dsFileSize }})
+
+
+