Skip to content

Commit aa4d56e

Browse files
Made it possible to only enable video media viewer
Also: - Filtered out non-supported media file types from the mediaViewers mediaList - Fixed thumbnails not displaying with 0 ORIGINAL bitstreams
1 parent e4f483c commit aa4d56e

9 files changed

Lines changed: 89 additions & 90 deletions

File tree

src/app/item-page/media-viewer/media-viewer-image/media-viewer-image.component.ts

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { Component, Input, OnInit } from '@angular/core';
1+
import { Component, Input, OnChanges, OnInit, SimpleChanges } from '@angular/core';
22
import { NgxGalleryImage, NgxGalleryOptions } from '@kolkov/ngx-gallery';
33
import { MediaViewerItem } from '../../../core/shared/media-viewer-item.model';
44
import { NgxGalleryAnimation } from '@kolkov/ngx-gallery';
@@ -13,7 +13,7 @@ import { AuthService } from '../../../core/auth/auth.service';
1313
templateUrl: './media-viewer-image.component.html',
1414
styleUrls: ['./media-viewer-image.component.scss'],
1515
})
16-
export class MediaViewerImageComponent implements OnInit {
16+
export class MediaViewerImageComponent implements OnChanges, OnInit {
1717
@Input() images: MediaViewerItem[];
1818
@Input() preview?: boolean;
1919
@Input() image?: string;
@@ -30,11 +30,9 @@ export class MediaViewerImageComponent implements OnInit {
3030

3131
constructor(private authService: AuthService) {}
3232

33-
/**
34-
* Thi method sets up the gallery settings and data
35-
*/
36-
ngOnInit(): void {
37-
this.isAuthenticated$ = this.authService.isAuthenticated();
33+
ngOnChanges(changes: SimpleChanges): void {
34+
this.image = changes.image.currentValue;
35+
this.preview = changes.preview.currentValue;
3836
this.galleryOptions = [
3937
{
4038
preview: this.preview !== undefined ? this.preview : true,
@@ -50,7 +48,6 @@ export class MediaViewerImageComponent implements OnInit {
5048
previewFullscreen: true,
5149
},
5250
];
53-
5451
if (this.image) {
5552
this.galleryImages = [
5653
{
@@ -64,6 +61,10 @@ export class MediaViewerImageComponent implements OnInit {
6461
}
6562
}
6663

64+
ngOnInit(): void {
65+
this.isAuthenticated$ = this.authService.isAuthenticated();
66+
}
67+
6768
/**
6869
* This method convert an array of MediaViewerItem into NgxGalleryImage array
6970
* @param medias input NgxGalleryImage array

src/app/item-page/media-viewer/media-viewer-video/media-viewer-video.component.html

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,14 @@
11
<video
2-
#media
3-
[src]="filteredMedias[currentIndex].bitstream._links.content.href"
2+
[src]="medias[currentIndex].bitstream._links.content.href"
43
id="singleVideo"
54
[poster]="
6-
filteredMedias[currentIndex].thumbnail ||
7-
replacements[filteredMedias[currentIndex].format]
5+
medias[currentIndex].thumbnail ||
6+
replacements[medias[currentIndex].format]
87
"
98
preload="none"
109
controls
1110
></video>
12-
<div class="buttons" *ngIf="filteredMedias?.length > 1">
11+
<div class="buttons" *ngIf="medias?.length > 1">
1312
<button
1413
class="btn btn-primary previous"
1514
[disabled]="currentIndex === 0"
@@ -20,7 +19,7 @@
2019

2120
<button
2221
class="btn btn-primary next"
23-
[disabled]="currentIndex === filteredMedias.length - 1"
22+
[disabled]="currentIndex === medias.length - 1"
2423
(click)="nextMedia()"
2524
>
2625
{{ "media-viewer.next" | translate }}
@@ -36,7 +35,7 @@
3635
<div ngbDropdownMenu aria-labelledby="dropdownBasic1">
3736
<button
3837
ngbDropdownItem
39-
*ngFor="let item of filteredMedias; index as indexOfelement"
38+
*ngFor="let item of medias; index as indexOfelement"
4039
class="list-element"
4140
(click)="selectedMedia(indexOfelement)"
4241
>

src/app/item-page/media-viewer/media-viewer-video/media-viewer-video.component.spec.ts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,6 @@ describe('MediaViewerVideoComponent', () => {
8383
fixture = TestBed.createComponent(MediaViewerVideoComponent);
8484
component = fixture.componentInstance;
8585
component.medias = mockMediaViewerItem;
86-
component.filteredMedias = mockMediaViewerItem;
8786
fixture.detectChanges();
8887
});
8988

@@ -94,7 +93,6 @@ describe('MediaViewerVideoComponent', () => {
9493
describe('should show controller buttons when the having mode then one video', () => {
9594
beforeEach(() => {
9695
component.medias = mockMediaViewerItems;
97-
component.filteredMedias = mockMediaViewerItems;
9896
fixture.detectChanges();
9997
});
10098

src/app/item-page/media-viewer/media-viewer-video/media-viewer-video.component.ts

Lines changed: 6 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { Component, Input, OnInit } from '@angular/core';
1+
import { Component, Input } from '@angular/core';
22
import { MediaViewerItem } from '../../../core/shared/media-viewer-item.model';
33

44
/**
@@ -9,12 +9,11 @@ import { MediaViewerItem } from '../../../core/shared/media-viewer-item.model';
99
templateUrl: './media-viewer-video.component.html',
1010
styleUrls: ['./media-viewer-video.component.scss'],
1111
})
12-
export class MediaViewerVideoComponent implements OnInit {
12+
export class MediaViewerVideoComponent {
1313
@Input() medias: MediaViewerItem[];
1414

15-
filteredMedias: MediaViewerItem[];
15+
isCollapsed = false;
1616

17-
isCollapsed: boolean;
1817
currentIndex = 0;
1918

2019
replacements = {
@@ -24,30 +23,23 @@ export class MediaViewerVideoComponent implements OnInit {
2423

2524
replacementThumbnail: string;
2625

27-
ngOnInit() {
28-
this.isCollapsed = false;
29-
this.filteredMedias = this.medias.filter(
30-
(media) => media.format === 'audio' || media.format === 'video'
31-
);
32-
}
33-
3426
/**
35-
* This method sets the reviced index into currentIndex
27+
* This method sets the received index into currentIndex
3628
* @param index Selected index
3729
*/
3830
selectedMedia(index: number) {
3931
this.currentIndex = index;
4032
}
4133

4234
/**
43-
* This method increade the number of the currentIndex
35+
* This method increases the number of the currentIndex
4436
*/
4537
nextMedia() {
4638
this.currentIndex++;
4739
}
4840

4941
/**
50-
* This method decrese the number of the currentIndex
42+
* This method decreases the number of the currentIndex
5143
*/
5244
prevMedia() {
5345
this.currentIndex--;

src/app/item-page/media-viewer/media-viewer.component.html

Lines changed: 12 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -5,32 +5,20 @@
55
[showMessage]="false"
66
></ds-loading>
77
<div class="media-viewer" *ngIf="!isLoading">
8-
<ng-container *ngIf="mediaList.length > 0">
9-
<ng-container *ngIf="videoOptions">
10-
<ng-container
11-
*ngIf="
12-
mediaList[0]?.format === 'video' || mediaList[0]?.format === 'audio'
13-
"
14-
>
15-
<ds-media-viewer-video [medias]="mediaList"></ds-media-viewer-video>
8+
<ng-container *ngIf="mediaList.length > 0; else showThumbnail">
9+
<ng-container *ngVar="mediaOptions.video && ['audio', 'video'].includes(mediaList[0]?.format) as showVideo">
10+
<ng-container *ngVar="mediaOptions.image && mediaList[0]?.format === 'image' as showImage">
11+
<ds-media-viewer-video *ngIf="showVideo" [medias]="mediaList"></ds-media-viewer-video>
12+
<ds-media-viewer-image *ngIf="showImage" [images]="mediaList"></ds-media-viewer-image>
13+
<ng-container *ngIf="showImage || showVideo; else showThumbnail"></ng-container>
1614
</ng-container>
1715
</ng-container>
18-
<ng-container *ngIf="mediaList[0]?.format === 'image'">
19-
<ds-media-viewer-image [images]="mediaList"></ds-media-viewer-image>
20-
</ng-container>
21-
</ng-container>
22-
<ng-container
23-
*ngIf="
24-
((mediaList[0]?.format !== 'image') &&
25-
(!videoOptions || mediaList[0]?.format !== 'video') &&
26-
(!videoOptions || mediaList[0]?.format !== 'audio')) ||
27-
mediaList.length === 0
28-
"
29-
>
30-
<ds-media-viewer-image
31-
[image]="mediaList[0]?.thumbnail || thumbnailPlaceholder"
32-
[preview]="false"
33-
></ds-media-viewer-image>
3416
</ng-container>
3517
</div>
18+
<ng-template #showThumbnail>
19+
<ds-media-viewer-image
20+
[image]="(thumbnailsRD$ | async)?.payload?.page[0]?._links.content.href || thumbnailPlaceholder"
21+
[preview]="false"
22+
></ds-media-viewer-image>
23+
</ng-template>
3624
</ng-container>

src/app/item-page/media-viewer/media-viewer.component.spec.ts

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ describe('MediaViewerComponent', () => {
6161
);
6262

6363
beforeEach(waitForAsync(() => {
64-
TestBed.configureTestingModule({
64+
return TestBed.configureTestingModule({
6565
imports: [
6666
TranslateModule.forRoot({
6767
loader: {
@@ -94,7 +94,10 @@ describe('MediaViewerComponent', () => {
9494
describe('when the bitstreams are loading', () => {
9595
beforeEach(() => {
9696
comp.mediaList$.next([mockMediaViewerItem]);
97-
comp.videoOptions = true;
97+
comp.mediaOptions = {
98+
image: true,
99+
video: true,
100+
};
98101
comp.isLoading = true;
99102
fixture.detectChanges();
100103
});
@@ -118,7 +121,10 @@ describe('MediaViewerComponent', () => {
118121
describe('when the bitstreams loading is failed', () => {
119122
beforeEach(() => {
120123
comp.mediaList$.next([]);
121-
comp.videoOptions = true;
124+
comp.mediaOptions = {
125+
image: true,
126+
video: true,
127+
};
122128
comp.isLoading = false;
123129
fixture.detectChanges();
124130
});

src/app/item-page/media-viewer/media-viewer.component.ts

Lines changed: 41 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { Component, Input, OnInit } from '@angular/core';
1+
import { Component, Input, OnDestroy, OnInit } from '@angular/core';
22
import { BehaviorSubject, Observable } from 'rxjs';
33
import { filter, take } from 'rxjs/operators';
44
import { BitstreamDataService } from '../../core/data/bitstream-data.service';
@@ -11,6 +11,9 @@ import { MediaViewerItem } from '../../core/shared/media-viewer-item.model';
1111
import { getFirstSucceededRemoteDataPayload } from '../../core/shared/operators';
1212
import { hasValue } from '../../shared/empty.util';
1313
import { followLink } from '../../shared/utils/follow-link-config.model';
14+
import { MediaViewerConfig } from '../../../config/media-viewer-config.interface';
15+
import { environment } from '../../../environments/environment';
16+
import { Subscription } from 'rxjs/internal/Subscription';
1417

1518
/**
1619
* This componenet renders the media viewers
@@ -21,51 +24,67 @@ import { followLink } from '../../shared/utils/follow-link-config.model';
2124
templateUrl: './media-viewer.component.html',
2225
styleUrls: ['./media-viewer.component.scss'],
2326
})
24-
export class MediaViewerComponent implements OnInit {
27+
export class MediaViewerComponent implements OnDestroy, OnInit {
2528
@Input() item: Item;
26-
@Input() videoOptions: boolean;
2729

28-
mediaList$: BehaviorSubject<MediaViewerItem[]>;
30+
@Input() mediaOptions: MediaViewerConfig = environment.mediaViewer;
2931

30-
isLoading: boolean;
32+
mediaList$: BehaviorSubject<MediaViewerItem[]> = new BehaviorSubject([]);
33+
34+
isLoading = true;
3135

3236
thumbnailPlaceholder = './assets/images/replacement_document.svg';
3337

34-
constructor(protected bitstreamDataService: BitstreamDataService) {}
38+
thumbnailsRD$: Observable<RemoteData<PaginatedList<Bitstream>>>;
39+
40+
subs: Subscription[] = [];
41+
42+
constructor(
43+
protected bitstreamDataService: BitstreamDataService,
44+
) {
45+
}
46+
47+
ngOnDestroy(): void {
48+
this.subs.forEach((subscription: Subscription) => subscription.unsubscribe());
49+
}
3550

3651
/**
37-
* This metod loads all the Bitstreams and Thumbnails and contert it to media item
52+
* This method loads all the Bitstreams and Thumbnails and converts it to {@link MediaViewerItem}s
3853
*/
3954
ngOnInit(): void {
40-
this.mediaList$ = new BehaviorSubject([]);
41-
this.isLoading = true;
42-
this.loadRemoteData('ORIGINAL').subscribe((bitstreamsRD) => {
55+
const types: string[] = [
56+
...(this.mediaOptions.image ? ['image'] : []),
57+
...(this.mediaOptions.video ? ['audio', 'video'] : []),
58+
];
59+
this.thumbnailsRD$ = this.loadRemoteData('THUMBNAIL');
60+
this.subs.push(this.loadRemoteData('ORIGINAL').subscribe((bitstreamsRD: RemoteData<PaginatedList<Bitstream>>) => {
4361
if (bitstreamsRD.payload.page.length === 0) {
4462
this.isLoading = false;
4563
this.mediaList$.next([]);
4664
} else {
47-
this.loadRemoteData('THUMBNAIL').subscribe((thumbnailsRD) => {
65+
this.subs.push(this.thumbnailsRD$.subscribe((thumbnailsRD: RemoteData<PaginatedList<Bitstream>>) => {
4866
for (
4967
let index = 0;
5068
index < bitstreamsRD.payload.page.length;
5169
index++
5270
) {
53-
bitstreamsRD.payload.page[index].format
71+
this.subs.push(bitstreamsRD.payload.page[index].format
5472
.pipe(getFirstSucceededRemoteDataPayload())
55-
.subscribe((format) => {
56-
const current = this.mediaList$.getValue();
73+
.subscribe((format: BitstreamFormat) => {
5774
const mediaItem = this.createMediaViewerItem(
5875
bitstreamsRD.payload.page[index],
5976
format,
6077
thumbnailsRD.payload && thumbnailsRD.payload.page[index]
6178
);
62-
this.mediaList$.next([...current, mediaItem]);
63-
});
79+
if (types.includes(mediaItem.format)) {
80+
this.mediaList$.next([...this.mediaList$.getValue(), mediaItem]);
81+
}
82+
}));
6483
}
6584
this.isLoading = false;
66-
});
85+
}));
6786
}
68-
});
87+
}));
6988
}
7089

7190
/**
@@ -95,16 +114,12 @@ export class MediaViewerComponent implements OnInit {
95114
}
96115

97116
/**
98-
* This method create MediaViewerItem from incoming bitstreams
99-
* @param original original remote data bitstream
117+
* This method creates a {@link MediaViewerItem} from incoming {@link Bitstream}s
118+
* @param original original bitstream
100119
* @param format original bitstream format
101-
* @param thumbnail trunbnail remote data bitstream
120+
* @param thumbnail thumbnail bitstream
102121
*/
103-
createMediaViewerItem(
104-
original: Bitstream,
105-
format: BitstreamFormat,
106-
thumbnail: Bitstream
107-
): MediaViewerItem {
122+
createMediaViewerItem(original: Bitstream, format: BitstreamFormat, thumbnail: Bitstream): MediaViewerItem {
108123
const mediaItem = new MediaViewerItem();
109124
mediaItem.bitstream = original;
110125
mediaItem.format = format.mimetype.split('/')[0];

src/app/item-page/simple/item-types/publication/publication.component.html

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,13 +17,13 @@ <h2 class="item-page-title-field mr-auto">
1717
</div>
1818
<div class="row">
1919
<div class="col-xs-12 col-md-4">
20-
<ng-container *ngIf="!mediaViewer.image">
20+
<ng-container *ngIf="!(mediaViewer.image || mediaViewer.video)">
2121
<ds-metadata-field-wrapper [hideIfNoTextContent]="false">
2222
<ds-thumbnail [thumbnail]="object?.thumbnail | async"></ds-thumbnail>
2323
</ds-metadata-field-wrapper>
2424
</ng-container>
25-
<ng-container *ngIf="mediaViewer.image">
26-
<ds-media-viewer [item]="object" [videoOptions]="mediaViewer.video"></ds-media-viewer>
25+
<ng-container *ngIf="mediaViewer.image || mediaViewer.video">
26+
<ds-media-viewer [item]="object"></ds-media-viewer>
2727
</ng-container>
2828
<ds-themed-item-page-file-section [item]="object"></ds-themed-item-page-file-section>
2929
<ds-item-page-date-field [item]="object"></ds-item-page-date-field>

src/app/item-page/simple/item-types/untyped-item/untyped-item.component.html

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,13 +20,13 @@ <h2 class="item-page-title-field mr-auto">
2020
</div>
2121
<div class="row">
2222
<div class="col-xs-12 col-md-4">
23-
<ng-container *ngIf="!mediaViewer.image">
23+
<ng-container *ngIf="!(mediaViewer.image || mediaViewer.video)">
2424
<ds-metadata-field-wrapper [hideIfNoTextContent]="false">
2525
<ds-thumbnail [thumbnail]="object?.thumbnail | async"></ds-thumbnail>
2626
</ds-metadata-field-wrapper>
2727
</ng-container>
28-
<ng-container *ngIf="mediaViewer.image">
29-
<ds-media-viewer [item]="object" [videoOptions]="mediaViewer.video"></ds-media-viewer>
28+
<ng-container *ngIf="mediaViewer.image || mediaViewer.video">
29+
<ds-media-viewer [item]="object"></ds-media-viewer>
3030
</ng-container>
3131
<ds-themed-item-page-file-section [item]="object"></ds-themed-item-page-file-section>
3232
<ds-item-page-date-field [item]="object"></ds-item-page-date-field>

0 commit comments

Comments
 (0)