Use ds-file-download-link component to allow bitstream download during submission

This commit is contained in:
Giuseppe Digilio
2021-07-02 13:46:17 +02:00
parent 0ee451f3d3
commit badf901361
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-template #content>
<ng-content></ng-content> <ng-content></ng-content>

View File

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

View File

@@ -10,8 +10,9 @@
</div> </div>
<div class="float-right w-15" [class.sticky-buttons]="!readMode"> <div class="float-right w-15" [class.sticky-buttons]="!readMode">
<ng-container *ngIf="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> <ds-file-download-link [cssClasses]="'btn btn-link'" [isBlank]="true" [bitstream]="getBitstream()">
<!--<a href="{{fileData.url}}" title="Download file" target="_blank"><i class="fa fa-download text-normal mr-3" aria-hidden="true"></i></a>--> <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" (click)="$event.preventDefault();switchMode();"><i class="fa fa-edit fa-2x text-normal"></i></button>
<button class="btn btn-link" <button class="btn btn-link"
title="{{ 'submission.sections.upload.delete.confirm.title' | translate }}" 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 { of as observableOf } from 'rxjs';
import { TranslateModule } from '@ngx-translate/core'; import { TranslateModule } from '@ngx-translate/core';
import { FileService } from '../../../../core/shared/file.service';
import { FormService } from '../../../../shared/form/form.service'; import { FormService } from '../../../../shared/form/form.service';
import { getMockFormService } from '../../../../shared/mocks/form-service.mock'; import { getMockFormService } from '../../../../shared/mocks/form-service.mock';
import { HALEndpointService } from '../../../../core/shared/hal-endpoint.service'; 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 { SubmissionServiceStub } from '../../../../shared/testing/submission-service.stub';
import { import {
mockFileFormData, mockFileFormData,
mockGroup,
mockSubmissionCollectionId, mockSubmissionCollectionId,
mockSubmissionId, mockSubmissionId,
mockSubmissionObject, 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 { JsonPatchOperationPathCombiner } from '../../../../core/json-patch/builder/json-patch-operation-path-combiner';
import { getMockSectionUploadService } from '../../../../shared/mocks/section-upload.service.mock'; import { getMockSectionUploadService } from '../../../../shared/mocks/section-upload.service.mock';
import { FormFieldMetadataValueObject } from '../../../../shared/form/builder/models/form-field-metadata-value.model'; 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 { SubmissionSectionUploadFileEditComponent } from './edit/section-upload-file-edit.component';
import { FormBuilderService } from '../../../../shared/form/builder/form-builder.service'; 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', () => { describe('SubmissionSectionUploadFileComponent test suite', () => {
let comp: SubmissionSectionUploadFileComponent; let comp: SubmissionSectionUploadFileComponent;
@@ -53,7 +43,6 @@ describe('SubmissionSectionUploadFileComponent test suite', () => {
let fixture: ComponentFixture<SubmissionSectionUploadFileComponent>; let fixture: ComponentFixture<SubmissionSectionUploadFileComponent>;
let submissionServiceStub: SubmissionServiceStub; let submissionServiceStub: SubmissionServiceStub;
let uploadService: any; let uploadService: any;
let fileService: any;
let formService: any; let formService: any;
let halService: any; let halService: any;
let operationsBuilder: any; let operationsBuilder: any;
@@ -64,10 +53,6 @@ describe('SubmissionSectionUploadFileComponent test suite', () => {
const sectionId = 'upload'; const sectionId = 'upload';
const collectionId = mockSubmissionCollectionId; const collectionId = mockSubmissionCollectionId;
const availableAccessConditionOptions = mockUploadConfigResponse.accessConditionOptions; 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 collectionPolicyType = POLICY_DEFAULT_WITH_LIST;
const fileIndex = '0'; const fileIndex = '0';
const fileName = '123456-test-upload.jpg'; const fileName = '123456-test-upload.jpg';
@@ -95,7 +80,6 @@ describe('SubmissionSectionUploadFileComponent test suite', () => {
TestComponent TestComponent
], ],
providers: [ providers: [
{ provide: FileService, useValue: getMockFileService() },
{ provide: FormService, useValue: getMockFormService() }, { provide: FormService, useValue: getMockFormService() },
{ provide: HALEndpointService, useValue: new HALEndpointServiceStub('workspaceitems') }, { provide: HALEndpointService, useValue: new HALEndpointServiceStub('workspaceitems') },
{ provide: JsonPatchOperationsBuilder, useValue: jsonPatchOpBuilder }, { provide: JsonPatchOperationsBuilder, useValue: jsonPatchOpBuilder },
@@ -152,7 +136,6 @@ describe('SubmissionSectionUploadFileComponent test suite', () => {
compAsAny = comp; compAsAny = comp;
submissionServiceStub = TestBed.inject(SubmissionService as any); submissionServiceStub = TestBed.inject(SubmissionService as any);
uploadService = TestBed.inject(SectionUploadService); uploadService = TestBed.inject(SectionUploadService);
fileService = TestBed.inject(FileService);
formService = TestBed.inject(FormService); formService = TestBed.inject(FormService);
halService = TestBed.inject(HALEndpointService); halService = TestBed.inject(HALEndpointService);
operationsBuilder = TestBed.inject(JsonPatchOperationsBuilder); operationsBuilder = TestBed.inject(JsonPatchOperationsBuilder);
@@ -226,15 +209,6 @@ describe('SubmissionSectionUploadFileComponent test suite', () => {
pathCombiner.subRootElement); 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(() => { it('should save Bitstream File data properly when form is valid', fakeAsync(() => {
compAsAny.fileEditComp = TestBed.inject(SubmissionSectionUploadFileEditComponent); compAsAny.fileEditComp = TestBed.inject(SubmissionSectionUploadFileEditComponent);
compAsAny.fileEditComp.formRef = {formGroup: null}; compAsAny.fileEditComp.formRef = {formGroup: null};

View File

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