Merge pull request #1266 from 4Science/submission-bitstream-download

fix bitstream download during submission
This commit is contained in:
Tim Donohue
2021-07-02 14:19:36 -05:00
committed by GitHub
5 changed files with 26 additions and 42 deletions

View File

@@ -1,5 +1,6 @@
<a [href]="bitstreamPath"><ng-container *ngTemplateOutlet="content"></ng-container></a>
<a [href]="bitstreamPath" [target]="isBlank ? '_blank': '_self'" [ngClass]="cssClasses">
<ng-container *ngTemplateOutlet="content"></ng-container>
</a>
<ng-template #content>
<ng-content></ng-content>

View File

@@ -18,6 +18,17 @@ export class FileDownloadLinkComponent implements OnInit {
* Optional bitstream instead of href and file name
*/
@Input() bitstream: Bitstream;
/**
* Additional css classes to apply to link
*/
@Input() cssClasses = '';
/**
* A boolean representing if link is shown in same tab or in a new one.
*/
@Input() isBlank = false;
bitstreamPath: string;
ngOnInit() {

View File

@@ -10,8 +10,9 @@
</div>
<div class="float-right w-15" [class.sticky-buttons]="!readMode">
<ng-container *ngIf="readMode">
<button class="btn btn-link" (click)="downloadBitstreamFile(); $event.stopPropagation()"><i class="fa fa-download fa-2x text-normal" aria-hidden="true"></i></button>
<!--<a href="{{fileData.url}}" title="Download file" target="_blank"><i class="fa fa-download text-normal mr-3" aria-hidden="true"></i></a>-->
<ds-file-download-link [cssClasses]="'btn btn-link'" [isBlank]="true" [bitstream]="getBitstream()">
<i class="fa fa-download fa-2x text-normal" aria-hidden="true"></i>
</ds-file-download-link>
<button class="btn btn-link" (click)="$event.preventDefault();switchMode();"><i class="fa fa-edit fa-2x text-normal"></i></button>
<button class="btn btn-link"
title="{{ 'submission.sections.upload.delete.confirm.title' | translate }}"

View File

@@ -6,7 +6,6 @@ import { CommonModule } from '@angular/common';
import { of as observableOf } from 'rxjs';
import { TranslateModule } from '@ngx-translate/core';
import { FileService } from '../../../../core/shared/file.service';
import { FormService } from '../../../../shared/form/form.service';
import { getMockFormService } from '../../../../shared/mocks/form-service.mock';
import { HALEndpointService } from '../../../../core/shared/hal-endpoint.service';
@@ -19,7 +18,6 @@ import { SubmissionSectionUploadFileComponent } from './section-upload-file.comp
import { SubmissionServiceStub } from '../../../../shared/testing/submission-service.stub';
import {
mockFileFormData,
mockGroup,
mockSubmissionCollectionId,
mockSubmissionId,
mockSubmissionObject,
@@ -35,17 +33,9 @@ import { POLICY_DEFAULT_WITH_LIST } from '../section-upload.component';
import { JsonPatchOperationPathCombiner } from '../../../../core/json-patch/builder/json-patch-operation-path-combiner';
import { getMockSectionUploadService } from '../../../../shared/mocks/section-upload.service.mock';
import { FormFieldMetadataValueObject } from '../../../../shared/form/builder/models/form-field-metadata-value.model';
import { Group } from '../../../../core/eperson/models/group.model';
import { SubmissionSectionUploadFileEditComponent } from './edit/section-upload-file-edit.component';
import { FormBuilderService } from '../../../../shared/form/builder/form-builder.service';
function getMockFileService(): FileService {
return jasmine.createSpyObj('FileService', {
retrieveFileDownloadLink: jasmine.createSpy('retrieveFileDownloadLink'),
getFileNameFromResponseContentDisposition: jasmine.createSpy('getFileNameFromResponseContentDisposition')
});
}
describe('SubmissionSectionUploadFileComponent test suite', () => {
let comp: SubmissionSectionUploadFileComponent;
@@ -53,7 +43,6 @@ describe('SubmissionSectionUploadFileComponent test suite', () => {
let fixture: ComponentFixture<SubmissionSectionUploadFileComponent>;
let submissionServiceStub: SubmissionServiceStub;
let uploadService: any;
let fileService: any;
let formService: any;
let halService: any;
let operationsBuilder: any;
@@ -64,10 +53,6 @@ describe('SubmissionSectionUploadFileComponent test suite', () => {
const sectionId = 'upload';
const collectionId = mockSubmissionCollectionId;
const availableAccessConditionOptions = mockUploadConfigResponse.accessConditionOptions;
const availableGroupsMap: Map<string, Group[]> = new Map([
[mockUploadConfigResponse.accessConditionOptions[1].name, [mockGroup as any]],
[mockUploadConfigResponse.accessConditionOptions[2].name, [mockGroup as any]],
]);
const collectionPolicyType = POLICY_DEFAULT_WITH_LIST;
const fileIndex = '0';
const fileName = '123456-test-upload.jpg';
@@ -95,7 +80,6 @@ describe('SubmissionSectionUploadFileComponent test suite', () => {
TestComponent
],
providers: [
{ provide: FileService, useValue: getMockFileService() },
{ provide: FormService, useValue: getMockFormService() },
{ provide: HALEndpointService, useValue: new HALEndpointServiceStub('workspaceitems') },
{ provide: JsonPatchOperationsBuilder, useValue: jsonPatchOpBuilder },
@@ -152,7 +136,6 @@ describe('SubmissionSectionUploadFileComponent test suite', () => {
compAsAny = comp;
submissionServiceStub = TestBed.inject(SubmissionService as any);
uploadService = TestBed.inject(SectionUploadService);
fileService = TestBed.inject(FileService);
formService = TestBed.inject(FormService);
halService = TestBed.inject(HALEndpointService);
operationsBuilder = TestBed.inject(JsonPatchOperationsBuilder);
@@ -226,15 +209,6 @@ describe('SubmissionSectionUploadFileComponent test suite', () => {
pathCombiner.subRootElement);
});
it('should download Bitstream File properly', fakeAsync(() => {
comp.fileData = fileData;
comp.downloadBitstreamFile();
tick();
expect(fileService.retrieveFileDownloadLink).toHaveBeenCalled();
}));
it('should save Bitstream File data properly when form is valid', fakeAsync(() => {
compAsAny.fileEditComp = TestBed.inject(SubmissionSectionUploadFileEditComponent);
compAsAny.fileEditComp.formRef = {formGroup: null};

View File

@@ -1,7 +1,7 @@
import { ChangeDetectorRef, Component, Input, OnChanges, OnInit, ViewChild } from '@angular/core';
import { BehaviorSubject, Subscription } from 'rxjs';
import { filter, first, mergeMap, take } from 'rxjs/operators';
import { filter, mergeMap, take } from 'rxjs/operators';
import { DynamicFormControlModel, } from '@ng-dynamic-forms/core';
import { NgbModal } from '@ng-bootstrap/ng-bootstrap';
@@ -14,12 +14,12 @@ import { WorkspaceitemSectionUploadFileObject } from '../../../../core/submissio
import { SubmissionFormsModel } from '../../../../core/config/models/config-submission-forms.model';
import { dateToISOFormat } from '../../../../shared/date.util';
import { SubmissionService } from '../../../submission.service';
import { FileService } from '../../../../core/shared/file.service';
import { HALEndpointService } from '../../../../core/shared/hal-endpoint.service';
import { SubmissionJsonPatchOperationsService } from '../../../../core/submission/submission-json-patch-operations.service';
import { SubmissionObject } from '../../../../core/submission/models/submission-object.model';
import { WorkspaceitemSectionUploadObject } from '../../../../core/submission/models/workspaceitem-section-upload.model';
import { SubmissionSectionUploadFileEditComponent } from './edit/section-upload-file-edit.component';
import { Bitstream } from '../../../../core/shared/bitstream.model';
/**
* This component represents a single bitstream contained in the submission
@@ -139,7 +139,6 @@ export class SubmissionSectionUploadFileComponent implements OnChanges, OnInit {
* Initialize instance variables
*
* @param {ChangeDetectorRef} cdr
* @param {FileService} fileService
* @param {FormService} formService
* @param {HALEndpointService} halService
* @param {NgbModal} modalService
@@ -149,7 +148,6 @@ export class SubmissionSectionUploadFileComponent implements OnChanges, OnInit {
* @param {SectionUploadService} uploadService
*/
constructor(private cdr: ChangeDetectorRef,
private fileService: FileService,
private formService: FormService,
private halService: HALEndpointService,
private modalService: NgbModal,
@@ -217,15 +215,14 @@ export class SubmissionSectionUploadFileComponent implements OnChanges, OnInit {
}
/**
* Perform bitstream download
* Build a Bitstream object by the current file uuid
*
* @return Bitstream object
*/
public downloadBitstreamFile() {
this.halService.getEndpoint('bitstreams').pipe(
first())
.subscribe((url) => {
const fileUrl = `${url}/${this.fileData.uuid}/content`;
this.fileService.retrieveFileDownloadLink(fileUrl);
});
public getBitstream(): Bitstream {
return Object.assign(new Bitstream(), {
uuid: this.fileData.uuid
});
}
/**