mirror of
https://github.com/Alfresco/alfresco-ng2-components.git
synced 2025-05-12 17:04:57 +00:00
[ADF-2136] support shared links and renditions in the Viewer (#2826)
* support previewing shared link content * remove unused router instance * docs update * support 'shared links' preview in the Viewer
This commit is contained in:
parent
46ad98cd8b
commit
713e4bb33b
@ -43,6 +43,7 @@ import { TranslateModule } from '@ngx-translate/core';
|
|||||||
import { ReactiveFormsModule } from '@angular/forms';
|
import { ReactiveFormsModule } from '@angular/forms';
|
||||||
import { TaskAttachmentsComponent } from './components/process-service/task-attachments.component';
|
import { TaskAttachmentsComponent } from './components/process-service/task-attachments.component';
|
||||||
import { ProcessAttachmentsComponent } from './components/process-service/process-attachments.component';
|
import { ProcessAttachmentsComponent } from './components/process-service/process-attachments.component';
|
||||||
|
import { SharedLinkViewComponent } from './components/shared-link-view/shared-link-view.component';
|
||||||
|
|
||||||
|
|
||||||
@NgModule({
|
@NgModule({
|
||||||
@ -85,7 +86,8 @@ import { ProcessAttachmentsComponent } from './components/process-service/proces
|
|||||||
VersionManagerDialogAdapterComponent,
|
VersionManagerDialogAdapterComponent,
|
||||||
TaskAttachmentsComponent,
|
TaskAttachmentsComponent,
|
||||||
ProcessAttachmentsComponent,
|
ProcessAttachmentsComponent,
|
||||||
OverlayViewerComponent
|
OverlayViewerComponent,
|
||||||
|
SharedLinkViewComponent
|
||||||
],
|
],
|
||||||
providers: [
|
providers: [
|
||||||
TranslateService,
|
TranslateService,
|
||||||
|
@ -42,11 +42,16 @@ import { FileViewComponent } from './components/file-view/file-view.component';
|
|||||||
import { CustomSourcesComponent } from './components/files/custom-sources.component';
|
import { CustomSourcesComponent } from './components/files/custom-sources.component';
|
||||||
import { FormListComponent } from './components/form/form-list.component';
|
import { FormListComponent } from './components/form/form-list.component';
|
||||||
import { OverlayViewerComponent } from './components/overlay-viewer/overlay-viewer.component';
|
import { OverlayViewerComponent } from './components/overlay-viewer/overlay-viewer.component';
|
||||||
|
import { SharedLinkViewComponent } from './components/shared-link-view/shared-link-view.component';
|
||||||
|
|
||||||
export const appRoutes: Routes = [
|
export const appRoutes: Routes = [
|
||||||
{ path: 'login', component: LoginComponent },
|
{ path: 'login', component: LoginComponent },
|
||||||
{ path: 'settings', component: SettingsComponent },
|
{ path: 'settings', component: SettingsComponent },
|
||||||
{ path: 'files/:nodeId/view', component: FileViewComponent, canActivate: [ AuthGuardEcm ] },
|
{ path: 'files/:nodeId/view', component: FileViewComponent, canActivate: [ AuthGuardEcm ] },
|
||||||
|
{
|
||||||
|
path: 'preview/s/:id',
|
||||||
|
component: SharedLinkViewComponent
|
||||||
|
},
|
||||||
{
|
{
|
||||||
path: '',
|
path: '',
|
||||||
component: AppLayoutComponent,
|
component: AppLayoutComponent,
|
||||||
|
@ -0,0 +1,6 @@
|
|||||||
|
<ng-container *ngIf="sharedLinkId">
|
||||||
|
<adf-viewer
|
||||||
|
[sharedLinkId]="sharedLinkId"
|
||||||
|
[allowGoBack]="false">
|
||||||
|
</adf-viewer>
|
||||||
|
</ng-container>
|
@ -0,0 +1,4 @@
|
|||||||
|
.app-shared-link-view {
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
}
|
@ -0,0 +1,24 @@
|
|||||||
|
import { Component, ViewEncapsulation, OnInit } from '@angular/core';
|
||||||
|
import { ActivatedRoute } from '@angular/router';
|
||||||
|
|
||||||
|
@Component({
|
||||||
|
selector: 'app-shared-link-view',
|
||||||
|
templateUrl: 'shared-link-view.component.html',
|
||||||
|
styleUrls: [ 'shared-link-view.component.scss' ],
|
||||||
|
encapsulation: ViewEncapsulation.None,
|
||||||
|
// tslint:disable-next-line:use-host-property-decorator
|
||||||
|
host: { 'class': 'app-shared-link-view' }
|
||||||
|
})
|
||||||
|
export class SharedLinkViewComponent implements OnInit {
|
||||||
|
|
||||||
|
sharedLinkId: string = null;
|
||||||
|
|
||||||
|
constructor(private route: ActivatedRoute) {}
|
||||||
|
|
||||||
|
ngOnInit() {
|
||||||
|
this.route.params.subscribe(params => {
|
||||||
|
this.sharedLinkId = params.id;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -49,6 +49,7 @@ Using with file url:
|
|||||||
| Name | Type | Default | Description |
|
| Name | Type | Default | Description |
|
||||||
| ---- | ---- | ------- | ----------- |
|
| ---- | ---- | ------- | ----------- |
|
||||||
| fileNodeId | string | | Node Id of the file to load |
|
| fileNodeId | string | | Node Id of the file to load |
|
||||||
|
| sharedLinkId | string | | Shared link id (to display shared file) |
|
||||||
| urlFile | string | | If you want to load an external file that does not come from ECM you can use this Url where to load the file |
|
| urlFile | string | | If you want to load an external file that does not come from ECM you can use this Url where to load the file |
|
||||||
| urlFileViewer | string | null | Viewer to use with the `urlFile` address (`pdf`, `image`, `media`, `text`). Used when `urlFile` has no filename and extension. |
|
| urlFileViewer | string | null | Viewer to use with the `urlFile` address (`pdf`, `image`, `media`, `text`). Used when `urlFile` has no filename and extension. |
|
||||||
| urlBlob | Blob | | If you want to load a Blob File |
|
| urlBlob | Blob | | If you want to load a Blob File |
|
||||||
@ -112,6 +113,19 @@ export class OverlayViewerComponent {
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### Custom file parameters
|
||||||
|
|
||||||
|
You can provide custom file parameters, for example a value for the `mimeType` or `displayName` when using URL values that have no file names or extensions:
|
||||||
|
|
||||||
|
```html
|
||||||
|
<adf-viewer
|
||||||
|
[displayName]="fileName"
|
||||||
|
[allowGoBack]="false"
|
||||||
|
[mimeType]="mimeType"
|
||||||
|
[urlFile]="fileUrl">
|
||||||
|
</adf-viewer>
|
||||||
|
```
|
||||||
|
|
||||||
### Supported file formats
|
### Supported file formats
|
||||||
|
|
||||||
| Type | Extension |
|
| Type | Extension |
|
||||||
|
@ -63,6 +63,9 @@ export class ViewerComponent implements OnChanges {
|
|||||||
@Input()
|
@Input()
|
||||||
fileNodeId: string = null;
|
fileNodeId: string = null;
|
||||||
|
|
||||||
|
@Input()
|
||||||
|
sharedLinkId: string = null;
|
||||||
|
|
||||||
@Input()
|
@Input()
|
||||||
overlayMode = false;
|
overlayMode = false;
|
||||||
|
|
||||||
@ -99,6 +102,15 @@ export class ViewerComponent implements OnChanges {
|
|||||||
@Input()
|
@Input()
|
||||||
sidebarTemplate: TemplateRef<any> = null;
|
sidebarTemplate: TemplateRef<any> = null;
|
||||||
|
|
||||||
|
@Input()
|
||||||
|
mimeType: string;
|
||||||
|
|
||||||
|
@Input()
|
||||||
|
fileName: string;
|
||||||
|
|
||||||
|
@Input()
|
||||||
|
downloadUrl: string = null;
|
||||||
|
|
||||||
@Output()
|
@Output()
|
||||||
goBack = new EventEmitter<BaseEvent<any>>();
|
goBack = new EventEmitter<BaseEvent<any>>();
|
||||||
|
|
||||||
@ -118,8 +130,6 @@ export class ViewerComponent implements OnChanges {
|
|||||||
extensionChange = new EventEmitter<string>();
|
extensionChange = new EventEmitter<string>();
|
||||||
|
|
||||||
viewerType = 'unknown';
|
viewerType = 'unknown';
|
||||||
downloadUrl: string = null;
|
|
||||||
fileName = 'document';
|
|
||||||
isLoading = false;
|
isLoading = false;
|
||||||
node: MinimalNodeEntryEntity;
|
node: MinimalNodeEntryEntity;
|
||||||
|
|
||||||
@ -128,7 +138,6 @@ export class ViewerComponent implements OnChanges {
|
|||||||
urlFileContent: string;
|
urlFileContent: string;
|
||||||
otherMenu: any;
|
otherMenu: any;
|
||||||
extension: string;
|
extension: string;
|
||||||
mimeType: string;
|
|
||||||
sidebarTemplateContext: { node: MinimalNodeEntryEntity } = { node: null };
|
sidebarTemplateContext: { node: MinimalNodeEntryEntity } = { node: null };
|
||||||
|
|
||||||
private extensions = {
|
private extensions = {
|
||||||
@ -149,10 +158,14 @@ export class ViewerComponent implements OnChanges {
|
|||||||
private renditionService: RenditionsService) {
|
private renditionService: RenditionsService) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
isSourceDefined(): boolean {
|
||||||
|
return (this.urlFile || this.blobFile || this.fileNodeId || this.sharedLinkId) ? true : false;
|
||||||
|
}
|
||||||
|
|
||||||
ngOnChanges(changes: SimpleChanges) {
|
ngOnChanges(changes: SimpleChanges) {
|
||||||
if (this.showViewer) {
|
if (this.showViewer) {
|
||||||
if (!this.urlFile && !this.blobFile && !this.fileNodeId) {
|
if (!this.isSourceDefined()) {
|
||||||
throw new Error('Attribute urlFile or fileNodeId or blobFile is required');
|
throw new Error('A content source attribute value is missing.');
|
||||||
}
|
}
|
||||||
|
|
||||||
return new Promise((resolve, reject) => {
|
return new Promise((resolve, reject) => {
|
||||||
@ -206,7 +219,7 @@ export class ViewerComponent implements OnChanges {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (this.viewerType === 'unknown') {
|
if (this.viewerType === 'unknown') {
|
||||||
this.displayAsPdf(data.id);
|
this.displayNodeAsPdf(data.id);
|
||||||
} else {
|
} else {
|
||||||
this.isLoading = false;
|
this.isLoading = false;
|
||||||
}
|
}
|
||||||
@ -222,6 +235,33 @@ export class ViewerComponent implements OnChanges {
|
|||||||
this.logService.error('This node does not exist');
|
this.logService.error('This node does not exist');
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
} else if (this.sharedLinkId) {
|
||||||
|
this.isLoading = true;
|
||||||
|
|
||||||
|
this.apiService.sharedLinksApi.getSharedLink(this.sharedLinkId).then(details => {
|
||||||
|
this.mimeType = details.entry.content.mimeType;
|
||||||
|
this.displayName = this.getDisplayName(details.entry.name);
|
||||||
|
this.extension = this.getFileExtension(details.entry.name);
|
||||||
|
this.fileName = details.entry.name;
|
||||||
|
|
||||||
|
this.urlFileContent = this.apiService.contentApi.getSharedLinkContentUrl(this.sharedLinkId, false);
|
||||||
|
this.downloadUrl = this.apiService.contentApi.getSharedLinkContentUrl(this.sharedLinkId, true);
|
||||||
|
|
||||||
|
this.viewerType = this.getViewerTypeByMimeType(this.mimeType);
|
||||||
|
if (this.viewerType === 'unknown') {
|
||||||
|
this.viewerType = this.getViewerTypeByExtension(this.extension);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this.viewerType === 'unknown') {
|
||||||
|
this.displaySharedLinkAsPdf(this.sharedLinkId);
|
||||||
|
} else {
|
||||||
|
this.isLoading = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
this.extensionChange.emit(this.extension);
|
||||||
|
this.isLoading = false;
|
||||||
|
resolve();
|
||||||
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@ -403,7 +443,7 @@ export class ViewerComponent implements OnChanges {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private displayAsPdf(nodeId: string) {
|
private displayNodeAsPdf(nodeId: string) {
|
||||||
this.isLoading = true;
|
this.isLoading = true;
|
||||||
|
|
||||||
this.renditionService.getRendition(nodeId, 'pdf').subscribe(
|
this.renditionService.getRendition(nodeId, 'pdf').subscribe(
|
||||||
@ -433,6 +473,26 @@ export class ViewerComponent implements OnChanges {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private displaySharedLinkAsPdf(sharedId: string) {
|
||||||
|
this.isLoading = true;
|
||||||
|
|
||||||
|
this.apiService.renditionsApi.getSharedLinkRendition(sharedId, 'pdf').then(
|
||||||
|
(response) => {
|
||||||
|
const status = response.entry.status.toString();
|
||||||
|
if (status === 'CREATED') {
|
||||||
|
this.isLoading = false;
|
||||||
|
this.viewerType = 'pdf';
|
||||||
|
this.urlFileContent = this.apiService.contentApi.getSharedLinkRenditionUrl(sharedId, 'pdf');
|
||||||
|
} else {
|
||||||
|
this.isLoading = false;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
(err) => {
|
||||||
|
this.isLoading = false;
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
private showPdfRendition(nodeId: string) {
|
private showPdfRendition(nodeId: string) {
|
||||||
if (nodeId) {
|
if (nodeId) {
|
||||||
this.viewerType = 'pdf';
|
this.viewerType = 'pdf';
|
||||||
|
Loading…
x
Reference in New Issue
Block a user