@alfresco/adf-content-services
Version:
Alfresco ADF content services
401 lines • 71.1 kB
JavaScript
/*!
* @license
* Copyright © 2005-2025 Hyland Software, Inc. and its affiliates. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import { ChangeDetectorRef, Component, ContentChild, DestroyRef, EventEmitter, inject, Input, Output, TemplateRef, ViewChild, ViewEncapsulation } from '@angular/core';
import { CloseButtonPosition, VIEWER_DIRECTIVES, ViewerComponent, ViewerMoreActionsComponent, ViewerOpenWithComponent, ViewerSidebarComponent, ViewerToolbarActionsComponent, ViewerToolbarComponent, ViewUtilService } from '@alfresco/adf-core';
import { AlfrescoApiService } from '../../services/alfresco-api.service';
import { ContentApi, NodesApi, SharedlinksApi, VersionsApi } from '@alfresco/js-api';
import { RenditionService } from '../../common/services/rendition.service';
import { MatDialog } from '@angular/material/dialog';
import { filter } from 'rxjs/operators';
import { ContentService } from '../../common/services/content.service';
import { NodesApiService } from '../../common/services/nodes-api.service';
import { UploadService } from '../../common/services/upload.service';
import { FileModel } from '../../common/models/file.model';
import { NodeActionsService } from '../../document-list';
import { CommonModule } from '@angular/common';
import { TranslateModule } from '@ngx-translate/core';
import { MatButtonModule } from '@angular/material/button';
import { MatIconModule } from '@angular/material/icon';
import { NodeDownloadDirective } from '../../directives';
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
import * as i0 from "@angular/core";
import * as i1 from "../../services/alfresco-api.service";
import * as i2 from "../../common/services/nodes-api.service";
import * as i3 from "../../common/services/rendition.service";
import * as i4 from "@alfresco/adf-core";
import * as i5 from "../../common/services/content.service";
import * as i6 from "../../common/services/upload.service";
import * as i7 from "@angular/material/dialog";
import * as i8 from "../../document-list";
import * as i9 from "@angular/common";
import * as i10 from "@ngx-translate/core";
import * as i11 from "@angular/material/button";
import * as i12 from "@angular/material/icon";
export class AlfrescoViewerComponent {
get sharedLinksApi() {
this._sharedLinksApi = this._sharedLinksApi ?? new SharedlinksApi(this.apiService.getInstance());
return this._sharedLinksApi;
}
get versionsApi() {
this._versionsApi = this._versionsApi ?? new VersionsApi(this.apiService.getInstance());
return this._versionsApi;
}
get nodesApi() {
this._nodesApi = this._nodesApi ?? new NodesApi(this.apiService.getInstance());
return this._nodesApi;
}
get contentApi() {
this._contentApi = this._contentApi ?? new ContentApi(this.apiService.getInstance());
return this._contentApi;
}
constructor(apiService, nodesApiService, renditionService, viewUtilService, contentService, uploadService, dialog, cdr, nodeActionsService) {
this.apiService = apiService;
this.nodesApiService = nodesApiService;
this.renditionService = renditionService;
this.viewUtilService = viewUtilService;
this.contentService = contentService;
this.uploadService = uploadService;
this.dialog = dialog;
this.cdr = cdr;
this.nodeActionsService = nodeActionsService;
/** Node Id of the file to load. */
this.nodeId = null;
/** Version Id of the file to load. */
this.versionId = null;
/** Shared link id (to display shared file). */
this.sharedLinkId = null;
/** Hide or show the viewer */
this.showViewer = true;
/**
* Number of times the Viewer will retry fetching content Rendition.
* There is a delay of at least one second between attempts.
*/
this.maxRetries = 30;
/** Allows `back` navigation */
this.allowGoBack = true;
/** Hide or show the toolbar */
this.showToolbar = true;
/**
* If `true` then show the Viewer as a full page over the current content.
* Otherwise, fit inside the parent div.
*/
this.overlayMode = false;
/**
* Toggles before/next navigation. You can use the arrow buttons to navigate
* between documents in the collection.
*/
this.allowNavigate = false;
/** Toggles the "before" ("<") button. Requires `allowNavigate` to be enabled. */
this.canNavigateBefore = true;
/** Toggles the next (">") button. Requires `allowNavigate` to be enabled. */
this.canNavigateNext = true;
/** Allow the left the sidebar. */
this.allowLeftSidebar = false;
/** Allow the right sidebar. */
this.allowRightSidebar = false;
/** Toggles right sidebar visibility. Requires `allowRightSidebar` to be set to `true`. */
this.showRightSidebar = false;
/** Toggles left sidebar visibility. Requires `allowLeftSidebar` to be set to `true`. */
this.showLeftSidebar = false;
/** Toggles downloading. */
this.allowDownload = true;
/** Toggles printing. */
this.allowPrint = false;
/** Toggles the 'Full Screen' feature. */
this.allowFullScreen = true;
/** Toggles the 'Info Button' */
this.hideInfoButton = false;
/** Change the close button position Right/Left */
this.closeButtonPosition = CloseButtonPosition.Left;
/** The template for the right sidebar. The template context contains the loaded node data. */
this.sidebarRightTemplate = null;
/** The template for the left sidebar. The template context contains the loaded node data. */
this.sidebarLeftTemplate = null;
/** Emitted when the shared link used is not valid. */
this.invalidSharedLink = new EventEmitter();
/** Emitted when user clicks 'Navigate Before' ("<") button. */
this.navigateBefore = new EventEmitter();
/** Emitted when user clicks 'Navigate Next' (">") button. */
this.navigateNext = new EventEmitter();
/** Emitted when the viewer close */
this.showViewerChange = new EventEmitter();
this.tracks = [];
this.readOnly = true;
this.allowedEditActions = {
rotate: true,
crop: true
};
this.sidebarRightTemplateContext = { node: null };
this.sidebarLeftTemplateContext = { node: null };
this.destroyRef = inject(DestroyRef);
renditionService.maxRetries = this.maxRetries;
}
ngOnInit() {
this.nodesApiService.nodeUpdated
.pipe(filter((node) => node && node.id === this.nodeId && this.getNodeVersionProperty(this.nodeEntry.entry) !== this.getNodeVersionProperty(node)), takeUntilDestroyed(this.destroyRef))
.subscribe((node) => this.onNodeUpdated(node));
}
async onNodeUpdated(node) {
if (node && node.id === this.nodeId) {
this.generateCacheBusterNumber();
await this.setUpNodeFile(node);
}
}
getNodeVersionProperty(node) {
return node?.properties['cm:versionLabel'] ?? '';
}
async setupSharedLink() {
this.allowGoBack = false;
try {
const sharedLinkEntry = await this.sharedLinksApi.getSharedLink(this.sharedLinkId);
await this.setUpSharedLinkFile(sharedLinkEntry);
}
catch (error) {
this.invalidSharedLink.next(undefined);
this.mimeType = 'invalid-link';
this.urlFileContent = 'invalid-file';
}
}
async setupNode() {
try {
this.nodeEntry = await this.nodesApi.getNode(this.nodeId, { include: ['allowableOperations'] });
if (this.versionId) {
this.versionEntry = await this.versionsApi.getVersion(this.nodeId, this.versionId);
await this.setUpNodeFile(this.nodeEntry.entry, this.versionEntry.entry);
}
else {
await this.setUpNodeFile(this.nodeEntry.entry);
this.cdr.detectChanges();
}
}
catch (error) {
this.urlFileContent = 'invalid-node';
}
}
async setUpNodeFile(nodeData, versionData) {
this.readOnly = !this.contentService.hasAllowableOperations(nodeData, 'update');
let mimeType;
let nodeMimeType;
let urlFileContent;
if (versionData?.content) {
mimeType = versionData.content.mimeType;
}
else if (nodeData.content) {
mimeType = nodeData.content.mimeType;
}
nodeMimeType = mimeType;
const currentFileVersion = this.nodeEntry?.entry?.properties?.['cm:versionLabel']
? encodeURI(this.nodeEntry?.entry?.properties['cm:versionLabel'])
: encodeURI('1.0');
urlFileContent = versionData ? this.contentApi.getVersionContentUrl(this.nodeId, versionData.id) : this.contentApi.getContentUrl(this.nodeId);
urlFileContent = urlFileContent + '&' + currentFileVersion;
const fileExtension = this.viewUtilService.getFileExtension(versionData ? versionData.name : nodeData.name);
const viewerType = this.viewUtilService.getViewerType(fileExtension, mimeType);
if (viewerType === 'unknown') {
let nodeRendition;
if (versionData) {
nodeRendition = await this.renditionService.getNodeRendition(nodeData.id, versionData.id);
}
else {
nodeRendition = await this.renditionService.getNodeRendition(nodeData.id);
}
if (nodeRendition) {
urlFileContent = nodeRendition.url;
nodeMimeType = nodeData?.content?.mimeType;
const renditionMimeType = nodeRendition.mimeType;
mimeType = renditionMimeType || nodeMimeType;
}
}
else if (viewerType === 'media') {
this.tracks = await this.renditionService.generateMediaTracksRendition(this.nodeId);
}
this.mimeType = mimeType;
this.nodeMimeType = nodeMimeType;
this.fileName = versionData ? versionData.name : nodeData.name;
this.urlFileContent = urlFileContent + (this.cacheBusterNumber ? '&' + this.cacheBusterNumber : '');
this.sidebarRightTemplateContext.node = nodeData;
this.sidebarLeftTemplateContext.node = nodeData;
}
async setUpSharedLinkFile(details) {
let mimeType = details.entry.content.mimeType;
const fileExtension = this.viewUtilService.getFileExtension(details.entry.name);
this.fileName = details.entry.name;
let urlFileContent = this.contentApi.getSharedLinkContentUrl(this.sharedLinkId, false);
const viewerType = this.viewUtilService.getViewerType(fileExtension, mimeType);
if (viewerType === 'unknown') {
({ url: urlFileContent, mimeType } = await this.getSharedLinkRendition(this.sharedLinkId));
}
this.mimeType = mimeType;
this.urlFileContent = urlFileContent;
}
async getSharedLinkRendition(sharedId) {
try {
const rendition = await this.sharedLinksApi.getSharedLinkRendition(sharedId, 'pdf');
if (rendition.entry.status.toString() === 'CREATED') {
const urlFileContent = this.contentApi.getSharedLinkRenditionUrl(sharedId, 'pdf');
return { url: urlFileContent, mimeType: 'application/pdf' };
}
}
catch (error) {
try {
const rendition = await this.sharedLinksApi.getSharedLinkRendition(sharedId, 'imgpreview');
if (rendition.entry.status.toString() === 'CREATED') {
const urlFileContent = this.contentApi.getSharedLinkRenditionUrl(sharedId, 'imgpreview');
return { url: urlFileContent, mimeType: 'image/png' };
}
}
catch (renditionError) {
return null;
}
}
return null;
}
generateCacheBusterNumber() {
this.cacheBusterNumber = Date.now();
}
/**
* close the viewer
*/
onClose() {
this.showViewerChange.emit(this.showViewer);
}
onPrintContent(event) {
if (this.allowPrint) {
if (!event.defaultPrevented) {
this.renditionService.printFileGeneric(this.nodeId, this.mimeType);
}
}
}
onSubmitFile(newImageBlob) {
if (this?.nodeEntry?.entry?.id && !this.readOnly) {
const newImageFile = new File([newImageBlob], this?.nodeEntry?.entry?.name, { type: this?.nodeEntry?.entry?.content?.mimeType });
const newFile = new FileModel(newImageFile, {
majorVersion: false,
newVersion: true,
parentId: this?.nodeEntry?.entry?.parentId,
nodeType: this?.nodeEntry?.entry?.content?.mimeType
}, this?.nodeEntry?.entry?.id);
this.uploadService.addToQueue(...[newFile]);
this.uploadService.uploadFilesInTheQueue();
}
}
onNavigateBeforeClick(event) {
this.navigateBefore.next(event);
}
onNavigateNextClick(event) {
this.navigateNext.next(event);
}
isSourceDefined() {
return !!(this.nodeId || this.sharedLinkId);
}
ngOnChanges(changes) {
if (this.showViewer) {
if (!this.isSourceDefined()) {
throw new Error('A content source attribute value is missing.');
}
if (changes.nodeId?.currentValue !== changes.nodeId?.previousValue) {
this.setupNode();
}
else if (this.sharedLinkId) {
this.setupSharedLink();
}
}
}
onDownloadFile() {
this.nodeActionsService.downloadNode(this.nodeEntry);
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.1.3", ngImport: i0, type: AlfrescoViewerComponent, deps: [{ token: i1.AlfrescoApiService }, { token: i2.NodesApiService }, { token: i3.RenditionService }, { token: i4.ViewUtilService }, { token: i5.ContentService }, { token: i6.UploadService }, { token: i7.MatDialog }, { token: i0.ChangeDetectorRef }, { token: i8.NodeActionsService }], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.1.3", type: AlfrescoViewerComponent, isStandalone: true, selector: "adf-alfresco-viewer", inputs: { nodeId: "nodeId", versionId: "versionId", sharedLinkId: "sharedLinkId", showViewer: "showViewer", maxRetries: "maxRetries", allowGoBack: "allowGoBack", showToolbar: "showToolbar", overlayMode: "overlayMode", allowNavigate: "allowNavigate", canNavigateBefore: "canNavigateBefore", canNavigateNext: "canNavigateNext", allowLeftSidebar: "allowLeftSidebar", allowRightSidebar: "allowRightSidebar", showRightSidebar: "showRightSidebar", showLeftSidebar: "showLeftSidebar", allowDownload: "allowDownload", allowPrint: "allowPrint", allowFullScreen: "allowFullScreen", hideInfoButton: "hideInfoButton", closeButtonPosition: "closeButtonPosition", sidebarRightTemplate: "sidebarRightTemplate", sidebarLeftTemplate: "sidebarLeftTemplate" }, outputs: { invalidSharedLink: "invalidSharedLink", navigateBefore: "navigateBefore", navigateNext: "navigateNext", showViewerChange: "showViewerChange" }, host: { classAttribute: "adf-alfresco-viewer" }, providers: [ViewUtilService], queries: [{ propertyName: "toolbar", first: true, predicate: ViewerToolbarComponent, descendants: true }, { propertyName: "sidebar", first: true, predicate: ViewerSidebarComponent, descendants: true }, { propertyName: "toolbarActions", first: true, predicate: ViewerToolbarActionsComponent, descendants: true }, { propertyName: "moreActions", first: true, predicate: ViewerMoreActionsComponent, descendants: true }, { propertyName: "openWith", first: true, predicate: ViewerOpenWithComponent, descendants: true }, { propertyName: "viewerExtensions", first: true, predicate: ["viewerExtensions"], descendants: true }], viewQueries: [{ propertyName: "adfViewer", first: true, predicate: ["adfViewer"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<adf-viewer\n #adfViewer\n [(showViewer)]=\"showViewer\"\n [allowGoBack]=\"allowGoBack\"\n [showToolbar]=\"showToolbar\"\n [overlayMode]=\"overlayMode\"\n [allowNavigate]=\"allowNavigate\"\n [canNavigateBefore]=\"canNavigateBefore\"\n [canNavigateNext]=\"canNavigateNext\"\n [allowLeftSidebar]=\"allowLeftSidebar\"\n [allowRightSidebar]=\"allowRightSidebar\"\n [showRightSidebar]=\"showRightSidebar\"\n [showLeftSidebar]=\"showLeftSidebar\"\n [allowFullScreen]=\"allowFullScreen\"\n [sidebarRightTemplate]=\"sidebarRightTemplate\"\n [sidebarLeftTemplate]=\"sidebarLeftTemplate\"\n [sidebarRightTemplateContext]=\"sidebarRightTemplateContext\"\n [sidebarLeftTemplateContext]=\"sidebarLeftTemplateContext\"\n [closeButtonPosition]=\"closeButtonPosition\"\n [hideInfoButton]=\"hideInfoButton\"\n [fileName]=\"fileName\"\n [mimeType]=\"mimeType\"\n [nodeMimeType]=\"nodeMimeType\"\n [urlFile]=\"urlFileContent\"\n [tracks]=\"tracks\"\n [readOnly]=\"readOnly\"\n [allowedEditActions]=\"allowedEditActions\"\n [viewerExtensions]=\"viewerExtensions\"\n [nodeId]=\"nodeId\"\n (downloadFile)=\"onDownloadFile()\"\n (navigateBefore)=\"onNavigateBeforeClick($event)\"\n (navigateNext)=\"onNavigateNextClick($event)\"\n (showViewerChange)=\"onClose()\"\n (submitFile)=\"onSubmitFile($event)\">\n\n <adf-viewer-toolbar *ngIf=\"toolbar\">\n <ng-content select=\"adf-viewer-toolbar\" />\n </adf-viewer-toolbar>\n\n <adf-viewer-toolbar-actions *ngIf=\"toolbarActions\">\n <ng-content select=\"adf-viewer-toolbar-actions\" />\n </adf-viewer-toolbar-actions>\n\n <adf-viewer-more-actions *ngIf=\"moreActions\">\n <ng-content select=\"adf-viewer-more-actions\" />\n </adf-viewer-more-actions>\n\n <adf-viewer-open-with *ngIf=\"openWith\">\n <ng-content select=\"adf-viewer-open-with\" />\n </adf-viewer-open-with>\n\n <adf-viewer-sidebar *ngIf=\"sidebar\">\n <ng-content select=\"adf-viewer-sidebar\" />\n </adf-viewer-sidebar>\n\n <adf-viewer-toolbar-custom-actions>\n <button id=\"adf-alfresco-viewer-download\"\n *ngIf=\"allowDownload\"\n mat-icon-button\n [attr.aria-label]=\"'ADF_VIEWER.ACTIONS.DOWNLOAD' | translate\"\n title=\"{{ 'ADF_VIEWER.ACTIONS.DOWNLOAD' | translate }}\"\n data-automation-id=\"adf-toolbar-download\"\n [adfNodeDownload]=\"nodeEntry\"\n [version]=\"versionEntry\">\n <mat-icon>file_download</mat-icon>\n </button>\n\n <button id=\"adf-alfresco-viewer-print\"\n *ngIf=\"allowPrint\"\n mat-icon-button\n [attr.aria-label]=\"'ADF_VIEWER.ACTIONS.PRINT' | translate\"\n title=\"{{ 'ADF_VIEWER.ACTIONS.PRINT' | translate }}\"\n data-automation-id=\"adf-toolbar-print\"\n (click)=\"onPrintContent($event)\">\n <mat-icon>print</mat-icon>\n </button>\n </adf-viewer-toolbar-custom-actions>\n</adf-viewer>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i9.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i10.TranslatePipe, name: "translate" }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i11.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i12.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i4.ViewerToolbarComponent, selector: "adf-viewer-toolbar" }, { kind: "component", type: i4.ViewerSidebarComponent, selector: "adf-viewer-sidebar" }, { kind: "component", type: i4.ViewerOpenWithComponent, selector: "adf-viewer-open-with" }, { kind: "component", type: i4.ViewerMoreActionsComponent, selector: "adf-viewer-more-actions" }, { kind: "component", type: i4.ViewerToolbarActionsComponent, selector: "adf-viewer-toolbar-actions" }, { kind: "component", type: i4.ViewerComponent, selector: "adf-viewer", inputs: ["urlFile", "blobFile", "fileName", "showViewer", "allowGoBack", "allowFullScreen", "showToolbar", "overlayMode", "allowNavigate", "canNavigateBefore", "canNavigateNext", "allowLeftSidebar", "allowRightSidebar", "showRightSidebar", "showLeftSidebar", "sidebarRightTemplate", "sidebarLeftTemplate", "readOnly", "allowedEditActions", "tracks", "mimeType", "sidebarRightTemplateContext", "sidebarLeftTemplateContext", "closeButtonPosition", "hideInfoButton", "viewerExtensions", "nodeId", "nodeMimeType"], outputs: ["downloadFile", "navigateBefore", "navigateNext", "showViewerChange", "submitFile"] }, { kind: "component", type: i4.ViewerToolbarCustomActionsComponent, selector: "adf-viewer-toolbar-custom-actions" }, { kind: "directive", type: NodeDownloadDirective, selector: "[adfNodeDownload]", inputs: ["adfNodeDownload", "version"] }], encapsulation: i0.ViewEncapsulation.None }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.1.3", ngImport: i0, type: AlfrescoViewerComponent, decorators: [{
type: Component,
args: [{ selector: 'adf-alfresco-viewer', standalone: true, imports: [CommonModule, TranslateModule, MatButtonModule, MatIconModule, ...VIEWER_DIRECTIVES, NodeDownloadDirective], host: { class: 'adf-alfresco-viewer' }, encapsulation: ViewEncapsulation.None, providers: [ViewUtilService], template: "<adf-viewer\n #adfViewer\n [(showViewer)]=\"showViewer\"\n [allowGoBack]=\"allowGoBack\"\n [showToolbar]=\"showToolbar\"\n [overlayMode]=\"overlayMode\"\n [allowNavigate]=\"allowNavigate\"\n [canNavigateBefore]=\"canNavigateBefore\"\n [canNavigateNext]=\"canNavigateNext\"\n [allowLeftSidebar]=\"allowLeftSidebar\"\n [allowRightSidebar]=\"allowRightSidebar\"\n [showRightSidebar]=\"showRightSidebar\"\n [showLeftSidebar]=\"showLeftSidebar\"\n [allowFullScreen]=\"allowFullScreen\"\n [sidebarRightTemplate]=\"sidebarRightTemplate\"\n [sidebarLeftTemplate]=\"sidebarLeftTemplate\"\n [sidebarRightTemplateContext]=\"sidebarRightTemplateContext\"\n [sidebarLeftTemplateContext]=\"sidebarLeftTemplateContext\"\n [closeButtonPosition]=\"closeButtonPosition\"\n [hideInfoButton]=\"hideInfoButton\"\n [fileName]=\"fileName\"\n [mimeType]=\"mimeType\"\n [nodeMimeType]=\"nodeMimeType\"\n [urlFile]=\"urlFileContent\"\n [tracks]=\"tracks\"\n [readOnly]=\"readOnly\"\n [allowedEditActions]=\"allowedEditActions\"\n [viewerExtensions]=\"viewerExtensions\"\n [nodeId]=\"nodeId\"\n (downloadFile)=\"onDownloadFile()\"\n (navigateBefore)=\"onNavigateBeforeClick($event)\"\n (navigateNext)=\"onNavigateNextClick($event)\"\n (showViewerChange)=\"onClose()\"\n (submitFile)=\"onSubmitFile($event)\">\n\n <adf-viewer-toolbar *ngIf=\"toolbar\">\n <ng-content select=\"adf-viewer-toolbar\" />\n </adf-viewer-toolbar>\n\n <adf-viewer-toolbar-actions *ngIf=\"toolbarActions\">\n <ng-content select=\"adf-viewer-toolbar-actions\" />\n </adf-viewer-toolbar-actions>\n\n <adf-viewer-more-actions *ngIf=\"moreActions\">\n <ng-content select=\"adf-viewer-more-actions\" />\n </adf-viewer-more-actions>\n\n <adf-viewer-open-with *ngIf=\"openWith\">\n <ng-content select=\"adf-viewer-open-with\" />\n </adf-viewer-open-with>\n\n <adf-viewer-sidebar *ngIf=\"sidebar\">\n <ng-content select=\"adf-viewer-sidebar\" />\n </adf-viewer-sidebar>\n\n <adf-viewer-toolbar-custom-actions>\n <button id=\"adf-alfresco-viewer-download\"\n *ngIf=\"allowDownload\"\n mat-icon-button\n [attr.aria-label]=\"'ADF_VIEWER.ACTIONS.DOWNLOAD' | translate\"\n title=\"{{ 'ADF_VIEWER.ACTIONS.DOWNLOAD' | translate }}\"\n data-automation-id=\"adf-toolbar-download\"\n [adfNodeDownload]=\"nodeEntry\"\n [version]=\"versionEntry\">\n <mat-icon>file_download</mat-icon>\n </button>\n\n <button id=\"adf-alfresco-viewer-print\"\n *ngIf=\"allowPrint\"\n mat-icon-button\n [attr.aria-label]=\"'ADF_VIEWER.ACTIONS.PRINT' | translate\"\n title=\"{{ 'ADF_VIEWER.ACTIONS.PRINT' | translate }}\"\n data-automation-id=\"adf-toolbar-print\"\n (click)=\"onPrintContent($event)\">\n <mat-icon>print</mat-icon>\n </button>\n </adf-viewer-toolbar-custom-actions>\n</adf-viewer>\n" }]
}], ctorParameters: () => [{ type: i1.AlfrescoApiService }, { type: i2.NodesApiService }, { type: i3.RenditionService }, { type: i4.ViewUtilService }, { type: i5.ContentService }, { type: i6.UploadService }, { type: i7.MatDialog }, { type: i0.ChangeDetectorRef }, { type: i8.NodeActionsService }], propDecorators: { adfViewer: [{
type: ViewChild,
args: ['adfViewer']
}], toolbar: [{
type: ContentChild,
args: [ViewerToolbarComponent]
}], sidebar: [{
type: ContentChild,
args: [ViewerSidebarComponent]
}], toolbarActions: [{
type: ContentChild,
args: [ViewerToolbarActionsComponent]
}], moreActions: [{
type: ContentChild,
args: [ViewerMoreActionsComponent]
}], openWith: [{
type: ContentChild,
args: [ViewerOpenWithComponent]
}], viewerExtensions: [{
type: ContentChild,
args: ['viewerExtensions', { static: false }]
}], nodeId: [{
type: Input
}], versionId: [{
type: Input
}], sharedLinkId: [{
type: Input
}], showViewer: [{
type: Input
}], maxRetries: [{
type: Input
}], allowGoBack: [{
type: Input
}], showToolbar: [{
type: Input
}], overlayMode: [{
type: Input
}], allowNavigate: [{
type: Input
}], canNavigateBefore: [{
type: Input
}], canNavigateNext: [{
type: Input
}], allowLeftSidebar: [{
type: Input
}], allowRightSidebar: [{
type: Input
}], showRightSidebar: [{
type: Input
}], showLeftSidebar: [{
type: Input
}], allowDownload: [{
type: Input
}], allowPrint: [{
type: Input
}], allowFullScreen: [{
type: Input
}], hideInfoButton: [{
type: Input
}], closeButtonPosition: [{
type: Input
}], sidebarRightTemplate: [{
type: Input
}], sidebarLeftTemplate: [{
type: Input
}], invalidSharedLink: [{
type: Output
}], navigateBefore: [{
type: Output
}], navigateNext: [{
type: Output
}], showViewerChange: [{
type: Output
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWxmcmVzY28tdmlld2VyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYi9jb250ZW50LXNlcnZpY2VzL3NyYy9saWIvdmlld2VyL2NvbXBvbmVudHMvYWxmcmVzY28tdmlld2VyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYi9jb250ZW50LXNlcnZpY2VzL3NyYy9saWIvdmlld2VyL2NvbXBvbmVudHMvYWxmcmVzY28tdmlld2VyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFDSCxpQkFBaUIsRUFDakIsU0FBUyxFQUNULFlBQVksRUFDWixVQUFVLEVBQ1YsWUFBWSxFQUNaLE1BQU0sRUFDTixLQUFLLEVBR0wsTUFBTSxFQUVOLFdBQVcsRUFDWCxTQUFTLEVBQ1QsaUJBQWlCLEVBQ3BCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFDSCxtQkFBbUIsRUFFbkIsaUJBQWlCLEVBQ2pCLGVBQWUsRUFDZiwwQkFBMEIsRUFDMUIsdUJBQXVCLEVBQ3ZCLHNCQUFzQixFQUN0Qiw2QkFBNkIsRUFDN0Isc0JBQXNCLEVBQ3RCLGVBQWUsRUFDbEIsTUFBTSxvQkFBb0IsQ0FBQztBQUM1QixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUN6RSxPQUFPLEVBQUUsVUFBVSxFQUFtQixRQUFRLEVBQWtCLGNBQWMsRUFBeUIsV0FBVyxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDN0ksT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0seUNBQXlDLENBQUM7QUFDM0UsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3JELE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0s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QUs7Z0JBS04sZUFBZTtzQkFEZCxLQUFLO2dCQUtOLGdCQUFnQjtzQkFEZixLQUFLO2dCQUtOLGlCQUFpQjtzQkFEaEIsS0FBSztnQkFLTixnQkFBZ0I7c0JBRGYsS0FBSztnQkFLTixlQUFlO3NCQURkLEtBQUs7Z0JBS04sYUFBYTtzQkFEWixLQUFLO2dCQUtOLFVBQVU7c0JBRFQsS0FBSztnQkFLTixlQUFlO3NCQURkLEtBQUs7Z0JBS04sY0FBYztzQkFEYixLQUFLO2dCQUtOLG1CQUFtQjtzQkFEbEIsS0FBSztnQkFLTixvQkFBb0I7c0JBRG5CLEtBQUs7Z0JBS04sbUJBQW1CO3NCQURsQixLQUFLO2dCQUtOLGlCQUFpQjtzQkFEaEIsTUFBTTtnQkFLUCxjQUFjO3NCQURiLE1BQU07Z0JBS1AsWUFBWTtzQkFEWCxNQUFNO2dCQUtQLGdCQUFnQjtzQkFEZixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiLyohXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IMKpIDIwMDUtMjAyNSBIeWxhbmQgU29mdHdhcmUsIEluYy4gYW5kIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5pbXBvcnQge1xuICAgIENoYW5nZURldGVjdG9yUmVmLFxuICAgIENvbXBvbmVudCxcbiAgICBDb250ZW50Q2hpbGQsXG4gICAgRGVzdHJveVJlZixcbiAgICBFdmVudEVtaXR0ZXIsXG4gICAgaW5qZWN0LFxuICAgIElucHV0LFxuICAgIE9uQ2hhbmdlcyxcbiAgICBPbkluaXQsXG4gICAgT3V0cHV0LFxuICAgIFNpbXBsZUNoYW5nZXMsXG4gICAgVGVtcGxhdGVSZWYsXG4gICAgVmlld0NoaWxkLFxuICAgIFZpZXdFbmNhcHN1bGF0aW9uXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgICBDbG9zZUJ1dHRvblBvc2l0aW9uLFxuICAgIFRyYWNrLFxuICAgIFZJRVdFUl9ESVJFQ1RJVkVTLFxuICAgIFZpZXdlckNvbXBvbmVudCxcbiAgICBWaWV3ZXJNb3JlQWN0aW9uc0NvbXBvbmVudCxcbiAgICBWaWV3ZXJPcGVuV2l0aENvbXBvbmVudCxcbiAgICBWaWV3ZXJTaWRlYmFyQ29tcG9uZW50LFxuICAgIFZpZXdlclRvb2xiYXJBY3Rpb25zQ29tcG9uZW50LFxuICAgIFZpZXdlclRvb2xiYXJDb21wb25lbnQsXG4gICAgVmlld1V0aWxTZXJ2aWNlXG59IGZyb20gJ0BhbGZyZXNjby9hZGYtY29yZSc7XG5pbXBvcnQgeyBBbGZyZXNjb0FwaVNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9hbGZyZXNjby1hcGkuc2VydmljZSc7XG5pbXBvcnQgeyBDb250ZW50QXBpLCBOb2RlLCBOb2RlRW50cnksIE5vZGVzQXBpLCBSZW5kaXRpb25FbnRyeSwgU2hhcmVkbGlua3NBcGksIFZlcnNpb24sIFZlcnNpb25FbnRyeSwgVmVyc2lvbnNBcGkgfSBmcm9tICdAYWxmcmVzY28vanMtYXBpJztcbmltcG9ydCB7IFJlbmRpdGlvblNlcnZpY2UgfSBmcm9tICcuLi8uLi9jb21tb24vc2VydmljZXMvcmVuZGl0aW9uLnNlcnZpY2UnO1xuaW1wb3J0IHsgTWF0RGlhbG9nIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGlhbG9nJztcbmltcG9ydCB7IGZpbHRlciB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IENvbnRlbnRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vY29tbW9uL3NlcnZpY2VzL2NvbnRlbnQuc2VydmljZSc7XG5pbXBvcnQgeyBOb2Rlc0FwaVNlcnZpY2UgfSBmcm9tICcuLi8uLi9jb21tb24vc2VydmljZXMvbm9kZXMtYXBpLnNlcnZpY2UnO1xuaW1wb3J0IHsgVXBsb2FkU2VydmljZSB9IGZyb20gJy4uLy4uL2NvbW1vbi9zZXJ2aWNlcy91cGxvYWQuc2VydmljZSc7XG5pbXBvcnQgeyBGaWxlTW9kZWwgfSBmcm9tICcuLi8uLi9jb21tb24vbW9kZWxzL2ZpbGUubW9kZWwnO1xuaW1wb3J0IHsgTm9kZUFjdGlvbnNTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vZG9jdW1lbnQtbGlzdCc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgVHJhbnNsYXRlTW9kdWxlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQgeyBNYXRCdXR0b25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9idXR0b24nO1xuaW1wb3J0IHsgTWF0SWNvbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2ljb24nO1xuaW1wb3J0IHsgTm9kZURvd25sb2FkRGlyZWN0aXZlIH0gZnJvbSAnLi4vLi4vZGlyZWN0aXZlcyc7XG5pbXBvcnQgeyB0YWtlVW50aWxEZXN0cm95ZWQgfSBmcm9tICdAYW5ndWxhci9jb3JlL3J4anMtaW50ZXJvcCc7XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnYWRmLWFsZnJlc2NvLXZpZXdlcicsXG4gICAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBUcmFuc2xhdGVNb2R1bGUsIE1hdEJ1dHRvbk1vZHVsZSwgTWF0SWNvbk1vZHVsZSwgLi4uVklFV0VSX0RJUkVDVElWRVMsIE5vZGVEb3dubG9hZERpcmVjdGl2ZV0sXG4gICAgdGVtcGxhdGVVcmw6ICcuL2FsZnJlc2NvLXZpZXdlci5jb21wb25lbnQuaHRtbCcsXG4gICAgc3R5bGVVcmxzOiBbJy4vYWxmcmVzY28tdmlld2VyLmNvbXBvbmVudC5zY3NzJ10sXG4gICAgaG9zdDogeyBjbGFzczogJ2FkZi1hbGZyZXNjby12aWV3ZXInIH0sXG4gICAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbiAgICBwcm92aWRlcnM6IFtWaWV3VXRpbFNlcnZpY2VdXG59KVxuZXhwb3J0IGNsYXNzIEFsZnJlc2NvVmlld2VyQ29tcG9uZW50IGltcGxlbWVudHMgT25DaGFuZ2VzLCBPbkluaXQge1xuICAgIEBWaWV3Q2hpbGQoJ2FkZlZpZXdlcicpXG4gICAgYWRmVmlld2VyOiBWaWV3ZXJDb21wb25lbnQ8eyBub2RlOiBOb2RlIH0+O1xuXG4gICAgQENvbnRlbnRDaGlsZChWaWV3ZXJUb29sYmFyQ29tcG9uZW50KVxuICAgIHRvb2xiYXI6IFZpZXdlclRvb2xiYXJDb21wb25lbnQ7XG5cbiAgICBAQ29udGVudENoaWxkKFZpZXdlclNpZGViYXJDb21wb25lbnQpXG4gICAgc2lkZWJhcjogVmlld2VyU2lkZWJhckNvbXBvbmVudDtcblxuICAgIEBDb250ZW50Q2hpbGQoVmlld2VyVG9vbGJhckFjdGlvbnNDb21wb25lbnQpXG4gICAgdG9vbGJhckFjdGlvbnM6IFZpZXdlclRvb2xiYXJBY3Rpb25zQ29tcG9uZW50O1xuXG4gICAgQENvbnRlbnRDaGlsZChWaWV3ZXJNb3JlQWN0aW9uc0NvbXBvbmVudClcbiAgICBtb3JlQWN0aW9uczogVmlld2VyTW9yZUFjdGlvbnNDb21wb25lbnQ7XG5cbiAgICBAQ29udGVudENoaWxkKFZpZXdlck9wZW5XaXRoQ29tcG9uZW50KVxuICAgIG9wZW5XaXRoOiBWaWV3ZXJPcGVuV2l0aENvbXBvbmVudDtcblxuICAgIEBDb250ZW50Q2hpbGQoJ3ZpZXdlckV4dGVuc2lvbnMnLCB7IHN0YXRpYzogZmFsc2UgfSlcbiAgICB2aWV3ZXJFeHRlbnNpb25zOiBUZW1wbGF0ZVJlZjxhbnk+O1xuXG4gICAgLyoqIE5vZGUgSWQgb2YgdGhlIGZpbGUgdG8gbG9hZC4gKi9cbiAgICBASW5wdXQoKVxuICAgIG5vZGVJZDogc3RyaW5nID0gbnVsbDtcblxuICAgIC8qKiBWZXJzaW9uIElkIG9mIHRoZSBmaWxlIHRvIGxvYWQuICovXG4gICAgQElucHV0KClcbiAgICB2ZXJzaW9uSWQ6IHN0cmluZyA9IG51bGw7XG5cbiAgICAvKiogU2hhcmVkIGxpbmsgaWQgKHRvIGRpc3BsYXkgc2hhcmVkIGZpbGUpLiAqL1xuICAgIEBJbnB1dCgpXG4gICAgc2hhcmVkTGlua0lkOiBzdHJpbmcgPSBudWxsO1xuXG4gICAgLyoqIEhpZGUgb3Igc2hvdyB0aGUgdmlld2VyICovXG4gICAgQElucHV0KClcbiAgICBzaG93Vmlld2VyID0gdHJ1ZTtcblxuICAgIC8qKlxuICAgICAqIE51bWJlciBvZiB0aW1lcyB0aGUgVmlld2VyIHdpbGwgcmV0cnkgZmV0Y2hpbmcgY29udGVudCBSZW5kaXRpb24uXG4gICAgICogVGhlcmUgaXMgYSBkZWxheSBvZiBhdCBsZWFzdCBvbmUgc