diff --git a/ng2-components/ng2-alfresco-viewer/src/assets/PDFJS.mock.ts b/ng2-components/ng2-alfresco-viewer/src/assets/PDFJS.mock.ts
index 573cbc9571..dd9f6871bb 100644
--- a/ng2-components/ng2-alfresco-viewer/src/assets/PDFJS.mock.ts
+++ b/ng2-components/ng2-alfresco-viewer/src/assets/PDFJS.mock.ts
@@ -18,10 +18,6 @@
export class PDFJSmock {
- getFilenameFromUrl(url: string) {
- return 'fake-name';
- }
-
getDocument(url: string) {
return new Promise((resolve) => {
resolve({numPages: '10'});
diff --git a/ng2-components/ng2-alfresco-viewer/src/pdfViewer.component.css b/ng2-components/ng2-alfresco-viewer/src/pdfViewer.component.css
new file mode 100644
index 0000000000..5d0b4b8a4e
--- /dev/null
+++ b/ng2-components/ng2-alfresco-viewer/src/pdfViewer.component.css
@@ -0,0 +1,15 @@
+.viewer-pdf-container {
+ background: #3E3E3E;
+}
+
+:host .page {
+ margin: 10px auto !important;
+ overflow: visible;
+ border: 9px solid transparent;
+ background-clip: content-box;
+ background-color: white;
+}
+
+:host .canvasWrapper {
+ box-shadow: 0px 0px 8px 2px #000;
+}
diff --git a/ng2-components/ng2-alfresco-viewer/src/pdfViewer.component.html b/ng2-components/ng2-alfresco-viewer/src/pdfViewer.component.html
new file mode 100644
index 0000000000..2d2ab2b450
--- /dev/null
+++ b/ng2-components/ng2-alfresco-viewer/src/pdfViewer.component.html
@@ -0,0 +1,12 @@
+
+
+
diff --git a/ng2-components/ng2-alfresco-viewer/src/pdfViewer.component.spec.ts b/ng2-components/ng2-alfresco-viewer/src/pdfViewer.component.spec.ts
new file mode 100644
index 0000000000..ac67617435
--- /dev/null
+++ b/ng2-components/ng2-alfresco-viewer/src/pdfViewer.component.spec.ts
@@ -0,0 +1,122 @@
+/*!
+ * @license
+ * Copyright 2016 Alfresco Software, Ltd.
+ *
+ * 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 { describe, expect, it, injectAsync, TestComponentBuilder, setBaseTestProviders } from 'angular2/testing';
+import { TEST_BROWSER_PLATFORM_PROVIDERS, TEST_BROWSER_APPLICATION_PROVIDERS } from 'angular2/platform/testing/browser';
+import { PdfViewerComponent } from './pdfViewer.component';
+import { PDFJSmock } from './assets/PDFJS.mock';
+import { PDFViewermock } from './assets/PDFViewer.mock';
+
+describe('PdfViewer', () => {
+ setBaseTestProviders(TEST_BROWSER_PLATFORM_PROVIDERS, TEST_BROWSER_APPLICATION_PROVIDERS);
+
+ describe('View', () => {
+ it('Canvas should be present', injectAsync([TestComponentBuilder], (tcb: TestComponentBuilder) => {
+ return tcb
+ .createAsync(PdfViewerComponent)
+ .then((fixture) => {
+ let element = fixture.nativeElement;
+
+ fixture.detectChanges();
+
+ expect(element.querySelector('#viewer-viewerPdf')).not.toBeNull();
+ expect(element.querySelector('#viewer-pdf-container')).not.toBeNull();
+ });
+ }));
+
+ it('Total number of pages should be showed', injectAsync([TestComponentBuilder], (tcb: TestComponentBuilder) => {
+ return tcb
+ .createAsync(PdfViewerComponent)
+ .then((fixture) => {
+ let element = fixture.nativeElement;
+ let component = fixture.componentInstance;
+
+ component.urlFile = 'fake-url-file';
+ spyOn(component, 'getPDFJS').and.returnValue(new PDFJSmock());
+
+ component.ngOnChanges().then(() => {
+ expect(element.querySelector('#viewer-total-pages').innerHTML).toEqual('/10');
+ });
+ });
+ }));
+ });
+
+ describe('User interaction', () => {
+ it('Click on next page should move to the next page', injectAsync([TestComponentBuilder], (tcb: TestComponentBuilder) => {
+ return tcb
+ .createAsync(PdfViewerComponent)
+ .then((fixture) => {
+ let element = fixture.nativeElement;
+ let component = fixture.componentInstance;
+ spyOn(component, 'getPDFJS').and.returnValue(new PDFJSmock());
+ component.pdfViewer = new PDFViewermock();
+ component.urlFile = 'fake-url-file';
+
+ component.ngOnChanges().then(() => {
+ fixture.detectChanges();
+ expect(element.querySelector('#viewer-pagenumber-input').value).toBe('1');
+ element.querySelector('#viewer-next-page-button').click();
+ fixture.detectChanges();
+ expect(element.querySelector('#viewer-pagenumber-input').value).toBe('2');
+ });
+ });
+ }));
+
+ it('Click on previous page should move to the previous page', injectAsync([TestComponentBuilder], (tcb: TestComponentBuilder) => {
+ return tcb
+ .createAsync(PdfViewerComponent)
+ .then((fixture) => {
+ let element = fixture.nativeElement;
+ let component = fixture.componentInstance;
+ spyOn(component, 'getPDFJS').and.returnValue(new PDFJSmock());
+ component.pdfViewer = new PDFViewermock();
+ component.urlFile = 'fake-url-file';
+
+ component.ngOnChanges().then(() => {
+ fixture.detectChanges();
+ expect(element.querySelector('#viewer-pagenumber-input').value).toBe('1');
+ element.querySelector('#viewer-next-page-button').click();
+ element.querySelector('#viewer-next-page-button').click();
+ element.querySelector('#viewer-previous-page-button').click();
+ fixture.detectChanges();
+ expect(element.querySelector('#viewer-pagenumber-input').value).toBe('2');
+ });
+ });
+ }));
+
+ /* tslint:disable:max-line-length */
+ it('Click on previous page should not move to the previous page if is page 1', injectAsync([TestComponentBuilder], (tcb: TestComponentBuilder) => {
+ return tcb
+ .createAsync(PdfViewerComponent)
+ .then((fixture) => {
+ let element = fixture.nativeElement;
+ let component = fixture.componentInstance;
+ spyOn(component, 'getPDFJS').and.returnValue(new PDFJSmock());
+ component.pdfViewer = new PDFViewermock();
+ component.urlFile = 'fake-url-file';
+
+ component.ngOnChanges().then(() => {
+ fixture.detectChanges();
+ expect(element.querySelector('#viewer-pagenumber-input').value).toBe('1');
+ element.querySelector('#viewer-previous-page-button').click();
+ fixture.detectChanges();
+ expect(element.querySelector('#viewer-pagenumber-input').value).toBe('1');
+ });
+ });
+ }));
+ });
+});
diff --git a/ng2-components/ng2-alfresco-viewer/src/pdfViewer.component.ts b/ng2-components/ng2-alfresco-viewer/src/pdfViewer.component.ts
new file mode 100644
index 0000000000..3d15b4561e
--- /dev/null
+++ b/ng2-components/ng2-alfresco-viewer/src/pdfViewer.component.ts
@@ -0,0 +1,150 @@
+/*!
+ * @license
+ * Copyright 2016 Alfresco Software, Ltd.
+ *
+ * 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 { Component, Input } from 'angular2/core';
+
+declare let PDFJS: any;
+declare let __moduleName: string;
+
+@Component({
+ moduleId: __moduleName,
+ selector: 'pdf-viewer',
+ templateUrl: './pdfViewer.component.html',
+ styleUrls: ['./pdfViewer.component.css']
+})
+export class PdfViewerComponent {
+
+ @Input()
+ urlFile: string;
+
+ currentPdfDocument: any;
+ page: number;
+ displayPage: number;
+ totalPages: number;
+
+ pdfViewer: any;
+
+ renderingStates = {
+ FINISHED: 3 as number
+ };
+
+ ngOnChanges(changes) {
+ if (!this.urlFile) {
+ throw new Error('Attribute urlFile is required');
+ }
+
+ if (this.urlFile) {
+ let urlFileTicket = this.addAlfrescoTicket(this.urlFile);
+
+ return new Promise((resolve) => {
+ this.getPDFJS().getDocument(urlFileTicket, null, null).then((pdfDocument) => {
+ this.currentPdfDocument = pdfDocument;
+ this.totalPages = pdfDocument.numPages;
+ this.page = 1;
+ this.displayPage = 1;
+ this.initPDFViewer(this.currentPdfDocument);
+ });
+ resolve();
+ });
+ }
+ }
+
+ /**
+ * Add Ticket to the file request
+ * @returns {string}
+ */
+ private addAlfrescoTicket(url: string) {
+ return url + '?alf_ticket=' + this.getAlfrescoTicket();
+ }
+
+ /**
+ * Get the token from the local storage
+ * @returns {string}
+ */
+ private getAlfrescoTicket() {
+ return localStorage.getItem('token');
+ }
+
+ /**
+ * return the PDFJS global object (exist to facilitate the mock of PDFJS in the test)
+ * @returns {PDFJS}
+ */
+ getPDFJS() {
+ return PDFJS;
+ }
+
+ initPDFViewer(pdfDocument: any) {
+ PDFJS.verbosity = 5;
+
+ let documentContainer: any = document.getElementById('viewer-pdf-container');
+ let viewer: any = document.getElementById('viewer-viewerPdf');
+
+ this.pdfViewer = new PDFJS.PDFViewer({
+ container: documentContainer,
+ viewer: viewer
+ });
+
+ this.pdfViewer.setDocument(pdfDocument);
+ }
+
+ /**
+ * load the previous page
+ */
+ previousPage() {
+ if (this.pdfViewer && this.page > 1) {
+ this.page--;
+ this.displayPage = this.page;
+
+ this.pdfViewer.currentPageNumber = this.page;
+
+ if (this.pdfViewer.currentPage.renderingState === this.renderingStates.FINISHED) {
+ // remove loader
+ } else {
+ // add loader
+ }
+ }
+ }
+
+ /**
+ * load the next page
+ */
+ nextPage() {
+ if (this.pdfViewer && this.page < this.totalPages) {
+ this.page++;
+ this.displayPage = this.page;
+
+ this.pdfViewer.currentPageNumber = this.page;
+ }
+ }
+
+ /**
+ * load the page in input
+ *
+ * @param {string} page - page to load
+ */
+ inputPage(page: string) {
+ let pageInput = parseInt(page, 10);
+
+ if (!isNaN(pageInput) && pageInput > 0 && pageInput <= this.totalPages) {
+ this.page = pageInput;
+
+ this.pdfViewer.currentPageNumber = this.page;
+ } else {
+ this.displayPage = this.page;
+ }
+ }
+}
diff --git a/ng2-components/ng2-alfresco-viewer/src/viewer.component.css b/ng2-components/ng2-alfresco-viewer/src/viewer.component.css
index 0a7ead1210..4bc1db7da3 100644
--- a/ng2-components/ng2-alfresco-viewer/src/viewer.component.css
+++ b/ng2-components/ng2-alfresco-viewer/src/viewer.component.css
@@ -46,10 +46,6 @@
text-overflow: ellipsis;
}
-.viewer-pdf-container {
- background: #3E3E3E;
-}
-
.viewer-shadow-transparent {
background-color: #3E3E3E;
position: fixed;
@@ -69,15 +65,9 @@
z-index: 1000;
}
-:host .page {
- margin: 10px auto !important;
- overflow: visible;
- border: 9px solid transparent;
- background-clip: content-box;
- background-color: white;
+.viewer-image {
+ width: 100%;
+ height: 100%;
}
-:host .canvasWrapper {
- box-shadow: 0px 0px 8px 2px #000;
-}
diff --git a/ng2-components/ng2-alfresco-viewer/src/viewer.component.html b/ng2-components/ng2-alfresco-viewer/src/viewer.component.html
index e3792971a9..75a158c132 100644
--- a/ng2-components/ng2-alfresco-viewer/src/viewer.component.html
+++ b/ng2-components/ng2-alfresco-viewer/src/viewer.component.html
@@ -3,7 +3,7 @@
-