From 940f20ae1b5595b1ee99d5b2aa7c51e8c23535ff Mon Sep 17 00:00:00 2001 From: milanmajchrak Date: Fri, 19 Apr 2024 14:32:35 +0200 Subject: [PATCH 1/2] Show download all in zip button only when all conditions are met --- .../clarin-files-section.component.html | 8 ++- .../clarin-files-section.component.ts | 71 ++++++++++++++----- 2 files changed, 59 insertions(+), 20 deletions(-) diff --git a/src/app/item-page/clarin-files-section/clarin-files-section.component.html b/src/app/item-page/clarin-files-section/clarin-files-section.component.html index e801c0bc867..978b72717c1 100644 --- a/src/app/item-page/clarin-files-section/clarin-files-section.component.html +++ b/src/app/item-page/clarin-files-section/clarin-files-section.component.html @@ -14,10 +14,14 @@
 {{'item.page.files.head' | translate}}<
{{ command }}
-   - {{'item.page.download.button.all.files.zip' | translate}} ({{ totalFileSizes | dsFileSize }}) + {{'item.page.download.button.all.files.zip' | translate}} ({{ (totalFileSizes | async) | dsFileSize }}) diff --git a/src/app/item-page/clarin-files-section/clarin-files-section.component.ts b/src/app/item-page/clarin-files-section/clarin-files-section.component.ts index 084c9c66955..029961b2d13 100644 --- a/src/app/item-page/clarin-files-section/clarin-files-section.component.ts +++ b/src/app/item-page/clarin-files-section/clarin-files-section.component.ts @@ -1,11 +1,13 @@ import { Component, Input, OnInit } from '@angular/core'; import { Item } from '../../core/shared/item.model'; -import { getAllSucceededRemoteListPayload } from '../../core/shared/operators'; +import { getAllSucceededRemoteListPayload, getFirstSucceededRemoteDataPayload } from '../../core/shared/operators'; import { getItemPageRoute } from '../item-page-routing-paths'; import { MetadataBitstream } from '../../core/metadata/metadata-bitstream.model'; import { RegistryService } from '../../core/registry/registry.service'; import { Router } from '@angular/router'; import { HALEndpointService } from '../../core/shared/hal-endpoint.service'; +import { ConfigurationDataService } from '../../core/data/configuration-data.service'; +import { BehaviorSubject } from 'rxjs'; @Component({ selector: 'ds-clarin-files-section', @@ -44,17 +46,36 @@ export class ClarinFilesSectionComponent implements OnInit { /** * total size of list of files uploaded by users to this item */ - totalFileSizes: number; + totalFileSizes: BehaviorSubject = new BehaviorSubject(-1); /** * list of files uploaded by users to this item */ - listOfFiles: MetadataBitstream[]; + listOfFiles: BehaviorSubject = new BehaviorSubject([]); + + /** + * min file size to show `Download all ZIP` button, this value is loaded from the configuration property + * `download.all.alert.min.file.size` + */ + downloadZipMinFileSize: BehaviorSubject = new BehaviorSubject(-1); + + /** + * max file size to show `Download all ZIP` button, this value is loaded from the configuration property + * `download.all.limit.max.file.size` + */ + downloadZipMaxFileSize: BehaviorSubject = new BehaviorSubject(-1); + + /** + * min count of files to show `Download all ZIP` button, this value is loaded from the configuration property + * `download.all.limit.min.file.count` + */ + downloadZipMinFileCount: BehaviorSubject = new BehaviorSubject(-1); constructor(protected registryService: RegistryService, protected router: Router, - protected halService: HALEndpointService) { + protected halService: HALEndpointService, + protected configurationService: ConfigurationDataService) { } ngOnInit(): void { @@ -62,10 +83,11 @@ export class ClarinFilesSectionComponent implements OnInit { .getMetadataBitstream(this.itemHandle, 'ORIGINAL,TEXT,THUMBNAIL') .pipe(getAllSucceededRemoteListPayload()) .subscribe((data: MetadataBitstream[]) => { - this.listOfFiles = data; + this.listOfFiles.next(data); this.generateCurlCommand(); - this.sumFileSizes(); }); + this.totalFileSizes.next(Number(this.item.firstMetadataValue('local.files.size'))); + this.loadDownloadZipConfigProperties(); } setCommandline() { @@ -77,12 +99,7 @@ export class ClarinFilesSectionComponent implements OnInit { } generateCurlCommand() { - const fileNames = this.listOfFiles.map((file: MetadataBitstream) => { - // Show `Download All Files` only if there are more files. - if (this.listOfFiles.length > 1) { - this.canDownloadAllFiles = true; - } - + const fileNames = this.listOfFiles.value.map((file: MetadataBitstream) => { if (file.canPreview) { this.canShowCurlDownload = true; } @@ -95,11 +112,29 @@ export class ClarinFilesSectionComponent implements OnInit { }/{${fileNames.join(',')}}`; } - sumFileSizes() { - let totalBytes = 0; - this.listOfFiles.forEach((file) => { - totalBytes += file.fileSize; - }); - this.totalFileSizes = totalBytes; + loadDownloadZipConfigProperties() { + this.configurationService.findByPropertyName('download.all.limit.min.file.count') + .pipe( + getFirstSucceededRemoteDataPayload() + ) + .subscribe((config) => { + this.downloadZipMinFileCount.next(Number(config.values[0])); + }); + + this.configurationService.findByPropertyName('download.all.limit.max.file.size') + .pipe( + getFirstSucceededRemoteDataPayload() + ) + .subscribe((config) => { + this.downloadZipMaxFileSize.next(Number(config.values[0])); + }); + + this.configurationService.findByPropertyName('download.all.alert.min.file.size') + .pipe( + getFirstSucceededRemoteDataPayload() + ) + .subscribe((config) => { + this.downloadZipMinFileSize.next(Number(config.values[0])); + }); } } From fe2711962e949c42203c423c574f34a25f6cfaa8 Mon Sep 17 00:00:00 2001 From: milanmajchrak Date: Fri, 19 Apr 2024 14:41:18 +0200 Subject: [PATCH 2/2] Updated test because of new updates --- .../clarin-files-section.component.spec.ts | 26 +++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) diff --git a/src/app/item-page/clarin-files-section/clarin-files-section.component.spec.ts b/src/app/item-page/clarin-files-section/clarin-files-section.component.spec.ts index 10bf2998ac2..f5e795d4d0e 100644 --- a/src/app/item-page/clarin-files-section/clarin-files-section.component.spec.ts +++ b/src/app/item-page/clarin-files-section/clarin-files-section.component.spec.ts @@ -9,7 +9,11 @@ import { TranslateModule } from '@ngx-translate/core'; import { MetadataBitstream } from '../../core/metadata/metadata-bitstream.model'; import { ResourceType } from '../../core/shared/resource-type'; import { HALLink } from '../../core/shared/hal-link.model'; -import { BehaviorSubject , of} from 'rxjs'; +import { BehaviorSubject , of } from 'rxjs'; +import { ConfigurationDataService } from '../../core/data/configuration-data.service'; +import { Item } from '../../core/shared/item.model'; +import { createSuccessfulRemoteDataObject$ } from '../../shared/remote-data.utils'; +import { createPaginatedList } from '../../shared/testing/utils.test'; describe('ClarinFilesSectionComponent', () => { let component: ClarinFilesSectionComponent; @@ -38,6 +42,22 @@ describe('ClarinFilesSectionComponent', () => { const metadataBitstreams: MetadataBitstream[] = [metadatabitstream]; const bitstreamStream = new BehaviorSubject(metadataBitstreams); + const mockItem: Item = Object.assign(new Item(), { + bundles: createSuccessfulRemoteDataObject$(createPaginatedList([])), + metadata: { + 'local.files.size': [ + { + language: 'en_US', + value: '123' + } + ] + } + }); + + const configurationServiceSpy = jasmine.createSpyObj('configurationService', { + findByPropertyName: of('123456'), + }); + beforeEach(async () => { mockRegistryService = jasmine.createSpyObj('RegistryService', { 'getMetadataBitstream': of(bitstreamStream) @@ -53,13 +73,15 @@ describe('ClarinFilesSectionComponent', () => { providers: [ { provide: RegistryService, useValue: mockRegistryService }, { provide: Router, useValue: new RouterMock() }, - { provide: HALEndpointService, useValue: halService } + { provide: HALEndpointService, useValue: halService }, + { provide: ConfigurationDataService, useValue: configurationServiceSpy }, ], }) .compileComponents(); fixture = TestBed.createComponent(ClarinFilesSectionComponent); component = fixture.componentInstance; + component.item = mockItem; fixture.detectChanges(); });