mirror of
https://github.com/DSpace/dspace-angular.git
synced 2025-10-07 10:04:11 +00:00
Use ds-file-download-link component to allow bitstream download during submission
This commit is contained in:
@@ -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>
|
||||||
|
@@ -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() {
|
||||||
|
@@ -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 }}"
|
||||||
|
@@ -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};
|
||||||
|
@@ -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);
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
Reference in New Issue
Block a user