LP1825851 Server managed/processed print templates
[working/Evergreen.git] / Open-ILS / src / eg2 / src / app / share / print / print.component.ts
index 4f69949..ff1c3ed 100644 (file)
@@ -1,6 +1,8 @@
 import {Component, OnInit, TemplateRef, ElementRef, Renderer2} from '@angular/core';
 import {PrintService, PrintRequest} from './print.service';
 import {StoreService} from '@eg/core/store.service';
+import {ServerStoreService} from '@eg/core/server-store.service';
+import {HatchService, HatchMessage} from './hatch.service';
 
 @Component({
     selector: 'eg-print',
@@ -26,6 +28,8 @@ export class PrintComponent implements OnInit {
         private renderer: Renderer2,
         private elm: ElementRef,
         private store: StoreService,
+        private serverStore: ServerStoreService,
+        private hatch: HatchService,
         private printer: PrintService) {
         this.isPrinting = false;
         this.printQueue = [];
@@ -49,35 +53,64 @@ export class PrintComponent implements OnInit {
 
         this.isPrinting = true;
 
-        this.applyTemplate(printReq);
-
-        // Give templates a chance to render before printing
-        setTimeout(() => {
-            this.dispatchPrint(printReq);
-            this.reset();
+        this.applyTemplate(printReq).then(() => {
+            // Give templates a chance to render before printing
+            setTimeout(() => {
+                this.dispatchPrint(printReq);
+                this.reset();
+            });
         });
     }
 
-    applyTemplate(printReq: PrintRequest) {
+    applyTemplate(printReq: PrintRequest): Promise<any> {
 
         if (printReq.template) {
-            // Inline template.  Let Angular do the interpolationwork.
+            // Local Angular template.
             this.template = printReq.template;
             this.context = {$implicit: printReq.contextData};
-            return;
+            return Promise.resolve();
+        }
+
+        let promise;
+
+        // Precompiled text
+        if (printReq.text) {
+            promise = Promise.resolve();
+
+        } else if (printReq.templateName || printReq.templateId) {
+            // Server-compiled template
+
+            promise = this.printer.compileRemoteTemplate(printReq).then(
+                response => {
+                    printReq.text = response.content;
+                    printReq.contentType = response.contentType;
+                },
+                err => {
+                    console.error('Error compiling template', printReq);
+                    return Promise.reject(new Error(
+                        'Error compiling server-hosted print template'));
+                }
+            );
+
+        } else {
+            console.error('Cannot find template', printReq);
+            return Promise.reject(new Error('Cannot find print template'));
         }
 
-        if (printReq.text && true /* !this.hatch.isActive */) {
-            // Insert HTML into the browser DOM for in-browser printing only.
+        return promise.then(() => {
 
-            if (printReq.contentType === 'text/plain') {
+            // Insert HTML into the browser DOM for in-browser printing.
+            if (printReq.text && !this.useHatch()) {
+
+                if (printReq.contentType === 'text/plain') {
                 // Wrap text/plain content in pre's to prevent
                 // unintended html formatting.
-                printReq.text = `<pre>${printReq.text}</pre>`;
-            }
+                    printReq.text = `<pre>${printReq.text}</pre>`;
+                }
 
-            this.htmlContainer.innerHTML = printReq.text;
-        }
+                this.htmlContainer.innerHTML = printReq.text;
+            }
+        });
     }
 
     // Clear the print data
@@ -109,7 +142,7 @@ export class PrintComponent implements OnInit {
             show_dialog: printReq.showDialog
         });
 
-        if (0 /* this.hatch.isActive */) {
+        if (this.useHatch()) {
             this.printViaHatch(printReq);
         } else {
             // Here the needed HTML is already in the page.
@@ -117,17 +150,35 @@ export class PrintComponent implements OnInit {
         }
     }
 
+    useHatch(): boolean {
+        return this.store.getLocalItem('eg.hatch.enable.printing')
+            && this.hatch.connect();
+    }
+
     printViaHatch(printReq: PrintRequest) {
 
         // Send a full HTML document to Hatch
-        const html = `<html><body>${printReq.text}</body></html>`;
+        let html = printReq.text;
+        if (printReq.contentType === 'text/html') {
+            html = `<html><body>${printReq.text}</body></html>`;
+        }
 
-        /*
-        this.hatch.print({
-            printContext: printReq.printContext,
-            content: html
+        this.serverStore.getItem(`eg.print.config.${printReq.printContext}`)
+        .then(config => {
+
+            const msg = new HatchMessage({
+                action: 'print',
+                content: html,
+                settings: config || {},
+                contentType: 'text/html',
+                showDialog: printReq.showDialog
+            });
+
+            this.hatch.sendRequest(msg).then(
+                ok  => console.debug('Print request succeeded'),
+                err => console.warn('Print request failed', err)
+            );
         });
-        */
     }
 }