mirror of
https://github.com/Alfresco/alfresco-ng2-components.git
synced 2025-05-26 17:24:56 +00:00
AAE-34641 Refactor viewer-render loading (#10868)
This commit is contained in:
parent
f2fa458fe5
commit
413fce8cb7
@ -4,9 +4,11 @@
|
|||||||
<div *ngIf="hasTabs()" class="alfresco-tabs-widget">
|
<div *ngIf="hasTabs()" class="alfresco-tabs-widget">
|
||||||
<mat-tab-group>
|
<mat-tab-group>
|
||||||
<mat-tab *ngFor="let tab of visibleTabs()" [label]="tab.title | translate ">
|
<mat-tab *ngFor="let tab of visibleTabs()" [label]="tab.title | translate ">
|
||||||
<ng-container class="adf-form-tab-content">
|
<ng-template matTabContent>
|
||||||
<ng-template *ngTemplateOutlet="render; context: { fieldToRender: tab.fields }" />
|
<div class="adf-form-tab-content">
|
||||||
</ng-container>
|
<ng-template *ngTemplateOutlet="render; context: { fieldToRender: tab.fields }" />
|
||||||
|
</div>
|
||||||
|
</ng-template>
|
||||||
</mat-tab>
|
</mat-tab>
|
||||||
</mat-tab-group>
|
</mat-tab-group>
|
||||||
</div>
|
</div>
|
||||||
|
@ -1,95 +1,105 @@
|
|||||||
<div *ngIf="(viewerType === 'media' || viewerType === 'pdf' || viewerType === 'image') ? isLoading || !isContentReady : isLoading"
|
<div *ngIf="isLoading$ | async" class="adf-viewer-render-main-loader">
|
||||||
class="adf-viewer-render-main-loader">
|
|
||||||
<div class="adf-viewer-render-layout-content adf-viewer__fullscreen-container">
|
<div class="adf-viewer-render-layout-content adf-viewer__fullscreen-container">
|
||||||
<div class="adf-viewer-render-content-container">
|
<div class="adf-viewer-render-content-container">
|
||||||
<div class="adf-viewer-render__loading-screen ">
|
<div class="adf-viewer-render__loading-screen">
|
||||||
<h2>{{ 'ADF_VIEWER.LOADING' | translate }}</h2>
|
<h2>{{ 'ADF_VIEWER.LOADING' | translate }}</h2>
|
||||||
<div>
|
<div>
|
||||||
<mat-spinner class="adf-viewer-render__loading-screen__spinner"/>
|
<mat-spinner class="adf-viewer-render__loading-screen__spinner" />
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div *ngIf="!isLoading"
|
<ng-container *ngIf="urlFile || blobFile">
|
||||||
class="adf-viewer-render-main">
|
<div [hidden]="isLoading$ | async" class="adf-viewer-render-main">
|
||||||
<div class="adf-viewer-render-layout-content adf-viewer__fullscreen-container">
|
<div class="adf-viewer-render-layout-content adf-viewer__fullscreen-container">
|
||||||
<div class="adf-viewer-render-content-container" [ngSwitch]="viewerType">
|
<div class="adf-viewer-render-content-container" [ngSwitch]="viewerType">
|
||||||
<ng-container *ngSwitchCase="'external'">
|
<ng-container *ngSwitchCase="'external'">
|
||||||
<adf-preview-extension *ngIf="!!externalViewer"
|
<adf-preview-extension
|
||||||
[id]="externalViewer.component"
|
*ngIf="!!externalViewer"
|
||||||
[url]="urlFile"
|
[id]="externalViewer.component"
|
||||||
[extension]="externalViewer.fileExtension"
|
[url]="urlFile"
|
||||||
[nodeId]="nodeId"
|
[extension]="externalViewer.fileExtension"
|
||||||
[attr.data-automation-id]="externalViewer.component" />
|
[nodeId]="nodeId"
|
||||||
</ng-container>
|
[attr.data-automation-id]="externalViewer.component"
|
||||||
|
/>
|
||||||
<ng-container *ngSwitchCase="'pdf'">
|
|
||||||
<adf-pdf-viewer [thumbnailsTemplate]="thumbnailsTemplate"
|
|
||||||
[allowThumbnails]="allowThumbnails"
|
|
||||||
[blobFile]="blobFile"
|
|
||||||
[urlFile]="urlFile"
|
|
||||||
[fileName]="internalFileName"
|
|
||||||
[cacheType]="cacheTypeForContent"
|
|
||||||
(pagesLoaded)="isContentReady = true"
|
|
||||||
(close)="onClose()"
|
|
||||||
(error)="onUnsupportedFile()" />
|
|
||||||
</ng-container>
|
|
||||||
|
|
||||||
<ng-container *ngSwitchCase="'image'">
|
|
||||||
<adf-img-viewer [urlFile]="urlFile"
|
|
||||||
[readOnly]="readOnly"
|
|
||||||
[fileName]="internalFileName"
|
|
||||||
[allowedEditActions]="allowedEditActions"
|
|
||||||
[blobFile]="blobFile"
|
|
||||||
(error)="onUnsupportedFile()"
|
|
||||||
(submit)="onSubmitFile($event)"
|
|
||||||
(imageLoaded)="isContentReady = true"
|
|
||||||
(isSaving)="isSaving.emit($event)"
|
|
||||||
/>
|
|
||||||
</ng-container>
|
|
||||||
|
|
||||||
<ng-container *ngSwitchCase="'media'">
|
|
||||||
<adf-media-player id="adf-mdedia-player"
|
|
||||||
[urlFile]="urlFile"
|
|
||||||
[tracks]="tracks"
|
|
||||||
[mimeType]="mimeType"
|
|
||||||
[blobFile]="blobFile"
|
|
||||||
[fileName]="internalFileName"
|
|
||||||
(error)="onUnsupportedFile()"
|
|
||||||
(canPlay)="isContentReady = true"/>
|
|
||||||
</ng-container>
|
|
||||||
|
|
||||||
<ng-container *ngSwitchCase="'text'">
|
|
||||||
<adf-txt-viewer [urlFile]="urlFile"
|
|
||||||
[blobFile]="blobFile" />
|
|
||||||
</ng-container>
|
|
||||||
|
|
||||||
<ng-container *ngSwitchCase="'custom'">
|
|
||||||
<ng-container *ngFor="let ext of viewerExtensions">
|
|
||||||
<adf-preview-extension *ngIf="checkExtensions(ext.fileExtension)"
|
|
||||||
[id]="ext.component"
|
|
||||||
[url]="urlFile"
|
|
||||||
[extension]="extension"
|
|
||||||
[nodeId]="nodeId"
|
|
||||||
[attr.data-automation-id]="ext.component" />
|
|
||||||
</ng-container>
|
</ng-container>
|
||||||
|
|
||||||
<ng-container *ngFor="let extensionTemplate of extensionTemplates">
|
<ng-container *ngSwitchCase="'pdf'">
|
||||||
<span *ngIf="extensionTemplate.isVisible" class="adf-viewer-render-custom-content">
|
<adf-pdf-viewer
|
||||||
<ng-template [ngTemplateOutlet]="extensionTemplate.template"
|
[thumbnailsTemplate]="thumbnailsTemplate"
|
||||||
[ngTemplateOutletContext]="{ urlFile: urlFile, extension: extension }" />
|
[allowThumbnails]="allowThumbnails"
|
||||||
</span>
|
[blobFile]="blobFile"
|
||||||
|
[urlFile]="urlFile"
|
||||||
|
[fileName]="internalFileName"
|
||||||
|
[cacheType]="cacheTypeForContent"
|
||||||
|
(pagesLoaded)="markAsLoaded()"
|
||||||
|
(close)="onClose()"
|
||||||
|
(error)="onUnsupportedFile()"
|
||||||
|
/>
|
||||||
</ng-container>
|
</ng-container>
|
||||||
</ng-container>
|
|
||||||
|
|
||||||
<ng-container *ngSwitchDefault>
|
<ng-container *ngSwitchCase="'image'">
|
||||||
<adf-viewer-unknown-format [customError]="customError"/>
|
<adf-img-viewer
|
||||||
</ng-container>
|
[urlFile]="urlFile"
|
||||||
|
[readOnly]="readOnly"
|
||||||
|
[fileName]="internalFileName"
|
||||||
|
[allowedEditActions]="allowedEditActions"
|
||||||
|
[blobFile]="blobFile"
|
||||||
|
(error)="onUnsupportedFile()"
|
||||||
|
(submit)="onSubmitFile($event)"
|
||||||
|
(imageLoaded)="markAsLoaded()"
|
||||||
|
(isSaving)="isSaving.emit($event)"
|
||||||
|
/>
|
||||||
|
</ng-container>
|
||||||
|
|
||||||
|
<ng-container *ngSwitchCase="'media'">
|
||||||
|
<adf-media-player
|
||||||
|
id="adf-mdedia-player"
|
||||||
|
[urlFile]="urlFile"
|
||||||
|
[tracks]="tracks"
|
||||||
|
[mimeType]="mimeType"
|
||||||
|
[blobFile]="blobFile"
|
||||||
|
[fileName]="internalFileName"
|
||||||
|
(error)="onUnsupportedFile()"
|
||||||
|
(canPlay)="markAsLoaded()"
|
||||||
|
/>
|
||||||
|
</ng-container>
|
||||||
|
|
||||||
|
<ng-container *ngSwitchCase="'text'">
|
||||||
|
<adf-txt-viewer [urlFile]="urlFile" [blobFile]="blobFile" />
|
||||||
|
</ng-container>
|
||||||
|
|
||||||
|
<ng-container *ngSwitchCase="'custom'">
|
||||||
|
<ng-container *ngFor="let ext of viewerExtensions">
|
||||||
|
<adf-preview-extension
|
||||||
|
*ngIf="checkExtensions(ext.fileExtension)"
|
||||||
|
[id]="ext.component"
|
||||||
|
[url]="urlFile"
|
||||||
|
[extension]="extension"
|
||||||
|
[nodeId]="nodeId"
|
||||||
|
[attr.data-automation-id]="ext.component"
|
||||||
|
/>
|
||||||
|
</ng-container>
|
||||||
|
|
||||||
|
<ng-container *ngFor="let extensionTemplate of extensionTemplates">
|
||||||
|
<span *ngIf="extensionTemplate.isVisible" class="adf-viewer-render-custom-content">
|
||||||
|
<ng-template
|
||||||
|
[ngTemplateOutlet]="extensionTemplate.template"
|
||||||
|
[ngTemplateOutletContext]="{ urlFile: urlFile, extension: extension }"
|
||||||
|
/>
|
||||||
|
</span>
|
||||||
|
</ng-container>
|
||||||
|
</ng-container>
|
||||||
|
|
||||||
|
<ng-container *ngSwitchDefault>
|
||||||
|
<adf-viewer-unknown-format [customError]="customError" />
|
||||||
|
</ng-container>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</ng-container>
|
||||||
<ng-container *ngIf="viewerTemplateExtensions">
|
<ng-container *ngIf="viewerTemplateExtensions">
|
||||||
<ng-template [ngTemplateOutlet]="viewerTemplateExtensions" [ngTemplateOutletInjector]="injector" />
|
<ng-template [ngTemplateOutlet]="viewerTemplateExtensions" [ngTemplateOutletInjector]="injector" />
|
||||||
</ng-container>
|
</ng-container>
|
||||||
|
@ -24,7 +24,7 @@ import { MatDialog, MatDialogModule } from '@angular/material/dialog';
|
|||||||
import { NoopTranslateModule, UnitTestingUtils } from '../../../testing';
|
import { NoopTranslateModule, UnitTestingUtils } from '../../../testing';
|
||||||
import { RenderingQueueServices } from '../../services/rendering-queue.services';
|
import { RenderingQueueServices } from '../../services/rendering-queue.services';
|
||||||
import { ViewerRenderComponent } from './viewer-render.component';
|
import { ViewerRenderComponent } from './viewer-render.component';
|
||||||
import { ImgViewerComponent, MediaPlayerComponent, ViewerExtensionDirective } from '@alfresco/adf-core';
|
import { ImgViewerComponent, MediaPlayerComponent, PdfViewerComponent, ViewerExtensionDirective } from '@alfresco/adf-core';
|
||||||
import { NoopAnimationsModule } from '@angular/platform-browser/animations';
|
import { NoopAnimationsModule } from '@angular/platform-browser/animations';
|
||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
@ -483,14 +483,16 @@ describe('ViewerComponent', () => {
|
|||||||
describe('Spinner', () => {
|
describe('Spinner', () => {
|
||||||
const getMainLoader = (): DebugElement => testingUtils.getByCSS('.adf-viewer-render-main-loader');
|
const getMainLoader = (): DebugElement => testingUtils.getByCSS('.adf-viewer-render-main-loader');
|
||||||
|
|
||||||
it('should show spinner when isLoading is true', () => {
|
it('should not show spinner by default', (done) => {
|
||||||
component.isLoading = true;
|
component.isLoading$.subscribe((isLoading) => {
|
||||||
fixture.detectChanges();
|
fixture.detectChanges();
|
||||||
expect(getMainLoader()).not.toBeNull();
|
expect(isLoading).toBeFalse();
|
||||||
|
expect(getMainLoader()).toBeNull();
|
||||||
|
done();
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should show spinner until content is ready when viewerType is media', () => {
|
it('should display spinner when viewerType is media', () => {
|
||||||
component.isLoading = false;
|
|
||||||
component.urlFile = 'some-file.mp4';
|
component.urlFile = 'some-file.mp4';
|
||||||
|
|
||||||
component.ngOnChanges();
|
component.ngOnChanges();
|
||||||
@ -506,24 +508,21 @@ describe('ViewerComponent', () => {
|
|||||||
expect(component.viewerType).toBe('media');
|
expect(component.viewerType).toBe('media');
|
||||||
});
|
});
|
||||||
|
|
||||||
// eslint-disable-next-line ban/ban
|
it('should display spinner when viewerType is pdf', () => {
|
||||||
xit('should show spinner until content is ready when viewerType is pdf', () => {
|
|
||||||
component.isLoading = false;
|
|
||||||
component.urlFile = 'some-url.pdf';
|
component.urlFile = 'some-url.pdf';
|
||||||
|
expect(getMainLoader()).toBeNull();
|
||||||
|
|
||||||
component.ngOnChanges();
|
component.ngOnChanges();
|
||||||
fixture.detectChanges();
|
fixture.detectChanges();
|
||||||
|
|
||||||
expect(getMainLoader()).not.toBeNull();
|
const imgViewer = testingUtils.getByDirective(PdfViewerComponent);
|
||||||
|
imgViewer.triggerEventHandler('pagesLoaded', null);
|
||||||
fixture.detectChanges();
|
fixture.detectChanges();
|
||||||
|
|
||||||
expect(getMainLoader()).toBeNull();
|
|
||||||
expect(component.viewerType).toBe('pdf');
|
expect(component.viewerType).toBe('pdf');
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should show spinner until content is ready when viewerType is image', () => {
|
it('should display spinner when viewerType is image', () => {
|
||||||
component.isLoading = false;
|
|
||||||
component.urlFile = 'some-url.png';
|
component.urlFile = 'some-url.png';
|
||||||
|
|
||||||
component.ngOnChanges();
|
component.ngOnChanges();
|
||||||
@ -537,16 +536,5 @@ describe('ViewerComponent', () => {
|
|||||||
expect(getMainLoader()).toBeNull();
|
expect(getMainLoader()).toBeNull();
|
||||||
expect(component.viewerType).toBe('image');
|
expect(component.viewerType).toBe('image');
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should not show spinner when isLoading = false and isContentReady = false for other viewer types', () => {
|
|
||||||
component.isLoading = false;
|
|
||||||
component.urlFile = 'some-url.txt';
|
|
||||||
|
|
||||||
component.ngOnChanges();
|
|
||||||
fixture.detectChanges();
|
|
||||||
|
|
||||||
expect(getMainLoader()).toBeNull();
|
|
||||||
expect(component.isContentReady).toBeFalse();
|
|
||||||
});
|
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
@ -16,7 +16,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
import { AppExtensionService, ExtensionsModule, ViewerExtensionRef } from '@alfresco/adf-extensions';
|
import { AppExtensionService, ExtensionsModule, ViewerExtensionRef } from '@alfresco/adf-extensions';
|
||||||
import { NgForOf, NgIf, NgSwitch, NgSwitchCase, NgSwitchDefault, NgTemplateOutlet } from '@angular/common';
|
import { AsyncPipe, NgForOf, NgIf, NgSwitch, NgSwitchCase, NgSwitchDefault, NgTemplateOutlet } from '@angular/common';
|
||||||
import { Component, EventEmitter, Injector, Input, OnChanges, OnInit, Output, TemplateRef, ViewEncapsulation } from '@angular/core';
|
import { Component, EventEmitter, Injector, Input, OnChanges, OnInit, Output, TemplateRef, ViewEncapsulation } from '@angular/core';
|
||||||
import { MatDialog } from '@angular/material/dialog';
|
import { MatDialog } from '@angular/material/dialog';
|
||||||
import { MatProgressSpinnerModule } from '@angular/material/progress-spinner';
|
import { MatProgressSpinnerModule } from '@angular/material/progress-spinner';
|
||||||
@ -28,6 +28,9 @@ import { MediaPlayerComponent } from '../media-player/media-player.component';
|
|||||||
import { PdfViewerComponent } from '../pdf-viewer/pdf-viewer.component';
|
import { PdfViewerComponent } from '../pdf-viewer/pdf-viewer.component';
|
||||||
import { TxtViewerComponent } from '../txt-viewer/txt-viewer.component';
|
import { TxtViewerComponent } from '../txt-viewer/txt-viewer.component';
|
||||||
import { UnknownFormatComponent } from '../unknown-format/unknown-format.component';
|
import { UnknownFormatComponent } from '../unknown-format/unknown-format.component';
|
||||||
|
import { BehaviorSubject } from 'rxjs';
|
||||||
|
|
||||||
|
type ViewerType = 'media' | 'image' | 'pdf' | 'external' | 'text' | 'custom' | 'unknown';
|
||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
selector: 'adf-viewer-render',
|
selector: 'adf-viewer-render',
|
||||||
@ -50,7 +53,8 @@ import { UnknownFormatComponent } from '../unknown-format/unknown-format.compone
|
|||||||
UnknownFormatComponent,
|
UnknownFormatComponent,
|
||||||
ExtensionsModule,
|
ExtensionsModule,
|
||||||
NgForOf,
|
NgForOf,
|
||||||
NgSwitchDefault
|
NgSwitchDefault,
|
||||||
|
AsyncPipe
|
||||||
],
|
],
|
||||||
providers: [ViewUtilService]
|
providers: [ViewUtilService]
|
||||||
})
|
})
|
||||||
@ -86,10 +90,6 @@ export class ViewerRenderComponent implements OnChanges, OnInit {
|
|||||||
@Input()
|
@Input()
|
||||||
fileName: string;
|
fileName: string;
|
||||||
|
|
||||||
/** Override loading status */
|
|
||||||
@Input()
|
|
||||||
isLoading = false;
|
|
||||||
|
|
||||||
/** Enable when where is possible the editing functionalities */
|
/** Enable when where is possible the editing functionalities */
|
||||||
@Input()
|
@Input()
|
||||||
readOnly = true;
|
readOnly = true;
|
||||||
@ -141,8 +141,8 @@ export class ViewerRenderComponent implements OnChanges, OnInit {
|
|||||||
extensionsSupportedByTemplates: string[] = [];
|
extensionsSupportedByTemplates: string[] = [];
|
||||||
extension: string;
|
extension: string;
|
||||||
internalFileName: string;
|
internalFileName: string;
|
||||||
viewerType: string = 'unknown';
|
viewerType: ViewerType = 'unknown';
|
||||||
isContentReady = false;
|
readonly isLoading$ = new BehaviorSubject(false);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns a list of the active Viewer content extensions.
|
* Returns a list of the active Viewer content extensions.
|
||||||
@ -182,12 +182,10 @@ export class ViewerRenderComponent implements OnChanges, OnInit {
|
|||||||
|
|
||||||
ngOnInit() {
|
ngOnInit() {
|
||||||
this.cacheTypeForContent = 'no-cache';
|
this.cacheTypeForContent = 'no-cache';
|
||||||
|
this.setDefaultLoadingState();
|
||||||
}
|
}
|
||||||
|
|
||||||
ngOnChanges() {
|
ngOnChanges() {
|
||||||
this.isContentReady = false;
|
|
||||||
this.isLoading = !this.blobFile && !this.urlFile;
|
|
||||||
|
|
||||||
if (this.blobFile) {
|
if (this.blobFile) {
|
||||||
this.setUpBlobData();
|
this.setUpBlobData();
|
||||||
} else if (this.urlFile) {
|
} else if (this.urlFile) {
|
||||||
@ -195,9 +193,13 @@ export class ViewerRenderComponent implements OnChanges, OnInit {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
markAsLoaded() {
|
||||||
|
this.isLoading$.next(false);
|
||||||
|
}
|
||||||
|
|
||||||
private setUpBlobData() {
|
private setUpBlobData() {
|
||||||
this.internalFileName = this.fileName;
|
this.internalFileName = this.fileName;
|
||||||
this.viewerType = this.viewUtilService.getViewerTypeByMimeType(this.blobFile.type);
|
this.viewerType = this.viewUtilService.getViewerTypeByMimeType(this.blobFile.type) as ViewerType;
|
||||||
|
|
||||||
this.extensionChange.emit(this.blobFile.type);
|
this.extensionChange.emit(this.blobFile.type);
|
||||||
this.scrollTop();
|
this.scrollTop();
|
||||||
@ -206,7 +208,7 @@ export class ViewerRenderComponent implements OnChanges, OnInit {
|
|||||||
private setUpUrlFile() {
|
private setUpUrlFile() {
|
||||||
this.internalFileName = this.fileName ? this.fileName : this.viewUtilService.getFilenameFromUrl(this.urlFile);
|
this.internalFileName = this.fileName ? this.fileName : this.viewUtilService.getFilenameFromUrl(this.urlFile);
|
||||||
this.extension = this.viewUtilService.getFileExtension(this.internalFileName);
|
this.extension = this.viewUtilService.getFileExtension(this.internalFileName);
|
||||||
this.viewerType = this.viewUtilService.getViewerType(this.extension, this.mimeType, this.extensionsSupportedByTemplates);
|
this.viewerType = this.viewUtilService.getViewerType(this.extension, this.mimeType, this.extensionsSupportedByTemplates) as ViewerType;
|
||||||
|
|
||||||
this.extensionChange.emit(this.extension);
|
this.extensionChange.emit(this.extension);
|
||||||
this.scrollTop();
|
this.scrollTop();
|
||||||
@ -235,4 +237,14 @@ export class ViewerRenderComponent implements OnChanges, OnInit {
|
|||||||
onClose() {
|
onClose() {
|
||||||
this.close.next(true);
|
this.close.next(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private canBePreviewed(): boolean {
|
||||||
|
return this.viewerType === 'media' || this.viewerType === 'pdf' || this.viewerType === 'image';
|
||||||
|
}
|
||||||
|
|
||||||
|
private setDefaultLoadingState() {
|
||||||
|
if (this.canBePreviewed()) {
|
||||||
|
this.isLoading$.next(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user