From 0cc130a8b90a668806438c688bebe6642ddf6fff Mon Sep 17 00:00:00 2001
From: Giuseppe Digilio <giuseppe.digilio@4science.it>
Date: Tue, 20 Aug 2019 11:14:15 +0200
Subject: [PATCH] Fixed bitstream download in mydspace page

---
 .../item-detail-preview.component.html        |  4 ++--
 .../item-detail-preview.component.spec.ts     | 14 +++++++++++
 .../item-detail-preview.component.ts          | 24 +++++++++++++++++++
 3 files changed, 40 insertions(+), 2 deletions(-)

diff --git a/src/app/shared/object-detail/my-dspace-result-detail-element/item-detail-preview/item-detail-preview.component.html b/src/app/shared/object-detail/my-dspace-result-detail-element/item-detail-preview/item-detail-preview.component.html
index 04e128c49a..ab2c24c435 100644
--- a/src/app/shared/object-detail/my-dspace-result-detail-element/item-detail-preview/item-detail-preview.component.html
+++ b/src/app/shared/object-detail/my-dspace-result-detail-element/item-detail-preview/item-detail-preview.component.html
@@ -15,11 +15,11 @@
         <ng-container *ngVar="(bitstreams$ | async) as bitstreams">
           <ds-metadata-field-wrapper [label]="('item.page.files' | translate)">
             <div *ngIf="bitstreams?.length > 0" class="file-section">
-              <a *ngFor="let file of bitstreams; let last=last;" [href]="file?.content" target="_blank" [download]="file?.name">
+              <button class="btn btn-link" *ngFor="let file of bitstreams; let last=last;" (click)="downloadBitstreamFile(file?.uuid)">
                 <span>{{file?.name}}</span>
                 <span>({{(file?.sizeBytes) | dsFileSize }})</span>
                 <span *ngIf="!last" innerHTML="{{separator}}"></span>
-              </a>
+              </button>
             </div>
             <ng-container *ngIf="bitstreams?.length === 0">
               <span class="text-muted">{{('mydspace.results.no-files' | translate)}}</span>
diff --git a/src/app/shared/object-detail/my-dspace-result-detail-element/item-detail-preview/item-detail-preview.component.spec.ts b/src/app/shared/object-detail/my-dspace-result-detail-element/item-detail-preview/item-detail-preview.component.spec.ts
index d0af614a6c..182c5eca39 100644
--- a/src/app/shared/object-detail/my-dspace-result-detail-element/item-detail-preview/item-detail-preview.component.spec.ts
+++ b/src/app/shared/object-detail/my-dspace-result-detail-element/item-detail-preview/item-detail-preview.component.spec.ts
@@ -12,6 +12,16 @@ import { MockTranslateLoader } from '../../../mocks/mock-translate-loader';
 import { ItemDetailPreviewFieldComponent } from './item-detail-preview-field/item-detail-preview-field.component';
 import { FileSizePipe } from '../../../utils/file-size-pipe';
 import { VarDirective } from '../../../utils/var.directive';
+import { FileService } from '../../../../core/shared/file.service';
+import { HALEndpointService } from '../../../../core/shared/hal-endpoint.service';
+import { HALEndpointServiceStub } from '../../../testing/hal-endpoint-service-stub';
+
+function getMockFileService(): FileService {
+  return jasmine.createSpyObj('FileService', {
+    downloadFile: jasmine.createSpy('downloadFile'),
+    getFileNameFromResponseContentDisposition: jasmine.createSpy('getFileNameFromResponseContentDisposition')
+  });
+}
 
 let component: ItemDetailPreviewComponent;
 let fixture: ComponentFixture<ItemDetailPreviewComponent>;
@@ -59,6 +69,10 @@ describe('ItemDetailPreviewComponent', () => {
         }),
       ],
       declarations: [ItemDetailPreviewComponent, ItemDetailPreviewFieldComponent, TruncatePipe, FileSizePipe, VarDirective],
+      providers: [
+        { provide: FileService, useValue: getMockFileService() },
+        { provide: HALEndpointService, useValue: new HALEndpointServiceStub('workspaceitems') }
+      ],
       schemas: [NO_ERRORS_SCHEMA]
     }).overrideComponent(ItemDetailPreviewComponent, {
       set: { changeDetection: ChangeDetectionStrategy.Default }
diff --git a/src/app/shared/object-detail/my-dspace-result-detail-element/item-detail-preview/item-detail-preview.component.ts b/src/app/shared/object-detail/my-dspace-result-detail-element/item-detail-preview/item-detail-preview.component.ts
index d26bfc4589..fa15c71168 100644
--- a/src/app/shared/object-detail/my-dspace-result-detail-element/item-detail-preview/item-detail-preview.component.ts
+++ b/src/app/shared/object-detail/my-dspace-result-detail-element/item-detail-preview/item-detail-preview.component.ts
@@ -1,12 +1,15 @@
 import { Component, Input } from '@angular/core';
 
 import { Observable } from 'rxjs';
+import { first } from 'rxjs/operators';
 
 import { Item } from '../../../../core/shared/item.model';
 import { MyDspaceItemStatusType } from '../../../object-collection/shared/mydspace-item-status/my-dspace-item-status-type';
 import { fadeInOut } from '../../../animations/fade';
 import { Bitstream } from '../../../../core/shared/bitstream.model';
 import { MyDSpaceResult } from '../../../../+my-dspace-page/my-dspace-result.model';
+import { FileService } from '../../../../core/shared/file.service';
+import { HALEndpointService } from '../../../../core/shared/hal-endpoint.service';
 
 /**
  * This component show metadata for the given item object in the detail view.
@@ -54,6 +57,16 @@ export class ItemDetailPreviewComponent {
    */
   public thumbnail$: Observable<Bitstream>;
 
+  /**
+   * Initialize instance variables
+   *
+   * @param {FileService} fileService
+   * @param {HALEndpointService} halService
+   */
+  constructor(private fileService: FileService,
+              private halService: HALEndpointService) {
+  }
+
   /**
    * Initialize all instance variables
    */
@@ -62,4 +75,15 @@ export class ItemDetailPreviewComponent {
     this.bitstreams$ = this.item.getFiles();
   }
 
+  /**
+   * Perform bitstream download
+   */
+  public downloadBitstreamFile(uuid: string) {
+    this.halService.getEndpoint('bitstreams').pipe(
+      first())
+      .subscribe((url) => {
+        const fileUrl = `${url}/${uuid}/content`;
+        this.fileService.downloadFile(fileUrl);
+      });
+  }
 }
-- 
GitLab