diff --git a/docs/core/components/viewer.component.md b/docs/core/components/viewer.component.md index 6e93d3bbea..e05fd3ed62 100644 --- a/docs/core/components/viewer.component.md +++ b/docs/core/components/viewer.component.md @@ -85,12 +85,13 @@ See the [Custom layout](#custom-layout) section for full details of all availabl ### Events -| Name | Type | Description | -| ---- | ---- | ----------- | -| navigateBefore | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`` | Emitted when user clicks 'Navigate Before' ("<") button. | -| navigateNext | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`` | Emitted when user clicks 'Navigate Next' (">") button. | -| showViewerChange | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`` | Emitted when the viewer close | -| submitFile | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<`[`Blob`](https://developer.mozilla.org/en-US/docs/Web/API/Blob)`>` | Emitted when the img is submitted in the img viewer. | +| Name | Type | Description | +|------------------|---------------------------------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------| +| navigateBefore | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`` | Emitted when user clicks 'Navigate Before' ("<") button. | +| navigateNext | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`` | Emitted when user clicks 'Navigate Next' (">") button. | +| showViewerChange | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`` | Emitted when the viewer close | +| submitFile | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<`[`Blob`](https://developer.mozilla.org/en-US/docs/Web/API/Blob)`>` | Emitted when the img is submitted in the img viewer. | +| downloadFile | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<`[`void`](https://developer.mozilla.org/en-US/docs/Web/API/Blob)`>` | Emitted when download button is clicked on the Download File Prompt. | ## Keyboard shortcuts diff --git a/lib/content-services/src/lib/viewer/components/alfresco-viewer.component.html b/lib/content-services/src/lib/viewer/components/alfresco-viewer.component.html index 06cce191b7..e16d5f09f0 100644 --- a/lib/content-services/src/lib/viewer/components/alfresco-viewer.component.html +++ b/lib/content-services/src/lib/viewer/components/alfresco-viewer.component.html @@ -21,6 +21,7 @@ [urlFile]="urlFileContent" [tracks]="tracks" [readOnly]="readOnly" + (downloadFile)="onDownloadFile()" (navigateBefore)="onNavigateBeforeClick($event)" (navigateNext)="onNavigateNextClick($event)" (showViewerChange)="onClose()" diff --git a/lib/content-services/src/lib/viewer/components/alfresco-viewer.component.spec.ts b/lib/content-services/src/lib/viewer/components/alfresco-viewer.component.spec.ts index 5f08232e8c..361080d671 100644 --- a/lib/content-services/src/lib/viewer/components/alfresco-viewer.component.spec.ts +++ b/lib/content-services/src/lib/viewer/components/alfresco-viewer.component.spec.ts @@ -26,19 +26,20 @@ import { AppExtensionService, ViewerExtensionRef } from '@alfresco/adf-extension import { MatButtonModule } from '@angular/material/button'; import { MatIconModule } from '@angular/material/icon'; import { NodeEntry, VersionEntry } from '@alfresco/js-api'; -import { AlfrescoViewerComponent, RenditionService } from '@alfresco/adf-content-services'; +import { AlfrescoViewerComponent, NodeActionsService, RenditionService } from '@alfresco/adf-content-services'; import { CoreTestingModule, setupTestBed, EventMock, - ViewUtilService + ViewUtilService, ViewerComponent } from '@alfresco/adf-core'; import { NodesApiService } from '../../common/services/nodes-api.service'; import { UploadService } from '../../common/services/upload.service'; import { FileModel } from '../../common/models/file.model'; import { throwError } from 'rxjs'; -import { Component } from '@angular/core'; +import { Component, CUSTOM_ELEMENTS_SCHEMA } from '@angular/core'; import { ESCAPE } from '@angular/cdk/keycodes'; +import { By } from '@angular/platform-browser'; @Component({ selector: 'adf-viewer-container-toolbar', @@ -149,6 +150,7 @@ describe('AlfrescoViewerComponent', () => { let extensionService: AppExtensionService; let renditionService: RenditionService; let viewUtilService: ViewUtilService; + let nodeActionsService: NodeActionsService; setupTestBed({ imports: [ @@ -174,7 +176,8 @@ describe('AlfrescoViewerComponent', () => { }, {provide: Location, useClass: SpyLocation}, MatDialog - ] + ], + schemas: [CUSTOM_ELEMENTS_SCHEMA] }); beforeEach(() => { @@ -188,6 +191,7 @@ describe('AlfrescoViewerComponent', () => { extensionService = TestBed.inject(AppExtensionService); renditionService = TestBed.inject(RenditionService); viewUtilService = TestBed.inject(ViewUtilService); + nodeActionsService = TestBed.inject(NodeActionsService); }); afterEach(() => { @@ -350,6 +354,15 @@ describe('AlfrescoViewerComponent', () => { expect(component.nodeId).toBe('id1'); })); + it('should download file when downloadFile event is emitted', () => { + spyOn(nodeActionsService, 'downloadNode'); + const viewerComponent = fixture.debugElement.query(By.directive(ViewerComponent)); + viewerComponent.triggerEventHandler('downloadFile'); + + fixture.detectChanges(); + expect(nodeActionsService.downloadNode).toHaveBeenCalled(); + }); + describe('Viewer Example Component Rendering', () => { it('should use custom toolbar', (done) => { diff --git a/lib/content-services/src/lib/viewer/components/alfresco-viewer.component.ts b/lib/content-services/src/lib/viewer/components/alfresco-viewer.component.ts index e03ce0875c..625e9046c6 100644 --- a/lib/content-services/src/lib/viewer/components/alfresco-viewer.component.ts +++ b/lib/content-services/src/lib/viewer/components/alfresco-viewer.component.ts @@ -60,6 +60,7 @@ 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'; @Component({ selector: 'adf-alfresco-viewer', @@ -238,7 +239,8 @@ export class AlfrescoViewerComponent implements OnChanges, OnInit, OnDestroy { private contentService: ContentService, private uploadService: UploadService, public dialog: MatDialog, - private cdr: ChangeDetectorRef) { + private cdr: ChangeDetectorRef, + private nodeActionsService: NodeActionsService) { renditionService.maxRetries = this.maxRetries; } @@ -449,4 +451,7 @@ export class AlfrescoViewerComponent implements OnChanges, OnInit, OnDestroy { this.onDestroy$.complete(); } + onDownloadFile() { + this.nodeActionsService.downloadNode(this.nodeEntry); + } } diff --git a/lib/core/src/lib/viewer/components/viewer.component.spec.ts b/lib/core/src/lib/viewer/components/viewer.component.spec.ts index b462c24289..41bf38e368 100644 --- a/lib/core/src/lib/viewer/components/viewer.component.spec.ts +++ b/lib/core/src/lib/viewer/components/viewer.component.spec.ts @@ -675,5 +675,15 @@ describe('ViewerComponent', () => { flush(); discardPeriodicTasks(); })); + + it('should emit downloadFileEvent when DownloadPromptDialog return DownloadPromptActions.DOWNLOAD on close', fakeAsync( () => { + dialogOpenSpy.and.returnValue({ afterClosed: () => of(DownloadPromptActions.DOWNLOAD) } as any); + spyOn(component.downloadFile, 'emit'); + fixture.detectChanges(); + tick(3000); + fixture.detectChanges(); + + expect(component.downloadFile.emit).toHaveBeenCalled(); + })); }); }); diff --git a/lib/core/src/lib/viewer/components/viewer.component.ts b/lib/core/src/lib/viewer/components/viewer.component.ts index ad78e0be40..9dc10d9241 100644 --- a/lib/core/src/lib/viewer/components/viewer.component.ts +++ b/lib/core/src/lib/viewer/components/viewer.component.ts @@ -190,6 +190,12 @@ export class ViewerComponent implements OnDestroy, OnInit, OnChanges { * */ downloadPromptReminderDelay: number = 15; + /** + * Emitted when user clicks on download button on download prompt dialog. + * */ + @Output() + downloadFile: EventEmitter = new EventEmitter(); + /** Emitted when user clicks 'Navigate Before' ("<") button. */ @Output() navigateBefore = new EventEmitter(); @@ -388,7 +394,10 @@ export class ViewerComponent implements OnDestroy, OnInit, OnChanges { this.isDialogVisible = true; this.dialog.open(DownloadPromptDialogComponent, { disableClose: true }).afterClosed().pipe(first()).subscribe((result: DownloadPromptActions) => { this.isDialogVisible = false; - if (result === DownloadPromptActions.WAIT) { + if (result === DownloadPromptActions.DOWNLOAD) { + this.downloadFile.emit(); + this.onClose(); + } else if (result === DownloadPromptActions.WAIT) { if (this.enableDownloadPromptReminder) { this.clearDownloadPromptTimeouts(); this.downloadPromptReminderTimer = window.setTimeout(() => {