Skip to content

Commit 361f6ef

Browse files
FrancescoMolinarosteph-ieffam
authored andcommitted
Merged in DSC-1634-porting-bitstream-badge (pull request DSpace#1558)
[DSC-1634] port file type badge Approved-by: Stefano Maffei
2 parents c2cbb5c + 959abe5 commit 361f6ef

4 files changed

Lines changed: 75 additions & 24 deletions

File tree

src/app/submission/sections/upload/accessConditions/submission-section-upload-access-conditions.component.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import { find } from 'rxjs/operators';
44

55
import { GroupDataService } from '../../../../core/eperson/group-data.service';
66
import { ResourcePolicy } from '../../../../core/resource-policy/models/resource-policy.model';
7-
import { isEmpty } from '../../../../shared/empty.util';
7+
import { hasValue, isEmpty } from '../../../../shared/empty.util';
88
import { Group } from '../../../../core/eperson/models/group.model';
99
import { RemoteData } from '../../../../core/data/remote-data';
1010
import { DSONameService } from '../../../../core/breadcrumbs/dso-name.service';
@@ -41,7 +41,7 @@ export class SubmissionSectionUploadAccessConditionsComponent implements OnInit
4141
*/
4242
ngOnInit() {
4343
this.accessConditions.forEach((accessCondition: ResourcePolicy) => {
44-
if (isEmpty(accessCondition.name)) {
44+
if (isEmpty(accessCondition.name) && hasValue(accessCondition._links?.group.href)) {
4545
this.groupService.findByHref(accessCondition._links.group.href).pipe(
4646
find((rd: RemoteData<Group>) => !rd.isResponsePending && rd.hasSucceeded))
4747
.subscribe((rd: RemoteData<Group>) => {

src/app/submission/sections/upload/file/section-upload-file.component.html

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,13 @@
11
<ng-container *ngIf="fileData">
22
<div class="row">
33
<div class="col-md-12">
4-
<div class="float-left w-75">
5-
<h3>{{fileName}} <span class="text-muted">({{fileData?.sizeBytes | dsFileSize}})</span></h3>
4+
<div class="float-left ml-3 mb-2 badge badge-pill bg-primary text-white" *ngIf="(vocabularyFileType$ | async)">
5+
{{(vocabularyFileType$ | async)}}
6+
</div>
7+
</div>
8+
<div class="col-md-12">
9+
<div class="float-left w-75 pl-3">
10+
<h4>{{fileName}} <span class="text-secondary">({{fileData?.sizeBytes | dsFileSize}})</span></h4>
611
</div>
712
<div *ngIf="!readOnly" class="float-right w-15">
813
<ng-container>

src/app/submission/sections/upload/file/section-upload-file.component.spec.ts

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import { ComponentFixture, inject, TestBed, waitForAsync } from '@angular/core/t
33
import { BrowserModule, By } from '@angular/platform-browser';
44
import { CommonModule } from '@angular/common';
55

6-
import { of, of as observableOf } from 'rxjs';
6+
import { EMPTY, of, of as observableOf } from 'rxjs';
77
import { TranslateModule } from '@ngx-translate/core';
88

99
import { FormService } from '../../../../shared/form/form.service';
@@ -32,6 +32,7 @@ import { JsonPatchOperationPathCombiner } from '../../../../core/json-patch/buil
3232
import { getMockSectionUploadService } from '../../../../shared/mocks/section-upload.service.mock';
3333
import { SubmissionSectionUploadFileEditComponent } from './edit/section-upload-file-edit.component';
3434
import { FormBuilderService } from '../../../../shared/form/builder/form-builder.service';
35+
import { VocabularyService } from '../../../../core/submission/vocabularies/vocabulary.service';
3536

3637
const configMetadataFormMock = {
3738
rows: [{
@@ -56,6 +57,7 @@ describe('SubmissionSectionUploadFileComponent test suite', () => {
5657
let operationsBuilder: any;
5758
let operationsService: any;
5859

60+
5961
const submissionJsonPatchOperationsServiceStub = new SubmissionJsonPatchOperationsServiceStub();
6062
const submissionId = mockSubmissionId;
6163
const sectionId = 'upload';
@@ -74,6 +76,12 @@ describe('SubmissionSectionUploadFileComponent test suite', () => {
7476
remove: jasmine.createSpy('remove'),
7577
});
7678

79+
const vocabularyServiceSpy =
80+
jasmine.createSpyObj(
81+
'vocabularyService',
82+
{ getPublicVocabularyEntryByValue: EMPTY, getPublicVocabularyEntryByID: EMPTY }
83+
);
84+
7785
beforeEach(waitForAsync(() => {
7886
TestBed.configureTestingModule({
7987
imports: [
@@ -98,7 +106,8 @@ describe('SubmissionSectionUploadFileComponent test suite', () => {
98106
NgbModal,
99107
SubmissionSectionUploadFileComponent,
100108
SubmissionSectionUploadFileEditComponent,
101-
FormBuilderService
109+
FormBuilderService,
110+
{ provide: VocabularyService, useValue: vocabularyServiceSpy },
102111
],
103112
schemas: [NO_ERRORS_SCHEMA]
104113
}).compileComponents().then();

src/app/submission/sections/upload/file/section-upload-file.component.ts

Lines changed: 55 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,16 @@
11
import {
2-
ChangeDetectorRef,
3-
Component,
4-
Input,
5-
OnChanges,
6-
OnDestroy,
7-
OnInit,
8-
SimpleChanges,
9-
ViewChild
2+
ChangeDetectorRef,
3+
Component,
4+
Input,
5+
OnChanges,
6+
OnDestroy,
7+
OnInit,
8+
SimpleChanges,
9+
ViewChild
1010
} from '@angular/core';
1111

12-
import { BehaviorSubject, Subscription } from 'rxjs';
13-
import { filter } from 'rxjs/operators';
12+
import { BehaviorSubject, Observable, of, Subscription } from 'rxjs';
13+
import { filter, map, take } from 'rxjs/operators';
1414
import { DynamicFormControlModel, } from '@ng-dynamic-forms/core';
1515
import { NgbModal } from '@ng-bootstrap/ng-bootstrap';
1616

@@ -27,6 +27,12 @@ import { SubmissionJsonPatchOperationsService } from '../../../../core/submissio
2727
import { SubmissionSectionUploadFileEditComponent } from './edit/section-upload-file-edit.component';
2828
import { Bitstream } from '../../../../core/shared/bitstream.model';
2929
import { NgbModalOptions } from '@ng-bootstrap/ng-bootstrap/modal/modal-config';
30+
import { VocabularyService } from '../../../../core/submission/vocabularies/vocabulary.service';
31+
import {
32+
getFirstCompletedRemoteData,
33+
getPaginatedListPayload,
34+
getRemoteDataPayload
35+
} from '../../../../core/shared/operators';
3036

3137
/**
3238
* This component represents a single bitstream contained in the submission
@@ -137,6 +143,12 @@ export class SubmissionSectionUploadFileComponent implements OnChanges, OnInit,
137143
*/
138144
public formModel: DynamicFormControlModel[];
139145

146+
147+
/**
148+
* The translated dc.type of the file
149+
*/
150+
public vocabularyFileType$: Observable<string>;
151+
140152
/**
141153
* A boolean representing if a submission delete operation is pending
142154
* @type {BehaviorSubject<boolean>}
@@ -172,6 +184,7 @@ export class SubmissionSectionUploadFileComponent implements OnChanges, OnInit,
172184
* @param {SubmissionJsonPatchOperationsService} operationsService
173185
* @param {SubmissionService} submissionService
174186
* @param {SectionUploadService} uploadService
187+
* @param vocabularyService
175188
*/
176189
constructor(
177190
private cdr: ChangeDetectorRef,
@@ -182,6 +195,7 @@ export class SubmissionSectionUploadFileComponent implements OnChanges, OnInit,
182195
private operationsService: SubmissionJsonPatchOperationsService,
183196
private submissionService: SubmissionService,
184197
private uploadService: SectionUploadService,
198+
private vocabularyService: VocabularyService,
185199
) {
186200
this.readMode = true;
187201
}
@@ -197,9 +211,17 @@ export class SubmissionSectionUploadFileComponent implements OnChanges, OnInit,
197211
.getFileData(this.submissionId, this.sectionId, this.fileId)
198212
.pipe(filter((bitstream) => isNotUndefined(bitstream)))
199213
.subscribe((bitstream) => {
200-
this.fileData = bitstream;
201-
}
202-
)
214+
this.fileData = bitstream;
215+
const fileType = this.fileData.metadata['dc.type']?.map(data => data.value)[0];
216+
this.vocabularyFileType$ = !hasValue(fileType) ? of(null) : this.vocabularyService.getPublicVocabularyEntryByValue(this.getControlledVocabulary(this.configMetadataForm), fileType).pipe(
217+
getFirstCompletedRemoteData(),
218+
getRemoteDataPayload(),
219+
getPaginatedListPayload(),
220+
map((res) => res?.length > 0 ? res[0] : null),
221+
map((res) => res?.display ?? res?.value),
222+
take(1)
223+
);
224+
})
203225
);
204226
}
205227
}
@@ -272,12 +294,12 @@ export class SubmissionSectionUploadFileComponent implements OnChanges, OnInit,
272294

273295
protected loadFormMetadata() {
274296
this.configMetadataForm.rows.forEach((row) => {
275-
row.fields.forEach((field) => {
276-
field.selectableMetadata.forEach((metadatum) => {
277-
this.formMetadata.push(metadatum.metadata);
297+
row.fields.forEach((field) => {
298+
field.selectableMetadata.forEach((metadatum) => {
299+
this.formMetadata.push(metadatum.metadata);
300+
});
278301
});
279-
});
280-
}
302+
}
281303
);
282304
}
283305

@@ -297,4 +319,19 @@ export class SubmissionSectionUploadFileComponent implements OnChanges, OnInit,
297319
}));
298320
}
299321

322+
/**
323+
* Retrieve vocabulary key for dc.type
324+
* @param model
325+
* @private
326+
*/
327+
private getControlledVocabulary(model: SubmissionFormsModel): string {
328+
return model.rows.filter(row =>
329+
hasValue(row.fields) &&
330+
hasValue(row.fields[0]) &&
331+
hasValue(row.fields[0].selectableMetadata) &&
332+
hasValue(row.fields[0].selectableMetadata[0]) &&
333+
row.fields[0].selectableMetadata[0].metadata === 'dc.type'
334+
).map((filteredRow) => filteredRow.fields[0].selectableMetadata[0].controlledVocabulary)[0];
335+
}
336+
300337
}

0 commit comments

Comments
 (0)